aboutsummaryrefslogtreecommitdiffstats
path: root/recipes/linux/linux
diff options
context:
space:
mode:
Diffstat (limited to 'recipes/linux/linux')
-rw-r--r--recipes/linux/linux/akita/defconfig381
-rw-r--r--recipes/linux/linux/c7x0/defconfig378
-rw-r--r--recipes/linux/linux/collie/defconfig324
-rw-r--r--recipes/linux/linux/defconfig989
-rw-r--r--recipes/linux/linux/exopcslate/defconfig3403
-rw-r--r--recipes/linux/linux/patch-2.6.28-gc32569
-rw-r--r--recipes/linux/linux/poodle/defconfig379
-rw-r--r--recipes/linux/linux/spitz/defconfig2097
-rw-r--r--recipes/linux/linux/tosa/defconfig1845
9 files changed, 5008 insertions, 37357 deletions
diff --git a/recipes/linux/linux/akita/defconfig b/recipes/linux/linux/akita/defconfig
new file mode 100644
index 0000000000..43b22dc597
--- /dev/null
+++ b/recipes/linux/linux/akita/defconfig
@@ -0,0 +1,381 @@
+CONFIG_EXPERIMENTAL=y
+# CONFIG_LOCALVERSION_AUTO is not set
+CONFIG_SYSVIPC=y
+CONFIG_BSD_PROCESS_ACCT=y
+CONFIG_BSD_PROCESS_ACCT_V3=y
+CONFIG_IKCONFIG=m
+CONFIG_IKCONFIG_PROC=y
+CONFIG_LOG_BUF_SHIFT=14
+CONFIG_BLK_DEV_INITRD=y
+CONFIG_RD_BZIP2=y
+CONFIG_RD_LZMA=y
+CONFIG_RD_LZO=y
+# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
+CONFIG_EMBEDDED=y
+CONFIG_SLOB=y
+CONFIG_PROFILING=y
+CONFIG_OPROFILE=m
+CONFIG_MODULES=y
+CONFIG_MODULE_UNLOAD=y
+CONFIG_MODULE_FORCE_UNLOAD=y
+# CONFIG_LBDAF is not set
+CONFIG_IOSCHED_DEADLINE=m
+CONFIG_IOSCHED_CFQ=m
+CONFIG_ARCH_PXA=y
+CONFIG_PXA_SHARPSL=y
+CONFIG_MACH_AKITA=y
+CONFIG_MACH_BORZOI=y
+CONFIG_PCCARD=y
+CONFIG_PCMCIA_PXA2XX=y
+CONFIG_NO_HZ=y
+CONFIG_HIGH_RES_TIMERS=y
+CONFIG_AEABI=y
+# CONFIG_OABI_COMPAT is not set
+CONFIG_ZBOOT_ROM_TEXT=0x0
+CONFIG_ZBOOT_ROM_BSS=0x0
+CONFIG_CMDLINE="console=ttyS0,115200n8 console=tty1 fbcon=rotate:1 quiet"
+CONFIG_KEXEC=y
+# CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS is not set
+CONFIG_BINFMT_AOUT=m
+CONFIG_BINFMT_MISC=m
+CONFIG_PM_RUNTIME=y
+CONFIG_NET=y
+CONFIG_PACKET=m
+CONFIG_UNIX=y
+CONFIG_XFRM_USER=m
+CONFIG_INET=y
+CONFIG_INET_XFRM_MODE_TRANSPORT=m
+CONFIG_INET_XFRM_MODE_TUNNEL=m
+CONFIG_INET_XFRM_MODE_BEET=m
+# CONFIG_INET_LRO is not set
+CONFIG_INET_DIAG=m
+CONFIG_INET6_AH=m
+CONFIG_INET6_ESP=m
+CONFIG_INET6_IPCOMP=m
+CONFIG_IPV6_TUNNEL=m
+CONFIG_NETFILTER=y
+CONFIG_NF_CONNTRACK=m
+CONFIG_NF_CONNTRACK_FTP=m
+CONFIG_NF_CONNTRACK_H323=m
+CONFIG_NF_CONNTRACK_IRC=m
+CONFIG_NF_CONNTRACK_SIP=m
+CONFIG_NF_CONNTRACK_IPV4=m
+CONFIG_IP_NF_IPTABLES=m
+CONFIG_IP_NF_MATCH_AH=m
+CONFIG_IP_NF_MATCH_ECN=m
+CONFIG_IP_NF_MATCH_TTL=m
+CONFIG_IP_NF_FILTER=m
+CONFIG_IP_NF_TARGET_REJECT=m
+CONFIG_IP_NF_TARGET_LOG=m
+CONFIG_IP_NF_TARGET_ULOG=m
+CONFIG_NF_NAT=m
+CONFIG_IP_NF_TARGET_MASQUERADE=m
+CONFIG_IP_NF_TARGET_NETMAP=m
+CONFIG_IP_NF_TARGET_REDIRECT=m
+CONFIG_IP_NF_MANGLE=m
+CONFIG_IP_NF_TARGET_ECN=m
+CONFIG_IP_NF_TARGET_TTL=m
+CONFIG_IP_NF_RAW=m
+CONFIG_IP_NF_ARPTABLES=m
+CONFIG_IP_NF_ARPFILTER=m
+CONFIG_IP_NF_ARP_MANGLE=m
+CONFIG_IRDA=m
+CONFIG_IRLAN=m
+CONFIG_IRNET=m
+CONFIG_IRCOMM=m
+CONFIG_PXA_FICP=m
+CONFIG_BT=m
+CONFIG_BT_L2CAP=y
+CONFIG_BT_SCO=y
+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
+CONFIG_BT_HCIBTUSB=m
+CONFIG_BT_HCIBTSDIO=m
+CONFIG_BT_HCIUART=m
+CONFIG_BT_HCIUART_H4=y
+CONFIG_BT_HCIUART_BCSP=y
+CONFIG_BT_HCIUART_ATH3K=y
+CONFIG_BT_HCIUART_LL=y
+CONFIG_BT_HCIBCM203X=m
+CONFIG_BT_HCIBPA10X=m
+CONFIG_BT_HCIBFUSB=m
+CONFIG_BT_HCIDTL1=m
+CONFIG_BT_HCIBT3C=m
+CONFIG_BT_HCIBLUECARD=m
+CONFIG_BT_HCIBTUART=m
+CONFIG_BT_HCIVHCI=m
+CONFIG_BT_MRVL=m
+CONFIG_BT_MRVL_SDIO=m
+CONFIG_BT_ATH3K=m
+CONFIG_CFG80211=m
+# CONFIG_CFG80211_DEFAULT_PS is not set
+CONFIG_MAC80211=m
+# CONFIG_MAC80211_RC_MINSTREL is not set
+CONFIG_DEVTMPFS=y
+CONFIG_DEVTMPFS_MOUNT=y
+CONFIG_MTD=y
+CONFIG_MTD_PARTITIONS=y
+CONFIG_MTD_CMDLINE_PARTS=y
+CONFIG_MTD_CHAR=y
+CONFIG_MTD_BLOCK=y
+CONFIG_MTD_ROM=y
+CONFIG_MTD_COMPLEX_MAPPINGS=y
+CONFIG_MTD_PHYSMAP=y
+CONFIG_MTD_NAND=y
+CONFIG_MTD_NAND_VERIFY_WRITE=y
+CONFIG_MTD_NAND_SHARPSL=y
+CONFIG_MTD_UBI=y
+CONFIG_MTD_UBI_GLUEBI=m
+CONFIG_BLK_DEV_LOOP=y
+CONFIG_MISC_DEVICES=y
+CONFIG_BLK_DEV_SD=y
+CONFIG_BLK_DEV_SR=m
+CONFIG_CHR_DEV_SG=m
+CONFIG_SCSI_MULTI_LUN=y
+CONFIG_ATA=y
+CONFIG_PATA_PXA=y
+CONFIG_PATA_PCMCIA=y
+CONFIG_NETDEVICES=y
+CONFIG_TUN=m
+CONFIG_NET_ETHERNET=y
+# CONFIG_NETDEV_1000 is not set
+# CONFIG_NETDEV_10000 is not set
+CONFIG_AIRO_CS=m
+CONFIG_HOSTAP=m
+CONFIG_HOSTAP_FIRMWARE=y
+CONFIG_HOSTAP_CS=m
+CONFIG_USB_CATC=m
+CONFIG_USB_KAWETH=m
+CONFIG_USB_PEGASUS=m
+CONFIG_USB_RTL8150=m
+CONFIG_USB_USBNET=m
+CONFIG_USB_NET_DM9601=m
+# CONFIG_USB_NET_CDC_SUBSET is not set
+CONFIG_USB_SIERRA_NET=m
+CONFIG_NET_PCMCIA=y
+CONFIG_PCMCIA_PCNET=m
+CONFIG_PPP=m
+CONFIG_PPP_ASYNC=m
+CONFIG_PPP_DEFLATE=m
+CONFIG_PPP_BSDCOMP=m
+# CONFIG_INPUT_MOUSEDEV_PSAUX is not set
+CONFIG_INPUT_MOUSEDEV_SCREEN_X=640
+CONFIG_INPUT_MOUSEDEV_SCREEN_Y=480
+CONFIG_INPUT_EVDEV=y
+CONFIG_INPUT_APMPOWER=y
+# CONFIG_KEYBOARD_ATKBD is not set
+CONFIG_KEYBOARD_GPIO=y
+CONFIG_KEYBOARD_MATRIX=y
+# CONFIG_INPUT_MOUSE is not set
+CONFIG_INPUT_TOUCHSCREEN=y
+CONFIG_TOUCHSCREEN_ADS7846=y
+CONFIG_INPUT_MISC=y
+CONFIG_INPUT_UINPUT=m
+# CONFIG_SERIO is not set
+# CONFIG_LEGACY_PTYS is not set
+CONFIG_SERIAL_8250=m
+CONFIG_SERIAL_8250_CS=m
+CONFIG_SERIAL_PXA=y
+CONFIG_SERIAL_PXA_CONSOLE=y
+CONFIG_RAMOOPS=y
+CONFIG_SPI=y
+CONFIG_SPI_PXA2XX=y
+CONFIG_GPIO_SYSFS=y
+CONFIG_POWER_SUPPLY=y
+CONFIG_POWER_SUPPLY_DEBUG=y
+CONFIG_PDA_POWER=y
+CONFIG_APM_POWER=y
+CONFIG_FB=y
+CONFIG_FB_PXA=y
+CONFIG_FB_PXA_OVERLAY=y
+CONFIG_FB_PXA_SMARTPANEL=y
+CONFIG_FB_PXA_PARAMETERS=y
+CONFIG_BACKLIGHT_LCD_SUPPORT=y
+CONFIG_LCD_CLASS_DEVICE=y
+CONFIG_LCD_CORGI=y
+CONFIG_BACKLIGHT_CLASS_DEVICE=y
+CONFIG_DISPLAY_SUPPORT=y
+CONFIG_FRAMEBUFFER_CONSOLE=y
+CONFIG_FRAMEBUFFER_CONSOLE_ROTATION=y
+CONFIG_FONTS=y
+CONFIG_FONT_8x16=y
+CONFIG_LOGO=y
+# CONFIG_LOGO_LINUX_MONO is not set
+# CONFIG_LOGO_LINUX_VGA16 is not set
+CONFIG_SOUND=m
+CONFIG_SND=m
+CONFIG_SND_SEQUENCER=m
+CONFIG_SND_MIXER_OSS=m
+CONFIG_SND_PCM_OSS=m
+CONFIG_SND_PXA2XX_AC97=m
+CONFIG_SND_USB_AUDIO=m
+CONFIG_SND_SOC=m
+CONFIG_SND_PXA2XX_SOC=m
+CONFIG_SND_PXA2XX_SOC_SPITZ=m
+CONFIG_HID=m
+CONFIG_USB_KBD=m
+CONFIG_USB_MOUSE=m
+CONFIG_USB=m
+CONFIG_USB_DEBUG=y
+CONFIG_USB_ANNOUNCE_NEW_DEVICES=y
+CONFIG_USB_DEVICEFS=y
+CONFIG_USB_OTG_WHITELIST=y
+CONFIG_USB_MON=m
+CONFIG_USB_OHCI_HCD=m
+CONFIG_USB_SL811_HCD=m
+CONFIG_USB_SL811_CS=m
+CONFIG_USB_ACM=m
+CONFIG_USB_PRINTER=m
+CONFIG_USB_STORAGE=m
+CONFIG_USB_MDC800=m
+CONFIG_USB_MICROTEK=m
+CONFIG_USB_SERIAL=m
+CONFIG_USB_SERIAL_GENERIC=y
+CONFIG_USB_SERIAL_BELKIN=m
+CONFIG_USB_SERIAL_DIGI_ACCELEPORT=m
+CONFIG_USB_SERIAL_CYPRESS_M8=m
+CONFIG_USB_SERIAL_EMPEG=m
+CONFIG_USB_SERIAL_FTDI_SIO=m
+CONFIG_USB_SERIAL_VISOR=m
+CONFIG_USB_SERIAL_IPAQ=m
+CONFIG_USB_SERIAL_IR=m
+CONFIG_USB_SERIAL_EDGEPORT=m
+CONFIG_USB_SERIAL_EDGEPORT_TI=m
+CONFIG_USB_SERIAL_GARMIN=m
+CONFIG_USB_SERIAL_IPW=m
+CONFIG_USB_SERIAL_KEYSPAN_PDA=m
+CONFIG_USB_SERIAL_KEYSPAN=m
+CONFIG_USB_SERIAL_KLSI=m
+CONFIG_USB_SERIAL_KOBIL_SCT=m
+CONFIG_USB_SERIAL_MCT_U232=m
+CONFIG_USB_SERIAL_PL2303=m
+CONFIG_USB_SERIAL_SAFE=m
+CONFIG_USB_SERIAL_TI=m
+CONFIG_USB_SERIAL_CYBERJACK=m
+CONFIG_USB_SERIAL_XIRCOM=m
+CONFIG_USB_SERIAL_OMNINET=m
+CONFIG_USB_EMI62=m
+CONFIG_USB_EMI26=m
+CONFIG_USB_RIO500=m
+CONFIG_USB_LEGOTOWER=m
+CONFIG_USB_LCD=m
+CONFIG_USB_LED=m
+CONFIG_USB_CYTHERM=m
+CONFIG_USB_IDMOUSE=m
+CONFIG_USB_GADGET=m
+CONFIG_USB_GADGET_DEBUG_FILES=y
+CONFIG_USB_GADGET_DEBUG_FS=y
+CONFIG_USB_GADGET_PXA27X=y
+CONFIG_USB_ZERO=m
+CONFIG_USB_ETH=m
+CONFIG_USB_ETH_EEM=y
+CONFIG_USB_GADGETFS=m
+CONFIG_USB_FILE_STORAGE=m
+CONFIG_USB_MASS_STORAGE=m
+CONFIG_USB_G_SERIAL=m
+CONFIG_USB_CDC_COMPOSITE=m
+CONFIG_USB_G_MULTI=m
+CONFIG_USB_G_MULTI_CDC=y
+CONFIG_USB_GPIO_VBUS=m
+CONFIG_USB_ULPI=y
+CONFIG_NOP_USB_XCEIV=m
+CONFIG_MMC=y
+CONFIG_MMC_UNSAFE_RESUME=y
+CONFIG_MMC_PXA=y
+CONFIG_MMC_SPI=y
+CONFIG_NEW_LEDS=y
+CONFIG_LEDS_CLASS=y
+CONFIG_LEDS_GPIO=y
+CONFIG_LEDS_TRIGGERS=y
+CONFIG_LEDS_TRIGGER_TIMER=y
+CONFIG_LEDS_TRIGGER_HEARTBEAT=y
+CONFIG_RTC_CLASS=m
+CONFIG_RTC_DRV_SA1100=m
+CONFIG_RTC_DRV_PXA=m
+CONFIG_EXT2_FS=y
+CONFIG_EXT3_FS=y
+# CONFIG_EXT3_DEFAULTS_TO_ORDERED is not set
+# CONFIG_EXT3_FS_XATTR is not set
+CONFIG_EXT4_FS=y
+CONFIG_VFAT_FS=y
+CONFIG_TMPFS=y
+CONFIG_TMPFS_POSIX_ACL=y
+CONFIG_JFFS2_FS=y
+CONFIG_JFFS2_SUMMARY=y
+CONFIG_JFFS2_COMPRESSION_OPTIONS=y
+CONFIG_JFFS2_LZO=y
+CONFIG_JFFS2_RUBIN=y
+CONFIG_UBIFS_FS=y
+CONFIG_UBIFS_FS_ADVANCED_COMPR=y
+CONFIG_CRAMFS=m
+CONFIG_NFS_FS=m
+CONFIG_NFS_V3=y
+CONFIG_NFS_V4=y
+CONFIG_NFSD=m
+CONFIG_NFSD_V4=y
+CONFIG_CIFS=m
+CONFIG_PARTITION_ADVANCED=y
+CONFIG_NLS_DEFAULT="cp437"
+CONFIG_NLS_CODEPAGE_437=y
+CONFIG_NLS_CODEPAGE_737=m
+CONFIG_NLS_CODEPAGE_775=m
+CONFIG_NLS_CODEPAGE_850=m
+CONFIG_NLS_CODEPAGE_852=m
+CONFIG_NLS_CODEPAGE_855=m
+CONFIG_NLS_CODEPAGE_857=m
+CONFIG_NLS_CODEPAGE_860=m
+CONFIG_NLS_CODEPAGE_861=m
+CONFIG_NLS_CODEPAGE_862=m
+CONFIG_NLS_CODEPAGE_863=m
+CONFIG_NLS_CODEPAGE_864=m
+CONFIG_NLS_CODEPAGE_865=m
+CONFIG_NLS_CODEPAGE_866=m
+CONFIG_NLS_CODEPAGE_869=m
+CONFIG_NLS_CODEPAGE_936=m
+CONFIG_NLS_CODEPAGE_950=m
+CONFIG_NLS_CODEPAGE_932=m
+CONFIG_NLS_CODEPAGE_949=m
+CONFIG_NLS_CODEPAGE_874=m
+CONFIG_NLS_ISO8859_8=m
+CONFIG_NLS_CODEPAGE_1250=m
+CONFIG_NLS_CODEPAGE_1251=m
+CONFIG_NLS_ASCII=m
+CONFIG_NLS_ISO8859_1=y
+CONFIG_NLS_ISO8859_2=m
+CONFIG_NLS_ISO8859_3=m
+CONFIG_NLS_ISO8859_4=m
+CONFIG_NLS_ISO8859_5=m
+CONFIG_NLS_ISO8859_6=m
+CONFIG_NLS_ISO8859_7=m
+CONFIG_NLS_ISO8859_9=m
+CONFIG_NLS_ISO8859_13=m
+CONFIG_NLS_ISO8859_14=m
+CONFIG_NLS_ISO8859_15=m
+CONFIG_NLS_KOI8_R=m
+CONFIG_NLS_KOI8_U=m
+CONFIG_NLS_UTF8=y
+CONFIG_MAGIC_SYSRQ=y
+CONFIG_DEBUG_FS=y
+CONFIG_SYSCTL_SYSCALL_CHECK=y
+CONFIG_CRYPTO_NULL=m
+CONFIG_CRYPTO_TEST=m
+CONFIG_CRYPTO_PCBC=m
+CONFIG_CRYPTO_SHA256=m
+CONFIG_CRYPTO_SHA512=m
+CONFIG_CRYPTO_WP512=m
+CONFIG_CRYPTO_ANUBIS=m
+CONFIG_CRYPTO_BLOWFISH=m
+CONFIG_CRYPTO_CAMELLIA=m
+CONFIG_CRYPTO_CAST5=m
+CONFIG_CRYPTO_CAST6=m
+CONFIG_CRYPTO_KHAZAD=m
+CONFIG_CRYPTO_SERPENT=m
+CONFIG_CRYPTO_TEA=m
+CONFIG_CRYPTO_TWOFISH=m
+# CONFIG_CRYPTO_HW is not set
+CONFIG_CRC_CCITT=y
+CONFIG_LIBCRC32C=m
diff --git a/recipes/linux/linux/c7x0/defconfig b/recipes/linux/linux/c7x0/defconfig
new file mode 100644
index 0000000000..4e00cd764c
--- /dev/null
+++ b/recipes/linux/linux/c7x0/defconfig
@@ -0,0 +1,378 @@
+CONFIG_EXPERIMENTAL=y
+# CONFIG_LOCALVERSION_AUTO is not set
+CONFIG_SYSVIPC=y
+CONFIG_BSD_PROCESS_ACCT=y
+CONFIG_BSD_PROCESS_ACCT_V3=y
+CONFIG_IKCONFIG=m
+CONFIG_IKCONFIG_PROC=y
+CONFIG_LOG_BUF_SHIFT=14
+CONFIG_BLK_DEV_INITRD=y
+CONFIG_RD_BZIP2=y
+CONFIG_RD_LZMA=y
+CONFIG_RD_LZO=y
+# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
+CONFIG_EMBEDDED=y
+CONFIG_SLOB=y
+CONFIG_PROFILING=y
+CONFIG_OPROFILE=m
+CONFIG_MODULES=y
+CONFIG_MODULE_UNLOAD=y
+CONFIG_MODULE_FORCE_UNLOAD=y
+# CONFIG_LBDAF is not set
+CONFIG_IOSCHED_DEADLINE=m
+CONFIG_IOSCHED_CFQ=m
+CONFIG_ARCH_PXA=y
+CONFIG_PXA_SHARPSL=y
+CONFIG_MACH_CORGI=y
+CONFIG_MACH_SHEPHERD=y
+CONFIG_MACH_HUSKY=y
+CONFIG_PCCARD=y
+CONFIG_PCMCIA_PXA2XX=y
+CONFIG_NO_HZ=y
+CONFIG_HIGH_RES_TIMERS=y
+CONFIG_AEABI=y
+# CONFIG_OABI_COMPAT is not set
+CONFIG_ZBOOT_ROM_TEXT=0x0
+CONFIG_ZBOOT_ROM_BSS=0x0
+CONFIG_CMDLINE="console=ttyS0,115200n8 console=tty1 quiet"
+CONFIG_KEXEC=y
+# CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS is not set
+CONFIG_BINFMT_AOUT=m
+CONFIG_BINFMT_MISC=m
+CONFIG_PM_RUNTIME=y
+CONFIG_NET=y
+CONFIG_PACKET=m
+CONFIG_UNIX=y
+CONFIG_XFRM_USER=m
+CONFIG_INET=y
+CONFIG_INET_XFRM_MODE_TRANSPORT=m
+CONFIG_INET_XFRM_MODE_TUNNEL=m
+CONFIG_INET_XFRM_MODE_BEET=m
+# CONFIG_INET_LRO is not set
+CONFIG_INET_DIAG=m
+CONFIG_INET6_AH=m
+CONFIG_INET6_ESP=m
+CONFIG_INET6_IPCOMP=m
+CONFIG_IPV6_TUNNEL=m
+CONFIG_NETFILTER=y
+CONFIG_NF_CONNTRACK=m
+CONFIG_NF_CONNTRACK_FTP=m
+CONFIG_NF_CONNTRACK_H323=m
+CONFIG_NF_CONNTRACK_IRC=m
+CONFIG_NF_CONNTRACK_SIP=m
+CONFIG_NF_CONNTRACK_IPV4=m
+CONFIG_IP_NF_IPTABLES=m
+CONFIG_IP_NF_MATCH_AH=m
+CONFIG_IP_NF_MATCH_ECN=m
+CONFIG_IP_NF_MATCH_TTL=m
+CONFIG_IP_NF_FILTER=m
+CONFIG_IP_NF_TARGET_REJECT=m
+CONFIG_IP_NF_TARGET_LOG=m
+CONFIG_IP_NF_TARGET_ULOG=m
+CONFIG_NF_NAT=m
+CONFIG_IP_NF_TARGET_MASQUERADE=m
+CONFIG_IP_NF_TARGET_NETMAP=m
+CONFIG_IP_NF_TARGET_REDIRECT=m
+CONFIG_IP_NF_MANGLE=m
+CONFIG_IP_NF_TARGET_ECN=m
+CONFIG_IP_NF_TARGET_TTL=m
+CONFIG_IP_NF_RAW=m
+CONFIG_IP_NF_ARPTABLES=m
+CONFIG_IP_NF_ARPFILTER=m
+CONFIG_IP_NF_ARP_MANGLE=m
+CONFIG_IRDA=m
+CONFIG_IRLAN=m
+CONFIG_IRNET=m
+CONFIG_IRCOMM=m
+CONFIG_PXA_FICP=m
+CONFIG_BT=m
+CONFIG_BT_L2CAP=y
+CONFIG_BT_SCO=y
+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
+CONFIG_BT_HCIBTUSB=m
+CONFIG_BT_HCIBTSDIO=m
+CONFIG_BT_HCIUART=m
+CONFIG_BT_HCIUART_H4=y
+CONFIG_BT_HCIUART_BCSP=y
+CONFIG_BT_HCIUART_ATH3K=y
+CONFIG_BT_HCIUART_LL=y
+CONFIG_BT_HCIBCM203X=m
+CONFIG_BT_HCIBPA10X=m
+CONFIG_BT_HCIBFUSB=m
+CONFIG_BT_HCIDTL1=m
+CONFIG_BT_HCIBT3C=m
+CONFIG_BT_HCIBLUECARD=m
+CONFIG_BT_HCIBTUART=m
+CONFIG_BT_HCIVHCI=m
+CONFIG_BT_MRVL=m
+CONFIG_BT_MRVL_SDIO=m
+CONFIG_BT_ATH3K=m
+CONFIG_CFG80211=m
+# CONFIG_CFG80211_DEFAULT_PS is not set
+CONFIG_MAC80211=m
+# CONFIG_MAC80211_RC_MINSTREL is not set
+CONFIG_DEVTMPFS=y
+CONFIG_DEVTMPFS_MOUNT=y
+CONFIG_MTD=y
+CONFIG_MTD_PARTITIONS=y
+CONFIG_MTD_CMDLINE_PARTS=y
+CONFIG_MTD_CHAR=y
+CONFIG_MTD_BLOCK=y
+CONFIG_MTD_ROM=y
+CONFIG_MTD_COMPLEX_MAPPINGS=y
+CONFIG_MTD_PHYSMAP=y
+CONFIG_MTD_NAND=y
+CONFIG_MTD_NAND_VERIFY_WRITE=y
+CONFIG_MTD_NAND_SHARPSL=y
+CONFIG_MTD_UBI=y
+CONFIG_MTD_UBI_GLUEBI=m
+CONFIG_BLK_DEV_LOOP=y
+CONFIG_MISC_DEVICES=y
+CONFIG_BLK_DEV_SD=y
+CONFIG_BLK_DEV_SR=m
+CONFIG_CHR_DEV_SG=m
+CONFIG_SCSI_MULTI_LUN=y
+CONFIG_ATA=y
+CONFIG_PATA_PXA=y
+CONFIG_PATA_PCMCIA=y
+CONFIG_NETDEVICES=y
+CONFIG_TUN=m
+CONFIG_NET_ETHERNET=y
+# CONFIG_NETDEV_1000 is not set
+# CONFIG_NETDEV_10000 is not set
+CONFIG_AIRO_CS=m
+CONFIG_HOSTAP=m
+CONFIG_HOSTAP_FIRMWARE=y
+CONFIG_HOSTAP_CS=m
+CONFIG_USB_CATC=m
+CONFIG_USB_KAWETH=m
+CONFIG_USB_PEGASUS=m
+CONFIG_USB_RTL8150=m
+CONFIG_USB_USBNET=m
+CONFIG_USB_NET_DM9601=m
+# CONFIG_USB_NET_CDC_SUBSET is not set
+CONFIG_USB_SIERRA_NET=m
+CONFIG_NET_PCMCIA=y
+CONFIG_PCMCIA_PCNET=m
+CONFIG_PPP=m
+CONFIG_PPP_ASYNC=m
+CONFIG_PPP_DEFLATE=m
+CONFIG_PPP_BSDCOMP=m
+# CONFIG_INPUT_MOUSEDEV_PSAUX is not set
+CONFIG_INPUT_MOUSEDEV_SCREEN_X=640
+CONFIG_INPUT_MOUSEDEV_SCREEN_Y=480
+CONFIG_INPUT_EVDEV=y
+CONFIG_INPUT_APMPOWER=y
+# CONFIG_KEYBOARD_ATKBD is not set
+CONFIG_KEYBOARD_GPIO=y
+CONFIG_KEYBOARD_MATRIX=y
+# CONFIG_INPUT_MOUSE is not set
+CONFIG_INPUT_TOUCHSCREEN=y
+CONFIG_TOUCHSCREEN_ADS7846=y
+CONFIG_INPUT_MISC=y
+CONFIG_INPUT_UINPUT=m
+# CONFIG_SERIO is not set
+# CONFIG_LEGACY_PTYS is not set
+CONFIG_SERIAL_8250=m
+CONFIG_SERIAL_8250_CS=m
+CONFIG_SERIAL_PXA=y
+CONFIG_SERIAL_PXA_CONSOLE=y
+CONFIG_RAMOOPS=y
+CONFIG_I2C=y
+CONFIG_I2C_PXA=y
+CONFIG_SPI=y
+CONFIG_SPI_PXA2XX=y
+CONFIG_GPIO_SYSFS=y
+CONFIG_POWER_SUPPLY=y
+CONFIG_POWER_SUPPLY_DEBUG=y
+CONFIG_PDA_POWER=y
+CONFIG_APM_POWER=y
+CONFIG_FB=y
+CONFIG_FB_W100=y
+CONFIG_BACKLIGHT_LCD_SUPPORT=y
+CONFIG_LCD_CLASS_DEVICE=y
+CONFIG_LCD_CORGI=y
+CONFIG_BACKLIGHT_CLASS_DEVICE=y
+CONFIG_DISPLAY_SUPPORT=y
+CONFIG_FRAMEBUFFER_CONSOLE=y
+CONFIG_FONTS=y
+CONFIG_FONT_8x16=y
+CONFIG_LOGO=y
+# CONFIG_LOGO_LINUX_MONO is not set
+# CONFIG_LOGO_LINUX_VGA16 is not set
+CONFIG_SOUND=m
+CONFIG_SND=m
+CONFIG_SND_SEQUENCER=m
+CONFIG_SND_MIXER_OSS=m
+CONFIG_SND_PCM_OSS=m
+CONFIG_SND_PXA2XX_AC97=m
+CONFIG_SND_USB_AUDIO=m
+CONFIG_SND_SOC=m
+CONFIG_SND_PXA2XX_SOC=m
+CONFIG_SND_PXA2XX_SOC_CORGI=m
+CONFIG_HID=m
+CONFIG_USB_KBD=m
+CONFIG_USB_MOUSE=m
+CONFIG_USB=m
+CONFIG_USB_DEBUG=y
+CONFIG_USB_ANNOUNCE_NEW_DEVICES=y
+CONFIG_USB_DEVICEFS=y
+CONFIG_USB_OTG_WHITELIST=y
+CONFIG_USB_MON=m
+CONFIG_USB_SL811_HCD=m
+CONFIG_USB_SL811_CS=m
+CONFIG_USB_ACM=m
+CONFIG_USB_PRINTER=m
+CONFIG_USB_STORAGE=m
+CONFIG_USB_MDC800=m
+CONFIG_USB_MICROTEK=m
+CONFIG_USB_SERIAL=m
+CONFIG_USB_SERIAL_GENERIC=y
+CONFIG_USB_SERIAL_BELKIN=m
+CONFIG_USB_SERIAL_DIGI_ACCELEPORT=m
+CONFIG_USB_SERIAL_CYPRESS_M8=m
+CONFIG_USB_SERIAL_EMPEG=m
+CONFIG_USB_SERIAL_FTDI_SIO=m
+CONFIG_USB_SERIAL_VISOR=m
+CONFIG_USB_SERIAL_IPAQ=m
+CONFIG_USB_SERIAL_IR=m
+CONFIG_USB_SERIAL_EDGEPORT=m
+CONFIG_USB_SERIAL_EDGEPORT_TI=m
+CONFIG_USB_SERIAL_GARMIN=m
+CONFIG_USB_SERIAL_IPW=m
+CONFIG_USB_SERIAL_KEYSPAN_PDA=m
+CONFIG_USB_SERIAL_KEYSPAN=m
+CONFIG_USB_SERIAL_KLSI=m
+CONFIG_USB_SERIAL_KOBIL_SCT=m
+CONFIG_USB_SERIAL_MCT_U232=m
+CONFIG_USB_SERIAL_PL2303=m
+CONFIG_USB_SERIAL_SAFE=m
+CONFIG_USB_SERIAL_TI=m
+CONFIG_USB_SERIAL_CYBERJACK=m
+CONFIG_USB_SERIAL_XIRCOM=m
+CONFIG_USB_SERIAL_OMNINET=m
+CONFIG_USB_EMI62=m
+CONFIG_USB_EMI26=m
+CONFIG_USB_RIO500=m
+CONFIG_USB_LEGOTOWER=m
+CONFIG_USB_LCD=m
+CONFIG_USB_LED=m
+CONFIG_USB_CYTHERM=m
+CONFIG_USB_IDMOUSE=m
+CONFIG_USB_GADGET=m
+CONFIG_USB_GADGET_DEBUG_FILES=y
+CONFIG_USB_GADGET_DEBUG_FS=y
+CONFIG_USB_ZERO=m
+CONFIG_USB_ETH=m
+CONFIG_USB_ETH_EEM=y
+CONFIG_USB_GADGETFS=m
+CONFIG_USB_FILE_STORAGE=m
+CONFIG_USB_MASS_STORAGE=m
+CONFIG_USB_G_SERIAL=m
+CONFIG_USB_CDC_COMPOSITE=m
+CONFIG_USB_G_MULTI=m
+CONFIG_USB_G_MULTI_CDC=y
+CONFIG_USB_GPIO_VBUS=m
+CONFIG_USB_ULPI=y
+CONFIG_NOP_USB_XCEIV=m
+CONFIG_MMC=y
+CONFIG_MMC_UNSAFE_RESUME=y
+CONFIG_MMC_PXA=y
+CONFIG_MMC_SPI=y
+CONFIG_NEW_LEDS=y
+CONFIG_LEDS_CLASS=y
+CONFIG_LEDS_GPIO=y
+CONFIG_LEDS_TRIGGERS=y
+CONFIG_LEDS_TRIGGER_TIMER=y
+CONFIG_LEDS_TRIGGER_HEARTBEAT=y
+CONFIG_RTC_CLASS=m
+CONFIG_RTC_DRV_SA1100=m
+CONFIG_RTC_DRV_PXA=m
+CONFIG_EXT2_FS=y
+CONFIG_EXT3_FS=y
+# CONFIG_EXT3_DEFAULTS_TO_ORDERED is not set
+# CONFIG_EXT3_FS_XATTR is not set
+CONFIG_EXT4_FS=y
+CONFIG_VFAT_FS=y
+CONFIG_TMPFS=y
+CONFIG_TMPFS_POSIX_ACL=y
+CONFIG_JFFS2_FS=y
+CONFIG_JFFS2_SUMMARY=y
+CONFIG_JFFS2_COMPRESSION_OPTIONS=y
+CONFIG_JFFS2_LZO=y
+CONFIG_JFFS2_RUBIN=y
+CONFIG_UBIFS_FS=y
+CONFIG_UBIFS_FS_ADVANCED_COMPR=y
+CONFIG_CRAMFS=m
+CONFIG_NFS_FS=m
+CONFIG_NFS_V3=y
+CONFIG_NFS_V4=y
+CONFIG_NFSD=m
+CONFIG_NFSD_V4=y
+CONFIG_CIFS=m
+CONFIG_PARTITION_ADVANCED=y
+CONFIG_NLS_DEFAULT="cp437"
+CONFIG_NLS_CODEPAGE_437=y
+CONFIG_NLS_CODEPAGE_737=m
+CONFIG_NLS_CODEPAGE_775=m
+CONFIG_NLS_CODEPAGE_850=m
+CONFIG_NLS_CODEPAGE_852=m
+CONFIG_NLS_CODEPAGE_855=m
+CONFIG_NLS_CODEPAGE_857=m
+CONFIG_NLS_CODEPAGE_860=m
+CONFIG_NLS_CODEPAGE_861=m
+CONFIG_NLS_CODEPAGE_862=m
+CONFIG_NLS_CODEPAGE_863=m
+CONFIG_NLS_CODEPAGE_864=m
+CONFIG_NLS_CODEPAGE_865=m
+CONFIG_NLS_CODEPAGE_866=m
+CONFIG_NLS_CODEPAGE_869=m
+CONFIG_NLS_CODEPAGE_936=m
+CONFIG_NLS_CODEPAGE_950=m
+CONFIG_NLS_CODEPAGE_932=m
+CONFIG_NLS_CODEPAGE_949=m
+CONFIG_NLS_CODEPAGE_874=m
+CONFIG_NLS_ISO8859_8=m
+CONFIG_NLS_CODEPAGE_1250=m
+CONFIG_NLS_CODEPAGE_1251=m
+CONFIG_NLS_ASCII=m
+CONFIG_NLS_ISO8859_1=y
+CONFIG_NLS_ISO8859_2=m
+CONFIG_NLS_ISO8859_3=m
+CONFIG_NLS_ISO8859_4=m
+CONFIG_NLS_ISO8859_5=m
+CONFIG_NLS_ISO8859_6=m
+CONFIG_NLS_ISO8859_7=m
+CONFIG_NLS_ISO8859_9=m
+CONFIG_NLS_ISO8859_13=m
+CONFIG_NLS_ISO8859_14=m
+CONFIG_NLS_ISO8859_15=m
+CONFIG_NLS_KOI8_R=m
+CONFIG_NLS_KOI8_U=m
+CONFIG_NLS_UTF8=y
+CONFIG_MAGIC_SYSRQ=y
+CONFIG_DEBUG_FS=y
+CONFIG_SYSCTL_SYSCALL_CHECK=y
+CONFIG_CRYPTO_NULL=m
+CONFIG_CRYPTO_TEST=m
+CONFIG_CRYPTO_PCBC=m
+CONFIG_CRYPTO_SHA256=m
+CONFIG_CRYPTO_SHA512=m
+CONFIG_CRYPTO_WP512=m
+CONFIG_CRYPTO_ANUBIS=m
+CONFIG_CRYPTO_BLOWFISH=m
+CONFIG_CRYPTO_CAMELLIA=m
+CONFIG_CRYPTO_CAST5=m
+CONFIG_CRYPTO_CAST6=m
+CONFIG_CRYPTO_KHAZAD=m
+CONFIG_CRYPTO_SERPENT=m
+CONFIG_CRYPTO_TEA=m
+CONFIG_CRYPTO_TWOFISH=m
+# CONFIG_CRYPTO_HW is not set
+CONFIG_CRC_CCITT=y
+CONFIG_LIBCRC32C=m
diff --git a/recipes/linux/linux/collie/defconfig b/recipes/linux/linux/collie/defconfig
new file mode 100644
index 0000000000..4711f095ae
--- /dev/null
+++ b/recipes/linux/linux/collie/defconfig
@@ -0,0 +1,324 @@
+CONFIG_EXPERIMENTAL=y
+# CONFIG_LOCALVERSION_AUTO is not set
+CONFIG_SYSVIPC=y
+CONFIG_BSD_PROCESS_ACCT=y
+CONFIG_BSD_PROCESS_ACCT_V3=y
+CONFIG_SPARSE_IRQ=y
+CONFIG_IKCONFIG=m
+CONFIG_IKCONFIG_PROC=y
+CONFIG_LOG_BUF_SHIFT=14
+CONFIG_BLK_DEV_INITRD=y
+CONFIG_RD_BZIP2=y
+CONFIG_RD_LZMA=y
+CONFIG_RD_LZO=y
+# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
+CONFIG_EMBEDDED=y
+CONFIG_SLOB=y
+CONFIG_PROFILING=y
+CONFIG_OPROFILE=m
+CONFIG_MODULES=y
+CONFIG_MODULE_UNLOAD=y
+CONFIG_MODULE_FORCE_UNLOAD=y
+# CONFIG_LBDAF is not set
+CONFIG_IOSCHED_DEADLINE=m
+CONFIG_IOSCHED_CFQ=m
+CONFIG_ARCH_SA1100=y
+CONFIG_SA1100_COLLIE=y
+CONFIG_PCCARD=y
+CONFIG_PCMCIA_SA1100=y
+CONFIG_NO_HZ=y
+CONFIG_HIGH_RES_TIMERS=y
+CONFIG_AEABI=y
+# CONFIG_OABI_COMPAT is not set
+CONFIG_ZBOOT_ROM_TEXT=0x0
+CONFIG_ZBOOT_ROM_BSS=0x0
+CONFIG_CMDLINE="console=ttySA0,115200n8 console=tty1 mem=64M fbcon=rotate:1 quiet"
+CONFIG_KEXEC=y
+# CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS is not set
+CONFIG_BINFMT_AOUT=m
+CONFIG_BINFMT_MISC=m
+CONFIG_PM_RUNTIME=y
+CONFIG_APM_EMULATION=y
+CONFIG_NET=y
+CONFIG_PACKET=m
+CONFIG_UNIX=y
+CONFIG_XFRM_USER=m
+CONFIG_INET=y
+CONFIG_INET_XFRM_MODE_TRANSPORT=m
+CONFIG_INET_XFRM_MODE_TUNNEL=m
+CONFIG_INET_XFRM_MODE_BEET=m
+# CONFIG_INET_LRO is not set
+CONFIG_INET_DIAG=m
+CONFIG_INET6_AH=m
+CONFIG_INET6_ESP=m
+CONFIG_INET6_IPCOMP=m
+CONFIG_IPV6_TUNNEL=m
+CONFIG_NETFILTER=y
+CONFIG_NF_CONNTRACK=m
+CONFIG_NF_CONNTRACK_FTP=m
+CONFIG_NF_CONNTRACK_H323=m
+CONFIG_NF_CONNTRACK_IRC=m
+CONFIG_NF_CONNTRACK_SIP=m
+CONFIG_NF_CONNTRACK_IPV4=m
+CONFIG_IP_NF_IPTABLES=m
+CONFIG_IP_NF_MATCH_AH=m
+CONFIG_IP_NF_MATCH_ECN=m
+CONFIG_IP_NF_MATCH_TTL=m
+CONFIG_IP_NF_FILTER=m
+CONFIG_IP_NF_TARGET_REJECT=m
+CONFIG_IP_NF_TARGET_LOG=m
+CONFIG_IP_NF_TARGET_ULOG=m
+CONFIG_NF_NAT=m
+CONFIG_IP_NF_TARGET_MASQUERADE=m
+CONFIG_IP_NF_TARGET_NETMAP=m
+CONFIG_IP_NF_TARGET_REDIRECT=m
+CONFIG_IP_NF_MANGLE=m
+CONFIG_IP_NF_TARGET_ECN=m
+CONFIG_IP_NF_TARGET_TTL=m
+CONFIG_IP_NF_RAW=m
+CONFIG_IP_NF_ARPTABLES=m
+CONFIG_IP_NF_ARPFILTER=m
+CONFIG_IP_NF_ARP_MANGLE=m
+CONFIG_IRDA=m
+CONFIG_IRLAN=m
+CONFIG_IRNET=m
+CONFIG_IRCOMM=m
+CONFIG_BT=m
+CONFIG_BT_L2CAP=y
+CONFIG_BT_SCO=y
+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
+CONFIG_BT_HCIBTSDIO=m
+CONFIG_BT_HCIUART=m
+CONFIG_BT_HCIUART_H4=y
+CONFIG_BT_HCIUART_BCSP=y
+CONFIG_BT_HCIUART_ATH3K=y
+CONFIG_BT_HCIUART_LL=y
+CONFIG_BT_HCIDTL1=m
+CONFIG_BT_HCIBT3C=m
+CONFIG_BT_HCIBLUECARD=m
+CONFIG_BT_HCIBTUART=m
+CONFIG_BT_HCIVHCI=m
+CONFIG_BT_MRVL=m
+CONFIG_BT_MRVL_SDIO=m
+CONFIG_CFG80211=m
+# CONFIG_CFG80211_DEFAULT_PS is not set
+CONFIG_MAC80211=m
+# CONFIG_MAC80211_RC_MINSTREL is not set
+CONFIG_DEVTMPFS=y
+CONFIG_DEVTMPFS_MOUNT=y
+CONFIG_MTD=y
+CONFIG_MTD_PARTITIONS=y
+CONFIG_MTD_CMDLINE_PARTS=y
+CONFIG_MTD_CHAR=y
+CONFIG_MTD_BLOCK=y
+CONFIG_MTD_CFI=y
+CONFIG_MTD_JEDECPROBE=y
+CONFIG_MTD_CFI_ADV_OPTIONS=y
+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_CFI_I1 is not set
+# CONFIG_MTD_CFI_I2 is not set
+CONFIG_MTD_CFI_I4=y
+CONFIG_MTD_CFI_INTELEXT=y
+CONFIG_MTD_ROM=y
+CONFIG_MTD_COMPLEX_MAPPINGS=y
+CONFIG_MTD_PHYSMAP=y
+CONFIG_MTD_SA1100=y
+CONFIG_MTD_NAND=y
+CONFIG_MTD_NAND_VERIFY_WRITE=y
+CONFIG_MTD_UBI=y
+CONFIG_MTD_UBI_GLUEBI=m
+CONFIG_BLK_DEV_LOOP=y
+CONFIG_MISC_DEVICES=y
+CONFIG_BLK_DEV_SD=y
+CONFIG_BLK_DEV_SR=m
+CONFIG_CHR_DEV_SG=m
+CONFIG_SCSI_MULTI_LUN=y
+CONFIG_ATA=y
+CONFIG_PATA_PCMCIA=y
+CONFIG_NETDEVICES=y
+CONFIG_TUN=m
+CONFIG_MII=m
+CONFIG_NET_ETHERNET=y
+# CONFIG_NETDEV_1000 is not set
+# CONFIG_NETDEV_10000 is not set
+CONFIG_AIRO_CS=m
+CONFIG_HOSTAP=m
+CONFIG_HOSTAP_FIRMWARE=y
+CONFIG_HOSTAP_CS=m
+CONFIG_NET_PCMCIA=y
+CONFIG_PCMCIA_PCNET=m
+CONFIG_PPP=m
+CONFIG_PPP_ASYNC=m
+CONFIG_PPP_DEFLATE=m
+CONFIG_PPP_BSDCOMP=m
+# CONFIG_INPUT_MOUSEDEV_PSAUX is not set
+CONFIG_INPUT_MOUSEDEV_SCREEN_X=240
+CONFIG_INPUT_MOUSEDEV_SCREEN_Y=320
+CONFIG_INPUT_EVDEV=y
+CONFIG_INPUT_APMPOWER=y
+# CONFIG_KEYBOARD_ATKBD is not set
+CONFIG_KEYBOARD_GPIO=y
+CONFIG_KEYBOARD_LOCOMO=y
+# CONFIG_INPUT_MOUSE is not set
+CONFIG_INPUT_TOUCHSCREEN=y
+CONFIG_TOUCHSCREEN_ADS7846=y
+CONFIG_INPUT_MISC=y
+CONFIG_INPUT_UINPUT=m
+# CONFIG_SERIO is not set
+# CONFIG_LEGACY_PTYS is not set
+CONFIG_SERIAL_8250=m
+CONFIG_SERIAL_8250_CS=m
+CONFIG_SERIAL_SA1100=y
+CONFIG_SERIAL_SA1100_CONSOLE=y
+CONFIG_RAMOOPS=y
+CONFIG_I2C=y
+CONFIG_SPI=y
+CONFIG_GPIO_SYSFS=y
+CONFIG_POWER_SUPPLY=y
+CONFIG_POWER_SUPPLY_DEBUG=y
+CONFIG_PDA_POWER=y
+CONFIG_APM_POWER=y
+CONFIG_SENSORS_MAX1111=y
+CONFIG_MCP_SA11X0=y
+CONFIG_MCP_UCB1200=y
+CONFIG_MCP_UCB1200_TS=y
+CONFIG_FB=y
+CONFIG_FB_SA1100=y
+CONFIG_BACKLIGHT_LCD_SUPPORT=y
+CONFIG_LCD_CLASS_DEVICE=y
+CONFIG_BACKLIGHT_CLASS_DEVICE=y
+# CONFIG_BACKLIGHT_GENERIC is not set
+CONFIG_DISPLAY_SUPPORT=y
+CONFIG_FRAMEBUFFER_CONSOLE=y
+CONFIG_FRAMEBUFFER_CONSOLE_ROTATION=y
+CONFIG_FONTS=y
+CONFIG_FONT_8x8=y
+CONFIG_LOGO=y
+# CONFIG_LOGO_LINUX_MONO is not set
+# CONFIG_LOGO_LINUX_VGA16 is not set
+CONFIG_SOUND=m
+CONFIG_SND=m
+CONFIG_SND_SEQUENCER=m
+CONFIG_SND_MIXER_OSS=m
+CONFIG_SND_PCM_OSS=m
+CONFIG_SND_SOC=m
+CONFIG_HID=m
+CONFIG_USB_OTG_WHITELIST=y
+CONFIG_USB_GADGET=m
+CONFIG_USB_GADGET_DEBUG_FILES=y
+CONFIG_USB_GADGET_DEBUG_FS=y
+CONFIG_USB_ZERO=m
+CONFIG_USB_ETH=m
+CONFIG_USB_ETH_EEM=y
+CONFIG_USB_GADGETFS=m
+CONFIG_USB_FILE_STORAGE=m
+CONFIG_USB_MASS_STORAGE=m
+CONFIG_USB_G_SERIAL=m
+CONFIG_USB_CDC_COMPOSITE=m
+CONFIG_USB_G_MULTI=m
+CONFIG_USB_G_MULTI_CDC=y
+CONFIG_USB_GPIO_VBUS=m
+CONFIG_USB_ULPI=y
+CONFIG_NOP_USB_XCEIV=m
+CONFIG_MMC=y
+CONFIG_MMC_UNSAFE_RESUME=y
+CONFIG_MMC_SPI=y
+CONFIG_NEW_LEDS=y
+CONFIG_LEDS_CLASS=y
+CONFIG_LEDS_LOCOMO=y
+CONFIG_LEDS_GPIO=y
+CONFIG_LEDS_TRIGGERS=y
+CONFIG_LEDS_TRIGGER_TIMER=y
+CONFIG_LEDS_TRIGGER_HEARTBEAT=y
+CONFIG_RTC_CLASS=m
+CONFIG_RTC_DRV_SA1100=m
+CONFIG_EXT2_FS=y
+CONFIG_EXT3_FS=y
+# CONFIG_EXT3_DEFAULTS_TO_ORDERED is not set
+# CONFIG_EXT3_FS_XATTR is not set
+CONFIG_EXT4_FS=y
+CONFIG_VFAT_FS=y
+CONFIG_TMPFS=y
+CONFIG_TMPFS_POSIX_ACL=y
+CONFIG_JFFS2_FS=y
+CONFIG_JFFS2_SUMMARY=y
+CONFIG_JFFS2_COMPRESSION_OPTIONS=y
+CONFIG_JFFS2_LZO=y
+CONFIG_JFFS2_RUBIN=y
+CONFIG_UBIFS_FS=y
+CONFIG_UBIFS_FS_ADVANCED_COMPR=y
+CONFIG_CRAMFS=m
+CONFIG_NFS_FS=m
+CONFIG_NFS_V3=y
+CONFIG_NFS_V4=y
+CONFIG_NFSD=m
+CONFIG_NFSD_V4=y
+CONFIG_CIFS=m
+CONFIG_PARTITION_ADVANCED=y
+CONFIG_NLS_DEFAULT="cp437"
+CONFIG_NLS_CODEPAGE_437=y
+CONFIG_NLS_CODEPAGE_737=m
+CONFIG_NLS_CODEPAGE_775=m
+CONFIG_NLS_CODEPAGE_850=m
+CONFIG_NLS_CODEPAGE_852=m
+CONFIG_NLS_CODEPAGE_855=m
+CONFIG_NLS_CODEPAGE_857=m
+CONFIG_NLS_CODEPAGE_860=m
+CONFIG_NLS_CODEPAGE_861=m
+CONFIG_NLS_CODEPAGE_862=m
+CONFIG_NLS_CODEPAGE_863=m
+CONFIG_NLS_CODEPAGE_864=m
+CONFIG_NLS_CODEPAGE_865=m
+CONFIG_NLS_CODEPAGE_866=m
+CONFIG_NLS_CODEPAGE_869=m
+CONFIG_NLS_CODEPAGE_936=m
+CONFIG_NLS_CODEPAGE_950=m
+CONFIG_NLS_CODEPAGE_932=m
+CONFIG_NLS_CODEPAGE_949=m
+CONFIG_NLS_CODEPAGE_874=m
+CONFIG_NLS_ISO8859_8=m
+CONFIG_NLS_CODEPAGE_1250=m
+CONFIG_NLS_CODEPAGE_1251=m
+CONFIG_NLS_ASCII=m
+CONFIG_NLS_ISO8859_1=y
+CONFIG_NLS_ISO8859_2=m
+CONFIG_NLS_ISO8859_3=m
+CONFIG_NLS_ISO8859_4=m
+CONFIG_NLS_ISO8859_5=m
+CONFIG_NLS_ISO8859_6=m
+CONFIG_NLS_ISO8859_7=m
+CONFIG_NLS_ISO8859_9=m
+CONFIG_NLS_ISO8859_13=m
+CONFIG_NLS_ISO8859_14=m
+CONFIG_NLS_ISO8859_15=m
+CONFIG_NLS_KOI8_R=m
+CONFIG_NLS_KOI8_U=m
+CONFIG_NLS_UTF8=y
+CONFIG_MAGIC_SYSRQ=y
+CONFIG_DEBUG_FS=y
+CONFIG_SYSCTL_SYSCALL_CHECK=y
+CONFIG_CRYPTO_NULL=m
+CONFIG_CRYPTO_TEST=m
+CONFIG_CRYPTO_PCBC=m
+CONFIG_CRYPTO_SHA256=m
+CONFIG_CRYPTO_SHA512=m
+CONFIG_CRYPTO_WP512=m
+CONFIG_CRYPTO_ANUBIS=m
+CONFIG_CRYPTO_BLOWFISH=m
+CONFIG_CRYPTO_CAMELLIA=m
+CONFIG_CRYPTO_CAST5=m
+CONFIG_CRYPTO_CAST6=m
+CONFIG_CRYPTO_KHAZAD=m
+CONFIG_CRYPTO_SERPENT=m
+CONFIG_CRYPTO_TEA=m
+CONFIG_CRYPTO_TWOFISH=m
+# CONFIG_CRYPTO_HW is not set
+CONFIG_CRC_CCITT=y
+CONFIG_LIBCRC32C=m
diff --git a/recipes/linux/linux/defconfig b/recipes/linux/linux/defconfig
deleted file mode 100644
index 7e3e549061..0000000000
--- a/recipes/linux/linux/defconfig
+++ /dev/null
@@ -1,989 +0,0 @@
-#
-# Automatically generated make config: don't edit
-# Linux kernel version: 2.6.28
-# Mon Jan 12 20:23:50 2009
-#
-# 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_NOT_COHERENT_CACHE=y
-CONFIG_PPC32=y
-CONFIG_WORD_SIZE=32
-# CONFIG_ARCH_PHYS_ADDR_T_64BIT is not set
-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_HAVE_SETUP_PER_CPU_AREA is not set
-CONFIG_IRQ_PER_CPU=y
-CONFIG_STACKTRACE_SUPPORT=y
-CONFIG_HAVE_LATENCYTOP_SUPPORT=y
-CONFIG_LOCKDEP_SUPPORT=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_LOCK_KERNEL=y
-CONFIG_INIT_ENV_ARG_LIMIT=32
-CONFIG_LOCALVERSION="-isobel-gcn"
-CONFIG_LOCALVERSION_AUTO=y
-CONFIG_SWAP=y
-CONFIG_SYSVIPC=y
-CONFIG_SYSVIPC_SYSCTL=y
-# CONFIG_POSIX_MQUEUE is not set
-# CONFIG_BSD_PROCESS_ACCT is not set
-# CONFIG_TASKSTATS is not set
-# CONFIG_AUDIT is not set
-CONFIG_IKCONFIG=y
-CONFIG_IKCONFIG_PROC=y
-CONFIG_LOG_BUF_SHIFT=14
-# CONFIG_CGROUPS is not set
-CONFIG_GROUP_SCHED=y
-CONFIG_FAIR_GROUP_SCHED=y
-# CONFIG_RT_GROUP_SCHED is not set
-CONFIG_USER_SCHED=y
-# CONFIG_CGROUP_SCHED is not set
-CONFIG_SYSFS_DEPRECATED=y
-CONFIG_SYSFS_DEPRECATED_V2=y
-# CONFIG_RELAY is not set
-# CONFIG_NAMESPACES is not set
-CONFIG_BLK_DEV_INITRD=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 is not set
-CONFIG_HOTPLUG=y
-CONFIG_PRINTK=y
-CONFIG_BUG=y
-# CONFIG_ELF_CORE is not set
-CONFIG_COMPAT_BRK=y
-CONFIG_BASE_FULL=y
-CONFIG_FUTEX=y
-CONFIG_ANON_INODES=y
-CONFIG_EPOLL=y
-CONFIG_SIGNALFD=y
-CONFIG_TIMERFD=y
-CONFIG_EVENTFD=y
-CONFIG_SHMEM=y
-CONFIG_AIO=y
-# CONFIG_VM_EVENT_COUNTERS is not set
-CONFIG_SLAB=y
-# CONFIG_SLUB is not set
-# CONFIG_SLOB is not set
-# CONFIG_PROFILING is not set
-CONFIG_TRACEPOINTS=y
-CONFIG_MARKERS=y
-CONFIG_HAVE_OPROFILE=y
-# CONFIG_KPROBES is not set
-CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS=y
-CONFIG_HAVE_IOREMAP_PROT=y
-CONFIG_HAVE_KPROBES=y
-CONFIG_HAVE_KRETPROBES=y
-CONFIG_HAVE_ARCH_TRACEHOOK=y
-# CONFIG_HAVE_GENERIC_DMA_COHERENT is not set
-CONFIG_SLABINFO=y
-CONFIG_RT_MUTEXES=y
-# CONFIG_TINY_SHMEM is not set
-CONFIG_BASE_SMALL=0
-CONFIG_MODULES=y
-# CONFIG_MODULE_FORCE_LOAD is not set
-CONFIG_MODULE_UNLOAD=y
-# CONFIG_MODULE_FORCE_UNLOAD 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
-# CONFIG_BLK_DEV_INTEGRITY is not set
-
-#
-# IO Schedulers
-#
-CONFIG_IOSCHED_NOOP=y
-CONFIG_IOSCHED_AS=y
-CONFIG_IOSCHED_DEADLINE=y
-CONFIG_IOSCHED_CFQ=y
-CONFIG_DEFAULT_AS=y
-# CONFIG_DEFAULT_DEADLINE is not set
-# CONFIG_DEFAULT_CFQ is not set
-# CONFIG_DEFAULT_NOOP is not set
-CONFIG_DEFAULT_IOSCHED="anticipatory"
-CONFIG_CLASSIC_RCU=y
-# CONFIG_FREEZER is not set
-
-#
-# Platform support
-#
-CONFIG_PPC_MULTIPLATFORM=y
-CONFIG_CLASSIC32=y
-# CONFIG_PPC_CHRP is not set
-# CONFIG_MPC5121_ADS is not set
-# CONFIG_MPC5121_GENERIC is not set
-# CONFIG_PPC_MPC52xx is not set
-# CONFIG_PPC_PMAC is not set
-# CONFIG_PPC_CELL is not set
-# CONFIG_PPC_CELL_NATIVE is not set
-# CONFIG_PPC_82xx is not set
-# CONFIG_PQ2ADS is not set
-# CONFIG_PPC_83xx is not set
-# CONFIG_PPC_86xx is not set
-CONFIG_EMBEDDED6xx=y
-# CONFIG_LINKSTATION is not set
-# CONFIG_STORCENTER is not set
-# CONFIG_MPC7448HPC2 is not set
-# CONFIG_PPC_HOLLY is not set
-# CONFIG_PPC_PRPMC2800 is not set
-# CONFIG_PPC_C2K is not set
-CONFIG_GAMECUBE=y
-# CONFIG_WII is not set
-CONFIG_FLIPPER_PIC=y
-CONFIG_GAMECUBE_COMMON=y
-CONFIG_GAMECUBE_RSW=y
-CONFIG_GAMECUBE_UDBG=y
-CONFIG_USBGECKO_UDBG=y
-# CONFIG_GAMECUBE_VIDEO_UDBG is not set
-# CONFIG_IPIC 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_FSL_ULI1575 is not set
-
-#
-# Kernel options
-#
-# CONFIG_HIGHMEM 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_SCHED_HRTICK is not set
-# CONFIG_PREEMPT_NONE is not set
-# CONFIG_PREEMPT_VOLUNTARY is not set
-CONFIG_PREEMPT=y
-# CONFIG_PREEMPT_RCU is not set
-CONFIG_BINFMT_ELF=y
-# CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS is not set
-# CONFIG_HAVE_AOUT is not set
-CONFIG_BINFMT_MISC=m
-# CONFIG_IOMMU_HELPER is not set
-CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y
-CONFIG_ARCH_HAS_WALK_MEMORY=y
-CONFIG_ARCH_ENABLE_MEMORY_HOTREMOVE=y
-CONFIG_KEXEC=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_PAGEFLAGS_EXTENDED=y
-CONFIG_SPLIT_PTLOCK_CPUS=4
-# CONFIG_MIGRATION is not set
-# CONFIG_RESOURCES_64BIT is not set
-# CONFIG_PHYS_ADDR_T_64BIT is not set
-CONFIG_ZONE_DMA_FLAG=1
-CONFIG_BOUNCE=y
-CONFIG_VIRT_TO_BUS=y
-CONFIG_UNEVICTABLE_LRU=y
-CONFIG_FORCE_MAX_ZONEORDER=11
-CONFIG_PROC_DEVICETREE=y
-# CONFIG_CMDLINE_BOOL is not set
-CONFIG_EXTRA_TARGETS=""
-# CONFIG_PM is not set
-# CONFIG_SECCOMP is not set
-CONFIG_ISA_DMA_API=y
-
-#
-# Bus options
-#
-CONFIG_ZONE_DMA=y
-CONFIG_GENERIC_ISA_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_PCCARD is not set
-# CONFIG_HAS_RAPIDIO is not set
-
-#
-# Advanced setup
-#
-CONFIG_ADVANCED_OPTIONS=y
-# CONFIG_LOWMEM_SIZE_BOOL is not set
-CONFIG_LOWMEM_SIZE=0x30000000
-# CONFIG_PAGE_OFFSET_BOOL is not set
-CONFIG_PAGE_OFFSET=0xc0000000
-# CONFIG_KERNEL_START_BOOL is not set
-CONFIG_KERNEL_START=0xc0000000
-CONFIG_PHYSICAL_START=0x00000000
-# CONFIG_TASK_SIZE_BOOL is not set
-CONFIG_TASK_SIZE=0xc0000000
-# CONFIG_CONSISTENT_START_BOOL is not set
-CONFIG_CONSISTENT_START=0xff100000
-# CONFIG_CONSISTENT_SIZE_BOOL is not set
-CONFIG_CONSISTENT_SIZE=0x00200000
-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=y
-# CONFIG_NET_IPIP is not set
-# CONFIG_NET_IPGRE is not set
-# CONFIG_ARPD is not set
-# CONFIG_SYN_COOKIES is not set
-# CONFIG_INET_AH is not set
-# CONFIG_INET_ESP is not set
-# CONFIG_INET_IPCOMP is not set
-# CONFIG_INET_XFRM_TUNNEL is not set
-# CONFIG_INET_TUNNEL is not set
-# CONFIG_INET_XFRM_MODE_TRANSPORT is not set
-# CONFIG_INET_XFRM_MODE_TUNNEL is not set
-# CONFIG_INET_XFRM_MODE_BEET is not set
-# CONFIG_INET_LRO is not set
-# CONFIG_INET_DIAG is not set
-# CONFIG_TCP_CONG_ADVANCED is not set
-CONFIG_TCP_CONG_CUBIC=y
-CONFIG_DEFAULT_TCP_CONG="cubic"
-# CONFIG_TCP_MD5SIG is not set
-# CONFIG_IPV6 is not set
-# CONFIG_NETWORK_SECMARK is not set
-# CONFIG_NETFILTER is not set
-# CONFIG_IP_DCCP is not set
-# CONFIG_IP_SCTP is not set
-# CONFIG_TIPC is not set
-# CONFIG_ATM is not set
-# CONFIG_BRIDGE is not set
-# CONFIG_NET_DSA is not set
-# CONFIG_VLAN_8021Q is not set
-# CONFIG_DECNET is not set
-# CONFIG_LLC2 is not set
-# CONFIG_IPX is not set
-# CONFIG_ATALK is not set
-# CONFIG_X25 is not set
-# CONFIG_LAPB is not set
-# CONFIG_ECONET is not set
-# CONFIG_WAN_ROUTER is not set
-# CONFIG_NET_SCHED is not set
-
-#
-# Network testing
-#
-# CONFIG_NET_PKTGEN is not set
-# CONFIG_HAMRADIO is not set
-# CONFIG_CAN is not set
-# CONFIG_IRDA is not set
-# CONFIG_BT is not set
-# CONFIG_AF_RXRPC is not set
-# CONFIG_PHONET is not set
-# CONFIG_WIRELESS 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 is not set
-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_GAMECUBE_DI=y
-CONFIG_GAMECUBE_ARAM=y
-CONFIG_GAMECUBE_SD=y
-# CONFIG_BLK_DEV_COW_COMMON is not set
-CONFIG_BLK_DEV_LOOP=y
-# CONFIG_BLK_DEV_CRYPTOLOOP is not set
-CONFIG_BLK_DEV_NBD=m
-CONFIG_BLK_DEV_RAM=y
-CONFIG_BLK_DEV_RAM_COUNT=2
-CONFIG_BLK_DEV_RAM_SIZE=4096
-# CONFIG_BLK_DEV_XIP is not set
-# CONFIG_CDROM_PKTCDVD is not set
-# CONFIG_ATA_OVER_ETH is not set
-# CONFIG_BLK_DEV_HD is not set
-CONFIG_MISC_DEVICES=y
-CONFIG_GAMECUBE_GQR=y
-# CONFIG_EEPROM_93CX6 is not set
-# CONFIG_ENCLOSURE_SERVICES is not set
-# CONFIG_C2PORT is not set
-CONFIG_HAVE_IDE=y
-# CONFIG_IDE is not set
-
-#
-# SCSI device support
-#
-# CONFIG_RAID_ATTRS is not set
-# CONFIG_SCSI is not set
-# CONFIG_SCSI_DMA is not set
-# CONFIG_SCSI_NETLINK is not set
-# CONFIG_ATA is not set
-# CONFIG_MD is not set
-# CONFIG_MACINTOSH_DRIVERS is not set
-CONFIG_NETDEVICES=y
-# CONFIG_DUMMY is not set
-# CONFIG_BONDING is not set
-# CONFIG_MACVLAN is not set
-# CONFIG_EQUALIZER is not set
-# CONFIG_TUN is not set
-# CONFIG_VETH is not set
-# CONFIG_PHYLIB is not set
-CONFIG_NET_ETHERNET=y
-# CONFIG_MII is not set
-CONFIG_GAMECUBE_BBA=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_IBM_NEW_EMAC_NO_FLOW_CTRL is not set
-# CONFIG_IBM_NEW_EMAC_MAL_CLR_ICINTSTAT is not set
-# CONFIG_IBM_NEW_EMAC_MAL_COMMON_ERR is not set
-# CONFIG_B44 is not set
-# CONFIG_NETDEV_1000 is not set
-# CONFIG_NETDEV_10000 is not set
-
-#
-# Wireless LAN
-#
-# CONFIG_WLAN_PRE80211 is not set
-# CONFIG_WLAN_80211 is not set
-# CONFIG_IWLWIFI_LEDS is not set
-# CONFIG_WAN is not set
-# CONFIG_PPP is not set
-# CONFIG_SLIP is not set
-# CONFIG_NETCONSOLE is not set
-# CONFIG_NETPOLL is not set
-# CONFIG_NET_POLL_CONTROLLER is not set
-# CONFIG_ISDN is not set
-# 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=y
-CONFIG_INPUT_EVDEV=y
-# CONFIG_INPUT_EVBUG is not set
-
-#
-# Input Device Drivers
-#
-CONFIG_INPUT_KEYBOARD=y
-# CONFIG_KEYBOARD_ATKBD is not set
-# CONFIG_KEYBOARD_SUNKBD is not set
-# CONFIG_KEYBOARD_LKKBD is not set
-# CONFIG_KEYBOARD_XTKBD is not set
-# CONFIG_KEYBOARD_NEWTON is not set
-# CONFIG_KEYBOARD_STOWAWAY is not set
-# CONFIG_INPUT_MOUSE is not set
-CONFIG_INPUT_JOYSTICK=y
-# CONFIG_JOYSTICK_ANALOG is not set
-# CONFIG_JOYSTICK_A3D is not set
-# CONFIG_JOYSTICK_ADI is not set
-# CONFIG_JOYSTICK_COBRA is not set
-# CONFIG_JOYSTICK_GF2K is not set
-# CONFIG_JOYSTICK_GRIP is not set
-# CONFIG_JOYSTICK_GRIP_MP is not set
-# CONFIG_JOYSTICK_GUILLEMOT is not set
-# CONFIG_JOYSTICK_INTERACT is not set
-# CONFIG_JOYSTICK_SIDEWINDER is not set
-# CONFIG_JOYSTICK_TMDC is not set
-# CONFIG_JOYSTICK_IFORCE is not set
-# CONFIG_JOYSTICK_WARRIOR is not set
-# CONFIG_JOYSTICK_MAGELLAN is not set
-# CONFIG_JOYSTICK_SPACEORB is not set
-# CONFIG_JOYSTICK_SPACEBALL is not set
-# CONFIG_JOYSTICK_STINGER is not set
-# CONFIG_JOYSTICK_TWIDJOY is not set
-# CONFIG_JOYSTICK_ZHENHUA is not set
-# CONFIG_JOYSTICK_JOYDUMP 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 is not set
-# CONFIG_SERIO_SERPORT is not set
-# CONFIG_SERIO_LIBPS2 is not set
-# CONFIG_SERIO_RAW is not set
-# CONFIG_SERIO_XILINX_XPS_PS2 is not set
-# CONFIG_GAMEPORT is not set
-CONFIG_GAMECUBE_SI=y
-
-#
-# Character devices
-#
-CONFIG_VT=y
-CONFIG_CONSOLE_TRANSLATIONS=y
-CONFIG_VT_CONSOLE=y
-CONFIG_HW_CONSOLE=y
-# CONFIG_VT_HW_CONSOLE_BINDING is not set
-# CONFIG_DEVKMEM 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_USBGECKO is not set
-CONFIG_UNIX98_PTYS=y
-CONFIG_LEGACY_PTYS=y
-CONFIG_LEGACY_PTY_COUNT=64
-# CONFIG_IPMI_HANDLER is not set
-# CONFIG_HW_RANDOM is not set
-# CONFIG_NVRAM is not set
-# CONFIG_R3964 is not set
-# CONFIG_RAW_DRIVER is not set
-# CONFIG_TCG_TPM is not set
-# CONFIG_I2C is not set
-
-#
-# EXI support
-#
-CONFIG_GAMECUBE_EXI=y
-# CONFIG_SPI is not set
-CONFIG_ARCH_WANT_OPTIONAL_GPIOLIB=y
-# CONFIG_GPIOLIB is not set
-# CONFIG_W1 is not set
-# CONFIG_POWER_SUPPLY is not set
-# CONFIG_HWMON is not set
-# CONFIG_THERMAL is not set
-# CONFIG_THERMAL_HWMON is not set
-# CONFIG_WATCHDOG is not set
-CONFIG_SSB_POSSIBLE=y
-
-#
-# Sonics Silicon Backplane
-#
-# CONFIG_SSB is not set
-
-#
-# Multifunction device drivers
-#
-# CONFIG_MFD_CORE is not set
-# CONFIG_MFD_SM501 is not set
-# CONFIG_HTC_PASIC3 is not set
-# CONFIG_MFD_TMIO is not set
-# CONFIG_REGULATOR is not set
-
-#
-# Multimedia devices
-#
-
-#
-# Multimedia core support
-#
-# CONFIG_VIDEO_DEV is not set
-# CONFIG_DVB_CORE is not set
-# CONFIG_VIDEO_MEDIA is not set
-
-#
-# Multimedia drivers
-#
-# CONFIG_DAB is not set
-
-#
-# Graphics support
-#
-# CONFIG_VGASTATE is not set
-# CONFIG_VIDEO_OUTPUT_CONTROL is not set
-CONFIG_FB=y
-# CONFIG_FIRMWARE_EDID is not set
-# CONFIG_FB_DDC is not set
-# CONFIG_FB_BOOT_VESA_SUPPORT is not set
-CONFIG_FB_CFB_FILLRECT=y
-CONFIG_FB_CFB_COPYAREA=y
-CONFIG_FB_CFB_IMAGEBLIT=y
-# CONFIG_FB_CFB_REV_PIXELS_IN_BYTE is not set
-# CONFIG_FB_SYS_FILLRECT is not set
-# CONFIG_FB_SYS_COPYAREA is not set
-# CONFIG_FB_SYS_IMAGEBLIT is not set
-# CONFIG_FB_FOREIGN_ENDIAN is not set
-# CONFIG_FB_SYS_FOPS is not set
-# CONFIG_FB_SVGALIB is not set
-# CONFIG_FB_MACMODES is not set
-# CONFIG_FB_BACKLIGHT is not set
-# CONFIG_FB_MODE_HELPERS is not set
-# CONFIG_FB_TILEBLITTING is not set
-
-#
-# Frame buffer hardware drivers
-#
-# CONFIG_FB_OF is not set
-# CONFIG_FB_VGA16 is not set
-# CONFIG_FB_S1D13XXX is not set
-CONFIG_FB_GAMECUBE=y
-# CONFIG_FB_IBM_GXT4500 is not set
-# CONFIG_FB_VIRTUAL is not set
-# CONFIG_FB_METRONOME is not set
-# CONFIG_FB_MB862XX is not set
-# CONFIG_BACKLIGHT_LCD_SUPPORT is not set
-
-#
-# Display device support
-#
-# CONFIG_DISPLAY_SUPPORT is not set
-
-#
-# Console display driver support
-#
-# CONFIG_VGA_CONSOLE is not set
-CONFIG_DUMMY_CONSOLE=y
-CONFIG_FRAMEBUFFER_CONSOLE=y
-# CONFIG_FRAMEBUFFER_CONSOLE_DETECT_PRIMARY is not set
-# CONFIG_FRAMEBUFFER_CONSOLE_ROTATION is not set
-# CONFIG_FONTS is not set
-CONFIG_FONT_8x8=y
-CONFIG_FONT_8x16=y
-CONFIG_LOGO=y
-# CONFIG_LOGO_LINUX_MONO is not set
-# CONFIG_LOGO_LINUX_VGA16 is not set
-# CONFIG_LOGO_LINUX_CLUT224 is not set
-CONFIG_LOGO_GAMECUBE_CLUT224=y
-CONFIG_SOUND=y
-CONFIG_SOUND_OSS_CORE=y
-CONFIG_SND=y
-CONFIG_SND_TIMER=y
-CONFIG_SND_PCM=y
-CONFIG_SND_SEQUENCER=y
-# CONFIG_SND_SEQ_DUMMY is not set
-CONFIG_SND_OSSEMUL=y
-CONFIG_SND_MIXER_OSS=y
-CONFIG_SND_PCM_OSS=y
-CONFIG_SND_PCM_OSS_PLUGINS=y
-CONFIG_SND_SEQUENCER_OSS=y
-# CONFIG_SND_DYNAMIC_MINORS is not set
-CONFIG_SND_SUPPORT_OLD_API=y
-# CONFIG_SND_VERBOSE_PROCFS is not set
-# CONFIG_SND_VERBOSE_PRINTK is not set
-# CONFIG_SND_DEBUG is not set
-CONFIG_SND_DRIVERS=y
-# CONFIG_SND_DUMMY is not set
-# CONFIG_SND_VIRMIDI is not set
-# CONFIG_SND_MTPAV is not set
-# CONFIG_SND_SERIAL_U16550 is not set
-# CONFIG_SND_MPU401 is not set
-CONFIG_SND_PPC=y
-CONFIG_SND_GAMECUBE=y
-CONFIG_SND_GAMECUBE_MIC=m
-# CONFIG_SND_SOC is not set
-# CONFIG_SOUND_PRIME is not set
-CONFIG_HID_SUPPORT=y
-CONFIG_HID=y
-# CONFIG_HID_DEBUG is not set
-# CONFIG_HIDRAW is not set
-# CONFIG_HID_PID is not set
-
-#
-# Special HID drivers
-#
-CONFIG_HID_COMPAT=y
-# CONFIG_USB_SUPPORT is not set
-# CONFIG_MMC is not set
-# CONFIG_MEMSTICK is not set
-# CONFIG_NEW_LEDS is not set
-# CONFIG_ACCESSIBILITY 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
-
-#
-# SPI RTC drivers
-#
-
-#
-# Platform RTC drivers
-#
-# CONFIG_RTC_DRV_CMOS is not set
-# CONFIG_RTC_DRV_DS1286 is not set
-# CONFIG_RTC_DRV_DS1511 is not set
-# CONFIG_RTC_DRV_DS1553 is not set
-# CONFIG_RTC_DRV_DS1742 is not set
-# CONFIG_RTC_DRV_STK17TA8 is not set
-# CONFIG_RTC_DRV_M48T86 is not set
-# CONFIG_RTC_DRV_M48T35 is not set
-# CONFIG_RTC_DRV_M48T59 is not set
-# CONFIG_RTC_DRV_BQ4802 is not set
-# CONFIG_RTC_DRV_V3020 is not set
-CONFIG_RTC_DRV_GCN=y
-
-#
-# on-CPU RTC drivers
-#
-# CONFIG_RTC_DRV_PPC is not set
-# CONFIG_DMADEVICES is not set
-# CONFIG_UIO is not set
-# CONFIG_STAGING is not set
-
-#
-# File systems
-#
-CONFIG_EXT2_FS=y
-# CONFIG_EXT2_FS_XATTR is not set
-# CONFIG_EXT2_FS_XIP is not set
-CONFIG_EXT3_FS=y
-# CONFIG_EXT3_FS_XATTR is not set
-# CONFIG_EXT4_FS is not set
-CONFIG_JBD=y
-# CONFIG_JBD_DEBUG is not set
-# CONFIG_REISERFS_FS is not set
-# CONFIG_JFS_FS is not set
-# CONFIG_FS_POSIX_ACL is not set
-CONFIG_FILE_LOCKING=y
-# CONFIG_XFS_FS is not set
-# CONFIG_OCFS2_FS is not set
-CONFIG_DNOTIFY=y
-CONFIG_INOTIFY=y
-CONFIG_INOTIFY_USER=y
-# CONFIG_QUOTA is not set
-# CONFIG_AUTOFS_FS is not set
-# CONFIG_AUTOFS4_FS is not set
-# CONFIG_FUSE_FS is not set
-
-#
-# CD-ROM/DVD Filesystems
-#
-CONFIG_ISO9660_FS=y
-CONFIG_JOLIET=y
-# CONFIG_ZISOFS is not set
-# CONFIG_UDF_FS is not set
-# CONFIG_GCDVD_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_PROC_PAGE_MONITOR is not set
-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_MINIX_FS is not set
-# CONFIG_OMFS_FS is not set
-# CONFIG_HPFS_FS is not set
-# CONFIG_QNX4FS_FS is not set
-# CONFIG_ROMFS_FS is not set
-# CONFIG_SYSV_FS is not set
-# CONFIG_UFS_FS is not set
-CONFIG_NETWORK_FILESYSTEMS=y
-CONFIG_NFS_FS=y
-CONFIG_NFS_V3=y
-# CONFIG_NFS_V3_ACL is not set
-# CONFIG_NFS_V4 is not set
-CONFIG_ROOT_NFS=y
-# CONFIG_NFSD is not set
-CONFIG_LOCKD=y
-CONFIG_LOCKD_V4=y
-CONFIG_NFS_COMMON=y
-CONFIG_SUNRPC=y
-# CONFIG_SUNRPC_REGISTER_V4 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=y
-# CONFIG_CIFS_STATS is not set
-# CONFIG_CIFS_WEAK_PW_HASH is not set
-# CONFIG_CIFS_XATTR is not set
-# CONFIG_CIFS_DEBUG2 is not set
-# CONFIG_CIFS_EXPERIMENTAL 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
-
-#
-# Library routines
-#
-CONFIG_BITREVERSE=y
-CONFIG_CRC_CCITT=y
-# CONFIG_CRC16 is not set
-# CONFIG_CRC_T10DIF is not set
-# CONFIG_CRC_ITU_T is not set
-CONFIG_CRC32=y
-# CONFIG_CRC7 is not set
-# CONFIG_LIBCRC32C is not set
-CONFIG_PLIST=y
-CONFIG_HAS_IOMEM=y
-CONFIG_HAS_IOPORT=y
-CONFIG_HAS_DMA=y
-CONFIG_HAVE_LMB=y
-
-#
-# Kernel hacking
-#
-# CONFIG_PRINTK_TIME is not set
-CONFIG_ENABLE_WARN_DEPRECATED=y
-CONFIG_ENABLE_MUST_CHECK=y
-CONFIG_FRAME_WARN=1024
-# CONFIG_MAGIC_SYSRQ is not set
-# CONFIG_UNUSED_SYMBOLS is not set
-CONFIG_DEBUG_FS=y
-# CONFIG_HEADERS_CHECK is not set
-CONFIG_DEBUG_KERNEL=y
-# CONFIG_DEBUG_SHIRQ is not set
-CONFIG_DETECT_SOFTLOCKUP=y
-# CONFIG_BOOTPARAM_SOFTLOCKUP_PANIC is not set
-CONFIG_BOOTPARAM_SOFTLOCKUP_PANIC_VALUE=0
-CONFIG_SCHED_DEBUG=y
-CONFIG_SCHEDSTATS=y
-# CONFIG_TIMER_STATS is not set
-# CONFIG_DEBUG_OBJECTS 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=y
-CONFIG_DEBUG_MUTEXES=y
-# CONFIG_DEBUG_SPINLOCK_SLEEP is not set
-# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set
-CONFIG_STACKTRACE=y
-# CONFIG_DEBUG_KOBJECT is not set
-CONFIG_DEBUG_BUGVERBOSE=y
-# CONFIG_DEBUG_INFO is not set
-# CONFIG_DEBUG_VM is not set
-# CONFIG_DEBUG_WRITECOUNT is not set
-# CONFIG_DEBUG_MEMORY_INIT is not set
-# CONFIG_DEBUG_LIST is not set
-# CONFIG_DEBUG_SG is not set
-# CONFIG_BOOT_PRINTK_DELAY is not set
-# CONFIG_RCU_TORTURE_TEST is not set
-# CONFIG_RCU_CPU_STALL_DETECTOR is not set
-# CONFIG_BACKTRACE_SELF_TEST is not set
-# CONFIG_DEBUG_BLOCK_EXT_DEVT is not set
-# CONFIG_FAULT_INJECTION is not set
-CONFIG_LATENCYTOP=y
-CONFIG_SYSCTL_SYSCALL_CHECK=y
-CONFIG_NOP_TRACER=y
-CONFIG_HAVE_FUNCTION_TRACER=y
-CONFIG_RING_BUFFER=y
-CONFIG_TRACING=y
-
-#
-# Tracers
-#
-# CONFIG_FUNCTION_TRACER is not set
-# CONFIG_PREEMPT_TRACER is not set
-# CONFIG_SCHED_TRACER is not set
-CONFIG_CONTEXT_SWITCH_TRACER=y
-CONFIG_BOOT_TRACER=y
-# CONFIG_STACK_TRACER is not set
-# CONFIG_DYNAMIC_PRINTK_DEBUG is not set
-# CONFIG_SAMPLES is not set
-CONFIG_HAVE_ARCH_KGDB=y
-# CONFIG_KGDB is not set
-# CONFIG_DEBUG_STACKOVERFLOW is not set
-# CONFIG_DEBUG_STACK_USAGE is not set
-# CONFIG_DEBUG_PAGEALLOC is not set
-# CONFIG_CODE_PATCHING_SELFTEST is not set
-# CONFIG_FTR_FIXUP_SELFTEST is not set
-# CONFIG_MSI_BITMAP_SELFTEST is not set
-# CONFIG_XMON is not set
-# CONFIG_IRQSTACKS is not set
-# CONFIG_VIRQ_DEBUG is not set
-# CONFIG_BDI_SWITCH 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 is not set
-# CONFIG_PPC_EARLY_DEBUG_44x is not set
-# CONFIG_PPC_EARLY_DEBUG_40x is not set
-# CONFIG_PPC_EARLY_DEBUG_CPM is not set
-CONFIG_PPC_EARLY_DEBUG_USBGECKO=y
-
-#
-# Security options
-#
-# CONFIG_KEYS is not set
-# CONFIG_SECURITY is not set
-# CONFIG_SECURITYFS is not set
-# CONFIG_SECURITY_FILE_CAPABILITIES is not set
-# CONFIG_CRYPTO is not set
-# CONFIG_PPC_CLOCK is not set
-# CONFIG_VIRTUALIZATION is not set
diff --git a/recipes/linux/linux/exopcslate/defconfig b/recipes/linux/linux/exopcslate/defconfig
new file mode 100644
index 0000000000..62de66e101
--- /dev/null
+++ b/recipes/linux/linux/exopcslate/defconfig
@@ -0,0 +1,3403 @@
+#
+# Automatically generated make config: don't edit
+# Linux/x86 2.6.37-7.1 Kernel Configuration
+# Sat Feb 12 03:10:36 2011
+#
+# CONFIG_64BIT is not set
+CONFIG_X86_32=y
+# CONFIG_X86_64 is not set
+CONFIG_X86=y
+CONFIG_INSTRUCTION_DECODER=y
+CONFIG_OUTPUT_FORMAT="elf32-i386"
+CONFIG_ARCH_DEFCONFIG="arch/x86/configs/i386_defconfig"
+CONFIG_GENERIC_CMOS_UPDATE=y
+CONFIG_CLOCKSOURCE_WATCHDOG=y
+CONFIG_GENERIC_CLOCKEVENTS=y
+CONFIG_GENERIC_CLOCKEVENTS_BROADCAST=y
+CONFIG_LOCKDEP_SUPPORT=y
+CONFIG_STACKTRACE_SUPPORT=y
+CONFIG_HAVE_LATENCYTOP_SUPPORT=y
+CONFIG_MMU=y
+CONFIG_ZONE_DMA=y
+# CONFIG_NEED_DMA_MAP_STATE is not set
+CONFIG_NEED_SG_DMA_LENGTH=y
+CONFIG_GENERIC_ISA_DMA=y
+CONFIG_GENERIC_IOMAP=y
+CONFIG_GENERIC_BUG=y
+CONFIG_GENERIC_HWEIGHT=y
+CONFIG_ARCH_MAY_HAVE_PC_FDC=y
+# CONFIG_RWSEM_GENERIC_SPINLOCK is not set
+CONFIG_RWSEM_XCHGADD_ALGORITHM=y
+CONFIG_ARCH_HAS_CPU_IDLE_WAIT=y
+CONFIG_GENERIC_CALIBRATE_DELAY=y
+# CONFIG_GENERIC_TIME_VSYSCALL is not set
+CONFIG_ARCH_HAS_CPU_RELAX=y
+CONFIG_ARCH_HAS_DEFAULT_IDLE=y
+CONFIG_ARCH_HAS_CACHE_LINE_SIZE=y
+CONFIG_HAVE_SETUP_PER_CPU_AREA=y
+CONFIG_NEED_PER_CPU_EMBED_FIRST_CHUNK=y
+CONFIG_NEED_PER_CPU_PAGE_FIRST_CHUNK=y
+# CONFIG_HAVE_CPUMASK_OF_CPU_MAP is not set
+CONFIG_ARCH_HIBERNATION_POSSIBLE=y
+CONFIG_ARCH_SUSPEND_POSSIBLE=y
+# CONFIG_ZONE_DMA32 is not set
+CONFIG_ARCH_POPULATES_NODE_MAP=y
+# CONFIG_AUDIT_ARCH is not set
+CONFIG_ARCH_SUPPORTS_OPTIMIZED_INLINING=y
+CONFIG_ARCH_SUPPORTS_DEBUG_PAGEALLOC=y
+CONFIG_USE_GENERIC_SMP_HELPERS=y
+CONFIG_X86_32_SMP=y
+CONFIG_X86_HT=y
+CONFIG_X86_TRAMPOLINE=y
+CONFIG_X86_32_LAZY_GS=y
+CONFIG_ARCH_HWEIGHT_CFLAGS="-fcall-saved-ecx -fcall-saved-edx"
+CONFIG_KTIME_SCALAR=y
+CONFIG_ARCH_CPU_PROBE_RELEASE=y
+CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
+CONFIG_CONSTRUCTORS=y
+CONFIG_HAVE_IRQ_WORK=y
+CONFIG_IRQ_WORK=y
+
+#
+# General setup
+#
+CONFIG_EXPERIMENTAL=y
+CONFIG_LOCK_KERNEL=y
+CONFIG_INIT_ENV_ARG_LIMIT=32
+CONFIG_CROSS_COMPILE=""
+CONFIG_LOCALVERSION=""
+# CONFIG_LOCALVERSION_AUTO is not set
+CONFIG_HAVE_KERNEL_GZIP=y
+CONFIG_HAVE_KERNEL_BZIP2=y
+CONFIG_HAVE_KERNEL_LZMA=y
+CONFIG_HAVE_KERNEL_LZO=y
+CONFIG_KERNEL_GZIP=y
+# CONFIG_KERNEL_BZIP2 is not set
+# CONFIG_KERNEL_LZMA is not set
+# CONFIG_KERNEL_LZO is not set
+CONFIG_SWAP=y
+CONFIG_SYSVIPC=y
+CONFIG_SYSVIPC_SYSCTL=y
+CONFIG_POSIX_MQUEUE=y
+CONFIG_POSIX_MQUEUE_SYSCTL=y
+CONFIG_BSD_PROCESS_ACCT=y
+CONFIG_BSD_PROCESS_ACCT_V3=y
+CONFIG_TASKSTATS=y
+CONFIG_TASK_DELAY_ACCT=y
+CONFIG_TASK_XACCT=y
+CONFIG_TASK_IO_ACCOUNTING=y
+# CONFIG_AUDIT is not set
+CONFIG_HAVE_GENERIC_HARDIRQS=y
+
+#
+# IRQ subsystem
+#
+CONFIG_GENERIC_HARDIRQS=y
+CONFIG_GENERIC_HARDIRQS_NO__DO_IRQ=y
+# CONFIG_GENERIC_HARDIRQS_NO_DEPRECATED is not set
+CONFIG_HAVE_SPARSE_IRQ=y
+CONFIG_GENERIC_IRQ_PROBE=y
+CONFIG_GENERIC_PENDING_IRQ=y
+# CONFIG_AUTO_IRQ_AFFINITY is not set
+# CONFIG_IRQ_PER_CPU is not set
+# CONFIG_HARDIRQS_SW_RESEND is not set
+# CONFIG_SPARSE_IRQ is not set
+
+#
+# RCU Subsystem
+#
+CONFIG_TREE_PREEMPT_RCU=y
+CONFIG_PREEMPT_RCU=y
+# CONFIG_RCU_TRACE is not set
+CONFIG_RCU_FANOUT=32
+# CONFIG_RCU_FANOUT_EXACT is not set
+# CONFIG_TREE_RCU_TRACE is not set
+# CONFIG_IKCONFIG is not set
+CONFIG_LOG_BUF_SHIFT=17
+CONFIG_HAVE_UNSTABLE_SCHED_CLOCK=y
+CONFIG_CGROUPS=y
+# CONFIG_CGROUP_DEBUG is not set
+CONFIG_CGROUP_NS=y
+CONFIG_CGROUP_FREEZER=y
+CONFIG_CGROUP_DEVICE=y
+CONFIG_CPUSETS=y
+CONFIG_PROC_PID_CPUSET=y
+CONFIG_CGROUP_CPUACCT=y
+CONFIG_RESOURCE_COUNTERS=y
+CONFIG_CGROUP_MEM_RES_CTLR=y
+# CONFIG_CGROUP_MEM_RES_CTLR_SWAP is not set
+CONFIG_CGROUP_SCHED=y
+CONFIG_FAIR_GROUP_SCHED=y
+CONFIG_RT_GROUP_SCHED=y
+CONFIG_BLK_CGROUP=y
+# CONFIG_DEBUG_BLK_CGROUP is not set
+CONFIG_NAMESPACES=y
+# CONFIG_UTS_NS is not set
+# CONFIG_IPC_NS is not set
+# CONFIG_USER_NS is not set
+# CONFIG_PID_NS is not set
+# CONFIG_NET_NS is not set
+CONFIG_MM_OWNER=y
+CONFIG_SYSFS_DEPRECATED=y
+# CONFIG_SYSFS_DEPRECATED_V2 is not set
+CONFIG_RELAY=y
+CONFIG_BLK_DEV_INITRD=y
+CONFIG_INITRAMFS_SOURCE=""
+CONFIG_RD_GZIP=y
+CONFIG_RD_BZIP2=y
+CONFIG_RD_LZMA=y
+CONFIG_RD_LZO=y
+CONFIG_CC_OPTIMIZE_FOR_SIZE=y
+CONFIG_SYSCTL=y
+CONFIG_ANON_INODES=y
+# CONFIG_EMBEDDED is not set
+CONFIG_UID16=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_PCSPKR_PLATFORM=y
+CONFIG_BASE_FULL=y
+CONFIG_FUTEX=y
+CONFIG_EPOLL=y
+CONFIG_SIGNALFD=y
+CONFIG_TIMERFD=y
+CONFIG_EVENTFD=y
+CONFIG_SHMEM=y
+CONFIG_AIO=y
+CONFIG_HAVE_PERF_EVENTS=y
+
+#
+# Kernel Performance Events And Counters
+#
+CONFIG_PERF_EVENTS=y
+CONFIG_PERF_COUNTERS=y
+# CONFIG_DEBUG_PERF_USE_VMALLOC is not set
+CONFIG_VM_EVENT_COUNTERS=y
+CONFIG_PCI_QUIRKS=y
+# CONFIG_COMPAT_BRK is not set
+CONFIG_SLAB=y
+# CONFIG_SLUB is not set
+CONFIG_PROFILING=y
+CONFIG_TRACEPOINTS=y
+# CONFIG_OPROFILE is not set
+CONFIG_HAVE_OPROFILE=y
+# CONFIG_KPROBES is not set
+# CONFIG_JUMP_LABEL is not set
+CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS=y
+CONFIG_USER_RETURN_NOTIFIER=y
+CONFIG_HAVE_IOREMAP_PROT=y
+CONFIG_HAVE_KPROBES=y
+CONFIG_HAVE_KRETPROBES=y
+CONFIG_HAVE_OPTPROBES=y
+CONFIG_HAVE_ARCH_TRACEHOOK=y
+CONFIG_HAVE_DMA_ATTRS=y
+CONFIG_HAVE_REGS_AND_STACK_ACCESS_API=y
+CONFIG_HAVE_DMA_API_DEBUG=y
+CONFIG_HAVE_HW_BREAKPOINT=y
+CONFIG_HAVE_MIXED_BREAKPOINTS_REGS=y
+CONFIG_HAVE_USER_RETURN_NOTIFIER=y
+CONFIG_HAVE_PERF_EVENTS_NMI=y
+CONFIG_HAVE_ARCH_JUMP_LABEL=y
+
+#
+# GCOV-based kernel profiling
+#
+# CONFIG_GCOV_KERNEL is not set
+CONFIG_HAVE_GENERIC_DMA_COHERENT=y
+CONFIG_SLABINFO=y
+CONFIG_RT_MUTEXES=y
+CONFIG_BASE_SMALL=0
+CONFIG_MODULES=y
+# CONFIG_MODULE_FORCE_LOAD is not set
+CONFIG_MODULE_UNLOAD=y
+# CONFIG_MODULE_FORCE_UNLOAD is not set
+# CONFIG_MODVERSIONS is not set
+# CONFIG_MODULE_SRCVERSION_ALL is not set
+CONFIG_STOP_MACHINE=y
+CONFIG_BLOCK=y
+CONFIG_LBDAF=y
+CONFIG_BLK_DEV_BSG=y
+# CONFIG_BLK_DEV_INTEGRITY is not set
+CONFIG_BLK_DEV_THROTTLING=y
+
+#
+# IO Schedulers
+#
+CONFIG_IOSCHED_NOOP=y
+# CONFIG_IOSCHED_DEADLINE is not set
+CONFIG_IOSCHED_CFQ=y
+# CONFIG_CFQ_GROUP_IOSCHED is not set
+CONFIG_DEFAULT_CFQ=y
+# CONFIG_DEFAULT_NOOP is not set
+CONFIG_DEFAULT_IOSCHED="cfq"
+CONFIG_PREEMPT_NOTIFIERS=y
+# CONFIG_INLINE_SPIN_TRYLOCK is not set
+# CONFIG_INLINE_SPIN_TRYLOCK_BH is not set
+# CONFIG_INLINE_SPIN_LOCK is not set
+# CONFIG_INLINE_SPIN_LOCK_BH is not set
+# CONFIG_INLINE_SPIN_LOCK_IRQ is not set
+# CONFIG_INLINE_SPIN_LOCK_IRQSAVE is not set
+# CONFIG_INLINE_SPIN_UNLOCK is not set
+# CONFIG_INLINE_SPIN_UNLOCK_BH is not set
+# CONFIG_INLINE_SPIN_UNLOCK_IRQ is not set
+# CONFIG_INLINE_SPIN_UNLOCK_IRQRESTORE is not set
+# CONFIG_INLINE_READ_TRYLOCK is not set
+# CONFIG_INLINE_READ_LOCK is not set
+# CONFIG_INLINE_READ_LOCK_BH is not set
+# CONFIG_INLINE_READ_LOCK_IRQ is not set
+# CONFIG_INLINE_READ_LOCK_IRQSAVE is not set
+# CONFIG_INLINE_READ_UNLOCK is not set
+# CONFIG_INLINE_READ_UNLOCK_BH is not set
+# CONFIG_INLINE_READ_UNLOCK_IRQ is not set
+# CONFIG_INLINE_READ_UNLOCK_IRQRESTORE is not set
+# CONFIG_INLINE_WRITE_TRYLOCK is not set
+# CONFIG_INLINE_WRITE_LOCK is not set
+# CONFIG_INLINE_WRITE_LOCK_BH is not set
+# CONFIG_INLINE_WRITE_LOCK_IRQ is not set
+# CONFIG_INLINE_WRITE_LOCK_IRQSAVE is not set
+# CONFIG_INLINE_WRITE_UNLOCK is not set
+# CONFIG_INLINE_WRITE_UNLOCK_BH is not set
+# CONFIG_INLINE_WRITE_UNLOCK_IRQ is not set
+# CONFIG_INLINE_WRITE_UNLOCK_IRQRESTORE is not set
+# CONFIG_MUTEX_SPIN_ON_OWNER is not set
+CONFIG_FREEZER=y
+
+#
+# Processor type and features
+#
+CONFIG_TICK_ONESHOT=y
+CONFIG_NO_HZ=y
+CONFIG_HIGH_RES_TIMERS=y
+CONFIG_GENERIC_CLOCKEVENTS_BUILD=y
+CONFIG_SMP=y
+CONFIG_X86_MPPARSE=y
+# CONFIG_X86_BIGSMP is not set
+# CONFIG_X86_EXTENDED_PLATFORM is not set
+CONFIG_X86_SUPPORTS_MEMORY_FAILURE=y
+# CONFIG_SCHED_OMIT_FRAME_POINTER is not set
+# CONFIG_PARAVIRT_GUEST is not set
+CONFIG_NO_BOOTMEM=y
+# CONFIG_MEMTEST is not set
+# CONFIG_M386 is not set
+# CONFIG_M486 is not set
+# CONFIG_M586 is not set
+# CONFIG_M586TSC is not set
+# CONFIG_M586MMX is not set
+# CONFIG_M686 is not set
+# CONFIG_MPENTIUMII is not set
+# CONFIG_MPENTIUMIII is not set
+CONFIG_MPENTIUMM=y
+# CONFIG_MPENTIUM4 is not set
+# CONFIG_MK6 is not set
+# CONFIG_MK7 is not set
+# CONFIG_MK8 is not set
+# CONFIG_MCRUSOE is not set
+# CONFIG_MEFFICEON is not set
+# CONFIG_MWINCHIPC6 is not set
+# CONFIG_MWINCHIP3D is not set
+# CONFIG_MGEODEGX1 is not set
+# CONFIG_MGEODE_LX is not set
+# CONFIG_MCYRIXIII is not set
+# CONFIG_MVIAC3_2 is not set
+# CONFIG_MVIAC7 is not set
+# CONFIG_MCORE2 is not set
+# CONFIG_MATOM is not set
+CONFIG_X86_GENERIC=y
+CONFIG_X86_CPU=y
+CONFIG_X86_INTERNODE_CACHE_SHIFT=6
+CONFIG_X86_CMPXCHG=y
+CONFIG_X86_L1_CACHE_SHIFT=6
+CONFIG_X86_XADD=y
+CONFIG_X86_WP_WORKS_OK=y
+CONFIG_X86_INVLPG=y
+CONFIG_X86_BSWAP=y
+CONFIG_X86_POPAD_OK=y
+CONFIG_X86_INTEL_USERCOPY=y
+CONFIG_X86_USE_PPRO_CHECKSUM=y
+CONFIG_X86_TSC=y
+CONFIG_X86_CMPXCHG64=y
+CONFIG_X86_CMOV=y
+CONFIG_X86_MINIMUM_CPU_FAMILY=5
+CONFIG_X86_DEBUGCTLMSR=y
+CONFIG_CPU_SUP_INTEL=y
+CONFIG_CPU_SUP_CYRIX_32=y
+CONFIG_CPU_SUP_AMD=y
+CONFIG_CPU_SUP_CENTAUR=y
+CONFIG_CPU_SUP_TRANSMETA_32=y
+CONFIG_CPU_SUP_UMC_32=y
+CONFIG_HPET_TIMER=y
+CONFIG_HPET_EMULATE_RTC=y
+CONFIG_DMI=y
+# CONFIG_IOMMU_HELPER is not set
+# CONFIG_IOMMU_API is not set
+CONFIG_NR_CPUS=8
+# CONFIG_SCHED_SMT is not set
+CONFIG_SCHED_MC=y
+CONFIG_IRQ_TIME_ACCOUNTING=y
+# CONFIG_PREEMPT_NONE is not set
+# CONFIG_PREEMPT_VOLUNTARY is not set
+CONFIG_PREEMPT=y
+CONFIG_X86_LOCAL_APIC=y
+CONFIG_X86_IO_APIC=y
+# CONFIG_X86_REROUTE_FOR_BROKEN_BOOT_IRQS is not set
+CONFIG_X86_MCE=y
+CONFIG_X86_MCE_INTEL=y
+# CONFIG_X86_MCE_AMD is not set
+# CONFIG_X86_ANCIENT_MCE is not set
+CONFIG_X86_MCE_THRESHOLD=y
+# CONFIG_X86_MCE_INJECT is not set
+CONFIG_X86_THERMAL_VECTOR=y
+CONFIG_VM86=y
+CONFIG_TOSHIBA=m
+CONFIG_I8K=m
+CONFIG_X86_REBOOTFIXUPS=y
+CONFIG_MICROCODE=y
+CONFIG_MICROCODE_INTEL=y
+# CONFIG_MICROCODE_AMD is not set
+CONFIG_MICROCODE_OLD_INTERFACE=y
+CONFIG_X86_MSR=y
+CONFIG_X86_CPUID=y
+CONFIG_NOHIGHMEM=y
+# CONFIG_HIGHMEM4G is not set
+# CONFIG_HIGHMEM64G is not set
+CONFIG_PAGE_OFFSET=0xC0000000
+CONFIG_X86_PAE=y
+CONFIG_ARCH_PHYS_ADDR_T_64BIT=y
+# CONFIG_ARCH_DMA_ADDR_T_64BIT is not set
+CONFIG_ARCH_FLATMEM_ENABLE=y
+CONFIG_ARCH_SPARSEMEM_ENABLE=y
+CONFIG_ARCH_SELECT_MEMORY_MODEL=y
+CONFIG_ILLEGAL_POINTER_VALUE=0
+CONFIG_SELECT_MEMORY_MODEL=y
+CONFIG_FLATMEM_MANUAL=y
+# CONFIG_SPARSEMEM_MANUAL is not set
+CONFIG_FLATMEM=y
+CONFIG_FLAT_NODE_MEM_MAP=y
+CONFIG_SPARSEMEM_STATIC=y
+CONFIG_HAVE_MEMBLOCK=y
+CONFIG_PAGEFLAGS_EXTENDED=y
+CONFIG_SPLIT_PTLOCK_CPUS=999999
+CONFIG_PHYS_ADDR_T_64BIT=y
+CONFIG_ZONE_DMA_FLAG=1
+CONFIG_BOUNCE=y
+CONFIG_VIRT_TO_BUS=y
+CONFIG_MMU_NOTIFIER=y
+# CONFIG_KSM is not set
+CONFIG_DEFAULT_MMAP_MIN_ADDR=4096
+CONFIG_ARCH_SUPPORTS_MEMORY_FAILURE=y
+# CONFIG_MEMORY_FAILURE is not set
+CONFIG_X86_CHECK_BIOS_CORRUPTION=y
+# CONFIG_X86_BOOTPARAM_MEMORY_CORRUPTION_CHECK is not set
+CONFIG_X86_RESERVE_LOW=64
+# CONFIG_MATH_EMULATION is not set
+CONFIG_MTRR=y
+CONFIG_MTRR_SANITIZER=y
+CONFIG_MTRR_SANITIZER_ENABLE_DEFAULT=1
+CONFIG_MTRR_SANITIZER_SPARE_REG_NR_DEFAULT=1
+CONFIG_X86_PAT=y
+CONFIG_ARCH_USES_PG_UNCACHED=y
+# CONFIG_EFI is not set
+# CONFIG_SECCOMP is not set
+# CONFIG_CC_STACKPROTECTOR is not set
+# 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_SCHED_HRTICK=y
+# CONFIG_KEXEC is not set
+CONFIG_PHYSICAL_START=0x1000000
+# CONFIG_RELOCATABLE is not set
+CONFIG_PHYSICAL_ALIGN=0x400000
+CONFIG_HOTPLUG_CPU=y
+# CONFIG_COMPAT_VDSO is not set
+# CONFIG_CMDLINE_BOOL is not set
+
+#
+# Power management and ACPI options
+#
+CONFIG_PM=y
+CONFIG_PM_DEBUG=y
+CONFIG_PM_ADVANCED_DEBUG=y
+# CONFIG_PM_VERBOSE is not set
+CONFIG_CAN_PM_TRACE=y
+CONFIG_PM_TRACE=y
+CONFIG_PM_TRACE_RTC=y
+CONFIG_PM_SLEEP_SMP=y
+CONFIG_PM_SLEEP=y
+# CONFIG_PM_SLEEP_ADVANCED_DEBUG is not set
+CONFIG_SUSPEND_NVS=y
+CONFIG_SUSPEND=y
+# CONFIG_PM_TEST_SUSPEND is not set
+CONFIG_SUSPEND_FREEZER=y
+CONFIG_HIBERNATION=y
+CONFIG_PM_STD_PARTITION=""
+CONFIG_PM_RUNTIME=y
+CONFIG_PM_OPS=y
+CONFIG_ACPI=y
+CONFIG_ACPI_SLEEP=y
+CONFIG_ACPI_PROCFS=y
+CONFIG_ACPI_PROCFS_POWER=y
+CONFIG_ACPI_POWER_METER=y
+CONFIG_ACPI_EC_DEBUGFS=y
+CONFIG_ACPI_PROC_EVENT=y
+CONFIG_ACPI_AC=y
+CONFIG_ACPI_BATTERY=m
+CONFIG_ACPI_BUTTON=y
+CONFIG_ACPI_VIDEO=y
+CONFIG_ACPI_FAN=y
+CONFIG_ACPI_DOCK=y
+CONFIG_ACPI_PROCESSOR=y
+CONFIG_ACPI_HOTPLUG_CPU=y
+# CONFIG_ACPI_PROCESSOR_AGGREGATOR is not set
+CONFIG_ACPI_THERMAL=y
+# CONFIG_ACPI_CUSTOM_DSDT is not set
+CONFIG_ACPI_BLACKLIST_YEAR=1999
+# CONFIG_ACPI_DEBUG is not set
+# CONFIG_ACPI_PCI_SLOT is not set
+CONFIG_X86_PM_TIMER=y
+CONFIG_ACPI_CONTAINER=y
+CONFIG_ACPI_SBS=m
+CONFIG_ACPI_HED=m
+CONFIG_ACPI_APEI=y
+# CONFIG_ACPI_APEI_GHES is not set
+# CONFIG_ACPI_APEI_EINJ is not set
+# CONFIG_ACPI_APEI_ERST_DEBUG is not set
+# CONFIG_SFI is not set
+# CONFIG_APM is not set
+
+#
+# CPU Frequency scaling
+#
+CONFIG_CPU_FREQ=y
+CONFIG_CPU_FREQ_TABLE=y
+CONFIG_CPU_FREQ_DEBUG=y
+CONFIG_CPU_FREQ_STAT=y
+CONFIG_CPU_FREQ_STAT_DETAILS=y
+# CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE is not set
+# CONFIG_CPU_FREQ_DEFAULT_GOV_USERSPACE is not set
+CONFIG_CPU_FREQ_DEFAULT_GOV_ONDEMAND=y
+# CONFIG_CPU_FREQ_DEFAULT_GOV_CONSERVATIVE is not set
+CONFIG_CPU_FREQ_GOV_PERFORMANCE=y
+# CONFIG_CPU_FREQ_GOV_POWERSAVE is not set
+CONFIG_CPU_FREQ_GOV_USERSPACE=y
+CONFIG_CPU_FREQ_GOV_ONDEMAND=y
+# CONFIG_CPU_FREQ_GOV_CONSERVATIVE is not set
+
+#
+# CPUFreq processor drivers
+#
+# CONFIG_X86_PCC_CPUFREQ is not set
+CONFIG_X86_ACPI_CPUFREQ=y
+# CONFIG_X86_POWERNOW_K6 is not set
+# CONFIG_X86_POWERNOW_K7 is not set
+# CONFIG_X86_POWERNOW_K8 is not set
+# CONFIG_X86_GX_SUSPMOD is not set
+# CONFIG_X86_SPEEDSTEP_CENTRINO is not set
+# CONFIG_X86_SPEEDSTEP_ICH is not set
+# CONFIG_X86_SPEEDSTEP_SMI is not set
+# CONFIG_X86_P4_CLOCKMOD is not set
+# CONFIG_X86_CPUFREQ_NFORCE2 is not set
+# CONFIG_X86_LONGRUN is not set
+# CONFIG_X86_LONGHAUL is not set
+# CONFIG_X86_E_POWERSAVER is not set
+
+#
+# shared options
+#
+# CONFIG_X86_SPEEDSTEP_LIB is not set
+CONFIG_CPU_IDLE=y
+CONFIG_CPU_IDLE_GOV_LADDER=y
+CONFIG_CPU_IDLE_GOV_MENU=y
+CONFIG_INTEL_IDLE=y
+
+#
+# Bus options (PCI etc.)
+#
+CONFIG_PCI=y
+# CONFIG_PCI_GOBIOS is not set
+# CONFIG_PCI_GOMMCONFIG is not set
+# CONFIG_PCI_GODIRECT is not set
+CONFIG_PCI_GOANY=y
+CONFIG_PCI_BIOS=y
+CONFIG_PCI_DIRECT=y
+CONFIG_PCI_MMCONFIG=y
+CONFIG_PCI_DOMAINS=y
+# CONFIG_PCI_CNB20LE_QUIRK is not set
+# CONFIG_DMAR is not set
+CONFIG_PCIEPORTBUS=y
+CONFIG_HOTPLUG_PCI_PCIE=m
+# CONFIG_PCIEAER is not set
+CONFIG_PCIEASPM=y
+# CONFIG_PCIEASPM_DEBUG is not set
+CONFIG_PCIE_PME=y
+CONFIG_ARCH_SUPPORTS_MSI=y
+CONFIG_PCI_MSI=y
+# CONFIG_PCI_DEBUG is not set
+# CONFIG_PCI_STUB is not set
+# CONFIG_HT_IRQ is not set
+# CONFIG_PCI_IOV is not set
+CONFIG_PCI_IOAPIC=y
+CONFIG_ISA_DMA_API=y
+CONFIG_ISA=y
+# CONFIG_EISA is not set
+# CONFIG_MCA is not set
+# CONFIG_SCx200 is not set
+# CONFIG_OLPC is not set
+CONFIG_AMD_NB=y
+CONFIG_PCCARD=y
+# CONFIG_PCMCIA is not set
+CONFIG_CARDBUS=y
+
+#
+# PC-card bridges
+#
+CONFIG_YENTA=y
+CONFIG_YENTA_O2=y
+CONFIG_YENTA_RICOH=y
+CONFIG_YENTA_TI=y
+CONFIG_YENTA_ENE_TUNE=y
+CONFIG_YENTA_TOSHIBA=y
+CONFIG_PCMCIA_PROBE=y
+CONFIG_HOTPLUG_PCI=y
+# CONFIG_HOTPLUG_PCI_FAKE is not set
+# CONFIG_HOTPLUG_PCI_COMPAQ is not set
+# CONFIG_HOTPLUG_PCI_IBM is not set
+CONFIG_HOTPLUG_PCI_ACPI=m
+CONFIG_HOTPLUG_PCI_ACPI_IBM=m
+# CONFIG_HOTPLUG_PCI_CPCI is not set
+# CONFIG_HOTPLUG_PCI_SHPC is not set
+
+#
+# Executable file formats / Emulations
+#
+CONFIG_BINFMT_ELF=y
+CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS=y
+CONFIG_HAVE_AOUT=y
+# CONFIG_BINFMT_AOUT is not set
+CONFIG_BINFMT_MISC=y
+CONFIG_HAVE_ATOMIC_IOMAP=y
+CONFIG_HAVE_TEXT_POKE_SMP=y
+CONFIG_NET=y
+
+#
+# Networking options
+#
+CONFIG_PACKET=y
+CONFIG_UNIX=y
+CONFIG_XFRM=y
+CONFIG_XFRM_USER=y
+CONFIG_XFRM_SUB_POLICY=y
+CONFIG_XFRM_MIGRATE=y
+CONFIG_XFRM_STATISTICS=y
+CONFIG_XFRM_IPCOMP=m
+CONFIG_NET_KEY=m
+CONFIG_NET_KEY_MIGRATE=y
+CONFIG_INET=y
+CONFIG_IP_MULTICAST=y
+# CONFIG_IP_ADVANCED_ROUTER is not set
+CONFIG_IP_FIB_HASH=y
+# CONFIG_IP_PNP is not set
+# CONFIG_NET_IPIP is not set
+# CONFIG_NET_IPGRE_DEMUX is not set
+# CONFIG_IP_MROUTE is not set
+# CONFIG_ARPD is not set
+# CONFIG_SYN_COOKIES is not set
+CONFIG_INET_AH=m
+CONFIG_INET_ESP=m
+CONFIG_INET_IPCOMP=m
+CONFIG_INET_XFRM_TUNNEL=m
+CONFIG_INET_TUNNEL=m
+CONFIG_INET_XFRM_MODE_TRANSPORT=m
+CONFIG_INET_XFRM_MODE_TUNNEL=m
+CONFIG_INET_XFRM_MODE_BEET=m
+CONFIG_INET_LRO=y
+CONFIG_INET_DIAG=m
+CONFIG_INET_TCP_DIAG=m
+CONFIG_TCP_CONG_ADVANCED=y
+CONFIG_TCP_CONG_BIC=m
+CONFIG_TCP_CONG_CUBIC=y
+# CONFIG_TCP_CONG_WESTWOOD is not set
+# CONFIG_TCP_CONG_HTCP is not set
+# CONFIG_TCP_CONG_HSTCP is not set
+# CONFIG_TCP_CONG_HYBLA is not set
+# CONFIG_TCP_CONG_VEGAS is not set
+# CONFIG_TCP_CONG_SCALABLE is not set
+# CONFIG_TCP_CONG_LP is not set
+# CONFIG_TCP_CONG_VENO is not set
+# CONFIG_TCP_CONG_YEAH is not set
+# CONFIG_TCP_CONG_ILLINOIS is not set
+CONFIG_DEFAULT_CUBIC=y
+# CONFIG_DEFAULT_RENO is not set
+CONFIG_DEFAULT_TCP_CONG="cubic"
+CONFIG_TCP_MD5SIG=y
+CONFIG_IPV6=y
+CONFIG_IPV6_PRIVACY=y
+CONFIG_IPV6_ROUTER_PREF=y
+CONFIG_IPV6_ROUTE_INFO=y
+CONFIG_IPV6_OPTIMISTIC_DAD=y
+CONFIG_INET6_AH=m
+CONFIG_INET6_ESP=m
+CONFIG_INET6_IPCOMP=m
+CONFIG_IPV6_MIP6=m
+CONFIG_INET6_XFRM_TUNNEL=m
+CONFIG_INET6_TUNNEL=m
+CONFIG_INET6_XFRM_MODE_TRANSPORT=m
+CONFIG_INET6_XFRM_MODE_TUNNEL=m
+CONFIG_INET6_XFRM_MODE_BEET=m
+CONFIG_INET6_XFRM_MODE_ROUTEOPTIMIZATION=m
+CONFIG_IPV6_SIT=m
+# CONFIG_IPV6_SIT_6RD is not set
+CONFIG_IPV6_NDISC_NODETYPE=y
+CONFIG_IPV6_TUNNEL=m
+# CONFIG_IPV6_MULTIPLE_TABLES is not set
+# CONFIG_IPV6_MROUTE is not set
+# CONFIG_NETWORK_SECMARK is not set
+# CONFIG_NETWORK_PHY_TIMESTAMPING is not set
+CONFIG_NETFILTER=y
+# CONFIG_NETFILTER_DEBUG is not set
+CONFIG_NETFILTER_ADVANCED=y
+
+#
+# Core Netfilter Configuration
+#
+CONFIG_NETFILTER_NETLINK=m
+CONFIG_NETFILTER_NETLINK_QUEUE=m
+CONFIG_NETFILTER_NETLINK_LOG=m
+CONFIG_NF_CONNTRACK=y
+CONFIG_NF_CONNTRACK_MARK=y
+CONFIG_NF_CONNTRACK_EVENTS=y
+# CONFIG_NF_CT_PROTO_DCCP is not set
+CONFIG_NF_CT_PROTO_GRE=m
+CONFIG_NF_CT_PROTO_SCTP=m
+CONFIG_NF_CT_PROTO_UDPLITE=m
+CONFIG_NF_CONNTRACK_AMANDA=m
+CONFIG_NF_CONNTRACK_FTP=m
+CONFIG_NF_CONNTRACK_H323=m
+CONFIG_NF_CONNTRACK_IRC=m
+CONFIG_NF_CONNTRACK_NETBIOS_NS=m
+CONFIG_NF_CONNTRACK_PPTP=m
+CONFIG_NF_CONNTRACK_SANE=m
+CONFIG_NF_CONNTRACK_SIP=m
+CONFIG_NF_CONNTRACK_TFTP=m
+CONFIG_NF_CT_NETLINK=m
+# CONFIG_NETFILTER_TPROXY is not set
+CONFIG_NETFILTER_XTABLES=y
+
+#
+# Xtables combined modules
+#
+CONFIG_NETFILTER_XT_MARK=m
+CONFIG_NETFILTER_XT_CONNMARK=m
+
+#
+# Xtables targets
+#
+# CONFIG_NETFILTER_XT_TARGET_CHECKSUM is not set
+CONFIG_NETFILTER_XT_TARGET_CLASSIFY=m
+CONFIG_NETFILTER_XT_TARGET_CONNMARK=m
+# CONFIG_NETFILTER_XT_TARGET_CT is not set
+CONFIG_NETFILTER_XT_TARGET_DSCP=m
+CONFIG_NETFILTER_XT_TARGET_HL=m
+# CONFIG_NETFILTER_XT_TARGET_IDLETIMER is not set
+# CONFIG_NETFILTER_XT_TARGET_LED is not set
+CONFIG_NETFILTER_XT_TARGET_MARK=m
+CONFIG_NETFILTER_XT_TARGET_NFLOG=m
+CONFIG_NETFILTER_XT_TARGET_NFQUEUE=m
+CONFIG_NETFILTER_XT_TARGET_NOTRACK=m
+CONFIG_NETFILTER_XT_TARGET_RATEEST=m
+# CONFIG_NETFILTER_XT_TARGET_TEE is not set
+CONFIG_NETFILTER_XT_TARGET_TRACE=m
+CONFIG_NETFILTER_XT_TARGET_TCPMSS=m
+CONFIG_NETFILTER_XT_TARGET_TCPOPTSTRIP=m
+
+#
+# Xtables matches
+#
+# CONFIG_NETFILTER_XT_MATCH_CLUSTER is not set
+CONFIG_NETFILTER_XT_MATCH_COMMENT=m
+CONFIG_NETFILTER_XT_MATCH_CONNBYTES=m
+CONFIG_NETFILTER_XT_MATCH_CONNLIMIT=m
+CONFIG_NETFILTER_XT_MATCH_CONNMARK=m
+CONFIG_NETFILTER_XT_MATCH_CONNTRACK=m
+# CONFIG_NETFILTER_XT_MATCH_CPU is not set
+# CONFIG_NETFILTER_XT_MATCH_DCCP is not set
+CONFIG_NETFILTER_XT_MATCH_DSCP=m
+CONFIG_NETFILTER_XT_MATCH_ESP=m
+CONFIG_NETFILTER_XT_MATCH_HASHLIMIT=m
+CONFIG_NETFILTER_XT_MATCH_HELPER=m
+CONFIG_NETFILTER_XT_MATCH_HL=m
+CONFIG_NETFILTER_XT_MATCH_IPRANGE=m
+CONFIG_NETFILTER_XT_MATCH_LENGTH=m
+CONFIG_NETFILTER_XT_MATCH_LIMIT=m
+CONFIG_NETFILTER_XT_MATCH_MAC=m
+CONFIG_NETFILTER_XT_MATCH_MARK=m
+CONFIG_NETFILTER_XT_MATCH_MULTIPORT=m
+# CONFIG_NETFILTER_XT_MATCH_OSF is not set
+CONFIG_NETFILTER_XT_MATCH_OWNER=m
+CONFIG_NETFILTER_XT_MATCH_POLICY=m
+CONFIG_NETFILTER_XT_MATCH_PKTTYPE=m
+CONFIG_NETFILTER_XT_MATCH_QUOTA=m
+CONFIG_NETFILTER_XT_MATCH_RATEEST=m
+CONFIG_NETFILTER_XT_MATCH_REALM=m
+# CONFIG_NETFILTER_XT_MATCH_RECENT is not set
+CONFIG_NETFILTER_XT_MATCH_SCTP=m
+CONFIG_NETFILTER_XT_MATCH_STATE=y
+CONFIG_NETFILTER_XT_MATCH_STATISTIC=m
+CONFIG_NETFILTER_XT_MATCH_STRING=m
+CONFIG_NETFILTER_XT_MATCH_TCPMSS=m
+CONFIG_NETFILTER_XT_MATCH_TIME=m
+CONFIG_NETFILTER_XT_MATCH_U32=m
+# CONFIG_IP_VS is not set
+
+#
+# IP: Netfilter Configuration
+#
+CONFIG_NF_DEFRAG_IPV4=y
+CONFIG_NF_CONNTRACK_IPV4=y
+# CONFIG_NF_CONNTRACK_PROC_COMPAT is not set
+CONFIG_IP_NF_QUEUE=m
+CONFIG_IP_NF_IPTABLES=y
+CONFIG_IP_NF_MATCH_ADDRTYPE=m
+CONFIG_IP_NF_MATCH_AH=m
+CONFIG_IP_NF_MATCH_ECN=m
+CONFIG_IP_NF_MATCH_TTL=m
+CONFIG_IP_NF_FILTER=y
+CONFIG_IP_NF_TARGET_REJECT=y
+CONFIG_IP_NF_TARGET_LOG=m
+CONFIG_IP_NF_TARGET_ULOG=m
+CONFIG_NF_NAT=m
+CONFIG_NF_NAT_NEEDED=y
+CONFIG_IP_NF_TARGET_MASQUERADE=m
+CONFIG_IP_NF_TARGET_NETMAP=m
+CONFIG_IP_NF_TARGET_REDIRECT=m
+CONFIG_NF_NAT_SNMP_BASIC=m
+CONFIG_NF_NAT_PROTO_GRE=m
+CONFIG_NF_NAT_PROTO_UDPLITE=m
+CONFIG_NF_NAT_PROTO_SCTP=m
+CONFIG_NF_NAT_FTP=m
+CONFIG_NF_NAT_IRC=m
+CONFIG_NF_NAT_TFTP=m
+CONFIG_NF_NAT_AMANDA=m
+CONFIG_NF_NAT_PPTP=m
+CONFIG_NF_NAT_H323=m
+CONFIG_NF_NAT_SIP=m
+CONFIG_IP_NF_MANGLE=m
+CONFIG_IP_NF_TARGET_CLUSTERIP=m
+CONFIG_IP_NF_TARGET_ECN=m
+CONFIG_IP_NF_TARGET_TTL=m
+CONFIG_IP_NF_RAW=m
+CONFIG_IP_NF_ARPTABLES=m
+CONFIG_IP_NF_ARPFILTER=m
+CONFIG_IP_NF_ARP_MANGLE=m
+
+#
+# IPv6: Netfilter Configuration
+#
+CONFIG_NF_DEFRAG_IPV6=y
+CONFIG_NF_CONNTRACK_IPV6=y
+CONFIG_IP6_NF_QUEUE=m
+CONFIG_IP6_NF_IPTABLES=y
+CONFIG_IP6_NF_MATCH_AH=m
+CONFIG_IP6_NF_MATCH_EUI64=m
+CONFIG_IP6_NF_MATCH_FRAG=m
+CONFIG_IP6_NF_MATCH_OPTS=m
+CONFIG_IP6_NF_MATCH_HL=m
+CONFIG_IP6_NF_MATCH_IPV6HEADER=m
+CONFIG_IP6_NF_MATCH_MH=m
+CONFIG_IP6_NF_MATCH_RT=m
+CONFIG_IP6_NF_TARGET_HL=m
+CONFIG_IP6_NF_TARGET_LOG=m
+CONFIG_IP6_NF_FILTER=y
+CONFIG_IP6_NF_TARGET_REJECT=y
+CONFIG_IP6_NF_MANGLE=m
+CONFIG_IP6_NF_RAW=m
+# CONFIG_IP_DCCP is not set
+# CONFIG_IP_SCTP is not set
+# CONFIG_RDS is not set
+# CONFIG_TIPC is not set
+# CONFIG_ATM is not set
+# CONFIG_L2TP is not set
+# CONFIG_BRIDGE is not set
+# CONFIG_NET_DSA is not set
+# CONFIG_VLAN_8021Q is not set
+# CONFIG_DECNET is not set
+# CONFIG_LLC2 is not set
+# CONFIG_IPX is not set
+# CONFIG_ATALK is not set
+# CONFIG_X25 is not set
+# CONFIG_LAPB is not set
+# CONFIG_ECONET is not set
+# CONFIG_WAN_ROUTER is not set
+# CONFIG_PHONET is not set
+# CONFIG_IEEE802154 is not set
+# CONFIG_NET_SCHED is not set
+CONFIG_NET_CLS_ROUTE=y
+# CONFIG_DCB is not set
+# CONFIG_DNS_RESOLVER is not set
+CONFIG_RPS=y
+
+#
+# Network testing
+#
+# CONFIG_NET_PKTGEN is not set
+# CONFIG_NET_DROP_MONITOR is not set
+# CONFIG_HAMRADIO is not set
+# CONFIG_CAN is not set
+# CONFIG_IRDA is not set
+CONFIG_BT=y
+CONFIG_BT_L2CAP=y
+CONFIG_BT_SCO=y
+CONFIG_BT_RFCOMM=y
+CONFIG_BT_RFCOMM_TTY=y
+CONFIG_BT_BNEP=y
+CONFIG_BT_BNEP_MC_FILTER=y
+CONFIG_BT_BNEP_PROTO_FILTER=y
+CONFIG_BT_HIDP=y
+
+#
+# Bluetooth device drivers
+#
+CONFIG_BT_HCIBTUSB=y
+CONFIG_BT_HCIBTSDIO=m
+CONFIG_BT_HCIUART=m
+CONFIG_BT_HCIUART_H4=y
+CONFIG_BT_HCIUART_BCSP=y
+# CONFIG_BT_HCIUART_ATH3K is not set
+CONFIG_BT_HCIUART_LL=y
+CONFIG_BT_HCIBCM203X=m
+CONFIG_BT_HCIBPA10X=m
+CONFIG_BT_HCIBFUSB=m
+CONFIG_BT_HCIVHCI=m
+CONFIG_BT_MRVL=m
+CONFIG_BT_MRVL_SDIO=m
+CONFIG_BT_ATH3K=m
+# CONFIG_AF_RXRPC is not set
+CONFIG_WIRELESS=y
+CONFIG_WIRELESS_EXT=y
+CONFIG_WEXT_CORE=y
+CONFIG_WEXT_PROC=y
+CONFIG_WEXT_SPY=y
+CONFIG_WEXT_PRIV=y
+CONFIG_CFG80211=y
+# CONFIG_NL80211_TESTMODE is not set
+# CONFIG_CFG80211_DEVELOPER_WARNINGS is not set
+# CONFIG_CFG80211_REG_DEBUG is not set
+CONFIG_CFG80211_DEFAULT_PS=y
+# CONFIG_CFG80211_DEBUGFS is not set
+# CONFIG_CFG80211_INTERNAL_REGDB is not set
+CONFIG_CFG80211_WEXT=y
+CONFIG_WIRELESS_EXT_SYSFS=y
+CONFIG_LIB80211=y
+CONFIG_LIB80211_CRYPT_WEP=m
+CONFIG_LIB80211_CRYPT_CCMP=m
+CONFIG_LIB80211_CRYPT_TKIP=m
+# CONFIG_LIB80211_DEBUG is not set
+CONFIG_MAC80211=y
+CONFIG_MAC80211_HAS_RC=y
+CONFIG_MAC80211_RC_MINSTREL=y
+CONFIG_MAC80211_RC_MINSTREL_HT=y
+CONFIG_MAC80211_RC_DEFAULT_MINSTREL=y
+CONFIG_MAC80211_RC_DEFAULT="minstrel_ht"
+CONFIG_MAC80211_MESH=y
+CONFIG_MAC80211_LEDS=y
+CONFIG_MAC80211_DEBUGFS=y
+# CONFIG_MAC80211_DEBUG_MENU is not set
+CONFIG_WIMAX=m
+CONFIG_WIMAX_DEBUG_LEVEL=8
+CONFIG_RFKILL=y
+CONFIG_RFKILL_LEDS=y
+CONFIG_RFKILL_INPUT=y
+# CONFIG_NET_9P is not set
+CONFIG_CAIF=y
+# CONFIG_CAIF_DEBUG is not set
+CONFIG_CAIF_NETDEV=y
+# CONFIG_CEPH_LIB is not set
+
+#
+# Device Drivers
+#
+
+#
+# Generic Driver Options
+#
+CONFIG_UEVENT_HELPER_PATH=""
+# CONFIG_DEVTMPFS is not set
+CONFIG_STANDALONE=y
+CONFIG_PREVENT_FIRMWARE_BUILD=y
+CONFIG_FW_LOADER=y
+CONFIG_FIRMWARE_IN_KERNEL=y
+CONFIG_EXTRA_FIRMWARE=""
+# CONFIG_DEBUG_DRIVER is not set
+CONFIG_DEBUG_DEVRES=y
+# CONFIG_SYS_HYPERVISOR is not set
+CONFIG_CONNECTOR=y
+CONFIG_PROC_EVENTS=y
+# CONFIG_MTD is not set
+# CONFIG_PARPORT is not set
+CONFIG_PNP=y
+# CONFIG_PNP_DEBUG_MESSAGES is not set
+
+#
+# Protocols
+#
+# CONFIG_ISAPNP is not set
+# CONFIG_PNPBIOS is not set
+CONFIG_PNPACPI=y
+CONFIG_BLK_DEV=y
+# CONFIG_BLK_DEV_FD is not set
+# CONFIG_BLK_DEV_XD 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=m
+# CONFIG_BLK_DEV_DRBD 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=m
+CONFIG_BLK_DEV_RAM_COUNT=16
+CONFIG_BLK_DEV_RAM_SIZE=16384
+# CONFIG_BLK_DEV_XIP is not set
+CONFIG_CDROM_PKTCDVD=m
+CONFIG_CDROM_PKTCDVD_BUFFERS=8
+# CONFIG_CDROM_PKTCDVD_WCACHE is not set
+# CONFIG_ATA_OVER_ETH is not set
+# CONFIG_BLK_DEV_HD is not set
+# CONFIG_BLK_DEV_RBD is not set
+CONFIG_MISC_DEVICES=y
+# CONFIG_AD525X_DPOT is not set
+# CONFIG_IBM_ASM is not set
+# CONFIG_PHANTOM is not set
+# CONFIG_SGI_IOC4 is not set
+CONFIG_TIFM_CORE=m
+# CONFIG_TIFM_7XX1 is not set
+# CONFIG_ICS932S401 is not set
+# CONFIG_ENCLOSURE_SERVICES is not set
+# CONFIG_CS5535_MFGPT is not set
+# CONFIG_HP_ILO is not set
+# CONFIG_APDS9802ALS is not set
+# CONFIG_ISL29003 is not set
+# CONFIG_ISL29020 is not set
+# CONFIG_SENSORS_TSL2550 is not set
+CONFIG_SENSORS_BH1780=m
+CONFIG_SENSORS_BH1770=m
+CONFIG_SENSORS_APDS990X=m
+# CONFIG_HMC6352 is not set
+# CONFIG_DS1682 is not set
+# CONFIG_VMWARE_BALLOON is not set
+CONFIG_BMP085=m
+# CONFIG_PCH_PHUB is not set
+# CONFIG_C2PORT is not set
+
+#
+# EEPROM support
+#
+# CONFIG_EEPROM_AT24 is not set
+# CONFIG_EEPROM_LEGACY is not set
+# CONFIG_EEPROM_MAX6875 is not set
+CONFIG_EEPROM_93CX6=m
+# CONFIG_CB710_CORE is not set
+# CONFIG_IWMC3200TOP is not set
+
+#
+# Texas Instruments shared transport line discipline
+#
+# CONFIG_TI_ST is not set
+CONFIG_HAVE_IDE=y
+# CONFIG_IDE is not set
+
+#
+# SCSI device support
+#
+CONFIG_SCSI_MOD=y
+CONFIG_RAID_ATTRS=m
+CONFIG_SCSI=y
+CONFIG_SCSI_DMA=y
+# CONFIG_SCSI_TGT is not set
+CONFIG_SCSI_NETLINK=y
+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=y
+CONFIG_CHR_DEV_SG=y
+# CONFIG_CHR_DEV_SCH is not set
+CONFIG_SCSI_MULTI_LUN=y
+CONFIG_SCSI_CONSTANTS=y
+CONFIG_SCSI_LOGGING=y
+CONFIG_SCSI_SCAN_ASYNC=y
+CONFIG_SCSI_WAIT_SCAN=m
+
+#
+# SCSI Transports
+#
+CONFIG_SCSI_SPI_ATTRS=y
+CONFIG_SCSI_FC_ATTRS=m
+# CONFIG_SCSI_ISCSI_ATTRS is not set
+CONFIG_SCSI_SAS_ATTRS=m
+# 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_ISCSI_BOOT_SYSFS is not set
+# CONFIG_SCSI_CXGB3_ISCSI is not set
+# CONFIG_SCSI_CXGB4_ISCSI is not set
+# CONFIG_SCSI_BNX2_ISCSI is not set
+# CONFIG_BE2ISCSI is not set
+# CONFIG_BLK_DEV_3W_XXXX_RAID is not set
+# CONFIG_SCSI_HPSA is not set
+# CONFIG_SCSI_3W_9XXX is not set
+# CONFIG_SCSI_3W_SAS is not set
+# CONFIG_SCSI_7000FASST is not set
+# CONFIG_SCSI_ACARD is not set
+# CONFIG_SCSI_AHA152X is not set
+# CONFIG_SCSI_AHA1542 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_MVSAS is not set
+# CONFIG_SCSI_DPT_I2O is not set
+# CONFIG_SCSI_ADVANSYS is not set
+# CONFIG_SCSI_IN2000 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_MPT2SAS is not set
+# CONFIG_SCSI_HPTIOP is not set
+# CONFIG_SCSI_BUSLOGIC is not set
+# CONFIG_VMWARE_PVSCSI is not set
+# CONFIG_LIBFC is not set
+# CONFIG_LIBFCOE is not set
+# CONFIG_FCOE is not set
+# CONFIG_FCOE_FNIC is not set
+# CONFIG_SCSI_DMX3191D is not set
+# CONFIG_SCSI_DTC3280 is not set
+# CONFIG_SCSI_EATA 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_IPS is not set
+# CONFIG_SCSI_INITIO is not set
+# CONFIG_SCSI_INIA100 is not set
+# CONFIG_SCSI_NCR53C406A is not set
+# CONFIG_SCSI_STEX is not set
+# CONFIG_SCSI_SYM53C8XX_2 is not set
+# CONFIG_SCSI_IPR is not set
+# CONFIG_SCSI_PAS16 is not set
+# CONFIG_SCSI_QLOGIC_FAS 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_SYM53C416 is not set
+# CONFIG_SCSI_DC395x is not set
+# CONFIG_SCSI_DC390T is not set
+# CONFIG_SCSI_T128 is not set
+# CONFIG_SCSI_U14_34F is not set
+# CONFIG_SCSI_ULTRASTOR is not set
+# CONFIG_SCSI_NSP32 is not set
+# CONFIG_SCSI_DEBUG is not set
+# CONFIG_SCSI_PMCRAID is not set
+# CONFIG_SCSI_PM8001 is not set
+# CONFIG_SCSI_SRP is not set
+# CONFIG_SCSI_BFA_FC is not set
+# CONFIG_SCSI_DH is not set
+# CONFIG_SCSI_OSD_INITIATOR is not set
+CONFIG_ATA=y
+# CONFIG_ATA_NONSTANDARD is not set
+# CONFIG_ATA_VERBOSE_ERROR is not set
+CONFIG_ATA_ACPI=y
+# CONFIG_SATA_PMP is not set
+
+#
+# Controllers with non-SFF native interface
+#
+CONFIG_SATA_AHCI=y
+CONFIG_SATA_AHCI_PLATFORM=y
+# CONFIG_SATA_INIC162X is not set
+# CONFIG_SATA_SIL24 is not set
+CONFIG_ATA_SFF=y
+
+#
+# SFF controllers with custom DMA interface
+#
+# CONFIG_PDC_ADMA is not set
+# CONFIG_SATA_QSTOR is not set
+# CONFIG_SATA_SX4 is not set
+CONFIG_ATA_BMDMA=y
+
+#
+# SATA SFF controllers with BMDMA
+#
+CONFIG_ATA_PIIX=y
+# CONFIG_SATA_MV is not set
+# CONFIG_SATA_NV is not set
+# CONFIG_SATA_PROMISE is not set
+# CONFIG_SATA_SIL is not set
+# CONFIG_SATA_SIS is not set
+# CONFIG_SATA_SVW is not set
+# CONFIG_SATA_ULI is not set
+# CONFIG_SATA_VIA is not set
+# CONFIG_SATA_VITESSE is not set
+
+#
+# PATA SFF controllers with BMDMA
+#
+# 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_ATP867X 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_CS5536 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_IT8213 is not set
+# CONFIG_PATA_IT821X is not set
+# CONFIG_PATA_JMICRON is not set
+# CONFIG_PATA_MARVELL is not set
+# CONFIG_PATA_NETCELL is not set
+# CONFIG_PATA_NINJA32 is not set
+# CONFIG_PATA_NS87415 is not set
+# CONFIG_PATA_OLDPIIX is not set
+# CONFIG_PATA_OPTIDMA is not set
+# CONFIG_PATA_PDC2027X is not set
+# CONFIG_PATA_PDC_OLD is not set
+# CONFIG_PATA_RADISYS is not set
+# CONFIG_PATA_RDC is not set
+# CONFIG_PATA_SC1200 is not set
+CONFIG_PATA_SCH=y
+# CONFIG_PATA_SERVERWORKS is not set
+# CONFIG_PATA_SIL680 is not set
+# CONFIG_PATA_SIS is not set
+# CONFIG_PATA_TOSHIBA is not set
+# CONFIG_PATA_TRIFLEX is not set
+# CONFIG_PATA_VIA is not set
+# CONFIG_PATA_WINBOND is not set
+
+#
+# PIO-only SFF controllers
+#
+# CONFIG_PATA_CMD640_PCI is not set
+CONFIG_PATA_MPIIX=y
+# CONFIG_PATA_NS87410 is not set
+# CONFIG_PATA_OPTI is not set
+# CONFIG_PATA_QDI is not set
+# CONFIG_PATA_RZ1000 is not set
+# CONFIG_PATA_WINBOND_VLB is not set
+
+#
+# Generic fallback / legacy drivers
+#
+# CONFIG_PATA_ACPI is not set
+CONFIG_ATA_GENERIC=y
+# CONFIG_PATA_LEGACY is not set
+CONFIG_MD=y
+# CONFIG_BLK_DEV_MD is not set
+CONFIG_BLK_DEV_DM=m
+CONFIG_DM_DEBUG=y
+# CONFIG_DM_CRYPT is not set
+CONFIG_DM_SNAPSHOT=m
+CONFIG_DM_MIRROR=m
+# CONFIG_DM_LOG_USERSPACE is not set
+CONFIG_DM_ZERO=m
+CONFIG_DM_MULTIPATH=m
+# CONFIG_DM_MULTIPATH_QL is not set
+# CONFIG_DM_MULTIPATH_ST is not set
+CONFIG_DM_DELAY=m
+# CONFIG_DM_UEVENT is not set
+CONFIG_FUSION=y
+CONFIG_FUSION_SPI=y
+CONFIG_FUSION_FC=m
+CONFIG_FUSION_SAS=m
+CONFIG_FUSION_MAX_SGE=40
+CONFIG_FUSION_CTL=m
+CONFIG_FUSION_LOGGING=y
+
+#
+# IEEE 1394 (FireWire) support
+#
+# CONFIG_FIREWIRE is not set
+CONFIG_FIREWIRE_NOSY=m
+# CONFIG_I2O is not set
+# CONFIG_MACINTOSH_DRIVERS is not set
+CONFIG_NETDEVICES=y
+# CONFIG_DUMMY is not set
+# CONFIG_BONDING is not set
+CONFIG_MACVLAN=m
+# CONFIG_MACVTAP is not set
+# CONFIG_EQUALIZER is not set
+CONFIG_TUN=y
+# CONFIG_VETH is not set
+# CONFIG_NET_SB1000 is not set
+# CONFIG_ARCNET is not set
+CONFIG_MII=y
+CONFIG_PHYLIB=m
+
+#
+# MII PHY device drivers
+#
+CONFIG_MARVELL_PHY=m
+CONFIG_DAVICOM_PHY=m
+CONFIG_QSEMI_PHY=m
+CONFIG_LXT_PHY=m
+CONFIG_CICADA_PHY=m
+CONFIG_VITESSE_PHY=m
+CONFIG_SMSC_PHY=m
+CONFIG_BROADCOM_PHY=m
+CONFIG_BCM63XX_PHY=m
+CONFIG_ICPLUS_PHY=m
+CONFIG_REALTEK_PHY=m
+# CONFIG_NATIONAL_PHY is not set
+# CONFIG_STE10XP is not set
+# CONFIG_LSI_ET1011C_PHY is not set
+CONFIG_MICREL_PHY=m
+CONFIG_MDIO_BITBANG=m
+CONFIG_NET_ETHERNET=y
+# CONFIG_HAPPYMEAL is not set
+# CONFIG_SUNGEM is not set
+# CONFIG_CASSINI is not set
+# CONFIG_NET_VENDOR_3COM is not set
+# CONFIG_LANCE is not set
+# CONFIG_NET_VENDOR_SMC is not set
+# CONFIG_ETHOC is not set
+# CONFIG_NET_VENDOR_RACAL is not set
+# CONFIG_DNET is not set
+# CONFIG_NET_TULIP is not set
+# CONFIG_AT1700 is not set
+# CONFIG_DEPCA is not set
+# CONFIG_HP100 is not set
+# CONFIG_NET_ISA is not set
+# CONFIG_IBM_NEW_EMAC_ZMII is not set
+# CONFIG_IBM_NEW_EMAC_RGMII is not set
+# CONFIG_IBM_NEW_EMAC_TAH is not set
+# CONFIG_IBM_NEW_EMAC_EMAC4 is not set
+# CONFIG_IBM_NEW_EMAC_NO_FLOW_CTRL is not set
+# CONFIG_IBM_NEW_EMAC_MAL_CLR_ICINTSTAT is not set
+# CONFIG_IBM_NEW_EMAC_MAL_COMMON_ERR is not set
+CONFIG_NET_PCI=y
+CONFIG_PCNET32=m
+# CONFIG_AMD8111_ETH is not set
+# CONFIG_ADAPTEC_STARFIRE is not set
+# CONFIG_AC3200 is not set
+# CONFIG_KSZ884X_PCI is not set
+# CONFIG_APRICOT is not set
+# CONFIG_B44 is not set
+# CONFIG_FORCEDETH is not set
+# CONFIG_CS89x0 is not set
+CONFIG_E100=y
+# CONFIG_FEALNX is not set
+# CONFIG_NATSEMI is not set
+# CONFIG_NE2K_PCI is not set
+CONFIG_8139CP=m
+CONFIG_8139TOO=m
+CONFIG_8139TOO_PIO=y
+# CONFIG_8139TOO_TUNE_TWISTER is not set
+# CONFIG_8139TOO_8129 is not set
+# CONFIG_8139_OLD_RX_RESET is not set
+# CONFIG_R6040 is not set
+CONFIG_SIS900=m
+# CONFIG_EPIC100 is not set
+# CONFIG_SMSC9420 is not set
+# CONFIG_SUNDANCE is not set
+# CONFIG_TLAN is not set
+# CONFIG_KS8851_MLL is not set
+# CONFIG_VIA_RHINE is not set
+# CONFIG_SC92031 is not set
+CONFIG_ATL2=m
+CONFIG_NETDEV_1000=y
+# CONFIG_ACENIC is not set
+# CONFIG_DL2K is not set
+CONFIG_E1000=y
+CONFIG_E1000E=y
+# CONFIG_IP1000 is not set
+CONFIG_IGB=y
+# CONFIG_IGBVF is not set
+# CONFIG_NS83820 is not set
+# CONFIG_HAMACHI is not set
+# CONFIG_YELLOWFIN is not set
+CONFIG_R8169=y
+CONFIG_SIS190=m
+# CONFIG_SKGE is not set
+CONFIG_SKY2=m
+# CONFIG_SKY2_DEBUG is not set
+# CONFIG_VIA_VELOCITY is not set
+CONFIG_TIGON3=m
+CONFIG_BNX2=m
+# CONFIG_CNIC is not set
+# CONFIG_QLA3XXX is not set
+CONFIG_ATL1=m
+CONFIG_ATL1E=y
+CONFIG_ATL1C=m
+# CONFIG_JME is not set
+# CONFIG_STMMAC_ETH is not set
+# CONFIG_PCH_GBE is not set
+CONFIG_NETDEV_10000=y
+CONFIG_MDIO=m
+# CONFIG_CHELSIO_T1 is not set
+CONFIG_CHELSIO_T3_DEPENDS=y
+# CONFIG_CHELSIO_T3 is not set
+CONFIG_CHELSIO_T4_DEPENDS=y
+# CONFIG_CHELSIO_T4 is not set
+CONFIG_CHELSIO_T4VF_DEPENDS=y
+CONFIG_CHELSIO_T4VF=m
+# CONFIG_ENIC is not set
+CONFIG_IXGBE=m
+# CONFIG_IXGBEVF is not set
+CONFIG_IXGB=m
+# CONFIG_S2IO is not set
+# CONFIG_VXGE is not set
+# CONFIG_MYRI10GE is not set
+# CONFIG_NETXEN_NIC is not set
+# CONFIG_NIU is not set
+# CONFIG_MLX4_EN is not set
+# CONFIG_MLX4_CORE is not set
+# CONFIG_TEHUTI is not set
+CONFIG_BNX2X=m
+# CONFIG_QLCNIC is not set
+# CONFIG_QLGE is not set
+# CONFIG_BNA is not set
+# CONFIG_SFC is not set
+# CONFIG_BE2NET is not set
+# CONFIG_TR is not set
+CONFIG_WLAN=y
+# CONFIG_LIBERTAS_THINFIRM is not set
+# CONFIG_AIRO is not set
+# CONFIG_ATMEL is not set
+CONFIG_AT76C50X_USB=m
+# CONFIG_PRISM54 is not set
+CONFIG_USB_ZD1201=m
+CONFIG_USB_NET_RNDIS_WLAN=m
+CONFIG_RTL8180=m
+CONFIG_RTL8187=m
+CONFIG_RTL8187_LEDS=y
+# CONFIG_ADM8211 is not set
+# CONFIG_MAC80211_HWSIM is not set
+# CONFIG_MWL8K is not set
+CONFIG_ATH_COMMON=y
+# CONFIG_ATH_DEBUG is not set
+CONFIG_ATH5K=y
+# CONFIG_ATH5K_DEBUG is not set
+CONFIG_ATH9K_HW=m
+CONFIG_ATH9K_COMMON=m
+CONFIG_ATH9K=m
+# CONFIG_ATH9K_DEBUGFS is not set
+CONFIG_ATH9K_RATE_CONTROL=y
+CONFIG_ATH9K_HTC=m
+# CONFIG_ATH9K_HTC_DEBUGFS is not set
+CONFIG_AR9170_USB=m
+CONFIG_AR9170_LEDS=y
+# CONFIG_CARL9170 is not set
+# CONFIG_B43 is not set
+# CONFIG_B43LEGACY is not set
+# CONFIG_HOSTAP is not set
+CONFIG_IPW2100=m
+# CONFIG_IPW2100_MONITOR is not set
+# CONFIG_IPW2100_DEBUG is not set
+CONFIG_IPW2200=m
+# CONFIG_IPW2200_MONITOR is not set
+CONFIG_IPW2200_QOS=y
+# CONFIG_IPW2200_DEBUG is not set
+CONFIG_LIBIPW=m
+# CONFIG_LIBIPW_DEBUG is not set
+CONFIG_IWLWIFI=m
+
+#
+# Debugging Options
+#
+# CONFIG_IWLWIFI_DEBUG is not set
+CONFIG_IWLWIFI_DEBUGFS=y
+# CONFIG_IWLWIFI_DEVICE_TRACING is not set
+CONFIG_IWLAGN=m
+CONFIG_IWL4965=y
+CONFIG_IWL5000=y
+CONFIG_IWL3945=m
+# CONFIG_IWM is not set
+CONFIG_LIBERTAS=m
+CONFIG_LIBERTAS_USB=m
+CONFIG_LIBERTAS_SDIO=m
+CONFIG_LIBERTAS_DEBUG=y
+# CONFIG_LIBERTAS_MESH is not set
+# CONFIG_HERMES is not set
+CONFIG_P54_COMMON=m
+CONFIG_P54_USB=m
+CONFIG_P54_PCI=m
+CONFIG_P54_LEDS=y
+CONFIG_RT2X00=m
+CONFIG_RT2400PCI=m
+CONFIG_RT2500PCI=m
+CONFIG_RT61PCI=m
+CONFIG_RT2800PCI_PCI=y
+# CONFIG_RT2800PCI is not set
+CONFIG_RT2500USB=m
+CONFIG_RT73USB=m
+# CONFIG_RT2800USB is not set
+CONFIG_RT2X00_LIB_PCI=m
+CONFIG_RT2X00_LIB_USB=m
+CONFIG_RT2X00_LIB=m
+CONFIG_RT2X00_LIB_FIRMWARE=y
+CONFIG_RT2X00_LIB_CRYPTO=y
+CONFIG_RT2X00_LIB_LEDS=y
+# CONFIG_RT2X00_LIB_DEBUGFS is not set
+# CONFIG_RT2X00_DEBUG is not set
+# CONFIG_WL1251 is not set
+# CONFIG_WL12XX is not set
+# CONFIG_ZD1211RW is not set
+
+#
+# WiMAX Wireless Broadband devices
+#
+CONFIG_WIMAX_I2400M=m
+CONFIG_WIMAX_I2400M_USB=m
+# CONFIG_WIMAX_I2400M_SDIO is not set
+CONFIG_WIMAX_I2400M_DEBUG_LEVEL=8
+
+#
+# USB Network Adapters
+#
+CONFIG_USB_CATC=m
+CONFIG_USB_KAWETH=m
+CONFIG_USB_PEGASUS=m
+CONFIG_USB_RTL8150=m
+CONFIG_USB_USBNET=m
+CONFIG_USB_NET_AX8817X=m
+CONFIG_USB_NET_CDCETHER=m
+CONFIG_USB_NET_CDC_EEM=m
+CONFIG_USB_NET_DM9601=m
+# CONFIG_USB_NET_SMSC75XX is not set
+CONFIG_USB_NET_SMSC95XX=m
+CONFIG_USB_NET_GL620A=m
+CONFIG_USB_NET_NET1080=m
+CONFIG_USB_NET_PLUSB=m
+CONFIG_USB_NET_MCS7830=m
+CONFIG_USB_NET_RNDIS_HOST=m
+CONFIG_USB_NET_CDC_SUBSET=m
+CONFIG_USB_ALI_M5632=y
+CONFIG_USB_AN2720=y
+CONFIG_USB_BELKIN=y
+CONFIG_USB_ARMLINUX=y
+CONFIG_USB_EPSON2888=y
+CONFIG_USB_KC2190=y
+CONFIG_USB_NET_ZAURUS=m
+# CONFIG_USB_NET_CX82310_ETH is not set
+CONFIG_USB_HSO=m
+# CONFIG_USB_NET_INT51X1 is not set
+CONFIG_USB_IPHETH=m
+CONFIG_USB_SIERRA_NET=m
+# CONFIG_WAN is not set
+
+#
+# CAIF transport drivers
+#
+CONFIG_CAIF_TTY=y
+CONFIG_CAIF_SPI_SLAVE=y
+CONFIG_CAIF_SPI_SYNC=y
+# CONFIG_FDDI is not set
+# CONFIG_HIPPI is not set
+CONFIG_PPP=m
+CONFIG_PPP_MULTILINK=y
+CONFIG_PPP_FILTER=y
+CONFIG_PPP_ASYNC=m
+CONFIG_PPP_SYNC_TTY=m
+CONFIG_PPP_DEFLATE=m
+CONFIG_PPP_BSDCOMP=m
+CONFIG_PPP_MPPE=m
+CONFIG_PPPOE=m
+# CONFIG_SLIP is not set
+CONFIG_SLHC=m
+# CONFIG_NET_FC is not set
+# CONFIG_NETCONSOLE is not set
+# CONFIG_NETPOLL is not set
+# CONFIG_NET_POLL_CONTROLLER is not set
+CONFIG_VMXNET3=m
+# CONFIG_ISDN is not set
+# CONFIG_PHONE is not set
+
+#
+# Input device support
+#
+CONFIG_INPUT=y
+CONFIG_INPUT_FF_MEMLESS=y
+CONFIG_INPUT_POLLDEV=m
+CONFIG_INPUT_SPARSEKMAP=m
+
+#
+# Userland interfaces
+#
+CONFIG_INPUT_MOUSEDEV=y
+# CONFIG_INPUT_MOUSEDEV_PSAUX is not set
+CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024
+CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768
+CONFIG_INPUT_JOYDEV=m
+CONFIG_INPUT_EVDEV=y
+# CONFIG_INPUT_EVBUG is not set
+
+#
+# Input Device Drivers
+#
+CONFIG_INPUT_KEYBOARD=y
+# CONFIG_KEYBOARD_ADP5588 is not set
+CONFIG_KEYBOARD_ATKBD=y
+# CONFIG_KEYBOARD_QT2160 is not set
+# CONFIG_KEYBOARD_LKKBD is not set
+CONFIG_KEYBOARD_TCA6416=m
+# CONFIG_KEYBOARD_LM8323 is not set
+# CONFIG_KEYBOARD_MAX7359 is not set
+CONFIG_KEYBOARD_MCS=m
+# CONFIG_KEYBOARD_NEWTON is not set
+# CONFIG_KEYBOARD_OPENCORES is not set
+# CONFIG_KEYBOARD_STOWAWAY is not set
+# CONFIG_KEYBOARD_SUNKBD is not set
+# CONFIG_KEYBOARD_XTKBD 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_ELANTECH is not set
+# CONFIG_MOUSE_PS2_SENTELIC is not set
+CONFIG_MOUSE_PS2_TOUCHKIT=y
+CONFIG_MOUSE_SERIAL=m
+# CONFIG_MOUSE_APPLETOUCH is not set
+# CONFIG_MOUSE_BCM5974 is not set
+# CONFIG_MOUSE_INPORT is not set
+# CONFIG_MOUSE_LOGIBM is not set
+# CONFIG_MOUSE_PC110PAD is not set
+CONFIG_MOUSE_VSXXXAA=m
+# CONFIG_MOUSE_SYNAPTICS_I2C is not set
+CONFIG_INPUT_JOYSTICK=y
+# CONFIG_JOYSTICK_ANALOG is not set
+# CONFIG_JOYSTICK_A3D is not set
+# CONFIG_JOYSTICK_ADI is not set
+# CONFIG_JOYSTICK_COBRA is not set
+# CONFIG_JOYSTICK_GF2K is not set
+# CONFIG_JOYSTICK_GRIP is not set
+# CONFIG_JOYSTICK_GRIP_MP is not set
+# CONFIG_JOYSTICK_GUILLEMOT is not set
+# CONFIG_JOYSTICK_INTERACT is not set
+# CONFIG_JOYSTICK_SIDEWINDER is not set
+# CONFIG_JOYSTICK_TMDC is not set
+# CONFIG_JOYSTICK_IFORCE is not set
+# CONFIG_JOYSTICK_WARRIOR is not set
+# CONFIG_JOYSTICK_MAGELLAN is not set
+# CONFIG_JOYSTICK_SPACEORB is not set
+# CONFIG_JOYSTICK_SPACEBALL is not set
+# CONFIG_JOYSTICK_STINGER is not set
+# CONFIG_JOYSTICK_TWIDJOY is not set
+# CONFIG_JOYSTICK_ZHENHUA is not set
+# CONFIG_JOYSTICK_JOYDUMP is not set
+# CONFIG_JOYSTICK_XPAD is not set
+# CONFIG_INPUT_TABLET is not set
+CONFIG_INPUT_TOUCHSCREEN=y
+CONFIG_TOUCHSCREEN_AD7879=m
+CONFIG_TOUCHSCREEN_AD7879_I2C=m
+# CONFIG_TOUCHSCREEN_BU21013 is not set
+# CONFIG_TOUCHSCREEN_DYNAPRO is not set
+CONFIG_TOUCHSCREEN_HAMPSHIRE=m
+# CONFIG_TOUCHSCREEN_EETI is not set
+CONFIG_TOUCHSCREEN_FUJITSU=m
+CONFIG_TOUCHSCREEN_GUNZE=m
+CONFIG_TOUCHSCREEN_ELO=m
+# CONFIG_TOUCHSCREEN_WACOM_W8001 is not set
+# CONFIG_TOUCHSCREEN_MCS5000 is not set
+CONFIG_TOUCHSCREEN_MTOUCH=m
+CONFIG_TOUCHSCREEN_INEXIO=m
+CONFIG_TOUCHSCREEN_MK712=m
+CONFIG_TOUCHSCREEN_HTCPEN=m
+CONFIG_TOUCHSCREEN_PENMOUNT=m
+CONFIG_TOUCHSCREEN_QT602240=m
+CONFIG_TOUCHSCREEN_TOUCHRIGHT=m
+CONFIG_TOUCHSCREEN_TOUCHWIN=m
+CONFIG_TOUCHSCREEN_WM97XX=m
+CONFIG_TOUCHSCREEN_WM9705=y
+CONFIG_TOUCHSCREEN_WM9712=y
+CONFIG_TOUCHSCREEN_WM9713=y
+CONFIG_TOUCHSCREEN_USB_COMPOSITE=m
+CONFIG_TOUCHSCREEN_USB_EGALAX=y
+CONFIG_TOUCHSCREEN_USB_PANJIT=y
+CONFIG_TOUCHSCREEN_USB_3M=y
+CONFIG_TOUCHSCREEN_USB_ITM=y
+CONFIG_TOUCHSCREEN_USB_ETURBO=y
+CONFIG_TOUCHSCREEN_USB_GUNZE=y
+CONFIG_TOUCHSCREEN_USB_DMC_TSC10=y
+CONFIG_TOUCHSCREEN_USB_IRTOUCH=y
+CONFIG_TOUCHSCREEN_USB_IDEALTEK=y
+CONFIG_TOUCHSCREEN_USB_GENERAL_TOUCH=y
+CONFIG_TOUCHSCREEN_USB_GOTOP=y
+CONFIG_TOUCHSCREEN_USB_JASTEC=y
+# CONFIG_TOUCHSCREEN_USB_E2I is not set
+CONFIG_TOUCHSCREEN_USB_ZYTRONIC=y
+CONFIG_TOUCHSCREEN_USB_ETT_TC45USB=y
+CONFIG_TOUCHSCREEN_USB_NEXIO=y
+CONFIG_TOUCHSCREEN_TOUCHIT213=m
+# CONFIG_TOUCHSCREEN_TSC2007 is not set
+CONFIG_TOUCHSCREEN_TPS6507X=m
+CONFIG_INPUT_MISC=y
+CONFIG_INPUT_AD714X=m
+CONFIG_INPUT_AD714X_I2C=m
+# CONFIG_INPUT_PCSPKR is not set
+# CONFIG_INPUT_APANEL is not set
+CONFIG_INPUT_WISTRON_BTNS=m
+# CONFIG_INPUT_ATLAS_BTNS is not set
+# CONFIG_INPUT_ATI_REMOTE is not set
+# CONFIG_INPUT_ATI_REMOTE2 is not set
+CONFIG_INPUT_KEYSPAN_REMOTE=m
+CONFIG_INPUT_POWERMATE=m
+CONFIG_INPUT_YEALINK=m
+# CONFIG_INPUT_CM109 is not set
+CONFIG_INPUT_UINPUT=y
+# CONFIG_INPUT_WINBOND_CIR is not set
+CONFIG_INPUT_PCF8574=m
+CONFIG_INPUT_ADXL34X=m
+CONFIG_INPUT_ADXL34X_I2C=m
+
+#
+# Hardware I/O ports
+#
+CONFIG_SERIO=y
+CONFIG_SERIO_I8042=y
+CONFIG_SERIO_SERPORT=y
+# CONFIG_SERIO_CT82C710 is not set
+# CONFIG_SERIO_PCIPS2 is not set
+CONFIG_SERIO_LIBPS2=y
+CONFIG_SERIO_RAW=m
+# CONFIG_SERIO_ALTERA_PS2 is not set
+# CONFIG_SERIO_PS2MULT is not set
+# CONFIG_GAMEPORT is not set
+
+#
+# Character devices
+#
+CONFIG_VT=y
+CONFIG_CONSOLE_TRANSLATIONS=y
+CONFIG_VT_CONSOLE=y
+CONFIG_HW_CONSOLE=y
+CONFIG_VT_HW_CONSOLE_BINDING=y
+# CONFIG_DEVKMEM is not set
+# CONFIG_SERIAL_NONSTANDARD is not set
+CONFIG_N_GSM=m
+# CONFIG_NOZOMI is not set
+
+#
+# Serial drivers
+#
+CONFIG_SERIAL_8250=y
+CONFIG_SERIAL_8250_CONSOLE=y
+CONFIG_FIX_EARLYCON_MEM=y
+CONFIG_SERIAL_8250_PCI=y
+CONFIG_SERIAL_8250_PNP=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_MFD_HSU is not set
+CONFIG_SERIAL_CORE=y
+CONFIG_SERIAL_CORE_CONSOLE=y
+# CONFIG_SERIAL_JSM is not set
+# CONFIG_SERIAL_TIMBERDALE is not set
+CONFIG_SERIAL_ALTERA_JTAGUART=m
+# CONFIG_SERIAL_ALTERA_UART is not set
+CONFIG_UNIX98_PTYS=y
+# CONFIG_DEVPTS_MULTIPLE_INSTANCES is not set
+# CONFIG_LEGACY_PTYS is not set
+# CONFIG_IPMI_HANDLER is not set
+CONFIG_HW_RANDOM=m
+# CONFIG_HW_RANDOM_TIMERIOMEM is not set
+# CONFIG_HW_RANDOM_INTEL is not set
+# CONFIG_HW_RANDOM_AMD is not set
+# CONFIG_HW_RANDOM_GEODE is not set
+# CONFIG_HW_RANDOM_VIA is not set
+CONFIG_NVRAM=m
+# CONFIG_DTLK is not set
+# CONFIG_R3964 is not set
+# CONFIG_APPLICOM is not set
+# CONFIG_SONYPI is not set
+# CONFIG_MWAVE is not set
+# CONFIG_PC8736x_GPIO is not set
+# CONFIG_NSC_GPIO is not set
+# CONFIG_CS5535_GPIO is not set
+# CONFIG_RAW_DRIVER is not set
+CONFIG_HPET=y
+# CONFIG_HPET_MMAP is not set
+# CONFIG_HANGCHECK_TIMER is not set
+# CONFIG_TCG_TPM is not set
+# CONFIG_TELCLOCK is not set
+CONFIG_DEVPORT=y
+# CONFIG_RAMOOPS is not set
+CONFIG_I2C=y
+CONFIG_I2C_BOARDINFO=y
+# CONFIG_I2C_COMPAT is not set
+# CONFIG_I2C_CHARDEV is not set
+CONFIG_I2C_MUX=m
+
+#
+# Multiplexer I2C Chip support
+#
+CONFIG_I2C_MUX_PCA9541=m
+CONFIG_I2C_MUX_PCA954x=m
+# CONFIG_I2C_HELPER_AUTO is not set
+# CONFIG_I2C_SMBUS is not set
+
+#
+# I2C Algorithms
+#
+CONFIG_I2C_ALGOBIT=y
+# CONFIG_I2C_ALGOPCF is not set
+# CONFIG_I2C_ALGOPCA is not set
+
+#
+# I2C Hardware Bus support
+#
+
+#
+# PC SMBus host controller drivers
+#
+# 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_ISCH is not set
+# CONFIG_I2C_PIIX4 is not set
+# CONFIG_I2C_NFORCE2 is not set
+# CONFIG_I2C_SIS5595 is not set
+# CONFIG_I2C_SIS630 is not set
+# CONFIG_I2C_SIS96X is not set
+# CONFIG_I2C_VIA is not set
+# CONFIG_I2C_VIAPRO is not set
+
+#
+# ACPI drivers
+#
+# CONFIG_I2C_SCMI is not set
+
+#
+# I2C system bus drivers (mostly embedded / system-on-chip)
+#
+CONFIG_I2C_INTEL_MID=y
+# CONFIG_I2C_OCORES is not set
+# CONFIG_I2C_PCA_PLATFORM is not set
+# CONFIG_I2C_SIMTEC is not set
+# CONFIG_I2C_XILINX is not set
+
+#
+# External I2C/SMBus adapter drivers
+#
+# CONFIG_I2C_PARPORT_LIGHT is not set
+# CONFIG_I2C_TAOS_EVM is not set
+# CONFIG_I2C_TINY_USB is not set
+
+#
+# Other I2C/SMBus bus drivers
+#
+# CONFIG_I2C_PCA_ISA is not set
+# CONFIG_I2C_STUB is not set
+# CONFIG_SCx200_ACB 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_SPI is not set
+
+#
+# PPS support
+#
+# CONFIG_PPS is not set
+CONFIG_ARCH_WANT_OPTIONAL_GPIOLIB=y
+# CONFIG_GPIOLIB is not set
+# CONFIG_W1 is not set
+CONFIG_POWER_SUPPLY=y
+# CONFIG_POWER_SUPPLY_DEBUG is not set
+# CONFIG_PDA_POWER is not set
+# CONFIG_TEST_POWER is not set
+# CONFIG_BATTERY_DS2782 is not set
+# CONFIG_BATTERY_BQ20Z75 is not set
+# CONFIG_BATTERY_BQ27x00 is not set
+# CONFIG_BATTERY_MAX17040 is not set
+CONFIG_HWMON=y
+# CONFIG_HWMON_VID is not set
+# CONFIG_HWMON_DEBUG_CHIP is not set
+
+#
+# Native drivers
+#
+# CONFIG_SENSORS_ABITUGURU is not set
+# CONFIG_SENSORS_ABITUGURU3 is not set
+# CONFIG_SENSORS_AD7414 is not set
+# CONFIG_SENSORS_AD7418 is not set
+# CONFIG_SENSORS_ADM1021 is not set
+# CONFIG_SENSORS_ADM1025 is not set
+# CONFIG_SENSORS_ADM1026 is not set
+# CONFIG_SENSORS_ADM1029 is not set
+# CONFIG_SENSORS_ADM1031 is not set
+# CONFIG_SENSORS_ADM9240 is not set
+# CONFIG_SENSORS_ADT7411 is not set
+# CONFIG_SENSORS_ADT7462 is not set
+# CONFIG_SENSORS_ADT7470 is not set
+# CONFIG_SENSORS_ADT7475 is not set
+# CONFIG_SENSORS_ASC7621 is not set
+# CONFIG_SENSORS_K8TEMP is not set
+# CONFIG_SENSORS_K10TEMP is not set
+# CONFIG_SENSORS_ASB100 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_FSCHMD is not set
+# CONFIG_SENSORS_G760A is not set
+# CONFIG_SENSORS_GL518SM is not set
+# CONFIG_SENSORS_GL520SM is not set
+# CONFIG_SENSORS_CORETEMP is not set
+CONFIG_SENSORS_PKGTEMP=y
+# CONFIG_SENSORS_IT87 is not set
+CONFIG_SENSORS_JC42=m
+# CONFIG_SENSORS_LM63 is not set
+# CONFIG_SENSORS_LM73 is not set
+# CONFIG_SENSORS_LM75 is not set
+# CONFIG_SENSORS_LM77 is not set
+# CONFIG_SENSORS_LM78 is not set
+# CONFIG_SENSORS_LM80 is not set
+# CONFIG_SENSORS_LM83 is not set
+# CONFIG_SENSORS_LM85 is not set
+# CONFIG_SENSORS_LM87 is not set
+# CONFIG_SENSORS_LM90 is not set
+# CONFIG_SENSORS_LM92 is not set
+# CONFIG_SENSORS_LM93 is not set
+# CONFIG_SENSORS_LTC4215 is not set
+# CONFIG_SENSORS_LTC4245 is not set
+CONFIG_SENSORS_LTC4261=m
+# CONFIG_SENSORS_LM95241 is not set
+# CONFIG_SENSORS_MAX1619 is not set
+# CONFIG_SENSORS_MAX6650 is not set
+# CONFIG_SENSORS_PC87360 is not set
+# CONFIG_SENSORS_PC87427 is not set
+# CONFIG_SENSORS_PCF8591 is not set
+# CONFIG_SENSORS_SIS5595 is not set
+CONFIG_SENSORS_SMM665=m
+# CONFIG_SENSORS_DME1737 is not set
+# CONFIG_SENSORS_EMC1403 is not set
+CONFIG_SENSORS_EMC2103=m
+# CONFIG_SENSORS_SMSC47M1 is not set
+# CONFIG_SENSORS_SMSC47M192 is not set
+# CONFIG_SENSORS_SMSC47B397 is not set
+# CONFIG_SENSORS_ADS7828 is not set
+# CONFIG_SENSORS_AMC6821 is not set
+# CONFIG_SENSORS_THMC50 is not set
+CONFIG_SENSORS_TMP102=m
+# CONFIG_SENSORS_TMP401 is not set
+CONFIG_SENSORS_TMP421=m
+# CONFIG_SENSORS_VIA_CPUTEMP 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_W83795=m
+# CONFIG_SENSORS_W83795_FANCTRL is not set
+# CONFIG_SENSORS_W83L785TS is not set
+# CONFIG_SENSORS_W83L786NG is not set
+# CONFIG_SENSORS_W83627HF is not set
+# CONFIG_SENSORS_W83627EHF is not set
+# CONFIG_SENSORS_LIS3_I2C is not set
+# CONFIG_SENSORS_APPLESMC is not set
+
+#
+# ACPI drivers
+#
+# CONFIG_SENSORS_ATK0110 is not set
+# CONFIG_SENSORS_LIS3LV02D is not set
+CONFIG_THERMAL=y
+CONFIG_THERMAL_HWMON=y
+# CONFIG_WATCHDOG is not set
+CONFIG_SSB_POSSIBLE=y
+
+#
+# Sonics Silicon Backplane
+#
+# CONFIG_SSB is not set
+CONFIG_MFD_SUPPORT=y
+CONFIG_MFD_CORE=m
+# CONFIG_MFD_88PM860X is not set
+# CONFIG_MFD_SM501 is not set
+# CONFIG_HTC_PASIC3 is not set
+CONFIG_TPS6507X=m
+# CONFIG_TWL4030_CORE is not set
+# CONFIG_MFD_STMPE is not set
+# CONFIG_MFD_TC35892 is not set
+# CONFIG_MFD_TMIO is not set
+# CONFIG_PMIC_DA903X is not set
+# CONFIG_PMIC_ADP5520 is not set
+# CONFIG_MFD_MAX8925 is not set
+# CONFIG_MFD_MAX8998 is not set
+# CONFIG_MFD_WM8400 is not set
+# CONFIG_MFD_WM831X_I2C is not set
+# CONFIG_MFD_WM8350_I2C is not set
+# CONFIG_MFD_WM8994 is not set
+# CONFIG_MFD_PCF50633 is not set
+# CONFIG_ABX500_CORE is not set
+# CONFIG_LPC_SCH is not set
+CONFIG_MFD_RDC321X=m
+CONFIG_MFD_JANZ_CMODIO=m
+CONFIG_MFD_VX855=m
+# CONFIG_REGULATOR is not set
+CONFIG_MEDIA_SUPPORT=y
+
+#
+# Multimedia core support
+#
+CONFIG_VIDEO_DEV=y
+CONFIG_VIDEO_V4L2_COMMON=y
+# CONFIG_VIDEO_ALLOW_V4L1 is not set
+CONFIG_VIDEO_V4L1_COMPAT=y
+CONFIG_DVB_CORE=m
+CONFIG_VIDEO_MEDIA=m
+
+#
+# Multimedia drivers
+#
+CONFIG_VIDEO_SAA7146=m
+CONFIG_VIDEO_SAA7146_VV=m
+# CONFIG_IR_CORE is not set
+CONFIG_MEDIA_ATTACH=y
+CONFIG_MEDIA_TUNER=m
+# CONFIG_MEDIA_TUNER_CUSTOMISE is not set
+CONFIG_MEDIA_TUNER_SIMPLE=m
+CONFIG_MEDIA_TUNER_TDA8290=m
+CONFIG_MEDIA_TUNER_TDA827X=m
+CONFIG_MEDIA_TUNER_TDA18271=m
+CONFIG_MEDIA_TUNER_TDA9887=m
+CONFIG_MEDIA_TUNER_TEA5761=m
+CONFIG_MEDIA_TUNER_TEA5767=m
+CONFIG_MEDIA_TUNER_MT20XX=m
+CONFIG_MEDIA_TUNER_XC2028=m
+CONFIG_MEDIA_TUNER_XC5000=m
+CONFIG_MEDIA_TUNER_MC44S803=m
+CONFIG_VIDEO_V4L2=y
+CONFIG_VIDEOBUF_GEN=m
+CONFIG_VIDEOBUF_DMA_SG=m
+CONFIG_VIDEOBUF_VMALLOC=m
+CONFIG_VIDEOBUF_DMA_CONTIG=m
+CONFIG_VIDEOBUF_DVB=m
+CONFIG_VIDEO_TVEEPROM=m
+CONFIG_VIDEO_TUNER=m
+CONFIG_VIDEO_CAPTURE_DRIVERS=y
+# CONFIG_VIDEO_ADV_DEBUG is not set
+# CONFIG_VIDEO_FIXED_MINOR_RANGES is not set
+CONFIG_VIDEO_HELPER_CHIPS_AUTO=y
+
+#
+# Audio decoders
+#
+CONFIG_VIDEO_TDA9840=m
+CONFIG_VIDEO_TEA6415C=m
+CONFIG_VIDEO_TEA6420=m
+
+#
+# RDS decoders
+#
+
+#
+# Video decoders
+#
+CONFIG_VIDEO_SAA711X=m
+
+#
+# Video and audio decoders
+#
+
+#
+# MPEG video encoders
+#
+
+#
+# Video encoders
+#
+
+#
+# Video improvement chips
+#
+# CONFIG_VIDEO_VIVI is not set
+# CONFIG_VIDEO_PMS is not set
+CONFIG_VIDEO_CPIA2=m
+# CONFIG_VIDEO_ZORAN is not set
+# CONFIG_VIDEO_MEYE is not set
+# CONFIG_VIDEO_SAA7134 is not set
+CONFIG_VIDEO_MXB=m
+# CONFIG_VIDEO_HEXIUM_ORION is not set
+# CONFIG_VIDEO_HEXIUM_GEMINI is not set
+# CONFIG_VIDEO_AU0828 is not set
+CONFIG_VIDEO_SAA7164=m
+# CONFIG_VIDEO_CAFE_CCIC is not set
+CONFIG_VIDEO_SR030PC30=m
+# CONFIG_SOC_CAMERA is not set
+CONFIG_V4L_USB_DRIVERS=y
+CONFIG_USB_VIDEO_CLASS=m
+CONFIG_USB_VIDEO_CLASS_INPUT_EVDEV=y
+CONFIG_USB_GSPCA=m
+# CONFIG_USB_M5602 is not set
+# CONFIG_USB_STV06XX is not set
+CONFIG_USB_GL860=m
+# CONFIG_USB_GSPCA_BENQ is not set
+# CONFIG_USB_GSPCA_CONEX is not set
+# CONFIG_USB_GSPCA_CPIA1 is not set
+# CONFIG_USB_GSPCA_ETOMS is not set
+# CONFIG_USB_GSPCA_FINEPIX is not set
+CONFIG_USB_GSPCA_JEILINJ=m
+CONFIG_USB_GSPCA_KONICA=m
+# CONFIG_USB_GSPCA_MARS is not set
+CONFIG_USB_GSPCA_MR97310A=m
+# CONFIG_USB_GSPCA_OV519 is not set
+# CONFIG_USB_GSPCA_OV534 is not set
+# CONFIG_USB_GSPCA_OV534_9 is not set
+# CONFIG_USB_GSPCA_PAC207 is not set
+# CONFIG_USB_GSPCA_PAC7302 is not set
+# CONFIG_USB_GSPCA_PAC7311 is not set
+# CONFIG_USB_GSPCA_SN9C2028 is not set
+CONFIG_USB_GSPCA_SN9C20X=m
+# CONFIG_USB_GSPCA_SONIXB is not set
+# CONFIG_USB_GSPCA_SONIXJ is not set
+# CONFIG_USB_GSPCA_SPCA500 is not set
+# CONFIG_USB_GSPCA_SPCA501 is not set
+# CONFIG_USB_GSPCA_SPCA505 is not set
+# CONFIG_USB_GSPCA_SPCA506 is not set
+# CONFIG_USB_GSPCA_SPCA508 is not set
+# CONFIG_USB_GSPCA_SPCA561 is not set
+CONFIG_USB_GSPCA_SPCA1528=m
+CONFIG_USB_GSPCA_SQ905=m
+CONFIG_USB_GSPCA_SQ905C=m
+CONFIG_USB_GSPCA_SQ930X=m
+# CONFIG_USB_GSPCA_STK014 is not set
+# CONFIG_USB_GSPCA_STV0680 is not set
+# CONFIG_USB_GSPCA_SUNPLUS is not set
+# CONFIG_USB_GSPCA_T613 is not set
+# CONFIG_USB_GSPCA_TV8532 is not set
+# CONFIG_USB_GSPCA_VC032X is not set
+CONFIG_USB_GSPCA_XIRLINK_CIT=m
+# CONFIG_USB_GSPCA_ZC3XX is not set
+# CONFIG_VIDEO_PVRUSB2 is not set
+# CONFIG_VIDEO_HDPVR is not set
+# CONFIG_VIDEO_USBVISION is not set
+CONFIG_USB_ET61X251=m
+CONFIG_USB_SN9C102=m
+CONFIG_USB_PWC=m
+# CONFIG_USB_PWC_DEBUG is not set
+# CONFIG_USB_PWC_INPUT_EVDEV is not set
+CONFIG_USB_ZR364XX=m
+CONFIG_USB_STKWEBCAM=m
+CONFIG_USB_S2255=m
+CONFIG_V4L_MEM2MEM_DRIVERS=y
+# CONFIG_VIDEO_MEM2MEM_TESTDEV is not set
+# CONFIG_RADIO_ADAPTERS is not set
+CONFIG_DVB_MAX_ADAPTERS=1
+# CONFIG_DVB_DYNAMIC_MINORS is not set
+# CONFIG_DVB_CAPTURE_DRIVERS is not set
+CONFIG_DVB_TDA10048=m
+CONFIG_DVB_S5H1411=m
+# CONFIG_DAB is not set
+
+#
+# Graphics support
+#
+CONFIG_AGP=y
+# CONFIG_AGP_ALI is not set
+# CONFIG_AGP_ATI is not set
+# CONFIG_AGP_AMD is not set
+# CONFIG_AGP_AMD64 is not set
+CONFIG_AGP_INTEL=y
+# CONFIG_AGP_NVIDIA is not set
+# CONFIG_AGP_SIS is not set
+# CONFIG_AGP_SWORKS is not set
+# CONFIG_AGP_VIA is not set
+# CONFIG_AGP_EFFICEON is not set
+CONFIG_VGA_ARB=y
+CONFIG_VGA_ARB_MAX_GPUS=10
+# CONFIG_VGA_SWITCHEROO is not set
+CONFIG_DRM=y
+CONFIG_DRM_KMS_HELPER=y
+# CONFIG_DRM_TDFX is not set
+# CONFIG_DRM_R128 is not set
+# CONFIG_DRM_RADEON is not set
+CONFIG_DRM_I810=y
+# CONFIG_DRM_I830 is not set
+CONFIG_DRM_I915=y
+CONFIG_DRM_I915_KMS=y
+CONFIG_DRM_MGA=m
+# CONFIG_DRM_SIS is not set
+# CONFIG_DRM_VIA is not set
+# CONFIG_DRM_SAVAGE is not set
+# CONFIG_STUB_POULSBO is not set
+CONFIG_VGASTATE=m
+CONFIG_VIDEO_OUTPUT_CONTROL=y
+CONFIG_FB=y
+# CONFIG_FIRMWARE_EDID is not set
+# CONFIG_FB_DDC is not set
+# CONFIG_FB_BOOT_VESA_SUPPORT is not set
+CONFIG_FB_CFB_FILLRECT=y
+CONFIG_FB_CFB_COPYAREA=y
+CONFIG_FB_CFB_IMAGEBLIT=y
+# CONFIG_FB_CFB_REV_PIXELS_IN_BYTE is not set
+CONFIG_FB_SYS_FILLRECT=m
+CONFIG_FB_SYS_COPYAREA=m
+CONFIG_FB_SYS_IMAGEBLIT=m
+# CONFIG_FB_FOREIGN_ENDIAN is not set
+CONFIG_FB_SYS_FOPS=m
+CONFIG_FB_DEFERRED_IO=y
+# CONFIG_FB_SVGALIB is not set
+# CONFIG_FB_MACMODES is not set
+# CONFIG_FB_BACKLIGHT is not set
+CONFIG_FB_MODE_HELPERS=y
+# CONFIG_FB_TILEBLITTING is not set
+
+#
+# Frame buffer hardware drivers
+#
+# CONFIG_FB_CIRRUS is not set
+# CONFIG_FB_PM2 is not set
+# CONFIG_FB_CYBER2000 is not set
+# CONFIG_FB_ARC is not set
+# CONFIG_FB_ASILIANT is not set
+# CONFIG_FB_IMSTT is not set
+# CONFIG_FB_VGA16 is not set
+# CONFIG_FB_UVESA is not set
+# CONFIG_FB_VESA is not set
+# CONFIG_FB_N411 is not set
+# CONFIG_FB_HGA is not set
+# CONFIG_FB_S1D13XXX is not set
+# CONFIG_FB_NVIDIA is not set
+# CONFIG_FB_RIVA is not set
+CONFIG_FB_I810=m
+# CONFIG_FB_I810_GTF is not set
+# CONFIG_FB_LE80578 is not set
+# CONFIG_FB_MATROX is not set
+# CONFIG_FB_RADEON is not set
+# CONFIG_FB_ATY128 is not set
+# CONFIG_FB_ATY is not set
+# CONFIG_FB_S3 is not set
+# CONFIG_FB_SAVAGE is not set
+# CONFIG_FB_SIS is not set
+# CONFIG_FB_VIA is not set
+# CONFIG_FB_NEOMAGIC is not set
+# CONFIG_FB_KYRO is not set
+# CONFIG_FB_3DFX is not set
+# CONFIG_FB_VOODOO1 is not set
+# CONFIG_FB_VT8623 is not set
+# CONFIG_FB_TRIDENT is not set
+# CONFIG_FB_ARK is not set
+# CONFIG_FB_PM3 is not set
+# CONFIG_FB_CARMINE is not set
+# CONFIG_FB_GEODE is not set
+# CONFIG_FB_TMIO is not set
+# CONFIG_FB_VIRTUAL is not set
+# CONFIG_FB_METRONOME is not set
+# CONFIG_FB_MB862XX is not set
+# CONFIG_FB_BROADSHEET is not set
+CONFIG_BACKLIGHT_LCD_SUPPORT=y
+# CONFIG_LCD_CLASS_DEVICE is not set
+CONFIG_BACKLIGHT_CLASS_DEVICE=y
+CONFIG_BACKLIGHT_GENERIC=y
+# CONFIG_BACKLIGHT_PROGEAR is not set
+# CONFIG_BACKLIGHT_MBP_NVIDIA is not set
+# CONFIG_BACKLIGHT_SAHARA is not set
+CONFIG_BACKLIGHT_ADP8860=m
+
+#
+# Display device support
+#
+# CONFIG_DISPLAY_SUPPORT is not set
+
+#
+# Console display driver support
+#
+CONFIG_VGA_CONSOLE=y
+CONFIG_VGACON_SOFT_SCROLLBACK=y
+CONFIG_VGACON_SOFT_SCROLLBACK_SIZE=64
+# CONFIG_MDA_CONSOLE is not set
+CONFIG_DUMMY_CONSOLE=y
+CONFIG_FRAMEBUFFER_CONSOLE=y
+CONFIG_FRAMEBUFFER_CONSOLE_DETECT_PRIMARY=y
+# CONFIG_FRAMEBUFFER_CONSOLE_ROTATION is not set
+CONFIG_FONTS=y
+CONFIG_FONT_8x8=y
+CONFIG_FONT_8x16=y
+CONFIG_FONT_6x11=y
+CONFIG_FONT_7x14=y
+# CONFIG_FONT_PEARL_8x8 is not set
+# CONFIG_FONT_ACORN_8x8 is not set
+# CONFIG_FONT_MINI_4x6 is not set
+# CONFIG_FONT_SUN8x16 is not set
+# CONFIG_FONT_SUN12x22 is not set
+CONFIG_FONT_10x18=y
+# CONFIG_LOGO is not set
+CONFIG_SOUND=y
+# CONFIG_SOUND_OSS_CORE is not set
+CONFIG_SND=y
+CONFIG_SND_TIMER=y
+CONFIG_SND_PCM=y
+CONFIG_SND_HWDEP=y
+CONFIG_SND_RAWMIDI=m
+CONFIG_SND_SEQUENCER=y
+CONFIG_SND_SEQ_DUMMY=y
+# CONFIG_SND_MIXER_OSS is not set
+# CONFIG_SND_PCM_OSS is not set
+# CONFIG_SND_SEQUENCER_OSS is not set
+# CONFIG_SND_HRTIMER is not set
+CONFIG_SND_DYNAMIC_MINORS=y
+# CONFIG_SND_SUPPORT_OLD_API is not set
+CONFIG_SND_VERBOSE_PROCFS=y
+CONFIG_SND_VERBOSE_PRINTK=y
+CONFIG_SND_DEBUG=y
+# CONFIG_SND_DEBUG_VERBOSE is not set
+CONFIG_SND_PCM_XRUN_DEBUG=y
+CONFIG_SND_VMASTER=y
+CONFIG_SND_DMA_SGBUF=y
+CONFIG_SND_RAWMIDI_SEQ=m
+# CONFIG_SND_OPL3_LIB_SEQ is not set
+# CONFIG_SND_OPL4_LIB_SEQ is not set
+# CONFIG_SND_SBAWE_SEQ is not set
+# CONFIG_SND_EMU10K1_SEQ is not set
+CONFIG_SND_AC97_CODEC=y
+CONFIG_SND_DRIVERS=y
+# CONFIG_SND_PCSP is not set
+# CONFIG_SND_DUMMY is not set
+CONFIG_SND_ALOOP=m
+# CONFIG_SND_VIRMIDI is not set
+# CONFIG_SND_MTPAV is not set
+# CONFIG_SND_SERIAL_U16550 is not set
+# CONFIG_SND_MPU401 is not set
+CONFIG_SND_AC97_POWER_SAVE=y
+CONFIG_SND_AC97_POWER_SAVE_DEFAULT=5
+# CONFIG_SND_ISA is not set
+CONFIG_SND_PCI=y
+# 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_ASIHPI 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_AW2 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_OXYGEN 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_CTXFI 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_INDIGOIOX is not set
+# CONFIG_SND_INDIGODJX is not set
+# CONFIG_SND_EMU10K1 is not set
+# CONFIG_SND_EMU10K1X is not set
+# CONFIG_SND_ENS1370 is not set
+CONFIG_SND_ENS1371=m
+# CONFIG_SND_ES1938 is not set
+# CONFIG_SND_ES1968 is not set
+# CONFIG_SND_FM801 is not set
+CONFIG_SND_HDA_INTEL=y
+CONFIG_SND_HDA_HWDEP=y
+CONFIG_SND_HDA_RECONFIG=y
+# CONFIG_SND_HDA_INPUT_BEEP is not set
+# CONFIG_SND_HDA_INPUT_JACK is not set
+CONFIG_SND_HDA_PATCH_LOADER=y
+CONFIG_SND_HDA_CODEC_REALTEK=y
+CONFIG_SND_HDA_CODEC_ANALOG=y
+CONFIG_SND_HDA_CODEC_SIGMATEL=y
+CONFIG_SND_HDA_CODEC_VIA=y
+# CONFIG_SND_HDA_CODEC_HDMI is not set
+CONFIG_SND_HDA_CODEC_CIRRUS=y
+CONFIG_SND_HDA_CODEC_CONEXANT=y
+CONFIG_SND_HDA_CODEC_CA0110=y
+CONFIG_SND_HDA_CODEC_CMEDIA=y
+CONFIG_SND_HDA_CODEC_SI3054=y
+CONFIG_SND_HDA_GENERIC=y
+CONFIG_SND_HDA_POWER_SAVE=y
+CONFIG_SND_HDA_POWER_SAVE_DEFAULT=1
+# CONFIG_SND_HDSP is not set
+# CONFIG_SND_HDSPM is not set
+# CONFIG_SND_HIFIER is not set
+# CONFIG_SND_ICE1712 is not set
+# CONFIG_SND_ICE1724 is not set
+CONFIG_SND_INTEL8X0=y
+# CONFIG_SND_INTEL8X0M is not set
+# CONFIG_SND_KORG1212 is not set
+# CONFIG_SND_LX6464ES 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_SIS7019 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_VIRTUOSO is not set
+# CONFIG_SND_VX222 is not set
+# CONFIG_SND_YMFPCI is not set
+CONFIG_SND_USB=y
+CONFIG_SND_USB_AUDIO=m
+# CONFIG_SND_USB_UA101 is not set
+CONFIG_SND_USB_USX2Y=m
+CONFIG_SND_USB_CAIAQ=m
+CONFIG_SND_USB_CAIAQ_INPUT=y
+# CONFIG_SND_USB_US122L is not set
+# CONFIG_SND_SOC is not set
+# CONFIG_SOUND_PRIME is not set
+CONFIG_AC97_BUS=y
+CONFIG_HID_SUPPORT=y
+CONFIG_HID=y
+CONFIG_HIDRAW=y
+
+#
+# USB Input Devices
+#
+CONFIG_USB_HID=y
+CONFIG_HID_PID=y
+CONFIG_USB_HIDDEV=y
+
+#
+# Special HID drivers
+#
+# CONFIG_HID_3M_PCT is not set
+CONFIG_HID_A4TECH=y
+CONFIG_HID_ACRUX_FF=m
+CONFIG_HID_APPLE=y
+CONFIG_HID_BELKIN=y
+CONFIG_HID_CANDO=y
+CONFIG_HID_CHERRY=y
+CONFIG_HID_CHICONY=y
+CONFIG_HID_PRODIKEYS=m
+CONFIG_HID_CYPRESS=y
+CONFIG_HID_DRAGONRISE=m
+# CONFIG_DRAGONRISE_FF is not set
+CONFIG_HID_EGALAX=m
+CONFIG_HID_ELECOM=m
+CONFIG_HID_EZKEY=y
+CONFIG_HID_KYE=y
+CONFIG_HID_UCLOGIC=m
+CONFIG_HID_WALTOP=m
+CONFIG_HID_GYRATION=y
+CONFIG_HID_TWINHAN=m
+CONFIG_HID_KENSINGTON=y
+CONFIG_HID_LOGITECH=y
+# CONFIG_LOGITECH_FF is not set
+# CONFIG_LOGIRUMBLEPAD2_FF is not set
+# CONFIG_LOGIG940_FF is not set
+# CONFIG_LOGIWII_FF is not set
+# CONFIG_HID_MAGICMOUSE is not set
+CONFIG_HID_MICROSOFT=y
+CONFIG_HID_MOSART=y
+CONFIG_HID_MONTEREY=y
+# CONFIG_HID_NTRIG is not set
+CONFIG_HID_ORTEK=m
+CONFIG_HID_PANTHERLORD=y
+# CONFIG_PANTHERLORD_FF is not set
+CONFIG_HID_PETALYNX=y
+CONFIG_HID_PICOLCD=m
+CONFIG_HID_PICOLCD_FB=y
+CONFIG_HID_PICOLCD_BACKLIGHT=y
+CONFIG_HID_PICOLCD_LEDS=y
+# CONFIG_HID_QUANTA is not set
+CONFIG_HID_ROCCAT=m
+CONFIG_HID_ROCCAT_KONE=m
+CONFIG_HID_ROCCAT_PYRA=m
+CONFIG_HID_SAMSUNG=y
+CONFIG_HID_SONY=y
+CONFIG_HID_STANTUM=y
+CONFIG_HID_SUNPLUS=y
+CONFIG_HID_GREENASIA=m
+# CONFIG_GREENASIA_FF is not set
+CONFIG_HID_SMARTJOYPLUS=m
+# CONFIG_SMARTJOYPLUS_FF is not set
+CONFIG_HID_TOPSEED=m
+CONFIG_HID_THRUSTMASTER=m
+# CONFIG_THRUSTMASTER_FF is not set
+# CONFIG_HID_WACOM is not set
+CONFIG_HID_ZEROPLUS=m
+# CONFIG_ZEROPLUS_FF is not set
+CONFIG_HID_ZYDACRON=m
+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
+CONFIG_USB_ANNOUNCE_NEW_DEVICES=y
+
+#
+# Miscellaneous USB options
+#
+CONFIG_USB_DEVICEFS=y
+# CONFIG_USB_DEVICE_CLASS is not set
+# CONFIG_USB_DYNAMIC_MINORS is not set
+CONFIG_USB_SUSPEND=y
+# CONFIG_USB_OTG is not set
+CONFIG_USB_MON=y
+CONFIG_USB_WUSB=m
+# CONFIG_USB_WUSB_CBAF is not set
+
+#
+# USB Host Controller Drivers
+#
+# CONFIG_USB_C67X00_HCD is not set
+# CONFIG_USB_XHCI_HCD is not set
+CONFIG_USB_EHCI_HCD=y
+CONFIG_USB_EHCI_ROOT_HUB_TT=y
+CONFIG_USB_EHCI_TT_NEWSCHED=y
+# CONFIG_USB_OXU210HP_HCD is not set
+CONFIG_USB_ISP116X_HCD=m
+# CONFIG_USB_ISP1760_HCD is not set
+# CONFIG_USB_ISP1362_HCD is not set
+CONFIG_USB_OHCI_HCD=y
+# 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=y
+CONFIG_USB_U132_HCD=m
+CONFIG_USB_SL811_HCD=m
+# CONFIG_USB_R8A66597_HCD is not set
+CONFIG_USB_WHCI_HCD=m
+CONFIG_USB_HWA_HCD=m
+
+#
+# USB Device Class drivers
+#
+CONFIG_USB_ACM=m
+CONFIG_USB_PRINTER=m
+CONFIG_USB_WDM=m
+# CONFIG_USB_TMC is not set
+
+#
+# NOTE: USB_STORAGE depends on SCSI but BLK_DEV_SD may
+#
+
+#
+# also be needed; see USB_STORAGE Help for more info
+#
+CONFIG_USB_STORAGE=y
+# CONFIG_USB_STORAGE_DEBUG is not set
+CONFIG_USB_STORAGE_DATAFAB=y
+CONFIG_USB_STORAGE_FREECOM=y
+CONFIG_USB_STORAGE_ISD200=y
+CONFIG_USB_STORAGE_USBAT=y
+CONFIG_USB_STORAGE_SDDR09=y
+CONFIG_USB_STORAGE_SDDR55=y
+CONFIG_USB_STORAGE_JUMPSHOT=y
+CONFIG_USB_STORAGE_ALAUDA=y
+# CONFIG_USB_STORAGE_ONETOUCH is not set
+CONFIG_USB_STORAGE_KARMA=y
+# CONFIG_USB_STORAGE_CYPRESS_ATACB is not set
+CONFIG_USB_UAS=m
+CONFIG_USB_LIBUSUAL=y
+
+#
+# USB Imaging devices
+#
+CONFIG_USB_MDC800=m
+CONFIG_USB_MICROTEK=m
+
+#
+# USB port drivers
+#
+CONFIG_USB_SERIAL=m
+CONFIG_USB_EZUSB=y
+CONFIG_USB_SERIAL_GENERIC=y
+CONFIG_USB_SERIAL_AIRCABLE=m
+CONFIG_USB_SERIAL_ARK3116=m
+CONFIG_USB_SERIAL_BELKIN=m
+CONFIG_USB_SERIAL_CH341=m
+CONFIG_USB_SERIAL_WHITEHEAT=m
+CONFIG_USB_SERIAL_DIGI_ACCELEPORT=m
+CONFIG_USB_SERIAL_CP210X=m
+CONFIG_USB_SERIAL_CYPRESS_M8=m
+CONFIG_USB_SERIAL_EMPEG=m
+CONFIG_USB_SERIAL_FTDI_SIO=m
+CONFIG_USB_SERIAL_FUNSOFT=m
+CONFIG_USB_SERIAL_VISOR=m
+CONFIG_USB_SERIAL_IPAQ=m
+CONFIG_USB_SERIAL_IR=m
+CONFIG_USB_SERIAL_EDGEPORT=m
+CONFIG_USB_SERIAL_EDGEPORT_TI=m
+CONFIG_USB_SERIAL_GARMIN=m
+CONFIG_USB_SERIAL_IPW=m
+CONFIG_USB_SERIAL_IUU=m
+CONFIG_USB_SERIAL_KEYSPAN_PDA=m
+CONFIG_USB_SERIAL_KEYSPAN=m
+CONFIG_USB_SERIAL_KEYSPAN_MPR=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_USA19=y
+CONFIG_USB_SERIAL_KEYSPAN_USA18X=y
+CONFIG_USB_SERIAL_KEYSPAN_USA19W=y
+CONFIG_USB_SERIAL_KEYSPAN_USA19QW=y
+CONFIG_USB_SERIAL_KEYSPAN_USA19QI=y
+CONFIG_USB_SERIAL_KEYSPAN_USA49W=y
+CONFIG_USB_SERIAL_KEYSPAN_USA49WLC=y
+CONFIG_USB_SERIAL_KLSI=m
+CONFIG_USB_SERIAL_KOBIL_SCT=m
+CONFIG_USB_SERIAL_MCT_U232=m
+CONFIG_USB_SERIAL_MOS7720=m
+CONFIG_USB_SERIAL_MOS7840=m
+# CONFIG_USB_SERIAL_MOTOROLA is not set
+CONFIG_USB_SERIAL_NAVMAN=m
+CONFIG_USB_SERIAL_PL2303=m
+CONFIG_USB_SERIAL_OTI6858=m
+# CONFIG_USB_SERIAL_QCAUX is not set
+CONFIG_USB_SERIAL_QUALCOMM=m
+# CONFIG_USB_SERIAL_SPCP8X5 is not set
+CONFIG_USB_SERIAL_HP4X=m
+CONFIG_USB_SERIAL_SAFE=m
+CONFIG_USB_SERIAL_SAFE_PADDED=y
+CONFIG_USB_SERIAL_SAMBA=m
+# CONFIG_USB_SERIAL_SIEMENS_MPI is not set
+CONFIG_USB_SERIAL_SIERRAWIRELESS=m
+CONFIG_USB_SERIAL_SYMBOL=m
+CONFIG_USB_SERIAL_TI=m
+CONFIG_USB_SERIAL_CYBERJACK=m
+CONFIG_USB_SERIAL_XIRCOM=m
+CONFIG_USB_SERIAL_WWAN=m
+CONFIG_USB_SERIAL_OPTION=m
+CONFIG_USB_SERIAL_OMNINET=m
+# CONFIG_USB_SERIAL_OPTICON is not set
+# CONFIG_USB_SERIAL_VIVOPAY_SERIAL is not set
+CONFIG_USB_SERIAL_ZIO=m
+CONFIG_USB_SERIAL_SSU100=m
+CONFIG_USB_SERIAL_DEBUG=m
+
+#
+# USB Miscellaneous drivers
+#
+CONFIG_USB_EMI62=m
+CONFIG_USB_EMI26=m
+CONFIG_USB_ADUTUX=m
+# CONFIG_USB_SEVSEG is not set
+# CONFIG_USB_RIO500 is not set
+CONFIG_USB_LEGOTOWER=m
+CONFIG_USB_LCD=m
+CONFIG_USB_LED=m
+# CONFIG_USB_CYPRESS_CY7C63 is not set
+# CONFIG_USB_CYTHERM is not set
+CONFIG_USB_IDMOUSE=m
+CONFIG_USB_FTDI_ELAN=m
+CONFIG_USB_APPLEDISPLAY=m
+CONFIG_USB_SISUSBVGA=m
+CONFIG_USB_SISUSBVGA_CON=y
+CONFIG_USB_LD=m
+CONFIG_USB_TRANCEVIBRATOR=m
+CONFIG_USB_IOWARRIOR=m
+# CONFIG_USB_TEST is not set
+# CONFIG_USB_ISIGHTFW is not set
+CONFIG_USB_YUREX=m
+# CONFIG_USB_GADGET is not set
+
+#
+# OTG and related infrastructure
+#
+# CONFIG_NOP_USB_XCEIV is not set
+CONFIG_UWB=m
+CONFIG_UWB_HWA=m
+CONFIG_UWB_WHCI=m
+# CONFIG_UWB_I1480U is not set
+CONFIG_MMC=y
+# CONFIG_MMC_DEBUG is not set
+# CONFIG_MMC_UNSAFE_RESUME is not set
+
+#
+# MMC/SD/SDIO Card Drivers
+#
+CONFIG_MMC_BLOCK=y
+CONFIG_MMC_BLOCK_MINORS=16
+CONFIG_MMC_BLOCK_BOUNCE=y
+CONFIG_SDIO_UART=m
+# CONFIG_MMC_TEST is not set
+
+#
+# MMC/SD/SDIO Host Controller Drivers
+#
+CONFIG_MMC_SDHCI=y
+CONFIG_MMC_SDHCI_PCI=y
+# CONFIG_MMC_RICOH_MMC is not set
+# CONFIG_MMC_SDHCI_PLTFM is not set
+CONFIG_MMC_WBSD=m
+CONFIG_MMC_TIFM_SD=m
+# CONFIG_MMC_CB710 is not set
+# CONFIG_MMC_VIA_SDMMC is not set
+CONFIG_MMC_USHC=y
+# CONFIG_MEMSTICK is not set
+CONFIG_NEW_LEDS=y
+CONFIG_LEDS_CLASS=y
+
+#
+# LED drivers
+#
+# CONFIG_LEDS_ALIX2 is not set
+# CONFIG_LEDS_PCA9532 is not set
+# CONFIG_LEDS_LP3944 is not set
+# CONFIG_LEDS_LP5521 is not set
+# CONFIG_LEDS_LP5523 is not set
+# CONFIG_LEDS_CLEVO_MAIL is not set
+# CONFIG_LEDS_PCA955X is not set
+# CONFIG_LEDS_BD2802 is not set
+# CONFIG_LEDS_INTEL_SS4200 is not set
+# CONFIG_LEDS_DELL_NETBOOKS is not set
+CONFIG_LEDS_TRIGGERS=y
+
+#
+# LED Triggers
+#
+# CONFIG_LEDS_TRIGGER_TIMER is not set
+# CONFIG_LEDS_TRIGGER_HEARTBEAT is not set
+# CONFIG_LEDS_TRIGGER_BACKLIGHT is not set
+# CONFIG_LEDS_TRIGGER_DEFAULT_ON is not set
+
+#
+# iptables trigger is under Netfilter config (LED target)
+#
+# CONFIG_ACCESSIBILITY is not set
+# CONFIG_INFINIBAND is not set
+# CONFIG_EDAC is not set
+CONFIG_RTC_LIB=y
+CONFIG_RTC_CLASS=y
+# CONFIG_RTC_HCTOSYS is not set
+# 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 is not set
+# CONFIG_RTC_DRV_DS1374 is not set
+# CONFIG_RTC_DRV_DS1672 is not set
+# CONFIG_RTC_DRV_DS3232 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_ISL12022 is not set
+# CONFIG_RTC_DRV_X1205 is not set
+# CONFIG_RTC_DRV_PCF8563 is not set
+# CONFIG_RTC_DRV_PCF8583 is not set
+# CONFIG_RTC_DRV_M41T80 is not set
+# CONFIG_RTC_DRV_BQ32K is not set
+# CONFIG_RTC_DRV_S35390A is not set
+# CONFIG_RTC_DRV_FM3130 is not set
+# CONFIG_RTC_DRV_RX8581 is not set
+# CONFIG_RTC_DRV_RX8025 is not set
+
+#
+# SPI RTC drivers
+#
+
+#
+# Platform RTC drivers
+#
+CONFIG_RTC_DRV_CMOS=y
+# CONFIG_RTC_DRV_DS1286 is not set
+# CONFIG_RTC_DRV_DS1511 is not set
+# CONFIG_RTC_DRV_DS1553 is not set
+# CONFIG_RTC_DRV_DS1742 is not set
+# CONFIG_RTC_DRV_STK17TA8 is not set
+# CONFIG_RTC_DRV_M48T86 is not set
+# CONFIG_RTC_DRV_M48T35 is not set
+# CONFIG_RTC_DRV_M48T59 is not set
+# CONFIG_RTC_DRV_MSM6242 is not set
+# CONFIG_RTC_DRV_BQ4802 is not set
+# CONFIG_RTC_DRV_RP5C01 is not set
+# CONFIG_RTC_DRV_V3020 is not set
+
+#
+# on-CPU RTC drivers
+#
+# CONFIG_DMADEVICES is not set
+# CONFIG_AUXDISPLAY is not set
+# CONFIG_UIO is not set
+CONFIG_STAGING=y
+# CONFIG_STAGING_EXCLUDE_BUILD is not set
+# CONFIG_ET131X is not set
+# CONFIG_SLICOSS is not set
+CONFIG_USB_IP_COMMON=m
+CONFIG_USB_IP_VHCI_HCD=m
+CONFIG_USB_IP_HOST=m
+# CONFIG_USB_IP_DEBUG_ENABLE is not set
+# CONFIG_W35UND is not set
+CONFIG_PRISM2_USB=m
+# CONFIG_ECHO is not set
+CONFIG_BRCM80211=m
+CONFIG_BRCM80211_PCI=y
+# CONFIG_BRCMFMAC is not set
+CONFIG_RT2860=m
+CONFIG_RT2870=m
+# CONFIG_COMEDI is not set
+# CONFIG_ASUS_OLED is not set
+CONFIG_R8187SE=m
+# CONFIG_RTL8192U is not set
+CONFIG_RTL8192E=m
+CONFIG_R8712U=m
+# CONFIG_R8712_AP is not set
+# CONFIG_TRANZPORT is not set
+# CONFIG_POHMELFS is not set
+# CONFIG_AUTOFS_FS is not set
+# CONFIG_IDE_PHISON is not set
+CONFIG_LINE6_USB=m
+# CONFIG_LINE6_USB_DEBUG is not set
+# CONFIG_LINE6_USB_DUMP_CTRL is not set
+# CONFIG_LINE6_USB_DUMP_MIDI is not set
+# CONFIG_LINE6_USB_DUMP_PCM is not set
+# CONFIG_LINE6_USB_RAW is not set
+# CONFIG_LINE6_USB_IMPULSE_RESPONSE is not set
+# CONFIG_DRM_VMWGFX is not set
+# CONFIG_DRM_NOUVEAU is not set
+
+#
+# I2C encoder or helper chips
+#
+# CONFIG_DRM_I2C_CH7006 is not set
+# CONFIG_DRM_I2C_SIL164 is not set
+# CONFIG_USB_SERIAL_QUATECH2 is not set
+# CONFIG_USB_SERIAL_QUATECH_USB2 is not set
+# CONFIG_VT6655 is not set
+# CONFIG_VT6656 is not set
+# CONFIG_FB_UDL is not set
+# CONFIG_HYPERV is not set
+# CONFIG_VME_BUS is not set
+# CONFIG_IIO is not set
+# CONFIG_ZRAM is not set
+# CONFIG_BATMAN_ADV is not set
+CONFIG_SAMSUNG_LAPTOP=m
+# CONFIG_FB_SM7XX is not set
+CONFIG_VIDEO_DT3155=m
+# CONFIG_DT3155_CCIR is not set
+# CONFIG_CRYSTALHD is not set
+
+#
+# Texas Instruments shared transport line discipline
+#
+# CONFIG_ST_BT is not set
+# CONFIG_FB_XGI is not set
+# CONFIG_SMB_FS is not set
+# CONFIG_EASYCAP is not set
+CONFIG_SOLO6X10=m
+CONFIG_ACPI_QUICKSTART=y
+CONFIG_MACH_NO_WESTBRIDGE=y
+CONFIG_ATH6K_LEGACY=m
+CONFIG_AR600x_SD31_XXX=y
+# CONFIG_AR600x_WB31_XXX is not set
+# CONFIG_AR600x_SD32_XXX is not set
+# CONFIG_AR600x_CUSTOM_XXX is not set
+CONFIG_ATH6KL_ENABLE_COEXISTENCE=y
+CONFIG_AR600x_DUAL_ANTENNA=y
+# CONFIG_AR600x_SINGLE_ANTENNA is not set
+# CONFIG_AR600x_BT_QCOM is not set
+# CONFIG_AR600x_BT_CSR is not set
+CONFIG_AR600x_BT_AR3001=y
+CONFIG_ATH6KL_HCI_BRIDGE=y
+# CONFIG_ATH6KL_CONFIG_GPIO_BT_RESET is not set
+CONFIG_ATH6KL_CFG80211=y
+CONFIG_ATH6KL_HTC_RAW_INTERFACE=y
+CONFIG_ATH6KL_VIRTUAL_SCATTER_GATHER=y
+CONFIG_ATH6KL_SKIP_ABI_VERSION_CHECK=y
+# CONFIG_ATH6KL_DEBUG is not set
+CONFIG_USB_ENESTORAGE=m
+# CONFIG_BCM_WIMAX is not set
+# CONFIG_FT1000 is not set
+
+#
+# Speakup console speech
+#
+# CONFIG_SPEAKUP is not set
+CONFIG_X86_PLATFORM_DEVICES=y
+CONFIG_ACER_WMI=y
+# CONFIG_ACERHDF is not set
+CONFIG_ASUS_LAPTOP=m
+CONFIG_DELL_WMI=m
+CONFIG_FUJITSU_LAPTOP=m
+# CONFIG_FUJITSU_LAPTOP_DEBUG is not set
+CONFIG_TC1100_WMI=m
+CONFIG_HP_WMI=m
+CONFIG_MSI_LAPTOP=m
+CONFIG_PANASONIC_LAPTOP=m
+CONFIG_COMPAL_LAPTOP=m
+CONFIG_SONY_LAPTOP=m
+# CONFIG_SONYPI_COMPAT is not set
+CONFIG_IDEAPAD_LAPTOP=m
+CONFIG_THINKPAD_ACPI=m
+# CONFIG_THINKPAD_ACPI_ALSA_SUPPORT is not set
+# CONFIG_THINKPAD_ACPI_DEBUGFACILITIES is not set
+# CONFIG_THINKPAD_ACPI_DEBUG is not set
+# CONFIG_THINKPAD_ACPI_UNSAFE_LEDS is not set
+CONFIG_THINKPAD_ACPI_VIDEO=y
+CONFIG_THINKPAD_ACPI_HOTKEY_POLL=y
+# CONFIG_SENSORS_HDAPS is not set
+CONFIG_INTEL_MENLOW=y
+CONFIG_EEEPC_LAPTOP=m
+CONFIG_EEEPC_WMI=m
+CONFIG_ACPI_WMI=y
+# CONFIG_MSI_WMI is not set
+CONFIG_ACPI_ASUS=m
+# CONFIG_TOPSTAR_LAPTOP is not set
+CONFIG_ACPI_TOSHIBA=m
+# CONFIG_TOSHIBA_BT_RFKILL is not set
+# CONFIG_ACPI_CMPC is not set
+CONFIG_INTEL_IPS=m
+# CONFIG_IBM_RTL is not set
+
+#
+# Firmware Drivers
+#
+# CONFIG_EDD is not set
+CONFIG_FIRMWARE_MEMMAP=y
+# CONFIG_DELL_RBU is not set
+# CONFIG_DCDBAS is not set
+CONFIG_DMIID=y
+# CONFIG_ISCSI_IBFT_FIND is not set
+
+#
+# File systems
+#
+CONFIG_EXT2_FS=y
+# CONFIG_EXT2_FS_XATTR is not set
+# CONFIG_EXT2_FS_XIP is not set
+CONFIG_EXT3_FS=y
+# CONFIG_EXT3_DEFAULTS_TO_ORDERED is not set
+CONFIG_EXT3_FS_XATTR=y
+CONFIG_EXT3_FS_POSIX_ACL=y
+CONFIG_EXT3_FS_SECURITY=y
+CONFIG_EXT4_FS=y
+CONFIG_EXT4_FS_XATTR=y
+CONFIG_EXT4_FS_POSIX_ACL=y
+CONFIG_EXT4_FS_SECURITY=y
+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=y
+# CONFIG_XFS_FS is not set
+# CONFIG_GFS2_FS is not set
+# CONFIG_OCFS2_FS is not set
+CONFIG_BTRFS_FS=y
+CONFIG_BTRFS_FS_POSIX_ACL=y
+# CONFIG_NILFS2_FS is not set
+CONFIG_FILE_LOCKING=y
+CONFIG_FSNOTIFY=y
+CONFIG_DNOTIFY=y
+CONFIG_INOTIFY_USER=y
+CONFIG_FANOTIFY=y
+# CONFIG_QUOTA is not set
+# CONFIG_QUOTACTL is not set
+# CONFIG_AUTOFS4_FS is not set
+CONFIG_FUSE_FS=m
+# CONFIG_CUSE is not set
+CONFIG_GENERIC_ACL=y
+
+#
+# Caches
+#
+# CONFIG_FSCACHE is not set
+
+#
+# CD-ROM/DVD Filesystems
+#
+CONFIG_ISO9660_FS=y
+CONFIG_JOLIET=y
+CONFIG_ZISOFS=y
+CONFIG_UDF_FS=m
+CONFIG_UDF_NLS=y
+
+#
+# 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="ascii"
+# CONFIG_NTFS_FS is not set
+
+#
+# Pseudo filesystems
+#
+CONFIG_PROC_FS=y
+# CONFIG_PROC_KCORE is not set
+CONFIG_PROC_SYSCTL=y
+CONFIG_PROC_PAGE_MONITOR=y
+CONFIG_SYSFS=y
+CONFIG_TMPFS=y
+CONFIG_TMPFS_POSIX_ACL=y
+# CONFIG_HUGETLBFS is not set
+# CONFIG_HUGETLB_PAGE is not set
+CONFIG_CONFIGFS_FS=m
+CONFIG_MISC_FILESYSTEMS=y
+# CONFIG_ADFS_FS is not set
+# CONFIG_AFFS_FS is not set
+CONFIG_ECRYPT_FS=m
+# 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_LOGFS is not set
+# CONFIG_CRAMFS is not set
+CONFIG_SQUASHFS=y
+CONFIG_SQUASHFS_XATTR=y
+CONFIG_SQUASHFS_LZO=y
+# CONFIG_SQUASHFS_EMBEDDED is not set
+CONFIG_SQUASHFS_FRAGMENT_CACHE_SIZE=3
+# CONFIG_VXFS_FS is not set
+# CONFIG_MINIX_FS is not set
+# CONFIG_OMFS_FS is not set
+# CONFIG_HPFS_FS is not set
+# CONFIG_QNX4FS_FS is not set
+# CONFIG_ROMFS_FS is not set
+# CONFIG_SYSV_FS is not set
+# CONFIG_UFS_FS is not set
+CONFIG_NETWORK_FILESYSTEMS=y
+# CONFIG_NFS_FS is not set
+# CONFIG_NFSD is not set
+# CONFIG_CEPH_FS is not set
+CONFIG_CIFS=m
+# CONFIG_CIFS_STATS is not set
+CONFIG_CIFS_WEAK_PW_HASH=y
+# CONFIG_CIFS_UPCALL is not set
+# CONFIG_CIFS_XATTR is not set
+# CONFIG_CIFS_DEBUG2 is not set
+# CONFIG_CIFS_DFS_UPCALL is not set
+# CONFIG_CIFS_EXPERIMENTAL 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=y
+# CONFIG_MINIX_SUBPARTITION is not set
+# CONFIG_SOLARIS_X86_PARTITION is not set
+# CONFIG_UNIXWARE_DISKLABEL is not set
+CONFIG_LDM_PARTITION=y
+# CONFIG_LDM_DEBUG 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=y
+# CONFIG_SYSV68_PARTITION is not set
+CONFIG_NLS=y
+CONFIG_NLS_DEFAULT="utf8"
+CONFIG_NLS_CODEPAGE_437=y
+CONFIG_NLS_CODEPAGE_737=m
+CONFIG_NLS_CODEPAGE_775=m
+CONFIG_NLS_CODEPAGE_850=m
+CONFIG_NLS_CODEPAGE_852=m
+CONFIG_NLS_CODEPAGE_855=m
+CONFIG_NLS_CODEPAGE_857=m
+CONFIG_NLS_CODEPAGE_860=m
+CONFIG_NLS_CODEPAGE_861=m
+CONFIG_NLS_CODEPAGE_862=m
+CONFIG_NLS_CODEPAGE_863=m
+CONFIG_NLS_CODEPAGE_864=m
+CONFIG_NLS_CODEPAGE_865=m
+CONFIG_NLS_CODEPAGE_866=m
+CONFIG_NLS_CODEPAGE_869=m
+CONFIG_NLS_CODEPAGE_936=m
+CONFIG_NLS_CODEPAGE_950=m
+CONFIG_NLS_CODEPAGE_932=m
+CONFIG_NLS_CODEPAGE_949=m
+CONFIG_NLS_CODEPAGE_874=m
+CONFIG_NLS_ISO8859_8=m
+CONFIG_NLS_CODEPAGE_1250=m
+CONFIG_NLS_CODEPAGE_1251=m
+CONFIG_NLS_ASCII=y
+CONFIG_NLS_ISO8859_1=m
+CONFIG_NLS_ISO8859_2=m
+CONFIG_NLS_ISO8859_3=m
+CONFIG_NLS_ISO8859_4=m
+CONFIG_NLS_ISO8859_5=m
+CONFIG_NLS_ISO8859_6=m
+CONFIG_NLS_ISO8859_7=m
+CONFIG_NLS_ISO8859_9=m
+CONFIG_NLS_ISO8859_13=m
+CONFIG_NLS_ISO8859_14=m
+CONFIG_NLS_ISO8859_15=m
+CONFIG_NLS_KOI8_R=m
+CONFIG_NLS_KOI8_U=m
+CONFIG_NLS_UTF8=m
+# CONFIG_DLM is not set
+
+#
+# Kernel hacking
+#
+CONFIG_TRACE_IRQFLAGS_SUPPORT=y
+CONFIG_PRINTK_TIME=y
+CONFIG_ENABLE_WARN_DEPRECATED=y
+CONFIG_ENABLE_MUST_CHECK=y
+CONFIG_FRAME_WARN=1024
+CONFIG_MAGIC_SYSRQ=y
+# CONFIG_STRIP_ASM_SYMS is not set
+# CONFIG_UNUSED_SYMBOLS is not set
+CONFIG_DEBUG_FS=y
+# CONFIG_HEADERS_CHECK is not set
+CONFIG_DEBUG_KERNEL=y
+CONFIG_DEBUG_SHIRQ=y
+CONFIG_LOCKUP_DETECTOR=y
+CONFIG_HARDLOCKUP_DETECTOR=y
+# CONFIG_BOOTPARAM_SOFTLOCKUP_PANIC is not set
+CONFIG_BOOTPARAM_SOFTLOCKUP_PANIC_VALUE=0
+# CONFIG_DETECT_HUNG_TASK is not set
+CONFIG_SCHED_DEBUG=y
+CONFIG_SCHEDSTATS=y
+CONFIG_TIMER_STATS=y
+# CONFIG_DEBUG_OBJECTS is not set
+CONFIG_DEBUG_SLAB=y
+# CONFIG_DEBUG_SLAB_LEAK is not set
+# CONFIG_DEBUG_KMEMLEAK is not set
+# CONFIG_DEBUG_PREEMPT is not set
+# CONFIG_DEBUG_RT_MUTEXES is not set
+# CONFIG_RT_MUTEX_TESTER is not set
+CONFIG_DEBUG_SPINLOCK=y
+CONFIG_DEBUG_MUTEXES=y
+CONFIG_BKL=y
+CONFIG_DEBUG_LOCK_ALLOC=y
+CONFIG_PROVE_LOCKING=y
+CONFIG_PROVE_RCU=y
+# CONFIG_PROVE_RCU_REPEATEDLY is not set
+CONFIG_SPARSE_RCU_POINTER=y
+CONFIG_LOCKDEP=y
+# CONFIG_LOCK_STAT is not set
+# CONFIG_DEBUG_LOCKDEP is not set
+CONFIG_TRACE_IRQFLAGS=y
+CONFIG_DEBUG_SPINLOCK_SLEEP=y
+# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set
+CONFIG_STACKTRACE=y
+# CONFIG_DEBUG_KOBJECT is not set
+CONFIG_DEBUG_BUGVERBOSE=y
+CONFIG_DEBUG_INFO=y
+# CONFIG_DEBUG_INFO_REDUCED is not set
+# CONFIG_DEBUG_VM is not set
+# CONFIG_DEBUG_VIRTUAL is not set
+# CONFIG_DEBUG_WRITECOUNT is not set
+CONFIG_DEBUG_MEMORY_INIT=y
+CONFIG_DEBUG_LIST=y
+# CONFIG_TEST_LIST_SORT is not set
+# CONFIG_DEBUG_SG is not set
+CONFIG_DEBUG_NOTIFIERS=y
+# CONFIG_DEBUG_CREDENTIALS is not set
+CONFIG_ARCH_WANT_FRAME_POINTERS=y
+CONFIG_FRAME_POINTER=y
+CONFIG_BOOT_PRINTK_DELAY=y
+# CONFIG_RCU_TORTURE_TEST is not set
+# CONFIG_RCU_CPU_STALL_DETECTOR is not set
+# CONFIG_BACKTRACE_SELF_TEST is not set
+# CONFIG_DEBUG_BLOCK_EXT_DEVT is not set
+# CONFIG_DEBUG_FORCE_WEAK_PER_CPU is not set
+# CONFIG_LKDTM is not set
+# CONFIG_CPU_NOTIFIER_ERROR_INJECT is not set
+# CONFIG_FAULT_INJECTION is not set
+CONFIG_LATENCYTOP=y
+CONFIG_SYSCTL_SYSCALL_CHECK=y
+# CONFIG_DEBUG_PAGEALLOC is not set
+CONFIG_USER_STACKTRACE_SUPPORT=y
+CONFIG_NOP_TRACER=y
+CONFIG_HAVE_FUNCTION_TRACER=y
+CONFIG_HAVE_FUNCTION_GRAPH_TRACER=y
+CONFIG_HAVE_FUNCTION_GRAPH_FP_TEST=y
+CONFIG_HAVE_FUNCTION_TRACE_MCOUNT_TEST=y
+CONFIG_HAVE_DYNAMIC_FTRACE=y
+CONFIG_HAVE_FTRACE_MCOUNT_RECORD=y
+CONFIG_HAVE_SYSCALL_TRACEPOINTS=y
+CONFIG_HAVE_C_RECORDMCOUNT=y
+CONFIG_TRACER_MAX_TRACE=y
+CONFIG_RING_BUFFER=y
+CONFIG_EVENT_TRACING=y
+CONFIG_CONTEXT_SWITCH_TRACER=y
+CONFIG_TRACING=y
+CONFIG_GENERIC_TRACER=y
+CONFIG_TRACING_SUPPORT=y
+CONFIG_FTRACE=y
+# CONFIG_FUNCTION_TRACER is not set
+# CONFIG_IRQSOFF_TRACER is not set
+# CONFIG_PREEMPT_TRACER is not set
+CONFIG_SCHED_TRACER=y
+# CONFIG_FTRACE_SYSCALLS is not set
+CONFIG_BRANCH_PROFILE_NONE=y
+# CONFIG_PROFILE_ANNOTATED_BRANCHES is not set
+# CONFIG_PROFILE_ALL_BRANCHES is not set
+# CONFIG_STACK_TRACER is not set
+CONFIG_BLK_DEV_IO_TRACE=y
+# CONFIG_FTRACE_STARTUP_TEST is not set
+# CONFIG_MMIOTRACE is not set
+# CONFIG_RING_BUFFER_BENCHMARK is not set
+# CONFIG_PROVIDE_OHCI1394_DMA_INIT is not set
+# CONFIG_DYNAMIC_DEBUG is not set
+# CONFIG_DMA_API_DEBUG is not set
+# CONFIG_ATOMIC64_SELFTEST is not set
+# CONFIG_SAMPLES is not set
+CONFIG_HAVE_ARCH_KGDB=y
+# CONFIG_KGDB is not set
+CONFIG_HAVE_ARCH_KMEMCHECK=y
+CONFIG_STRICT_DEVMEM=y
+CONFIG_X86_VERBOSE_BOOTUP=y
+CONFIG_EARLY_PRINTK=y
+# CONFIG_EARLY_PRINTK_DBGP is not set
+# CONFIG_DEBUG_STACKOVERFLOW is not set
+# CONFIG_DEBUG_STACK_USAGE is not set
+# CONFIG_DEBUG_PER_CPU_MAPS is not set
+# CONFIG_X86_PTDUMP is not set
+CONFIG_DEBUG_RODATA=y
+# CONFIG_DEBUG_RODATA_TEST is not set
+# CONFIG_DEBUG_NX_TEST is not set
+CONFIG_DOUBLEFAULT=y
+# CONFIG_IOMMU_STRESS is not set
+CONFIG_HAVE_MMIOTRACE_SUPPORT=y
+CONFIG_IO_DELAY_TYPE_0X80=0
+CONFIG_IO_DELAY_TYPE_0XED=1
+CONFIG_IO_DELAY_TYPE_UDELAY=2
+CONFIG_IO_DELAY_TYPE_NONE=3
+CONFIG_IO_DELAY_0X80=y
+# CONFIG_IO_DELAY_0XED is not set
+# CONFIG_IO_DELAY_UDELAY is not set
+# CONFIG_IO_DELAY_NONE is not set
+CONFIG_DEFAULT_IO_DELAY_TYPE=0
+CONFIG_DEBUG_BOOT_PARAMS=y
+# CONFIG_CPA_DEBUG is not set
+# CONFIG_OPTIMIZE_INLINING is not set
+# CONFIG_DEBUG_STRICT_USER_COPY_CHECKS is not set
+
+#
+# Security options
+#
+CONFIG_KEYS=y
+# CONFIG_KEYS_DEBUG_PROC_KEYS is not set
+# CONFIG_SECURITY_DMESG_RESTRICT is not set
+# CONFIG_SECURITY is not set
+# CONFIG_SECURITYFS is not set
+CONFIG_DEFAULT_SECURITY_DAC=y
+CONFIG_DEFAULT_SECURITY=""
+CONFIG_CRYPTO=y
+
+#
+# Crypto core or helper
+#
+CONFIG_CRYPTO_ALGAPI=y
+CONFIG_CRYPTO_ALGAPI2=y
+CONFIG_CRYPTO_AEAD=m
+CONFIG_CRYPTO_AEAD2=y
+CONFIG_CRYPTO_BLKCIPHER=y
+CONFIG_CRYPTO_BLKCIPHER2=y
+CONFIG_CRYPTO_HASH=y
+CONFIG_CRYPTO_HASH2=y
+CONFIG_CRYPTO_RNG=m
+CONFIG_CRYPTO_RNG2=y
+CONFIG_CRYPTO_PCOMP=y
+CONFIG_CRYPTO_PCOMP2=y
+CONFIG_CRYPTO_MANAGER=y
+CONFIG_CRYPTO_MANAGER2=y
+# CONFIG_CRYPTO_MANAGER_DISABLE_TESTS is not set
+CONFIG_CRYPTO_GF128MUL=m
+CONFIG_CRYPTO_NULL=m
+# CONFIG_CRYPTO_PCRYPT is not set
+CONFIG_CRYPTO_WORKQUEUE=y
+# CONFIG_CRYPTO_CRYPTD is not set
+CONFIG_CRYPTO_AUTHENC=m
+CONFIG_CRYPTO_TEST=m
+
+#
+# Authenticated Encryption with Associated Data
+#
+CONFIG_CRYPTO_CCM=m
+CONFIG_CRYPTO_GCM=m
+CONFIG_CRYPTO_SEQIV=m
+
+#
+# Block modes
+#
+CONFIG_CRYPTO_CBC=m
+CONFIG_CRYPTO_CTR=m
+# CONFIG_CRYPTO_CTS is not set
+CONFIG_CRYPTO_ECB=y
+CONFIG_CRYPTO_LRW=m
+CONFIG_CRYPTO_PCBC=m
+CONFIG_CRYPTO_XTS=m
+
+#
+# Hash modes
+#
+CONFIG_CRYPTO_HMAC=y
+CONFIG_CRYPTO_XCBC=m
+CONFIG_CRYPTO_VMAC=m
+
+#
+# Digest
+#
+CONFIG_CRYPTO_CRC32C=y
+# CONFIG_CRYPTO_CRC32C_INTEL is not set
+CONFIG_CRYPTO_GHASH=m
+CONFIG_CRYPTO_MD4=m
+CONFIG_CRYPTO_MD5=y
+CONFIG_CRYPTO_MICHAEL_MIC=m
+# CONFIG_CRYPTO_RMD128 is not set
+# CONFIG_CRYPTO_RMD160 is not set
+# CONFIG_CRYPTO_RMD256 is not set
+# CONFIG_CRYPTO_RMD320 is not set
+CONFIG_CRYPTO_SHA1=y
+CONFIG_CRYPTO_SHA256=m
+CONFIG_CRYPTO_SHA512=m
+CONFIG_CRYPTO_TGR192=m
+CONFIG_CRYPTO_WP512=m
+
+#
+# Ciphers
+#
+CONFIG_CRYPTO_AES=y
+CONFIG_CRYPTO_AES_586=m
+CONFIG_CRYPTO_ANUBIS=m
+CONFIG_CRYPTO_ARC4=y
+CONFIG_CRYPTO_BLOWFISH=m
+CONFIG_CRYPTO_CAMELLIA=m
+CONFIG_CRYPTO_CAST5=m
+CONFIG_CRYPTO_CAST6=m
+CONFIG_CRYPTO_DES=m
+CONFIG_CRYPTO_FCRYPT=m
+CONFIG_CRYPTO_KHAZAD=m
+CONFIG_CRYPTO_SALSA20=m
+CONFIG_CRYPTO_SALSA20_586=m
+CONFIG_CRYPTO_SEED=m
+CONFIG_CRYPTO_SERPENT=m
+CONFIG_CRYPTO_TEA=m
+CONFIG_CRYPTO_TWOFISH=m
+CONFIG_CRYPTO_TWOFISH_COMMON=m
+CONFIG_CRYPTO_TWOFISH_586=m
+
+#
+# Compression
+#
+CONFIG_CRYPTO_DEFLATE=m
+CONFIG_CRYPTO_ZLIB=y
+# CONFIG_CRYPTO_LZO is not set
+
+#
+# Random Number Generation
+#
+# CONFIG_CRYPTO_ANSI_CPRNG is not set
+CONFIG_CRYPTO_HW=y
+# CONFIG_CRYPTO_DEV_PADLOCK is not set
+# CONFIG_CRYPTO_DEV_GEODE is not set
+# CONFIG_CRYPTO_DEV_HIFN_795X is not set
+CONFIG_HAVE_KVM=y
+CONFIG_HAVE_KVM_IRQCHIP=y
+CONFIG_HAVE_KVM_EVENTFD=y
+CONFIG_KVM_APIC_ARCHITECTURE=y
+CONFIG_KVM_MMIO=y
+CONFIG_VIRTUALIZATION=y
+CONFIG_KVM=m
+CONFIG_KVM_INTEL=m
+# CONFIG_KVM_AMD is not set
+# CONFIG_KVM_MMU_AUDIT is not set
+# CONFIG_VHOST_NET is not set
+# CONFIG_LGUEST is not set
+# CONFIG_VIRTIO_PCI is not set
+# CONFIG_VIRTIO_BALLOON is not set
+CONFIG_BINARY_PRINTF=y
+
+#
+# Library routines
+#
+CONFIG_BITREVERSE=y
+CONFIG_GENERIC_FIND_FIRST_BIT=y
+CONFIG_GENERIC_FIND_NEXT_BIT=y
+CONFIG_GENERIC_FIND_LAST_BIT=y
+CONFIG_CRC_CCITT=y
+CONFIG_CRC16=y
+# CONFIG_CRC_T10DIF is not set
+CONFIG_CRC_ITU_T=m
+CONFIG_CRC32=y
+# CONFIG_CRC7 is not set
+CONFIG_LIBCRC32C=y
+CONFIG_ZLIB_INFLATE=y
+CONFIG_ZLIB_DEFLATE=y
+CONFIG_LZO_COMPRESS=y
+CONFIG_LZO_DECOMPRESS=y
+CONFIG_DECOMPRESS_GZIP=y
+CONFIG_DECOMPRESS_BZIP2=y
+CONFIG_DECOMPRESS_LZMA=y
+CONFIG_DECOMPRESS_LZO=y
+CONFIG_TEXTSEARCH=y
+CONFIG_TEXTSEARCH_KMP=m
+CONFIG_TEXTSEARCH_BM=m
+CONFIG_TEXTSEARCH_FSM=m
+CONFIG_HAS_IOMEM=y
+CONFIG_HAS_IOPORT=y
+CONFIG_HAS_DMA=y
+CONFIG_CHECK_SIGNATURE=y
+CONFIG_NLATTR=y
+
diff --git a/recipes/linux/linux/patch-2.6.28-gc b/recipes/linux/linux/patch-2.6.28-gc
deleted file mode 100644
index e13666396b..0000000000
--- a/recipes/linux/linux/patch-2.6.28-gc
+++ /dev/null
@@ -1,32569 +0,0 @@
-diff --git a/Documentation/exi.txt b/Documentation/exi.txt
-new file mode 100644
-index 0000000..a330c56
---- /dev/null
-+++ b/Documentation/exi.txt
-@@ -0,0 +1,81 @@
-+The Expansion Interface (EXI)
-+-----------------------------
-+
-+[Introductory information goes here...]
-+
-+
-+Device drivers
-+--------------
-+
-+Outlined below is the recommended practice when writing EXI device drivers.
-+
-+The bus driver already handles quite an amount of stuff, although some of
-+it might have to be implemented by individual device drivers. If in doubt,
-+see include/linux/exi.h.
-+
-+
-+Registration
-+------------
-+
-+Declare a struct exi_driver. Initialize at least the name, id_table,
-+probe and remove fields:
-+
-+
-+ static struct exi_device_id frob_id_tbl[] __devinitdata = {
-+ { .dev_id = EXI_ID_FROB0, },
-+ { .dev_id = EXI_ID_FROB1, },
-+ { .dev_id = EXI_ID_FROB2, },
-+ };
-+
-+ static struct exi_driver frob_driver = {
-+ .name = "frob",
-+ .id_table = frob_id_tbl,
-+ .probe = frob_probe,
-+ .remove = __devexit_p(frob_remove),
-+ };
-+
-+
-+`name' distinguishes the driver from others registered with the bus.
-+It should be short, unique, yet remain informative.
-+
-+`id_table' is a pointer to a table of device IDs the driver claims to
-+support. These should be taken directly from include/linux/exi_ids.h.
-+This table should be marked __devinitdata.
-+
-+`probe' is a pointer to a function that's called once the driver is bound
-+to a device it claims to support. This should be marked __devinit.
-+
-+`remove' is a pointer to a function that's called when either the driver
-+unregisters with the bus, or a device bound to that specific driver is
-+physically unplugged from the bus. This should be marked __devexit and
-+created with __devexit_p().
-+
-+From within the driver's initialization function, register the driver with
-+the bus by calling exi_driver_register() with the driver structure declared
-+previously:
-+
-+ static int __init frob_init(void)
-+ {
-+ return exi_driver_register(&frob_driver);
-+ }
-+
-+
-+Deregistration
-+--------------
-+
-+If the driver may be compiled as a loadable kernel module, then all you
-+have to do is call exi_driver_unregister() in the driver's exit function:
-+
-+ static void __exit frob_exit(void)
-+ {
-+ exi_driver_unregister(&frob_driver);
-+ }
-+
-+Device Private Data
-+-------------------
-+
-+The functions exi_set_drvdata()/exi_get_drvdata() are available for the
-+sole purpose of setting and getting driver private data for an EXI device.
-+These are simply helpers around the driver-model functions that do the
-+actual work. Use them. That way, you don't have to worry (or worry less)
-+about changes to the driver-model API.
-diff --git a/arch/powerpc/Kconfig b/arch/powerpc/Kconfig
-index 525c13a..79074d6 100644
---- a/arch/powerpc/Kconfig
-+++ b/arch/powerpc/Kconfig
-@@ -584,7 +584,7 @@ config PPC_PCI_CHOICE
- config PCI
- bool "PCI support" if PPC_PCI_CHOICE
- default y if !40x && !CPM2 && !8xx && !PPC_83xx \
-- && !PPC_85xx && !PPC_86xx
-+ && !PPC_85xx && !PPC_86xx && !GAMECUBE_COMMON
- default PCI_PERMEDIA if !4xx && !CPM2 && !8xx
- default PCI_QSPAN if !4xx && !CPM2 && 8xx
- select ARCH_SUPPORTS_MSI
-diff --git a/arch/powerpc/Kconfig.debug b/arch/powerpc/Kconfig.debug
-index 15eb278..fc6a8da 100644
---- a/arch/powerpc/Kconfig.debug
-+++ b/arch/powerpc/Kconfig.debug
-@@ -224,6 +224,14 @@ config PPC_EARLY_DEBUG_CPM
- using a CPM-based serial port. This assumes that the bootwrapper
- has run, and set up the CPM in a particular way.
-
-+config PPC_EARLY_DEBUG_USBGECKO
-+ bool "Early debugging through the USB Gecko adapter"
-+ depends on GAMECUBE_COMMON
-+ select USBGECKO_UDBG
-+ help
-+ Select this to enable early debugging for Nintendo GameCube/Wii
-+ consoles via an external USB Gecko adapter.
-+
- endchoice
-
- config PPC_EARLY_DEBUG_44x_PHYSLOW
-diff --git a/arch/powerpc/boot/Makefile b/arch/powerpc/boot/Makefile
-index 3d3daa6..d685ea2 100644
---- a/arch/powerpc/boot/Makefile
-+++ b/arch/powerpc/boot/Makefile
-@@ -60,17 +60,16 @@ src-wlib := string.S crt0.S crtsavres.S stdio.c main.c \
- 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
-+ fsl-soc.c mpc8xx.c pq2.c ugecon.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 cuboot-mpc7448hpc2.c cuboot-taishan.c \
- fixed-head.S ep88xc.c ep405.c cuboot-c2k.c \
- cuboot-katmai.c cuboot-rainier.c redboot-8xx.c ep8248e.c \
- cuboot-warp.c cuboot-85xx-cpm2.c cuboot-yosemite.c simpleboot.c \
- virtex405-head.S virtex.c redboot-83xx.c cuboot-sam440ep.c \
-- cuboot-acadia.c
-+ cuboot-acadia.c gamecube.c wii.c
- src-boot := $(src-wlib) $(src-plat) empty.c
-
- src-boot := $(addprefix $(obj)/, $(src-boot))
-@@ -272,6 +271,8 @@ image-$(CONFIG_KSI8560) += cuImage.ksi8560
- image-$(CONFIG_STORCENTER) += cuImage.storcenter
- image-$(CONFIG_MPC7448HPC2) += cuImage.mpc7448hpc2
- image-$(CONFIG_PPC_C2K) += cuImage.c2k
-+image-$(CONFIG_GAMECUBE) += dtbImage.gamecube
-+image-$(CONFIG_WII) += dtbImage.wii
-
- # For 32-bit powermacs, build the COFF and miboot images
- # as well as the ELF images.
-diff --git a/arch/powerpc/boot/dts/gamecube.dts b/arch/powerpc/boot/dts/gamecube.dts
-new file mode 100644
-index 0000000..c45c97e
---- /dev/null
-+++ b/arch/powerpc/boot/dts/gamecube.dts
-@@ -0,0 +1,129 @@
-+/*
-+ * arch/powerpc/boot/dts/gamecube.dts
-+ *
-+ * Nintendo GameCube platform device tree source
-+ * Copyright (C) 2007-2009 The GameCube Linux Team
-+ * Copyright (C) 2007,2008,2009 Albert Herranz
-+ *
-+ * This program is free software; you can redistribute it and/or
-+ * modify it under the terms of the GNU General Public License
-+ * as published by the Free Software Foundation; either version 2
-+ * of the License, or (at your option) any later version.
-+ *
-+ */
-+
-+/ {
-+ model = "NintendoGameCube";
-+ compatible = "nintendo,gamecube";
-+ #address-cells = <1>;
-+ #size-cells = <1>;
-+
-+ chosen {
-+ bootargs = "root=/dev/nfs nfsroot=192.168.001.253:/nfsroot/cube,nfsvers=3,udp ip=on video=gcn-vifb:tv=auto force_keyboard_port=4";
-+ linux,stdout-path = "/exi@0c006800/usbgecko@0c006814";
-+ };
-+
-+ memory {
-+ device_type = "memory";
-+ /* 24M minus framebuffer memory area (640*576*2*2) */
-+ reg = <00000000 01698000>;
-+ };
-+
-+ cpus {
-+ #address-cells = <1>;
-+ #size-cells = <0>;
-+
-+ PowerPC,gekko@0 {
-+ device_type = "cpu";
-+ reg = <0>;
-+ clock-frequency = <1cf7c580>; /* 486MHz */
-+ bus-frequency = <9a7ec80>; /* 162MHz core-to-bus 3x */
-+ timebase-frequency = <269fb20>; /* 162MHz / 4 */
-+ /* Following required by dtc but not used */
-+ i-cache-line-size = <20>;
-+ d-cache-line-size = <20>;
-+ i-cache-size = <8000>;
-+ d-cache-size = <8000>;
-+ };
-+ };
-+
-+ pic: pic@0c003000 {
-+ #interrupt-cells = <1>;
-+ compatible = "nintendo,flipper-pic";
-+ reg = <0c003000 8>;
-+ interrupt-controller;
-+ };
-+
-+ /* External Interface bus */
-+ exi@0c006800 {
-+ #address-cells = <1>;
-+ #size-cells = <1>;
-+ compatible = "nintendo,flipper-exi";
-+ reg = <0c006800 40>;
-+ interrupts = <04>;
-+ interrupt-parent = <&pic>;
-+
-+ udbg_console: usbgecko@0c006814 {
-+ compatible = "usbgecko,usbgecko";
-+ reg = <0c006814 14>;
-+ virtual-reg = <cc006814>;
-+ };
-+ };
-+
-+ /* devices contained int the flipper chipset */
-+ soc {
-+ #address-cells = <1>;
-+ #size-cells = <1>;
-+ #interrupt-cells = <1>;
-+ model = "flipper";
-+ compatible = "nintendo,flipper";
-+ clock-frequency = <9a7ec80>; /* 162MHz */
-+ ranges = <0c000000 0c000000 00010000>;
-+
-+ video@0c002000 {
-+ compatible = "nintendo,flipper-video";
-+ reg = <0c002000 100>;
-+ interrupts = <08>;
-+ interrupt-parent = <&pic>;
-+ xfb-start = <01698000>; /* end-of-ram - xfb-size */
-+ xfb-size = <168000>;
-+ };
-+
-+ resetswitch@0c003000 {
-+ compatible = "nintendo,flipper-resetswitch";
-+ reg = <0c003000 4>;
-+ interrupts = <01>;
-+ interrupt-parent = <&pic>;
-+ };
-+
-+ auxram@0c005000 {
-+ compatible = "nintendo,flipper-auxram";
-+ reg = <0c005000 200>; /* DSP */
-+ interrupts = <06>;
-+ interrupt-parent = <&pic>;
-+ };
-+
-+ audio@0c005000 {
-+ compatible = "nintendo,flipper-audio";
-+ reg = <0c005000 200 /* DSP */
-+ 0c006c00 20>; /* AI */
-+ interrupts = <06>;
-+ interrupt-parent = <&pic>;
-+ };
-+
-+ disk@0c006000 {
-+ compatible = "nintendo,flipper-disk";
-+ reg = <0c006000 40>;
-+ interrupts = <02>;
-+ interrupt-parent = <&pic>;
-+ };
-+
-+ serial@0c006400 {
-+ compatible = "nintendo,flipper-serial";
-+ reg = <0c006400 100>;
-+ interrupts = <03>;
-+ interrupt-parent = <&pic>;
-+ };
-+ };
-+};
-+
-diff --git a/arch/powerpc/boot/dts/wii.dts b/arch/powerpc/boot/dts/wii.dts
-new file mode 100644
-index 0000000..fdfbc2c
---- /dev/null
-+++ b/arch/powerpc/boot/dts/wii.dts
-@@ -0,0 +1,162 @@
-+/*
-+ * arch/powerpc/boot/dts/wii.dts
-+ *
-+ * Nintendo Wii platform device tree source
-+ * Copyright (C) 2008-2009 The GameCube Linux Team
-+ * Copyright (C) 2008,2009 Albert Herranz
-+ *
-+ * This program is free software; you can redistribute it and/or
-+ * modify it under the terms of the GNU General Public License
-+ * as published by the Free Software Foundation; either version 2
-+ * of the License, or (at your option) any later version.
-+ *
-+ */
-+
-+
-+/memreserve/ 01698000-017fffff; /* framebuffer, see video@0c002000 */
-+/memreserve/ 01800000-0fffffff; /* memory hole */
-+/memreserve/ 10000000-10003fff; /* DSP */
-+
-+/ {
-+ model = "NintendoWii";
-+ compatible = "nintendo,wii";
-+ #address-cells = <1>;
-+ #size-cells = <1>;
-+
-+ chosen {
-+ /* ramdisk */
-+ /* bootargs = "nobats root=/dev/ram0 video=gcnfb:tv=NTSC ip=on force_keyboard_port=4"; */
-+
-+ /* nfsroot */
-+ /* bootargs = "nobats root=/dev/nfs nfsroot=192.168.001.253:/nfsroot/cube ip=on video=gcnfb:tv=NTSC force_keyboard_port=4"; */
-+
-+ /* root filesystem on 2nd partition of SD card, whiite style */
-+ bootargs = "nobats root=/dev/rvlsda2 video=gcnfb:tv=NTSC force_keyboard_port=4 placeholder_for_additional_kernel_options_targetted_at_hexedit_lovers";
-+ linux,stdout-path = "/exi@0d006800/usbgecko@0d006814";
-+ };
-+
-+ memory {
-+ device_type = "memory";
-+ /* mem1 + hole + mem2 - ioh */
-+ reg = <00000000 133e0000>;
-+ };
-+
-+ cpus {
-+ #cpus = <1>;
-+ #address-cells = <1>;
-+ #size-cells = <0>;
-+
-+ PowerPC,broadway@0 {
-+ device_type = "cpu";
-+ reg = <0>;
-+ clock-frequency = <2b73a840>; /* 729MHz */
-+ bus-frequency = <e7be2c0>; /* 243MHz core-to-bus 3x */
-+ timebase-frequency = <39ef8b0>; /* 243MHz / 4 */
-+ /* Following required by dtc but not used */
-+ i-cache-line-size = <20>;
-+ d-cache-line-size = <20>;
-+ i-cache-size = <8000>;
-+ d-cache-size = <8000>;
-+ };
-+ };
-+
-+ pic: pic@0c003000 {
-+ #interrupt-cells = <1>;
-+ compatible = "nintendo,flipper-pic";
-+ reg = <0c003000 8>;
-+ interrupt-controller;
-+ };
-+
-+ /* External Interface bus */
-+ exi@0d006800 {
-+ #address-cells = <1>;
-+ #size-cells = <1>;
-+ compatible = "nintendo,hollywood-exi";
-+ reg = <0d006800 40>;
-+ interrupts = <04>;
-+ interrupt-parent = <&pic>;
-+
-+ udbg_console: usbgecko@0d006814 {
-+ compatible = "usbgecko,usbgecko";
-+ reg = <0d006814 14>;
-+ virtual-reg = <cd006814>;
-+ };
-+ };
-+
-+ /* devices contained in the hollywood chipset */
-+ soc {
-+ #address-cells = <1>;
-+ #size-cells = <1>;
-+ #interrupt-cells = <1>;
-+ model = "hollywood";
-+ compatible = "nintendo,hollywood";
-+ clock-frequency = <e7be2c0>; /* 243MHz */
-+ ranges = <0c000000 0c000000 00010000
-+ 0d000000 0d000000 00010000
-+ 0d800000 0d800000 00001000
-+ 133e0000 133e0000 00020000>;
-+
-+ video@0c002000 {
-+ compatible = "nintendo,hollywood-video";
-+ reg = <0c002000 100>;
-+ interrupts = <08>;
-+ interrupt-parent = <&pic>;
-+ xfb-start = <01698000>; /* end-of-mem1 - xfb-size */
-+ xfb-size = <168000>; /* 640x576x2 x 2 bytes */
-+ };
-+
-+ resetswitch@0c003000 {
-+ compatible = "nintendo,hollywood-resetswitch";
-+ reg = <0c003000 4>;
-+ interrupts = <01>;
-+ interrupt-parent = <&pic>;
-+ };
-+
-+ audio@0c005000 {
-+ compatible = "nintendo,hollywood-audio";
-+ reg = <0c005000 200 /* DSP */
-+ 0d006c00 20>; /* AI */
-+ interrupts = <06>;
-+ interrupt-parent = <&pic>;
-+ };
-+
-+ serial@0d006400 {
-+ compatible = "nintendo,hollywood-serial";
-+ reg = <0d006400 100>;
-+ interrupts = <03>;
-+ interrupt-parent = <&pic>;
-+ };
-+
-+ gpio0: starlet-gpio@0d8000c0 {
-+ compatible = "nintendo,starlet-gpio";
-+ reg = <0d8000c0 4>;
-+ gpio-controller;
-+ #gpio-cells = <2>;
-+ };
-+
-+ starlet-ipc@0d000000 {
-+ compatible = "nintendo,starlet-ipc";
-+ reg = <0d000000 40 /* IPC */
-+ 133e0000 20000>; /* MEM2 ioh 128K */
-+ interrupts = <0e>;
-+ interrupt-parent = <&pic>;
-+
-+ };
-+
-+ starlet-es {
-+ compatible = "nintendo,starlet-es";
-+ };
-+
-+ starlet-sd {
-+ compatible = "nintendo,starlet-sd";
-+ };
-+
-+ starlet-keyboard {
-+ compatible = "nintendo,starlet-keyboard";
-+ };
-+
-+ starlet-hcd {
-+ compatible = "nintendo,starlet-hcd";
-+ };
-+ };
-+};
-diff --git a/arch/powerpc/boot/gamecube.c b/arch/powerpc/boot/gamecube.c
-new file mode 100644
-index 0000000..f3e3c0d
---- /dev/null
-+++ b/arch/powerpc/boot/gamecube.c
-@@ -0,0 +1,77 @@
-+/*
-+ * arch/powerpc/boot/gamecube.c
-+ *
-+ * Nintendo GameCube/Wii platforms
-+ * Copyright (C) 2004-2009 The GameCube Linux Team
-+ * Copyright (C) 2008,2009 Albert Herranz
-+ *
-+ * This program is free software; you can redistribute it and/or
-+ * modify it under the terms of the 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 <stddef.h>
-+#include "stdio.h"
-+#include "types.h"
-+#include "io.h"
-+#include "ops.h"
-+
-+#include "ugecon.h"
-+
-+BSS_STACK(8192);
-+
-+/*
-+ * We enter with the MMU enabled and some legacy memory mappings active.
-+ *
-+ * We leave the MMU enabled, but we switch to an identity mapped memory
-+ * scheme as expected by the start code.
-+ *
-+ */
-+asm ("\n\
-+.text\n\
-+.globl _zimage_start\n\
-+_zimage_start:\n\
-+\n\
-+ isync\n\
-+ /* IBAT3,DBAT3 for first 16Mbytes */\n\
-+ li 8, 0x01ff /* 16MB */\n\
-+ li 9, 0x0002 /* rw */\n\
-+ mtspr 0x216, 8 /* IBAT3U */\n\
-+ mtspr 0x217, 9 /* IBAT3L */\n\
-+ mtspr 0x21e, 8 /* DBAT3U */\n\
-+ mtspr 0x21f, 9 /* DBAT3L */\n\
-+\n\
-+ sync\n\
-+ isync\n\
-+\n\
-+ li 3, 0\n\
-+ li 4, 0\n\
-+ li 5, 0\n\
-+\n\
-+ bcl- 20,4*cr7+so,1f\n\
-+1:\n\
-+ mflr 8\n\
-+ clrlwi 8, 8, 3\n\
-+ addi 8, 8, 2f - 1b\n\
-+ mtlr 8\n\
-+ blr\n\
-+2:\n\
-+ b _zimage_start_lib\n\
-+");
-+
-+/*
-+ *
-+ */
-+void platform_init(unsigned long r3, unsigned long r4, unsigned long r5)
-+{
-+ u32 heapsize = 16*1024*1024 - (u32)_end;
-+
-+ simple_alloc_init(_end, heapsize, 32, 64);
-+ fdt_init(_dtb_start);
-+
-+ if (!ug_grab_io_base() && ug_is_adapter_present())
-+ console_ops.write = ug_console_write;
-+}
-+
-diff --git a/arch/powerpc/boot/ugecon.c b/arch/powerpc/boot/ugecon.c
-new file mode 100644
-index 0000000..b485eab
---- /dev/null
-+++ b/arch/powerpc/boot/ugecon.c
-@@ -0,0 +1,128 @@
-+/*
-+ * arch/powerpc/boot/ugecon.c
-+ *
-+ * USB Gecko bootwrapper console.
-+ * Copyright (C) 2008-2009 The GameCube Linux Team
-+ * Copyright (C) 2008,2009 Albert Herranz
-+ *
-+ * This program is free software; you can redistribute it and/or
-+ * modify it under the terms of the 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 <stddef.h>
-+#include "stdio.h"
-+#include "types.h"
-+#include "io.h"
-+#include "ops.h"
-+
-+
-+#define EXI_CLK_32MHZ 5
-+
-+#define EXI_CSR 0x00
-+#define EXI_CSR_CLKMASK (0x7<<4)
-+#define EXI_CSR_CLK_32MHZ (EXI_CLK_32MHZ<<4)
-+#define EXI_CSR_CSMASK (0x7<<7)
-+#define EXI_CSR_CS_0 (0x1<<7) /* Chip Select 001 */
-+
-+#define EXI_CR 0x0c
-+#define EXI_CR_TSTART (1<<0)
-+#define EXI_CR_WRITE (1<<2)
-+#define EXI_CR_READ_WRITE (2<<2)
-+#define EXI_CR_TLEN(len) (((len)-1)<<4)
-+
-+#define EXI_DATA 0x10
-+
-+
-+/* virtual address base for input/output, retrieved from device tree */
-+static void *ug_io_base;
-+
-+
-+static u32 ug_io_transaction(u32 in)
-+{
-+ u32 *csr_reg = ug_io_base + EXI_CSR;
-+ u32 *data_reg = ug_io_base + EXI_DATA;
-+ u32 *cr_reg = ug_io_base + EXI_CR;
-+ u32 csr, data, cr;
-+
-+ /* select */
-+ csr = EXI_CSR_CLK_32MHZ | EXI_CSR_CS_0;
-+ out_be32(csr_reg, csr);
-+
-+ /* read/write */
-+ data = in;
-+ out_be32(data_reg, data);
-+ cr = EXI_CR_TLEN(2) | EXI_CR_READ_WRITE | EXI_CR_TSTART;
-+ out_be32(cr_reg, cr);
-+
-+ while (in_be32(cr_reg) & EXI_CR_TSTART)
-+ barrier();
-+
-+ /* deselect */
-+ out_be32(csr_reg, 0);
-+
-+ data = in_be32(data_reg);
-+ return data;
-+}
-+
-+static int ug_is_txfifo_ready(void)
-+{
-+ return ug_io_transaction(0xc0000000) & 0x04000000;
-+}
-+
-+static void ug_raw_putc(char ch)
-+{
-+ ug_io_transaction(0xb0000000 | (ch << 20));
-+}
-+
-+static void ug_putc(char ch)
-+{
-+ int count = 16;
-+
-+ if (!ug_io_base)
-+ return;
-+
-+ while (!ug_is_txfifo_ready() && count--)
-+ barrier();
-+ if (count)
-+ ug_raw_putc(ch);
-+}
-+
-+void ug_console_write(const char *buf, int len)
-+{
-+ char *b = (char *)buf;
-+
-+ while (len--) {
-+ if (*b == '\n')
-+ ug_putc('\r');
-+ ug_putc(*b++);
-+ }
-+}
-+
-+int ug_is_adapter_present(void)
-+{
-+ if (!ug_io_base)
-+ return 0;
-+
-+ return ug_io_transaction(0x90000000) == 0x04700000;
-+}
-+
-+int ug_grab_io_base(void)
-+{
-+ u32 v;
-+ void *devp;
-+
-+ devp = finddevice("/exi/usbgecko");
-+ if (devp == NULL)
-+ goto err_out;
-+ if (getprop(devp, "virtual-reg", &v, sizeof(v)) != sizeof(v))
-+ goto err_out;
-+
-+ ug_io_base = (u8 *)v;
-+ return 0;
-+
-+err_out:
-+ return -1;
-+}
-diff --git a/arch/powerpc/boot/ugecon.h b/arch/powerpc/boot/ugecon.h
-new file mode 100644
-index 0000000..1fdb590
---- /dev/null
-+++ b/arch/powerpc/boot/ugecon.h
-@@ -0,0 +1,25 @@
-+/*
-+ * arch/powerpc/boot/ugecon.h
-+ *
-+ * USB Gecko early bootwrapper console.
-+ * Copyright (C) 2008-2009 The GameCube Linux Team
-+ * Copyright (C) 2008,2009 Albert Herranz
-+ *
-+ * This program is free software; you can redistribute it and/or
-+ * modify it under the terms of the 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 __UGECON_H
-+#define __UGECON_H
-+
-+extern int ug_grab_io_base(void);
-+extern int ug_is_adapter_present(void);
-+
-+extern void ug_putc(char ch);
-+extern void ug_console_write(const char *buf, int len);
-+
-+#endif /* __UGECON_H */
-+
-diff --git a/arch/powerpc/boot/wii.c b/arch/powerpc/boot/wii.c
-new file mode 100644
-index 0000000..b702514
---- /dev/null
-+++ b/arch/powerpc/boot/wii.c
-@@ -0,0 +1,78 @@
-+/*
-+ * arch/powerpc/boot/wii.c
-+ *
-+ * Nintendo Wii platform
-+ * Copyright (C) 2004-2009 The GameCube Linux Team
-+ * Copyright (C) 2008,2009 Albert Herranz
-+ *
-+ * This program is free software; you can redistribute it and/or
-+ * modify it under the terms of the 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 <stddef.h>
-+#include "stdio.h"
-+#include "types.h"
-+#include "io.h"
-+#include "ops.h"
-+
-+#include "ugecon.h"
-+
-+
-+BSS_STACK(8192);
-+
-+/*
-+ * We enter with the MMU enabled and some legacy memory mappings active.
-+ *
-+ * We leave the MMU enabled, but we switch to an identity mapped memory
-+ * scheme as expected by the start code.
-+ *
-+ */
-+asm ("\n\
-+.text\n\
-+.globl _zimage_start\n\
-+_zimage_start:\n\
-+\n\
-+ isync\n\
-+ /* IBAT3,DBAT3 for first 16Mbytes */\n\
-+ li 8, 0x01ff /* 16MB */\n\
-+ li 9, 0x0002 /* rw */\n\
-+ mtspr 0x216, 8 /* IBAT3U */\n\
-+ mtspr 0x217, 9 /* IBAT3L */\n\
-+ mtspr 0x21e, 8 /* DBAT3U */\n\
-+ mtspr 0x21f, 9 /* DBAT3L */\n\
-+\n\
-+ sync\n\
-+ isync\n\
-+\n\
-+ li 3, 0\n\
-+ li 4, 0\n\
-+ li 5, 0\n\
-+\n\
-+ bcl- 20,4*cr7+so,1f\n\
-+1:\n\
-+ mflr 8\n\
-+ clrlwi 8, 8, 3\n\
-+ addi 8, 8, 2f - 1b\n\
-+ mtlr 8\n\
-+ blr\n\
-+2:\n\
-+ b _zimage_start_lib\n\
-+");
-+
-+/*
-+ *
-+ */
-+void platform_init(unsigned long r3, unsigned long r4, unsigned long r5)
-+{
-+ u32 heapsize = 16*1024*1024 - (u32)_end;
-+
-+ simple_alloc_init(_end, heapsize, 32, 64);
-+ fdt_init(_dtb_start);
-+
-+ if (!ug_grab_io_base() && ug_is_adapter_present())
-+ console_ops.write = ug_console_write;
-+}
-+
-diff --git a/arch/powerpc/configs/gamecube_defconfig b/arch/powerpc/configs/gamecube_defconfig
-new file mode 100644
-index 0000000..7e3e549
---- /dev/null
-+++ b/arch/powerpc/configs/gamecube_defconfig
-@@ -0,0 +1,989 @@
-+#
-+# Automatically generated make config: don't edit
-+# Linux kernel version: 2.6.28
-+# Mon Jan 12 20:23:50 2009
-+#
-+# 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_NOT_COHERENT_CACHE=y
-+CONFIG_PPC32=y
-+CONFIG_WORD_SIZE=32
-+# CONFIG_ARCH_PHYS_ADDR_T_64BIT is not set
-+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_HAVE_SETUP_PER_CPU_AREA is not set
-+CONFIG_IRQ_PER_CPU=y
-+CONFIG_STACKTRACE_SUPPORT=y
-+CONFIG_HAVE_LATENCYTOP_SUPPORT=y
-+CONFIG_LOCKDEP_SUPPORT=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_LOCK_KERNEL=y
-+CONFIG_INIT_ENV_ARG_LIMIT=32
-+CONFIG_LOCALVERSION="-isobel-gcn"
-+CONFIG_LOCALVERSION_AUTO=y
-+CONFIG_SWAP=y
-+CONFIG_SYSVIPC=y
-+CONFIG_SYSVIPC_SYSCTL=y
-+# CONFIG_POSIX_MQUEUE is not set
-+# CONFIG_BSD_PROCESS_ACCT is not set
-+# CONFIG_TASKSTATS is not set
-+# CONFIG_AUDIT is not set
-+CONFIG_IKCONFIG=y
-+CONFIG_IKCONFIG_PROC=y
-+CONFIG_LOG_BUF_SHIFT=14
-+# CONFIG_CGROUPS is not set
-+CONFIG_GROUP_SCHED=y
-+CONFIG_FAIR_GROUP_SCHED=y
-+# CONFIG_RT_GROUP_SCHED is not set
-+CONFIG_USER_SCHED=y
-+# CONFIG_CGROUP_SCHED is not set
-+CONFIG_SYSFS_DEPRECATED=y
-+CONFIG_SYSFS_DEPRECATED_V2=y
-+# CONFIG_RELAY is not set
-+# CONFIG_NAMESPACES is not set
-+CONFIG_BLK_DEV_INITRD=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 is not set
-+CONFIG_HOTPLUG=y
-+CONFIG_PRINTK=y
-+CONFIG_BUG=y
-+# CONFIG_ELF_CORE is not set
-+CONFIG_COMPAT_BRK=y
-+CONFIG_BASE_FULL=y
-+CONFIG_FUTEX=y
-+CONFIG_ANON_INODES=y
-+CONFIG_EPOLL=y
-+CONFIG_SIGNALFD=y
-+CONFIG_TIMERFD=y
-+CONFIG_EVENTFD=y
-+CONFIG_SHMEM=y
-+CONFIG_AIO=y
-+# CONFIG_VM_EVENT_COUNTERS is not set
-+CONFIG_SLAB=y
-+# CONFIG_SLUB is not set
-+# CONFIG_SLOB is not set
-+# CONFIG_PROFILING is not set
-+CONFIG_TRACEPOINTS=y
-+CONFIG_MARKERS=y
-+CONFIG_HAVE_OPROFILE=y
-+# CONFIG_KPROBES is not set
-+CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS=y
-+CONFIG_HAVE_IOREMAP_PROT=y
-+CONFIG_HAVE_KPROBES=y
-+CONFIG_HAVE_KRETPROBES=y
-+CONFIG_HAVE_ARCH_TRACEHOOK=y
-+# CONFIG_HAVE_GENERIC_DMA_COHERENT is not set
-+CONFIG_SLABINFO=y
-+CONFIG_RT_MUTEXES=y
-+# CONFIG_TINY_SHMEM is not set
-+CONFIG_BASE_SMALL=0
-+CONFIG_MODULES=y
-+# CONFIG_MODULE_FORCE_LOAD is not set
-+CONFIG_MODULE_UNLOAD=y
-+# CONFIG_MODULE_FORCE_UNLOAD 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
-+# CONFIG_BLK_DEV_INTEGRITY is not set
-+
-+#
-+# IO Schedulers
-+#
-+CONFIG_IOSCHED_NOOP=y
-+CONFIG_IOSCHED_AS=y
-+CONFIG_IOSCHED_DEADLINE=y
-+CONFIG_IOSCHED_CFQ=y
-+CONFIG_DEFAULT_AS=y
-+# CONFIG_DEFAULT_DEADLINE is not set
-+# CONFIG_DEFAULT_CFQ is not set
-+# CONFIG_DEFAULT_NOOP is not set
-+CONFIG_DEFAULT_IOSCHED="anticipatory"
-+CONFIG_CLASSIC_RCU=y
-+# CONFIG_FREEZER is not set
-+
-+#
-+# Platform support
-+#
-+CONFIG_PPC_MULTIPLATFORM=y
-+CONFIG_CLASSIC32=y
-+# CONFIG_PPC_CHRP is not set
-+# CONFIG_MPC5121_ADS is not set
-+# CONFIG_MPC5121_GENERIC is not set
-+# CONFIG_PPC_MPC52xx is not set
-+# CONFIG_PPC_PMAC is not set
-+# CONFIG_PPC_CELL is not set
-+# CONFIG_PPC_CELL_NATIVE is not set
-+# CONFIG_PPC_82xx is not set
-+# CONFIG_PQ2ADS is not set
-+# CONFIG_PPC_83xx is not set
-+# CONFIG_PPC_86xx is not set
-+CONFIG_EMBEDDED6xx=y
-+# CONFIG_LINKSTATION is not set
-+# CONFIG_STORCENTER is not set
-+# CONFIG_MPC7448HPC2 is not set
-+# CONFIG_PPC_HOLLY is not set
-+# CONFIG_PPC_PRPMC2800 is not set
-+# CONFIG_PPC_C2K is not set
-+CONFIG_GAMECUBE=y
-+# CONFIG_WII is not set
-+CONFIG_FLIPPER_PIC=y
-+CONFIG_GAMECUBE_COMMON=y
-+CONFIG_GAMECUBE_RSW=y
-+CONFIG_GAMECUBE_UDBG=y
-+CONFIG_USBGECKO_UDBG=y
-+# CONFIG_GAMECUBE_VIDEO_UDBG is not set
-+# CONFIG_IPIC 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_FSL_ULI1575 is not set
-+
-+#
-+# Kernel options
-+#
-+# CONFIG_HIGHMEM 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_SCHED_HRTICK is not set
-+# CONFIG_PREEMPT_NONE is not set
-+# CONFIG_PREEMPT_VOLUNTARY is not set
-+CONFIG_PREEMPT=y
-+# CONFIG_PREEMPT_RCU is not set
-+CONFIG_BINFMT_ELF=y
-+# CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS is not set
-+# CONFIG_HAVE_AOUT is not set
-+CONFIG_BINFMT_MISC=m
-+# CONFIG_IOMMU_HELPER is not set
-+CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y
-+CONFIG_ARCH_HAS_WALK_MEMORY=y
-+CONFIG_ARCH_ENABLE_MEMORY_HOTREMOVE=y
-+CONFIG_KEXEC=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_PAGEFLAGS_EXTENDED=y
-+CONFIG_SPLIT_PTLOCK_CPUS=4
-+# CONFIG_MIGRATION is not set
-+# CONFIG_RESOURCES_64BIT is not set
-+# CONFIG_PHYS_ADDR_T_64BIT is not set
-+CONFIG_ZONE_DMA_FLAG=1
-+CONFIG_BOUNCE=y
-+CONFIG_VIRT_TO_BUS=y
-+CONFIG_UNEVICTABLE_LRU=y
-+CONFIG_FORCE_MAX_ZONEORDER=11
-+CONFIG_PROC_DEVICETREE=y
-+# CONFIG_CMDLINE_BOOL is not set
-+CONFIG_EXTRA_TARGETS=""
-+# CONFIG_PM is not set
-+# CONFIG_SECCOMP is not set
-+CONFIG_ISA_DMA_API=y
-+
-+#
-+# Bus options
-+#
-+CONFIG_ZONE_DMA=y
-+CONFIG_GENERIC_ISA_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_PCCARD is not set
-+# CONFIG_HAS_RAPIDIO is not set
-+
-+#
-+# Advanced setup
-+#
-+CONFIG_ADVANCED_OPTIONS=y
-+# CONFIG_LOWMEM_SIZE_BOOL is not set
-+CONFIG_LOWMEM_SIZE=0x30000000
-+# CONFIG_PAGE_OFFSET_BOOL is not set
-+CONFIG_PAGE_OFFSET=0xc0000000
-+# CONFIG_KERNEL_START_BOOL is not set
-+CONFIG_KERNEL_START=0xc0000000
-+CONFIG_PHYSICAL_START=0x00000000
-+# CONFIG_TASK_SIZE_BOOL is not set
-+CONFIG_TASK_SIZE=0xc0000000
-+# CONFIG_CONSISTENT_START_BOOL is not set
-+CONFIG_CONSISTENT_START=0xff100000
-+# CONFIG_CONSISTENT_SIZE_BOOL is not set
-+CONFIG_CONSISTENT_SIZE=0x00200000
-+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=y
-+# CONFIG_NET_IPIP is not set
-+# CONFIG_NET_IPGRE is not set
-+# CONFIG_ARPD is not set
-+# CONFIG_SYN_COOKIES is not set
-+# CONFIG_INET_AH is not set
-+# CONFIG_INET_ESP is not set
-+# CONFIG_INET_IPCOMP is not set
-+# CONFIG_INET_XFRM_TUNNEL is not set
-+# CONFIG_INET_TUNNEL is not set
-+# CONFIG_INET_XFRM_MODE_TRANSPORT is not set
-+# CONFIG_INET_XFRM_MODE_TUNNEL is not set
-+# CONFIG_INET_XFRM_MODE_BEET is not set
-+# CONFIG_INET_LRO is not set
-+# CONFIG_INET_DIAG is not set
-+# CONFIG_TCP_CONG_ADVANCED is not set
-+CONFIG_TCP_CONG_CUBIC=y
-+CONFIG_DEFAULT_TCP_CONG="cubic"
-+# CONFIG_TCP_MD5SIG is not set
-+# CONFIG_IPV6 is not set
-+# CONFIG_NETWORK_SECMARK is not set
-+# CONFIG_NETFILTER is not set
-+# CONFIG_IP_DCCP is not set
-+# CONFIG_IP_SCTP is not set
-+# CONFIG_TIPC is not set
-+# CONFIG_ATM is not set
-+# CONFIG_BRIDGE is not set
-+# CONFIG_NET_DSA is not set
-+# CONFIG_VLAN_8021Q is not set
-+# CONFIG_DECNET is not set
-+# CONFIG_LLC2 is not set
-+# CONFIG_IPX is not set
-+# CONFIG_ATALK is not set
-+# CONFIG_X25 is not set
-+# CONFIG_LAPB is not set
-+# CONFIG_ECONET is not set
-+# CONFIG_WAN_ROUTER is not set
-+# CONFIG_NET_SCHED is not set
-+
-+#
-+# Network testing
-+#
-+# CONFIG_NET_PKTGEN is not set
-+# CONFIG_HAMRADIO is not set
-+# CONFIG_CAN is not set
-+# CONFIG_IRDA is not set
-+# CONFIG_BT is not set
-+# CONFIG_AF_RXRPC is not set
-+# CONFIG_PHONET is not set
-+# CONFIG_WIRELESS 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 is not set
-+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_GAMECUBE_DI=y
-+CONFIG_GAMECUBE_ARAM=y
-+CONFIG_GAMECUBE_SD=y
-+# CONFIG_BLK_DEV_COW_COMMON is not set
-+CONFIG_BLK_DEV_LOOP=y
-+# CONFIG_BLK_DEV_CRYPTOLOOP is not set
-+CONFIG_BLK_DEV_NBD=m
-+CONFIG_BLK_DEV_RAM=y
-+CONFIG_BLK_DEV_RAM_COUNT=2
-+CONFIG_BLK_DEV_RAM_SIZE=4096
-+# CONFIG_BLK_DEV_XIP is not set
-+# CONFIG_CDROM_PKTCDVD is not set
-+# CONFIG_ATA_OVER_ETH is not set
-+# CONFIG_BLK_DEV_HD is not set
-+CONFIG_MISC_DEVICES=y
-+CONFIG_GAMECUBE_GQR=y
-+# CONFIG_EEPROM_93CX6 is not set
-+# CONFIG_ENCLOSURE_SERVICES is not set
-+# CONFIG_C2PORT is not set
-+CONFIG_HAVE_IDE=y
-+# CONFIG_IDE is not set
-+
-+#
-+# SCSI device support
-+#
-+# CONFIG_RAID_ATTRS is not set
-+# CONFIG_SCSI is not set
-+# CONFIG_SCSI_DMA is not set
-+# CONFIG_SCSI_NETLINK is not set
-+# CONFIG_ATA is not set
-+# CONFIG_MD is not set
-+# CONFIG_MACINTOSH_DRIVERS is not set
-+CONFIG_NETDEVICES=y
-+# CONFIG_DUMMY is not set
-+# CONFIG_BONDING is not set
-+# CONFIG_MACVLAN is not set
-+# CONFIG_EQUALIZER is not set
-+# CONFIG_TUN is not set
-+# CONFIG_VETH is not set
-+# CONFIG_PHYLIB is not set
-+CONFIG_NET_ETHERNET=y
-+# CONFIG_MII is not set
-+CONFIG_GAMECUBE_BBA=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_IBM_NEW_EMAC_NO_FLOW_CTRL is not set
-+# CONFIG_IBM_NEW_EMAC_MAL_CLR_ICINTSTAT is not set
-+# CONFIG_IBM_NEW_EMAC_MAL_COMMON_ERR is not set
-+# CONFIG_B44 is not set
-+# CONFIG_NETDEV_1000 is not set
-+# CONFIG_NETDEV_10000 is not set
-+
-+#
-+# Wireless LAN
-+#
-+# CONFIG_WLAN_PRE80211 is not set
-+# CONFIG_WLAN_80211 is not set
-+# CONFIG_IWLWIFI_LEDS is not set
-+# CONFIG_WAN is not set
-+# CONFIG_PPP is not set
-+# CONFIG_SLIP is not set
-+# CONFIG_NETCONSOLE is not set
-+# CONFIG_NETPOLL is not set
-+# CONFIG_NET_POLL_CONTROLLER is not set
-+# CONFIG_ISDN is not set
-+# 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=y
-+CONFIG_INPUT_EVDEV=y
-+# CONFIG_INPUT_EVBUG is not set
-+
-+#
-+# Input Device Drivers
-+#
-+CONFIG_INPUT_KEYBOARD=y
-+# CONFIG_KEYBOARD_ATKBD is not set
-+# CONFIG_KEYBOARD_SUNKBD is not set
-+# CONFIG_KEYBOARD_LKKBD is not set
-+# CONFIG_KEYBOARD_XTKBD is not set
-+# CONFIG_KEYBOARD_NEWTON is not set
-+# CONFIG_KEYBOARD_STOWAWAY is not set
-+# CONFIG_INPUT_MOUSE is not set
-+CONFIG_INPUT_JOYSTICK=y
-+# CONFIG_JOYSTICK_ANALOG is not set
-+# CONFIG_JOYSTICK_A3D is not set
-+# CONFIG_JOYSTICK_ADI is not set
-+# CONFIG_JOYSTICK_COBRA is not set
-+# CONFIG_JOYSTICK_GF2K is not set
-+# CONFIG_JOYSTICK_GRIP is not set
-+# CONFIG_JOYSTICK_GRIP_MP is not set
-+# CONFIG_JOYSTICK_GUILLEMOT is not set
-+# CONFIG_JOYSTICK_INTERACT is not set
-+# CONFIG_JOYSTICK_SIDEWINDER is not set
-+# CONFIG_JOYSTICK_TMDC is not set
-+# CONFIG_JOYSTICK_IFORCE is not set
-+# CONFIG_JOYSTICK_WARRIOR is not set
-+# CONFIG_JOYSTICK_MAGELLAN is not set
-+# CONFIG_JOYSTICK_SPACEORB is not set
-+# CONFIG_JOYSTICK_SPACEBALL is not set
-+# CONFIG_JOYSTICK_STINGER is not set
-+# CONFIG_JOYSTICK_TWIDJOY is not set
-+# CONFIG_JOYSTICK_ZHENHUA is not set
-+# CONFIG_JOYSTICK_JOYDUMP 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 is not set
-+# CONFIG_SERIO_SERPORT is not set
-+# CONFIG_SERIO_LIBPS2 is not set
-+# CONFIG_SERIO_RAW is not set
-+# CONFIG_SERIO_XILINX_XPS_PS2 is not set
-+# CONFIG_GAMEPORT is not set
-+CONFIG_GAMECUBE_SI=y
-+
-+#
-+# Character devices
-+#
-+CONFIG_VT=y
-+CONFIG_CONSOLE_TRANSLATIONS=y
-+CONFIG_VT_CONSOLE=y
-+CONFIG_HW_CONSOLE=y
-+# CONFIG_VT_HW_CONSOLE_BINDING is not set
-+# CONFIG_DEVKMEM 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_USBGECKO is not set
-+CONFIG_UNIX98_PTYS=y
-+CONFIG_LEGACY_PTYS=y
-+CONFIG_LEGACY_PTY_COUNT=64
-+# CONFIG_IPMI_HANDLER is not set
-+# CONFIG_HW_RANDOM is not set
-+# CONFIG_NVRAM is not set
-+# CONFIG_R3964 is not set
-+# CONFIG_RAW_DRIVER is not set
-+# CONFIG_TCG_TPM is not set
-+# CONFIG_I2C is not set
-+
-+#
-+# EXI support
-+#
-+CONFIG_GAMECUBE_EXI=y
-+# CONFIG_SPI is not set
-+CONFIG_ARCH_WANT_OPTIONAL_GPIOLIB=y
-+# CONFIG_GPIOLIB is not set
-+# CONFIG_W1 is not set
-+# CONFIG_POWER_SUPPLY is not set
-+# CONFIG_HWMON is not set
-+# CONFIG_THERMAL is not set
-+# CONFIG_THERMAL_HWMON is not set
-+# CONFIG_WATCHDOG is not set
-+CONFIG_SSB_POSSIBLE=y
-+
-+#
-+# Sonics Silicon Backplane
-+#
-+# CONFIG_SSB is not set
-+
-+#
-+# Multifunction device drivers
-+#
-+# CONFIG_MFD_CORE is not set
-+# CONFIG_MFD_SM501 is not set
-+# CONFIG_HTC_PASIC3 is not set
-+# CONFIG_MFD_TMIO is not set
-+# CONFIG_REGULATOR is not set
-+
-+#
-+# Multimedia devices
-+#
-+
-+#
-+# Multimedia core support
-+#
-+# CONFIG_VIDEO_DEV is not set
-+# CONFIG_DVB_CORE is not set
-+# CONFIG_VIDEO_MEDIA is not set
-+
-+#
-+# Multimedia drivers
-+#
-+# CONFIG_DAB is not set
-+
-+#
-+# Graphics support
-+#
-+# CONFIG_VGASTATE is not set
-+# CONFIG_VIDEO_OUTPUT_CONTROL is not set
-+CONFIG_FB=y
-+# CONFIG_FIRMWARE_EDID is not set
-+# CONFIG_FB_DDC is not set
-+# CONFIG_FB_BOOT_VESA_SUPPORT is not set
-+CONFIG_FB_CFB_FILLRECT=y
-+CONFIG_FB_CFB_COPYAREA=y
-+CONFIG_FB_CFB_IMAGEBLIT=y
-+# CONFIG_FB_CFB_REV_PIXELS_IN_BYTE is not set
-+# CONFIG_FB_SYS_FILLRECT is not set
-+# CONFIG_FB_SYS_COPYAREA is not set
-+# CONFIG_FB_SYS_IMAGEBLIT is not set
-+# CONFIG_FB_FOREIGN_ENDIAN is not set
-+# CONFIG_FB_SYS_FOPS is not set
-+# CONFIG_FB_SVGALIB is not set
-+# CONFIG_FB_MACMODES is not set
-+# CONFIG_FB_BACKLIGHT is not set
-+# CONFIG_FB_MODE_HELPERS is not set
-+# CONFIG_FB_TILEBLITTING is not set
-+
-+#
-+# Frame buffer hardware drivers
-+#
-+# CONFIG_FB_OF is not set
-+# CONFIG_FB_VGA16 is not set
-+# CONFIG_FB_S1D13XXX is not set
-+CONFIG_FB_GAMECUBE=y
-+# CONFIG_FB_IBM_GXT4500 is not set
-+# CONFIG_FB_VIRTUAL is not set
-+# CONFIG_FB_METRONOME is not set
-+# CONFIG_FB_MB862XX is not set
-+# CONFIG_BACKLIGHT_LCD_SUPPORT is not set
-+
-+#
-+# Display device support
-+#
-+# CONFIG_DISPLAY_SUPPORT is not set
-+
-+#
-+# Console display driver support
-+#
-+# CONFIG_VGA_CONSOLE is not set
-+CONFIG_DUMMY_CONSOLE=y
-+CONFIG_FRAMEBUFFER_CONSOLE=y
-+# CONFIG_FRAMEBUFFER_CONSOLE_DETECT_PRIMARY is not set
-+# CONFIG_FRAMEBUFFER_CONSOLE_ROTATION is not set
-+# CONFIG_FONTS is not set
-+CONFIG_FONT_8x8=y
-+CONFIG_FONT_8x16=y
-+CONFIG_LOGO=y
-+# CONFIG_LOGO_LINUX_MONO is not set
-+# CONFIG_LOGO_LINUX_VGA16 is not set
-+# CONFIG_LOGO_LINUX_CLUT224 is not set
-+CONFIG_LOGO_GAMECUBE_CLUT224=y
-+CONFIG_SOUND=y
-+CONFIG_SOUND_OSS_CORE=y
-+CONFIG_SND=y
-+CONFIG_SND_TIMER=y
-+CONFIG_SND_PCM=y
-+CONFIG_SND_SEQUENCER=y
-+# CONFIG_SND_SEQ_DUMMY is not set
-+CONFIG_SND_OSSEMUL=y
-+CONFIG_SND_MIXER_OSS=y
-+CONFIG_SND_PCM_OSS=y
-+CONFIG_SND_PCM_OSS_PLUGINS=y
-+CONFIG_SND_SEQUENCER_OSS=y
-+# CONFIG_SND_DYNAMIC_MINORS is not set
-+CONFIG_SND_SUPPORT_OLD_API=y
-+# CONFIG_SND_VERBOSE_PROCFS is not set
-+# CONFIG_SND_VERBOSE_PRINTK is not set
-+# CONFIG_SND_DEBUG is not set
-+CONFIG_SND_DRIVERS=y
-+# CONFIG_SND_DUMMY is not set
-+# CONFIG_SND_VIRMIDI is not set
-+# CONFIG_SND_MTPAV is not set
-+# CONFIG_SND_SERIAL_U16550 is not set
-+# CONFIG_SND_MPU401 is not set
-+CONFIG_SND_PPC=y
-+CONFIG_SND_GAMECUBE=y
-+CONFIG_SND_GAMECUBE_MIC=m
-+# CONFIG_SND_SOC is not set
-+# CONFIG_SOUND_PRIME is not set
-+CONFIG_HID_SUPPORT=y
-+CONFIG_HID=y
-+# CONFIG_HID_DEBUG is not set
-+# CONFIG_HIDRAW is not set
-+# CONFIG_HID_PID is not set
-+
-+#
-+# Special HID drivers
-+#
-+CONFIG_HID_COMPAT=y
-+# CONFIG_USB_SUPPORT is not set
-+# CONFIG_MMC is not set
-+# CONFIG_MEMSTICK is not set
-+# CONFIG_NEW_LEDS is not set
-+# CONFIG_ACCESSIBILITY 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
-+
-+#
-+# SPI RTC drivers
-+#
-+
-+#
-+# Platform RTC drivers
-+#
-+# CONFIG_RTC_DRV_CMOS is not set
-+# CONFIG_RTC_DRV_DS1286 is not set
-+# CONFIG_RTC_DRV_DS1511 is not set
-+# CONFIG_RTC_DRV_DS1553 is not set
-+# CONFIG_RTC_DRV_DS1742 is not set
-+# CONFIG_RTC_DRV_STK17TA8 is not set
-+# CONFIG_RTC_DRV_M48T86 is not set
-+# CONFIG_RTC_DRV_M48T35 is not set
-+# CONFIG_RTC_DRV_M48T59 is not set
-+# CONFIG_RTC_DRV_BQ4802 is not set
-+# CONFIG_RTC_DRV_V3020 is not set
-+CONFIG_RTC_DRV_GCN=y
-+
-+#
-+# on-CPU RTC drivers
-+#
-+# CONFIG_RTC_DRV_PPC is not set
-+# CONFIG_DMADEVICES is not set
-+# CONFIG_UIO is not set
-+# CONFIG_STAGING is not set
-+
-+#
-+# File systems
-+#
-+CONFIG_EXT2_FS=y
-+# CONFIG_EXT2_FS_XATTR is not set
-+# CONFIG_EXT2_FS_XIP is not set
-+CONFIG_EXT3_FS=y
-+# CONFIG_EXT3_FS_XATTR is not set
-+# CONFIG_EXT4_FS is not set
-+CONFIG_JBD=y
-+# CONFIG_JBD_DEBUG is not set
-+# CONFIG_REISERFS_FS is not set
-+# CONFIG_JFS_FS is not set
-+# CONFIG_FS_POSIX_ACL is not set
-+CONFIG_FILE_LOCKING=y
-+# CONFIG_XFS_FS is not set
-+# CONFIG_OCFS2_FS is not set
-+CONFIG_DNOTIFY=y
-+CONFIG_INOTIFY=y
-+CONFIG_INOTIFY_USER=y
-+# CONFIG_QUOTA is not set
-+# CONFIG_AUTOFS_FS is not set
-+# CONFIG_AUTOFS4_FS is not set
-+# CONFIG_FUSE_FS is not set
-+
-+#
-+# CD-ROM/DVD Filesystems
-+#
-+CONFIG_ISO9660_FS=y
-+CONFIG_JOLIET=y
-+# CONFIG_ZISOFS is not set
-+# CONFIG_UDF_FS is not set
-+# CONFIG_GCDVD_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_PROC_PAGE_MONITOR is not set
-+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_MINIX_FS is not set
-+# CONFIG_OMFS_FS is not set
-+# CONFIG_HPFS_FS is not set
-+# CONFIG_QNX4FS_FS is not set
-+# CONFIG_ROMFS_FS is not set
-+# CONFIG_SYSV_FS is not set
-+# CONFIG_UFS_FS is not set
-+CONFIG_NETWORK_FILESYSTEMS=y
-+CONFIG_NFS_FS=y
-+CONFIG_NFS_V3=y
-+# CONFIG_NFS_V3_ACL is not set
-+# CONFIG_NFS_V4 is not set
-+CONFIG_ROOT_NFS=y
-+# CONFIG_NFSD is not set
-+CONFIG_LOCKD=y
-+CONFIG_LOCKD_V4=y
-+CONFIG_NFS_COMMON=y
-+CONFIG_SUNRPC=y
-+# CONFIG_SUNRPC_REGISTER_V4 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=y
-+# CONFIG_CIFS_STATS is not set
-+# CONFIG_CIFS_WEAK_PW_HASH is not set
-+# CONFIG_CIFS_XATTR is not set
-+# CONFIG_CIFS_DEBUG2 is not set
-+# CONFIG_CIFS_EXPERIMENTAL 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
-+
-+#
-+# Library routines
-+#
-+CONFIG_BITREVERSE=y
-+CONFIG_CRC_CCITT=y
-+# CONFIG_CRC16 is not set
-+# CONFIG_CRC_T10DIF is not set
-+# CONFIG_CRC_ITU_T is not set
-+CONFIG_CRC32=y
-+# CONFIG_CRC7 is not set
-+# CONFIG_LIBCRC32C is not set
-+CONFIG_PLIST=y
-+CONFIG_HAS_IOMEM=y
-+CONFIG_HAS_IOPORT=y
-+CONFIG_HAS_DMA=y
-+CONFIG_HAVE_LMB=y
-+
-+#
-+# Kernel hacking
-+#
-+# CONFIG_PRINTK_TIME is not set
-+CONFIG_ENABLE_WARN_DEPRECATED=y
-+CONFIG_ENABLE_MUST_CHECK=y
-+CONFIG_FRAME_WARN=1024
-+# CONFIG_MAGIC_SYSRQ is not set
-+# CONFIG_UNUSED_SYMBOLS is not set
-+CONFIG_DEBUG_FS=y
-+# CONFIG_HEADERS_CHECK is not set
-+CONFIG_DEBUG_KERNEL=y
-+# CONFIG_DEBUG_SHIRQ is not set
-+CONFIG_DETECT_SOFTLOCKUP=y
-+# CONFIG_BOOTPARAM_SOFTLOCKUP_PANIC is not set
-+CONFIG_BOOTPARAM_SOFTLOCKUP_PANIC_VALUE=0
-+CONFIG_SCHED_DEBUG=y
-+CONFIG_SCHEDSTATS=y
-+# CONFIG_TIMER_STATS is not set
-+# CONFIG_DEBUG_OBJECTS 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=y
-+CONFIG_DEBUG_MUTEXES=y
-+# CONFIG_DEBUG_SPINLOCK_SLEEP is not set
-+# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set
-+CONFIG_STACKTRACE=y
-+# CONFIG_DEBUG_KOBJECT is not set
-+CONFIG_DEBUG_BUGVERBOSE=y
-+# CONFIG_DEBUG_INFO is not set
-+# CONFIG_DEBUG_VM is not set
-+# CONFIG_DEBUG_WRITECOUNT is not set
-+# CONFIG_DEBUG_MEMORY_INIT is not set
-+# CONFIG_DEBUG_LIST is not set
-+# CONFIG_DEBUG_SG is not set
-+# CONFIG_BOOT_PRINTK_DELAY is not set
-+# CONFIG_RCU_TORTURE_TEST is not set
-+# CONFIG_RCU_CPU_STALL_DETECTOR is not set
-+# CONFIG_BACKTRACE_SELF_TEST is not set
-+# CONFIG_DEBUG_BLOCK_EXT_DEVT is not set
-+# CONFIG_FAULT_INJECTION is not set
-+CONFIG_LATENCYTOP=y
-+CONFIG_SYSCTL_SYSCALL_CHECK=y
-+CONFIG_NOP_TRACER=y
-+CONFIG_HAVE_FUNCTION_TRACER=y
-+CONFIG_RING_BUFFER=y
-+CONFIG_TRACING=y
-+
-+#
-+# Tracers
-+#
-+# CONFIG_FUNCTION_TRACER is not set
-+# CONFIG_PREEMPT_TRACER is not set
-+# CONFIG_SCHED_TRACER is not set
-+CONFIG_CONTEXT_SWITCH_TRACER=y
-+CONFIG_BOOT_TRACER=y
-+# CONFIG_STACK_TRACER is not set
-+# CONFIG_DYNAMIC_PRINTK_DEBUG is not set
-+# CONFIG_SAMPLES is not set
-+CONFIG_HAVE_ARCH_KGDB=y
-+# CONFIG_KGDB is not set
-+# CONFIG_DEBUG_STACKOVERFLOW is not set
-+# CONFIG_DEBUG_STACK_USAGE is not set
-+# CONFIG_DEBUG_PAGEALLOC is not set
-+# CONFIG_CODE_PATCHING_SELFTEST is not set
-+# CONFIG_FTR_FIXUP_SELFTEST is not set
-+# CONFIG_MSI_BITMAP_SELFTEST is not set
-+# CONFIG_XMON is not set
-+# CONFIG_IRQSTACKS is not set
-+# CONFIG_VIRQ_DEBUG is not set
-+# CONFIG_BDI_SWITCH 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 is not set
-+# CONFIG_PPC_EARLY_DEBUG_44x is not set
-+# CONFIG_PPC_EARLY_DEBUG_40x is not set
-+# CONFIG_PPC_EARLY_DEBUG_CPM is not set
-+CONFIG_PPC_EARLY_DEBUG_USBGECKO=y
-+
-+#
-+# Security options
-+#
-+# CONFIG_KEYS is not set
-+# CONFIG_SECURITY is not set
-+# CONFIG_SECURITYFS is not set
-+# CONFIG_SECURITY_FILE_CAPABILITIES is not set
-+# CONFIG_CRYPTO is not set
-+# CONFIG_PPC_CLOCK is not set
-+# CONFIG_VIRTUALIZATION is not set
-diff --git a/arch/powerpc/configs/wii_defconfig b/arch/powerpc/configs/wii_defconfig
-new file mode 100644
-index 0000000..64d7f19
---- /dev/null
-+++ b/arch/powerpc/configs/wii_defconfig
-@@ -0,0 +1,1224 @@
-+#
-+# Automatically generated make config: don't edit
-+# Linux kernel version: 2.6.28
-+# Mon Jan 12 20:19:45 2009
-+#
-+# 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_NOT_COHERENT_CACHE=y
-+CONFIG_PPC32=y
-+CONFIG_WORD_SIZE=32
-+# CONFIG_ARCH_PHYS_ADDR_T_64BIT is not set
-+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_HAVE_SETUP_PER_CPU_AREA is not set
-+CONFIG_IRQ_PER_CPU=y
-+CONFIG_STACKTRACE_SUPPORT=y
-+CONFIG_HAVE_LATENCYTOP_SUPPORT=y
-+CONFIG_LOCKDEP_SUPPORT=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_GENERIC_GPIO=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_LOCK_KERNEL=y
-+CONFIG_INIT_ENV_ARG_LIMIT=32
-+CONFIG_LOCALVERSION="-isobel-wii"
-+CONFIG_LOCALVERSION_AUTO=y
-+CONFIG_SWAP=y
-+CONFIG_SYSVIPC=y
-+CONFIG_SYSVIPC_SYSCTL=y
-+# CONFIG_POSIX_MQUEUE is not set
-+# CONFIG_BSD_PROCESS_ACCT is not set
-+# CONFIG_TASKSTATS is not set
-+# CONFIG_AUDIT is not set
-+CONFIG_IKCONFIG=y
-+CONFIG_IKCONFIG_PROC=y
-+CONFIG_LOG_BUF_SHIFT=14
-+# CONFIG_CGROUPS is not set
-+CONFIG_GROUP_SCHED=y
-+CONFIG_FAIR_GROUP_SCHED=y
-+# CONFIG_RT_GROUP_SCHED is not set
-+CONFIG_USER_SCHED=y
-+# CONFIG_CGROUP_SCHED is not set
-+CONFIG_SYSFS_DEPRECATED=y
-+CONFIG_SYSFS_DEPRECATED_V2=y
-+# CONFIG_RELAY is not set
-+# CONFIG_NAMESPACES is not set
-+CONFIG_BLK_DEV_INITRD=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 is not set
-+CONFIG_HOTPLUG=y
-+CONFIG_PRINTK=y
-+CONFIG_BUG=y
-+# CONFIG_ELF_CORE is not set
-+CONFIG_COMPAT_BRK=y
-+CONFIG_BASE_FULL=y
-+CONFIG_FUTEX=y
-+CONFIG_ANON_INODES=y
-+CONFIG_EPOLL=y
-+CONFIG_SIGNALFD=y
-+CONFIG_TIMERFD=y
-+CONFIG_EVENTFD=y
-+CONFIG_SHMEM=y
-+CONFIG_AIO=y
-+# CONFIG_VM_EVENT_COUNTERS is not set
-+CONFIG_SLAB=y
-+# CONFIG_SLUB is not set
-+# CONFIG_SLOB is not set
-+# CONFIG_PROFILING is not set
-+CONFIG_TRACEPOINTS=y
-+CONFIG_MARKERS=y
-+CONFIG_HAVE_OPROFILE=y
-+# CONFIG_KPROBES is not set
-+CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS=y
-+CONFIG_HAVE_IOREMAP_PROT=y
-+CONFIG_HAVE_KPROBES=y
-+CONFIG_HAVE_KRETPROBES=y
-+CONFIG_HAVE_ARCH_TRACEHOOK=y
-+# CONFIG_HAVE_GENERIC_DMA_COHERENT is not set
-+CONFIG_SLABINFO=y
-+CONFIG_RT_MUTEXES=y
-+# CONFIG_TINY_SHMEM is not set
-+CONFIG_BASE_SMALL=0
-+CONFIG_MODULES=y
-+# CONFIG_MODULE_FORCE_LOAD is not set
-+CONFIG_MODULE_UNLOAD=y
-+# CONFIG_MODULE_FORCE_UNLOAD 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
-+# CONFIG_BLK_DEV_INTEGRITY is not set
-+
-+#
-+# IO Schedulers
-+#
-+CONFIG_IOSCHED_NOOP=y
-+CONFIG_IOSCHED_AS=y
-+CONFIG_IOSCHED_DEADLINE=y
-+CONFIG_IOSCHED_CFQ=y
-+CONFIG_DEFAULT_AS=y
-+# CONFIG_DEFAULT_DEADLINE is not set
-+# CONFIG_DEFAULT_CFQ is not set
-+# CONFIG_DEFAULT_NOOP is not set
-+CONFIG_DEFAULT_IOSCHED="anticipatory"
-+CONFIG_CLASSIC_RCU=y
-+# CONFIG_FREEZER is not set
-+
-+#
-+# Platform support
-+#
-+CONFIG_PPC_MULTIPLATFORM=y
-+CONFIG_CLASSIC32=y
-+# CONFIG_PPC_CHRP is not set
-+# CONFIG_MPC5121_ADS is not set
-+# CONFIG_MPC5121_GENERIC is not set
-+# CONFIG_PPC_MPC52xx is not set
-+# CONFIG_PPC_PMAC is not set
-+# CONFIG_PPC_CELL is not set
-+# CONFIG_PPC_CELL_NATIVE is not set
-+# CONFIG_PPC_82xx is not set
-+# CONFIG_PQ2ADS is not set
-+# CONFIG_PPC_83xx is not set
-+# CONFIG_PPC_86xx is not set
-+CONFIG_EMBEDDED6xx=y
-+# CONFIG_LINKSTATION is not set
-+# CONFIG_STORCENTER is not set
-+# CONFIG_MPC7448HPC2 is not set
-+# CONFIG_PPC_HOLLY is not set
-+# CONFIG_PPC_PRPMC2800 is not set
-+# CONFIG_PPC_C2K is not set
-+# CONFIG_GAMECUBE is not set
-+CONFIG_WII=y
-+CONFIG_FLIPPER_PIC=y
-+CONFIG_GAMECUBE_COMMON=y
-+CONFIG_GAMECUBE_RSW=y
-+CONFIG_GAMECUBE_UDBG=y
-+CONFIG_USBGECKO_UDBG=y
-+# CONFIG_GAMECUBE_VIDEO_UDBG is not set
-+CONFIG_WII_GPIO=y
-+# CONFIG_IPIC 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_FSL_ULI1575 is not set
-+
-+#
-+# Kernel options
-+#
-+# CONFIG_HIGHMEM 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_SCHED_HRTICK is not set
-+# CONFIG_PREEMPT_NONE is not set
-+# CONFIG_PREEMPT_VOLUNTARY is not set
-+CONFIG_PREEMPT=y
-+# CONFIG_PREEMPT_RCU is not set
-+CONFIG_BINFMT_ELF=y
-+# CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS is not set
-+# CONFIG_HAVE_AOUT is not set
-+CONFIG_BINFMT_MISC=m
-+# CONFIG_IOMMU_HELPER is not set
-+CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y
-+CONFIG_ARCH_HAS_WALK_MEMORY=y
-+CONFIG_ARCH_ENABLE_MEMORY_HOTREMOVE=y
-+CONFIG_KEXEC=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_PAGEFLAGS_EXTENDED=y
-+CONFIG_SPLIT_PTLOCK_CPUS=4
-+# CONFIG_MIGRATION is not set
-+# CONFIG_RESOURCES_64BIT is not set
-+# CONFIG_PHYS_ADDR_T_64BIT is not set
-+CONFIG_ZONE_DMA_FLAG=1
-+CONFIG_BOUNCE=y
-+CONFIG_VIRT_TO_BUS=y
-+CONFIG_UNEVICTABLE_LRU=y
-+CONFIG_FORCE_MAX_ZONEORDER=11
-+CONFIG_PROC_DEVICETREE=y
-+# CONFIG_CMDLINE_BOOL is not set
-+CONFIG_EXTRA_TARGETS=""
-+# CONFIG_PM is not set
-+# CONFIG_SECCOMP is not set
-+CONFIG_ISA_DMA_API=y
-+
-+#
-+# Bus options
-+#
-+CONFIG_ZONE_DMA=y
-+CONFIG_GENERIC_ISA_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_PCCARD is not set
-+# CONFIG_HAS_RAPIDIO is not set
-+
-+#
-+# Advanced setup
-+#
-+CONFIG_ADVANCED_OPTIONS=y
-+# CONFIG_LOWMEM_SIZE_BOOL is not set
-+CONFIG_LOWMEM_SIZE=0x30000000
-+# CONFIG_PAGE_OFFSET_BOOL is not set
-+CONFIG_PAGE_OFFSET=0xc0000000
-+# CONFIG_KERNEL_START_BOOL is not set
-+CONFIG_KERNEL_START=0xc0000000
-+CONFIG_PHYSICAL_START=0x00000000
-+# CONFIG_TASK_SIZE_BOOL is not set
-+CONFIG_TASK_SIZE=0xc0000000
-+# CONFIG_CONSISTENT_START_BOOL is not set
-+CONFIG_CONSISTENT_START=0xff100000
-+# CONFIG_CONSISTENT_SIZE_BOOL is not set
-+CONFIG_CONSISTENT_SIZE=0x00200000
-+CONFIG_NET=y
-+
-+#
-+# Networking options
-+#
-+CONFIG_PACKET=y
-+# CONFIG_PACKET_MMAP is not set
-+CONFIG_UNIX=y
-+# CONFIG_NET_KEY is not set
-+CONFIG_INET=y
-+# CONFIG_IP_MULTICAST is not set
-+# CONFIG_IP_ADVANCED_ROUTER is not set
-+CONFIG_IP_FIB_HASH=y
-+CONFIG_IP_PNP=y
-+CONFIG_IP_PNP_DHCP=y
-+# CONFIG_IP_PNP_BOOTP is not set
-+CONFIG_IP_PNP_RARP=y
-+# CONFIG_NET_IPIP is not set
-+# CONFIG_NET_IPGRE is not set
-+# CONFIG_ARPD is not set
-+# CONFIG_SYN_COOKIES is not set
-+# CONFIG_INET_AH is not set
-+# CONFIG_INET_ESP is not set
-+# CONFIG_INET_IPCOMP is not set
-+# CONFIG_INET_XFRM_TUNNEL is not set
-+# CONFIG_INET_TUNNEL is not set
-+# CONFIG_INET_XFRM_MODE_TRANSPORT is not set
-+# CONFIG_INET_XFRM_MODE_TUNNEL is not set
-+# CONFIG_INET_XFRM_MODE_BEET is not set
-+# CONFIG_INET_LRO is not set
-+# CONFIG_INET_DIAG is not set
-+# CONFIG_TCP_CONG_ADVANCED is not set
-+CONFIG_TCP_CONG_CUBIC=y
-+CONFIG_DEFAULT_TCP_CONG="cubic"
-+# CONFIG_TCP_MD5SIG is not set
-+# CONFIG_IPV6 is not set
-+# CONFIG_NETWORK_SECMARK is not set
-+# CONFIG_NETFILTER is not set
-+# CONFIG_IP_DCCP is not set
-+# CONFIG_IP_SCTP is not set
-+# CONFIG_TIPC is not set
-+# CONFIG_ATM is not set
-+# CONFIG_BRIDGE is not set
-+# CONFIG_NET_DSA is not set
-+# CONFIG_VLAN_8021Q is not set
-+# CONFIG_DECNET is not set
-+# CONFIG_LLC2 is not set
-+# CONFIG_IPX is not set
-+# CONFIG_ATALK is not set
-+# CONFIG_X25 is not set
-+# CONFIG_LAPB is not set
-+# CONFIG_ECONET is not set
-+# CONFIG_WAN_ROUTER is not set
-+# CONFIG_NET_SCHED is not set
-+
-+#
-+# Network testing
-+#
-+# CONFIG_NET_PKTGEN is not set
-+# CONFIG_HAMRADIO is not set
-+# CONFIG_CAN is not set
-+# CONFIG_IRDA is not set
-+CONFIG_BT=y
-+CONFIG_BT_L2CAP=y
-+# CONFIG_BT_SCO is not set
-+CONFIG_BT_RFCOMM=y
-+# CONFIG_BT_RFCOMM_TTY is not set
-+# CONFIG_BT_BNEP is not set
-+CONFIG_BT_HIDP=y
-+
-+#
-+# Bluetooth device drivers
-+#
-+CONFIG_BT_HCIBTUSB=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
-+# CONFIG_PHONET is not set
-+CONFIG_WIRELESS=y
-+# CONFIG_CFG80211 is not set
-+CONFIG_WIRELESS_OLD_REGULATORY=y
-+# 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 is not set
-+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_OF_GPIO=y
-+# CONFIG_PARPORT is not set
-+CONFIG_BLK_DEV=y
-+# CONFIG_BLK_DEV_FD is not set
-+CONFIG_GAMECUBE_SD=y
-+CONFIG_WII_SD=y
-+CONFIG_WII_MEM2=m
-+# 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_UB is not set
-+CONFIG_BLK_DEV_RAM=y
-+CONFIG_BLK_DEV_RAM_COUNT=2
-+CONFIG_BLK_DEV_RAM_SIZE=4096
-+# CONFIG_BLK_DEV_XIP is not set
-+# CONFIG_CDROM_PKTCDVD is not set
-+# CONFIG_ATA_OVER_ETH is not set
-+# CONFIG_BLK_DEV_HD is not set
-+CONFIG_MISC_DEVICES=y
-+CONFIG_GAMECUBE_GQR=m
-+# CONFIG_EEPROM_93CX6 is not set
-+# CONFIG_ENCLOSURE_SERVICES is not set
-+# CONFIG_C2PORT is not set
-+CONFIG_HAVE_IDE=y
-+# 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=y
-+# 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_SCSI_DEBUG is not set
-+# CONFIG_SCSI_DH is not set
-+# CONFIG_ATA is not set
-+# CONFIG_MD is not set
-+# CONFIG_MACINTOSH_DRIVERS is not set
-+CONFIG_NETDEVICES=y
-+# CONFIG_DUMMY is not set
-+# CONFIG_BONDING is not set
-+# CONFIG_MACVLAN is not set
-+# CONFIG_EQUALIZER is not set
-+# CONFIG_TUN is not set
-+# CONFIG_VETH is not set
-+# CONFIG_PHYLIB is not set
-+CONFIG_NET_ETHERNET=y
-+CONFIG_MII=y
-+# CONFIG_IBM_NEW_EMAC_ZMII is not set
-+# CONFIG_IBM_NEW_EMAC_RGMII is not set
-+# CONFIG_IBM_NEW_EMAC_TAH is not set
-+# CONFIG_IBM_NEW_EMAC_EMAC4 is not set
-+# CONFIG_IBM_NEW_EMAC_NO_FLOW_CTRL is not set
-+# CONFIG_IBM_NEW_EMAC_MAL_CLR_ICINTSTAT is not set
-+# CONFIG_IBM_NEW_EMAC_MAL_COMMON_ERR is not set
-+# CONFIG_B44 is not set
-+# CONFIG_NETDEV_1000 is not set
-+# CONFIG_NETDEV_10000 is not set
-+
-+#
-+# Wireless LAN
-+#
-+# CONFIG_WLAN_PRE80211 is not set
-+# CONFIG_WLAN_80211 is not set
-+# CONFIG_IWLWIFI_LEDS 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=y
-+CONFIG_USB_NET_AX8817X=y
-+# CONFIG_USB_NET_CDCETHER is not set
-+# CONFIG_USB_NET_DM9601 is not set
-+# CONFIG_USB_NET_SMSC95XX is not set
-+# CONFIG_USB_NET_GL620A is not set
-+# CONFIG_USB_NET_NET1080 is not set
-+# CONFIG_USB_NET_PLUSB is not set
-+# CONFIG_USB_NET_MCS7830 is not set
-+# CONFIG_USB_NET_RNDIS_HOST is not set
-+# CONFIG_USB_NET_CDC_SUBSET is not set
-+# CONFIG_USB_NET_ZAURUS is not set
-+# CONFIG_WAN is not set
-+# CONFIG_PPP is not set
-+# CONFIG_SLIP is not set
-+# CONFIG_NETCONSOLE is not set
-+# CONFIG_NETPOLL is not set
-+# CONFIG_NET_POLL_CONTROLLER is not set
-+# CONFIG_ISDN is not set
-+# CONFIG_PHONE is not set
-+
-+#
-+# Input device support
-+#
-+CONFIG_INPUT=y
-+CONFIG_INPUT_FF_MEMLESS=m
-+# CONFIG_INPUT_POLLDEV is not set
-+
-+#
-+# Userland interfaces
-+#
-+CONFIG_INPUT_MOUSEDEV=y
-+# CONFIG_INPUT_MOUSEDEV_PSAUX is not set
-+CONFIG_INPUT_MOUSEDEV_SCREEN_X=640
-+CONFIG_INPUT_MOUSEDEV_SCREEN_Y=480
-+CONFIG_INPUT_JOYDEV=y
-+CONFIG_INPUT_EVDEV=y
-+# CONFIG_INPUT_EVBUG is not set
-+
-+#
-+# Input Device Drivers
-+#
-+CONFIG_INPUT_KEYBOARD=y
-+# CONFIG_KEYBOARD_ATKBD is not set
-+# CONFIG_KEYBOARD_SUNKBD is not set
-+# CONFIG_KEYBOARD_LKKBD is not set
-+# CONFIG_KEYBOARD_XTKBD is not set
-+# CONFIG_KEYBOARD_NEWTON is not set
-+# CONFIG_KEYBOARD_STOWAWAY is not set
-+# CONFIG_KEYBOARD_GPIO is not set
-+CONFIG_INPUT_MOUSE=y
-+# CONFIG_MOUSE_PS2 is not set
-+# CONFIG_MOUSE_SERIAL is not set
-+# CONFIG_MOUSE_APPLETOUCH is not set
-+# CONFIG_MOUSE_BCM5974 is not set
-+# CONFIG_MOUSE_VSXXXAA is not set
-+# CONFIG_MOUSE_GPIO is not set
-+CONFIG_INPUT_JOYSTICK=y
-+# CONFIG_JOYSTICK_ANALOG is not set
-+# CONFIG_JOYSTICK_A3D is not set
-+# CONFIG_JOYSTICK_ADI is not set
-+# CONFIG_JOYSTICK_COBRA is not set
-+# CONFIG_JOYSTICK_GF2K is not set
-+# CONFIG_JOYSTICK_GRIP is not set
-+# CONFIG_JOYSTICK_GRIP_MP is not set
-+# CONFIG_JOYSTICK_GUILLEMOT is not set
-+# CONFIG_JOYSTICK_INTERACT is not set
-+# CONFIG_JOYSTICK_SIDEWINDER is not set
-+# CONFIG_JOYSTICK_TMDC is not set
-+# CONFIG_JOYSTICK_IFORCE is not set
-+# CONFIG_JOYSTICK_WARRIOR is not set
-+# CONFIG_JOYSTICK_MAGELLAN is not set
-+# CONFIG_JOYSTICK_SPACEORB is not set
-+# CONFIG_JOYSTICK_SPACEBALL is not set
-+# CONFIG_JOYSTICK_STINGER is not set
-+# CONFIG_JOYSTICK_TWIDJOY is not set
-+# CONFIG_JOYSTICK_ZHENHUA is not set
-+# CONFIG_JOYSTICK_JOYDUMP is not set
-+# CONFIG_JOYSTICK_XPAD is not set
-+# CONFIG_INPUT_TABLET is not set
-+# CONFIG_INPUT_TOUCHSCREEN is not set
-+CONFIG_INPUT_MISC=y
-+# CONFIG_INPUT_ATI_REMOTE is not set
-+# CONFIG_INPUT_ATI_REMOTE2 is not set
-+# CONFIG_INPUT_KEYSPAN_REMOTE is not set
-+# CONFIG_INPUT_POWERMATE is not set
-+# CONFIG_INPUT_YEALINK is not set
-+# CONFIG_INPUT_CM109 is not set
-+CONFIG_INPUT_UINPUT=y
-+
-+#
-+# Hardware I/O ports
-+#
-+CONFIG_SERIO=y
-+# CONFIG_SERIO_I8042 is not set
-+# CONFIG_SERIO_SERPORT is not set
-+# CONFIG_SERIO_LIBPS2 is not set
-+# CONFIG_SERIO_RAW is not set
-+# CONFIG_SERIO_XILINX_XPS_PS2 is not set
-+# CONFIG_GAMEPORT is not set
-+CONFIG_GAMECUBE_SI=y
-+
-+#
-+# Character devices
-+#
-+CONFIG_VT=y
-+CONFIG_CONSOLE_TRANSLATIONS=y
-+CONFIG_VT_CONSOLE=y
-+CONFIG_HW_CONSOLE=y
-+# CONFIG_VT_HW_CONSOLE_BINDING is not set
-+# CONFIG_DEVKMEM 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_USBGECKO is not set
-+CONFIG_UNIX98_PTYS=y
-+CONFIG_LEGACY_PTYS=y
-+CONFIG_LEGACY_PTY_COUNT=64
-+# CONFIG_IPMI_HANDLER is not set
-+# CONFIG_HW_RANDOM is not set
-+CONFIG_NVRAM=y
-+# CONFIG_R3964 is not set
-+# CONFIG_RAW_DRIVER is not set
-+# CONFIG_TCG_TPM is not set
-+# CONFIG_I2C is not set
-+
-+#
-+# EXI support
-+#
-+CONFIG_GAMECUBE_EXI=y
-+# CONFIG_SPI is not set
-+CONFIG_ARCH_WANT_OPTIONAL_GPIOLIB=y
-+CONFIG_GPIOLIB=y
-+# CONFIG_DEBUG_GPIO is not set
-+CONFIG_GPIO_SYSFS=y
-+
-+#
-+# Memory mapped GPIO expanders:
-+#
-+# CONFIG_GPIO_XILINX is not set
-+
-+#
-+# I2C GPIO expanders:
-+#
-+
-+#
-+# PCI GPIO expanders:
-+#
-+
-+#
-+# SPI GPIO expanders:
-+#
-+# CONFIG_W1 is not set
-+# CONFIG_POWER_SUPPLY is not set
-+# CONFIG_HWMON is not set
-+# CONFIG_THERMAL is not set
-+# CONFIG_THERMAL_HWMON is not set
-+# CONFIG_WATCHDOG is not set
-+CONFIG_SSB_POSSIBLE=y
-+
-+#
-+# Sonics Silicon Backplane
-+#
-+# CONFIG_SSB is not set
-+
-+#
-+# Multifunction device drivers
-+#
-+# CONFIG_MFD_CORE is not set
-+# CONFIG_MFD_SM501 is not set
-+# CONFIG_HTC_PASIC3 is not set
-+# CONFIG_MFD_TMIO is not set
-+# CONFIG_REGULATOR is not set
-+
-+#
-+# Multimedia devices
-+#
-+
-+#
-+# Multimedia core support
-+#
-+# CONFIG_VIDEO_DEV is not set
-+# CONFIG_DVB_CORE is not set
-+# CONFIG_VIDEO_MEDIA is not set
-+
-+#
-+# Multimedia drivers
-+#
-+# CONFIG_DAB is not set
-+
-+#
-+# Graphics support
-+#
-+# CONFIG_VGASTATE is not set
-+# CONFIG_VIDEO_OUTPUT_CONTROL is not set
-+CONFIG_FB=y
-+# CONFIG_FIRMWARE_EDID is not set
-+# CONFIG_FB_DDC is not set
-+# CONFIG_FB_BOOT_VESA_SUPPORT is not set
-+CONFIG_FB_CFB_FILLRECT=y
-+CONFIG_FB_CFB_COPYAREA=y
-+CONFIG_FB_CFB_IMAGEBLIT=y
-+# CONFIG_FB_CFB_REV_PIXELS_IN_BYTE is not set
-+# CONFIG_FB_SYS_FILLRECT is not set
-+# CONFIG_FB_SYS_COPYAREA is not set
-+# CONFIG_FB_SYS_IMAGEBLIT is not set
-+# CONFIG_FB_FOREIGN_ENDIAN is not set
-+# CONFIG_FB_SYS_FOPS is not set
-+# CONFIG_FB_SVGALIB is not set
-+# CONFIG_FB_MACMODES is not set
-+# CONFIG_FB_BACKLIGHT is not set
-+# CONFIG_FB_MODE_HELPERS is not set
-+# CONFIG_FB_TILEBLITTING is not set
-+
-+#
-+# Frame buffer hardware drivers
-+#
-+# CONFIG_FB_OF is not set
-+# CONFIG_FB_VGA16 is not set
-+# CONFIG_FB_S1D13XXX is not set
-+CONFIG_FB_GAMECUBE=y
-+# CONFIG_FB_IBM_GXT4500 is not set
-+# CONFIG_FB_VIRTUAL is not set
-+# CONFIG_FB_METRONOME is not set
-+# CONFIG_FB_MB862XX is not set
-+# CONFIG_BACKLIGHT_LCD_SUPPORT is not set
-+
-+#
-+# Display device support
-+#
-+# CONFIG_DISPLAY_SUPPORT is not set
-+
-+#
-+# Console display driver support
-+#
-+# CONFIG_VGA_CONSOLE is not set
-+CONFIG_DUMMY_CONSOLE=y
-+CONFIG_FRAMEBUFFER_CONSOLE=y
-+# CONFIG_FRAMEBUFFER_CONSOLE_DETECT_PRIMARY is not set
-+# CONFIG_FRAMEBUFFER_CONSOLE_ROTATION is not set
-+# CONFIG_FONTS is not set
-+CONFIG_FONT_8x8=y
-+CONFIG_FONT_8x16=y
-+# CONFIG_LOGO is not set
-+CONFIG_SOUND=y
-+CONFIG_SOUND_OSS_CORE=y
-+CONFIG_SND=y
-+CONFIG_SND_TIMER=y
-+CONFIG_SND_PCM=y
-+CONFIG_SND_SEQUENCER=y
-+# CONFIG_SND_SEQ_DUMMY is not set
-+CONFIG_SND_OSSEMUL=y
-+CONFIG_SND_MIXER_OSS=y
-+CONFIG_SND_PCM_OSS=y
-+CONFIG_SND_PCM_OSS_PLUGINS=y
-+CONFIG_SND_SEQUENCER_OSS=y
-+# CONFIG_SND_DYNAMIC_MINORS is not set
-+CONFIG_SND_SUPPORT_OLD_API=y
-+# CONFIG_SND_VERBOSE_PROCFS is not set
-+# CONFIG_SND_VERBOSE_PRINTK is not set
-+# CONFIG_SND_DEBUG is not set
-+CONFIG_SND_DRIVERS=y
-+# CONFIG_SND_DUMMY is not set
-+# CONFIG_SND_VIRMIDI is not set
-+# CONFIG_SND_MTPAV is not set
-+# CONFIG_SND_SERIAL_U16550 is not set
-+# CONFIG_SND_MPU401 is not set
-+CONFIG_SND_PPC=y
-+CONFIG_SND_GAMECUBE=y
-+CONFIG_SND_GAMECUBE_MIC=m
-+# CONFIG_SND_USB is not set
-+# CONFIG_SND_SOC is not set
-+# CONFIG_SOUND_PRIME is not set
-+CONFIG_HID_SUPPORT=y
-+CONFIG_HID=y
-+# CONFIG_HID_DEBUG is not set
-+# CONFIG_HIDRAW is not set
-+
-+#
-+# USB Input Devices
-+#
-+CONFIG_USB_HID=y
-+# CONFIG_HID_PID is not set
-+# CONFIG_USB_HIDDEV is not set
-+
-+#
-+# Special HID drivers
-+#
-+CONFIG_HID_COMPAT=y
-+CONFIG_HID_A4TECH=m
-+CONFIG_HID_APPLE=m
-+CONFIG_HID_BELKIN=m
-+CONFIG_HID_BRIGHT=m
-+CONFIG_HID_CHERRY=m
-+CONFIG_HID_CHICONY=m
-+CONFIG_HID_CYPRESS=m
-+CONFIG_HID_DELL=m
-+CONFIG_HID_EZKEY=m
-+CONFIG_HID_GYRATION=m
-+CONFIG_HID_LOGITECH=m
-+# CONFIG_LOGITECH_FF is not set
-+# CONFIG_LOGIRUMBLEPAD2_FF is not set
-+CONFIG_HID_MICROSOFT=m
-+CONFIG_HID_MONTEREY=m
-+CONFIG_HID_PANTHERLORD=m
-+# CONFIG_PANTHERLORD_FF is not set
-+CONFIG_HID_PETALYNX=m
-+CONFIG_HID_SAMSUNG=m
-+CONFIG_HID_SONY=m
-+CONFIG_HID_SUNPLUS=m
-+CONFIG_THRUSTMASTER_FF=m
-+CONFIG_ZEROPLUS_FF=m
-+CONFIG_USB_SUPPORT=y
-+CONFIG_USB_ARCH_HAS_HCD=y
-+# CONFIG_USB_ARCH_HAS_OHCI is not set
-+# CONFIG_USB_ARCH_HAS_EHCI is not set
-+CONFIG_USB=y
-+# CONFIG_USB_DEBUG is not set
-+CONFIG_USB_ANNOUNCE_NEW_DEVICES=y
-+
-+#
-+# Miscellaneous USB options
-+#
-+CONFIG_USB_DEVICEFS=y
-+CONFIG_USB_DEVICE_CLASS=y
-+# CONFIG_USB_DYNAMIC_MINORS is not set
-+# CONFIG_USB_OTG is not set
-+# CONFIG_USB_OTG_WHITELIST is not set
-+# CONFIG_USB_OTG_BLACKLIST_HUB is not set
-+# CONFIG_USB_MON is not set
-+# CONFIG_USB_WUSB is not set
-+# CONFIG_USB_WUSB_CBAF is not set
-+
-+#
-+# USB Host Controller Drivers
-+#
-+# CONFIG_USB_C67X00_HCD is not set
-+# CONFIG_USB_ISP116X_HCD is not set
-+# CONFIG_USB_ISP1760_HCD is not set
-+# CONFIG_USB_SL811_HCD is not set
-+# CONFIG_USB_R8A66597_HCD is not set
-+CONFIG_USB_WII_HCD=y
-+# CONFIG_USB_HWA_HCD is not set
-+
-+#
-+# USB Device Class drivers
-+#
-+# CONFIG_USB_ACM is not set
-+# CONFIG_USB_PRINTER is not set
-+# CONFIG_USB_WDM is not set
-+# CONFIG_USB_TMC is not set
-+
-+#
-+# NOTE: USB_STORAGE depends on SCSI but BLK_DEV_SD may also be needed;
-+#
-+
-+#
-+# see USB_STORAGE Help for more 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_ONETOUCH is not set
-+# CONFIG_USB_STORAGE_KARMA is not set
-+# CONFIG_USB_STORAGE_CYPRESS_ATACB is not set
-+CONFIG_USB_LIBUSUAL=y
-+
-+#
-+# USB Imaging devices
-+#
-+# CONFIG_USB_MDC800 is not set
-+# CONFIG_USB_MICROTEK is not set
-+
-+#
-+# USB port drivers
-+#
-+# CONFIG_USB_SERIAL is not set
-+
-+#
-+# USB Miscellaneous drivers
-+#
-+# CONFIG_USB_EMI62 is not set
-+# CONFIG_USB_EMI26 is not set
-+# CONFIG_USB_ADUTUX is not set
-+# CONFIG_USB_SEVSEG is not set
-+# CONFIG_USB_RIO500 is not set
-+# CONFIG_USB_LEGOTOWER is not set
-+# CONFIG_USB_LCD is not set
-+# CONFIG_USB_BERRY_CHARGE is not set
-+# CONFIG_USB_LED is not set
-+# CONFIG_USB_CYPRESS_CY7C63 is not set
-+# CONFIG_USB_CYTHERM is not set
-+# CONFIG_USB_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
-+# CONFIG_USB_ISIGHTFW is not set
-+# CONFIG_USB_VST is not set
-+# CONFIG_USB_GADGET is not set
-+# CONFIG_MMC is not set
-+# CONFIG_MEMSTICK is not set
-+# CONFIG_NEW_LEDS is not set
-+# CONFIG_ACCESSIBILITY 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
-+
-+#
-+# SPI RTC drivers
-+#
-+
-+#
-+# Platform RTC drivers
-+#
-+# CONFIG_RTC_DRV_CMOS is not set
-+# CONFIG_RTC_DRV_DS1286 is not set
-+# CONFIG_RTC_DRV_DS1511 is not set
-+# CONFIG_RTC_DRV_DS1553 is not set
-+# CONFIG_RTC_DRV_DS1742 is not set
-+# CONFIG_RTC_DRV_STK17TA8 is not set
-+# CONFIG_RTC_DRV_M48T86 is not set
-+# CONFIG_RTC_DRV_M48T35 is not set
-+# CONFIG_RTC_DRV_M48T59 is not set
-+# CONFIG_RTC_DRV_BQ4802 is not set
-+# CONFIG_RTC_DRV_V3020 is not set
-+CONFIG_RTC_DRV_GCN=y
-+
-+#
-+# on-CPU RTC drivers
-+#
-+# CONFIG_RTC_DRV_PPC is not set
-+# CONFIG_DMADEVICES is not set
-+# CONFIG_UIO is not set
-+# CONFIG_STAGING is not set
-+
-+#
-+# File systems
-+#
-+CONFIG_EXT2_FS=y
-+# CONFIG_EXT2_FS_XATTR is not set
-+# CONFIG_EXT2_FS_XIP is not set
-+CONFIG_EXT3_FS=y
-+# CONFIG_EXT3_FS_XATTR is not set
-+# CONFIG_EXT4_FS is not set
-+CONFIG_JBD=y
-+# CONFIG_JBD_DEBUG is not set
-+# CONFIG_REISERFS_FS is not set
-+# CONFIG_JFS_FS is not set
-+# CONFIG_FS_POSIX_ACL is not set
-+CONFIG_FILE_LOCKING=y
-+# CONFIG_XFS_FS is not set
-+# CONFIG_OCFS2_FS is not set
-+CONFIG_DNOTIFY=y
-+CONFIG_INOTIFY=y
-+CONFIG_INOTIFY_USER=y
-+# CONFIG_QUOTA is not set
-+# CONFIG_AUTOFS_FS is not set
-+# CONFIG_AUTOFS4_FS is not set
-+# CONFIG_FUSE_FS is not set
-+
-+#
-+# CD-ROM/DVD Filesystems
-+#
-+CONFIG_ISO9660_FS=y
-+CONFIG_JOLIET=y
-+# CONFIG_ZISOFS is not set
-+# CONFIG_UDF_FS is not set
-+# CONFIG_GCDVD_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_PROC_PAGE_MONITOR is not set
-+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_MINIX_FS is not set
-+# CONFIG_OMFS_FS is not set
-+# CONFIG_HPFS_FS is not set
-+# CONFIG_QNX4FS_FS is not set
-+# CONFIG_ROMFS_FS is not set
-+# CONFIG_SYSV_FS is not set
-+# CONFIG_UFS_FS is not set
-+CONFIG_NETWORK_FILESYSTEMS=y
-+CONFIG_NFS_FS=y
-+CONFIG_NFS_V3=y
-+# CONFIG_NFS_V3_ACL is not set
-+# CONFIG_NFS_V4 is not set
-+CONFIG_ROOT_NFS=y
-+# CONFIG_NFSD is not set
-+CONFIG_LOCKD=y
-+CONFIG_LOCKD_V4=y
-+CONFIG_NFS_COMMON=y
-+CONFIG_SUNRPC=y
-+# CONFIG_SUNRPC_REGISTER_V4 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 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
-+
-+#
-+# Library routines
-+#
-+CONFIG_BITREVERSE=y
-+CONFIG_CRC_CCITT=y
-+# CONFIG_CRC16 is not set
-+# CONFIG_CRC_T10DIF is not set
-+# CONFIG_CRC_ITU_T is not set
-+CONFIG_CRC32=y
-+# CONFIG_CRC7 is not set
-+# CONFIG_LIBCRC32C is not set
-+CONFIG_PLIST=y
-+CONFIG_HAS_IOMEM=y
-+CONFIG_HAS_IOPORT=y
-+CONFIG_HAS_DMA=y
-+CONFIG_HAVE_LMB=y
-+
-+#
-+# Kernel hacking
-+#
-+# CONFIG_PRINTK_TIME is not set
-+CONFIG_ENABLE_WARN_DEPRECATED=y
-+CONFIG_ENABLE_MUST_CHECK=y
-+CONFIG_FRAME_WARN=1024
-+CONFIG_MAGIC_SYSRQ=y
-+# CONFIG_UNUSED_SYMBOLS is not set
-+CONFIG_DEBUG_FS=y
-+# CONFIG_HEADERS_CHECK is not set
-+CONFIG_DEBUG_KERNEL=y
-+# CONFIG_DEBUG_SHIRQ is not set
-+CONFIG_DETECT_SOFTLOCKUP=y
-+# CONFIG_BOOTPARAM_SOFTLOCKUP_PANIC is not set
-+CONFIG_BOOTPARAM_SOFTLOCKUP_PANIC_VALUE=0
-+CONFIG_SCHED_DEBUG=y
-+CONFIG_SCHEDSTATS=y
-+# CONFIG_TIMER_STATS is not set
-+# CONFIG_DEBUG_OBJECTS 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=y
-+# CONFIG_DEBUG_MUTEXES is not set
-+# CONFIG_DEBUG_SPINLOCK_SLEEP is not set
-+# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set
-+CONFIG_STACKTRACE=y
-+# 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_WRITECOUNT is not set
-+# CONFIG_DEBUG_MEMORY_INIT is not set
-+# CONFIG_DEBUG_LIST is not set
-+# CONFIG_DEBUG_SG is not set
-+# CONFIG_BOOT_PRINTK_DELAY is not set
-+# CONFIG_RCU_TORTURE_TEST is not set
-+# CONFIG_RCU_CPU_STALL_DETECTOR is not set
-+# CONFIG_BACKTRACE_SELF_TEST is not set
-+# CONFIG_DEBUG_BLOCK_EXT_DEVT is not set
-+# CONFIG_FAULT_INJECTION is not set
-+CONFIG_LATENCYTOP=y
-+CONFIG_SYSCTL_SYSCALL_CHECK=y
-+CONFIG_NOP_TRACER=y
-+CONFIG_HAVE_FUNCTION_TRACER=y
-+CONFIG_RING_BUFFER=y
-+CONFIG_TRACING=y
-+
-+#
-+# Tracers
-+#
-+# CONFIG_FUNCTION_TRACER is not set
-+# CONFIG_PREEMPT_TRACER is not set
-+# CONFIG_SCHED_TRACER is not set
-+CONFIG_CONTEXT_SWITCH_TRACER=y
-+CONFIG_BOOT_TRACER=y
-+# CONFIG_STACK_TRACER is not set
-+# CONFIG_DYNAMIC_PRINTK_DEBUG is not set
-+# CONFIG_SAMPLES is not set
-+CONFIG_HAVE_ARCH_KGDB=y
-+# CONFIG_KGDB is not set
-+# CONFIG_DEBUG_STACKOVERFLOW is not set
-+# CONFIG_DEBUG_STACK_USAGE is not set
-+# CONFIG_DEBUG_PAGEALLOC is not set
-+# CONFIG_CODE_PATCHING_SELFTEST is not set
-+# CONFIG_FTR_FIXUP_SELFTEST is not set
-+# CONFIG_MSI_BITMAP_SELFTEST is not set
-+# CONFIG_XMON is not set
-+# CONFIG_IRQSTACKS is not set
-+# CONFIG_VIRQ_DEBUG is not set
-+# CONFIG_BDI_SWITCH 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 is not set
-+# CONFIG_PPC_EARLY_DEBUG_44x is not set
-+# CONFIG_PPC_EARLY_DEBUG_40x is not set
-+# CONFIG_PPC_EARLY_DEBUG_CPM is not set
-+CONFIG_PPC_EARLY_DEBUG_USBGECKO=y
-+
-+#
-+# Security options
-+#
-+# CONFIG_KEYS is not set
-+# CONFIG_SECURITY is not set
-+# CONFIG_SECURITYFS is not set
-+# CONFIG_SECURITY_FILE_CAPABILITIES is not set
-+# CONFIG_CRYPTO is not set
-+# CONFIG_PPC_CLOCK is not set
-+CONFIG_PPC_LIB_RHEAP=y
-+# CONFIG_VIRTUALIZATION is not set
-diff --git a/arch/powerpc/include/asm/starlet.h b/arch/powerpc/include/asm/starlet.h
-new file mode 100644
-index 0000000..b8f77c7
---- /dev/null
-+++ b/arch/powerpc/include/asm/starlet.h
-@@ -0,0 +1,234 @@
-+/*
-+ * arch/powerpc/include/asm/starlet.h
-+ *
-+ * Nintendo Wii starlet processor definitions
-+ * Copyright (C) 2008-2009 The GameCube Linux Team
-+ * Copyright (C) 2008,2009 Albert Herranz
-+ *
-+ * This program is free software; you can redistribute it and/or
-+ * modify it under the terms of the 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_STARLET_H
-+#define __ASM_POWERPC_STARLET_H
-+
-+#include <linux/types.h>
-+#include <linux/spinlock_types.h>
-+#include <linux/platform_device.h>
-+#include <linux/dmapool.h>
-+#include <linux/dma-mapping.h>
-+#include <linux/list.h>
-+#include <linux/scatterlist.h>
-+#include <linux/timer.h>
-+#include <asm/rheap.h>
-+
-+#define STARLET_EINVAL -4
-+
-+
-+#define STARLET_IPC_DMA_ALIGN 0x1f /* 32 bytes */
-+
-+struct starlet_ipc_request;
-+
-+/* input/output heap */
-+struct starlet_ioh {
-+ spinlock_t lock;
-+ rh_info_t *rheap;
-+ unsigned long base_phys;
-+ void *base;
-+ size_t size;
-+};
-+
-+/* pseudo-scatterlist support for the input/output heap */
-+struct starlet_ioh_sg {
-+ void *buf;
-+ size_t len;
-+ dma_addr_t dma_addr;
-+};
-+
-+/* inter-process communication device abstraction */
-+struct starlet_ipc_device {
-+ unsigned long flags;
-+
-+ void __iomem *io_base;
-+ int irq;
-+
-+ struct dma_pool *dma_pool; /* to allocate requests */
-+ struct starlet_ioh *ioh; /* to allocate special io buffers */
-+
-+ unsigned int random_id;
-+
-+ spinlock_t list_lock;
-+ struct list_head outstanding_list;
-+ unsigned long nr_outstanding;
-+ struct list_head pending_list;
-+ unsigned long nr_pending;
-+
-+ struct timer_list timer;
-+
-+ struct starlet_ipc_request *req; /* for requests causing a ios reboot */
-+
-+ struct device *dev;
-+};
-+
-+/* iovec entry suitable for ioctlv */
-+struct starlet_iovec {
-+ dma_addr_t dma_addr;
-+ u32 dma_len;
-+};
-+
-+typedef int (*starlet_ipc_callback_t)(struct starlet_ipc_request *req);
-+
-+struct starlet_ipc_request {
-+ /* begin starlet firmware request format */
-+ u32 cmd; /* 0x00 */
-+ s32 result; /* 0x04 */
-+ union { /* 0x08 */
-+ s32 fd;
-+ u32 req_cmd;
-+ };
-+ union {
-+ struct {
-+ dma_addr_t pathname; /* 0x0c */
-+ u32 mode; /* 0x10 */
-+ } open;
-+ struct {
-+ u32 request; /* 0x0c */
-+ dma_addr_t ibuf; /* 0x10 */
-+ u32 ilen; /* 0x14 */
-+ dma_addr_t obuf; /* 0x18 */
-+ u32 olen; /* 0x1c */
-+ } ioctl;
-+ struct {
-+ u32 request; /* 0x0c */
-+ u32 argc_in; /* 0x10 */
-+ u32 argc_io; /* 0x14 */
-+ dma_addr_t iovec_da; /* 0x18 */
-+ } ioctlv;
-+ u32 argv[5]; /* 0x0c,0x10,0x14,0x18,0x1c */
-+ };
-+ /* end starlet firmware request format */
-+
-+ /*
-+ * A signature is used to discard bogus requests from earlier
-+ * IPC instances.
-+ */
-+ unsigned int sig;
-+
-+ dma_addr_t dma_addr; /* request dma address */
-+
-+ /* ioctlv related data */
-+ struct starlet_iovec *iovec;
-+ size_t iovec_size;
-+
-+ unsigned sgl_nents_in;
-+ unsigned sgl_nents_io;
-+ union {
-+ struct scatterlist *sgl_in;
-+ struct starlet_ioh_sg *ioh_sgl_in;
-+ };
-+ union {
-+ struct scatterlist *sgl_io;
-+ struct starlet_ioh_sg *ioh_sgl_io;
-+ };
-+
-+ void *done_data;
-+ starlet_ipc_callback_t done;
-+
-+ starlet_ipc_callback_t complete;
-+
-+ unsigned long jiffies;
-+
-+ struct list_head node; /* for queueing */
-+
-+ struct starlet_ipc_device *ipc_dev;
-+};
-+
-+
-+
-+/* from starlet-malloc.c */
-+
-+extern int starlet_malloc_lib_bootstrap(struct resource *mem);
-+
-+extern void *starlet_kzalloc(size_t size, gfp_t flags);
-+extern void starlet_kfree(void *ptr);
-+
-+extern void *starlet_ioh_kzalloc(size_t size);
-+extern void starlet_ioh_kfree(void *ptr);
-+
-+extern unsigned long starlet_ioh_virt_to_phys(void *ptr);
-+
-+extern void starlet_ioh_sg_init_table(struct starlet_ioh_sg *sgl,
-+ unsigned int nents);
-+extern void starlet_ioh_sg_set_buf(struct starlet_ioh_sg *sg,
-+ void *buf, size_t len);
-+
-+#define starlet_ioh_for_each_sg(sgl, sg, nr, __i) \
-+ for (__i = 0, sg = (sgl); __i < nr; __i++, sg++)
-+
-+extern int starlet_ioh_dma_map_sg(struct device *dev,
-+ struct starlet_ioh_sg *sgl, int nents,
-+ enum dma_data_direction direction);
-+extern void starlet_ioh_dma_unmap_sg(struct device *dev,
-+ struct starlet_ioh_sg *sgl, int nents,
-+ enum dma_data_direction direction);
-+/* from starlet-ipc.c */
-+
-+extern struct starlet_ipc_device *starlet_ipc_get_device(void);
-+
-+extern struct starlet_ipc_request *
-+starlet_ipc_alloc_request(struct starlet_ipc_device *ipc_dev, gfp_t flags);
-+extern void starlet_ipc_free_request(struct starlet_ipc_request *req);
-+
-+
-+extern int starlet_open(const char *pathname, int flags);
-+extern int starlet_close(int fd);
-+
-+extern int starlet_ioctl(int fd, int request,
-+ void *ibuf, size_t ilen,
-+ void *obuf, size_t olen);
-+extern int starlet_ioctl_nowait(int fd, int request,
-+ void *ibuf, size_t ilen,
-+ void *obuf, size_t olen,
-+ starlet_ipc_callback_t callback,
-+ void *arg);
-+
-+extern int starlet_ioctlv(int fd, int request,
-+ unsigned int nents_in,
-+ struct scatterlist *sgl_in,
-+ unsigned int nents_out,
-+ struct scatterlist *sgl_out);
-+extern int starlet_ioctlv_nowait(int fd, int request,
-+ unsigned int nents_in,
-+ struct scatterlist *sgl_in,
-+ unsigned int nents_out,
-+ struct scatterlist *sgl_out,
-+ starlet_ipc_callback_t callback,
-+ void *arg);
-+extern int starlet_ioctlv_and_reboot(int fd, int request,
-+ unsigned int nents_in,
-+ struct scatterlist *sgl_in,
-+ unsigned int nents_out,
-+ struct scatterlist *sgl_out);
-+
-+extern int starlet_ioh_ioctlv(int fd, int request,
-+ unsigned int nents_in,
-+ struct starlet_ioh_sg *ioh_sgl_in,
-+ unsigned int nents_io,
-+ struct starlet_ioh_sg *ioh_sgl_io);
-+extern int starlet_ioh_ioctlv_nowait(int fd, int request,
-+ unsigned int nents_in,
-+ struct starlet_ioh_sg *ioh_sgl_in,
-+ unsigned int nents_io,
-+ struct starlet_ioh_sg *ioh_sgl_io,
-+ starlet_ipc_callback_t callback,
-+ void *arg);
-+
-+/* from starlet-stm.c */
-+
-+extern void starlet_stm_restart(void);
-+extern void starlet_stm_power_off(void);
-+
-+#endif /* __ASM_POWERPC_STARLET_H */
-diff --git a/arch/powerpc/include/asm/udbg.h b/arch/powerpc/include/asm/udbg.h
-index 6418cee..11ecd37 100644
---- a/arch/powerpc/include/asm/udbg.h
-+++ b/arch/powerpc/include/asm/udbg.h
-@@ -50,6 +50,7 @@ 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);
-+extern void __init udbg_init_usbgecko(void);
-
- #endif /* __KERNEL__ */
- #endif /* _ASM_POWERPC_UDBG_H */
-diff --git a/arch/powerpc/kernel/cputable.c b/arch/powerpc/kernel/cputable.c
-index 7e87195..daf94a5 100644
---- a/arch/powerpc/kernel/cputable.c
-+++ b/arch/powerpc/kernel/cputable.c
-@@ -644,11 +644,11 @@ static struct cpu_spec __initdata cpu_specs[] = {
- .machine_check = machine_check_generic,
- .platform = "ppc750",
- },
-- { /* 750CL */
-- .pvr_mask = 0xfffff0f0,
-- .pvr_value = 0x00087010,
-- .cpu_name = "750CL",
-- .cpu_features = CPU_FTRS_750CL,
-+ { /* 745/755 */
-+ .pvr_mask = 0xfffff000,
-+ .pvr_value = 0x00083000,
-+ .cpu_name = "745/755",
-+ .cpu_features = CPU_FTRS_750,
- .cpu_user_features = COMMON_USER | PPC_FEATURE_PPC_LE,
- .icache_bsize = 32,
- .dcache_bsize = 32,
-@@ -658,11 +658,11 @@ static struct cpu_spec __initdata cpu_specs[] = {
- .machine_check = machine_check_generic,
- .platform = "ppc750",
- },
-- { /* 745/755 */
-- .pvr_mask = 0xfffff000,
-- .pvr_value = 0x00083000,
-- .cpu_name = "745/755",
-- .cpu_features = CPU_FTRS_750,
-+ { /* 750CL (and "Broadway") */
-+ .pvr_mask = 0xfffff0e0,
-+ .pvr_value = 0x00087000,
-+ .cpu_name = "750CL",
-+ .cpu_features = CPU_FTRS_750CL,
- .cpu_user_features = COMMON_USER | PPC_FEATURE_PPC_LE,
- .icache_bsize = 32,
- .dcache_bsize = 32,
-diff --git a/arch/powerpc/kernel/head_32.S b/arch/powerpc/kernel/head_32.S
-index 0c32682..ae6825a 100644
---- a/arch/powerpc/kernel/head_32.S
-+++ b/arch/powerpc/kernel/head_32.S
-@@ -159,6 +159,9 @@ __after_mmu_off:
- #ifdef CONFIG_PPC_EARLY_DEBUG_CPM
- bl setup_cpm_bat
- #endif
-+#ifdef CONFIG_PPC_EARLY_DEBUG_USBGECKO
-+ bl setup_usbgecko_bat
-+#endif
-
- /*
- * Call setup_cpu for CPU 0 and initialize 6xx Idle
-@@ -1253,6 +1256,24 @@ setup_cpm_bat:
- blr
- #endif
-
-+#ifdef CONFIG_PPC_EARLY_DEBUG_USBGECKO
-+setup_usbgecko_bat:
-+ /* prepare a BAT for early io */
-+ lis r8, 0x0c00
-+ ori r8, r8, 0x002a /* uncached, guarded ,rw */
-+ lis r11, 0xcc00
-+ ori r11, r11, 0x3 /* 128K */
-+#ifdef CONFIG_WII
-+ oris r8, r8, 0x0100
-+ oris r11, r11, 0x0100
-+#endif
-+ mtspr SPRN_DBAT1L, r8
-+ mtspr SPRN_DBAT1U, r11
-+ sync
-+ isync
-+ blr
-+#endif
-+
- #ifdef CONFIG_8260
- /* Jump into the system reset for the rom.
- * We first disable the MMU, and then jump to the ROM reset address.
-diff --git a/arch/powerpc/kernel/prom_init_check.sh b/arch/powerpc/kernel/prom_init_check.sh
-index ea3a2ec..980cd4e 100644
---- a/arch/powerpc/kernel/prom_init_check.sh
-+++ b/arch/powerpc/kernel/prom_init_check.sh
-@@ -17,7 +17,7 @@
- # it to the list below:
-
- WHITELIST="add_reloc_offset __bss_start __bss_stop copy_and_flush
--_end enter_prom memcpy memset reloc_offset __secondary_hold
-+_end enter_prom memcmp memcpy memset reloc_offset __secondary_hold
- __secondary_hold_acknowledge __secondary_hold_spinloop __start
- strcmp strcpy strlcpy strlen strncmp strstr logo_linux_clut224
- reloc_got2 kernstart_addr memstart_addr"
-diff --git a/arch/powerpc/kernel/udbg.c b/arch/powerpc/kernel/udbg.c
-index 7d6c9bb..a85bfb0 100644
---- a/arch/powerpc/kernel/udbg.c
-+++ b/arch/powerpc/kernel/udbg.c
-@@ -59,6 +59,8 @@ void __init udbg_early_init(void)
- udbg_init_40x_realmode();
- #elif defined(CONFIG_PPC_EARLY_DEBUG_CPM)
- udbg_init_cpm();
-+#elif defined(CONFIG_PPC_EARLY_DEBUG_USBGECKO)
-+ udbg_init_usbgecko();
- #endif
-
- #ifdef CONFIG_PPC_EARLY_DEBUG
-diff --git a/arch/powerpc/mm/pgtable_32.c b/arch/powerpc/mm/pgtable_32.c
-index c31d6d2..62f8954 100644
---- a/arch/powerpc/mm/pgtable_32.c
-+++ b/arch/powerpc/mm/pgtable_32.c
-@@ -199,9 +199,19 @@ __ioremap(phys_addr_t addr, unsigned long size, unsigned long flags)
- * mem_init() sets high_memory so only do the check after that.
- */
- if (mem_init_done && (p < virt_to_phys(high_memory))) {
-- printk("__ioremap(): phys addr 0x%llx is RAM lr %p\n",
-- (unsigned long long)p, __builtin_return_address(0));
-- return NULL;
-+ /*
-+ * On some systems, though, we may want to remap normal RAM
-+ * that we have memreserve'd at the device tree.
-+ * But we can't do that safely if we are using BATs.
-+ *
-+ */
-+ if (!__map_without_bats) {
-+ printk(KERN_WARNING
-+ "__ioremap(): phys addr 0x%llx is RAM lr %p\n",
-+ (unsigned long long)p,
-+ __builtin_return_address(0));
-+ return NULL;
-+ }
- }
-
- if (size == 0)
-diff --git a/arch/powerpc/platforms/Kconfig.cputype b/arch/powerpc/platforms/Kconfig.cputype
-index 548efa5..36e041c 100644
---- a/arch/powerpc/platforms/Kconfig.cputype
-+++ b/arch/powerpc/platforms/Kconfig.cputype
-@@ -250,7 +250,7 @@ config NR_CPUS
-
- config NOT_COHERENT_CACHE
- bool
-- depends on 4xx || 8xx || E200 || PPC_MPC512x
-+ depends on 4xx || 8xx || E200 || PPC_MPC512x || GAMECUBE_COMMON
- default y
-
- config CHECK_CACHE_COHERENCY
-diff --git a/arch/powerpc/platforms/embedded6xx/Kconfig b/arch/powerpc/platforms/embedded6xx/Kconfig
-index 4f9f818..d5a76c3 100644
---- a/arch/powerpc/platforms/embedded6xx/Kconfig
-+++ b/arch/powerpc/platforms/embedded6xx/Kconfig
-@@ -90,3 +90,90 @@ config MPC10X_OPENPIC
- config MPC10X_STORE_GATHERING
- bool "Enable MPC10x store gathering"
- depends on MPC10X_BRIDGE
-+
-+config GAMECUBE
-+ bool "Nintendo-GameCube"
-+ depends on EMBEDDED6xx
-+ select GAMECUBE_COMMON
-+ help
-+ Select GAMECUBE if configuring for the Nintendo GameCube.
-+ More information at: <http://gc-linux.sourceforge.net/>
-+
-+config WII
-+ bool "Nintendo-Wii"
-+ depends on EMBEDDED6xx
-+ select GAMECUBE_COMMON
-+ select PPC_LIB_RHEAP
-+ help
-+ Select WII if configuring for the Nintendo Wii.
-+ More information at: <http://gc-linux.sourceforge.net/>
-+
-+config FLIPPER_PIC
-+ bool
-+ default n
-+
-+config GAMECUBE_COMMON
-+ bool
-+ select NOT_COHERENT_CACHE
-+ select FLIPPER_PIC
-+ default n
-+
-+config GAMECUBE_UDBG
-+ bool "Nintendo GameCube/Wii udbg support"
-+ depends on GAMECUBE_COMMON
-+ default n
-+ help
-+ If you say yes to this option, you will be able to choose between
-+ several udbg drivers available for the Nintendo GameCube/Wii.
-+
-+ If in doubt, say N here.
-+
-+choice
-+ prompt "Nintendo GameCube/Wii udbg drivers"
-+ depends on GAMECUBE_UDBG
-+
-+config USBGECKO_UDBG
-+ bool "USB Gecko udbg console for the Nintendo GameCube/Wii"
-+ help
-+ If you say yes to this option, support will be included for the
-+ USB Gecko adapter as an udbg console.
-+ The USB Gecko is a EXI to USB Serial converter that can be plugged
-+ into a memcard slot in the Nintendo GameCube/Wii.
-+
-+ This driver bypasses the EXI layer completely.
-+
-+ If in doubt, say N here.
-+
-+config GAMECUBE_VIDEO_UDBG
-+ bool "Nintendo GameCube/Wii framebuffer udbg console"
-+ select FONTS
-+ select FONT_8x16
-+ help
-+ If you say yes to this option, support will be included for a
-+ framebuffer based udbg console for the Nintendo GameCube/Wii.
-+
-+ If in doubt, say N here.
-+
-+endchoice
-+
-+config GAMECUBE_RSW
-+ bool "Nintendo GameCube/Wii reset switch/button"
-+ depends on GAMECUBE_COMMON
-+ default y
-+ help
-+ If you say yes to this option, support will be included for the
-+ reset switch/button of the Nintendo GameCube/Wii.
-+
-+ If in doubt, say Y here.
-+
-+config WII_GPIO
-+ bool "Nintendo Wii GPIO support"
-+ depends on GPIOLIB
-+ default y
-+ help
-+ If you say yes to this option, support will be included for the
-+ Nintendo Wii GPIO lines that control, for example, the sensor
-+ bar IR leds, the front led, or the eject switch of the disk unit.
-+
-+ If in doubt, say Y here.
-+
-diff --git a/arch/powerpc/platforms/embedded6xx/Makefile b/arch/powerpc/platforms/embedded6xx/Makefile
-index 0773c08..8a080ba 100644
---- a/arch/powerpc/platforms/embedded6xx/Makefile
-+++ b/arch/powerpc/platforms/embedded6xx/Makefile
-@@ -7,3 +7,12 @@ obj-$(CONFIG_STORCENTER) += storcenter.o
- obj-$(CONFIG_PPC_HOLLY) += holly.o
- obj-$(CONFIG_PPC_PRPMC2800) += prpmc2800.o
- obj-$(CONFIG_PPC_C2K) += c2k.o
-+obj-$(CONFIG_GAMECUBE) += gamecube.o gamecube_dev.o
-+obj-$(CONFIG_WII) += wii.o wii_dev.o \
-+ starlet-ipc.o starlet-malloc.o \
-+ starlet-stm.o starlet-es.o
-+obj-$(CONFIG_FLIPPER_PIC) += flipper-pic.o
-+obj-$(CONFIG_USBGECKO_UDBG) += usbgecko_udbg.o
-+obj-$(CONFIG_GAMECUBE_VIDEO_UDBG) += gcnvi_udbg.o
-+obj-$(CONFIG_GAMECUBE_RSW) += gcn-rsw.o
-+obj-$(CONFIG_WII_GPIO) += starlet-gpio.o
-diff --git a/arch/powerpc/platforms/embedded6xx/flipper-pic.c b/arch/powerpc/platforms/embedded6xx/flipper-pic.c
-new file mode 100644
-index 0000000..d836103
---- /dev/null
-+++ b/arch/powerpc/platforms/embedded6xx/flipper-pic.c
-@@ -0,0 +1,217 @@
-+/*
-+ * arch/powerpc/platforms/embedded6xx/flipper-pic.c
-+ *
-+ * Nintendo GameCube/Wii interrupt controller support.
-+ * Copyright (C) 2004-2009 The GameCube Linux Team
-+ * Copyright (C) 2007,2008,2009 Albert Herranz
-+ *
-+ * This program is free software; you can redistribute it and/or
-+ * modify it under the terms of the 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/init.h>
-+#include <linux/irq.h>
-+#include <linux/of.h>
-+#include <asm/io.h>
-+
-+#include "flipper-pic.h"
-+
-+
-+#define DRV_MODULE_NAME "flipper-pic"
-+
-+#define drv_printk(level, format, arg...) \
-+ printk(level DRV_MODULE_NAME ": " format , ## arg)
-+
-+
-+/*
-+ * IRQ chip hooks.
-+ *
-+ */
-+
-+static void flipper_pic_mask_and_ack(unsigned int virq)
-+{
-+ int irq = virq_to_hw(virq);
-+ void __iomem *io_base = get_irq_chip_data(virq);
-+
-+ clear_bit(irq, io_base + FLIPPER_IMR);
-+ set_bit(irq, io_base + FLIPPER_ICR);
-+}
-+
-+static void flipper_pic_ack(unsigned int virq)
-+{
-+ int irq = virq_to_hw(virq);
-+ void __iomem *io_base = get_irq_chip_data(virq);
-+
-+ set_bit(irq, io_base + FLIPPER_ICR);
-+}
-+
-+static void flipper_pic_mask(unsigned int virq)
-+{
-+ int irq = virq_to_hw(virq);
-+ void __iomem *io_base = get_irq_chip_data(virq);
-+
-+ clear_bit(irq, io_base + FLIPPER_IMR);
-+}
-+
-+static void flipper_pic_unmask(unsigned int virq)
-+{
-+ int irq = virq_to_hw(virq);
-+ void __iomem *io_base = get_irq_chip_data(virq);
-+
-+ set_bit(irq, io_base + FLIPPER_IMR);
-+}
-+
-+
-+static struct irq_chip flipper_pic = {
-+ .typename = "flipper-pic",
-+ .ack = flipper_pic_ack,
-+ .mask_ack = flipper_pic_mask_and_ack,
-+ .mask = flipper_pic_mask,
-+ .unmask = flipper_pic_unmask,
-+};
-+
-+/*
-+ * IRQ host hooks.
-+ *
-+ */
-+
-+static struct irq_host *flipper_irq_host;
-+
-+static int flipper_pic_map(struct irq_host *h, unsigned int virq,
-+ irq_hw_number_t hwirq)
-+{
-+ set_irq_chip_data(virq, h->host_data);
-+ set_irq_chip_and_handler(virq, &flipper_pic, handle_level_irq);
-+ return 0;
-+}
-+
-+static void flipper_pic_unmap(struct irq_host *h, unsigned int irq)
-+{
-+ set_irq_chip_data(irq, NULL);
-+ set_irq_chip(irq, NULL);
-+}
-+
-+static int flipper_pic_match(struct irq_host *h, struct device_node *np)
-+{
-+ return 1;
-+}
-+
-+
-+static struct irq_host_ops flipper_irq_host_ops = {
-+ .map = flipper_pic_map,
-+ .unmap = flipper_pic_unmap,
-+ .match = flipper_pic_match,
-+};
-+
-+/*
-+ * Platform hooks.
-+ *
-+ */
-+
-+struct irq_host * __init flipper_pic_init(struct device_node *np)
-+{
-+ struct irq_host *irq_host;
-+ struct resource res;
-+ void __iomem *io_base;
-+ int retval;
-+
-+ retval = of_address_to_resource(np, 0, &res);
-+ if (retval) {
-+ drv_printk(KERN_ERR, "no io memory range found\n");
-+ return NULL;
-+ }
-+ io_base = ioremap(res.start, res.end - res.start + 1);
-+
-+ drv_printk(KERN_INFO, "controller at 0x%08x mapped to 0x%p\n",
-+ res.start, io_base);
-+
-+ /* mask and ack all IRQs */
-+ out_be32(io_base + FLIPPER_IMR, 0x00000000);
-+ out_be32(io_base + FLIPPER_ICR, 0xffffffff);
-+
-+ irq_host = irq_alloc_host(np, IRQ_HOST_MAP_LINEAR, FLIPPER_NR_IRQS,
-+ &flipper_irq_host_ops, -1);
-+ if (!irq_host) {
-+ drv_printk(KERN_ERR, "failed to allocate irq_host\n");
-+ return NULL;
-+ }
-+
-+ irq_host->host_data = io_base;
-+
-+ return irq_host;
-+}
-+
-+unsigned int flipper_pic_get_irq(void)
-+{
-+ void __iomem *io_base = flipper_irq_host->host_data;
-+ int irq;
-+ u32 irq_status;
-+
-+ irq_status = in_be32(io_base + FLIPPER_ICR) &
-+ in_be32(io_base + FLIPPER_IMR);
-+ if (irq_status == 0)
-+ return -1; /* no more IRQs pending */
-+
-+ __asm__ __volatile__("cntlzw %0,%1" : "=r"(irq) : "r"(irq_status));
-+ return irq_linear_revmap(flipper_irq_host, 31 - irq);
-+}
-+
-+/*
-+ * Probe function.
-+ *
-+ */
-+
-+void __init flipper_pic_probe(void)
-+{
-+ struct device_node *np;
-+
-+ np = of_find_compatible_node(NULL, NULL, "nintendo,flipper-pic");
-+ BUG_ON(!np);
-+
-+ flipper_irq_host = flipper_pic_init(np);
-+ BUG_ON(!flipper_irq_host);
-+
-+ irq_set_default_host(flipper_irq_host);
-+
-+ of_node_put(np);
-+}
-+
-+/*
-+ * Misc functions related to the flipper chipset.
-+ *
-+ */
-+
-+/*
-+ * Resets the platform.
-+ */
-+void flipper_platform_reset(void)
-+{
-+ void __iomem *io_base;
-+
-+ if (flipper_irq_host && flipper_irq_host->host_data) {
-+ io_base = flipper_irq_host->host_data;
-+ out_8(io_base + FLIPPER_RESET, 0x00);
-+ }
-+}
-+
-+/*
-+ * Returns non-zero if the reset button is pressed.
-+ */
-+int flipper_is_reset_button_pressed(void)
-+{
-+ void __iomem *io_base;
-+ u32 icr;
-+
-+ if (flipper_irq_host && flipper_irq_host->host_data) {
-+ io_base = flipper_irq_host->host_data;
-+ icr = in_be32(io_base + FLIPPER_ICR);
-+ drv_printk(KERN_INFO, "%x\n", icr);
-+ return !(icr & FLIPPER_ICR_RSS);
-+ }
-+ return 0;
-+}
-+
-diff --git a/arch/powerpc/platforms/embedded6xx/flipper-pic.h b/arch/powerpc/platforms/embedded6xx/flipper-pic.h
-new file mode 100644
-index 0000000..483bee7
---- /dev/null
-+++ b/arch/powerpc/platforms/embedded6xx/flipper-pic.h
-@@ -0,0 +1,41 @@
-+/*
-+ * arch/powerpc/platforms/embedded6xx/flipper-pic.h
-+ *
-+ * Nintendo GameCube/Wii interrupt controller support.
-+ * Copyright (C) 2004-2009 The GameCube Linux Team
-+ * Copyright (C) 2007,2008,2009 Albert Herranz
-+ *
-+ * This program is free software; you can redistribute it and/or
-+ * modify it under the terms of the 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 __FLIPPER_PIC_H
-+#define __FLIPPER_PIC_H
-+
-+#define FLIPPER_NR_IRQS 32
-+
-+/*
-+ * Each interrupt has a corresponding bit in both
-+ * the Interrupt Cause (ICR) and Interrupt Mask (IMR) registers.
-+ *
-+ * Enabling/disabling an interrupt line involves asserting/clearing
-+ * the corresponding bit in IMR. ACK'ing a request simply involves
-+ * asserting the corresponding bit in ICR.
-+ */
-+#define FLIPPER_ICR 0x00
-+#define FLIPPER_ICR_RSS (1<<16) /* reset switch state */
-+
-+#define FLIPPER_IMR 0x04
-+
-+#define FLIPPER_RESET 0x24
-+
-+unsigned int flipper_pic_get_irq(void);
-+void __init flipper_pic_probe(void);
-+
-+void flipper_platform_reset(void);
-+int flipper_is_reset_button_pressed(void);
-+
-+#endif
-diff --git a/arch/powerpc/platforms/embedded6xx/gamecube.c b/arch/powerpc/platforms/embedded6xx/gamecube.c
-new file mode 100644
-index 0000000..b3b4db9
---- /dev/null
-+++ b/arch/powerpc/platforms/embedded6xx/gamecube.c
-@@ -0,0 +1,111 @@
-+/*
-+ * arch/powerpc/platforms/embedded6xx/gamecube.c
-+ *
-+ * Nintendo GameCube board-specific support
-+ * Copyright (C) 2004-2009 The GameCube Linux Team
-+ * Copyright (C) 2007,2008,2009 Albert Herranz
-+ *
-+ * This program is free software; you can redistribute it and/or
-+ * modify it under the terms of the 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/init.h>
-+#include <linux/irq.h>
-+#include <linux/kexec.h>
-+#include <linux/seq_file.h>
-+
-+#include <asm/io.h>
-+#include <asm/machdep.h>
-+#include <asm/prom.h>
-+#include <asm/time.h>
-+#include <asm/udbg.h>
-+
-+#include "flipper-pic.h"
-+#include "usbgecko_udbg.h"
-+
-+
-+static void gamecube_restart(char *cmd)
-+{
-+ local_irq_disable();
-+ flipper_platform_reset();
-+ /* spin until power button pressed */
-+ for (;;)
-+ cpu_relax();
-+}
-+
-+static void gamecube_power_off(void)
-+{
-+ local_irq_disable();
-+ /* spin until power button pressed */
-+ for (;;)
-+ cpu_relax();
-+}
-+
-+static void gamecube_halt(void)
-+{
-+ gamecube_restart(NULL);
-+}
-+
-+static void gamecube_show_cpuinfo(struct seq_file *m)
-+{
-+ seq_printf(m, "vendor\t\t: IBM\n");
-+ seq_printf(m, "machine\t\t: Nintendo GameCube\n");
-+}
-+
-+static void gamecube_setup_arch(void)
-+{
-+}
-+
-+static void __init gamecube_init_early(void)
-+{
-+ ug_udbg_init();
-+}
-+
-+static int __init gamecube_probe(void)
-+{
-+ unsigned long dt_root;
-+
-+ dt_root = of_get_flat_dt_root();
-+ if (!of_flat_dt_is_compatible(dt_root, "nintendo,gamecube"))
-+ return 0;
-+
-+ return 1;
-+}
-+
-+static void gamecube_shutdown(void)
-+{
-+ /* currently not used */
-+}
-+
-+#ifdef CONFIG_KEXEC
-+static int gamecube_kexec_prepare(struct kimage *image)
-+{
-+ return 0;
-+}
-+#endif /* CONFIG_KEXEC */
-+
-+
-+define_machine(gamecube) {
-+ .name = "gamecube",
-+ .probe = gamecube_probe,
-+ .setup_arch = gamecube_setup_arch,
-+ .init_early = gamecube_init_early,
-+ .show_cpuinfo = gamecube_show_cpuinfo,
-+ .restart = gamecube_restart,
-+ .power_off = gamecube_power_off,
-+ .halt = gamecube_halt,
-+ .init_IRQ = flipper_pic_probe,
-+ .get_irq = flipper_pic_get_irq,
-+ .calibrate_decr = generic_calibrate_decr,
-+ .progress = udbg_progress,
-+ .machine_shutdown = gamecube_shutdown,
-+#ifdef CONFIG_KEXEC
-+ .machine_kexec_prepare = gamecube_kexec_prepare,
-+ .machine_kexec = default_machine_kexec,
-+#endif
-+};
-+
-diff --git a/arch/powerpc/platforms/embedded6xx/gamecube_dev.c b/arch/powerpc/platforms/embedded6xx/gamecube_dev.c
-new file mode 100644
-index 0000000..13e1f73
---- /dev/null
-+++ b/arch/powerpc/platforms/embedded6xx/gamecube_dev.c
-@@ -0,0 +1,34 @@
-+/*
-+ * arch/powerpc/platforms/embedded6xx/gamecube_dev.c
-+ *
-+ * Nintendo GameCube platform device setup.
-+ * Copyright (C) 2008-2009 The GameCube Linux Team
-+ * Copyright (C) 2008,2009 Albert Herranz
-+ *
-+ * This program is free software; you can redistribute it and/or
-+ * modify it under the terms of the 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/init.h>
-+#include <linux/of_platform.h>
-+
-+#include <asm/machdep.h>
-+
-+static struct of_device_id gamecube_of_bus[] = {
-+ { .compatible = "nintendo,flipper", },
-+ { },
-+};
-+
-+static int __init gamecube_device_probe(void)
-+{
-+ if (!machine_is(gamecube))
-+ return 0;
-+
-+ of_platform_bus_probe(NULL, gamecube_of_bus, NULL);
-+ return 0;
-+}
-+device_initcall(gamecube_device_probe);
-diff --git a/arch/powerpc/platforms/embedded6xx/gcn-rsw.c b/arch/powerpc/platforms/embedded6xx/gcn-rsw.c
-new file mode 100644
-index 0000000..0bb20f0
---- /dev/null
-+++ b/arch/powerpc/platforms/embedded6xx/gcn-rsw.c
-@@ -0,0 +1,308 @@
-+/*
-+ * arch/powerpc/platforms/embedded6xx/gcn-rsw.c
-+ *
-+ * Nintendo GameCube/Wii reset switch (RSW) driver.
-+ * Copyright (C) 2004-2009 The GameCube Linux Team
-+ * Copyright (C) 2004 Stefan Esser
-+ * Copyright (C) 2004,2005,2008,2009 Albert Herranz
-+ *
-+ * This program is free software; you can redistribute it and/or
-+ * modify it under the terms of the 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/module.h>
-+#include <linux/init.h>
-+#include <linux/of_platform.h>
-+#include <linux/interrupt.h>
-+#include <linux/io.h>
-+#include <linux/spinlock.h>
-+#include <linux/delay.h>
-+#include <linux/reboot.h>
-+#include <linux/kexec.h>
-+
-+/* for flipper hardware registers */
-+#include "flipper-pic.h"
-+
-+#define DRV_MODULE_NAME "gcn-rsw"
-+#define DRV_DESCRIPTION "Nintendo GameCube/Wii Reset SWitch (RSW) driver"
-+#define DRV_AUTHOR "Stefan Esser <se@nopiracy.de>, " \
-+ "Albert Herranz"
-+
-+static char rsw_driver_version[] = "1.0i";
-+
-+#define drv_printk(level, format, arg...) \
-+ printk(level DRV_MODULE_NAME ": " format , ## arg)
-+
-+
-+#define RSW_NORMAL_TIMEOUT 3 /* seconds */
-+#define RSW_EMERGENCY_PUSHES 10
-+
-+enum rsw_state {
-+ IDLE = 0, /* nothing to do */
-+ NORMAL_RESET, /* reboot requested */
-+ EMERGENCY_RESET, /* try emergency reboot */
-+};
-+
-+struct rsw_drvdata {
-+ enum rsw_state state;
-+ struct timer_list timer;
-+ unsigned long jiffies;
-+ int pushes;
-+ int timeout;
-+ spinlock_t lock;
-+
-+ void __iomem *io_base;
-+ unsigned int irq;
-+
-+ struct device *dev;
-+};
-+
-+
-+/*
-+ * Tells if the reset button is pressed.
-+ */
-+static int rsw_is_button_pressed(void __iomem *io_base)
-+{
-+ u32 icr = in_be32(io_base + FLIPPER_ICR);
-+
-+ drv_printk(KERN_INFO, "%x\n", icr);
-+ return !(icr & FLIPPER_ICR_RSS);
-+}
-+
-+/*
-+ * Invokes a normal system restart.
-+ */
-+static void rsw_normal_restart(unsigned long dummy)
-+{
-+ ctrl_alt_del();
-+}
-+
-+/*
-+ * Performs a low level system restart.
-+ */
-+static void rsw_emergency_restart(void)
-+{
-+#ifdef CONFIG_KEXEC
-+ struct kimage *image;
-+ image = xchg(&kexec_image, 0);
-+ if (image)
-+ machine_kexec(image);
-+#endif
-+ machine_restart(NULL);
-+}
-+
-+/*
-+ * Handles the interrupt associated to the reset button.
-+ */
-+static irqreturn_t rsw_handler(int irq, void *data)
-+{
-+ struct rsw_drvdata *drvdata = (struct rsw_drvdata *)data;
-+ unsigned long flags;
-+
-+ if (!rsw_is_button_pressed(drvdata->io_base)) {
-+ /* nothing to do */
-+ return IRQ_HANDLED;
-+ }
-+
-+ spin_lock_irqsave(&drvdata->lock, flags);
-+
-+ /* someone pushed the reset button */
-+ switch (drvdata->state) {
-+ case IDLE:
-+ drvdata->state = NORMAL_RESET;
-+ printk(KERN_EMERG "Rebooting in %d seconds...\n",
-+ drvdata->timeout);
-+ printk(KERN_WARNING
-+ "Push the Reset button again to cancel reboot!\n");
-+
-+ /* schedule a reboot in a few seconds */
-+ init_timer(&drvdata->timer);
-+ drvdata->timer.expires = jiffies + drvdata->timeout * HZ;
-+ drvdata->timer.function =
-+ (void (*)(unsigned long))rsw_normal_restart;
-+ add_timer(&drvdata->timer);
-+ drvdata->jiffies = jiffies;
-+ break;
-+ case NORMAL_RESET:
-+ if (time_before(jiffies,
-+ drvdata->jiffies + drvdata->timeout * HZ)) {
-+ /* the reset button was hit again before deadline */
-+ del_timer(&drvdata->timer);
-+ drvdata->state = IDLE;
-+ printk(KERN_EMERG "Reboot cancelled!\n");
-+ } else {
-+ /*
-+ * Time expired. System should be now restarting.
-+ * Go to emergency mode in case something goes bad.
-+ */
-+ drvdata->state = EMERGENCY_RESET;
-+ drvdata->pushes = 0;
-+ printk(KERN_WARNING
-+ "SWITCHED TO EMERGENCY RESET MODE!\n"
-+ "Push %d times the Reset button to force"
-+ " a hard reset!\n"
-+ "NOTE THAT THIS COULD CAUSE DATA LOSS!\n",
-+ RSW_EMERGENCY_PUSHES);
-+ }
-+ break;
-+ case EMERGENCY_RESET:
-+ /* force a hard reset if the user insists ... */
-+ if (++drvdata->pushes >= RSW_EMERGENCY_PUSHES) {
-+ spin_unlock_irqrestore(&drvdata->lock, flags);
-+ rsw_emergency_restart();
-+ return IRQ_HANDLED;
-+ } else {
-+ printk(KERN_INFO "%d/%d\n", drvdata->pushes,
-+ RSW_EMERGENCY_PUSHES);
-+ }
-+ break;
-+ }
-+
-+ spin_unlock_irqrestore(&drvdata->lock, flags);
-+
-+ return IRQ_HANDLED;
-+}
-+
-+/*
-+ * Setup routines.
-+ *
-+ */
-+
-+static int rsw_init(struct rsw_drvdata *drvdata, struct resource *mem, int irq)
-+{
-+ int retval;
-+
-+ drvdata->io_base = ioremap(mem->start, mem->end - mem->start + 1);
-+ drvdata->irq = irq;
-+
-+ spin_lock_init(&drvdata->lock);
-+ drvdata->state = IDLE;
-+ drvdata->timeout = RSW_NORMAL_TIMEOUT;
-+
-+ retval = request_irq(drvdata->irq, rsw_handler, 0,
-+ DRV_MODULE_NAME, drvdata);
-+ if (retval) {
-+ drv_printk(KERN_ERR, "request of IRQ %d failed\n",
-+ drvdata->irq);
-+ }
-+ return retval;
-+}
-+
-+static void rsw_exit(struct rsw_drvdata *drvdata)
-+{
-+ free_irq(drvdata->irq, drvdata);
-+ if (drvdata->io_base) {
-+ iounmap(drvdata->io_base);
-+ drvdata->io_base = NULL;
-+ }
-+}
-+
-+/*
-+ * Driver model helper routines.
-+ *
-+ */
-+
-+static int rsw_do_probe(struct device *dev, struct resource *mem, int irq)
-+{
-+ struct rsw_drvdata *drvdata;
-+ int retval;
-+
-+ drvdata = kzalloc(sizeof(*drvdata), GFP_KERNEL);
-+ if (!drvdata) {
-+ drv_printk(KERN_ERR, "failed to allocate rsw_drvdata\n");
-+ return -ENOMEM;
-+ }
-+ dev_set_drvdata(dev, drvdata);
-+ drvdata->dev = dev;
-+
-+ retval = rsw_init(drvdata, mem, irq);
-+ if (retval) {
-+ dev_set_drvdata(dev, NULL);
-+ kfree(drvdata);
-+ }
-+ return retval;
-+}
-+
-+static int rsw_do_remove(struct device *dev)
-+{
-+ struct rsw_drvdata *drvdata = dev_get_drvdata(dev);
-+
-+ if (drvdata) {
-+ rsw_exit(drvdata);
-+ dev_set_drvdata(dev, NULL);
-+ kfree(drvdata);
-+ return 0;
-+ }
-+ return -ENODEV;
-+}
-+
-+/*
-+ * OF platform driver hooks.
-+ *
-+ */
-+
-+static int __init rsw_of_probe(struct of_device *odev,
-+ const struct of_device_id *match)
-+{
-+ struct resource mem;
-+ int retval;
-+
-+ retval = of_address_to_resource(odev->node, 0, &mem);
-+ if (retval) {
-+ drv_printk(KERN_ERR, "no io memory range found\n");
-+ return -ENODEV;
-+ }
-+
-+ return rsw_do_probe(&odev->dev,
-+ &mem, irq_of_parse_and_map(odev->node, 0));
-+}
-+
-+static int __exit rsw_of_remove(struct of_device *odev)
-+{
-+ return rsw_do_remove(&odev->dev);
-+}
-+
-+static struct of_device_id rsw_of_match[] = {
-+ {.compatible = "nintendo,flipper-resetswitch"},
-+ {.compatible = "nintendo,hollywood-resetswitch"},
-+ {},
-+};
-+
-+MODULE_DEVICE_TABLE(of, rsw_of_match);
-+
-+static struct of_platform_driver rsw_of_driver = {
-+ .owner = THIS_MODULE,
-+ .name = DRV_MODULE_NAME,
-+ .match_table = rsw_of_match,
-+ .probe = rsw_of_probe,
-+ .remove = rsw_of_remove,
-+};
-+
-+/*
-+ * Kernel module hooks.
-+ *
-+ */
-+
-+static int __init rsw_init_module(void)
-+{
-+ drv_printk(KERN_INFO, "%s - version %s\n", DRV_DESCRIPTION,
-+ rsw_driver_version);
-+
-+ return of_register_platform_driver(&rsw_of_driver);
-+}
-+
-+static void __exit rsw_exit_module(void)
-+{
-+ of_unregister_platform_driver(&rsw_of_driver);
-+}
-+
-+module_init(rsw_init_module);
-+module_exit(rsw_exit_module);
-+
-+MODULE_DESCRIPTION(DRV_DESCRIPTION);
-+MODULE_AUTHOR(DRV_AUTHOR);
-+MODULE_LICENSE("GPL");
-diff --git a/arch/powerpc/platforms/embedded6xx/gcnvi_udbg.c b/arch/powerpc/platforms/embedded6xx/gcnvi_udbg.c
-new file mode 100644
-index 0000000..6b63e48
---- /dev/null
-+++ b/arch/powerpc/platforms/embedded6xx/gcnvi_udbg.c
-@@ -0,0 +1,315 @@
-+/*
-+ * arch/powerpc/platforms/embedded6xx/gcnvi_udbg.c
-+ *
-+ * Nintendo GameCube/Wii framebuffer udbg output support.
-+ * Copyright (C) 2008-2009 The GameCube Linux Team
-+ * Copyright (C) 2008,2009 Albert Herranz
-+ *
-+ * Based on arch/ppc/platforms/gcn-con.c
-+ *
-+ * Nintendo GameCube early debug console
-+ * Copyright (C) 2004-2005 The GameCube Linux Team
-+ *
-+ * Based on console.c by tmbinc.
-+ *
-+ * This program is free software; you can redistribute it and/or
-+ * modify it under the terms of the 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/io.h>
-+#include <linux/string.h>
-+#include <linux/console.h>
-+#include <linux/font.h>
-+#include <asm/prom.h>
-+#include <asm/udbg.h>
-+#include <mm/mmu_decl.h>
-+
-+#include "gcnvi_udbg.h"
-+
-+/*
-+ * Console settings.
-+ *
-+ */
-+#define SCREEN_WIDTH 640
-+#define SCREEN_HEIGHT 480
-+
-+#define FONT_XSIZE 8
-+#define FONT_YSIZE 16
-+#define FONT_XFACTOR 1
-+#define FONT_YFACTOR 1
-+#define FONT_XGAP 2
-+#define FONT_YGAP 0
-+
-+#define COLOR_WHITE 0xFF80FF80
-+#define COLOR_BLACK 0x00800080
-+
-+struct console_data {
-+ unsigned char *framebuffer;
-+ int xres, yres, stride;
-+
-+ const unsigned char *font;
-+
-+ int cursor_x, cursor_y;
-+ int foreground, background;
-+
-+ int border_left, border_right, border_top, border_bottom;
-+
-+ int scrolled_lines;
-+};
-+
-+static struct console_data *default_console;
-+
-+#if 0
-+static int console_set_color(int background, int foreground)
-+{
-+ default_console->foreground = foreground;
-+ default_console->background = background;
-+ return 0;
-+}
-+#endif
-+
-+static void console_drawc(struct console_data *con, int x, int y,
-+ unsigned char c)
-+{
-+ int ax, ay;
-+ unsigned long *ptr;
-+ unsigned long color, color2x[2];
-+ int bits;
-+
-+ x >>= 1;
-+ ptr = (unsigned long *)(con->framebuffer + con->stride * y + x * 4);
-+
-+ for (ay = 0; ay < FONT_YSIZE; ay++) {
-+#if FONT_XFACTOR == 2
-+ for (ax = 0; ax < 8; ax++) {
-+ if ((con->font[c * FONT_YSIZE + ay] << ax) & 0x80)
-+ color = con->foreground;
-+ else
-+ color = con->background;
-+#if FONT_YFACTOR == 2
-+ /* pixel doubling: we write u32 */
-+ ptr[ay * 2 * con->stride / 4 + ax] = color;
-+ /* line doubling */
-+ ptr[(ay * 2 + 1) * con->stride / 4 + ax] = color;
-+#else
-+ ptr[ay * con->stride / 4 + ax] = color;
-+#endif
-+ }
-+#else
-+ for (ax = 0; ax < 4; ax++) {
-+ bits = (con->font[c * FONT_YSIZE + ay] << (ax * 2));
-+ if (bits & 0x80)
-+ color2x[0] = con->foreground;
-+ else
-+ color2x[0] = con->background;
-+ if (bits & 0x40)
-+ color2x[1] = con->foreground;
-+ else
-+ color2x[1] = con->background;
-+ ptr[ay * con->stride / 4 + ax] =
-+ (color2x[0] & 0xFFFF00FF) |
-+ (color2x[1] & 0x0000FF00);
-+ }
-+#endif
-+ }
-+}
-+
-+static void console_putc(struct console_data *con, char c)
-+{
-+ int cnt;
-+ unsigned long *ptr;
-+
-+ switch (c) {
-+ case '\n':
-+ con->cursor_y += FONT_YSIZE * FONT_YFACTOR + FONT_YGAP;
-+ con->cursor_x = con->border_left;
-+ break;
-+ default:
-+ console_drawc(con, con->cursor_x, con->cursor_y, c);
-+ con->cursor_x += FONT_XSIZE * FONT_XFACTOR + FONT_XGAP;
-+ if ((con->cursor_x + (FONT_XSIZE * FONT_XFACTOR)) >
-+ con->border_right) {
-+ con->cursor_y += FONT_YSIZE * FONT_YFACTOR + FONT_YGAP;
-+ con->cursor_x = con->border_left;
-+ }
-+ }
-+ if ((con->cursor_y + FONT_YSIZE * FONT_YFACTOR) >= con->border_bottom) {
-+ memcpy(con->framebuffer,
-+ con->framebuffer +
-+ con->stride * (FONT_YSIZE * FONT_YFACTOR + FONT_YGAP),
-+ con->stride * con->yres - FONT_YSIZE);
-+ cnt = (con->stride * (FONT_YSIZE*FONT_YFACTOR + FONT_YGAP)) / 4;
-+ ptr = (unsigned long *)(con->framebuffer +
-+ con->stride * (con->yres - FONT_YSIZE));
-+ while (cnt--)
-+ *ptr++ = con->background;
-+ con->cursor_y -= FONT_YSIZE * FONT_YFACTOR + FONT_YGAP;
-+ }
-+}
-+
-+static void console_init(struct console_data *con, void *framebuffer,
-+ int xres, int yres, int stride)
-+{
-+ int c;
-+ unsigned long *p;
-+
-+ con->framebuffer = framebuffer;
-+ con->xres = xres;
-+ con->yres = yres;
-+ con->border_left = 0;
-+ con->border_top = 0;
-+ con->border_right = con->xres;
-+ con->border_bottom = con->yres;
-+ con->stride = stride;
-+ con->cursor_x = con->cursor_y = 0;
-+
-+ con->font = font_vga_8x16.data;
-+
-+ con->foreground = COLOR_WHITE;
-+ con->background = COLOR_BLACK;
-+
-+ con->scrolled_lines = 0;
-+
-+ /* clear screen */
-+ c = con->xres * con->yres / 2;
-+ p = (unsigned long *)con->framebuffer;
-+ while (c--)
-+ *p++ = con->background;
-+
-+ default_console = con;
-+}
-+
-+/*
-+ * Video hardware setup.
-+ *
-+ */
-+
-+/* Hardware registers */
-+#define VI_TFBL 0x1c
-+#define VI_TFBR 0x20
-+#define VI_BFBL 0x24
-+#define VI_BFBR 0x28
-+#define VI_DPV 0x2c
-+
-+/* NTSC settings (640x480) */
-+static const u32 vi_Mode640X480NtscYUV16[32] = {
-+ 0x0F060001, 0x476901AD, 0x02EA5140, 0x00030018,
-+ 0x00020019, 0x410C410C, 0x40ED40ED, 0x00435A4E,
-+ 0x00000000, 0x00435A4E, 0x00000000, 0x00000000,
-+ 0x110701AE, 0x10010001, 0x00010001, 0x00010001,
-+ 0x00000000, 0x00000000, 0x28500100, 0x1AE771F0,
-+ 0x0DB4A574, 0x00C1188E, 0xC4C0CBE2, 0xFCECDECF,
-+ 0x13130F08, 0x00080C0F, 0x00FF0000, 0x00000000,
-+ 0x02800000, 0x000000FF, 0x00FF00FF, 0x00FF00FF
-+};
-+
-+static void vi_setup_video(void __iomem *io_base, unsigned long xfb_start)
-+{
-+ const u32 *regs = vi_Mode640X480NtscYUV16;
-+ int i;
-+
-+ /* initialize video registers */
-+ for (i = 0; i < 7; i++)
-+ out_be32(io_base + i * sizeof(__u32), regs[i]);
-+
-+ out_be32(io_base + VI_TFBR, regs[VI_TFBR / sizeof(__u32)]);
-+ out_be32(io_base + VI_BFBR, regs[VI_BFBR / sizeof(__u32)]);
-+ out_be32(io_base + VI_DPV, regs[VI_DPV / sizeof(__u32)]);
-+ for (i = 16; i < 32; i++)
-+ out_be32(io_base + i * sizeof(__u32), regs[i]);
-+
-+ /* set framebuffer address, interlaced mode */
-+ out_be32(io_base + VI_TFBL, 0x10000000 | (xfb_start >> 5));
-+ xfb_start += 2 * SCREEN_WIDTH; /* line length */
-+ out_be32(io_base + VI_BFBL, 0x10000000 | (xfb_start >> 5));
-+}
-+
-+/*
-+ * Retrieves and prepares the virtual address needed to access the hardware.
-+ */
-+static void __iomem *vi_setup_io_base(struct device_node *np)
-+{
-+ phys_addr_t paddr;
-+ const unsigned int *reg;
-+ void *io_base = NULL;
-+
-+ reg = of_get_property(np, "reg", NULL);
-+ if (reg) {
-+ paddr = of_translate_address(np, reg);
-+ if (paddr)
-+ io_base = ioremap(paddr, reg[1]);
-+ }
-+ return io_base;
-+}
-+
-+/*
-+ * udbg functions.
-+ *
-+ */
-+
-+/* OF bindings */
-+static struct of_device_id gcnvi_udbg_ids[] __initdata = {
-+ { .compatible = "nintendo,hollywood-video", },
-+ { .compatible = "nintendo,gamecube-video", },
-+};
-+
-+static struct console_data gcnvi_udbg_console;
-+
-+/*
-+ * Transmits a character.
-+ */
-+void gcnvi_udbg_putc(char ch)
-+{
-+ if (default_console)
-+ console_putc(default_console, ch);
-+}
-+
-+/*
-+ * Initializes udbg support.
-+ */
-+void __init gcnvi_udbg_init(void)
-+{
-+ unsigned long xfb_start = 0, xfb_size = 0;
-+ struct device_node *np = NULL;
-+ const unsigned long *prop;
-+ void *screen_base;
-+ void *io_base;
-+
-+ for_each_matching_node(np, gcnvi_udbg_ids) {
-+ if (np)
-+ break;
-+ }
-+ if (!np)
-+ return;
-+
-+ prop = of_get_property(np, "xfb-start", NULL);
-+ if (prop) {
-+ xfb_start = *prop;
-+ prop = of_get_property(np, "xfb-size", NULL);
-+ if (prop)
-+ xfb_size = *prop;
-+ }
-+ io_base = vi_setup_io_base(np);
-+
-+ of_node_put(np);
-+
-+ if (!prop || !io_base)
-+ return;
-+
-+ if (xfb_size < 2 * SCREEN_WIDTH * SCREEN_HEIGHT)
-+ return;
-+
-+ screen_base = ioremap_nocache(xfb_start, xfb_size);
-+ if (!screen_base)
-+ return;
-+
-+ vi_setup_video(io_base, xfb_start);
-+ console_init(&gcnvi_udbg_console, screen_base,
-+ SCREEN_WIDTH, SCREEN_HEIGHT, 2 * SCREEN_WIDTH);
-+
-+ udbg_putc = gcnvi_udbg_putc;
-+ printk(KERN_INFO "gcnvi_udbg: ready\n");
-+}
-diff --git a/arch/powerpc/platforms/embedded6xx/gcnvi_udbg.h b/arch/powerpc/platforms/embedded6xx/gcnvi_udbg.h
-new file mode 100644
-index 0000000..daba549
---- /dev/null
-+++ b/arch/powerpc/platforms/embedded6xx/gcnvi_udbg.h
-@@ -0,0 +1,30 @@
-+/*
-+ * arch/powerpc/platforms/embedded6xx/gcnvi_udbg.h
-+ *
-+ * Nintendo GameCube/Wii framebuffer udbg output support.
-+ * Copyright (C) 2008-2009 The GameCube Linux Team
-+ * Copyright (C) 2008,2009 Albert Herranz
-+ *
-+ * This program is free software; you can redistribute it and/or
-+ * modify it under the terms of the 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 __GCNVI_UDBG_H
-+#define __GCNVI_UDBG_H
-+
-+#ifdef CONFIG_GAMECUBE_VIDEO_UDBG
-+
-+extern void __init gcnvi_udbg_init(void);
-+
-+#else
-+
-+static inline void __init gcnvi_udbg_init(void)
-+{
-+}
-+
-+#endif /* CONFIG_GAMECUBE_VIDEO_UDBG */
-+
-+#endif /* __GCNVI_UDBG_H */
-diff --git a/arch/powerpc/platforms/embedded6xx/starlet-es.c b/arch/powerpc/platforms/embedded6xx/starlet-es.c
-new file mode 100644
-index 0000000..a975f64
---- /dev/null
-+++ b/arch/powerpc/platforms/embedded6xx/starlet-es.c
-@@ -0,0 +1,592 @@
-+/*
-+ * arch/powerpc/platforms/embedded6xx/starlet-es.c
-+ *
-+ * Nintendo Wii starlet ES routines
-+ * Copyright (C) 2008-2009 The GameCube Linux Team
-+ * Copyright (C) 2008,2009 Albert Herranz
-+ *
-+ * This program is free software; you can redistribute it and/or
-+ * modify it under the terms of the GNU General Public License
-+ * as published by the Free Software Foundation; either version 2
-+ * of the License, or (at your option) any later version.
-+ *
-+ */
-+
-+#define DEBUG
-+
-+#include <linux/kernel.h>
-+#include <linux/of_platform.h>
-+#include <linux/scatterlist.h>
-+#include <asm/starlet.h>
-+
-+#define DRV_MODULE_NAME "starlet-es"
-+#define DRV_DESCRIPTION "Nintendo Wii starlet ES driver"
-+#define DRV_AUTHOR "Albert Herranz"
-+
-+static const char starlet_es_driver_version[] = "0.2i";
-+
-+#define DBG(fmt, arg...) pr_debug(fmt, ##arg)
-+
-+#define drv_printk(level, format, arg...) \
-+ printk(level DRV_MODULE_NAME ": " format , ## arg)
-+
-+struct starlet_es_device {
-+ int fd;
-+
-+ struct device *dev;
-+};
-+
-+struct starlet_es_ticket_limit {
-+ u32 tag;
-+ u32 value;
-+} __attribute__((packed));
-+
-+struct starlet_es_ticket_view {
-+ u32 view;
-+ u64 ticketid;
-+ u32 devicetype;
-+ u64 title;
-+ u16 access_mask;
-+ u8 reserved[0x3c];
-+ u8 cidx_mask[0x40];
-+ u16 padding;
-+ struct starlet_es_ticket_limit limits[8];
-+} __attribute__((packed));
-+
-+#if 0
-+struct starlet_es_ticket {
-+ char issuer[0x40];
-+ u8 fill[63]; /* TODO: not really fill */
-+ u8 title_key[16];
-+ u8 fill2;
-+ u64 ticketid;
-+ u32 devicetype;
-+ u64 title;
-+ u16 access_mask;
-+ u8 reserved[0x3c];
-+ u8 cidx_mask[0x40];
-+ u16 padding;
-+ struct starlet_es_ticket_limit limits[8];
-+} __attribute__((packed));
-+#endif
-+
-+/*
-+ * /dev/es
-+ *
-+ */
-+
-+#define ES_IOCTLV_LAUNCHTITLE 0x08
-+#define ES_IOCTLV_GETTITLECOUNT 0x0e
-+#define ES_IOCTLV_GETTITLES 0x0f
-+#define ES_IOCTLV_GETTICKETVIEWCOUNT 0x12
-+#define ES_IOCTLV_GETTICKETVIEWS 0x13
-+
-+static const char dev_es[] = "/dev/es";
-+
-+/*
-+ * Handy small buffer routines.
-+ * We use a small static aligned buffer to avoid allocations for short-lived
-+ * operations involving 1 to 4 byte data transfers to/from IOS.
-+ *
-+ */
-+
-+static u32 es_small_buf[L1_CACHE_BYTES / sizeof(u32)]
-+ __attribute__ ((aligned(STARLET_IPC_DMA_ALIGN + 1)));
-+static const size_t es_small_buf_size = sizeof(es_small_buf_size);
-+static DEFINE_MUTEX(es_small_buf_lock);
-+
-+static u32 *es_small_buf_get(void)
-+{
-+ u32 *buf;
-+
-+ if (!mutex_trylock(&es_small_buf_lock))
-+ buf = starlet_kzalloc(es_small_buf_size, GFP_KERNEL);
-+ else {
-+ memset(es_small_buf, 0, es_small_buf_size);
-+ buf = es_small_buf;
-+ }
-+
-+ return buf;
-+}
-+
-+static void es_small_buf_put(u32 *buf)
-+{
-+ if (buf == es_small_buf)
-+ mutex_unlock(&es_small_buf_lock);
-+ else
-+ starlet_kfree(buf);
-+}
-+
-+#if 0
-+static void es_small_buf_dump(void)
-+{
-+ int i;
-+ size_t nelems = sizeof(es_small_buf) / sizeof(u32);
-+
-+ drv_printk(KERN_INFO, "es_small_buf[%d]= {\n", nelems);
-+ for (i = 0; i < nelems; i++)
-+ drv_printk(KERN_INFO, "%08x, ", es_small_buf[i]);
-+ drv_printk(KERN_INFO, "\n}\n");
-+
-+}
-+#endif
-+
-+/*
-+ *
-+ *
-+ */
-+
-+static struct starlet_es_device *starlet_es_device_instance;
-+
-+/**
-+ *
-+ */
-+struct starlet_es_device *starlet_es_get_device(void)
-+{
-+ if (!starlet_es_device_instance)
-+ drv_printk(KERN_ERR, "uninitialized device instance!\n");
-+ return starlet_es_device_instance;
-+}
-+EXPORT_SYMBOL_GPL(starlet_es_get_device);
-+
-+/**
-+ *
-+ */
-+int starlet_es_get_title_count(unsigned long *count)
-+{
-+ struct starlet_es_device *es_dev = starlet_es_get_device();
-+ struct scatterlist io[1];
-+ u32 *count_buf;
-+ int error;
-+
-+ if (!es_dev)
-+ return -ENODEV;
-+
-+ count_buf = es_small_buf_get();
-+ if (!count_buf)
-+ return -ENOMEM;
-+
-+ *count_buf = 0;
-+ sg_init_one(io, count_buf, sizeof(*count_buf));
-+
-+ error = starlet_ioctlv(es_dev->fd, ES_IOCTLV_GETTITLECOUNT,
-+ 0, NULL, 1, io);
-+ if (error)
-+ DBG("%s: error=%d (%08x)\n", __func__, error, error);
-+ else
-+ *count = *count_buf;
-+
-+ es_small_buf_put(count_buf);
-+
-+ return error;
-+}
-+
-+/**
-+ *
-+ */
-+int starlet_es_get_titles(u64 *titles, unsigned long count)
-+{
-+ struct starlet_es_device *es_dev = starlet_es_get_device();
-+ struct scatterlist in[1], io[1];
-+ u32 *count_buf;
-+ int error;
-+
-+ if (!es_dev)
-+ return -ENODEV;
-+
-+ count_buf = es_small_buf_get();
-+ if (!count_buf)
-+ return -ENOMEM;
-+
-+ *count_buf = count;
-+ sg_init_one(in, count_buf, sizeof(*count_buf));
-+ sg_init_one(io, titles, sizeof(*titles)*count);
-+
-+ error = starlet_ioctlv(es_dev->fd, ES_IOCTLV_GETTITLES,
-+ 1, in, 1, io);
-+ if (error)
-+ DBG("%s: error=%d (%08x)\n", __func__, error, error);
-+
-+ es_small_buf_put(count_buf);
-+
-+ return error;
-+}
-+
-+/**
-+ *
-+ */
-+int starlet_es_get_ticket_view_count(u64 title, unsigned long *count)
-+{
-+ struct starlet_es_device *es_dev = starlet_es_get_device();
-+ struct scatterlist in[1], io[1];
-+ u64 *title_buf;
-+ u32 *count_buf;
-+ int error;
-+
-+ if (!es_dev)
-+ return -ENODEV;
-+
-+ title_buf = starlet_kzalloc(sizeof(*title_buf), GFP_KERNEL);
-+ if (!title_buf)
-+ return -ENOMEM;
-+
-+ count_buf = es_small_buf_get();
-+ if (!count_buf) {
-+ starlet_kfree(title_buf);
-+ return -ENOMEM;
-+ }
-+
-+ *title_buf = title;
-+ sg_init_one(in, title_buf, sizeof(*title_buf));
-+ sg_init_one(io, count_buf, sizeof(*count_buf));
-+
-+ error = starlet_ioctlv(es_dev->fd, ES_IOCTLV_GETTICKETVIEWCOUNT,
-+ 1, in, 1, io);
-+ if (error)
-+ DBG("%s: error=%d (%08x)\n", __func__, error, error);
-+ else
-+ *count = *count_buf;
-+
-+ starlet_kfree(title_buf);
-+ es_small_buf_put(count_buf);
-+
-+ return error;
-+}
-+
-+/**
-+ *
-+ */
-+int starlet_es_get_ticket_views(u64 title,
-+ struct starlet_es_ticket_view *views,
-+ unsigned long count)
-+{
-+ struct starlet_es_device *es_dev = starlet_es_get_device();
-+ struct scatterlist in[2], io[1];
-+ u32 *count_buf;
-+ u64 *title_buf;
-+ int error;
-+
-+ if (!es_dev)
-+ return -ENODEV;
-+
-+ title_buf = starlet_kzalloc(sizeof(*title_buf), GFP_KERNEL);
-+ if (!title_buf)
-+ return -ENOMEM;
-+
-+ count_buf = es_small_buf_get();
-+ if (!count_buf) {
-+ starlet_kfree(title_buf);
-+ return -ENOMEM;
-+ }
-+
-+ *title_buf = title;
-+ *count_buf = count;
-+ sg_init_table(in, 2);
-+ sg_set_buf(&in[0], title_buf, sizeof(*title_buf));
-+ sg_set_buf(&in[1], count_buf, sizeof(*count_buf));
-+
-+ sg_init_one(io, views, sizeof(*views)*count);
-+
-+ error = starlet_ioctlv(es_dev->fd, ES_IOCTLV_GETTICKETVIEWS,
-+ 2, in, 1, io);
-+ if (error)
-+ DBG("%s: error=%d (%08x)\n", __func__, error, error);
-+
-+ es_small_buf_put(count_buf);
-+ starlet_kfree(title_buf);
-+
-+ return error;
-+}
-+
-+/**
-+ *
-+ */
-+int starlet_es_launch_title_view(u64 title, struct starlet_es_ticket_view *view)
-+{
-+ struct starlet_es_device *es_dev = starlet_es_get_device();
-+ struct scatterlist in[2];
-+ u64 *title_buf;
-+ int error;
-+
-+ if (!es_dev)
-+ return -ENODEV;
-+
-+ title_buf = starlet_kzalloc(sizeof(*title_buf), GFP_KERNEL);
-+ if (!title_buf)
-+ return -ENOMEM;
-+
-+ *title_buf = title;
-+ sg_init_table(in, 2);
-+ sg_set_buf(&in[0], title_buf, sizeof(*title_buf));
-+ sg_set_buf(&in[1], view, sizeof(*view));
-+
-+ error = starlet_ioctlv_and_reboot(es_dev->fd,
-+ ES_IOCTLV_LAUNCHTITLE,
-+ 2, in, 0, NULL);
-+ if (error)
-+ DBG("%s: error=%d (%08x)\n", __func__, error, error);
-+
-+ starlet_kfree(title_buf);
-+
-+ return error;
-+}
-+
-+
-+
-+/*
-+ * Setup routines.
-+ *
-+ */
-+
-+#define STARLET_ES_IOS_MIN 30
-+#define STARLET_ES_IOS_MAX 36
-+
-+static int starlet_es_find_newest_title(struct starlet_es_device *es_dev,
-+ u64 *title,
-+ u64 title_min, u64 title_max)
-+{
-+ u64 *titles;
-+ u64 candidate;
-+ unsigned long count;
-+ int found, i;
-+ int error;
-+
-+ error = starlet_es_get_title_count(&count);
-+ if (error)
-+ return error;
-+
-+ titles = starlet_kzalloc(sizeof(*titles)*count, GFP_KERNEL);
-+ if (!titles) {
-+ DBG("%s: out of memory\n", __func__);
-+ return -ENOMEM;
-+ }
-+
-+ error = starlet_es_get_titles(titles, count);
-+ if (error) {
-+ starlet_kfree(titles);
-+ return error;
-+ }
-+
-+ found = 0;
-+ candidate = title_min;
-+ for (i = 0; i < count; i++) {
-+ if (titles[i] > candidate && titles[i] <= title_max) {
-+ candidate = titles[i];
-+ found = 1;
-+ }
-+ }
-+
-+ starlet_kfree(titles);
-+
-+ if (!found)
-+ return 0;
-+
-+ *title = candidate;
-+
-+ return 1;
-+}
-+
-+static int starlet_es_launch_title(struct starlet_es_device *es_dev, u64 title)
-+{
-+ struct starlet_es_ticket_view *views;
-+ unsigned long count;
-+ int error;
-+
-+ error = starlet_es_get_ticket_view_count(title, &count);
-+ if (error)
-+ return error;
-+
-+ views = starlet_kzalloc(sizeof(*views)*count, GFP_KERNEL);
-+ if (!views) {
-+ DBG("%s: out of memory\n", __func__);
-+ return -ENOMEM;
-+ }
-+
-+ error = starlet_es_get_ticket_views(title, views, count);
-+ if (error) {
-+ starlet_kfree(views);
-+ return error;
-+ }
-+
-+ drv_printk(KERN_INFO, "launching IOS%u\n", (u32)(title & 0xffffffff));
-+ error = starlet_es_launch_title_view(title, views); /* first view */
-+
-+ starlet_kfree(views);
-+
-+ return error;
-+}
-+
-+static int starlet_es_load_preferred(struct starlet_es_device *es_dev,
-+ u64 ios_min, u64 ios_max)
-+{
-+ u64 title;
-+ int error;
-+
-+ error = starlet_es_find_newest_title(es_dev, &title, ios_min, ios_max);
-+ if (!error)
-+ return -EINVAL;
-+ if (error > 0)
-+ error = starlet_es_launch_title(es_dev, title);
-+
-+ return error;
-+}
-+
-+static int starlet_nwc24_stop_scheduler(void)
-+{
-+ void *obuf;
-+ const size_t osize = 0x20;
-+ int fd;
-+ int error = 0;
-+
-+ obuf = es_small_buf_get();
-+ if (!obuf)
-+ return -ENOMEM;
-+
-+ fd = starlet_open("/dev/net/kd/request", 0);
-+ if (fd >= 0) {
-+ error = starlet_ioctl(fd, 1, NULL, 0, obuf, osize);
-+ starlet_close(fd);
-+ }
-+
-+ es_small_buf_put(obuf);
-+
-+ if (error)
-+ DBG("%s: error=%d (%08x)\n", __func__, error, error);
-+ return error;
-+}
-+
-+static int starlet_es_init(struct starlet_es_device *es_dev)
-+{
-+ u64 ios_min, ios_max;
-+ int error;
-+
-+ error = starlet_open(dev_es, 0);
-+ if (error >= 0) {
-+ starlet_es_device_instance = es_dev;
-+ es_dev->fd = error;
-+
-+ ios_min = 0x100000000ULL | STARLET_ES_IOS_MIN;
-+ ios_max = 0x100000000ULL | STARLET_ES_IOS_MAX;
-+
-+ error = starlet_es_load_preferred(es_dev, ios_min, ios_max);
-+ if (error) {
-+ drv_printk(KERN_WARNING, "unable to load preferred"
-+ " IOS version (min %llx, max %llx)\n",
-+ ios_min, ios_max);
-+ }
-+ }
-+
-+ /*
-+ * Try to disable the Nintendo Wifi Connect 24 scheduler.
-+ * And do this even if we failed to load our preferred IOS.
-+ *
-+ * When the scheduler kicks in, starlet IPC calls from Broadway fail.
-+ */
-+ starlet_nwc24_stop_scheduler();
-+
-+ return error;
-+}
-+
-+static void starlet_es_exit(struct starlet_es_device *es_dev)
-+{
-+ starlet_es_device_instance = NULL;
-+ starlet_close(es_dev->fd);
-+ es_dev->fd = -1;
-+}
-+
-+
-+/*
-+ * Driver model helper routines.
-+ *
-+ */
-+
-+static int starlet_es_do_probe(struct device *dev)
-+{
-+ struct starlet_es_device *es_dev;
-+ int retval;
-+
-+ es_dev = kzalloc(sizeof(*es_dev), GFP_KERNEL);
-+ if (!es_dev) {
-+ drv_printk(KERN_ERR, "failed to allocate es_dev\n");
-+ return -ENOMEM;
-+ }
-+ dev_set_drvdata(dev, es_dev);
-+ es_dev->dev = dev;
-+
-+ retval = starlet_es_init(es_dev);
-+ if (retval) {
-+ dev_set_drvdata(dev, NULL);
-+ kfree(es_dev);
-+ }
-+ return retval;
-+}
-+
-+static int starlet_es_do_remove(struct device *dev)
-+{
-+ struct starlet_es_device *es_dev = dev_get_drvdata(dev);
-+
-+ if (es_dev) {
-+ starlet_es_exit(es_dev);
-+ dev_set_drvdata(dev, NULL);
-+ kfree(es_dev);
-+ return 0;
-+ }
-+ return -ENODEV;
-+}
-+
-+/*
-+ * OF platform driver hooks.
-+ *
-+ */
-+
-+static int starlet_es_of_probe(struct of_device *odev,
-+ const struct of_device_id *dev_id)
-+{
-+ return starlet_es_do_probe(&odev->dev);
-+}
-+
-+static int starlet_es_of_remove(struct of_device *odev)
-+{
-+ return starlet_es_do_remove(&odev->dev);
-+}
-+
-+static struct of_device_id starlet_es_of_match[] = {
-+ { .compatible = "nintendo,starlet-es" },
-+ { },
-+};
-+
-+MODULE_DEVICE_TABLE(of, starlet_es_of_match);
-+
-+static struct of_platform_driver starlet_es_of_driver = {
-+ .owner = THIS_MODULE,
-+ .name = DRV_MODULE_NAME,
-+ .match_table = starlet_es_of_match,
-+ .probe = starlet_es_of_probe,
-+ .remove = starlet_es_of_remove,
-+};
-+
-+/*
-+ * Kernel module interface hooks.
-+ *
-+ */
-+
-+static int __init starlet_es_init_module(void)
-+{
-+ drv_printk(KERN_INFO, "%s - version %s\n", DRV_DESCRIPTION,
-+ starlet_es_driver_version);
-+
-+ return of_register_platform_driver(&starlet_es_of_driver);
-+}
-+
-+static void __exit starlet_es_exit_module(void)
-+{
-+ of_unregister_platform_driver(&starlet_es_of_driver);
-+}
-+
-+module_init(starlet_es_init_module);
-+module_exit(starlet_es_exit_module);
-+
-+MODULE_DESCRIPTION(DRV_DESCRIPTION);
-+MODULE_AUTHOR(DRV_AUTHOR);
-+MODULE_LICENSE("GPL");
-+
-diff --git a/arch/powerpc/platforms/embedded6xx/starlet-gpio.c b/arch/powerpc/platforms/embedded6xx/starlet-gpio.c
-new file mode 100644
-index 0000000..abdae88
---- /dev/null
-+++ b/arch/powerpc/platforms/embedded6xx/starlet-gpio.c
-@@ -0,0 +1,134 @@
-+/*
-+ * arch/powerpc/platforms/embedded6xx/starlet-gpio.c
-+ *
-+ * Nintendo Wii starlet GPIO driver
-+ * Copyright (C) 2008-2009 The GameCube Linux Team
-+ * Copyright (C) 2008,2009 Albert Herranz
-+ *
-+ * This program is free software; you can redistribute it and/or
-+ * modify it under the terms of the 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/io.h>
-+#include <linux/kernel.h>
-+#include <linux/of.h>
-+#include <linux/of_gpio.h>
-+#include <linux/of_platform.h>
-+
-+struct stgpio_chip {
-+ struct of_mm_gpio_chip mmchip;
-+ spinlock_t lock;
-+};
-+
-+struct stgpio_regs {
-+ __be32 out, dir, in;
-+};
-+
-+
-+static inline struct stgpio_chip *
-+to_stgpio_chip(struct of_mm_gpio_chip *mm_gc)
-+{
-+ return container_of(mm_gc, struct stgpio_chip, mmchip);
-+}
-+
-+static int stgpio_get(struct gpio_chip *gc, unsigned int gpio)
-+{
-+ struct of_mm_gpio_chip *mm_gc = to_of_mm_gpio_chip(gc);
-+ struct stgpio_regs __iomem *regs = mm_gc->regs;
-+ u32 pin_mask = 1 << (31 - gpio);
-+ unsigned int val;
-+
-+ val = !!(in_be32(&regs->in) & pin_mask);
-+
-+ pr_debug("%s: gpio: %d val: %d\n", __func__, gpio, val);
-+
-+ return val;
-+}
-+
-+static void stgpio_set(struct gpio_chip *gc, unsigned int gpio, int val)
-+{
-+ struct of_mm_gpio_chip *mm_gc = to_of_mm_gpio_chip(gc);
-+ struct stgpio_chip *st_gc = to_stgpio_chip(mm_gc);
-+ struct stgpio_regs __iomem *regs = mm_gc->regs;
-+ u32 pin_mask = 1 << (31 - gpio);
-+ u32 data;
-+ unsigned long flags;
-+
-+ spin_lock_irqsave(&st_gc->lock, flags);
-+ data = in_be32(&regs->in) & ~pin_mask;
-+ if (val)
-+ data |= pin_mask;
-+ out_be32(&regs->out, data);
-+ spin_unlock_irqrestore(&st_gc->lock, flags);
-+
-+ pr_debug("%s: gpio: %d val: %d\n", __func__, gpio, val);
-+}
-+
-+static int stgpio_dir_in(struct gpio_chip *gc, unsigned int gpio)
-+{
-+ struct of_mm_gpio_chip *mm_gc = to_of_mm_gpio_chip(gc);
-+ struct stgpio_regs __iomem *regs = mm_gc->regs;
-+ u32 pin_mask = 1 << (31 - gpio);
-+
-+ clrbits32(&regs->dir, pin_mask);
-+
-+ return 0;
-+}
-+
-+static int stgpio_dir_out(struct gpio_chip *gc, unsigned int gpio, int val)
-+{
-+ struct of_mm_gpio_chip *mm_gc = to_of_mm_gpio_chip(gc);
-+ struct stgpio_regs __iomem *regs = mm_gc->regs;
-+ u32 pin_mask = 1 << (31 - gpio);
-+
-+ setbits32(&regs->dir, pin_mask);
-+ stgpio_set(gc, gpio, val);
-+
-+ return 0;
-+}
-+
-+int stgpio_add32(struct device_node *np)
-+{
-+ struct of_mm_gpio_chip *mm_gc;
-+ struct of_gpio_chip *of_gc;
-+ struct gpio_chip *gc;
-+ struct stgpio_chip *st_gc;
-+
-+ st_gc = kzalloc(sizeof(*st_gc), GFP_KERNEL);
-+ if (!st_gc)
-+ return -ENOMEM;
-+
-+ spin_lock_init(&st_gc->lock);
-+ mm_gc = &st_gc->mmchip;
-+ of_gc = &mm_gc->of_gc;
-+ gc = &of_gc->gc;
-+
-+ of_gc->gpio_cells = 1;
-+
-+ gc->ngpio = 32;
-+ gc->direction_input = stgpio_dir_in;
-+ gc->direction_output = stgpio_dir_out;
-+ gc->get = stgpio_get;
-+ gc->set = stgpio_set;
-+
-+ return of_mm_gpiochip_add(np, mm_gc);
-+}
-+
-+static int stgpio_init(void)
-+{
-+ struct device_node *np;
-+ int error;
-+
-+ for_each_compatible_node(np, NULL, "nintendo,starlet-gpio") {
-+ error = stgpio_add32(np);
-+ if (error < 0)
-+ printk(KERN_ERR "starlet-gpio: error %d adding gpios"
-+ " for %s\n", error, np->full_name);
-+ }
-+ return 0; /* whatever */
-+}
-+arch_initcall(stgpio_init);
-+
-diff --git a/arch/powerpc/platforms/embedded6xx/starlet-ipc.c b/arch/powerpc/platforms/embedded6xx/starlet-ipc.c
-new file mode 100644
-index 0000000..fa91b7a
---- /dev/null
-+++ b/arch/powerpc/platforms/embedded6xx/starlet-ipc.c
-@@ -0,0 +1,1488 @@
-+/*
-+ * arch/powerpc/platforms/embedded6xx/starlet-ipc.c
-+ *
-+ * Nintendo Wii starlet IPC driver
-+ * Copyright (C) 2008-2009 The GameCube Linux Team
-+ * Copyright (C) 2008,2009 Albert Herranz
-+ *
-+ * This program is free software; you can redistribute it and/or
-+ * modify it under the terms of the GNU General Public License
-+ * as published by the Free Software Foundation; either version 2
-+ * of the License, or (at your option) any later version.
-+ *
-+ */
-+
-+#define DEBUG
-+
-+/*#define DBG(fmt, arg...) pr_debug(fmt, ##arg)*/
-+#define DBG(fmt, arg...) drv_printk(KERN_INFO, fmt, ##arg)
-+
-+#include <linux/kernel.h>
-+#include <linux/module.h>
-+#include <linux/init.h>
-+#include <linux/of_platform.h>
-+#include <linux/ioport.h>
-+#include <linux/interrupt.h>
-+#include <linux/jiffies.h>
-+#include <linux/dmapool.h>
-+#include <linux/dma-mapping.h>
-+#include <linux/random.h>
-+#include <linux/scatterlist.h>
-+#include <linux/string.h>
-+#include <asm/io.h>
-+#include <asm/bitops.h>
-+
-+#include <asm/starlet.h>
-+
-+
-+#define DRV_MODULE_NAME "starlet-ipc"
-+#define DRV_DESCRIPTION "Nintendo Wii starlet IPC driver"
-+#define DRV_AUTHOR "Albert Herranz"
-+
-+static char starlet_ipc_driver_version[] = "0.2i";
-+
-+#define drv_printk(level, format, arg...) \
-+ printk(level DRV_MODULE_NAME ": " format , ## arg)
-+
-+/*
-+ * Hardware registers
-+ */
-+#define STARLET_IPC_TXBUF 0x00 /* data from cpu to starlet */
-+
-+#define STARLET_IPC_CSR 0x04
-+#define STARLET_IPC_CSR_TSTART (1<<0) /* start transmit */
-+#define STARLET_IPC_CSR_TBEI (1<<1) /* tx buf empty int */
-+#define STARLET_IPC_CSR_RBFI (1<<2) /* rx buf full int */
-+#define STARLET_IPC_CSR_INT (1<<3) /* interrupt ack */
-+#define STARLET_IPC_CSR_RBFIMASK (1<<4) /* rx buf full int mask */
-+#define STARLET_IPC_CSR_TBEIMASK (1<<5) /* tx buf empty int mask */
-+
-+#define STARLET_IPC_RXBUF 0x08 /* data from starlet to cpu */
-+
-+#define STARLET_IPC_ISR 0x30
-+
-+/* IOS calls */
-+#define STARLET_IOS_OPEN 0x01
-+#define STARLET_IOS_CLOSE 0x02
-+#define STARLET_IOS_IOCTL 0x06
-+#define STARLET_IOS_IOCTLV 0x07
-+
-+
-+/* starlet_ipc_device flags */
-+enum {
-+ __TX_INUSE = 0, /* tx buffer in use flag */
-+ __REBOOT, /* request causes IOS reboot */
-+};
-+
-+/*
-+ *
-+ * Hardware.
-+ */
-+
-+/*
-+ * Update control and status register.
-+ */
-+static inline void starlet_ipc_update_csr(void __iomem *io_base, u32 val)
-+{
-+ u32 csr;
-+
-+ csr = in_be32(io_base + STARLET_IPC_CSR);
-+ /* preserve interrupt masks */
-+ csr &= STARLET_IPC_CSR_RBFIMASK | STARLET_IPC_CSR_TBEIMASK;
-+ csr |= val;
-+ out_be32(io_base + STARLET_IPC_CSR, csr);
-+}
-+
-+/*
-+ * Put data for starlet in the transmit fifo.
-+ */
-+static inline void starlet_ipc_sendto(void __iomem *io_base, u32 data)
-+{
-+ out_be32(io_base + STARLET_IPC_TXBUF, data);
-+}
-+
-+/*
-+ * Get data from starlet out the receive fifo.
-+ */
-+static inline u32 starlet_ipc_recvfrom(void __iomem *io_base)
-+{
-+ return in_be32(io_base + STARLET_IPC_RXBUF);
-+}
-+
-+/*
-+ * Issue an end-of-interrupt sequence.
-+ */
-+static void starlet_ipc_eoi(void __iomem *io_base)
-+{
-+ starlet_ipc_update_csr(io_base, STARLET_IPC_CSR_INT);
-+}
-+
-+/*
-+ * Calm the hardware down.
-+ */
-+static void starlet_ipc_quiesce(struct starlet_ipc_device *ipc_dev)
-+{
-+ u32 csr;
-+
-+ /* ack and disable MBOX? and REPLY interrupts */
-+ csr = in_be32(ipc_dev->io_base + STARLET_IPC_CSR);
-+ csr &= ~(STARLET_IPC_CSR_TBEIMASK | STARLET_IPC_CSR_RBFIMASK);
-+ csr |= STARLET_IPC_CSR_TBEI | STARLET_IPC_CSR_RBFI;
-+ out_be32(ipc_dev->io_base + STARLET_IPC_CSR, csr);
-+}
-+
-+/*
-+ * Request routines.
-+ *
-+ */
-+
-+#if 0
-+
-+#define __case_string(_s) \
-+case _s: \
-+ str = #_s; \
-+ break;
-+
-+static char *stipc_cmd_string(u32 cmd)
-+{
-+ char *str = "unknown";
-+
-+ switch (cmd) {
-+__case_string(STARLET_IOS_OPEN)
-+__case_string(STARLET_IOS_CLOSE)
-+__case_string(STARLET_IOS_IOCTL)
-+__case_string(STARLET_IOS_IOCTLV)
-+ }
-+ return str;
-+}
-+
-+static void starlet_ipc_pretty_print_request(struct starlet_ipc_request *req)
-+{
-+ drv_printk(KERN_INFO, "\n"
-+ " struct starlet_ipc_request = {\n"
-+ " cmd = %s (0x%08x)\n"
-+ " result = %d (0x%08x)%s\n"
-+ " seconds_elapsed = %u\n"
-+ " dma_addr = %p\n"
-+ " };\n"
-+ ,
-+ stipc_cmd_string(req->cmd), req->cmd,
-+ req->result, req->result,
-+ (req->result == 0xdeadbeef) ? " /* pending */" : "",
-+ jiffies_to_msecs(jiffies - req->jiffies) / 1000,
-+ (void *)req->dma_addr
-+ );
-+}
-+
-+#endif
-+
-+static void starlet_ipc_debug_print_request(struct starlet_ipc_request *req)
-+{
-+#if 0
-+ DBG("cmd=%x, result=%x, fd=%x, dma_addr=%p\n",
-+ req->cmd, req->result, req->fd, (void *)req->dma_addr);
-+#endif
-+}
-+
-+struct starlet_ipc_request *
-+starlet_ipc_alloc_request(struct starlet_ipc_device *ipc_dev, gfp_t flags)
-+{
-+ struct starlet_ipc_request *req;
-+ dma_addr_t dma_addr;
-+
-+ req = dma_pool_alloc(ipc_dev->dma_pool, flags, &dma_addr);
-+ if (req) {
-+ memset(req, 0, sizeof(*req));
-+ req->ipc_dev = ipc_dev;
-+ req->result = 0xdeadbeef;
-+ req->sig = ipc_dev->random_id;
-+ req->dma_addr = dma_addr;
-+ INIT_LIST_HEAD(&req->node);
-+ }
-+ return req;
-+}
-+
-+void starlet_ipc_free_request(struct starlet_ipc_request *req)
-+{
-+ dma_pool_free(req->ipc_dev->dma_pool, req, req->dma_addr);
-+}
-+
-+static void starlet_ipc_start_request(struct starlet_ipc_request *req)
-+{
-+ struct starlet_ipc_device *ipc_dev = req->ipc_dev;
-+ void __iomem *io_base = ipc_dev->io_base;
-+ unsigned long flags;
-+
-+ starlet_ipc_debug_print_request(req);
-+
-+ spin_lock_irqsave(&ipc_dev->list_lock, flags);
-+ list_add_tail(&req->node, &ipc_dev->outstanding_list);
-+ ipc_dev->nr_outstanding++;
-+ req->jiffies = jiffies;
-+ spin_unlock_irqrestore(&ipc_dev->list_lock, flags);
-+
-+ starlet_ipc_sendto(io_base, (u32) req->dma_addr);
-+ starlet_ipc_update_csr(io_base, STARLET_IPC_CSR_TSTART);
-+}
-+
-+static void starlet_ipc_complete_request(struct starlet_ipc_request *req)
-+{
-+ struct starlet_ipc_device *ipc_dev = req->ipc_dev;
-+ unsigned long flags;
-+
-+ spin_lock_irqsave(&ipc_dev->list_lock, flags);
-+ list_del_init(&req->node);
-+ ipc_dev->nr_outstanding--;
-+ spin_unlock_irqrestore(&ipc_dev->list_lock, flags);
-+
-+ starlet_ipc_debug_print_request(req);
-+
-+ /* per request completion callback */
-+ if (req->complete)
-+ req->complete(req);
-+
-+ /* async callback */
-+ if (req->done)
-+ req->done(req);
-+}
-+
-+static void starlet_ipc_submit_request(struct starlet_ipc_request *req)
-+{
-+ struct starlet_ipc_device *ipc_dev = req->ipc_dev;
-+ unsigned long flags;
-+
-+ if (test_and_set_bit(__TX_INUSE, &ipc_dev->flags)) {
-+ spin_lock_irqsave(&ipc_dev->list_lock, flags);
-+ list_add_tail(&req->node, &ipc_dev->pending_list);
-+ ipc_dev->nr_pending++;
-+ spin_unlock_irqrestore(&ipc_dev->list_lock, flags);
-+ } else {
-+ starlet_ipc_start_request(req);
-+ }
-+}
-+
-+static struct starlet_ipc_request *
-+starlet_ipc_find_request_by_bus_addr(struct starlet_ipc_device *ipc_dev,
-+ dma_addr_t req_bus_addr)
-+{
-+ struct starlet_ipc_request *req;
-+ unsigned long flags;
-+
-+ spin_lock_irqsave(&ipc_dev->list_lock, flags);
-+ list_for_each_entry(req, &ipc_dev->outstanding_list, node) {
-+ if (req && req->sig != ipc_dev->random_id) {
-+ drv_printk(KERN_ERR, "IPC trash detected\n");
-+ ipc_dev->nr_outstanding = 0;
-+ INIT_LIST_HEAD(&ipc_dev->outstanding_list);
-+ INIT_LIST_HEAD(&req->node);
-+ spin_unlock_irqrestore(&ipc_dev->list_lock, flags);
-+ return NULL;
-+ }
-+ if (req && req_bus_addr == req->dma_addr) {
-+ spin_unlock_irqrestore(&ipc_dev->list_lock, flags);
-+ return req;
-+ }
-+ }
-+ spin_unlock_irqrestore(&ipc_dev->list_lock, flags);
-+ return NULL;
-+}
-+
-+/*
-+ * Interrupt handlers.
-+ *
-+ */
-+
-+/*
-+ * Transmit Buffer Empty Interrupt dispatcher.
-+ */
-+static int starlet_ipc_dispatch_tbei(struct starlet_ipc_device *ipc_dev)
-+{
-+ void __iomem *io_base = ipc_dev->io_base;
-+ struct starlet_ipc_request *req = NULL;
-+ struct list_head *pending = &ipc_dev->pending_list;
-+ unsigned long flags;
-+
-+ spin_lock_irqsave(&ipc_dev->list_lock, flags);
-+ if (!list_empty(pending)) {
-+ req = list_entry(pending->next, struct starlet_ipc_request,
-+ node);
-+ list_del_init(&req->node);
-+ ipc_dev->nr_pending--;
-+ }
-+ spin_unlock_irqrestore(&ipc_dev->list_lock, flags);
-+ if (req) {
-+ starlet_ipc_start_request(req);
-+ } else {
-+ if (!test_and_clear_bit(__TX_INUSE, &ipc_dev->flags)) {
-+ /* we get two consecutive TBEIs on reboot */
-+ if (test_and_clear_bit(__REBOOT, &ipc_dev->flags)) {
-+ req = ipc_dev->req;
-+ ipc_dev->req = NULL;
-+ if (req) {
-+ starlet_ipc_complete_request(req);
-+ req->result = 0;
-+ }
-+ starlet_ipc_eoi(io_base);
-+ }
-+ }
-+ }
-+
-+ return IRQ_HANDLED;
-+}
-+
-+/*
-+ * Receive Buffer Full Interrupt dispatcher.
-+ */
-+static int starlet_ipc_dispatch_rbfi(struct starlet_ipc_device *ipc_dev)
-+{
-+ void __iomem *io_base = ipc_dev->io_base;
-+ struct starlet_ipc_request *req;
-+ unsigned long req_bus_addr;
-+
-+ req_bus_addr = starlet_ipc_recvfrom(io_base);
-+ if (!req_bus_addr)
-+ return IRQ_NONE;
-+
-+ req = starlet_ipc_find_request_by_bus_addr(ipc_dev, req_bus_addr);
-+ if (req) {
-+ starlet_ipc_complete_request(req);
-+ } else {
-+ drv_printk(KERN_WARNING, "unknown request, bus=%p\n",
-+ (void *)req_bus_addr);
-+ }
-+ starlet_ipc_eoi(io_base);
-+ return IRQ_HANDLED;
-+}
-+
-+typedef int (*ipc_handler_t) (struct starlet_ipc_device *);
-+
-+static int
-+starlet_ipc_cond_dispatch_irq(struct starlet_ipc_device *ipc_dev,
-+ u32 irqmask, u32 irq, ipc_handler_t handler)
-+{
-+ void __iomem *io_base = ipc_dev->io_base;
-+ u32 csr;
-+ int retval = IRQ_NONE;
-+
-+ csr = in_be32(io_base + STARLET_IPC_CSR);
-+ if ((csr & (irqmask | irq)) == (irqmask | irq)) {
-+ /* early ack */
-+ starlet_ipc_update_csr(io_base, irq);
-+ out_be32(io_base + STARLET_IPC_ISR, 0x40000000); /* huh? */
-+ retval = handler(ipc_dev);
-+ }
-+ return retval;
-+}
-+
-+static irqreturn_t starlet_ipc_handler(int irq, void *data)
-+{
-+ struct starlet_ipc_device *ipc_dev = (struct starlet_ipc_device *)data;
-+ int handled = 0;
-+ int retval;
-+
-+ /* starlet acked a request */
-+ retval = starlet_ipc_cond_dispatch_irq(ipc_dev,
-+ STARLET_IPC_CSR_TBEIMASK,
-+ STARLET_IPC_CSR_TBEI,
-+ starlet_ipc_dispatch_tbei);
-+ if (retval == IRQ_HANDLED)
-+ handled++;
-+
-+ /* starlet delivered a reply */
-+ retval = starlet_ipc_cond_dispatch_irq(ipc_dev,
-+ STARLET_IPC_CSR_RBFIMASK,
-+ STARLET_IPC_CSR_RBFI,
-+ starlet_ipc_dispatch_rbfi);
-+ if (retval == IRQ_HANDLED)
-+ handled++;
-+
-+ if (!handled)
-+ return IRQ_NONE;
-+
-+ return IRQ_HANDLED;
-+}
-+
-+/*
-+ * IPC Calls.
-+ *
-+ */
-+
-+static int starlet_ipc_call_done(struct starlet_ipc_request *req)
-+{
-+ complete(req->done_data);
-+ return 0;
-+}
-+
-+static int starlet_ipc_call(struct starlet_ipc_request *req)
-+{
-+ DECLARE_COMPLETION(complete);
-+
-+ req->done_data = &complete;
-+ req->done = starlet_ipc_call_done;
-+ starlet_ipc_submit_request(req);
-+ wait_for_completion(&complete);
-+ return req->result;
-+}
-+
-+static void starlet_ipc_call_nowait(struct starlet_ipc_request *req,
-+ starlet_ipc_callback_t callback, void *arg)
-+{
-+ req->done_data = arg;
-+ req->done = callback;
-+ starlet_ipc_submit_request(req);
-+}
-+
-+/*
-+ *
-+ * IOS High level interfaces.
-+ */
-+
-+static struct starlet_ipc_device *starlet_ipc_device_instance;
-+
-+/**
-+ *
-+ */
-+struct starlet_ipc_device *starlet_ipc_get_device(void)
-+{
-+ if (!starlet_ipc_device_instance)
-+ drv_printk(KERN_ERR, "uninitialized device instance!\n");
-+ return starlet_ipc_device_instance;
-+}
-+EXPORT_SYMBOL_GPL(starlet_ipc_get_device);
-+
-+/**
-+ *
-+ */
-+int starlet_open(const char *pathname, int flags)
-+{
-+#define STSD_OPEN_BUF_SIZE 64
-+ static char open_buf[STSD_OPEN_BUF_SIZE]
-+ __attribute__ ((aligned(STARLET_IPC_DMA_ALIGN + 1)));
-+ static DEFINE_MUTEX(open_buf_lock);
-+
-+ struct starlet_ipc_device *ipc_dev = starlet_ipc_get_device();
-+ struct starlet_ipc_request *req;
-+ dma_addr_t dma_addr;
-+ char *local_pathname = NULL;
-+ size_t len;
-+ int error = -ENOMEM;
-+
-+ if (!ipc_dev)
-+ return -ENODEV;
-+
-+ req = starlet_ipc_alloc_request(ipc_dev, GFP_KERNEL);
-+ if (req) {
-+ len = strlen(pathname) + 1;
-+ if (len < sizeof(open_buf)) {
-+ if (mutex_trylock(&open_buf_lock))
-+ local_pathname = open_buf;
-+ }
-+ if (!local_pathname) {
-+ local_pathname = starlet_kzalloc(len, GFP_KERNEL);
-+ if (!local_pathname) {
-+ starlet_ipc_free_request(req);
-+ return -ENOMEM;
-+ }
-+ }
-+
-+ strncpy(local_pathname, pathname, len-1);
-+ local_pathname[len-1] = 0;
-+ dma_addr = dma_map_single(ipc_dev->dev, local_pathname, len,
-+ DMA_TO_DEVICE);
-+
-+ req->cmd = STARLET_IOS_OPEN;
-+ req->open.pathname = dma_addr; /* bus address */
-+ req->open.mode = flags;
-+ error = starlet_ipc_call(req);
-+
-+ dma_unmap_single(ipc_dev->dev, dma_addr, len, DMA_TO_DEVICE);
-+
-+ if (local_pathname == open_buf)
-+ mutex_unlock(&open_buf_lock);
-+ else
-+ starlet_kfree(local_pathname);
-+
-+ starlet_ipc_free_request(req);
-+ }
-+ if (error < 0)
-+ DBG("%s: error=%d (%x)\n", __func__, error, error);
-+ return error;
-+}
-+EXPORT_SYMBOL_GPL(starlet_open);
-+
-+/*
-+ *
-+ */
-+int starlet_close(int fd)
-+{
-+ struct starlet_ipc_device *ipc_dev = starlet_ipc_get_device();
-+ struct starlet_ipc_request *req;
-+ int error = -ENOMEM;
-+
-+ if (!ipc_dev)
-+ return -ENODEV;
-+
-+ req = starlet_ipc_alloc_request(ipc_dev, GFP_KERNEL);
-+ if (req) {
-+ req->cmd = STARLET_IOS_CLOSE;
-+ req->fd = fd;
-+ error = starlet_ipc_call(req);
-+ starlet_ipc_free_request(req);
-+ }
-+ return error;
-+}
-+EXPORT_SYMBOL_GPL(starlet_close);
-+
-+
-+/*
-+ * starlet_ioctl*
-+ *
-+ */
-+
-+static int starlet_ioctl_dma_complete(struct starlet_ipc_request *req)
-+{
-+ return 0;
-+}
-+
-+/*
-+ *
-+ */
-+int starlet_ioctl_dma_prepare(struct starlet_ipc_request *req,
-+ int fd, int request,
-+ dma_addr_t ibuf, size_t ilen,
-+ dma_addr_t obuf, size_t olen)
-+{
-+ struct starlet_ipc_device *ipc_dev = starlet_ipc_get_device();
-+
-+ if (!ipc_dev)
-+ return -ENODEV;
-+
-+ req->cmd = STARLET_IOS_IOCTL;
-+ req->fd = fd;
-+ req->ioctl.request = (u32) request;
-+ req->ioctl.ibuf = ibuf;
-+ req->ioctl.ilen = ilen;
-+ req->ioctl.obuf = obuf;
-+ req->ioctl.olen = olen;
-+ req->complete = starlet_ioctl_dma_complete;
-+
-+ return 0;
-+}
-+
-+/*
-+ *
-+ */
-+int starlet_ioctl_dma(int fd, int request,
-+ dma_addr_t ibuf, size_t ilen,
-+ dma_addr_t obuf, size_t olen)
-+{
-+ struct starlet_ipc_device *ipc_dev = starlet_ipc_get_device();
-+ struct starlet_ipc_request *req;
-+ int error;
-+
-+ req = starlet_ipc_alloc_request(ipc_dev, GFP_ATOMIC);
-+ if (!req)
-+ return -ENOMEM;
-+
-+ error = starlet_ioctl_dma_prepare(req, fd, request,
-+ ibuf, ilen,
-+ obuf, olen);
-+ if (!error)
-+ error = starlet_ipc_call(req);
-+ starlet_ipc_free_request(req);
-+
-+ if (error)
-+ DBG("%s: error=%d (%x)\n", __func__, error, error);
-+ return error;
-+}
-+EXPORT_SYMBOL_GPL(starlet_ioctl_dma);
-+
-+/**
-+ *
-+ */
-+int starlet_ioctl_dma_nowait(int fd, int request,
-+ dma_addr_t ibuf, size_t ilen,
-+ dma_addr_t obuf, size_t olen,
-+ starlet_ipc_callback_t callback, void *arg)
-+{
-+ struct starlet_ipc_device *ipc_dev = starlet_ipc_get_device();
-+ struct starlet_ipc_request *req;
-+ int error;
-+
-+ req = starlet_ipc_alloc_request(ipc_dev, GFP_ATOMIC);
-+ if (!req)
-+ return -ENOMEM;
-+
-+ error = starlet_ioctl_dma_prepare(req,
-+ fd, request,
-+ ibuf, ilen,
-+ obuf, olen);
-+ if (!error)
-+ starlet_ipc_call_nowait(req, callback, arg);
-+ else
-+ starlet_ipc_free_request(req);
-+
-+ if (error)
-+ DBG("%s: error=%d (%x)\n", __func__, error, error);
-+ return error;
-+}
-+EXPORT_SYMBOL_GPL(starlet_ioctl_dma_nowait);
-+
-+static int starlet_ioctl_complete(struct starlet_ipc_request *req)
-+{
-+ struct starlet_ipc_device *ipc_dev = starlet_ipc_get_device();
-+ dma_addr_t ibuf_ba, obuf_ba;
-+ size_t ilen, olen;
-+
-+ ibuf_ba = req->ioctl.ibuf;
-+ ilen = req->ioctl.ilen;
-+ obuf_ba = req->ioctl.obuf;
-+ olen = req->ioctl.olen;
-+
-+ if (ibuf_ba)
-+ dma_unmap_single(ipc_dev->dev, ibuf_ba, ilen, DMA_TO_DEVICE);
-+ if (obuf_ba)
-+ dma_unmap_single(ipc_dev->dev, obuf_ba, olen, DMA_FROM_DEVICE);
-+
-+ return 0;
-+}
-+
-+/*
-+ *
-+ */
-+int starlet_ioctl_prepare(struct starlet_ipc_request *req,
-+ int fd, int request,
-+ void *ibuf, size_t ilen,
-+ void *obuf, size_t olen)
-+{
-+ struct starlet_ipc_device *ipc_dev = starlet_ipc_get_device();
-+ dma_addr_t ibuf_ba, obuf_ba;
-+ int error;
-+
-+ if (!ipc_dev)
-+ return -ENODEV;
-+
-+ BUG_ON(!IS_ALIGNED((unsigned long)ibuf, STARLET_IPC_DMA_ALIGN+1));
-+ BUG_ON(!IS_ALIGNED((unsigned long)obuf, STARLET_IPC_DMA_ALIGN+1));
-+
-+ ibuf_ba = (ibuf) ? dma_map_single(ipc_dev->dev, ibuf, ilen,
-+ DMA_TO_DEVICE) : 0;
-+ obuf_ba = (obuf) ? dma_map_single(ipc_dev->dev, obuf, olen,
-+ DMA_FROM_DEVICE) : 0;
-+
-+ error = starlet_ioctl_dma_prepare(req, fd, request,
-+ ibuf_ba, ilen, obuf_ba, olen);
-+ if (!error) {
-+ req->complete = starlet_ioctl_complete;
-+ if (ibuf)
-+ dma_unmap_single(ipc_dev->dev, ibuf_ba, ilen,
-+ DMA_TO_DEVICE);
-+ if (obuf)
-+ dma_unmap_single(ipc_dev->dev, obuf_ba, olen,
-+ DMA_FROM_DEVICE);
-+ }
-+ return error;
-+}
-+
-+/**
-+ *
-+ */
-+int starlet_ioctl(int fd, int request,
-+ void *ibuf, size_t ilen,
-+ void *obuf, size_t olen)
-+{
-+ struct starlet_ipc_device *ipc_dev = starlet_ipc_get_device();
-+ struct starlet_ipc_request *req;
-+ int error;
-+
-+ req = starlet_ipc_alloc_request(ipc_dev, GFP_ATOMIC);
-+ if (!req)
-+ return -ENOMEM;
-+
-+ error = starlet_ioctl_prepare(req, fd, request,
-+ ibuf, ilen, obuf, olen);
-+ if (!error)
-+ error = starlet_ipc_call(req);
-+ starlet_ipc_free_request(req);
-+
-+ if (error < 0)
-+ DBG("%s: error=%d (%x)\n", __func__, error, error);
-+ return error;
-+}
-+EXPORT_SYMBOL_GPL(starlet_ioctl);
-+
-+/**
-+ *
-+ */
-+int starlet_ioctl_nowait(int fd, int request,
-+ void *ibuf, size_t ilen,
-+ void *obuf, size_t olen,
-+ starlet_ipc_callback_t callback, void *arg)
-+{
-+ struct starlet_ipc_device *ipc_dev = starlet_ipc_get_device();
-+ struct starlet_ipc_request *req;
-+ int error;
-+
-+ req = starlet_ipc_alloc_request(ipc_dev, GFP_ATOMIC);
-+ if (!req)
-+ return -ENOMEM;
-+
-+ error = starlet_ioctl_prepare(req, fd, request,
-+ ibuf, ilen, obuf, olen);
-+ if (!error)
-+ starlet_ipc_call_nowait(req, callback, arg);
-+ else
-+ starlet_ipc_free_request(req);
-+
-+ if (error)
-+ DBG("%s: error=%d (%x)\n", __func__, error, error);
-+ return error;
-+}
-+EXPORT_SYMBOL_GPL(starlet_ioctl_nowait);
-+
-+
-+static int starlet_ioctlv_complete(struct starlet_ipc_request *req)
-+{
-+ struct starlet_ipc_device *ipc_dev = starlet_ipc_get_device();
-+ struct starlet_iovec *iovec = req->iovec;
-+ dma_addr_t iovec_da = req->ioctlv.iovec_da;
-+ size_t iovec_size = req->iovec_size;
-+
-+#if 0
-+ unsigned int nents;
-+ DBG("%s: nents_in=%u, nents_io=%u\n", __func__,
-+ req->sgl_nents_in, req->sgl_nents_io);
-+#endif
-+
-+ if (req->sgl_nents_in > 0)
-+ dma_unmap_sg(ipc_dev->dev, req->sgl_in, req->sgl_nents_in,
-+ DMA_TO_DEVICE);
-+ if (req->sgl_nents_io > 0)
-+ dma_unmap_sg(ipc_dev->dev, req->sgl_io, req->sgl_nents_io,
-+ DMA_BIDIRECTIONAL);
-+ if (iovec) {
-+ dma_unmap_single(ipc_dev->dev,
-+ iovec_da, iovec_size, DMA_TO_DEVICE);
-+
-+#if 0
-+ struct starlet_iovec *p;
-+ p = iovec;
-+ nents = req->sgl_nents_in;
-+ while (nents--) {
-+ DBG("%s: in: dma_addr=%p, dma_len=%u\n", __func__,
-+ (void *)p->dma_addr, p->dma_len);
-+ p++;
-+ }
-+ nents = req->sgl_nents_io;
-+ while (nents--) {
-+ DBG("%s: io: dma_addr=%p, dma_len=%u\n", __func__,
-+ (void *)p->dma_addr, p->dma_len);
-+ p++;
-+ }
-+#endif
-+
-+ starlet_kfree(iovec);
-+ }
-+ return 0;
-+}
-+
-+/*
-+ *
-+ */
-+int starlet_ioctlv_prepare(struct starlet_ipc_request *req,
-+ int fd, int request,
-+ unsigned int nents_in,
-+ struct scatterlist *sgl_in,
-+ unsigned int nents_io,
-+ struct scatterlist *sgl_io)
-+{
-+ struct starlet_ipc_device *ipc_dev = starlet_ipc_get_device();
-+ struct starlet_iovec *iovec, *p;
-+ dma_addr_t iovec_da = 0;
-+ size_t iovec_size = 0;
-+ struct scatterlist *sg;
-+ unsigned int nents, i;
-+
-+ if (!ipc_dev)
-+ return -ENODEV;
-+
-+ BUG_ON(nents_in > 0 && !sgl_in);
-+ BUG_ON(nents_io > 0 && !sgl_io);
-+
-+ nents = nents_in + nents_io;
-+ if (nents > 0) {
-+ iovec_size = nents * sizeof(*iovec);
-+ iovec = starlet_kzalloc(iovec_size, GFP_ATOMIC);
-+ if (!iovec)
-+ return -ENOMEM;
-+ } else {
-+ iovec = NULL;
-+ }
-+
-+ p = iovec;
-+ if (nents_in > 0) {
-+ nents_in = dma_map_sg(ipc_dev->dev, sgl_in, nents_in,
-+ DMA_TO_DEVICE);
-+ for_each_sg(sgl_in, sg, nents_in, i) {
-+#if 0
-+ DBG("%s: in: dma_addr=%p, dma_len=%u\n", __func__,
-+ (void *)sg_dma_address(sg), sg_dma_len(sg));
-+#endif
-+ p->dma_addr = sg_dma_address(sg);
-+ p->dma_len = sg_dma_len(sg);
-+ p++;
-+ }
-+ }
-+ if (nents_io > 0) {
-+ nents_io = dma_map_sg(ipc_dev->dev, sgl_io, nents_io,
-+ DMA_BIDIRECTIONAL);
-+ for_each_sg(sgl_io, sg, nents_io, i) {
-+#if 0
-+ DBG("%s: io: dma_addr=%p, dma_len=%u\n", __func__,
-+ (void *)sg_dma_address(sg), sg_dma_len(sg));
-+#endif
-+ p->dma_addr = sg_dma_address(sg);
-+ p->dma_len = sg_dma_len(sg);
-+ p++;
-+ }
-+ }
-+
-+ if (iovec)
-+ iovec_da = dma_map_single(ipc_dev->dev,
-+ iovec, iovec_size,
-+ DMA_TO_DEVICE);
-+
-+ req->iovec = iovec;
-+ req->iovec_size = iovec_size;
-+ req->sgl_nents_in = nents_in;
-+ req->sgl_in = sgl_in;
-+ req->sgl_nents_io = nents_io;
-+ req->sgl_io = sgl_io;
-+
-+ req->cmd = STARLET_IOS_IOCTLV;
-+ req->fd = fd;
-+ req->ioctlv.request = request;
-+ req->ioctlv.argc_in = nents_in;
-+ req->ioctlv.argc_io = nents_io;
-+ req->ioctlv.iovec_da = iovec_da;
-+ req->complete = starlet_ioctlv_complete;
-+
-+#if 0
-+ DBG("%s: fd=%d, request=%d,"
-+ " argc_in=%u, argc_io=%u, iovec_da=%08x\n" , __func__,
-+ req->fd, req->ioctlv.request,
-+ req->ioctlv.argc_in, req->ioctlv.argc_io,
-+ req->ioctlv.iovec_da);
-+#endif
-+ return 0;
-+}
-+
-+/**
-+ *
-+ */
-+int starlet_ioctlv(int fd, int request,
-+ unsigned int nents_in,
-+ struct scatterlist *sgl_in,
-+ unsigned int nents_io,
-+ struct scatterlist *sgl_io)
-+{
-+ struct starlet_ipc_device *ipc_dev = starlet_ipc_get_device();
-+ struct starlet_ipc_request *req;
-+ int error;
-+
-+ req = starlet_ipc_alloc_request(ipc_dev, GFP_ATOMIC);
-+ if (!req)
-+ return -ENOMEM;
-+
-+ error = starlet_ioctlv_prepare(req, fd, request,
-+ nents_in, sgl_in,
-+ nents_io, sgl_io);
-+ if (!error)
-+ error = starlet_ipc_call(req);
-+ starlet_ipc_free_request(req);
-+
-+ if (error < 0)
-+ DBG("%s: error=%d (%x)\n", __func__, error, error);
-+ return error;
-+}
-+EXPORT_SYMBOL_GPL(starlet_ioctlv);
-+
-+/**
-+ *
-+ */
-+int starlet_ioctlv_nowait(int fd, int request,
-+ unsigned int nents_in,
-+ struct scatterlist *sgl_in,
-+ unsigned int nents_io,
-+ struct scatterlist *sgl_io,
-+ starlet_ipc_callback_t callback, void *arg)
-+{
-+ struct starlet_ipc_device *ipc_dev = starlet_ipc_get_device();
-+ struct starlet_ipc_request *req;
-+ int error;
-+
-+ req = starlet_ipc_alloc_request(ipc_dev, GFP_ATOMIC);
-+ if (!req)
-+ return -ENOMEM;
-+
-+ error = starlet_ioctlv_prepare(req, fd, request,
-+ nents_in, sgl_in,
-+ nents_io, sgl_io);
-+ if (!error)
-+ starlet_ipc_call_nowait(req, callback, arg);
-+ else
-+ starlet_ipc_free_request(req);
-+
-+ if (error < 0)
-+ DBG("%s: error=%d (%x)\n", __func__, error, error);
-+ return error;
-+}
-+EXPORT_SYMBOL_GPL(starlet_ioctlv_nowait);
-+
-+/**
-+ *
-+ */
-+int starlet_ioctlv_and_reboot(int fd, int request,
-+ unsigned int nents_in,
-+ struct scatterlist *sgl_in,
-+ unsigned int nents_io,
-+ struct scatterlist *sgl_io)
-+{
-+ struct starlet_ipc_device *ipc_dev = starlet_ipc_get_device();
-+ struct starlet_ipc_request *req;
-+ int error;
-+
-+ req = starlet_ipc_alloc_request(ipc_dev, GFP_ATOMIC);
-+ if (!req)
-+ return -ENOMEM;
-+
-+ error = starlet_ioctlv_prepare(req, fd, request,
-+ nents_in, sgl_in,
-+ nents_io, sgl_io);
-+ if (!error) {
-+ ipc_dev->req = req;
-+ set_bit(__REBOOT, &ipc_dev->flags);
-+ error = starlet_ipc_call(req);
-+ }
-+ starlet_ipc_free_request(req);
-+
-+ if (error < 0)
-+ DBG("%s: error=%d (%x)\n", __func__, error, error);
-+ return error;
-+}
-+EXPORT_SYMBOL_GPL(starlet_ioctlv_and_reboot);
-+
-+/*
-+ * starlet_ioh_ioctlv*
-+ *
-+ */
-+
-+static int starlet_ioh_ioctlv_complete(struct starlet_ipc_request *req)
-+{
-+ struct starlet_ipc_device *ipc_dev = starlet_ipc_get_device();
-+ struct starlet_iovec *iovec = req->iovec;
-+ dma_addr_t iovec_da = req->ioctlv.iovec_da;
-+ size_t iovec_size = req->iovec_size;
-+
-+#if 0
-+ unsigned int nents;
-+ DBG("%s: nents_in=%u, nents_io=%u\n", __func__,
-+ req->sgl_nents_in, req->sgl_nents_io);
-+#endif
-+
-+ if (req->sgl_nents_in > 0)
-+ starlet_ioh_dma_unmap_sg(ipc_dev->dev,
-+ req->ioh_sgl_in, req->sgl_nents_in,
-+ DMA_TO_DEVICE);
-+ if (req->sgl_nents_io > 0)
-+ starlet_ioh_dma_unmap_sg(ipc_dev->dev,
-+ req->ioh_sgl_io, req->sgl_nents_io,
-+ DMA_BIDIRECTIONAL);
-+ if (iovec) {
-+ dma_unmap_single(ipc_dev->dev,
-+ iovec_da, iovec_size, DMA_TO_DEVICE);
-+
-+ { /* begin debug */
-+#if 0
-+ struct starlet_iovec *p;
-+ p = iovec;
-+ nents = req->sgl_nents_in;
-+ while (nents--) {
-+ DBG("%s: in: dma_addr=%p, dma_len=%u\n", __func__,
-+ (void *)p->dma_addr, p->dma_len);
-+ p++;
-+ }
-+ nents = req->sgl_nents_io;
-+ while (nents--) {
-+ DBG("%s: io: dma_addr=%p, dma_len=%u\n", __func__,
-+ (void *)p->dma_addr, p->dma_len);
-+ p++;
-+ }
-+#endif
-+ } /* end debug */
-+
-+ starlet_kfree(iovec);
-+ }
-+ return 0;
-+}
-+
-+/*
-+ *
-+ */
-+int starlet_ioh_ioctlv_prepare(struct starlet_ipc_request *req,
-+ int fd, int request,
-+ unsigned int nents_in,
-+ struct starlet_ioh_sg *ioh_sgl_in,
-+ unsigned int nents_io,
-+ struct starlet_ioh_sg *ioh_sgl_io)
-+{
-+ struct starlet_ipc_device *ipc_dev = starlet_ipc_get_device();
-+ struct starlet_iovec *iovec, *p;
-+ dma_addr_t iovec_da = 0;
-+ size_t iovec_size = 0;
-+ struct starlet_ioh_sg *ioh_sg;
-+ unsigned int nents, i;
-+
-+ if (!ipc_dev)
-+ return -ENODEV;
-+
-+ BUG_ON(nents_in > 0 && !ioh_sgl_in);
-+ BUG_ON(nents_io > 0 && !ioh_sgl_io);
-+
-+ nents = nents_in + nents_io;
-+ if (nents > 0) {
-+ iovec_size = nents * sizeof(*iovec);
-+ iovec = starlet_kzalloc(iovec_size, GFP_ATOMIC);
-+ if (!iovec)
-+ return -ENOMEM;
-+ } else {
-+ iovec = NULL;
-+ }
-+
-+ p = iovec;
-+ if (nents_in > 0) {
-+ nents_in = starlet_ioh_dma_map_sg(ipc_dev->dev,
-+ ioh_sgl_in, nents_in,
-+ DMA_TO_DEVICE);
-+ starlet_ioh_for_each_sg(ioh_sgl_in, ioh_sg, nents_in, i) {
-+#if 0
-+ DBG("%s: in: dma_addr=%p, dma_len=%u\n", __func__,
-+ (void *)ioh_sg->dma_addr, ioh_sg->len);
-+#endif
-+ p->dma_addr = ioh_sg->dma_addr;
-+ p->dma_len = ioh_sg->len;
-+ p++;
-+ }
-+ }
-+ if (nents_io > 0) {
-+ nents_io = starlet_ioh_dma_map_sg(ipc_dev->dev,
-+ ioh_sgl_io, nents_io,
-+ DMA_BIDIRECTIONAL);
-+ starlet_ioh_for_each_sg(ioh_sgl_io, ioh_sg, nents_io, i) {
-+#if 0
-+ DBG("%s: io: dma_addr=%p, dma_len=%u\n", __func__,
-+ (void *)ioh_sg->dma_addr, ioh_sg->len);
-+#endif
-+ p->dma_addr = ioh_sg->dma_addr;
-+ p->dma_len = ioh_sg->len;
-+ p++;
-+ }
-+ }
-+
-+ if (iovec)
-+ iovec_da = dma_map_single(ipc_dev->dev,
-+ iovec, iovec_size,
-+ DMA_TO_DEVICE);
-+
-+ req->iovec = iovec;
-+ req->iovec_size = iovec_size;
-+ req->sgl_nents_in = nents_in;
-+ req->ioh_sgl_in = ioh_sgl_in;
-+ req->sgl_nents_io = nents_io;
-+ req->ioh_sgl_io = ioh_sgl_io;
-+
-+ req->cmd = STARLET_IOS_IOCTLV;
-+ req->fd = fd;
-+ req->ioctlv.request = request;
-+ req->ioctlv.argc_in = nents_in;
-+ req->ioctlv.argc_io = nents_io;
-+ req->ioctlv.iovec_da = iovec_da;
-+ req->complete = starlet_ioh_ioctlv_complete;
-+
-+ return 0;
-+}
-+
-+/**
-+ *
-+ */
-+int starlet_ioh_ioctlv(int fd, int request,
-+ unsigned int nents_in,
-+ struct starlet_ioh_sg *ioh_sgl_in,
-+ unsigned int nents_io,
-+ struct starlet_ioh_sg *ioh_sgl_io)
-+{
-+ struct starlet_ipc_device *ipc_dev = starlet_ipc_get_device();
-+ struct starlet_ipc_request *req;
-+ int error;
-+
-+ req = starlet_ipc_alloc_request(ipc_dev, GFP_ATOMIC);
-+ if (!req)
-+ return -ENOMEM;
-+
-+ error = starlet_ioh_ioctlv_prepare(req, fd, request,
-+ nents_in, ioh_sgl_in,
-+ nents_io, ioh_sgl_io);
-+ if (!error)
-+ error = starlet_ipc_call(req);
-+ starlet_ipc_free_request(req);
-+
-+ if (error < 0)
-+ DBG("%s: error=%d (%x)\n", __func__, error, error);
-+ return error;
-+}
-+EXPORT_SYMBOL_GPL(starlet_ioh_ioctlv);
-+
-+/**
-+ *
-+ */
-+int starlet_ioh_ioctlv_nowait(int fd, int request,
-+ unsigned int nents_in,
-+ struct starlet_ioh_sg *ioh_sgl_in,
-+ unsigned int nents_io,
-+ struct starlet_ioh_sg *ioh_sgl_io,
-+ starlet_ipc_callback_t callback, void *arg)
-+{
-+ struct starlet_ipc_device *ipc_dev = starlet_ipc_get_device();
-+ struct starlet_ipc_request *req;
-+ int error;
-+
-+ req = starlet_ipc_alloc_request(ipc_dev, GFP_ATOMIC);
-+ if (!req)
-+ return -ENOMEM;
-+
-+ error = starlet_ioh_ioctlv_prepare(req, fd, request,
-+ nents_in, ioh_sgl_in,
-+ nents_io, ioh_sgl_io);
-+ if (!error)
-+ starlet_ipc_call_nowait(req, callback, arg);
-+ else
-+ starlet_ipc_free_request(req);
-+
-+ if (error < 0)
-+ DBG("%s: error=%d (%x)\n", __func__, error, error);
-+ return error;
-+}
-+EXPORT_SYMBOL_GPL(starlet_ioh_ioctlv_nowait);
-+
-+
-+/*
-+ * This "watchdog" code may be used to detect misbehaving requests.
-+ *
-+ * Note that some requests can take a lot of time to complete.
-+ * For example, a keyboard event, which is delivered every time a key is
-+ * pressed or released (or a keyboard is connected/disconnected), may take an
-+ * arbitrary amount of time to arrive.
-+ *
-+ */
-+
-+#define STARLET_IPC_WATCHDOG_TIME (60 * HZ)
-+
-+static void starlet_ipc_watchdog(unsigned long arg)
-+{
-+#if 0
-+ struct starlet_ipc_device *ipc_dev = (struct starlet_ipc_device *)arg;
-+ struct starlet_ipc_request *req;
-+ unsigned long flags;
-+
-+ spin_lock_irqsave(&ipc_dev->list_lock, flags);
-+ list_for_each_entry(req, &ipc_dev->outstanding_list, node) {
-+ if (req &&
-+ time_after(jiffies,
-+ req->jiffies + STARLET_IPC_WATCHDOG_TIME)) {
-+ drv_printk(KERN_INFO, "request on the outstanding"
-+ " list for too long\n");
-+ starlet_ipc_pretty_print_request(req);
-+ }
-+ }
-+ spin_unlock_irqrestore(&ipc_dev->list_lock, flags);
-+
-+ mod_timer(&ipc_dev->timer, jiffies + STARLET_IPC_WATCHDOG_TIME);
-+#endif
-+}
-+
-+/*
-+ * Setup routines.
-+ *
-+ */
-+
-+/*
-+ * Place here any desired hardware cleanups while drivers get written.
-+ */
-+static void starlet_fixups(void)
-+{
-+ static u32 buf[8]
-+ __attribute__ ((aligned(STARLET_IPC_DMA_ALIGN + 1)));
-+ struct scatterlist in[6], io[1];
-+ int fd;
-+ void *gpio;
-+
-+ /* close any open file descriptors, just in case */
-+ for (fd = 0; fd < 24; fd++)
-+ starlet_close(fd);
-+
-+ /*
-+ * Hey! We are super-green. And you?
-+ */
-+
-+ /* try to stop the dvd unit motor */
-+ fd = starlet_open("/dev/di", 0);
-+ if (fd >= 0) {
-+ buf[0] = 0xe3000000; /* stop motor command */
-+ buf[1] = 0;
-+ buf[2] = 0;
-+ starlet_ioctl(fd, buf[0],
-+ buf, sizeof(buf),
-+ buf, sizeof(buf));
-+ starlet_close(fd);
-+ }
-+
-+ /* try to disconnect the wiimote */
-+ fd = starlet_open("/dev/usb/oh1/57e/305", 2);
-+ if (fd >= 0) {
-+ /*
-+ * This assumes big endianness and 4 byte dma alignment.
-+ */
-+ buf[0] = 0x20000000; /* bmRequestType 0x20 */
-+ buf[1] = 0x00000000; /* bRequest 0x00 */
-+ buf[2] = 0x00000000; /* wValue 0x00, 0x00 */
-+ buf[3] = 0x00000000; /* wIndex 0x00, 0x00 */
-+ buf[4] = 0x03000000; /* wLength 0x03, 0x00 */
-+ buf[5] = 0x00000000; /* timeout? 0x00 */
-+ buf[6] = 0x030c0000; /* payload 0x03, 0x0c, 0x00 */
-+ sg_init_table(in, 6);
-+ sg_set_buf(&in[0], &buf[0], 1);
-+ sg_set_buf(&in[1], &buf[1], 1);
-+ sg_set_buf(&in[2], &buf[2], 2);
-+ sg_set_buf(&in[3], &buf[3], 2);
-+ sg_set_buf(&in[4], &buf[4], 2);
-+ sg_set_buf(&in[5], &buf[5], 1);
-+ sg_init_table(io, 1);
-+ sg_set_buf(&io[0], &buf[6], 3);
-+ starlet_ioctlv(fd, 0, 6, in, 1, io);
-+ starlet_close(fd);
-+ }
-+
-+ /*
-+ * Try to turn off the front led and sensor bar.
-+ * (not strictly starlet-only stuff but anyway...)
-+ */
-+ gpio = ioremap(0x0d8000c0, 4);
-+ if (gpio) {
-+ out_be32(gpio, in_be32(gpio) & ~0x120);
-+ iounmap(gpio);
-+ }
-+}
-+
-+static int starlet_ipc_init(struct starlet_ipc_device *ipc_dev,
-+ struct resource *mem, int irq)
-+{
-+ size_t size, io_size;
-+ int error;
-+
-+ ipc_dev->random_id = get_random_int();
-+
-+ error = starlet_malloc_lib_bootstrap(&mem[1]);
-+ if (error)
-+ return error;
-+
-+ io_size = mem[0].end - mem[0].start + 1;
-+ ipc_dev->io_base = ioremap(mem[0].start, io_size);
-+ ipc_dev->irq = irq;
-+
-+ size = max((size_t)64, sizeof(struct starlet_ipc_request));
-+ ipc_dev->dma_pool = dma_pool_create(DRV_MODULE_NAME,
-+ ipc_dev->dev,
-+ size, STARLET_IPC_DMA_ALIGN + 1, 0);
-+ if (!ipc_dev->dma_pool) {
-+ drv_printk(KERN_ERR, "dma_pool_create failed\n");
-+ iounmap(ipc_dev->io_base);
-+ return -ENOMEM;
-+ }
-+ spin_lock_init(&ipc_dev->list_lock);
-+ INIT_LIST_HEAD(&ipc_dev->pending_list);
-+ INIT_LIST_HEAD(&ipc_dev->outstanding_list);
-+
-+ starlet_ipc_device_instance = ipc_dev;
-+
-+ init_timer(&ipc_dev->timer);
-+ ipc_dev->timer.function = starlet_ipc_watchdog;
-+ ipc_dev->timer.data = (unsigned long)ipc_dev;
-+ ipc_dev->timer.expires = jiffies + STARLET_IPC_WATCHDOG_TIME;
-+ add_timer(&ipc_dev->timer);
-+
-+ error = request_irq(ipc_dev->irq, starlet_ipc_handler, 0,
-+ DRV_MODULE_NAME, ipc_dev);
-+ if (error) {
-+ drv_printk(KERN_ERR, "request of IRQ %d failed\n", irq);
-+ starlet_ipc_device_instance = NULL;
-+ dma_pool_destroy(ipc_dev->dma_pool);
-+ iounmap(ipc_dev->io_base);
-+ return error;
-+ }
-+
-+ /* ack and enable RBFI and TBEI interrupts */
-+ out_be32(ipc_dev->io_base + STARLET_IPC_CSR,
-+ STARLET_IPC_CSR_TBEIMASK | STARLET_IPC_CSR_RBFIMASK |
-+ STARLET_IPC_CSR_TBEI | STARLET_IPC_CSR_RBFI);
-+
-+ starlet_fixups();
-+
-+ return error;
-+}
-+
-+static void starlet_ipc_exit(struct starlet_ipc_device *ipc_dev)
-+{
-+ starlet_ipc_device_instance = NULL;
-+ starlet_ipc_quiesce(ipc_dev);
-+
-+ del_timer(&ipc_dev->timer);
-+
-+ free_irq(ipc_dev->irq, ipc_dev);
-+ dma_pool_destroy(ipc_dev->dma_pool);
-+ iounmap(ipc_dev->io_base);
-+ ipc_dev->io_base = NULL;
-+}
-+
-+
-+/*
-+ * Driver model helper routines.
-+ *
-+ */
-+
-+static int starlet_ipc_do_probe(struct device *dev, struct resource *mem,
-+ int irq)
-+{
-+ struct starlet_ipc_device *ipc_dev;
-+ int retval;
-+
-+ ipc_dev = kzalloc(sizeof(*ipc_dev), GFP_KERNEL);
-+ if (!ipc_dev) {
-+ drv_printk(KERN_ERR, "failed to allocate ipc_dev\n");
-+ return -ENOMEM;
-+ }
-+ dev_set_drvdata(dev, ipc_dev);
-+ ipc_dev->dev = dev;
-+
-+ retval = starlet_ipc_init(ipc_dev, mem, irq);
-+ if (retval) {
-+ dev_set_drvdata(dev, NULL);
-+ kfree(ipc_dev);
-+ }
-+ return retval;
-+}
-+
-+static int starlet_ipc_do_remove(struct device *dev)
-+{
-+ struct starlet_ipc_device *ipc_dev = dev_get_drvdata(dev);
-+
-+ if (ipc_dev) {
-+ starlet_ipc_exit(ipc_dev);
-+ dev_set_drvdata(dev, NULL);
-+ kfree(ipc_dev);
-+ return 0;
-+ }
-+ return -ENODEV;
-+}
-+
-+static int starlet_ipc_do_shutdown(struct device *dev)
-+{
-+ struct starlet_ipc_device *ipc_dev = dev_get_drvdata(dev);
-+
-+ if (ipc_dev) {
-+ /*
-+ * We can't shutdown IPC as we need it to reboot the
-+ * machine.
-+ * Thus, no starlet_ipc_quiesce(ipc_dev); here, sorry.
-+ */
-+ return 0;
-+ }
-+ return -ENODEV;
-+}
-+
-+/*
-+ * OF platform driver hooks.
-+ *
-+ */
-+
-+static int starlet_ipc_of_probe(struct of_device *odev,
-+ const struct of_device_id *dev_id)
-+{
-+ struct resource mem[2];
-+ int error;
-+
-+ error = of_address_to_resource(odev->node, 0, &mem[0]);
-+ if (error) {
-+ drv_printk(KERN_ERR, "no io memory range found\n");
-+ return -ENODEV;
-+ }
-+ error = of_address_to_resource(odev->node, 1, &mem[1]);
-+ if (error) {
-+ drv_printk(KERN_ERR, "missing ioh memory area (%d)\n", error);
-+ return -ENODEV;
-+ }
-+
-+ return starlet_ipc_do_probe(&odev->dev, mem,
-+ irq_of_parse_and_map(odev->node, 0));
-+}
-+
-+static int starlet_ipc_of_remove(struct of_device *odev)
-+{
-+ return starlet_ipc_do_remove(&odev->dev);
-+}
-+
-+static int starlet_ipc_of_shutdown(struct of_device *odev)
-+{
-+ return starlet_ipc_do_shutdown(&odev->dev);
-+}
-+
-+static struct of_device_id starlet_ipc_of_match[] = {
-+ { .compatible = "nintendo,starlet-ipc" },
-+ { },
-+};
-+
-+MODULE_DEVICE_TABLE(of, starlet_ipc_of_match);
-+
-+static struct of_platform_driver starlet_ipc_of_driver = {
-+ .owner = THIS_MODULE,
-+ .name = DRV_MODULE_NAME,
-+ .match_table = starlet_ipc_of_match,
-+ .probe = starlet_ipc_of_probe,
-+ .remove = starlet_ipc_of_remove,
-+ .shutdown = starlet_ipc_of_shutdown,
-+};
-+
-+/*
-+ * Kernel module interface hooks.
-+ *
-+ */
-+
-+static int __init starlet_ipc_init_module(void)
-+{
-+ drv_printk(KERN_INFO, "%s - version %s\n", DRV_DESCRIPTION,
-+ starlet_ipc_driver_version);
-+
-+ return of_register_platform_driver(&starlet_ipc_of_driver);
-+}
-+
-+static void __exit starlet_ipc_exit_module(void)
-+{
-+ of_unregister_platform_driver(&starlet_ipc_of_driver);
-+}
-+
-+module_init(starlet_ipc_init_module);
-+module_exit(starlet_ipc_exit_module);
-+
-+MODULE_DESCRIPTION(DRV_DESCRIPTION);
-+MODULE_AUTHOR(DRV_AUTHOR);
-+MODULE_LICENSE("GPL");
-+
-diff --git a/arch/powerpc/platforms/embedded6xx/starlet-malloc.c b/arch/powerpc/platforms/embedded6xx/starlet-malloc.c
-new file mode 100644
-index 0000000..d9c9dcd
---- /dev/null
-+++ b/arch/powerpc/platforms/embedded6xx/starlet-malloc.c
-@@ -0,0 +1,365 @@
-+/*
-+ * arch/powerpc/platforms/embedded6xx/starlet-malloc.c
-+ *
-+ * Nintendo Wii starlet memory allocation library
-+ * Copyright (C) 2008-2009 The GameCube Linux Team
-+ * Copyright (C) 2008,2009 Albert Herranz
-+ *
-+ * This program is free software; you can redistribute it and/or
-+ * modify it under the terms of the GNU General Public License
-+ * as published by the Free Software Foundation; either version 2
-+ * of the License, or (at your option) any later version.
-+ *
-+ */
-+
-+/*
-+ * Notes from the trenches:
-+ *
-+ * writes from broadway to mem2
-+ * - 8 or 16 bit writes to mem2 modify 64 bits
-+ * - writing 0xaa results in 0xaaffffffaaffffff being written
-+ * - writing 0xaabb results in 0xaabbffffaabbffff being written
-+ * - 32 bit writes work fine
-+ * writes from starlet to mem1
-+ * - data must be 4 byte aligned, length must be 4 byte aligned
-+ *
-+ * write protected area (reads after writes do not return written info)
-+ * 0x13620000 - 0x14000000
-+ *
-+ */
-+
-+#define DEBUG
-+
-+#define DBG(fmt, arg...) pr_debug(fmt, ##arg)
-+
-+#include <linux/kernel.h>
-+#include <linux/resource.h>
-+#include <asm/starlet.h>
-+
-+
-+#define LIB_MODULE_NAME "starlet-malloc"
-+#define LIB_DESCRIPTION "Nintendo Wii starlet malloc library"
-+#define LIB_AUTHOR "Albert Herranz"
-+
-+static char starlet_malloc_lib_version[] = "0.1i";
-+
-+#define drv_printk(level, format, arg...) \
-+ printk(level LIB_MODULE_NAME ": " format , ## arg)
-+
-+
-+#define STARLET_IOH_ALIGN 31
-+
-+/*
-+ * Simple aligned kzalloc and free.
-+ *
-+ * Based on the idea proposed by Satya Kiran Popuri
-+ * http://www.cs.uic.edu/~spopuri/amalloc.html
-+ */
-+
-+/**
-+ *
-+ */
-+static void *kzalloc_aligned(size_t size, gfp_t flags, size_t align)
-+{
-+ void *ptr, *aligned_ptr;
-+ size_t aligned_size;
-+
-+ /* not a power of two */
-+ if (align & (align - 1))
-+ return NULL;
-+
-+ /* worst case allocation size */
-+ aligned_size = size + align - 1;
-+
-+ /* add extra space to store allocation delta */
-+ aligned_size += sizeof(size_t);
-+
-+ /* allocate all space */
-+ ptr = kzalloc(aligned_size, flags);
-+ if (!ptr)
-+ return NULL;
-+
-+ /* calculate the aligned address, making room for the delta value */
-+ aligned_ptr = PTR_ALIGN(ptr + sizeof(size_t), align);
-+
-+ /* save the delta before the address returned to caller */
-+ *((size_t *)aligned_ptr - 1) = aligned_ptr - ptr;
-+
-+ return aligned_ptr;
-+}
-+
-+static void kfree_aligned(void *aligned_ptr)
-+{
-+ void *ptr;
-+ size_t delta;
-+
-+ if (!aligned_ptr)
-+ return;
-+
-+ /* retrieve extra allocation delta */
-+ delta = *((size_t *)aligned_ptr - 1);
-+
-+ /* calculate original allocation area start */
-+ ptr = aligned_ptr - delta;
-+
-+ kfree(ptr);
-+}
-+
-+
-+/**
-+ *
-+ */
-+void *starlet_kzalloc(size_t size, gfp_t flags)
-+{
-+ return kzalloc_aligned(size, flags, STARLET_IPC_DMA_ALIGN+1);
-+}
-+
-+/**
-+ *
-+ */
-+void starlet_kfree(void *ptr)
-+{
-+ kfree_aligned(ptr);
-+}
-+
-+
-+
-+/*
-+ * Functions for special input/output buffer allocations.
-+ *
-+ * Starlet seems to have a limitation when doing non-32 bit writes to MEM1.
-+ * This can cause up to a 3 byte data loss when starlet delivers
-+ * data of an unaligned size.
-+ * Writes to MEM2 don't have such a limitation.
-+ *
-+ * We use special buffers when we need to retrieve data of an unaligned size
-+ * from starlet.
-+ *
-+ */
-+
-+static int starlet_ioh_init(struct starlet_ioh *ioh, struct resource *mem)
-+{
-+ size_t size = mem->end - mem->start + 1;
-+ rh_info_t *rheap;
-+ int error = -ENOMEM;
-+
-+ ioh->base = ioremap_flags(mem->start, size, _PAGE_GUARDED);
-+ if (!ioh->base) {
-+ drv_printk(KERN_ERR, "unable to ioremap ioh area\n");
-+ goto err;
-+ }
-+ ioh->base_phys = mem->start;
-+ ioh->size = size;
-+
-+ {
-+ void *first = NULL, *last = NULL;
-+ u32 *p;
-+
-+ p = ioh->base + size;
-+ do {
-+ p--;
-+ *p = 0xdeadbabe;
-+ } while (p != ioh->base);
-+ __dma_sync(ioh->base, size, DMA_TO_DEVICE);
-+
-+ p = ioh->base + size;
-+ do {
-+ p--;
-+ if (*p != 0xdeadbabe) {
-+ if (!last)
-+ last = p;
-+ first = p;
-+ }
-+ } while (p != ioh->base);
-+
-+ if (first)
-+ drv_printk(KERN_INFO, "unreliable writes from"
-+ " %p to %p\n", first, last);
-+ }
-+
-+ rheap = rh_create(STARLET_IOH_ALIGN+1);
-+ if (IS_ERR(rheap)) {
-+ error = PTR_ERR(rheap);
-+ goto err_rh_create;
-+ }
-+ ioh->rheap = rheap;
-+
-+ error = rh_attach_region(rheap, 0, size);
-+ if (error)
-+ goto err_rh_attach_region;
-+
-+ spin_lock_init(&ioh->lock);
-+
-+ drv_printk(KERN_INFO, "ioh at 0x%08lx, mapped to 0x%p, size %uk\n",
-+ ioh->base_phys, ioh->base, ioh->size / 1024);
-+
-+ return 0;
-+
-+err_rh_create:
-+ iounmap(ioh->base);
-+err_rh_attach_region:
-+ rh_destroy(ioh->rheap);
-+err:
-+ return error;
-+}
-+
-+static struct starlet_ioh *starlet_ioh;
-+
-+/**
-+ *
-+ */
-+static struct starlet_ioh *starlet_ioh_get(void)
-+{
-+ if (unlikely(!starlet_ioh))
-+ drv_printk(KERN_ERR, "uninitialized ioh instance!\n");
-+ return starlet_ioh;
-+}
-+
-+unsigned long starlet_ioh_virt_to_phys(void *ptr)
-+{
-+ struct starlet_ioh *ioh = starlet_ioh_get();
-+ unsigned long offset;
-+
-+ if (!ioh || !ptr)
-+ return 0;
-+
-+ offset = ptr - ioh->base;
-+ return ioh->base_phys + offset;
-+}
-+
-+/**
-+ *
-+ */
-+void *starlet_ioh_kzalloc_aligned(size_t size, size_t align)
-+{
-+ struct starlet_ioh *ioh = starlet_ioh_get();
-+ unsigned long offset;
-+ void *ptr;
-+ unsigned long flags;
-+
-+ if (!ioh)
-+ return NULL;
-+
-+ spin_lock_irqsave(&ioh->lock, flags);
-+ offset = rh_alloc_align(ioh->rheap, size, align, NULL);
-+ spin_unlock_irqrestore(&ioh->lock, flags);
-+
-+ if (IS_ERR_VALUE(offset))
-+ return NULL;
-+
-+ ptr = ioh->base + offset;
-+ memset(ptr, 0, size);
-+
-+ return ptr;
-+}
-+
-+/**
-+ *
-+ */
-+void *starlet_ioh_kzalloc(size_t size)
-+{
-+ return starlet_ioh_kzalloc_aligned(size, STARLET_IOH_ALIGN+1);
-+}
-+
-+/**
-+ *
-+ */
-+void starlet_ioh_kfree(void *ptr)
-+{
-+ struct starlet_ioh *ioh = starlet_ioh_get();
-+ unsigned long offset;
-+ unsigned long flags;
-+
-+ if (!ioh || !ptr)
-+ return;
-+
-+ offset = ptr - ioh->base;
-+
-+ spin_lock_irqsave(&ioh->lock, flags);
-+ rh_free(ioh->rheap, offset);
-+ spin_unlock_irqrestore(&ioh->lock, flags);
-+}
-+
-+int starlet_ioh_dma_map_sg(struct device *dev, struct starlet_ioh_sg *sgl,
-+ int nents, enum dma_data_direction direction)
-+{
-+ struct starlet_ioh_sg *sg;
-+ int i;
-+
-+ BUG_ON(direction == DMA_NONE);
-+
-+ starlet_ioh_for_each_sg(sgl, sg, nents, i) {
-+ if (!sg->buf || sg->len == 0)
-+ continue;
-+ __dma_sync(sg->buf, sg->len, direction);
-+ }
-+ return nents;
-+}
-+
-+void starlet_ioh_dma_unmap_sg(struct device *dev, struct starlet_ioh_sg *sgl,
-+ int nents, enum dma_data_direction direction)
-+{
-+ /* nothing to do */
-+}
-+
-+void starlet_ioh_sg_init_table(struct starlet_ioh_sg *sgl, unsigned int nents)
-+{
-+ memset(sgl, 0, nents * sizeof(*sgl));
-+}
-+
-+/**
-+ *
-+ * @buf: must have been allocated using one of the starlet_ioh_* alloc
-+ * functions.
-+ */
-+void starlet_ioh_sg_set_buf(struct starlet_ioh_sg *sg, void *buf, size_t len)
-+{
-+ struct starlet_ioh *ioh = starlet_ioh_get();
-+ unsigned long offset;
-+
-+ if (buf && len) {
-+ offset = buf - ioh->base;
-+
-+ sg->buf = buf;
-+ sg->len = len;
-+ sg->dma_addr = ioh->base_phys + offset;
-+ } else {
-+ sg->buf = NULL;
-+ sg->len = 0;
-+ sg->dma_addr = 0;
-+ }
-+}
-+
-+
-+/**
-+ *
-+ */
-+int starlet_malloc_lib_bootstrap(struct resource *mem)
-+{
-+ struct starlet_ioh *ioh;
-+ int error;
-+
-+ if (starlet_ioh) {
-+ drv_printk(KERN_WARNING, "already bootstrapped\n");
-+ return 0;
-+ }
-+
-+ drv_printk(KERN_INFO, "%s - version %s\n", LIB_DESCRIPTION,
-+ starlet_malloc_lib_version);
-+
-+ ioh = kzalloc(sizeof(*ioh), GFP_KERNEL);
-+ if (!ioh) {
-+ drv_printk(KERN_ERR, "failed to allocate ioh\n");
-+ return -ENOMEM;
-+ }
-+
-+ error = starlet_ioh_init(ioh, mem);
-+ if (error)
-+ kfree(ioh);
-+ else
-+ starlet_ioh = ioh;
-+
-+ return error;
-+}
-+
-+
-diff --git a/arch/powerpc/platforms/embedded6xx/starlet-stm.c b/arch/powerpc/platforms/embedded6xx/starlet-stm.c
-new file mode 100644
-index 0000000..a765964
---- /dev/null
-+++ b/arch/powerpc/platforms/embedded6xx/starlet-stm.c
-@@ -0,0 +1,93 @@
-+/*
-+ * arch/powerpc/platforms/embedded6xx/starlet-stm.c
-+ *
-+ * Nintendo Wii starlet STM routines
-+ * Copyright (C) 2008-2009 The GameCube Linux Team
-+ * Copyright (C) 2008,2009 Albert Herranz
-+ *
-+ * This program is free software; you can redistribute it and/or
-+ * modify it under the terms of the GNU General Public License
-+ * as published by the Free Software Foundation; either version 2
-+ * of the License, or (at your option) any later version.
-+ *
-+ */
-+
-+#define DBG(fmt, arg...) drv_printk(KERN_INFO, fmt, ##arg)
-+
-+#include <linux/kernel.h>
-+#include <linux/dma-mapping.h>
-+#include <asm/starlet.h>
-+
-+
-+/*
-+ * /dev/stm/immediate
-+ *
-+ */
-+
-+#define STARLET_STM_HOTRESET 0x2001
-+#define STARLET_STM_SHUTDOWN 0x2003
-+
-+#define STARLET_DEV_STM_IMMEDIATE "/dev/stm/immediate"
-+
-+#define drv_printk(level, format, arg...) \
-+ printk(level "starlet-stm: " format , ## arg)
-+
-+
-+static const char dev_stm_immediate[] = STARLET_DEV_STM_IMMEDIATE;
-+
-+/* private aligned buffer for restart/power_off operations */
-+static u32 starlet_stm_buf[(STARLET_IPC_DMA_ALIGN+1)/sizeof(u32)]
-+ __attribute__ ((aligned(STARLET_IPC_DMA_ALIGN+1)));
-+
-+/*
-+ *
-+ */
-+static void starlet_stm_common_restart(int request, u32 value)
-+{
-+ u32 *buf = starlet_stm_buf;
-+ size_t len = sizeof(starlet_stm_buf);
-+ int fd;
-+ int error;
-+
-+ /* REVISIT, use polled ipc calls here */
-+
-+
-+ drv_printk(KERN_INFO, "trying IPC restart...\n");
-+
-+ fd = starlet_open(dev_stm_immediate, 0);
-+ if (fd < 0) {
-+ drv_printk(KERN_ERR, "failed to open %s\n", dev_stm_immediate);
-+ error = fd;
-+ goto done;
-+ }
-+
-+ *buf = value;
-+ error = starlet_ioctl(fd, request, buf, len, buf, len);
-+ if (error < 0)
-+ drv_printk(KERN_ERR, "ioctl %d failed\n", request);
-+ starlet_close(fd);
-+
-+done:
-+ if (error < 0)
-+ DBG("%s: error=%d (%x)\n", __func__, error, error);
-+}
-+
-+/*
-+ *
-+ */
-+void starlet_stm_restart(void)
-+{
-+ starlet_stm_common_restart(STARLET_STM_HOTRESET, 0);
-+}
-+/*EXPORT_SYMBOL_GPL(starlet_stm_restart);*/
-+
-+/*
-+ *
-+ */
-+void starlet_stm_power_off(void)
-+{
-+ starlet_stm_common_restart(STARLET_STM_SHUTDOWN, 0);
-+}
-+/*EXPORT_SYMBOL_GPL(starlet_stm_power_off);*/
-+
-+
-diff --git a/arch/powerpc/platforms/embedded6xx/usbgecko_udbg.c b/arch/powerpc/platforms/embedded6xx/usbgecko_udbg.c
-new file mode 100644
-index 0000000..0b17477
---- /dev/null
-+++ b/arch/powerpc/platforms/embedded6xx/usbgecko_udbg.c
-@@ -0,0 +1,318 @@
-+/*
-+ * arch/powerpc/platforms/embedded6xx/usbgecko_udbg.c
-+ *
-+ * udbg serial input/output routines for the USB Gecko adapter.
-+ * Copyright (C) 2008-2009 The GameCube Linux Team
-+ * Copyright (C) 2008,2009 Albert Herranz
-+ *
-+ * This program is free software; you can redistribute it and/or
-+ * modify it under the terms of the 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/io.h>
-+#include <asm/prom.h>
-+#include <asm/udbg.h>
-+
-+#include <mm/mmu_decl.h>
-+
-+#include "usbgecko_udbg.h"
-+
-+
-+#define EXI_CLK_32MHZ 5
-+
-+#define EXI_CSR 0x00
-+#define EXI_CSR_CLKMASK (0x7<<4)
-+#define EXI_CSR_CLK_32MHZ (EXI_CLK_32MHZ<<4)
-+#define EXI_CSR_CSMASK (0x7<<7)
-+#define EXI_CSR_CS_0 (0x1<<7) /* Chip Select 001 */
-+
-+#define EXI_CR 0x0c
-+#define EXI_CR_TSTART (1<<0)
-+#define EXI_CR_WRITE (1<<2)
-+#define EXI_CR_READ_WRITE (2<<2)
-+#define EXI_CR_TLEN(len) (((len)-1)<<4)
-+
-+#define EXI_DATA 0x10
-+
-+#define UG_READ_ATTEMPTS 100
-+#define UG_WRITE_ATTEMPTS 100
-+
-+
-+static void __iomem *ug_io_base;
-+
-+/*
-+ * Performs one input/output transaction between the spi host and the usbgecko.
-+ */
-+static u32 ug_io_transaction(u32 in)
-+{
-+ u32 __iomem *csr_reg = ug_io_base + EXI_CSR;
-+ u32 __iomem *data_reg = ug_io_base + EXI_DATA;
-+ u32 __iomem *cr_reg = ug_io_base + EXI_CR;
-+ u32 csr, data, cr;
-+
-+ /* select */
-+ csr = EXI_CSR_CLK_32MHZ | EXI_CSR_CS_0;
-+ out_be32(csr_reg, csr);
-+
-+ /* read/write */
-+ data = in;
-+ out_be32(data_reg, data);
-+ cr = EXI_CR_TLEN(2) | EXI_CR_READ_WRITE | EXI_CR_TSTART;
-+ out_be32(cr_reg, cr);
-+
-+ while (in_be32(cr_reg) & EXI_CR_TSTART)
-+ barrier();
-+
-+ /* deselect */
-+ out_be32(csr_reg, 0);
-+
-+ /* result */
-+ data = in_be32(data_reg);
-+
-+ return data;
-+}
-+
-+/*
-+ * Returns true if an usbgecko adapter is found.
-+ */
-+static int ug_is_adapter_present(void)
-+{
-+ if (!ug_io_base)
-+ return 0;
-+
-+ return ug_io_transaction(0x90000000) == 0x04700000;
-+}
-+
-+/*
-+ * Returns true if the TX fifo is ready for transmission.
-+ */
-+static int ug_is_txfifo_ready(void)
-+{
-+ return ug_io_transaction(0xc0000000) & 0x04000000;
-+}
-+
-+/*
-+ * Tries to transmit a character.
-+ * If the TX fifo is not ready the result is undefined.
-+ */
-+static void ug_raw_putc(char ch)
-+{
-+ ug_io_transaction(0xb0000000 | (ch << 20));
-+}
-+
-+/*
-+ * Transmits a character.
-+ * It silently fails if the TX fifo is not ready after a number of retries.
-+ */
-+static void ug_putc(char ch)
-+{
-+ int count = UG_WRITE_ATTEMPTS;
-+
-+ if (!ug_io_base)
-+ return;
-+
-+ if (ch == '\n')
-+ ug_putc('\r');
-+
-+ while (!ug_is_txfifo_ready() && count--)
-+ barrier();
-+ if (count)
-+ ug_raw_putc(ch);
-+}
-+
-+#if 0
-+/*
-+ * Trasmits a null terminated character string.
-+ */
-+static void ug_puts(char *s)
-+{
-+ while (*s)
-+ ug_putc(*s++);
-+}
-+#endif
-+
-+/*
-+ * Returns true if the RX fifo is ready for transmission.
-+ */
-+static int ug_is_rxfifo_ready(void)
-+{
-+ return ug_io_transaction(0xd0000000) & 0x04000000;
-+}
-+
-+/*
-+ * Tries to receive a character.
-+ * If a character is unavailable the function returns -1.
-+ */
-+static int ug_raw_getc(void)
-+{
-+ u32 data = ug_io_transaction(0xa0000000);
-+ if (data & 0x08000000)
-+ return (data >> 16) & 0xff;
-+ else
-+ return -1;
-+}
-+
-+/*
-+ * Receives a character.
-+ * It fails if the RX fifo is not ready after a number of retries.
-+ */
-+static int ug_getc(void)
-+{
-+ int count = UG_READ_ATTEMPTS;
-+
-+ if (!ug_io_base)
-+ return -1;
-+
-+ while (!ug_is_rxfifo_ready() && count--)
-+ barrier();
-+ return ug_raw_getc();
-+}
-+
-+/*
-+ * udbg functions.
-+ *
-+ */
-+
-+/*
-+ * Transmits a character.
-+ */
-+void ug_udbg_putc(char ch)
-+{
-+ ug_putc(ch);
-+}
-+
-+/*
-+ * Receives a character. Waits until a character is available.
-+ */
-+static int ug_udbg_getc(void)
-+{
-+ int ch;
-+
-+ while ((ch = ug_getc()) == -1)
-+ barrier();
-+ return ch;
-+}
-+
-+/*
-+ * Receives a character. If a character is not available, returns -1.
-+ */
-+static int ug_udbg_getc_poll(void)
-+{
-+ if (!ug_is_rxfifo_ready())
-+ return -1;
-+ return ug_getc();
-+}
-+
-+/*
-+ * Retrieves and prepares the virtual address needed to access the hardware.
-+ */
-+static void __iomem *ug_udbg_setup_io_base(struct device_node *np)
-+{
-+ phys_addr_t paddr;
-+ const unsigned int *reg;
-+
-+ reg = of_get_property(np, "reg", NULL);
-+ if (reg) {
-+ paddr = of_translate_address(np, reg);
-+ if (paddr) {
-+ ug_io_base = ioremap(paddr, reg[1]);
-+ return ug_io_base;
-+ }
-+ }
-+ return NULL;
-+}
-+
-+/*
-+ * USB Gecko udbg support initialization.
-+ */
-+void __init ug_udbg_init(void)
-+{
-+ struct device_node *np = NULL;
-+ struct device_node *stdout;
-+ const char *path;
-+
-+ if (ug_io_base)
-+ udbg_printf("%s: early -> final\n", __func__);
-+
-+ if (!of_chosen) {
-+ udbg_printf("%s: missing of_chosen\n", __func__);
-+ goto done;
-+ }
-+
-+ path = of_get_property(of_chosen, "linux,stdout-path", NULL);
-+ if (!path) {
-+ udbg_printf("%s: missing %s property", __func__,
-+ "linux,stdout-path");
-+ goto done;
-+ }
-+
-+ stdout = of_find_node_by_path(path);
-+ if (!stdout) {
-+ udbg_printf("%s: missing path %s", __func__, path);
-+ goto done;
-+ }
-+
-+ for (np = NULL;
-+ (np = of_find_compatible_node(np, NULL, "usbgecko,usbgecko"));)
-+ if (np == stdout)
-+ break;
-+
-+ of_node_put(stdout);
-+ if (!np) {
-+ udbg_printf("%s: stdout is not an usbgecko", __func__);
-+ goto done;
-+ }
-+
-+ if (!ug_udbg_setup_io_base(np)) {
-+ udbg_printf("%s: failed to setup io base", __func__);
-+ goto done;
-+ }
-+
-+ if (!ug_is_adapter_present()) {
-+ udbg_printf("usbgecko_udbg: not found\n");
-+ ug_io_base = NULL;
-+ } else {
-+ udbg_putc = ug_udbg_putc;
-+ udbg_getc = ug_udbg_getc;
-+ udbg_getc_poll = ug_udbg_getc_poll;
-+ udbg_printf("usbgecko_udbg: ready\n");
-+ }
-+
-+done:
-+ if (np)
-+ of_node_put(np);
-+ return;
-+}
-+
-+#ifdef CONFIG_PPC_EARLY_DEBUG_USBGECKO
-+
-+/*
-+ * USB Gecko early debug support initialization for udbg.
-+ *
-+ */
-+void __init udbg_init_usbgecko(void)
-+{
-+ unsigned long vaddr, paddr;
-+
-+#if defined(CONFIG_GAMECUBE)
-+ paddr = 0x0c000000;
-+#elif defined(CONFIG_WII)
-+ paddr = 0x0d000000;
-+#else
-+#error Invalid platform for USB Gecko based early debugging.
-+#endif
-+
-+ vaddr = 0xc0000000 | paddr;
-+ setbat(1, vaddr, paddr, 128*1024, _PAGE_IO);
-+
-+ ug_io_base = (void __iomem *)(vaddr | 0x6814);
-+
-+ udbg_putc = ug_udbg_putc;
-+ udbg_getc = ug_udbg_getc;
-+ udbg_getc_poll = ug_udbg_getc_poll;
-+}
-+
-+#endif /* CONFIG_PPC_EARLY_DEBUG_USBGECKO */
-diff --git a/arch/powerpc/platforms/embedded6xx/usbgecko_udbg.h b/arch/powerpc/platforms/embedded6xx/usbgecko_udbg.h
-new file mode 100644
-index 0000000..98034ee
---- /dev/null
-+++ b/arch/powerpc/platforms/embedded6xx/usbgecko_udbg.h
-@@ -0,0 +1,36 @@
-+/*
-+ * arch/powerpc/platforms/embedded6xx/usbgecko_udbg.h
-+ *
-+ * udbg serial input/output routines for the USB Gecko adapter.
-+ * Copyright (C) 2008-2009 The GameCube Linux Team
-+ * Copyright (C) 2008,2009 Albert Herranz
-+ *
-+ * This program is free software; you can redistribute it and/or
-+ * modify it under the terms of the 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 __USBGECKO_UDBG_H
-+#define __USBGECKO_UDBG_H
-+
-+#ifdef CONFIG_USBGECKO_UDBG
-+
-+extern void __init ug_udbg_init(void);
-+
-+#else
-+
-+static inline void __init ug_udbg_init(void)
-+{
-+}
-+
-+#endif /* CONFIG_USBGECKO_UDBG */
-+
-+#ifdef CONFIG_PPC_EARLY_DEBUG_USBGECKO
-+
-+void __init udbg_init_usbgecko(void);
-+
-+#endif /* CONFIG_PPC_EARLY_DEBUG_USBGECKO */
-+
-+#endif /* __USBGECKO_UDBG_H */
-diff --git a/arch/powerpc/platforms/embedded6xx/wii.c b/arch/powerpc/platforms/embedded6xx/wii.c
-new file mode 100644
-index 0000000..7a7176d
---- /dev/null
-+++ b/arch/powerpc/platforms/embedded6xx/wii.c
-@@ -0,0 +1,115 @@
-+/*
-+ * arch/powerpc/platforms/embedded6xx/wii.c
-+ *
-+ * Nintendo Wii board-specific support
-+ * Copyright (C) 2008-2009 The GameCube Linux Team
-+ * Copyright (C) 2008,2009 Albert Herranz
-+ *
-+ * This program is free software; you can redistribute it and/or
-+ * modify it under the terms of the 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/init.h>
-+#include <linux/irq.h>
-+#include <linux/seq_file.h>
-+#include <linux/kexec.h>
-+
-+#include <asm/io.h>
-+#include <asm/machdep.h>
-+#include <asm/prom.h>
-+#include <asm/time.h>
-+#include <asm/starlet.h>
-+#include <asm/udbg.h>
-+
-+#include "flipper-pic.h"
-+#include "gcnvi_udbg.h"
-+#include "usbgecko_udbg.h"
-+
-+
-+static void wii_restart(char *cmd)
-+{
-+ starlet_stm_restart();
-+ local_irq_disable();
-+ /* spin until power button pressed */
-+ for (;;)
-+ cpu_relax();
-+}
-+
-+static void wii_power_off(void)
-+{
-+ starlet_stm_power_off();
-+ local_irq_disable();
-+ /* spin until power button pressed */
-+ for (;;)
-+ cpu_relax();
-+}
-+
-+static void wii_halt(void)
-+{
-+ wii_restart(NULL);
-+}
-+
-+static void wii_show_cpuinfo(struct seq_file *m)
-+{
-+ seq_printf(m, "vendor\t\t: IBM\n");
-+ seq_printf(m, "machine\t\t: Nintendo Wii\n");
-+}
-+
-+static void __init wii_setup_arch(void)
-+{
-+ ug_udbg_init();
-+ gcnvi_udbg_init();
-+}
-+
-+static void __init wii_init_early(void)
-+{
-+}
-+
-+static int __init wii_probe(void)
-+{
-+ unsigned long dt_root;
-+
-+ dt_root = of_get_flat_dt_root();
-+ if (!of_flat_dt_is_compatible(dt_root, "nintendo,wii"))
-+ return 0;
-+
-+ return 1;
-+}
-+
-+#ifdef CONFIG_KEXEC
-+static void wii_shutdown(void)
-+{
-+ /* currently not used */
-+}
-+
-+static int wii_kexec_prepare(struct kimage *image)
-+{
-+ return 0;
-+}
-+#endif /* CONFIG_KEXEC */
-+
-+
-+define_machine(wii) {
-+ .name = "wii",
-+ .probe = wii_probe,
-+ .setup_arch = wii_setup_arch,
-+ .init_early = wii_init_early,
-+ .show_cpuinfo = wii_show_cpuinfo,
-+ .restart = wii_restart,
-+ .power_off = wii_power_off,
-+ .halt = wii_halt,
-+ .init_IRQ = flipper_pic_probe,
-+ .get_irq = flipper_pic_get_irq,
-+ .calibrate_decr = generic_calibrate_decr,
-+ .progress = udbg_progress,
-+#ifdef CONFIG_KEXEC
-+ .machine_shutdown = wii_shutdown,
-+ .machine_kexec_prepare = wii_kexec_prepare,
-+ .machine_kexec = default_machine_kexec,
-+#endif
-+};
-+
-diff --git a/arch/powerpc/platforms/embedded6xx/wii_dev.c b/arch/powerpc/platforms/embedded6xx/wii_dev.c
-new file mode 100644
-index 0000000..c5ed8b5
---- /dev/null
-+++ b/arch/powerpc/platforms/embedded6xx/wii_dev.c
-@@ -0,0 +1,44 @@
-+/*
-+ * arch/powerpc/platforms/embedded6xx/wii_dev.c
-+ *
-+ * Nintendo Wii platform device setup.
-+ * Copyright (C) 2008-2009 The GameCube Linux Team
-+ * Copyright (C) 2008,2009 Albert Herranz
-+ *
-+ * This program is free software; you can redistribute it and/or
-+ * modify it under the terms of the 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/init.h>
-+#include <linux/of_platform.h>
-+
-+#include <asm/machdep.h>
-+
-+static struct of_device_id wii_of_bus[] = {
-+ { .compatible = "nintendo,hollywood", },
-+ { },
-+};
-+
-+static int __init wii_device_probe(void)
-+{
-+ struct device_node *np;
-+
-+ if (!machine_is(wii))
-+ return 0;
-+
-+ of_platform_bus_probe(NULL, wii_of_bus, NULL);
-+
-+ np = of_find_compatible_node(NULL, NULL, "nintendo,hollywood-mem2");
-+ if (np) {
-+ of_platform_device_create(np, NULL, NULL);
-+ of_node_put(np);
-+ }
-+
-+ return 0;
-+}
-+device_initcall(wii_device_probe);
-+
-diff --git a/drivers/Kconfig b/drivers/Kconfig
-index 2f557f5..08d2933 100644
---- a/drivers/Kconfig
-+++ b/drivers/Kconfig
-@@ -50,6 +50,8 @@ source "drivers/char/Kconfig"
-
- source "drivers/i2c/Kconfig"
-
-+source "drivers/exi/Kconfig"
-+
- source "drivers/spi/Kconfig"
-
- source "drivers/gpio/Kconfig"
-diff --git a/drivers/Makefile b/drivers/Makefile
-index fceb71a..d53f062 100644
---- a/drivers/Makefile
-+++ b/drivers/Makefile
-@@ -97,6 +97,8 @@ obj-$(CONFIG_DMA_ENGINE) += dma/
- obj-$(CONFIG_DCA) += dca/
- obj-$(CONFIG_HID) += hid/
- obj-$(CONFIG_PPC_PS3) += ps3/
-+obj-$(CONFIG_GAMECUBE_EXI) += exi/
-+obj-$(CONFIG_GAMECUBE_SI) += input/si/
- obj-$(CONFIG_OF) += of/
- obj-$(CONFIG_SSB) += ssb/
- obj-$(CONFIG_VIRTIO) += virtio/
-diff --git a/drivers/block/Kconfig b/drivers/block/Kconfig
-index 0344a8a..7dd9143 100644
---- a/drivers/block/Kconfig
-+++ b/drivers/block/Kconfig
-@@ -56,6 +56,93 @@ config AMIGA_Z2RAM
- To compile this driver as a module, choose M here: the
- module will be called z2ram.
-
-+config GAMECUBE_SD
-+ tristate "Nintendo GameCube/Wii MMC/SD card"
-+ depends on GAMECUBE_EXI
-+ help
-+ This enables support for using SD and MMC cards through
-+ the Nintendo SD Card Adapter (DOL-019) or compatible hardware.
-+
-+ You probably want to compile FAT support, and the required
-+ codepages, or mount will complain. See Filesystems -> DOS/FAT/NT
-+ filesystems and Filesystems -> Native Language Support
-+
-+ Say Y if you want to include this driver in the kernel.
-+
-+ To compile this driver as a module, choose M here: the
-+ module will be called gcn-sd.
-+
-+config GAMECUBE_ARAM
-+ tristate "Nintendo GameCube Auxiliary RAM (ARAM)"
-+ depends on GAMECUBE
-+ help
-+ This enables support for using the 16MB of ARAM found in the
-+ Nintendo GameCube as a block device.
-+ Say Y if you want to include this driver in the kernel.
-+
-+ To compile this driver as a module, choose M here: the
-+ module will be called gcn-aram.
-+
-+config GAMECUBE_DI
-+ tristate "Nintendo GameCube Disk Interface (DI)"
-+ depends on GAMECUBE
-+ help
-+ This enables support for using the DVD drive unit found
-+ in the Nintendo GameCube.
-+ Say Y if you want to include this driver in the kernel.
-+
-+ To compile this driver as a module, choose M here: the
-+ module will be called gcn-di.
-+
-+config GAMECUBE_DVD
-+ tristate "Nintendo Gamecube DVD"
-+ depends on GAMECUBE && !GAMECUBE_DI && BROKEN
-+ help
-+ This enables support for using the mini-DVD drive on the
-+ Nintendo Gamecube.
-+ Say Y if you want to include this driver in the kernel.
-+
-+ To compile this driver as a module, choose M here: the
-+ module will be called gcn-dvd
-+
-+config GAMECUBE_MEMCARD
-+ tristate "Nintendo GameCube/Wii memory card (EXPERIMENTAL)"
-+ depends on GAMECUBE_EXI && EXPERIMENTAL && BROKEN
-+ help
-+ This enables support for using memory cards compatible with the
-+ Nintendo GameCube.
-+ Say Y if you want to include this driver in the kernel.
-+
-+ To compile this driver as a module, choose M here: the
-+ module will be called gcn-memcard.
-+
-+config WII_MEM2
-+ tristate "Nintendo Wii MEM2"
-+ depends on WII
-+ help
-+ This enables support for using the MEM2 found in the
-+ Nintendo Wii as a block device.
-+ Say Y if you want to include this driver in the kernel.
-+
-+ To compile this driver as a module, choose M here: the
-+ module will be called rvl-mem2.
-+
-+ config WII_SD
-+ tristate "Nintendo Wii front slot MMC/SD"
-+ depends on WII
-+ help
-+ This enables support for MMC/SD cards using the front SD card
-+ slot of the Nintendo Wii.
-+
-+ You probably want to compile FAT support, and the required
-+ codepages, or mount will complain. See Filesystems -> DOS/FAT/NT
-+ filesystems and Filesystems -> Native Language Support
-+
-+ Say Y if you want to include this driver in the kernel.
-+
-+ To compile this driver as a module, choose M here: the
-+ module will be called rvl-stsd.
-+
- config BLK_DEV_XD
- tristate "XT hard disk support"
- depends on ISA && ISA_DMA_API
-diff --git a/drivers/block/Makefile b/drivers/block/Makefile
-index 204332b..1af7546 100644
---- a/drivers/block/Makefile
-+++ b/drivers/block/Makefile
-@@ -11,6 +11,13 @@ obj-$(CONFIG_AMIGA_FLOPPY) += amiflop.o
- obj-$(CONFIG_PS3_DISK) += ps3disk.o
- obj-$(CONFIG_ATARI_FLOPPY) += ataflop.o
- obj-$(CONFIG_AMIGA_Z2RAM) += z2ram.o
-+obj-$(CONFIG_GAMECUBE_SD) += gcn-sd.o
-+obj-$(CONFIG_GAMECUBE_ARAM) += gcn-aram.o
-+obj-$(CONFIG_GAMECUBE_DI) += gcn-di/
-+obj-$(CONFIG_GAMECUBE_DVD) += gcn-dvd/
-+obj-$(CONFIG_GAMECUBE_MEMCARD) += gcn-memcard.o
-+obj-$(CONFIG_WII_MEM2) += rvl-mem2.o
-+obj-$(CONFIG_WII_SD) += rvl-stsd.o
- obj-$(CONFIG_BLK_DEV_RAM) += brd.o
- obj-$(CONFIG_BLK_DEV_LOOP) += loop.o
- obj-$(CONFIG_BLK_DEV_XD) += xd.o
-diff --git a/drivers/block/gcn-aram.c b/drivers/block/gcn-aram.c
-new file mode 100644
-index 0000000..bc2774d
---- /dev/null
-+++ b/drivers/block/gcn-aram.c
-@@ -0,0 +1,597 @@
-+/*
-+ * drivers/block/gcn-aram.c
-+ *
-+ * Nintendo GameCube Auxiliary RAM (ARAM) block driver
-+ * Copyright (C) 2004-2009 The GameCube Linux Team
-+ * Copyright (C) 2005 Todd Jeffreys <todd@voidpointer.org>
-+ * Copyright (C) 2005,2007,2008,2009 Albert Herranz
-+ *
-+ * Based on previous work by Franz Lehner.
-+ *
-+ * This program is free software; you can redistribute it and/or
-+ * modify it under the terms of the 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/blkdev.h>
-+#include <linux/dma-mapping.h>
-+#include <linux/fcntl.h> /* O_ACCMODE */
-+#include <linux/hdreg.h> /* HDIO_GETGEO */
-+#include <linux/interrupt.h>
-+#include <linux/major.h>
-+#include <linux/module.h>
-+#include <linux/of_platform.h>
-+#include <linux/io.h>
-+
-+
-+#define DRV_MODULE_NAME "gcn-aram"
-+#define DRV_DESCRIPTION "Nintendo GameCube Auxiliary RAM (ARAM) block driver"
-+#define DRV_AUTHOR "Todd Jeffreys <todd@voidpointer.org>, " \
-+ "Albert Herranz"
-+
-+static char aram_driver_version[] = "4.0i";
-+
-+#define drv_printk(level, format, arg...) \
-+ printk(level DRV_MODULE_NAME ": " format , ## arg)
-+
-+
-+/*
-+ * Hardware.
-+ */
-+#define ARAM_DMA_ALIGN 0x1f /* 32 bytes */
-+
-+#define DSP_CSR 0x00a
-+#define DSP_CSR_RES (1<<0)
-+#define DSP_CSR_PIINT (1<<1)
-+#define DSP_CSR_HALT (1<<2)
-+#define DSP_CSR_AIDINT (1<<3)
-+#define DSP_CSR_AIDINTMASK (1<<4)
-+#define DSP_CSR_ARINT (1<<5)
-+#define DSP_CSR_ARINTMASK (1<<6)
-+#define DSP_CSR_DSPINT (1<<7)
-+#define DSP_CSR_DSPINTMASK (1<<8)
-+#define DSP_CSR_DSPDMA (1<<9)
-+#define DSP_CSR_RESETXXX (1<<11)
-+
-+#define AR_SIZE 0x012
-+
-+#define AR_MODE 0x016
-+#define AR_MODE_ACCELERATOR (1 << 0)
-+
-+#define AR_REFRESH 0x01a
-+
-+#define AR_DMA_MMADDR 0x020
-+
-+#define AR_DMA_ARADDR 0x024
-+
-+#define AR_DMA_CNT_H 0x028
-+#define AR_READ (1 << 31)
-+#define AR_WRITE 0
-+
-+#define AR_DMA_CNT_L 0x02a
-+
-+#define AR_DMA_CNT AR_DMA_CNT_H
-+
-+/*
-+ * Driver settings
-+ */
-+#define ARAM_NAME DRV_MODULE_NAME
-+#define ARAM_MAJOR Z2RAM_MAJOR /* we share the major */
-+
-+#define ARAM_SECTOR_SIZE PAGE_SIZE
-+
-+#define ARAM_BUFFERSIZE (16*1024*1024)
-+
-+/*
-+ * Driver data.
-+ */
-+struct aram_drvdata {
-+ spinlock_t lock;
-+
-+ spinlock_t io_lock;
-+ void __iomem *io_base;
-+ int irq;
-+
-+ struct block_device_operations fops;
-+ struct gendisk *disk;
-+ struct request_queue *queue;
-+
-+ struct request *req;
-+ dma_addr_t dma_addr;
-+ size_t dma_len;
-+
-+ int ref_count;
-+
-+ struct device *dev;
-+};
-+
-+
-+static inline enum dma_data_direction rq_dir_to_dma_dir(struct request *req)
-+{
-+ if (rq_data_dir(req) == READ)
-+ return DMA_FROM_DEVICE;
-+ else
-+ return DMA_TO_DEVICE;
-+}
-+
-+static inline int rq_dir_to_aram_dir(struct request *req)
-+{
-+ if (rq_data_dir(req) == READ)
-+ return AR_READ;
-+ else
-+ return AR_WRITE;
-+}
-+
-+static void aram_start_dma_transfer(struct aram_drvdata *drvdata,
-+ unsigned long aram_addr)
-+{
-+ void __iomem *io_base = drvdata->io_base;
-+ dma_addr_t dma_addr = drvdata->dma_addr;
-+ size_t dma_len = drvdata->dma_len;
-+
-+ /* DMA transfers require proper alignment */
-+ BUG_ON((dma_addr & ARAM_DMA_ALIGN) != 0 ||
-+ (dma_len & ARAM_DMA_ALIGN) != 0);
-+
-+ out_be32(io_base + AR_DMA_MMADDR, dma_addr);
-+ out_be32(io_base + AR_DMA_ARADDR, aram_addr);
-+
-+ /* writing the low-word kicks off the DMA */
-+ out_be32(io_base + AR_DMA_CNT,
-+ rq_dir_to_aram_dir(drvdata->req) | dma_len);
-+}
-+
-+static irqreturn_t aram_irq_handler(int irq, void *dev0)
-+{
-+ struct aram_drvdata *drvdata = dev0;
-+ struct request *req;
-+ u16 __iomem *csr_reg = drvdata->io_base + DSP_CSR;
-+ u16 csr;
-+ unsigned long flags;
-+
-+ spin_lock_irqsave(&drvdata->io_lock, flags);
-+
-+ csr = in_be16(csr_reg);
-+
-+ /*
-+ * Do nothing if the interrupt is not targetted for us.
-+ * We share this interrupt with the sound driver.
-+ */
-+ if (!(csr & DSP_CSR_ARINT)) {
-+ spin_unlock_irqrestore(&drvdata->io_lock, flags);
-+ return IRQ_NONE;
-+ }
-+
-+ /* strictly ack the ARAM interrupt, and nothing more */
-+ csr &= ~(DSP_CSR_AIDINT | DSP_CSR_DSPINT);
-+ out_be16(csr_reg, csr);
-+
-+ /* pick up current request being serviced */
-+ req = drvdata->req;
-+ drvdata->req = NULL;
-+
-+ spin_unlock_irqrestore(&drvdata->io_lock, flags);
-+
-+ if (req) {
-+ __blk_end_request(req, 0, req->current_nr_sectors << 9);
-+ dma_unmap_single(drvdata->dev,
-+ drvdata->dma_addr, drvdata->dma_len,
-+ rq_dir_to_dma_dir(req));
-+ spin_lock(&drvdata->lock);
-+ blk_start_queue(drvdata->queue);
-+ spin_unlock(&drvdata->lock);
-+ } else {
-+ drv_printk(KERN_ERR, "ignoring interrupt, no request\n");
-+ }
-+
-+ return IRQ_HANDLED;
-+}
-+
-+static void aram_do_request(struct request_queue *q)
-+{
-+ struct aram_drvdata *drvdata = q->queuedata;
-+ struct request *req;
-+ unsigned long aram_addr;
-+ size_t len;
-+ unsigned long flags;
-+
-+ req = elv_next_request(q);
-+ while (req) {
-+ spin_lock_irqsave(&drvdata->io_lock, flags);
-+
-+ /* we schedule a single request each time */
-+ if (drvdata->req) {
-+ spin_unlock_irqrestore(&drvdata->io_lock, flags);
-+ blk_stop_queue(q);
-+ break;
-+ }
-+
-+ blkdev_dequeue_request(req);
-+
-+ /* ignore requests that we can't handle */
-+ if (!blk_fs_request(req)) {
-+ spin_unlock_irqrestore(&drvdata->io_lock, flags);
-+ continue;
-+ }
-+
-+ /* store the request being handled */
-+ drvdata->req = req;
-+ blk_stop_queue(q);
-+
-+ spin_unlock_irqrestore(&drvdata->io_lock, flags);
-+
-+ /* calculate the ARAM address and length */
-+ aram_addr = req->sector << 9;
-+ len = req->current_nr_sectors << 9;
-+
-+ /* give up if the request goes out of bounds */
-+ if (aram_addr + len > ARAM_BUFFERSIZE) {
-+ drv_printk(KERN_ERR, "bad access: block=%lu,"
-+ " size=%u\n", (unsigned long)req->sector,
-+ len);
-+ /* XXX correct? the request is already dequeued */
-+ end_request(req, 0);
-+ continue;
-+ }
-+
-+ BUG_ON(req->nr_phys_segments != 1);
-+
-+ /* perform DMA mappings */
-+ drvdata->dma_len = len;
-+ drvdata->dma_addr = dma_map_single(drvdata->dev,
-+ req->buffer, len,
-+ rq_dir_to_dma_dir(req));
-+
-+ /* start the DMA transfer */
-+ aram_start_dma_transfer(drvdata, aram_addr);
-+ break;
-+ }
-+}
-+
-+/*
-+ * Block device hooks.
-+ *
-+ */
-+
-+static int aram_open(struct block_device *bdev, fmode_t mode)
-+{
-+ struct aram_drvdata *drvdata = bdev->bd_disk->private_data;
-+ unsigned long flags;
-+ int retval = 0;
-+
-+ spin_lock_irqsave(&drvdata->lock, flags);
-+
-+ /* only allow a minor of 0 to be opened */
-+ if (MINOR(bdev->bd_dev)) {
-+ retval = -ENODEV;
-+ goto out;
-+ }
-+
-+ /* honor exclusive open mode */
-+ if (drvdata->ref_count == -1 ||
-+ (drvdata->ref_count && (mode & FMODE_EXCL))) {
-+ retval = -EBUSY;
-+ goto out;
-+ }
-+
-+ if ((mode & FMODE_EXCL))
-+ drvdata->ref_count = -1;
-+ else
-+ drvdata->ref_count++;
-+
-+out:
-+ spin_unlock_irqrestore(&drvdata->lock, flags);
-+ return retval;
-+}
-+
-+static int aram_release(struct gendisk *disk, fmode_t mode)
-+{
-+ struct aram_drvdata *drvdata = disk->private_data;
-+ unsigned long flags;
-+
-+ spin_lock_irqsave(&drvdata->lock, flags);
-+ if (drvdata->ref_count > 0)
-+ drvdata->ref_count--;
-+ else
-+ drvdata->ref_count = 0;
-+ spin_unlock_irqrestore(&drvdata->lock, flags);
-+
-+ return 0;
-+}
-+
-+static int aram_getgeo(struct block_device *bdev, struct hd_geometry *geo)
-+{
-+ geo->cylinders = get_capacity(bdev->bd_disk) / (4 * 16);
-+ geo->heads = 4;
-+ geo->sectors = 16;
-+ return 0;
-+}
-+
-+static struct block_device_operations aram_fops = {
-+ .owner = THIS_MODULE,
-+ .open = aram_open,
-+ .release = aram_release,
-+ .getgeo = aram_getgeo,
-+};
-+
-+
-+/*
-+ * Setup routines.
-+ *
-+ */
-+
-+static int aram_init_blk_dev(struct aram_drvdata *drvdata)
-+{
-+ struct gendisk *disk;
-+ struct request_queue *queue;
-+ int retval;
-+
-+ drvdata->ref_count = 0;
-+
-+ retval = register_blkdev(ARAM_MAJOR, ARAM_NAME);
-+ if (retval)
-+ goto err_register_blkdev;
-+
-+ retval = -ENOMEM;
-+ spin_lock_init(&drvdata->lock);
-+ spin_lock_init(&drvdata->io_lock);
-+ queue = blk_init_queue(aram_do_request, &drvdata->lock);
-+ if (!queue)
-+ goto err_blk_init_queue;
-+
-+ blk_queue_hardsect_size(queue, ARAM_SECTOR_SIZE);
-+ blk_queue_dma_alignment(queue, ARAM_DMA_ALIGN);
-+ blk_queue_max_phys_segments(queue, 1);
-+ blk_queue_max_hw_segments(queue, 1);
-+ queue->queuedata = drvdata;
-+ drvdata->queue = queue;
-+
-+ disk = alloc_disk(1);
-+ if (!disk)
-+ goto err_alloc_disk;
-+
-+ disk->major = ARAM_MAJOR;
-+ disk->first_minor = 0;
-+ disk->fops = &aram_fops;
-+ strcpy(disk->disk_name, ARAM_NAME);
-+ disk->queue = drvdata->queue;
-+ set_capacity(disk, ARAM_BUFFERSIZE >> 9);
-+ disk->private_data = drvdata;
-+ drvdata->disk = disk;
-+
-+ add_disk(drvdata->disk);
-+
-+ retval = 0;
-+ goto out;
-+
-+err_alloc_disk:
-+ blk_cleanup_queue(drvdata->queue);
-+err_blk_init_queue:
-+ unregister_blkdev(ARAM_MAJOR, ARAM_NAME);
-+err_register_blkdev:
-+out:
-+ return retval;
-+}
-+
-+static void aram_exit_blk_dev(struct aram_drvdata *drvdata)
-+{
-+ if (drvdata->disk) {
-+ del_gendisk(drvdata->disk);
-+ put_disk(drvdata->disk);
-+ }
-+ if (drvdata->queue)
-+ blk_cleanup_queue(drvdata->queue);
-+ unregister_blkdev(ARAM_MAJOR, ARAM_NAME);
-+}
-+
-+static void aram_quiesce(struct aram_drvdata *drvdata)
-+{
-+ u16 __iomem *csr_reg = drvdata->io_base + DSP_CSR;
-+ u16 csr;
-+ unsigned long flags;
-+
-+ /*
-+ * Disable ARAM interrupts, but do not accidentally ack non-ARAM ones.
-+ */
-+ spin_lock_irqsave(&drvdata->io_lock, flags);
-+ csr = in_be16(csr_reg);
-+ csr &= ~(DSP_CSR_AIDINT | DSP_CSR_DSPINT | DSP_CSR_ARINTMASK);
-+ out_be16(csr_reg, csr);
-+ spin_unlock_irqrestore(&drvdata->io_lock, flags);
-+
-+ /* wait until pending transfers are finished */
-+ while (in_be16(csr_reg) & DSP_CSR_DSPDMA)
-+ cpu_relax();
-+}
-+
-+static int aram_init_irq(struct aram_drvdata *drvdata)
-+{
-+ u16 __iomem *csr_reg = drvdata->io_base + DSP_CSR;
-+ u16 csr;
-+ unsigned long flags;
-+ int retval;
-+
-+ retval = request_irq(drvdata->irq, aram_irq_handler,
-+ IRQF_DISABLED | IRQF_SHARED,
-+ DRV_MODULE_NAME, drvdata);
-+ if (retval) {
-+ drv_printk(KERN_ERR, "request of IRQ %d failed\n",
-+ drvdata->irq);
-+ goto out;
-+ }
-+
-+ /*
-+ * Enable ARAM interrupts, and route them to the processor.
-+ * Make sure to preserve the AI and DSP interrupts.
-+ */
-+ spin_lock_irqsave(&drvdata->io_lock, flags);
-+ csr = in_be16(csr_reg);
-+ csr |= (DSP_CSR_ARINT | DSP_CSR_ARINTMASK | DSP_CSR_PIINT);
-+ csr &= ~(DSP_CSR_AIDINT | DSP_CSR_DSPINT);
-+ out_be16(csr_reg, csr);
-+ spin_unlock_irqrestore(&drvdata->io_lock, flags);
-+
-+out:
-+ return retval;
-+}
-+
-+static void aram_exit_irq(struct aram_drvdata *drvdata)
-+{
-+ aram_quiesce(drvdata);
-+
-+ free_irq(drvdata->irq, drvdata);
-+}
-+
-+static int aram_init(struct aram_drvdata *drvdata,
-+ struct resource *mem, int irq)
-+{
-+ int retval;
-+
-+ drvdata->io_base = ioremap(mem->start, mem->end - mem->start + 1);
-+ drvdata->irq = irq;
-+
-+ retval = aram_init_blk_dev(drvdata);
-+ if (!retval) {
-+ retval = aram_init_irq(drvdata);
-+ if (retval)
-+ aram_exit_blk_dev(drvdata);
-+ }
-+ return retval;
-+}
-+
-+static void aram_exit(struct aram_drvdata *drvdata)
-+{
-+ aram_exit_blk_dev(drvdata);
-+ aram_exit_irq(drvdata);
-+ if (drvdata->io_base) {
-+ iounmap(drvdata->io_base);
-+ drvdata->io_base = NULL;
-+ }
-+}
-+
-+/*
-+ * Driver model helper routines.
-+ *
-+ */
-+
-+static int aram_do_probe(struct device *dev, struct resource *mem,
-+ int irq)
-+{
-+ struct aram_drvdata *drvdata;
-+ int retval;
-+
-+ drvdata = kzalloc(sizeof(*drvdata), GFP_KERNEL);
-+ if (!drvdata) {
-+ drv_printk(KERN_ERR, "failed to allocate aram_drvdata\n");
-+ return -ENOMEM;
-+ }
-+ dev_set_drvdata(dev, drvdata);
-+ drvdata->dev = dev;
-+
-+ retval = aram_init(drvdata, mem, irq);
-+ if (retval) {
-+ dev_set_drvdata(dev, NULL);
-+ kfree(drvdata);
-+ }
-+ return retval;
-+}
-+
-+static int aram_do_remove(struct device *dev)
-+{
-+ struct aram_drvdata *drvdata = dev_get_drvdata(dev);
-+
-+ if (drvdata) {
-+ aram_exit(drvdata);
-+ dev_set_drvdata(dev, NULL);
-+ kfree(drvdata);
-+ return 0;
-+ }
-+ return -ENODEV;
-+}
-+
-+static int aram_do_shutdown(struct device *dev)
-+{
-+ struct aram_drvdata *drvdata = dev_get_drvdata(dev);
-+
-+ if (drvdata)
-+ aram_quiesce(drvdata);
-+ return 0;
-+}
-+
-+
-+/*
-+ * OF platform device routines.
-+ *
-+ */
-+
-+static int __init aram_of_probe(struct of_device *odev,
-+ const struct of_device_id *match)
-+{
-+ struct resource res;
-+ int retval;
-+
-+ retval = of_address_to_resource(odev->node, 0, &res);
-+ if (retval) {
-+ drv_printk(KERN_ERR, "no io memory range found\n");
-+ return -ENODEV;
-+ }
-+
-+ return aram_do_probe(&odev->dev,
-+ &res, irq_of_parse_and_map(odev->node, 0));
-+}
-+
-+static int __exit aram_of_remove(struct of_device *odev)
-+{
-+ return aram_do_remove(&odev->dev);
-+}
-+
-+static int aram_of_shutdown(struct of_device *odev)
-+{
-+ return aram_do_shutdown(&odev->dev);
-+}
-+
-+
-+static struct of_device_id aram_of_match[] = {
-+ { .compatible = "nintendo,flipper-auxram" },
-+ { },
-+};
-+
-+
-+MODULE_DEVICE_TABLE(of, aram_of_match);
-+
-+static struct of_platform_driver aram_of_driver = {
-+ .owner = THIS_MODULE,
-+ .name = DRV_MODULE_NAME,
-+ .match_table = aram_of_match,
-+ .probe = aram_of_probe,
-+ .remove = aram_of_remove,
-+ .shutdown = aram_of_shutdown,
-+};
-+
-+/*
-+ * Module interfaces.
-+ *
-+ */
-+
-+static int __init aram_init_module(void)
-+{
-+ drv_printk(KERN_INFO, "%s - version %s\n", DRV_DESCRIPTION,
-+ aram_driver_version);
-+
-+ return of_register_platform_driver(&aram_of_driver);
-+}
-+
-+static void __exit aram_exit_module(void)
-+{
-+ of_unregister_platform_driver(&aram_of_driver);
-+}
-+
-+module_init(aram_init_module);
-+module_exit(aram_exit_module);
-+
-+MODULE_DESCRIPTION(DRV_DESCRIPTION);
-+MODULE_AUTHOR(DRV_AUTHOR);
-+MODULE_LICENSE("GPL");
-+
-diff --git a/drivers/block/gcn-di/Makefile b/drivers/block/gcn-di/Makefile
-new file mode 100644
-index 0000000..09a410d
---- /dev/null
-+++ b/drivers/block/gcn-di/Makefile
-@@ -0,0 +1,50 @@
-+obj-$(CONFIG_GAMECUBE_DI) += gcn-di.o
-+
-+$(obj)/gcn-di.o: $(obj)/drive_20010608.h \
-+ $(obj)/drive_20010831.h \
-+ $(obj)/drive_20020402.h \
-+ $(obj)/drive_20020823.h
-+
-+#CONFIG_GAMECUBE_DI_BUILD_FIRMWARE=y
-+
-+ifeq ($(CONFIG_GAMECUBE_DI_BUILD_FIRMWARE),y)
-+
-+ASMN102 = mn10200-linux-as
-+LDMN102 = mn10200-linux-ld
-+OCMN102 = mn10200-linux-objcopy
-+
-+quiet_cmd_build_difw = BLD FW $@
-+cmd_build_difw = \
-+ $(CPP) -DDRIVE_MODEL=$(DRIVE_MODEL) $< > $(obj)/$(@F).s; \
-+ $(ASMN102) -o $(obj)/$(@F).o $(obj)/$(@F).s; \
-+ $(LDMN102) --section-start absolute=0 -Ttext=0x40d000 \
-+ -o $(obj)/$(@F).elf -e 0x40d000 $(obj)/$(@F).o; \
-+ $(OCMN102) -I elf32-mn10200 -O binary $(obj)/$(@F).elf \
-+ $(obj)/$(@F).bin; \
-+ (echo -n "static "; cat $(obj)/$(@F).bin | scripts/bin2c "$(subst .h,,$(@F))_firmware") > $@; \
-+ rm -f $(obj)/$(@F).o $(obj)/$(@F).elf $(obj)/$(@F).bin $(obj)/$(@F).s
-+
-+
-+targets += drive_20010608.h
-+$(obj)/drive_20010608.h: DRIVE_MODEL := 0x20010608
-+$(obj)/drive_20010608.h: $(src)/drive_all.S FORCE
-+ $(call if_changed,build_difw)
-+
-+targets += drive_20010831.h
-+$(obj)/drive_20010831.h: DRIVE_MODEL := 0x20010831
-+$(obj)/drive_20010831.h: $(src)/drive_all.S FORCE
-+ $(call if_changed,build_difw)
-+
-+targets += drive_20020402.h
-+$(obj)/drive_20020402.h: DRIVE_MODEL := 0x20020402
-+$(obj)/drive_20020402.h: $(src)/drive_all.S FORCE
-+ $(call if_changed,build_difw)
-+
-+targets += drive_20020823.h
-+$(obj)/drive_20020823.h: DRIVE_MODEL := 0x20020823
-+$(obj)/drive_20020823.h: $(src)/drive_all.S FORCE
-+ $(call if_changed,build_difw)
-+
-+endif
-+
-+
-diff --git a/drivers/block/gcn-di/drive_20010608.h b/drivers/block/gcn-di/drive_20010608.h
-new file mode 100644
-index 0000000..7c3e9d8
---- /dev/null
-+++ b/drivers/block/gcn-di/drive_20010608.h
-@@ -0,0 +1,25 @@
-+static const char drive_20010608_firmware[] =
-+ "\xf7\x10\xff\xf7\xf4\x74\x25\xd0\x40\xf7\x20\x4c\x80\xf4\x74\x42"
-+ "\x9d\x08\xf7\x20\xd6\xfc\xf4\x74\x45\xb1\x08\xf7\x20\xd2\xfc\x80"
-+ "\x0c\xc4\xda\xfc\xfe\xc8\xda\xfc\xf5\x00\x01\xe9\x70\xc8\xda\xfc"
-+ "\xf5\x00\x02\xe9\x75\xf4\x74\x02\xed\x40\x80\x02\xf0\x20\xc8\x78"
-+ "\x80\xc0\x90\x81\xdc\xa8\x80\xf5\x30\x00\xf4\x44\x41\xd1\x40\xf8"
-+ "\xaa\x00\x10\xf4\xd0\x3c\xd1\x40\xf0\x01\xdc\xa8\x80\xf5\x30\x00"
-+ "\xf7\x48\xaa\x00\xe9\x07\xf4\xc4\x41\xd1\x40\x10\xfe\xf7\x48\xee"
-+ "\x00\xe8\x0c\xd8\x55\xe9\x25\xcc\xa9\x80\xfd\x79\x00\xea\x0c\xcc"
-+ "\xa9\x80\xc4\xa4\x81\xcc\xaa\x80\xc4\x88\x81\xdc\xa8\x80\xf8\xe0"
-+ "\x00\x10\xa0\xf5\x10\x01\xf5\x10\x02\xf5\x10\x03\xfe\xc8\xda\xfc"
-+ "\xf7\x00\xfe\xff\xf7\x31\xd2\xfc\xea\x0b\xc8\xda\xfc\xf7\x00\xfd"
-+ "\xff\xf7\x31\xd6\xfc\xc4\xda\xfc\xcc\x44\xfc\xf7\x00\xfe\xff\xc4"
-+ "\x44\xfc\xf4\x7d\x45\xb1\x08\xe9\x07\xf4\x75\x0c\xd1\x40\xea\x0c"
-+ "\xf4\x7d\x42\x9d\x08\xe9\x05\xf4\x75\x35\xd1\x40\xf2\x7c\xd0\x04"
-+ "\xcc\x5b\x80\xd8\x01\xe9\x02\x7c\x04\x51\x20\x71\x34\xf4\x7d\xb9"
-+ "\x85\x08\xe9\x13\x80\x00\x85\x00\xd8\x00\xe8\x02\x85\x0c\xc5\xda"
-+ "\xfc\xf4\x75\x40\xd1\x40\x14\xfe\x80\x01\xea\xea\xf7\x10\xff\xf7"
-+ "\xf4\xc9\x40\xd1\x40\xd9\x00\xe8\x17\x21\xf4\x79\x00\xf0\x00\xe9"
-+ "\x05\x80\x00\xf5\x10\x09\xd9\x06\xe9\x06\x61\x06\xd5\x06\x41\x06"
-+ "\xf4\xe0\x1b\xe0\xc7\xf4\xe0\x96\xcc\xc7\x00\x00\x74\x0a\x08\x00"
-+ "\x01\x00\x00\x00"
-+ ;
-+
-+const int drive_20010608_firmware_size = 324;
-diff --git a/drivers/block/gcn-di/drive_20010831.h b/drivers/block/gcn-di/drive_20010831.h
-new file mode 100644
-index 0000000..16df341
---- /dev/null
-+++ b/drivers/block/gcn-di/drive_20010831.h
-@@ -0,0 +1,25 @@
-+static const char drive_20010831_firmware[] =
-+ "\xf7\x10\xff\xf7\xf4\x74\x25\xd0\x40\xf7\x20\x4c\x80\xf4\x74\x39"
-+ "\x9e\x08\xf7\x20\xd6\xfc\xf4\x74\x02\xb3\x08\xf7\x20\xd2\xfc\x80"
-+ "\x0c\xc4\xda\xfc\xfe\xc8\xda\xfc\xf5\x00\x01\xe9\x70\xc8\xda\xfc"
-+ "\xf5\x00\x02\xe9\x75\xf4\x74\x02\xed\x40\x80\x02\xf0\x20\xc8\x78"
-+ "\x80\xc0\x92\x81\xdc\xaa\x80\xf5\x30\x00\xf4\x44\x41\xd1\x40\xf8"
-+ "\xaa\x00\x10\xf4\xd0\x3c\xd1\x40\xf0\x01\xdc\xaa\x80\xf5\x30\x00"
-+ "\xf7\x48\xaa\x00\xe9\x07\xf4\xc4\x41\xd1\x40\x10\xfe\xf7\x48\xee"
-+ "\x00\xe8\x0c\xd8\x55\xe9\x25\xcc\xab\x80\xfd\x79\x00\xea\x0c\xcc"
-+ "\xab\x80\xc4\xa6\x81\xcc\xac\x80\xc4\x8a\x81\xdc\xaa\x80\xf8\xe0"
-+ "\x00\x10\xa0\xf5\x10\x01\xf5\x10\x02\xf5\x10\x03\xfe\xc8\xda\xfc"
-+ "\xf7\x00\xfe\xff\xf7\x31\xd2\xfc\xea\x0b\xc8\xda\xfc\xf7\x00\xfd"
-+ "\xff\xf7\x31\xd6\xfc\xc4\xda\xfc\xcc\x44\xfc\xf7\x00\xfe\xff\xc4"
-+ "\x44\xfc\xf4\x7d\x02\xb3\x08\xe9\x07\xf4\x75\x0c\xd1\x40\xea\x0c"
-+ "\xf4\x7d\x39\x9e\x08\xe9\x05\xf4\x75\x35\xd1\x40\xf2\x7c\xd0\x04"
-+ "\xcc\x5b\x80\xd8\x01\xe9\x02\x7c\x04\x51\x20\x71\x34\xf4\x7d\x7f"
-+ "\x86\x08\xe9\x13\x80\x00\x85\x00\xd8\x00\xe8\x02\x85\x0c\xc5\xda"
-+ "\xfc\xf4\x75\x40\xd1\x40\x14\xfe\x80\x01\xea\xea\xf7\x10\xff\xf7"
-+ "\xf4\xc9\x40\xd1\x40\xd9\x00\xe8\x17\x21\xf4\x79\x00\xf0\x00\xe9"
-+ "\x05\x80\x00\xf5\x10\x09\xd9\x06\xe9\x06\x61\x06\xd5\x06\x41\x06"
-+ "\xf4\xe0\xd8\xe1\xc7\xf4\xe0\x4a\xce\xc7\x00\x00\xa4\x0a\x08\x00"
-+ "\x01\x00\x00\x00"
-+ ;
-+
-+const int drive_20010831_firmware_size = 324;
-diff --git a/drivers/block/gcn-di/drive_20020402.h b/drivers/block/gcn-di/drive_20020402.h
-new file mode 100644
-index 0000000..dc80971
---- /dev/null
-+++ b/drivers/block/gcn-di/drive_20020402.h
-@@ -0,0 +1,25 @@
-+static const char drive_20020402_firmware[] =
-+ "\xf7\x10\xff\xf7\xf4\x74\x25\xd0\x40\xf7\x20\x4c\x80\xf4\x74\xd6"
-+ "\x9c\x08\xf7\x20\xd6\xfc\xf4\x74\x28\xae\x08\xf7\x20\xd2\xfc\x80"
-+ "\x0c\xc4\xda\xfc\xfe\xc8\xda\xfc\xf5\x00\x01\xe9\x70\xc8\xda\xfc"
-+ "\xf5\x00\x02\xe9\x75\xf4\x74\xf9\xec\x40\x80\x02\xf0\x20\xc8\x84"
-+ "\x80\xc0\x9c\x81\xdc\xb4\x80\xf5\x30\x00\xf4\x44\x41\xd1\x40\xf8"
-+ "\xaa\x00\x10\xf4\xd0\x3c\xd1\x40\xf0\x01\xdc\xb4\x80\xf5\x30\x00"
-+ "\xf7\x48\xaa\x00\xe9\x07\xf4\xc4\x41\xd1\x40\x10\xfe\xf7\x48\xee"
-+ "\x00\xe8\x0c\xd8\x55\xe9\x25\xcc\xb5\x80\xfd\x79\x00\xea\x0c\xcc"
-+ "\xb5\x80\xc4\xb0\x81\xcc\xb6\x80\xc4\x94\x81\xdc\xb4\x80\xf8\xe0"
-+ "\x00\x10\xa0\xf5\x10\x01\xf5\x10\x02\xf5\x10\x03\xfe\xc8\xda\xfc"
-+ "\xf7\x00\xfe\xff\xf7\x31\xd2\xfc\xea\x0b\xc8\xda\xfc\xf7\x00\xfd"
-+ "\xff\xf7\x31\xd6\xfc\xc4\xda\xfc\xcc\x44\xfc\xf7\x00\xfe\xff\xc4"
-+ "\x44\xfc\xf4\x7d\x28\xae\x08\xe9\x07\xf4\x75\x0c\xd1\x40\xea\x0c"
-+ "\xf4\x7d\xd6\x9c\x08\xe9\x05\xf4\x75\x35\xd1\x40\xf2\x7c\xd0\x04"
-+ "\xcc\x5b\x80\xd8\x01\xe9\x02\x7c\x04\x51\x20\x71\x34\xf4\x7d\xc1"
-+ "\x85\x08\xe9\x13\x80\x00\x85\x00\xd8\x00\xe8\x02\x85\x0c\xc5\xda"
-+ "\xfc\xf4\x75\x40\xd1\x40\x14\xfe\x80\x01\xea\xea\xf7\x10\xff\xf7"
-+ "\xf4\xc9\x40\xd1\x40\xd9\x00\xe8\x17\x21\xf4\x79\x00\xf0\x00\xe9"
-+ "\x05\x80\x00\xf5\x10\x09\xd9\x06\xe9\x06\x61\x06\xd5\x06\x41\x06"
-+ "\xf4\xe0\xfe\xdc\xc7\xf4\xe0\x14\xcc\xc7\x00\x00\x74\x0a\x08\x00"
-+ "\x01\x00\x00\x00"
-+ ;
-+
-+const int drive_20020402_firmware_size = 324;
-diff --git a/drivers/block/gcn-di/drive_20020823.h b/drivers/block/gcn-di/drive_20020823.h
-new file mode 100644
-index 0000000..f20b5cc
---- /dev/null
-+++ b/drivers/block/gcn-di/drive_20020823.h
-@@ -0,0 +1,25 @@
-+static const char drive_20020823_firmware[] =
-+ "\xf7\x10\xff\xf7\xf4\x74\x25\xd0\x40\xf7\x20\x4c\x80\xf4\x74\x32"
-+ "\x9d\x08\xf7\x20\xd6\xfc\xf4\x74\x75\xae\x08\xf7\x20\xd2\xfc\x80"
-+ "\x0c\xc4\xda\xfc\xfe\xc8\xda\xfc\xf5\x00\x01\xe9\x70\xc8\xda\xfc"
-+ "\xf5\x00\x02\xe9\x75\xf4\x74\xf5\xec\x40\x80\x02\xf0\x20\xc8\x80"
-+ "\x80\xc0\x98\x81\xdc\xb0\x80\xf5\x30\x00\xf4\x44\x41\xd1\x40\xf8"
-+ "\xaa\x00\x10\xf4\xd0\x3c\xd1\x40\xf0\x01\xdc\xb0\x80\xf5\x30\x00"
-+ "\xf7\x48\xaa\x00\xe9\x07\xf4\xc4\x41\xd1\x40\x10\xfe\xf7\x48\xee"
-+ "\x00\xe8\x0c\xd8\x55\xe9\x25\xcc\xb1\x80\xfd\x79\x00\xea\x0c\xcc"
-+ "\xb1\x80\xc4\xac\x81\xcc\xb2\x80\xc4\x90\x81\xdc\xb0\x80\xf8\xe0"
-+ "\x00\x10\xa0\xf5\x10\x01\xf5\x10\x02\xf5\x10\x03\xfe\xc8\xda\xfc"
-+ "\xf7\x00\xfe\xff\xf7\x31\xd2\xfc\xea\x0b\xc8\xda\xfc\xf7\x00\xfd"
-+ "\xff\xf7\x31\xd6\xfc\xc4\xda\xfc\xcc\x44\xfc\xf7\x00\xfe\xff\xc4"
-+ "\x44\xfc\xf4\x7d\x75\xae\x08\xe9\x07\xf4\x75\x0c\xd1\x40\xea\x0c"
-+ "\xf4\x7d\x32\x9d\x08\xe9\x05\xf4\x75\x35\xd1\x40\xf2\x7c\xd0\x04"
-+ "\xcc\x5b\x80\xd8\x01\xe9\x02\x7c\x04\x51\x20\x71\x34\xf4\x7d\xc1"
-+ "\x85\x08\xe9\x13\x80\x00\x85\x00\xd8\x00\xe8\x02\x85\x0c\xc5\xda"
-+ "\xfc\xf4\x75\x40\xd1\x40\x14\xfe\x80\x01\xea\xea\xf7\x10\xff\xf7"
-+ "\xf4\xc9\x40\xd1\x40\xd9\x00\xe8\x17\x21\xf4\x79\x00\xf0\x00\xe9"
-+ "\x05\x80\x00\xf5\x10\x09\xd9\x06\xe9\x06\x61\x06\xd5\x06\x41\x06"
-+ "\xf4\xe0\x4b\xdd\xc7\xf4\xe0\x6d\xcc\xc7\x00\x00\x74\x0a\x08\x00"
-+ "\x01\x00\x00\x00"
-+ ;
-+
-+const int drive_20020823_firmware_size = 324;
-diff --git a/drivers/block/gcn-di/drive_all.S b/drivers/block/gcn-di/drive_all.S
-new file mode 100644
-index 0000000..e9d91a0
---- /dev/null
-+++ b/drivers/block/gcn-di/drive_all.S
-@@ -0,0 +1,415 @@
-+/*
-+ * DVD+/-R compatible "cactus" firmware extensions
-+ * Copyright (C) 2005-2009 The GameCube Linux Team
-+ * Copyright (C) 2005,2006,2009 Albert Herranz
-+ *
-+ * Originally based on analysis of Cobra 1.0 drive code released by tmbinc
-+ * on dextrose.com.
-+ *
-+ * This program is free software; you can redistribute it and/or
-+ * modify it under the terms of the GNU General Public License
-+ * as published by the Free Software Foundation; either version 2
-+ * of the License, or (at your option) any later version.
-+ *
-+ */
-+
-+/*
-+ * This code is compatible with binutils 2.15 limited mn10200 support.
-+ * And it intentionally lacks the audio fix and DRE recovery features.
-+ *
-+ */
-+
-+
-+.equ UNICR, 0xfc44
-+.equ UNID, (1<<0)
-+.equ ADB0, 0xfcd2
-+.equ ADB1, 0xfcd6
-+.equ ADBCTL, 0xfcda
-+.equ ADB0CK, (1<<0)
-+.equ ADB1CK, (1<<1)
-+.equ ADB0ON, (1<<2)
-+.equ ADB1ON, (1<<3)
-+
-+
-+.equ irq_handler_vector, 0x804c /* 04, 06, 08, Panasonic Q */
-+.equ irq_depth, 0x805b /* 04, 06, 08, Panasonic Q */
-+
-+.equ fake_command, 0xaa
-+.equ set_drive_status_command, 0xee /* same as in gcn-di.c */
-+.equ enable_extensions_command, 0x55 /* same as in gcn-di.c */
-+
-+.equ get_drive_status_command, 0xe0
-+
-+
-+#if DRIVE_MODEL == 0x20020402 /* 04 */
-+
-+ .equ cmdbuf0, 0x80b4
-+ .equ drive_status, 0x81b0
-+ .equ drive_status2, 0x8194
-+
-+ .equ bert, 0x8084
-+ .equ ernie, 0x819c
-+ .equ cactus, 0x40ecf9
-+
-+ .section absolute
-+
-+ .equ adb1_break_address, 0x089cd6
-+ .org 0x089d4e
-+ adb1_fixup_exit:
-+
-+ .equ adb0_break_address, 0x08ae28
-+ .org 0x08ae33
-+ adb0_fixup_exit:
-+
-+ .equ disable_extensions_when_called_from, 0x0885c1 /* 04, 08 */
-+
-+#elif DRIVE_MODEL == 0x20010608 /* 06 */
-+
-+ .equ cmdbuf0, 0x80a8
-+ .equ drive_status, 0x81a4
-+ .equ drive_status2, 0x8188
-+
-+ .equ bert, 0x8078
-+ .equ ernie, 0x8190
-+ .equ cactus, 0x40ed02
-+
-+ .section absolute
-+
-+ .equ adb1_break_address, 0x089d42
-+ .org 0x089dd0
-+ adb1_fixup_exit:
-+
-+ .equ adb0_break_address, 0x08b145
-+ .org 0x08b150
-+ adb0_fixup_exit:
-+
-+ .equ disable_extensions_when_called_from, 0x0885b9
-+
-+#elif DRIVE_MODEL == 0x20020823 /* 08 */
-+
-+ .equ cmdbuf0, 0x80b0
-+ .equ drive_status, 0x81ac
-+ .equ drive_status2, 0x8190
-+
-+ .equ bert, 0x8080
-+ .equ ernie, 0x8198
-+ .equ cactus, 0x40ecf5
-+
-+ .section absolute
-+
-+ .equ adb1_break_address, 0x089d32
-+ .org 0x089da7
-+ adb1_fixup_exit:
-+
-+ .equ adb0_break_address, 0x08ae75
-+ .org 0x08ae80
-+ adb0_fixup_exit:
-+
-+ .equ disable_extensions_when_called_from, 0x0885c1 /* 04, 08 */
-+
-+#elif DRIVE_MODEL == 0x20010831 /* Panasonic Q */
-+
-+ .equ cmdbuf0, 0x80aa
-+ .equ drive_status, 0x81a6
-+ .equ drive_status2, 0x818a
-+
-+ .equ bert, 0x8078
-+ .equ ernie, 0x8192
-+ .equ cactus, 0x40ed02
-+
-+ .section absolute
-+
-+ .equ adb1_break_address, 0x089e39
-+ .org 0x089f84
-+ adb1_fixup_exit:
-+
-+ .equ adb0_break_address, 0x08b302
-+ .org 0x08b30d
-+ adb0_fixup_exit:
-+
-+ .equ disable_extensions_when_called_from, 0x08867f
-+
-+#else
-+ #error Sorry, unsupported drive.
-+#endif
-+
-+
-+ .section .text
-+ .global _start
-+ .global _exit
-+
-+/*
-+ * We are launched now through the 'func' debug command.
-+ */
-+_start:
-+_main:
-+ /* disable interrupts, do not disturb */
-+ and 0xf7ff, psw
-+
-+ /* replace the current irq handler with ours */
-+ mov our_irq_handler, a0
-+ mov a0, (irq_handler_vector)
-+
-+ /* setup our extending functions ... */
-+ mov adb1_break_address, a0
-+ mov a0, (ADB1)
-+ mov adb0_break_address, a0
-+ mov a0, (ADB0)
-+
-+ /* ... and enable them */
-+ mov ADB1ON|ADB0ON, d0
-+ movb d0, (ADBCTL)
-+
-+ rts
-+
-+
-+our_irq_handler:
-+ /* check for Address Break 0 */
-+ mov (ADBCTL), d0
-+ and ADB0CK, d0
-+ bne adb0_break_handler
-+
-+ /* check for Address Break 1 */
-+ mov (ADBCTL), d0
-+ and ADB1CK, d0
-+ bne adb1_break_handler
-+
-+ /* XXX not sure about this one... */
-+// mov 0x0c, d0
-+// movb d0, (0x819a)
-+
-+ /* tell the drive to please accept the disk */
-+ mov cactus, a0
-+ mov 2, d0
-+ bset d0, (a0)
-+
-+ /* this seems to avoid errors if the drive idles for too long */
-+ mov (bert), d0
-+ mov d0, (ernie)
-+
-+ /* save current command ... */
-+ mov cmdbuf0, a0
-+ movbu (0, a0), d0
-+ movb d0, (saved_cmdbuf0)
-+
-+ /* ... and place a temporary fake command, to detect new commands */
-+ mov fake_command, d0
-+ movb d0, (a0)
-+
-+ /* call the original handler */
-+ mov (saved_irq_handler), a0
-+ jsr (a0)
-+
-+ /* if our fake command changed, we assume a new command has arrived */
-+ mov cmdbuf0, a0
-+ movbu (0, a0), d0
-+ cmp fake_command, d0
-+ bne extra_command_parser
-+
-+ /* if there is no new command, restore the previously saved command */
-+ movb (saved_cmdbuf0), d0
-+ movb d0, (a0)
-+
-+ rts
-+
-+
-+extra_command_parser:
-+ /* "set drive status" command */
-+ cmp set_drive_status_command, d0
-+ beq set_drive_status
-+
-+ /* "enable extensions" command */
-+ cmp enable_extensions_command, d0
-+ bne done
-+
-+enable_or_disable_extensions:
-+ /* 0x55, 0xZZ, 0x00, 0x00 */
-+ /* ZZ=0 disable, otherwise enable */
-+ movbu (cmdbuf0+1), d0
-+ jsr di_enable_or_disable_extensions
-+ jmp get_drive_status
-+
-+set_drive_status:
-+ /* 0xee, 0xZZ, 0xYY, 0x00 */
-+ /* ZZ=drive_status, YY=drive_status2 */
-+ movbu (cmdbuf0+1), d0
-+ movb d0, (drive_status)
-+ movbu (cmdbuf0+2), d0
-+ movb d0, (drive_status2)
-+
-+
-+get_drive_status:
-+ /*
-+ * This saves us an invalid command error and updates the status
-+ * accordingly. In fact, our extended command becomes a "get status"
-+ * command.
-+ */
-+ mov cmdbuf0, a0
-+ mov get_drive_status_command, d0
-+ movb d0, (a0)
-+ sub d0, d0
-+ movb d0, (1,a0)
-+ movb d0, (2,a0)
-+ movb d0, (3,a0)
-+
-+done:
-+ rts
-+
-+
-+/*
-+ * This is how the stacks look like when our interrupt handler is called.
-+ *
-+ * Our interrupt handler is in fact not the real interrupt handler, but
-+ * just a subroutine called by the real interrupt handler.
-+ * That's why we just RTS and not RTI from our interrupt handler.
-+ *
-+ * | | | |
-+ * 00| d0 0| <- old a3 | |
-+ * 02| 8| | |
-+ * 04| d1 6| | |
-+ * 06| 4| | |
-+ * 08| d2 2| | |
-+ * 0a| 0| | |
-+ * 0c| d3 8| | |
-+ * 0e| 6| | |
-+ * 10| a0 4| | |
-+ * 12| 2| | |
-+ * 14| a1 0| | |
-+ * 16| 8| | |
-+ * 18| a2 6| | |
-+ * 1a| 4| | |
-+ * 1c| MDR 2| | |
-+ * 1e| PSW | | |
-+ * 20| PC lo | | PC lo | <- a3
-+ * 22| PC hi | | PC hi |
-+ * : : | old a3 |
-+ * | ... | | |
-+ * +--------+ +--------+ <- (0x8ea1c) for drive 04
-+ * normal context stack interrupt context stack
-+ *
-+ */
-+
-+adb0_break_handler:
-+ mov (ADBCTL), d0
-+ and ~ADB0CK, d0
-+ mov (ADB0), a1
-+ jmp address_break_handler
-+
-+adb1_break_handler:
-+ mov (ADBCTL), d0
-+ and ~ADB1CK, d0
-+ mov (ADB1), a1
-+
-+address_break_handler:
-+ /* ack the interrupt */
-+ movb d0, (ADBCTL)
-+ movbu (UNICR), d0
-+ and ~UNID, d0
-+ movb d0, (UNICR)
-+
-+ cmp adb0_break_address, a1
-+ bne 1f
-+ mov adb0_fixup, a1
-+ jmp 2f
-+
-+1:
-+ cmp adb1_break_address, a1
-+ bne 2f
-+ mov adb1_fixup, a1
-+
-+2:
-+ /* point to the previous stack pointer */
-+ mov a3, a0
-+ add 4, a0
-+
-+ /*
-+ * Special case. When entering interrupt context the first time,
-+ * the old stack is pushed in the interrupt stack before calling us.
-+ */
-+ movbu (irq_depth), d0
-+ cmp 1, d0
-+ bne 1f
-+ mov (4, a3), a0 /* get the old stack pointer */
-+1:
-+ /* overwrite the original return address (look at the stack layout) */
-+ mov a1, (0x20, a0)
-+
-+ /*
-+ * We disable the extensions when an original disc is found.
-+ *
-+ * We do that by checking if we were called from a piece of
-+ * code reached only when original discs are inserted. Tricky.
-+ */
-+
-+ /* 0x20 + 0x10 + 0x04 = 0x34 */
-+ mov (0x34, a0), a1
-+ cmp disable_extensions_when_called_from, a1
-+ bne 9f /* else, do nothing */
-+
-+di_disable_extensions:
-+ mov 0, d0
-+
-+di_enable_or_disable_extensions:
-+ /* enable additional media if extensions are enabled */
-+ mov 0, d1
-+ cmp 0, d0
-+ beq 1f
-+ mov ADB0ON|ADB1ON, d1
-+1:
-+ movb d1, (ADBCTL)
-+
-+ mov enable_extensions, a1
-+ movb d0, (a1)
-+
-+9:
-+ rts
-+
-+di_enable_extensions:
-+ mov 1, d0
-+ jmp di_enable_or_disable_extensions
-+
-+
-+adb0_fixup:
-+ /* disable interrupts, XXX really needed here...? */
-+ and 0xf7ff, psw
-+
-+ /* check if we need to tweak things or not */
-+ movbu (enable_extensions), d1
-+ cmp 0, d1
-+ beq 1f
-+
-+ /* deal with the dvd seed */
-+ mov (a0), d1
-+ cmp 0x00f000, d1 /* controller setup */
-+ bne 2f
-+ mov 0x00, d0 /* seed 0x00 for normal DVD */
-+ movb d0, (0x09, a0)
-+2:
-+ /* skip the extra field */
-+ cmp 0x06, d1 /* transfer sector buffer */
-+ bne 1f
-+ mov (0x06, a0), d1
-+ add 6, d1 /* skip it */
-+ mov d1, (0x06, a0)
-+1:
-+ jmp adb0_fixup_exit
-+
-+
-+adb1_fixup:
-+ jmp adb1_fixup_exit
-+
-+
-+.align 2
-+saved_irq_handler:
-+#if DRIVE_MODEL != 0x20010831
-+ .long 0x00080A74 /* 04, 06, 08 */
-+#else
-+ .long 0x00080AA4 /* Panasonic Q */
-+#endif
-+enable_extensions:
-+ .byte 0x01
-+saved_cmdbuf0:
-+ .byte 0x00
-+
-+_exit:
-+
-diff --git a/drivers/block/gcn-di/gcn-di.c b/drivers/block/gcn-di/gcn-di.c
-new file mode 100644
-index 0000000..9f6564f
---- /dev/null
-+++ b/drivers/block/gcn-di/gcn-di.c
-@@ -0,0 +1,2363 @@
-+/*
-+ * drivers/block/gcn-di/gcn-di.c
-+ *
-+ * Nintendo GameCube Disk Interface (DI) driver
-+ * Copyright (C) 2005-2009 The GameCube Linux Team
-+ * Copyright (C) 2005,2006,2007,2009 Albert Herranz
-+ *
-+ * Portions based on previous work by Scream|CT.
-+ *
-+ * This program is free software; you can redistribute it and/or
-+ * modify it under the terms of the 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/blkdev.h>
-+#include <linux/cdrom.h>
-+#include <linux/delay.h>
-+#include <linux/dma-mapping.h>
-+#include <linux/fcntl.h>
-+#include <linux/hdreg.h>
-+#include <linux/init.h>
-+#include <linux/interrupt.h>
-+#include <linux/kernel.h>
-+#include <linux/module.h>
-+#include <linux/of_platform.h>
-+#include <linux/proc_fs.h>
-+#include <linux/seq_file.h>
-+#include <linux/timer.h>
-+#include <linux/io.h>
-+
-+#define DI_DEBUG
-+
-+#define DRV_MODULE_NAME "gcn-di"
-+#define DRV_DESCRIPTION "Nintendo GameCube Disk Interface (DI) driver"
-+#define DRV_AUTHOR "Albert Herranz"
-+
-+static char di_driver_version[] = "1.0i";
-+
-+#define drv_printk(level, format, arg...) \
-+ printk(level DRV_MODULE_NAME ": " format , ## arg)
-+
-+#ifdef DI_DEBUG
-+# define DBG(fmt, args...) \
-+ printk(KERN_ERR "%s: " fmt, __func__ , ## args)
-+#else
-+# define DBG(fmt, args...)
-+#endif
-+
-+
-+/*
-+ * Hardware.
-+ */
-+#define DI_DMA_ALIGN 0x1f /* 32 bytes */
-+
-+/* DI Status Register */
-+#define DI_SR 0x00
-+#define DI_SR_BRK (1<<0)
-+#define DI_SR_DEINTMASK (1<<1)
-+#define DI_SR_DEINT (1<<2)
-+#define DI_SR_TCINTMASK (1<<3)
-+#define DI_SR_TCINT (1<<4)
-+#define DI_SR_BRKINTMASK (1<<5)
-+#define DI_SR_BRKINT (1<<6)
-+
-+/* DI Cover Register */
-+#define DI_CVR 0x04
-+#define DI_CVR_CVR (1<<0)
-+#define DI_CVR_CVRINTMASK (1<<1)
-+#define DI_CVR_CVRINT (1<<2)
-+
-+/* DI Command Buffers */
-+#define DI_CMDBUF0 0x08
-+#define DI_CMDBUF1 0x0c
-+#define DI_CMDBUF2 0x10
-+
-+/* DI DMA Memory Address Register */
-+#define DI_MAR 0x14
-+
-+/* DI DMA Transfer Length Register */
-+#define DI_LENGTH 0x18
-+
-+/* DI Control Register */
-+#define DI_CR 0x1c
-+#define DI_CR_TSTART (1<<0)
-+#define DI_CR_DMA (1<<1)
-+#define DI_CR_RW (1<<2)
-+
-+/* DI Immediate Data Buffer */
-+#define DI_DATA 0x20
-+
-+/* DI Configuration Register */
-+#define DI_CFG 0x24
-+
-+
-+/* drive status, status */
-+#define DI_STATUS(s) ((u8)((s)>>24))
-+
-+#define DI_STATUS_READY 0x00
-+#define DI_STATUS_COVER_OPENED 0x01
-+#define DI_STATUS_DISK_CHANGE 0x02
-+#define DI_STATUS_NO_DISK 0x03
-+#define DI_STATUS_MOTOR_STOP 0x04
-+#define DI_STATUS_DISK_ID_NOT_READ 0x05
-+
-+/* drive status, error */
-+#define DI_ERROR(s) ((u32)((s)&0x00ffffff))
-+
-+#define DI_ERROR_NO_ERROR 0x000000
-+#define DI_ERROR_MOTOR_STOPPED 0x020400
-+#define DI_ERROR_DISK_ID_NOT_READ 0x020401
-+#define DI_ERROR_MEDIUM_NOT_PRESENT 0x023a00
-+#define DI_ERROR_SEEK_INCOMPLETE 0x030200
-+#define DI_ERROR_UNRECOVERABLE_READ 0x031100
-+#define DI_ERROR_INVALID_COMMAND 0x052000
-+#define DI_ERROR_BLOCK_OUT_OF_RANGE 0x052100
-+#define DI_ERROR_INVALID_FIELD 0x052400
-+#define DI_ERROR_MEDIUM_CHANGED 0x062800
-+
-+#define di_may_retry(s) ((DI_STATUS(s) == DI_STATUS_READY || \
-+ DI_STATUS(s) == DI_STATUS_DISK_ID_NOT_READ) \
-+ && \
-+ (DI_ERROR(s) != DI_ERROR_SEEK_INCOMPLETE))
-+
-+/* DI Sector Size */
-+#define DI_SECTOR_SHIFT 11
-+#define DI_SECTOR_SIZE (1 << DI_SECTOR_SHIFT) /*2048*/
-+#define DI_MAX_SECTORS 712880
-+
-+
-+/* Driver Settings */
-+#define DI_NAME DRV_MODULE_NAME
-+#define DI_MAJOR 60
-+
-+#define DI_COMMAND_TIMEOUT 20 /* seconds */
-+#define DI_COMMAND_RETRIES 10 /* times */
-+
-+#define DI_MOTOR_OFF_TIMEOUT 10
-+
-+#define KERNEL_SECTOR_SHIFT 9
-+#define KERNEL_SECTOR_SIZE (1 << KERNEL_SECTOR_SHIFT) /*512*/
-+
-+
-+/*
-+ * Drive Information.
-+ */
-+struct di_drive_info {
-+ u16 rev;
-+ u16 code;
-+ u32 date;
-+ u8 pad[0x18];
-+};
-+
-+/*
-+ * Disk ID.
-+ */
-+struct di_disk_id {
-+ u8 id[32];
-+};
-+
-+/*
-+ * An operation code.
-+ */
-+struct di_opcode {
-+ u16 op;
-+#define DI_OP(id, flags) (((u8)(id)<<8)|((u8)(flags)))
-+#define DI_OP_ID(op) ((u8)((op)>>8))
-+#define DI_OP_FLAGS(op) ((u8)(op))
-+
-+#define DI_DIR_READ 0x00
-+#define DI_DIR_WRITE DI_CR_RW
-+#define DI_MODE_IMMED 0x00
-+#define DI_MODE_DMA DI_CR_DMA
-+#define DI_IGNORE_ERRORS (1<<7)
-+
-+ char *name;
-+
-+ u32 cmdbuf0;
-+};
-+
-+/*
-+ * Drive code container.
-+ */
-+struct di_drive_code {
-+ u32 address;
-+ size_t len;
-+ void *code;
-+};
-+
-+struct di_device;
-+
-+/*
-+ * A Disk Interface command.
-+ */
-+struct di_command {
-+ u16 opidx;
-+
-+ u32 cmdbuf0;
-+ u32 cmdbuf1;
-+ u32 cmdbuf2;
-+
-+ void *data;
-+ size_t len;
-+
-+ dma_addr_t dma_addr;
-+ size_t dma_len;
-+
-+ void *done_data;
-+ void (*done)(struct di_command *cmd);
-+
-+ u16 retries;
-+ u16 max_retries;
-+
-+ u32 result;
-+
-+ struct di_device *ddev;
-+};
-+
-+#define di_result_ok(result) ((result) == DI_SR_TCINT)
-+#define di_command_ok(cmd) (di_result_ok((cmd)->result))
-+
-+enum {
-+ __DI_INTEROPERABLE = 0,
-+ __DI_MEDIA_CHANGED,
-+ __DI_START_QUEUE,
-+ __DI_RESETTING,
-+ __DI_AVOID_DEBUG,
-+};
-+
-+/*
-+ * The Disk Interface device.
-+ */
-+struct di_device {
-+ spinlock_t lock;
-+
-+ int irq;
-+
-+ spinlock_t io_lock;
-+ void __iomem *io_base;
-+
-+ struct di_command *cmd;
-+ struct di_command *failed_cmd;
-+
-+ struct di_command status;
-+ u32 drive_status;
-+
-+ struct gendisk *disk;
-+ struct request_queue *queue;
-+ spinlock_t queue_lock;
-+
-+ struct request *req;
-+ struct di_command req_cmd;
-+
-+ struct di_drive_code *drive_code;
-+
-+ u32 model;
-+ unsigned long flags;
-+#define DI_INTEROPERABLE (1<<__DI_INTEROPERABLE)
-+#define DI_MEDIA_CHANGED (1<<__DI_MEDIA_CHANGED)
-+#define DI_START_QUEUE (1<<__DI_START_QUEUE)
-+#define DI_RESETTING (1<<__DI_RESETTING)
-+#define DI_AVOID_DEBUG (1<<__DI_AVOID_DEBUG)
-+
-+ unsigned long nr_sectors;
-+
-+ struct timer_list motor_off_timer;
-+
-+#ifdef CONFIG_PROC_FS
-+ struct proc_dir_entry *proc;
-+#endif /* CONFIG_PROC_FS */
-+
-+ int ref_count;
-+
-+ struct device *dev;
-+};
-+
-+
-+static struct di_drive_info di_drive_info
-+ __attribute__ ((aligned(DI_DMA_ALIGN+1)));
-+
-+/*
-+ * We do not accept original media with this driver, as there is currently no
-+ * general need for that.
-+ * If you ever develop an application (a media player for example) which works
-+ * with original media, just change di_accept_gods and recompile.
-+ */
-+static const int di_accept_gods;
-+
-+/*
-+ * Drive firmware extensions.
-+ *
-+ */
-+
-+#define DI_DRIVE_CODE_BASE 0x40d000
-+#define DI_DRIVE_IRQ_VECTOR 0x00804c
-+
-+/*
-+ * Drive 04 (20020402) firmware extensions.
-+ */
-+
-+#include "drive_20020402.h"
-+
-+static struct di_drive_code drive_20020402 = {
-+ .address = DI_DRIVE_CODE_BASE,
-+ .len = sizeof(drive_20020402_firmware),
-+ .code = (u8 *)drive_20020402_firmware,
-+};
-+
-+/*
-+ * Drive 06 (20010608) firmware extensions.
-+ */
-+
-+#include "drive_20010608.h"
-+
-+static struct di_drive_code drive_20010608 = {
-+ .address = DI_DRIVE_CODE_BASE,
-+ .len = sizeof(drive_20010608_firmware),
-+ .code = (u8 *)drive_20010608_firmware,
-+};
-+
-+/*
-+ * Drive 08 (20020823) firmware extensions.
-+ */
-+
-+#include "drive_20020823.h"
-+
-+static struct di_drive_code drive_20020823 = {
-+ .address = DI_DRIVE_CODE_BASE,
-+ .len = sizeof(drive_20020823_firmware),
-+ .code = (u8 *)drive_20020823_firmware,
-+};
-+
-+/*
-+ * Panasonic Q (20010831) firmware extensions.
-+ */
-+
-+#include "drive_20010831.h"
-+
-+static struct di_drive_code drive_20010831 = {
-+ .address = DI_DRIVE_CODE_BASE,
-+ .len = sizeof(drive_20010831_firmware),
-+ .code = (u8 *)drive_20010831_firmware,
-+};
-+
-+
-+/*
-+ * Drive operations table, incomplete.
-+ * We just include here some of the available functions, in no particular
-+ * order.
-+ */
-+#define CMDBUF(a, b, c, d) (((a)<<24)|((b)<<16)|((c)<<8)|(d))
-+
-+static struct di_opcode di_opcodes[] = {
-+
-+#define DI_OP_NOP 0
-+ [DI_OP_NOP] = {
-+ .op = DI_OP(DI_OP_NOP, 0),
-+ .name = "NOP",
-+ .cmdbuf0 = 0,
-+ },
-+
-+#define DI_OP_INQ (DI_OP_NOP+1)
-+ [DI_OP_INQ] = {
-+ .op = DI_OP(DI_OP_INQ, DI_DIR_READ | DI_MODE_DMA),
-+ .name = "INQ",
-+ .cmdbuf0 = 0x12000000,
-+ },
-+
-+#define DI_OP_STOPMOTOR (DI_OP_INQ+1)
-+ [DI_OP_STOPMOTOR] = {
-+ .op = DI_OP(DI_OP_STOPMOTOR, DI_DIR_READ | DI_MODE_IMMED),
-+ .name = "STOPMOTOR",
-+ .cmdbuf0 = 0xe3000000,
-+ },
-+
-+#define DI_OP_READDISKID (DI_OP_STOPMOTOR+1)
-+ [DI_OP_READDISKID] = {
-+ .op = DI_OP(DI_OP_READDISKID, DI_DIR_READ | DI_MODE_DMA),
-+ .name = "READDISKID",
-+ .cmdbuf0 = 0xa8000040,
-+ },
-+
-+#define DI_OP_READSECTOR (DI_OP_READDISKID+1)
-+ [DI_OP_READSECTOR] = {
-+ .op = DI_OP(DI_OP_READSECTOR, DI_DIR_READ | DI_MODE_DMA),
-+ .name = "READSECTOR",
-+ .cmdbuf0 = 0xa8000000,
-+ },
-+
-+#define DI_OP_ENABLE1 (DI_OP_READSECTOR+1)
-+ [DI_OP_ENABLE1] = {
-+ .op = DI_OP(DI_OP_ENABLE1, DI_DIR_READ | DI_MODE_IMMED),
-+ .name = "MATSHITA",
-+ .cmdbuf0 = 0,
-+ },
-+
-+#define DI_OP_ENABLE2 (DI_OP_ENABLE1+1)
-+ [DI_OP_ENABLE2] = {
-+ .op = DI_OP(DI_OP_ENABLE2, DI_DIR_READ | DI_MODE_IMMED),
-+ .name = "DVD-GAME",
-+ .cmdbuf0 = 0,
-+ },
-+
-+/*
-+ * The following commands are available in debug mode only.
-+ */
-+
-+#define DI_OP_READMEM (DI_OP_ENABLE2+1)
-+ [DI_OP_READMEM] = {
-+ .op = DI_OP(DI_OP_READMEM, DI_DIR_READ | DI_MODE_IMMED),
-+ .name = "READMEM",
-+ .cmdbuf0 = 0xfe010000,
-+ },
-+
-+#define DI_OP_WRITEMEM (DI_OP_READMEM+1)
-+ [DI_OP_WRITEMEM] = {
-+ .op = DI_OP(DI_OP_WRITEMEM, DI_DIR_READ | DI_MODE_DMA),
-+ .name = "WRITEMEM",
-+ .cmdbuf0 = 0xfe010100,
-+ },
-+
-+#define DI_OP_FUNC (DI_OP_WRITEMEM+1)
-+ [DI_OP_FUNC] = {
-+ .op = DI_OP(DI_OP_FUNC, DI_DIR_READ | DI_MODE_IMMED),
-+ .name = "FUNC",
-+ .cmdbuf0 = 0xfe120000,
-+ },
-+
-+#define DI_OP_GETSTATUS (DI_OP_FUNC+1)
-+ [DI_OP_GETSTATUS] = {
-+ .op = DI_OP(DI_OP_GETSTATUS, DI_DIR_READ | DI_MODE_IMMED),
-+ .name = "GETSTATUS",
-+ .cmdbuf0 = 0xe0000000,
-+ },
-+
-+/* thanks to blackcheck for pointing this one */
-+#define DI_OP_SPINMOTOR (DI_OP_GETSTATUS+1)
-+ [DI_OP_SPINMOTOR] = {
-+ .op = DI_OP(DI_OP_SPINMOTOR, DI_DIR_READ | DI_MODE_IMMED),
-+ .name = "SPINMOTOR",
-+ .cmdbuf0 = 0xfe110001,
-+#define DI_SPINMOTOR_MASK 0x0000ff00
-+#define DI_SPINMOTOR_DOWN 0x00000000
-+#define DI_SPINMOTOR_UP 0x00000100
-+#define DI_SPINMOTOR_CHECKDISK 0x00008000
-+ },
-+
-+/*
-+ * The following commands are part of the firmware extensions.
-+ */
-+
-+#define DI_OP_SETSTATUS (DI_OP_SPINMOTOR+1)
-+ [DI_OP_SETSTATUS] = {
-+ .op = DI_OP(DI_OP_SETSTATUS, DI_DIR_READ | DI_MODE_IMMED),
-+ .name = "SETSTATUS",
-+ .cmdbuf0 = 0xee000000,
-+#define DI_SETSTATUS_MASK 0x00ff0000
-+#define DI_SETSTATUS_SHIFT 16
-+ },
-+
-+#define DI_OP_ENABLEEXTENSIONS (DI_OP_SETSTATUS+1)
-+ [DI_OP_ENABLEEXTENSIONS] = {
-+ .op = DI_OP(DI_OP_ENABLEEXTENSIONS, DI_DIR_READ|DI_MODE_IMMED|
-+ DI_IGNORE_ERRORS),
-+ .name = "ENABLEEXTENSIONS",
-+ .cmdbuf0 = 0x55000000,
-+#define DI_ENABLEEXTENSIONS_MASK 0x00ff0000
-+#define DI_ENABLEEXTENSIONS_SHIFT 16
-+ },
-+
-+#define DI_OP_MAXOP DI_OP_ENABLEEXTENSIONS
-+};
-+
-+#define DI_OP_CUSTOM ((u16)~0)
-+
-+
-+static void di_reset(struct di_device *ddev);
-+static int di_run_command(struct di_command *cmd);
-+
-+/*
-+ * Returns the operation code related data for a command.
-+ */
-+static inline struct di_opcode *di_get_opcode(struct di_command *cmd)
-+{
-+ BUG_ON(cmd->opidx > DI_OP_MAXOP && cmd->opidx != DI_OP_CUSTOM);
-+
-+ if (cmd->opidx == DI_OP_CUSTOM)
-+ return cmd->data;
-+ else
-+ return &di_opcodes[cmd->opidx];
-+}
-+
-+/*
-+ * Returns the operation code for a command.
-+ */
-+static inline u16 di_op(struct di_command *cmd)
-+{
-+ return di_get_opcode(cmd)->op;
-+}
-+
-+
-+/*
-+ * Basic initialization for all commands.
-+ */
-+static void di_op_basic(struct di_command *cmd,
-+ struct di_device *ddev, u16 opidx)
-+{
-+ struct di_opcode *opcode;
-+
-+ memset(cmd, 0, sizeof(*cmd));
-+ cmd->ddev = ddev;
-+ cmd->opidx = opidx;
-+ cmd->max_retries = cmd->retries = 0;
-+ opcode = di_get_opcode(cmd);
-+ if (opcode)
-+ cmd->cmdbuf0 = opcode->cmdbuf0;
-+}
-+
-+/*
-+ * Builds an "Inquiry" command.
-+ */
-+static void di_op_inq(struct di_command *cmd,
-+ struct di_device *ddev,
-+ struct di_drive_info *drive_info)
-+{
-+ di_op_basic(cmd, ddev, DI_OP_INQ);
-+ cmd->cmdbuf2 = sizeof(*drive_info);
-+ cmd->data = drive_info;
-+ cmd->len = sizeof(*drive_info);
-+}
-+
-+/*
-+ * Builds a "Stop Motor" command.
-+ */
-+static inline void di_op_stopmotor(struct di_command *cmd,
-+ struct di_device *ddev)
-+{
-+ di_op_basic(cmd, ddev, DI_OP_STOPMOTOR);
-+}
-+
-+/*
-+ * Builds a "Read Disc ID" command.
-+ */
-+static void di_op_readdiskid(struct di_command *cmd,
-+ struct di_device *ddev,
-+ struct di_disk_id *disk_id)
-+{
-+ di_op_basic(cmd, ddev, DI_OP_READDISKID);
-+ cmd->cmdbuf2 = sizeof(*disk_id);
-+ cmd->data = disk_id;
-+ cmd->len = sizeof(*disk_id);
-+ cmd->max_retries = cmd->retries = DI_COMMAND_RETRIES;
-+}
-+
-+/*
-+ * Builds a "Read Sector" command.
-+ */
-+static void di_op_readsector(struct di_command *cmd,
-+ struct di_device *ddev,
-+ u32 sector, void *data, size_t len)
-+{
-+ di_op_basic(cmd, ddev, DI_OP_READSECTOR);
-+ cmd->cmdbuf1 = sector;
-+ cmd->cmdbuf2 = len;
-+ cmd->data = data;
-+ cmd->len = len;
-+ cmd->max_retries = cmd->retries = DI_COMMAND_RETRIES;
-+}
-+
-+/*
-+ * Builds the first enable command.
-+ */
-+static void di_op_enable1(struct di_command *cmd, struct di_device *ddev)
-+{
-+ di_op_basic(cmd, ddev, DI_OP_ENABLE1);
-+ cmd->cmdbuf0 = CMDBUF(0xff, 0x01, 'M', 'A');
-+ cmd->cmdbuf1 = CMDBUF('T', 'S', 'H', 'I');
-+ cmd->cmdbuf2 = CMDBUF('T', 'A', 0x02, 0x00);
-+}
-+
-+/*
-+ * Builds the second enable command.
-+ */
-+static void di_op_enable2(struct di_command *cmd, struct di_device *ddev)
-+{
-+ di_op_basic(cmd, ddev, DI_OP_ENABLE2);
-+ cmd->cmdbuf0 = CMDBUF(0xff, 0x00, 'D', 'V');
-+ cmd->cmdbuf1 = CMDBUF('D', '-', 'G', 'A');
-+ cmd->cmdbuf2 = CMDBUF('M', 'E', 0x03, 0x00);
-+}
-+
-+/*
-+ * Builds a "Read Memory" command.
-+ * Requires debug mode enabled.
-+ */
-+static inline void di_op_readmem(struct di_command *cmd,
-+ struct di_device *ddev)
-+{
-+ di_op_basic(cmd, ddev, DI_OP_READMEM);
-+ cmd->cmdbuf2 = 0x00010000;
-+}
-+
-+/*
-+ * Builds a "Invoke func" command.
-+ * Requires debug mode enabled.
-+ */
-+static inline void di_op_func(struct di_command *cmd,
-+ struct di_device *ddev, u32 address)
-+{
-+ di_op_basic(cmd, ddev, DI_OP_FUNC);
-+ cmd->cmdbuf1 = address;
-+ cmd->cmdbuf2 = CMDBUF('f', 'u', 'n', 'c');
-+}
-+
-+/*
-+ * Builds a "Write Memory" command.
-+ * Requires debug mode enabled.
-+ */
-+static inline void di_op_writemem(struct di_command *cmd,
-+ struct di_device *ddev)
-+{
-+ di_op_basic(cmd, ddev, DI_OP_WRITEMEM);
-+}
-+
-+/*
-+ * Builds a "get drive status" command.
-+ */
-+static inline void di_op_getstatus(struct di_command *cmd,
-+ struct di_device *ddev)
-+{
-+ di_op_basic(cmd, ddev, DI_OP_GETSTATUS);
-+}
-+
-+/*
-+ * Builds a "spin motor" command.
-+ * Requires debug mode enabled.
-+ */
-+static void di_op_spinmotor(struct di_command *cmd,
-+ struct di_device *ddev, u32 flags)
-+{
-+ di_op_basic(cmd, ddev, DI_OP_SPINMOTOR);
-+ cmd->cmdbuf0 |= (flags & DI_SPINMOTOR_MASK);
-+}
-+
-+/*
-+ * Builds a "set drive status" command.
-+ * Requires debug mode enabled.
-+ */
-+static void di_op_setstatus(struct di_command *cmd,
-+ struct di_device *ddev, u8 status)
-+{
-+ di_op_basic(cmd, ddev, DI_OP_SETSTATUS);
-+ cmd->cmdbuf0 |= ((status << DI_SETSTATUS_SHIFT) & DI_SETSTATUS_MASK);
-+}
-+
-+/*
-+ * Builds a "enable extensions" command.
-+ * The extended firmware will transparently disable the extensions when
-+ * original media is found.
-+ * Requires debug mode enabled.
-+ */
-+static void di_op_enableextensions(struct di_command *cmd,
-+ struct di_device *ddev, u8 enable)
-+{
-+ di_op_basic(cmd, ddev, DI_OP_ENABLEEXTENSIONS);
-+ cmd->cmdbuf0 |= ((enable << DI_ENABLEEXTENSIONS_SHIFT) &
-+ DI_ENABLEEXTENSIONS_MASK);
-+}
-+
-+/*
-+ * Builds a customized command.
-+ */
-+static inline void di_op_custom(struct di_command *cmd,
-+ struct di_device *ddev,
-+ struct di_opcode *opcode)
-+{
-+ di_op_basic(cmd, ddev, DI_OP_NOP);
-+ cmd->opidx = DI_OP_CUSTOM;
-+ cmd->data = opcode;
-+}
-+
-+
-+/*
-+ * Returns the printable form of the status part of a drive status.
-+ */
-+static char *di_printable_status(u32 drive_status)
-+{
-+ char *s = "unknown";
-+
-+ switch (DI_STATUS(drive_status)) {
-+ case DI_STATUS_READY:
-+ s = "ready";
-+ break;
-+ case DI_STATUS_COVER_OPENED:
-+ s = "cover opened";
-+ break;
-+ case DI_STATUS_DISK_CHANGE:
-+ s = "disk change";
-+ break;
-+ case DI_STATUS_NO_DISK:
-+ s = "no disk";
-+ break;
-+ case DI_STATUS_MOTOR_STOP:
-+ s = "motor stop";
-+ break;
-+ case DI_STATUS_DISK_ID_NOT_READ:
-+ s = "disk id not read";
-+ break;
-+ }
-+ return s;
-+}
-+
-+/*
-+ * Returns the printable form of the error part of a drive status.
-+ */
-+static char *di_printable_error(u32 drive_status)
-+{
-+ char *s = "unknown";
-+
-+ switch (DI_ERROR(drive_status)) {
-+ case DI_ERROR_NO_ERROR:
-+ s = "no error";
-+ break;
-+ case DI_ERROR_MOTOR_STOPPED:
-+ s = "motor stopped";
-+ break;
-+ case DI_ERROR_DISK_ID_NOT_READ:
-+ s = "disk id not read";
-+ break;
-+ case DI_ERROR_MEDIUM_NOT_PRESENT:
-+ s = "medium not present";
-+ break;
-+ case DI_ERROR_SEEK_INCOMPLETE:
-+ s = "seek incomplete";
-+ break;
-+ case DI_ERROR_UNRECOVERABLE_READ:
-+ s = "unrecoverable read";
-+ break;
-+ case DI_ERROR_INVALID_COMMAND:
-+ s = "invalid command";
-+ break;
-+ case DI_ERROR_BLOCK_OUT_OF_RANGE:
-+ s = "block out of range";
-+ break;
-+ case DI_ERROR_INVALID_FIELD:
-+ s = "invalid field";
-+ break;
-+ case DI_ERROR_MEDIUM_CHANGED:
-+ s = "medium changed";
-+ break;
-+ }
-+
-+ return s;
-+}
-+
-+/*
-+ * Prints the given drive status, only if debug enabled.
-+ */
-+static inline void di_debug_print_drive_status(u32 drive_status)
-+{
-+ DBG("%08x, [%s, %s]\n", drive_status,
-+ di_printable_status(drive_status),
-+ di_printable_error(drive_status));
-+}
-+
-+/*
-+ * Prints the given drive status.
-+ */
-+static void di_print_drive_status(u32 drive_status)
-+{
-+ drv_printk(KERN_INFO, "drive_status=%08x, [%s, %s]\n", drive_status,
-+ di_printable_status(drive_status),
-+ di_printable_error(drive_status));
-+}
-+
-+/*
-+ * Prints the given disk identifier.
-+ */
-+static void di_print_disk_id(struct di_disk_id *disk_id)
-+{
-+ drv_printk(KERN_INFO, "disk_id = [%s]\n", disk_id->id);
-+}
-+
-+/*
-+ *
-+ * I/O.
-+ */
-+
-+/*
-+ * Converts a request direction into a DMA data direction.
-+ */
-+static inline
-+enum dma_data_direction di_opidx_to_dma_dir(struct di_command *cmd)
-+{
-+ u16 op = di_op(cmd);
-+
-+ if ((op & DI_DIR_WRITE))
-+ return DMA_TO_DEVICE;
-+ else
-+ return DMA_FROM_DEVICE;
-+}
-+
-+/*
-+ * Starts a DMA transfer.
-+ */
-+static void di_start_dma_transfer_raw(struct di_device *ddev,
-+ dma_addr_t data, size_t len, int mode)
-+{
-+ void __iomem *io_base = ddev->io_base;
-+ u32 __iomem *sr_reg = io_base + DI_SR;
-+ unsigned long flags;
-+
-+ BUG_ON((data & DI_DMA_ALIGN) != 0 ||
-+ (len & DI_DMA_ALIGN) != 0);
-+
-+ /* setup address and length of transfer */
-+ out_be32(io_base + DI_LENGTH, len);
-+ out_be32(io_base + DI_MAR, data);
-+
-+ /* enable the Transfer Complete interrupt */
-+ spin_lock_irqsave(&ddev->io_lock, flags);
-+ out_be32(sr_reg, in_be32(sr_reg) | DI_SR_TCINTMASK);
-+ spin_unlock_irqrestore(&ddev->io_lock, flags);
-+
-+ /* start the transfer */
-+ out_be32(io_base + DI_CR, DI_CR_TSTART | DI_CR_DMA | (mode&0x4));
-+}
-+
-+/*
-+ * Internal. Busy-waits until a DMA transfer finishes or timeouts.
-+ */
-+static int __wait_for_dma_transfer_or_timeout(u32 __iomem *cr_reg,
-+ int secs)
-+{
-+ unsigned long timeout = jiffies + secs*HZ;
-+
-+ /* busy-wait for transfer complete */
-+ while ((in_be32(cr_reg) & DI_CR_TSTART) &&
-+ time_before(jiffies, timeout))
-+ cpu_relax();
-+
-+ return (in_be32(cr_reg) & DI_CR_TSTART) ? -EBUSY : 0;
-+}
-+
-+/*
-+ * Busy-waits until DMA transfers are finished.
-+ */
-+static void di_wait_for_dma_transfer_raw(struct di_device *ddev)
-+{
-+ u32 __iomem *cr_reg = ddev->io_base + DI_CR;
-+ u32 __iomem *sr_reg = ddev->io_base + DI_SR;
-+ unsigned long flags;
-+
-+ /* we don't want TCINTs to disturb us while waiting */
-+ spin_lock_irqsave(&ddev->io_lock, flags);
-+ out_be32(sr_reg, in_be32(sr_reg) & ~DI_SR_TCINTMASK);
-+ spin_unlock_irqrestore(&ddev->io_lock, flags);
-+
-+ /* if the drive got stuck, reset it */
-+ if (__wait_for_dma_transfer_or_timeout(cr_reg, DI_COMMAND_TIMEOUT)) {
-+ DBG("dvd stuck!\n");
-+ di_reset(ddev);
-+ }
-+
-+ /* ack and enable the Transfer Complete interrupt */
-+ spin_lock_irqsave(&ddev->io_lock, flags);
-+ out_be32(sr_reg, in_be32(sr_reg) | (DI_SR_TCINT|DI_SR_TCINTMASK));
-+ spin_unlock_irqrestore(&ddev->io_lock, flags);
-+
-+ return;
-+}
-+
-+/*
-+ * Quiesces the hardware to a calm and known state.
-+ */
-+static void di_quiesce(struct di_device *ddev)
-+{
-+ void __iomem *io_base = ddev->io_base;
-+ u32 __iomem *cr_reg = io_base + DI_CR;
-+ u32 __iomem *sr_reg = io_base + DI_SR;
-+ u32 __iomem *cvr_reg = io_base + DI_CVR;
-+ u32 sr, cvr;
-+ unsigned long flags;
-+
-+ spin_lock_irqsave(&ddev->io_lock, flags);
-+
-+ /* ack and mask dvd io interrupts */
-+ sr = in_be32(sr_reg);
-+ sr |= DI_SR_BRKINT | DI_SR_TCINT | DI_SR_DEINT;
-+ sr &= ~(DI_SR_BRKINTMASK | DI_SR_TCINTMASK | DI_SR_DEINTMASK);
-+ out_be32(sr_reg, sr);
-+
-+ /* ack and mask dvd cover interrupts */
-+ cvr = in_be32(cvr_reg);
-+ out_be32(cvr_reg, (cvr | DI_CVR_CVRINT) & ~DI_CVR_CVRINTMASK);
-+
-+ spin_unlock_irqrestore(&ddev->io_lock, flags);
-+
-+ /* busy-wait for transfer complete */
-+ __wait_for_dma_transfer_or_timeout(cr_reg, DI_COMMAND_TIMEOUT);
-+}
-+
-+/*
-+ * Command engine.
-+ *
-+ */
-+
-+/*
-+ * Outputs the command buffers, and optionally starts a transfer.
-+ */
-+static void di_prepare_command(struct di_command *cmd, int tstart)
-+{
-+ struct di_opcode *opcode = di_get_opcode(cmd);
-+ void __iomem *io_base = cmd->ddev->io_base;
-+
-+ /*DBG("buf0 = 0x%08x, buf1 = 0x%08x, buf2 = 0x%08x\n",
-+ cmd->cmdbuf0, cmd->cmdbuf1, cmd->cmdbuf2);*/
-+
-+ out_be32(io_base + DI_CMDBUF0, cmd->cmdbuf0);
-+ out_be32(io_base + DI_CMDBUF1, cmd->cmdbuf1);
-+ out_be32(io_base + DI_CMDBUF2, cmd->cmdbuf2);
-+
-+ cmd->ddev->drive_status = 0;
-+
-+ if (tstart)
-+ out_be32(io_base + DI_CR, DI_CR_TSTART | (opcode->op & 0x6));
-+}
-+
-+static void di_command_done(struct di_command *cmd);
-+
-+/*
-+ * Starts a command by using the immediate mode.
-+ */
-+static int di_start_command(struct di_command *cmd)
-+{
-+ struct di_device *ddev = cmd->ddev;
-+ unsigned long flags;
-+ int retval = 1;
-+
-+ spin_lock_irqsave(&ddev->lock, flags);
-+
-+ BUG_ON(ddev->cmd);
-+
-+ ddev->cmd = cmd;
-+ cmd->dma_len = 0; /* no dma here */
-+ di_prepare_command(cmd, 1);
-+
-+ spin_unlock_irqrestore(&ddev->lock, flags);
-+
-+ return retval;
-+}
-+
-+/*
-+ * Starts a command by using the DMA mode.
-+ */
-+static int di_start_dma_command(struct di_command *cmd)
-+{
-+ struct di_device *ddev = cmd->ddev;
-+ unsigned long flags;
-+ int retval = 1;
-+
-+ spin_lock_irqsave(&ddev->lock, flags);
-+
-+ BUG_ON(ddev->cmd);
-+
-+ ddev->cmd = cmd;
-+ cmd->dma_len = cmd->len;
-+ cmd->dma_addr = dma_map_single(ddev->dev,
-+ cmd->data, cmd->len,
-+ di_opidx_to_dma_dir(cmd));
-+
-+ di_prepare_command(cmd, 0);
-+ di_start_dma_transfer_raw(ddev, cmd->dma_addr, cmd->dma_len,
-+ di_op(cmd) & DI_DIR_WRITE);
-+
-+ spin_unlock_irqrestore(&ddev->lock, flags);
-+
-+ return retval;
-+}
-+
-+/*
-+ * Completes a "get drive status" command, after a failed command.
-+ */
-+static void di_complete_getstatus(struct di_command *cmd)
-+{
-+ struct di_device *ddev = cmd->ddev;
-+ void __iomem *io_base = ddev->io_base;
-+ u32 __iomem *data_reg = io_base + DI_DATA;
-+
-+ ddev->drive_status = in_be32(data_reg);
-+}
-+
-+/*
-+ * Called after a transfer is completed.
-+ */
-+static void di_complete_transfer(struct di_device *ddev, u32 result)
-+{
-+ struct di_command *cmd;
-+ struct di_opcode *opcode;
-+ u32 drive_status;
-+ unsigned long flags;
-+
-+ spin_lock_irqsave(&ddev->lock, flags);
-+
-+ /* do nothing if we have nothing to complete */
-+ cmd = ddev->cmd;
-+ if (!cmd) {
-+ spin_unlock_irqrestore(&ddev->lock, flags);
-+ goto out;
-+ }
-+
-+ /* free the command slot */
-+ ddev->cmd = NULL;
-+ spin_unlock_irqrestore(&ddev->lock, flags);
-+
-+ /* deal with caches after a dma transfer */
-+ if (cmd->dma_len) {
-+ dma_unmap_single(ddev->dev,
-+ cmd->dma_addr, cmd->dma_len,
-+ di_opidx_to_dma_dir(cmd));
-+ }
-+
-+ opcode = di_get_opcode(cmd);
-+
-+ /*
-+ * If a command fails we check the drive status. Depending on that
-+ * we may or not retry later the command.
-+ */
-+ cmd->result = result;
-+ if (!di_command_ok(cmd)) {
-+ /* the MATSHITA command always reports failure, ignore it */
-+ if (DI_OP_ID(opcode->op) != DI_OP_ENABLE1) {
-+ BUG_ON(ddev->failed_cmd != NULL);
-+
-+ ddev->failed_cmd = cmd;
-+
-+ /*
-+ * Issue immediately a "get drive status"
-+ * after a failed command.
-+ */
-+ cmd = &ddev->status;
-+ di_op_getstatus(cmd, ddev);
-+ cmd->done = di_complete_getstatus;
-+ di_run_command(cmd);
-+ goto out;
-+ }
-+ } else {
-+ if (cmd->retries != cmd->max_retries) {
-+ DBG("command %s succeeded after %d retries :-)\n",
-+ opcode->name, cmd->max_retries - cmd->retries);
-+ }
-+ }
-+
-+ /* complete a successful command, or the MATSHITA one */
-+ di_command_done(cmd);
-+
-+ spin_lock_irqsave(&ddev->lock, flags);
-+ if (ddev->failed_cmd) {
-+ cmd = ddev->failed_cmd;
-+ ddev->failed_cmd = NULL;
-+ spin_unlock_irqrestore(&ddev->lock, flags);
-+
-+ drive_status = ddev->drive_status;
-+ opcode = di_get_opcode(cmd);
-+
-+ /* retry a previously failed command if appropiate */
-+ if (cmd->retries > 0) {
-+ if (di_may_retry(drive_status)) {
-+ DBG("command %s failed, %d retries left\n",
-+ opcode->name, cmd->retries);
-+ di_debug_print_drive_status(drive_status);
-+
-+ cmd->retries--;
-+ di_run_command(cmd);
-+ goto out;
-+ } else {
-+ DBG("command %s failed,"
-+ " aborting due to drive status\n",
-+ opcode->name);
-+ }
-+ } else {
-+ if (!(opcode->op & DI_IGNORE_ERRORS))
-+ DBG("command %s failed\n", opcode->name);
-+ }
-+
-+ if (!(opcode->op & DI_IGNORE_ERRORS))
-+ di_print_drive_status(drive_status);
-+
-+ /* complete the failed command */
-+ di_command_done(cmd);
-+
-+ /* update the driver status */
-+ switch (DI_ERROR(drive_status)) {
-+ case DI_ERROR_MOTOR_STOPPED:
-+ case DI_ERROR_MEDIUM_NOT_PRESENT:
-+ case DI_ERROR_MEDIUM_CHANGED:
-+ set_bit(__DI_MEDIA_CHANGED, &ddev->flags);
-+ break;
-+ default:
-+ break;
-+ }
-+
-+ } else {
-+ spin_unlock_irqrestore(&ddev->lock, flags);
-+ }
-+
-+ /* start the block layer queue if someone requested it */
-+ if (test_and_clear_bit(__DI_START_QUEUE, &ddev->flags)) {
-+ spin_lock_irqsave(&ddev->queue_lock, flags);
-+ blk_start_queue(ddev->queue);
-+ spin_unlock_irqrestore(&ddev->queue_lock, flags);
-+ }
-+
-+out:
-+ return;
-+}
-+
-+/*
-+ * Calls any done hooks.
-+ */
-+static void di_command_done(struct di_command *cmd)
-+{
-+ /* if specified, call the completion routine */
-+ if (cmd->done)
-+ cmd->done(cmd);
-+}
-+
-+/*
-+ * Completion routine.
-+ */
-+static void di_wait_done(struct di_command *cmd)
-+{
-+ complete(cmd->done_data);
-+}
-+
-+/*
-+ * Runs a command.
-+ */
-+static int di_run_command(struct di_command *cmd)
-+{
-+ struct di_opcode *opcode = di_get_opcode(cmd);
-+ int retval;
-+
-+ if (cmd->retries > cmd->max_retries)
-+ cmd->retries = cmd->max_retries;
-+
-+ if (!(opcode->op & DI_MODE_DMA))
-+ retval = di_start_command(cmd);
-+ else
-+ retval = di_start_dma_command(cmd);
-+ return retval;
-+}
-+
-+/*
-+ * Runs a command and waits.
-+ * Might sleep if called from user context.
-+ */
-+static int di_run_command_and_wait(struct di_command *cmd)
-+{
-+ DECLARE_COMPLETION(complete);
-+
-+ cmd->done_data = &complete;
-+ cmd->done = di_wait_done;
-+ if (di_run_command(cmd) > 0)
-+ wait_for_completion(&complete);
-+ return cmd->result;
-+}
-+
-+/*
-+ * Interrupt handler for DI interrupts.
-+ */
-+static irqreturn_t di_irq_handler(int irq, void *dev0)
-+{
-+ struct di_device *ddev = dev0;
-+ void __iomem *io_base = ddev->io_base;
-+ u32 __iomem *sr_reg = io_base + DI_SR;
-+ u32 __iomem *cvr_reg = io_base + DI_CVR;
-+ u32 sr, cvr, reason, mask;
-+ unsigned long flags;
-+
-+ spin_lock_irqsave(&ddev->io_lock, flags);
-+
-+ sr = in_be32(sr_reg);
-+ mask = sr & (DI_SR_BRKINTMASK | DI_SR_TCINTMASK | DI_SR_DEINTMASK);
-+ reason = sr; /* & (mask << 1); */
-+ if (reason) {
-+ out_be32(sr_reg, sr | reason);
-+ spin_unlock_irqrestore(&ddev->io_lock, flags);
-+
-+ if (reason & DI_SR_TCINT)
-+ di_complete_transfer(ddev, DI_SR_TCINT);
-+ if (reason & DI_SR_BRKINT) {
-+ DBG("BRKINT\n");
-+ di_complete_transfer(ddev, DI_SR_BRKINT);
-+ }
-+ if (reason & DI_SR_DEINT)
-+ di_complete_transfer(ddev, DI_SR_DEINT);
-+
-+ spin_lock_irqsave(&ddev->io_lock, flags);
-+ }
-+
-+ cvr = in_be32(cvr_reg);
-+ mask = cvr & DI_CVR_CVRINTMASK;
-+ reason = cvr; /* & (mask << 1); */
-+ if ((reason & DI_CVR_CVRINT)) {
-+ out_be32(cvr_reg, cvr | DI_CVR_CVRINT);
-+ set_bit(__DI_MEDIA_CHANGED, &ddev->flags);
-+ if (test_and_clear_bit(__DI_RESETTING, &ddev->flags)) {
-+ if (!test_bit(__DI_AVOID_DEBUG, &ddev->flags)) {
-+ if (ddev->flags & DI_INTEROPERABLE) {
-+ DBG("extensions loaded"
-+ " and hopefully working\n");
-+ }
-+ }
-+ } else {
-+ DBG("dvd cover interrupt\n");
-+ }
-+ }
-+
-+ spin_unlock_irqrestore(&ddev->io_lock, flags);
-+
-+ return IRQ_HANDLED;
-+}
-+
-+/*
-+ * Hard-resets the drive.
-+ */
-+static void di_reset(struct di_device *ddev)
-+{
-+ u32 __iomem *reset_reg = (u32 __iomem *)0xcc003024;
-+ u32 reset;
-+
-+#define FLIPPER_RESET_DVD 0x00000004
-+
-+ /* set flags, but preserve the alien firmware flag */
-+ ddev->flags = (ddev->flags & DI_AVOID_DEBUG) |
-+ DI_RESETTING | DI_MEDIA_CHANGED;
-+
-+ reset = in_be32(reset_reg);
-+ out_be32(reset_reg, (reset & ~FLIPPER_RESET_DVD) | 1);
-+ mdelay(500);
-+ out_be32(reset_reg, (reset | FLIPPER_RESET_DVD) | 1);
-+ mdelay(500);
-+
-+ DBG("drive reset\n");
-+}
-+
-+
-+/*
-+ * Misc routines.
-+ *
-+ */
-+
-+/*
-+ * Retrieves (and prints out) the laser unit model.
-+ */
-+static u32 di_retrieve_drive_model(struct di_device *ddev)
-+{
-+ struct di_command cmd;
-+
-+ memset(&di_drive_info, 0, sizeof(di_drive_info));
-+ di_op_inq(&cmd, ddev, &di_drive_info);
-+ di_run_command_and_wait(&cmd);
-+
-+ drv_printk(KERN_INFO, "laser unit: rev=%x, code=%x, date=%x\n",
-+ di_drive_info.rev, di_drive_info.code,
-+ di_drive_info.date);
-+
-+ ddev->model = di_drive_info.date;
-+ return ddev->model;
-+}
-+
-+/*
-+ * Gets the current drive status.
-+ */
-+static u32 di_get_drive_status(struct di_device *ddev)
-+{
-+ void __iomem *io_base = ddev->io_base;
-+ u32 __iomem *data_reg = io_base + DI_DATA;
-+ struct di_command cmd;
-+ u32 drive_status;
-+
-+ di_op_getstatus(&cmd, ddev);
-+ di_run_command_and_wait(&cmd);
-+ drive_status = in_be32(data_reg);
-+
-+ return drive_status;
-+}
-+
-+/*
-+ * Checks if the drive is in a ready state.
-+ */
-+static int di_is_drive_ready(struct di_device *ddev)
-+{
-+ u32 drive_status;
-+ int result = 0;
-+
-+ drive_status = di_get_drive_status(ddev);
-+ if (DI_STATUS(drive_status) == DI_STATUS_DISK_ID_NOT_READ ||
-+ DI_STATUS(drive_status) == DI_STATUS_READY) {
-+ result = 1;
-+ }
-+
-+ return result;
-+}
-+
-+/*
-+ *
-+ * Firmware handling.
-+ */
-+
-+/*
-+ * Reads a long word from drive addressable memory.
-+ * Requires debug mode enabled.
-+ */
-+static int di_fw_read_meml(struct di_device *ddev,
-+ unsigned long *data, unsigned long address)
-+{
-+ void __iomem *io_base = ddev->io_base;
-+ struct di_command cmd;
-+ int result = -1;
-+
-+ di_op_readmem(&cmd, ddev);
-+ cmd.cmdbuf1 = address;
-+ di_run_command_and_wait(&cmd);
-+ if (di_command_ok(&cmd)) {
-+ *data = in_be32(io_base + DI_DATA);
-+ result = 0;
-+ }
-+ return result;
-+}
-+
-+/*
-+ * Retrieves the current active interrupt handler for the drive.
-+ * Requires debug mode enabled.
-+ */
-+static unsigned long di_fw_get_irq_handler(struct di_device *ddev)
-+{
-+ unsigned long data = 0;
-+
-+ di_fw_read_meml(ddev, &data, DI_DRIVE_IRQ_VECTOR);
-+ return data;
-+}
-+
-+/*
-+ * Patches drive addressable memory.
-+ * Requires debug mode enabled.
-+ */
-+static void di_fw_patch_mem(struct di_device *ddev, u32 address,
-+ void *data, size_t len)
-+{
-+ struct di_command cmd;
-+ struct di_opcode opcode;
-+ int chunk_size;
-+ const int max_chunk_size = 3 * sizeof(cmd.cmdbuf0);
-+
-+ while (len > 0) {
-+ /* we can write in groups of 12 bytes at max */
-+ if (len > max_chunk_size)
-+ chunk_size = max_chunk_size;
-+ else
-+ chunk_size = len;
-+
-+ /* prepare for writing to drive's memory ... */
-+ di_op_writemem(&cmd, ddev);
-+ cmd.cmdbuf1 = address;
-+ cmd.cmdbuf2 = chunk_size << 16;
-+ di_run_command_and_wait(&cmd);
-+ if (!di_command_ok(&cmd))
-+ break;
-+
-+ /* ... and actually write to it */
-+ opcode.op = DI_OP(DI_OP_CUSTOM, DI_DIR_READ | DI_MODE_IMMED);
-+ opcode.name = "custom write";
-+ di_op_custom(&cmd, ddev, &opcode);
-+ memcpy(&cmd.cmdbuf0, data, chunk_size);
-+ di_run_command(&cmd);
-+
-+ /*
-+ * We can't rely on drive operating as expected here, so we
-+ * explicitly poll for end of transfer and timeout eventually.
-+ * Anyway, we assume everything was ok.
-+ */
-+ di_wait_for_dma_transfer_raw(ddev);
-+ di_complete_transfer(ddev, DI_SR_TCINT);
-+
-+ /* ok, next chunk */
-+ address += chunk_size;
-+ data += chunk_size;
-+ len -= chunk_size;
-+ }
-+}
-+
-+/*
-+ * Runs a series of patches.
-+ * Requires debug mode enabled.
-+ */
-+static void di_fw_patch(struct di_device *ddev,
-+ struct di_drive_code *section, int nr_sections)
-+{
-+ while (nr_sections > 0) {
-+ di_fw_patch_mem(ddev, section->address,
-+ section->code, section->len);
-+ section++;
-+ nr_sections--;
-+ }
-+}
-+
-+/*
-+ * Selects the appropiate drive code for each drive.
-+ */
-+static int di_select_drive_code(struct di_device *ddev)
-+{
-+ ddev->drive_code = NULL;
-+
-+ switch (ddev->model) {
-+ case 0x20020402:
-+ ddev->drive_code = &drive_20020402;
-+ break;
-+ case 0x20010608:
-+ ddev->drive_code = &drive_20010608;
-+ break;
-+ case 0x20020823:
-+ ddev->drive_code = &drive_20020823;
-+ break;
-+ case 0x20010831:
-+ ddev->drive_code = &drive_20010831;
-+ break;
-+ default:
-+ drv_printk(KERN_ERR, "sorry, drive %x is not yet"
-+ " supported\n",
-+ di_drive_info.date);
-+ break;
-+ }
-+
-+ return (ddev->drive_code) ? 0 : -EINVAL;
-+}
-+
-+/*
-+ *
-+ */
-+static u8 parking_code[] = {
-+ 0xa0, /* sub d0, d0 */
-+ 0xc4, 0xda, 0xfc, /* movb d0, (ADBCTL) */
-+ 0xf4, 0x74, 0x74, 0x0a, 0x08, /* mov 0x080a74, a0 */ /* fixup */
-+ 0xf7, 0x20, 0x4c, 0x80, /* mov a0, (0x804c) */
-+ 0xfe, /* rts */
-+};
-+
-+/*
-+ * Parks (disables) any existing alien drive code.
-+ * Requires debug mode enabled.
-+ */
-+static u32 di_park_firmware(struct di_device *ddev)
-+{
-+ struct di_command cmd;
-+ u32 irq_handler, original_irq_handler;
-+ u32 load_address;
-+
-+ /* calculate an appropiate load address for the parking code */
-+ irq_handler = le32_to_cpu(di_fw_get_irq_handler(ddev));
-+ load_address = (irq_handler >= 0x400000) ? 0x008502 : 0x40c600;
-+
-+ /* get the original interrupt handler */
-+ irq_handler = (ddev->model != 0x20010831) ? 0x00080A74 : 0x00080AA4;
-+ original_irq_handler = irq_handler;
-+
-+ /* fix the parking code to match our drive model */
-+ cpu_to_le32s(&irq_handler);
-+ memcpy(parking_code + 6, &irq_handler, 3);
-+
-+ /* load and call it */
-+ di_fw_patch_mem(ddev, load_address, parking_code, sizeof(parking_code));
-+ di_op_func(&cmd, ddev, load_address);
-+ di_run_command_and_wait(&cmd);
-+
-+ /*
-+ * Check if the parking code did its job.
-+ * The drive should be running now under the original irq handler.
-+ */
-+ irq_handler = le32_to_cpu(di_fw_get_irq_handler(ddev));
-+ if (irq_handler != original_irq_handler) {
-+ drv_printk(KERN_ERR, "parking failed!\n");
-+ di_reset(ddev);
-+ } else {
-+ DBG("parking done, irq handler = %08x\n", irq_handler);
-+ }
-+
-+ /* drive is not patched anymore here */
-+ clear_bit(__DI_INTEROPERABLE, &ddev->flags);
-+
-+ return di_get_drive_status(ddev);
-+}
-+
-+/*
-+ * Spins down the drive, immediatelly.
-+ */
-+static void di_spin_down_drive(struct di_device *ddev)
-+{
-+ struct di_command cmd;
-+
-+ di_op_stopmotor(&cmd, ddev);
-+ di_run_command_and_wait(&cmd);
-+}
-+
-+/*
-+ * Enables the "debug" command set.
-+ */
-+static int di_enable_debug_commands(struct di_device *ddev)
-+{
-+ struct di_command cmd;
-+
-+ /* send these two consecutive enable commands */
-+ di_op_enable1(&cmd, ddev);
-+ di_run_command_and_wait(&cmd);
-+ di_op_enable2(&cmd, ddev);
-+ return di_run_command_and_wait(&cmd);
-+}
-+
-+/*
-+ * Tries to determine if firmware extensions are currently installed.
-+ * Requires debug mode enabled.
-+ */
-+static int di_has_alien_drive_code(struct di_device *ddev)
-+{
-+ unsigned long address;
-+ int result = 1;
-+
-+ /*
-+ * We assume that alien drive code is in place if the interrupt handler
-+ * is not pointing to ROM address space.
-+ */
-+ address = di_fw_get_irq_handler(ddev);
-+ address = le32_to_cpu(address);
-+ if (address) {
-+ if ((address & 0xffff0000) == 0x00080000)
-+ result = 0;
-+ }
-+ return result;
-+}
-+
-+/*
-+ * Enables some workarounds and/or special behaviours depending on
-+ * the drive firmware found.
-+ * Requires debug mode enabled.
-+ */
-+static void di_init_alien_drive_code_quirks(struct di_device *ddev)
-+{
-+ unsigned long fingerprint;
-+
-+ /*
-+ * Test if a xenogc/duoq is installed.
-+ */
-+ if (!di_fw_read_meml(ddev, &fingerprint, 0x40c60a)) {
-+ if (fingerprint == 0xf710fff7) {
-+ drv_printk(KERN_INFO, "drivechip: xenogc/duoq\n");
-+ set_bit(__DI_AVOID_DEBUG, &ddev->flags);
-+ }
-+ }
-+}
-+
-+/*
-+ * Configures the drive to accept DVD-R and DVD+R media.
-+ */
-+static void di_make_interoperable(struct di_device *ddev)
-+{
-+ struct di_command cmd;
-+
-+ if (!ddev->drive_code || test_bit(__DI_AVOID_DEBUG, &ddev->flags))
-+ return;
-+
-+ /* calm things down */
-+ di_spin_down_drive(ddev);
-+
-+ /* disable any alien drive code */
-+ di_enable_debug_commands(ddev);
-+ di_park_firmware(ddev);
-+
-+ /* re-enable debug commands */
-+ di_enable_debug_commands(ddev);
-+
-+ /* load our own drive code extensions */
-+ di_fw_patch(ddev, ddev->drive_code, 1);
-+
-+ /*
-+ * The drive will become interoperable now.
-+ * Here we go...!
-+ */
-+ set_bit(__DI_INTEROPERABLE, &ddev->flags);
-+ di_op_func(&cmd, ddev, DI_DRIVE_CODE_BASE);
-+ di_run_command_and_wait(&cmd);
-+
-+ /* this checks if drive is still working... */
-+ di_get_drive_status(ddev);
-+}
-+
-+/*
-+ * Ensures that the debug features of the drive firmware are working.
-+ */
-+static int di_probe_debug_features(struct di_device *ddev)
-+{
-+ int result;
-+
-+ /* do nothing on unknown drive models */
-+ if (!ddev->drive_code)
-+ return -EINVAL;
-+
-+ result = di_enable_debug_commands(ddev);
-+ if (!di_result_ok(result)) {
-+ DBG("uhmm, debug commands seem banned...\n");
-+ DBG("... let's hard reset the drive!\n");
-+
-+ di_reset(ddev);
-+ result = di_enable_debug_commands(ddev);
-+ }
-+
-+ return di_result_ok(result) ? 0 : -EINVAL;
-+}
-+
-+/*
-+ * Probes the existing firmware features and determines the best operation
-+ * mode.
-+ */
-+static void di_probe_firmware(struct di_device *ddev)
-+{
-+ if (di_probe_debug_features(ddev)) {
-+ /* we can't use debug features, thus try to avoid them */
-+ drv_printk(KERN_INFO, "firmware: debug features do not work,"
-+ " using standard command set\n");
-+ set_bit(__DI_AVOID_DEBUG, &ddev->flags);
-+ } else {
-+ if (di_has_alien_drive_code(ddev)) {
-+ drv_printk(KERN_INFO, "firmware: patched drive\n");
-+ /* enable some workarounds if required */
-+ di_init_alien_drive_code_quirks(ddev);
-+ } else {
-+ drv_printk(KERN_INFO, "firmware: unpatched drive\n");
-+ }
-+ }
-+}
-+
-+/*
-+ * Stops the drive's motor, according to a previous schedule.
-+ */
-+static void di_motor_off(unsigned long ddev0)
-+{
-+ struct di_device *ddev = (struct di_device *)ddev0;
-+ struct di_command *cmd;
-+ unsigned long flags;
-+
-+ /* postpone a bit the motor off if there are pending commands */
-+ spin_lock_irqsave(&ddev->lock, flags);
-+ if (!ddev->cmd) {
-+ ddev->cmd = cmd = &ddev->status;
-+ spin_unlock_irqrestore(&ddev->lock, flags);
-+ di_op_stopmotor(cmd, ddev);
-+ di_prepare_command(cmd, 1);
-+ } else {
-+ spin_unlock_irqrestore(&ddev->lock, flags);
-+ mod_timer(&ddev->motor_off_timer, jiffies + 1*HZ);
-+ }
-+}
-+
-+/*
-+ * Cancels a previously scheduled motor off.
-+ */
-+static inline void di_cancel_motor_off(struct di_device *ddev)
-+{
-+ del_timer(&ddev->motor_off_timer);
-+}
-+
-+/*
-+ * Stops the drive's motor after the specified amount of seconds has elapsed.
-+ */
-+static void di_schedule_motor_off(struct di_device *ddev, unsigned int secs)
-+{
-+ del_timer(&ddev->motor_off_timer);
-+ ddev->motor_off_timer.expires = jiffies + secs*HZ;
-+ ddev->motor_off_timer.data = (unsigned long)ddev;
-+ add_timer(&ddev->motor_off_timer);
-+}
-+
-+/*
-+ * Spins up the drive.
-+ */
-+static void di_spin_up_drive(struct di_device *ddev, u8 enable_extensions)
-+{
-+ struct di_command cmd;
-+ u32 drive_status;
-+ unsigned int attempts = 2;
-+
-+ /* do nothing if the drive is already spinning */
-+ if (di_is_drive_ready(ddev))
-+ goto out;
-+
-+ if (test_bit(__DI_AVOID_DEBUG, &ddev->flags)) {
-+ /* don't use debug commands, let's hope a drivechip is there */
-+ di_reset(ddev);
-+ } else {
-+ while (attempts-- > 0) {
-+ if (!test_bit(__DI_INTEROPERABLE, &ddev->flags))
-+ di_make_interoperable(ddev);
-+
-+ /*
-+ * We only re-enable the extensions if the drive is not
-+ * in a pending read disk id state. Otherwise, we assume
-+ * that the drive has already accepted the disk.
-+ */
-+ drive_status = di_get_drive_status(ddev);
-+ if (DI_STATUS(drive_status) !=
-+ DI_STATUS_DISK_ID_NOT_READ) {
-+ di_op_enableextensions(&cmd, ddev,
-+ enable_extensions);
-+ di_run_command_and_wait(&cmd);
-+ }
-+
-+ /* the spin motor command requires the debug mode */
-+ di_enable_debug_commands(ddev);
-+ di_op_spinmotor(&cmd, ddev, DI_SPINMOTOR_UP);
-+ di_run_command_and_wait(&cmd);
-+
-+ if (!ddev->drive_status) {
-+ di_op_setstatus(&cmd, ddev,
-+ DI_STATUS_DISK_ID_NOT_READ+1);
-+ cmd.cmdbuf0 |= 0x00000300; /* XXX cheqmate */
-+ di_run_command_and_wait(&cmd);
-+ } else {
-+ if (DI_ERROR(ddev->drive_status) !=
-+ DI_ERROR_MEDIUM_NOT_PRESENT)
-+ di_reset(ddev);
-+ continue;
-+ }
-+ break;
-+ }
-+ }
-+out:
-+ return;
-+}
-+
-+
-+/*
-+ * Block layer hooks.
-+ *
-+ */
-+
-+static int di_read_toc(struct di_device *ddev)
-+{
-+ static struct di_disk_id disk_id
-+ __attribute__ ((aligned(DI_DMA_ALIGN+1)));
-+ struct di_command cmd;
-+ int accepted_media = 0;
-+ int retval = 0;
-+ const u8 enable_extensions = 1;
-+
-+ di_cancel_motor_off(ddev);
-+
-+ /* spin up the drive if needed */
-+ if ((ddev->flags & DI_MEDIA_CHANGED))
-+ di_spin_up_drive(ddev, enable_extensions);
-+
-+ /* check that disk id can be read and that the media is appropiate */
-+ memset(&disk_id, 0, sizeof(disk_id));
-+ di_op_readdiskid(&cmd, ddev, &disk_id);
-+ di_run_command_and_wait(&cmd);
-+ if (di_command_ok(&cmd)) {
-+ if (disk_id.id[0] && memcmp(disk_id.id, "GBL", 3) &&
-+ !di_accept_gods) {
-+ di_print_disk_id(&disk_id);
-+ drv_printk(KERN_ERR, "sorry, gamecube media"
-+ " support is disabled\n");
-+ } else {
-+ accepted_media = 1;
-+ }
-+ } else {
-+ set_bit(__DI_MEDIA_CHANGED, &ddev->flags);
-+ }
-+
-+ if (accepted_media) {
-+ /*
-+ * This is currently hardcoded. Scream|CT got this number
-+ * by reading up to where the lens physically allowed.
-+ *
-+ * This is currently causing us problems.
-+ * For example, recent 'mount' versions will read 4k from
-+ * the end of the device when guessing filesystem types.
-+ * The end of device we are reporting is not the real one,
-+ * so the drive will fail to read that part if it was not
-+ * burned.
-+ *
-+ * As a temporary solution, specify always a filesystem
-+ * type when using mount, or fill the whole disk when
-+ * burning.
-+ */
-+ ddev->nr_sectors = DI_MAX_SECTORS; /* in DVD sectors */
-+ clear_bit(__DI_MEDIA_CHANGED, &ddev->flags);
-+
-+ DBG("media ready for operation\n");
-+ } else {
-+ ddev->nr_sectors = 0;
-+ retval = -ENOMEDIUM;
-+
-+ di_spin_down_drive(ddev);
-+
-+ DBG("media NOT ready\n");
-+ }
-+
-+ /* transform to kernel sectors */
-+ ddev->nr_sectors <<= (DI_SECTOR_SHIFT - KERNEL_SECTOR_SHIFT);
-+ set_capacity(ddev->disk, ddev->nr_sectors);
-+
-+ return retval;
-+}
-+
-+
-+static void di_request_done(struct di_command *cmd)
-+{
-+ struct di_device *ddev = cmd->ddev;
-+ struct request *req;
-+ unsigned long flags;
-+ int error = (cmd->result & DI_SR_TCINT) ? 0 : -EIO;
-+
-+ spin_lock_irqsave(&ddev->lock, flags);
-+
-+ req = ddev->req;
-+ ddev->req = NULL;
-+
-+ spin_unlock_irqrestore(&ddev->lock, flags);
-+
-+ if (req) {
-+ __blk_end_request(req, error, req->current_nr_sectors << 9);
-+ spin_lock_irqsave(&ddev->queue_lock, flags);
-+ blk_start_queue(ddev->queue);
-+ spin_unlock_irqrestore(&ddev->queue_lock, flags);
-+ }
-+}
-+
-+static void di_do_request(struct request_queue *q)
-+{
-+ struct di_device *ddev = q->queuedata;
-+ struct di_command *cmd = &ddev->req_cmd;
-+ struct request *req;
-+ unsigned long start;
-+ unsigned long flags;
-+ size_t len;
-+
-+ while ((req = elv_next_request(q))) {
-+ /* keep our reads within limits */
-+ if (req->sector + req->current_nr_sectors > ddev->nr_sectors) {
-+ drv_printk(KERN_ERR, "reading past end\n");
-+ end_request(req, 0);
-+ continue;
-+ }
-+
-+ /* it doesn't make sense to write to this device */
-+ if (rq_data_dir(req) == WRITE) {
-+ drv_printk(KERN_ERR, "write attempted\n");
-+ end_request(req, 0);
-+ continue;
-+ }
-+
-+ /* it is not a good idea to open the lid ... */
-+ if ((ddev->flags & DI_MEDIA_CHANGED)) {
-+ drv_printk(KERN_ERR, "media changed, aborting\n");
-+ end_request(req, 0);
-+ continue;
-+ }
-+
-+ spin_lock_irqsave(&ddev->lock, flags);
-+
-+ /* we can schedule just a single request each time */
-+ if (ddev->req || ddev->cmd) {
-+ blk_stop_queue(q);
-+ if (ddev->cmd)
-+ set_bit(__DI_START_QUEUE, &ddev->flags);
-+ spin_unlock_irqrestore(&ddev->lock, flags);
-+ break;
-+ }
-+
-+ blkdev_dequeue_request(req);
-+
-+ /* ignore requests that we can't handle */
-+ if (!blk_fs_request(req)) {
-+ spin_unlock_irqrestore(&ddev->lock, flags);
-+ continue;
-+ }
-+
-+ /* store the request being handled ... */
-+ ddev->req = req;
-+ blk_stop_queue(q);
-+
-+ spin_unlock_irqrestore(&ddev->lock, flags);
-+
-+ /* ... and launch the corresponding read sector command */
-+ start = req->sector << KERNEL_SECTOR_SHIFT;
-+ len = req->current_nr_sectors << KERNEL_SECTOR_SHIFT;
-+
-+ di_op_readsector(cmd, ddev, start >> 2,
-+ req->buffer, len);
-+ cmd->done_data = cmd;
-+ cmd->done = di_request_done;
-+ di_run_command(cmd);
-+ }
-+}
-+
-+/*
-+ * Block device hooks.
-+ *
-+ */
-+
-+static int di_open(struct block_device *bdev, fmode_t mode)
-+{
-+ struct di_device *ddev = bdev->bd_disk->private_data;
-+ struct di_command *cmd;
-+ DECLARE_COMPLETION(complete);
-+ unsigned long flags;
-+ int retval = 0;
-+
-+ /* this is a read only device */
-+ if (mode & FMODE_WRITE) {
-+ retval = -EROFS;
-+ goto out;
-+ }
-+
-+ /*
-+ * If we have a pending command, that's a previously scheduled
-+ * motor off. Wait for it to terminate before going on.
-+ */
-+ spin_lock_irqsave(&ddev->lock, flags);
-+ if (ddev->cmd && ddev->ref_count == 0) {
-+ cmd = ddev->cmd;
-+ cmd->done_data = &complete;
-+ cmd->done = di_wait_done;
-+ spin_unlock_irqrestore(&ddev->lock, flags);
-+ wait_for_completion(&complete);
-+ } else {
-+ spin_unlock_irqrestore(&ddev->lock, flags);
-+ }
-+
-+ /* this will take care of validating the media */
-+ check_disk_change(bdev);
-+ if (!ddev->nr_sectors) {
-+ retval = -ENOMEDIUM;
-+ goto out;
-+ }
-+
-+ spin_lock_irqsave(&ddev->queue_lock, flags);
-+
-+ /* honor exclusive open mode */
-+ if (ddev->ref_count == -1 ||
-+ (ddev->ref_count && (mode & FMODE_EXCL))) {
-+ retval = -EBUSY;
-+ goto out_unlock;
-+ }
-+
-+ if ((mode & FMODE_EXCL))
-+ ddev->ref_count = -1;
-+ else
-+ ddev->ref_count++;
-+
-+out_unlock:
-+ spin_unlock_irqrestore(&ddev->queue_lock, flags);
-+out:
-+ return retval;
-+
-+}
-+
-+static int di_release(struct gendisk *disk, fmode_t mode)
-+{
-+ struct di_device *ddev = disk->private_data;
-+ unsigned long flags;
-+
-+ spin_lock_irqsave(&ddev->queue_lock, flags);
-+
-+ if (ddev->ref_count > 0)
-+ ddev->ref_count--;
-+ else
-+ ddev->ref_count = 0;
-+
-+ spin_unlock_irqrestore(&ddev->queue_lock, flags);
-+
-+ if (ddev->ref_count == 0) {
-+ /*
-+ * We do not immediately stop the motor, which saves us
-+ * a spin down/spin up in applications that re-open quickly
-+ * the device, like mount when -t is not specified.
-+ */
-+ di_schedule_motor_off(ddev, 1);
-+
-+ set_bit(__DI_MEDIA_CHANGED, &ddev->flags);
-+ }
-+
-+ return 0;
-+}
-+
-+static int di_revalidate_disk(struct gendisk *disk)
-+{
-+ struct di_device *ddev = disk->private_data;
-+ di_read_toc(ddev);
-+ return 0;
-+}
-+
-+static int di_media_changed(struct gendisk *disk)
-+{
-+ struct di_device *ddev = disk->private_data;
-+ return (ddev->flags & DI_MEDIA_CHANGED) ? 1 : 0;
-+}
-+
-+static int di_ioctl(struct block_device *bdev, fmode_t mode,
-+ unsigned int cmd, unsigned long arg)
-+{
-+ switch (cmd) {
-+ case CDROMMULTISESSION:
-+ /* struct cdrom_multisession */
-+ break;
-+ case CDROMSTART:
-+ break;
-+ case CDROMSTOP:
-+ break;
-+ case CDROMREADTOCHDR:
-+ /* struct cdrom_tochdr */
-+ break;
-+ case CDROMREADTOCENTRY:
-+ /* struct cdrom_tocentry */
-+ break;
-+ case CDROMREADMODE2:
-+ case CDROMREADMODE1:
-+ case CDROMREADRAW:
-+ /* struct cdrom_read (1-2048, 2-2336,RAW-2352) */
-+ break;
-+ case CDROM_GET_MCN:
-+ /* retrieve the universal product code */
-+ /* struct cdrom_mcn */
-+ break;
-+ case CDROMRESET:
-+ /* reset the drive */
-+ break;
-+ case BLKRAGET:
-+ case BLKFRAGET:
-+ case BLKROGET:
-+ case BLKBSZGET:
-+ case BLKSSZGET:
-+ case BLKSECTGET:
-+ case BLKGETSIZE:
-+ case BLKGETSIZE64:
-+ case BLKFLSBUF:
-+ return ioctl_by_bdev(bdev, cmd, arg);
-+ default:
-+ return -EINVAL;
-+ }
-+ return -EINVAL;
-+}
-+
-+static struct block_device_operations di_fops = {
-+ .owner = THIS_MODULE,
-+ .open = di_open,
-+ .release = di_release,
-+ .revalidate_disk = di_revalidate_disk,
-+ .media_changed = di_media_changed,
-+ .ioctl = di_ioctl,
-+};
-+
-+/*
-+ * Setup routines.
-+ *
-+ */
-+
-+static int di_init_irq(struct di_device *ddev)
-+{
-+ void __iomem *io_base = ddev->io_base;
-+ u32 __iomem *sr_reg = io_base + DI_SR;
-+ u32 __iomem *cvr_reg = io_base + DI_CVR;
-+ u32 sr, cvr;
-+ unsigned long flags;
-+ int retval;
-+
-+ init_timer(&ddev->motor_off_timer);
-+ ddev->motor_off_timer.function =
-+ (void (*)(unsigned long))di_motor_off;
-+
-+ ddev->flags = 0;
-+ set_bit(__DI_MEDIA_CHANGED, &ddev->flags);
-+
-+ /* calm down things a bit first */
-+ di_quiesce(ddev);
-+
-+ /* request interrupt */
-+ retval = request_irq(ddev->irq, di_irq_handler, 0,
-+ DRV_MODULE_NAME, ddev);
-+ if (retval) {
-+ drv_printk(KERN_ERR, "request of irq%d failed\n", ddev->irq);
-+ goto out;
-+ }
-+
-+ spin_lock_irqsave(&ddev->io_lock, flags);
-+
-+ sr = in_be32(sr_reg);
-+ sr |= DI_SR_BRKINT | DI_SR_TCINT | DI_SR_DEINT;
-+ sr |= DI_SR_BRKINTMASK | DI_SR_TCINTMASK | DI_SR_DEINTMASK;
-+ out_be32(sr_reg, sr);
-+
-+ cvr = in_be32(cvr_reg);
-+ out_be32(cvr_reg, cvr | DI_CVR_CVRINT | DI_CVR_CVRINTMASK);
-+
-+ spin_unlock_irqrestore(&ddev->io_lock, flags);
-+
-+ di_retrieve_drive_model(ddev);
-+ di_select_drive_code(ddev);
-+
-+ di_probe_firmware(ddev);
-+
-+ di_schedule_motor_off(ddev, DI_MOTOR_OFF_TIMEOUT);
-+
-+out:
-+ return retval;
-+}
-+
-+static void di_exit_irq(struct di_device *ddev)
-+{
-+ /* stop DVD motor */
-+ di_cancel_motor_off(ddev);
-+ di_spin_down_drive(ddev);
-+
-+ di_quiesce(ddev);
-+
-+ free_irq(ddev->irq, ddev);
-+}
-+
-+static int di_init_blk_dev(struct di_device *ddev)
-+{
-+ struct gendisk *disk;
-+ struct request_queue *queue;
-+ int retval;
-+
-+ spin_lock_init(&ddev->lock);
-+ spin_lock_init(&ddev->io_lock);
-+
-+ ddev->ref_count = 0;
-+
-+ retval = register_blkdev(DI_MAJOR, DI_NAME);
-+ if (retval) {
-+ drv_printk(KERN_ERR, "error registering major %d\n", DI_MAJOR);
-+ goto err_register_blkdev;
-+ }
-+
-+ retval = -ENOMEM;
-+ spin_lock_init(&ddev->queue_lock);
-+ queue = blk_init_queue(di_do_request, &ddev->queue_lock);
-+ if (!queue) {
-+ drv_printk(KERN_ERR, "error initializing queue\n");
-+ goto err_blk_init_queue;
-+ }
-+
-+ blk_queue_hardsect_size(queue, DI_SECTOR_SIZE);
-+ blk_queue_dma_alignment(queue, DI_DMA_ALIGN);
-+ blk_queue_max_phys_segments(queue, 1);
-+ blk_queue_max_hw_segments(queue, 1);
-+ queue->queuedata = ddev;
-+ ddev->queue = queue;
-+
-+ disk = alloc_disk(1);
-+ if (!disk) {
-+ drv_printk(KERN_ERR, "error allocating disk\n");
-+ goto err_alloc_disk;
-+ }
-+
-+ disk->major = DI_MAJOR;
-+ disk->first_minor = 0;
-+ disk->fops = &di_fops;
-+ strcpy(disk->disk_name, DI_NAME);
-+ disk->queue = ddev->queue;
-+ disk->private_data = ddev;
-+ ddev->disk = disk;
-+
-+ set_disk_ro(ddev->disk, 1);
-+ add_disk(ddev->disk);
-+
-+ retval = 0;
-+ goto out;
-+
-+err_alloc_disk:
-+ blk_cleanup_queue(ddev->queue);
-+err_blk_init_queue:
-+ unregister_blkdev(DI_MAJOR, DI_NAME);
-+err_register_blkdev:
-+out:
-+ return retval;
-+}
-+
-+static void di_exit_blk_dev(struct di_device *ddev)
-+{
-+ if (ddev->disk) {
-+ del_gendisk(ddev->disk);
-+ put_disk(ddev->disk);
-+ }
-+ if (ddev->queue)
-+ blk_cleanup_queue(ddev->queue);
-+ unregister_blkdev(DI_MAJOR, DI_NAME);
-+}
-+
-+static int di_init_proc(struct di_device *ddev)
-+{
-+#ifdef CONFIG_PROC_FS
-+#endif /* CONFIG_PROC_FS */
-+ return 0;
-+}
-+
-+static void di_exit_proc(struct di_device *ddev)
-+{
-+#ifdef CONFIG_PROC_FS
-+#endif /* CONFIG_PROC_FS */
-+}
-+
-+static int di_init(struct di_device *ddev, struct resource *mem, int irq)
-+{
-+ int retval;
-+
-+ ddev->io_base = ioremap(mem->start, mem->end - mem->start + 1);
-+ ddev->irq = irq;
-+
-+ retval = di_init_blk_dev(ddev);
-+ if (!retval) {
-+ retval = di_init_irq(ddev);
-+ if (retval)
-+ di_exit_blk_dev(ddev);
-+ else
-+ di_init_proc(ddev);
-+ }
-+ return retval;
-+}
-+
-+static void di_exit(struct di_device *ddev)
-+{
-+ di_exit_blk_dev(ddev);
-+ di_exit_irq(ddev);
-+ di_exit_proc(ddev);
-+ if (ddev->io_base) {
-+ iounmap(ddev->io_base);
-+ ddev->io_base = NULL;
-+ }
-+}
-+
-+/*
-+ * Driver model helper routines.
-+ *
-+ */
-+
-+static int di_do_probe(struct device *dev,
-+ struct resource *mem, int irq)
-+{
-+ struct di_device *ddev;
-+ int retval;
-+
-+ ddev = kzalloc(sizeof(*ddev), GFP_KERNEL);
-+ if (!ddev) {
-+ drv_printk(KERN_ERR, "failed to allocate di_device\n");
-+ return -ENOMEM;
-+ }
-+ dev_set_drvdata(dev, ddev);
-+ ddev->dev = dev;
-+
-+ retval = di_init(ddev, mem, irq);
-+ if (retval) {
-+ dev_set_drvdata(dev, NULL);
-+ kfree(ddev);
-+ }
-+ return retval;
-+}
-+
-+static int di_do_remove(struct device *dev)
-+{
-+ struct di_device *ddev = dev_get_drvdata(dev);
-+
-+ if (ddev) {
-+ di_exit(ddev);
-+ dev_set_drvdata(dev, NULL);
-+ kfree(ddev);
-+ return 0;
-+ }
-+ return -ENODEV;
-+}
-+
-+static int di_do_shutdown(struct device *dev)
-+{
-+ struct di_device *ddev = dev_get_drvdata(dev);
-+
-+ if (ddev)
-+ di_quiesce(ddev);
-+ return 0;
-+}
-+
-+/*
-+ * OF platform driver hooks.
-+ *
-+ */
-+
-+static int __init di_of_probe(struct of_device *odev,
-+ const struct of_device_id *match)
-+{
-+ struct resource res;
-+ int retval;
-+
-+ retval = of_address_to_resource(odev->node, 0, &res);
-+ if (retval) {
-+ drv_printk(KERN_ERR, "no io memory range found\n");
-+ return -ENODEV;
-+ }
-+
-+ return di_do_probe(&odev->dev,
-+ &res, irq_of_parse_and_map(odev->node, 0));
-+}
-+
-+static int __exit di_of_remove(struct of_device *odev)
-+{
-+ return di_do_remove(&odev->dev);
-+}
-+
-+static int di_of_shutdown(struct of_device *odev)
-+{
-+ return di_do_shutdown(&odev->dev);
-+}
-+
-+
-+static struct of_device_id di_of_match[] = {
-+ { .compatible = "nintendo,flipper-disk" },
-+ { },
-+};
-+
-+MODULE_DEVICE_TABLE(of, di_of_match);
-+
-+static struct of_platform_driver di_of_driver = {
-+ .owner = THIS_MODULE,
-+ .name = DRV_MODULE_NAME,
-+ .match_table = di_of_match,
-+ .probe = di_of_probe,
-+ .remove = di_of_remove,
-+ .shutdown = di_of_shutdown,
-+};
-+
-+/*
-+ * Module interface hooks.
-+ *
-+ */
-+
-+static int __init di_init_module(void)
-+{
-+ drv_printk(KERN_INFO, "%s - version %s\n", DRV_DESCRIPTION,
-+ di_driver_version);
-+
-+ return of_register_platform_driver(&di_of_driver);
-+}
-+
-+static void __exit di_exit_module(void)
-+{
-+ of_unregister_platform_driver(&di_of_driver);
-+}
-+
-+module_init(di_init_module);
-+module_exit(di_exit_module);
-+
-+MODULE_AUTHOR(DRV_AUTHOR);
-+MODULE_DESCRIPTION(DRV_DESCRIPTION);
-+MODULE_LICENSE("GPL");
-diff --git a/drivers/block/gcn-dvd/Makefile b/drivers/block/gcn-dvd/Makefile
-new file mode 100644
-index 0000000..1f3ebca
---- /dev/null
-+++ b/drivers/block/gcn-dvd/Makefile
-@@ -0,0 +1,3 @@
-+obj-$(CONFIG_GAMECUBE_DVD) := gcn-dvd.o
-+
-+gcn-dvd-objs := main.o request.o
-diff --git a/drivers/block/gcn-dvd/main.c b/drivers/block/gcn-dvd/main.c
-new file mode 100644
-index 0000000..d07333e
---- /dev/null
-+++ b/drivers/block/gcn-dvd/main.c
-@@ -0,0 +1,810 @@
-+/*
-+ * drivers/block/gcn-dvd/main.c
-+ *
-+ * Nintendo GameCube DVD driver
-+ * Copyright (C) 2005 The GameCube Linux Team
-+ *
-+ * This program is free software; you can redistribute it and/or
-+ * modify it under the terms of the 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/major.h>
-+#include <linux/vmalloc.h>
-+#include <linux/init.h>
-+#include <linux/module.h>
-+#include <linux/moduleparam.h>
-+#include <linux/blkdev.h>
-+#include <linux/delay.h>
-+#include <linux/cdrom.h>
-+#include <linux/wait.h>
-+#include <asm/setup.h>
-+#include <asm/bitops.h>
-+#include <asm/pgtable.h>
-+#include <asm/cacheflush.h>
-+#include <asm/cache.h>
-+#include <linux/interrupt.h>
-+#include <linux/dma-mapping.h>
-+
-+#include <linux/fcntl.h> /* O_ACCMODE */
-+#include <linux/hdreg.h> /* HDIO_GETGEO */
-+
-+#include <asm/io.h>
-+
-+#include "request.h"
-+
-+#define DEVICE_NAME "DVD"
-+#define DVD_MAJOR 60
-+
-+#define LINUX_SECTOR_SIZE 512
-+#define LINUX_SECTOR_SHIFT 9
-+#define DVD_SECTOR_SIZE 2048
-+#define DVD_SECTOR_SHIFT 11
-+#define DVD_MAX_SECTORS 712880
-+
-+#define DMA_ALIGNMENT_MASK 0x1F
-+
-+#define DVD_REGISTER_INIT ((void* __iomem)0xCC003024)
-+
-+#define DVD_REGISTER_BLOCK_BASE 0xCC006000
-+#define DVD_REGISTER_BLOCK_LENGTH 0x40
-+
-+#define DVD_GAMECODE_U32 0x80000000 /* Gamecode */
-+#define DVD_COMPANY_U16 0x80000004 /* Game company id */
-+#define DVD_DISK_ID_U8 0x80000006 /* Disk id */
-+#define DVD_DISK_VERSION_U8 0x80000007 /* Disk version */
-+
-+#define DVD_IRQ 2
-+
-+/* DI Status Register */
-+#define DI_DISR ((void * __iomem)0xCC006000)
-+#define DI_DISR_BRKINT (1<<6)
-+#define DI_DISR_BRKINTMASK (1<<5)
-+#define DI_DISR_TCINT (1<<4)
-+#define DI_DISR_TCINTMASK (1<<3)
-+#define DI_DISR_DEINT (1<<2)
-+#define DI_DISR_DEINTMASK (1<<1)
-+#define DI_DISR_BRK (1<<0)
-+
-+/* DI Cover Register */
-+#define DI_DICVR ((void * __iomem)0xCC006004)
-+#define DI_DICVR_CVRINT (1<<2)
-+#define DI_DICVR_CVRINTMASK (1<<1)
-+#define DI_DICVR_CVR (1<<0)
-+
-+/* DI Command Buffer 0 */
-+#define DI_DICMDBUF0 ((void * __iomem)0xCC006008)
-+#define DI_DICMDBUF0_CMD 24
-+#define DI_DICMDBUF0_SUBCMD1 16
-+#define DI_DICMDBUF0_SUBCMD2 0
-+
-+/* DI Command Buffer 1 */
-+#define DI_DICMDBUF1 ((void * __iomem)0xCC00600C)
-+
-+/* DI Command Buffer 2 */
-+#define DI_DICMDBUF2 ((void * __iomem)0xCC006010)
-+
-+/* DMA Memory Address Register */
-+#define DI_DIMAR ((void * __iomem)0xCC006014)
-+
-+/* DI DMA Transfer Length Register */
-+#define DI_DILENGTH ((void * __iomem)0xCC006018)
-+
-+/* DI Control Register */
-+#define DI_DICR ((void * __iomem)0xCC00601C)
-+#define DI_DICR_RW (1<<2)
-+#define DI_DICR_DMA (1<<1)
-+#define DI_DICR_TSTART (1<<0)
-+
-+/* DI Immediate Data Buffer */
-+#define DI_DIIMMBUF ((void * __iomem)0xCC006020)
-+
-+#define DI_CMD_REZERO 0x01
-+#define DI_CMD_INQUIRY 0x12
-+#define DI_CMD_READ 0xA8
-+#define DI_CMD_SEEK 0xAB
-+#define DI_CMD_READTOC 0x43
-+#define DI_CMD_STOP 0xE3
-+/* This is a fake command, don't send to the hardware */
-+#define DI_CMD_INITIALIZE 0xFF
-+
-+#define IS_CMD_TYPE(cmd,type) (((cmd) >> DI_DICMDBUF0_CMD) == (type))
-+
-+static struct gendisk *dvd_gendisk;
-+static struct request_queue *dvd_queue;
-+static spinlock_t dvd_queue_lock = SPIN_LOCK_UNLOCKED;
-+static struct _taginterrupt_queue
-+{
-+ spinlock_t lock;
-+ int drive_initialized;
-+ struct list_head queue;
-+} interrupt_queue;
-+
-+static struct _tagdvdinfo {
-+ spinlock_t lock;
-+ unsigned long refCount;
-+ unsigned int media_changed;
-+ unsigned long numDVDSectors;
-+ unsigned long numLinuxSectors;
-+
-+ /* disc info */
-+ struct _tagdvdid
-+ {
-+ u32 gamecode;
-+ u16 company;
-+ u8 id;
-+ u8 version;
-+ } disc;
-+} dvd_info;
-+
-+#define LOCK(flags) spin_lock_irqsave(&dvd_info.lock,flags)
-+#define UNLOCK(flags) spin_unlock_irqrestore(&dvd_info.lock,flags)
-+
-+/* Must be 0x20 in size = 32 bytes */
-+#pragma pack(1)
-+
-+struct gc_dvd_drive_info
-+{
-+ u32 head;
-+ u32 middle;
-+ u32 last;
-+ u8 padding[20];
-+};
-+
-+struct gc_dvd_disc_info
-+{
-+ u16 revision;
-+ u16 device_code;
-+ u32 release_date;
-+ u8 padding[24];
-+};
-+
-+#pragma pack()
-+
-+struct dma_buffer
-+{
-+ size_t size;
-+ void *ptr;
-+ void *alignedPtr;
-+ dma_addr_t handle;
-+};
-+
-+#ifdef DEBUG
-+#define DPRINTK(fmt,args...) printk(KERN_INFO "%s (%u): " fmt,__FUNCTION__,__LINE__,## args)
-+#else
-+#define DPRINTK(fmt,args...)
-+#endif
-+
-+static int alloc_dma_buffer(size_t size,struct dma_buffer *pRet)
-+{
-+ /* allocate space for the aligned memory */
-+ pRet->size = DMA_ALIGNMENT_MASK + size;
-+ if (!(pRet->ptr = kmalloc(pRet->size,GFP_KERNEL | GFP_DMA))) {
-+ DPRINTK("Cannot allocate DMA memory of size %i\n",pRet->size);
-+ return -ENOMEM;
-+ }
-+
-+ /* align the pointer */
-+ if ((unsigned long)pRet->ptr & DMA_ALIGNMENT_MASK) {
-+ pRet->alignedPtr = (void*)(((unsigned long)pRet->ptr + DMA_ALIGNMENT_MASK) & ~DMA_ALIGNMENT_MASK);
-+ /* adjust the size if not aligned */
-+ pRet->size -= (pRet->alignedPtr - pRet->ptr);
-+ }
-+ else {
-+ pRet->alignedPtr = pRet->ptr;
-+ }
-+ /* get the dma mapping */
-+ pRet->handle = virt_to_phys(pRet->alignedPtr);
-+ return 0;
-+}
-+
-+inline static void sync_dma_buffer(struct dma_buffer *pRet)
-+{
-+ __dma_sync(pRet->alignedPtr, pRet->size, DMA_FROM_DEVICE);
-+}
-+
-+inline static void free_dma_buffer(struct dma_buffer *pRet)
-+{
-+ kfree(pRet->ptr);
-+}
-+
-+/* hardware talk */
-+static void gc_dvd_enable_interrupts(int enable)
-+{
-+ unsigned long outval;
-+ /* enable main interrupts */
-+ if (enable) {
-+ outval = DI_DISR_BRKINT | DI_DISR_TCINT | DI_DISR_DEINT |
-+ DI_DISR_BRKINTMASK | DI_DISR_TCINTMASK | DI_DISR_DEINTMASK;
-+ }
-+ else {
-+ outval = DI_DISR_BRKINT | DI_DISR_TCINT | DI_DISR_DEINT;
-+ }
-+
-+ writel(outval,DI_DISR);
-+
-+ /* This enables cover interrupts */
-+ if (enable) {
-+ outval = DI_DICVR_CVRINT | DI_DICVR_CVRINTMASK;
-+ }
-+ else {
-+ outval = DI_DICVR_CVRINT;
-+ }
-+
-+ writel(outval,DI_DICVR);
-+}
-+
-+static void gc_dvd_execute_queue_command(struct gc_dvd_command *cmd)
-+{
-+ u32 val;
-+ /* if they're doing a read and the drive is not initialized */
-+ if (!interrupt_queue.drive_initialized &&
-+ IS_CMD_TYPE(cmd->r_DI_DICMDBUF0,DI_CMD_READ)) {
-+ /* insert an initialize queue item BEFORE this one */
-+ static struct gc_dvd_command init_cmd = {
-+ .r_DI_DICMDBUF0 = DI_CMD_INITIALIZE << DI_DICMDBUF0_CMD,
-+ .completion_routine = NULL,
-+ .param = NULL,
-+ };
-+
-+ /* insert before this item */
-+ list_add_tail(&init_cmd.list,&cmd->list);
-+ /* now execute the initialize routine */
-+ val = (readl(DVD_REGISTER_INIT) & ~4) | 1;
-+ writel(val,DVD_REGISTER_INIT);
-+ udelay(100);
-+ val |= (4 | 1);
-+ writel(val,DVD_REGISTER_INIT);
-+ udelay(100);
-+ /* it will return an interrupt when we're done, our
-+ queue item will pick it up */
-+ }
-+ else if (cmd) {
-+ writel(cmd->r_DI_DICMDBUF0,DI_DICMDBUF0);
-+ writel(cmd->r_DI_DICMDBUF1,DI_DICMDBUF1);
-+ writel(cmd->r_DI_DICMDBUF2,DI_DICMDBUF2);
-+ writel((unsigned long)cmd->r_DI_DIMAR,DI_DIMAR);
-+ writel(cmd->r_DI_DILENGTH,DI_DILENGTH);
-+ writel(cmd->r_DI_DICR,DI_DICR);
-+ }
-+}
-+
-+static int gc_dvd_queue_command(struct gc_dvd_command *cmd)
-+{
-+ unsigned long flags;
-+ int execute_immediately;
-+
-+ spin_lock_irqsave(&interrupt_queue.lock,flags);
-+
-+ cmd->int_status = is_still_running;
-+ /* add to the tail of the list */
-+ execute_immediately = list_empty(&interrupt_queue.queue);
-+
-+ list_add_tail(&cmd->list,&interrupt_queue.queue);
-+
-+ if (execute_immediately) {
-+ gc_dvd_execute_queue_command(cmd);
-+ }
-+ /* release lock so interrupt handler can get it */
-+ spin_unlock_irqrestore(&interrupt_queue.lock,flags);
-+ return 0;
-+}
-+
-+/* This function is called from an IRQ context, we just wake up the queue */
-+static void gc_dvd_queue_completion_wake_up(struct gc_dvd_command *cmd)
-+{
-+ wake_up_interruptible(((wait_queue_head_t*)cmd->param));
-+}
-+
-+static int gc_dvd_execute_blocking_command(unsigned int di_cmd,unsigned int sz,struct dma_buffer *buf)
-+{
-+ struct gc_dvd_command cmd;
-+ wait_queue_head_t wait_queue;
-+
-+ if ((sz > 0) && alloc_dma_buffer(sz,buf)) {
-+ return -ENOMEM;
-+ }
-+
-+ init_waitqueue_head(&wait_queue);
-+
-+ cmd.flags = 0;
-+ cmd.r_DI_DICMDBUF0 = di_cmd;
-+ cmd.r_DI_DICMDBUF1 = 0;
-+ cmd.r_DI_DICMDBUF2 = sz;
-+ cmd.r_DI_DIMAR = (sz > 0) ? (void*)buf->handle : NULL;
-+ cmd.r_DI_DILENGTH = sz;
-+ cmd.r_DI_DICR = DI_DICR_TSTART | ((sz > 0) ? DI_DICR_DMA : 0);
-+ cmd.completion_routine = gc_dvd_queue_completion_wake_up;
-+ cmd.param = &wait_queue;
-+
-+ gc_dvd_queue_command(&cmd);
-+ /* wait for it to finish */
-+ while (wait_event_interruptible(wait_queue,cmd.int_status !=
-+ is_still_running)) ;
-+
-+ return cmd.int_status;
-+}
-+
-+static inline void gc_dvd_stop_motor(void)
-+{
-+ gc_dvd_execute_blocking_command(DI_CMD_STOP << DI_DICMDBUF0_CMD,0,NULL);
-+}
-+
-+static int gc_dvd_inquiry(void)
-+{
-+
-+ /* get status on disk */
-+ struct dma_buffer buf;
-+ struct gc_dvd_drive_info *pdi;
-+ int is;
-+
-+ is = gc_dvd_execute_blocking_command(DI_CMD_INQUIRY << DI_DICMDBUF0_CMD,
-+ sizeof(struct gc_dvd_drive_info),
-+ &buf);
-+ if (is == -ENOMEM) {
-+ return is;
-+ }
-+ else if (is != is_transfer_complete) {
-+ printk(KERN_ERR "Gamecube DVD: error in inquiry cmd\n");
-+ is = -ENODEV;
-+ }
-+ else {
-+ sync_dma_buffer(&buf);
-+
-+ pdi = (struct gc_dvd_drive_info*)buf.alignedPtr;
-+ printk(KERN_INFO "Gamecube DVD: 0x%x, 0x%x,0x%x\n",pdi->head,pdi->middle,pdi->last);
-+
-+ is = 0;
-+ }
-+
-+ free_dma_buffer(&buf);
-+ return is;
-+}
-+
-+static int gc_dvd_read_toc(void)
-+{
-+ struct dma_buffer buf;
-+ struct gc_dvd_disc_info *pdi;
-+ int i;
-+
-+ i = gc_dvd_execute_blocking_command(DI_CMD_READ << DI_DICMDBUF0_CMD | 0x40,
-+ sizeof(struct gc_dvd_disc_info),
-+ &buf);
-+ if (i != is_transfer_complete) {
-+ dvd_info.numDVDSectors = 0;
-+
-+ if (i != -ENOMEM) {
-+ free_dma_buffer(&buf);
-+ }
-+ else {
-+ i = -ENOMEDIUM;
-+ }
-+
-+ printk(KERN_ERR "Gamecube DVD: error reading TOC - missing medium?\n");
-+ }
-+ else {
-+ sync_dma_buffer(&buf);
-+
-+ pdi = (struct gc_dvd_disc_info*)buf.alignedPtr;
-+ printk(KERN_INFO "Gamecube DVD: revision: %u, device_code %u, release_date: %u\n",pdi->revision,pdi->device_code,pdi->release_date);
-+
-+ dvd_info.numDVDSectors = DVD_MAX_SECTORS;
-+ /* reset media_changed flag */
-+ dvd_info.media_changed = 0;
-+
-+ free_dma_buffer(&buf);
-+
-+ i = 0;
-+ }
-+ /* inform the kernel of the size */
-+ dvd_info.numLinuxSectors = dvd_info.numDVDSectors << (DVD_SECTOR_SHIFT - LINUX_SECTOR_SHIFT);
-+ set_capacity(dvd_gendisk,dvd_info.numLinuxSectors);
-+ return i;
-+}
-+
-+/* Handlers */
-+static int gc_dvd_revalidate(struct gendisk *disk)
-+{
-+ gc_dvd_read_toc();
-+ return 0;
-+}
-+
-+static int gc_dvd_open(struct inode *inode,struct file *filp)
-+{
-+ unsigned long flags;
-+ /* we are read only */
-+ if (filp->f_mode & FMODE_WRITE) {
-+ return -EROFS;
-+ }
-+
-+ /* check the disc, only allow minor of 0 to be opened */
-+ if (iminor(inode)) {
-+ return -ENODEV;
-+ }
-+
-+ /* update information about the disc */
-+ LOCK(flags);
-+ if (dvd_info.refCount > 0) {
-+ /* we only let one at a time */
-+ UNLOCK(flags);
-+ return -EBUSY;
-+ }
-+ else {
-+ check_disk_change(inode->i_bdev);
-+ /* revalidate should be called if necessary, check results here */
-+ if (dvd_info.numDVDSectors == 0) {
-+ UNLOCK(flags);
-+ return -ENOMEDIUM;
-+ }
-+ }
-+ dvd_info.refCount++;
-+ UNLOCK(flags);
-+ return 0;
-+}
-+static int gc_dvd_release(struct inode *inode,struct file *filp)
-+{
-+ unsigned long flags;
-+
-+ gc_dvd_stop_motor();
-+
-+ LOCK(flags);
-+ dvd_info.refCount--;
-+ /* force a media change so we re-read the toc and initialize the disc */
-+ dvd_info.media_changed = 1;
-+ UNLOCK(flags);
-+ return 0;
-+}
-+
-+static int gc_dvd_ioctl(struct inode *inode,struct file *filp,
-+ unsigned int cmd,unsigned long arg)
-+{
-+ switch (cmd)
-+ {
-+ case CDROMMULTISESSION:
-+ /* struct cdrom_multisession */
-+ break;
-+
-+ case CDROMSTART:
-+ break;
-+
-+ case CDROMSTOP:
-+ break;
-+
-+ case CDROMREADTOCHDR:
-+ /* struct cdrom_tochdr */
-+ break;
-+
-+ case CDROMREADTOCENTRY:
-+ /* struct cdrom_tocentry */
-+ break;
-+
-+ case CDROMREADMODE2:
-+ case CDROMREADMODE1:
-+ case CDROMREADRAW:
-+ /* struct cdrom_read (1-2048, 2-2336,RAW-2352) */
-+ break;
-+
-+ case CDROM_GET_MCN:
-+ /* retrieve the universal product code */
-+ /* struct cdrom_mcn */
-+ break;
-+
-+ case CDROMRESET:
-+ /* reset the drive */
-+ break;
-+
-+ case BLKRAGET:
-+ case BLKFRAGET:
-+ case BLKROGET:
-+ case BLKBSZGET:
-+ case BLKSSZGET:
-+ case BLKSECTGET:
-+ case BLKGETSIZE:
-+ case BLKGETSIZE64:
-+ case BLKFLSBUF:
-+ return ioctl_by_bdev(inode->i_bdev,cmd,arg);
-+ default:
-+ return -ENOTTY;
-+ }
-+ return -ENOTTY;
-+}
-+
-+static int gc_dvd_media_changed(struct gendisk *disk)
-+{
-+ /* return 1 if the disc has changed */
-+ return (dvd_info.media_changed ? 1 : 0);
-+}
-+
-+static void gc_dvd_read_request_callback(struct gc_dvd_command *cmd)
-+{
-+ unsigned long flags;
-+ struct request *req = (struct request*)cmd->param;
-+ struct request_queue *rqueue = req->q;
-+ int status;
-+
-+ /* since this was performed via DMA, invalidate the cache */
-+ if (cmd->int_status == is_transfer_complete) {
-+ __dma_sync(req->buffer, cmd->r_DI_DILENGTH, DMA_FROM_DEVICE);
-+ }
-+ /* free this item so another request can get it */
-+ gc_dvd_request_release_data(cmd);
-+ /* now end the request and send back to block layer */
-+ spin_lock_irqsave(rqueue->queue_lock,flags);
-+ status = is_transfer_complete;
-+ if (!end_that_request_first(req,
-+ status, req->current_nr_sectors)) {
-+ add_disk_randomness(req->rq_disk);
-+ end_that_request_last(req, status);
-+ }
-+ /* start queue back up */
-+ blk_start_queue(rqueue);
-+ spin_unlock_irqrestore(rqueue->queue_lock,flags);
-+}
-+
-+static void gc_dvd_do_request(request_queue_t *q)
-+{
-+ struct request *req;
-+ unsigned long start;
-+ unsigned long len;
-+ struct gc_dvd_command *cmd;
-+
-+ while ((req = elv_next_request(q))) {
-+ /* check if they are reading beyond the limits */
-+ if ((req->sector + req->current_nr_sectors) > dvd_info.numLinuxSectors) {
-+ printk(KERN_ERR "Gamecube DVD: reading past end\n");
-+ end_request(req,0);
-+ }
-+ else if (rq_data_dir(req) == WRITE) {
-+ printk(KERN_ERR "Gamecube DVD: write attempted\n");
-+ end_request(req,0);
-+ }
-+ else if (dvd_info.media_changed) {
-+ DPRINTK("media changed in read routine, aborting\n");
-+ end_request(req,0);
-+ }
-+ else if (req->current_nr_sectors >= (1 << (DVD_SECTOR_SHIFT - LINUX_SECTOR_SHIFT))) {
-+ /* now schedule the read */
-+ if (gc_dvd_request_get_data(&cmd) || !cmd) {
-+ /* we're full, stop the queue */
-+ blk_stop_queue(q);
-+ return;
-+ }
-+ else {
-+ /* remove item from the queue */
-+ blkdev_dequeue_request(req);
-+
-+ /* setup my structure */
-+ start = req->sector << LINUX_SECTOR_SHIFT;
-+ len = req->current_nr_sectors << LINUX_SECTOR_SHIFT;
-+
-+ cmd->flags = 0;
-+ cmd->r_DI_DICMDBUF0 = DI_CMD_READ << DI_DICMDBUF0_CMD;
-+ cmd->r_DI_DICMDBUF1 = start >> (DVD_SECTOR_SHIFT - LINUX_SECTOR_SHIFT);
-+ cmd->r_DI_DICMDBUF2 = len;
-+ cmd->r_DI_DIMAR = (void*)virt_to_phys(req->buffer);
-+ cmd->r_DI_DILENGTH = len;
-+ cmd->r_DI_DICR = DI_DICR_TSTART | DI_DICR_DMA;
-+ cmd->completion_routine = gc_dvd_read_request_callback;
-+ cmd->param = req;
-+ gc_dvd_queue_command(cmd);
-+ }
-+ }
-+ }
-+}
-+
-+static struct block_device_operations dvd_fops =
-+{
-+ .owner = THIS_MODULE,
-+ .open = gc_dvd_open,
-+ .release = gc_dvd_release,
-+ .revalidate_disk = gc_dvd_revalidate,
-+ .media_changed = gc_dvd_media_changed,
-+ .ioctl = gc_dvd_ioctl,
-+};
-+
-+static irqreturn_t gc_dvd_irq_handler(int irq,void *dev_id,struct pt_regs *regs)
-+{
-+ unsigned int reason;
-+ unsigned long flags;
-+ struct gc_dvd_command *cur_item;
-+#define REASON_FLAG_COVER 0x80000000
-+ /* try the main status */
-+ if ((reason=readl(DI_DISR)) & (DI_DISR_BRKINT | DI_DISR_TCINT | DI_DISR_DEINT)) {
-+ /* acknowledge the interrupt */
-+ writel(reason | DI_DISR_BRKINT | DI_DISR_TCINT | DI_DISR_DEINT,DI_DISR);
-+ }
-+ else if ((reason=readl(DI_DICVR)) & (DI_DICVR_CVRINT)) {
-+ /* acknowlegde the interrupt */
-+ writel(reason | DI_DICVR_CVRINT,DI_DICVR);
-+ /* set media changed flag */
-+ if (!(reason & DI_DICVR_CVR)) {
-+ dvd_info.media_changed = 1;
-+ }
-+ /* set flag to be used later on */
-+ reason |= REASON_FLAG_COVER;
-+ }
-+ else {
-+ /* not for us, get out of here */
-+ return IRQ_NONE;
-+ }
-+ /* ok we have an interrupt, now process our queue */
-+ /* lock our structure */
-+ spin_lock_irqsave(&interrupt_queue.lock,flags);
-+ /* now look at our structure and call appropriate callback if necessary */
-+ if (!list_empty(&interrupt_queue.queue)) {
-+ /* first unlink the queue item */
-+ cur_item = (struct gc_dvd_command*)interrupt_queue.queue.next;
-+ list_del(&cur_item->list);
-+ /* do special checks on the command type to keep track of drive state */
-+ if (IS_CMD_TYPE(cur_item->r_DI_DICMDBUF0,DI_CMD_STOP)) {
-+ interrupt_queue.drive_initialized = 0;
-+ }
-+ else if (IS_CMD_TYPE(cur_item->r_DI_DICMDBUF0,DI_CMD_INITIALIZE)) {
-+ interrupt_queue.drive_initialized = 1;
-+ }
-+ /* now execute the next request if we have one */
-+ if (!list_empty(&interrupt_queue.queue)) {
-+ gc_dvd_execute_queue_command((struct gc_dvd_command*)
-+ interrupt_queue.queue.next);
-+ }
-+ /* unlock the lock */
-+ spin_unlock_irqrestore(&interrupt_queue.lock,flags);
-+ /* determine the correct interrupt status */
-+ if (reason & REASON_FLAG_COVER) {
-+ if (reason & DI_DICVR_CVR) {
-+ cur_item->int_status = is_cover_opened;
-+ }
-+ else {
-+ cur_item->int_status = is_cover_closed;
-+ }
-+ }
-+ else if (reason & DI_DISR_TCINT) {
-+ cur_item->int_status = is_transfer_complete;
-+ }
-+ else if (reason & DI_DISR_DEINT) {
-+ cur_item->int_status = is_error;
-+ }
-+ else if (reason & DI_DISR_BRKINT) {
-+ cur_item->int_status = is_break;
-+ }
-+ /* call the callback */
-+ if (cur_item->completion_routine) {
-+ cur_item->completion_routine(cur_item);
-+ }
-+ }
-+ else {
-+ spin_unlock_irqrestore(&interrupt_queue.lock,flags);
-+ DPRINTK("Received interrupt but nothing was waiting for it\n");
-+ }
-+
-+ return IRQ_HANDLED;
-+}
-+
-+static int __init gc_dvd_init(void)
-+{
-+ int ret;
-+
-+ printk(KERN_INFO "Gamecube DVD driver: init\n");
-+
-+ /* initialize the refcount */
-+ memset(&dvd_info,0,sizeof(dvd_info));
-+ dvd_info.media_changed = 1;
-+
-+ /* initialize the interrupt_queue */
-+ spin_lock_init(&interrupt_queue.lock);
-+ interrupt_queue.drive_initialized = 0;
-+ INIT_LIST_HEAD(&interrupt_queue.queue);
-+
-+ spin_lock_init(&dvd_info.lock);
-+
-+ /* initial the request queue */
-+ gc_dvd_request_init();
-+ /* first reserve our memory region to we can query hardware */
-+ if (check_mem_region(DVD_REGISTER_BLOCK_BASE,DVD_REGISTER_BLOCK_LENGTH) ||
-+ !request_mem_region(DVD_REGISTER_BLOCK_BASE,DVD_REGISTER_BLOCK_LENGTH,"Gamecube DVD")) {
-+ printk(KERN_ERR "Couldn't reserve memory area for DVD\n");
-+ return -ENOMEM;
-+ }
-+
-+ if ((ret=request_irq(DVD_IRQ,gc_dvd_irq_handler,SA_INTERRUPT,"Gamecube DVD",0))) {
-+ printk(KERN_ERR "Unable to reserve DVD IRQ\n");
-+ goto delete_mem_region;
-+ }
-+
-+ /* enable interrupts */
-+ gc_dvd_enable_interrupts(1);
-+ /* query the drive first */
-+ if ((ret=gc_dvd_inquiry())) {
-+ goto delete_irq;
-+ }
-+ /* now stop the dvd motor */
-+ gc_dvd_stop_motor();
-+
-+ if ((ret=register_blkdev(DVD_MAJOR,DEVICE_NAME))) {
-+ goto delete_irq;
-+ }
-+
-+ if (!(dvd_gendisk = alloc_disk(1))) {
-+ ret = -ENOMEM;
-+ goto unreg_blkdev;
-+ }
-+
-+ if (!(dvd_queue = blk_init_queue(gc_dvd_do_request,&dvd_queue_lock))) {
-+ ret = -ENOMEM;
-+ goto delete_gendisk;
-+ }
-+
-+ dvd_gendisk->major = DVD_MAJOR;
-+ dvd_gendisk->first_minor = 0;
-+ dvd_gendisk->fops = &dvd_fops;
-+ strcpy(dvd_gendisk->disk_name,"dvd");
-+
-+ dvd_gendisk->queue = dvd_queue;
-+
-+ /* ok now setup the desired parameters, like block size, hardsect size,
-+ max hardware sectors to read at once, read ahead, etc */
-+ /* Hardware sector size */
-+ blk_queue_hardsect_size(dvd_queue,DVD_SECTOR_SIZE);
-+ /* Maximum sectors that can be read per request, hardware limit */
-+ blk_queue_max_phys_segments(dvd_queue,1);
-+ blk_queue_max_hw_segments(dvd_queue,1);
-+ /* Max size of coalesced segment */
-+ /* blk_queue_max_segment_size(dvd_queue,size); */
-+ /* Set the dma alignment */
-+ blk_queue_dma_alignment(dvd_queue,DMA_ALIGNMENT_MASK);
-+
-+ set_disk_ro(dvd_gendisk,1);
-+ add_disk(dvd_gendisk);
-+
-+ return 0;
-+
-+ delete_gendisk:
-+ del_gendisk(dvd_gendisk);
-+ put_disk(dvd_gendisk);
-+ dvd_gendisk = NULL;
-+ unreg_blkdev:
-+ unregister_blkdev(DVD_MAJOR,DEVICE_NAME);
-+ delete_irq:
-+ free_irq(DVD_IRQ,0);
-+ delete_mem_region:
-+ release_mem_region(DVD_REGISTER_BLOCK_BASE,DVD_REGISTER_BLOCK_LENGTH);
-+ return ret;
-+}
-+
-+static void __exit gc_dvd_exit(void)
-+{
-+ printk(KERN_INFO "Gamecube DVD driver: exit\n");
-+
-+ /* TODO send a break/interrupt to the device */
-+ gc_dvd_stop_motor();
-+ gc_dvd_enable_interrupts(0);
-+
-+ free_irq(DVD_IRQ, 0);
-+
-+ release_mem_region(DVD_REGISTER_BLOCK_BASE,DVD_REGISTER_BLOCK_LENGTH);
-+
-+ blk_unregister_region(MKDEV(DVD_MAJOR,0),256);
-+ unregister_blkdev(DVD_MAJOR,DEVICE_NAME);
-+
-+ if (dvd_gendisk) {
-+ del_gendisk(dvd_gendisk);
-+ put_disk(dvd_gendisk);
-+
-+ dvd_gendisk = NULL;
-+ }
-+
-+ if (dvd_queue) {
-+ blk_cleanup_queue(dvd_queue);
-+
-+ dvd_queue = NULL;
-+ }
-+}
-+
-+MODULE_AUTHOR("Scream|CT");
-+MODULE_DESCRIPTION("Gamecube DVD driver");
-+MODULE_LICENSE("GPL");
-+
-+module_init(gc_dvd_init);
-+module_exit(gc_dvd_exit);
-diff --git a/drivers/block/gcn-dvd/request.c b/drivers/block/gcn-dvd/request.c
-new file mode 100644
-index 0000000..19203e3
---- /dev/null
-+++ b/drivers/block/gcn-dvd/request.c
-@@ -0,0 +1,70 @@
-+/*
-+ * drivers/block/gcn-dvd/request.c
-+ *
-+ * Nintendo GameCube DVD driver
-+ * Copyright (C) 2005 The GameCube Linux Team
-+ *
-+ * This program is free software; you can redistribute it and/or
-+ * modify it under the terms of the 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/types.h>
-+#include <linux/errno.h>
-+#include <linux/list.h>
-+#include <linux/spinlock.h>
-+#include "request.h"
-+
-+struct data_item
-+{
-+ struct list_head list;
-+ struct gc_dvd_command data;
-+};
-+
-+// define array of data items
-+static struct data_item data[MAX_ITEMS];
-+static spinlock_t lock;
-+static struct list_head lfree;
-+
-+void gc_dvd_request_init(void)
-+{
-+ int i;
-+
-+ INIT_LIST_HEAD(&lfree);
-+ spin_lock_init(&lock);
-+
-+ for (i=0;i<MAX_ITEMS;++i) {
-+ list_add_tail(&data[i].list,&lfree);
-+ }
-+}
-+
-+int gc_dvd_request_get_data(struct gc_dvd_command **ppcmd)
-+{
-+ unsigned long flags;
-+ struct data_item *pdi;
-+ // get the first object and remove from the free list
-+ spin_lock_irqsave(&lock,flags);
-+ if (list_empty(&lfree)) {
-+ spin_unlock_irqrestore(&lock,flags);
-+ return -ENOMEM;
-+ }
-+ pdi = (struct data_item*)lfree.next;
-+ list_del(&pdi->list);
-+ spin_unlock_irqrestore(&lock,flags);
-+ // return it
-+ *ppcmd = &pdi->data;
-+ return 0;
-+}
-+
-+void gc_dvd_request_release_data(struct gc_dvd_command *pcmd)
-+{
-+ unsigned long flags;
-+ struct data_item *pdi;
-+ /* return the item */
-+ spin_lock_irqsave(&lock,flags);
-+ pdi = (struct data_item*)((u8*)pcmd - sizeof(struct list_head));
-+ list_add_tail(&pdi->list,&lfree);
-+ spin_unlock_irqrestore(&lock,flags);
-+}
-diff --git a/drivers/block/gcn-dvd/request.h b/drivers/block/gcn-dvd/request.h
-new file mode 100644
-index 0000000..f0fdd0b
---- /dev/null
-+++ b/drivers/block/gcn-dvd/request.h
-@@ -0,0 +1,45 @@
-+/*
-+ * drivers/block/gcn-dvd/request.h
-+ *
-+ * Nintendo GameCube DVD driver
-+ * Copyright (C) 2005 The GameCube Linux Team
-+ *
-+ * This program is free software; you can redistribute it and/or
-+ * modify it under the terms of the 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 __request___
-+#define __request___
-+
-+#define MAX_ITEMS 8
-+
-+enum gc_dvd_interrupt_status { is_still_running,
-+ is_transfer_complete,
-+ is_error,
-+ is_break,
-+ is_cover_closed,
-+ is_cover_opened};
-+
-+struct gc_dvd_command
-+{
-+ struct list_head list;
-+ u32 flags;
-+ enum gc_dvd_interrupt_status int_status;
-+ u32 r_DI_DICMDBUF0;
-+ u32 r_DI_DICMDBUF1;
-+ u32 r_DI_DICMDBUF2;
-+ void *r_DI_DIMAR;
-+ u32 r_DI_DILENGTH;
-+ u32 r_DI_DICR;
-+ void *param;
-+ void (*completion_routine)(struct gc_dvd_command *cmd);
-+};
-+
-+void gc_dvd_request_init(void);
-+int gc_dvd_request_get_data(struct gc_dvd_command **ppcmd);
-+void gc_dvd_request_release_data(struct gc_dvd_command *pcmd);
-+
-+#endif
-diff --git a/drivers/block/gcn-memcard.c b/drivers/block/gcn-memcard.c
-new file mode 100644
-index 0000000..e14e614
---- /dev/null
-+++ b/drivers/block/gcn-memcard.c
-@@ -0,0 +1,569 @@
-+/*
-+ * drivers/block/gcn-memcard.c
-+ *
-+ * Nintendo GameCube Memory Card block driver
-+ * Copyright (C) 2004 The GameCube Linux Team
-+ *
-+ * Based on work from Torben Nielsen.
-+ *
-+ * This program is free software; you can redistribute it and/or
-+ * modify it under the terms of the GNU General Public License
-+ * as published by the Free Software Foundation; either version 2
-+ * of the License, or (at your option) any later version.
-+ *
-+ */
-+#define DEVICE_NAME "memcard"
-+
-+#include <linux/major.h>
-+#include <linux/vmalloc.h>
-+#include <linux/init.h>
-+#include <linux/module.h>
-+#include <linux/moduleparam.h>
-+#include <linux/blkdev.h>
-+#include <linux/delay.h>
-+#include <linux/interrupt.h>
-+#include <linux/fcntl.h> /* O_ACCMODE */
-+#include <linux/hdreg.h> /* HDIO_GETGEO */
-+
-+#include <linux/exi.h>
-+
-+#include <asm/setup.h>
-+#include <asm/bitops.h>
-+#include <asm/pgtable.h>
-+#include <asm/cacheflush.h>
-+
-+#define MEMCARD_MAX_UNITS 2
-+
-+static int major_num = 0;
-+module_param(major_num, int, 0);
-+
-+#define TRUE (1)
-+#define FALSE (0)
-+
-+static int curr_card_sector[MEMCARD_MAX_UNITS] = { -1, -1 };
-+static int card_sector_mask[MEMCARD_MAX_UNITS] = { 0, 0 };
-+static int current_device = -1;
-+static spinlock_t memcard_lock = SPIN_LOCK_UNLOCKED;
-+
-+
-+
-+static struct block_device_operations memcard_fops;
-+static struct gendisk *memcard_gendisk[MEMCARD_MAX_UNITS];
-+
-+static unsigned char *card_sector_buffer[MEMCARD_MAX_UNITS];
-+
-+#define MEMCARD_READ 1
-+#define MEMCARD_WRITE 0
-+#define ALLOW_WRITE
-+#define CARD_SECTOR_SIZE 0x2000
-+
-+/*#define CARD_DBG printk*/
-+#define CARD_DBG(format, arg...); { }
-+
-+/* MemCard commands originally by Costis */
-+
-+
-+#define CARD_FILENAME 32
-+#define CARD_MAXFILES 127
-+#define CARD_MAXICONS 8
-+#define CARD_READSIZE 512
-+#define CARD_SECTORSIZE 8192
-+#define CARD_SLOTA 0
-+#define CARD_SLOTB 1
-+#define CARD_SYSAREA 5
-+#define CARD_WRITESIZE 128
-+
-+
-+#define EXI_CONTROL_TYPE_READ 0
-+#define EXI_CONTROL_TYPE_WRITE 1
-+#define EXI_STATUS0 *(unsigned long*)0xCC006800
-+
-+#define EXI_DMABUF0 *(unsigned long*)0xCC006804
-+#define EXI_DMALEN0 *(unsigned long*)0xCC006808
-+#define EXI_DMACNT0 *(unsigned long*)0xCC00680C
-+
-+#define EXI_CONTROL_DMA 2
-+#define EXI_CONTROL_ENABLE 1
-+
-+static int exi_probe(unsigned long channel)
-+{
-+ if (*(unsigned long *) (&EXI_STATUS0 + (channel * 5)) & 0x1000)
-+ return 1;
-+ else
-+ return 0;
-+}
-+
-+static unsigned long exi_retrieve_id(unsigned long channel,
-+ unsigned long device)
-+{
-+ unsigned long tID;
-+
-+ if (exi_probe(channel)) {
-+
-+ /* Select the specified EXI channel and device. */
-+ exi_select(channel, device, 0);
-+
-+ /* Send the EXI ID command (0x0000) */
-+ tID = 0;
-+ exi_write(channel, (unsigned char *) &tID, 2);
-+ /* Read the actual ID data (4 bytes) */
-+ exi_read(channel, (unsigned char *) &tID, 4);
-+ /* Deselect the selected EXI device. */
-+ exi_deselect(channel);
-+
-+ return tID;
-+ } else {
-+ return 0;
-+ }
-+}
-+
-+
-+/*
-+ Determines if a memcard is present in the given slot.
-+*/
-+
-+static int card_is_present(unsigned long channel)
-+{
-+
-+ unsigned long id;
-+
-+ id = exi_retrieve_id(channel, 0);
-+
-+ if (id & 0xffff0000 || id & 3)
-+ return 0;
-+
-+ return id;
-+}
-+
-+
-+/**
-+ Channel must be from 0 to 2.
-+ Buffer must be aligned to a 32-bit offset.
-+ Size must be a multiple of 32 bytes.
-+ Type must be either EXI_CONTROL_TYPE_READ or EXI_CONTROL_TYPE_WRITE.
-+*/
-+static void exi_dma(unsigned long channel, unsigned char *abuffer,
-+ unsigned long size, unsigned long type)
-+{
-+ /* EXI DMA Operation */
-+ *(unsigned long *) (&EXI_DMABUF0 + (channel * 5)) =
-+ (unsigned long) abuffer & 0x3FFFFE0;
-+ *(unsigned long *) (&EXI_DMALEN0 + (channel * 5)) =
-+ size & 0x3FFFFE0;
-+ *(unsigned long *) (&EXI_DMACNT0 + (channel * 5)) =
-+ EXI_CONTROL_ENABLE | EXI_CONTROL_DMA | (type << 2);
-+
-+ /* Wait until the EXI DMA operation has been completed. */
-+ while (*(volatile unsigned long *) (&EXI_DMACNT0 + channel * 5) &
-+ EXI_CONTROL_ENABLE);
-+
-+ return;
-+}
-+
-+
-+static unsigned char card_read_status(unsigned long channel)
-+{
-+ unsigned char cbuf[4];
-+
-+ /* Select the specified EXI channel and device. */
-+ exi_select(channel, 0, 4);
-+
-+ /* Send the EXI ID command (0x83xx) */
-+ cbuf[0] = 0x83; /* Command Byte */
-+ cbuf[1] = 0x00;
-+ exi_write(channel, cbuf, 2);
-+ /* Read the actual ID data (2 bytes) */
-+ exi_read(channel, cbuf, 1);
-+
-+ /* Deselect the selected EXI device. */
-+ exi_deselect(channel);
-+
-+ return cbuf[0];
-+}
-+
-+static void card_read_array(unsigned long channel, unsigned char *abuf,
-+ unsigned long address, unsigned long size)
-+{
-+ int i;
-+ unsigned char cbuf[4];
-+ unsigned char *bbuf = abuf;
-+
-+ for (i = 0; i < size / CARD_READSIZE; i++) {
-+
-+ /* Check if the card is ready */
-+ while (!(card_read_status(channel) & 1));
-+
-+ /* Select the specified EXI channel and device. */
-+ exi_select(channel, 0, 4);
-+
-+ /* Send the EXI Sector Read command (0x52xxxxxx) */
-+ cbuf[0] = 0x52; /* Command Byte */
-+ cbuf[1] = (address >> 17) & 0x3F;
-+ cbuf[2] = (address >> 9) & 0xFF;
-+ cbuf[3] = (address >> 7) & 3;
-+ exi_write(channel, cbuf, 4);
-+
-+ cbuf[0] = address & 0x7F;
-+ exi_write(channel, cbuf, 1);
-+
-+ cbuf[0] = 0;
-+ cbuf[1] = 0;
-+ cbuf[2] = 0;
-+ cbuf[3] = 0;
-+ exi_write(channel, cbuf, 4);
-+
-+ exi_dma(channel, bbuf, CARD_READSIZE,
-+ EXI_CONTROL_TYPE_READ);
-+
-+ /* Deselect the selected EXI device. */
-+ exi_deselect(channel);
-+
-+ address += CARD_READSIZE;
-+ bbuf += CARD_READSIZE;
-+ }
-+}
-+
-+static void card_sector_erase(unsigned long channel, unsigned long sector)
-+{
-+ unsigned char cbuf[3];
-+
-+ /* Check if the card is ready */
-+ while (!(card_read_status(channel) & 1));
-+
-+ /* Select the specified EXI channel and device. */
-+ exi_select(channel, 0, 4);
-+
-+ /* Send the EXI Sector Erase command (0xF1xxxx) */
-+ cbuf[0] = 0xF1; // Command Byte
-+ cbuf[1] = (sector >> 17) & 0x7F;
-+ cbuf[2] = (sector >> 9) & 0xFF;
-+ exi_write(channel, cbuf, 3);
-+
-+ /* Deselect the selected EXI device. */
-+ exi_deselect(channel);
-+
-+ /* Wait till the erase is finished */
-+ while (card_read_status(channel) & 0x8000);
-+}
-+
-+static void card_sector_program(unsigned long channel, unsigned char *abuf,
-+ unsigned long address, unsigned long size)
-+{
-+ int i;
-+ unsigned char cbuf[4];
-+ unsigned char *bbuf = abuf;
-+
-+ for (i = 0; i < size / CARD_WRITESIZE; i++) {
-+
-+ /* Check if the card is ready */
-+ while (!(card_read_status(channel) & 1));
-+
-+ /* Select the specified EXI channel and device. */
-+ exi_select(channel, 0, 4);
-+
-+ /* Send the EXI Sector Program command (0xF2xxxxxx) */
-+ cbuf[0] = 0xF2; /* Command Byte */
-+ cbuf[1] = (address >> 17) & 0x3F;
-+ cbuf[2] = (address >> 9) & 0xFF;
-+ cbuf[3] = (address >> 7) & 3;
-+ exi_write(channel, cbuf, 4);
-+
-+ cbuf[0] = address & 0x7F;
-+ exi_write(channel, cbuf, 1);
-+
-+ exi_dma(channel, bbuf, CARD_WRITESIZE,
-+ EXI_CONTROL_TYPE_WRITE);
-+
-+ /* Deselect the selected EXI device. */
-+ exi_deselect(channel);
-+
-+ /* Wait till the write is finished */
-+ while (card_read_status(channel) & 0x8000);
-+
-+ address += CARD_WRITESIZE;
-+ bbuf += CARD_WRITESIZE;
-+ }
-+}
-+
-+/**
-+ Block device handling
-+ */
-+
-+static int memcard_buffersize(int channel)
-+{
-+ return card_is_present(channel) << 17;
-+}
-+
-+static void card_flush(int channel)
-+{
-+ int i, mask;
-+ unsigned long start = curr_card_sector[channel] * CARD_SECTOR_SIZE;
-+ CARD_DBG("card_flush(%d)\n", channel);
-+ if (curr_card_sector[channel] == -1)
-+ return;
-+ CARD_DBG("Flush channel = %d mask = %x\n", channel,
-+ card_sector_mask[channel]);
-+ for (i = 0, mask = ~card_sector_mask[channel]; i < 16; i++) {
-+ if (mask & 1) {
-+ CARD_DBG("card_flush: read block %d\n", i);
-+ }
-+ }
-+ CARD_DBG("card_flush: writing out ch = %d, start = %08lx\n",
-+ channel, start);
-+ flush_dcache_range((unsigned long) card_sector_buffer[channel],
-+ (unsigned long) card_sector_buffer[channel] +
-+ CARD_SECTOR_SIZE);
-+
-+ card_sector_erase(channel, start);
-+ card_sector_program(channel, card_sector_buffer[channel], start,
-+ CARD_SECTOR_SIZE);
-+ card_sector_mask[channel] = 0;
-+ curr_card_sector[channel] = -1;
-+}
-+
-+static void do_memcard_request(request_queue_t * q)
-+{
-+ struct request *req;
-+ blk_stop_queue(q);
-+ spin_lock(&memcard_lock);
-+
-+ while ((req = elv_next_request(q)) != NULL) {
-+ unsigned long start = req->sector << 9;
-+ unsigned long len = req->current_nr_sectors << 9;
-+ int channel = req->rq_disk->first_minor;
-+
-+ if (start + len > memcard_buffersize(channel)) {
-+ printk(KERN_ERR DEVICE_NAME
-+ ": bad access: block=%lu, count=%u\n",
-+ (unsigned long) req->sector,
-+ req->current_nr_sectors);
-+ end_request(req, 0);
-+ continue;
-+ }
-+
-+ if (rq_data_dir(req) == READ) {
-+ CARD_DBG
-+ ("do_memcard_request: READ(%s,%lu,%lu), channel = %d\n",
-+ req->rq_disk->disk_name,
-+ (unsigned long) req->sector,
-+ (unsigned long) req->current_nr_sectors,
-+ channel);
-+
-+ card_flush(channel);
-+ flush_dcache_range((unsigned long) req->buffer,
-+ (unsigned long) req->buffer +
-+ len);
-+ card_read_array(channel, req->buffer, start, len);
-+ invalidate_dcache_range((unsigned long) req->
-+ buffer,
-+ (unsigned long) req->
-+ buffer + len);
-+
-+ } else {
-+ int i;
-+ CARD_DBG
-+ ("do_memcard_request: WRITE channel = %d\n",
-+ channel);
-+ for (i = 0; i < req->current_nr_sectors; i++) {
-+ int new_card_sector =
-+ (req->sector + i) >> 4;
-+ int card_sector_idx =
-+ (req->sector + i) & 0xf;
-+ if (new_card_sector !=
-+ curr_card_sector[channel]) {
-+ card_flush(channel);
-+ curr_card_sector[channel] =
-+ new_card_sector;
-+ }
-+ card_sector_mask[channel] |=
-+ 1 << card_sector_idx;
-+ CARD_DBG("update block %d, sector %d\n",
-+ card_sector_idx, new_card_sector);
-+ memcpy(card_sector_buffer[channel] +
-+ (card_sector_idx << 9),
-+ req->buffer + (i << 9), 1 << 9);
-+ if (card_sector_idx == 0xF)
-+ card_flush(channel);
-+ }
-+ }
-+
-+
-+ end_request(req, 1);
-+ }
-+
-+ spin_unlock(&memcard_lock);
-+ blk_start_queue(q);
-+
-+}
-+
-+
-+static int memcard_open(struct inode *inode, struct file *filp)
-+{
-+ CARD_DBG("MEMCARD Open device\n");
-+
-+ int device;
-+ int rc = -ENOMEM;
-+
-+ device = iminor(inode);
-+
-+ if (current_device != -1 && current_device != device) {
-+ rc = -EBUSY;
-+ goto err_out;
-+ }
-+
-+ if (memcard_buffersize(device) == 0) {
-+ rc = -ENODEV;
-+ goto err_out;
-+ }
-+
-+ return 0;
-+
-+ err_out:
-+ CARD_DBG("MEMCARD Open device Error %d\n", rc);
-+
-+ return rc;
-+
-+}
-+
-+static int memcard_ioctl(struct inode *inode, struct file *file,
-+ unsigned int cmd, unsigned long arg)
-+{
-+ CARD_DBG("MEMCARD IOCTL\n");
-+
-+ if (cmd == HDIO_GETGEO) {
-+ long size;
-+ struct hd_geometry geo;
-+ /*
-+ * get geometry: we have to fake one... trim the size to a
-+ * multiple of 1024 (0.5M): tell we have 32 sectors, 32 heads,
-+ * whatever cylinders.
-+ */
-+ size = memcard_buffersize(iminor(inode));
-+ geo.heads = 32;
-+ geo.sectors = 32;
-+ geo.start = 0;
-+ geo.cylinders = size / (geo.heads * geo.sectors);
-+
-+ if (copy_to_user((void *) arg, &geo, sizeof(geo)))
-+ return -EFAULT;
-+ return 0;
-+ }
-+
-+ return -EINVAL;
-+}
-+
-+static int memcard_release(struct inode *inode, struct file *filp)
-+{
-+ CARD_DBG("MEMCARD Close device\n");
-+ card_flush(iminor(inode));
-+ if (current_device == -1)
-+ return 0;
-+
-+ return 0;
-+}
-+
-+
-+static int memcard_revalidate(struct gendisk *disk)
-+{
-+ CARD_DBG("MEMCARD Revalidate\n");
-+ set_capacity(disk, memcard_buffersize(disk->first_minor) >> 9);
-+ return 0;
-+}
-+
-+static struct block_device_operations memcard_fops = {
-+ .owner = THIS_MODULE,
-+ .open = memcard_open,
-+ .release = memcard_release,
-+ .revalidate_disk = memcard_revalidate,
-+ .ioctl = memcard_ioctl,
-+};
-+
-+
-+static struct request_queue *memcard_queue[MEMCARD_MAX_UNITS];
-+
-+int __init memcard_init(void)
-+{
-+ int ret;
-+ int i;
-+
-+ CARD_DBG("MemCard Block Device Driver Init\n");
-+
-+ ret = -EBUSY;
-+ major_num = register_blkdev(major_num, DEVICE_NAME);
-+ if (major_num <= 0)
-+ goto err;
-+
-+ ret = -ENOMEM;
-+ for (i = 0; i < MEMCARD_MAX_UNITS; i++) {
-+ memcard_gendisk[i] = alloc_disk(1);
-+ if (!memcard_gendisk[i])
-+ goto out_disk;
-+ }
-+
-+ for (i = 0; i < MEMCARD_MAX_UNITS; i++) {
-+ memcard_queue[i] =
-+ blk_init_queue(do_memcard_request, &memcard_lock);
-+ if (!memcard_queue[i])
-+ goto out_queue;
-+ }
-+
-+ for (i = 0; i < MEMCARD_MAX_UNITS; i++) {
-+ memcard_gendisk[i]->major = major_num;
-+ memcard_gendisk[i]->first_minor = i;
-+ memcard_gendisk[i]->fops = &memcard_fops;
-+ sprintf(memcard_gendisk[i]->disk_name, "memcard%d", i);
-+ strcpy(memcard_gendisk[i]->devfs_name,
-+ memcard_gendisk[i]->disk_name);
-+
-+ memcard_gendisk[i]->queue = memcard_queue[i];
-+ set_capacity(memcard_gendisk[i],
-+ memcard_buffersize(i) >> 9);
-+
-+ add_disk(memcard_gendisk[i]);
-+ }
-+
-+ spin_lock_init(&memcard_lock);
-+
-+ for (i = 0; i < MEMCARD_MAX_UNITS; i++) {
-+ card_sector_buffer[i] = kmalloc(CARD_SECTOR_SIZE, GFP_KERNEL);
-+ }
-+
-+ return 0;
-+
-+ out_queue:
-+ for (i = 0; i < MEMCARD_MAX_UNITS; i++)
-+ put_disk(memcard_gendisk[i]);
-+ out_disk:
-+ unregister_blkdev(major_num, DEVICE_NAME);
-+ err:
-+ return ret;
-+}
-+
-+
-+void __exit memcard_cleanup(void)
-+{
-+ int i;
-+ blk_unregister_region(MKDEV(major_num, 0), 256);
-+ for (i = 0; i < MEMCARD_MAX_UNITS; i++) {
-+ del_gendisk(memcard_gendisk[i]);
-+ put_disk(memcard_gendisk[i]);
-+ }
-+
-+ if (unregister_blkdev(major_num, DEVICE_NAME) != 0)
-+ printk(KERN_ERR DEVICE_NAME
-+ ": unregister of device failed\n");
-+
-+ for (i = 0; i < MEMCARD_MAX_UNITS; i++) {
-+ blk_cleanup_queue(memcard_queue[i]);
-+ kfree(card_sector_buffer[i]);
-+ }
-+
-+
-+ CARD_DBG("Removed gc_memcard\n");
-+ return;
-+}
-+
-+MODULE_LICENSE("GPL");
-+MODULE_AUTHOR("Torben Nielsen");
-+module_init(memcard_init);
-+module_exit(memcard_cleanup);
-diff --git a/drivers/block/gcn-sd.c b/drivers/block/gcn-sd.c
-new file mode 100644
-index 0000000..be489bc
---- /dev/null
-+++ b/drivers/block/gcn-sd.c
-@@ -0,0 +1,1709 @@
-+/*
-+ * drivers/block/gcn-sd.c
-+ *
-+ * MMC/SD card block driver for the Nintendo GameCube/Wii
-+ * Copyright (C) 2004-2009 The GameCube Linux Team
-+ * Copyright (C) 2004,2005 Rob Reylink
-+ * Copyright (C) 2005 Todd Jeffreys
-+ * Copyright (C) 2005,2006,2007,2008,2009 Albert Herranz
-+ *
-+ * This program is free software; you can redistribute it and/or
-+ * modify it under the terms of the 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 is a block device driver for the Nintendo SD Card Adapter (DOL-019)
-+ * and compatible hardware.
-+ * The driver has been tested with SPI-enabled MMC cards and SD cards.
-+ *
-+ * The following table shows the device major and minors needed to access
-+ * MMC/SD cards:
-+ *
-+ * +------+-------------+-------+-------+
-+ * | Slot | Target | Major | Minor |
-+ * +======+=============+=======+=======+
-+ * | A | disk | 61 | 0 |
-+ * | A | partition 1 | 61 | 1 |
-+ * | A | partition 2 | 61 | 2 |
-+ * | A | partition 3 | 61 | 3 |
-+ * | A | partition 4 | 61 | 4 |
-+ * | A | partition 5 | 61 | 5 |
-+ * | A | partition 6 | 61 | 6 |
-+ * | A | partition 7 | 61 | 7 |
-+ * +------+-------------+-------+-------+
-+ * | B | disk | 61 | 8 |
-+ * | B | partition 1 | 61 | 9 |
-+ * | B | partition 2 | 61 | 10 |
-+ * | B | partition 3 | 61 | 11 |
-+ * | B | partition 4 | 61 | 12 |
-+ * | B | partition 5 | 61 | 13 |
-+ * | B | partition 6 | 61 | 14 |
-+ * | B | partition 7 | 61 | 15 |
-+ * +------+-------------+-------+-------+
-+ *
-+ * For example, run "mknod /dev/gcnsdb1 b 61 9" to create a device file
-+ * to access the 1st partition on the card inserted in memcard slot B.
-+ *
-+ */
-+
-+#define SD_DEBUG
-+
-+#include <linux/kernel.h>
-+#include <linux/module.h>
-+#include <linux/init.h>
-+#include <linux/delay.h>
-+#include <linux/kthread.h>
-+#include <linux/major.h>
-+#include <linux/blkdev.h>
-+#include <linux/hdreg.h>
-+#include <linux/crc-ccitt.h>
-+
-+/*
-+ * The existing Linux MMC layer does not support SPI operation yet.
-+ * Anyway, we try to recycle here some common code.
-+ */
-+#include <linux/mmc/host.h>
-+#include <linux/mmc/card.h>
-+#include <linux/mmc/mmc.h>
-+#include <linux/mmc/sd.h>
-+
-+#include <linux/exi.h>
-+
-+#define DRV_MODULE_NAME "gcn-sd"
-+#define DRV_DESCRIPTION "MMC/SD card block driver for the Nintendo GameCube/Wii"
-+#define DRV_AUTHOR "Rob Reylink, " \
-+ "Todd Jeffreys, " \
-+ "Albert Herranz"
-+
-+static char sd_driver_version[] = "4.1i";
-+
-+#define sd_printk(level, format, arg...) \
-+ printk(level DRV_MODULE_NAME ": " format , ## arg)
-+
-+#ifdef SD_DEBUG
-+# define DBG(fmt, args...) \
-+ printk(KERN_ERR "%s: " fmt, __func__ , ## args)
-+#else
-+# define DBG(fmt, args...)
-+#endif
-+
-+
-+/*
-+ *
-+ * EXI related definitions.
-+ */
-+#define SD_SLOTA_CHANNEL 0 /* EXI0xxx */
-+#define SD_SLOTA_DEVICE 0 /* chip select, EXI0CSB0 */
-+
-+#define SD_SLOTB_CHANNEL 1 /* EXI1xxx */
-+#define SD_SLOTB_DEVICE 0 /* chip select, EXI1CSB0 */
-+
-+#define SD_SPI_CLK 16000000
-+#define SD_SPI_CLK_IDX EXI_CLK_16MHZ
-+
-+
-+/*
-+ *
-+ * MMC/SD related definitions.
-+ */
-+
-+/* cycles in 8 clock units */
-+#define SD_IDLE_CYCLES 80
-+#define SD_FINISH_CYCLES 8
-+
-+/* several times in 8 clock units */
-+#define MMC_SPI_N_CR 8 /* card response time */
-+
-+/* data start and stop tokens */
-+#define MMC_SPI_TOKEN_START_SINGLE_BLOCK_READ 0xfe
-+#define MMC_SPI_TOKEN_START_MULTIPLE_BLOCK_READ 0xfe
-+#define MMC_SPI_TOKEN_START_SINGLE_BLOCK_WRITE 0xfe
-+#define MMC_SPI_TOKEN_START_MULTIPLE_BLOCK_WRITE 0xfc
-+#define MMC_SPI_TOKEN_STOP_MULTIPLE_BLOCK_WRITE 0xfd
-+
-+/* data response */
-+#define DR_SPI_MASK 0x1f
-+#define DR_SPI_DATA_ACCEPTED 0x05
-+#define DR_SPI_DATA_REJECTED_CRC_ERROR 0x0b
-+#define DR_SPI_DATA_REJECTED_WRITE_ERROR 0x0d
-+
-+/* this is still a missing command in the current MMC framework ... */
-+#define MMC_READ_OCR 58
-+
-+/*
-+ * OCR Bit positions to 10s of Vdd mV.
-+ */
-+static const unsigned short mmc_ocr_bit_to_vdd[] = {
-+ 150, 155, 160, 165, 170, 180, 190, 200,
-+ 210, 220, 230, 240, 250, 260, 270, 280,
-+ 290, 300, 310, 320, 330, 340, 350, 360
-+};
-+
-+static const unsigned int tran_exp[] = {
-+ 10000, 100000, 1000000, 10000000,
-+ 0, 0, 0, 0
-+};
-+
-+static const unsigned char tran_mant[] = {
-+ 0, 10, 12, 13, 15, 20, 25, 30,
-+ 35, 40, 45, 50, 55, 60, 70, 80,
-+};
-+
-+static const unsigned int tacc_exp[] = {
-+ 1, 10, 100, 1000, 10000, 100000, 1000000, 10000000,
-+};
-+
-+static const unsigned int tacc_mant[] = {
-+ 0, 10, 12, 13, 15, 20, 25, 30,
-+ 35, 40, 45, 50, 55, 60, 70, 80,
-+};
-+
-+/*
-+ *
-+ * Driver settings.
-+ */
-+#define MMC_SHIFT 3 /* 8 partitions */
-+
-+#define SD_MAJOR 61
-+#define SD_NAME "gcnsd"
-+
-+#define KERNEL_SECTOR_SHIFT 9
-+#define KERNEL_SECTOR_SIZE (1 << KERNEL_SECTOR_SHIFT) /*512 */
-+
-+enum {
-+ __SD_MEDIA_CHANGED = 0,
-+ __SD_BAD_CARD,
-+};
-+
-+
-+/*
-+ * Raw MMC/SD command.
-+ */
-+struct sd_command {
-+ u8 cmd;
-+ u32 arg;
-+ u8 crc;
-+} __attribute__ ((__packed__)); /* do not add padding, please */
-+
-+/*
-+ * MMC/SD host.
-+ *
-+ * We have one host for each memory card slot. And a host can only drive a
-+ * single card each time.
-+ */
-+struct sd_host {
-+ spinlock_t lock;
-+
-+ int refcnt;
-+ unsigned long flags;
-+#define SD_MEDIA_CHANGED (1<<__SD_MEDIA_CHANGED)
-+#define SD_BAD_CARD (1<<__SD_BAD_CARD)
-+
-+ /* card related info */
-+ struct mmc_card card;
-+
-+ /* timeouts in 8 clock cycles */
-+ unsigned long read_timeout;
-+ unsigned long write_timeout;
-+
-+ /* operations condition register */
-+ u32 ocr_avail; /* just 3.3V for the GameCube */
-+ u32 ocr;
-+
-+ /* last card response */
-+ u8 resp;
-+
-+ /* frequency */
-+ unsigned int clock;
-+ u8 exi_clock;
-+
-+ /* command buffer */
-+ struct sd_command cmd;
-+
-+ spinlock_t queue_lock;
-+ struct request_queue *queue;
-+
-+ struct gendisk *disk;
-+
-+ struct task_struct *io_thread;
-+ struct mutex io_mutex;
-+
-+ struct exi_device *exi_device;
-+};
-+
-+static void sd_kill(struct sd_host *host);
-+
-+
-+static void sd_card_set_bad(struct sd_host *host)
-+{
-+ set_bit(__SD_BAD_CARD, &host->flags);
-+}
-+
-+static int sd_card_is_bad(struct sd_host *host)
-+{
-+ return test_bit(__SD_BAD_CARD, &host->flags);
-+}
-+
-+/*
-+ *
-+ * MMC/SD data structures manipulation.
-+ */
-+
-+/*
-+ * FIXME: use a faster method (table)
-+ * (the in-kernel crc 16 (ccitt crc) tables seem not compatible with us)
-+ */
-+static u16 crc_xmodem_update(u16 crc, u8 data)
-+{
-+ int i;
-+
-+ crc = crc ^ ((u16) data << 8);
-+
-+ for (i = 0; i < 8; i++) {
-+ if (crc & 0x8000)
-+ crc = (crc << 1) ^ 0x1021;
-+ else
-+ crc <<= 1;
-+ }
-+
-+ return crc;
-+}
-+
-+#define UNSTUFF_BITS(resp, start, size) \
-+ ({ \
-+ const int __size = size; \
-+ const u32 __mask = (__size < 32 ? 1 << __size : 0) - 1; \
-+ const int __off = 3 - ((start) / 32); \
-+ const int __shft = (start) & 31; \
-+ u32 __res; \
-+ \
-+ __res = resp[__off] >> __shft; \
-+ if (__size + __shft > 32) \
-+ __res |= resp[__off-1] << ((32 - __shft) % 32); \
-+ __res & __mask; \
-+ })
-+
-+/*
-+ * Given the decoded CSD structure, decode the raw CID to our CID structure.
-+ */
-+static void mmc_decode_cid(struct mmc_card *card)
-+{
-+ u32 *resp = card->raw_cid;
-+
-+ memset(&card->cid, 0, sizeof(struct mmc_cid));
-+
-+ if (mmc_card_sd(card)) {
-+ card->cid.manfid = UNSTUFF_BITS(resp, 120, 8);
-+ card->cid.oemid = UNSTUFF_BITS(resp, 104, 16);
-+ card->cid.prod_name[0] = UNSTUFF_BITS(resp, 96, 8);
-+ card->cid.prod_name[1] = UNSTUFF_BITS(resp, 88, 8);
-+ card->cid.prod_name[2] = UNSTUFF_BITS(resp, 80, 8);
-+ card->cid.prod_name[3] = UNSTUFF_BITS(resp, 72, 8);
-+ card->cid.prod_name[4] = UNSTUFF_BITS(resp, 64, 8);
-+ card->cid.hwrev = UNSTUFF_BITS(resp, 60, 4);
-+ card->cid.fwrev = UNSTUFF_BITS(resp, 56, 4);
-+ card->cid.serial = UNSTUFF_BITS(resp, 24, 32);
-+ card->cid.year = UNSTUFF_BITS(resp, 12, 8);
-+ card->cid.month = UNSTUFF_BITS(resp, 8, 4);
-+ card->cid.year += 2000;
-+ } else {
-+ /*
-+ * The selection of the format here is guesswork based upon
-+ * information people have sent to date.
-+ */
-+ switch (card->csd.mmca_vsn) {
-+ case 0: /* MMC v1.0 - v1.2 */
-+ case 1: /* MMC v1.4 */
-+ card->cid.manfid = UNSTUFF_BITS(resp, 104, 24);
-+ card->cid.prod_name[0] = UNSTUFF_BITS(resp, 96, 8);
-+ card->cid.prod_name[1] = UNSTUFF_BITS(resp, 88, 8);
-+ card->cid.prod_name[2] = UNSTUFF_BITS(resp, 80, 8);
-+ card->cid.prod_name[3] = UNSTUFF_BITS(resp, 72, 8);
-+ card->cid.prod_name[4] = UNSTUFF_BITS(resp, 64, 8);
-+ card->cid.prod_name[5] = UNSTUFF_BITS(resp, 56, 8);
-+ card->cid.prod_name[6] = UNSTUFF_BITS(resp, 48, 8);
-+ card->cid.hwrev = UNSTUFF_BITS(resp, 44, 4);
-+ card->cid.fwrev = UNSTUFF_BITS(resp, 40, 4);
-+ card->cid.serial = UNSTUFF_BITS(resp, 16, 24);
-+ card->cid.month = UNSTUFF_BITS(resp, 12, 4);
-+ card->cid.year = UNSTUFF_BITS(resp, 8, 4);
-+ card->cid.year += 1997;
-+ break;
-+ case 2: /* MMC v2.0 - v2.2 */
-+ case 3: /* MMC v3.1 - v3.3 */
-+ card->cid.manfid = UNSTUFF_BITS(resp, 120, 8);
-+ card->cid.oemid = UNSTUFF_BITS(resp, 104, 16);
-+ card->cid.prod_name[0] = UNSTUFF_BITS(resp, 96, 8);
-+ card->cid.prod_name[1] = UNSTUFF_BITS(resp, 88, 8);
-+ card->cid.prod_name[2] = UNSTUFF_BITS(resp, 80, 8);
-+ card->cid.prod_name[3] = UNSTUFF_BITS(resp, 72, 8);
-+ card->cid.prod_name[4] = UNSTUFF_BITS(resp, 64, 8);
-+ card->cid.prod_name[5] = UNSTUFF_BITS(resp, 56, 8);
-+ card->cid.serial = UNSTUFF_BITS(resp, 16, 32);
-+ card->cid.month = UNSTUFF_BITS(resp, 12, 4);
-+ card->cid.year = UNSTUFF_BITS(resp, 8, 4);
-+ card->cid.year += 1997;
-+ break;
-+ default:
-+ sd_printk(KERN_ERR, "card has unknown MMCA"
-+ " version %d\n", card->csd.mmca_vsn);
-+ break;
-+ }
-+ }
-+}
-+
-+/*
-+ * Given a 128-bit response, decode to our card CSD structure.
-+ */
-+static void mmc_decode_csd(struct mmc_card *card)
-+{
-+ struct mmc_csd *csd = &card->csd;
-+ unsigned int e, m, csd_struct;
-+ u32 *resp = card->raw_csd;
-+
-+ /*
-+ * We only understand CSD structure v1.0, v1.1 and v2.
-+ * v2 has extra information in bits 15, 11 and 10.
-+ */
-+ csd_struct = UNSTUFF_BITS(resp, 126, 2);
-+ if (csd_struct != 0 && csd_struct != 1 && csd_struct != 2) {
-+ sd_printk(KERN_ERR, "unrecognised CSD structure"
-+ " version %d\n", csd_struct);
-+ return;
-+ }
-+
-+ csd->mmca_vsn = UNSTUFF_BITS(resp, 122, 4);
-+
-+ /* TAAC */
-+ m = UNSTUFF_BITS(resp, 115, 4);
-+ e = UNSTUFF_BITS(resp, 112, 3);
-+ csd->tacc_ns = (tacc_exp[e] * tacc_mant[m] + 9) / 10;
-+
-+ /* NSAC */
-+ csd->tacc_clks = UNSTUFF_BITS(resp, 104, 8) * 100;
-+
-+ /* TRAN_SPEED */
-+ m = UNSTUFF_BITS(resp, 99, 4);
-+ e = UNSTUFF_BITS(resp, 96, 3);
-+ csd->max_dtr = tran_exp[e] * tran_mant[m];
-+
-+ /* CCC */
-+ csd->cmdclass = UNSTUFF_BITS(resp, 84, 12);
-+
-+ /* READ_BL_LEN */
-+ csd->read_blkbits = UNSTUFF_BITS(resp, 80, 4);
-+
-+ /* C_SIZE */
-+ m = UNSTUFF_BITS(resp, 62, 12);
-+
-+ /* C_SIZE_MULT */
-+ e = UNSTUFF_BITS(resp, 47, 3);
-+
-+ csd->capacity = (1 + m) << (e + 2); /* in card blocks */
-+}
-+
-+#if 0
-+static void sd_print_cid(struct mmc_cid *cid)
-+{
-+ sd_printk(KERN_INFO,
-+ "manfid = %d\n"
-+ "oemid = %d\n"
-+ "prod_name = %s\n"
-+ "hwrev = %d\n"
-+ "fwrev = %d\n"
-+ "serial = %08x\n"
-+ "year = %d\n"
-+ "month = %d\n",
-+ cid->manfid,
-+ cid->oemid,
-+ cid->prod_name,
-+ cid->hwrev, cid->fwrev, cid->serial, cid->year, cid->month);
-+}
-+#endif
-+
-+/* */
-+static inline unsigned int ms_to_cycles(unsigned int ms, unsigned int clock)
-+{
-+ return ms * (clock / 1000);
-+}
-+
-+/* */
-+static unsigned int sd_set_clock(struct sd_host *host, unsigned int clock)
-+{
-+ if (clock >= 32000000) {
-+ host->clock = 32000000;
-+ host->exi_clock = EXI_CLK_32MHZ;
-+ } else if (clock >= 16000000) {
-+ host->clock = 16000000;
-+ host->exi_clock = EXI_CLK_16MHZ;
-+ } else if (clock >= 8000000) {
-+ host->clock = 8000000;
-+ host->exi_clock = EXI_CLK_8MHZ;
-+ } else if (clock >= 4000000) {
-+ host->clock = 4000000;
-+ host->exi_clock = EXI_CLK_4MHZ;
-+ } else if (clock >= 2000000) {
-+ host->clock = 2000000;
-+ host->exi_clock = EXI_CLK_2MHZ;
-+ } else {
-+ host->clock = 1000000;
-+ host->exi_clock = EXI_CLK_1MHZ;
-+ }
-+ return host->clock;
-+}
-+
-+/* */
-+static void sd_calc_timeouts(struct sd_host *host)
-+{
-+ /*
-+ * FIXME: calculate timeouts from card information
-+ * (use safe defaults for now)
-+ */
-+ host->read_timeout = ms_to_cycles(100, host->clock);
-+ host->write_timeout = ms_to_cycles(250, host->clock);
-+}
-+
-+/*
-+ *
-+ * SPI I/O support routines, including some handy SPI to EXI language
-+ * translations.
-+ */
-+
-+/* */
-+static inline void spi_cs_low(struct sd_host *host)
-+{
-+ exi_dev_take(host->exi_device);
-+ exi_dev_select(host->exi_device);
-+}
-+
-+/* */
-+static inline void spi_cs_high(struct sd_host *host)
-+{
-+ exi_dev_deselect(host->exi_device);
-+ exi_dev_give(host->exi_device);
-+}
-+
-+/* */
-+static inline void spi_write(struct sd_host *host, void *data, size_t len)
-+{
-+ exi_dev_write(host->exi_device, data, len);
-+}
-+
-+/* */
-+static inline void spi_read(struct sd_host *host, void *data, size_t len)
-+{
-+ /*
-+ * Houston, we have a problem.
-+ *
-+ * The EXI hardware implementation seems to use a shift register which
-+ * outputs data from the MSB to the MOSI line and inputs data from
-+ * the MISO line into the LSB.
-+ * When a read operation is performed, data from the MISO line
-+ * is entered into the shift register LSB as expected. But also the
-+ * data already present in the shift register is sent out through the
-+ * MOSI line from the MSB.
-+ * This is in fact the "feature" that enabled tmbinc to dump the IPL.
-+ *
-+ * When interfacing with SD cards, this causes us a serious problem.
-+ *
-+ * We are required to send all ones (1s) while reading data from
-+ * the SD card. Otherwise, the card can interpret the data sent as
-+ * commands (if they start with the bit pattern 01 for example).
-+ *
-+ * If we use the EXI immediate mode transfer, we can workaround the
-+ * situation by writing all 1s to the DATA register before reading
-+ * (this is indeed automatically done by the EXI layer).
-+ * But we simply can't do that when using EXI DMA transfers (these
-+ * kind of transfers do not allow bidirectional operation).
-+ *
-+ * Given that no EXI DMA read transfers seem reliable, we fallback
-+ * to the "interrupt-driven" immediate mode of the EXI layer.
-+ * This will help reducing CPU monopolization on large reads.
-+ *
-+ */
-+ exi_dev_transfer(host->exi_device, data, len, EXI_OP_READ, EXI_CMD_IDI);
-+}
-+
-+/* cycles are expressed in 8 clock cycles */
-+static void spi_burn_cycles(struct sd_host *host, int cycles)
-+{
-+ u8 d;
-+
-+ while (cycles-- > 0) {
-+ d = 0xff;
-+ spi_write(host, &d, sizeof(d));
-+ }
-+}
-+
-+/* cycles are expressed in 8 clock cycles */
-+static int spi_wait_for_resp(struct sd_host *host,
-+ u8 resp, u8 resp_mask, unsigned long cycles)
-+{
-+ u8 data;
-+
-+ while (cycles-- > 0) {
-+ spi_read(host, &data, sizeof(data));
-+ if ((data & resp_mask) == resp) {
-+ host->resp = data;
-+ return data;
-+ }
-+ }
-+ return -ENODATA;
-+}
-+
-+/*
-+ *
-+ */
-+static int sd_read_data(struct sd_host *host, void *data, size_t len, int token)
-+{
-+ int retval = 0;
-+
-+ if (token) {
-+ retval = spi_wait_for_resp(host, token, 0xff,
-+ host->read_timeout);
-+ if (retval < 0)
-+ goto out;
-+ }
-+ spi_read(host, data, len);
-+ retval = 0;
-+
-+out:
-+ return retval;
-+}
-+
-+/*
-+ *
-+ */
-+static int sd_write_data(struct sd_host *host, void *data, size_t len,
-+ int token)
-+{
-+ u16 crc;
-+ u8 t, *d;
-+ size_t l;
-+ int retval = 0;
-+
-+ /* FIXME, rewrite this a bit */
-+ {
-+ crc = 0;
-+ d = data;
-+ l = len;
-+
-+ while (l-- > 0)
-+ crc = crc_xmodem_update(crc, *d++);
-+ }
-+
-+ /* send the write block token */
-+ t = token;
-+ spi_write(host, &t, sizeof(t));
-+
-+ /* send the data */
-+ spi_write(host, data, len);
-+
-+ /* send the crc */
-+ spi_write(host, &crc, sizeof(crc));
-+
-+ /* get the card data response */
-+ retval = spi_wait_for_resp(host, 0x01, 0x11, host->write_timeout);
-+ if (retval < 0)
-+ goto out;
-+ if ((retval & DR_SPI_MASK) != DR_SPI_DATA_ACCEPTED) {
-+ DBG("data response=%02x\n", retval);
-+ retval = -EIO;
-+ goto out;
-+ }
-+
-+ /* wait for the busy signal to clear */
-+ retval = spi_wait_for_resp(host, 0xff, 0xff, host->write_timeout);
-+ if (retval < 0)
-+ goto out;
-+
-+ retval = 0;
-+
-+out:
-+ return retval;
-+}
-+
-+/*
-+ *
-+ * MMC/SD command transactions related routines.
-+ */
-+
-+/* */
-+static inline void sd_cmd(struct sd_command *cmd, u8 opcode, u32 arg)
-+{
-+ cmd->cmd = 0x40 | opcode;
-+ cmd->arg = arg;
-+ cmd->crc = 0x01; /* FIXME, crc is not currently used */
-+}
-+
-+/* */
-+static inline void sd_cmd_go_idle_state(struct sd_command *cmd)
-+{
-+ cmd->cmd = 0x40;
-+ cmd->arg = 0;
-+ cmd->crc = 0x95;
-+}
-+
-+/* */
-+static inline void sd_debug_print_cmd(struct sd_command *cmd)
-+{
-+ DBG("cmd = %d, arg = %08x, crc = %02x\n",
-+ cmd->cmd & ~0x40, cmd->arg, cmd->crc);
-+}
-+
-+/*
-+ *
-+ */
-+static int sd_start_command(struct sd_host *host, struct sd_command *cmd)
-+{
-+ int retval = 0;
-+
-+ /* select the card by driving CS low */
-+ spi_cs_low(host);
-+
-+ /* send the command through the MOSI line */
-+ spi_write(host, cmd, sizeof(*cmd));
-+
-+ /*
-+ * Wait for the card response.
-+ * Card responses come in the MISO line and have the most significant
-+ * bit cleared.
-+ */
-+ retval = spi_wait_for_resp(host, 0x00, 0x80, MMC_SPI_N_CR);
-+
-+ if (retval > 0 && !(retval & 0x01) && cmd->cmd != 0x40)
-+ DBG("command = %d, response = 0x%02x\n", cmd->cmd & ~0x40,
-+ retval);
-+
-+ return retval;
-+}
-+
-+/*
-+ *
-+ */
-+static void sd_end_command(struct sd_host *host)
-+{
-+ /* wait 8 clock cycles as dictated by the specification */
-+ spi_burn_cycles(host, SD_FINISH_CYCLES);
-+
-+ /* deselect the card by driving CS high */
-+ spi_cs_high(host);
-+}
-+
-+/*
-+ *
-+ */
-+static int sd_run_no_data_command(struct sd_host *host, struct sd_command *cmd)
-+{
-+ int retval;
-+
-+ /* send command, wait for response, and burn extra cycles */
-+ retval = sd_start_command(host, cmd);
-+ sd_end_command(host);
-+
-+ return retval;
-+}
-+
-+/*
-+ *
-+ */
-+static int sd_generic_read(struct sd_host *host,
-+ u8 opcode, u32 arg,
-+ void *data, size_t len, int token)
-+{
-+ struct sd_command *cmd = &host->cmd;
-+ u16 crc, calc_crc = 0xffff;
-+ u8 *d;
-+ size_t l;
-+ int retval;
-+
-+ /* build raw command */
-+ sd_cmd(cmd, opcode, arg);
-+
-+ /* select card, send command and wait for response */
-+ retval = sd_start_command(host, cmd);
-+ if (retval < 0)
-+ goto out;
-+ if (retval != 0x00) {
-+ retval = -EIO;
-+ goto out;
-+ }
-+
-+ /* wait for read token, then read data */
-+ retval = sd_read_data(host, data, len, token);
-+ if (retval < 0)
-+ goto out;
-+
-+ /* read trailing crc */
-+ spi_read(host, &crc, sizeof(crc));
-+
-+ retval = 0;
-+
-+ /* FIXME, rewrite this a bit */
-+ {
-+ calc_crc = 0;
-+ d = data;
-+ l = len;
-+
-+ while (l-- > 0)
-+ calc_crc = crc_xmodem_update(calc_crc, *d++);
-+
-+ if (calc_crc != crc)
-+ retval = -EIO;
-+ }
-+
-+out:
-+ /* burn extra cycles and deselect card */
-+ sd_end_command(host);
-+
-+ if (retval < 0) {
-+ DBG("read, offset=%d, len=%d\n", arg, len);
-+ DBG("crc=%04x, calc_crc=%04x, %s\n", crc, calc_crc,
-+ (retval < 0) ? "failed" : "ok");
-+ }
-+
-+ return retval;
-+}
-+
-+/*
-+ *
-+ */
-+static int sd_generic_write(struct sd_host *host,
-+ u8 opcode, u32 arg,
-+ void *data, size_t len, int token)
-+{
-+ struct sd_command *cmd = &host->cmd;
-+ int retval;
-+
-+ /* build raw command */
-+ sd_cmd(cmd, opcode, arg);
-+
-+ /* select card, send command and wait for response */
-+ retval = sd_start_command(host, cmd);
-+ if (retval < 0)
-+ goto out;
-+ if (retval != 0x00) {
-+ retval = -EIO;
-+ goto out;
-+ }
-+
-+ /* send data token, data and crc, get data response */
-+ retval = sd_write_data(host, data, len, token);
-+ if (retval < 0)
-+ goto out;
-+
-+ retval = 0;
-+
-+out:
-+ /* burn extra cycles and deselect card */
-+ sd_end_command(host);
-+
-+ if (retval < 0)
-+ DBG("write, offset=%d, len=%d\n", arg, len);
-+
-+ return retval;
-+}
-+
-+/*
-+ *
-+ */
-+static int sd_read_ocr(struct sd_host *host)
-+{
-+ struct sd_command *cmd = &host->cmd;
-+ int retval;
-+
-+ memset(&host->ocr, 0, sizeof(host->ocr));
-+
-+ sd_cmd(cmd, MMC_READ_OCR, 0);
-+
-+ /* select card, send command and wait for response */
-+ retval = sd_start_command(host, cmd);
-+ if (retval < 0)
-+ goto out;
-+
-+ /* the OCR contents come immediately after the card response */
-+ spi_read(host, &host->ocr, sizeof(host->ocr));
-+ retval = 0;
-+
-+out:
-+ /* burn extra cycles and deselect card */
-+ sd_end_command(host);
-+ return retval;
-+}
-+
-+/*
-+ *
-+ */
-+static inline int sd_read_csd(struct sd_host *host)
-+{
-+ memset(&host->card.raw_csd, 0, sizeof(host->card.raw_csd));
-+ return sd_generic_read(host, MMC_SEND_CSD, 0,
-+ &host->card.raw_csd,
-+ sizeof(host->card.raw_csd),
-+ MMC_SPI_TOKEN_START_SINGLE_BLOCK_READ);
-+}
-+
-+/*
-+ *
-+ */
-+static inline int sd_read_cid(struct sd_host *host)
-+{
-+ memset(&host->card.raw_cid, 0, sizeof(host->card.raw_cid));
-+ return sd_generic_read(host, MMC_SEND_CID, 0,
-+ &host->card.raw_cid,
-+ sizeof(host->card.raw_cid),
-+ MMC_SPI_TOKEN_START_SINGLE_BLOCK_READ);
-+}
-+
-+/*
-+ *
-+ */
-+static inline int sd_read_single_block(struct sd_host *host,
-+ unsigned long start,
-+ void *data, size_t len)
-+{
-+ int retval;
-+ int attempts = 3;
-+
-+ if (test_bit(__SD_MEDIA_CHANGED, &host->flags))
-+ attempts = 1;
-+
-+ while (attempts > 0) {
-+ retval = sd_generic_read(host, MMC_READ_SINGLE_BLOCK, start,
-+ data, len,
-+ MMC_SPI_TOKEN_START_SINGLE_BLOCK_READ);
-+ if (retval >= 0)
-+ break;
-+ attempts--;
-+ DBG("start=%lu, data=%p, len=%d, retval = %d\n", start, data,
-+ len, retval);
-+ }
-+ return retval;
-+}
-+
-+/*
-+ *
-+ */
-+static inline int sd_write_single_block(struct sd_host *host,
-+ unsigned long start,
-+ void *data, size_t len)
-+{
-+ int retval;
-+
-+ retval = sd_generic_write(host, MMC_WRITE_BLOCK, start,
-+ data, len,
-+ MMC_SPI_TOKEN_START_SINGLE_BLOCK_WRITE);
-+ if (retval < 0)
-+ DBG("start=%lu, data=%p, len=%d, retval = %d\n", start, data,
-+ len, retval);
-+
-+ return retval;
-+}
-+
-+/*
-+ *
-+ */
-+static int sd_reset_sequence(struct sd_host *host)
-+{
-+ struct sd_command *cmd = &host->cmd;
-+ u8 d;
-+ int i;
-+ int retval = 0;
-+
-+ host->card.state = 0;
-+
-+ /*
-+ * Wait at least 80 dummy clock cycles with the card deselected
-+ * and with the MOSI line continuously high.
-+ */
-+ exi_dev_take(host->exi_device);
-+ exi_dev_deselect(host->exi_device);
-+ for (i = 0; i < SD_IDLE_CYCLES; i++) {
-+ d = 0xff;
-+ exi_dev_write(host->exi_device, &d, sizeof(d));
-+ }
-+ exi_dev_give(host->exi_device);
-+
-+ /*
-+ * Send a CMD0, card must ack with "idle state" (0x01).
-+ * This puts the card into SPI mode and soft resets it.
-+ * CRC checking is disabled by default.
-+ */
-+ for (i = 0; i < 255; i++) {
-+ /* CMD0 */
-+ sd_cmd_go_idle_state(cmd);
-+ retval = sd_run_no_data_command(host, cmd);
-+ if (retval < 0) {
-+ retval = -ENODEV;
-+ goto out;
-+ }
-+ if (retval == R1_SPI_IDLE)
-+ break;
-+ }
-+ if (retval != R1_SPI_IDLE) {
-+ retval = -ENODEV;
-+ goto out;
-+ }
-+
-+ /*
-+ * Send a ACMD41 to activate card initialization process.
-+ * SD card must ack with "ok" (0x00).
-+ * MMC card will report "invalid command" (0x04).
-+ */
-+ for (i = 0; i < 0xffff; i++) {
-+ /* ACMD41 = CMD55 + CMD41 */
-+ sd_cmd(cmd, MMC_APP_CMD, 0);
-+ retval = sd_run_no_data_command(host, cmd);
-+ if (retval < 0) {
-+ retval = -ENODEV;
-+ goto out;
-+ }
-+
-+ sd_cmd(cmd, SD_APP_OP_COND, 0);
-+ retval = sd_run_no_data_command(host, cmd);
-+ if (retval < 0) {
-+ retval = -ENODEV;
-+ goto out;
-+ }
-+ if (retval == 0x00) {
-+ /* we found a SD card */
-+ mmc_card_set_present(&host->card);
-+ host->card.type = MMC_TYPE_SD;
-+ break;
-+ }
-+ if ((retval & R1_SPI_ILLEGAL_COMMAND)) {
-+ /* this looks like a MMC card */
-+ break;
-+ }
-+ }
-+
-+ /*
-+ * MMC cards require CMD1 to activate card initialization process.
-+ * MMC card must ack with "ok" (0x00)
-+ */
-+ if (!mmc_card_sd(&host->card)) {
-+ for (i = 0; i < 0xffff; i++) {
-+ sd_cmd(cmd, MMC_SEND_OP_COND, 0);
-+ retval = sd_run_no_data_command(host, cmd);
-+ if (retval < 0) {
-+ retval = -ENODEV;
-+ goto out;
-+ }
-+ if (retval == 0x00) {
-+ /* we found a MMC card */
-+ mmc_card_set_present(&host->card);
-+ break;
-+ }
-+ }
-+ if (retval != 0x00) {
-+ DBG("MMC card, bad, retval=%02x\n", retval);
-+ sd_card_set_bad(host);
-+ }
-+ }
-+
-+out:
-+ return retval;
-+}
-+
-+/*
-+ *
-+ */
-+static int sd_welcome_card(struct sd_host *host)
-+{
-+ int retval;
-+
-+ /* soft reset the card */
-+ retval = sd_reset_sequence(host);
-+ if (retval < 0 || sd_card_is_bad(host))
-+ goto out;
-+
-+ /* read Operating Conditions Register */
-+ retval = sd_read_ocr(host);
-+ if (retval < 0)
-+ goto err_bad_card;
-+
-+ /* refuse to drive cards reporting voltage ranges out of scope */
-+ if (!(host->ocr & host->ocr_avail)) {
-+ sd_printk(KERN_WARNING, "reported OCR (%08x)"
-+ " indicates that it is not safe to use this"
-+ " card with a GameCube\n", host->ocr);
-+ retval = -ENODEV;
-+ goto err_bad_card;
-+ }
-+
-+ /* read and decode the Card Specific Data */
-+ retval = sd_read_csd(host);
-+ if (retval < 0)
-+ goto err_bad_card;
-+ mmc_decode_csd(&host->card);
-+
-+ /* calculate some card access related timeouts */
-+ sd_calc_timeouts(host);
-+
-+ /* read and decode the Card Identification Data */
-+ retval = sd_read_cid(host);
-+ if (retval < 0)
-+ goto err_bad_card;
-+ mmc_decode_cid(&host->card);
-+
-+ sd_printk(KERN_INFO, "slot%d: descr \"%s\", size %luk, block %ub,"
-+ " serial %08x\n",
-+ to_channel(exi_get_exi_channel(host->exi_device)),
-+ host->card.cid.prod_name,
-+ (unsigned long)((host->card.csd.capacity *
-+ (1 << host->card.csd.read_blkbits)) / 1024),
-+ 1 << host->card.csd.read_blkbits,
-+ host->card.cid.serial);
-+
-+ retval = 0;
-+ goto out;
-+
-+err_bad_card:
-+ sd_card_set_bad(host);
-+out:
-+ return retval;
-+}
-+
-+/*
-+ *
-+ * Block layer.
-+ */
-+
-+/*
-+ * Performs a read request.
-+ */
-+static int sd_read_request(struct sd_host *host, struct request *req)
-+{
-+ int i;
-+ unsigned long nr_blocks; /* in card blocks */
-+ size_t block_len; /* in bytes */
-+ unsigned long start;
-+ void *buf = req->buffer;
-+ int retval;
-+
-+ /*
-+ * It seems that some cards do not accept single block reads for the
-+ * read block length reported by the card.
-+ * For now, we perform only 512 byte single block reads.
-+ */
-+
-+ start = req->sector << KERNEL_SECTOR_SHIFT;
-+#if 0
-+ nr_blocks = req->current_nr_sectors >>
-+ (host->card.csd.read_blkbits - KERNEL_SECTOR_SHIFT);
-+ block_len = 1 << host->card.csd.read_blkbits;
-+#else
-+ nr_blocks = req->current_nr_sectors;
-+ block_len = 1 << KERNEL_SECTOR_SHIFT;
-+#endif
-+
-+ for (i = 0; i < nr_blocks; i++) {
-+ retval = sd_read_single_block(host, start, buf, block_len);
-+ if (retval < 0)
-+ break;
-+
-+ start += block_len;
-+ buf += block_len;
-+ }
-+
-+ /* number of kernel sectors transferred */
-+#if 0
-+ retval = i << (host->card.csd.read_blkbits - KERNEL_SECTOR_SHIFT);
-+#else
-+ retval = i;
-+#endif
-+
-+ return retval;
-+}
-+
-+/*
-+ * Performs a write request.
-+ */
-+static int sd_write_request(struct sd_host *host, struct request *req)
-+{
-+ int i;
-+ unsigned long nr_blocks; /* in card blocks */
-+ size_t block_len; /* in bytes */
-+ unsigned long start;
-+ void *buf = req->buffer;
-+ int retval;
-+
-+ /* FIXME?, maybe should use 2^WRITE_BL_LEN blocks */
-+
-+ /* kernel sectors and card write blocks are both 512 bytes long */
-+ start = req->sector << KERNEL_SECTOR_SHIFT;
-+ nr_blocks = req->current_nr_sectors;
-+ block_len = 1 << KERNEL_SECTOR_SHIFT;
-+
-+ for (i = 0; i < nr_blocks; i++) {
-+ retval = sd_write_single_block(host, start, buf, block_len);
-+ if (retval < 0)
-+ break;
-+
-+ start += block_len;
-+ buf += block_len;
-+ }
-+
-+ /* number of kernel sectors transferred */
-+ retval = i;
-+
-+ return retval;
-+}
-+
-+/*
-+ * Verifies if a request should be dispatched or not.
-+ *
-+ * Returns:
-+ * <0 in case of error.
-+ * 0 if request passes the checks
-+ * >0 if request can be ignored
-+ */
-+static int sd_check_request(struct sd_host *host, struct request *req)
-+{
-+ unsigned long nr_sectors;
-+
-+ if (test_bit(__SD_MEDIA_CHANGED, &host->flags)) {
-+ sd_printk(KERN_ERR, "media changed, aborting\n");
-+ return -ENOMEDIUM;
-+ }
-+
-+ /* unit is kernel sectors */
-+ nr_sectors =
-+ host->card.csd.capacity << (host->card.csd.read_blkbits -
-+ KERNEL_SECTOR_SHIFT);
-+
-+ /* keep our reads within limits */
-+ if (req->sector + req->current_nr_sectors > nr_sectors) {
-+ sd_printk(KERN_ERR, "reading past end, aborting\n");
-+ return -EINVAL;
-+ }
-+
-+ if (!blk_fs_request(req))
-+ return 1;
-+
-+ return 0;
-+}
-+
-+/*
-+ * Request dispatcher.
-+ */
-+static int sd_do_request(struct sd_host *host, struct request *req)
-+{
-+ int retval;
-+
-+ retval = sd_check_request(host, req);
-+ if (retval)
-+ return 0;
-+
-+ switch (rq_data_dir(req)) {
-+ case WRITE:
-+ retval = sd_write_request(host, req);
-+ break;
-+ case READ:
-+ retval = sd_read_request(host, req);
-+ break;
-+ }
-+
-+ return retval;
-+}
-+
-+/*
-+ * Input/Output thread.
-+ */
-+static int sd_io_thread(void *param)
-+{
-+ struct sd_host *host = param;
-+ struct request *req;
-+ unsigned long flags;
-+ int nr_sectors;
-+ int error;
-+
-+#if 0
-+ /*
-+ * We are going to perfom badly due to the read problem explained
-+ * above. At least, be nice with other processes trying to use the
-+ * cpu.
-+ */
-+ set_user_nice(current, 0);
-+#endif
-+
-+ current->flags |= PF_NOFREEZE|PF_MEMALLOC;
-+
-+ mutex_lock(&host->io_mutex);
-+ for (;;) {
-+ req = NULL;
-+ set_current_state(TASK_INTERRUPTIBLE);
-+
-+ spin_lock_irqsave(&host->queue_lock, flags);
-+ if (!blk_queue_plugged(host->queue))
-+ req = elv_next_request(host->queue);
-+ spin_unlock_irqrestore(&host->queue_lock, flags);
-+
-+ if (!req) {
-+ if (kthread_should_stop()) {
-+ set_current_state(TASK_RUNNING);
-+ break;
-+ }
-+ mutex_unlock(&host->io_mutex);
-+ schedule();
-+ mutex_lock(&host->io_mutex);
-+ continue;
-+ }
-+ set_current_state(TASK_INTERRUPTIBLE);
-+ nr_sectors = sd_do_request(host, req);
-+ error = (nr_sectors < 0) ? nr_sectors : 0;
-+
-+ spin_lock_irqsave(&host->queue_lock, flags);
-+ __blk_end_request(req, error, nr_sectors << 9);
-+ spin_unlock_irqrestore(&host->queue_lock, flags);
-+ }
-+ mutex_unlock(&host->io_mutex);
-+
-+ return 0;
-+}
-+
-+/*
-+ * Block layer request function.
-+ * Wakes up the IO thread.
-+ */
-+static void sd_request_func(struct request_queue *q)
-+{
-+ struct sd_host *host = q->queuedata;
-+ wake_up_process(host->io_thread);
-+}
-+
-+/*
-+ *
-+ * Driver interface.
-+ */
-+
-+static DECLARE_MUTEX(open_lock);
-+
-+/*
-+ * Opens the drive device.
-+ */
-+static int sd_open(struct block_device *bdev, fmode_t mode)
-+{
-+ struct sd_host *host = bdev->bd_disk->private_data;
-+ int retval = 0;
-+
-+ if (!host || !host->exi_device)
-+ return -ENXIO;
-+
-+ /* honor exclusive open mode */
-+ if (host->refcnt == -1 ||
-+ (host->refcnt && (mode & FMODE_EXCL))) {
-+ retval = -EBUSY;
-+ goto out;
-+ }
-+
-+ /* this takes care of revalidating the media if needed */
-+ check_disk_change(bdev);
-+ if (!host->card.csd.capacity) {
-+ retval = -ENOMEDIUM;
-+ goto out;
-+ }
-+
-+ down(&open_lock);
-+
-+ if ((mode & FMODE_EXCL))
-+ host->refcnt = -1;
-+ else
-+ host->refcnt++;
-+
-+ up(&open_lock);
-+
-+out:
-+ return retval;
-+
-+}
-+
-+/*
-+ * Releases the drive device.
-+ */
-+static int sd_release(struct gendisk *disk, fmode_t mode)
-+{
-+ struct sd_host *host = disk->private_data;
-+
-+ if (!host)
-+ return -ENXIO;
-+
-+ down(&open_lock);
-+
-+ if (host->refcnt > 0)
-+ host->refcnt--;
-+ else
-+ host->refcnt = 0;
-+
-+ up(&open_lock);
-+
-+ /* lazy removal of unreferenced zombies */
-+ if (!host->refcnt && !host->exi_device)
-+ kfree(host);
-+
-+ return 0;
-+}
-+
-+/*
-+ * Checks if media changed.
-+ */
-+static int sd_media_changed(struct gendisk *disk)
-+{
-+ struct sd_host *host = disk->private_data;
-+ unsigned int last_serial;
-+ int retval;
-+
-+ /* report a media change for zombies */
-+ if (!host)
-+ return 1;
-+
-+ /* report a media change if someone forced it */
-+ if (test_bit(__SD_MEDIA_CHANGED, &host->flags))
-+ return 1;
-+
-+ /* check if the serial number of the card changed */
-+ last_serial = host->card.cid.serial;
-+ retval = sd_read_cid(host);
-+ if (!retval && last_serial == host->card.cid.serial && last_serial)
-+ clear_bit(__SD_MEDIA_CHANGED, &host->flags);
-+ else
-+ set_bit(__SD_MEDIA_CHANGED, &host->flags);
-+
-+ return (host->flags & SD_MEDIA_CHANGED) ? 1 : 0;
-+}
-+
-+/*
-+ * Checks if media is still valid.
-+ */
-+static int sd_revalidate_disk(struct gendisk *disk)
-+{
-+ struct sd_host *host = disk->private_data;
-+ int retval = 0;
-+
-+ /* report missing medium for zombies */
-+ if (!host) {
-+ retval = -ENOMEDIUM;
-+ goto out;
-+ }
-+
-+ /* the block layer likes to call us multiple times... */
-+ if (!sd_media_changed(host->disk))
-+ goto out;
-+
-+ /* get the card into a known status */
-+ retval = sd_welcome_card(host);
-+ if (retval < 0 || sd_card_is_bad(host)) {
-+ retval = -ENOMEDIUM;
-+ goto out;
-+ }
-+
-+ /* inform the block layer about various sizes */
-+ blk_queue_hardsect_size(host->queue, 1 << KERNEL_SECTOR_SHIFT);
-+ set_capacity(host->disk, host->card.csd.capacity <<
-+ (host->card.csd.read_blkbits - KERNEL_SECTOR_SHIFT));
-+
-+ clear_bit(__SD_MEDIA_CHANGED, &host->flags);
-+
-+out:
-+ return retval;
-+}
-+
-+static int sd_getgeo(struct block_device *bdev, struct hd_geometry *geo)
-+{
-+ geo->cylinders = get_capacity(bdev->bd_disk) / (4 * 16);
-+ geo->heads = 4;
-+ geo->sectors = 16;
-+ return 0;
-+}
-+
-+
-+static struct block_device_operations sd_fops = {
-+ .owner = THIS_MODULE,
-+ .open = sd_open,
-+ .release = sd_release,
-+ .revalidate_disk = sd_revalidate_disk,
-+ .media_changed = sd_media_changed,
-+ .getgeo = sd_getgeo,
-+};
-+
-+/*
-+ * Initializes the block layer interfaces.
-+ */
-+static int sd_init_blk_dev(struct sd_host *host)
-+{
-+ struct gendisk *disk;
-+ struct request_queue *queue;
-+ int channel;
-+ int retval;
-+
-+ channel = to_channel(exi_get_exi_channel(host->exi_device));
-+
-+ /* queue */
-+ retval = -ENOMEM;
-+ spin_lock_init(&host->queue_lock);
-+ queue = blk_init_queue(sd_request_func, &host->queue_lock);
-+ if (!queue) {
-+ sd_printk(KERN_ERR, "error initializing queue\n");
-+ goto err_blk_init_queue;
-+ }
-+ blk_queue_dma_alignment(queue, EXI_DMA_ALIGN);
-+ blk_queue_max_phys_segments(queue, 1);
-+ blk_queue_max_hw_segments(queue, 1);
-+ blk_queue_max_sectors(queue, 8);
-+ queue->queuedata = host;
-+ host->queue = queue;
-+
-+ /* disk */
-+ disk = alloc_disk(1 << MMC_SHIFT);
-+ if (!disk) {
-+ sd_printk(KERN_ERR, "error allocating disk\n");
-+ goto err_alloc_disk;
-+ }
-+ disk->major = SD_MAJOR;
-+ disk->first_minor = channel << MMC_SHIFT;
-+ disk->fops = &sd_fops;
-+ sprintf(disk->disk_name, "%s%c", SD_NAME, 'a' + channel);
-+ disk->private_data = host;
-+ disk->queue = host->queue;
-+ host->disk = disk;
-+
-+ retval = 0;
-+ goto out;
-+
-+err_alloc_disk:
-+ blk_cleanup_queue(host->queue);
-+ host->queue = NULL;
-+err_blk_init_queue:
-+out:
-+ return retval;
-+}
-+
-+/*
-+ * Exits the block layer interfaces.
-+ */
-+static void sd_exit_blk_dev(struct sd_host *host)
-+{
-+ blk_cleanup_queue(host->queue);
-+ put_disk(host->disk);
-+}
-+
-+
-+/*
-+ * Initializes and launches the IO thread.
-+ */
-+static int sd_init_io_thread(struct sd_host *host)
-+{
-+ int channel;
-+ int result = 0;
-+
-+ channel = to_channel(exi_get_exi_channel(host->exi_device));
-+
-+ mutex_init(&host->io_mutex);
-+ host->io_thread = kthread_run(sd_io_thread, host,
-+ "ksdiod/%c", 'a' + channel);
-+ if (IS_ERR(host->io_thread)) {
-+ sd_printk(KERN_ERR, "error creating io thread\n");
-+ result = PTR_ERR(host->io_thread);
-+ }
-+ return result;
-+}
-+
-+/*
-+ * Terminates and waits for the IO thread to complete.
-+ */
-+static void sd_exit_io_thread(struct sd_host *host)
-+{
-+ if (!IS_ERR(host->io_thread)) {
-+ wake_up_process(host->io_thread);
-+ kthread_stop(host->io_thread);
-+ host->io_thread = ERR_PTR(-EINVAL);
-+ }
-+}
-+
-+/*
-+ * Initializes a host.
-+ */
-+static int sd_init(struct sd_host *host)
-+{
-+ int retval;
-+
-+ spin_lock_init(&host->lock);
-+
-+ host->refcnt = 0;
-+ set_bit(__SD_MEDIA_CHANGED, &host->flags);
-+
-+ host->ocr_avail = MMC_VDD_32_33 | MMC_VDD_33_34;
-+ sd_set_clock(host, SD_SPI_CLK);
-+ sd_calc_timeouts(host);
-+
-+ retval = sd_init_blk_dev(host);
-+ if (!retval) {
-+ retval = sd_revalidate_disk(host->disk);
-+ if (retval < 0 || !mmc_card_present(&host->card)) {
-+ retval = -ENODEV;
-+ goto err_blk_dev;
-+ }
-+
-+ retval = sd_init_io_thread(host);
-+ if (retval)
-+ goto err_blk_dev;
-+
-+ add_disk(host->disk);
-+ }
-+
-+ return retval;
-+
-+err_blk_dev:
-+ sd_exit_blk_dev(host);
-+ return retval;
-+}
-+
-+/*
-+ * Deinitializes (exits) a host.
-+ */
-+static void sd_exit(struct sd_host *host)
-+{
-+ del_gendisk(host->disk);
-+ sd_exit_io_thread(host);
-+ sd_exit_blk_dev(host);
-+}
-+
-+/*
-+ * Terminates a host.
-+ */
-+static void sd_kill(struct sd_host *host)
-+{
-+ if (host->refcnt > 0) {
-+ sd_printk(KERN_ERR, "hey! card removed while in use!\n");
-+ set_bit(__SD_MEDIA_CHANGED, &host->flags);
-+ }
-+
-+ sd_exit(host);
-+ host->exi_device = NULL;
-+
-+ /* release the host immediately when not in use */
-+ if (!host->refcnt)
-+ kfree(host);
-+}
-+
-+
-+/*
-+ * EXI layer interface.
-+ *
-+ */
-+
-+/*
-+ * Checks if the given EXI device is a MMC/SD card and makes it available
-+ * if true.
-+ */
-+static int sd_probe(struct exi_device *exi_device)
-+{
-+ struct sd_host *host;
-+ int retval;
-+
-+ /* don't try to drive a device which already has a real identifier */
-+ if (exi_device->eid.id != EXI_ID_NONE)
-+ return -ENODEV;
-+
-+ host = kzalloc(sizeof(*host), GFP_KERNEL);
-+ if (!host)
-+ return -ENOMEM;
-+
-+ host->exi_device = exi_device_get(exi_device);
-+ WARN_ON(exi_get_drvdata(exi_device));
-+ exi_set_drvdata(exi_device, host);
-+ retval = sd_init(host);
-+ if (retval) {
-+ exi_set_drvdata(exi_device, NULL);
-+ host->exi_device = NULL;
-+ kfree(host);
-+ exi_device_put(exi_device);
-+ }
-+ return retval;
-+}
-+
-+/*
-+ * Makes unavailable the MMC/SD card identified by the EXI device `exi_device'.
-+ */
-+static void sd_remove(struct exi_device *exi_device)
-+{
-+ struct sd_host *host = exi_get_drvdata(exi_device);
-+
-+ WARN_ON(!host);
-+ WARN_ON(!host->exi_device);
-+
-+ exi_set_drvdata(exi_device, NULL);
-+ if (host)
-+ sd_kill(host);
-+ exi_device_put(exi_device);
-+}
-+
-+static struct exi_device_id sd_eid_table[] = {
-+ [0] = {
-+ .channel = SD_SLOTA_CHANNEL,
-+ .device = SD_SLOTA_DEVICE,
-+ .id = EXI_ID_NONE,
-+ },
-+ [1] = {
-+ .channel = SD_SLOTB_CHANNEL,
-+ .device = SD_SLOTB_DEVICE,
-+ .id = EXI_ID_NONE,
-+ },
-+ {.id = 0}
-+};
-+
-+static struct exi_driver sd_driver = {
-+ .name = DRV_MODULE_NAME,
-+ .eid_table = sd_eid_table,
-+ .frequency = SD_SPI_CLK_IDX,
-+ .probe = sd_probe,
-+ .remove = sd_remove,
-+};
-+
-+
-+/*
-+ * Kernel module interface.
-+ *
-+ */
-+
-+/*
-+ *
-+ */
-+static int __init sd_init_module(void)
-+{
-+ int retval = 0;
-+
-+ sd_printk(KERN_INFO, "%s - version %s\n", DRV_DESCRIPTION,
-+ sd_driver_version);
-+
-+ if (register_blkdev(SD_MAJOR, DRV_MODULE_NAME)) {
-+ sd_printk(KERN_ERR, "unable to register major %d\n", SD_MAJOR);
-+ retval = -EIO;
-+ goto out;
-+ }
-+
-+ retval = exi_driver_register(&sd_driver);
-+
-+out:
-+ return retval;
-+}
-+
-+/*
-+ *
-+ */
-+static void __exit sd_exit_module(void)
-+{
-+ unregister_blkdev(SD_MAJOR, DRV_MODULE_NAME);
-+ exi_driver_unregister(&sd_driver);
-+}
-+
-+module_init(sd_init_module);
-+module_exit(sd_exit_module);
-+
-+MODULE_AUTHOR(DRV_AUTHOR);
-+MODULE_DESCRIPTION(DRV_DESCRIPTION);
-+MODULE_LICENSE("GPL");
-+
-diff --git a/drivers/block/rvl-mem2.c b/drivers/block/rvl-mem2.c
-new file mode 100644
-index 0000000..01339f5
---- /dev/null
-+++ b/drivers/block/rvl-mem2.c
-@@ -0,0 +1,384 @@
-+/*
-+ * drivers/block/rvl-mem2.c
-+ *
-+ * Nintendo Wii MEM2 block driver
-+ * Copyright (C) 2008-2009 The GameCube Linux Team
-+ * Copyright (C) 2008,2009 Albert Herranz
-+ *
-+ * Based on gcn-aram.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.
-+ *
-+ */
-+
-+#include <linux/module.h>
-+#include <linux/major.h>
-+#include <linux/of_platform.h>
-+#include <linux/blkdev.h>
-+#include <linux/fcntl.h> /* O_ACCMODE */
-+#include <linux/hdreg.h> /* HDIO_GETGEO */
-+#include <linux/io.h>
-+
-+
-+#define DRV_MODULE_NAME "rvl-mem2"
-+#define DRV_DESCRIPTION "Nintendo Wii MEM2 block driver"
-+#define DRV_AUTHOR "Albert Herranz"
-+
-+static char mem2_driver_version[] = "0.1-isobel";
-+
-+#define drv_printk(level, format, arg...) \
-+ printk(level DRV_MODULE_NAME ": " format , ## arg)
-+
-+
-+/*
-+ * Driver settings
-+ */
-+#define MEM2_NAME DRV_MODULE_NAME
-+#define MEM2_MAJOR Z2RAM_MAJOR
-+
-+#define MEM2_SECTOR_SIZE PAGE_SIZE
-+
-+
-+struct mem2_drvdata {
-+ spinlock_t lock;
-+
-+ void __iomem *io_base;
-+ size_t size;
-+
-+ struct block_device_operations fops;
-+ struct gendisk *disk;
-+ struct request_queue *queue;
-+
-+ int ref_count;
-+
-+ struct device *dev;
-+};
-+
-+/*
-+ *
-+ */
-+
-+/*
-+ * Performs block layer requests.
-+ */
-+static void mem2_do_request(struct request_queue *q)
-+{
-+ struct mem2_drvdata *drvdata = q->queuedata;
-+ struct request *req;
-+ unsigned long mem2_addr;
-+ size_t len;
-+ int error;
-+
-+ req = elv_next_request(q);
-+ while (req) {
-+ if (blk_fs_request(req)) {
-+ /* calculate the MEM2 address and length */
-+ mem2_addr = req->sector << 9;
-+ len = req->current_nr_sectors << 9;
-+
-+ /* give up if the request goes out of bounds */
-+ if (mem2_addr + len > drvdata->size) {
-+ drv_printk(KERN_ERR, "bad access: block=%lu,"
-+ " size=%u\n",
-+ (unsigned long)req->sector, len);
-+ error = -EIO;
-+ } else {
-+ switch (rq_data_dir(req)) {
-+ case READ:
-+ memcpy(req->buffer,
-+ drvdata->io_base + mem2_addr,
-+ len);
-+ break;
-+ case WRITE:
-+ memcpy(drvdata->io_base + mem2_addr,
-+ req->buffer, len);
-+ break;
-+ }
-+ error = 0;
-+ }
-+ blk_end_request(req, error, len);
-+ } else {
-+ end_request(req, 0);
-+ }
-+ req = elv_next_request(q);
-+ }
-+}
-+
-+/*
-+ * Opens the MEM2 device.
-+ */
-+static int mem2_open(struct block_device *bdev, fmode_t mode)
-+{
-+ struct mem2_drvdata *drvdata = bdev->bd_disk->private_data;
-+ unsigned long flags;
-+ int retval = 0;
-+
-+ spin_lock_irqsave(&drvdata->lock, flags);
-+
-+ /* only allow a minor of 0 to be opened */
-+ if (MINOR(bdev->bd_dev)) {
-+ retval = -ENODEV;
-+ goto out;
-+ }
-+
-+ /* honor exclusive open mode */
-+ if (drvdata->ref_count == -1 ||
-+ (drvdata->ref_count && (mode & FMODE_EXCL))) {
-+ retval = -EBUSY;
-+ goto out;
-+ }
-+
-+ if ((mode & FMODE_EXCL))
-+ drvdata->ref_count = -1;
-+ else
-+ drvdata->ref_count++;
-+
-+out:
-+ spin_unlock_irqrestore(&drvdata->lock, flags);
-+ return retval;
-+}
-+
-+/*
-+ * Closes the MEM2 device.
-+ */
-+static int mem2_release(struct gendisk *disk, fmode_t mode)
-+{
-+ struct mem2_drvdata *drvdata = disk->private_data;
-+ unsigned long flags;
-+
-+ spin_lock_irqsave(&drvdata->lock, flags);
-+ if (drvdata->ref_count > 0)
-+ drvdata->ref_count--;
-+ else
-+ drvdata->ref_count = 0;
-+ spin_unlock_irqrestore(&drvdata->lock, flags);
-+
-+ return 0;
-+}
-+
-+static int mem2_getgeo(struct block_device *bdev, struct hd_geometry *geo)
-+{
-+ geo->cylinders = get_capacity(bdev->bd_disk) / (4 * 16);
-+ geo->heads = 4;
-+ geo->sectors = 16;
-+ return 0;
-+}
-+
-+
-+static struct block_device_operations mem2_fops = {
-+ .owner = THIS_MODULE,
-+ .open = mem2_open,
-+ .release = mem2_release,
-+ .getgeo = mem2_getgeo,
-+};
-+
-+
-+/*
-+ *
-+ */
-+static int mem2_init_blk_dev(struct mem2_drvdata *drvdata)
-+{
-+ struct gendisk *disk;
-+ struct request_queue *queue;
-+ int retval;
-+
-+ drvdata->ref_count = 0;
-+
-+ retval = register_blkdev(MEM2_MAJOR, MEM2_NAME);
-+ if (retval)
-+ goto err_register_blkdev;
-+
-+ retval = -ENOMEM;
-+ spin_lock_init(&drvdata->lock);
-+ queue = blk_init_queue(mem2_do_request, &drvdata->lock);
-+ if (!queue)
-+ goto err_blk_init_queue;
-+
-+ blk_queue_hardsect_size(queue, MEM2_SECTOR_SIZE);
-+ blk_queue_max_phys_segments(queue, 1);
-+ blk_queue_max_hw_segments(queue, 1);
-+ queue->queuedata = drvdata;
-+ drvdata->queue = queue;
-+
-+ disk = alloc_disk(1);
-+ if (!disk)
-+ goto err_alloc_disk;
-+
-+ disk->major = MEM2_MAJOR;
-+ disk->first_minor = 0;
-+ disk->fops = &mem2_fops;
-+ strcpy(disk->disk_name, MEM2_NAME);
-+ disk->queue = drvdata->queue;
-+ set_capacity(disk, drvdata->size >> 9);
-+ disk->private_data = drvdata;
-+ drvdata->disk = disk;
-+
-+ add_disk(drvdata->disk);
-+
-+ retval = 0;
-+ goto out;
-+
-+err_alloc_disk:
-+ blk_cleanup_queue(drvdata->queue);
-+err_blk_init_queue:
-+ unregister_blkdev(MEM2_MAJOR, MEM2_NAME);
-+err_register_blkdev:
-+out:
-+ return retval;
-+}
-+
-+/*
-+ *
-+ */
-+static void mem2_exit_blk_dev(struct mem2_drvdata *drvdata)
-+{
-+ if (drvdata->disk) {
-+ del_gendisk(drvdata->disk);
-+ put_disk(drvdata->disk);
-+ }
-+ if (drvdata->queue)
-+ blk_cleanup_queue(drvdata->queue);
-+ unregister_blkdev(MEM2_MAJOR, MEM2_NAME);
-+}
-+
-+/*
-+ *
-+ */
-+static int mem2_init(struct mem2_drvdata *drvdata, struct resource *mem)
-+{
-+ int retval;
-+ size_t size;
-+
-+ size = mem->end - mem->start + 1;
-+ drvdata->size = size;
-+ drvdata->io_base = ioremap(mem->start, size);
-+ if (!drvdata->io_base) {
-+ drv_printk(KERN_ERR, "failed to ioremap MEM2\n");
-+ return -EIO;
-+ }
-+
-+ retval = mem2_init_blk_dev(drvdata);
-+ if (retval)
-+ iounmap(drvdata->io_base);
-+ return retval;
-+}
-+
-+/*
-+ *
-+ */
-+static void mem2_exit(struct mem2_drvdata *drvdata)
-+{
-+ if (drvdata->io_base)
-+ iounmap(drvdata->io_base);
-+ mem2_exit_blk_dev(drvdata);
-+}
-+
-+/*
-+ *
-+ */
-+static int mem2_do_probe(struct device *dev, struct resource *mem)
-+{
-+ struct mem2_drvdata *drvdata;
-+ int retval;
-+
-+ drvdata = kzalloc(sizeof(*drvdata), GFP_KERNEL);
-+ if (!drvdata) {
-+ drv_printk(KERN_ERR, "failed to allocate mem2_drvdata\n");
-+ return -ENOMEM;
-+ }
-+ dev_set_drvdata(dev, drvdata);
-+ drvdata->dev = dev;
-+
-+ retval = mem2_init(drvdata, mem);
-+ if (retval) {
-+ dev_set_drvdata(dev, NULL);
-+ kfree(drvdata);
-+ }
-+ return retval;
-+}
-+
-+/*
-+ *
-+ */
-+static int mem2_do_remove(struct device *dev)
-+{
-+ struct mem2_drvdata *drvdata = dev_get_drvdata(dev);
-+
-+ if (drvdata) {
-+ mem2_exit(drvdata);
-+ dev_set_drvdata(dev, NULL);
-+ return 0;
-+ }
-+ return -ENODEV;
-+}
-+
-+/*
-+ * Driver model probe function.
-+ */
-+static int __init mem2_of_probe(struct of_device *odev,
-+ const struct of_device_id *match)
-+{
-+ struct resource res;
-+ int retval;
-+
-+ retval = of_address_to_resource(odev->node, 0, &res);
-+ if (retval) {
-+ drv_printk(KERN_ERR, "no memory range found\n");
-+ return -ENODEV;
-+ }
-+
-+ return mem2_do_probe(&odev->dev, &res);
-+}
-+
-+/*
-+ * Driver model remove function.
-+ */
-+static int __exit mem2_of_remove(struct of_device *odev)
-+{
-+ return mem2_do_remove(&odev->dev);
-+}
-+
-+static struct of_device_id mem2_of_match[] = {
-+ { .compatible = "nintendo,hollywood-mem2" },
-+ { },
-+};
-+
-+MODULE_DEVICE_TABLE(of, mem2_of_match);
-+
-+static struct of_platform_driver mem2_of_driver = {
-+ .owner = THIS_MODULE,
-+ .name = DRV_MODULE_NAME,
-+ .match_table = mem2_of_match,
-+ .probe = mem2_of_probe,
-+ .remove = mem2_of_remove,
-+};
-+
-+/*
-+ * Module initialization function.
-+ */
-+static int __init mem2_init_module(void)
-+{
-+ drv_printk(KERN_INFO, "%s - version %s\n", DRV_DESCRIPTION,
-+ mem2_driver_version);
-+
-+ return of_register_platform_driver(&mem2_of_driver);
-+}
-+
-+/*
-+ * Module deinitialization funtion.
-+ */
-+static void __exit mem2_exit_module(void)
-+{
-+ of_unregister_platform_driver(&mem2_of_driver);
-+}
-+
-+module_init(mem2_init_module);
-+module_exit(mem2_exit_module);
-+
-+MODULE_DESCRIPTION(DRV_DESCRIPTION);
-+MODULE_AUTHOR(DRV_AUTHOR);
-+MODULE_LICENSE("GPL");
-+
-diff --git a/drivers/block/rvl-stsd.c b/drivers/block/rvl-stsd.c
-new file mode 100644
-index 0000000..d3b7044
---- /dev/null
-+++ b/drivers/block/rvl-stsd.c
-@@ -0,0 +1,2294 @@
-+/*
-+ * drivers/block/rvl-stsd.c
-+ *
-+ * Block driver for the Nintendo Wii SD front slot.
-+ * Copyright (C) 2008-2009 The GameCube Linux Team
-+ * Copyright (C) 2008,2009 Albert Herranz
-+ *
-+ * Based on drivers/block/gcn-sd.c
-+ *
-+ * Copyright (C) 2004-2008 The GameCube Linux Team
-+ * Copyright (C) 2004,2005 Rob Reylink
-+ * Copyright (C) 2005 Todd Jeffreys
-+ * Copyright (C) 2005,2006,2007,2008 Albert Herranz
-+ *
-+ * This program is free software; you can redistribute it and/or
-+ * modify it under the terms of the GNU General Public License
-+ * as published by the Free Software Foundation; either version 2
-+ * of the License, or (at your option) any later version.
-+ *
-+ */
-+
-+#define DEBUG
-+
-+/*#define DBG(fmt, arg...) pr_debug(fmt, ##arg)*/
-+#define DBG(fmt, arg...) drv_printk(KERN_ERR, fmt, ##arg)
-+
-+#include <linux/blkdev.h>
-+#include <linux/delay.h>
-+#include <linux/dma-mapping.h>
-+#include <linux/hdreg.h>
-+#include <linux/init.h>
-+#include <linux/kernel.h>
-+#include <linux/kthread.h>
-+#include <linux/major.h>
-+#include <linux/module.h>
-+#include <linux/of_platform.h>
-+#include <asm/starlet.h>
-+
-+/*
-+ * We are not a native MMC driver...
-+ * But anyway, we try to recycle here some of the available code.
-+ */
-+#include <linux/mmc/host.h>
-+#include <linux/mmc/card.h>
-+#include <linux/mmc/mmc.h>
-+#include <linux/mmc/sd.h>
-+#include <linux/mmc/sdio.h>
-+#include "../mmc/host/sdhci.h"
-+
-+#define DRV_MODULE_NAME "rvl-stsd"
-+#define DRV_DESCRIPTION "Block driver for the Nintendo Wii SD front slot"
-+#define DRV_AUTHOR "Albert Herranz"
-+
-+static char stsd_driver_version[] = "0.3i";
-+
-+#define drv_printk(level, format, arg...) \
-+ printk(level DRV_MODULE_NAME ": " format , ## arg)
-+
-+/*
-+ * Driver settings.
-+ */
-+#define MMC_SHIFT 3 /* 8 partitions */
-+
-+#define STSD_MAJOR 62
-+#define STSD_NAME "rvlsd"
-+
-+#define KERNEL_SECTOR_SHIFT 9
-+#define KERNEL_SECTOR_SIZE (1 << KERNEL_SECTOR_SHIFT) /*512 */
-+
-+#define STSD_MAX_SECTORS 16
-+
-+
-+/*
-+ * IOS-related constants.
-+ */
-+
-+/* ioctls */
-+#define STSD_IOCTL_SETHSR 1
-+#define STSD_IOCTL_GETHSR 2
-+#define STSD_IOCTL_RESET 4
-+#define STSD_IOCTL_SETCLOCK 6
-+#define STSD_IOCTL_SENDCMD 7
-+#define STSD_IOCTL_GETSTATUS 11
-+#define STSD_IOCTL_GETOCR 12
-+
-+#define STSD_IOCTLV_SENDCMD 7
-+
-+/* SD command types */
-+#define STSD_CMDTYPE_BC 1
-+#define STSD_CMDTYPE_BCR 2
-+#define STSD_CMDTYPE_AC 3
-+#define STSD_CMDTYPE_ADTC 4
-+
-+/* SD response types */
-+#define STSD_RSPTYPE_NONE 0
-+#define STSD_RSPTYPE_R1 1
-+#define STSD_RSPTYPE_R1B 2
-+#define STSD_RSPTYPE_R2 3
-+#define STSD_RSPTYPE_R3 4
-+#define STSD_RSPTYPE_R4 5
-+#define STSD_RSPTYPE_R5 6
-+#define STSD_RSPTYPE_R6 7
-+#define STSD_RSPTYPE_R7 8
-+
-+/* card status bits */
-+#define STSD_STATUS_CARD_INSERTED (1<<0)
-+#define STSD_STATUS_CARD_INITIALIZED (1<<16)
-+
-+/* IOS errors */
-+#define STSD_ERR_INVALID_CARD 0xc1000020
-+
-+/*
-+ * Hardware registers.
-+ */
-+
-+/*
-+ * Simplified SD Host Controller Specification
-+ * Version 2.00
-+ * February 8, 2007
-+ */
-+
-+/*
-+ * SD Host Standard Registers
-+ *
-+ */
-+
-+/* we are recycling the stuff already in "../mmc/host/sdhci.h" */
-+
-+/* TMCLK*2^a a=[13..27] */
-+#define STSD_TIMEOUT_CONTROL_DIV(a) (((a)-13)&0xf)
-+
-+static char stsd_dev_sdio_slot0[] = "/dev/sdio/slot0";
-+
-+/*
-+ * Used to get/set the host controller hardware register values through IOS.
-+ */
-+struct stsd_reg_query {
-+ u32 addr;
-+ u32 _unk1;
-+ u32 _unk2;
-+ u32 size;
-+ u32 data;
-+ u32 _unk3;
-+};
-+
-+/*
-+ * Used to send commands to an SD card through IOS.
-+ */
-+struct stsd_command {
-+ u32 opcode;
-+ u32 cmdtype;
-+ u32 rsptype;
-+ u32 arg;
-+ u32 blk_count;
-+ u32 blk_size;
-+ dma_addr_t dma_addr;
-+ u32 is_dma;
-+ u32 _unk2;
-+};
-+
-+struct stsd_xfer {
-+ size_t size;
-+ enum dma_data_direction direction;
-+
-+ struct starlet_ioh_sg in[2], io[1];
-+ struct stsd_command *cmd;
-+
-+ /* one-time initialized members */
-+ void *reply;
-+ size_t reply_len;
-+ dma_addr_t dma_addr;
-+ void *bounce_buf;
-+ size_t bounce_buf_size;
-+ size_t blk_size;
-+};
-+
-+enum {
-+ __STSD_MEDIA_CHANGED = 0,
-+ __STSD_BAD_CARD,
-+ __STSD_MANUAL_SETUP,
-+ __STSD_SDHC,
-+};
-+
-+struct stsd_host {
-+ spinlock_t lock;
-+ unsigned long flags;
-+#define STSD_MEDIA_CHANGED (1<<__STSD_MEDIA_CHANGED)
-+#define STSD_BAD_CARD (1<<__STSD_BAD_CARD)
-+#define STSD_MANUAL_SETUP (1<<__STSD_MANUAL_SETUP)
-+#define STSD_SDHC (1<<__STSD_SDHC)
-+
-+ /* u32 ocr; */
-+ unsigned int f_max;
-+ unsigned int clock;
-+ u32 bus_width;
-+
-+ u16 status;
-+
-+ /* card related info */
-+ struct mmc_card card;
-+
-+ int refcnt;
-+
-+ spinlock_t queue_lock;
-+ struct request_queue *queue;
-+ struct gendisk *disk;
-+ unsigned int max_phys_segments;
-+
-+ struct stsd_xfer *xfer;
-+
-+ struct task_struct *io_thread;
-+ struct mutex io_mutex;
-+
-+ int fd;
-+ struct device *dev;
-+};
-+
-+
-+static const unsigned int tran_exp[] = {
-+ 10000, 100000, 1000000, 10000000,
-+ 0, 0, 0, 0
-+};
-+
-+static const unsigned char tran_mant[] = {
-+ 0, 10, 12, 13, 15, 20, 25, 30,
-+ 35, 40, 45, 50, 55, 60, 70, 80,
-+};
-+
-+static const unsigned int tacc_exp[] = {
-+ 1, 10, 100, 1000, 10000, 100000, 1000000, 10000000,
-+};
-+
-+static const unsigned int tacc_mant[] = {
-+ 0, 10, 12, 13, 15, 20, 25, 30,
-+ 35, 40, 45, 50, 55, 60, 70, 80,
-+};
-+
-+
-+/*
-+ * debug section
-+ *
-+ */
-+
-+#if defined(DEBUG) && 0
-+
-+#define __case_string(_s) \
-+case _s: \
-+ str = #_s; \
-+ break;
-+
-+static char *stsd_opcode_string(u32 opcode)
-+{
-+ char *str = "unknown";
-+
-+ switch (opcode) {
-+__case_string(MMC_GO_IDLE_STATE)
-+__case_string(MMC_SEND_OP_COND)
-+__case_string(MMC_ALL_SEND_CID)
-+__case_string(MMC_SET_RELATIVE_ADDR)
-+__case_string(MMC_SET_DSR)
-+__case_string(MMC_SWITCH)
-+__case_string(MMC_SELECT_CARD)
-+__case_string(MMC_SEND_EXT_CSD)
-+__case_string(MMC_SEND_CSD)
-+__case_string(MMC_SEND_CID)
-+__case_string(MMC_READ_DAT_UNTIL_STOP)
-+__case_string(MMC_STOP_TRANSMISSION)
-+__case_string(MMC_SEND_STATUS)
-+__case_string(MMC_GO_INACTIVE_STATE)
-+__case_string(MMC_SPI_READ_OCR)
-+__case_string(MMC_SPI_CRC_ON_OFF)
-+__case_string(MMC_SET_BLOCKLEN)
-+__case_string(MMC_READ_SINGLE_BLOCK)
-+__case_string(MMC_READ_MULTIPLE_BLOCK)
-+__case_string(MMC_WRITE_DAT_UNTIL_STOP)
-+__case_string(MMC_SET_BLOCK_COUNT)
-+__case_string(MMC_WRITE_BLOCK)
-+__case_string(MMC_WRITE_MULTIPLE_BLOCK)
-+__case_string(MMC_PROGRAM_CID)
-+__case_string(MMC_PROGRAM_CSD)
-+__case_string(MMC_SET_WRITE_PROT)
-+__case_string(MMC_CLR_WRITE_PROT)
-+__case_string(MMC_SEND_WRITE_PROT)
-+__case_string(MMC_ERASE_GROUP_START)
-+__case_string(MMC_ERASE_GROUP_END)
-+__case_string(MMC_ERASE)
-+__case_string(MMC_FAST_IO)
-+__case_string(MMC_GO_IRQ_STATE)
-+__case_string(MMC_LOCK_UNLOCK)
-+/*__case_string(SD_SEND_RELATIVE_ADDR)*/
-+/*__case_string(SD_SEND_IF_COND)*/
-+/*__case_string(SD_SWITCH)*/
-+__case_string(SD_IO_SEND_OP_COND)
-+__case_string(SD_IO_RW_DIRECT)
-+__case_string(SD_IO_RW_EXTENDED)
-+ }
-+
-+ return str;
-+}
-+
-+static char *stsd_rsptype_string(u32 rsptype)
-+{
-+ char *str = "unknown";
-+
-+ switch (rsptype) {
-+__case_string(STSD_RSPTYPE_NONE)
-+__case_string(STSD_RSPTYPE_R1)
-+__case_string(STSD_RSPTYPE_R1B)
-+__case_string(STSD_RSPTYPE_R2)
-+__case_string(STSD_RSPTYPE_R3)
-+__case_string(STSD_RSPTYPE_R4)
-+__case_string(STSD_RSPTYPE_R5)
-+__case_string(STSD_RSPTYPE_R6)
-+__case_string(STSD_RSPTYPE_R7)
-+ }
-+
-+ return str;
-+}
-+
-+static char *stsd_cmdtype_string(u32 cmdtype)
-+{
-+ char *str = "unknown";
-+
-+ switch (cmdtype) {
-+__case_string(STSD_CMDTYPE_BC)
-+__case_string(STSD_CMDTYPE_BCR)
-+__case_string(STSD_CMDTYPE_AC)
-+__case_string(STSD_CMDTYPE_ADTC)
-+ }
-+
-+ return str;
-+}
-+
-+static char *stsd_statusbit_string(u32 statusbit)
-+{
-+ char *str = "unknown";
-+
-+ switch (statusbit) {
-+__case_string(R1_OUT_OF_RANGE)
-+__case_string(R1_ADDRESS_ERROR)
-+__case_string(R1_BLOCK_LEN_ERROR)
-+__case_string(R1_ERASE_SEQ_ERROR)
-+__case_string(R1_ERASE_PARAM)
-+__case_string(R1_WP_VIOLATION)
-+__case_string(R1_CARD_IS_LOCKED)
-+__case_string(R1_LOCK_UNLOCK_FAILED)
-+__case_string(R1_COM_CRC_ERROR)
-+__case_string(R1_ILLEGAL_COMMAND)
-+__case_string(R1_CARD_ECC_FAILED)
-+__case_string(R1_CC_ERROR)
-+__case_string(R1_ERROR)
-+__case_string(R1_UNDERRUN)
-+__case_string(R1_OVERRUN)
-+__case_string(R1_CID_CSD_OVERWRITE)
-+__case_string(R1_WP_ERASE_SKIP)
-+__case_string(R1_CARD_ECC_DISABLED)
-+__case_string(R1_ERASE_RESET)
-+__case_string(R1_READY_FOR_DATA)
-+__case_string(R1_APP_CMD)
-+ }
-+
-+ return str;
-+}
-+
-+static char *stsd_card_state_string(u32 status)
-+{
-+ char *str = "unknown";
-+
-+ switch (R1_CURRENT_STATE(status)) {
-+ case 0:
-+ str = "IDLE";
-+ break;
-+ case 1:
-+ str = "READY";
-+ break;
-+ case 2:
-+ str = "IDENT";
-+ break;
-+ case 3:
-+ str = "STANDBY";
-+ break;
-+ case 4:
-+ str = "TRANSFER";
-+ break;
-+ case 5:
-+ str = "SEND";
-+ break;
-+ case 6:
-+ str = "RECEIVE";
-+ break;
-+ case 7:
-+ str = "PROGRAM";
-+ break;
-+ case 8:
-+ str = "DISCONNECT";
-+ break;
-+ }
-+
-+ return str;
-+}
-+static void stsd_print_status(u32 status)
-+{
-+ u32 i, bit;
-+
-+ drv_printk(KERN_INFO, "card state %s\n",
-+ stsd_card_state_string(status));
-+
-+ i = 13;
-+ for (i = 13; i <= 31; i++) {
-+ bit = 1 << i;
-+ if ((status & bit))
-+ drv_printk(KERN_INFO, "%02d %s\n", i,
-+ stsd_statusbit_string(bit));
-+ }
-+ bit = 1 << 8;
-+ if ((status & bit))
-+ drv_printk(KERN_INFO, "%02d %s\n", 8,
-+ stsd_statusbit_string(bit));
-+ bit = 1 << 5;
-+ if ((status & bit))
-+ drv_printk(KERN_INFO, "%02d %s\n", 5,
-+ stsd_statusbit_string(bit));
-+}
-+
-+static void stsd_print_cid(struct mmc_cid *cid)
-+{
-+ drv_printk(KERN_INFO,
-+ "manfid = %d\n"
-+ "oemid = %d\n"
-+ "prod_name = %s\n"
-+ "hwrev = %d\n"
-+ "fwrev = %d\n"
-+ "serial = %08x\n"
-+ "year = %d\n"
-+ "month = %d\n",
-+ cid->manfid,
-+ cid->oemid,
-+ cid->prod_name,
-+ cid->hwrev, cid->fwrev, cid->serial, cid->year, cid->month);
-+}
-+
-+static void stsd_print_csd(struct mmc_csd *csd)
-+{
-+ drv_printk(KERN_INFO,
-+ "mmca_vsn = %d\n"
-+ "cmdclass = %d\n"
-+ "tacc_clks = %d\n"
-+ "tacc_ns = %d\n"
-+ "r2w_factor = %d\n"
-+ "max_dtr = %d\n"
-+ "read_blkbits = %d\n"
-+ "write_blkbits = %d\n"
-+ "capacity = %d\n"
-+ "read_partial = %d\n"
-+ "read_misalign = %d\n"
-+ "write_partial = %d\n"
-+ "write_misalign = %d\n",
-+ csd->mmca_vsn,
-+ csd->cmdclass,
-+ csd->tacc_clks,
-+ csd->tacc_ns,
-+ csd->r2w_factor,
-+ csd->max_dtr,
-+ csd->read_blkbits,
-+ csd->write_blkbits,
-+ csd->capacity,
-+ csd->read_partial,
-+ csd->read_misalign,
-+ csd->write_partial,
-+ csd->write_misalign);
-+}
-+
-+static void stsd_dump_hs_regs(struct stsd_host *host)
-+{
-+ drv_printk(KERN_DEBUG, "============== REGISTER DUMP ==============\n");
-+
-+ drv_printk(KERN_DEBUG, "Sys addr: 0x%08x | Version: 0x%08x\n",
-+ stsd_hsr_in_u32(host, SDHCI_DMA_ADDRESS),
-+ stsd_hsr_in_u16(host, SDHCI_HOST_VERSION));
-+ drv_printk(KERN_DEBUG, "Blk size: 0x%08x | Blk cnt: 0x%08x\n",
-+ stsd_hsr_in_u16(host, SDHCI_BLOCK_SIZE),
-+ stsd_hsr_in_u16(host, SDHCI_BLOCK_COUNT));
-+ drv_printk(KERN_DEBUG, "Argument: 0x%08x | Trn mode: 0x%08x\n",
-+ stsd_hsr_in_u32(host, SDHCI_ARGUMENT),
-+ stsd_hsr_in_u16(host, SDHCI_TRANSFER_MODE));
-+ drv_printk(KERN_DEBUG, "Present: 0x%08x | Host ctl: 0x%08x\n",
-+ stsd_hsr_in_u32(host, SDHCI_PRESENT_STATE),
-+ stsd_hsr_in_u8(host, SDHCI_HOST_CONTROL));
-+ drv_printk(KERN_DEBUG, "Power: 0x%08x | Blk gap: 0x%08x\n",
-+ stsd_hsr_in_u8(host, SDHCI_POWER_CONTROL),
-+ stsd_hsr_in_u8(host, SDHCI_BLOCK_GAP_CONTROL));
-+ drv_printk(KERN_DEBUG, "Wake-up: 0x%08x | Clock: 0x%08x\n",
-+ stsd_hsr_in_u8(host, SDHCI_WAKE_UP_CONTROL),
-+ stsd_hsr_in_u16(host, SDHCI_CLOCK_CONTROL));
-+ drv_printk(KERN_DEBUG, "Timeout: 0x%08x | Int stat: 0x%08x\n",
-+ stsd_hsr_in_u8(host, SDHCI_TIMEOUT_CONTROL),
-+ stsd_hsr_in_u32(host, SDHCI_INT_STATUS));
-+ drv_printk(KERN_DEBUG, "Int enab: 0x%08x | Sig enab: 0x%08x\n",
-+ stsd_hsr_in_u32(host, SDHCI_INT_ENABLE),
-+ stsd_hsr_in_u32(host, SDHCI_SIGNAL_ENABLE));
-+ drv_printk(KERN_DEBUG, "AC12 err: 0x%08x | Slot int: 0x%08x\n",
-+ stsd_hsr_in_u16(host, SDHCI_ACMD12_ERR),
-+ stsd_hsr_in_u16(host, SDHCI_SLOT_INT_STATUS));
-+ drv_printk(KERN_DEBUG, "Caps: 0x%08x | Max curr: 0x%08x\n",
-+ stsd_hsr_in_u32(host, SDHCI_CAPABILITIES),
-+ stsd_hsr_in_u32(host, SDHCI_MAX_CURRENT));
-+
-+ drv_printk(KERN_DEBUG, "===========================================\n");
-+}
-+
-+#endif /* DEBUG */
-+
-+/*
-+ *
-+ * MMC/SD data structures manipulation.
-+ * Borrowed from MMC layer.
-+ */
-+
-+#define UNSTUFF_BITS(resp, start, size) \
-+ ({ \
-+ const int __size = size; \
-+ const u32 __mask = (__size < 32 ? 1 << __size : 0) - 1; \
-+ const int __off = 3 - ((start) / 32); \
-+ const int __shft = (start) & 31; \
-+ u32 __res; \
-+ \
-+ __res = resp[__off] >> __shft; \
-+ if (__size + __shft > 32) \
-+ __res |= resp[__off-1] << ((32 - __shft) % 32); \
-+ __res & __mask; \
-+ })
-+
-+/*
-+ * Given the decoded CSD structure, decode the raw CID to our CID structure.
-+ */
-+static void mmc_decode_cid(struct mmc_card *card)
-+{
-+ u32 *resp = card->raw_cid;
-+
-+ memset(&card->cid, 0, sizeof(struct mmc_cid));
-+
-+ /*
-+ * SD doesn't currently have a version field so we will
-+ * have to assume we can parse this.
-+ */
-+ card->cid.manfid = UNSTUFF_BITS(resp, 120, 8);
-+ card->cid.oemid = UNSTUFF_BITS(resp, 104, 16);
-+ card->cid.prod_name[0] = UNSTUFF_BITS(resp, 96, 8);
-+ card->cid.prod_name[1] = UNSTUFF_BITS(resp, 88, 8);
-+ card->cid.prod_name[2] = UNSTUFF_BITS(resp, 80, 8);
-+ card->cid.prod_name[3] = UNSTUFF_BITS(resp, 72, 8);
-+ card->cid.prod_name[4] = UNSTUFF_BITS(resp, 64, 8);
-+ card->cid.hwrev = UNSTUFF_BITS(resp, 60, 4);
-+ card->cid.fwrev = UNSTUFF_BITS(resp, 56, 4);
-+ card->cid.serial = UNSTUFF_BITS(resp, 24, 32);
-+ card->cid.year = UNSTUFF_BITS(resp, 12, 8);
-+ card->cid.month = UNSTUFF_BITS(resp, 8, 4);
-+
-+ card->cid.year += 2000; /* SD cards year offset */
-+}
-+
-+/*
-+ * Given a 128-bit response, decode to our card CSD structure.
-+ */
-+static int mmc_decode_csd(struct mmc_card *card)
-+{
-+ struct mmc_csd *csd = &card->csd;
-+ unsigned int e, m, csd_struct;
-+ u32 *resp = card->raw_csd;
-+
-+ csd_struct = UNSTUFF_BITS(resp, 126, 2);
-+
-+ switch (csd_struct) {
-+ case 0:
-+ m = UNSTUFF_BITS(resp, 115, 4);
-+ e = UNSTUFF_BITS(resp, 112, 3);
-+ csd->tacc_ns = (tacc_exp[e] * tacc_mant[m] + 9) / 10;
-+ csd->tacc_clks = UNSTUFF_BITS(resp, 104, 8) * 100;
-+
-+ m = UNSTUFF_BITS(resp, 99, 4);
-+ e = UNSTUFF_BITS(resp, 96, 3);
-+ csd->max_dtr = tran_exp[e] * tran_mant[m];
-+ csd->cmdclass = UNSTUFF_BITS(resp, 84, 12);
-+
-+ e = UNSTUFF_BITS(resp, 47, 3);
-+ m = UNSTUFF_BITS(resp, 62, 12);
-+ csd->capacity = (1 + m) << (e + 2);
-+
-+ csd->read_blkbits = UNSTUFF_BITS(resp, 80, 4);
-+ csd->read_partial = UNSTUFF_BITS(resp, 79, 1);
-+ csd->write_misalign = UNSTUFF_BITS(resp, 78, 1);
-+ csd->read_misalign = UNSTUFF_BITS(resp, 77, 1);
-+ csd->r2w_factor = UNSTUFF_BITS(resp, 26, 3);
-+ csd->write_blkbits = UNSTUFF_BITS(resp, 22, 4);
-+ csd->write_partial = UNSTUFF_BITS(resp, 21, 1);
-+ break;
-+ case 1:
-+ /*
-+ * This is a block-addressed SDHC card. Most
-+ * interesting fields are unused and have fixed
-+ * values. To avoid getting tripped by buggy cards,
-+ * we assume those fixed values ourselves.
-+ */
-+ mmc_card_set_blockaddr(card);
-+
-+ csd->tacc_ns = 0; /* Unused */
-+ csd->tacc_clks = 0; /* Unused */
-+
-+ m = UNSTUFF_BITS(resp, 99, 4);
-+ e = UNSTUFF_BITS(resp, 96, 3);
-+ csd->max_dtr = tran_exp[e] * tran_mant[m];
-+ csd->cmdclass = UNSTUFF_BITS(resp, 84, 12);
-+
-+ m = UNSTUFF_BITS(resp, 48, 22);
-+ csd->capacity = (1 + m) << 10;
-+
-+ csd->read_blkbits = 9;
-+ csd->read_partial = 0;
-+ csd->write_misalign = 0;
-+ csd->read_misalign = 0;
-+ csd->r2w_factor = 4; /* Unused */
-+ csd->write_blkbits = 9;
-+ csd->write_partial = 0;
-+ break;
-+ default:
-+ printk(KERN_ERR "unrecognised CSD structure version %d\n",
-+ csd_struct);
-+ return -EINVAL;
-+ }
-+
-+ /*stsd_print_csd(csd);*/
-+
-+ return 0;
-+}
-+
-+/*
-+ * REVISIT maybe get rid of this and specify the rsptype directly
-+ */
-+static u32 stsd_opcode_to_rsptype(u32 opcode)
-+{
-+ u32 rsptype = STSD_RSPTYPE_R1;
-+
-+ switch (opcode) {
-+ case MMC_GO_IDLE_STATE:
-+ case MMC_SET_DSR:
-+ case MMC_GO_INACTIVE_STATE:
-+ rsptype = STSD_RSPTYPE_NONE;
-+ break;
-+ case MMC_SWITCH:
-+ case MMC_STOP_TRANSMISSION:
-+ case MMC_SET_WRITE_PROT:
-+ case MMC_CLR_WRITE_PROT:
-+ case MMC_ERASE:
-+ case MMC_LOCK_UNLOCK:
-+ rsptype = STSD_RSPTYPE_R1B;
-+ break;
-+ case MMC_ALL_SEND_CID:
-+ case MMC_SEND_CSD:
-+ case MMC_SEND_CID:
-+ rsptype = STSD_RSPTYPE_R2;
-+ break;
-+ case MMC_SEND_OP_COND:
-+ case SD_APP_OP_COND:
-+ rsptype = STSD_RSPTYPE_R3;
-+ break;
-+ case MMC_FAST_IO:
-+ case SD_IO_SEND_OP_COND:
-+ rsptype = STSD_RSPTYPE_R4;
-+ break;
-+ case MMC_GO_IRQ_STATE:
-+ case SD_IO_RW_DIRECT:
-+ case SD_IO_RW_EXTENDED:
-+ rsptype = STSD_RSPTYPE_R5;
-+ break;
-+ case SD_SEND_RELATIVE_ADDR:
-+ rsptype = STSD_RSPTYPE_R6;
-+ break;
-+ case SD_SEND_IF_COND:
-+ /* WEIRD */
-+ /*rsptype = STSD_RSPTYPE_R7;*/
-+ rsptype = STSD_RSPTYPE_R6;
-+ break;
-+ default:
-+ break;
-+ }
-+
-+ return rsptype;
-+}
-+
-+static inline void stsd_card_set_bad(struct stsd_host *host)
-+{
-+ set_bit(__STSD_BAD_CARD, &host->flags);
-+}
-+
-+static inline void stsd_card_unset_bad(struct stsd_host *host)
-+{
-+ clear_bit(__STSD_BAD_CARD, &host->flags);
-+}
-+
-+static inline int stsd_card_is_bad(struct stsd_host *host)
-+{
-+ return test_bit(__STSD_BAD_CARD, &host->flags);
-+}
-+
-+static inline void stsd_card_set_sdhc(struct stsd_host *host)
-+{
-+ set_bit(__STSD_SDHC, &host->flags);
-+}
-+
-+static inline void stsd_card_unset_sdhc(struct stsd_host *host)
-+{
-+ clear_bit(__STSD_SDHC, &host->flags);
-+}
-+
-+static inline int stsd_card_is_sdhc(struct stsd_host *host)
-+{
-+ return test_bit(__STSD_SDHC, &host->flags);
-+}
-+
-+static inline void stsd_card_set_manual_setup(struct stsd_host *host)
-+{
-+ set_bit(__STSD_MANUAL_SETUP, &host->flags);
-+}
-+
-+static inline void stsd_card_unset_manual_setup(struct stsd_host *host)
-+{
-+ clear_bit(__STSD_MANUAL_SETUP, &host->flags);
-+}
-+
-+static inline int stsd_card_needs_manual_setup(struct stsd_host *host)
-+{
-+ return test_bit(__STSD_MANUAL_SETUP, &host->flags);
-+}
-+
-+static inline int stsd_card_status_is_inserted(u32 status)
-+{
-+ return (status & STSD_STATUS_CARD_INSERTED)
-+ == STSD_STATUS_CARD_INSERTED;
-+}
-+
-+static inline int stsd_card_status_is_initialized(u32 status)
-+{
-+ return (status & STSD_STATUS_CARD_INITIALIZED)
-+ == STSD_STATUS_CARD_INITIALIZED;
-+}
-+
-+/*
-+ * Hardware.
-+ *
-+ */
-+
-+/*
-+ * Handy small buffer routines.
-+ * We use a small static aligned buffer to avoid allocations for short-lived
-+ * operations involving 1 to 4 byte data transfers to/from IOS.
-+ *
-+ */
-+
-+static u32 stsd_small_buf[L1_CACHE_BYTES / sizeof(u32)]
-+ __attribute__ ((aligned(STARLET_IPC_DMA_ALIGN + 1)));
-+static const size_t stsd_small_buf_size = sizeof(stsd_small_buf_size);
-+static DEFINE_MUTEX(stsd_small_buf_lock);
-+
-+static u32 *stsd_small_buf_get(void)
-+{
-+ u32 *buf;
-+
-+ if (!mutex_trylock(&stsd_small_buf_lock))
-+ buf = starlet_kzalloc(stsd_small_buf_size, GFP_NOIO);
-+ else {
-+ memset(stsd_small_buf, 0, stsd_small_buf_size);
-+ buf = stsd_small_buf;
-+ }
-+
-+ return buf;
-+}
-+
-+void stsd_small_buf_put(u32 *buf)
-+{
-+ if (buf == stsd_small_buf)
-+ mutex_unlock(&stsd_small_buf_lock);
-+ else
-+ starlet_kfree(buf);
-+}
-+
-+
-+/*
-+ * SD Host Standard Registers accessors.
-+ *
-+ */
-+
-+/*
-+ * @data must be aligned
-+ * @size must be between 1 and 4
-+ */
-+static int __stsd_hsr_in(struct stsd_host *host,
-+ u32 addr, u32 *data, size_t size)
-+{
-+ struct stsd_reg_query *query;
-+ int error;
-+
-+ query = starlet_kzalloc(sizeof(*query), GFP_ATOMIC);
-+ if (!query)
-+ return -ENOMEM;
-+
-+ query->addr = addr;
-+ query->size = size;
-+
-+ error = starlet_ioctl(host->fd, STSD_IOCTL_GETHSR,
-+ query, sizeof(*query), data, sizeof(*data));
-+
-+ starlet_kfree(query);
-+
-+ if (error)
-+ DBG("%s: error=%d (%08x)\n", __func__, error, error);
-+
-+ return error;
-+}
-+
-+static int __stsd_hsr_out(struct stsd_host *host,
-+ u32 addr, u32 *data, size_t size)
-+{
-+ struct stsd_reg_query *query;
-+ int error;
-+
-+ query = starlet_kzalloc(sizeof(*query), GFP_ATOMIC);
-+ if (!query)
-+ return -ENOMEM;
-+
-+ query->addr = addr;
-+ query->size = size;
-+ query->data = *data;
-+
-+ error = starlet_ioctl(host->fd, STSD_IOCTL_SETHSR,
-+ query, sizeof(*query), NULL, 0);
-+
-+ starlet_kfree(query);
-+
-+ if (error)
-+ DBG("%s: error=%d (%08x)\n", __func__, error, error);
-+
-+ return error;
-+}
-+
-+
-+static int stsd_hsr_in(struct stsd_host *host,
-+ u32 reg, void *buf, size_t size)
-+{
-+ u32 *local_buf;
-+ int error;
-+
-+ /* we do 8, 16 and 32 bits reads */
-+ if (size > 4)
-+ return -EINVAL;
-+
-+ local_buf = stsd_small_buf_get();
-+ if (!local_buf)
-+ return -ENOMEM;
-+
-+ error = __stsd_hsr_in(host, reg, local_buf, size);
-+ if (!error) {
-+ switch (size) {
-+ case 1:
-+ *(u8 *)buf = *local_buf & 0xff;
-+ break;
-+ case 2:
-+ *(u16 *)buf = *local_buf & 0xffff;
-+ break;
-+ case 4:
-+ *(u32 *)buf = *local_buf;
-+ break;
-+ default:
-+ BUG();
-+ break;
-+ }
-+ }
-+
-+ stsd_small_buf_put(local_buf);
-+
-+ return error;
-+}
-+
-+static int stsd_hsr_out(struct stsd_host *host,
-+ u32 reg, void *buf, size_t size)
-+{
-+ u32 *local_buf;
-+ int error;
-+
-+ /* we do 8, 16 and 32 bits reads */
-+ if (size > 4)
-+ return -EINVAL;
-+
-+ local_buf = stsd_small_buf_get();
-+ if (!local_buf)
-+ return -ENOMEM;
-+
-+ switch (size) {
-+ case 1:
-+ *local_buf = *(u8 *)buf;
-+ break;
-+ case 2:
-+ *local_buf = *(u16 *)buf;
-+ break;
-+ case 4:
-+ *local_buf = *(u32 *)buf;
-+ break;
-+ default:
-+ BUG();
-+ break;
-+ }
-+ error = __stsd_hsr_out(host, reg, local_buf, size);
-+
-+ stsd_small_buf_put(local_buf);
-+
-+ return error;
-+}
-+
-+#define __declare_stsd_hsr_wait_for_resp(_type) \
-+static int stsd_hsr_wait_for_resp_##_type(struct stsd_host *host, \
-+ u32 reg, _type resp, _type resp_mask, \
-+ unsigned long jiffies) \
-+{ \
-+ _type val; \
-+ int error; \
-+ \
-+ unsigned long cycles = 10; \
-+ while (cycles-- > 0) { \
-+ error = stsd_hsr_in(host, reg, &val, sizeof(val)); \
-+ if (error) \
-+ return error; \
-+ if ((val & resp_mask) == resp) \
-+ return 0; \
-+ mdelay(10); \
-+ } \
-+ return -ENODATA; \
-+}
-+
-+__declare_stsd_hsr_wait_for_resp(u8);
-+__declare_stsd_hsr_wait_for_resp(u16);
-+
-+#define __declare_stsd_hsr_in(_type) \
-+static inline _type stsd_hsr_in_##_type(struct stsd_host *host, u32 reg) \
-+{ \
-+ _type val; \
-+ \
-+ stsd_hsr_in(host, reg, &val, sizeof(val)); \
-+ return val; \
-+}
-+
-+__declare_stsd_hsr_in(u8);
-+__declare_stsd_hsr_in(u16);
-+__declare_stsd_hsr_in(u32);
-+
-+#define __declare_stsd_hsr_out(_type) \
-+static inline void stsd_hsr_out_##_type(struct stsd_host *host, u32 reg,\
-+ _type val) \
-+{ \
-+ stsd_hsr_out(host, reg, &val, sizeof(val)); \
-+}
-+
-+__declare_stsd_hsr_out(u8);
-+__declare_stsd_hsr_out(u16);
-+__declare_stsd_hsr_out(u32);
-+
-+
-+
-+/*
-+ * Ioctl helpers.
-+ *
-+ */
-+
-+static int stsd_ioctl_small_read(struct stsd_host *host, int request,
-+ void *buf, size_t size)
-+{
-+ void *local_buf;
-+ int error;
-+
-+ /* we do 8, 16 and 32 bits reads */
-+ if (size > stsd_small_buf_size) {
-+ error = -EINVAL;
-+ goto done;
-+ }
-+
-+ local_buf = stsd_small_buf_get();
-+ if (!local_buf) {
-+ error = -ENOMEM;
-+ goto done;
-+ }
-+
-+ error = starlet_ioctl(host->fd, request,
-+ NULL, 0, local_buf, size);
-+ if (!error)
-+ memcpy(buf, local_buf, size);
-+
-+ stsd_small_buf_put(local_buf);
-+
-+done:
-+ if (error)
-+ DBG("%s: error=%d (%08x)\n", __func__, error, error);
-+ return error;
-+}
-+
-+static int stsd_ioctl_small_write(struct stsd_host *host, int request,
-+ void *buf, size_t size)
-+{
-+ void *local_buf;
-+ int error;
-+
-+ /* we do 8, 16 and 32 bits writes */
-+ if (size > stsd_small_buf_size) {
-+ error = -EINVAL;
-+ goto done;
-+ }
-+
-+ local_buf = stsd_small_buf_get();
-+ if (!local_buf) {
-+ error = -ENOMEM;
-+ goto done;
-+ }
-+
-+ memcpy(local_buf, buf, size);
-+ error = starlet_ioctl(host->fd, request,
-+ local_buf, size, NULL, 0);
-+
-+ stsd_small_buf_put(local_buf);
-+
-+done:
-+ if (error)
-+ DBG("%s: error=%d (%08x)\n", __func__, error, error);
-+ return error;
-+}
-+
-+
-+/*
-+ * Hardware interfaces.
-+ *
-+ */
-+
-+static int stsd_get_status(struct stsd_host *host, u32 *status)
-+{
-+ int error;
-+
-+ error = stsd_ioctl_small_read(host, STSD_IOCTL_GETSTATUS,
-+ status, sizeof(*status));
-+ if (error)
-+ DBG("%s: error=%d (%08x)\n", __func__, error, error);
-+
-+ return error;
-+}
-+
-+static void stsd_set_bus_width(struct stsd_host *host, int width)
-+{
-+ u8 hcr;
-+
-+ hcr = stsd_hsr_in_u8(host, SDHCI_HOST_CONTROL);
-+ if (width == 4) {
-+ hcr |= SDHCI_CTRL_4BITBUS;
-+ } else {
-+ hcr &= ~SDHCI_CTRL_4BITBUS;
-+ width = 1;
-+ }
-+ stsd_hsr_out_u8(host, SDHCI_HOST_CONTROL, hcr);
-+ host->bus_width = width;
-+}
-+
-+static int stsd_set_clock(struct stsd_host *host, unsigned int clock)
-+{
-+ int error;
-+ u32 divisor;
-+
-+ for (divisor = 1; divisor <= 32; divisor <<= 1) {
-+ if (host->f_max / divisor <= clock)
-+ break;
-+ }
-+
-+ error = stsd_ioctl_small_write(host, STSD_IOCTL_SETCLOCK,
-+ &divisor, sizeof(divisor));
-+ if (error)
-+ DBG("%s: error=%d (%08x)\n", __func__, error, error);
-+ else
-+ host->clock = clock;
-+
-+ return error;
-+}
-+
-+static int stsd_reset_card(struct stsd_host *host)
-+{
-+ struct mmc_card *card = &host->card;
-+ int error;
-+ u32 status;
-+
-+ stsd_card_unset_bad(host);
-+ stsd_card_unset_sdhc(host);
-+ stsd_card_unset_manual_setup(host);
-+
-+ memset(&card->cid, 0, sizeof(struct mmc_cid));
-+ memset(&card->csd, 0, sizeof(struct mmc_csd));
-+ host->card.rca = 0;
-+
-+ error = stsd_ioctl_small_read(host, STSD_IOCTL_RESET,
-+ &status, sizeof(status));
-+ if (error) {
-+ if (error != STSD_ERR_INVALID_CARD)
-+ DBG("%s: error=%d (%08x)\n", __func__, error, error);
-+ } else {
-+ host->card.rca = status >> 16;
-+ host->status = status & 0xffff;
-+ }
-+
-+ return error;
-+}
-+
-+#if 0
-+static int stsd_get_ocr(struct stsd_host *host)
-+{
-+ int error;
-+ u32 ocr;
-+
-+ error = stsd_ioctl_small_read(host, STSD_IOCTL_GETOCR,
-+ &ocr, sizeof(ocr));
-+ if (error)
-+ DBG("%s: error=%d (%08x)\n", __func__, error, error);
-+ else
-+ host->ocr = ocr;
-+
-+ return error;
-+}
-+#endif
-+
-+/*
-+ * Command engine.
-+ *
-+ */
-+
-+static int stsd_send_command(struct stsd_host *host,
-+ u32 opcode, u32 type, u32 arg,
-+ void *buf, size_t buf_len)
-+{
-+ struct scatterlist in[2], io[1];
-+ struct stsd_command *cmd;
-+ u32 *reply;
-+ size_t reply_len;
-+ int error;
-+
-+ reply_len = 4 * sizeof(u32);
-+ if (buf_len > reply_len)
-+ return -EINVAL;
-+
-+ cmd = starlet_kzalloc(sizeof(*cmd), GFP_NOIO);
-+ if (!cmd)
-+ return -ENOMEM;
-+
-+ reply = starlet_kzalloc(reply_len, GFP_NOIO);
-+ if (!reply) {
-+ starlet_kfree(cmd);
-+ return -ENOMEM;
-+ }
-+
-+ cmd->opcode = opcode;
-+ cmd->arg = arg;
-+
-+ cmd->cmdtype = type;
-+ cmd->rsptype = stsd_opcode_to_rsptype(opcode);
-+ if (opcode == MMC_SELECT_CARD && arg == 0)
-+ cmd->rsptype = STSD_RSPTYPE_NONE;
-+
-+ if (stsd_card_needs_manual_setup(host)) {
-+ /*
-+ * We need to use ioctlvs, instead of ioctls, to drive
-+ * manually initialized cards.
-+ * This makes IOS "cooperative" :)
-+ */
-+ sg_init_table(in, 2);
-+ sg_set_buf(&in[0], cmd, sizeof(*cmd));
-+ sg_set_buf(&in[1], reply, 0);
-+
-+ sg_init_table(io, 1);
-+ sg_set_buf(&io[0], reply, reply_len);
-+
-+ error = starlet_ioctlv(host->fd, STSD_IOCTL_SENDCMD,
-+ 2, in, 1, io);
-+ } else {
-+ error = starlet_ioctl(host->fd, STSD_IOCTL_SENDCMD,
-+ cmd, sizeof(*cmd), reply, reply_len);
-+ }
-+
-+ if (error) {
-+ DBG("%s: error=%d (%08x), opcode=%d\n", __func__,
-+ error, error, opcode);
-+ } else {
-+ if (buf)
-+ memcpy(buf, reply, buf_len);
-+ }
-+
-+ starlet_kfree(reply);
-+ starlet_kfree(cmd);
-+
-+ return error;
-+}
-+
-+static int stsd_send_app_command(struct stsd_host *host,
-+ u32 opcode, u32 type, u32 arg,
-+ void *buf, size_t buf_len)
-+{
-+ int error;
-+
-+ error = stsd_send_command(host, MMC_APP_CMD, STSD_CMDTYPE_AC,
-+ host->card.rca << 16, NULL, 0);
-+ if (!error) {
-+ error = stsd_send_command(host, opcode, type, arg,
-+ buf, buf_len);
-+ }
-+ return error;
-+}
-+
-+
-+/*
-+ * Command helpers.
-+ *
-+ */
-+
-+
-+static int stsd_cmd_read_cxd(struct stsd_host *host, int request, void *buf)
-+{
-+ int error;
-+ u32 *q, savedq;
-+ u8 *p, crc;
-+ const size_t size = 128/8*sizeof(u8);
-+
-+ error = stsd_send_command(host, request, STSD_CMDTYPE_AC,
-+ host->card.rca << 16, buf, size);
-+
-+ if (!error) {
-+ /*
-+ * WEIRD,
-+ * starlet sends CSD and CID contents in a very special way.
-+ *
-+ * If the 128 bit register value is:
-+ * 0123456789abcdef
-+ * starlet will send it as:
-+ * bcde789a3456f012
-+ * with byte f (the crc field) zeroed.
-+ */
-+
-+ /* bcde789a3456f012 -> f0123456789abcde */
-+ q = buf;
-+ savedq = q[0];
-+ q[0] = q[3];
-+ q[3] = savedq;
-+ savedq = q[1];
-+ q[1] = q[2];
-+ q[2] = savedq;
-+
-+ /* f0123456789abcde -> 0123456789abcdef */
-+ p = buf;
-+ crc = p[0];
-+ memcpy(p, p+1, size-1);
-+ p[size-1] = crc;
-+ }
-+ return error;
-+}
-+
-+static int stsd_cmd_read_csd(struct stsd_host *host)
-+{
-+ return stsd_cmd_read_cxd(host, MMC_SEND_CSD, host->card.raw_csd);
-+}
-+
-+static int stsd_cmd_read_cid(struct stsd_host *host)
-+{
-+ return stsd_cmd_read_cxd(host, MMC_SEND_CID, host->card.raw_cid);
-+}
-+
-+static int stsd_cmd_all_send_cid(struct stsd_host *host)
-+{
-+ const size_t size = 128/8*sizeof(u8);
-+
-+ /* WEIRD, don't use CMDTYPE_BCR for MMC_ALL_SEND_CID */
-+ return stsd_send_command(host, MMC_ALL_SEND_CID, 0,
-+ host->card.rca << 16,
-+ host->card.raw_cid, size);
-+}
-+
-+static int stsd_cmd_set_relative_addr(struct stsd_host *host, unsigned int rca)
-+{
-+ int error;
-+ u32 reply;
-+
-+ error = stsd_send_command(host, MMC_SET_RELATIVE_ADDR, STSD_CMDTYPE_AC,
-+ rca, &reply, sizeof(reply));
-+ if (!error) {
-+ host->card.rca = reply >> 16;
-+ /* DBG("rca=%d, new_rca=%x\n", rca, host->card.rca); */
-+ }
-+ return error;
-+}
-+
-+
-+static int stsd_cmd_select_card(struct stsd_host *host)
-+{
-+ return stsd_send_command(host, MMC_SELECT_CARD, STSD_CMDTYPE_AC,
-+ host->card.rca << 16,
-+ NULL, 0);
-+}
-+
-+static int stsd_cmd_deselect_card(struct stsd_host *host)
-+{
-+ return stsd_send_command(host, MMC_SELECT_CARD, STSD_CMDTYPE_AC,
-+ 0,
-+ NULL, 0);
-+}
-+
-+static int stsd_cmd_set_block_len(struct stsd_host *host, unsigned int len)
-+{
-+ return stsd_send_command(host, MMC_SET_BLOCKLEN, STSD_CMDTYPE_AC,
-+ len,
-+ NULL, 0);
-+}
-+
-+static int stsd_app_cmd_set_bus_width(struct stsd_host *host, int width)
-+{
-+ int error;
-+ u16 val;
-+
-+ if (width == 4)
-+ val = SD_BUS_WIDTH_4;
-+ else
-+ val = SD_BUS_WIDTH_1;
-+
-+ error = stsd_send_app_command(host, SD_APP_SET_BUS_WIDTH,
-+ STSD_CMDTYPE_AC,
-+ val, NULL, 0);
-+ if (error)
-+ DBG("%s: error=%d (%08x)\n", __func__, error, error);
-+
-+ return error;
-+}
-+
-+
-+
-+static int stsd_setup_host_controller(struct stsd_host *host)
-+{
-+ const u32 mask = SDHCI_INT_RESPONSE | SDHCI_INT_DATA_END |
-+ SDHCI_INT_CARD_INSERT | SDHCI_INT_CARD_REMOVE |
-+ SDHCI_INT_TIMEOUT | SDHCI_INT_CRC |
-+ SDHCI_INT_END_BIT | SDHCI_INT_INDEX |
-+ SDHCI_INT_DATA_TIMEOUT | SDHCI_INT_DATA_CRC |
-+ SDHCI_INT_ACMD12ERR;
-+ u8 rst, pwr, clk_idx;
-+ int error;
-+
-+ /*
-+ * Reset host controller.
-+ */
-+
-+ /* write 1 to the Reset All bit in the Software Reset register ... */
-+ rst = SDHCI_RESET_ALL;
-+ stsd_hsr_out_u8(host, SDHCI_SOFTWARE_RESET, rst);
-+
-+ /* ... then wait for the Reset All bit to be cleared */
-+ error = stsd_hsr_wait_for_resp_u8(host, SDHCI_SOFTWARE_RESET,
-+ 0, rst,
-+ 100*(HZ/1000));
-+ if (error) {
-+ drv_printk(KERN_ERR, "host controller didn't get out of"
-+ " reset\n");
-+ goto done;
-+ }
-+
-+ /*
-+ * Setup interrupt sources.
-+ */
-+
-+ /* ack the interrupt sources that IOS uses ... */
-+ stsd_hsr_out_u32(host, SDHCI_INT_ENABLE, mask);
-+ stsd_hsr_in_u32(host, SDHCI_INT_ENABLE);
-+ /* ... then unmask them */
-+ stsd_hsr_out_u32(host, SDHCI_SIGNAL_ENABLE, mask);
-+ stsd_hsr_in_u32(host, SDHCI_SIGNAL_ENABLE);
-+
-+ /*
-+ * Setup bus power.
-+ */
-+
-+ /* FIXME, we should use capabilities register here */
-+ /* for now use 3.3V setting */
-+ pwr = SDHCI_POWER_330;
-+
-+ /* turn on bus power and use selected voltage setting */
-+ stsd_hsr_out_u8(host, SDHCI_POWER_CONTROL, pwr & ~SDHCI_POWER_ON);
-+ stsd_hsr_out_u8(host, SDHCI_POWER_CONTROL, pwr | SDHCI_POWER_ON);
-+
-+ /*
-+ * Initialize clocks.
-+ */
-+
-+ /* FIXME, we should use capabilities register here */
-+ /* for now use index 01h which is base clock divided by 2 */
-+ clk_idx = 1;
-+
-+ /* disable clock signalling... */
-+ stsd_hsr_out_u16(host, SDHCI_CLOCK_CONTROL, 0);
-+ /* ... then enable internal clock ... */
-+ stsd_hsr_out_u16(host, SDHCI_CLOCK_CONTROL,
-+ SDHCI_CLOCK_INT_EN |
-+ (clk_idx << SDHCI_DIVIDER_SHIFT));
-+ /* ... and wait until it gets stable */
-+ error = stsd_hsr_wait_for_resp_u16(host, SDHCI_CLOCK_CONTROL,
-+ SDHCI_CLOCK_INT_STABLE,
-+ SDHCI_CLOCK_INT_STABLE,
-+ 1*HZ);
-+ if (error) {
-+ drv_printk(KERN_ERR, "internal clock didn't get stable\n");
-+ goto done;
-+ }
-+
-+ /* SD clock can be enabled now */
-+ stsd_hsr_out_u16(host, SDHCI_CLOCK_CONTROL,
-+ SDHCI_CLOCK_INT_EN |
-+ SDHCI_CLOCK_CARD_EN |
-+ (1 << SDHCI_DIVIDER_SHIFT));
-+
-+ /*
-+ * Setup timeout.
-+ */
-+
-+ /* setup timeout to TMCLK * 2^27 */
-+ stsd_hsr_out_u8(host, SDHCI_TIMEOUT_CONTROL,
-+ STSD_TIMEOUT_CONTROL_DIV(27));
-+
-+done:
-+ if (error)
-+ DBG("%s: error=%d (%08x)\n", __func__, error, error);
-+
-+ return error;
-+}
-+
-+static int stsd_setup_card(struct stsd_host *host)
-+{
-+ const u8 check_pattern = 0xaa;
-+ u32 arg;
-+ u32 resp[4];
-+ int i;
-+ int error;
-+
-+ /* WEIRD, don't use CMDTYPE_BC for MMC_GO_IDLE_STATE */
-+ error = stsd_send_command(host, MMC_GO_IDLE_STATE, 0,
-+ 0, NULL, 0);
-+ if (error)
-+ goto done;
-+
-+#define STSD_VHS(a) ((((a)&0x0f)<<8))
-+#define STSD_VHS_27_36 STSD_VHS(0x1)
-+
-+ /* WEIRD, don't use CMDTYPE_BC for SD_SEND_IF_COND */
-+ arg = STSD_VHS_27_36 | check_pattern;
-+ error = stsd_send_command(host, SD_SEND_IF_COND, 0,
-+ arg, &resp, sizeof(resp));
-+ if (error)
-+ goto done;
-+
-+ if ((resp[0] & 0xff) != check_pattern) {
-+ DBG("arg=0x%x, resp[0]=0x%x\n", arg, resp[0]);
-+ error = -ENODEV;
-+ goto done;
-+ }
-+
-+ /*
-+ * At this point we have identified a v2.00 SD Memory Card.
-+ *
-+ */
-+
-+ /*
-+ * Get OCR
-+ */
-+
-+#define STSD_OCR_HCS (1<<30) /* Host Capacity Support */
-+#define STSD_OCR_CCS (1<<30) /* Card Capacity Support */
-+
-+ for (i = 0; i < 100; i++) {
-+ /* WEIRD, don't use CMDTYPE_BCR for MMC_APP_CMD */
-+ error = stsd_send_command(host, MMC_APP_CMD, STSD_CMDTYPE_AC,
-+ 0, NULL, 0);
-+ if (error)
-+ goto done;
-+
-+ /* WEIRD, don't use CMDTYPE_BCR for SD_APP_OP_COND */
-+ error = stsd_send_command(host, SD_APP_OP_COND, 0,
-+ STSD_OCR_HCS|
-+ MMC_VDD_32_33|MMC_VDD_33_34,
-+ &resp, sizeof(resp));
-+ if (error)
-+ goto done;
-+
-+ if ((resp[0] & MMC_CARD_BUSY) != 0) {
-+ /* card power up completed */
-+ break;
-+ }
-+
-+ error = -ETIMEDOUT;
-+ mdelay(10);
-+ }
-+ if (error) {
-+ drv_printk(KERN_ERR, "timed out while trying to get OCR\n");
-+ goto done;
-+ }
-+
-+ if ((resp[0] & STSD_OCR_CCS) != 0) {
-+ /* high capacity card */
-+ stsd_card_set_sdhc(host);
-+ }
-+
-+ error = stsd_cmd_all_send_cid(host);
-+ if (error)
-+ goto done;
-+
-+ error = stsd_cmd_set_relative_addr(host, 0);
-+ if (error)
-+ goto done;
-+
-+done:
-+ if (error)
-+ DBG("%s: error=%d (%08x)\n", __func__, error, error);
-+ return error;
-+}
-+
-+static int stsd_reopen_sdio(struct stsd_host *host)
-+{
-+ int error = 0;
-+
-+ starlet_close(host->fd);
-+ host->fd = starlet_open(stsd_dev_sdio_slot0, 1);
-+ if (host->fd < 0) {
-+ drv_printk(KERN_ERR, "unable to re-open %s\n",
-+ stsd_dev_sdio_slot0);
-+ error = -ENODEV;
-+ }
-+ return error;
-+}
-+
-+
-+static int stsd_welcome_card(struct stsd_host *host)
-+{
-+ size_t block_len; /* in bytes */
-+ u32 status;
-+ int error;
-+
-+ mutex_lock(&host->io_mutex);
-+
-+ /*
-+ * Re-open the sdio device if things look wrong.
-+ */
-+ error = stsd_get_status(host, &status);
-+ if (error == STARLET_EINVAL) {
-+ error = stsd_reopen_sdio(host);
-+ if (error)
-+ goto err_bad_card;
-+ }
-+
-+ /*
-+ * Try a normal initialization sequence first, and revert to
-+ * manual mode if that fails.
-+ */
-+
-+ stsd_reset_card(host);
-+
-+ error = stsd_get_status(host, &status);
-+ if (error)
-+ goto err_bad_card;
-+ if (!stsd_card_status_is_inserted(status)) {
-+ drv_printk(KERN_ERR, "no card found\n");
-+ goto err_bad_card;
-+ }
-+
-+ if (!stsd_card_status_is_initialized(status)) {
-+ /* manual initialization, needed for SDHC support */
-+ stsd_card_set_manual_setup(host);
-+
-+ error = stsd_reopen_sdio(host);
-+ if (error)
-+ goto err_bad_card;
-+
-+ error = stsd_setup_host_controller(host);
-+ if (error)
-+ goto err_bad_card;
-+
-+ error = stsd_setup_card(host);
-+ if (error)
-+ goto err_bad_card;
-+ }
-+
-+#if 0
-+ /* read Operating Conditions Register */
-+ error = stsd_get_ocr(host);
-+ if (error < 0)
-+ goto err_bad_card;
-+#endif
-+
-+ error = stsd_cmd_deselect_card(host);
-+ if (error)
-+ goto err_bad_card;
-+
-+ /* read and decode the Card Specific Data */
-+ error = stsd_cmd_read_csd(host);
-+ if (error)
-+ goto err_bad_card;
-+ mmc_decode_csd(&host->card);
-+
-+ /* read and decode the Card Identification Data */
-+ error = stsd_cmd_read_cid(host);
-+ if (error)
-+ goto err_bad_card;
-+ mmc_decode_cid(&host->card);
-+
-+ error = stsd_cmd_select_card(host);
-+ if (error)
-+ goto err_bad_card;
-+
-+ stsd_set_clock(host, host->card.csd.max_dtr);
-+
-+ /* FIXME check if card supports 4 bit bus width */
-+ stsd_set_bus_width(host, 4);
-+ error = stsd_app_cmd_set_bus_width(host, 4);
-+ if (error)
-+ goto err_bad_card;
-+
-+ /* setup block length */
-+ block_len = KERNEL_SECTOR_SIZE;
-+ error = stsd_cmd_set_block_len(host, block_len);
-+ if (error)
-+ goto err_bad_card;
-+
-+#if 0
-+ mmc_card_set_present(&host->card);
-+#endif
-+
-+ mutex_unlock(&host->io_mutex);
-+
-+ drv_printk(KERN_INFO, "descr \"%s\", size %luk, block %ub,"
-+ " serial %08x\n",
-+ host->card.cid.prod_name,
-+ (unsigned long)((host->card.csd.capacity / 1024) *
-+ (1 << host->card.csd.read_blkbits)),
-+ 1 << host->card.csd.read_blkbits,
-+ host->card.cid.serial);
-+
-+ error = 0;
-+ goto out;
-+
-+err_bad_card:
-+ mutex_unlock(&host->io_mutex);
-+ stsd_card_set_bad(host);
-+out:
-+ return error;
-+}
-+
-+
-+/*
-+ * Block layer helper routines.
-+ *
-+ */
-+
-+static int stsd_do_block_transfer(struct stsd_host *host, int write,
-+ unsigned long start,
-+ void *buf, size_t nr_blocks)
-+{
-+ struct stsd_xfer *xfer = host->xfer;
-+ struct stsd_command *cmd = xfer->cmd;
-+ int error;
-+
-+ xfer->direction = (write) ? DMA_TO_DEVICE : DMA_FROM_DEVICE;
-+ xfer->size = nr_blocks * xfer->blk_size;
-+
-+ if (xfer->size > xfer->bounce_buf_size) {
-+ drv_printk(KERN_ERR, "oops, request size %d > %d\n",
-+ xfer->size, xfer->bounce_buf_size);
-+ return -ENOMEM;
-+ }
-+
-+ /*
-+ * This is stupid.
-+ * Starlet expects the buffer to be an input iovec (from starlet
-+ * point of view) even for reads. Thus, map the buffer explicitly here.
-+ */
-+ if (write)
-+ memcpy(xfer->bounce_buf, buf, xfer->size);
-+ __dma_sync(xfer->bounce_buf, xfer->size, xfer->direction);
-+/*
-+ xfer->dma_addr = dma_map_single(host->dev, buf,
-+ xfer->size, xfer->direction);
-+*/
-+
-+ starlet_ioh_sg_init_table(xfer->in, 2);
-+ starlet_ioh_sg_set_buf(&xfer->in[0], cmd, sizeof(*cmd));
-+ starlet_ioh_sg_set_buf(&xfer->in[1], xfer->bounce_buf, xfer->size);
-+
-+ starlet_ioh_sg_init_table(xfer->io, 1);
-+ starlet_ioh_sg_set_buf(&xfer->io[0], xfer->reply, xfer->reply_len);
-+
-+ cmd->opcode = (write) ? MMC_WRITE_MULTIPLE_BLOCK :
-+ MMC_READ_MULTIPLE_BLOCK;
-+ cmd->arg = start;
-+ cmd->cmdtype = STSD_CMDTYPE_AC; /* STSD_CMDTYPE_ADTC */
-+ cmd->rsptype = stsd_opcode_to_rsptype(cmd->opcode);
-+ cmd->blk_count = nr_blocks;
-+ cmd->blk_size = xfer->blk_size;
-+ cmd->dma_addr = xfer->dma_addr; /* bounce buf */
-+ cmd->is_dma = 1;
-+
-+ error = starlet_ioh_ioctlv(host->fd, STSD_IOCTLV_SENDCMD,
-+ 2, xfer->in, 1, xfer->io);
-+/*
-+ dma_unmap_single(host->dev,
-+ xfer->dma_addr, xfer->size, xfer->direction);
-+*/
-+
-+ if (!write)
-+ memcpy(buf, xfer->bounce_buf, xfer->size);
-+
-+ if (error)
-+ DBG("%s: error=%d (%08x)\n", __func__, error, error);
-+
-+ return error;
-+}
-+
-+/*
-+ * Returns >0 if a request should be dispatched.
-+ */
-+static int stsd_check_request(struct stsd_host *host, struct request *req)
-+{
-+ unsigned long nr_sectors;
-+
-+ if (test_bit(__STSD_MEDIA_CHANGED, &host->flags)) {
-+ drv_printk(KERN_ERR, "media changed, aborting\n");
-+ return -ENOMEDIUM;
-+ }
-+
-+ /* unit is kernel sectors */
-+ nr_sectors =
-+ host->card.csd.capacity << (host->card.csd.read_blkbits -
-+ KERNEL_SECTOR_SHIFT);
-+
-+ /* keep our reads within limits */
-+ if (req->sector + req->current_nr_sectors > nr_sectors) {
-+ drv_printk(KERN_ERR, "reading past end, aborting\n");
-+ return -EINVAL;
-+ }
-+
-+ if (!blk_fs_request(req))
-+ return 0;
-+
-+ return 1;
-+}
-+
-+static int stsd_do_request(struct stsd_host *host, struct request *req)
-+{
-+ unsigned long nr_blocks; /* in card blocks */
-+ unsigned long start;
-+ int write;
-+ int uptodate;
-+ int error;
-+
-+ uptodate = stsd_check_request(host, req);
-+ if (uptodate <= 0)
-+ return uptodate;
-+
-+ write = (rq_data_dir(req) == READ) ? 0 : 1;
-+
-+ start = req->sector;
-+ if (!stsd_card_is_sdhc(host))
-+ start <<= KERNEL_SECTOR_SHIFT;
-+ nr_blocks = req->current_nr_sectors;
-+
-+ error = stsd_do_block_transfer(host, write,
-+ start, req->buffer, nr_blocks);
-+ if (error)
-+ DBG("%s: error=%d (%08x), start=%lu, \n", __func__,
-+ error, error, start);
-+
-+ return error;
-+}
-+
-+static int stsd_io_thread(void *param)
-+{
-+ struct stsd_host *host = param;
-+ struct request *req;
-+ unsigned long flags;
-+ int error;
-+
-+ current->flags |= PF_NOFREEZE|PF_MEMALLOC;
-+
-+ mutex_lock(&host->io_mutex);
-+ for (;;) {
-+ req = NULL;
-+ set_current_state(TASK_INTERRUPTIBLE);
-+
-+ spin_lock_irqsave(&host->queue_lock, flags);
-+ if (!blk_queue_plugged(host->queue))
-+ req = elv_next_request(host->queue);
-+ spin_unlock_irqrestore(&host->queue_lock, flags);
-+
-+ if (!req) {
-+ if (kthread_should_stop()) {
-+ set_current_state(TASK_RUNNING);
-+ break;
-+ }
-+ mutex_unlock(&host->io_mutex);
-+ schedule();
-+ mutex_lock(&host->io_mutex);
-+ continue;
-+ }
-+ set_current_state(TASK_INTERRUPTIBLE);
-+ error = stsd_do_request(host, req);
-+
-+ spin_lock_irqsave(&host->queue_lock, flags);
-+ __blk_end_request(req, error, blk_rq_bytes(req));
-+ spin_unlock_irqrestore(&host->queue_lock, flags);
-+ }
-+ mutex_unlock(&host->io_mutex);
-+
-+ return 0;
-+}
-+
-+static void stsd_request_func(struct request_queue *q)
-+{
-+ struct stsd_host *host = q->queuedata;
-+
-+ wake_up_process(host->io_thread);
-+}
-+
-+/*
-+ * Block device hooks.
-+ *
-+ */
-+
-+static DECLARE_MUTEX(open_lock);
-+
-+static int stsd_open(struct block_device *bdev, fmode_t mode)
-+{
-+ struct stsd_host *host = bdev->bd_disk->private_data;
-+ int error = 0;
-+
-+ if (!host || host->fd < 0)
-+ return -ENXIO;
-+
-+ /* honor exclusive open mode */
-+ if (host->refcnt == -1 ||
-+ (host->refcnt && (mode & FMODE_EXCL))) {
-+ error = -EBUSY;
-+ goto out;
-+ }
-+
-+ /* this takes care of revalidating the media if needed */
-+ check_disk_change(bdev);
-+ if (!host->card.csd.capacity) {
-+ error = -ENOMEDIUM;
-+ goto out;
-+ }
-+
-+ down(&open_lock);
-+
-+ if ((mode & FMODE_EXCL))
-+ host->refcnt = -1;
-+ else
-+ host->refcnt++;
-+
-+ up(&open_lock);
-+
-+out:
-+ return error;
-+
-+}
-+
-+static int stsd_release(struct gendisk *disk, fmode_t mode)
-+{
-+ struct stsd_host *host = disk->private_data;
-+
-+ if (!host)
-+ return -ENXIO;
-+
-+ down(&open_lock);
-+
-+ if (host->refcnt > 0)
-+ host->refcnt--;
-+ else
-+ host->refcnt = 0;
-+
-+ up(&open_lock);
-+
-+ if (!host->refcnt && host->fd == -1)
-+ kfree(host);
-+
-+ return 0;
-+}
-+
-+static int stsd_media_changed(struct gendisk *disk)
-+{
-+ struct stsd_host *host = disk->private_data;
-+ unsigned int last_serial;
-+ int error;
-+
-+ /* report a media change for zombies */
-+ if (!host)
-+ return 1;
-+
-+ /* report a media change if someone forced it */
-+ if (test_bit(__STSD_MEDIA_CHANGED, &host->flags))
-+ return 1;
-+
-+ /* REVISIT use the starlet provided iotcl to check the status */
-+
-+ mutex_lock(&host->io_mutex);
-+
-+ /* check if the serial number of the card changed */
-+ last_serial = host->card.cid.serial;
-+ error = stsd_cmd_deselect_card(host);
-+ if (!error) {
-+ error = stsd_cmd_read_cid(host);
-+ if (!error)
-+ error = stsd_cmd_select_card(host);
-+ }
-+
-+ mutex_unlock(&host->io_mutex);
-+
-+ if (!error && last_serial == host->card.cid.serial && last_serial)
-+ clear_bit(__STSD_MEDIA_CHANGED, &host->flags);
-+ else
-+ set_bit(__STSD_MEDIA_CHANGED, &host->flags);
-+
-+ return (host->flags & STSD_MEDIA_CHANGED) ? 1 : 0;
-+}
-+
-+static int stsd_revalidate_disk(struct gendisk *disk)
-+{
-+ struct stsd_host *host = disk->private_data;
-+ int error = 0;
-+
-+ /* report missing medium for zombies */
-+ if (!host) {
-+ error = -ENOMEDIUM;
-+ goto out;
-+ }
-+
-+ /* the block layer likes to call us multiple times... */
-+ if (!stsd_media_changed(host->disk))
-+ goto out;
-+
-+ /* get the card into a known status */
-+ error = stsd_welcome_card(host);
-+ if (error < 0 || stsd_card_is_bad(host)) {
-+ drv_printk(KERN_ERR, "card welcome failed\n");
-+ if (stsd_card_is_bad(host))
-+ drv_printk(KERN_ERR, "stsd_card_is_bad() true\n");
-+ if (error < 0)
-+ drv_printk(KERN_ERR, "error = %d\n", error);
-+ error = -ENOMEDIUM;
-+ /* FALL THROUGH */
-+ }
-+
-+ /* inform the block layer about various sizes */
-+ blk_queue_hardsect_size(host->queue, KERNEL_SECTOR_SIZE);
-+ set_capacity(host->disk, host->card.csd.capacity <<
-+ (host->card.csd.read_blkbits - KERNEL_SECTOR_SHIFT));
-+
-+ clear_bit(__STSD_MEDIA_CHANGED, &host->flags);
-+
-+out:
-+ if (error)
-+ DBG("%s: error=%d (%08x)\n", __func__, error, error);
-+ return error;
-+}
-+
-+static int stsd_getgeo(struct block_device *bdev, struct hd_geometry *geo)
-+{
-+ geo->cylinders = get_capacity(bdev->bd_disk) / (4 * 16);
-+ geo->heads = 4;
-+ geo->sectors = 16;
-+ return 0;
-+}
-+
-+static struct block_device_operations stsd_fops = {
-+ .owner = THIS_MODULE,
-+ .open = stsd_open,
-+ .release = stsd_release,
-+ .revalidate_disk = stsd_revalidate_disk,
-+ .media_changed = stsd_media_changed,
-+ .getgeo = stsd_getgeo,
-+};
-+
-+/*
-+ * Setup routines.
-+ *
-+ */
-+
-+static int stsd_init_xfer(struct stsd_host *host)
-+{
-+ struct stsd_xfer *xfer;
-+
-+ xfer = starlet_kzalloc(sizeof(*xfer), GFP_KERNEL);
-+ if (!xfer)
-+ return -ENOMEM;
-+
-+ xfer->reply_len = 4 * sizeof(u32);
-+ xfer->reply = starlet_ioh_kzalloc(xfer->reply_len);
-+ if (!xfer->reply) {
-+ starlet_kfree(xfer);
-+ return -ENOMEM;
-+ }
-+ xfer->cmd = starlet_ioh_kzalloc(sizeof(*xfer->cmd));
-+ if (!xfer->cmd) {
-+ starlet_ioh_kfree(xfer->reply);
-+ starlet_kfree(xfer);
-+ return -ENOMEM;
-+ }
-+ xfer->bounce_buf_size = STSD_MAX_SECTORS * KERNEL_SECTOR_SIZE;
-+ xfer->bounce_buf = starlet_ioh_kzalloc(xfer->bounce_buf_size);
-+ if (!xfer->bounce_buf) {
-+ starlet_ioh_kfree(xfer->cmd);
-+ starlet_ioh_kfree(xfer->reply);
-+ starlet_kfree(xfer);
-+ return -ENOMEM;
-+ }
-+ xfer->dma_addr = starlet_ioh_virt_to_phys(xfer->bounce_buf);
-+
-+ xfer->blk_size = KERNEL_SECTOR_SIZE;
-+
-+ host->xfer = xfer;
-+
-+ return 0;
-+}
-+
-+static void stsd_exit_xfer(struct stsd_host *host)
-+{
-+ struct stsd_xfer *xfer = host->xfer;
-+
-+ starlet_ioh_kfree(xfer->cmd);
-+ starlet_ioh_kfree(xfer->reply);
-+ starlet_kfree(host->xfer);
-+}
-+
-+static int stsd_init_blk_dev(struct stsd_host *host)
-+{
-+ struct gendisk *disk;
-+ struct request_queue *queue;
-+ int error;
-+
-+ mutex_init(&host->io_mutex);
-+
-+ /* queue */
-+ error = -ENOMEM;
-+ spin_lock_init(&host->queue_lock);
-+ queue = blk_init_queue(stsd_request_func, &host->queue_lock);
-+ if (!queue) {
-+ drv_printk(KERN_ERR, "error initializing queue\n");
-+ goto err_blk_init_queue;
-+ }
-+ host->max_phys_segments = 1;
-+ blk_queue_max_phys_segments(queue, host->max_phys_segments);
-+ blk_queue_max_hw_segments(queue, host->max_phys_segments);
-+ blk_queue_max_sectors(queue, STSD_MAX_SECTORS); /* 16 * 512 = 8K */
-+ blk_queue_dma_alignment(queue, STARLET_IPC_DMA_ALIGN);
-+ queue->queuedata = host;
-+ host->queue = queue;
-+
-+ /* disk */
-+ disk = alloc_disk(1 << MMC_SHIFT);
-+ if (!disk) {
-+ drv_printk(KERN_ERR, "error allocating disk\n");
-+ goto err_alloc_disk;
-+ }
-+ disk->major = STSD_MAJOR;
-+ disk->first_minor = 0 << MMC_SHIFT;
-+ disk->fops = &stsd_fops;
-+ sprintf(disk->disk_name, "%s%c", STSD_NAME, 'a');
-+ disk->private_data = host;
-+ disk->queue = host->queue;
-+ host->disk = disk;
-+
-+ error = 0;
-+ goto out;
-+
-+err_alloc_disk:
-+ blk_cleanup_queue(host->queue);
-+ host->queue = NULL;
-+err_blk_init_queue:
-+out:
-+ return error;
-+}
-+
-+static void stsd_exit_blk_dev(struct stsd_host *host)
-+{
-+ blk_cleanup_queue(host->queue);
-+ put_disk(host->disk);
-+}
-+
-+static int stsd_init_io_thread(struct stsd_host *host)
-+{
-+ int result = 0;
-+
-+ host->io_thread = kthread_run(stsd_io_thread, host, "ksdio");
-+ if (IS_ERR(host->io_thread)) {
-+ drv_printk(KERN_ERR, "error creating io thread\n");
-+ result = PTR_ERR(host->io_thread);
-+ }
-+ return result;
-+}
-+
-+static void stsd_exit_io_thread(struct stsd_host *host)
-+{
-+ if (!IS_ERR(host->io_thread)) {
-+ wake_up_process(host->io_thread);
-+ kthread_stop(host->io_thread);
-+ host->io_thread = ERR_PTR(-EINVAL);
-+ }
-+}
-+
-+static int stsd_init(struct stsd_host *host)
-+{
-+ int error;
-+
-+ host->refcnt = 0;
-+ spin_lock_init(&host->lock);
-+ set_bit(__STSD_MEDIA_CHANGED, &host->flags);
-+ host->f_max = 25000000; /* 25MHz */
-+
-+ host->fd = starlet_open(stsd_dev_sdio_slot0, 0);
-+ if (host->fd < 0) {
-+ drv_printk(KERN_ERR, "unable to open %s\n",
-+ stsd_dev_sdio_slot0);
-+ return -ENODEV;
-+ }
-+
-+ error = stsd_init_blk_dev(host);
-+ if (error)
-+ goto out;
-+
-+ error = stsd_init_xfer(host);
-+ if (error)
-+ goto err_blk_dev;
-+
-+ error = stsd_revalidate_disk(host->disk);
-+#if 0
-+ if (error < 0 || !mmc_card_present(&host->card)) {
-+ error = -ENODEV;
-+ goto err_xfer;
-+ }
-+#endif
-+
-+ error = stsd_init_io_thread(host);
-+ if (error)
-+ goto err_xfer;
-+
-+ add_disk(host->disk);
-+
-+ return 0;
-+
-+err_xfer:
-+ stsd_exit_xfer(host);
-+err_blk_dev:
-+ stsd_exit_blk_dev(host);
-+out:
-+ return error;
-+}
-+
-+static void stsd_exit(struct stsd_host *host)
-+{
-+ del_gendisk(host->disk);
-+ stsd_exit_io_thread(host);
-+ stsd_exit_xfer(host);
-+ stsd_exit_blk_dev(host);
-+ if (host->fd >= 0)
-+ starlet_close(host->fd);
-+ host->fd = -1;
-+
-+}
-+
-+static void stsd_kill(struct stsd_host *host)
-+{
-+ if (host->refcnt > 0) {
-+ drv_printk(KERN_ERR, "hey! card removed while in use!\n");
-+ set_bit(__STSD_MEDIA_CHANGED, &host->flags);
-+ }
-+
-+ stsd_exit(host);
-+
-+ /* release the host immediately when not in use */
-+ if (!host->refcnt)
-+ kfree(host);
-+}
-+
-+/*
-+ * Driver model helper routines.
-+ *
-+ */
-+
-+static int __devinit stsd_do_probe(struct device *dev)
-+{
-+ struct stsd_host *host;
-+ int error;
-+
-+ host = kzalloc(sizeof(*host), GFP_KERNEL);
-+ if (!host) {
-+ drv_printk(KERN_ERR, "%s: failed to allocate stsd_host\n",
-+ __func__);
-+ return -ENOMEM;
-+ }
-+ dev_set_drvdata(dev, host);
-+ host->dev = dev;
-+
-+ error = stsd_init(host);
-+ if (error) {
-+ kfree(host);
-+ dev_set_drvdata(dev, NULL);
-+ }
-+
-+ return error;
-+}
-+
-+static int __devexit stsd_do_remove(struct device *dev)
-+{
-+ struct stsd_host *host = dev_get_drvdata(dev);
-+
-+ if (!host)
-+ return -ENODEV;
-+
-+ stsd_kill(host);
-+ dev_set_drvdata(dev, NULL);
-+
-+ return 0;
-+}
-+
-+/*
-+ * OF platform device routines.
-+ *
-+ */
-+
-+static int __init stsd_of_probe(struct of_device *odev,
-+ const struct of_device_id *match)
-+{
-+ return stsd_do_probe(&odev->dev);
-+}
-+
-+static int __exit stsd_of_remove(struct of_device *odev)
-+{
-+ return stsd_do_remove(&odev->dev);
-+}
-+
-+static struct of_device_id stsd_of_match[] = {
-+ { .compatible = "nintendo,starlet-sd" },
-+ { },
-+};
-+
-+MODULE_DEVICE_TABLE(of, stsd_of_match);
-+
-+static struct of_platform_driver stsd_of_driver = {
-+ .owner = THIS_MODULE,
-+ .name = DRV_MODULE_NAME,
-+ .match_table = stsd_of_match,
-+ .probe = stsd_of_probe,
-+ .remove = stsd_of_remove,
-+};
-+
-+
-+/*
-+ * Kernel module interface.
-+ *
-+ */
-+
-+static int __init stsd_init_module(void)
-+{
-+ drv_printk(KERN_INFO, "%s - version %s\n", DRV_DESCRIPTION,
-+ stsd_driver_version);
-+
-+ if (register_blkdev(STSD_MAJOR, DRV_MODULE_NAME)) {
-+ drv_printk(KERN_ERR, "unable to register major %d\n",
-+ STSD_MAJOR);
-+ return -EIO;
-+ }
-+
-+ return of_register_platform_driver(&stsd_of_driver);
-+}
-+
-+static void __exit stsd_exit_module(void)
-+{
-+ of_unregister_platform_driver(&stsd_of_driver);
-+ unregister_blkdev(STSD_MAJOR, DRV_MODULE_NAME);
-+}
-+
-+module_init(stsd_init_module);
-+module_exit(stsd_exit_module);
-+
-+MODULE_AUTHOR(DRV_AUTHOR);
-+MODULE_DESCRIPTION(DRV_DESCRIPTION);
-+MODULE_LICENSE("GPL");
-+
-diff --git a/drivers/exi/Kconfig b/drivers/exi/Kconfig
-new file mode 100644
-index 0000000..c810782
---- /dev/null
-+++ b/drivers/exi/Kconfig
-@@ -0,0 +1,20 @@
-+#
-+# Nintendo GameCube EXI (Expansion Interface) support.
-+#
-+
-+if GAMECUBE_COMMON
-+
-+menu "EXI support"
-+
-+config GAMECUBE_EXI
-+ bool "Nintendo GameCube/Wii External Interface (EXI)"
-+ default y
-+ help
-+ On the External Interface sit the memory card slots,
-+ serial ports I & II, the Mask ROM, RTC, SRAM and UART.
-+
-+ If in doubt, say Y here.
-+
-+endmenu
-+
-+endif
-diff --git a/drivers/exi/Makefile b/drivers/exi/Makefile
-new file mode 100644
-index 0000000..eb80bce
---- /dev/null
-+++ b/drivers/exi/Makefile
-@@ -0,0 +1,5 @@
-+#
-+# Makefile for the EXI bus core.
-+#
-+
-+obj-$(CONFIG_GAMECUBE_EXI) += exi-driver.o exi-hw.o
-diff --git a/drivers/exi/exi-driver.c b/drivers/exi/exi-driver.c
-new file mode 100644
-index 0000000..ae173a5
---- /dev/null
-+++ b/drivers/exi/exi-driver.c
-@@ -0,0 +1,515 @@
-+/*
-+ * drivers/exi/exi-driver.c
-+ *
-+ * Nintendo GameCube EXternal Interface (EXI) driver model routines.
-+ * Copyright (C) 2004-2009 The GameCube Linux Team
-+ * Copyright (C) 2004 Arthur Othieno <a.othieno@bluewin.ch>
-+ * Copyright (C) 2004,2005 Todd Jeffreys <todd@voidpointer.org>
-+ * Copyright (C) 2005,2006,2007,2008,2009 Albert Herranz
-+ *
-+ * This program is free software; you can redistribute it and/or
-+ * modify it under the terms of the 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/delay.h>
-+#include <linux/exi.h>
-+#include <linux/init.h>
-+#include <linux/kthread.h>
-+#include <linux/module.h>
-+#include <linux/of_platform.h>
-+
-+#define DRV_MODULE_NAME "exi"
-+#define DRV_DESCRIPTION "Nintendo GameCube/Wii EXternal Interface (EXI) driver"
-+#define DRV_AUTHOR "Arthur Othieno <a.othieno@bluewin.ch>, " \
-+ "Todd Jeffreys <todd@voidpointer.org>, " \
-+ "Albert Herranz"
-+
-+static char exi_driver_version[] = "4.0i";
-+
-+#define drv_printk(level, format, arg...) \
-+ printk(level DRV_MODULE_NAME ": " format , ## arg)
-+
-+
-+struct exi_map_id_to_name {
-+ unsigned int id;
-+ char *name;
-+};
-+
-+
-+static void exi_bus_device_release(struct device *dev);
-+static int exi_bus_match(struct device *dev, struct device_driver *drv);
-+
-+
-+static struct bus_type exi_bus_type = {
-+ .name = "exi",
-+ .match = exi_bus_match,
-+};
-+EXPORT_SYMBOL(exi_bus_type);
-+
-+static struct device exi_bus_devices[EXI_MAX_CHANNELS] = {
-+ [0] = {
-+ .bus_id = "exi0",
-+ .release = exi_bus_device_release,
-+ .parent = NULL
-+ },
-+ [1] = {
-+ .bus_id = "exi1",
-+ .release = exi_bus_device_release,
-+ .parent = NULL
-+ },
-+ [2] = {
-+ .bus_id = "exi2",
-+ .release = exi_bus_device_release,
-+ .parent = NULL
-+ },
-+};
-+
-+static struct exi_device exi_devices[EXI_MAX_CHANNELS][EXI_DEVICES_PER_CHANNEL];
-+
-+static struct exi_map_id_to_name exi_map_id_to_name[] = {
-+ { .id = EXI_ID_NONE, .name = "(external card)" },
-+ { .id = 0xffff1698, .name = "GameCube Mask ROM/RTC/SRAM/UART" },
-+ { .id = 0xfffff308, .name = "Wii Mask ROM/RTC/SRAM/UART" },
-+ { .id = 0x00000004, .name = "Memory Card 59" },
-+ { .id = 0x00000008, .name = "Memory Card 123" },
-+ { .id = 0x00000010, .name = "Memory Card 251" },
-+ { .id = 0x00000020, .name = "Memory Card 507" },
-+ { .id = 0x00000040, .name = "Memory Card 1019" },
-+ { .id = 0x00000080, .name = "Memory Card 2043" },
-+ { .id = 0x01010000, .name = "USB Adapter" },
-+ { .id = 0x01020000, .name = "NPDP GDEV" },
-+ { .id = 0x02020000, .name = "Modem" },
-+ { .id = 0x03010000, .name = "Marlin?" },
-+ { .id = 0x04020200, .name = "BroadBand Adapter (DOL-015)" },
-+ { .id = 0x04120000, .name = "AD16" },
-+ { .id = 0x05070000, .name = "IS Viewer" },
-+ { .id = 0x0a000000, .name = "Microphone (DOL-022)" },
-+ { .id = 0 }
-+};
-+
-+/*
-+ * Internal. Return the friendly name of an exi identifier.
-+ */
-+static const char *exi_name_id(unsigned int id)
-+{
-+ struct exi_map_id_to_name *map = exi_map_id_to_name;
-+
-+ while (map->id) {
-+ if (map->id == id)
-+ return map->name;
-+ map++;
-+ }
-+ return "Unknown";
-+}
-+
-+/*
-+ * Internal. Check if an exi device matches a given exi device id.
-+ */
-+static int exi_device_match_one(const struct exi_device_id *eid,
-+ const struct exi_device *exi_device)
-+{
-+ /*
-+ * We allow drivers to claim devices that do not provide
-+ * EXI identifiers by matching directly on channel/device.
-+ * These drivers must use EXI_ID_NONE on their eids.
-+ */
-+ if (eid->id == exi_device->eid.id || eid->id == EXI_ID_NONE) {
-+ /* match against channel and device */
-+ if (exi_device->eid.channel == eid->channel &&
-+ exi_device->eid.device == eid->device) {
-+ return 1;
-+ }
-+ }
-+ return 0;
-+}
-+
-+/*
-+ * Internal. Check if an exi device matches a given set of exi device ids.
-+ * Return the exi device identifier or %NULL if there is no match.
-+ */
-+static const struct exi_device_id *
-+exi_device_match(const struct exi_device_id *eids,
-+ const struct exi_device *exi_device)
-+{
-+ while (eids && eids->id) {
-+ if (exi_device_match_one(eids, exi_device))
-+ return eids;
-+ eids++;
-+ }
-+ return NULL;
-+}
-+
-+/*
-+ * Internal. Used to check if an exi device is supported by an exi driver.
-+ */
-+static int exi_bus_match(struct device *dev, struct device_driver *drv)
-+{
-+ struct exi_device *exi_device = to_exi_device(dev);
-+ struct exi_driver *exi_driver = to_exi_driver(drv);
-+ const struct exi_device_id *eids = exi_driver->eid_table;
-+
-+ if (eids && exi_device_match(eids, exi_device))
-+ return 1;
-+ return 0;
-+}
-+
-+/*
-+ * Internal. Bus device release.
-+ */
-+static void exi_bus_device_release(struct device *dev)
-+{
-+ drv_printk(KERN_WARNING, "exi_bus_device_release called!\n");
-+}
-+
-+static void exi_device_release(struct device *dev);
-+
-+/*
-+ * Internal. Initialize an exi_device structure.
-+ */
-+static void exi_device_init(struct exi_device *exi_device,
-+ unsigned int channel, unsigned int device)
-+{
-+ memset(exi_device, 0, sizeof(*exi_device));
-+
-+ exi_device->eid.id = EXI_ID_INVALID;
-+ exi_device->eid.channel = channel;
-+ exi_device->eid.device = device;
-+ exi_device->frequency = EXI_FREQ_SCAN;
-+
-+ exi_device->exi_channel = to_exi_channel(channel);
-+
-+ exi_device->dev.parent = &exi_bus_devices[channel];
-+ exi_device->dev.bus = &exi_bus_type;
-+ sprintf(exi_device->dev.bus_id, "exi%01x:%01x", channel, device);
-+ exi_device->dev.platform_data = to_exi_channel(channel);
-+ exi_device->dev.release = exi_device_release;
-+}
-+
-+/*
-+ * Internal. Device release.
-+ */
-+static void exi_device_release(struct device *dev)
-+{
-+ struct exi_device *exi_device = to_exi_device(dev);
-+ unsigned int channel, device;
-+
-+ channel = exi_device->eid.channel;
-+ device = exi_device->eid.device;
-+
-+ exi_device_init(exi_device, channel, device);
-+}
-+
-+/**
-+ * exi_device_get - Increments the reference count of the exi device
-+ * @exi_device: device being referenced
-+ *
-+ * Each live reference to an exi device should be refcounted.
-+ * A pointer to the device with the incremented reference counter
-+ * is returned.
-+ */
-+struct exi_device *exi_device_get(struct exi_device *exi_device)
-+{
-+ if (exi_device)
-+ get_device(&exi_device->dev);
-+ return exi_device;
-+}
-+EXPORT_SYMBOL(exi_device_get);
-+
-+/**
-+ * exi_device_put - Releases a use of the exi device
-+ * @exi_device: device that's been disconnected
-+ *
-+ * Must be called when a user of a device is finished with it.
-+ */
-+void exi_device_put(struct exi_device *exi_device)
-+{
-+ if (exi_device)
-+ put_device(&exi_device->dev);
-+}
-+EXPORT_SYMBOL(exi_device_put);
-+
-+/**
-+ * exi_get_exi_device - Returns a reference to an exi device
-+ * @exi_channel: exi channel where the device is located
-+ * @device: device number within the channel
-+ */
-+struct exi_device *exi_get_exi_device(struct exi_channel *exi_channel,
-+ int device)
-+{
-+ /* REVISIT, take a ref here? */
-+ return &exi_devices[to_channel(exi_channel)][device];
-+}
-+EXPORT_SYMBOL(exi_get_exi_device);
-+
-+/*
-+ * Internal. Call device driver probe function on match.
-+ */
-+static int exi_device_probe(struct device *dev)
-+{
-+ struct exi_device *exi_device = to_exi_device(dev);
-+ struct exi_driver *exi_driver = to_exi_driver(dev->driver);
-+ const struct exi_device_id *eid;
-+ int retval = -ENODEV;
-+
-+ if (!exi_driver->eid_table)
-+ goto out;
-+
-+ eid = exi_device_match(exi_driver->eid_table, exi_device);
-+ if (eid) {
-+ exi_device->frequency = exi_driver->frequency;
-+ if (exi_driver->probe)
-+ retval = exi_driver->probe(exi_device);
-+ }
-+ if (retval >= 0)
-+ retval = 0;
-+
-+out:
-+ return retval;
-+}
-+
-+/*
-+ * Internal. Call device driver remove function.
-+ */
-+static int exi_device_remove(struct device *dev)
-+{
-+ struct exi_device *exi_device = to_exi_device(dev);
-+ struct exi_driver *exi_driver = to_exi_driver(dev->driver);
-+
-+ if (exi_driver->remove)
-+ exi_driver->remove(exi_device);
-+
-+ return 0;
-+}
-+
-+
-+/**
-+ * exi_driver_register - register an EXI device driver.
-+ * @driver: driver structure to register.
-+ *
-+ * Registers an EXI device driver with the bus
-+ * and consequently with the driver model core.
-+ */
-+int exi_driver_register(struct exi_driver *driver)
-+{
-+ driver->driver.name = driver->name;
-+ driver->driver.bus = &exi_bus_type;
-+ driver->driver.probe = exi_device_probe;
-+ driver->driver.remove = exi_device_remove;
-+
-+ return driver_register(&driver->driver);
-+}
-+EXPORT_SYMBOL(exi_driver_register);
-+
-+/**
-+ * exi_driver_unregister - unregister an EXI device driver.
-+ * @driver: driver structure to unregister.
-+ *
-+ * Unregisters an EXI device driver with the bus
-+ * and consequently with the driver model core.
-+ */
-+void exi_driver_unregister(struct exi_driver *driver)
-+{
-+ driver_unregister(&driver->driver);
-+}
-+EXPORT_SYMBOL(exi_driver_unregister);
-+
-+
-+/*
-+ * Internal. Re-scan a given device.
-+ */
-+static void exi_device_rescan(struct exi_device *exi_device)
-+{
-+ unsigned int id;
-+ int error;
-+
-+ /* now ID the device */
-+ id = exi_get_id(exi_device);
-+
-+ if (exi_device->eid.id != EXI_ID_INVALID) {
-+ /* device removed or changed */
-+ drv_printk(KERN_INFO, "about to remove [%s] id=0x%08x %s\n",
-+ exi_device->dev.bus_id,
-+ exi_device->eid.id,
-+ exi_name_id(exi_device->eid.id));
-+ device_unregister(&exi_device->dev);
-+ drv_printk(KERN_INFO, "remove completed\n");
-+ exi_device->eid.id = EXI_ID_INVALID;
-+ }
-+
-+ if (id != EXI_ID_INVALID) {
-+ /* a new device has been found */
-+ drv_printk(KERN_INFO, "about to add [%s] id=0x%08x %s\n",
-+ exi_device->dev.bus_id,
-+ id, exi_name_id(id));
-+ exi_device->eid.id = id;
-+ error = device_register(&exi_device->dev);
-+ if (error) {
-+ drv_printk(KERN_INFO, "add failed (%d)\n", error);
-+ exi_device->eid.id = EXI_ID_INVALID;
-+ } else
-+ drv_printk(KERN_INFO, "add completed\n");
-+ }
-+
-+ exi_update_ext_status(exi_get_exi_channel(exi_device));
-+}
-+
-+/*
-+ * Internal. Re-scan a given exi channel, looking for added, changed and
-+ * removed exi devices.
-+ */
-+static void exi_channel_rescan(struct exi_channel *exi_channel)
-+{
-+ struct exi_device *exi_device;
-+ unsigned int channel, device;
-+
-+ /* add the exi devices underneath the parents */
-+ for (device = 0; device < EXI_DEVICES_PER_CHANNEL; ++device) {
-+ channel = to_channel(exi_channel);
-+ exi_device = &exi_devices[channel][device];
-+ exi_device_rescan(exi_device);
-+ }
-+}
-+
-+/*
-+ * Internal. Scans all the exi channels looking for exi devices.
-+ */
-+static void exi_bus_rescan(void)
-+{
-+ struct exi_channel *exi_channel;
-+ unsigned int channel;
-+
-+ for (channel = 0; channel < EXI_MAX_CHANNELS; ++channel) {
-+ exi_channel = to_exi_channel(channel);
-+ exi_channel_rescan(exi_channel);
-+ }
-+}
-+
-+
-+static struct task_struct *exi_bus_task;
-+wait_queue_head_t exi_bus_waitq;
-+
-+/*
-+ * Internal. Looks for new, changed or removed devices.
-+ */
-+static int exi_bus_thread(void *__unused)
-+{
-+ struct exi_channel *exi_channel;
-+ struct exi_device *exi_device;
-+ unsigned int channel;
-+ int is_loaded, was_loaded;
-+
-+ while (!kthread_should_stop()) {
-+ /* scan the memcard slot channels for device changes */
-+ for (channel = 0; channel <= 1; ++channel) {
-+ exi_channel = to_exi_channel(channel);
-+
-+ is_loaded = exi_get_ext_line(exi_channel);
-+ was_loaded = (exi_channel->flags & EXI_EXT) ? 1 : 0;
-+
-+ if (is_loaded ^ was_loaded) {
-+ exi_device = &exi_devices[channel][0];
-+ exi_device_rescan(exi_device);
-+ }
-+ }
-+
-+ sleep_on_timeout(&exi_bus_waitq, HZ);
-+ }
-+
-+ return 0;
-+}
-+
-+/*
-+ *
-+ */
-+static int exi_init(struct resource *mem, unsigned int irq)
-+{
-+ struct exi_channel *exi_channel;
-+ struct exi_device *exi_device;
-+ unsigned int channel, device;
-+ int retval;
-+
-+ retval = exi_hw_init(DRV_MODULE_NAME, mem, irq);
-+ if (retval)
-+ goto err_hw_init;
-+
-+ /* initialize devices */
-+ for (channel = 0; channel < EXI_MAX_CHANNELS; ++channel) {
-+ exi_channel = to_exi_channel(channel);
-+ for (device = 0; device < EXI_DEVICES_PER_CHANNEL; ++device) {
-+ exi_device = &exi_devices[channel][device];
-+ exi_device_init(exi_device, channel, device);
-+ }
-+ }
-+
-+ /* register root devices */
-+ for (channel = 0; channel < EXI_MAX_CHANNELS; ++channel) {
-+ retval = device_register(&exi_bus_devices[channel]);
-+ if (retval)
-+ goto err_device_register;
-+ }
-+
-+ /* register the bus */
-+ retval = bus_register(&exi_bus_type);
-+ if (retval)
-+ goto err_bus_register;
-+
-+ /* now enumerate through the bus and add all detected devices */
-+ exi_bus_rescan();
-+
-+ /* setup a thread to manage plugable devices */
-+ init_waitqueue_head(&exi_bus_waitq);
-+ exi_bus_task = kthread_run(exi_bus_thread, NULL, "kexid");
-+ if (IS_ERR(exi_bus_task))
-+ drv_printk(KERN_WARNING, "failed to start exi kernel thread\n");
-+
-+ return 0;
-+
-+err_bus_register:
-+err_device_register:
-+ while (--channel > 0)
-+ device_unregister(&exi_bus_devices[channel]);
-+ exi_hw_exit(mem, irq);
-+err_hw_init:
-+ return retval;
-+}
-+
-+/*
-+ *
-+ */
-+static int __init exi_layer_init(void)
-+{
-+ struct device_node *np;
-+ struct resource res;
-+ int retval;
-+
-+ drv_printk(KERN_INFO, "%s - version %s\n", DRV_DESCRIPTION,
-+ exi_driver_version);
-+
-+ np = of_find_compatible_node(NULL, NULL, "nintendo,flipper-exi");
-+ if (!np) {
-+ np = of_find_compatible_node(NULL, NULL,
-+ "nintendo,hollywood-exi");
-+ if (!np)
-+ return -ENODEV;
-+ }
-+
-+ retval = of_address_to_resource(np, 0, &res);
-+ if (retval) {
-+ drv_printk(KERN_ERR, "no io memory range found\n");
-+ return -ENOMEM;
-+ }
-+
-+ retval = exi_init(&res, irq_of_parse_and_map(np, 0));
-+ of_node_put(np);
-+
-+ return retval;
-+}
-+postcore_initcall(exi_layer_init);
-+
-+MODULE_AUTHOR(DRV_AUTHOR);
-+MODULE_DESCRIPTION(DRV_DESCRIPTION);
-+MODULE_LICENSE("GPL");
-+
-diff --git a/drivers/exi/exi-hw.c b/drivers/exi/exi-hw.c
-new file mode 100644
-index 0000000..de3414b
---- /dev/null
-+++ b/drivers/exi/exi-hw.c
-@@ -0,0 +1,1408 @@
-+/*
-+ * drivers/exi/exi-hw.c
-+ *
-+ * Nintendo GameCube EXpansion Interface support. Hardware routines.
-+ * Copyright (C) 2004-2009 The GameCube Linux Team
-+ * Copyright (C) 2004,2005 Todd Jeffreys <todd@voidpointer.org>
-+ * Copyright (C) 2005,2006,2007,2008,2009 Albert Herranz
-+ *
-+ * This program is free software; you can redistribute it and/or
-+ * modify it under the terms of the GNU General Public License
-+ * as published by the Free Software Foundation; either version 2
-+ * of the License, or (at your option) any later version.
-+ *
-+ */
-+
-+/*
-+ * IMPLEMENTATION NOTES
-+ *
-+ * The EXI Layer provides the following primitives:
-+ *
-+ * op atomic?
-+ * ------------------ -------
-+ * take yes
-+ * give yes
-+ * select yes
-+ * deselect yes
-+ * transfer yes/no (1)
-+ *
-+ * These primitives are encapsulated in several APIs.
-+ * See include/linux/exi.h for additional information.
-+ *
-+ * 1. Kernel Contexts
-+ *
-+ * User, softirq and hardirq contexts are supported, with some limitations.
-+ *
-+ * Launching EXI operations in softirq or hardirq context requires kernel
-+ * coordination to ensure channels are free before use.
-+ *
-+ * The EXI Layer Event System delivers events in softirq context, but it already
-+ * makes provisions to ensure that channels are useable by the event handlers.
-+ * Events are delivered only when the channels on the event handler
-+ * channel mask are all deselected. This allows one to run EXI commands in
-+ * softirq context from the EXI event handlers.
-+ *
-+ * "take" operations in user context will sleep if necessary until the
-+ * channel is "given".
-+ *
-+ *
-+ * 2. Transfers
-+ *
-+ * The EXI Layer provides a transfer API to perform read and write
-+ * operations.
-+ * By default, transfers partially or totally suitable for DMA will be
-+ * partially or totally processed through DMA. The EXI Layer takes care of
-+ * splitting a transfer in several pieces so the best transfer method is
-+ * used each time.
-+ *
-+ * (1) A immediate mode transfer is atomic, but a DMA transfer is not.
-+ */
-+
-+/*#define EXI_DEBUG 1*/
-+
-+#include <linux/types.h>
-+#include <linux/dma-mapping.h>
-+#include <linux/wait.h>
-+#include <linux/delay.h>
-+#include <linux/io.h>
-+#include <linux/spinlock.h>
-+
-+#include <linux/exi.h>
-+#include "exi-hw.h"
-+
-+
-+#define drv_printk(level, format, arg...) \
-+ printk(level "exi: " format , ## arg)
-+
-+#ifdef EXI_DEBUG
-+# define DBG(fmt, args...) \
-+ printk(KERN_ERR "%s: " fmt, __func__ , ## args)
-+#else
-+# define DBG(fmt, args...)
-+#endif
-+
-+
-+static void exi_tasklet(unsigned long param);
-+
-+
-+/* io memory base for EXI */
-+static void __iomem *exi_io_mem;
-+
-+
-+/*
-+ * These are the available exi channels.
-+ */
-+static struct exi_channel exi_channels[EXI_MAX_CHANNELS] = {
-+ [0] = {
-+ .channel = 0,
-+ .lock = __SPIN_LOCK_UNLOCKED(exi_channels[0].lock),
-+ .io_lock = __SPIN_LOCK_UNLOCKED(exi_channels[0].io_lock),
-+ .wait_queue = __WAIT_QUEUE_HEAD_INITIALIZER(
-+ exi_channels[0].wait_queue),
-+ },
-+ [1] = {
-+ .channel = 1,
-+ .lock = __SPIN_LOCK_UNLOCKED(exi_channels[1].lock),
-+ .io_lock = __SPIN_LOCK_UNLOCKED(exi_channels[1].io_lock),
-+ .wait_queue = __WAIT_QUEUE_HEAD_INITIALIZER(
-+ exi_channels[1].wait_queue),
-+ },
-+ [2] = {
-+ .channel = 2,
-+ .lock = __SPIN_LOCK_UNLOCKED(exi_channels[2].lock),
-+ .io_lock = __SPIN_LOCK_UNLOCKED(exi_channels[2].io_lock),
-+ .wait_queue = __WAIT_QUEUE_HEAD_INITIALIZER(
-+ exi_channels[2].wait_queue),
-+ },
-+};
-+
-+/* handy iterator for exi channels */
-+#define exi_channel_for_each(pos) \
-+ for (pos = &exi_channels[0]; pos < &exi_channels[EXI_MAX_CHANNELS]; \
-+ pos++)
-+
-+/* conversions between channel numbers and exi channel structures */
-+#define __to_exi_channel(channel) (&exi_channels[channel])
-+#define __to_channel(exi_channel) (exi_channel->channel)
-+
-+/**
-+ * to_exi_channel - returns an exi_channel given a channel number
-+ * @channel: channel number
-+ *
-+ * Return the exi_channel structure associated to a given channel.
-+ */
-+struct exi_channel *to_exi_channel(unsigned int channel)
-+{
-+ if (channel > EXI_MAX_CHANNELS)
-+ return NULL;
-+
-+ return __to_exi_channel(channel);
-+}
-+EXPORT_SYMBOL(to_exi_channel);
-+
-+/**
-+ * to_channel - returns a channel number given an exi channel
-+ * @exi_channel: channel
-+ *
-+ * Return the channel number for a given exi_channel structure.
-+ */
-+unsigned int to_channel(struct exi_channel *exi_channel)
-+{
-+ BUG_ON(exi_channel == NULL);
-+
-+ return __to_channel(exi_channel);
-+}
-+EXPORT_SYMBOL(to_channel);
-+
-+/**
-+ * exi_channel_owner - returns the owner of the given channel
-+ * @exi_channel: channel
-+ *
-+ * Return the device owning a given exi_channel structure.
-+ */
-+struct exi_device *exi_channel_owner(struct exi_channel *exi_channel)
-+{
-+ return exi_channel->owner;
-+}
-+
-+
-+/*
-+ *
-+ *
-+ */
-+
-+/**
-+ * exi_select_raw - selects a device on an exi channel
-+ * @exi_channel: channel
-+ * @device: device number on channel
-+ * @freq: clock frequency index
-+ *
-+ * Select a given device on a specified EXI channel by setting its
-+ * CS line, and use the specified clock frequency when doing transfers.
-+ */
-+void exi_select_raw(struct exi_channel *exi_channel, unsigned int device,
-+ unsigned int freq)
-+{
-+ u32 __iomem *csr_reg = exi_channel->io_base + EXI_CSR;
-+ u32 csr;
-+ unsigned long flags;
-+
-+ BUG_ON(device > EXI_DEVICES_PER_CHANNEL ||
-+ freq > EXI_MAX_FREQ);
-+
-+ /*
-+ * Preserve interrupt masks while setting the CS line bits.
-+ */
-+ spin_lock_irqsave(&exi_channel->io_lock, flags);
-+ csr = in_be32(csr_reg);
-+ csr &= (EXI_CSR_EXTINMASK | EXI_CSR_TCINTMASK | EXI_CSR_EXIINTMASK);
-+ csr |= ((1<<device) << 7) | (freq << 4);
-+ out_be32(csr_reg, csr);
-+ spin_unlock_irqrestore(&exi_channel->io_lock, flags);
-+}
-+EXPORT_SYMBOL(exi_select_raw);
-+
-+
-+/**
-+ * exi_deselect_raw - deselects all devices on an exi channel
-+ * @exi_channel: channel
-+ *
-+ * Deselect any device previously selected on the specified EXI
-+ * channel by unsetting all CS lines.
-+ */
-+void exi_deselect_raw(struct exi_channel *exi_channel)
-+{
-+ u32 __iomem *csr_reg = exi_channel->io_base + EXI_CSR;
-+ u32 csr;
-+ unsigned long flags;
-+
-+ /*
-+ * Preserve interrupt masks while clearing the CS line bits.
-+ */
-+ spin_lock_irqsave(&exi_channel->io_lock, flags);
-+ csr = in_be32(csr_reg);
-+ csr &= (EXI_CSR_EXTINMASK | EXI_CSR_TCINTMASK | EXI_CSR_EXIINTMASK);
-+ out_be32(csr_reg, csr);
-+ spin_unlock_irqrestore(&exi_channel->io_lock, flags);
-+}
-+EXPORT_SYMBOL(exi_deselect_raw);
-+
-+/**
-+ * exi_transfer_raw - performs an exi transfer using immediate mode
-+ * @exi_channel: channel
-+ * @data: pointer to data being read/writen
-+ * @len: length of data
-+ * @mode: direction of transfer (EXI_OP_{READ,READWRITE,WRITE})
-+ *
-+ * Read or write data on a given EXI channel.
-+ *
-+ */
-+void exi_transfer_raw(struct exi_channel *exi_channel,
-+ void *data, size_t len, int mode)
-+{
-+ while (len >= 4) {
-+ __exi_transfer_raw_u32(exi_channel, data, mode);
-+ exi_channel->stats_xfers++;
-+ data += 4;
-+ len -= 4;
-+ }
-+
-+ switch (len) {
-+ case 1:
-+ __exi_transfer_raw_u8(exi_channel, data, mode);
-+ exi_channel->stats_xfers++;
-+ break;
-+ case 2:
-+ __exi_transfer_raw_u16(exi_channel, data, mode);
-+ exi_channel->stats_xfers++;
-+ break;
-+ case 3:
-+ /* XXX optimize this case */
-+ __exi_transfer_raw_u16(exi_channel, data, mode);
-+ exi_channel->stats_xfers++;
-+ __exi_transfer_raw_u8(exi_channel, data+2, mode);
-+ exi_channel->stats_xfers++;
-+ break;
-+ default:
-+ break;
-+ }
-+}
-+EXPORT_SYMBOL(exi_transfer_raw);
-+
-+/*
-+ * Internal. Start a transfer using "interrupt-driven immediate" mode.
-+ */
-+static void exi_start_idi_transfer_raw(struct exi_channel *exi_channel,
-+ void *data, size_t len, int mode)
-+{
-+ void __iomem *io_base = exi_channel->io_base;
-+ u32 __iomem *csr_reg = io_base + EXI_CSR;
-+ u32 val = ~0;
-+ unsigned long flags;
-+
-+ BUG_ON(len < 1 || len > 4);
-+
-+ exi_channel->stats_idi_xfers++;
-+ exi_channel->stats_xfers++;
-+
-+ if ((mode & EXI_OP_WRITE)) {
-+ switch (len) {
-+ case 1:
-+ val = *((u8 *)data) << 24;
-+ break;
-+ case 2:
-+ val = *((u16 *)data) << 16;
-+ break;
-+ case 3:
-+ val = *((u16 *)data) << 16;
-+ val |= *((u8 *)data+2) << 8;
-+ break;
-+ case 4:
-+ val = *((u32 *)data);
-+ break;
-+ default:
-+ break;
-+ }
-+ }
-+
-+ out_be32(io_base + EXI_DATA, val);
-+
-+ /* enable the Transfer Complete interrupt */
-+ spin_lock_irqsave(&exi_channel->io_lock, flags);
-+ out_be32(csr_reg, in_be32(csr_reg) | EXI_CSR_TCINTMASK);
-+ spin_unlock_irqrestore(&exi_channel->io_lock, flags);
-+
-+ /* start the transfer */
-+ out_be32(io_base + EXI_CR,
-+ EXI_CR_TSTART | EXI_CR_TLEN(len) | (mode&0xf));
-+}
-+
-+/*
-+ * Internal. Finish a transfer using "interrupt-driven immediate" mode.
-+ */
-+static void exi_end_idi_transfer_raw(struct exi_channel *exi_channel,
-+ void *data, size_t len, int mode)
-+{
-+ void __iomem *io_base = exi_channel->io_base;
-+ u32 val = ~0;
-+
-+ BUG_ON(len < 1 || len > 4);
-+
-+ if ((mode&0xf) != EXI_OP_WRITE) {
-+ val = in_be32(io_base + EXI_DATA);
-+ switch (len) {
-+ case 1:
-+ *((u8 *)data) = (u8)(val >> 24);
-+ break;
-+ case 2:
-+ *((u16 *)data) = (u16)(val >> 16);
-+ break;
-+ case 3:
-+ *((u16 *)data) = (u16)(val >> 16);
-+ *((u8 *)data+2) = (u8)(val >> 8);
-+ break;
-+ case 4:
-+ *((u32 *)data) = (u32)(val);
-+ break;
-+ default:
-+ break;
-+ }
-+ }
-+}
-+
-+/*
-+ * Internal. Start a transfer using DMA mode.
-+ */
-+static void exi_start_dma_transfer_raw(struct exi_channel *exi_channel,
-+ dma_addr_t data, size_t len, int mode)
-+{
-+ void __iomem *io_base = exi_channel->io_base;
-+ u32 __iomem *csr_reg = io_base + EXI_CSR;
-+ unsigned long flags;
-+
-+ BUG_ON((data & EXI_DMA_ALIGN) != 0 ||
-+ (len & EXI_DMA_ALIGN) != 0);
-+
-+ exi_channel->stats_dma_xfers++;
-+ exi_channel->stats_xfers++;
-+
-+ /*
-+ * We clear the DATA register here to avoid confusing some
-+ * special hardware, like SD cards.
-+ * Indeed, we need all 1s here.
-+ */
-+ out_be32(io_base + EXI_DATA, ~0);
-+
-+ /* setup address and length of transfer */
-+ out_be32(io_base + EXI_MAR, data);
-+ out_be32(io_base + EXI_LENGTH, len);
-+
-+ /* enable the Transfer Complete interrupt */
-+ spin_lock_irqsave(&exi_channel->io_lock, flags);
-+ out_be32(csr_reg, in_be32(csr_reg) | EXI_CSR_TCINTMASK);
-+ spin_unlock_irqrestore(&exi_channel->io_lock, flags);
-+
-+ /* start the transfer */
-+ out_be32(io_base + EXI_CR, EXI_CR_TSTART | EXI_CR_DMA | (mode&0xf));
-+}
-+
-+
-+/*
-+ * Internal. Busy-wait until a DMA mode transfer operation completes.
-+ */
-+static void exi_wait_for_transfer_raw(struct exi_channel *exi_channel)
-+{
-+ u32 __iomem *cr_reg = exi_channel->io_base + EXI_CR;
-+ u32 __iomem *csr_reg = exi_channel->io_base + EXI_CSR;
-+ unsigned long flags;
-+ unsigned long deadline = jiffies + 2*HZ;
-+ int borked = 0;
-+
-+ /* we don't want TCINTs to disturb us while waiting */
-+ spin_lock_irqsave(&exi_channel->io_lock, flags);
-+ out_be32(csr_reg, in_be32(csr_reg) & ~EXI_CSR_TCINTMASK);
-+ spin_unlock_irqrestore(&exi_channel->io_lock, flags);
-+
-+ /* busy-wait for transfer complete */
-+ while ((in_be32(cr_reg)&EXI_CR_TSTART) && !borked) {
-+ cpu_relax();
-+ borked = time_after(jiffies, deadline);
-+ }
-+
-+ if (borked) {
-+ drv_printk(KERN_ERR, "exi transfer took too long, "
-+ "is your hardware ok?");
-+ }
-+
-+ /* ack the Transfer Complete interrupt */
-+ spin_lock_irqsave(&exi_channel->io_lock, flags);
-+ out_be32(csr_reg, in_be32(csr_reg) | EXI_CSR_TCINT);
-+ spin_unlock_irqrestore(&exi_channel->io_lock, flags);
-+}
-+
-+
-+/*
-+ *
-+ *
-+ */
-+
-+static void exi_command_done(struct exi_command *cmd);
-+
-+/*
-+ * Internal. Initialize an exi_channel structure.
-+ */
-+void exi_channel_init(struct exi_channel *exi_channel, unsigned int channel)
-+{
-+ memset(exi_channel, 0, sizeof(*exi_channel));
-+ exi_channel->events[EXI_EVENT_IRQ].id = EXI_EVENT_IRQ;
-+ exi_channel->events[EXI_EVENT_INSERT].id = EXI_EVENT_INSERT;
-+ exi_channel->events[EXI_EVENT_TC].id = EXI_EVENT_TC;
-+
-+ spin_lock_init(&exi_channel->lock);
-+ spin_lock_init(&exi_channel->io_lock);
-+ init_waitqueue_head(&exi_channel->wait_queue);
-+
-+ exi_channel->channel = channel;
-+ exi_channel->io_base = exi_io_mem + channel * EXI_CHANNEL_SPACING;
-+
-+ tasklet_init(&exi_channel->tasklet,
-+ exi_tasklet, (unsigned long)exi_channel);
-+}
-+
-+/*
-+ * Internal. Check if an exi channel has delayed work to do.
-+ */
-+static void exi_check_pending_work(void)
-+{
-+ struct exi_channel *exi_channel;
-+
-+ exi_channel_for_each(exi_channel) {
-+ if (exi_channel->csr)
-+ tasklet_schedule(&exi_channel->tasklet);
-+ }
-+}
-+
-+/*
-+ * Internal. Finish a DMA transfer.
-+ * Caller holds the channel lock.
-+ */
-+static void exi_end_dma_transfer(struct exi_channel *exi_channel)
-+{
-+ struct exi_command *cmd;
-+
-+ cmd = exi_channel->queued_cmd;
-+ if (cmd) {
-+ BUG_ON(!(exi_channel->flags & EXI_DMABUSY));
-+
-+ exi_channel->flags &= ~EXI_DMABUSY;
-+ dma_unmap_single(&exi_channel->owner->dev,
-+ cmd->dma_addr, cmd->dma_len,
-+ (cmd->opcode == EXI_OP_READ) ?
-+ DMA_FROM_DEVICE : DMA_TO_DEVICE);
-+
-+ exi_channel->queued_cmd = NULL;
-+ }
-+}
-+
-+/*
-+ * Internal. Finish an "interrupt-driven immediate" transfer.
-+ * Caller holds the channel lock.
-+ *
-+ * If more data is pending transfer, it schedules a new transfer.
-+ * Returns zero if no more transfers are required, non-zero otherwise.
-+ *
-+ */
-+static int exi_end_idi_transfer(struct exi_channel *exi_channel)
-+{
-+ struct exi_command *cmd;
-+ int len, offset;
-+ unsigned int balance = 16 /* / sizeof(u32) */;
-+
-+ cmd = exi_channel->queued_cmd;
-+ if (cmd) {
-+ BUG_ON((exi_channel->flags & EXI_DMABUSY));
-+
-+ len = (cmd->bytes_left > 4) ? 4 : cmd->bytes_left;
-+ offset = cmd->len - cmd->bytes_left;
-+ exi_end_idi_transfer_raw(exi_channel,
-+ cmd->data + offset, len,
-+ cmd->opcode);
-+ cmd->bytes_left -= len;
-+
-+ if (balance && cmd->bytes_left > 0) {
-+ offset += len;
-+ len = (cmd->bytes_left > balance) ?
-+ balance : cmd->bytes_left;
-+ exi_transfer_raw(exi_channel,
-+ cmd->data + offset, len, cmd->opcode);
-+ cmd->bytes_left -= len;
-+ }
-+
-+ if (cmd->bytes_left > 0) {
-+ offset = cmd->len - cmd->bytes_left;
-+ len = (cmd->bytes_left > 4) ? 4 : cmd->bytes_left;
-+
-+ exi_start_idi_transfer_raw(exi_channel,
-+ cmd->data + offset, len,
-+ cmd->opcode);
-+ } else {
-+ exi_channel->queued_cmd = NULL;
-+ }
-+ }
-+
-+ return (exi_channel->queued_cmd) ? 1 : 0;
-+}
-+
-+/*
-+ * Internal. Wait until a single transfer completes, and launch callbacks
-+ * when the whole transfer is completed.
-+ */
-+static int exi_wait_for_transfer_one(struct exi_channel *exi_channel)
-+{
-+ struct exi_command *cmd;
-+ unsigned long flags;
-+ int pending = 0;
-+
-+ spin_lock_irqsave(&exi_channel->lock, flags);
-+
-+ exi_wait_for_transfer_raw(exi_channel);
-+
-+ cmd = exi_channel->queued_cmd;
-+ if (cmd) {
-+ if ((exi_channel->flags & EXI_DMABUSY)) {
-+ /* dma transfers need just one transfer */
-+ exi_end_dma_transfer(exi_channel);
-+ } else {
-+ pending = exi_end_idi_transfer(exi_channel);
-+ }
-+
-+ spin_unlock_irqrestore(&exi_channel->lock, flags);
-+
-+ if (!pending)
-+ exi_command_done(cmd);
-+ goto out;
-+ }
-+
-+ spin_unlock_irqrestore(&exi_channel->lock, flags);
-+out:
-+ return pending;
-+}
-+
-+#if 0
-+/*
-+ * Internal. Wait until a full transfer completes and launch callbacks.
-+ */
-+static void exi_wait_for_transfer(struct exi_channel *exi_channel)
-+{
-+ while (exi_wait_for_transfer_one(exi_channel))
-+ cpu_relax();
-+}
-+#endif
-+
-+/*
-+ * Internal. Call any done hooks.
-+ */
-+static void exi_command_done(struct exi_command *cmd)
-+{
-+ /* if specified, call the completion routine */
-+ if (cmd->done)
-+ cmd->done(cmd);
-+}
-+
-+/*
-+ * Internal. Take a channel.
-+ */
-+static int exi_take_channel(struct exi_channel *exi_channel,
-+ struct exi_device *exi_device, int wait)
-+{
-+ unsigned long flags;
-+ int result = 0;
-+
-+ BUG_ON(!exi_device);
-+
-+ spin_lock_irqsave(&exi_channel->lock, flags);
-+ while (exi_channel->owner) {
-+ spin_unlock_irqrestore(&exi_channel->lock, flags);
-+ if (!wait)
-+ return -EBUSY;
-+ wait_event(exi_channel->wait_queue,
-+ !exi_channel->owner);
-+ spin_lock_irqsave(&exi_channel->lock, flags);
-+ }
-+ exi_channel->owner = exi_device;
-+ spin_unlock_irqrestore(&exi_channel->lock, flags);
-+
-+ return result;
-+}
-+
-+/*
-+ * Internal. Give a channel.
-+ */
-+static int exi_give_channel(struct exi_channel *exi_channel)
-+{
-+ WARN_ON(exi_channel->owner == NULL);
-+ exi_channel->owner = NULL;
-+ wake_up(&exi_channel->wait_queue);
-+ return 0;
-+}
-+
-+/*
-+ * Internal. Perform the post non-DMA transfer associated to a DMA transfer.
-+ */
-+static void exi_cmd_post_transfer(struct exi_command *cmd)
-+{
-+ struct exi_channel *exi_channel = cmd->exi_channel;
-+ struct exi_command *post_cmd = &exi_channel->post_cmd;
-+
-+ DBG("channel=%d\n", exi_channel->channel);
-+
-+ exi_transfer_raw(exi_channel, post_cmd->data, post_cmd->len,
-+ post_cmd->opcode);
-+
-+ cmd->done_data = post_cmd->done_data;
-+ cmd->done = post_cmd->done;
-+ exi_op_nop(post_cmd, exi_channel);
-+ exi_command_done(cmd);
-+}
-+
-+
-+#define exi_align_next(x) (void *) \
-+ (((unsigned long)(x)+EXI_DMA_ALIGN)&~EXI_DMA_ALIGN)
-+#define exi_align_prev(x) (void *) \
-+ ((unsigned long)(x)&~EXI_DMA_ALIGN)
-+#define exi_is_aligned(x) (void *) \
-+ (!((unsigned long)(x)&EXI_DMA_ALIGN))
-+
-+/*
-+ * Internal. Perform a transfer.
-+ * Caller holds the channel lock.
-+ */
-+static int exi_cmd_transfer(struct exi_command *cmd)
-+{
-+ static u8 exi_aligned_transfer_buf[EXI_DMA_ALIGN+1]
-+ __attribute__ ((aligned(EXI_DMA_ALIGN+1)));
-+ struct exi_channel *exi_channel = cmd->exi_channel;
-+ struct exi_command *post_cmd = &exi_channel->post_cmd;
-+ void *pre_data, *data, *post_data;
-+ unsigned int pre_len, len, post_len;
-+ int opcode;
-+ int result = 0;
-+
-+ BUG_ON(!exi_channel->owner);
-+
-+ len = cmd->len;
-+ if (!len)
-+ goto done;
-+
-+ DBG("channel=%d, opcode=%d\n", exi_channel->channel, cmd->opcode);
-+
-+ opcode = cmd->opcode;
-+ data = cmd->data;
-+
-+ /* interrupt driven immediate transfer... */
-+ if ((cmd->flags & EXI_CMD_IDI)) {
-+ exi_channel->queued_cmd = cmd;
-+ exi_channel->flags &= ~EXI_DMABUSY;
-+
-+ cmd->bytes_left = cmd->len;
-+ len = (cmd->bytes_left > 4) ? 4 : cmd->bytes_left;
-+ exi_start_idi_transfer_raw(exi_channel, data, len, opcode);
-+
-+ result = 1; /* wait */
-+ goto done;
-+ }
-+
-+ /*
-+ * We can't do DMA transfers unless we have at least 32 bytes.
-+ * And we won't do DMA transfers if user requests that.
-+ */
-+ if (len < EXI_DMA_ALIGN+1 || (cmd->flags & EXI_CMD_NODMA)) {
-+ exi_transfer_raw(exi_channel, data, len, opcode);
-+ goto done;
-+ }
-+
-+ /*
-+ * |_______________|______...______|_______________| DMA alignment
-+ * <--pre_len--><---- len -----><-post_len->
-+ * +-----------+------...------+-----------+
-+ * | pre_data | data | post_data |
-+ * | non-DMA | DMA | non-DMA |
-+ * +-----------+------...------+-----------+
-+ * < 32 bytes N*32 bytes < 32 bytes
-+ * |<--------->|<-----...----->|<--------->|
-+ * <-------------- cmd->len --------------->
-+ */
-+
-+ pre_data = data;
-+ post_data = exi_align_prev(pre_data+len);
-+ data = exi_align_next(pre_data);
-+
-+ pre_len = data - pre_data;
-+ post_len = (pre_data + len) - post_data;
-+ len = post_data - data;
-+
-+ /*
-+ * Coalesce pre and post data transfers if no DMA transfer is possible.
-+ */
-+ if (!len) {
-+ /*
-+ * Maximum transfer size here is 31+31=62 bytes.
-+ */
-+
-+ /*
-+ * On transfer sizes greater than or equal to 32 bytes
-+ * we can optimize the transfer by performing a 32-byte
-+ * DMA transfer using a specially aligned temporary buffer,
-+ * followed by a non-DMA transfer for the remaining bytes.
-+ */
-+ if (pre_len + post_len > EXI_DMA_ALIGN) {
-+ post_len = pre_len + post_len - (EXI_DMA_ALIGN+1);
-+ post_data = pre_data + EXI_DMA_ALIGN+1;
-+ len = EXI_DMA_ALIGN+1;
-+ data = exi_aligned_transfer_buf;
-+ memcpy(data, pre_data, EXI_DMA_ALIGN+1);
-+ pre_len = 0;
-+ } else {
-+ exi_transfer_raw(exi_channel, pre_data,
-+ pre_len + post_len, opcode);
-+ goto done;
-+ }
-+ }
-+
-+ /*
-+ * The first unaligned chunk can't use DMA.
-+ */
-+ if (pre_len > 0) {
-+ /*
-+ * Maximum transfer size here is 31 bytes.
-+ */
-+ exi_transfer_raw(exi_channel, pre_data, pre_len, opcode);
-+ }
-+
-+ /*
-+ * Perform a DMA transfer on the aligned data, followed by a non-DMA
-+ * data transfer on the remaining data.
-+ */
-+ if (post_len > 0) {
-+ /*
-+ * Maximum transfer size here will be 31 bytes.
-+ */
-+ exi_op_transfer(post_cmd, exi_channel,
-+ post_data, post_len, opcode);
-+ post_cmd->done_data = cmd->done_data;
-+ post_cmd->done = cmd->done;
-+ cmd->done_data = NULL;
-+ cmd->done = exi_cmd_post_transfer;
-+ }
-+
-+ exi_channel->queued_cmd = cmd;
-+ exi_channel->flags |= EXI_DMABUSY;
-+
-+ cmd->dma_len = len;
-+ cmd->dma_addr = dma_map_single(&exi_channel->owner->dev,
-+ data, len,
-+ (cmd->opcode == EXI_OP_READ) ?
-+ DMA_FROM_DEVICE : DMA_TO_DEVICE);
-+
-+ exi_start_dma_transfer_raw(exi_channel, cmd->dma_addr, len, opcode);
-+
-+ result = 1; /* wait */
-+
-+done:
-+ return result;
-+}
-+
-+/**
-+ * exi_run_command - executes a single exi command
-+ * @cmd: the command to execute
-+ *
-+ * Context: user
-+ *
-+ * Run just one command.
-+ *
-+ */
-+static int exi_run_command(struct exi_command *cmd)
-+{
-+ struct exi_channel *exi_channel = cmd->exi_channel;
-+ struct exi_device *exi_device = cmd->exi_device;
-+ unsigned long flags;
-+ int wait = !(cmd->flags & EXI_CMD_NOWAIT);
-+ int result = 0;
-+
-+ if (cmd->opcode != EXI_OP_TAKE)
-+ WARN_ON(exi_channel->owner != exi_device);
-+
-+ switch (cmd->opcode) {
-+ case EXI_OP_NOP:
-+ break;
-+ case EXI_OP_TAKE:
-+ result = exi_take_channel(exi_channel, exi_device, wait);
-+ break;
-+ case EXI_OP_GIVE:
-+ result = exi_give_channel(exi_channel);
-+ if (!exi_channel->owner)
-+ exi_check_pending_work();
-+ break;
-+ case EXI_OP_SELECT:
-+ exi_select_raw(exi_channel, exi_device->eid.device,
-+ exi_device->frequency);
-+ break;
-+ case EXI_OP_DESELECT:
-+ exi_deselect_raw(exi_channel);
-+ break;
-+ case EXI_OP_READ:
-+ case EXI_OP_READWRITE:
-+ case EXI_OP_WRITE:
-+ spin_lock_irqsave(&exi_channel->lock, flags);
-+ result = exi_cmd_transfer(cmd);
-+ spin_unlock_irqrestore(&exi_channel->lock, flags);
-+ break;
-+ default:
-+ result = -ENOSYS;
-+ break;
-+ }
-+
-+ /*
-+ * We check for delayed work every time the channel becomes
-+ * idle.
-+ */
-+ if (!result)
-+ exi_command_done(cmd);
-+
-+ return result;
-+}
-+
-+
-+/*
-+ * Internal. Completion routine.
-+ */
-+static void exi_wait_done(struct exi_command *cmd)
-+{
-+ complete(cmd->done_data);
-+}
-+
-+/*
-+ * Internal. Run a command and wait.
-+ * Might sleep if called from user context. Otherwise will busy-wait.
-+ */
-+static int exi_run_command_and_wait(struct exi_command *cmd)
-+{
-+ DECLARE_COMPLETION(complete);
-+ int result;
-+
-+ cmd->done_data = &complete;
-+ cmd->done = exi_wait_done;
-+ result = exi_run_command(cmd);
-+ if (result > 0) {
-+ wait_for_completion(&complete);
-+ result = 0;
-+ }
-+ return result;
-+}
-+
-+/**
-+ * exi_take - reserves an exi channel for exclusive use by a device
-+ * @exi_device: exi device making the reservation
-+ * @wait: wait for the operation to complete
-+ *
-+ * Reserves the channel of a given EXI device.
-+ */
-+int exi_take(struct exi_device *exi_device, int wait)
-+{
-+ struct exi_command cmd;
-+
-+ exi_op_take(&cmd, exi_device);
-+ if (!wait)
-+ cmd.flags |= EXI_CMD_NOWAIT;
-+ return exi_run_command(&cmd);
-+}
-+EXPORT_SYMBOL(exi_take);
-+
-+/**
-+ * exi_give - releases an exi channel
-+ * @exi_device: exi device making the release
-+ *
-+ * Releases the channel of a given EXI device.
-+ */
-+int exi_give(struct exi_device *exi_device)
-+{
-+ struct exi_command cmd;
-+
-+ exi_op_give(&cmd, exi_device->exi_channel);
-+ return exi_run_command(&cmd);
-+}
-+EXPORT_SYMBOL(exi_give);
-+
-+/**
-+ * exi_select - selects a exi device
-+ * @exi_device: exi device being selected
-+ *
-+ * Selects a given EXI device.
-+ */
-+void exi_select(struct exi_device *exi_device)
-+{
-+ struct exi_command cmd;
-+
-+ exi_op_select(&cmd, exi_device);
-+ exi_run_command(&cmd);
-+}
-+EXPORT_SYMBOL(exi_select);
-+
-+/**
-+ * exi_deselect - deselects all devices on an exi channel
-+ * @exi_channel: channel
-+ *
-+ * Deselects all EXI devices on the given channel.
-+ *
-+ */
-+void exi_deselect(struct exi_channel *exi_channel)
-+{
-+ struct exi_command cmd;
-+
-+ exi_op_deselect(&cmd, exi_channel);
-+ exi_run_command(&cmd);
-+}
-+EXPORT_SYMBOL(exi_deselect);
-+
-+/**
-+ * exi_transfer - Performs a read or write EXI transfer.
-+ * @exi_channel: channel
-+ * @data: pointer to data being read/written
-+ * @len: length of data
-+ * @opcode: operation code (EXI_OP_{READ,READWRITE,WRITE})
-+ *
-+ * Read or write data on a given EXI channel.
-+ */
-+void exi_transfer(struct exi_channel *exi_channel, void *data, size_t len,
-+ int opcode, unsigned long flags)
-+{
-+ struct exi_command cmd;
-+
-+ exi_op_transfer(&cmd, exi_channel, data, len, opcode);
-+ cmd.flags |= flags;
-+ exi_run_command_and_wait(&cmd);
-+}
-+EXPORT_SYMBOL(exi_transfer);
-+
-+/*
-+ * Internal. Release several previously reserved channels, according to a
-+ * channel mask.
-+ */
-+static void __give_some_channels(unsigned int channel_mask)
-+{
-+ struct exi_channel *exi_channel;
-+ unsigned int channel;
-+
-+ for (channel = 0; channel_mask && channel < EXI_MAX_CHANNELS;
-+ channel++) {
-+ if ((channel_mask & (1<<channel))) {
-+ channel_mask &= ~(1<<channel);
-+ exi_channel = __to_exi_channel(channel);
-+ exi_channel->owner = NULL;
-+ }
-+ }
-+}
-+
-+/*
-+ * Internal. Try to reserve atomically several channels, according to a
-+ * channel mask.
-+ */
-+static inline int __try_take_some_channels(unsigned int channel_mask,
-+ struct exi_device *exi_device)
-+{
-+ struct exi_channel *exi_channel;
-+ unsigned int channel, taken_channel_mask = 0;
-+ unsigned long flags;
-+ int result = 0;
-+
-+ for (channel = 0; channel_mask && channel < EXI_MAX_CHANNELS;
-+ channel++) {
-+ if ((channel_mask & (1<<channel))) {
-+ channel_mask &= ~(1<<channel);
-+ exi_channel = __to_exi_channel(channel);
-+ spin_lock_irqsave(&exi_channel->lock, flags);
-+ if (exi_channel->owner) {
-+ spin_unlock_irqrestore(&exi_channel->lock,
-+ flags);
-+ result = -EBUSY;
-+ break;
-+ }
-+ exi_channel->owner = exi_device;
-+ taken_channel_mask |= (1<<channel);
-+ spin_unlock_irqrestore(&exi_channel->lock, flags);
-+ }
-+ }
-+
-+ if (result)
-+ __give_some_channels(taken_channel_mask);
-+
-+ return result;
-+}
-+
-+/*
-+ * Internal. Determine if we can trigger an exi event.
-+ */
-+static inline int exi_can_trigger_event(struct exi_event *event)
-+{
-+ return !__try_take_some_channels(event->channel_mask, event->owner);
-+}
-+
-+/*
-+ * Internal. Finish an exi event invocation.
-+ */
-+static inline void exi_finish_event(struct exi_event *event)
-+{
-+ __give_some_channels(event->channel_mask);
-+}
-+
-+/*
-+ * Internal. Trigger an exi event.
-+ */
-+static inline int exi_trigger_event(struct exi_channel *exi_channel,
-+ struct exi_event *event)
-+{
-+ exi_event_handler_t handler;
-+ int result = 0;
-+
-+ handler = event->handler;
-+ if (handler)
-+ result = handler(exi_channel, event->id, event->data);
-+ return result;
-+}
-+
-+/*
-+ * Internal. Conditionally trigger an exi event.
-+ */
-+static void exi_cond_trigger_event(struct exi_channel *exi_channel,
-+ unsigned int event_id, int csr_mask)
-+{
-+ struct exi_event *event;
-+ unsigned long flags;
-+
-+ if ((exi_channel->csr & csr_mask)) {
-+ event = &exi_channel->events[event_id];
-+ if (exi_can_trigger_event(event)) {
-+ spin_lock_irqsave(&exi_channel->lock, flags);
-+ exi_channel->csr &= ~csr_mask;
-+ spin_unlock_irqrestore(&exi_channel->lock, flags);
-+ exi_trigger_event(exi_channel, event);
-+ exi_finish_event(event);
-+ }
-+ }
-+
-+ return;
-+}
-+
-+/*
-+ * Internal. Tasklet used to execute delayed work.
-+ */
-+static void exi_tasklet(unsigned long param)
-+{
-+ struct exi_channel *exi_channel = (struct exi_channel *)param;
-+
-+ DBG("channel=%d, csr=%08lx\n", exi_channel->channel, exi_channel->csr);
-+
-+ if (exi_channel->queued_cmd) {
-+ DBG("tasklet while xfer in flight on channel %d, csr = %08lx\n",
-+ exi_channel->channel, exi_channel->csr);
-+ }
-+
-+ /*
-+ * We won't lauch event handlers if any of the channels we
-+ * provided on event registration is in use.
-+ */
-+
-+ /*exi_cond_trigger_event(exi_channel, EXI_EVENT_TC, EXI_CSR_TCINT);*/
-+ exi_cond_trigger_event(exi_channel, EXI_EVENT_IRQ, EXI_CSR_EXIINT);
-+ exi_cond_trigger_event(exi_channel, EXI_EVENT_INSERT, EXI_CSR_EXTIN);
-+}
-+
-+/*
-+ * Internal. Interrupt handler for EXI interrupts.
-+ */
-+static irqreturn_t exi_irq_handler(int irq, void *dev_id)
-+{
-+ struct exi_channel *exi_channel;
-+ u32 __iomem *csr_reg;
-+ u32 csr, status, mask;
-+ unsigned long flags;
-+
-+ exi_channel_for_each(exi_channel) {
-+ csr_reg = exi_channel->io_base + EXI_CSR;
-+
-+ /*
-+ * Determine if we have pending interrupts on this channel,
-+ * and which ones.
-+ */
-+ spin_lock_irqsave(&exi_channel->io_lock, flags);
-+
-+ csr = in_be32(csr_reg);
-+ mask = csr & (EXI_CSR_EXTINMASK |
-+ EXI_CSR_TCINTMASK | EXI_CSR_EXIINTMASK);
-+ status = csr & (mask << 1);
-+ if (!status) {
-+ spin_unlock_irqrestore(&exi_channel->io_lock, flags);
-+ continue;
-+ }
-+
-+ /* XXX do not signal TC events for now... */
-+ exi_channel->csr |= (status & ~EXI_CSR_TCINT);
-+
-+ DBG("channel=%d, csr=%08lx\n", exi_channel->channel,
-+ exi_channel->csr);
-+
-+ /* ack all for this channel */
-+ out_be32(csr_reg, csr | status);
-+
-+ spin_unlock_irqrestore(&exi_channel->io_lock, flags);
-+
-+ if ((status & EXI_CSR_TCINT))
-+ exi_wait_for_transfer_one(exi_channel);
-+ if ((status & EXI_CSR_EXTIN))
-+ wake_up(&exi_bus_waitq);
-+
-+ if (exi_channel->csr && !exi_is_taken(exi_channel))
-+ tasklet_schedule(&exi_channel->tasklet);
-+ }
-+ return IRQ_HANDLED;
-+}
-+
-+/*
-+ * Internal. Enable an exi event.
-+ */
-+static int exi_enable_event(struct exi_channel *exi_channel,
-+ unsigned int event_id)
-+{
-+ u32 __iomem *csr_reg = exi_channel->io_base + EXI_CSR;
-+ u32 csr;
-+ unsigned long flags;
-+
-+ spin_lock_irqsave(&exi_channel->io_lock, flags);
-+ csr = in_be32(csr_reg);
-+
-+ /* ack and enable the associated interrupt */
-+ switch (event_id) {
-+ case EXI_EVENT_INSERT:
-+ out_be32(csr_reg, csr | (EXI_CSR_EXTIN | EXI_CSR_EXTINMASK));
-+ break;
-+ case EXI_EVENT_TC:
-+ /*out_be32(csr_reg,
-+ csr | (EXI_CSR_TCINT | EXI_CSR_TCINTMASK));*/
-+ break;
-+ case EXI_EVENT_IRQ:
-+ out_be32(csr_reg, csr | (EXI_CSR_EXIINT | EXI_CSR_EXIINTMASK));
-+ break;
-+ }
-+ spin_unlock_irqrestore(&exi_channel->io_lock, flags);
-+ return 0;
-+}
-+
-+/*
-+ * Internal. Disable an exi event.
-+ */
-+static int exi_disable_event(struct exi_channel *exi_channel,
-+ unsigned int event_id)
-+{
-+ u32 __iomem *csr_reg = exi_channel->io_base + EXI_CSR;
-+ u32 csr;
-+ unsigned long flags;
-+
-+ spin_lock_irqsave(&exi_channel->io_lock, flags);
-+ csr = in_be32(csr_reg);
-+
-+ /* ack and disable the associated interrupt */
-+ switch (event_id) {
-+ case EXI_EVENT_INSERT:
-+ out_be32(csr_reg, (csr | EXI_CSR_EXTIN) & ~EXI_CSR_EXTINMASK);
-+ break;
-+ case EXI_EVENT_TC:
-+ /*out_be32(csr_reg,
-+ (csr | EXI_CSR_TCINT) & ~EXI_CSR_TCINTMASK);*/
-+ break;
-+ case EXI_EVENT_IRQ:
-+ out_be32(csr_reg, (csr | EXI_CSR_EXIINT) & ~EXI_CSR_EXIINTMASK);
-+ break;
-+ }
-+ spin_unlock_irqrestore(&exi_channel->io_lock, flags);
-+ return 0;
-+}
-+
-+/**
-+ * exi_event_register - Registers an event on a given channel.
-+ * @exi_channel: channel
-+ * @event_id: event id
-+ * @handler: event handler
-+ * @data: data passed to event handler
-+ *
-+ * Register a handler to be called whenever a specified event happens
-+ * on the given channel.
-+ */
-+int exi_event_register(struct exi_channel *exi_channel, unsigned int event_id,
-+ struct exi_device *exi_device,
-+ exi_event_handler_t handler, void *data,
-+ unsigned int channel_mask)
-+{
-+ struct exi_event *event;
-+ int result = 0;
-+
-+ BUG_ON(event_id > EXI_MAX_EVENTS);
-+
-+ event = &exi_channel->events[event_id];
-+
-+ spin_lock(&exi_channel->lock);
-+ if (event->handler) {
-+ result = -EBUSY;
-+ goto out;
-+ }
-+ event->owner = exi_device;
-+ event->handler = handler;
-+ event->data = data;
-+ event->channel_mask = channel_mask;
-+ exi_enable_event(exi_channel, event_id);
-+
-+out:
-+ spin_unlock(&exi_channel->lock);
-+ return result;
-+}
-+EXPORT_SYMBOL(exi_event_register);
-+
-+/**
-+ * exi_event_unregister - Unregisters an event on a given channel.
-+ * @exi_channel: channel
-+ * @event_id: event id
-+ *
-+ * Unregister a previously registered event handler.
-+ */
-+int exi_event_unregister(struct exi_channel *exi_channel, unsigned int event_id)
-+{
-+ struct exi_event *event;
-+ int result = 0;
-+
-+ BUG_ON(event_id > EXI_MAX_EVENTS);
-+
-+ event = &exi_channel->events[event_id];
-+
-+ spin_lock(&exi_channel->lock);
-+ exi_disable_event(exi_channel, event_id);
-+ event->owner = NULL;
-+ event->handler = NULL;
-+ event->data = NULL;
-+ event->channel_mask = 0;
-+ spin_unlock(&exi_channel->lock);
-+
-+ return result;
-+}
-+EXPORT_SYMBOL(exi_event_unregister);
-+
-+/*
-+ * Internal. Quiesce a channel.
-+ */
-+static void exi_quiesce_channel(struct exi_channel *exi_channel, u32 csr_mask)
-+{
-+ /* wait for dma transfers to complete */
-+ exi_wait_for_transfer_raw(exi_channel);
-+
-+ /* ack and mask all interrupts */
-+ out_be32(exi_channel->io_base + EXI_CSR,
-+ EXI_CSR_TCINT | EXI_CSR_EXIINT | EXI_CSR_EXTIN | csr_mask);
-+}
-+
-+/*
-+ * Internal. Quiesce all channels.
-+ */
-+static void exi_quiesce_all_channels(u32 csr_mask)
-+{
-+ struct exi_channel *exi_channel;
-+
-+ exi_channel_for_each(exi_channel) {
-+ exi_quiesce_channel(exi_channel, csr_mask);
-+ }
-+}
-+
-+/**
-+ * exi_get_id - Returns the EXI ID of a device
-+ * @exi_channel: channel
-+ * @device: device number on channel
-+ * @freq: clock frequency index
-+ *
-+ * Returns the EXI ID of an EXI device on a given channel.
-+ * Might sleep.
-+ */
-+u32 exi_get_id(struct exi_device *exi_device)
-+{
-+ struct exi_channel *exi_channel = exi_device->exi_channel;
-+ u32 __iomem *csr_reg = exi_channel->io_base + EXI_CSR;
-+ u32 id = EXI_ID_INVALID;
-+ u16 cmd = 0;
-+
-+ /* ask for the EXI id */
-+ exi_dev_take(exi_device);
-+ exi_dev_select(exi_device);
-+ exi_dev_write(exi_device, &cmd, sizeof(cmd));
-+ exi_dev_read(exi_device, &id, sizeof(id));
-+ exi_dev_deselect(exi_device);
-+ exi_dev_give(exi_device);
-+
-+ /* "canonicalize" the id */
-+ if (!id)
-+ id = EXI_ID_INVALID;
-+ /*
-+ * We return a EXI_ID_NONE if there is some unidentified device
-+ * inserted in memcard slot A or memcard slot B.
-+ * This, for example, allows the SD/MMC driver to see inserted cards.
-+ */
-+ if (id == EXI_ID_INVALID) {
-+ if ((__to_channel(exi_channel) == 0 ||
-+ __to_channel(exi_channel) == 1)
-+ && exi_device->eid.device == 0) {
-+ if (in_be32(csr_reg) & EXI_CSR_EXT)
-+ id = EXI_ID_NONE;
-+ }
-+ }
-+
-+ return id;
-+}
-+EXPORT_SYMBOL(exi_get_id);
-+
-+/*
-+ * Tells if there is a device inserted in one of the memory card slots.
-+ */
-+int exi_get_ext_line(struct exi_channel *exi_channel)
-+{
-+ u32 __iomem *csr_reg = exi_channel->io_base + EXI_CSR;
-+ return (in_be32(csr_reg) & EXI_CSR_EXT) ? 1 : 0;
-+}
-+
-+/*
-+ * Saves the current insertion status of a given channel.
-+ */
-+void exi_update_ext_status(struct exi_channel *exi_channel)
-+{
-+ if (exi_get_ext_line(exi_channel))
-+ exi_channel->flags |= EXI_EXT;
-+ else
-+ exi_channel->flags &= ~EXI_EXT;
-+}
-+
-+/*
-+ * Pseudo-Internal. Initialize basic channel structures and hardware.
-+ */
-+int exi_hw_init(char *module_name, struct resource *mem, unsigned int irq)
-+{
-+ struct exi_channel *exi_channel;
-+ int channel;
-+ int result;
-+
-+ exi_io_mem = ioremap(mem->start, mem->end - mem->start + 1);
-+ if (!exi_io_mem) {
-+ drv_printk(KERN_ERR, "ioremap failed\n");
-+ return -ENOMEM;
-+ }
-+
-+ for (channel = 0; channel < EXI_MAX_CHANNELS; channel++) {
-+ exi_channel = __to_exi_channel(channel);
-+
-+ /* initialize a channel structure */
-+ exi_channel_init(exi_channel, channel);
-+ }
-+
-+ /* calm down the hardware and allow extractions */
-+ exi_quiesce_all_channels(EXI_CSR_EXTINMASK);
-+
-+ /* register the exi interrupt handler */
-+ result = request_irq(irq, exi_irq_handler, 0, module_name, NULL);
-+ if (result)
-+ drv_printk(KERN_ERR, "failed to register IRQ %d\n", irq);
-+
-+ return result;
-+}
-+
-+/*
-+ * Pseudo-Internal.
-+ */
-+void exi_hw_exit(struct resource *mem, unsigned int irq)
-+{
-+ exi_quiesce_all_channels(0);
-+ iounmap(exi_io_mem);
-+ free_irq(irq, NULL);
-+}
-diff --git a/drivers/exi/exi-hw.h b/drivers/exi/exi-hw.h
-new file mode 100644
-index 0000000..a2382bf
---- /dev/null
-+++ b/drivers/exi/exi-hw.h
-@@ -0,0 +1,195 @@
-+/*
-+ * drivers/exi/exi-hw.h
-+ *
-+ * Nintendo GameCube EXpansion Interface support. Hardware routines.
-+ * Copyright (C) 2004-2009 The GameCube Linux Team
-+ * Copyright (C) 2004,2005 Todd Jeffreys <todd@voidpointer.org>
-+ * Copyright (C) 2005,2006,2007,2008,2009 Albert Herranz
-+ *
-+ * This program is free software; you can redistribute it and/or
-+ * modify it under the terms of the 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 __EXI_HW_H
-+#define __EXI_HW_H
-+
-+#include <linux/exi.h>
-+#include <linux/interrupt.h>
-+#include <linux/resource.h>
-+#include <asm/atomic.h>
-+
-+
-+#define EXI_MAX_CHANNELS 3 /* channels on the EXI bus */
-+#define EXI_DEVICES_PER_CHANNEL 3 /* number of devices per EXI channel */
-+#define EXI_MAX_EVENTS 3 /* types of events on the EXI bus */
-+
-+#define EXI_CLK_1MHZ 0
-+#define EXI_CLK_2MHZ 1
-+#define EXI_CLK_4MHZ 2
-+#define EXI_CLK_8MHZ 3
-+#define EXI_CLK_16MHZ 4
-+#define EXI_CLK_32MHZ 5
-+
-+#define EXI_MAX_FREQ 7
-+#define EXI_FREQ_SCAN EXI_CLK_8MHZ
-+
-+#define EXI_READ 0
-+#define EXI_WRITE 1
-+
-+#define EXI_IDI_MAX_SIZE 4
-+
-+
-+#define EXI_DMA_ALIGN 0x1f /* 32 bytes */
-+
-+#define EXI_CHANNEL_SPACING 0x14
-+
-+#define EXI_CSR 0x00
-+#define EXI_CSR_EXIINTMASK (1<<0)
-+#define EXI_CSR_EXIINT (1<<1)
-+#define EXI_CSR_TCINTMASK (1<<2)
-+#define EXI_CSR_TCINT (1<<3)
-+#define EXI_CSR_CLKMASK (0x7<<4)
-+#define EXI_CSR_CLK_1MHZ (EXI_CLK_1MHZ<<4)
-+#define EXI_CSR_CLK_2MHZ (EXI_CLK_2MHZ<<4)
-+#define EXI_CSR_CLK_4MHZ (EXI_CLK_4MHZ<<4)
-+#define EXI_CSR_CLK_8MHZ (EXI_CLK_8MHZ<<4)
-+#define EXI_CSR_CLK_16MHZ (EXI_CLK_16MHZ<<4)
-+#define EXI_CSR_CLK_32MHZ (EXI_CLK_32MHZ<<4)
-+#define EXI_CSR_CSMASK (0x7<<7)
-+#define EXI_CSR_CS_0 (0x1<<7) /* Chip Select 001 */
-+#define EXI_CSR_CS_1 (0x2<<7) /* Chip Select 010 */
-+#define EXI_CSR_CS_2 (0x4<<7) /* Chip Select 100 */
-+#define EXI_CSR_EXTINMASK (1<<10)
-+#define EXI_CSR_EXTIN (1<<11)
-+#define EXI_CSR_EXT (1<<12)
-+
-+#define EXI_MAR 0x04
-+
-+#define EXI_LENGTH 0x08
-+
-+#define EXI_CR 0x0c
-+#define EXI_CR_TSTART (1<<0)
-+#define EXI_CR_DMA (1<<1)
-+#define EXI_CR_READ (0<<2)
-+#define EXI_CR_WRITE (1<<2)
-+#define EXI_CR_READ_WRITE (2<<2)
-+#define EXI_CR_TLEN(len) (((len)-1)<<4)
-+
-+#define EXI_DATA 0x10
-+
-+enum {
-+ __EXI_DMABUSY = 0,
-+ __EXI_EXT,
-+};
-+
-+/*
-+ * For registering event handlers with the exi layer.
-+ */
-+struct exi_event {
-+ int id; /* event id */
-+ struct exi_device *owner; /* device owning of the event */
-+ exi_event_handler_t handler;
-+ void *data;
-+ unsigned int channel_mask; /* channels used by handler */
-+};
-+
-+/*
-+ * This structure represents an exi channel.
-+ */
-+struct exi_channel {
-+ spinlock_t lock; /* misc channel lock */
-+
-+ int channel;
-+ unsigned long flags;
-+#define EXI_DMABUSY (1<<__EXI_DMABUSY)
-+#define EXI_EXT (1<<__EXI_EXT)
-+
-+ spinlock_t io_lock; /* serializes access to CSR */
-+ void __iomem *io_base;
-+
-+ struct exi_device *owner;
-+ wait_queue_head_t wait_queue;
-+
-+ struct exi_command *queued_cmd;
-+ struct exi_command post_cmd;
-+
-+ unsigned long csr;
-+ struct tasklet_struct tasklet;
-+
-+ unsigned long stats_idi_xfers;
-+ unsigned long stats_dma_xfers;
-+ unsigned long stats_xfers;
-+
-+ struct exi_event events[EXI_MAX_EVENTS];
-+};
-+
-+extern struct exi_device *exi_channel_owner(struct exi_channel *exi_channel);
-+extern int exi_get_ext_line(struct exi_channel *exi_channel);
-+extern void exi_update_ext_status(struct exi_channel *exi_channel);
-+
-+extern int exi_hw_init(char *name, struct resource *mem, unsigned int irq);
-+extern void exi_hw_exit(struct resource *mem, unsigned int irq);
-+
-+#define exi_is_taken(x) ((x)->owner)
-+
-+/*
-+ * Internal.
-+ * Declare simple transfer functions for single bytes, words and dwords,
-+ * and build a general transfer function based on that.
-+ */
-+#define __declare__exi_transfer_raw(_type, _val, _data, _on_write, _on_read) \
-+static inline void __exi_transfer_raw_##_type(struct exi_channel *exi_channel,\
-+ _type * _data, int mode) \
-+{ \
-+ u32 __iomem *csr_reg = exi_channel->io_base + EXI_CSR; \
-+ u32 __iomem *data_reg = exi_channel->io_base + EXI_DATA; \
-+ u32 __iomem *cr_reg = exi_channel->io_base + EXI_CR; \
-+ u32 _val = ~0; \
-+ unsigned long flags; \
-+ \
-+ /* \
-+ * On reads we write too some known value to EXIxDATA because \
-+ * information currently stored there is leaked to the \
-+ * MOSI line, confusing some hardware. \
-+ */ \
-+ if (((mode&0xf) != EXI_OP_READ)) /* write or read-write */ \
-+ _on_write; \
-+ out_be32(data_reg, _val); \
-+ \
-+ /* start transfer */ \
-+ _val = EXI_CR_TSTART | EXI_CR_TLEN(sizeof(_type)) | (mode&0xf); \
-+ out_be32(cr_reg, _val); \
-+ \
-+ /* wait for transfer completion */ \
-+ while (in_be32(cr_reg) & EXI_CR_TSTART) \
-+ cpu_relax(); \
-+ \
-+ /* XXX check if we need that on immediate mode */ \
-+ /* assert transfer complete interrupt */ \
-+ spin_lock_irqsave(&exi_channel->io_lock, flags); \
-+ out_be32(csr_reg, in_be32(csr_reg) | EXI_CSR_TCINT); \
-+ spin_unlock_irqrestore(&exi_channel->io_lock, flags); \
-+ \
-+ if ((mode&0xf) != EXI_OP_WRITE) { /* read or read-write */ \
-+ _val = in_be32(data_reg); \
-+ _on_read; \
-+ } \
-+}
-+
-+#define __declare__exi_transfer_raw_simple(_type) \
-+__declare__exi_transfer_raw( \
-+ _type, _v, _d, \
-+ _v = *(_d) << (32 - (8*sizeof(_type))), \
-+ *(_d) = (_type)(_v >> (32 - (8*sizeof(_type)))) \
-+ )
-+
-+__declare__exi_transfer_raw_simple(u8)
-+__declare__exi_transfer_raw_simple(u16)
-+__declare__exi_transfer_raw_simple(u32)
-+
-+extern wait_queue_head_t exi_bus_waitq;
-+
-+#endif /* __EXI_HW_H */
-diff --git a/drivers/input/Kconfig b/drivers/input/Kconfig
-index 5f9d860..bcf4d1f 100644
---- a/drivers/input/Kconfig
-+++ b/drivers/input/Kconfig
-@@ -180,6 +180,8 @@ source "drivers/input/serio/Kconfig"
-
- source "drivers/input/gameport/Kconfig"
-
-+source "drivers/input/si/Kconfig"
-+
- endmenu
-
- endmenu
-diff --git a/drivers/input/keyboard/Kconfig b/drivers/input/keyboard/Kconfig
-index efd70a9..ed0a67a 100644
---- a/drivers/input/keyboard/Kconfig
-+++ b/drivers/input/keyboard/Kconfig
-@@ -314,6 +314,17 @@ config KEYBOARD_BFIN
- To compile this driver as a module, choose M here: the
- module will be called bf54x-keys.
-
-+config KEYBOARD_WII
-+ tristate "Nintendo Wii USB keyboard IOS glue"
-+ depends on (WII && !USB)
-+ help
-+ Say Y here if you have a Nintendo Wii console running Linux and have
-+ a keyboard attached to one of its USB ports.
-+ This driver uses the IOS interface glue to access the USB keyboard.
-+
-+ To compile this driver as a module, choose M here: the
-+ module will be called rvl-stkbd.
-+
- config KEYBOARD_SH_KEYSC
- tristate "SuperH KEYSC keypad support"
- depends on SUPERH
-diff --git a/drivers/input/keyboard/Makefile b/drivers/input/keyboard/Makefile
-index 0edc8f2..2918d70 100644
---- a/drivers/input/keyboard/Makefile
-+++ b/drivers/input/keyboard/Makefile
-@@ -27,3 +27,4 @@ obj-$(CONFIG_KEYBOARD_HP7XX) += jornada720_kbd.o
- obj-$(CONFIG_KEYBOARD_MAPLE) += maple_keyb.o
- obj-$(CONFIG_KEYBOARD_BFIN) += bf54x-keys.o
- obj-$(CONFIG_KEYBOARD_SH_KEYSC) += sh_keysc.o
-+obj-$(CONFIG_KEYBOARD_WII) += rvl-stkbd.o
-diff --git a/drivers/input/keyboard/rvl-stkbd.c b/drivers/input/keyboard/rvl-stkbd.c
-new file mode 100644
-index 0000000..272f772
---- /dev/null
-+++ b/drivers/input/keyboard/rvl-stkbd.c
-@@ -0,0 +1,512 @@
-+/*
-+ * drivers/input/keyboard/rvl-stkbd.c
-+ *
-+ * Nintendo Wii starlet keyboard driver.
-+ * Copyright (C) 2008-2009 The GameCube Linux Team
-+ * Copyright (C) 2008,2009 Albert Herranz
-+ *
-+ * This program is free software; you can redistribute it and/or
-+ * modify it under the terms of the GNU General Public License
-+ * as published by the Free Software Foundation; either version 2
-+ * of the License, or (at your option) any later version.
-+ *
-+ */
-+
-+/*
-+ * NOTES:
-+ * The keyboard driver requires at least IOS30 installed.
-+ * LED support is pending.
-+ */
-+
-+#define DEBUG
-+
-+#define DBG(fmt, arg...) pr_debug(fmt, ##arg)
-+
-+#include <linux/init.h>
-+#include <linux/input.h>
-+#include <linux/kernel.h>
-+#include <linux/kthread.h>
-+#include <linux/module.h>
-+#include <linux/of_platform.h>
-+#include <asm/starlet.h>
-+
-+#define DRV_MODULE_NAME "rvl-stkbd"
-+#define DRV_DESCRIPTION "Nintendo Wii starlet keyboard driver"
-+#define DRV_AUTHOR "Albert Herranz"
-+
-+static char stkbd_driver_version[] = "0.1i";
-+
-+#define drv_printk(level, format, arg...) \
-+ printk(level DRV_MODULE_NAME ": " format , ## arg)
-+
-+/*
-+ * Keyboard events from IOS.
-+ */
-+#define STKBD_EV_CONNECT 0x00000000
-+#define STKBD_EV_DISCONNECT 0x00000001
-+#define STKBD_EV_REPORT 0x00000002
-+
-+struct stkbd_event {
-+ u32 type;
-+ u32 _unk1;
-+ union {
-+ struct {
-+ u8 modifiers;
-+ u8 reserved;
-+ u8 keys[6];
-+ } report;
-+ u8 raw_report[8];
-+ };
-+} __attribute__((packed));
-+
-+/*
-+ * Keyboard device.
-+ */
-+
-+enum {
-+ __STKBD_RUNNING = 1, /* device is opened and running */
-+ __STKBD_WAITING_REPORT /* waiting for IOS report */
-+};
-+
-+struct stkbd_keyboard {
-+ int fd;
-+
-+ struct stkbd_event *event;
-+ u8 old_raw_report[8];
-+
-+ unsigned long flags;
-+#define STKBD_RUNNING (1 << __STKBD_RUNNING)
-+#define STKBD_WAITING_REPORT (1 << __STKBD_WAITING_REPORT)
-+
-+ char name[32];
-+ struct input_dev *idev;
-+ unsigned int usage;
-+
-+ struct device *dev;
-+};
-+
-+/* device path in IOS for the USB keyboard */
-+static char stkbd_dev_path[] = "/dev/usb/kbd";
-+
-+/*
-+ * Keycodes are standard USB keyboard HID keycodes.
-+ * We use the same table as in drivers/hid/usbhid/usbkbd.c.
-+ */
-+
-+#define NR_SCANCODES 256
-+
-+static unsigned char stkbd_keycode[NR_SCANCODES] = {
-+/*000*/ KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED,
-+/*004*/ KEY_A, KEY_B, KEY_C, KEY_D,
-+/*008*/ KEY_E, KEY_F, KEY_G, KEY_H,
-+/*012*/ KEY_I, KEY_J, KEY_K, KEY_L,
-+/*016*/ KEY_M, KEY_N, KEY_O, KEY_P,
-+/*020*/ KEY_Q, KEY_R, KEY_S, KEY_T,
-+/*024*/ KEY_U, KEY_V, KEY_W, KEY_X,
-+/*028*/ KEY_Y, KEY_Z, KEY_1, KEY_2,
-+/*032*/ KEY_3, KEY_4, KEY_5, KEY_6,
-+/*036*/ KEY_7, KEY_8, KEY_9, KEY_0,
-+/*040*/ KEY_ENTER, KEY_ESC, KEY_BACKSPACE, KEY_TAB,
-+/*044*/ KEY_SPACE, KEY_MINUS, KEY_EQUAL, KEY_LEFTBRACE,
-+/*048*/ KEY_RIGHTBRACE, KEY_BACKSLASH, KEY_BACKSLASH, KEY_SEMICOLON,
-+/*052*/ KEY_APOSTROPHE, KEY_GRAVE, KEY_COMMA, KEY_DOT,
-+/*056*/ KEY_SLASH, KEY_CAPSLOCK, KEY_F1, KEY_F2,
-+/*060*/ KEY_F3, KEY_F4, KEY_F5, KEY_F6,
-+/*064*/ KEY_F7, KEY_F8, KEY_F9, KEY_F10,
-+/*068*/ KEY_F11, KEY_F12, KEY_SYSRQ, KEY_SCROLLLOCK,
-+/*072*/ KEY_PAUSE, KEY_INSERT, KEY_HOME, KEY_PAGEUP,
-+/*076*/ KEY_DELETE, KEY_END, KEY_PAGEDOWN, KEY_RIGHT,
-+/*080*/ KEY_LEFT, KEY_DOWN, KEY_UP, KEY_NUMLOCK,
-+/*084*/ KEY_KPSLASH, KEY_KPASTERISK, KEY_KPMINUS, KEY_KPPLUS,
-+/*088*/ KEY_KPENTER, KEY_KP1, KEY_KP2, KEY_KP3,
-+/*092*/ KEY_KP4, KEY_KP5, KEY_KP6, KEY_KP7,
-+/*096*/ KEY_KP8, KEY_KP9, KEY_KP0, KEY_KPDOT,
-+/*100*/ KEY_102ND, KEY_COMPOSE, KEY_POWER, KEY_KPEQUAL,
-+/*104*/ KEY_F13, KEY_F14, KEY_F15, KEY_F16,
-+/*108*/ KEY_F17, KEY_F18, KEY_F19, KEY_F20,
-+/*112*/ KEY_F21, KEY_F22, KEY_F23, KEY_F24,
-+/*116*/ KEY_OPEN, KEY_HELP, KEY_PROPS, KEY_FRONT,
-+/*120*/ KEY_STOP, KEY_AGAIN, KEY_UNDO, KEY_CUT,
-+/*124*/ KEY_COPY, KEY_PASTE, KEY_FIND, KEY_MUTE,
-+/*128*/ KEY_VOLUMEUP, KEY_VOLUMEDOWN, KEY_RESERVED, KEY_RESERVED,
-+/*132*/ KEY_RESERVED, KEY_KPCOMMA, KEY_RESERVED, KEY_RO,
-+/*136*/ KEY_KATAKANAHIRAGANA, KEY_YEN, KEY_HENKAN, KEY_MUHENKAN,
-+/*140*/ KEY_KPJPCOMMA, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED,
-+/*144*/ KEY_HANGEUL, KEY_HANJA, KEY_KATAKANA, KEY_HIRAGANA,
-+/*148*/ KEY_ZENKAKUHANKAKU, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED,
-+/*152*/ KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED,
-+/*156*/ KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED,
-+/*160*/ KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED,
-+/*164*/ KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED,
-+/*168*/ KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED,
-+/*172*/ KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED,
-+/*176*/ KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED,
-+/*180*/ KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED,
-+/*184*/ KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED,
-+/*188*/ KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED,
-+/*192*/ KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED,
-+/*196*/ KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED,
-+/*200*/ KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED,
-+/*204*/ KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED,
-+/*208*/ KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED,
-+/*212*/ KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED,
-+/*216*/ KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED,
-+/*220*/ KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED,
-+/*224*/ KEY_LEFTCTRL, KEY_LEFTSHIFT, KEY_LEFTALT, KEY_LEFTMETA,
-+/*228*/ KEY_RIGHTCTRL, KEY_RIGHTSHIFT, KEY_RIGHTALT, KEY_RIGHTMETA,
-+/*232*/ KEY_PLAYPAUSE, KEY_STOPCD, KEY_PREVIOUSSONG, KEY_NEXTSONG,
-+/*236*/ KEY_EJECTCD, KEY_VOLUMEUP, KEY_VOLUMEDOWN, KEY_MUTE,
-+/*240*/ KEY_WWW, KEY_BACK, KEY_FORWARD, KEY_STOP,
-+/*244*/ KEY_FIND, KEY_SCROLLUP, KEY_SCROLLDOWN, KEY_EDIT,
-+/*248*/ KEY_SLEEP, KEY_SCROLLLOCK, KEY_REFRESH, KEY_CALC,
-+/*252*/ KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED,
-+};
-+
-+
-+static int stkbd_wait_for_events(struct stkbd_keyboard *kbd);
-+
-+static void stkbd_dispatch_report(struct stkbd_keyboard *kbd)
-+{
-+ struct stkbd_event *event = kbd->event;
-+ u8 *new = event->raw_report;
-+ u8 *old = kbd->old_raw_report;
-+ int i;
-+
-+ /*
-+ * The report is a standard USB HID report for a keyboard.
-+ * Modifiers come in byte 0 as variable data and map to
-+ * positions 224-231 of the USB HID keyboard/keypad page.
-+ */
-+ for (i = 0; i < 8; i++)
-+ input_report_key(kbd->idev, stkbd_keycode[i + 224],
-+ (new[0] >> i) & 1);
-+
-+ /*
-+ * Byte 1 is reserved and ignored here.
-+ * Bytes 2 to 7 contain the indexes of up to 6 keys pressed.
-+ * A value of 01 for an index means "Keyboard ErrorRollOver" and is
-+ * reported when the keyboard is in error (for example, when too
-+ * many keys are simultaneously pressed).
-+ * Index values less than or equal to 03 can be safely ignored.
-+ */
-+ for (i = 2; i < 8; i++) {
-+ /* released keys are old indexes not found in new array */
-+ if (old[i] > 3 && memscan(new + 2, old[i], 6) == new + 8) {
-+ if (stkbd_keycode[old[i]])
-+ input_report_key(kbd->idev,
-+ stkbd_keycode[old[i]], 0);
-+ else
-+ drv_printk(KERN_WARNING, "unknown key"
-+ " (scancode %#x) released.", old[i]);
-+ }
-+
-+ /* pressed keys are new indexes not found in old array */
-+ if (new[i] > 3 && memscan(old + 2, new[i], 6) == old + 8) {
-+ if (stkbd_keycode[new[i]])
-+ input_report_key(kbd->idev,
-+ stkbd_keycode[new[i]], 1);
-+ else
-+ drv_printk(KERN_WARNING, "unknown key"
-+ " (scancode %#x) pressed.", new[i]);
-+ }
-+ }
-+
-+ input_sync(kbd->idev);
-+ memcpy(old, new, 8);
-+}
-+
-+static int stkbd_dispatch_ipc_request(struct starlet_ipc_request *req)
-+{
-+ struct stkbd_keyboard *kbd;
-+ struct stkbd_event *event;
-+ int error;
-+
-+ /* retrieve the interesting data before freeing the request */
-+ kbd = req->done_data;
-+ error = req->result;
-+ starlet_ipc_free_request(req);
-+
-+ clear_bit(__STKBD_WAITING_REPORT, &kbd->flags);
-+
-+ if (kbd->fd == -1)
-+ return -ENODEV;
-+
-+ if (error) {
-+ DBG("%s: error=%d (%x)\n", __func__, error, error);
-+ } else {
-+ event = kbd->event;
-+
-+ switch (event->type) {
-+ case STKBD_EV_CONNECT:
-+ drv_printk(KERN_INFO, "keyboard connected\n");
-+ break;
-+ case STKBD_EV_DISCONNECT:
-+ drv_printk(KERN_INFO, "keyboard disconnected\n");
-+ break;
-+ case STKBD_EV_REPORT:
-+ if (test_bit(__STKBD_RUNNING, &kbd->flags))
-+ stkbd_dispatch_report(kbd);
-+ break;
-+ }
-+
-+ error = stkbd_wait_for_events(kbd);
-+ }
-+ return error;
-+}
-+
-+static int stkbd_wait_for_events(struct stkbd_keyboard *kbd)
-+{
-+ struct stkbd_event *event = kbd->event;
-+ int error = 0;
-+
-+ if (!test_and_set_bit(__STKBD_WAITING_REPORT, &kbd->flags)) {
-+ error = starlet_ioctl_nowait(kbd->fd, 0,
-+ NULL, 0,
-+ event, sizeof(*event),
-+ stkbd_dispatch_ipc_request,
-+ kbd);
-+ if (error)
-+ drv_printk(KERN_ERR, "ioctl error %d (%04x)\n",
-+ error, error);
-+ }
-+ return error;
-+}
-+
-+/*
-+ * Input driver hooks.
-+ *
-+ */
-+
-+static DEFINE_MUTEX(open_lock);
-+
-+static int stkbd_open(struct input_dev *idev)
-+{
-+ struct stkbd_keyboard *kbd = input_get_drvdata(idev);
-+ int error = 0;
-+
-+ if (!kbd)
-+ return -ENODEV;
-+
-+ mutex_lock(&open_lock);
-+ kbd->usage++;
-+ set_bit(__STKBD_RUNNING, &kbd->flags);
-+ mutex_unlock(&open_lock);
-+
-+ return error;
-+}
-+
-+static void stkbd_close(struct input_dev *idev)
-+{
-+ struct stkbd_keyboard *kbd = input_get_drvdata(idev);
-+
-+ if (!kbd)
-+ return;
-+
-+ mutex_lock(&open_lock);
-+ kbd->usage--;
-+ if (kbd->usage == 0)
-+ clear_bit(__STKBD_RUNNING, &kbd->flags);
-+ mutex_unlock(&open_lock);
-+}
-+
-+static void stkbd_setup_keyboard(struct input_dev *idev)
-+{
-+ int i;
-+
-+ set_bit(EV_KEY, idev->evbit);
-+ set_bit(EV_REP, idev->evbit);
-+
-+ for (i = 0; i < 255; ++i)
-+ set_bit(stkbd_keycode[i], idev->keybit);
-+ clear_bit(0, idev->keybit);
-+}
-+
-+static int stkbd_init_input_dev(struct stkbd_keyboard *kbd)
-+{
-+ struct input_dev *idev;
-+ int error;
-+
-+ idev = input_allocate_device();
-+ if (!idev) {
-+ drv_printk(KERN_ERR, "failed to allocate input_dev\n");
-+ return -ENOMEM;
-+ }
-+
-+ idev->dev.parent = kbd->dev;
-+
-+ strcpy(kbd->name, "USB keyboard");
-+ idev->name = kbd->name;
-+
-+ input_set_drvdata(idev, kbd);
-+ kbd->idev = idev;
-+
-+ stkbd_setup_keyboard(idev);
-+
-+ idev->open = stkbd_open;
-+ idev->close = stkbd_close;
-+
-+ error = input_register_device(kbd->idev);
-+ if (error) {
-+ input_free_device(kbd->idev);
-+ return error;
-+ }
-+
-+ return 0;
-+}
-+
-+static void stkbd_exit_input_dev(struct stkbd_keyboard *kbd)
-+{
-+ input_free_device(kbd->idev);
-+}
-+
-+/*
-+ * Setup routines.
-+ *
-+ */
-+
-+static int stkbd_init(struct stkbd_keyboard *kbd)
-+{
-+ struct stkbd_event *event;
-+ int error;
-+
-+ event = starlet_kzalloc(sizeof(*event), GFP_KERNEL);
-+ if (!event) {
-+ drv_printk(KERN_ERR, "failed to allocate stkbd_event\n");
-+ error = -ENOMEM;
-+ goto err;
-+ }
-+ kbd->event = event;
-+
-+ kbd->fd = starlet_open(stkbd_dev_path, 0);
-+ if (kbd->fd < 0) {
-+ drv_printk(KERN_ERR, "unable to open device %s\n",
-+ stkbd_dev_path);
-+ error = kbd->fd;
-+ goto err_event;
-+ }
-+
-+ error = stkbd_init_input_dev(kbd);
-+ if (error)
-+ goto err_fd;
-+
-+ /* start to grab events from the keyboard */
-+ error = stkbd_wait_for_events(kbd);
-+ if (error)
-+ goto err_input_dev;
-+
-+ return 0;
-+
-+err_input_dev:
-+ stkbd_exit_input_dev(kbd);
-+err_fd:
-+ starlet_close(kbd->fd);
-+err_event:
-+ starlet_kfree(event);
-+err:
-+ return error;
-+}
-+
-+static void stkbd_exit(struct stkbd_keyboard *kbd)
-+{
-+ stkbd_exit_input_dev(kbd);
-+ starlet_close(kbd->fd);
-+ starlet_kfree(kbd->event);
-+}
-+
-+/*
-+ * Driver model helper routines.
-+ *
-+ */
-+
-+static int stkbd_do_probe(struct device *dev)
-+{
-+ struct stkbd_keyboard *kbd;
-+ int error;
-+
-+ kbd = kzalloc(sizeof(*kbd), GFP_KERNEL);
-+ if (!kbd) {
-+ drv_printk(KERN_ERR, "failed to allocate stkbd_keyboard\n");
-+ return -ENOMEM;
-+ }
-+ dev_set_drvdata(dev, kbd);
-+ kbd->dev = dev;
-+
-+ error = stkbd_init(kbd);
-+ if (error) {
-+ dev_set_drvdata(dev, NULL);
-+ kfree(kbd);
-+ }
-+ return error;
-+}
-+
-+static int stkbd_do_remove(struct device *dev)
-+{
-+ struct stkbd_keyboard *kbd = dev_get_drvdata(dev);
-+
-+ if (kbd) {
-+ stkbd_exit(kbd);
-+ dev_set_drvdata(dev, NULL);
-+ kfree(kbd);
-+ return 0;
-+ }
-+ return -ENODEV;
-+}
-+
-+
-+/*
-+ * OF platform driver hooks.
-+ *
-+ */
-+
-+static int __init stkbd_of_probe(struct of_device *odev,
-+ const struct of_device_id *match)
-+{
-+ return stkbd_do_probe(&odev->dev);
-+}
-+
-+static int __exit stkbd_of_remove(struct of_device *odev)
-+{
-+ return stkbd_do_remove(&odev->dev);
-+}
-+
-+static struct of_device_id stkbd_of_match[] = {
-+ { .compatible = "nintendo,starlet-keyboard" },
-+ { },
-+};
-+
-+
-+MODULE_DEVICE_TABLE(of, stkbd_of_match);
-+
-+static struct of_platform_driver stkbd_of_driver = {
-+ .owner = THIS_MODULE,
-+ .name = DRV_MODULE_NAME,
-+ .match_table = stkbd_of_match,
-+ .probe = stkbd_of_probe,
-+ .remove = stkbd_of_remove,
-+};
-+
-+
-+/*
-+ * Module interface hooks.
-+ *
-+ */
-+
-+static int __init stkbd_init_module(void)
-+{
-+ drv_printk(KERN_INFO, "%s - version %s\n", DRV_DESCRIPTION,
-+ stkbd_driver_version);
-+
-+ return of_register_platform_driver(&stkbd_of_driver);
-+}
-+
-+static void __exit stkbd_exit_module(void)
-+{
-+ of_unregister_platform_driver(&stkbd_of_driver);
-+}
-+
-+module_init(stkbd_init_module);
-+module_exit(stkbd_exit_module);
-+
-+MODULE_DESCRIPTION(DRV_DESCRIPTION);
-+MODULE_AUTHOR(DRV_AUTHOR);
-+MODULE_LICENSE("GPL");
-diff --git a/drivers/input/si/Kconfig b/drivers/input/si/Kconfig
-new file mode 100644
-index 0000000..51de017
---- /dev/null
-+++ b/drivers/input/si/Kconfig
-@@ -0,0 +1,14 @@
-+#
-+# Nintendo GameCube/Wii Serial Interface (SI) configuration
-+#
-+
-+config GAMECUBE_SI
-+ tristate "Nintendo GameCube/Wii Serial Interface (SI) support"
-+ depends on GAMECUBE_COMMON
-+ ---help---
-+ Say Y here if you want to use the standard pads as joysticks or
-+ want to use a keyboard. Everything is autodetected.
-+
-+ NOTE: Keyboard detection doesn't work 100%. Building this as a
-+ module is recommended, this way you can unload/load the driver
-+ to re-detect.
-diff --git a/drivers/input/si/Makefile b/drivers/input/si/Makefile
-new file mode 100644
-index 0000000..5087995
---- /dev/null
-+++ b/drivers/input/si/Makefile
-@@ -0,0 +1,5 @@
-+#
-+# Makefile for the Nintendo GameCube/Wii Serial Interface (SI).
-+#
-+
-+obj-$(CONFIG_GAMECUBE_SI) += gcn-si.o
-diff --git a/drivers/input/si/gcn-keymap.h b/drivers/input/si/gcn-keymap.h
-new file mode 100644
-index 0000000..7a3345a
---- /dev/null
-+++ b/drivers/input/si/gcn-keymap.h
-@@ -0,0 +1,79 @@
-+/*
-+ * keymap for a Datel adapater + US keyboard (not the normal keyboard)
-+ * not mapped:
-+ * printscreen / sysreq
-+ * pause / break
-+ * numlock
-+ * windows key 1
-+ * windows key 2
-+ * windows menu key
-+ *
-+ * cursor keys send both 36 and their own code, so 36 must be RESERVED
-+ */
-+
-+static unsigned char gamecube_keymap[] = {
-+ /* 00 */ KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED,
-+ KEY_RESERVED, KEY_RESERVED, KEY_HOME, KEY_END,
-+ /* 08 */ KEY_PAGEUP, KEY_PAGEDOWN, KEY_SCROLLLOCK, KEY_RESERVED,
-+ KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED,
-+ /* 10 */ KEY_A, KEY_B, KEY_C, KEY_D,
-+ KEY_E, KEY_F, KEY_G, KEY_H,
-+ /* 18 */ KEY_I, KEY_J, KEY_K, KEY_L,
-+ KEY_M, KEY_N, KEY_O, KEY_P,
-+ /* 20 */ KEY_Q, KEY_R, KEY_S, KEY_T,
-+ KEY_U, KEY_V, KEY_W, KEY_X,
-+ /* 28 */ KEY_Y, KEY_Z, KEY_1, KEY_2,
-+ KEY_3, KEY_4, KEY_5, KEY_6,
-+ /* 30 */ KEY_7, KEY_8, KEY_9, KEY_0,
-+ KEY_MINUS, KEY_EQUAL, KEY_RESERVED, KEY_KPASTERISK,
-+ /* 38 */ KEY_LEFTBRACE, KEY_SEMICOLON, KEY_APOSTROPHE, KEY_RIGHTBRACE,
-+ KEY_COMMA, KEY_DOT, KEY_SLASH, KEY_BACKSLASH,
-+ /* 40 */ KEY_F1, KEY_F2, KEY_F3, KEY_F4,
-+ KEY_F5, KEY_F6, KEY_F7, KEY_F8,
-+ /* 48 */ KEY_F9, KEY_F10, KEY_F11, KEY_F12,
-+ KEY_ESC, KEY_INSERT, KEY_DELETE, KEY_GRAVE,
-+ /* 50 */ KEY_BACKSPACE, KEY_TAB, KEY_RESERVED, KEY_CAPSLOCK,
-+ KEY_LEFTSHIFT, KEY_RIGHTSHIFT, KEY_LEFTCTRL, KEY_LEFTALT,
-+ /* 58 */ KEY_RESERVED, KEY_SPACE, KEY_RESERVED, KEY_RESERVED,
-+ KEY_LEFT, KEY_DOWN, KEY_UP, KEY_RIGHT,
-+ /* 60 */ KEY_RESERVED, KEY_ENTER, KEY_RESERVED, KEY_RESERVED,
-+ KEY_SEMICOLON, KEY_KPPLUS, KEY_RESERVED, KEY_RESERVED,
-+ /* 68 */ KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED,
-+ KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED,
-+ /* 70 */ KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED,
-+ KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED,
-+ /* 78 */ KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED,
-+ KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED,
-+ /* 80 */ KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED,
-+ KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED,
-+ /* 88 */ KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED,
-+ KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED,
-+ /* 90 */ KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED,
-+ KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED,
-+ /* 98 */ KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED,
-+ KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED,
-+ /* a0 */ KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED,
-+ KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED,
-+ /* a8 */ KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED,
-+ KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED,
-+ /* b0 */ KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED,
-+ KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED,
-+ /* b8 */ KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED,
-+ KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED,
-+ /* c0 */ KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED,
-+ KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED,
-+ /* c8 */ KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED,
-+ KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED,
-+ /* d0 */ KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED,
-+ KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED,
-+ /* d8 */ KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED,
-+ KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED,
-+ /* e0 */ KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED,
-+ KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED,
-+ /* e8 */ KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED,
-+ KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED,
-+ /* f0 */ KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED,
-+ KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED,
-+ /* f8 */ KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED,
-+ KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED
-+};
-diff --git a/drivers/input/si/gcn-si.c b/drivers/input/si/gcn-si.c
-new file mode 100644
-index 0000000..731437f
---- /dev/null
-+++ b/drivers/input/si/gcn-si.c
-@@ -0,0 +1,730 @@
-+/*
-+ * drivers/input/gcn-si.c
-+ *
-+ * Nintendo GameCube/Wii Serial Interface (SI) driver.
-+ * Copyright (C) 2004-2009 The GameCube Linux Team
-+ * Copyright (C) 2004 Steven Looman
-+ * Copyright (C) 2005,2008,2009 Albert Herranz
-+ *
-+ * This program is free software; you can redistribute it and/or
-+ * modify it under the terms of the GNU General Public License
-+ * as published by the Free Software Foundation; either version 2
-+ * of the License, or (at your option) any later version.
-+ *
-+ */
-+
-+/* #define SI_DEBUG */
-+
-+#include <linux/delay.h>
-+#include <linux/init.h>
-+#include <linux/input.h>
-+#include <linux/io.h>
-+#include <linux/kernel.h>
-+#include <linux/module.h>
-+#include <linux/of_platform.h>
-+#include <linux/timer.h>
-+
-+/*
-+ * This keymap is for a datel adapter + normal US keyboard.
-+ */
-+#include "gcn-keymap.h"
-+
-+/*
-+ * Defining HACK_FORCE_KEYBOARD_PORT allows one to specify a port that
-+ * will be identified as a keyboard port in case the port gets incorrectly
-+ * identified.
-+ */
-+#define HACK_FORCE_KEYBOARD_PORT
-+
-+
-+#define DRV_MODULE_NAME "gcn-si"
-+#define DRV_DESCRIPTION "Nintendo GameCube/Wii Serial Interface (SI) driver"
-+#define DRV_AUTHOR "Steven Looman <steven@krx.nl>, " \
-+ "Albert Herranz"
-+
-+static char si_driver_version[] = "1.0i";
-+
-+#define drv_printk(level, format, arg...) \
-+ printk(level DRV_MODULE_NAME ": " format , ## arg)
-+
-+#define SI_MAX_PORTS 4 /* the four controller ports */
-+#define SI_REFRESH_TIME (HZ/100) /* polling interval */
-+
-+/*
-+ * Hardware registers
-+ */
-+#define SI_PORT_SPACING 12
-+
-+#define SICOUTBUF(i) (0x00 + (i)*SI_PORT_SPACING)
-+#define SICINBUFH(i) (0x04 + (i)*SI_PORT_SPACING)
-+#define SICINBUFL(i) (0x08 + (i)*SI_PORT_SPACING)
-+#define SIPOLL 0x30
-+#define SICOMCSR 0x34
-+#define SISR 0x38
-+#define SIEXILK 0x3c
-+
-+#define ID_PAD 0x0900
-+#define ID_KEYBOARD 0x0820
-+#define ID_WIRELESS_BIT (1 << 15)
-+#define ID_WAVEBIRD_BIT (1 << 8)
-+
-+#define PAD_START (1 << 28)
-+#define PAD_Y (1 << 27)
-+#define PAD_X (1 << 26)
-+#define PAD_B (1 << 25)
-+#define PAD_A (1 << 24)
-+#define PAD_LT (1 << 22)
-+#define PAD_RT (1 << 21)
-+#define PAD_Z (1 << 20)
-+#define PAD_UP (1 << 19)
-+#define PAD_DOWN (1 << 18)
-+#define PAD_RIGHT (1 << 17)
-+#define PAD_LEFT (1 << 16)
-+
-+
-+struct si_keyboard_status {
-+ unsigned char old[3];
-+};
-+
-+enum si_control_type {
-+ CTL_PAD,
-+ CTL_KEYBOARD,
-+ CTL_UNKNOWN
-+};
-+
-+struct si_drvdata;
-+
-+struct si_port {
-+ unsigned int index;
-+ struct si_drvdata *drvdata;
-+
-+ u32 id; /* SI id */
-+
-+ enum si_control_type type;
-+ unsigned int raw[2];
-+
-+ struct input_dev *idev;
-+ struct timer_list timer;
-+ char name[32];
-+
-+ union {
-+ struct si_keyboard_status keyboard;
-+ };
-+
-+};
-+
-+struct si_drvdata {
-+ struct si_port ports[SI_MAX_PORTS];
-+
-+ void __iomem *io_base;
-+
-+ struct device *dev;
-+};
-+
-+
-+#ifdef HACK_FORCE_KEYBOARD_PORT
-+
-+static int si_force_keyboard_port = -1;
-+
-+#ifdef MODULE
-+module_psi_named(force_keyboard_port, si_force_keyboard_port, int, 0644);
-+MODULE_PARM_DESC(force_keyboard_port, "port n becomes a keyboard port if"
-+ " automatic identification fails");
-+#else
-+static int __init si_force_keyboard_port_setup(char *line)
-+{
-+ if (sscanf(line, "%d", &si_force_keyboard_port) != 1)
-+ si_force_keyboard_port = -1;
-+ return 1;
-+}
-+__setup("force_keyboard_port=", si_force_keyboard_port_setup);
-+#endif /* MODULE */
-+
-+#endif /* HACK_FORCE_KEYBOARD_PORT */
-+
-+
-+/*
-+ * Hardware.
-+ *
-+ */
-+
-+static void si_reset(void __iomem *io_base)
-+{
-+ int i;
-+
-+ /* clear all SI registers */
-+
-+ for (i = 0; i < SI_MAX_PORTS; ++i)
-+ out_be32(io_base + SICOUTBUF(i), 0);
-+ for (i = 0; i < SI_MAX_PORTS; ++i)
-+ out_be32(io_base + SICINBUFH(i), 0);
-+ for (i = 0; i < SI_MAX_PORTS; ++i)
-+ out_be32(io_base + SICINBUFL(i), 0);
-+ out_be32(io_base + SIPOLL, 0);
-+ out_be32(io_base + SICOMCSR, 0);
-+ out_be32(io_base + SISR, 0);
-+
-+ /* these too... */
-+ out_be32(io_base + 0x80, 0);
-+ out_be32(io_base + 0x84, 0);
-+ out_be32(io_base + 0x88, 0);
-+ out_be32(io_base + 0x8c, 0);
-+ out_be32(io_base + 0x90, 0);
-+ out_be32(io_base + 0x94, 0);
-+ out_be32(io_base + 0x98, 0);
-+ out_be32(io_base + 0x9c, 0);
-+ out_be32(io_base + 0xa0, 0);
-+ out_be32(io_base + 0xa4, 0);
-+ out_be32(io_base + 0xa8, 0);
-+ out_be32(io_base + 0xac, 0);
-+}
-+
-+static void si_set_rumbling(void __iomem *io_base, unsigned int index,
-+ int rumble)
-+{
-+ out_be32(io_base + SICOUTBUF(index), 0x00400000 | (rumble) ? 1 : 0);
-+ out_be32(io_base + SISR, 0x80000000);
-+}
-+
-+static void si_wait_transfer_done(void __iomem *io_base)
-+{
-+ unsigned long deadline = jiffies + 2*HZ;
-+ int borked = 0;
-+
-+ while (!(in_be32(io_base + SICOMCSR) & (1 << 31)) && !borked) {
-+ cpu_relax();
-+ borked = time_after(jiffies, deadline);
-+ }
-+
-+ if (borked) {
-+ drv_printk(KERN_ERR, "serial transfer took too long, "
-+ "is your hardware ok?");
-+ }
-+
-+ out_be32(io_base + SICOMCSR,
-+ in_be32(io_base + SICOMCSR) | (1 << 31)); /* ack IRQ */
-+}
-+
-+static u32 si_get_controller_id(void __iomem *io_base,
-+ unsigned int index)
-+{
-+ out_be32(io_base + SICOUTBUF(index), 0);
-+ out_be32(io_base + SIPOLL, 0);
-+
-+ out_be32(io_base + SISR, 0x80000000);
-+ out_be32(io_base + SICOMCSR, 0xd0010001 | index << 1);
-+ si_wait_transfer_done(io_base);
-+
-+ return in_be32(io_base + 0x80) >> 16;
-+}
-+
-+static void si_setup_polling(struct si_drvdata *drvdata)
-+{
-+ void __iomem *io_base = drvdata->io_base;
-+ unsigned long pad_bits = 0;
-+ int i;
-+
-+ for (i = 0; i < SI_MAX_PORTS; ++i) {
-+ switch (drvdata->ports[i].type) {
-+ case CTL_PAD:
-+ out_be32(io_base + SICOUTBUF(i), 0x00400300);
-+ break;
-+ case CTL_KEYBOARD:
-+ out_be32(io_base + SICOUTBUF(i), 0x00540000);
-+ break;
-+ default:
-+ continue;
-+ }
-+ pad_bits |= 1 << (7 - i);
-+ }
-+ out_be32(io_base + SIPOLL, 0x00f70200 | pad_bits);
-+
-+ out_be32(io_base + SISR, 0x80000000);
-+ out_be32(io_base + SICOMCSR, 0xc0010801);
-+ si_wait_transfer_done(io_base);
-+}
-+
-+static void si_timer(unsigned long data)
-+{
-+ struct si_port *port = (struct si_port *)data;
-+ unsigned int index = port->index;
-+ void __iomem *io_base = port->drvdata->io_base;
-+ unsigned long raw[2];
-+ unsigned char key[3];
-+ unsigned char oldkey;
-+ int i;
-+
-+ raw[0] = in_be32(io_base + SICINBUFH(index));
-+ raw[1] = in_be32(io_base + SICINBUFL(index));
-+
-+ switch (port->type) {
-+ case CTL_PAD:
-+ /* buttons */
-+ input_report_key(port->idev, BTN_A, raw[0] & PAD_A);
-+ input_report_key(port->idev, BTN_B, raw[0] & PAD_B);
-+ input_report_key(port->idev, BTN_X, raw[0] & PAD_X);
-+ input_report_key(port->idev, BTN_Y, raw[0] & PAD_Y);
-+ input_report_key(port->idev, BTN_Z, raw[0] & PAD_Z);
-+ input_report_key(port->idev, BTN_TL,
-+ raw[0] & PAD_LT);
-+ input_report_key(port->idev, BTN_TR,
-+ raw[0] & PAD_RT);
-+ input_report_key(port->idev, BTN_START,
-+ raw[0] & PAD_START);
-+ input_report_key(port->idev, BTN_0, raw[0] & PAD_UP);
-+ input_report_key(port->idev, BTN_1, raw[0] & PAD_RIGHT);
-+ input_report_key(port->idev, BTN_2, raw[0] & PAD_DOWN);
-+ input_report_key(port->idev, BTN_3, raw[0] & PAD_LEFT);
-+
-+ /* axis */
-+ /* a stick */
-+ input_report_abs(port->idev, ABS_X,
-+ raw[0] >> 8 & 0xFF);
-+ input_report_abs(port->idev, ABS_Y,
-+ 0xFF - (raw[0] >> 0 & 0xFF));
-+
-+ /* b pad */
-+ if (raw[0] & PAD_RIGHT)
-+ input_report_abs(port->idev, ABS_HAT0X, 1);
-+ else if (raw[0] & PAD_LEFT)
-+ input_report_abs(port->idev, ABS_HAT0X, -1);
-+ else
-+ input_report_abs(port->idev, ABS_HAT0X, 0);
-+
-+ if (raw[0] & PAD_DOWN)
-+ input_report_abs(port->idev, ABS_HAT0Y, 1);
-+ else if (raw[0] & PAD_UP)
-+ input_report_abs(port->idev, ABS_HAT0Y, -1);
-+ else
-+ input_report_abs(port->idev, ABS_HAT0Y, 0);
-+
-+ /* c stick */
-+ input_report_abs(port->idev, ABS_RX,
-+ raw[1] >> 24 & 0xFF);
-+ input_report_abs(port->idev, ABS_RY,
-+ raw[1] >> 16 & 0xFF);
-+
-+ /* triggers */
-+ input_report_abs(port->idev, ABS_BRAKE,
-+ raw[1] >> 8 & 0xFF);
-+ input_report_abs(port->idev, ABS_GAS,
-+ raw[1] >> 0 & 0xFF);
-+
-+ break;
-+
-+ case CTL_KEYBOARD:
-+ /*
-+ raw nibbles:
-+ [4]<C>[0][0][0][0][0][0] <1H><1L><2H><2L><3H><3L><X><C>
-+ where:
-+ [n] = fixed to n
-+ <nH> <nL> = high / low nibble of n-th key pressed
-+ (0 if not pressed)
-+ <X> = <1H> xor <2H> xor <3H>
-+ <C> = counter: 0, 0, 1, 1, 2, 2, ..., F, F, 0, 0, ...
-+ */
-+ key[0] = (raw[1] >> 24) & 0xFF;
-+ key[1] = (raw[1] >> 16) & 0xFF;
-+ key[2] = (raw[1] >> 8) & 0xFF;
-+
-+ /* check if anything was released */
-+ for (i = 0; i < 3; ++i) {
-+ oldkey = port->keyboard.old[i];
-+ if (oldkey != key[0] &&
-+ oldkey != key[1] && oldkey != key[2])
-+ input_report_key(port->idev,
-+ gamecube_keymap[oldkey], 0);
-+ }
-+
-+ /* report keys */
-+ for (i = 0; i < 3; ++i) {
-+ if (key[i])
-+ input_report_key(port->idev,
-+ gamecube_keymap[key[i]], 1);
-+ port->keyboard.old[i] = key[i];
-+ }
-+ break;
-+
-+ default:
-+ break;
-+ }
-+
-+ input_sync(port->idev);
-+
-+ mod_timer(&port->timer, jiffies + SI_REFRESH_TIME);
-+}
-+
-+/*
-+ * Input driver hooks.
-+ *
-+ */
-+
-+static int si_open(struct input_dev *idev)
-+{
-+ struct si_port *port = input_get_drvdata(idev);
-+
-+ init_timer(&port->timer);
-+ port->timer.function = si_timer;
-+ port->timer.data = (unsigned long)port;
-+ port->timer.expires = jiffies + SI_REFRESH_TIME;
-+ add_timer(&port->timer);
-+
-+ return 0;
-+}
-+
-+static void si_close(struct input_dev *idev)
-+{
-+ struct si_port *port = input_get_drvdata(idev);
-+
-+ del_timer(&port->timer);
-+}
-+
-+static int si_event(struct input_dev *idev, unsigned int type,
-+ unsigned int code, int value)
-+{
-+ struct si_port *port = input_get_drvdata(idev);
-+ unsigned int index = port->index;
-+ void __iomem *io_base = port->drvdata->io_base;
-+
-+ if (type == EV_FF) {
-+ if (code == FF_RUMBLE)
-+ si_set_rumbling(io_base, index, value);
-+ }
-+
-+ return value;
-+}
-+
-+static int si_setup_pad(struct input_dev *idev)
-+{
-+ struct ff_device *ff;
-+ int retval;
-+
-+ set_bit(EV_KEY, idev->evbit);
-+ set_bit(EV_ABS, idev->evbit);
-+
-+ set_bit(BTN_A, idev->keybit);
-+ set_bit(BTN_B, idev->keybit);
-+ set_bit(BTN_X, idev->keybit);
-+ set_bit(BTN_Y, idev->keybit);
-+ set_bit(BTN_Z, idev->keybit);
-+ set_bit(BTN_TL, idev->keybit);
-+ set_bit(BTN_TR, idev->keybit);
-+ set_bit(BTN_START, idev->keybit);
-+ set_bit(BTN_0, idev->keybit);
-+ set_bit(BTN_1, idev->keybit);
-+ set_bit(BTN_2, idev->keybit);
-+ set_bit(BTN_3, idev->keybit);
-+
-+ /* a stick */
-+ set_bit(ABS_X, idev->absbit);
-+ idev->absmin[ABS_X] = 0;
-+ idev->absmax[ABS_X] = 255;
-+ idev->absfuzz[ABS_X] = 8;
-+ idev->absflat[ABS_X] = 8;
-+
-+ set_bit(ABS_Y, idev->absbit);
-+ idev->absmin[ABS_Y] = 0;
-+ idev->absmax[ABS_Y] = 255;
-+ idev->absfuzz[ABS_Y] = 8;
-+ idev->absflat[ABS_Y] = 8;
-+
-+ /* b pad */
-+ input_set_abs_params(idev, ABS_HAT0X, -1, 1, 0, 0);
-+ input_set_abs_params(idev, ABS_HAT0Y, -1, 1, 0, 0);
-+
-+ /* c stick */
-+ set_bit(ABS_RX, idev->absbit);
-+ idev->absmin[ABS_RX] = 0;
-+ idev->absmax[ABS_RX] = 255;
-+ idev->absfuzz[ABS_RX] = 8;
-+ idev->absflat[ABS_RX] = 8;
-+
-+ set_bit(ABS_RY, idev->absbit);
-+ idev->absmin[ABS_RY] = 0;
-+ idev->absmax[ABS_RY] = 255;
-+ idev->absfuzz[ABS_RY] = 8;
-+ idev->absflat[ABS_RY] = 8;
-+
-+ /* triggers */
-+ set_bit(ABS_GAS, idev->absbit);
-+ idev->absmin[ABS_GAS] = -255;
-+ idev->absmax[ABS_GAS] = 255;
-+ idev->absfuzz[ABS_GAS] = 16;
-+ idev->absflat[ABS_GAS] = 16;
-+
-+ set_bit(ABS_BRAKE, idev->absbit);
-+ idev->absmin[ABS_BRAKE] = -255;
-+ idev->absmax[ABS_BRAKE] = 255;
-+ idev->absfuzz[ABS_BRAKE] = 16;
-+ idev->absflat[ABS_BRAKE] = 16;
-+
-+ /* rumbling */
-+ set_bit(EV_FF, idev->evbit);
-+ set_bit(FF_RUMBLE, idev->ffbit);
-+ retval = input_ff_create(idev, 1);
-+ if (retval)
-+ return retval;
-+ ff = idev->ff;
-+ idev->event = si_event;
-+ return 0;
-+}
-+
-+static void si_setup_keyboard(struct input_dev *idev)
-+{
-+ int i;
-+
-+ set_bit(EV_KEY, idev->evbit);
-+ set_bit(EV_REP, idev->evbit);
-+
-+ for (i = 0; i < 255; ++i)
-+ set_bit(gamecube_keymap[i], idev->keybit);
-+}
-+
-+static int si_port_probe(struct si_port *port)
-+{
-+ unsigned int index = port->index;
-+ void __iomem *io_base = port->drvdata->io_base;
-+ struct input_dev *idev;
-+ int retval = 0;
-+
-+ si_reset(io_base);
-+
-+ /*
-+ * Determine input device type from SI id.
-+ */
-+ port->id = si_get_controller_id(io_base, index);
-+ if (port->id == ID_PAD) {
-+ port->type = CTL_PAD;
-+ strcpy(port->name, "standard pad");
-+ } else if (port->id & ID_WIRELESS_BIT) {
-+ /* wireless pad */
-+ port->type = CTL_PAD;
-+ strcpy(port->name, (port->id & ID_WAVEBIRD_BIT) ?
-+ "Nintendo Wavebird" : "wireless pad");
-+ } else if (port->id == ID_KEYBOARD) {
-+ port->type = CTL_KEYBOARD;
-+ strcpy(port->name, "keyboard");
-+ } else {
-+ port->type = CTL_UNKNOWN;
-+ if (port->id) {
-+ sprintf(port->name, "unknown (%x)",
-+ port->id);
-+#ifdef HACK_FORCE_KEYBOARD_PORT
-+ if (index+1 == si_force_keyboard_port) {
-+ drv_printk(KERN_WARNING,
-+ "port %d forced to keyboard mode\n",
-+ index+1);
-+ port->id = ID_KEYBOARD;
-+ port->type = CTL_KEYBOARD;
-+ strcpy(port->name, "keyboard (forced)");
-+ }
-+#endif /* HACK_FORCE_KEYBOARD_PORT */
-+ } else {
-+ strcpy(port->name, "not present");
-+ }
-+ }
-+
-+ if (port->type == CTL_UNKNOWN) {
-+ retval = -ENODEV;
-+ goto done;
-+ }
-+
-+ idev = input_allocate_device();
-+ if (!idev) {
-+ drv_printk(KERN_ERR, "failed to allocate input_dev\n");
-+ retval = -ENOMEM;
-+ goto done;
-+ }
-+
-+ idev->open = si_open;
-+ idev->close = si_close;
-+ idev->name = port->name;
-+
-+ switch (port->type) {
-+ case CTL_PAD:
-+ retval = si_setup_pad(idev);
-+ break;
-+ case CTL_KEYBOARD:
-+ si_setup_keyboard(idev);
-+ break;
-+ default:
-+ break;
-+ }
-+
-+ if (retval) {
-+ input_free_device(idev);
-+ goto done;
-+ }
-+
-+ input_set_drvdata(idev, port);
-+ port->idev = idev;
-+
-+done:
-+ return retval;
-+}
-+
-+/*
-+ * Setup routines.
-+ *
-+ */
-+
-+static int si_init(struct si_drvdata *drvdata, struct resource *mem)
-+{
-+ struct si_port *port;
-+ int index;
-+ int retval;
-+ int error;
-+
-+ drvdata->io_base = ioremap(mem->start, mem->end - mem->start + 1);
-+
-+ for (index = 0; index < SI_MAX_PORTS; ++index) {
-+ port = &drvdata->ports[index];
-+
-+ memset(port, 0, sizeof(*port));
-+ port->index = index;
-+ port->drvdata = drvdata;
-+
-+ retval = si_port_probe(port);
-+ if (!retval) {
-+ error = input_register_device(port->idev);
-+ if (error) {
-+ drv_printk(KERN_ERR,
-+ "input device registration failed"
-+ " (%d) for port %d", error, index+1);
-+ port->idev = NULL;
-+ } else
-+ drv_printk(KERN_INFO, "port %d: %s\n",
-+ index+1, port->name);
-+ }
-+ }
-+
-+ si_setup_polling(drvdata);
-+
-+ return 0;
-+}
-+
-+static void si_exit(struct si_drvdata *drvdata)
-+{
-+ struct si_port *port;
-+ int index;
-+
-+ for (index = 0; index < SI_MAX_PORTS; ++index) {
-+ port = &drvdata->ports[index];
-+ if (port->idev)
-+ input_unregister_device(port->idev);
-+ }
-+
-+ if (drvdata->io_base) {
-+ iounmap(drvdata->io_base);
-+ drvdata->io_base = NULL;
-+ }
-+}
-+
-+/*
-+ * Driver model helper routines.
-+ *
-+ */
-+
-+static int si_do_probe(struct device *dev, struct resource *mem)
-+{
-+ struct si_drvdata *drvdata;
-+ int retval;
-+
-+ drvdata = kzalloc(sizeof(*drvdata), GFP_KERNEL);
-+ if (!drvdata) {
-+ drv_printk(KERN_ERR, "failed to allocate si_drvdata\n");
-+ return -ENOMEM;
-+ }
-+ dev_set_drvdata(dev, drvdata);
-+ drvdata->dev = dev;
-+
-+ retval = si_init(drvdata, mem);
-+ if (retval) {
-+ dev_set_drvdata(dev, NULL);
-+ kfree(drvdata);
-+ }
-+ return retval;
-+}
-+
-+static int si_do_remove(struct device *dev)
-+{
-+ struct si_drvdata *drvdata = dev_get_drvdata(dev);
-+
-+ if (drvdata) {
-+ si_exit(drvdata);
-+ dev_set_drvdata(dev, NULL);
-+ kfree(drvdata);
-+ return 0;
-+ }
-+ return -ENODEV;
-+}
-+
-+
-+/*
-+ * OF platform driver hooks.
-+ *
-+ */
-+
-+static int __init si_of_probe(struct of_device *odev,
-+ const struct of_device_id *match)
-+{
-+ struct resource mem;
-+ int retval;
-+
-+ retval = of_address_to_resource(odev->node, 0, &mem);
-+ if (retval) {
-+ drv_printk(KERN_ERR, "no io memory range found\n");
-+ return -ENODEV;
-+ }
-+
-+ return si_do_probe(&odev->dev, &mem);
-+}
-+
-+static int __exit si_of_remove(struct of_device *odev)
-+{
-+ return si_do_remove(&odev->dev);
-+}
-+
-+static struct of_device_id si_of_match[] = {
-+ { .compatible = "nintendo,flipper-serial" },
-+ { .compatible = "nintendo,hollywood-serial" },
-+ { },
-+};
-+
-+
-+MODULE_DEVICE_TABLE(of, si_of_match);
-+
-+static struct of_platform_driver si_of_driver = {
-+ .owner = THIS_MODULE,
-+ .name = DRV_MODULE_NAME,
-+ .match_table = si_of_match,
-+ .probe = si_of_probe,
-+ .remove = si_of_remove,
-+};
-+
-+
-+/*
-+ * Module interface hooks.
-+ *
-+ */
-+
-+static int __init si_init_module(void)
-+{
-+ drv_printk(KERN_INFO, "%s - version %s\n", DRV_DESCRIPTION,
-+ si_driver_version);
-+
-+ return of_register_platform_driver(&si_of_driver);
-+}
-+
-+static void __exit si_exit_module(void)
-+{
-+ of_unregister_platform_driver(&si_of_driver);
-+}
-+
-+module_init(si_init_module);
-+module_exit(si_exit_module);
-+
-+MODULE_DESCRIPTION(DRV_DESCRIPTION);
-+MODULE_AUTHOR(DRV_AUTHOR);
-+MODULE_LICENSE("GPL");
-+
-diff --git a/drivers/misc/Kconfig b/drivers/misc/Kconfig
-index fee7304..1b07a82 100644
---- a/drivers/misc/Kconfig
-+++ b/drivers/misc/Kconfig
-@@ -55,6 +55,28 @@ config ATMEL_TCB_CLKSRC_BLOCK
- TC can be used for other purposes, such as PWM generation and
- interval timing.
-
-+config GAMECUBE_GQR
-+ tristate "Nintendo GameCube/Wii Graphic Quantization Registers (GQR)"
-+ depends on GAMECUBE_COMMON
-+ help
-+ This option enables device driver support for the Gekko/Broadway
-+ processors' Graphic Quantization Registers.
-+ These registers are used with the psql and psqst instructions.
-+ The registers will appear in /proc/sys/gqr.
-+
-+config GAMECUBE_MI
-+ tristate "Nintendo GameCube Memory Interface (MI)"
-+ depends on GAMECUBE
-+ help
-+ If you say yes to this option, support will be included for the
-+ Memory Interface (MI) of the Nintendo GameCube.
-+
-+ The MI allows one to setup up to four protected memory regions,
-+ catching invalid accesses to them. The MI catches out of bounds
-+ memory accesses too.
-+
-+ If in doubt, say N here.
-+
- config IBM_ASM
- tristate "Device driver for IBM RSA service processor"
- depends on X86 && PCI && INPUT && EXPERIMENTAL
-diff --git a/drivers/misc/Makefile b/drivers/misc/Makefile
-index 817f7f5..79387aa 100644
---- a/drivers/misc/Makefile
-+++ b/drivers/misc/Makefile
-@@ -33,3 +33,5 @@ obj-$(CONFIG_SGI_XP) += sgi-xp/
- obj-$(CONFIG_SGI_GRU) += sgi-gru/
- obj-$(CONFIG_HP_ILO) += hpilo.o
- obj-$(CONFIG_C2PORT) += c2port/
-+obj-$(CONFIG_GAMECUBE_GQR) += gcn-gqr.o
-+obj-$(CONFIG_GAMECUBE_MI) += gcn-mi.o
-diff --git a/drivers/misc/gcn-gqr.c b/drivers/misc/gcn-gqr.c
-new file mode 100644
-index 0000000..6648265
---- /dev/null
-+++ b/drivers/misc/gcn-gqr.c
-@@ -0,0 +1,129 @@
-+/*
-+ * drivers/misc/gcn-gqr.c
-+ *
-+ * Nintendo GameCube GQR driver
-+ * Copyright (C) 2004-2009 The GameCube Linux Team
-+ * Copyright (C) 2004 Todd Jeffreys <todd@voidpointer.org>
-+ * Copyright (C) 2007,2008,2009 Albert Herranz
-+ *
-+ * This program is free software; you can redistribute it and/or
-+ * modify it under the terms of the 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/kernel.h>
-+#include <linux/errno.h>
-+#include <linux/fs.h>
-+#include <linux/ctype.h>
-+#include <linux/sysctl.h>
-+#include <linux/types.h>
-+#include <linux/uaccess.h>
-+
-+static u32 gqr_values[8];
-+static struct ctl_table_header *gqr_table_header;
-+
-+#define SPR_GQR0 912
-+#define SPR_GQR1 913
-+#define SPR_GQR2 914
-+#define SPR_GQR3 915
-+#define SPR_GQR4 916
-+#define SPR_GQR5 917
-+#define SPR_GQR6 918
-+#define SPR_GQR7 919
-+
-+#define MFSPR_CASE(i) case (i): (*((u32 *)table->data) = mfspr(SPR_GQR##i))
-+#define MTSPR_CASE(i) case (i): mtspr(SPR_GQR##i, *((u32 *)table->data))
-+
-+static int proc_dogqr(ctl_table *table, int write, struct file *file,
-+ void __user *buffer, size_t *lenp, loff_t *ppos)
-+{
-+ int r;
-+
-+ if (!write) { /* if they are reading, update the variable */
-+ switch (table->data - (void *)gqr_values) {
-+ MFSPR_CASE(0); break;
-+ MFSPR_CASE(1); break;
-+ MFSPR_CASE(2); break;
-+ MFSPR_CASE(3); break;
-+ MFSPR_CASE(4); break;
-+ MFSPR_CASE(5); break;
-+ MFSPR_CASE(6); break;
-+ MFSPR_CASE(7); break;
-+ default:
-+ return -EFAULT; /* shouldn't happen */
-+ }
-+ }
-+
-+ r = proc_dointvec(table, write, file, buffer, lenp, ppos);
-+
-+ if ((r == 0) && write) { /* if they are writing, update the reg */
-+ switch (table->data - (void *)gqr_values) {
-+ MTSPR_CASE(0); break;
-+ MTSPR_CASE(1); break;
-+ MTSPR_CASE(2); break;
-+ MTSPR_CASE(3); break;
-+ MTSPR_CASE(4); break;
-+ MTSPR_CASE(5); break;
-+ MTSPR_CASE(6); break;
-+ MTSPR_CASE(7); break;
-+ default:
-+ return -EFAULT; /* shouldn't happen */
-+ }
-+ }
-+
-+ return r;
-+}
-+
-+#define DECLARE_GQR(i) { \
-+ .ctl_name = CTL_UNNUMBERED, \
-+ .procname = "gqr" #i, \
-+ .data = gqr_values + i, \
-+ .maxlen = sizeof(int), \
-+ .mode = 0644, \
-+ .proc_handler = &proc_dogqr \
-+ }
-+
-+static ctl_table gqr_members[] = {
-+ DECLARE_GQR(0),
-+ DECLARE_GQR(1),
-+ DECLARE_GQR(2),
-+ DECLARE_GQR(3),
-+ DECLARE_GQR(4),
-+ DECLARE_GQR(5),
-+ DECLARE_GQR(6),
-+ DECLARE_GQR(7),
-+ { .ctl_name = 0 }
-+};
-+
-+static ctl_table gqr_table[] = {
-+ {
-+ .ctl_name = CTL_UNNUMBERED,
-+ .procname = "gqr",
-+ .mode = 0555,
-+ .child = gqr_members,
-+ },
-+ { .ctl_name = 0 }
-+};
-+
-+int __init gcngqr_init(void)
-+{
-+ gqr_table_header = register_sysctl_table(gqr_table);
-+ if (!gqr_table_header) {
-+ printk(KERN_ERR "Unable to register GQR sysctl table\n");
-+ return -ENOMEM;
-+ }
-+ return 0;
-+}
-+
-+void __exit gcngqr_exit(void)
-+{
-+ unregister_sysctl_table(gqr_table_header);
-+}
-+
-+MODULE_LICENSE("GPL");
-+MODULE_AUTHOR("Todd Jeffreys <todd@voidpointer.org>");
-+module_init(gcngqr_init);
-+module_exit(gcngqr_exit);
-diff --git a/drivers/misc/gcn-mi.c b/drivers/misc/gcn-mi.c
-new file mode 100644
-index 0000000..864017d
---- /dev/null
-+++ b/drivers/misc/gcn-mi.c
-@@ -0,0 +1,443 @@
-+/*
-+ * drivers/misc/gcn-mi.c
-+ *
-+ * Nintendo GameCube Memory Interface (MI) driver.
-+ * Copyright (C) 2004-2009 The GameCube Linux Team
-+ * Copyright (C) 2004,2005,2007,2008,2009 Albert Herranz
-+ *
-+ * This program is free software; you can redistribute it and/or
-+ * modify it under the terms of the 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/device.h>
-+#include <linux/init.h>
-+#include <linux/kernel.h>
-+#include <linux/module.h>
-+#include <linux/platform_device.h>
-+#include <linux/ioport.h>
-+#include <linux/interrupt.h>
-+#include <linux/spinlock.h>
-+#include <linux/proc_fs.h>
-+#include <linux/io.h>
-+
-+#include "gcn-mi.h"
-+
-+
-+#define MI_IRQ 7
-+
-+#define MI_BASE 0xcc004000
-+#define MI_SIZE 0x80
-+
-+#define MI_PROT_REGION0 ((u32 __iomem *)(MI_BASE+0x00))
-+#define MI_PROT_REGION1 ((u32 __iomem *)(MI_BASE+0x04))
-+#define MI_PROT_REGION2 ((u32 __iomem *)(MI_BASE+0x08))
-+#define MI_PROT_REGION3 ((u32 __iomem *)(MI_BASE+0x0c))
-+
-+#define MI_PROT_TYPE ((u16 __iomem *)(MI_BASE+0x10))
-+
-+#define MI_IMR ((u16 __iomem *)(MI_BASE+0x1c))
-+#define MI_ICR ((u16 __iomem *)(MI_BASE+0x1e))
-+
-+#define MI_0x4020 ((u16 __iomem *)(MI_BASE+0x20))
-+
-+#define MI_ADDRLO ((u16 __iomem *)(MI_BASE+0x22))
-+#define MI_ADDRHI ((u16 __iomem *)(MI_BASE+0x24))
-+
-+#define MI_PAGE_SHIFT 10
-+#define MI_PAGE_MASK (~((1 << MI_PAGE_SHIFT) - 1))
-+#define MI_PAGE_SIZE (1UL << MI_PAGE_SHIFT)
-+
-+struct mi_private {
-+ struct device *device;
-+ int irq;
-+ int nr_regions;
-+ int regions_bitmap;
-+ unsigned long faults[MI_MAX_REGIONS+1];
-+ unsigned long last_address;
-+ unsigned long last_address_faults;
-+ spinlock_t lock;
-+#ifdef CONFIG_PROC_FS
-+ struct proc_dir_entry *proc_file;
-+#endif
-+};
-+
-+static struct mi_private *mi_private;
-+
-+#define DRV_MODULE_NAME "gcn-mi"
-+#define DRV_DESCRIPTION "Nintendo GameCube Memory Interface driver"
-+#define DRV_AUTHOR "Albert Herranz"
-+
-+#define PFX DRV_MODULE_NAME ": "
-+#define mi_printk(level, format, arg...) \
-+ printk(level PFX format , ## arg)
-+
-+/*
-+ *
-+ */
-+static irqreturn_t mi_handler(int this_irq, void *data)
-+{
-+ struct mi_private *priv = (struct mi_private *)data;
-+ unsigned long flags;
-+ int region, cause, ack;
-+ unsigned long address;
-+
-+ spin_lock_irqsave(&priv->lock, flags);
-+
-+ address = in_be16(MI_ADDRLO) | (in_be16(MI_ADDRHI)<<16);
-+
-+ ack = 0;
-+ cause = in_be16(MI_ICR);
-+
-+ /* a fault was detected in some of the registered regions */
-+ if ((cause & 0xf) != 0) {
-+ for (region = 0; region < MI_MAX_REGIONS; region++) {
-+ if ((cause & (1 << region)) != 0) {
-+ priv->faults[region]++;
-+ mi_printk(KERN_INFO, "bad access on region #%d"
-+ " at 0x%lx\n", region, address);
-+ }
-+ }
-+ }
-+
-+ /* a fault was detected out of any registered region */
-+ if ((cause & (1 << 4)) != 0) {
-+ priv->faults[MI_MAX_REGIONS]++;
-+ if (address == priv->last_address) {
-+ priv->last_address_faults++;
-+ } else {
-+ if (priv->last_address_faults > 0) {
-+#if 0
-+ mi_printk(KERN_INFO, "bad access"
-+ " at 0x%lx (%lu times)\n",
-+ priv->last_address,
-+ priv->last_address_faults);
-+#endif
-+ }
-+ priv->last_address = address;
-+ priv->last_address_faults = 1;
-+ }
-+ }
-+ ack |= cause;
-+ out_be16(MI_ICR, ack); /* ack int */
-+ out_be16(MI_0x4020, 0); /* kind of ack */
-+
-+ spin_unlock_irqrestore(&priv->lock, flags);
-+
-+ return IRQ_HANDLED;
-+}
-+
-+#ifdef CONFIG_PROC_FS
-+/*
-+ *
-+ */
-+static int mi_proc_read(char *page, char **start,
-+ off_t off, int count,
-+ int *eof, void *data)
-+{
-+ struct mi_private *priv = (struct mi_private *)data;
-+ int len;
-+ int region;
-+
-+ len = sprintf(page, "# <region> <faults>\n");
-+ for (region = 0; region < MI_MAX_REGIONS; region++) {
-+ if ((priv->regions_bitmap & (1<<region)) != 0) {
-+ len += sprintf(page+len, "%d\t%lu\n",
-+ region, priv->faults[region]);
-+ }
-+ }
-+ len += sprintf(page+len, "%s\t%lu\n",
-+ "none", priv->faults[MI_MAX_REGIONS]);
-+
-+ return len;
-+}
-+
-+#endif /* CONFIG_PROC_FS */
-+
-+/*
-+ *
-+ */
-+static int mi_setup_irq(struct mi_private *priv)
-+{
-+ int retval;
-+
-+ retval = request_irq(priv->irq, mi_handler, 0, DRV_MODULE_NAME, priv);
-+ if (retval)
-+ mi_printk(KERN_ERR, "request of irq%d failed\n", priv->irq);
-+ else
-+ out_be16(MI_IMR, (1<<4)); /* do not mask all MI interrupts */
-+
-+ return retval;
-+}
-+
-+/*
-+ *
-+ */
-+static int mi_probe(struct device *device, struct resource *mem, int irq)
-+{
-+ struct mi_private *priv;
-+ int retval;
-+
-+ priv = kmalloc(sizeof(struct mi_private), GFP_KERNEL);
-+ if (!priv) {
-+ retval = -ENOMEM;
-+ goto err;
-+ }
-+
-+ memset(priv, 0, sizeof(*priv));
-+ /*
-+ int region;
-+ priv->nr_regions = 0;
-+ priv->regions_bitmap = 0;
-+ for( region = 0; region < MI_MAX_REGIONS; region++ ) {
-+ priv->faults[region] = 0;
-+ }
-+ priv->last_address_faults = 0;
-+ */
-+ spin_lock_init(&priv->lock);
-+
-+ priv->device = device;
-+ dev_set_drvdata(priv->device, priv);
-+
-+ priv->irq = irq;
-+ retval = mi_setup_irq(priv);
-+ if (retval)
-+ goto err_setup_irq;
-+
-+#ifdef CONFIG_PROC_FS
-+ struct platform_device *pdev = to_platform_device(device);
-+ priv->proc_file = create_proc_read_entry(pdev->dev.bus_id, 0444, NULL,
-+ mi_proc_read, priv);
-+ priv->proc_file->owner = THIS_MODULE;
-+#endif /* CONFIG_PROC_FS */
-+
-+ mi_private = priv;
-+
-+ return 0;
-+
-+err_setup_irq:
-+ dev_set_drvdata(priv->device, NULL);
-+ kfree(priv);
-+err:
-+ return retval;
-+}
-+
-+/*
-+ *
-+ */
-+static void mi_shutdown(struct mi_private *priv)
-+{
-+ gcn_mi_region_unprotect_all();
-+}
-+
-+/*
-+ *
-+ */
-+static void mi_remove(struct mi_private *priv)
-+{
-+#ifdef CONFIG_PROC_FS
-+ struct platform_device *pdev = to_platform_device(priv->device);
-+ remove_proc_entry(pdev->dev.bus_id, NULL);
-+#endif /* CONFIG_PROC_FS */
-+
-+ mi_shutdown(priv);
-+
-+ /* free interrupt handler */
-+ free_irq(priv->irq, priv);
-+
-+ kfree(priv);
-+ mi_private = NULL;
-+}
-+
-+/*
-+ *
-+ */
-+static int __init mi_drv_probe(struct device *device)
-+{
-+ struct platform_device *pdev = to_platform_device(device);
-+ struct resource *mem;
-+ int irq;
-+
-+ irq = platform_get_irq(pdev, 0);
-+ mem = platform_get_resource(pdev, IORESOURCE_MEM, 0);
-+ if (!mem)
-+ return -ENODEV;
-+
-+ mi_printk(KERN_INFO, "%s\n", DRV_DESCRIPTION);
-+
-+ return mi_probe(device, mem, irq);
-+}
-+
-+/*
-+ *
-+ */
-+static int mi_drv_remove(struct device *device)
-+{
-+ struct mi_private *priv = dev_get_drvdata(device);
-+
-+ if (priv) {
-+ mi_remove(priv);
-+ dev_set_drvdata(device, NULL);
-+ }
-+
-+ return 0;
-+}
-+
-+/*
-+ *
-+ */
-+static void mi_drv_shutdown(struct device *device)
-+{
-+ struct mi_private *priv = dev_get_drvdata(device);
-+
-+ if (priv)
-+ mi_shutdown(priv);
-+}
-+
-+static struct device_driver mi_device_driver = {
-+ .name = "mi",
-+ .bus = &platform_bus_type,
-+ .probe = mi_drv_probe,
-+ .remove = mi_drv_remove,
-+ .shutdown = mi_drv_shutdown,
-+};
-+
-+static struct resource mi_resources[] = {
-+ [0] = {
-+ .start = MI_BASE,
-+ .end = MI_BASE + MI_SIZE - 1,
-+ .flags = IORESOURCE_MEM,
-+ },
-+ [1] = {
-+ .start = MI_IRQ,
-+ .end = MI_IRQ,
-+ .flags = IORESOURCE_IRQ,
-+ },
-+};
-+
-+static struct platform_device mi_device = {
-+ .name = "mi",
-+ .id = 0,
-+ .num_resources = ARRAY_SIZE(mi_resources),
-+ .resource = mi_resources,
-+};
-+
-+/*
-+ *
-+ */
-+static int __init mi_init(void)
-+{
-+ int retval = 0;
-+
-+ retval = driver_register(&mi_device_driver);
-+ if (!retval)
-+ retval = platform_device_register(&mi_device);
-+
-+ return retval;
-+}
-+
-+/*
-+ *
-+ */
-+static void __exit mi_exit(void)
-+{
-+ platform_device_unregister(&mi_device);
-+ driver_unregister(&mi_device_driver);
-+}
-+
-+module_init(mi_init);
-+module_exit(mi_exit);
-+
-+
-+/* public interface */
-+
-+/*
-+ *
-+ */
-+int gcn_mi_region_protect(unsigned long physlo, unsigned long physhi, int type)
-+{
-+ struct mi_private *priv = mi_private;
-+ int region, free_regions;
-+ u16 pagelo, pagehi;
-+
-+ if (!priv)
-+ return -ENODEV;
-+
-+ if (type < MI_PROT_NONE || type > MI_PROT_RW)
-+ return -EINVAL;
-+
-+ if ((physlo & ~MI_PAGE_MASK) != 0 || (physhi & ~MI_PAGE_MASK) != 0)
-+ return -EINVAL;
-+
-+ free_regions = MI_MAX_REGIONS - priv->nr_regions;
-+ if (free_regions <= 0)
-+ return -ENOMEM;
-+ for (region = 0; region < MI_MAX_REGIONS; region++) {
-+ if ((priv->regions_bitmap & (1<<region)) == 0)
-+ break;
-+ }
-+ if (region >= MI_MAX_REGIONS)
-+ return -ENOMEM;
-+ priv->regions_bitmap |= (1 << region);
-+ priv->nr_regions++;
-+
-+ out_be16(MI_PROT_TYPE,
-+ (in_be16(MI_PROT_TYPE) & ~(3 << 2*region))|(type << 2*region));
-+ pagelo = physlo >> MI_PAGE_SHIFT;
-+ pagehi = (physhi >> MI_PAGE_SHIFT) - 1;
-+ out_be32(MI_PROT_REGION0 + 4*region, (pagelo << 16) | pagehi);
-+ out_be16(MI_IMR, in_be16(MI_IMR) | (1 << region));
-+
-+ mi_printk(KERN_INFO, "protected region #%d"
-+ " from 0x%0lx to 0x%0lx with 0x%0x\n", region,
-+ (unsigned long)(pagelo << MI_PAGE_SHIFT),
-+ (unsigned long)(((pagehi+1) << MI_PAGE_SHIFT) - 1),
-+ type);
-+
-+ return region;
-+}
-+
-+/*
-+ *
-+ */
-+int gcn_mi_region_unprotect(int region)
-+{
-+ struct mi_private *priv = mi_private;
-+
-+ if (!priv)
-+ return -ENODEV;
-+
-+ if (region < 0 || region > MI_MAX_REGIONS)
-+ return -EINVAL;
-+
-+ out_be16(MI_IMR, in_be16(MI_IMR) & ~(1 << region));
-+ out_be32(MI_PROT_REGION0 + 4*region, 0);
-+ out_be16(MI_PROT_TYPE,
-+ in_be16(MI_PROT_TYPE) | (MI_PROT_RW << 2*region));
-+
-+ if ((priv->regions_bitmap & (1<<region)) != 0)
-+ mi_printk(KERN_INFO, "region #%d unprotected\n", region);
-+
-+ priv->regions_bitmap &= ~(1 << region);
-+ priv->nr_regions--;
-+
-+ return 0;
-+}
-+
-+/*
-+ *
-+ */
-+void gcn_mi_region_unprotect_all(void)
-+{
-+ int region;
-+
-+ out_be16(MI_IMR, 0);
-+ for (region = 0; region < MI_MAX_REGIONS; region++)
-+ gcn_mi_region_unprotect(region);
-+}
-+
-+MODULE_DESCRIPTION(DRV_DESCRIPTION);
-+MODULE_AUTHOR(DRV_AUTHOR);
-+MODULE_LICENSE("GPL");
-diff --git a/drivers/misc/gcn-mi.h b/drivers/misc/gcn-mi.h
-new file mode 100644
-index 0000000..201387b
---- /dev/null
-+++ b/drivers/misc/gcn-mi.h
-@@ -0,0 +1,30 @@
-+/*
-+ * drivers/misc/gcn-mi.h
-+ *
-+ * Nintendo GameCube Memory Interface driver
-+ * Copyright (C) 2004-2009 The GameCube Linux Team
-+ * Copyright (C) 2004,2005,2008,2009 Albert Herranz
-+ *
-+ * This program is free software; you can redistribute it and/or
-+ * modify it under the terms of the 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 __GCN_MI_H
-+#define __GCN_MI_H
-+
-+#define MI_MAX_REGIONS 4
-+
-+#define MI_PROT_NONE 0x00
-+#define MI_PROT_RO 0x01
-+#define MI_PROT_WO 0x02
-+#define MI_PROT_RW 0x03
-+
-+int gcn_mi_region_protect(unsigned long physlo, unsigned long physhi, int type);
-+int gcn_mi_region_unprotect(int region);
-+void gcn_mi_region_unprotect_all(void);
-+
-+#endif /* __GCN_MI_H */
-+
-diff --git a/drivers/net/Kconfig b/drivers/net/Kconfig
-index 231eeaf..a56c769 100644
---- a/drivers/net/Kconfig
-+++ b/drivers/net/Kconfig
-@@ -270,6 +270,15 @@ config BMAC
- To compile this driver as a module, choose M here: the module
- will be called bmac.
-
-+config GAMECUBE_BBA
-+ tristate "Nintendo GameCube ethernet BroadBand Adapter (BBA)"
-+ depends on GAMECUBE_EXI && GAMECUBE
-+ help
-+ Say Y here to add ethernet support for the Broadband Adapter (BBA).
-+
-+ To compile this driver as a module, choose M here: the module
-+ will be called gcn-bba.
-+
- config ARIADNE
- tristate "Ariadne support"
- depends on ZORRO
-diff --git a/drivers/net/Makefile b/drivers/net/Makefile
-index 017383a..79854fa 100644
---- a/drivers/net/Makefile
-+++ b/drivers/net/Makefile
-@@ -226,6 +226,7 @@ obj-$(CONFIG_PASEMI_MAC) += pasemi_mac_driver.o
- pasemi_mac_driver-objs := pasemi_mac.o pasemi_mac_ethtool.o
- obj-$(CONFIG_MLX4_CORE) += mlx4/
- obj-$(CONFIG_ENC28J60) += enc28j60.o
-+obj-$(CONFIG_GAMECUBE_BBA) += gcn-bba.o
-
- obj-$(CONFIG_XTENSA_XT2000_SONIC) += xtsonic.o
-
-diff --git a/drivers/net/gcn-bba.c b/drivers/net/gcn-bba.c
-new file mode 100644
-index 0000000..2f67968
---- /dev/null
-+++ b/drivers/net/gcn-bba.c
-@@ -0,0 +1,1252 @@
-+/**
-+ * drivers/net/gcn-bba.c
-+ *
-+ * Nintendo GameCube Broadband Adapter (BBA) driver
-+ * Copyright (C) 2004-2009 The GameCube Linux Team
-+ * Copyright (C) 2005 Todd Jeffreys
-+ * Copyright (C) 2004,2005,2006,2007,2008,2009 Albert Herranz
-+ *
-+ * Based on previous work by Stefan Esser, Franz Lehner, Costis and tmbinc.
-+ *
-+ * This program is free software; you can redistribute it and/or
-+ * modify it under the terms of the GNU General Public License
-+ * as published by the Free Software Foundation; either version 2
-+ * of the License, or (at your option) any later version.
-+ *
-+ */
-+
-+#define BBA_DEBUG
-+
-+#include <linux/module.h>
-+#include <linux/kernel.h>
-+#include <linux/types.h>
-+#include <linux/fcntl.h>
-+#include <linux/string.h>
-+#include <linux/interrupt.h>
-+#include <linux/ioport.h>
-+#include <linux/errno.h>
-+#include <linux/init.h>
-+#include <linux/delay.h>
-+#include <linux/inet.h>
-+#include <linux/netdevice.h>
-+#include <linux/etherdevice.h>
-+#include <linux/skbuff.h>
-+#include <linux/spinlock.h>
-+#include <linux/kthread.h>
-+#include <linux/wait.h>
-+#include <linux/io.h>
-+#include <linux/exi.h>
-+#include <asm/system.h>
-+
-+
-+#define DRV_MODULE_NAME "gcn-bba"
-+#define DRV_DESCRIPTION "Nintendo GameCube Broadband Adapter (BBA) driver"
-+#define DRV_AUTHOR "Albert Herranz, " \
-+ "Todd Jeffreys"
-+
-+static char bba_driver_version[] = "1.4i";
-+
-+
-+#define bba_printk(level, format, arg...) \
-+ printk(level DRV_MODULE_NAME ": " format , ## arg)
-+
-+#ifdef BBA_DEBUG
-+# define DBG(fmt, args...) \
-+ printk(KERN_ERR "%s: " fmt, __func__ , ## args)
-+#else
-+# define DBG(fmt, args...)
-+#endif
-+
-+/*
-+ * EXpansion Interface glue for the Broadband Adapter.
-+ *
-+ */
-+#define BBA_EXI_ID 0x04020200
-+
-+#define BBA_EXI_IRQ_CHANNEL 2 /* INT line uses EXI2INTB */
-+#define BBA_EXI_CHANNEL 0 /* rest of lines use EXI0xxx */
-+#define BBA_EXI_DEVICE 2 /* chip select, EXI0CSB2 */
-+#define BBA_EXI_FREQ 5 /* 32MHz */
-+
-+#define BBA_CMD_IR_MASKALL 0x00
-+#define BBA_CMD_IR_MASKNONE 0xf8
-+
-+static inline void bba_select(void);
-+static inline void bba_deselect(void);
-+static inline void bba_write(void *data, size_t len);
-+static inline void bba_read(void *data, size_t len);
-+
-+static void bba_ins(int reg, void *val, int len);
-+static void bba_outs(int reg, void *val, int len);
-+
-+/*
-+ * Command Registers I/O.
-+ */
-+
-+static inline void bba_cmd_ins_nosel(int reg, void *val, int len)
-+{
-+ u16 req;
-+ req = reg << 8;
-+ bba_write(&req, sizeof(req));
-+ bba_read(val, len);
-+}
-+
-+static void bba_cmd_ins(int reg, void *val, int len)
-+{
-+ bba_select();
-+ bba_cmd_ins_nosel(reg, val, len);
-+ bba_deselect();
-+}
-+
-+static inline void bba_cmd_outs_nosel(int reg, void *val, int len)
-+{
-+ u16 req;
-+ req = (reg << 8) | 0x4000;
-+ bba_write(&req, sizeof(req));
-+ bba_write(val, len);
-+}
-+
-+static void bba_cmd_outs(int reg, void *val, int len)
-+{
-+ bba_select();
-+ bba_cmd_outs_nosel(reg, val, len);
-+ bba_deselect();
-+}
-+
-+static inline u8 bba_cmd_in8(int reg)
-+{
-+ u8 val;
-+ bba_cmd_ins(reg, &val, sizeof(val));
-+ return val;
-+}
-+
-+static u8 bba_cmd_in8_slow(int reg)
-+{
-+ u8 val;
-+ bba_select();
-+ bba_cmd_ins_nosel(reg, &val, sizeof(val));
-+ udelay(200);
-+ bba_deselect();
-+ return val;
-+}
-+
-+static inline void bba_cmd_out8(int reg, u8 val)
-+{
-+ bba_cmd_outs(reg, &val, sizeof(val));
-+}
-+
-+
-+/*
-+ * Registers I/O.
-+ */
-+
-+static inline u8 bba_in8(int reg)
-+{
-+ u8 val;
-+ bba_ins(reg, &val, sizeof(val));
-+ return val;
-+}
-+
-+static inline void bba_out8(int reg, u8 val)
-+{
-+ bba_outs(reg, &val, sizeof(val));
-+}
-+
-+static inline u16 bba_in16(int reg)
-+{
-+ u16 val;
-+ bba_ins(reg, &val, sizeof(val));
-+ return le16_to_cpup(&val);
-+}
-+
-+static inline void bba_out16(int reg, u16 val)
-+{
-+ cpu_to_le16s(&val);
-+ bba_outs(reg, &val, sizeof(val));
-+}
-+
-+#define bba_in12(reg) (bba_in16(reg) & 0x0fff)
-+#define bba_out12(reg, val) do { bba_out16(reg, (val)&0x0fff); } while (0)
-+
-+static inline void bba_ins_nosel(int reg, void *val, int len)
-+{
-+ u32 req;
-+ req = (reg << 8) | 0x80000000;
-+ bba_write(&req, sizeof(req));
-+ bba_read(val, len);
-+}
-+
-+static void bba_ins(int reg, void *val, int len)
-+{
-+ bba_select();
-+ bba_ins_nosel(reg, val, len);
-+ bba_deselect();
-+}
-+
-+static inline void bba_outs_nosel(int reg, void *val, int len)
-+{
-+ u32 req;
-+ req = (reg << 8) | 0xC0000000;
-+ bba_write(&req, sizeof(req));
-+ bba_write(val, len);
-+}
-+
-+static inline void bba_outs_nosel_continued(void *val, int len)
-+{
-+ bba_write(val, len);
-+}
-+
-+static void bba_outs(int reg, void *val, int len)
-+{
-+ bba_select();
-+ bba_outs_nosel(reg, val, len);
-+ bba_deselect();
-+}
-+
-+
-+/*
-+ * Macronix mx98728ec supporting bits.
-+ *
-+ */
-+
-+#define BBA_NCRA 0x00 /* Network Control Register A, RW */
-+#define BBA_NCRA_RESET (1<<0) /* RESET */
-+#define BBA_NCRA_ST0 (1<<1) /* ST0, Start transmit command/status */
-+#define BBA_NCRA_ST1 (1<<2) /* ST1, " */
-+#define BBA_NCRA_SR (1<<3) /* SR, Start Receive */
-+
-+#define BBA_NCRB 0x01 /* Network Control Register B, RW */
-+#define BBA_NCRB_PR (1<<0) /* PR, Promiscuous Mode */
-+#define BBA_NCRB_CA (1<<1) /* CA, Capture Effect Mode */
-+#define BBA_NCRB_PM (1<<2) /* PM, Pass Multicast */
-+#define BBA_NCRB_PB (1<<3) /* PB, Pass Bad Frame */
-+#define BBA_NCRB_AB (1<<4) /* AB, Accept Broadcast */
-+#define BBA_NCRB_HBD (1<<5) /* HBD, reserved */
-+#define BBA_NCRB_RXINTC0 (1<<6) /* RXINTC, Receive Interrupt Counter */
-+#define BBA_NCRB_RXINTC1 (1<<7) /* " */
-+#define BBA_NCRB_1_PACKET_PER_INT (0<<6) /* 0 0 */
-+#define BBA_NCRB_2_PACKETS_PER_INT (1<<6) /* 0 1 */
-+#define BBA_NCRB_4_PACKETS_PER_INT (2<<6) /* 1 0 */
-+#define BBA_NCRB_8_PACKETS_PER_INT (3<<6) /* 1 1 */
-+
-+#define BBA_LTPS 0x04 /* Last Transmitted Packet Status, RO */
-+#define BBA_LRPS 0x05 /* Last Received Packet Status, RO */
-+
-+#define BBA_IMR 0x08 /* Interrupt Mask Register, RW, 00h */
-+#define BBA_IMR_FRAGIM (1<<0) /* FRAGIM, Fragment Counter Int Mask */
-+#define BBA_IMR_RIM (1<<1) /* RIM, Receive Interrupt Mask */
-+#define BBA_IMR_TIM (1<<2) /* TIM, Transmit Interrupt Mask */
-+#define BBA_IMR_REIM (1<<3) /* REIM, Receive Error Interrupt Mask */
-+#define BBA_IMR_TEIM (1<<4) /* TEIM, Transmit Error Interrupt Mask */
-+#define BBA_IMR_FIFOEIM (1<<5) /* FIFOEIM, FIFO Error Interrupt Mask */
-+#define BBA_IMR_BUSEIM (1<<6) /* BUSEIM, BUS Error Interrupt Mask */
-+#define BBA_IMR_RBFIM (1<<7) /* RBFIM, RX Buf Full Interrupt Mask */
-+
-+#define BBA_IR 0x09 /* Interrupt Register, RW, 00h */
-+#define BBA_IR_FRAGI (1<<0) /* FRAGI, Fragment Counter Interrupt */
-+#define BBA_IR_RI (1<<1) /* RI, Receive Interrupt */
-+#define BBA_IR_TI (1<<2) /* TI, Transmit Interrupt */
-+#define BBA_IR_REI (1<<3) /* REI, Receive Error Interrupt */
-+#define BBA_IR_TEI (1<<4) /* TEI, Transmit Error Interrupt */
-+#define BBA_IR_FIFOEI (1<<5) /* FIFOEI, FIFO Error Interrupt */
-+#define BBA_IR_BUSEI (1<<6) /* BUSEI, BUS Error Interrupt */
-+#define BBA_IR_RBFI (1<<7) /* RBFI, RX Buffer Full Interrupt */
-+
-+#define BBA_BP 0x0a/*+0x0b*/ /* Boundary Page Pointer Register */
-+#define BBA_TLBP 0x0c/*+0x0d*/ /* TX Low Boundary Page Pointer Register */
-+#define BBA_TWP 0x0e/*+0x0f*/ /* Transmit Buf Write Page Pointer Register */
-+#define BBA_TRP 0x12/*+0x13*/ /* Transmit Buf Read Page Pointer Register */
-+#define BBA_RWP 0x16/*+0x17*/ /* Receive Buffer Write Page Pointer Register */
-+#define BBA_RRP 0x18/*+0x19*/ /* Receive Buffer Read Page Pointer Register */
-+#define BBA_RHBP 0x1a/*+0x1b*/ /* Receive High Boundary Page Ptr Register */
-+
-+#define BBA_RXINTT 0x14/*+0x15*/ /* Receive Interrupt Timer Register */
-+
-+#define BBA_NAFR_PAR0 0x20 /* Physical Address Register Byte 0 */
-+#define BBA_NAFR_PAR1 0x21 /* Physical Address Register Byte 1 */
-+#define BBA_NAFR_PAR2 0x22 /* Physical Address Register Byte 2 */
-+#define BBA_NAFR_PAR3 0x23 /* Physical Address Register Byte 3 */
-+#define BBA_NAFR_PAR4 0x24 /* Physical Address Register Byte 4 */
-+#define BBA_NAFR_PAR5 0x25 /* Physical Address Register Byte 5 */
-+
-+#define BBA_NWAYC 0x30 /* NWAY Configuration Register, RW, 84h */
-+#define BBA_NWAYC_FD (1<<0) /* FD, Full Duplex Mode */
-+#define BBA_NWAYC_PS100 (1<<1) /* PS100/10, Port Select 100/10 */
-+#define BBA_NWAYC_ANE (1<<2) /* ANE, Autonegotiation Enable */
-+#define BBA_NWAYC_ANS_RA (0x01<<3) /* ANS, Restart Autonegotiation */
-+#define BBA_NWAYC_LTE (1<<7) /* LTE, Link Test Enable */
-+
-+#define BBA_GCA 0x32 /* GMAC Configuration A Register, RW, 00h */
-+#define BBA_GCA_ARXERRB (1<<3) /* ARXERRB, Accept RX pkt with error */
-+
-+#define BBA_MISC 0x3d /* MISC Control Register 1, RW, 3ch */
-+#define BBA_MISC_BURSTDMA (1<<0)
-+#define BBA_MISC_DISLDMA (1<<1)
-+
-+#define BBA_TXFIFOCNT 0x3e/*0x3f*/ /* Transmit FIFO Counter Register */
-+#define BBA_WRTXFIFOD 0x48/*-0x4b*/ /* Write TX FIFO Data Port Register */
-+
-+#define BBA_MISC2 0x50 /* MISC Control Register 2, RW, 00h */
-+#define BBA_MISC2_HBRLEN0 (1<<0) /* HBRLEN, Host Burst Read Length */
-+#define BBA_MISC2_HBRLEN1 (1<<1) /* " */
-+#define BBA_MISC2_AUTORCVR (1<<7) /* Auto RX Full Recovery */
-+
-+#define BBA_RX_STATUS_BF (1<<0)
-+#define BBA_RX_STATUS_CRC (1<<1)
-+#define BBA_RX_STATUS_FAE (1<<2)
-+#define BBA_RX_STATUS_FO (1<<3)
-+#define BBA_RX_STATUS_RW (1<<4)
-+#define BBA_RX_STATUS_MF (1<<5)
-+#define BBA_RX_STATUS_RF (1<<6)
-+#define BBA_RX_STATUS_RERR (1<<7)
-+
-+#define BBA_TX_STATUS_CC0 (1<<0)
-+#define BBA_TX_STATUS_CC1 (1<<1)
-+#define BBA_TX_STATUS_CC2 (1<<2)
-+#define BBA_TX_STATUS_CC3 (1<<3)
-+#define BBA_TX_STATUS_CCMASK (0x0f)
-+#define BBA_TX_STATUS_CRSLOST (1<<4)
-+#define BBA_TX_STATUS_UF (1<<5)
-+#define BBA_TX_STATUS_OWC (1<<6)
-+#define BBA_TX_STATUS_OWN (1<<7)
-+#define BBA_TX_STATUS_TERR (1<<7)
-+
-+#define BBA_TX_MAX_PACKET_SIZE 1518 /* 14+1500+4 */
-+#define BBA_RX_MAX_PACKET_SIZE 1536 /* 6 pages * 256 bytes */
-+
-+
-+/**
-+ *
-+ * DRIVER NOTES
-+ *
-+ * 1. Packet Memory organization
-+ *
-+ * rx: 15 pages of 256 bytes, 2 full sized packets only (6 pages each)
-+ * tx: through FIFO, not using packet memory
-+ *
-+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-+ * |1|2|3|4|5|6|7|8|9|A|B|C|D|E|F|
-+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-+ * ^ ^
-+ * | |
-+ * TLBP RHBP
-+ * BP
-+ *
-+ */
-+
-+#define BBA_INIT_TLBP 0x00
-+#define BBA_INIT_BP 0x01
-+#define BBA_INIT_RHBP 0x0f
-+#define BBA_INIT_RWP BBA_INIT_BP
-+#define BBA_INIT_RRP BBA_INIT_BP
-+
-+enum {
-+ __BBA_RBFIM_OFF = 0,
-+};
-+
-+struct bba_descr {
-+#if defined(__BIG_ENDIAN_BITFIELD)
-+ __u32 status:8,
-+ packet_len : 12,
-+ next_packet_ptr : 12;
-+#else
-+ __u32 next_packet_ptr:12,
-+ packet_len : 12,
-+ status : 8;
-+#endif
-+} __attribute((packed));
-+
-+
-+struct bba_private {
-+ spinlock_t lock;
-+ unsigned long flags;
-+#define BBA_RBFIM_OFF (1<<__BBA_RBFIM_OFF)
-+
-+ u32 msg_enable;
-+ u8 revid;
-+ u8 __0x04_init[2];
-+ u8 __0x05_init;
-+
-+ struct sk_buff *tx_skb;
-+ int rx_work;
-+
-+ struct task_struct *io_thread;
-+ wait_queue_head_t io_waitq;
-+
-+ struct net_device *dev;
-+ struct net_device_stats stats;
-+
-+ struct exi_device *exi_device;
-+};
-+
-+static int bba_event_handler(struct exi_channel *exi_channel,
-+ unsigned int event, void *dev0);
-+static int bba_setup_hardware(struct net_device *dev);
-+
-+/*
-+ * Opens the network device.
-+ */
-+static int bba_open(struct net_device *dev)
-+{
-+ struct bba_private *priv = (struct bba_private *)dev->priv;
-+ int retval;
-+
-+ /* INTs are triggered on EXI channel 2 */
-+ retval = exi_event_register(to_exi_channel(BBA_EXI_IRQ_CHANNEL),
-+ EXI_EVENT_IRQ,
-+ priv->exi_device,
-+ bba_event_handler, dev,
-+ (1 << BBA_EXI_CHANNEL));
-+ if (retval < 0) {
-+ bba_printk(KERN_ERR, "unable to register EXI event %d\n",
-+ EXI_EVENT_IRQ);
-+ goto out;
-+ }
-+
-+ /* reset the hardware to a known state */
-+ exi_dev_take(priv->exi_device);
-+ retval = bba_setup_hardware(dev);
-+ exi_dev_give(priv->exi_device);
-+
-+ /* inform the network layer that we are ready */
-+ netif_start_queue(dev);
-+out:
-+ return retval;
-+}
-+
-+/*
-+ * Closes the network device.
-+ */
-+static int bba_close(struct net_device *dev)
-+{
-+ struct bba_private *priv = (struct bba_private *)dev->priv;
-+
-+ /* do not allow more packets to be queued */
-+ netif_carrier_off(dev);
-+ netif_stop_queue(dev);
-+
-+ exi_dev_take(priv->exi_device);
-+
-+ /* stop receiver */
-+ bba_out8(BBA_NCRA, bba_in8(BBA_NCRA) & ~BBA_NCRA_SR);
-+
-+ /* mask all interrupts */
-+ bba_out8(BBA_IMR, 0x00);
-+
-+ exi_dev_give(priv->exi_device);
-+
-+ /* unregister exi event */
-+ exi_event_unregister(to_exi_channel(BBA_EXI_IRQ_CHANNEL),
-+ EXI_EVENT_IRQ);
-+
-+ return 0;
-+}
-+
-+/*
-+ * Returns the network device statistics.
-+ */
-+static struct net_device_stats *bba_get_stats(struct net_device *dev)
-+{
-+ struct bba_private *priv = (struct bba_private *)dev->priv;
-+
-+ return &priv->stats;
-+}
-+
-+/*
-+ * Starts transmission for a packet.
-+ * We can't do real hardware i/o here.
-+ */
-+static int bba_start_xmit(struct sk_buff *skb, struct net_device *dev)
-+{
-+ struct bba_private *priv = (struct bba_private *)dev->priv;
-+ unsigned long flags;
-+ int retval = NETDEV_TX_OK;
-+
-+ /* we are not able to send packets greater than this */
-+ if (skb->len > BBA_TX_MAX_PACKET_SIZE) {
-+ dev_kfree_skb(skb);
-+ priv->stats.tx_dropped++;
-+ /* silently drop the package */
-+ goto out;
-+ }
-+
-+ spin_lock_irqsave(&priv->lock, flags);
-+
-+ /*
-+ * If there's no packet pending, store the packet for transmission
-+ * and wake up the io thread. Otherwise, we are busy.
-+ */
-+ if (!priv->tx_skb) {
-+ priv->tx_skb = skb;
-+ dev->trans_start = jiffies;
-+ wake_up(&priv->io_waitq);
-+ } else {
-+ retval = NETDEV_TX_BUSY;
-+ }
-+
-+ /* we can only send one packet at a time through the FIFO */
-+ netif_stop_queue(dev);
-+
-+ spin_unlock_irqrestore(&priv->lock, flags);
-+
-+out:
-+ return retval;
-+}
-+
-+/*
-+ * Updates transmission error statistics.
-+ * Caller holds the device lock.
-+ */
-+static int bba_tx_err(u8 status, struct net_device *dev)
-+{
-+ struct bba_private *priv = (struct bba_private *)dev->priv;
-+ int last_tx_errors = priv->stats.tx_errors;
-+
-+ if (status & BBA_TX_STATUS_TERR) {
-+ if (status & BBA_TX_STATUS_CCMASK) {
-+ priv->stats.collisions +=
-+ (status & BBA_TX_STATUS_CCMASK);
-+ priv->stats.tx_errors++;
-+ }
-+ if (status & BBA_TX_STATUS_CRSLOST) {
-+ priv->stats.tx_carrier_errors++;
-+ priv->stats.tx_errors++;
-+ }
-+ if (status & BBA_TX_STATUS_UF) {
-+ priv->stats.tx_fifo_errors++;
-+ priv->stats.tx_errors++;
-+ }
-+ if (status & BBA_TX_STATUS_OWC) {
-+ priv->stats.tx_window_errors++;
-+ priv->stats.tx_errors++;
-+ }
-+ }
-+
-+ if (last_tx_errors != priv->stats.tx_errors) {
-+ if (netif_msg_tx_err(priv)) {
-+ bba_printk(KERN_DEBUG, "tx errors, status %8.8x.\n",
-+ status);
-+ }
-+ }
-+ return priv->stats.tx_errors;
-+}
-+
-+/*
-+ * Transmits a packet already stored in the driver's internal tx slot.
-+ */
-+static int bba_tx(struct net_device *dev)
-+{
-+ struct bba_private *priv = (struct bba_private *)dev->priv;
-+ struct sk_buff *skb;
-+ unsigned long flags;
-+ int retval = NETDEV_TX_OK;
-+
-+ static u8 pad[ETH_ZLEN] __attribute__ ((aligned(EXI_DMA_ALIGN+1)));
-+ int pad_len;
-+
-+ exi_dev_take(priv->exi_device);
-+
-+ /* if the TXFIFO is in use, we'll try it later when free */
-+ if (bba_in8(BBA_NCRA) & (BBA_NCRA_ST0 | BBA_NCRA_ST1)) {
-+ retval = NETDEV_TX_BUSY;
-+ goto out;
-+ }
-+
-+ spin_lock_irqsave(&priv->lock, flags);
-+ skb = priv->tx_skb;
-+ priv->tx_skb = NULL;
-+ spin_unlock_irqrestore(&priv->lock, flags);
-+
-+ /* tell the card about the length of this packet */
-+ bba_out12(BBA_TXFIFOCNT, skb->len);
-+
-+ /*
-+ * Store the packet in the TXFIFO, including padding if needed.
-+ * Packet transmission tries to make use of DMA transfers.
-+ */
-+
-+ bba_select();
-+ bba_outs_nosel(BBA_WRTXFIFOD, skb->data, skb->len);
-+ if (skb->len < ETH_ZLEN) {
-+ pad_len = ETH_ZLEN - skb->len;
-+ memset(pad, 0, pad_len);
-+ bba_outs_nosel_continued(pad, pad_len);
-+ }
-+ bba_deselect();
-+
-+ /* tell the card to send the packet right now */
-+ bba_out8(BBA_NCRA, (bba_in8(BBA_NCRA) | BBA_NCRA_ST1) & ~BBA_NCRA_ST0);
-+
-+ /* update statistics */
-+ priv->stats.tx_bytes += skb->len;
-+ priv->stats.tx_packets++;
-+
-+ /* free this packet and remove it from our transmission "queue" */
-+ dev_kfree_skb(skb);
-+
-+out:
-+ exi_dev_give(priv->exi_device);
-+
-+ return retval;
-+}
-+
-+/*
-+ * Updates reception error statistics.
-+ * Caller has already taken the exi channel.
-+ */
-+static int bba_rx_err(u8 status, struct net_device *dev)
-+{
-+ struct bba_private *priv = (struct bba_private *)dev->priv;
-+ int last_rx_errors = priv->stats.rx_errors;
-+
-+ if (status == 0xff) {
-+ priv->stats.rx_over_errors++;
-+ priv->stats.rx_errors++;
-+ } else {
-+ if (status & BBA_RX_STATUS_RERR) {
-+ if (status & BBA_RX_STATUS_CRC) {
-+ priv->stats.rx_crc_errors++;
-+ priv->stats.rx_errors++;
-+ }
-+ if (status & BBA_RX_STATUS_FO) {
-+ priv->stats.rx_fifo_errors++;
-+ priv->stats.rx_errors++;
-+ }
-+ if (status & BBA_RX_STATUS_RW) {
-+ priv->stats.rx_length_errors++;
-+ priv->stats.rx_errors++;
-+ }
-+ if (status & BBA_RX_STATUS_BF) {
-+ priv->stats.rx_over_errors++;
-+ priv->stats.rx_errors++;
-+ }
-+ if (status & BBA_RX_STATUS_RF) {
-+ priv->stats.rx_length_errors++;
-+ priv->stats.rx_errors++;
-+ }
-+ }
-+ if (status & BBA_RX_STATUS_FAE) {
-+ priv->stats.rx_frame_errors++;
-+ priv->stats.rx_errors++;
-+ }
-+ }
-+
-+ if (last_rx_errors != priv->stats.rx_errors) {
-+ if (netif_msg_rx_err(priv)) {
-+ bba_printk(KERN_DEBUG, "rx errors, status %8.8x.\n",
-+ status);
-+ }
-+ }
-+ return priv->stats.rx_errors;
-+}
-+
-+/*
-+ * Reception function. Receives up to @budget packets.
-+ */
-+static int bba_rx(struct net_device *dev, int budget)
-+{
-+ struct bba_private *priv = (struct bba_private *)dev->priv;
-+ struct sk_buff *skb;
-+ struct bba_descr descr;
-+ int lrps, size;
-+ unsigned long pos, top;
-+ unsigned short rrp, rwp;
-+ int received = 0;
-+
-+ exi_dev_take(priv->exi_device);
-+
-+ /* get current receiver pointers */
-+ rwp = bba_in12(BBA_RWP);
-+ rrp = bba_in12(BBA_RRP);
-+
-+ while (netif_running(dev) && received < budget && rrp != rwp) {
-+ bba_ins(rrp << 8, &descr, sizeof(descr));
-+ le32_to_cpus((u32 *) &descr);
-+
-+ size = descr.packet_len - 4; /* ignore CRC */
-+ lrps = descr.status;
-+
-+ /* abort processing in case of errors */
-+ if (size > BBA_RX_MAX_PACKET_SIZE + 4) {
-+ DBG("packet too big %d", size);
-+ continue;
-+ }
-+
-+ if ((lrps & (BBA_RX_STATUS_RERR | BBA_RX_STATUS_FAE))) {
-+ DBG("error %x on received packet\n", lrps);
-+ bba_rx_err(lrps, dev);
-+ rwp = bba_in12(BBA_RWP);
-+ rrp = bba_in12(BBA_RRP);
-+ continue;
-+ }
-+
-+ /* allocate a buffer, omitting the CRC (4 bytes) */
-+ skb = dev_alloc_skb(size + NET_IP_ALIGN);
-+ if (!skb) {
-+ priv->stats.rx_dropped++;
-+ continue;
-+ }
-+ skb->dev = dev;
-+ skb_reserve(skb, NET_IP_ALIGN); /* align */
-+ skb_put(skb, size);
-+
-+ pos = (rrp << 8) + 4; /* skip descriptor */
-+ top = (BBA_INIT_RHBP + 1) << 8;
-+
-+ if ((pos + size) < top) {
-+ /* full packet in one chunk */
-+ bba_ins(pos, skb->data, size);
-+ } else {
-+ /* packet wrapped */
-+ int chunk_size = top - pos;
-+
-+ bba_ins(pos, skb->data, chunk_size);
-+ rrp = BBA_INIT_RRP;
-+ bba_ins(rrp << 8, skb->data + chunk_size,
-+ size - chunk_size);
-+ }
-+
-+ skb->protocol = eth_type_trans(skb, dev);
-+
-+ dev->last_rx = jiffies;
-+ priv->stats.rx_bytes += size;
-+ priv->stats.rx_packets++;
-+
-+ netif_rx(skb);
-+ received++;
-+
-+ /* move read pointer to next packet */
-+ bba_out12(BBA_RRP, rrp = descr.next_packet_ptr);
-+
-+ /* get write pointer and continue */
-+ rwp = bba_in12(BBA_RWP);
-+ }
-+
-+ /* there are no more packets pending if we didn't exhaust our budget */
-+ if (received < budget)
-+ priv->rx_work = 0;
-+
-+ /* re-enable RBFI if it was disabled before */
-+ if (test_and_clear_bit(__BBA_RBFIM_OFF, &priv->flags))
-+ bba_out8(BBA_IMR, bba_in8(BBA_IMR) | BBA_IMR_RBFIM);
-+
-+ exi_dev_give(priv->exi_device);
-+
-+ return received;
-+}
-+
-+/*
-+ * Input/Output thread. Sends and receives packets.
-+ */
-+static int bba_io_thread(void *bba_priv)
-+{
-+ struct bba_private *priv = bba_priv;
-+/* struct task_struct *me = current; */
-+/* struct sched_param param = { .sched_priority = MAX_RT_PRIO-1 }; */
-+
-+/* sched_setscheduler(me, SCHED_FIFO, &param); */
-+
-+ set_user_nice(current, -20);
-+ current->flags |= PF_NOFREEZE;
-+ set_current_state(TASK_RUNNING);
-+
-+ /*
-+ * XXX We currently do not freeze this thread.
-+ * The bba is often used to access the root filesystem.
-+ */
-+
-+ while (!kthread_should_stop()) {
-+ /*
-+ * We want to get scheduled at least once every 2 minutes
-+ * to avoid a softlockup spurious message...
-+ * "INFO: task kbbaiod blocked for more than 120 seconds."
-+ */
-+ wait_event_timeout(priv->io_waitq,
-+ priv->rx_work || priv->tx_skb, 90*HZ);
-+ while (priv->rx_work || priv->tx_skb) {
-+ if (priv->rx_work)
-+ bba_rx(priv->dev, 0x0f);
-+ if (priv->tx_skb)
-+ bba_tx(priv->dev);
-+ }
-+ }
-+ return 0;
-+}
-+
-+/*
-+ * Handles interrupt work from the network device.
-+ * Caller has already taken the exi channel.
-+ */
-+static void bba_interrupt(struct net_device *dev)
-+{
-+ struct bba_private *priv = (struct bba_private *)dev->priv;
-+ u8 ir, imr, status, lrps, ltps;
-+ int loops = 0;
-+
-+ ir = bba_in8(BBA_IR);
-+ imr = bba_in8(BBA_IMR);
-+ status = ir & imr;
-+
-+ /* close possible races with dev_close */
-+ if (unlikely(!netif_running(dev))) {
-+ bba_out8(BBA_IR, status);
-+ bba_out8(BBA_IMR, 0x00);
-+ goto out;
-+ }
-+
-+ while (status) {
-+ bba_out8(BBA_IR, status);
-+
-+ /* avoid multiple receive buffer full interrupts */
-+ if (status & BBA_IR_RBFI) {
-+ bba_out8(BBA_IMR, bba_in8(BBA_IMR) & ~BBA_IMR_RBFIM);
-+ set_bit(__BBA_RBFIM_OFF, &priv->flags);
-+ }
-+
-+ if ((status & (BBA_IR_RI | BBA_IR_RBFI))) {
-+ priv->rx_work = 1;
-+ wake_up(&priv->io_waitq);
-+ }
-+ if ((status & (BBA_IR_TI|BBA_IR_FIFOEI))) {
-+ /* allow more packets to be sent */
-+ netif_wake_queue(dev);
-+ }
-+
-+ if ((status & (BBA_IR_RBFI|BBA_IR_REI))) {
-+ lrps = bba_in8(BBA_LRPS);
-+ bba_rx_err(lrps, dev);
-+ }
-+ if (status & BBA_IR_TEI) {
-+ ltps = bba_in8(BBA_LTPS);
-+ bba_tx_err(ltps, dev);
-+ }
-+
-+ if (status & BBA_IR_FIFOEI)
-+ DBG("FIFOEI\n");
-+ if (status & BBA_IR_BUSEI)
-+ DBG("BUSEI\n");
-+ if (status & BBA_IR_FRAGI)
-+ DBG("FRAGI\n");
-+
-+ ir = bba_in8(BBA_IR);
-+ imr = bba_in8(BBA_IMR);
-+ status = ir & imr;
-+
-+ loops++;
-+ }
-+
-+ if (loops > 3)
-+ DBG("a lot of interrupt work (%d loops)\n", loops);
-+
-+ /* wake up xmit queue in case transmitter is idle */
-+ if ((bba_in8(BBA_NCRA) & (BBA_NCRA_ST0 | BBA_NCRA_ST1)) == 0)
-+ netif_wake_queue(dev);
-+
-+out:
-+ return;
-+}
-+
-+/*
-+ * Retrieves the MAC address of the adapter.
-+ * Caller has already taken the exi channel.
-+ */
-+static void bba_retrieve_ether_addr(struct net_device *dev)
-+{
-+ bba_ins(BBA_NAFR_PAR0, dev->dev_addr, ETH_ALEN);
-+ if (!is_valid_ether_addr(dev->dev_addr))
-+ random_ether_addr(dev->dev_addr);
-+}
-+
-+/*
-+ * Resets the hardware to a known state.
-+ * Caller has already taken the exi channel.
-+ */
-+static void bba_reset_hardware(struct net_device *dev)
-+{
-+ struct bba_private *priv = (struct bba_private *)dev->priv;
-+
-+ /* unknown, mx register 0x60 */
-+ bba_out8(0x60, 0);
-+ udelay(1000);
-+
-+ /* unknown, command register 0x0f */
-+ bba_cmd_in8_slow(0x0f);
-+ udelay(1000);
-+
-+ /* software reset (write 1 then write 0) */
-+ bba_out8(BBA_NCRA, BBA_NCRA_RESET);
-+ udelay(100);
-+ bba_out8(BBA_NCRA, 0);
-+
-+ /* unknown, command register 0x01 */
-+ /* XXX obtain bits needed for challenge/response calculation later */
-+ priv->revid = bba_cmd_in8(0x01);
-+
-+ /* unknown, command registers 0x04, 0x05 */
-+ bba_cmd_outs(0x04, priv->__0x04_init, 2);
-+ bba_cmd_out8(0x05, priv->__0x05_init);
-+
-+ /*
-+ * These initializations seem to limit the final port speed to 10Mbps
-+ * half duplex. Bypassing them, allows one to set other port speeds.
-+ * But, remember that the bba spi-like bus clock operates at 32MHz.
-+ * ---Albert Herranz
-+ */
-+
-+ /* unknown, mx registers 0x5b, 0x5c, 0x5e */
-+ bba_out8(0x5b, bba_in8(0x5b) & ~(1 << 7));
-+ bba_out8(0x5e, 1); /* without this the BBA goes at half the speed */
-+ bba_out8(0x5c, bba_in8(0x5c) | 4);
-+ udelay(1000);
-+
-+ /* accept broadcast, assert int for every packet received */
-+ bba_out8(BBA_NCRB, BBA_NCRB_AB | BBA_NCRB_1_PACKET_PER_INT);
-+
-+ /* setup receive interrupt time out, in 40ns units */
-+ bba_out8(BBA_RXINTT, 0x00);
-+ bba_out8(BBA_RXINTT+1, 0x06); /* 0x0600 = 61us */
-+
-+ /* auto RX full recovery */
-+ bba_out8(BBA_MISC2, BBA_MISC2_AUTORCVR);
-+
-+ /* initialize packet memory layout */
-+ bba_out12(BBA_TLBP, BBA_INIT_TLBP);
-+ bba_out12(BBA_BP, BBA_INIT_BP);
-+ bba_out12(BBA_RHBP, BBA_INIT_RHBP);
-+
-+ /* set receive page pointers */
-+ bba_out12(BBA_RWP, BBA_INIT_RWP);
-+ bba_out12(BBA_RRP, BBA_INIT_RRP);
-+
-+ /* packet memory won't contain packets with RW, FO, CRC errors */
-+ bba_out8(BBA_GCA, BBA_GCA_ARXERRB);
-+}
-+
-+/*
-+ * Prepares the hardware for operation.
-+ * Caller has already taken the exi channel.
-+ */
-+static int bba_setup_hardware(struct net_device *dev)
-+{
-+ /* reset hardware to a sane state */
-+ bba_reset_hardware(dev);
-+
-+ /* start receiver */
-+ bba_out8(BBA_NCRA, BBA_NCRA_SR);
-+
-+ /* clear all interrupts */
-+ bba_out8(BBA_IR, 0xFF);
-+
-+ /* enable all interrupts */
-+ bba_out8(BBA_IMR, 0xFF & ~(BBA_IMR_FIFOEIM /*| BBA_IMR_REIM*/));
-+
-+ /* unknown, short command registers 0x02 */
-+ /* XXX enable interrupts on the EXI glue logic */
-+ bba_cmd_out8(0x02, BBA_CMD_IR_MASKNONE);
-+
-+ /* DO NOT clear interrupts on the EXI glue logic !!! */
-+ /* we need that initial interrupts for the challenge/response */
-+
-+ return 0; /* OK */
-+}
-+
-+/*
-+ * Calculates a response for a given challenge.
-+ */
-+static unsigned long bba_calc_response(unsigned long val,
-+ struct bba_private *priv)
-+{
-+ u8 revid_0, revid_eth_0, revid_eth_1;
-+ revid_0 = priv->revid;
-+ revid_eth_0 = priv->__0x04_init[0];
-+ revid_eth_1 = priv->__0x04_init[1];
-+
-+ u8 i0, i1, i2, i3;
-+ i0 = val >> 24;
-+ i1 = val >> 16;
-+ i2 = val >> 8;
-+ i3 = val;
-+
-+ u8 c0, c1, c2, c3;
-+ c0 = (i0 + i1 * 0xc1 + 0x18 + revid_0) ^ (i3 * i2 + 0x90);
-+ c1 = (i1 + i2 + 0x90) ^ (c0 + i0 - 0xc1);
-+ c2 = (i2 + 0xc8) ^ (c0 + ((revid_eth_0 + revid_0 * 0x23) ^ 0x19));
-+ c3 = (i0 + 0xc1) ^ (i3 + ((revid_eth_1 + 0xc8) ^ 0x90));
-+
-+ return (c0 << 24) | (c1 << 16) | (c2 << 8) | c3;
-+}
-+
-+/*
-+ * Handles IRQ events from the exi layer.
-+ *
-+ * We are called from softirq context, and with the exi channel kindly taken
-+ * for us. We can also safely do exi transfers of less than 32 bytes, which
-+ * are guaranteed to not sleep by the exi layer.
-+ */
-+static int bba_event_handler(struct exi_channel *exi_channel,
-+ unsigned int event, void *dev0)
-+{
-+ struct net_device *dev = (struct net_device *)dev0;
-+ struct bba_private *priv = (struct bba_private *)dev->priv;
-+ register u8 status, mask;
-+
-+ /* XXX mask all EXI glue interrupts */
-+ bba_cmd_out8(0x02, BBA_CMD_IR_MASKALL);
-+
-+ /* get interrupt status from EXI glue */
-+ status = bba_cmd_in8(0x03);
-+
-+ /* start with the usual case */
-+ mask = (1<<7);
-+
-+ /* normal interrupt from the macronix chip */
-+ if (status & mask) {
-+ /* call our interrupt handler */
-+ bba_interrupt(dev);
-+ goto out;
-+ }
-+
-+ /* "killing" interrupt, try to not get one of these! */
-+ mask >>= 1;
-+ if (status & mask) {
-+ DBG("bba: killing interrupt!\n");
-+ /* reset the adapter so that we can continue working */
-+ bba_setup_hardware(dev);
-+ goto out;
-+ }
-+
-+ /* command error interrupt, haven't seen one yet */
-+ mask >>= 1;
-+ if (status & mask)
-+ goto out;
-+
-+ /* challenge/response interrupt */
-+ mask >>= 1;
-+ if (status & mask) {
-+ unsigned long response;
-+ unsigned long challenge;
-+
-+ /* kids, don't do it without an adult present */
-+ bba_cmd_out8(0x05, priv->__0x05_init);
-+ bba_cmd_ins(0x08, &challenge, sizeof(challenge));
-+ response = bba_calc_response(challenge, priv);
-+ bba_cmd_outs(0x09, &response, sizeof(response));
-+
-+ goto out;
-+ }
-+
-+ /* challenge/response status interrupt */
-+ mask >>= 1;
-+ if (status & mask) {
-+ /* better get a "1" here ... */
-+ u8 result = bba_cmd_in8(0x0b);
-+ if (result != 1) {
-+ bba_printk(KERN_DEBUG,
-+ "challenge failed! (result=%d)\n", result);
-+ }
-+ goto out;
-+ }
-+
-+ /* should not happen, treat as normal interrupt in any case */
-+ DBG("bba: unknown interrupt type = %d\n", status);
-+
-+out:
-+ /* assert interrupt */
-+ bba_cmd_out8(0x03, mask);
-+
-+ /* enable interrupts again */
-+ bba_cmd_out8(0x02, BBA_CMD_IR_MASKNONE);
-+
-+ return 1;
-+}
-+
-+static struct net_device *bba_dev;
-+
-+static inline void bba_select(void)
-+{
-+ struct bba_private *priv = (struct bba_private *)bba_dev->priv;
-+ exi_dev_select(priv->exi_device);
-+
-+}
-+
-+static inline void bba_deselect(void)
-+{
-+ struct bba_private *priv = (struct bba_private *)bba_dev->priv;
-+ exi_dev_deselect(priv->exi_device);
-+}
-+
-+static inline void bba_read(void *data, size_t len)
-+{
-+ struct bba_private *priv = (struct bba_private *)bba_dev->priv;
-+ return exi_dev_read(priv->exi_device, data, len);
-+}
-+
-+static inline void bba_write(void *data, size_t len)
-+{
-+ struct bba_private *priv = (struct bba_private *)bba_dev->priv;
-+ return exi_dev_write(priv->exi_device, data, len);
-+}
-+
-+/*
-+ * Initializes a BroadBand Adapter device.
-+ */
-+static int __devinit bba_init_device(struct exi_device *exi_device)
-+{
-+ struct net_device *dev;
-+ struct bba_private *priv;
-+ int err;
-+
-+ /* allocate a network device */
-+ dev = alloc_etherdev(sizeof(*priv));
-+ if (!dev) {
-+ bba_printk(KERN_ERR, "unable to allocate net device\n");
-+ err = -ENOMEM;
-+ goto err_out;
-+ }
-+ SET_NETDEV_DEV(dev, &exi_device->dev);
-+
-+ /* we use the event system from the EXI driver, so no irq here */
-+ dev->irq = 0;
-+
-+ /* network device hooks */
-+ dev->open = bba_open;
-+ dev->stop = bba_close;
-+ dev->hard_start_xmit = bba_start_xmit;
-+ dev->get_stats = bba_get_stats;
-+
-+ priv = netdev_priv(dev);
-+ priv->dev = dev;
-+ priv->exi_device = exi_device;
-+
-+ spin_lock_init(&priv->lock);
-+
-+ /* initialization values */
-+ priv->revid = 0xf0;
-+ priv->__0x04_init[0] = 0xd1;
-+ priv->__0x04_init[1] = 0x07;
-+ priv->__0x05_init = 0x4e;
-+
-+ /* i/o artifacts */
-+ priv->tx_skb = NULL;
-+ priv->rx_work = 0;
-+ init_waitqueue_head(&priv->io_waitq);
-+ priv->io_thread = kthread_run(bba_io_thread, priv, "kbbaiod");
-+
-+ /* the hardware can't do multicast */
-+ dev->flags &= ~IFF_MULTICAST;
-+
-+ exi_set_drvdata(exi_device, dev);
-+ if (bba_dev)
-+ free_netdev(bba_dev);
-+ bba_dev = dev;
-+
-+ /* we need to retrieve the MAC address before registration */
-+ exi_dev_take(priv->exi_device);
-+ bba_reset_hardware(dev);
-+ bba_retrieve_ether_addr(dev);
-+ exi_dev_give(priv->exi_device);
-+
-+ /* this makes our device available to the kernel */
-+ err = register_netdev(dev);
-+ if (err) {
-+ bba_printk(KERN_ERR, "cannot register net device, aborting.\n");
-+ goto err_out_free_dev;
-+ }
-+
-+ return 0;
-+
-+err_out_free_dev:
-+ exi_set_drvdata(exi_device, NULL);
-+ free_netdev(dev);
-+ bba_dev = NULL;
-+
-+err_out:
-+ return err;
-+}
-+
-+/*
-+ * Removes a BroadBand Adapter device from the system.
-+ */
-+static void __devexit bba_remove(struct exi_device *exi_device)
-+{
-+ struct net_device *dev = (struct net_device *)
-+ exi_get_drvdata(exi_device);
-+ struct bba_private *priv;
-+
-+ if (dev) {
-+ priv = (struct bba_private *)dev->priv;
-+
-+ kthread_stop(priv->io_thread);
-+
-+ unregister_netdev(dev);
-+ free_netdev(dev);
-+ exi_set_drvdata(exi_device, NULL);
-+ bba_dev = NULL;
-+ }
-+ exi_device_put(exi_device);
-+}
-+
-+/*
-+ * Probes for a BroadBand Adapter device.
-+ * Actually, the exi layer has already probed for us.
-+ */
-+static int __devinit bba_probe(struct exi_device *exi_device)
-+{
-+ int ret = -ENODEV;
-+
-+ if (exi_device_get(exi_device))
-+ ret = bba_init_device(exi_device);
-+
-+ return ret;
-+}
-+
-+
-+static struct exi_device_id bba_eid_table[] = {
-+ [0] = {
-+ .channel = BBA_EXI_CHANNEL,
-+ .device = BBA_EXI_DEVICE,
-+ .id = BBA_EXI_ID
-+ },
-+ { .id = 0 }
-+};
-+
-+static struct exi_driver bba_driver = {
-+ .name = "bba",
-+ .eid_table = bba_eid_table,
-+ .frequency = BBA_EXI_FREQ,
-+ .probe = bba_probe,
-+ .remove = bba_remove,
-+};
-+
-+/**
-+ * bba_init_module - driver initialization routine
-+ *
-+ * Initializes the BroadBand Adapter driver module.
-+ *
-+ */
-+static int __init bba_init_module(void)
-+{
-+ bba_printk(KERN_INFO, "%s - version %s\n", DRV_DESCRIPTION,
-+ bba_driver_version);
-+
-+ return exi_driver_register(&bba_driver);
-+}
-+
-+/**
-+ * bba_exit_module - driver exit routine
-+ *
-+ * Removes the BroadBand Adapter driver module.
-+ *
-+ */
-+static void __exit bba_exit_module(void)
-+{
-+ exi_driver_unregister(&bba_driver);
-+}
-+
-+module_init(bba_init_module);
-+module_exit(bba_exit_module);
-+
-+MODULE_AUTHOR(DRV_AUTHOR);
-+MODULE_DESCRIPTION(DRV_DESCRIPTION);
-+MODULE_LICENSE("GPL");
-+
-diff --git a/drivers/net/usb/usbnet.c b/drivers/net/usb/usbnet.c
-index 02d25c7..1fcf0d3 100644
---- a/drivers/net/usb/usbnet.c
-+++ b/drivers/net/usb/usbnet.c
-@@ -522,7 +522,9 @@ static int unlink_urbs (struct usbnet *dev, struct sk_buff_head *q)
-
- // during some PM-driven resume scenarios,
- // these (async) unlinks complete immediately
-+ spin_unlock(&q->lock);
- retval = usb_unlink_urb (urb);
-+ spin_lock(&q->lock);
- if (retval != -EINPROGRESS && retval != 0)
- devdbg (dev, "unlink urb err, %d", retval);
- else
-diff --git a/drivers/rtc/Kconfig b/drivers/rtc/Kconfig
-index 123092d..fd42af5 100644
---- a/drivers/rtc/Kconfig
-+++ b/drivers/rtc/Kconfig
-@@ -497,6 +497,16 @@ config RTC_DRV_WM8350
- This driver can also be built as a module. If so, the module
- will be called "rtc-wm8350".
-
-+config RTC_DRV_GCN
-+ bool "Nintendo GameCube/Wii Real Time Clock and SRAM"
-+ depends on GAMECUBE_EXI
-+ default y
-+ help
-+ If you say yes to this option, support will be included for the
-+ Real Time Clock and SRAM of the Nintendo GameCube/Wii.
-+
-+ If in doubt, say Y here.
-+
- comment "on-CPU RTC drivers"
-
- config RTC_DRV_OMAP
-diff --git a/drivers/rtc/Makefile b/drivers/rtc/Makefile
-index 6e79c91..10a907f 100644
---- a/drivers/rtc/Makefile
-+++ b/drivers/rtc/Makefile
-@@ -36,6 +36,7 @@ obj-$(CONFIG_RTC_DRV_DS1742) += rtc-ds1742.o
- obj-$(CONFIG_RTC_DRV_DS3234) += rtc-ds3234.o
- obj-$(CONFIG_RTC_DRV_EP93XX) += rtc-ep93xx.o
- obj-$(CONFIG_RTC_DRV_FM3130) += rtc-fm3130.o
-+obj-$(CONFIG_RTC_DRV_GCN) += rtc-gcn.o
- obj-$(CONFIG_RTC_DRV_ISL1208) += rtc-isl1208.o
- obj-$(CONFIG_RTC_DRV_M41T80) += rtc-m41t80.o
- obj-$(CONFIG_RTC_DRV_M41T94) += rtc-m41t94.o
-diff --git a/drivers/rtc/rtc-gcn.c b/drivers/rtc/rtc-gcn.c
-new file mode 100644
-index 0000000..d5bae5c
---- /dev/null
-+++ b/drivers/rtc/rtc-gcn.c
-@@ -0,0 +1,339 @@
-+/*
-+ * drivers/rtc/rtc-gcn.c
-+ *
-+ * Nintendo GameCube/Wii RTC/SRAM driver
-+ * Copyright (C) 2004-2009 The GameCube Linux Team
-+ * Copyright (C) 2005,2008,2009 Albert Herranz
-+ *
-+ * Based on gamecube_time.c from Torben Nielsen.
-+ *
-+ * This program is free software; you can redistribute it and/or
-+ * modify it under the terms of the 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/time.h>
-+#include <linux/rtc.h>
-+#include <linux/exi.h>
-+#include <asm/machdep.h>
-+
-+#define DRV_MODULE_NAME "rtc-gcn"
-+#define DRV_DESCRIPTION "Nintendo GameCube/Wii RTC/SRAM driver"
-+#define DRV_AUTHOR "Torben Nielsen, " \
-+ "Albert Herranz"
-+
-+static char gcnrtc_driver_version[] = "1.0i";
-+
-+#define drv_printk(level, format, arg...) \
-+ printk(level DRV_MODULE_NAME ": " format , ## arg)
-+
-+
-+#define RTC_EXI_GCN_ID 0xffff1698
-+#define RTC_EXI_RVL_ID 0xfffff308
-+
-+#define RTC_EXI_CHANNEL 0
-+#define RTC_EXI_DEVICE 1
-+#define RTC_EXI_FREQ 3 /* 8MHz */
-+
-+#define RTC_OFFSET 946684800L
-+
-+
-+struct gcn_sram {
-+ u16 csum1;
-+ u16 csum2;
-+ u32 ead0;
-+ u32 ead1;
-+ int bias;
-+ s8 horz_display_offset;
-+ u8 ntd;
-+ u8 language;
-+ u8 flags;
-+ u8 reserved[44];
-+};
-+
-+struct gcnrtc_drvdata {
-+ spinlock_t lock;
-+ struct exi_device *dev;
-+
-+ struct rtc_device *rtc_dev;
-+
-+ struct gcn_sram sram;
-+};
-+
-+static struct gcnrtc_drvdata gcnrtc_drvdata;
-+
-+/*
-+ * Hardware interfaces.
-+ *
-+ */
-+
-+/*
-+ * Loads the SRAM contents.
-+ * Context: user.
-+ */
-+static void sram_load(struct exi_device *dev)
-+{
-+ struct gcnrtc_drvdata *drvdata = exi_get_drvdata(dev);
-+ struct gcn_sram *sram = &drvdata->sram;
-+ u32 req;
-+
-+ exi_dev_take(dev);
-+
-+ /* select the SRAM device */
-+ exi_dev_select(dev);
-+
-+ /* send the appropriate command */
-+ req = 0x20000100;
-+ exi_dev_write(dev, &req, sizeof(req));
-+
-+ /* read the SRAM data */
-+ exi_dev_read(dev, sram, sizeof(*sram));
-+
-+ /* deselect the SRAM device */
-+ exi_dev_deselect(dev);
-+
-+ exi_dev_give(dev);
-+
-+ return;
-+}
-+
-+/*
-+ * Gets the hardware clock date and time.
-+ * Context: user.
-+ */
-+static unsigned long gcnrtc_read_time(struct exi_device *dev)
-+{
-+ unsigned long a = 0;
-+
-+ exi_dev_take(dev);
-+
-+ /* select the SRAM device */
-+ exi_dev_select(dev);
-+
-+ /* send the appropriate command */
-+ a = 0x20000000;
-+ exi_dev_write(dev, &a, sizeof(a));
-+
-+ /* read the time and date value */
-+ exi_dev_read(dev, &a, sizeof(a));
-+
-+ /* deselect the RTC device */
-+ exi_dev_deselect(dev);
-+
-+ exi_dev_give(dev);
-+
-+ return a;
-+}
-+
-+/*
-+ * Sets the hardware clock date and time to @aval.
-+ * Context: user, interrupt (adjtimex).
-+ */
-+static int gcnrtc_write_time(struct exi_device *dev, unsigned long aval)
-+{
-+ u32 req;
-+ int retval;
-+
-+ /*
-+ * We may get called from the timer interrupt. In that case,
-+ * we could fail if the exi channel used to access the RTC
-+ * is busy. If this happens, we just return an error. The timer
-+ * interrupt code is prepared to deal with such case.
-+ */
-+
-+ retval = exi_dev_try_take(dev);
-+ if (!retval) {
-+ /* select the RTC device */
-+ exi_dev_select(dev);
-+
-+ /* send the appropriate command */
-+ req = 0xa0000000;
-+ exi_dev_write(dev, &req, sizeof(req));
-+
-+ /* set the new time and date value */
-+ exi_dev_write(dev, &aval, sizeof(aval));
-+
-+ /* deselect the RTC device */
-+ exi_dev_deselect(dev);
-+
-+ exi_dev_give(dev);
-+ }
-+ return retval;
-+}
-+
-+/*
-+ * Platform time functions.
-+ *
-+ */
-+
-+/*
-+ * Platform specific function to return the current date and time.
-+ */
-+static void gcnrtc_plat_rtc_get_time(struct rtc_time *t)
-+{
-+ struct gcnrtc_drvdata *drvdata = &gcnrtc_drvdata;
-+ unsigned long nowtime;
-+
-+ if (!drvdata->dev)
-+ return;
-+
-+ nowtime = gcnrtc_read_time(drvdata->dev) +
-+ drvdata->sram.bias + RTC_OFFSET;
-+ rtc_time_to_tm(nowtime, t);
-+}
-+
-+/*
-+ * Platform specific function to set the current date and time.
-+ *
-+ */
-+static int gcnrtc_plat_rtc_set_time(struct rtc_time *t)
-+{
-+ struct gcnrtc_drvdata *drvdata = &gcnrtc_drvdata;
-+ unsigned long nowtime;
-+
-+ if (!drvdata->dev)
-+ return -ENODEV;
-+
-+ rtc_tm_to_time(t, &nowtime);
-+ return gcnrtc_write_time(drvdata->dev,
-+ nowtime - RTC_OFFSET - drvdata->sram.bias);
-+}
-+
-+/*
-+ * RTC class driver.
-+ *
-+ */
-+
-+/*
-+ *
-+ */
-+static int gcnrtc_rtc_read_time(struct device *dev, struct rtc_time *t)
-+{
-+ gcnrtc_plat_rtc_get_time(t);
-+ return 0;
-+}
-+
-+/*
-+ *
-+ */
-+static int gcnrtc_rtc_set_time(struct device *dev, struct rtc_time *t)
-+{
-+ return gcnrtc_plat_rtc_set_time(t);
-+}
-+
-+static const struct rtc_class_ops gcnrtc_ops = {
-+ .read_time = gcnrtc_rtc_read_time,
-+ .set_time = gcnrtc_rtc_set_time,
-+};
-+
-+
-+/*
-+ * EXI driver.
-+ *
-+ */
-+
-+/*
-+ *
-+ */
-+static int gcnrtc_probe(struct exi_device *dev)
-+{
-+ struct gcnrtc_drvdata *drvdata = &gcnrtc_drvdata;
-+ unsigned long flags;
-+ int retval = -ENODEV;
-+
-+ if (exi_device_get(dev)) {
-+ spin_lock_init(&drvdata->lock);
-+
-+ exi_set_drvdata(dev, drvdata);
-+ drvdata->dev = dev;
-+
-+ memset(&drvdata->sram, 0, sizeof(struct gcn_sram));
-+ sram_load(dev);
-+
-+ spin_lock_irqsave(&drvdata->lock, flags);
-+ ppc_md.set_rtc_time = gcnrtc_plat_rtc_set_time;
-+ ppc_md.get_rtc_time = gcnrtc_plat_rtc_get_time;
-+ spin_unlock_irqrestore(&drvdata->lock, flags);
-+
-+ drvdata->rtc_dev = rtc_device_register(DRV_MODULE_NAME,
-+ &dev->dev,
-+ &gcnrtc_ops,
-+ THIS_MODULE);
-+ retval = 0;
-+ }
-+
-+ return retval;
-+}
-+
-+/*
-+ *
-+ */
-+static void gcnrtc_remove(struct exi_device *dev)
-+{
-+ struct gcnrtc_drvdata *drvdata = exi_get_drvdata(dev);
-+ unsigned long flags;
-+
-+ if (drvdata) {
-+ spin_lock_irqsave(&drvdata->lock, flags);
-+ ppc_md.set_rtc_time = NULL;
-+ ppc_md.get_rtc_time = NULL;
-+ spin_unlock_irqrestore(&drvdata->lock, flags);
-+
-+ if (!IS_ERR(drvdata->rtc_dev))
-+ rtc_device_unregister(drvdata->rtc_dev);
-+ }
-+ exi_device_put(dev);
-+}
-+
-+
-+static struct exi_device_id gcnrtc_eid_table[] = {
-+ {
-+ .channel = RTC_EXI_CHANNEL,
-+ .device = RTC_EXI_DEVICE,
-+ .id = RTC_EXI_GCN_ID
-+ },
-+ {
-+ .channel = RTC_EXI_CHANNEL,
-+ .device = RTC_EXI_DEVICE,
-+ .id = RTC_EXI_RVL_ID
-+ },
-+ { },
-+};
-+
-+static struct exi_driver gcnrtc_driver = {
-+ .name = DRV_MODULE_NAME,
-+ .eid_table = gcnrtc_eid_table,
-+ .frequency = RTC_EXI_FREQ,
-+ .probe = gcnrtc_probe,
-+ .remove = gcnrtc_remove,
-+};
-+
-+
-+/*
-+ *
-+ */
-+static int __init gcnrtc_init_module(void)
-+{
-+ drv_printk(KERN_INFO, "%s - version %s\n",
-+ DRV_DESCRIPTION, gcnrtc_driver_version);
-+
-+ return exi_driver_register(&gcnrtc_driver);
-+}
-+
-+/*
-+ *
-+ */
-+static void __exit gcnrtc_exit_module(void)
-+{
-+ exi_driver_unregister(&gcnrtc_driver);
-+}
-+
-+module_init(gcnrtc_init_module);
-+module_exit(gcnrtc_exit_module);
-+
-+MODULE_AUTHOR(DRV_AUTHOR);
-+MODULE_DESCRIPTION(DRV_DESCRIPTION);
-+MODULE_LICENSE("GPL");
-diff --git a/drivers/serial/Kconfig b/drivers/serial/Kconfig
-index 579d63a..fc383ae 100644
---- a/drivers/serial/Kconfig
-+++ b/drivers/serial/Kconfig
-@@ -1372,4 +1372,17 @@ config SPORT_BAUD_RATE
- default 19200 if (SERIAL_SPORT_BAUD_RATE_19200)
- default 9600 if (SERIAL_SPORT_BAUD_RATE_9600)
-
-+config SERIAL_USBGECKO
-+ bool "USBGecko adapter on the Nintendo GameCube/Wii"
-+ depends on GAMECUBE_EXI
-+ select SERIAL_CORE
-+ help
-+ This is a driver for the USB Gecko adapter for the Nintendo GameCube
-+ and Wii gaming consoles. It provides a console and a tty interface.
-+
-+ If you have an adapter like this, say Y here, otherwise say N.
-+
-+ To compile this driver as a module, choose M here: the
-+ module will be called usbgecko.
-+
- endmenu
-diff --git a/drivers/serial/Makefile b/drivers/serial/Makefile
-index 0c17c8d..a00d73e 100644
---- a/drivers/serial/Makefile
-+++ b/drivers/serial/Makefile
-@@ -73,3 +73,4 @@ obj-$(CONFIG_SERIAL_OF_PLATFORM) += of_serial.o
- obj-$(CONFIG_SERIAL_KS8695) += serial_ks8695.o
- obj-$(CONFIG_KGDB_SERIAL_CONSOLE) += kgdboc.o
- obj-$(CONFIG_SERIAL_QE) += ucc_uart.o
-+obj-$(CONFIG_SERIAL_USBGECKO) += usbgecko.o
-diff --git a/drivers/serial/usbgecko.c b/drivers/serial/usbgecko.c
-new file mode 100644
-index 0000000..223890d
---- /dev/null
-+++ b/drivers/serial/usbgecko.c
-@@ -0,0 +1,597 @@
-+/*
-+ * drivers/serial/usbgecko.c
-+ *
-+ * Console and TTY driver for the USB Gecko adapter.
-+ * Copyright (C) 2008-2009 The GameCube Linux Team
-+ * Copyright (C) 2008,2009 Albert Herranz
-+ *
-+ * This program is free software; you can redistribute it and/or
-+ * modify it under the terms of the GNU General Public License
-+ * as published by the Free Software Foundation; either version 2
-+ * of the License, or (at your option) any later version.
-+ *
-+ */
-+
-+#define UG_DEBUG
-+
-+#include <linux/kernel.h>
-+#include <linux/device.h>
-+#include <linux/module.h>
-+#include <linux/init.h>
-+#include <linux/console.h>
-+#include <linux/tty.h>
-+#include <linux/tty_driver.h>
-+#include <linux/tty_flip.h>
-+#include <linux/kthread.h>
-+#include <linux/delay.h>
-+
-+#include <linux/exi.h>
-+
-+#define DRV_MODULE_NAME "usbgecko"
-+#define DRV_DESCRIPTION "Console and TTY driver for the USB Gecko adapter"
-+#define DRV_AUTHOR "Albert Herranz"
-+
-+static char ug_driver_version[] = "0.1i";
-+
-+#define drv_printk(level, format, arg...) \
-+ printk(level DRV_MODULE_NAME ": " format , ## arg)
-+
-+/*
-+ *
-+ * EXI related definitions.
-+ */
-+#define UG_SLOTA_CHANNEL 0 /* EXI0xxx */
-+#define UG_SLOTA_DEVICE 0 /* chip select, EXI0CSB0 */
-+
-+#define UG_SLOTB_CHANNEL 1 /* EXI1xxx */
-+#define UG_SLOTB_DEVICE 0 /* chip select, EXI1CSB0 */
-+
-+#define UG_SPI_CLK_IDX EXI_CLK_32MHZ
-+
-+
-+struct ug_adapter {
-+ struct exi_device *exi_device;
-+ struct task_struct *poller;
-+ struct mutex mutex;
-+ int refcnt;
-+};
-+
-+static struct ug_adapter ug_adapters[2];
-+
-+
-+/*
-+ *
-+ * Hardware interface.
-+ */
-+
-+/*
-+ *
-+ */
-+static void ug_exi_io_transaction(struct exi_device *exi_device, u16 i, u16 *o)
-+{
-+ u16 data;
-+
-+ exi_dev_select(exi_device);
-+ data = i;
-+ exi_dev_readwrite(exi_device, &data, 2);
-+ exi_dev_deselect(exi_device);
-+ *o = data;
-+}
-+
-+#if 0
-+/*
-+ *
-+ */
-+static void ug_io_transaction(struct ug_adapter *adapter, u16 i, u16 *o)
-+{
-+ struct exi_device *exi_device = adapter->exi_device;
-+
-+ if (exi_device)
-+ ug_exi_io_transaction(exi_device, i, o);
-+}
-+#endif
-+
-+/*
-+ *
-+ */
-+static int ug_check_adapter(struct exi_device *exi_device)
-+{
-+ u16 data;
-+
-+ exi_dev_take(exi_device);
-+ ug_exi_io_transaction(exi_device, 0x9000, &data);
-+ exi_dev_give(exi_device);
-+
-+ return data == 0x0470;
-+}
-+
-+#if 0
-+/*
-+ *
-+ */
-+static int ug_is_txfifo_empty(struct ug_adapter *adapter)
-+{
-+ struct exi_device *exi_device = adapter->exi_device;
-+ u16 data;
-+
-+ if (!exi_device)
-+ return 0;
-+
-+ if (!exi_dev_try_take(exi_device)) {
-+ ug_exi_io_transaction(exi_device, 0xC000, &data);
-+ exi_dev_give(exi_device);
-+ return data & 0x0400;
-+ }
-+ return 0;
-+}
-+
-+/*
-+ *
-+ */
-+static int ug_is_rxfifo_empty(struct ug_adapter *adapter)
-+{
-+ struct exi_device *exi_device = adapter->exi_device;
-+ u16 data;
-+
-+ if (!exi_device)
-+ return 0;
-+
-+ if (!exi_dev_try_take(exi_device)) {
-+ ug_exi_io_transaction(exi_device, 0xD000, &data);
-+ exi_dev_give(exi_device);
-+ return data & 0x0400;
-+ }
-+ return 0;
-+}
-+
-+/*
-+ *
-+ */
-+static int ug_putc(struct ug_adapter *adapter, char c)
-+{
-+ struct exi_device *exi_device = adapter->exi_device;
-+ u16 data;
-+
-+ if (!exi_device)
-+ return 0;
-+
-+ if (!exi_dev_try_take(exi_device)) {
-+ ug_exi_io_transaction(exi_device, 0xB000|(c<<4), &data);
-+ exi_dev_give(exi_device);
-+ return data & 0x0400;
-+ }
-+ return 0;
-+}
-+
-+/*
-+ *
-+ */
-+static int ug_getc(struct ug_adapter *adapter, char *c)
-+{
-+ struct exi_device *exi_device = adapter->exi_device;
-+ u16 data;
-+
-+ if (!exi_device)
-+ return 0;
-+
-+ if (!exi_dev_try_take(exi_device)) {
-+ ug_exi_io_transaction(exi_device, 0xA000, &data);
-+ exi_dev_give(exi_device);
-+ if ((data & 0x0800)) {
-+ *c = data & 0xff;
-+ return 1;
-+ }
-+ }
-+ return 0;
-+}
-+#endif
-+
-+/*
-+ *
-+ */
-+static int ug_safe_putc(struct ug_adapter *adapter, char c)
-+{
-+ struct exi_device *exi_device = adapter->exi_device;
-+ u16 data;
-+
-+ if (!exi_device)
-+ return 0;
-+
-+ if (!exi_dev_try_take(exi_device)) {
-+ ug_exi_io_transaction(exi_device, 0xC000, &data);
-+ if ((data & 0x0400))
-+ ug_exi_io_transaction(exi_device, 0xB000|(c<<4), &data);
-+ exi_dev_give(exi_device);
-+ return data & 0x0400;
-+ }
-+ return 0;
-+}
-+
-+/*
-+ *
-+ */
-+static int ug_safe_getc(struct ug_adapter *adapter, char *c)
-+{
-+ struct exi_device *exi_device = adapter->exi_device;
-+ u16 data;
-+
-+ if (!exi_device)
-+ return 0;
-+
-+ if (!exi_dev_try_take(exi_device)) {
-+ ug_exi_io_transaction(exi_device, 0xD000, &data);
-+ if ((data & 0x0400)) {
-+ ug_exi_io_transaction(exi_device, 0xA000, &data);
-+ exi_dev_give(exi_device);
-+ if ((data & 0x0800)) {
-+ *c = data & 0xff;
-+ return 1;
-+ }
-+ } else {
-+ exi_dev_give(exi_device);
-+ }
-+ }
-+ return 0;
-+}
-+
-+
-+/*
-+ *
-+ * Linux console interface.
-+ */
-+
-+/*
-+ *
-+ */
-+static void ug_console_write(struct console *co, const char *buf,
-+ unsigned int count)
-+{
-+ struct ug_adapter *adapter = co->data;
-+ char *b = (char *)buf;
-+
-+ while (count--) {
-+ if (*b == '\n')
-+ ug_safe_putc(adapter, '\r');
-+ ug_safe_putc(adapter, *b++);
-+ }
-+}
-+
-+/*
-+ *
-+ */
-+static int ug_console_read(struct console *co, char *buf,
-+ unsigned int count)
-+{
-+ struct ug_adapter *adapter = co->data;
-+ int i;
-+ char c;
-+
-+ i = count;
-+ while (i--) {
-+ ug_safe_getc(adapter, &c);
-+ *buf++ = c;
-+ }
-+ return count;
-+}
-+
-+static struct tty_driver *ug_tty_driver;
-+
-+static struct tty_driver *ug_console_device(struct console *co, int *index)
-+{
-+ *index = co->index;
-+ return ug_tty_driver;
-+}
-+
-+
-+static struct console ug_consoles[] = {
-+ {
-+ .name = DRV_MODULE_NAME "0",
-+ .write = ug_console_write,
-+ .read = ug_console_read,
-+ .device = ug_console_device,
-+ .flags = CON_PRINTBUFFER | CON_ENABLED,
-+ .index = 0,
-+ .data = &ug_adapters[0],
-+ },
-+ {
-+ .name = DRV_MODULE_NAME "1",
-+ .write = ug_console_write,
-+ .read = ug_console_read,
-+ .device = ug_console_device,
-+ .flags = CON_PRINTBUFFER | CON_ENABLED,
-+ .index = 1,
-+ .data = &ug_adapters[1],
-+ },
-+};
-+
-+
-+/*
-+ *
-+ * Linux tty driver.
-+ */
-+
-+static int ug_tty_poller(void *tty_)
-+{
-+ struct sched_param param = { .sched_priority = 1 };
-+ struct tty_struct *tty = tty_;
-+ struct ug_adapter *adapter;
-+ int count, chunk;
-+ const int max_outstanding = 32;
-+ char ch;
-+
-+ sched_setscheduler(current, SCHED_FIFO, &param);
-+ set_task_state(current, TASK_RUNNING);
-+
-+ chunk = 0;
-+ while (!kthread_should_stop()) {
-+ count = 0;
-+ adapter = tty->driver_data;
-+ if (adapter)
-+ count = ug_safe_getc(adapter, &ch);
-+ set_task_state(current, TASK_INTERRUPTIBLE);
-+ if (count) {
-+ tty_insert_flip_char(tty, ch, TTY_NORMAL);
-+ if (chunk++ > max_outstanding) {
-+ tty_flip_buffer_push(tty);
-+ chunk = 0;
-+ }
-+ } else {
-+ if (chunk) {
-+ tty_flip_buffer_push(tty);
-+ chunk = 0;
-+ }
-+ schedule_timeout(1);
-+ }
-+ set_task_state(current, TASK_RUNNING);
-+ }
-+
-+ return 0;
-+}
-+
-+static int ug_tty_open(struct tty_struct *tty, struct file *filp)
-+{
-+ struct ug_adapter *adapter;
-+ int index;
-+ int retval = 0;
-+
-+ index = tty->index;
-+ adapter = &ug_adapters[index];
-+
-+ mutex_lock(&adapter->mutex);
-+
-+ if (!adapter->exi_device) {
-+ mutex_unlock(&adapter->mutex);
-+ return -ENODEV;
-+ }
-+
-+ if (!adapter->refcnt) {
-+ adapter->poller = kthread_run(ug_tty_poller, tty, "kugtty");
-+ if (IS_ERR(adapter->poller)) {
-+ drv_printk(KERN_ERR, "error creating poller thread\n");
-+ mutex_unlock(&adapter->mutex);
-+ return -ENOMEM;
-+ }
-+ }
-+
-+ adapter->refcnt++;
-+ tty->driver_data = adapter;
-+
-+ mutex_unlock(&adapter->mutex);
-+
-+ return retval;
-+}
-+
-+static void ug_tty_close(struct tty_struct *tty, struct file *filp)
-+{
-+ struct ug_adapter *adapter;
-+ int index;
-+
-+ index = tty->index;
-+ adapter = &ug_adapters[index];
-+
-+ mutex_lock(&adapter->mutex);
-+
-+ adapter->refcnt--;
-+ if (!adapter->refcnt) {
-+ if (!IS_ERR(adapter->poller))
-+ kthread_stop(adapter->poller);
-+ adapter->poller = ERR_PTR(-EINVAL);
-+ tty->driver_data = NULL;
-+ }
-+
-+ mutex_unlock(&adapter->mutex);
-+}
-+
-+static int ug_tty_write(struct tty_struct *tty,
-+ const unsigned char *buf, int count)
-+{
-+ struct ug_adapter *adapter = tty->driver_data;
-+ char *b = (char *)buf;
-+ int index;
-+ int i;
-+
-+ if (!adapter)
-+ return -ENODEV;
-+
-+ index = tty->index;
-+ adapter = &ug_adapters[index];
-+ for (i = 0; i < count; i++)
-+ ug_safe_putc(adapter, *b++);
-+ return count;
-+}
-+
-+static int ug_tty_write_room(struct tty_struct *tty)
-+{
-+ return 0x123; /* whatever */
-+}
-+
-+static int ug_tty_chars_in_buffer(struct tty_struct *tty)
-+{
-+ return 0; /* unbuffered */
-+}
-+
-+
-+static const struct tty_operations ug_tty_ops = {
-+ .open = ug_tty_open,
-+ .close = ug_tty_close,
-+ .write = ug_tty_write,
-+ .write_room = ug_tty_write_room,
-+ .chars_in_buffer = ug_tty_chars_in_buffer,
-+};
-+
-+
-+static int ug_tty_init(void)
-+{
-+ struct tty_driver *driver;
-+ int retval;
-+
-+ driver = alloc_tty_driver(2);
-+ if (!driver)
-+ return -ENOMEM;
-+ driver->name = DRV_MODULE_NAME "con";
-+ driver->major = TTY_MAJOR;
-+ driver->minor_start = 64;
-+ driver->type = TTY_DRIVER_TYPE_SYSCONS;
-+ driver->init_termios = tty_std_termios;
-+ tty_set_operations(driver, &ug_tty_ops);
-+ retval = tty_register_driver(driver);
-+ if (retval) {
-+ put_tty_driver(driver);
-+ return retval;
-+ }
-+ ug_tty_driver = driver;
-+ return 0;
-+}
-+
-+static void ug_tty_exit(void)
-+{
-+ struct tty_driver *driver = ug_tty_driver;
-+
-+ ug_tty_driver = NULL;
-+ if (driver) {
-+ tty_unregister_driver(driver);
-+ put_tty_driver(driver);
-+ }
-+}
-+
-+
-+
-+/*
-+ *
-+ * EXI layer interface.
-+ */
-+
-+/*
-+ *
-+ */
-+static int ug_probe(struct exi_device *exi_device)
-+{
-+ struct console *console;
-+ struct ug_adapter *adapter;
-+ unsigned int slot;
-+
-+ /* don't try to drive a device which already has a real identifier */
-+ if (exi_device->eid.id != EXI_ID_NONE)
-+ return -ENODEV;
-+
-+ if (!ug_check_adapter(exi_device))
-+ return -ENODEV;
-+
-+ slot = to_channel(exi_get_exi_channel(exi_device));
-+ console = &ug_consoles[slot];
-+ adapter = console->data;
-+
-+ drv_printk(KERN_INFO, "USB Gecko detected in memcard slot-%c\n",
-+ 'A'+slot);
-+
-+ adapter->poller = ERR_PTR(-EINVAL);
-+ mutex_init(&adapter->mutex);
-+ adapter->refcnt = 0;
-+
-+ adapter->exi_device = exi_device_get(exi_device);
-+ exi_set_drvdata(exi_device, adapter);
-+ register_console(console);
-+
-+ ug_tty_init();
-+
-+ return 0;
-+}
-+
-+/*
-+ * Makes unavailable the USB Gecko adapter identified by the EXI device
-+ * `exi_device'.
-+ */
-+static void ug_remove(struct exi_device *exi_device)
-+{
-+ struct console *console;
-+ struct ug_adapter *adapter;
-+ unsigned int slot;
-+
-+ slot = to_channel(exi_get_exi_channel(exi_device));
-+ console = &ug_consoles[slot];
-+ adapter = console->data;
-+
-+ if (adapter->refcnt)
-+ drv_printk(KERN_ERR, "adapter removed while in use!\n");
-+
-+ ug_tty_exit();
-+
-+ unregister_console(console);
-+ exi_set_drvdata(exi_device, NULL);
-+ adapter->exi_device = NULL;
-+ exi_device_put(exi_device);
-+
-+ mutex_destroy(&adapter->mutex);
-+
-+ drv_printk(KERN_INFO, "USB Gecko removed from memcard slot-%c\n",
-+ 'A'+slot);
-+}
-+
-+static struct exi_device_id ug_eid_table[] = {
-+ [0] = {
-+ .channel = UG_SLOTA_CHANNEL,
-+ .device = UG_SLOTA_DEVICE,
-+ .id = EXI_ID_NONE,
-+ },
-+ [1] = {
-+ .channel = UG_SLOTB_CHANNEL,
-+ .device = UG_SLOTB_DEVICE,
-+ .id = EXI_ID_NONE,
-+ },
-+ {.id = 0}
-+};
-+
-+static struct exi_driver ug_exi_driver = {
-+ .name = DRV_MODULE_NAME,
-+ .eid_table = ug_eid_table,
-+ .frequency = UG_SPI_CLK_IDX,
-+ .probe = ug_probe,
-+ .remove = ug_remove,
-+};
-+
-+
-+/*
-+ *
-+ * Module interface.
-+ */
-+
-+static int __init ug_init_module(void)
-+{
-+ drv_printk(KERN_INFO, "%s - version %s\n", DRV_DESCRIPTION,
-+ ug_driver_version);
-+
-+ return exi_driver_register(&ug_exi_driver);
-+}
-+
-+static void __exit ug_exit_module(void)
-+{
-+ exi_driver_unregister(&ug_exi_driver);
-+}
-+
-+module_init(ug_init_module);
-+module_exit(ug_exit_module);
-+
-+MODULE_AUTHOR(DRV_AUTHOR);
-+MODULE_DESCRIPTION(DRV_DESCRIPTION);
-+MODULE_LICENSE("GPL");
-+
-diff --git a/drivers/usb/Kconfig b/drivers/usb/Kconfig
-index 289d81a..cdadf99 100644
---- a/drivers/usb/Kconfig
-+++ b/drivers/usb/Kconfig
-@@ -22,6 +22,7 @@ config USB_ARCH_HAS_HCD
- default y if PCMCIA && !M32R # sl811_cs
- default y if ARM # SL-811
- default y if SUPERH # r8a66597-hcd
-+ default y if WII # rvl-sthcd
- default PCI
-
- # many non-PCI SOC chips embed OHCI
-diff --git a/drivers/usb/Makefile b/drivers/usb/Makefile
-index 8b7c419..ba41ba1 100644
---- a/drivers/usb/Makefile
-+++ b/drivers/usb/Makefile
-@@ -16,6 +16,7 @@ obj-$(CONFIG_USB_UHCI_HCD) += host/
- obj-$(CONFIG_USB_SL811_HCD) += host/
- obj-$(CONFIG_USB_U132_HCD) += host/
- obj-$(CONFIG_USB_R8A66597_HCD) += host/
-+obj-$(CONFIG_USB_WII_HCD) += host/
- obj-$(CONFIG_USB_HWA_HCD) += host/
-
- obj-$(CONFIG_USB_C67X00_HCD) += c67x00/
-diff --git a/drivers/usb/host/Kconfig b/drivers/usb/host/Kconfig
-index f3a75a9..60c8f71 100644
---- a/drivers/usb/host/Kconfig
-+++ b/drivers/usb/host/Kconfig
-@@ -294,6 +294,25 @@ config SUPERH_ON_CHIP_R8A66597
- This driver enables support for the on-chip R8A66597 in the
- SH7366 and SH7723 processors.
-
-+config USB_WII_HCD
-+ tristate "Nintendo Wii HCD support"
-+ depends on USB && WII && !HIGHMEM && EXPERIMENTAL
-+ help
-+ The Nintendo Wii includes a USB 1.1 host controller that can be
-+ accessed through the API provided by the starlet subsystem.
-+
-+ Enable this option if you plan to use the internal Nintendo Wii
-+ bluetooth dongle or any USB peripheral connected to the external
-+ ports.
-+
-+ USB devices using isochronous transfers are not supported.
-+ Use of USB hubs is partially supported.
-+
-+ Use completely at you own risk. If unsure, say N.
-+
-+ To compile this driver as a module, choose M here: the
-+ module will be called rvl-sthcd.
-+
- config USB_WHCI_HCD
- tristate "Wireless USB Host Controller Interface (WHCI) driver (EXPERIMENTAL)"
- depends on EXPERIMENTAL
-diff --git a/drivers/usb/host/Makefile b/drivers/usb/host/Makefile
-index 23be222..98209ee 100644
---- a/drivers/usb/host/Makefile
-+++ b/drivers/usb/host/Makefile
-@@ -21,4 +21,5 @@ obj-$(CONFIG_USB_SL811_CS) += sl811_cs.o
- obj-$(CONFIG_USB_U132_HCD) += u132-hcd.o
- obj-$(CONFIG_USB_R8A66597_HCD) += r8a66597-hcd.o
- obj-$(CONFIG_USB_ISP1760_HCD) += isp1760.o
-+obj-$(CONFIG_USB_WII_HCD) += rvl-sthcd.o
- obj-$(CONFIG_USB_HWA_HCD) += hwa-hc.o
-diff --git a/drivers/usb/host/rvl-sthcd.c b/drivers/usb/host/rvl-sthcd.c
-new file mode 100644
-index 0000000..8f68297
---- /dev/null
-+++ b/drivers/usb/host/rvl-sthcd.c
-@@ -0,0 +1,2373 @@
-+/*
-+ * drivers/usb/host/rvl-sthcd.c
-+ *
-+ * USB Host Controller driver for the Nintendo Wii
-+ * Copyright (C) 2008-2009 The GameCube Linux Team
-+ * Copyright (C) 2008 Maarten ter Huurne
-+ * Copyright (C) 2008,2009 Albert Herranz
-+ *
-+ * This program is free software; you can redistribute it and/or
-+ * modify it under the terms of the GNU General Public License
-+ * as published by the Free Software Foundation; either version 2
-+ * of the License, or (at your option) any later version.
-+ *
-+ */
-+
-+/*
-+ *
-+ * TODO
-+ * - cleanup debuging mess
-+ *
-+ */
-+
-+#ifdef CONFIG_HIGHMEM
-+#error Sorry, this driver cannot currently work if HIGHMEM is y
-+#endif
-+
-+#define DBG(fmt, arg...) drv_printk(KERN_DEBUG, fmt, ##arg)
-+
-+#include <linux/device.h>
-+#include <linux/errno.h>
-+#include <linux/kernel.h>
-+#include <linux/kthread.h>
-+#include <linux/module.h>
-+#include <linux/of_platform.h>
-+#include <linux/scatterlist.h>
-+#include <linux/usb.h>
-+#include <asm/starlet.h>
-+
-+#include "../core/hcd.h"
-+#include "../core/hub.h"
-+
-+#define DRV_MODULE_NAME "rvl-sthcd"
-+#define DRV_DESCRIPTION "USB Host Controller driver for the Nintendo Wii"
-+#define DRV_AUTHOR "Maarten ter Huurne, " \
-+ "Albert Herranz"
-+
-+static char sthcd_driver_version[] = "0.4i";
-+
-+#define drv_printk(level, format, arg...) \
-+ printk(level DRV_MODULE_NAME ": " format , ## arg)
-+
-+
-+/* TODO: Use enum instead? */
-+#define STHCD_IOCTLV_CONTROLREQ 0
-+#define STHCD_IOCTLV_BULKREQ 1
-+#define STHCD_IOCTLV_INTRREQ 2
-+#define STHCD_IOCTL_SUSPENDDEVICE 5
-+#define STHCD_IOCTL_RESUMEDEVICE 6
-+#define STHCD_IOCTLV_GETDEVICELIST 12
-+#define STHCD_IOCTL_DEVICEREMOVALNOTIFY 26
-+#define STHCD_IOCTLV_DEVICEINSERTNOTIFY 27
-+
-+/*
-+ * The Nintendo Wii has only 2 external USB ports (plus 1 internal USB port),
-+ * but the starlet API provides access to USB devices in a port independent
-+ * way. This is true also for USB devices attached to external hubs.
-+ *
-+ * Our HCD model currently maps one starlet USB device to one HCD port, thus
-+ * we need additional ports here.
-+ */
-+#define STHCD_MAX_DEVIDS 15
-+#define STHCD_MAX_PORTS STHCD_MAX_DEVIDS
-+
-+/*
-+ * We get error -7008 after performing large transfers.
-+ * Using this arbitrary limit makes things work.
-+ */
-+#define STHCD_MAX_CHUNK_SIZE (2048)
-+
-+#define STHCD_PORT_MAX_RESETS 2 /* maximum number of consecutive
-+ * resets allowed for a port */
-+#define STHCD_RESCAN_INTERVAL 5 /* seconds */
-+
-+#define starlet_ioh_sg_entry(sg, ptr) \
-+ starlet_ioh_sg_set_buf((sg), (ptr), sizeof(*(ptr)))
-+
-+
-+struct sthcd_hcd;
-+struct sthcd_port;
-+struct sthcd_oh;
-+
-+/*
-+ * starlet USB device abstraction (udev).
-+ *
-+ */
-+struct sthcd_udev {
-+ u16 idVendor;
-+ u16 idProduct;
-+ int fd; /* starlet file descriptor */
-+
-+ u16 devnum; /* USB address set by kernel */
-+
-+ struct list_head node; /* in list of connected devices */
-+ struct sthcd_oh *oh; /* parent Open Host controller */
-+
-+ struct list_head pep_list; /* list of private endpoints */
-+};
-+
-+/*
-+ * starlet USB device identifier.
-+ *
-+ */
-+struct sthcd_devid {
-+ u32 _unk1;
-+ u16 idVendor;
-+ u16 idProduct;
-+};
-+
-+enum {
-+ __STHCD_PORT_INUSE = 0,
-+ __STHCD_PORT_DOOMED,
-+};
-+
-+
-+/*
-+ * "Virtual" HCD USB port.
-+ *
-+ */
-+struct sthcd_port {
-+ unsigned long flags;
-+#define STHCD_PORT_INUSE (1 << __STHCD_PORT_INUSE)
-+#define STHCD_PORT_DOOMED (1 << __STHCD_PORT_DOOMED)
-+
-+ u32 status_change;
-+ unsigned nr_resets;
-+
-+ struct sthcd_udev udev; /* one udev per port */
-+};
-+
-+/*
-+ * starlet Open Host controller abstraction (oh).
-+ *
-+ */
-+struct sthcd_oh {
-+ unsigned int index;
-+ int fd; /* starlet file descriptor */
-+
-+ unsigned int max_devids;
-+ struct sthcd_devid *new_devids;
-+ struct sthcd_devid *devids;
-+ unsigned int nr_devids; /* actual no of devices */
-+
-+ struct sthcd_hcd *hcd; /* parent Host Controller */
-+};
-+
-+/*
-+ * Host Controller (hcd).
-+ *
-+ */
-+struct sthcd_hcd {
-+ spinlock_t lock;
-+
-+ struct sthcd_oh oh[2];
-+
-+ struct sthcd_port *ports; /* array of ports */
-+ unsigned int nr_ports;
-+
-+ struct list_head device_list; /* list of connected devices */
-+
-+ wait_queue_head_t rescan_waitq; /* wait queue for the rescan task */
-+ struct task_struct *rescan_task;
-+};
-+
-+
-+/*
-+ * Private endpoint (pep).
-+ *
-+ * A pep takes care of the transfers for an endpoint.
-+ */
-+
-+struct sthcd_ctrl_params_in {
-+ struct usb_ctrlrequest req;
-+ u8 _unk1; /* timeout? */
-+};
-+struct sthcd_ctrl_xfer_ctx {
-+ struct starlet_ioh_sg in[6];
-+ struct sthcd_ctrl_params_in *params_in;
-+};
-+
-+struct sthcd_bulk_intr_params_in {
-+ u8 bEndpointAddress;
-+ u16 wLength;
-+};
-+struct sthcd_bulk_intr_xfer_ctx {
-+ struct starlet_ioh_sg in[2];
-+ struct sthcd_bulk_intr_params_in *params_in;
-+};
-+
-+enum {
-+ __STHCD_PEP_DISABLED = 0,
-+ __STHCD_PEP_XFERBUSY, /* pep is actively xferring data */
-+};
-+
-+struct sthcd_pep {
-+ unsigned long flags;
-+#define STHCD_PEP_DISABLED (1 << __STHCD_PEP_DISABLED)
-+#define STHCD_PEP_XFERBUSY (1 << __STHCD_PEP_XFERBUSY)
-+
-+ unsigned long outstanding;
-+
-+ struct usb_host_endpoint *ep; /* associated endpoint */
-+ struct sthcd_hcd *sthcd; /* associated hcd */
-+
-+ /* local copy of endpoint descriptor bmAttributes */
-+ __u8 bmAttributes;
-+
-+ /* xfer context data */
-+
-+ struct urb *urb; /* urb being transferred */
-+
-+ struct sthcd_udev *udev; /* udev for this urb */
-+ struct list_head node; /* in list of peps for this udev */
-+
-+ size_t io_xfer_offset; /* number of bytes transferred */
-+ void *io_buf; /* data buffer */
-+ size_t io_buf_len; /* length of io_buf */
-+
-+ int request; /* ioctlv request */
-+ union {
-+ struct sthcd_bulk_intr_xfer_ctx *bulk_intr;
-+ struct sthcd_ctrl_xfer_ctx *ctrl;
-+ } ctx; /* transfer context */
-+
-+ unsigned int nents_in; /* number of input sg entries */
-+ struct starlet_ioh_sg *in; /* input sg list */
-+ struct starlet_ioh_sg io[1]; /* input/output sg list */
-+};
-+
-+
-+/*
-+ * Debugging facilities.
-+ *
-+ */
-+
-+#if 0
-+static inline void print_buffer(void *buf, u32 size)
-+{
-+ int i;
-+ for (i = 0; i < (size + 3) / 4; i += 4) {
-+ u32 *data = &((u32 *)buf)[i];
-+ printk(KERN_INFO " %08X %08X %08X %08X\n",
-+ data[0], data[1], data[2], data[3]
-+ );
-+ }
-+}
-+#endif
-+
-+/*
-+ * Type conversion routines.
-+ *
-+ */
-+
-+static inline struct sthcd_hcd *hcd_to_sthcd(struct usb_hcd *hcd)
-+{
-+ return (struct sthcd_hcd *)(hcd->hcd_priv);
-+}
-+
-+static inline struct usb_hcd *sthcd_to_hcd(struct sthcd_hcd *sthcd)
-+{
-+ return container_of((void *)sthcd, struct usb_hcd, hcd_priv);
-+}
-+
-+static inline struct sthcd_port *udev_to_port(struct sthcd_udev *_udev)
-+{
-+ return container_of(_udev, struct sthcd_port, udev);
-+}
-+
-+
-+/*
-+ * Private End Point abstraction.
-+ *
-+ */
-+
-+static inline struct sthcd_pep *ep_to_pep(struct usb_host_endpoint *ep)
-+{
-+ return ep->hcpriv;
-+}
-+
-+static inline int pep_is_enabled(struct sthcd_pep *pep)
-+{
-+ return !test_bit(__STHCD_PEP_DISABLED, &pep->flags);
-+}
-+
-+static int sthcd_pep_alloc_ctrl_xfer_ctx(struct sthcd_pep *pep)
-+{
-+ struct sthcd_ctrl_xfer_ctx *ctx;
-+ struct sthcd_ctrl_params_in *params_in;
-+ int error;
-+
-+ ctx = starlet_kzalloc(sizeof(*ctx), GFP_ATOMIC);
-+ if (!ctx) {
-+ error = -ENOMEM;
-+ goto done;
-+ }
-+
-+ params_in = starlet_ioh_kzalloc(sizeof(*params_in));
-+ if (!params_in) {
-+ starlet_kfree(ctx);
-+ error = -ENOMEM;
-+ goto done;
-+ }
-+
-+ ctx->params_in = params_in;
-+
-+ starlet_ioh_sg_init_table(ctx->in, 6);
-+ starlet_ioh_sg_entry(&ctx->in[0], &params_in->req.bRequestType);
-+ starlet_ioh_sg_entry(&ctx->in[1], &params_in->req.bRequest);
-+ starlet_ioh_sg_entry(&ctx->in[2], &params_in->req.wValue);
-+ starlet_ioh_sg_entry(&ctx->in[3], &params_in->req.wIndex);
-+ starlet_ioh_sg_entry(&ctx->in[4], &params_in->req.wLength);
-+ starlet_ioh_sg_entry(&ctx->in[5], &params_in->_unk1);
-+
-+ pep->ctx.ctrl = ctx;
-+
-+ pep->nents_in = ARRAY_SIZE(ctx->in);
-+ pep->in = ctx->in;
-+
-+ error = 0;
-+
-+done:
-+ if (error < 0)
-+ DBG("%s: error=%d (%x)\n", __func__, error, error);
-+ return error;
-+}
-+
-+static void sthcd_pep_free_ctrl_xfer_ctx(struct sthcd_pep *pep)
-+{
-+ struct sthcd_ctrl_xfer_ctx *ctx = pep->ctx.ctrl;
-+
-+ if (ctx) {
-+ starlet_ioh_kfree(ctx->params_in);
-+ starlet_kfree(ctx);
-+ pep->ctx.ctrl = NULL;
-+ }
-+}
-+
-+static int sthcd_pep_alloc_bulk_intr_xfer_ctx(struct sthcd_pep *pep)
-+{
-+ struct sthcd_bulk_intr_xfer_ctx *ctx;
-+ struct sthcd_bulk_intr_params_in *params_in;
-+ int error;
-+
-+ ctx = starlet_kzalloc(sizeof(*ctx), GFP_ATOMIC);
-+ if (!ctx) {
-+ error = -ENOMEM;
-+ goto done;
-+ }
-+
-+ params_in = starlet_ioh_kzalloc(sizeof(*params_in));
-+ if (!params_in) {
-+ starlet_kfree(ctx);
-+ error = -ENOMEM;
-+ goto done;
-+ }
-+
-+ ctx->params_in = params_in;
-+
-+ starlet_ioh_sg_init_table(ctx->in, 2);
-+ starlet_ioh_sg_entry(&ctx->in[0], &params_in->bEndpointAddress);
-+ starlet_ioh_sg_entry(&ctx->in[1], &params_in->wLength);
-+
-+ pep->ctx.bulk_intr = ctx;
-+
-+ pep->nents_in = ARRAY_SIZE(ctx->in);
-+ pep->in = ctx->in;
-+
-+ error = 0;
-+
-+done:
-+ if (error < 0)
-+ DBG("%s: error=%d (%x)\n", __func__, error, error);
-+ return error;
-+}
-+
-+static void sthcd_pep_free_bulk_intr_xfer_ctx(struct sthcd_pep *pep)
-+{
-+ struct sthcd_bulk_intr_xfer_ctx *ctx = pep->ctx.bulk_intr;
-+
-+ if (ctx) {
-+ starlet_ioh_kfree(ctx->params_in);
-+ starlet_kfree(ctx);
-+ pep->ctx.bulk_intr = NULL;
-+ }
-+}
-+
-+static int sthcd_pep_alloc_xfer_ctx(struct sthcd_pep *pep)
-+{
-+ unsigned int xfer_type = pep->bmAttributes &
-+ USB_ENDPOINT_XFERTYPE_MASK;
-+ int error;
-+
-+ switch (xfer_type) {
-+ case USB_ENDPOINT_XFER_CONTROL:
-+ error = sthcd_pep_alloc_ctrl_xfer_ctx(pep);
-+ break;
-+ case USB_ENDPOINT_XFER_BULK:
-+ case USB_ENDPOINT_XFER_INT:
-+ error = sthcd_pep_alloc_bulk_intr_xfer_ctx(pep);
-+ break;
-+ default:
-+ error = -ENXIO;
-+ break;
-+ }
-+
-+ if (error < 0)
-+ DBG("%s: error=%d (%x)\n", __func__, error, error);
-+ return error;
-+}
-+
-+static void sthcd_pep_free_xfer_ctx(struct sthcd_pep *pep)
-+{
-+ unsigned int xfer_type = pep->bmAttributes &
-+ USB_ENDPOINT_XFERTYPE_MASK;
-+
-+ switch (xfer_type) {
-+ case USB_ENDPOINT_XFER_CONTROL:
-+ sthcd_pep_free_ctrl_xfer_ctx(pep);
-+ break;
-+ case USB_ENDPOINT_XFER_BULK:
-+ case USB_ENDPOINT_XFER_INT:
-+ sthcd_pep_free_bulk_intr_xfer_ctx(pep);
-+ break;
-+ default:
-+ DBG("%s: invalid endpoint xfer type %u\n", __func__,
-+ xfer_type);
-+ break;
-+ }
-+}
-+
-+static int sthcd_pep_alloc_xfer_io_buf(struct sthcd_pep *pep, size_t size)
-+{
-+ /* REVISIT, size must be greater than 0 */
-+ size_t io_buf_size = size + 32;
-+ int error;
-+
-+ pep->io_buf = starlet_ioh_kzalloc(io_buf_size);
-+ if (!pep->io_buf) {
-+ error = -ENOMEM;
-+ goto done;
-+ }
-+
-+ starlet_ioh_sg_init_table(pep->io, 1);
-+ starlet_ioh_sg_set_buf(&pep->io[0], pep->io_buf, size);
-+
-+ error = 0;
-+
-+done:
-+ if (error < 0)
-+ DBG("%s: error=%d (%x)\n", __func__, error, error);
-+ return error;
-+}
-+
-+static void sthcd_pep_free_xfer_io_buf(struct sthcd_pep *pep)
-+{
-+ if (pep->io_buf) {
-+ starlet_ioh_sg_set_buf(&pep->io[0], NULL, 0);
-+ starlet_ioh_kfree(pep->io_buf);
-+ pep->io_buf = NULL;
-+ }
-+}
-+
-+/*
-+ *
-+ * Context: interrupts disabled, hcd lock held
-+ */
-+static int sthcd_pep_init(struct sthcd_pep *pep, struct sthcd_hcd *sthcd,
-+ struct usb_host_endpoint *ep)
-+{
-+ int error;
-+
-+ BUG_ON(!ep);
-+
-+ pep->sthcd = sthcd;
-+ pep->ep = ep;
-+ pep->bmAttributes = ep->desc.bmAttributes;
-+
-+ error = sthcd_pep_alloc_xfer_ctx(pep);
-+ if (error)
-+ goto done;
-+
-+done:
-+ if (error < 0)
-+ DBG("%s: error=%d (%x)\n", __func__, error, error);
-+ return error;
-+}
-+
-+/*
-+ *
-+ * Context: interrupts disabled, hcd lock held
-+ */
-+static void sthcd_pep_exit(struct sthcd_pep *pep)
-+{
-+ BUG_ON(pep->urb);
-+ BUG_ON(!pep->ep);
-+
-+ sthcd_pep_free_xfer_ctx(pep);
-+
-+ pep->ep = NULL;
-+ pep->sthcd = NULL;
-+}
-+
-+/*
-+ *
-+ * Context: interrupts disabled, hcd lock held
-+ */
-+static struct sthcd_pep *sthcd_pep_alloc(struct sthcd_hcd *sthcd,
-+ struct usb_host_endpoint *ep)
-+{
-+ struct sthcd_pep *pep;
-+ int error;
-+
-+ pep = kzalloc(sizeof(*pep), GFP_ATOMIC);
-+ if (!pep)
-+ return NULL;
-+
-+ error = sthcd_pep_init(pep, sthcd, ep);
-+ if (error) {
-+ kfree(pep);
-+ return NULL;
-+ }
-+
-+ return pep;
-+}
-+
-+/*
-+ *
-+ * Context: interrupts disabled, hcd lock held
-+ */
-+static void sthcd_pep_free(struct sthcd_pep *pep)
-+{
-+ sthcd_pep_exit(pep);
-+ kfree(pep);
-+}
-+
-+/*
-+ *
-+ * Context: interrupts disabled, hcd lock held
-+ */
-+static struct sthcd_udev *sthcd_find_udev_by_num(struct sthcd_hcd *sthcd,
-+ u16 devnum)
-+{
-+ struct sthcd_udev *udev;
-+
-+ list_for_each_entry(udev, &sthcd->device_list, node) {
-+ if (udev->devnum == devnum)
-+ return udev;
-+ }
-+ DBG("%s: udev %u not found\n", __func__, devnum);
-+ return NULL;
-+}
-+
-+/*
-+ *
-+ * Context: interrupts disabled, hcd lock held
-+ */
-+static int sthcd_pep_takein_urb(struct sthcd_pep *pep, struct urb *urb)
-+{
-+ struct sthcd_hcd *sthcd = pep->sthcd;
-+ struct sthcd_udev *udev;
-+ int error = 0;
-+
-+ if (!pep_is_enabled(pep)) {
-+ error = -ESHUTDOWN;
-+ goto done;
-+ }
-+
-+ if (pep->urb) {
-+ error = -EBUSY;
-+ goto done;
-+ }
-+
-+ if (unlikely(!pep->udev)) {
-+ BUG_ON(!urb->dev);
-+ udev = sthcd_find_udev_by_num(sthcd, urb->dev->devnum);
-+ if (!udev) {
-+ error = -ENODEV;
-+ goto done;
-+ }
-+ pep->udev = udev;
-+ list_add_tail(&pep->node, &udev->pep_list);
-+ }
-+
-+ pep->urb = urb;
-+done:
-+ if (error < 0)
-+ DBG("%s: error=%d (%x)\n", __func__, error, error);
-+ return error;
-+}
-+
-+/*
-+ *
-+ * Context: interrupts disabled, hcd lock held
-+ */
-+static void sthcd_pep_takeout_urb(struct sthcd_pep *pep)
-+{
-+ WARN_ON(!pep->urb);
-+
-+ pep->urb = NULL;
-+ if (pep->udev)
-+ list_del_init(&pep->node);
-+ pep->udev = NULL;
-+}
-+
-+/*
-+ *
-+ * Context: interrupts disabled, hcd lock held
-+ */
-+static void sthcd_pep_setup_ctrl_xfer(struct sthcd_pep *pep)
-+{
-+ struct urb *urb = pep->urb;
-+ struct sthcd_ctrl_xfer_ctx *ctx = pep->ctx.ctrl;
-+ struct sthcd_ctrl_params_in *params_in;
-+
-+ params_in = ctx->params_in;
-+ memcpy(&params_in->req, urb->setup_packet, sizeof(params_in->req));
-+ params_in->req.wLength = cpu_to_le16(pep->io_buf_len);
-+}
-+
-+/*
-+ *
-+ * Context: interrupts disabled, hcd lock held
-+ */
-+static void sthcd_pep_setup_bulk_intr_xfer(struct sthcd_pep *pep)
-+{
-+ struct urb *urb = pep->urb;
-+ struct sthcd_bulk_intr_xfer_ctx *ctx = pep->ctx.bulk_intr;
-+ struct sthcd_bulk_intr_params_in *params_in;
-+
-+ params_in = ctx->params_in;
-+ params_in->bEndpointAddress = urb->ep->desc.bEndpointAddress;
-+ params_in->wLength = pep->io_buf_len;
-+}
-+
-+/*
-+ *
-+ * Context: interrupts disabled, hcd lock held
-+ */
-+static int sthcd_pep_setup_xfer(struct sthcd_pep *pep)
-+{
-+ struct urb *urb = pep->urb;
-+ int request;
-+ int error = 0;
-+
-+ switch (usb_pipetype(urb->pipe)) {
-+ case PIPE_CONTROL:
-+ request = STHCD_IOCTLV_CONTROLREQ;
-+ sthcd_pep_setup_ctrl_xfer(pep);
-+ break;
-+ case PIPE_INTERRUPT:
-+ request = STHCD_IOCTLV_INTRREQ;
-+ sthcd_pep_setup_bulk_intr_xfer(pep);
-+ break;
-+ case PIPE_BULK:
-+ request = STHCD_IOCTLV_BULKREQ;
-+ sthcd_pep_setup_bulk_intr_xfer(pep);
-+ break;
-+ default:
-+ error = -EINVAL;
-+ break;
-+ }
-+
-+ if (!error) {
-+ pep->request = request;
-+ starlet_ioh_sg_set_buf(&pep->io[0],
-+ pep->io_buf, pep->io_buf_len);
-+ }
-+
-+ if (error < 0)
-+ DBG("%s: error=%d (%x)\n", __func__, error, error);
-+ return error;
-+}
-+
-+/*
-+ *
-+ * Context: interrupts disabled, hcd lock held
-+ */
-+static int sthcd_pep_setup_next_xfer(struct sthcd_pep *pep)
-+{
-+ struct urb *urb = pep->urb;
-+ int retval = 0;
-+ int error;
-+
-+ if (pep->io_xfer_offset < urb->transfer_buffer_length) {
-+ pep->io_buf_len = urb->transfer_buffer_length -
-+ pep->io_xfer_offset;
-+ if (pep->io_buf_len > STHCD_MAX_CHUNK_SIZE)
-+ pep->io_buf_len = STHCD_MAX_CHUNK_SIZE;
-+
-+ retval = pep->io_buf_len;
-+
-+ error = sthcd_pep_setup_xfer(pep);
-+ if (error)
-+ retval = error;
-+ }
-+
-+ if (retval < 0)
-+ DBG("%s: retval=%d (%x)\n", __func__, retval, retval);
-+ return retval;
-+}
-+
-+/*
-+ *
-+ * Context: interrupts disabled, hcd lock held
-+ */
-+static int sthcd_pep_setup_first_xfer(struct sthcd_pep *pep)
-+{
-+ struct urb *urb = pep->urb;
-+ int retval;
-+ int error;
-+
-+ pep->io_xfer_offset = 0;
-+ pep->io_buf_len = urb->transfer_buffer_length;
-+ if (pep->io_buf_len > STHCD_MAX_CHUNK_SIZE)
-+ pep->io_buf_len = STHCD_MAX_CHUNK_SIZE;
-+
-+ retval = pep->io_buf_len;
-+
-+ error = sthcd_pep_setup_xfer(pep);
-+ if (error)
-+ retval = error;
-+
-+ if (retval < 0)
-+ DBG("%s: retval=%d (%x)\n", __func__, retval, retval);
-+ return retval;
-+}
-+
-+/*
-+ *
-+ * Context: interrupts disabled, hcd lock held
-+ */
-+static void sthcd_pep_finish_xfer(struct sthcd_pep *pep, int xfer_len)
-+{
-+ struct urb *urb = pep->urb;
-+
-+ if (xfer_len <= 0)
-+ goto done;
-+
-+ BUG_ON(!urb);
-+ BUG_ON(!pep->io_buf);
-+
-+ /*
-+ * For IN transfers, copy the received chunk data into the urb
-+ * xfer buffer.
-+ */
-+ if (usb_urb_dir_in(urb)) {
-+ /* device -> host */
-+ BUG_ON(!urb->transfer_buffer);
-+ memcpy(urb->transfer_buffer + pep->io_xfer_offset,
-+ pep->io_buf, xfer_len);
-+ }
-+
-+ pep->io_xfer_offset += xfer_len;
-+
-+done:
-+ return;
-+}
-+
-+static int sthcd_pep_xfer_callback(struct starlet_ipc_request *req);
-+
-+/*
-+ *
-+ * Context: interrupts disabled, hcd lock held
-+ */
-+static int sthcd_pep_start_xfer(struct sthcd_pep *pep)
-+{
-+ struct urb *urb = pep->urb;
-+ struct sthcd_udev *udev = pep->udev;
-+ int error;
-+
-+ BUG_ON(!urb);
-+
-+ /* udev was disconnected */
-+ if (unlikely(!udev)) {
-+ error = -ENODEV;
-+ goto done;
-+ }
-+
-+ if (!pep_is_enabled(pep)) {
-+ error = -ESHUTDOWN;
-+ goto done;
-+ }
-+
-+ /* for OUT transfers, copy the data to send into the pep xfer buffer */
-+ if (pep->io_buf_len > 0) {
-+ if (usb_urb_dir_out(urb)) {
-+ /* host -> device */
-+ BUG_ON(!urb->transfer_buffer);
-+ memcpy(pep->io_buf,
-+ urb->transfer_buffer + pep->io_xfer_offset,
-+ pep->io_buf_len);
-+ }
-+ }
-+
-+ starlet_ioh_sg_set_buf(&pep->io[0],
-+ pep->io_buf, pep->io_buf_len);
-+
-+ /* start an async transfer */
-+ error = starlet_ioh_ioctlv_nowait(udev->fd, pep->request,
-+ pep->nents_in, pep->in, 1, pep->io,
-+ sthcd_pep_xfer_callback, pep);
-+ if (!error)
-+ pep->outstanding++;
-+
-+done:
-+ if (error < 0)
-+ DBG("%s: error=%d (%x)\n", __func__, error, error);
-+ return error;
-+}
-+
-+/*
-+ *
-+ * Context: interrupts disabled, hcd lock held
-+ */
-+static int sthcd_giveback_urb(struct sthcd_hcd *sthcd,
-+ struct urb *urb, int status)
-+__releases(sthcd->lock) __acquires(sthcd->lock)
-+{
-+ struct usb_hcd *hcd = sthcd_to_hcd(sthcd);
-+
-+ /*
-+ * Release the hcd lock here as the callback may need to
-+ * hold it again.
-+ */
-+ spin_unlock(&sthcd->lock);
-+ usb_hcd_giveback_urb(hcd, urb, status);
-+ spin_lock(&sthcd->lock);
-+
-+ return status;
-+}
-+
-+/*
-+ *
-+ * Context: interrupts disabled, hcd lock held
-+ */
-+struct urb *sthcd_find_next_urb_in_ep(struct usb_host_endpoint *ep)
-+{
-+ if (list_empty(&ep->urb_list))
-+ return NULL;
-+ else
-+ return list_first_entry(&ep->urb_list, struct urb, urb_list);
-+}
-+
-+static int sthcd_pep_send_urb(struct sthcd_pep *pep, struct urb *urb);
-+
-+/*
-+ *
-+ * Context: interrupts disabled, hcd lock held
-+ */
-+static int sthcd_pep_cond_send_next_urb(struct sthcd_pep *pep)
-+{
-+ struct urb *urb;
-+ int retval = 0;
-+ int error;
-+
-+ /* schedule next urb if any */
-+ urb = sthcd_find_next_urb_in_ep(pep->ep);
-+ if (urb) {
-+ error = sthcd_pep_send_urb(pep, urb);
-+ if (!error) {
-+ retval = 1;
-+ goto done;
-+ } else {
-+ retval = error;
-+ }
-+ }
-+done:
-+ if (retval < 0)
-+ DBG("%s: retval=%d (%x)\n", __func__, retval, retval);
-+ return retval;
-+}
-+
-+/*
-+ *
-+ * Context: interrupts disabled, hcd lock held
-+ */
-+static int sthcd_pep_send_urb(struct sthcd_pep *pep, struct urb *urb)
-+{
-+ struct sthcd_port *port = NULL;
-+ struct sthcd_hcd *sthcd;
-+ struct usb_ctrlrequest *req;
-+ u16 typeReq, wValue;
-+ int retval, fake;
-+ int error;
-+
-+ /*
-+ * Unconditionally fail urbs targetted at doomed ports.
-+ */
-+ if (pep->udev) {
-+ port = udev_to_port(pep->udev);
-+ if (test_bit(__STHCD_PORT_DOOMED, &port->flags)) {
-+ error = -ENODEV;
-+ goto done;
-+ }
-+ }
-+
-+ if (test_and_set_bit(__STHCD_PEP_XFERBUSY, &pep->flags)) {
-+ /*
-+ * There is a pep xfer in progress.
-+ * Our urb is already queued on the usb device, so do nothing
-+ * here and rely on the pep xfer callback to do the actual
-+ * work when it's done with the current urb in flight.
-+ */
-+ error = 0;
-+ goto done;
-+ }
-+
-+ /* we can have one ongoing urb only */
-+ error = sthcd_pep_takein_urb(pep, urb);
-+ if (error)
-+ goto done;
-+
-+ urb->hcpriv = urb; /* mark urb in use */
-+
-+ retval = sthcd_pep_setup_first_xfer(pep);
-+ if (retval < 0) {
-+ error = retval;
-+ goto err_setup_xfer;
-+ }
-+
-+ fake = 0;
-+ if (pep->request == STHCD_IOCTLV_CONTROLREQ) {
-+ req = (struct usb_ctrlrequest *)urb->setup_packet;
-+ typeReq = (req->bRequestType << 8) | req->bRequest;
-+ wValue = le16_to_cpu(req->wValue);
-+
-+ switch (typeReq) {
-+ case DeviceOutRequest | USB_REQ_SET_ADDRESS: /* 0005 */
-+ if (urb->dev->devnum != 0) {
-+ /* REVISIT, never reached */
-+ drv_printk(KERN_WARNING,
-+ "address change %u->%u\n",
-+ urb->dev->devnum, wValue);
-+ }
-+ /*
-+ * We are guaranteed to have an udev because the takein
-+ * was successful.
-+ */
-+ pep->udev->devnum = wValue;
-+ urb->actual_length = 0;
-+
-+ /* clear the port reset count, we have an address */
-+ if (wValue) {
-+ /*
-+ * We need to retrieve the port again
-+ * as we might have entered the function
-+ * without an udev assigned to the pep.
-+ */
-+ port = udev_to_port(pep->udev);
-+ port->nr_resets = 0;
-+ }
-+ fake = 1;
-+ break;
-+ default:
-+ break;
-+ }
-+ }
-+
-+ if (fake) {
-+ sthcd = pep->sthcd;
-+ /* finish this fake urb synchronously... */
-+ usb_hcd_unlink_urb_from_ep(sthcd_to_hcd(sthcd), urb);
-+ sthcd_giveback_urb(sthcd, urb, 0);
-+ /* ... and proceed with the next urb, if applicable */
-+ sthcd_pep_cond_send_next_urb(pep);
-+ } else {
-+ /* allocate an io buffer for this transfer */
-+ error = sthcd_pep_alloc_xfer_io_buf(pep, pep->io_buf_len);
-+ if (error)
-+ goto err_alloc_io_buf;
-+
-+ /* ... and start the first transfer */
-+ error = sthcd_pep_start_xfer(pep);
-+ if (error)
-+ goto err_start_xfer;
-+ }
-+
-+ return 0;
-+
-+err_start_xfer:
-+ sthcd_pep_free_xfer_io_buf(pep);
-+err_alloc_io_buf:
-+err_setup_xfer:
-+ sthcd_pep_takeout_urb(pep);
-+ urb->hcpriv = NULL;
-+done:
-+ if (error < 0)
-+ DBG("%s: error=%d (%x)\n", __func__, error, error);
-+ return error;
-+}
-+
-+static void sthcd_pep_print(struct sthcd_pep *pep)
-+{
-+ struct usb_device *udev;
-+ u16 idVendor, idProduct;
-+
-+ idVendor = idProduct = 0xffff;
-+ if (pep->urb) {
-+ udev = pep->urb->dev;
-+ if (udev) {
-+ idVendor = le16_to_cpu(udev->descriptor.idVendor);
-+ idProduct = le16_to_cpu(udev->descriptor.idProduct);
-+ }
-+ }
-+ DBG("(%04X:%04X) request=%d,"
-+ " io_buf=%p, io_buf_len=%u, io_xfer_offset=%u\n",
-+ idVendor, idProduct,
-+ pep->request,
-+ pep->io_buf,
-+ pep->io_buf_len,
-+ pep->io_xfer_offset);
-+}
-+
-+/*
-+ *
-+ * Context: in interrupt
-+ */
-+static int sthcd_pep_xfer_callback(struct starlet_ipc_request *req)
-+{
-+ int xfer_len = req->result;
-+ struct sthcd_pep *pep = req->done_data;
-+ int status = 0;
-+ struct sthcd_port *port;
-+ struct sthcd_hcd *sthcd;
-+ struct usb_hcd *hcd;
-+ struct urb *urb;
-+ int retval;
-+ unsigned long flags;
-+ int error;
-+
-+ starlet_ipc_free_request(req);
-+
-+ sthcd = pep->sthcd;
-+ spin_lock_irqsave(&sthcd->lock, flags);
-+
-+ hcd = sthcd_to_hcd(sthcd);
-+
-+ pep->outstanding--;
-+
-+ urb = pep->urb;
-+ if (!urb) {
-+ /*
-+ * starlet completed an URB that was already dequeued.
-+ *
-+ * We must free here the memory used by the pep, including
-+ * I/O buffers, avoiding dereferencing any USB stack data
-+ * pointed by the pep, as it may be invalid now.
-+ */
-+ sthcd_pep_free_xfer_io_buf(pep);
-+ sthcd_pep_free(pep);
-+ goto done;
-+ }
-+
-+ /* sanity checks, determine transfer status and length */
-+ if (xfer_len < 0) {
-+ status = xfer_len;
-+ xfer_len = 0;
-+
-+ if (status != -7004 && status != -7003 && status != -7005) {
-+ drv_printk(KERN_ERR, "request completed"
-+ " with error %d\n", status);
-+ sthcd_pep_print(pep);
-+ }
-+
-+ switch (status) {
-+ case -7003:
-+ case -7004:
-+ /* endpoint stall */
-+ status = -EPIPE;
-+ break;
-+ case -7005:
-+ /* nak? */
-+ status = -ECONNRESET;
-+ break;
-+ case -7008:
-+ case -7022:
-+ case -4:
-+ /* FALL-THROUGH */
-+ default:
-+ /*
-+ * We got an unknown, probably un-retryable, error.
-+ * Flag the port as unuseable. The associated
-+ * device will be disconnected ASAP.
-+ */
-+ port = udev_to_port(pep->udev);
-+ set_bit(__STHCD_PORT_DOOMED, &port->flags);
-+ DBG("%s: error %d on port %d, doomed!\n", __func__,
-+ status, port - pep->sthcd->ports + 1);
-+
-+ /* also, do not use the pep for xfers anymore */
-+ set_bit(__STHCD_PEP_DISABLED, &pep->flags);
-+ status = -ENODEV;
-+ break;
-+ }
-+ } else {
-+ if (usb_pipecontrol(urb->pipe)) {
-+ /*
-+ * starlet includes the length of the request
-+ * into the reply for control transfers.
-+ * We need to substract the request size from
-+ * the reply len to get the actual data size.
-+ */
-+ xfer_len -= sizeof(struct usb_ctrlrequest);
-+ if (xfer_len < 0) {
-+ drv_printk(KERN_ERR, "request incomplete,"
-+ " %d bytes short\n",
-+ -xfer_len);
-+ status = -EPIPE;
-+ xfer_len = 0;
-+ }
-+ }
-+ if (xfer_len > pep->io_buf_len) {
-+ DBG("%s: xfer len %u larger than xfer buf"
-+ " len %u\n", __func__,
-+ xfer_len, pep->io_buf_len);
-+ xfer_len = pep->io_buf_len;
-+ }
-+
-+ }
-+
-+ if (xfer_len > 0) {
-+ sthcd_pep_finish_xfer(pep, xfer_len);
-+
-+ /*
-+ * Only schedule the next chunk if we didn't get a short xfer
-+ * and the pep is still active
-+ */
-+ if (xfer_len == pep->io_buf_len && pep_is_enabled(pep)) {
-+ retval = sthcd_pep_setup_next_xfer(pep);
-+ if (retval <= 0) {
-+ /* an error happened or all chunks were done */
-+ status = retval;
-+ } else {
-+ /* next xfer */
-+ sthcd_pep_start_xfer(pep);
-+ goto done;
-+ }
-+ }
-+ }
-+
-+ sthcd_pep_free_xfer_io_buf(pep);
-+ urb->actual_length = pep->io_xfer_offset;
-+
-+ /* at this point, we are done with this urb */
-+ clear_bit(__STHCD_PEP_XFERBUSY, &pep->flags);
-+
-+ sthcd_pep_takeout_urb(pep);
-+
-+ BUG_ON(!sthcd);
-+ BUG_ON(!urb);
-+
-+ error = usb_hcd_check_unlink_urb(hcd, urb, status);
-+ if (!error) {
-+ usb_hcd_unlink_urb_from_ep(hcd, urb);
-+
-+ /* give back this urb */
-+ sthcd_giveback_urb(sthcd, urb, status);
-+ } else {
-+ /* REVISIT, paranoid */
-+ DBG("%s: error checking unlink\n", __func__);
-+ }
-+
-+ /* if applicable, launch the next urb in this endpoint queue */
-+ sthcd_pep_cond_send_next_urb(pep);
-+
-+done:
-+ spin_unlock_irqrestore(&sthcd->lock, flags);
-+
-+ return 0;
-+}
-+
-+
-+/*
-+ * starlet USB device "udev" abstraction.
-+ *
-+ *
-+ */
-+
-+
-+static struct sthcd_udev *sthcd_get_free_udev(struct sthcd_hcd *sthcd)
-+{
-+ struct sthcd_port *port;
-+ struct sthcd_udev *udev;
-+ int i;
-+
-+ port = sthcd->ports;
-+ for (i = 0; i < sthcd->nr_ports; i++, port++) {
-+ udev = &port->udev;
-+ if (!test_and_set_bit(__STHCD_PORT_INUSE, &port->flags))
-+ return udev;
-+ }
-+ return NULL;
-+}
-+
-+static struct sthcd_udev *sthcd_find_udev_by_ids(struct sthcd_hcd *sthcd,
-+ u16 idVendor, u16 idProduct)
-+{
-+ struct sthcd_udev *udev;
-+
-+ list_for_each_entry(udev, &sthcd->device_list, node) {
-+ if (udev->idVendor == idVendor && udev->idProduct == idProduct)
-+ return udev;
-+ }
-+ return NULL;
-+}
-+
-+#if 0
-+static int sthcd_udev_suspend(struct sthcd_udev *udev)
-+{
-+ int error;
-+
-+ error = starlet_ioctl(udev->fd, STHCD_IOCTL_SUSPENDDEVICE,
-+ NULL, 0, NULL, 0);
-+ if (error < 0)
-+ DBG("%s: error=%d (%x)\n", __func__, error, error);
-+ return error;
-+}
-+
-+static int sthcd_udev_resume(struct sthcd_udev *udev)
-+{
-+ int error;
-+
-+ error = starlet_ioctl(udev->fd, STHCD_IOCTL_RESUMEDEVICE,
-+ NULL, 0, NULL, 0);
-+ if (error < 0)
-+ DBG("%s: error=%d (%x)\n", __func__, error, error);
-+ return error;
-+}
-+#endif
-+
-+static int sthcd_udev_close(struct sthcd_udev *udev)
-+{
-+ int fd = udev->fd;
-+
-+ udev->fd = -1;
-+ return starlet_close(fd);
-+}
-+
-+static int sthcd_udev_open(struct sthcd_udev *udev)
-+{
-+ struct sthcd_oh *oh = udev->oh;
-+ char pathname[32];
-+ int error;
-+
-+ if (udev->fd != -1) {
-+ drv_printk(KERN_WARNING, "udev %04X.%04X already opened,"
-+ " closing it first\n",
-+ udev->idVendor, udev->idProduct);
-+ sthcd_udev_close(udev);
-+ }
-+
-+ snprintf(pathname, sizeof(pathname), "/dev/usb/oh%u/%04x/%04x",
-+ oh->index, udev->idVendor, udev->idProduct);
-+ error = starlet_open(pathname, 0);
-+ if (error < 0) {
-+ drv_printk(KERN_ERR, "open %s failed\n", pathname);
-+ return error;
-+ }
-+ udev->fd = error;
-+
-+ return 0;
-+}
-+
-+static void sthcd_udev_exit(struct sthcd_udev *udev)
-+{
-+ struct sthcd_hcd *sthcd;
-+ struct sthcd_pep *pep;
-+ unsigned long flags;
-+
-+ sthcd = udev->oh->hcd;
-+
-+ spin_lock_irqsave(&sthcd->lock, flags);
-+
-+ /* remove from the list of connected devices */
-+ list_del_init(&udev->node);
-+
-+ /* unlink all associated peps */
-+ list_for_each_entry(pep, &udev->pep_list, node) {
-+ if (pep->udev) {
-+ pep->udev = NULL;
-+ list_del_init(&pep->node);
-+ }
-+ }
-+
-+ spin_unlock_irqrestore(&sthcd->lock, flags);
-+
-+ sthcd_udev_close(udev);
-+
-+ udev->idVendor = 0;
-+ udev->idProduct = 0;
-+ udev->oh = NULL;
-+ udev->devnum = 0;
-+}
-+
-+static int sthcd_udev_init(struct sthcd_udev *udev,
-+ struct sthcd_oh *oh,
-+ u16 idVendor, u16 idProduct)
-+{
-+ struct sthcd_hcd *sthcd = oh->hcd;
-+ int error;
-+ unsigned long flags;
-+
-+ INIT_LIST_HEAD(&udev->pep_list);
-+
-+ udev->idVendor = idVendor;
-+ udev->idProduct = idProduct;
-+ udev->oh = oh;
-+ udev->fd = -1;
-+ udev->devnum = 0;
-+
-+ error = sthcd_udev_open(udev);
-+ if (error)
-+ return error;
-+
-+ spin_lock_irqsave(&sthcd->lock, flags);
-+ list_add_tail(&udev->node, &sthcd->device_list);
-+ spin_unlock_irqrestore(&sthcd->lock, flags);
-+
-+ return error;
-+}
-+
-+
-+/*
-+ * Hub emulation routines.
-+ *
-+ */
-+
-+#define STHCD_USB_DT_HUB_TOTAL_SIZE \
-+ (USB_DT_HUB_NONVAR_SIZE + 2*((STHCD_MAX_PORTS + 1 + 7) / 8))
-+
-+static struct usb_hub_descriptor sthcd_hub_hub_descr = {
-+ .bDescLength = STHCD_USB_DT_HUB_TOTAL_SIZE,
-+ .bDescriptorType = USB_DT_HUB,
-+ .bNbrPorts = STHCD_MAX_PORTS,
-+ .wHubCharacteristics = 0x0000,
-+ .bPwrOn2PwrGood = 0,
-+ .bHubContrCurrent = 0,
-+};
-+
-+
-+static int
-+sthcd_hub_control_standard(struct usb_hcd *hcd, u16 typeReq, u16 wValue,
-+ u16 wIndex, char *buf, u16 wLength)
-+{
-+ int retval = -EINVAL;
-+
-+ switch (typeReq) {
-+ case DeviceOutRequest | USB_REQ_SET_CONFIGURATION: /* 0009 */
-+ if (wValue != 1) {
-+ drv_printk(KERN_INFO, "invalid configuration %d\n",
-+ wValue);
-+ } else {
-+ retval = 0;
-+ }
-+ break;
-+ case DeviceRequest | USB_REQ_GET_STATUS: /* 8000 */
-+ if (wLength < 2) {
-+ retval = -ENOMEM;
-+ } else {
-+ buf[0] = (1 << USB_DEVICE_SELF_POWERED);
-+ buf[1] = 0;
-+ retval = 2;
-+ }
-+ break;
-+ default:
-+ drv_printk(KERN_WARNING, "%s: request %04X not supported\n",
-+ __func__, typeReq);
-+ break;
-+ }
-+ DBG("%s: retval=%d (%x)\n", __func__, retval, retval);
-+ return retval;
-+}
-+
-+static int
-+sthcd_hub_control_hub(struct usb_hcd *hcd, u16 typeReq, u16 wValue,
-+ u16 wIndex, void *buf, u16 wLength)
-+{
-+ struct sthcd_hcd *sthcd = hcd_to_sthcd(hcd);
-+ struct usb_hub_status *hub_status;
-+ struct usb_hub_descriptor *hub_descr;
-+ size_t size, port_array_size;
-+ u8 *p;
-+ int retval = -EINVAL;
-+
-+ switch (typeReq) {
-+ case GetHubStatus: /* 0xA000 */
-+ size = sizeof(*hub_status);
-+ if (wLength < size) {
-+ retval = -ENOMEM;
-+ } else {
-+ hub_status = buf;
-+ hub_status->wHubStatus = 0x0000; /* no problems */
-+ hub_status->wHubChange = 0x0000; /* no changes */
-+ retval = size;
-+ }
-+ break;
-+ case GetHubDescriptor: /* 0xA006 */
-+ /*
-+ * For the DeviceRemovable and PortPwrCtrlMask fields:
-+ * bit 0 is reserved.
-+ * bit 1 is the internal (oh1) port, which is non-removable.
-+ * bit 2..nr_ports+1 are the external (oh0) ports.
-+ */
-+ port_array_size = (1 + sthcd->nr_ports + 7) / 8;
-+ size = USB_DT_HUB_NONVAR_SIZE + 2*port_array_size;
-+
-+ if (wLength < size) {
-+ retval = -ENOMEM;
-+ } else {
-+ p = buf;
-+
-+ memcpy(p, &sthcd_hub_hub_descr, USB_DT_HUB_NONVAR_SIZE);
-+ p += USB_DT_HUB_NONVAR_SIZE;
-+
-+ /* fixup the descriptor with the real number of ports */
-+ hub_descr = buf;
-+ hub_descr->bDescLength = size;
-+ hub_descr->bNbrPorts = sthcd->nr_ports;
-+
-+ /* DeviceRemovable field, table 11-13 Hub Descriptor */
-+ memset(p, 0, port_array_size);
-+ *p |= 0x02; /* port 1 is non-removable */
-+ p += port_array_size;
-+
-+ /* PortPwrCtrlMask field, table 11-13 Hub Descriptor */
-+ memset(p, 0xff, port_array_size);
-+
-+ retval = size;
-+ }
-+ break;
-+ default:
-+ drv_printk(KERN_WARNING, "%s: request %04X not supported\n",
-+ __func__, typeReq);
-+ break;
-+ }
-+
-+ if (retval < 0)
-+ DBG("%s: retval=%d (%x)\n", __func__, retval, retval);
-+ return retval;
-+}
-+
-+
-+static int
-+sthcd_hub_control_port(struct usb_hcd *hcd, u16 typeReq, u16 wValue,
-+ u16 wIndex, void *buf, u16 wLength)
-+{
-+ struct sthcd_hcd *sthcd = hcd_to_sthcd(hcd);
-+ struct sthcd_port *port;
-+ unsigned long flags;
-+ int retval = 0;
-+
-+ if (wIndex == 0 || wIndex > sthcd->nr_ports) {
-+ DBG("%s: invalid port %u\n", __func__, wIndex);
-+ return -EINVAL;
-+ }
-+
-+ spin_lock_irqsave(&sthcd->lock, flags);
-+
-+ wIndex--;
-+ port = &sthcd->ports[wIndex];
-+
-+ switch (typeReq) {
-+ case GetPortStatus: /* 0xA300 */
-+ if (test_bit(__STHCD_PORT_DOOMED, &port->flags)) {
-+ /* disconnect */
-+ if (!!(port->status_change & USB_PORT_STAT_CONNECTION))
-+ port->status_change |=
-+ (USB_PORT_STAT_C_CONNECTION<<16);
-+ port->status_change &= ~USB_PORT_STAT_CONNECTION;
-+ }
-+ /* REVISIT wait 50ms before clearing the RESET state */
-+ if (port->status_change & USB_PORT_STAT_RESET) {
-+ port->nr_resets++;
-+ if (port->nr_resets > 2) {
-+ DBG("%s: port %d was reset %u time(s),"
-+ " doomed!\n", __func__,
-+ wIndex+1, port->nr_resets);
-+ set_bit(__STHCD_PORT_DOOMED, &port->flags);
-+ }
-+ if (!(port->status_change & USB_PORT_STAT_ENABLE))
-+ port->status_change |=
-+ (USB_PORT_STAT_C_ENABLE << 16);
-+ port->status_change &= ~USB_PORT_STAT_RESET;
-+ port->status_change |= (USB_PORT_STAT_ENABLE |
-+ (USB_PORT_STAT_C_RESET << 16));
-+ port->udev.devnum = 0;
-+ }
-+ retval = 4;
-+ ((__le32 *) buf)[0] = cpu_to_le32(port->status_change);
-+ break;
-+ case ClearPortFeature: /* 0x2301 */
-+ switch (wValue) {
-+ case USB_PORT_FEAT_ENABLE:
-+ port->status_change &= USB_PORT_STAT_POWER;
-+ break;
-+ case USB_PORT_FEAT_SUSPEND:
-+ case USB_PORT_FEAT_POWER:
-+ case USB_PORT_FEAT_C_ENABLE:
-+ case USB_PORT_FEAT_C_SUSPEND:
-+ case USB_PORT_FEAT_C_CONNECTION:
-+ case USB_PORT_FEAT_C_OVER_CURRENT:
-+ case USB_PORT_FEAT_C_RESET: /* 0x14 */
-+ break;
-+ default:
-+ goto error;
-+ }
-+ port->status_change &= ~(1 << wValue);
-+ break;
-+ case SetPortFeature: /* 0x2303 */
-+ switch (wValue) {
-+ case USB_PORT_FEAT_ENABLE:
-+ case USB_PORT_FEAT_SUSPEND:
-+ case USB_PORT_FEAT_POWER: /* 0x08 */
-+ break;
-+ case USB_PORT_FEAT_RESET: /* 0x04 */
-+ /* REVISIT, free all related resources here */
-+ break;
-+ default:
-+ goto error;
-+ }
-+ port->status_change |= 1 << wValue;
-+ break;
-+ default:
-+ drv_printk(KERN_WARNING, "%s: request %04X not supported\n",
-+ __func__, typeReq);
-+error:
-+ retval = -EPIPE;
-+ break;
-+ }
-+
-+ spin_unlock_irqrestore(&sthcd->lock, flags);
-+
-+ return retval;
-+}
-+
-+static int sthcd_hub_control(struct usb_hcd *hcd, u16 typeReq, u16 wValue,
-+ u16 wIndex, char *buf, u16 wLength)
-+{
-+ u8 bmRequestType;
-+ int retval = -EINVAL;
-+
-+ /*
-+ * starlet never answers to requests on device 0/0, so we emulate it.
-+ */
-+
-+ bmRequestType = typeReq >> 8;
-+
-+ switch (bmRequestType & USB_TYPE_MASK) {
-+ case USB_TYPE_STANDARD:
-+ /* generic requests */
-+ retval = sthcd_hub_control_standard(hcd, typeReq, wValue,
-+ wIndex, buf, wLength);
-+ break;
-+ case USB_TYPE_CLASS:
-+ /* hub-specific requests */
-+ switch (bmRequestType & USB_RECIP_MASK) {
-+ case USB_RECIP_DEVICE:
-+ /* hub */
-+ retval = sthcd_hub_control_hub(hcd, typeReq, wValue,
-+ wIndex, buf, wLength);
-+ break;
-+ case USB_RECIP_OTHER:
-+ /* port */
-+ retval = sthcd_hub_control_port(hcd, typeReq, wValue,
-+ wIndex, buf, wLength);
-+ break;
-+ default:
-+ drv_printk(KERN_WARNING, "%s: request %04X"
-+ " not supported\n", __func__, typeReq);
-+ break;
-+ }
-+ break;
-+ default:
-+ drv_printk(KERN_WARNING, "%s: request %04X not supported\n",
-+ __func__, typeReq);
-+ break;
-+ }
-+
-+ if (retval > 0)
-+ retval = 0;
-+ if (retval < 0)
-+ DBG("%s: retval=%d (%x)\n", __func__, retval, retval);
-+ return retval;
-+}
-+
-+static int sthcd_hub_status_data(struct usb_hcd *hcd, char *buf)
-+{
-+ struct sthcd_hcd *sthcd = hcd_to_sthcd(hcd);
-+ u16 *p = (u16 *)buf;
-+ struct sthcd_port *port;
-+ unsigned long flags;
-+ int i, result;
-+
-+ if (!HC_IS_RUNNING(hcd->state))
-+ return -ESHUTDOWN;
-+
-+#if 0
-+ if (timer_pending(&hcd->rh_timer))
-+ return 0;
-+#endif
-+
-+ /* FIXME, this code assumes at least 9 and no more than 15 ports */
-+ BUG_ON(sthcd->nr_ports > 15 || sthcd->nr_ports < 8);
-+
-+ spin_lock_irqsave(&sthcd->lock, flags);
-+
-+ port = sthcd->ports;
-+ for (i = 0, *p = 0; i < sthcd->nr_ports; i++, port++) {
-+ if ((port->status_change & 0xffff0000) != 0) {
-+ *p |= 1 << (i+1);
-+ /* REVISIT */
-+ }
-+ }
-+ *p = le16_to_cpu(*p);
-+ result = (*p != 0) ? 2 : 0;
-+
-+ spin_unlock_irqrestore(&sthcd->lock, flags);
-+
-+/* DBG("%s: poll cycle, changes=%04x\n", __func__, *p); */
-+
-+ return result;
-+}
-+
-+
-+/*
-+ * "OH" abstraction.
-+ *
-+ */
-+
-+static int sthcd_oh_insert_udev(struct sthcd_oh *oh,
-+ u16 idVendor, u16 idProduct)
-+{
-+ struct sthcd_hcd *sthcd = oh->hcd;
-+ struct sthcd_udev *udev;
-+ struct sthcd_port *port;
-+ unsigned long flags;
-+ int error;
-+
-+ drv_printk(KERN_INFO, "inserting device %04X.%04X\n",
-+ idVendor, idProduct);
-+
-+ udev = sthcd_get_free_udev(sthcd);
-+ if (!udev) {
-+ drv_printk(KERN_ERR, "no free udevs!\n");
-+ return -EBUSY;
-+ }
-+
-+ error = sthcd_udev_init(udev, oh, idVendor, idProduct);
-+ if (!error) {
-+ spin_lock_irqsave(&sthcd->lock, flags);
-+
-+ port = udev_to_port(udev);
-+ /* notify a connection event */
-+ port->status_change = USB_PORT_STAT_POWER |
-+ USB_PORT_STAT_CONNECTION |
-+ (USB_PORT_STAT_C_CONNECTION<<16);
-+
-+ spin_unlock_irqrestore(&sthcd->lock, flags);
-+ }
-+ return error;
-+}
-+
-+static int sthcd_oh_remove_udev(struct sthcd_oh *oh,
-+ u16 idVendor, u16 idProduct)
-+{
-+ struct sthcd_hcd *sthcd = oh->hcd;
-+ struct sthcd_udev *udev;
-+ struct sthcd_port *port;
-+ u32 old_status;
-+ unsigned long flags;
-+ int error = 0;
-+
-+ udev = sthcd_find_udev_by_ids(sthcd, idVendor, idProduct);
-+ if (!udev) {
-+ /* normally reached for ignored hubs */
-+ error = -ENODEV;
-+ } else {
-+ drv_printk(KERN_INFO, "removing device %04X.%04X\n",
-+ idVendor, idProduct);
-+ sthcd_udev_exit(udev);
-+
-+ spin_lock_irqsave(&sthcd->lock, flags);
-+
-+ port = udev_to_port(udev);
-+ clear_bit(__STHCD_PORT_INUSE, &port->flags);
-+ clear_bit(__STHCD_PORT_DOOMED, &port->flags);
-+ port->nr_resets = 0;
-+ /* notify a disconnection event */
-+ old_status = port->status_change;
-+ port->status_change = USB_PORT_STAT_POWER;
-+ if ((old_status & USB_PORT_STAT_CONNECTION) != 0)
-+ port->status_change |= (USB_PORT_STAT_C_CONNECTION<<16);
-+
-+ spin_unlock_irqrestore(&sthcd->lock, flags);
-+ }
-+ return error;
-+}
-+
-+
-+/*
-+ * Non-atomic context (synchronous call).
-+ */
-+static int sthcd_usb_control_msg(int fd,
-+ __u8 request, __u8 requesttype,
-+ __u16 value, __u16 index,
-+ void *data, __u16 size,
-+ int timeout)
-+{
-+ struct sthcd_ctrl_params_in *params_in;
-+ struct starlet_ioh_sg in[6];
-+ struct starlet_ioh_sg io[1];
-+ int error;
-+
-+ params_in = starlet_ioh_kzalloc(sizeof(*params_in));
-+ if (!params_in) {
-+ error = -ENOMEM;
-+ goto done;
-+ }
-+
-+ params_in->req.bRequestType = requesttype;
-+ params_in->req.bRequest = request;
-+ params_in->req.wValue = cpu_to_le16p(&value);
-+ params_in->req.wIndex = cpu_to_le16p(&index);
-+ params_in->req.wLength = cpu_to_le16p(&size);
-+ params_in->_unk1 = timeout; /* seconds? */
-+
-+ starlet_ioh_sg_init_table(in, 6);
-+ starlet_ioh_sg_entry(&in[0], &params_in->req.bRequestType);
-+ starlet_ioh_sg_entry(&in[1], &params_in->req.bRequest);
-+ starlet_ioh_sg_entry(&in[2], &params_in->req.wValue);
-+ starlet_ioh_sg_entry(&in[3], &params_in->req.wIndex);
-+ starlet_ioh_sg_entry(&in[4], &params_in->req.wLength);
-+ starlet_ioh_sg_entry(&in[5], &params_in->_unk1);
-+
-+ starlet_ioh_sg_init_table(io, 1);
-+ starlet_ioh_sg_set_buf(&io[0], data, size);
-+
-+ error = starlet_ioh_ioctlv(fd, STHCD_IOCTLV_CONTROLREQ,
-+ 6, in, 1, io);
-+
-+ starlet_ioh_kfree(params_in);
-+
-+ if (error > 0) {
-+ /* adjust size for successful control xfers */
-+ error -= sizeof(struct usb_ctrlrequest);
-+ if (error < 0)
-+ error = -EINVAL;
-+ }
-+
-+done:
-+ if (error < 0)
-+ DBG("%s: error=%d (%x)\n", __func__, error, error);
-+ return error;
-+}
-+
-+
-+static int sthcd_oh_check_hub(struct sthcd_oh *oh, u16 idVendor, u16 idProduct)
-+{
-+ char pathname[32];
-+ struct usb_device_descriptor *descriptor;
-+ int fd;
-+ int i;
-+ int retval;
-+
-+ descriptor = starlet_ioh_kzalloc(USB_DT_DEVICE_SIZE);
-+ if (!descriptor) {
-+ retval = -ENOMEM;
-+ goto done;
-+ }
-+
-+ snprintf(pathname, sizeof(pathname), "/dev/usb/oh%u/%04x/%04x",
-+ oh->index, idVendor, idProduct);
-+ retval = starlet_open(pathname, 0);
-+ if (retval < 0) {
-+ drv_printk(KERN_ERR, "open %s failed\n", pathname);
-+ starlet_ioh_kfree(descriptor);
-+ goto done;
-+ }
-+ fd = retval;
-+
-+ for (i = 0; i < 3; i++) {
-+ retval = sthcd_usb_control_msg(fd, USB_REQ_GET_DESCRIPTOR,
-+ USB_DIR_IN,
-+ USB_DT_DEVICE << 8, 0,
-+ descriptor, USB_DT_DEVICE_SIZE,
-+ 0);
-+ if (retval != -7005)
-+ break;
-+ DBG("%s: attempt %d, retval=%d (%x)\n", __func__,
-+ i, retval, retval);
-+ }
-+
-+ starlet_close(fd);
-+
-+ if (retval >= USB_DT_DEVICE_SIZE) {
-+ /* tell if a hub was found */
-+ retval = (descriptor->bDeviceClass == USB_CLASS_HUB) ? 1 : 0;
-+ } else {
-+ if (retval >= 0)
-+ retval = -EINVAL; /* short descriptor */
-+ }
-+
-+ starlet_ioh_kfree(descriptor);
-+
-+done:
-+ if (retval < 0)
-+ DBG("%s: retval=%d (%x)\n", __func__, retval, retval);
-+ return retval;
-+}
-+
-+struct sthcd_getdevicelist_params_in {
-+ u8 devid_count;
-+ u8 _type;
-+};
-+struct sthcd_getdevicelist_params_io {
-+ u8 devid_count;
-+ struct sthcd_devid devids[0];
-+};
-+
-+static int sthcd_get_device_list(struct sthcd_hcd *sthcd, int fd,
-+ struct sthcd_devid *devids, size_t nr_devids)
-+{
-+ struct starlet_ioh_sg in[2], io[2];
-+ struct sthcd_getdevicelist_params_in *params_in;
-+ struct sthcd_getdevicelist_params_io *params_io;
-+ size_t size = nr_devids * sizeof(struct sthcd_devid);
-+ int error;
-+
-+ if (!nr_devids)
-+ return -EINVAL;
-+
-+ params_in = starlet_ioh_kzalloc(sizeof(*params_in));
-+ if (!params_in)
-+ return -ENOMEM;
-+
-+ params_io = starlet_ioh_kzalloc(sizeof(*params_io) + size);
-+ if (!params_io) {
-+ starlet_ioh_kfree(params_in);
-+ return -ENOMEM;
-+ }
-+
-+ params_in->devid_count = nr_devids;
-+ params_in->_type = 0;
-+
-+ starlet_ioh_sg_init_table(in, 2);
-+ starlet_ioh_sg_entry(&in[0], &params_in->devid_count);
-+ starlet_ioh_sg_entry(&in[1], &params_in->_type);
-+
-+ starlet_ioh_sg_init_table(io, 2);
-+ starlet_ioh_sg_entry(&io[0], &params_io->devid_count);
-+ starlet_ioh_sg_set_buf(&io[1], &params_io->devids, size);
-+
-+ error = starlet_ioh_ioctlv(fd, STHCD_IOCTLV_GETDEVICELIST,
-+ 2, in, 2, io);
-+
-+ if (error < 0) {
-+ DBG("%s: error=%d (%x)\n", __func__, error, error);
-+ } else {
-+ memcpy(devids, params_io->devids, size);
-+ error = params_io->devid_count;
-+ }
-+
-+ starlet_ioh_kfree(params_in);
-+ starlet_ioh_kfree(params_io);
-+
-+ return error;
-+}
-+
-+static int sthcd_devid_match(struct sthcd_devid *id1, struct sthcd_devid *id2)
-+{
-+ return id1->idVendor == id2->idVendor &&
-+ id1->idProduct == id2->idProduct;
-+}
-+
-+static int sthcd_devid_find(struct sthcd_devid *haystack, size_t count,
-+ struct sthcd_devid *needle)
-+{
-+ unsigned int i;
-+
-+ for (i = 0; i < count; i++) {
-+ if (sthcd_devid_match(&haystack[i], needle))
-+ return 1;
-+ }
-+ return 0;
-+}
-+
-+static int sthcd_oh_rescan(struct sthcd_oh *oh)
-+{
-+ static unsigned int poll_cycles;
-+ struct usb_hcd *hcd = sthcd_to_hcd(oh->hcd);
-+ struct sthcd_devid *p;
-+ int nr_new_devids, i;
-+ int changes;
-+ int error;
-+
-+ error = sthcd_get_device_list(oh->hcd, oh->fd, oh->new_devids,
-+ oh->max_devids);
-+ if (error < 0)
-+ return error;
-+
-+ nr_new_devids = error;
-+ changes = 0;
-+
-+ for (i = 0; i < oh->nr_devids; i++) {
-+ p = &oh->devids[i];
-+ if (!sthcd_devid_find(oh->new_devids, nr_new_devids, p)) {
-+ /* removal */
-+ error = sthcd_oh_remove_udev(oh, p->idVendor,
-+ p->idProduct);
-+ if (!error)
-+ changes++;
-+ }
-+ }
-+
-+ for (i = 0; i < nr_new_devids; i++) {
-+ p = &oh->new_devids[i];
-+ if (!sthcd_devid_find(oh->devids, oh->nr_devids, p)) {
-+ /* insertion */
-+ error = sthcd_oh_check_hub(oh, p->idVendor,
-+ p->idProduct);
-+ if (error == 0) {
-+ /* not a hub, register the usb device */
-+ error = sthcd_oh_insert_udev(oh, p->idVendor,
-+ p->idProduct);
-+ if (!error)
-+ changes++;
-+ } else {
-+ drv_printk(KERN_INFO,
-+ "ignoring hub %04X.%04X\n",
-+ p->idVendor, p->idProduct);
-+ }
-+ }
-+ }
-+
-+ memcpy(oh->devids, oh->new_devids, nr_new_devids * sizeof(*p));
-+ oh->nr_devids = nr_new_devids;
-+
-+ /*
-+ * FIXME
-+ * We ask here the USB layer to explicitly poll for root hub changes
-+ * until we get at least two complete rescan cycles without changes.
-+ *
-+ * Otherwise, for unknown reasons, we end up missing the detection of
-+ * some devices, even if the insertion/removal of these devices is
-+ * properly signaled in port->status_change.
-+ */
-+ if (changes) {
-+#if 1
-+ if (!poll_cycles) {
-+ hcd->poll_rh = 1;
-+ usb_hcd_poll_rh_status(hcd);
-+ }
-+ poll_cycles = 2;
-+ } else {
-+ if (!poll_cycles)
-+ hcd->poll_rh = 0;
-+ else
-+ poll_cycles--;
-+#else
-+ usb_hcd_poll_rh_status(hcd);
-+#endif
-+ }
-+
-+ return 0;
-+}
-+
-+static int sthcd_oh_init(struct sthcd_oh *oh, unsigned int index,
-+ struct sthcd_hcd *sthcd, size_t max_devids)
-+{
-+ char pathname[16];
-+ int error;
-+
-+ if (index != 0 && index != 1)
-+ return -EINVAL;
-+
-+ snprintf(pathname, sizeof(pathname), "/dev/usb/oh%u", index);
-+ error = starlet_open(pathname, 0);
-+ if (error < 0)
-+ return error;
-+
-+ oh->fd = error;
-+ oh->devids = kzalloc(2 * max_devids * sizeof(struct sthcd_devid),
-+ GFP_KERNEL);
-+ if (!oh->devids) {
-+ starlet_close(oh->fd);
-+ return -ENOMEM;
-+ }
-+
-+ oh->new_devids = oh->devids + max_devids;
-+
-+ oh->max_devids = max_devids;
-+ oh->nr_devids = 0;
-+
-+ oh->index = index;
-+ oh->hcd = sthcd;
-+
-+ return 0;
-+}
-+
-+static void sthcd_oh_exit(struct sthcd_oh *oh)
-+{
-+ starlet_close(oh->fd);
-+ oh->fd = -1;
-+ kfree(oh->devids);
-+ oh->devids = NULL;
-+}
-+
-+static int sthcd_rescan_thread(void *arg)
-+{
-+ struct sthcd_hcd *sthcd = arg;
-+ struct sthcd_oh *oh;
-+
-+ /*
-+ * REVISIT
-+ * We may need to rescan oh1 if bluetooth dongle disconnects.
-+ */
-+
-+ /* oh1 has non-removable devices only, so just scan it once */
-+ sthcd_oh_rescan(&sthcd->oh[1]);
-+
-+ oh = &sthcd->oh[0];
-+
-+ while (!kthread_should_stop()) {
-+ sthcd_oh_rescan(oh);
-+
-+ /* re-check again after the configured interval */
-+ sleep_on_timeout(&sthcd->rescan_waitq,
-+ STHCD_RESCAN_INTERVAL*HZ);
-+ }
-+ return 0;
-+}
-+
-+
-+/*
-+ *
-+ *
-+ */
-+
-+static int sthcd_init(struct usb_hcd *hcd)
-+{
-+ return 0;
-+}
-+
-+static int sthcd_start(struct usb_hcd *hcd)
-+{
-+ struct sthcd_hcd *sthcd = hcd_to_sthcd(hcd);
-+ int error;
-+
-+ /*
-+ * This is to prevent a spurious error from the kernel usb stack
-+ * as we do not make use of interrupts.
-+ */
-+ set_bit(HCD_FLAG_SAW_IRQ, &hcd->flags);
-+
-+ hcd->uses_new_polling = 1;
-+
-+ /* oh0 is the external bus */
-+ error = sthcd_oh_init(&sthcd->oh[0], 0, sthcd, STHCD_MAX_DEVIDS);
-+ if (error < 0) {
-+ DBG("%s: error=%d (%x)\n", __func__, error, error);
-+ return error;
-+ }
-+
-+ /* oh1 is the internal bus, used only by the bluetooth dongle */
-+ error = sthcd_oh_init(&sthcd->oh[1], 1, sthcd, 1);
-+ if (error < 0) {
-+ DBG("%s: error=%d (%x)\n", __func__, error, error);
-+ sthcd_oh_exit(&sthcd->oh[0]);
-+ return error;
-+ }
-+
-+ hcd->state = HC_STATE_RUNNING;
-+
-+ /* device insertion/removal is managed by the rescan thread */
-+ sthcd->rescan_task = kthread_run(sthcd_rescan_thread, sthcd, "ksthcd");
-+ if (IS_ERR(sthcd->rescan_task))
-+ drv_printk(KERN_ERR, "failed to start rescan thread\n");
-+
-+ return 0;
-+}
-+
-+static void sthcd_stop(struct usb_hcd *hcd)
-+{
-+ struct sthcd_hcd *sthcd = hcd_to_sthcd(hcd);
-+
-+ if (!IS_ERR(sthcd->rescan_task)) {
-+ kthread_stop(sthcd->rescan_task);
-+ sthcd->rescan_task = ERR_PTR(-EINVAL);
-+ }
-+
-+ sthcd_oh_exit(&sthcd->oh[0]);
-+ sthcd_oh_exit(&sthcd->oh[1]);
-+
-+ hcd->state &= ~HC_STATE_RUNNING;
-+}
-+
-+static int sthcd_get_frame_number(struct usb_hcd *hcd)
-+{
-+ DBG("%s: CALLED\n", __func__);
-+ return 0;
-+}
-+
-+
-+static int sthcd_urb_enqueue(struct usb_hcd *hcd, struct urb *urb,
-+ gfp_t mem_flags)
-+{
-+ struct sthcd_hcd *sthcd = hcd_to_sthcd(hcd);
-+ struct usb_host_endpoint *ep;
-+ struct sthcd_pep *pep;
-+ unsigned long flags;
-+ int error;
-+
-+ spin_lock_irqsave(&sthcd->lock, flags);
-+
-+ /* REVISIT, paranoid */
-+ if (urb->status != -EINPROGRESS) {
-+ DBG("%s: status != -EINPROGRESS\n", __func__);
-+ error = urb->status;
-+ goto done;
-+ }
-+
-+ error = usb_hcd_link_urb_to_ep(hcd, urb);
-+ if (error)
-+ goto done;
-+
-+ ep = urb->ep;
-+
-+ /* allocate a pep for each endpoint on first use */
-+ if (!ep->hcpriv) {
-+ pep = sthcd_pep_alloc(sthcd, ep);
-+ if (!pep) {
-+ error = -ENOMEM;
-+ goto err_linked;
-+ }
-+ ep->hcpriv = pep;
-+ } else {
-+ pep = ep->hcpriv;
-+ }
-+
-+ error = sthcd_pep_send_urb(pep, urb);
-+ if (!error)
-+ goto done;
-+
-+err_linked:
-+ usb_hcd_unlink_urb_from_ep(hcd, urb);
-+done:
-+ spin_unlock_irqrestore(&sthcd->lock, flags);
-+ return error;
-+}
-+
-+static int sthcd_urb_dequeue(struct usb_hcd *hcd, struct urb *urb, int status)
-+{
-+ struct sthcd_hcd *sthcd = hcd_to_sthcd(hcd);
-+ struct usb_host_endpoint *ep;
-+ struct sthcd_pep *pep;
-+ unsigned long flags;
-+ int error;
-+
-+ spin_lock_irqsave(&sthcd->lock, flags);
-+
-+ error = usb_hcd_check_unlink_urb(hcd, urb, status);
-+ if (error)
-+ goto done;
-+
-+ ep = urb->ep;
-+ pep = ep_to_pep(ep);
-+ if (pep && pep->urb == urb) {
-+ /*
-+ * There is an urb in flight.
-+ *
-+ * We deattach the urb from the pep and leave the pep to the
-+ * callback function, which will free it upon completion,
-+ * without further action.
-+ */
-+ sthcd_pep_takeout_urb(pep);
-+ ep->hcpriv = NULL;
-+ }
-+
-+ usb_hcd_unlink_urb_from_ep(hcd, urb);
-+ sthcd_giveback_urb(sthcd, urb, status);
-+
-+done:
-+ spin_unlock_irqrestore(&sthcd->lock, flags);
-+
-+#if 0
-+ if (error < 0)
-+ DBG("%s: error=%d (%x)\n", __func__, error, error);
-+#endif
-+ return error;
-+}
-+
-+static void sthcd_endpoint_disable(struct usb_hcd *hcd,
-+ struct usb_host_endpoint *ep)
-+{
-+ struct sthcd_hcd *sthcd = hcd_to_sthcd(hcd);
-+ struct sthcd_pep *pep;
-+ unsigned long flags;
-+
-+ spin_lock_irqsave(&sthcd->lock, flags);
-+ pep = ep->hcpriv;
-+
-+ /* do nothing if the pep was already freed */
-+ if (!pep)
-+ goto done;
-+
-+ if (pep->urb) {
-+ /*
-+ * There is an urb in flight.
-+ *
-+ * Disable the private endpoint and take the urb out of it.
-+ * The callback function will take care of freeing the pep
-+ * when the starlet call completes.
-+ */
-+ set_bit(__STHCD_PEP_DISABLED, &pep->flags);
-+ sthcd_pep_takeout_urb(pep);
-+ } else {
-+ /* the pep can be freed immediately when no urb is in flight */
-+ sthcd_pep_free(pep);
-+ }
-+ ep->hcpriv = NULL;
-+
-+done:
-+ spin_unlock_irqrestore(&sthcd->lock, flags);
-+}
-+
-+
-+static const struct hc_driver starlet_hc_driver = {
-+ .description = DRV_MODULE_NAME,
-+ .product_desc = "Nintendo Wii USB Host Controller",
-+ .hcd_priv_size = sizeof(struct sthcd_hcd),
-+
-+ .irq = NULL,
-+ .flags = HCD_USB11,
-+
-+ /* REVISIT, power management calls not yet supported */
-+
-+ .reset = sthcd_init,
-+ .start = sthcd_start,
-+ .stop = sthcd_stop,
-+
-+ .get_frame_number = sthcd_get_frame_number,
-+
-+ .urb_enqueue = sthcd_urb_enqueue,
-+ .urb_dequeue = sthcd_urb_dequeue,
-+ .endpoint_disable = sthcd_endpoint_disable,
-+
-+ .hub_status_data = sthcd_hub_status_data,
-+ .hub_control = sthcd_hub_control,
-+};
-+
-+static int __devinit sthcd_driver_probe(struct device *dev)
-+{
-+ struct sthcd_hcd *sthcd;
-+ struct usb_hcd *hcd;
-+ int error = -ENOMEM;
-+
-+ /*
-+ * We can't use normal dma as starlet requires MEM2 buffers
-+ * to work properly in all cases.
-+ */
-+ dev->dma_mask = NULL;
-+
-+ hcd = usb_create_hcd(&starlet_hc_driver, dev, DRV_MODULE_NAME);
-+ if (!hcd)
-+ goto err;
-+
-+ sthcd = hcd_to_sthcd(hcd);
-+ spin_lock_init(&sthcd->lock);
-+
-+ sthcd->nr_ports = STHCD_MAX_PORTS;
-+ sthcd->ports = kzalloc(sthcd->nr_ports * sizeof(struct sthcd_port),
-+ GFP_KERNEL);
-+ if (!sthcd->ports)
-+ goto err_alloc_ports;
-+
-+ INIT_LIST_HEAD(&sthcd->device_list);
-+ init_waitqueue_head(&sthcd->rescan_waitq);
-+
-+ error = usb_add_hcd(hcd, 0, 0);
-+ if (error) {
-+ drv_printk(KERN_INFO, "%s: error %d adding hcd\n",
-+ __func__, error);
-+ goto err_add;
-+ }
-+
-+ return 0;
-+
-+err_add:
-+ kfree(sthcd->ports);
-+err_alloc_ports:
-+ usb_put_hcd(hcd);
-+err:
-+ return error;
-+}
-+
-+static int __devexit sthcd_driver_remove(struct device *dev)
-+{
-+ struct usb_hcd *hcd = dev_get_drvdata(dev);
-+ usb_remove_hcd(hcd);
-+ usb_put_hcd(hcd);
-+ return 0;
-+}
-+
-+
-+/*
-+ * Open Firmware platform device routines
-+ *
-+ */
-+
-+static int __init sthcd_of_probe(struct of_device *odev,
-+ const struct of_device_id *match)
-+{
-+ return sthcd_driver_probe(&odev->dev);
-+}
-+
-+static int __exit sthcd_of_remove(struct of_device *odev)
-+{
-+ return sthcd_driver_remove(&odev->dev);
-+}
-+
-+static struct of_device_id sthcd_of_match[] = {
-+ { .compatible = "nintendo,starlet-hcd" },
-+ { },
-+};
-+
-+MODULE_DEVICE_TABLE(of, sthcd_of_match);
-+
-+static struct of_platform_driver sthcd_of_driver = {
-+ .owner = THIS_MODULE,
-+ .name = DRV_MODULE_NAME,
-+ .match_table = sthcd_of_match,
-+ .probe = sthcd_of_probe,
-+ .remove = sthcd_of_remove,
-+};
-+
-+
-+/*
-+ * Linux module framework
-+ *
-+ */
-+
-+static int __init sthcd_module_init(void)
-+{
-+ if (usb_disabled())
-+ return -ENODEV;
-+
-+ drv_printk(KERN_INFO, "%s - version %s\n", DRV_DESCRIPTION,
-+ sthcd_driver_version);
-+
-+ return of_register_platform_driver(&sthcd_of_driver);
-+}
-+
-+static void __exit sthcd_module_exit(void)
-+{
-+ of_unregister_platform_driver(&sthcd_of_driver);
-+}
-+
-+module_init(sthcd_module_init);
-+module_exit(sthcd_module_exit);
-+
-+MODULE_AUTHOR(DRV_AUTHOR);
-+MODULE_DESCRIPTION(DRV_DESCRIPTION);
-+MODULE_LICENSE("GPL");
-+
-diff --git a/drivers/video/Kconfig b/drivers/video/Kconfig
-index 3f3ce13..3e86331 100644
---- a/drivers/video/Kconfig
-+++ b/drivers/video/Kconfig
-@@ -1704,6 +1704,21 @@ config CARMINE_DRAM_CUSTOM
- Use custom board timings.
- endchoice
-
-+config FB_GAMECUBE
-+ bool "Nintendo GameCube/Wii frame buffer"
-+ depends on FB && GAMECUBE_COMMON
-+ select FB_CFB_FILLRECT
-+ select FB_CFB_COPYAREA
-+ select FB_CFB_IMAGEBLIT
-+ help
-+ This is the frame buffer device driver for the Nintendo GameCube.
-+
-+config FB_GAMECUBE_GX
-+ bool "Nintendo GameCube hardware accelerated graphics support"
-+ depends on FB_GAMECUBE && GAMECUBE && BROKEN
-+ help
-+ Say Y here to support the 3D hardware found in the Nintendo GameCube.
-+
- config FB_AU1100
- bool "Au1100 LCD Driver"
- depends on (FB = y) && MIPS && SOC_AU1100
-diff --git a/drivers/video/Makefile b/drivers/video/Makefile
-index e39e33e..45c7d0c 100644
---- a/drivers/video/Makefile
-+++ b/drivers/video/Makefile
-@@ -123,6 +123,8 @@ obj-$(CONFIG_FB_OMAP) += omap/
- obj-$(CONFIG_XEN_FBDEV_FRONTEND) += xen-fbfront.o
- obj-$(CONFIG_FB_CARMINE) += carminefb.o
- obj-$(CONFIG_FB_MB862XX) += mb862xx/
-+obj-$(CONFIG_FB_GAMECUBE) += gcnfb.o
-+obj-$(CONFIG_FB_GAMECUBE_GX) += gcngx.o
-
- # Platform or fallback drivers go here
- obj-$(CONFIG_FB_UVESA) += uvesafb.o
-diff --git a/drivers/video/gcnfb.c b/drivers/video/gcnfb.c
-new file mode 100644
-index 0000000..d29fa01
---- /dev/null
-+++ b/drivers/video/gcnfb.c
-@@ -0,0 +1,1087 @@
-+/*
-+ * drivers/video/gcn-vifb.c
-+ *
-+ * Nintendo GameCube/Wii Video Interface (VI) frame buffer driver
-+ * Copyright (C) 2004-2009 The GameCube Linux Team
-+ * Copyright (C) 2004 Michael Steil <mist@c64.org>
-+ * Copyright (C) 2004,2005 Todd Jeffreys <todd@voidpointer.org>
-+ * Copyright (C) 2006,2007,2008,2009 Albert Herranz
-+ *
-+ * Based on vesafb (c) 1998 Gerd Knorr <kraxel@goldbach.in-berlin.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.
-+ *
-+ */
-+
-+#include <linux/delay.h>
-+#include <linux/errno.h>
-+#include <linux/fb.h>
-+#include <linux/init.h>
-+#include <linux/interrupt.h>
-+#include <linux/kernel.h>
-+#include <linux/mm.h>
-+#include <linux/module.h>
-+#include <linux/of_platform.h>
-+#include <linux/string.h>
-+#include <linux/tty.h>
-+#include <linux/wait.h>
-+#include <linux/io.h>
-+
-+#define DRV_MODULE_NAME "gcn-vifb"
-+#define DRV_DESCRIPTION "Nintendo GameCube/Wii Video Interface (VI) driver"
-+#define DRV_AUTHOR "Michael Steil <mist@c64.org>, " \
-+ "Todd Jeffreys <todd@voidpointer.org>, " \
-+ "Albert Herranz"
-+
-+static char vifb_driver_version[] = "1.0i";
-+
-+#define drv_printk(level, format, arg...) \
-+ printk(level DRV_MODULE_NAME ": " format , ## arg)
-+
-+
-+/*
-+ * Hardware registers.
-+ */
-+#define VI_DCR 0x02
-+#define VI_HTR0 0x04
-+#define VI_TFBL 0x1c
-+#define VI_TFBR 0x20
-+#define VI_BFBL 0x24
-+#define VI_BFBR 0x28
-+#define VI_DPV 0x2c
-+
-+#define VI_DI0 0x30
-+#define VI_DI1 0x34
-+#define VI_DI2 0x38
-+#define VI_DI3 0x3C
-+#define VI_DI_INT (1 << 31)
-+#define VI_DI_ENB (1 << 28)
-+#define VI_DI_VCT_SHIFT 16
-+#define VI_DI_VCT_MASK 0x03FF0000
-+#define VI_DI_HCT_SHIFT 0
-+#define VI_DI_HCT_MASK 0x000003FF
-+
-+#define VI_VISEL 0x6e
-+#define VI_VISEL_PROGRESSIVE (1 << 0)
-+
-+
-+/*
-+ * Video control data structure.
-+ */
-+struct vi_ctl {
-+ spinlock_t lock;
-+
-+ void __iomem *io_base;
-+ unsigned int irq;
-+
-+ int in_vtrace;
-+ wait_queue_head_t vtrace_waitq;
-+
-+ int visible_page;
-+ unsigned long page_address[2];
-+ unsigned long flip_pending;
-+
-+ struct fb_info *info;
-+};
-+
-+
-+/*
-+ * Video mode handling
-+ */
-+
-+struct vi_video_mode {
-+ char *name;
-+ const u32 *regs;
-+ int width;
-+ int height;
-+ int lines;
-+};
-+
-+static const u32 vi_Mode640X480NtscYUV16[32] = {
-+ 0x0F060001, 0x476901AD, 0x02EA5140, 0x00030018,
-+ 0x00020019, 0x410C410C, 0x40ED40ED, 0x00435A4E,
-+ 0x00000000, 0x00435A4E, 0x00000000, 0x00000000,
-+ 0x110701AE, 0x10010001, 0x00010001, 0x00010001,
-+ 0x00000000, 0x00000000, 0x28500100, 0x1AE771F0,
-+ 0x0DB4A574, 0x00C1188E, 0xC4C0CBE2, 0xFCECDECF,
-+ 0x13130F08, 0x00080C0F, 0x00FF0000, 0x00000000,
-+ 0x02800000, 0x000000FF, 0x00FF00FF, 0x00FF00FF
-+};
-+
-+static const u32 vi_Mode640x480NtscProgressiveYUV16[32] = {
-+ 0x1e0c0005, 0x476901ad, 0x02ea5140, 0x00060030,
-+ 0x00060030, 0x81d881d8, 0x81d881d8, 0x10000000,
-+ 0x00000000, 0x00000000, 0x00000000, 0x037702b6,
-+ 0x90010001, 0x00000000, 0x00000000, 0x00000000,
-+ 0x00000000, 0x00000000, 0x28280100, 0x1ae771f0,
-+ 0x0db4a574, 0x00c1188e, 0xc4c0cbe2, 0xfcecdecf,
-+ 0x13130f08, 0x00080c0f, 0x00ff0000, 0x00010001,
-+ 0x02800000, 0x000000ff, 0x00ff00ff, 0x00ff00ff,
-+};
-+
-+static const u32 vi_Mode640X576Pal50YUV16[32] = {
-+ 0x11F50101, 0x4B6A01B0, 0x02F85640, 0x00010023,
-+ 0x00000024, 0x4D2B4D6D, 0x4D8A4D4C, 0x0066D480,
-+ 0x00000000, 0x0066D980, 0x00000000, 0x00C901F3,
-+ 0x913901B1, 0x90010001, 0x00010001, 0x00010001,
-+ 0x00000000, 0x00000000, 0x28500100, 0x1AE771F0,
-+ 0x0DB4A574, 0x00C1188E, 0xC4C0CBE2, 0xFCECDECF,
-+ 0x13130F08, 0x00080C0F, 0x00FF0000, 0x00000000,
-+ 0x02800000, 0x000000FF, 0x00FF00FF, 0x00FF00FF
-+};
-+
-+static const u32 vi_Mode640X480Pal60YUV16[32] = {
-+ 0x0F060001, 0x476901AD, 0x02EA5140, 0x00030018,
-+ 0x00020019, 0x410C410C, 0x40ED40ED, 0x0066D480,
-+ 0x00000000, 0x0066D980, 0x00000000, 0x00C9010F,
-+ 0x910701AE, 0x90010001, 0x00010001, 0x00010001,
-+ 0x00000000, 0x00000000, 0x28500100, 0x1AE771F0,
-+ 0x0DB4A574, 0x00C1188E, 0xC4C0CBE2, 0xFCECDECF,
-+ 0x13130F08, 0x00080C0F, 0x00FF0000, 0x00000000,
-+ 0x02800000, 0x000000FF, 0x00FF00FF, 0x00FF00FF
-+};
-+
-+static struct vi_video_mode vi_video_modes[] = {
-+#define VI_VM_NTSC 0
-+ [VI_VM_NTSC] = {
-+ .name = "NTSC/PAL60 480i",
-+ .regs = vi_Mode640X480NtscYUV16,
-+ .width = 640,
-+ .height = 480,
-+ .lines = 525,
-+ },
-+#define VI_VM_NTSC_PROGRESSIVE (VI_VM_NTSC+1)
-+ [VI_VM_NTSC_PROGRESSIVE] = {
-+ .name = "NTSC 480p",
-+ .regs = vi_Mode640x480NtscProgressiveYUV16,
-+ .width = 640,
-+ .height = 480,
-+ .lines = 525,
-+ },
-+#define VI_VM_PAL50 (VI_VM_NTSC_PROGRESSIVE+1)
-+ [VI_VM_PAL50] = {
-+ .name = "PAL50 576i",
-+ .regs = vi_Mode640X576Pal50YUV16,
-+ .width = 640,
-+ .height = 576,
-+ .lines = 625,
-+ },
-+#define VI_VM_PAL60 (VI_VM_PAL50+1)
-+ [VI_VM_PAL60] = {
-+ /* this seems to be actually the same as NTSC 480i */
-+ .name = "PAL60 480i",
-+ .regs = vi_Mode640X480Pal60YUV16,
-+ .width = 640,
-+ .height = 480,
-+ .lines = 525,
-+ },
-+};
-+
-+
-+static struct fb_fix_screeninfo vifb_fix = {
-+ .id = DRV_MODULE_NAME,
-+ .type = FB_TYPE_PACKED_PIXELS,
-+ .visual = FB_VISUAL_TRUECOLOR, /* lies, lies, lies, ... */
-+ .accel = FB_ACCEL_NONE,
-+};
-+
-+static struct fb_var_screeninfo vifb_var = {
-+ .bits_per_pixel = 16,
-+ .activate = FB_ACTIVATE_NOW,
-+ .height = -1,
-+ .width = -1,
-+ .right_margin = 32,
-+ .upper_margin = 16,
-+ .lower_margin = 4,
-+ .vsync_len = 4,
-+ .vmode = FB_VMODE_INTERLACED,
-+};
-+
-+/*
-+ * setup parameters
-+ */
-+static struct vi_video_mode *vi_current_video_mode;
-+static int ypan = 1; /* 0..nothing, 1..ypan */
-+
-+/* FIXME: is this really needed? */
-+static u32 pseudo_palette[17];
-+
-+
-+/* some glue to the gx side */
-+static inline void gcngx_dispatch_vtrace(struct vi_ctl *ctl)
-+{
-+#ifdef CONFIG_FB_GAMECUBE_GX
-+ gcngx_vtrace(ctl);
-+#endif
-+}
-+
-+
-+/*
-+ *
-+ * Color space handling.
-+ */
-+
-+/*
-+ * RGB to YCbYCr conversion support bits.
-+ * We are using here the ITU.BT-601 Y'CbCr standard.
-+ *
-+ * References:
-+ * - "Colour Space Conversions" by Adrian Ford and Alan Roberts, 1998
-+ * (google for coloureq.pdf)
-+ *
-+ */
-+
-+#define RGB2YUV_SHIFT 16
-+#define RGB2YUV_LUMA 16
-+#define RGB2YUV_CHROMA 128
-+
-+#define Yr ((int)(0.299 * (1<<RGB2YUV_SHIFT)))
-+#define Yg ((int)(0.587 * (1<<RGB2YUV_SHIFT)))
-+#define Yb ((int)(0.114 * (1<<RGB2YUV_SHIFT)))
-+
-+#define Ur ((int)(-0.169 * (1<<RGB2YUV_SHIFT)))
-+#define Ug ((int)(-0.331 * (1<<RGB2YUV_SHIFT)))
-+#define Ub ((int)(0.500 * (1<<RGB2YUV_SHIFT)))
-+
-+#define Vr ((int)(0.500 * (1<<RGB2YUV_SHIFT))) /* same as Ub */
-+#define Vg ((int)(-0.419 * (1<<RGB2YUV_SHIFT)))
-+#define Vb ((int)(-0.081 * (1<<RGB2YUV_SHIFT)))
-+
-+/*
-+ * Converts two 16bpp rgb pixels into a dual yuy2 pixel.
-+ */
-+static inline uint32_t rgbrgb16toycbycr(uint16_t rgb1, uint16_t rgb2)
-+{
-+ register int Y1, Cb, Y2, Cr;
-+ register int r1, g1, b1;
-+ register int r2, g2, b2;
-+ register int r, g, b;
-+
-+ /* fast path, thanks to bohdy */
-+ if (!(rgb1 | rgb2))
-+ return 0x00800080; /* black, black */
-+
-+ /* RGB565 */
-+ r1 = ((rgb1 >> 11) & 0x1f);
-+ g1 = ((rgb1 >> 5) & 0x3f);
-+ b1 = ((rgb1 >> 0) & 0x1f);
-+
-+ /* fast (approximated) scaling to 8 bits, thanks to Masken */
-+ r1 = (r1 << 3) | (r1 >> 2);
-+ g1 = (g1 << 2) | (g1 >> 4);
-+ b1 = (b1 << 3) | (b1 >> 2);
-+
-+ Y1 = clamp(((Yr * r1 + Yg * g1 + Yb * b1) >> RGB2YUV_SHIFT)
-+ + RGB2YUV_LUMA, 16, 235);
-+ if (rgb1 == rgb2) {
-+ /* this is just another fast path */
-+ Y2 = Y1;
-+ r = r1;
-+ g = g1;
-+ b = b1;
-+ } else {
-+ /* same as we did for r1 before */
-+ r2 = ((rgb2 >> 11) & 0x1f);
-+ g2 = ((rgb2 >> 5) & 0x3f);
-+ b2 = ((rgb2 >> 0) & 0x1f);
-+ r2 = (r2 << 3) | (r2 >> 2);
-+ g2 = (g2 << 2) | (g2 >> 4);
-+ b2 = (b2 << 3) | (b2 >> 2);
-+
-+ Y2 = clamp(((Yr * r2 + Yg * g2 + Yb * b2) >> RGB2YUV_SHIFT)
-+ + RGB2YUV_LUMA,
-+ 16, 235);
-+
-+ r = (r1 + r2) / 2;
-+ g = (g1 + g2) / 2;
-+ b = (b1 + b2) / 2;
-+ }
-+
-+ Cb = clamp(((Ur * r + Ug * g + Ub * b) >> RGB2YUV_SHIFT)
-+ + RGB2YUV_CHROMA, 16, 240);
-+ Cr = clamp(((Vr * r + Vg * g + Vb * b) >> RGB2YUV_SHIFT)
-+ + RGB2YUV_CHROMA, 16, 240);
-+
-+ return (((uint8_t) Y1) << 24) | (((uint8_t) Cb) << 16) |
-+ (((uint8_t) Y2) << 8) | (((uint8_t) Cr) << 0);
-+}
-+
-+/*
-+ *
-+ * Video hardware support.
-+ */
-+
-+/*
-+ * Get video mode reported by hardware.
-+ * 0=NTSC, 1=PAL, 2=MPAL, 3=debug
-+ */
-+static inline int vi_get_mode(struct vi_ctl *ctl)
-+{
-+ return (in_be16(ctl->io_base + VI_DCR) >> 8) & 3;
-+}
-+
-+static inline int vi_is_mode_ntsc(struct vi_ctl *ctl)
-+{
-+ return vi_get_mode(ctl) == 0;
-+}
-+
-+static inline int vi_is_mode_progressive(__u32 vmode)
-+{
-+ return (vmode & FB_VMODE_MASK) == FB_VMODE_NONINTERLACED;
-+}
-+
-+static inline int vi_can_do_progressive(struct vi_ctl *ctl)
-+{
-+ return in_be16(ctl->io_base + VI_VISEL) & VI_VISEL_PROGRESSIVE;
-+}
-+
-+static void vi_guess_mode(struct vi_ctl *ctl)
-+{
-+ void __iomem *io_base = ctl->io_base;
-+ u16 mode;
-+
-+ if (vi_current_video_mode == NULL) {
-+ /* auto detection */
-+ if (in_be32(io_base + VI_HTR0) == 0x4B6A01B0) {
-+ /* PAL50 */
-+ vi_current_video_mode = vi_video_modes + VI_VM_PAL50;
-+ } else {
-+ /* NTSC/PAL60 */
-+ mode = vi_get_mode(ctl);
-+ switch (mode) {
-+ case 0: /* NTSC */
-+ /* check if we can support progressive */
-+ vi_current_video_mode =
-+ vi_video_modes +
-+ (vi_can_do_progressive(ctl) ?
-+ VI_VM_NTSC_PROGRESSIVE : VI_VM_NTSC);
-+ break;
-+ /* XXX this code is never reached */
-+ case 1: /* PAL60 */
-+ vi_current_video_mode =
-+ vi_video_modes + VI_VM_PAL60;
-+ break;
-+ default: /* MPAL or DEBUG, we don't support */
-+ break;
-+ }
-+ }
-+ }
-+
-+ /* if we get here something wrong happened */
-+ if (vi_current_video_mode == NULL) {
-+ drv_printk(KERN_DEBUG, "failed to guess video mode,"
-+ "using NTSC\n");
-+ vi_current_video_mode = vi_video_modes + VI_VM_NTSC;
-+ }
-+}
-+
-+/*
-+ * Set the address from where the video encoder will display data on screen.
-+ */
-+void vi_set_framebuffer(struct vi_ctl *ctl, u32 addr)
-+{
-+ struct fb_info *info = ctl->info;
-+ void __iomem *io_base = ctl->io_base;
-+
-+ /* set top field */
-+ out_be32(io_base + VI_TFBL, 0x10000000 | (addr >> 5));
-+
-+ /* set bottom field */
-+ if (!vi_is_mode_progressive(info->var.vmode))
-+ addr += info->fix.line_length;
-+ out_be32(io_base + VI_BFBL, 0x10000000 | (addr >> 5));
-+}
-+
-+/*
-+ * Swap the visible and back pages.
-+ */
-+static inline void vi_flip_page(struct vi_ctl *ctl)
-+{
-+ ctl->visible_page ^= 1;
-+ vi_set_framebuffer(ctl, ctl->page_address[ctl->visible_page]);
-+
-+ ctl->flip_pending = 0;
-+}
-+
-+static void vi_enable_interrupts(struct vi_ctl *ctl, int enable)
-+{
-+ void __iomem *io_base = ctl->io_base;
-+ u16 vtrap, htrap;
-+
-+ if (enable) {
-+ /*
-+ * The vertical retrace happens while the beam moves from
-+ * the last drawn dot in the last line to the first dot in
-+ * the first line.
-+ */
-+
-+ /* XXX should we incorporate this in the video mode struct ? */
-+ vtrap = vi_current_video_mode->lines;
-+ htrap = vi_is_mode_ntsc(ctl) ? 430 : 433;
-+
-+ /* non-progressive needs interlacing */
-+ if (!(vi_is_mode_progressive(ctl->info->var.vmode)
-+ && vi_can_do_progressive(ctl))) {
-+ vtrap /= 2;
-+ }
-+
-+ /* first dot, first line */
-+ out_be32(io_base + VI_DI0,
-+ VI_DI_INT | VI_DI_ENB |
-+ (1 << VI_DI_VCT_SHIFT) | (1 << VI_DI_HCT_SHIFT));
-+ /* last dot, last line */
-+ out_be32(io_base + VI_DI1,
-+ VI_DI_INT | VI_DI_ENB |
-+ (vtrap << VI_DI_VCT_SHIFT) | (htrap << VI_DI_HCT_SHIFT));
-+ } else {
-+ out_be32(io_base + VI_DI0, 0);
-+ out_be32(io_base + VI_DI1, 0);
-+ }
-+ /* these two are currently not used */
-+ out_be32(io_base + VI_DI2, 0);
-+ out_be32(io_base + VI_DI3, 0);
-+}
-+
-+static void vi_dispatch_vtrace(struct vi_ctl *ctl)
-+{
-+ unsigned long flags;
-+
-+ spin_lock_irqsave(&ctl->lock, flags);
-+ if (ctl->flip_pending)
-+ vi_flip_page(ctl);
-+ spin_unlock_irqrestore(&ctl->lock, flags);
-+
-+ wake_up_interruptible(&ctl->vtrace_waitq);
-+}
-+
-+static irqreturn_t vi_irq_handler(int irq, void *dev)
-+{
-+ struct fb_info *info = dev_get_drvdata((struct device *)dev);
-+ struct vi_ctl *ctl = info->par;
-+ void __iomem *io_base = ctl->io_base;
-+ u32 val;
-+
-+ /* DI0 and DI1 are used to account for the vertical retrace */
-+ val = in_be32(io_base + VI_DI0);
-+ if (val & VI_DI_INT) {
-+ ctl->in_vtrace = 0;
-+ gcngx_dispatch_vtrace(ctl); /* backwards compatibility */
-+
-+ out_be32(io_base + VI_DI0, val & ~VI_DI_INT);
-+ return IRQ_HANDLED;
-+ }
-+ val = in_be32(io_base + VI_DI1);
-+ if (val & VI_DI_INT) {
-+ ctl->in_vtrace = 1;
-+ vi_dispatch_vtrace(ctl);
-+ gcngx_dispatch_vtrace(ctl); /* backwards compatibility */
-+
-+ out_be32(io_base + VI_DI1, val & ~VI_DI_INT);
-+ return IRQ_HANDLED;
-+ }
-+
-+ /* currently unused, just in case */
-+ val = in_be32(io_base + VI_DI2);
-+ if (val & VI_DI_INT) {
-+ out_be32(io_base + VI_DI2, val & ~VI_DI_INT);
-+ return IRQ_HANDLED;
-+ }
-+ val = in_be32(io_base + VI_DI3);
-+ if (val & VI_DI_INT) {
-+ out_be32(io_base + VI_DI3, val & ~VI_DI_INT);
-+ return IRQ_HANDLED;
-+ }
-+
-+ return IRQ_NONE;
-+}
-+
-+/*
-+ * Linux framebuffer support routines.
-+ *
-+ */
-+
-+/*
-+ * This is just a quick, dirty and cheap way of getting right colors on the
-+ * linux framebuffer console.
-+ */
-+unsigned int vifb_writel(unsigned int rgbrgb, void *address)
-+{
-+ uint16_t *rgb = (uint16_t *)&rgbrgb;
-+ return fb_writel_real(rgbrgb16toycbycr(rgb[0], rgb[1]), address);
-+}
-+
-+/*
-+ * Restore the video hardware to sane defaults.
-+ */
-+int vifb_restorefb(struct fb_info *info)
-+{
-+ struct vi_ctl *ctl = info->par;
-+ void __iomem *io_base = ctl->io_base;
-+ int i;
-+ unsigned long flags;
-+
-+ /* set page 0 as the visible page and cancel pending flips */
-+ spin_lock_irqsave(&ctl->lock, flags);
-+ ctl->visible_page = 1;
-+ vi_flip_page(ctl);
-+ spin_unlock_irqrestore(&ctl->lock, flags);
-+
-+ /* initialize video registers */
-+ for (i = 0; i < 7; i++) {
-+ out_be32(io_base + i * sizeof(__u32),
-+ vi_current_video_mode->regs[i]);
-+ }
-+ out_be32(io_base + VI_TFBR,
-+ vi_current_video_mode->regs[VI_TFBR / sizeof(__u32)]);
-+ out_be32(io_base + VI_BFBR,
-+ vi_current_video_mode->regs[VI_BFBR / sizeof(__u32)]);
-+ out_be32(io_base + VI_DPV,
-+ vi_current_video_mode->regs[VI_DPV / sizeof(__u32)]);
-+ for (i = 16; i < 32; i++) {
-+ out_be32(io_base + i * sizeof(__u32),
-+ vi_current_video_mode->regs[i]);
-+ }
-+
-+ /* enable the video retrace handling */
-+ vi_enable_interrupts(ctl, 1);
-+
-+ return 0;
-+}
-+EXPORT_SYMBOL(vifb_restorefb);
-+
-+/*
-+ * FIXME: do we really need this?
-+ */
-+static int vifb_setcolreg(unsigned regno, unsigned red, unsigned green,
-+ unsigned blue, unsigned transp, struct fb_info *info)
-+{
-+ /*
-+ * Set a single color register. The values supplied are
-+ * already rounded down to the hardware's capabilities
-+ * (according to the entries in the `var' structure). Return
-+ * != 0 for invalid regno.
-+ */
-+
-+ if (regno >= info->cmap.len)
-+ return 1;
-+
-+ switch (info->var.bits_per_pixel) {
-+ case 16:
-+ if (info->var.red.offset == 10) {
-+ /* 1:5:5:5, not used currently */
-+ ((u32 *) (info->pseudo_palette))[regno] =
-+ ((red & 0xf800) >> 1) |
-+ ((green & 0xf800) >> 6) | ((blue & 0xf800) >> 11);
-+ } else {
-+ /* 0:5:6:5 */
-+ ((u32 *) (info->pseudo_palette))[regno] =
-+ ((red & 0xf800)) |
-+ ((green & 0xfc00) >> 5) | ((blue & 0xf800) >> 11);
-+ }
-+ break;
-+ case 8:
-+ case 15:
-+ case 24:
-+ case 32:
-+ break;
-+ }
-+ return 0;
-+}
-+
-+/*
-+ * Pan the display by altering the framebuffer address in hardware.
-+ */
-+static int vifb_pan_display(struct fb_var_screeninfo *var,
-+ struct fb_info *info)
-+{
-+ struct vi_ctl *ctl = info->par;
-+ unsigned long flags;
-+ int offset;
-+
-+ offset = (var->yoffset * info->fix.line_length) +
-+ var->xoffset * (var->bits_per_pixel / 8);
-+ vi_set_framebuffer(ctl, info->fix.smem_start + offset);
-+
-+ spin_lock_irqsave(&ctl->lock, flags);
-+ ctl->visible_page = (offset) ? 1 : 0;
-+ spin_unlock_irqrestore(&ctl->lock, flags);
-+
-+ return 0;
-+}
-+
-+static int vifb_ioctl(struct fb_info *info,
-+ unsigned int cmd, unsigned long arg)
-+{
-+ struct vi_ctl *ctl = info->par;
-+ void __user *argp;
-+ unsigned long flags;
-+ int page;
-+
-+ switch (cmd) {
-+ case FBIOWAITRETRACE:
-+ interruptible_sleep_on(&ctl->vtrace_waitq);
-+ return signal_pending(current) ? -EINTR : 0;
-+ case FBIOFLIPHACK:
-+ /*
-+ * If arg == NULL then
-+ * Try to flip the video page as soon as possible.
-+ * Returns the current visible video page number.
-+ */
-+ if (!arg) {
-+ spin_lock_irqsave(&ctl->lock, flags);
-+ if (ctl->in_vtrace)
-+ vi_flip_page(ctl);
-+ else
-+ ctl->flip_pending = 1;
-+ spin_unlock_irqrestore(&ctl->lock, flags);
-+ return ctl->visible_page;
-+ }
-+
-+ /*
-+ * If arg != NULL then
-+ * Wait until the video page number pointed by arg
-+ * is not visible.
-+ * Returns the current visible video page number.
-+ */
-+ argp = (void __user *)arg;
-+ if (copy_from_user(&page, argp, sizeof(int)))
-+ return -EFAULT;
-+
-+ if (page != 0 && page != 1)
-+ return -EINVAL;
-+
-+ spin_lock_irqsave(&ctl->lock, flags);
-+ ctl->flip_pending = 0;
-+ if (ctl->visible_page == page) {
-+ if (ctl->in_vtrace) {
-+ vi_flip_page(ctl);
-+ } else {
-+ ctl->flip_pending = 1;
-+ spin_unlock_irqrestore(&ctl->lock, flags);
-+ interruptible_sleep_on(&ctl->vtrace_waitq);
-+ return signal_pending(current) ?
-+ -EINTR : ctl->visible_page;
-+ }
-+ }
-+ spin_unlock_irqrestore(&ctl->lock, flags);
-+ return ctl->visible_page;
-+ }
-+#ifdef CONFIG_FB_GAMECUBE_GX
-+ /* see if the GX module will handle it */
-+ return gcngx_ioctl(info, cmd, arg);
-+#else
-+ return -EINVAL;
-+#endif
-+}
-+
-+/*
-+ * Set the video mode according to info->var.
-+ */
-+static int vifb_set_par(struct fb_info *info)
-+{
-+ /* just load sane default here */
-+ vifb_restorefb(info);
-+ return 0;
-+}
-+
-+/*
-+ * Check var and eventually tweak it to something supported.
-+ * Do not modify par here.
-+ */
-+static int vifb_check_var(struct fb_var_screeninfo *var, struct fb_info *info)
-+{
-+ struct vi_ctl *ctl = info->par;
-+
-+ /* check bpp */
-+ if (var->bits_per_pixel != 16 || /* check bpp */
-+ var->xres_virtual != vi_current_video_mode->width ||
-+ var->xres != vi_current_video_mode->width ||
-+ /* XXX isobel, do not break old sdl */
-+ var->yres_virtual > 2 * vi_current_video_mode->height ||
-+ var->yres > vi_current_video_mode->height ||
-+ (vi_is_mode_progressive(var->vmode) &&
-+ !vi_can_do_progressive(ctl))) { /* trying to set progressive? */
-+ return -EINVAL;
-+ }
-+ return 0;
-+}
-+
-+static int vifb_mmap(struct fb_info *info, struct vm_area_struct *vma)
-+{
-+ unsigned long off;
-+ unsigned long start;
-+ u32 len;
-+
-+ off = vma->vm_pgoff << PAGE_SHIFT;
-+
-+ /* frame buffer memory */
-+ start = info->fix.smem_start;
-+ len = PAGE_ALIGN((start & ~PAGE_MASK) + info->fix.smem_len);
-+ start &= PAGE_MASK;
-+ if ((vma->vm_end - vma->vm_start + off) > len)
-+ return -EINVAL;
-+ off += start;
-+ vma->vm_pgoff = off >> PAGE_SHIFT;
-+
-+ /* this is an IO map, tell maydump to skip this VMA */
-+ vma->vm_flags |= VM_IO | VM_RESERVED;
-+
-+ /* we share RAM between the cpu and the video hardware */
-+ vma->vm_page_prot = pgprot_noncached(vma->vm_page_prot);
-+
-+ if (io_remap_pfn_range(vma, vma->vm_start, off >> PAGE_SHIFT,
-+ vma->vm_end - vma->vm_start,
-+ vma->vm_page_prot))
-+ return -EAGAIN;
-+ return 0;
-+}
-+
-+
-+struct fb_ops vifb_ops = {
-+ .owner = THIS_MODULE,
-+ .fb_setcolreg = vifb_setcolreg,
-+ .fb_pan_display = vifb_pan_display,
-+ .fb_ioctl = vifb_ioctl,
-+ .fb_set_par = vifb_set_par,
-+ .fb_check_var = vifb_check_var,
-+ .fb_mmap = vifb_mmap,
-+ .fb_fillrect = cfb_fillrect,
-+ .fb_copyarea = cfb_copyarea,
-+ .fb_imageblit = cfb_imageblit,
-+};
-+
-+/*
-+ * Driver model helper routines.
-+ *
-+ */
-+
-+static int vifb_do_probe(struct device *dev,
-+ struct resource *mem, unsigned int irq,
-+ unsigned long xfb_start, unsigned long xfb_size)
-+{
-+ struct fb_info *info;
-+ struct vi_ctl *ctl;
-+
-+ int video_cmap_len;
-+ int err = -EINVAL;
-+
-+ info = framebuffer_alloc(sizeof(struct vi_ctl), dev);
-+ if (!info)
-+ goto err_framebuffer_alloc;
-+
-+ info->fbops = &vifb_ops;
-+ info->var = vifb_var;
-+ info->fix = vifb_fix;
-+ ctl = info->par;
-+ ctl->info = info;
-+
-+ /* first thing needed */
-+ ctl->io_base = ioremap(mem->start, mem->end - mem->start + 1);
-+ ctl->irq = irq;
-+
-+ vi_guess_mode(ctl);
-+
-+ info->var.xres = vi_current_video_mode->width;
-+ info->var.yres = vi_current_video_mode->height;
-+
-+ /* enable non-interlaced if it supports progressive */
-+ if (vi_can_do_progressive(ctl))
-+ info->var.vmode = FB_VMODE_NONINTERLACED;
-+
-+ /* horizontal line in bytes */
-+ info->fix.line_length = info->var.xres * (info->var.bits_per_pixel / 8);
-+
-+ /*
-+ * Location and size of the external framebuffer.
-+ */
-+ info->fix.smem_start = xfb_start;
-+ info->fix.smem_len = xfb_size;
-+
-+ if (!request_mem_region(info->fix.smem_start, info->fix.smem_len,
-+ DRV_MODULE_NAME)) {
-+ drv_printk(KERN_WARNING,
-+ "failed to request video memory at %p\n",
-+ (void *)info->fix.smem_start);
-+ }
-+
-+ info->screen_base = ioremap(info->fix.smem_start, info->fix.smem_len);
-+ if (!info->screen_base) {
-+ drv_printk(KERN_ERR,
-+ "failed to ioremap video memory at %p (%dk)\n",
-+ (void *)info->fix.smem_start,
-+ info->fix.smem_len / 1024);
-+ err = -EIO;
-+ goto err_ioremap;
-+ }
-+
-+ spin_lock_init(&ctl->lock);
-+ init_waitqueue_head(&ctl->vtrace_waitq);
-+
-+ ctl->visible_page = 0;
-+ ctl->page_address[0] = info->fix.smem_start;
-+ ctl->page_address[1] =
-+ info->fix.smem_start + info->var.yres * info->fix.line_length;
-+
-+ ctl->flip_pending = 0;
-+
-+ drv_printk(KERN_INFO,
-+ "framebuffer at 0x%p, mapped to 0x%p, size %dk\n",
-+ (void *)info->fix.smem_start, info->screen_base,
-+ info->fix.smem_len / 1024);
-+ drv_printk(KERN_INFO,
-+ "mode is %dx%dx%d, linelength=%d, pages=%d\n",
-+ info->var.xres, info->var.yres,
-+ info->var.bits_per_pixel,
-+ info->fix.line_length,
-+ info->fix.smem_len / (info->fix.line_length*info->var.yres));
-+
-+ info->var.xres_virtual = info->var.xres;
-+ info->var.yres_virtual = info->fix.smem_len / info->fix.line_length;
-+
-+ if (ypan && info->var.yres_virtual > info->var.yres) {
-+ drv_printk(KERN_INFO, "scrolling: pan, yres_virtual=%d\n",
-+ info->var.yres_virtual);
-+ } else {
-+ drv_printk(KERN_INFO, "scrolling: redraw, yres_virtual=%d\n",
-+ info->var.yres_virtual);
-+ info->var.yres_virtual = info->var.yres;
-+ ypan = 0;
-+ }
-+
-+ info->fix.ypanstep = ypan ? 1 : 0;
-+ info->fix.ywrapstep = 0;
-+ if (!ypan)
-+ info->fbops->fb_pan_display = NULL;
-+
-+ /* use some dummy values for timing to make fbset happy */
-+ info->var.pixclock = 10000000 / info->var.xres * 1000 / info->var.yres;
-+ info->var.left_margin = (info->var.xres / 8) & 0xf8;
-+ info->var.hsync_len = (info->var.xres / 8) & 0xf8;
-+
-+ /* we support ony 16 bits per pixel */
-+ info->var.red.offset = 11;
-+ info->var.red.length = 5;
-+ info->var.green.offset = 5;
-+ info->var.green.length = 6;
-+ info->var.blue.offset = 0;
-+ info->var.blue.length = 5;
-+ info->var.transp.offset = 0;
-+ info->var.transp.length = 0;
-+ video_cmap_len = 16;
-+
-+ info->pseudo_palette = pseudo_palette;
-+ if (fb_alloc_cmap(&info->cmap, video_cmap_len, 0)) {
-+ err = -ENOMEM;
-+ goto err_alloc_cmap;
-+ }
-+
-+ info->flags = FBINFO_FLAG_DEFAULT | (ypan) ? FBINFO_HWACCEL_YPAN : 0;
-+
-+ dev_set_drvdata(dev, info);
-+
-+ vi_enable_interrupts(ctl, 0);
-+
-+ err = request_irq(ctl->irq, vi_irq_handler, 0, DRV_MODULE_NAME, dev);
-+ if (err) {
-+ drv_printk(KERN_ERR, "unable to register IRQ %u\n", ctl->irq);
-+ goto err_request_irq;
-+ }
-+
-+ /* now register us */
-+ if (register_framebuffer(info) < 0) {
-+ err = -EINVAL;
-+ goto err_register_framebuffer;
-+ }
-+
-+ /* setup the framebuffer address */
-+ vifb_restorefb(info);
-+
-+#ifdef CONFIG_FB_GAMECUBE_GX
-+ err = gcngx_init(info);
-+ if (err)
-+ goto err_gcngx_init;
-+#endif
-+
-+ drv_printk(KERN_INFO, "fb%d: %s frame buffer device\n",
-+ info->node, info->fix.id);
-+
-+ return 0;
-+
-+#ifdef CONFIG_FB_GAMECUBE_GX
-+err_gcngx_init:
-+ unregister_framebuffer(info);
-+#endif
-+err_register_framebuffer:
-+ free_irq(ctl->irq, 0);
-+err_request_irq:
-+ fb_dealloc_cmap(&info->cmap);
-+err_alloc_cmap:
-+ iounmap(info->screen_base);
-+err_ioremap:
-+ release_mem_region(info->fix.smem_start, info->fix.smem_len);
-+
-+ dev_set_drvdata(dev, NULL);
-+ iounmap(ctl->io_base);
-+ framebuffer_release(info);
-+err_framebuffer_alloc:
-+ return err;
-+}
-+
-+static int vifb_do_remove(struct device *dev)
-+{
-+ struct fb_info *info = dev_get_drvdata(dev);
-+ struct vi_ctl *ctl = info->par;
-+
-+ if (!info)
-+ return -ENODEV;
-+
-+#ifdef CONFIG_FB_GAMECUBE_GX
-+ gcngx_exit(info);
-+#endif
-+ free_irq(ctl->irq, dev);
-+ unregister_framebuffer(info);
-+ fb_dealloc_cmap(&info->cmap);
-+ iounmap(info->screen_base);
-+ release_mem_region(info->fix.smem_start, info->fix.smem_len);
-+
-+ dev_set_drvdata(dev, NULL);
-+ iounmap(ctl->io_base);
-+ framebuffer_release(info);
-+ return 0;
-+}
-+
-+#ifndef MODULE
-+
-+static int __devinit vifb_setup(char *options)
-+{
-+ char *this_opt;
-+
-+ if (!options || !*options)
-+ return 0;
-+
-+ drv_printk(KERN_DEBUG, "options: %s\n", options);
-+
-+ while ((this_opt = strsep(&options, ",")) != NULL) {
-+ if (!*this_opt)
-+ continue;
-+
-+ if (!strcmp(this_opt, "redraw"))
-+ ypan = 0;
-+ else if (!strcmp(this_opt, "ypan"))
-+ ypan = 1;
-+ else if (!strcmp(this_opt, "ywrap"))
-+ ypan = 2;
-+ else if (!strncmp(this_opt, "tv=", 3)) {
-+ if (!strncmp(this_opt + 3, "PAL", 3))
-+ vi_current_video_mode =
-+ vi_video_modes + VI_VM_PAL50;
-+ else if (!strncmp(this_opt + 3, "NTSC", 4))
-+ vi_current_video_mode =
-+ vi_video_modes + VI_VM_NTSC;
-+ }
-+ }
-+ return 0;
-+}
-+
-+#endif /* MODULE */
-+
-+
-+/*
-+ * OF platform driver hooks.
-+ *
-+ */
-+
-+static int __init vifb_of_probe(struct of_device *odev,
-+ const struct of_device_id *match)
-+{
-+ struct resource res;
-+ const unsigned long *prop;
-+ unsigned long xfb_start, xfb_size;
-+ int retval;
-+
-+ retval = of_address_to_resource(odev->node, 0, &res);
-+ if (retval) {
-+ drv_printk(KERN_ERR, "no io memory range found\n");
-+ return -ENODEV;
-+ }
-+
-+ prop = of_get_property(odev->node, "xfb-start", NULL);
-+ if (!prop) {
-+ drv_printk(KERN_ERR, "no xfb start found\n");
-+ return -ENODEV;
-+ }
-+ xfb_start = *prop;
-+
-+ prop = of_get_property(odev->node, "xfb-size", NULL);
-+ if (!prop) {
-+ drv_printk(KERN_ERR, "no xfb size found\n");
-+ return -ENODEV;
-+ }
-+ xfb_size = *prop;
-+
-+ return vifb_do_probe(&odev->dev,
-+ &res, irq_of_parse_and_map(odev->node, 0),
-+ xfb_start, xfb_size);
-+}
-+
-+static int __exit vifb_of_remove(struct of_device *odev)
-+{
-+ return vifb_do_remove(&odev->dev);
-+}
-+
-+
-+static struct of_device_id vifb_of_match[] = {
-+ { .compatible = "nintendo,flipper-video", },
-+ { .compatible = "nintendo,hollywood-video", },
-+ { },
-+};
-+
-+MODULE_DEVICE_TABLE(of, vifb_of_match);
-+
-+static struct of_platform_driver vifb_of_driver = {
-+ .owner = THIS_MODULE,
-+ .name = DRV_MODULE_NAME,
-+ .match_table = vifb_of_match,
-+ .probe = vifb_of_probe,
-+ .remove = vifb_of_remove,
-+};
-+
-+/*
-+ * Module interface hooks
-+ *
-+ */
-+
-+static int __init vifb_init_module(void)
-+{
-+#ifndef MODULE
-+ char *option = NULL;
-+
-+ if (fb_get_options(DRV_MODULE_NAME, &option)) {
-+ /* for backwards compatibility */
-+ if (fb_get_options("gcnfb", &option))
-+ return -ENODEV;
-+ }
-+ vifb_setup(option);
-+#endif
-+
-+ drv_printk(KERN_INFO, "%s - version %s\n", DRV_DESCRIPTION,
-+ vifb_driver_version);
-+
-+ return of_register_platform_driver(&vifb_of_driver);
-+}
-+
-+static void __exit vifb_exit_module(void)
-+{
-+ of_unregister_platform_driver(&vifb_of_driver);
-+}
-+
-+module_init(vifb_init_module);
-+module_exit(vifb_exit_module);
-+
-+MODULE_DESCRIPTION(DRV_DESCRIPTION);
-+MODULE_AUTHOR(DRV_AUTHOR);
-+MODULE_LICENSE("GPL");
-+
-diff --git a/drivers/video/gcngx.c b/drivers/video/gcngx.c
-new file mode 100644
-index 0000000..3246617
---- /dev/null
-+++ b/drivers/video/gcngx.c
-@@ -0,0 +1,691 @@
-+/*
-+ * drivers/video/gcngx.c
-+ *
-+ * Nintendo GameCube GX driver extension
-+ * Copyright (C) 2004-2007 The GameCube Linux Team
-+ * Copyright (C) 2004,2005 Todd Jeffreys <todd@voidpointer.org>
-+ * Copyright (C) 2007 Albert Herranz
-+ *
-+ * Parts borrowed heavily from libogc. This driver would not have
-+ * been possible with this library. Thanks!
-+ *
-+ * This program is free software; you can redistribute it and/or
-+ * modify it under the terms of the 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 CONFIG_FB_GAMECUBE_GX
-+
-+#include <linux/module.h>
-+#include <linux/kernel.h>
-+#include <linux/errno.h>
-+#include <linux/mm.h>
-+#include <linux/fb.h>
-+#include <linux/console.h>
-+#include <linux/vt_kern.h>
-+#include <linux/interrupt.h>
-+#include <linux/wait.h>
-+#include <asm/pgtable.h>
-+#include <asm/atomic.h>
-+#include <asm/cacheflush.h>
-+
-+#error This driver is broken since ARCH=powerpc changes. A rewrite is needed.
-+
-+#ifdef CONFIG_PPC_MERGE
-+#include <platforms/embedded6xx/gamecube.h>
-+#else
-+#include <platforms/gamecube.h>
-+#endif
-+
-+#include "gcngx.h"
-+
-+/* Function definitions */
-+static inline void __GX_AckFifoInt(int isOver);
-+static inline void __GX_WriteFifoIntEnable(int over,int under);
-+static void gcngx_munmap(struct vm_area_struct *vma);
-+static void gcngx_free_munmap(struct vm_area_struct *vma);
-+static void gcngx_destroy_fifo(void);
-+static void gcngx_init_fifo(void);
-+
-+extern void vi_set_framebuffer(struct vi_ctl *ctl, u32 addr);
-+extern int gcnfb_restorefb(struct fb_info *info);
-+
-+extern struct fb_ops gcnfb_ops;
-+
-+/* Defines */
-+#define mtwpar(v) mtspr(921,v)
-+#define mfwpar(v) mfspr(921)
-+
-+#define GX_ENABLE 1
-+#define GX_DISABLE 0
-+#define GX_TRUE 1
-+#define GX_FALSE 0
-+#define _SHIFTL(v, s, w) \
-+ ((u32) (((u32)(v) & ((0x01 << (w)) - 1)) << (s)))
-+#define _SHIFTR(v, s, w) \
-+ ((u32)(((u32)(v) >> (s)) & ((0x01 << (w)) - 1)))
-+
-+#define IRQ_VIDEO 8
-+#define IRQ_PE_TOKEN 9
-+#define IRQ_PE_FINISH 10
-+#define IRQ_CP_FIFO 11
-+
-+#define VIDEO_MMAP_BASE 0x0C000000
-+#define VIDEO_MMAP_LENGTH 0x9000
-+
-+#define KMALLOC_BASE 0x0D000000
-+
-+#define VIDEO_PE_INTERRUPT ((void __iomem *)0xcc00100a)
-+#define VIDEO_PE_TOKEN ((void __iomem *)0xcc00100e)
-+#define VIDEO_PE_INTERRUPT_TOKEN_ENABLE (1 << 0)
-+#define VIDEO_PE_INTERRUPT_FINISH_ENABLE (1 << 1)
-+#define VIDEO_PE_INTERRUPT_TOKEN_INTERRUPT (1 << 2)
-+#define VIDEO_PE_INTERRUPT_FINISH_INTERRUPT (1 << 3)
-+
-+#define gcngx_disable_pe_interrupts() out_be16(VIDEO_PE_INTERRUPT,in_be16(VIDEO_PE_INTERRUPT) & ~(VIDEO_PE_INTERRUPT_TOKEN_ENABLE | VIDEO_PE_INTERRUPT_FINISH_ENABLE))
-+#define gcngx_enable_pe_interrupts() { out_be16(VIDEO_PE_INTERRUPT,in_be16(VIDEO_PE_INTERRUPT) | (VIDEO_PE_INTERRUPT_TOKEN_ENABLE | VIDEO_PE_INTERRUPT_FINISH_ENABLE | VIDEO_PE_INTERRUPT_TOKEN_INTERRUPT | VIDEO_PE_INTERRUPT_FINISH_INTERRUPT)); out_be16(VIDEO_PE_TOKEN, 0); }
-+
-+#define VIDEO_CP_SR ((volatile u16 __iomem *)0xcc000000)
-+#define VIDEO_CP_SR_OVERFLOW (1 << 0)
-+#define VIDEO_CP_SR_UNDERFLOW (1 << 1)
-+
-+#define VIDEO_CP_CR ((volatile u16 __iomem *)0xcc000002)
-+#define VIDEO_CP_CR_GP_FIFO_READ_ENABLE (1 << 0)
-+#define VIDEO_CP_CR_CP_IRQ_ENABLE (1 << 1)
-+#define VIDEO_CP_CR_OVERFLOW_IRQ_ENABLE (1 << 2)
-+#define VIDEO_CP_CR_UNDERFLOW_IRQ_ENABLE (1 << 3)
-+#define VIDEO_CP_CR_GP_LINK_ENABLE (1 << 4)
-+#define VIDEO_CP_CR_MASK (0x1F)
-+
-+#define SIG_PE_FINISH (SIGRTMIN+14)
-+#define SIG_PE_TOKEN (SIGRTMIN+15)
-+#define SIG_VTRACE_COMPLETE (SIGRTMIN+16)
-+
-+#define FIFO_PUTU8(x) (*((volatile u8*) WGPIPE) = (x))
-+#define FIFO_PUTU32(x) (*((volatile u32*)WGPIPE) = (x))
-+
-+#define LOAD_BP_REG(x) do { FIFO_PUTU8(0x61); FIFO_PUTU32(x); } while (0)
-+
-+/* Static data */
-+static struct task_struct *mmap_task;
-+static int overflow;
-+static u32 xfb[2];
-+static int currentFB = 0;
-+static int flipRequest = 0;
-+static u8 *mmap_fifo_base;
-+static u8 *phys_fifo_base;
-+static const u32 fifo_len = GCN_GX_FIFO_SIZE;
-+static struct vm_operations_struct gcngx_vm_ops =
-+{
-+ .close = gcngx_munmap,
-+};
-+static struct vm_operations_struct gcngx_vm_free_ops =
-+{
-+ .close = gcngx_free_munmap,
-+};
-+
-+static volatile u32* const _piReg = (volatile u32*)0xCC003000;
-+static volatile u16* const _cpReg = (volatile u16*)0xCC000000;
-+static volatile u16* const _peReg = (volatile u16*)0xCC001000;
-+static volatile u16* const _memReg = (volatile u16*)0xCC004000;
-+static volatile u32* const WGPIPE = (volatile u32*)0xCC008000;
-+
-+static irqreturn_t gcfb_fifo_irq_handler(int irq,void *dev_id)
-+{
-+ /* now handle the int */
-+ u16 val = in_be16(VIDEO_CP_SR);
-+
-+ /* ENABLE_RUMBLE(); */
-+
-+ if (val & VIDEO_CP_SR_OVERFLOW)
-+ {
-+ /* fifo overflow, must halt the current application */
-+ if (mmap_task)
-+ {
-+ printk(KERN_INFO "Man you are writing too fast! Slow down! I will make you!\n");
-+ set_task_state(mmap_task,TASK_UNINTERRUPTIBLE);
-+ overflow = 1;
-+ }
-+ __GX_AckFifoInt(1);
-+ __GX_WriteFifoIntEnable(GX_DISABLE,GX_ENABLE);
-+ return IRQ_HANDLED;
-+ }
-+ else if (val & VIDEO_CP_SR_UNDERFLOW)
-+ {
-+ /* underflow, resume the current application */
-+ if (mmap_task && overflow)
-+ {
-+ printk(KERN_INFO "OK dude, the GX has crunched the data, you can resume now\n");
-+ set_task_state(mmap_task,TASK_RUNNING);
-+ overflow = 0;
-+ }
-+ __GX_AckFifoInt(0);
-+ __GX_WriteFifoIntEnable(GX_ENABLE,GX_DISABLE);
-+ return IRQ_HANDLED;
-+ }
-+ return IRQ_NONE;
-+}
-+
-+void gcngx_vtrace(struct vi_ctl *ctl)
-+{
-+ struct siginfo sig;
-+ /* ok flip the image if we have a flip request.
-+ send signal on completion */
-+ if (mmap_task && flipRequest)
-+ {
-+ /* do the flip! */
-+ flipRequest = 0;
-+ /* setup the signal info and flip buffer pointers */
-+ currentFB = currentFB ? 0 : 1;
-+ sig.si_errno = xfb[currentFB];
-+ /* inform the hardware */
-+ vi_set_framebuffer(ctl, xfb[currentFB]);
-+ /* notify the process */
-+ sig.si_signo = SIG_VTRACE_COMPLETE;
-+ sig.si_code = 0;
-+ send_sig_info(SIG_VTRACE_COMPLETE,&sig,mmap_task);
-+ }
-+}
-+
-+static irqreturn_t gcfb_pe_finish_irq_handler(int irq,void *dev_id)
-+{
-+ u16 val;
-+ struct siginfo sig;
-+ /* ack the interrupt */
-+ val = in_be16(VIDEO_PE_INTERRUPT) | VIDEO_PE_INTERRUPT_FINISH_INTERRUPT;
-+ out_be16(VIDEO_PE_INTERRUPT, val);
-+
-+ /* send SIG_PE_FINISH to the process */
-+ if (mmap_task)
-+ {
-+ sig.si_signo = SIG_PE_FINISH;
-+ sig.si_errno = 0;
-+ sig.si_code = 0;
-+ send_sig_info(SIG_PE_FINISH,&sig,mmap_task);
-+ }
-+ return IRQ_HANDLED;
-+}
-+
-+static irqreturn_t gcfb_pe_token_irq_handler(int irq,void *dev_id)
-+{
-+ u16 val;
-+ struct siginfo sig;
-+ /* ack the interrupt */
-+ val = in_be16(VIDEO_PE_INTERRUPT) | VIDEO_PE_INTERRUPT_TOKEN_INTERRUPT;
-+ out_be16(VIDEO_PE_INTERRUPT, val);
-+ /* send SIG_PE_TOKEN to the process */
-+ if (mmap_task)
-+ {
-+ sig.si_signo = SIG_PE_TOKEN;
-+ sig.si_errno = 0;
-+ sig.si_code = _peReg[7];
-+ send_sig_info(SIG_PE_TOKEN,&sig,mmap_task);
-+ }
-+ return IRQ_HANDLED;
-+}
-+
-+/**
-+ *
-+ */
-+static u32 gcngx_uvirt_to_phys(u32 virt)
-+{
-+ pgd_t *dir;
-+ pmd_t *pmd;
-+ pte_t *pte;
-+ u32 ret = 0;
-+ struct mm_struct *mm = get_task_mm(current);
-+ u32 offset = virt & (PAGE_SIZE - 1);
-+ virt &= PAGE_MASK;
-+
-+ if (!mm) {
-+ return 0;
-+ }
-+ down_read(&mm->mmap_sem);
-+ /* convert to kernel address */
-+ if ((dir = pgd_offset(mm, virt)) && pgd_present(*dir)) {
-+ if ((pmd = pmd_offset(dir, virt)) && pmd_present(*pmd)) {
-+ pte = pte_offset_kernel(pmd, virt);
-+ if (pte && pte_present(*pte)) {
-+ ret =
-+ (u32) page_address(pte_page(*pte)) + offset;
-+ /* ok now we have the kern addr, map to phys */
-+ ret = virt_to_phys((void *)ret);
-+ }
-+ }
-+ }
-+
-+ up_read(&mm->mmap_sem);
-+ mmput(mm);
-+ return ret;
-+}
-+
-+int gcngx_ioctl(struct fb_info *info,
-+ unsigned int cmd, unsigned long arg)
-+{
-+ u32 phys;
-+ void __user *argp;
-+
-+ if (cmd == FBIOFLIP)
-+ {
-+ flipRequest = 1;
-+ return 0;
-+ } else if (cmd == FBIOVIRTTOPHYS) {
-+ argp = (void __user *)arg;
-+ if (copy_from_user(&phys, argp, sizeof(void *)))
-+ return -EFAULT;
-+
-+ phys = gcngx_uvirt_to_phys(phys);
-+
-+ if (copy_to_user(argp, &phys, sizeof(void *)))
-+ return -EFAULT;
-+ return 0;
-+ }
-+ return -EINVAL;
-+}
-+
-+static void *mymalloc(unsigned int len)
-+{
-+ struct page *page;
-+ void *p = kmalloc(len,GFP_KERNEL);
-+ if (p && len)
-+ {
-+ /* reserve all the memory so remap_page_range works */
-+ for (page=virt_to_page(p);page<virt_to_page(p+len);++page) {
-+ SetPageReserved(page);
-+ SetPageLocked(page);
-+ }
-+ }
-+ return p;
-+}
-+
-+static void myfree(void *p)
-+{
-+ struct page *page;
-+ u32 len;
-+ if (p)
-+ {
-+ len = ksize(p);
-+ for (page=virt_to_page(p);page<virt_to_page(p+len);++page) {
-+ ClearPageReserved(page);
-+ ClearPageLocked(page);
-+ }
-+ kfree(p);
-+ }
-+}
-+
-+static void gcngx_free_munmap(struct vm_area_struct *vma)
-+{
-+ if (vma->vm_private_data)
-+ {
-+ myfree(vma->vm_private_data);
-+ vma->vm_private_data = NULL;
-+ }
-+}
-+
-+static void gcngx_munmap(struct vm_area_struct *vma)
-+{
-+ struct fb_info *info = (struct fb_info*)vma->vm_private_data;
-+ struct vc_data *vc;
-+
-+ gcngx_destroy_fifo();
-+
-+ /* nobody has up mapped anymore */
-+ mmap_task = NULL;
-+ overflow = 0;
-+
-+ /* restore the framebuffer */
-+ gcnfb_restorefb(info);
-+#ifdef CONFIG_FRAMEBUFFER_CONSOLE
-+ acquire_console_sem();
-+ vc = vc_cons[fg_console].d;
-+ update_screen(vc);
-+ unblank_screen();
-+ release_console_sem();
-+#endif
-+}
-+
-+int gcngx_mmap(struct fb_info *info, struct vm_area_struct *vma)
-+{
-+ struct file *file = vma->vm_file;
-+ int ret;
-+// static spinlock_t lock = SPIN_LOCK_UNLOCKED;
-+ u32 phys;
-+ u32 len;
-+
-+
-+ len = vma->vm_end - vma->vm_start;
-+
-+ if (vma->vm_pgoff == (VIDEO_MMAP_BASE >> PAGE_SHIFT) &&
-+ len == VIDEO_MMAP_LENGTH)
-+ {
-+ /* our special case, map the memory info */
-+ vma->vm_flags |= VM_IO;
-+ vma->vm_page_prot = pgprot_noncached(vma->vm_page_prot);
-+ if (io_remap_pfn_range(vma,vma->vm_start,
-+ VIDEO_MMAP_BASE >> PAGE_SHIFT,
-+ len,
-+ vma->vm_page_prot))
-+ {
-+ return -EINVAL;
-+ }
-+ vma->vm_ops = &gcngx_vm_ops;
-+ vma->vm_private_data = info;
-+ /* store task for when fifo is overflown */
-+ mmap_task = current;
-+ overflow = 0;
-+ /* init the fifo before we return */
-+ gcngx_init_fifo();
-+ return 0;
-+ }
-+ else if (vma->vm_pgoff >= (KMALLOC_BASE >> PAGE_SHIFT))
-+ {
-+ /* ok kmalloc the memory now */
-+ vma->vm_private_data = mymalloc(len);
-+ if (!vma->vm_private_data)
-+ {
-+ return -ENOMEM;
-+ }
-+ /* now setup the mapping */
-+ phys = virt_to_phys(vma->vm_private_data);
-+ vma->vm_flags |= (VM_RESERVED | VM_LOCKED);
-+ if (remap_pfn_range(vma,vma->vm_start,
-+ phys >> PAGE_SHIFT,len,vma->vm_page_prot))
-+ {
-+ kfree(vma->vm_private_data);
-+ return -EINVAL;
-+ }
-+ vma->vm_ops = &gcngx_vm_free_ops;
-+ /* now write the physical mapping in the first u32 */
-+ *((u32*)vma->vm_private_data) = phys;
-+ /* return successful */
-+ return 0;
-+ }
-+
-+ /* call the frame buffer mmap method */
-+ if (file->f_op->mmap)
-+ {
-+ /*
-+ * FIXME
-+ * This seems to be broken.
-+ * fb_mmap might sleep and we're getting a lock here.
-+ */
-+// spin_lock(&lock);
-+ /* reset our mmap since the fb driver will call it */
-+ gcnfb_ops.fb_mmap = NULL;
-+ ret = file->f_op->mmap(file,vma);
-+ /* reset our mmap */
-+ gcnfb_ops.fb_mmap = gcngx_mmap;
-+// spin_unlock(&lock);
-+ return ret;
-+ }
-+ return -EINVAL;
-+}
-+
-+static inline void __GX_AckFifoInt(int isOver)
-+{
-+ if (isOver)
-+ _cpReg[2] |= (1 << 0);
-+ else
-+ _cpReg[2] |= (1 << 1);
-+}
-+
-+static inline void __GX_Flush(void)
-+{
-+ /* write 8 32 bit values to the WGPIPE */
-+ *WGPIPE = 0;
-+ *WGPIPE = 0;
-+ *WGPIPE = 0;
-+ *WGPIPE = 0;
-+ *WGPIPE = 0;
-+ *WGPIPE = 0;
-+ *WGPIPE = 0;
-+ *WGPIPE = 0;
-+}
-+
-+static inline void __GX_WriteFifoIntEnable(int over, int under)
-+{
-+ u16 val = _cpReg[1] & ~(VIDEO_CP_CR_GP_FIFO_READ_ENABLE |
-+ VIDEO_CP_CR_CP_IRQ_ENABLE |
-+ VIDEO_CP_CR_GP_LINK_ENABLE);
-+
-+ if (over) val |= VIDEO_CP_CR_OVERFLOW_IRQ_ENABLE;
-+ if (under) val |= VIDEO_CP_CR_UNDERFLOW_IRQ_ENABLE;
-+
-+ _cpReg[1] = val;
-+ /* ack it just for fun */
-+ _cpReg[2] = 0x3;
-+}
-+
-+static inline void __GX_FifoReadEnable(int enable)
-+{
-+ if (enable)
-+ _cpReg[1] |= VIDEO_CP_CR_GP_FIFO_READ_ENABLE;
-+ else
-+ _cpReg[1] &= ~VIDEO_CP_CR_GP_FIFO_READ_ENABLE;
-+}
-+
-+static inline void __GX_FifoLink(u8 enable)
-+{
-+ if (enable)
-+ _cpReg[1] |= VIDEO_CP_CR_GP_LINK_ENABLE;
-+ else
-+ _cpReg[1] &= ~VIDEO_CP_CR_GP_LINK_ENABLE;
-+}
-+
-+static void __GX_EnableWriteGatherPipe(u8 enable)
-+{
-+ u32 flags;
-+ if (enable)
-+ {
-+ mtwpar(0x0C008000);
-+ }
-+
-+ asm ("isync");
-+ asm ("sync");
-+
-+ flags = mfspr(920);
-+ if (enable)
-+ {
-+ flags |= 0x40000000;
-+ }
-+ else
-+ {
-+ flags &= ~0x40000000;
-+ }
-+
-+ mtspr(920,flags);
-+ asm ("isync");
-+ asm ("sync");
-+}
-+
-+static inline void __GX_DrawDone(void)
-+{
-+ LOAD_BP_REG(0x45000002);
-+ __GX_Flush();
-+}
-+
-+static void gcngx_destroy_fifo()
-+{
-+ gcngx_disable_pe_interrupts();
-+ _peReg[7] = 0;
-+
-+ __GX_DrawDone();
-+ /* wait for the buffer to empty? */
-+ __GX_WriteFifoIntEnable(GX_DISABLE,GX_DISABLE);
-+ __GX_FifoReadEnable(0);
-+ __GX_FifoLink(GX_FALSE);
-+
-+ __GX_EnableWriteGatherPipe(0);
-+}
-+
-+struct fifo_info
-+{
-+ u8 *base;
-+ u8 *end;
-+ u32 length;
-+ u8 *lo_water_mark;
-+ u8 *hi_water_mark;
-+ u8 *write_ptr;
-+ u8 *read_ptr;
-+};
-+
-+static void gcngx_init_fifo(void)
-+{
-+ struct fifo_info fi;
-+ int i;
-+
-+ fi.base = phys_fifo_base;
-+ fi.end = phys_fifo_base + fifo_len - 4;
-+ fi.length = fifo_len;
-+ fi.lo_water_mark = phys_fifo_base + ((fifo_len / 2) & ~31);
-+ fi.hi_water_mark = phys_fifo_base + fifo_len - (16*1024);
-+ fi.write_ptr = phys_fifo_base;
-+ fi.read_ptr = phys_fifo_base;
-+
-+ /* reset currentFB pointer */
-+ currentFB = 0;
-+ flipRequest = 0;
-+
-+ /* printk(KERN_INFO "Initializing Flipper FIFO at %p of length %u\n",
-+ fi.base,fifo_len); */
-+
-+ __GX_FifoLink(GX_FALSE);
-+ __GX_WriteFifoIntEnable(GX_DISABLE,GX_DISABLE);
-+ __GX_FifoReadEnable(0);
-+
-+ /* clear the fifo */
-+ for (i=0;i<fifo_len/4;++i)
-+ {
-+ ((u32*)mmap_fifo_base)[i] = 0;
-+ }
-+ /* flush it */
-+ flush_dcache_range((u32)mmap_fifo_base,
-+ (u32)(mmap_fifo_base+fifo_len));
-+
-+ _peReg[7] = 0;
-+
-+ /* fifo base start */
-+ _piReg[3] = (u32)fi.base;
-+ /* fifo base end */
-+ _piReg[4] = (u32)fi.end;
-+ /* fifo write pointer */
-+ _piReg[5] = (u32)fi.write_ptr;
-+
-+ /* init and flush the write gather pipe */
-+ __GX_EnableWriteGatherPipe(1);
-+ __GX_Flush();
-+
-+ /* wait for all data to be flushed */
-+ while (mfwpar() & 1);
-+ _piReg[3] = (u32)fi.base;
-+ _piReg[4] = (u32)fi.end;
-+ _piReg[5] = (u32)fi.write_ptr;
-+ while (mfwpar() & 1);
-+
-+ /* setup fifo base */
-+ _cpReg[16] = _SHIFTL(fi.base,0,16);
-+ _cpReg[17] = _SHIFTR(fi.base,16,16);
-+
-+ /* setup fifo end */
-+ _cpReg[18] = _SHIFTL(fi.end,0,16);
-+ _cpReg[19] = _SHIFTR(fi.end,16,16);
-+
-+ /* setup hiwater mark */
-+ _cpReg[20] = _SHIFTL(fi.hi_water_mark,0,16);
-+ _cpReg[21] = _SHIFTR(fi.hi_water_mark,16,16);
-+
-+ /* setup lowater mark */
-+ _cpReg[22] = _SHIFTL(fi.lo_water_mark,0,16);
-+ _cpReg[23] = _SHIFTR(fi.lo_water_mark,16,16);
-+
-+ /* setup rd<->wd dist */
-+ /*_cpReg[24] = _SHIFTL((pad)[7],0,16);
-+ _cpReg[25] = _SHIFTR((pad)[7],16,16);*/
-+ _cpReg[24] = 0;
-+ _cpReg[25] = 0;
-+
-+ /* setup wt ptr */
-+ _cpReg[26] = _SHIFTL(fi.write_ptr,0,16);
-+ _cpReg[27] = _SHIFTR(fi.write_ptr,16,16);
-+
-+ /* setup rd ptr */
-+ _cpReg[28] = _SHIFTL(fi.read_ptr,0,16);
-+ _cpReg[29] = _SHIFTR(fi.read_ptr,16,16);
-+
-+ asm ("sync");
-+ asm ("isync");
-+ /* enable the write gather pipe */
-+ __GX_WriteFifoIntEnable(GX_ENABLE,GX_DISABLE);
-+ __GX_FifoLink(GX_TRUE);
-+ __GX_FifoReadEnable(1);
-+ /* enable interrupts */
-+ gcngx_enable_pe_interrupts();
-+
-+ asm("sync");
-+ asm("isync");
-+}
-+
-+int gcngx_init(struct fb_info *info)
-+{
-+ int err;
-+ /* compute framebuffer pointers */
-+ xfb[0] = (u32)info->fix.smem_start;
-+ xfb[1] = (u32)info->fix.smem_start + info->fix.smem_len/2;
-+ /* disable the interrupts */
-+ gcngx_disable_pe_interrupts();
-+ __GX_WriteFifoIntEnable(GX_DISABLE,GX_DISABLE);
-+
-+ /* map the fifo area */
-+ phys_fifo_base = (u8*)GCN_GX_FIFO_START;
-+ if (!request_mem_region((u32)phys_fifo_base,fifo_len,"GX FIFO")) {
-+ printk(KERN_ERR "Cannot reserve fifo memory area at %p\n",phys_fifo_base);
-+ return -EIO;
-+ }
-+ if (!(mmap_fifo_base = ioremap((u32)phys_fifo_base,fifo_len))) {
-+ printk(KERN_ERR "Cannot map the fifo area at %p\n",phys_fifo_base);
-+ err = -EIO;
-+ goto free_mem;
-+ }
-+
-+ if ((err=request_irq(IRQ_PE_TOKEN,gcfb_pe_token_irq_handler,IRQF_DISABLED,"PE Token",0)))
-+ {
-+ goto free_iounmap;
-+ }
-+ if ((err=request_irq(IRQ_PE_FINISH,gcfb_pe_finish_irq_handler,IRQF_DISABLED,"PE Finish",0)))
-+ {
-+ goto free_pe_token;
-+ }
-+ if ((err=request_irq(IRQ_CP_FIFO,gcfb_fifo_irq_handler,IRQF_DISABLED,"CP FIFO",0)))
-+ {
-+ goto free_pe_finish;
-+ }
-+ return 0;
-+
-+ free_pe_finish:
-+ free_irq(IRQ_PE_FINISH,0);
-+ free_pe_token:
-+ free_irq(IRQ_PE_TOKEN,0);
-+ free_iounmap:
-+ iounmap(mmap_fifo_base);
-+ free_mem:
-+ release_mem_region((u32)phys_fifo_base,fifo_len);
-+
-+ return err;
-+}
-+
-+void gcngx_exit(struct fb_info *info)
-+{
-+ gcngx_destroy_fifo();
-+
-+ free_irq(IRQ_PE_FINISH,0);
-+ free_irq(IRQ_PE_TOKEN,0);
-+ free_irq(IRQ_CP_FIFO,0);
-+
-+ iounmap(mmap_fifo_base);
-+ release_mem_region((u32)phys_fifo_base,fifo_len);
-+}
-+
-+#endif /* CONFIG_FB_GAMECUBE_GX */
-+
-diff --git a/drivers/video/gcngx.h b/drivers/video/gcngx.h
-new file mode 100644
-index 0000000..9722349
---- /dev/null
-+++ b/drivers/video/gcngx.h
-@@ -0,0 +1,17 @@
-+#ifndef __GCGX__
-+#define __GCGX__
-+
-+#ifdef CONFIG_FB_GAMECUBE_GX
-+
-+int gcngx_mmap(struct fb_info *info, struct vm_area_struct *vma);
-+int gcngx_ioctl(struct fb_info *info, unsigned int cmd,unsigned long arg);
-+
-+int gcngx_init(struct fb_info *info);
-+void gcngx_exit(struct fb_info *info);
-+
-+struct vi_ctl;
-+void gcngx_vtrace(struct vi_ctl *ctl);
-+
-+#endif
-+
-+#endif
-diff --git a/drivers/video/logo/Kconfig b/drivers/video/logo/Kconfig
-index 39ac49e..6fa54c6 100644
---- a/drivers/video/logo/Kconfig
-+++ b/drivers/video/logo/Kconfig
-@@ -42,6 +42,11 @@ config LOGO_DEC_CLUT224
- depends on MACH_DECSTATION || ALPHA
- default y
-
-+config LOGO_GAMECUBE_CLUT224
-+ bool "224-color GameCube Linux logo"
-+ depends on GAMECUBE
-+ default y
-+
- config LOGO_MAC_CLUT224
- bool "224-color Macintosh Linux logo"
- depends on MAC
-diff --git a/drivers/video/logo/Makefile b/drivers/video/logo/Makefile
-index b91251d..a88ea9f 100644
---- a/drivers/video/logo/Makefile
-+++ b/drivers/video/logo/Makefile
-@@ -7,6 +7,7 @@ obj-$(CONFIG_LOGO_LINUX_CLUT224) += logo_linux_clut224.o
- obj-$(CONFIG_LOGO_BLACKFIN_CLUT224) += logo_blackfin_clut224.o
- obj-$(CONFIG_LOGO_BLACKFIN_VGA16) += logo_blackfin_vga16.o
- obj-$(CONFIG_LOGO_DEC_CLUT224) += logo_dec_clut224.o
-+obj-$(CONFIG_LOGO_GAMECUBE_CLUT224) += logo_gcn_clut224.o
- obj-$(CONFIG_LOGO_MAC_CLUT224) += logo_mac_clut224.o
- obj-$(CONFIG_LOGO_PARISC_CLUT224) += logo_parisc_clut224.o
- obj-$(CONFIG_LOGO_SGI_CLUT224) += logo_sgi_clut224.o
-diff --git a/drivers/video/logo/logo.c b/drivers/video/logo/logo.c
-index 2e85a2b..bd608bf 100644
---- a/drivers/video/logo/logo.c
-+++ b/drivers/video/logo/logo.c
-@@ -27,6 +27,7 @@ extern const struct linux_logo logo_linux_clut224;
- extern const struct linux_logo logo_blackfin_vga16;
- extern const struct linux_logo logo_blackfin_clut224;
- extern const struct linux_logo logo_dec_clut224;
-+extern const struct linux_logo logo_gcn_clut224;
- extern const struct linux_logo logo_mac_clut224;
- extern const struct linux_logo logo_parisc_clut224;
- extern const struct linux_logo logo_sgi_clut224;
-@@ -90,6 +91,10 @@ const struct linux_logo * __init_refok fb_find_logo(int depth)
- /* DEC Linux logo on MIPS/MIPS64 or ALPHA */
- logo = &logo_dec_clut224;
- #endif
-+#ifdef CONFIG_LOGO_GAMECUBE_CLUT224
-+ /* GameCube Linux logo */
-+ logo = &logo_gcn_clut224;
-+#endif
- #ifdef CONFIG_LOGO_MAC_CLUT224
- /* Macintosh Linux logo on m68k */
- if (MACH_IS_MAC)
-diff --git a/drivers/video/logo/logo_gcn_clut224.ppm b/drivers/video/logo/logo_gcn_clut224.ppm
-new file mode 100644
-index 0000000..08e12b3
---- /dev/null
-+++ b/drivers/video/logo/logo_gcn_clut224.ppm
-@@ -0,0 +1,1123 @@
-+P3
-+80 80
-+255
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+6 6 6 6 6 6 10 10 10 10 10 10 10 10 10 6 6 6
-+6 6 6 6 6 6 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 6 6 6 10 10 10 14 14 14
-+22 22 22 26 26 26 30 30 30 34 34 34 30 30 30 30 30 30
-+26 26 26 18 18 17 14 14 14 10 10 10 6 6 6 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 6 6 6 14 14 14 26 26 26 42 42 42
-+54 54 55 66 66 66 78 78 78 78 78 78 78 78 78 74 74 74
-+66 66 66 54 54 55 42 42 42 26 26 26 18 18 17 10 10 10
-+6 6 6 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 10 10 10 22 22 22 42 42 42 66 66 66 87 86 85
-+66 66 66 38 38 38 38 38 38 22 22 22 26 26 26 34 34 34
-+54 54 55 66 66 66 87 86 85 70 70 70 46 46 46 26 26 26
-+14 14 14 6 6 6 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+10 10 10 26 26 26 50 50 50 82 82 82 58 58 58 6 6 6
-+2 2 6 2 2 6 2 2 6 2 2 6 2 2 6 2 2 6
-+2 2 6 2 2 6 6 6 6 54 54 55 87 86 85 66 66 66
-+38 38 38 18 18 17 6 6 6 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 6 6 6
-+22 22 22 50 50 50 78 78 78 34 34 34 2 2 6 2 2 6
-+2 2 6 2 2 6 2 2 6 2 2 6 2 2 6 2 2 6
-+2 2 6 2 2 6 2 2 6 2 2 6 6 6 6 70 70 70
-+78 78 78 46 46 46 22 22 22 6 6 6 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 6 6 6 18 18 17
-+42 42 42 82 82 82 26 26 26 2 2 6 2 2 6 2 2 6
-+2 2 6 2 2 6 2 2 6 2 2 6 2 2 6 2 2 6
-+2 2 6 14 14 14 46 46 46 34 34 34 6 6 6 2 2 6
-+42 42 42 78 78 78 42 42 42 18 18 17 6 6 6 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 10 10 10 30 30 30
-+66 66 66 58 58 58 2 2 6 2 2 6 2 2 6 2 2 6
-+2 2 6 2 2 6 2 2 6 2 2 6 2 2 6 2 2 6
-+2 2 6 26 26 26 87 86 85 102 98 90 46 46 46 10 10 10
-+2 2 6 58 58 58 70 70 70 34 34 34 10 10 10 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 14 14 14 42 42 42
-+87 86 85 10 10 10 2 2 6 2 2 6 2 2 6 2 2 6
-+2 2 6 2 2 6 2 2 6 2 2 6 2 2 6 2 2 6
-+2 2 6 30 30 30 94 94 98 94 94 94 58 58 58 26 26 26
-+2 2 6 6 6 6 78 78 78 54 54 55 22 22 22 6 6 6
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 6 6 6 22 22 22 62 62 62
-+62 62 62 2 2 6 2 2 6 2 2 6 2 2 6 2 2 6
-+2 2 6 2 2 6 2 2 6 2 2 6 2 2 6 2 2 6
-+2 2 6 26 26 26 54 54 55 38 38 38 18 18 17 10 10 10
-+2 2 6 2 2 6 34 34 34 82 82 82 38 38 38 14 14 14
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 6 6 6 30 30 30 78 78 78
-+30 30 30 2 2 6 2 2 6 2 2 6 2 2 6 2 2 6
-+2 2 6 2 2 6 2 2 6 2 2 6 2 2 6 2 2 6
-+2 2 6 10 10 10 10 10 10 2 2 6 2 2 6 2 2 6
-+2 2 6 2 2 6 2 2 6 78 78 78 50 50 50 18 18 17
-+6 6 6 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 10 10 10 38 38 38 87 86 85
-+14 14 14 2 2 6 2 2 6 2 2 6 2 2 6 2 2 6
-+2 2 6 2 2 6 2 2 6 2 2 6 2 2 6 2 2 6
-+2 2 6 2 2 6 2 2 6 2 2 6 2 2 6 2 2 6
-+2 2 6 2 2 6 2 2 2 54 54 55 66 66 66 26 26 26
-+6 6 6 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 14 14 14 42 42 42 82 82 82
-+2 2 6 2 2 6 2 2 6 6 6 6 10 10 10 2 2 6
-+2 2 6 2 2 6 2 2 6 2 2 6 2 2 6 2 2 6
-+2 2 6 6 6 6 14 14 14 10 10 10 2 2 6 2 2 6
-+2 2 6 2 2 6 2 2 6 18 18 17 82 82 82 34 34 34
-+10 10 10 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 14 14 14 46 46 46 87 86 85
-+2 2 6 2 2 6 6 6 6 6 6 6 22 22 22 34 34 34
-+6 6 6 2 2 6 2 2 6 2 2 6 2 2 6 2 2 6
-+18 18 17 34 34 34 10 10 10 50 50 50 22 22 22 2 2 6
-+2 2 6 2 2 6 2 2 6 10 10 10 87 86 85 42 42 42
-+14 14 14 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 14 14 14 46 46 46 87 86 85
-+2 2 6 2 2 6 38 38 38 118 118 118 94 94 94 22 22 22
-+22 22 22 2 2 6 2 2 6 2 2 6 14 14 14 87 86 85
-+141 139 143 160 158 162 152 152 152 38 38 38 26 26 26 6 6 6
-+2 2 6 2 2 6 2 2 6 2 2 6 87 86 85 46 46 46
-+14 14 14 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 14 14 14 46 46 46 87 86 85
-+2 2 6 14 14 14 134 133 135 199 199 199 194 193 197 118 118 118
-+10 10 10 2 2 6 2 2 6 6 6 6 102 98 90 190 190 190
-+209 208 212 219 220 223 215 214 215 134 133 135 14 14 14 6 6 6
-+2 2 6 2 2 6 2 2 6 2 2 6 87 86 85 50 50 50
-+18 18 17 6 6 6 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 14 14 14 46 46 46 87 86 85
-+2 2 6 54 54 55 219 220 223 199 199 199 219 220 223 246 246 246
-+58 58 58 2 2 6 2 2 6 30 30 30 209 208 212 254 254 254
-+173 173 174 121 121 122 219 220 223 236 233 239 74 74 74 2 2 6
-+2 2 6 2 2 6 2 2 6 2 2 6 70 70 70 58 58 58
-+22 22 22 6 6 6 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 14 14 14 46 46 46 82 82 82
-+2 2 6 104 103 100 173 173 174 26 26 26 90 90 90 229 226 233
-+121 121 122 10 10 10 14 14 14 46 46 46 229 231 235 190 190 190
-+6 6 6 74 74 74 90 90 90 239 238 242 160 158 162 2 2 6
-+2 2 6 2 2 6 2 2 6 2 2 6 70 70 70 58 58 58
-+22 22 22 6 6 6 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 14 14 14 42 42 42 87 86 85
-+6 6 6 118 118 118 104 103 100 6 6 6 70 70 70 152 152 152
-+122 122 130 18 18 17 38 38 38 54 54 55 219 220 223 104 103 100
-+2 2 2 14 14 14 46 46 46 190 190 190 199 199 199 2 2 2
-+2 2 6 2 2 6 2 2 6 2 2 6 74 74 74 62 62 62
-+22 22 22 6 6 6 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 14 14 14 42 42 42 94 94 94
-+14 14 14 104 103 100 122 122 130 2 2 2 18 18 17 118 118 118
-+124 98 46 122 94 10 122 94 10 101 78 10 163 163 162 107 107 108
-+2 2 6 2 2 2 2 2 2 194 193 197 194 193 197 6 6 6
-+2 2 6 2 2 6 2 2 6 2 2 6 74 74 74 62 62 62
-+22 22 22 6 6 6 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 10 10 10 38 38 38 90 90 90
-+14 14 14 62 62 62 209 208 212 26 26 26 44 31 8 158 118 10
-+226 171 11 238 183 13 214 174 14 188 146 14 214 174 14 174 146 62
-+26 26 26 2 2 2 70 70 70 246 246 246 141 139 143 2 2 2
-+2 2 6 2 2 6 2 2 6 2 2 6 70 70 70 66 66 66
-+26 26 26 6 6 6 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 10 10 10 38 38 38 87 86 85
-+14 14 14 6 6 6 199 199 199 190 166 114 186 134 10 226 171 11
-+238 178 14 234 193 17 234 193 17 236 202 20 246 206 46 242 210 18
-+234 193 17 188 146 14 218 194 134 210 206 186 42 42 42 2 2 6
-+2 2 6 2 2 6 2 2 6 2 2 6 50 50 50 74 74 74
-+30 30 30 6 6 6 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 10 10 10 34 34 34 87 86 85
-+14 14 14 2 2 2 122 86 26 194 134 10 226 166 10 238 183 13
-+226 186 14 234 193 17 236 202 20 246 216 61 246 217 39 246 217 39
-+246 214 22 242 210 18 242 210 18 226 186 14 122 86 26 2 2 6
-+2 2 6 2 2 6 2 2 6 2 2 6 50 50 50 82 82 82
-+34 34 34 10 10 10 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 10 10 10 34 34 34 82 82 82
-+30 30 30 63 43 6 182 122 6 204 146 10 231 174 11 238 183 13
-+234 193 17 236 202 20 242 210 18 246 216 61 246 217 39 246 214 22
-+246 214 22 242 210 18 226 186 14 214 174 14 188 146 14 6 6 6
-+2 2 6 2 2 6 2 2 6 2 2 6 26 26 26 94 94 94
-+42 42 42 14 14 14 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 10 10 10 30 30 30 78 78 78
-+50 50 50 104 70 6 186 134 10 218 158 10 238 178 14 242 186 14
-+236 202 20 236 202 20 246 216 61 246 217 39 246 217 39 246 214 22
-+242 210 18 198 154 10 198 138 10 218 158 10 154 114 10 2 2 6
-+2 2 6 2 2 6 2 2 6 2 2 6 6 6 6 90 90 90
-+54 54 55 18 18 17 6 6 6 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 10 10 10 30 30 30 78 78 78
-+46 46 46 22 22 22 138 93 6 198 154 10 238 183 13 238 183 13
-+236 202 20 242 210 18 246 214 22 246 214 22 242 210 18 204 166 16
-+186 134 10 210 150 10 216 162 10 210 150 10 101 78 10 2 2 6
-+6 6 6 54 54 55 14 14 14 2 2 6 2 2 6 62 62 62
-+74 74 74 30 30 30 10 10 10 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 10 10 10 34 34 34 78 78 78
-+50 50 50 6 6 6 94 70 30 138 102 14 188 146 14 226 186 14
-+236 202 20 234 193 17 214 174 14 188 146 14 173 119 7 186 134 10
-+210 150 10 214 154 10 202 150 34 182 158 106 102 98 90 2 2 2
-+2 2 6 78 78 78 118 118 118 54 54 55 2 2 6 22 22 22
-+90 90 90 46 46 46 18 18 17 6 6 6 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 10 10 10 38 38 38 87 86 85
-+50 50 50 6 6 6 132 131 125 174 154 114 160 108 10 173 119 7
-+198 154 10 188 146 14 198 138 10 198 138 10 204 146 10 204 146 10
-+198 138 10 190 166 114 194 193 197 199 199 199 173 173 174 14 14 14
-+2 2 6 18 18 17 118 118 118 118 118 118 22 22 22 2 2 6
-+74 74 74 70 70 70 30 30 30 10 10 10 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 6 6 6 18 18 17 50 50 50 104 103 100
-+26 26 26 10 10 10 141 139 143 190 190 190 174 154 114 160 108 10
-+198 138 10 188 146 14 198 138 10 194 134 10 182 122 6 190 142 34
-+186 174 146 185 185 187 199 199 199 219 220 223 215 214 215 66 66 66
-+2 2 6 2 2 6 50 50 50 62 62 62 6 6 6 2 2 2
-+10 10 10 90 90 90 50 50 50 18 18 17 6 6 6 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 10 10 10 34 34 34 74 74 74 74 74 74
-+2 2 2 6 6 6 141 139 143 199 199 199 190 190 190 163 163 162
-+154 122 54 160 108 10 160 108 10 164 122 42 174 154 114 185 185 187
-+194 193 197 209 208 212 250 250 250 254 254 254 250 250 250 182 182 182
-+6 6 6 2 2 6 2 2 6 2 2 6 2 2 6 2 2 6
-+2 2 6 62 62 62 74 74 74 34 34 34 14 14 14 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 10 10 10 22 22 22 54 54 55 94 94 94 18 18 17
-+2 2 6 50 50 50 229 231 235 219 220 223 194 193 197 190 190 190
-+190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 194 193 197
-+215 214 215 242 242 242 254 254 254 254 254 254 250 250 250 254 254 254
-+82 82 82 2 2 6 2 2 6 2 2 6 2 2 6 2 2 6
-+2 2 6 14 14 14 87 86 85 54 54 55 22 22 22 6 6 6
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+6 6 6 18 18 17 46 46 46 90 90 90 46 46 46 18 18 17
-+6 6 6 182 182 182 254 254 254 250 250 250 210 206 186 190 190 190
-+190 190 190 190 190 190 190 190 190 190 190 190 210 206 186 229 231 235
-+254 254 254 250 250 250 250 250 250 254 254 254 254 254 254 254 254 254
-+198 200 208 14 14 14 2 2 6 2 2 6 2 2 6 2 2 6
-+2 2 6 2 2 6 42 42 42 87 86 85 42 42 42 18 18 17
-+6 6 6 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 6 6 6
-+14 14 14 38 38 38 74 74 74 66 66 66 2 2 6 6 6 6
-+90 90 90 250 250 250 250 250 250 254 254 254 239 238 242 199 199 199
-+190 190 190 190 190 190 194 193 197 219 220 223 183 174 199 134 114 171
-+207 201 219 254 254 254 254 254 254 254 254 254 250 250 250 254 254 254
-+250 250 250 82 82 82 2 2 2 2 2 6 2 2 6 2 2 6
-+2 2 6 2 2 6 2 2 6 78 78 78 70 70 70 34 34 34
-+14 14 14 6 6 6 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 14 14 14
-+34 34 34 66 66 66 78 78 78 6 6 6 2 2 2 18 18 17
-+219 220 223 254 254 254 254 254 254 250 250 250 254 254 254 246 246 246
-+222 223 236 229 231 235 229 226 233 140 131 164 109 96 159 109 96 159
-+120 106 166 170 156 193 236 233 239 254 254 254 254 254 254 254 254 254
-+254 254 254 182 182 182 2 2 6 2 2 6 2 2 6 2 2 6
-+2 2 6 2 2 6 2 2 6 18 18 17 90 90 90 62 62 62
-+30 30 30 10 10 10 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 10 10 10 26 26 26
-+58 58 58 90 90 90 18 18 17 2 2 6 2 2 6 107 107 108
-+254 254 254 254 254 254 254 254 254 250 250 250 250 250 250 254 254 254
-+250 250 250 189 183 204 121 102 164 116 94 159 117 98 162 114 103 163
-+114 103 163 120 106 166 136 121 175 146 139 165 107 107 108 118 118 118
-+141 139 143 182 182 182 219 220 223 2 2 6 2 2 6 2 2 6
-+2 2 6 2 2 6 2 2 6 2 2 6 18 18 17 94 94 94
-+54 54 55 26 26 26 10 10 10 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 6 6 6 22 22 22 50 50 50
-+90 90 90 26 26 26 2 2 6 2 2 2 14 14 14 199 199 199
-+250 250 250 254 254 254 254 254 254 254 254 254 254 254 254 229 226 233
-+147 132 180 109 90 154 158 147 190 198 200 208 137 128 178 120 106 166
-+121 102 164 120 106 166 130 120 175 130 120 175 127 110 169 76 72 88
-+58 58 58 58 58 58 74 74 74 118 118 118 194 193 197 2 2 6
-+2 2 6 2 2 6 2 2 6 2 2 6 2 2 6 38 38 38
-+87 86 85 50 50 50 22 22 22 6 6 6 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 6 6 6 14 14 14 38 38 38 82 82 82
-+34 34 34 2 2 6 2 2 6 2 2 2 42 42 42 194 193 197
-+246 246 246 254 254 254 254 254 254 254 254 254 200 193 212 122 98 164
-+113 86 148 109 96 159 128 114 172 158 147 190 130 120 175 120 106 166
-+127 110 169 127 110 169 130 120 175 130 120 175 142 128 179 140 131 164
-+102 98 122 58 50 84 54 54 55 62 62 62 74 74 74 134 133 135
-+236 233 239 2 2 2 2 2 6 2 2 6 2 2 6 2 2 6
-+38 38 38 82 82 82 42 42 42 14 14 14 6 6 6 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 10 10 10 26 26 26 62 62 62 66 66 66
-+2 2 6 2 2 6 2 2 6 6 6 6 70 70 70 169 165 179
-+210 206 186 229 231 235 236 233 239 146 139 165 105 86 155 105 86 155
-+109 96 159 109 90 154 109 96 159 114 103 163 114 103 163 120 106 166
-+120 106 166 128 114 172 130 120 175 137 128 178 137 128 178 142 134 183
-+155 141 181 140 131 164 70 70 70 58 50 84 66 66 66 84 82 94
-+118 118 118 229 231 235 2 2 6 2 2 6 2 2 6 2 2 6
-+2 2 6 62 62 62 66 66 66 30 30 30 10 10 10 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 14 14 14 42 42 42 82 82 82 18 18 17
-+2 2 6 2 2 6 2 2 6 10 10 10 94 94 94 182 182 182
-+219 220 223 200 193 212 122 98 164 102 82 152 105 86 155 109 90 154
-+109 96 159 109 90 154 109 96 159 114 103 163 114 103 163 127 110 169
-+128 114 172 128 114 172 130 120 175 137 128 178 142 128 179 148 140 189
-+148 140 189 158 147 190 158 147 190 118 110 134 76 72 88 94 90 106
-+94 94 98 132 131 125 2 2 6 2 2 6 2 2 6 2 2 6
-+2 2 6 6 6 6 87 86 85 46 46 46 18 18 17 6 6 6
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 6 6 6 22 22 22 54 54 55 70 70 70 2 2 6
-+2 2 6 10 10 10 2 2 2 22 22 22 173 173 174 236 233 239
-+155 141 181 102 82 152 102 82 152 102 82 152 109 90 154 105 86 155
-+109 90 154 87 78 126 58 50 84 45 38 66 45 38 66 54 46 76
-+82 70 114 114 103 163 130 120 175 136 121 175 137 128 178 142 128 179
-+142 134 183 148 140 189 158 147 190 158 147 190 146 139 165 118 106 138
-+126 122 142 87 86 85 199 199 199 2 2 6 2 2 6 2 2 6
-+2 2 6 2 2 6 62 62 62 66 66 66 26 26 26 10 10 10
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 10 10 10 30 30 30 74 74 74 50 50 50 2 2 6
-+26 26 26 26 26 26 2 2 6 107 107 108 207 201 219 120 106 166
-+103 83 144 102 82 152 105 86 155 102 82 152 94 82 138 87 78 126
-+34 26 54 6 6 6 6 6 6 2 2 6 2 2 6 2 2 2
-+2 2 2 10 6 18 64 60 89 130 120 175 137 128 178 137 128 178
-+142 128 179 148 140 189 142 134 183 146 140 180 142 134 183 148 140 189
-+155 141 181 110 106 126 146 146 147 18 18 17 2 2 6 2 2 6
-+2 2 6 2 2 6 18 18 17 87 86 85 42 42 42 14 14 14
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 14 14 14 42 42 42 90 90 90 22 22 22 2 2 6
-+42 42 42 2 2 2 78 78 78 166 150 188 102 82 152 99 78 147
-+111 77 141 102 82 152 99 78 147 105 86 155 87 78 126 10 10 10
-+6 6 6 2 2 6 2 2 6 6 2 2 2 2 2 2 2 2
-+2 2 6 6 6 6 2 2 6 45 38 66 130 120 175 136 121 175
-+137 128 178 137 128 178 137 128 178 137 128 178 137 128 178 142 128 179
-+142 134 183 140 131 164 138 131 154 38 38 38 10 10 10 2 2 6
-+2 2 6 2 2 6 2 2 6 78 78 78 58 58 58 22 22 22
-+6 6 6 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+6 6 6 18 18 17 54 54 55 82 82 82 2 2 6 26 26 26
-+22 22 22 216 211 227 127 110 169 97 74 146 99 78 147 99 78 147
-+102 82 152 102 82 152 99 78 147 94 82 138 34 26 54 2 2 6
-+2 2 6 6 2 7 50 50 50 30 30 30 6 6 6 6 2 2
-+2 2 2 2 2 2 2 2 6 2 2 6 87 78 126 130 120 175
-+128 114 172 130 120 175 130 120 175 136 121 175 137 128 178 130 120 175
-+130 120 175 137 128 178 142 134 183 213 206 226 38 38 38 2 2 6
-+2 2 6 2 2 6 2 2 6 46 46 46 78 78 78 30 30 30
-+10 10 10 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+10 10 10 30 30 30 74 74 74 58 58 58 2 2 6 42 42 42
-+189 183 204 105 86 155 97 74 146 97 74 146 93 70 140 97 74 146
-+105 86 155 99 78 147 102 82 152 94 82 138 10 6 18 6 2 7
-+6 6 6 2 2 2 10 6 18 50 50 50 54 54 55 18 18 17
-+6 2 2 6 2 7 6 2 7 2 2 6 54 46 76 120 106 166
-+127 110 169 127 110 169 127 110 169 128 114 172 127 110 169 128 114 172
-+128 114 172 127 110 169 128 114 172 130 120 175 38 38 38 14 14 14
-+2 2 6 2 2 6 2 2 6 6 6 6 87 86 85 46 46 46
-+14 14 14 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 6 6 6
-+14 14 14 42 42 42 90 90 90 18 18 17 18 18 17 26 26 26
-+183 174 199 122 98 164 97 74 146 99 78 147 97 74 146 97 74 146
-+99 78 147 99 78 147 102 82 152 99 78 147 14 14 14 26 26 26
-+26 26 26 6 2 7 6 2 7 6 2 7 22 22 22 66 66 66
-+30 30 30 2 2 6 2 2 6 2 2 6 58 50 84 120 106 166
-+114 103 163 114 103 163 114 103 163 114 103 163 114 103 163 114 103 163
-+114 103 163 120 106 166 109 90 154 134 120 165 10 10 10 34 34 34
-+2 2 6 2 2 6 2 2 6 2 2 6 74 74 74 58 58 58
-+22 22 22 6 6 6 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 10 10 10
-+26 26 26 66 66 66 82 82 82 2 2 6 38 38 38 6 2 7
-+196 186 211 154 134 184 127 110 169 99 78 147 97 74 146 97 74 146
-+99 78 147 99 78 147 99 78 147 102 82 152 45 38 66 58 50 84
-+54 54 55 22 22 22 6 2 7 6 2 7 6 2 7 10 10 10
-+14 14 14 6 2 2 2 2 2 10 6 18 94 82 138 109 96 159
-+109 96 159 109 96 159 109 96 159 109 96 159 109 96 159 109 96 159
-+109 96 159 105 86 155 116 94 159 147 132 180 2 2 6 46 46 46
-+2 2 6 2 2 6 2 2 6 2 2 6 42 42 42 74 74 74
-+30 30 30 10 10 10 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 6 6 6 14 14 14
-+42 42 42 90 90 90 26 26 26 6 6 6 42 42 42 2 2 6
-+200 193 212 154 134 184 154 134 184 136 121 175 105 86 155 97 74 146
-+97 74 146 99 78 147 99 78 147 97 74 146 95 75 136 40 30 56
-+94 90 106 104 103 100 50 50 50 26 26 26 6 2 7 6 2 7
-+2 2 6 6 2 2 10 6 18 64 60 89 109 90 154 105 86 155
-+105 86 155 105 86 155 105 86 155 105 86 155 105 86 155 102 82 152
-+109 90 154 116 94 159 116 94 159 157 140 187 2 2 6 46 46 46
-+2 2 6 2 2 6 2 2 6 2 2 6 10 10 10 87 86 85
-+38 38 38 10 10 10 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 10 10 10 26 26 26
-+66 66 66 82 82 82 2 2 6 22 22 22 18 18 17 6 2 7
-+207 201 219 154 134 184 147 132 180 147 132 180 147 126 185 114 90 155
-+97 74 146 97 74 146 111 77 141 130 90 130 99 78 147 95 75 136
-+58 50 84 84 82 94 87 86 85 38 38 38 6 2 7 6 2 7
-+10 6 18 34 26 54 86 66 120 102 82 152 99 78 147 102 82 152
-+102 82 152 102 82 152 102 82 152 99 78 147 99 78 147 109 90 154
-+114 90 155 116 94 159 116 94 159 170 156 193 2 2 6 38 38 38
-+2 2 6 2 2 6 2 2 6 2 2 6 6 6 6 87 86 85
-+46 46 46 14 14 14 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 6 6 6 18 18 17 46 46 46
-+87 86 85 18 18 17 2 2 6 34 34 34 10 10 10 10 6 18
-+213 206 226 162 146 182 183 174 199 147 132 180 142 134 183 147 132 180
-+126 102 165 97 74 146 97 74 146 130 90 130 166 110 126 118 78 130
-+93 70 140 97 74 146 86 66 120 70 56 108 70 56 108 70 56 108
-+87 78 126 94 82 138 99 78 147 99 78 147 99 78 147 99 78 147
-+97 74 146 97 74 146 97 74 146 102 82 152 114 90 155 116 94 159
-+116 94 159 122 98 164 122 98 164 177 168 195 6 6 6 30 30 30
-+2 2 6 2 2 6 2 2 6 2 2 6 2 2 6 82 82 82
-+54 54 55 18 18 17 6 6 6 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 10 10 10 26 26 26 66 66 66
-+62 62 62 2 2 6 2 2 2 38 38 38 10 10 10 22 22 22
-+226 218 234 170 156 193 207 201 219 194 193 197 146 139 165 147 126 185
-+147 132 180 134 114 171 99 78 147 99 78 147 118 78 130 113 86 148
-+97 74 146 97 74 146 97 74 146 97 74 146 97 74 146 99 78 147
-+97 74 146 97 74 146 97 74 146 97 74 146 97 74 146 93 70 140
-+97 74 146 93 70 140 105 86 155 109 90 154 93 70 140 116 94 159
-+122 98 164 122 98 164 126 102 165 189 183 204 10 10 10 30 30 30
-+2 2 6 2 2 6 2 2 6 2 2 6 2 2 6 66 66 66
-+58 58 58 22 22 22 6 6 6 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 10 10 10 38 38 38 78 78 78
-+6 6 6 2 2 6 2 2 6 46 46 46 14 14 14 42 42 42
-+229 226 233 170 156 193 183 174 199 132 131 125 198 200 208 158 147 190
-+140 131 164 142 134 183 136 121 175 113 86 148 95 75 136 97 74 146
-+97 74 146 95 75 136 93 70 140 93 70 140 97 74 146 102 82 152
-+97 74 146 93 70 140 93 70 140 93 70 140 93 70 140 93 70 140
-+97 74 146 105 86 155 99 78 147 88 65 130 92 71 128 116 94 159
-+122 98 164 126 102 165 127 106 167 196 186 211 22 22 22 14 14 14
-+2 2 6 2 2 6 2 2 6 2 2 6 2 2 6 66 66 66
-+62 62 62 22 22 22 6 6 6 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 6 6 6 18 18 17 50 50 50 74 74 74
-+2 2 6 2 2 6 14 14 14 70 70 70 34 34 34 62 62 62
-+236 233 239 170 156 193 194 193 197 46 42 70 200 193 212 199 199 199
-+177 162 197 137 128 178 147 132 180 147 126 185 121 102 164 97 74 146
-+93 70 140 93 70 140 97 74 146 93 70 140 93 70 140 88 65 130
-+88 65 130 93 70 140 93 70 140 93 70 140 93 70 140 97 74 146
-+113 86 148 97 74 146 86 66 120 92 71 128 93 70 140 122 98 164
-+126 102 165 127 106 167 127 106 167 207 201 219 30 30 30 2 2 6
-+2 2 6 2 2 6 2 2 6 2 2 6 2 2 6 66 66 66
-+62 62 62 22 22 22 6 6 6 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 6 6 6 18 18 17 54 54 55 62 62 62
-+2 2 6 2 2 6 2 2 6 30 30 30 46 46 46 74 74 74
-+254 254 254 158 147 190 236 233 239 199 199 199 215 214 215 190 190 190
-+163 163 162 183 174 199 138 131 154 142 128 179 147 126 185 127 110 169
-+99 78 147 93 70 140 97 74 146 93 70 140 93 70 140 88 65 130
-+88 65 130 88 65 130 93 70 140 88 65 130 102 82 152 105 86 155
-+92 71 128 86 66 120 86 66 120 92 71 128 95 75 136 126 102 165
-+127 106 167 127 106 167 127 106 167 213 206 226 30 30 30 2 2 6
-+2 2 6 2 2 6 2 2 6 2 2 6 2 2 6 66 66 66
-+58 58 58 22 22 22 6 6 6 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 6 6 6 22 22 22 58 58 58 62 62 62
-+2 2 6 2 2 6 2 2 2 6 2 7 30 30 30 78 78 78
-+250 250 250 162 146 182 207 201 219 222 223 236 229 231 235 173 173 174
-+38 38 38 194 193 197 189 183 204 146 139 165 137 128 178 147 132 180
-+136 121 175 105 86 155 88 65 130 93 70 140 93 70 140 88 65 130
-+88 65 130 88 65 130 88 65 130 105 86 155 102 82 152 88 65 130
-+86 66 120 88 65 130 82 70 114 92 71 128 99 78 147 127 106 167
-+126 102 165 126 102 165 127 110 169 226 218 234 14 14 14 22 22 22
-+26 26 26 18 18 17 6 6 6 2 2 6 2 2 2 82 82 82
-+54 54 55 18 18 17 6 6 6 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 6 6 6 26 26 26 62 62 62 107 107 108
-+74 54 14 186 134 10 216 162 10 122 94 10 6 6 6 62 62 62
-+239 238 242 170 156 193 155 141 181 200 193 212 222 223 236 229 231 235
-+134 133 135 198 200 208 194 193 197 183 174 199 152 152 152 136 121 175
-+142 128 179 142 128 179 117 98 162 88 65 130 88 65 130 93 70 140
-+88 65 130 99 78 147 109 90 154 114 90 155 95 75 136 86 66 120
-+92 71 128 88 65 130 92 71 128 95 75 136 103 83 144 120 106 166
-+127 106 167 127 110 169 155 141 181 160 158 162 2 2 2 2 2 2
-+6 6 6 18 18 17 66 66 66 38 38 38 6 6 6 94 94 94
-+50 50 50 18 18 17 6 6 6 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 6 6 6
-+10 10 10 10 10 10 18 18 17 38 38 38 78 78 78 132 131 125
-+218 158 10 242 186 14 246 190 14 246 190 14 158 118 10 10 10 10
-+90 90 90 226 218 234 166 150 188 157 140 187 189 183 204 216 211 227
-+229 231 235 219 220 223 173 173 174 74 74 74 189 183 204 169 165 179
-+134 120 165 136 121 175 137 128 178 127 110 169 93 70 140 88 65 130
-+102 82 152 113 86 148 114 90 155 114 90 155 92 71 128 86 66 120
-+92 71 128 95 75 136 92 71 128 95 75 136 117 98 162 127 106 167
-+127 110 169 177 162 197 6 2 7 6 2 7 2 2 6 2 2 6
-+2 2 6 2 2 6 38 38 38 46 46 46 22 22 22 107 107 108
-+54 54 55 18 18 17 6 6 6 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 6 6 6 14 14 14 22 22 22
-+30 30 30 38 38 38 50 50 50 70 70 70 107 107 108 190 142 34
-+226 171 11 242 186 14 246 190 14 246 190 14 246 190 14 154 114 10
-+6 6 6 74 74 74 236 233 239 136 121 175 157 140 187 177 162 197
-+216 211 227 236 233 239 209 208 212 66 66 66 169 165 179 194 193 197
-+177 168 195 138 131 154 136 121 175 137 128 178 127 106 167 102 82 152
-+109 90 154 109 90 154 109 90 154 116 94 159 99 78 147 86 66 120
-+92 71 128 95 75 136 103 83 144 116 94 159 127 106 167 134 120 165
-+196 186 211 44 31 8 2 2 2 2 2 6 2 2 6 2 2 6
-+2 2 6 6 6 6 30 30 30 26 26 26 204 166 16 154 142 90
-+66 66 66 26 26 26 6 6 6 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 6 6 6 18 18 17 38 38 38 58 58 58
-+78 78 78 87 86 85 102 98 90 121 121 122 174 146 62 210 150 10
-+231 174 11 246 186 14 246 190 14 246 190 14 246 186 14 234 193 17
-+101 78 10 2 2 6 46 46 46 215 214 215 177 168 195 148 140 189
-+158 147 190 222 223 236 239 238 242 215 214 215 215 214 215 185 185 187
-+122 122 130 183 174 199 138 131 154 136 121 175 127 110 169 113 86 148
-+109 90 154 114 90 155 116 94 159 122 98 164 99 78 147 95 75 136
-+87 78 126 118 78 130 116 94 159 122 98 164 136 121 175 213 206 226
-+204 166 16 18 18 17 2 2 6 2 2 6 2 2 6 2 2 6
-+2 2 6 2 2 6 6 6 6 122 94 10 236 202 20 234 193 17
-+82 82 82 34 34 34 10 10 10 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 14 14 14 38 38 38 70 70 70 154 122 54
-+190 142 34 204 146 10 198 138 10 198 138 10 214 154 10 226 171 11
-+242 186 14 246 190 14 246 190 14 246 190 14 246 190 14 246 186 14
-+226 171 11 44 31 8 6 2 7 22 22 22 160 158 162 200 193 212
-+157 140 187 157 140 187 207 201 219 209 208 212 222 223 236 194 193 197
-+30 30 30 146 139 165 146 139 165 134 120 165 134 114 171 114 90 155
-+116 94 159 122 98 164 122 98 164 122 98 164 111 77 141 92 71 128
-+109 90 154 122 98 164 126 102 165 142 128 179 229 226 233 242 186 14
-+214 154 10 44 31 8 2 2 2 2 2 6 2 2 6 2 2 6
-+2 2 6 2 2 6 63 43 6 231 174 11 234 193 17 238 183 13
-+114 102 78 38 38 38 14 14 14 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 6 6 6 22 22 22 54 54 55 154 122 54 214 154 10
-+226 171 11 231 174 11 226 171 11 226 171 11 238 178 14 242 186 14
-+246 190 14 246 190 14 246 190 14 246 190 14 246 190 14 246 190 14
-+242 198 14 188 146 14 10 10 10 6 2 7 6 2 7 118 118 118
-+216 211 227 157 140 187 154 134 184 183 174 199 215 214 215 222 223 236
-+169 165 179 173 173 174 138 131 154 128 114 172 134 120 165 116 94 159
-+122 98 164 122 98 164 121 102 164 126 102 165 103 83 144 116 94 159
-+127 106 167 127 106 167 154 134 184 236 233 239 238 178 14 238 178 14
-+210 150 10 138 93 6 14 14 14 2 2 6 2 2 6 2 2 6
-+6 6 6 63 43 6 198 138 10 238 178 14 238 178 14 238 183 13
-+126 114 90 58 58 58 22 22 22 6 6 6 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 10 10 10 30 30 30 70 70 70 179 134 43 226 171 11
-+238 183 13 242 186 14 242 186 14 246 186 14 246 190 14 246 190 14
-+246 190 14 246 190 14 246 190 14 246 190 14 246 190 14 246 190 14
-+246 190 14 234 193 17 94 70 30 2 2 2 2 2 6 2 2 6
-+66 66 66 229 226 233 170 156 193 147 132 180 170 156 193 207 201 219
-+219 220 223 219 220 223 138 131 154 128 114 172 134 114 171 117 98 162
-+121 102 164 121 102 164 121 102 164 120 106 166 116 94 159 127 106 167
-+128 114 172 169 165 179 160 158 162 214 166 58 231 174 11 231 174 11
-+218 158 10 194 134 10 160 108 10 118 82 10 101 78 10 118 82 10
-+166 114 6 198 138 10 226 171 11 238 183 13 242 186 14 242 186 14
-+162 146 94 78 78 78 34 34 34 14 14 14 6 6 6 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 6 6 6 30 30 30 78 78 78 190 142 34 226 166 10
-+238 183 13 246 190 14 246 190 14 246 190 14 246 190 14 246 190 14
-+246 190 14 246 190 14 246 190 14 246 190 14 246 190 14 246 190 14
-+246 190 14 242 198 14 204 166 16 18 18 17 2 2 6 2 2 6
-+2 2 6 38 38 38 160 158 162 177 168 195 142 134 183 155 141 181
-+200 193 212 222 223 236 146 139 165 128 114 172 136 121 175 122 98 164
-+122 98 164 122 98 164 126 102 165 114 90 155 122 98 164 128 114 172
-+196 186 211 210 206 186 200 193 212 206 162 42 226 171 11 238 178 14
-+226 166 10 204 146 10 204 146 10 194 134 10 186 134 10 198 138 10
-+210 150 10 231 174 11 242 186 14 246 190 14 246 190 14 242 186 14
-+226 171 11 126 114 90 62 62 62 30 30 30 14 14 14 6 6 6
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 10 10 10 30 30 30 78 78 78 179 134 43 226 166 10
-+238 183 13 246 190 14 246 190 14 246 190 14 246 190 14 246 190 14
-+246 190 14 246 190 14 246 190 14 246 190 14 246 190 14 246 190 14
-+246 190 14 246 190 14 242 198 14 138 102 14 2 2 6 2 2 6
-+2 2 6 2 2 6 78 78 78 250 250 250 196 186 211 147 132 180
-+154 134 184 207 201 219 169 165 179 136 121 175 136 121 175 122 98 164
-+126 102 165 122 98 164 114 90 155 121 102 164 134 120 165 213 206 226
-+250 250 250 219 220 223 194 193 197 190 150 46 216 162 10 238 178 14
-+231 174 11 226 166 10 218 158 10 214 154 10 214 154 10 218 158 10
-+226 171 11 238 183 13 246 190 14 246 190 14 246 190 14 246 190 14
-+242 186 14 206 162 42 102 98 90 58 58 58 30 30 30 14 14 14
-+6 6 6 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 10 10 10 30 30 30 74 74 74 179 134 43 218 158 10
-+238 178 14 246 190 14 246 190 14 246 190 14 246 190 14 246 190 14
-+246 190 14 246 190 14 246 190 14 246 190 14 246 190 14 246 190 14
-+246 190 14 246 186 14 242 198 14 226 186 14 63 43 6 2 2 6
-+2 2 6 2 2 6 22 22 22 239 238 242 254 254 254 213 206 226
-+157 140 187 147 132 180 155 141 181 136 121 175 136 121 175 121 102 164
-+117 98 162 116 94 159 127 106 167 147 126 185 226 218 234 250 250 250
-+250 250 250 222 223 236 190 190 190 179 134 43 218 158 10 238 178 14
-+238 183 13 238 178 14 231 174 11 226 166 10 226 171 11 231 174 11
-+238 178 14 242 186 14 246 190 14 246 190 14 246 190 14 246 190 14
-+238 183 13 238 183 13 206 162 42 107 107 108 66 66 66 34 34 34
-+14 14 14 6 6 6 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 6 6 6 26 26 26 70 70 70 162 134 66 210 150 10
-+238 178 14 246 190 14 246 190 14 246 190 14 246 190 14 246 190 14
-+246 190 14 246 190 14 246 190 14 246 190 14 246 190 14 246 190 14
-+246 190 14 246 190 14 246 186 14 234 193 17 188 146 14 14 14 14
-+2 2 6 2 2 6 46 46 46 246 246 246 254 254 254 254 254 254
-+229 226 233 157 140 187 147 132 180 136 121 175 127 110 169 116 94 159
-+121 102 164 121 102 164 162 146 182 236 233 239 254 254 254 254 254 254
-+254 254 254 219 220 223 87 86 85 160 108 10 218 158 10 238 178 14
-+242 186 14 246 186 14 242 186 14 238 183 13 238 183 13 242 186 14
-+242 186 14 242 186 14 246 190 14 246 190 14 246 190 14 246 190 14
-+246 190 14 246 190 14 242 186 14 226 171 11 142 122 74 66 66 66
-+30 30 30 10 10 10 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 6 6 6 26 26 26 70 70 70 162 134 66 210 150 10
-+238 178 14 246 190 14 246 190 14 246 190 14 246 190 14 246 190 14
-+246 190 14 246 190 14 246 190 14 246 190 14 246 190 14 246 190 14
-+246 190 14 246 190 14 246 190 14 246 190 14 234 193 17 122 94 10
-+30 30 30 107 107 108 219 220 223 254 254 254 250 250 250 250 250 250
-+250 250 250 216 211 227 118 106 138 147 132 180 134 114 171 126 102 165
-+127 106 167 177 168 195 250 250 250 254 254 254 254 254 254 254 254 254
-+242 242 242 82 82 82 14 14 14 160 108 10 218 158 10 238 178 14
-+242 186 14 246 190 14 246 190 14 246 190 14 246 190 14 246 190 14
-+246 190 14 246 190 14 246 190 14 246 190 14 246 190 14 246 190 14
-+246 190 14 246 190 14 246 190 14 246 190 14 238 183 13 162 134 66
-+46 46 46 18 18 17 6 6 6 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 10 10 10 30 30 30 78 78 78 162 134 66 210 150 10
-+238 178 14 242 186 14 246 190 14 246 190 14 246 190 14 246 190 14
-+246 190 14 246 190 14 246 190 14 246 190 14 246 190 14 246 190 14
-+246 190 14 246 190 14 246 190 14 246 190 14 242 198 14 214 174 14
-+186 174 146 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254
-+254 254 254 250 250 250 250 250 250 196 186 211 136 121 175 134 114 171
-+200 193 212 254 254 254 254 254 254 254 254 254 250 250 250 219 220 223
-+58 58 58 2 2 2 18 18 17 166 114 6 218 158 10 231 174 11
-+246 186 14 246 190 14 246 190 14 246 190 14 246 190 14 246 190 14
-+246 190 14 246 190 14 246 190 14 246 190 14 246 190 14 246 190 14
-+246 190 14 246 190 14 246 190 14 246 186 14 242 186 14 190 150 46
-+54 54 55 22 22 22 6 6 6 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 14 14 14 38 38 38 87 86 85 179 134 43 214 154 10
-+238 178 14 246 186 14 246 190 14 246 190 14 246 190 14 246 190 14
-+246 190 14 246 190 14 246 190 14 246 190 14 246 190 14 246 190 14
-+246 190 14 246 190 14 246 190 14 246 190 14 246 190 14 234 193 17
-+188 146 14 215 214 215 250 250 250 254 254 254 254 254 254 254 254 254
-+254 254 254 254 254 254 254 254 254 250 250 250 216 211 227 226 218 234
-+250 250 250 254 254 254 254 254 254 250 250 250 173 173 174 26 26 26
-+2 2 2 2 2 2 44 31 8 160 108 10 216 162 10 242 186 14
-+246 186 14 246 190 14 246 190 14 246 190 14 246 190 14 246 190 14
-+246 190 14 246 190 14 246 190 14 246 190 14 246 190 14 246 190 14
-+246 190 14 246 190 14 246 190 14 238 178 14 226 166 10 142 122 74
-+46 46 46 18 18 17 6 6 6 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+6 6 6 18 18 17 50 50 50 107 107 108 186 134 10 226 166 10
-+242 186 14 246 190 14 246 190 14 246 190 14 246 190 14 246 190 14
-+246 190 14 246 190 14 246 190 14 246 190 14 246 190 14 246 190 14
-+246 190 14 246 190 14 246 190 14 246 190 14 246 190 14 226 186 14
-+216 162 10 141 110 47 229 226 233 254 254 254 254 254 254 250 250 250
-+254 254 254 254 254 254 254 254 254 250 250 250 250 250 250 254 254 254
-+254 254 254 250 250 250 199 199 199 62 62 62 2 2 2 2 2 2
-+2 2 2 2 2 6 44 31 8 160 108 10 216 162 10 238 183 13
-+246 186 14 246 190 14 246 190 14 246 190 14 246 190 14 246 190 14
-+246 190 14 246 190 14 246 190 14 246 190 14 246 190 14 246 190 14
-+246 190 14 242 186 14 231 174 11 214 154 10 154 122 54 66 66 66
-+30 30 30 10 10 10 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+6 6 6 22 22 22 54 54 55 154 122 54 204 146 10 231 174 11
-+242 186 14 246 186 14 246 190 14 246 190 14 246 190 14 246 190 14
-+246 190 14 246 190 14 246 190 14 246 190 14 246 190 14 246 190 14
-+246 190 14 246 190 14 246 190 14 246 190 14 242 186 14 238 178 14
-+216 162 10 160 108 10 63 43 6 134 133 135 219 220 223 250 250 250
-+254 254 254 254 254 254 254 254 254 250 250 250 242 242 242 209 208 212
-+141 139 143 66 66 66 6 6 6 6 2 7 2 2 6 2 2 6
-+2 2 6 2 2 2 63 43 6 160 108 10 218 158 10 238 178 14
-+246 190 14 246 190 14 246 190 14 246 190 14 246 190 14 246 190 14
-+246 190 14 246 190 14 246 190 14 246 190 14 246 190 14 238 183 13
-+231 174 11 218 158 10 190 142 34 126 114 90 70 70 70 38 38 38
-+18 18 17 6 6 6 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+6 6 6 22 22 22 62 62 62 164 122 42 204 146 10 226 166 10
-+238 178 14 238 183 13 238 183 13 242 186 14 246 186 14 246 190 14
-+246 190 14 246 190 14 246 190 14 246 190 14 246 190 14 246 190 14
-+246 190 14 246 190 14 246 190 14 246 190 14 246 190 14 238 178 14
-+216 162 10 173 119 7 82 54 6 2 2 2 6 6 6 30 30 30
-+54 54 55 62 62 62 50 50 50 38 38 38 18 18 17 6 6 6
-+6 2 2 2 2 2 2 2 2 2 2 6 2 2 6 2 2 6
-+2 2 6 6 6 6 82 54 6 166 114 6 214 154 10 238 178 14
-+246 190 14 246 190 14 246 190 14 246 190 14 246 190 14 246 190 14
-+246 190 14 246 190 14 238 183 13 238 183 13 226 171 11 210 150 10
-+179 134 43 126 114 90 78 78 78 50 50 50 34 34 34 18 18 17
-+6 6 6 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+6 6 6 18 18 17 46 46 46 164 122 42 194 134 10 198 138 10
-+218 158 10 216 162 10 226 166 10 226 171 11 231 174 11 238 178 14
-+238 183 13 238 183 13 242 186 14 246 186 14 246 190 14 246 190 14
-+246 190 14 246 190 14 246 190 14 246 190 14 242 186 14 231 174 11
-+210 150 10 160 108 10 104 70 6 10 10 10 6 2 2 2 2 2
-+2 2 2 2 2 2 6 2 2 6 2 2 2 2 2 2 2 6
-+2 2 6 2 2 6 2 2 6 2 2 6 2 2 6 2 2 6
-+2 2 6 6 6 6 90 62 6 166 114 6 204 146 10 231 174 11
-+242 186 14 246 190 14 246 190 14 246 190 14 246 186 14 242 186 14
-+238 183 13 231 174 11 226 166 10 214 154 10 179 134 43 126 114 90
-+87 86 85 58 58 58 38 38 38 22 22 22 10 10 10 6 6 6
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 14 14 14 34 34 34 66 66 66 141 110 47 158 118 10
-+166 114 6 182 122 6 186 134 10 198 138 10 204 146 10 204 146 10
-+210 150 10 216 162 10 226 166 10 231 174 11 238 183 13 246 186 14
-+246 186 14 246 186 14 246 186 14 246 186 14 238 183 13 218 158 10
-+186 134 10 154 98 6 104 70 6 14 14 14 2 2 2 2 2 6
-+2 2 6 2 2 6 2 2 6 2 2 6 2 2 6 2 2 6
-+2 2 6 2 2 6 2 2 6 2 2 6 2 2 6 2 2 6
-+2 2 6 6 6 6 82 54 6 154 98 6 186 134 10 216 162 10
-+238 178 14 238 183 13 246 186 14 242 186 14 238 183 13 231 174 11
-+226 166 10 204 146 10 186 134 10 154 122 54 90 90 90 62 62 62
-+42 42 42 22 22 22 14 14 14 6 6 6 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 6 6 6 18 18 17 34 34 34 62 62 62 78 78 78
-+102 98 90 126 114 90 141 110 47 160 108 10 160 108 10 166 114 6
-+173 119 7 182 122 6 186 134 10 198 138 10 210 150 10 216 162 10
-+226 171 11 238 178 14 238 178 14 231 174 11 216 162 10 198 138 10
-+160 108 10 127 82 6 90 62 6 10 10 10 2 2 6 2 2 6
-+18 18 17 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38
-+38 38 38 38 38 38 38 38 38 38 38 38 26 26 26 2 2 6
-+2 2 2 6 6 6 63 43 6 138 93 6 173 119 7 204 146 10
-+216 162 10 231 174 11 231 174 11 231 174 11 216 162 10 210 150 10
-+186 134 10 160 108 10 126 114 90 82 82 82 50 50 50 30 30 30
-+14 14 14 6 6 6 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 6 6 6 14 14 14 22 22 22 34 34 34
-+42 42 42 58 58 58 74 74 74 87 86 85 102 98 90 122 102 70
-+124 98 46 122 86 26 138 93 6 154 98 6 160 108 10 182 122 6
-+186 134 10 194 134 10 204 146 10 204 146 10 182 122 6 160 108 10
-+134 86 6 104 70 6 44 31 8 54 54 55 107 107 108 102 98 90
-+87 86 85 82 82 82 78 78 78 78 78 78 78 78 78 78 78 78
-+78 78 78 78 78 78 78 78 78 82 82 82 87 86 85 94 94 94
-+107 107 108 104 103 100 85 65 33 127 82 6 160 108 10 182 122 6
-+186 134 10 204 146 10 204 146 10 204 146 10 194 134 10 173 119 7
-+154 98 6 107 107 108 66 66 66 42 42 42 22 22 22 10 10 10
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 6 6 6 10 10 10
-+14 14 14 22 22 22 30 30 30 38 38 38 50 50 50 62 62 62
-+74 74 74 90 90 90 102 98 90 114 102 78 122 86 26 127 82 6
-+138 93 6 154 98 6 154 98 6 154 98 6 134 86 6 118 82 10
-+104 70 6 85 65 33 102 98 90 82 82 82 58 58 58 46 46 46
-+38 38 38 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34
-+34 34 34 34 34 34 34 34 34 34 34 34 38 38 38 42 42 42
-+54 54 55 82 82 82 91 83 66 90 62 6 127 82 6 160 108 10
-+166 114 6 166 114 6 173 119 7 166 114 6 154 98 6 122 86 26
-+102 98 90 62 62 62 34 34 34 18 18 17 6 6 6 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 6 6 6 6 6 6 10 10 10 18 18 17 22 22 22
-+30 30 30 42 42 42 50 50 50 70 70 70 87 86 85 102 98 90
-+104 84 56 104 70 6 104 70 6 104 70 6 104 70 6 90 62 6
-+82 54 6 94 94 94 62 62 62 38 38 38 22 22 22 14 14 14
-+10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10
-+6 6 6 10 10 10 10 10 10 10 10 10 10 10 10 14 14 14
-+22 22 22 42 42 42 70 70 70 91 83 66 82 54 6 104 70 6
-+127 82 6 138 93 6 134 86 6 118 82 10 104 84 56 87 86 85
-+58 58 58 30 30 30 14 14 14 6 6 6 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 6 6 6
-+10 10 10 14 14 14 18 18 17 26 26 26 38 38 38 54 54 55
-+74 74 74 87 86 85 91 83 66 91 83 66 91 83 66 87 86 85
-+78 78 78 50 50 50 30 30 30 14 14 14 6 6 6 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+6 6 6 18 18 17 34 34 34 58 58 58 78 78 78 78 78 78
-+91 83 66 91 83 66 91 83 66 91 83 66 74 74 74 50 50 50
-+26 26 26 14 14 14 10 6 18 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 6 6 6 6 6 6 14 14 14 18 18 17
-+30 30 30 38 38 38 46 46 46 50 50 50 46 46 46 42 42 42
-+30 30 30 18 18 17 10 10 10 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 6 6 6 14 14 14 26 26 26 38 38 38 50 50 50
-+54 54 55 58 58 58 54 54 55 42 42 42 30 30 30 18 18 17
-+10 10 10 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 6 6 6
-+6 6 6 10 10 10 14 14 14 18 18 17 18 18 17 14 14 14
-+10 10 10 6 6 6 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 6 6 6 14 14 14 18 18 17
-+22 22 22 22 22 22 18 18 17 14 14 14 10 10 10 6 6 6
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-+2 2 2 2 2 2
-diff --git a/fs/Kconfig b/fs/Kconfig
-index 522469a..696a86f 100644
---- a/fs/Kconfig
-+++ b/fs/Kconfig
-@@ -485,6 +485,18 @@ config UDF_NLS
- default y
- depends on (UDF_FS=m && NLS) || (UDF_FS=y && NLS=y)
-
-+config GCDVD_FS
-+ tristate "GCDVD file system support"
-+ depends on BROKEN
-+ help
-+ This is the filesystem used on commercial Gamecube games. Say Y if
-+ you intend to mount GC DVD discs.
-+
-+ To compile this file system support as a module, choose M here: the
-+ module will be called gcdvdfs
-+
-+ If unsure, say N.
-+
- endmenu
- endif # BLOCK
-
-diff --git a/fs/Makefile b/fs/Makefile
-index d9f8afe..b36b461 100644
---- a/fs/Makefile
-+++ b/fs/Makefile
-@@ -83,6 +83,7 @@ obj-$(CONFIG_MINIX_FS) += minix/
- obj-$(CONFIG_FAT_FS) += fat/
- obj-$(CONFIG_BFS_FS) += bfs/
- obj-$(CONFIG_ISO9660_FS) += isofs/
-+obj-$(CONFIG_GCDVD_FS) += gcdvdfs/
- obj-$(CONFIG_HFSPLUS_FS) += hfsplus/ # Before hfs to find wrapped HFS+
- obj-$(CONFIG_HFS_FS) += hfs/
- obj-$(CONFIG_ECRYPT_FS) += ecryptfs/
-diff --git a/fs/gcdvdfs/Makefile b/fs/gcdvdfs/Makefile
-new file mode 100644
-index 0000000..2ac5b5a
---- /dev/null
-+++ b/fs/gcdvdfs/Makefile
-@@ -0,0 +1,6 @@
-+obj-$(CONFIG_GCDVD_FS) := gcdvdfs.o
-+
-+gcdvdfs-objs-y := main.o inode.o dir.o namei.o fst.o dol.o
-+
-+gcdvdfs-objs := $(gcdvdfs-objs-y)
-+
-diff --git a/fs/gcdvdfs/dir.c b/fs/gcdvdfs/dir.c
-new file mode 100644
-index 0000000..51c7cff
---- /dev/null
-+++ b/fs/gcdvdfs/dir.c
-@@ -0,0 +1,120 @@
-+/*
-+ * fs/gcdvdfs/dir.c
-+ *
-+ * Nintendo GameCube Filesystem driver
-+ * Copyright (C) 2006 The GameCube Linux Team
-+ *
-+ * This program is free software; you can redistribute it and/or
-+ * modify it under the terms of the 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/module.h>
-+#include <linux/fs.h>
-+#include "fst.h"
-+#include "dir.h"
-+#include "inode.h"
-+#include "namei.h"
-+
-+struct readdir_data
-+{
-+ struct gc_dvdfs_fst *fst;
-+ struct file *filp;
-+ filldir_t filldir;
-+ void *dirent;
-+ u32 idx;
-+};
-+
-+static int gc_dvdfs_readdir_callback(struct gc_dvdfs_file_entry *pfe,void *param)
-+{
-+ struct readdir_data *rdd = (struct readdir_data*)param;
-+ int len;
-+ const char *pname;
-+
-+ if ((gc_dvdfs_valid_file_entry(rdd->fst,pfe) == 0) &&
-+ (rdd->idx == rdd->filp->f_pos))
-+ {
-+ /* add this item to the list now */
-+ pname = FILENAME(rdd->fst,pfe);
-+ len = strlen(pname);
-+
-+ if (rdd->filldir(rdd->dirent,pname,len,rdd->filp->f_pos,
-+ PFE_TO_INO(rdd->fst,pfe),
-+ (pfe->type == FST_DIRECTORY) ? DT_DIR : DT_REG) < 0)
-+ {
-+ /* failure, so stop enumerating */
-+ return -1;
-+ }
-+ rdd->filp->f_pos++;
-+ }
-+ /* increment count */
-+ rdd->idx++;
-+ return 0;
-+}
-+
-+static int gc_dvdfs_readdir(struct file *filp,void *dirent,filldir_t filldir)
-+{
-+ struct inode *inode = filp->f_dentry->d_inode;
-+ struct gc_dvdfs_fst *fst = (struct gc_dvdfs_fst*)inode->i_sb->s_fs_info;
-+ struct gc_dvdfs_file_entry *pfe;
-+ struct readdir_data rdd;
-+ int i;
-+
-+ /* first entry is . */
-+ switch ((u32)filp->f_pos)
-+ {
-+ case 0:
-+ if (filldir(dirent,".",1,0,inode->i_ino,DT_DIR) < 0)
-+ return 0;
-+ filp->f_pos = 1;
-+ /* fall through */
-+ case 1:
-+ if (filldir(dirent,"..",2,1,parent_ino(filp->f_dentry),DT_DIR) < 0)
-+ return 0;
-+ filp->f_pos = 2;
-+ /* fall through */
-+ default:
-+ if (inode->i_ino == ROOT_INO)
-+ {
-+ for (i=filp->f_pos-2;i<num_root_dir_entries;++i)
-+ {
-+ if (filldir(dirent,root_dir_entries[i].name,
-+ root_dir_entries[i].name_length,filp->f_pos,
-+ root_dir_entries[i].ino,
-+ root_dir_entries[i].filldir_type) < 0)
-+ {
-+ return 0;
-+ }
-+
-+ filp->f_pos++;
-+ }
-+ }
-+ else if (inode->i_ino >= DATA_INO)
-+ {
-+ /* use enumerate, the function will check for the FST_DIRECTORY flag */
-+ pfe = INO_TO_PFE(fst,inode->i_ino);
-+
-+ rdd.fst = fst;
-+ rdd.filp = filp;
-+ rdd.filldir = filldir;
-+ rdd.dirent = dirent;
-+ rdd.idx = 2;
-+
-+ gc_dvdfs_enumerate(fst,pfe,gc_dvdfs_readdir_callback,&rdd);
-+ }
-+ }
-+ return 0;
-+}
-+
-+struct file_operations gc_dvdfs_dir_operations =
-+{
-+ .read = generic_read_dir,
-+ .readdir = gc_dvdfs_readdir,
-+};
-+
-+struct inode_operations gc_dvdfs_dir_inode_operations =
-+{
-+ .lookup = gc_dvdfs_lookup,
-+};
-+
-diff --git a/fs/gcdvdfs/dir.h b/fs/gcdvdfs/dir.h
-new file mode 100644
-index 0000000..f415510
---- /dev/null
-+++ b/fs/gcdvdfs/dir.h
-@@ -0,0 +1,20 @@
-+/*
-+ * fs/gcdvdfs/dir.h
-+ *
-+ * Nintendo GameCube Filesystem driver
-+ * Copyright (C) 2006 The GameCube Linux Team
-+ *
-+ * This program is free software; you can redistribute it and/or
-+ * modify it under the terms of the 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 __dir__gc__
-+#define __dir__gc__
-+
-+extern struct file_operations gc_dvdfs_dir_operations;
-+extern struct inode_operations gc_dvdfs_dir_inode_operations;
-+
-+#endif
-diff --git a/fs/gcdvdfs/dol.c b/fs/gcdvdfs/dol.c
-new file mode 100644
-index 0000000..c2dc6ac
---- /dev/null
-+++ b/fs/gcdvdfs/dol.c
-@@ -0,0 +1,63 @@
-+/*
-+ * fs/gcdvdfs/dol.c
-+ *
-+ * Nintendo GameCube Filesystem driver
-+ * Copyright (C) 2006 The GameCube Linux Team
-+ *
-+ * This program is free software; you can redistribute it and/or
-+ * modify it under the terms of the 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/module.h>
-+#include <linux/types.h>
-+#include "fst.h"
-+#include "dol.h"
-+
-+void gc_dvdfs_fix_raw_dol_header(struct gc_dvdfs_dol_header *pdh)
-+{
-+#ifdef __LITTLE_ENDIAN
-+#define SWAP(a) (a) = be32_to_cpu(a)
-+ unsigned int i;
-+
-+ for (i=0;i<7;++i)
-+ {
-+ SWAP(pdh->text_file_pos[i]);
-+ SWAP(pdh->text_mem_pos[i]);
-+ SWAP(pdh->text_section_size[i]);
-+ }
-+
-+ for (i=0;i<11;++i)
-+ {
-+ SWAP(pdh->data_file_pos[i]);
-+ SWAP(pdh->data_mem_pos[i]);
-+ SWAP(pdh->data_section_size[i]);
-+ }
-+
-+ SWAP(pdh->bss_mem_address);
-+ SWAP(pdh->bss_size);
-+ SWAP(pdh->entry_point);
-+#endif
-+}
-+
-+u32 gc_dvdfs_get_dol_file_size(struct gc_dvdfs_dol_header *pdh)
-+{
-+ unsigned int tmp;
-+ unsigned int i;
-+ unsigned int max = 0;
-+
-+ for (i=0;i<7;++i)
-+ {
-+ tmp = pdh->text_file_pos[i] + pdh->text_section_size[i];
-+ if (tmp > max)
-+ max = tmp;
-+ }
-+ for (i=0;i<11;++i)
-+ {
-+ tmp = pdh->data_file_pos[i] + pdh->data_section_size[i];
-+ if (tmp > max)
-+ max = tmp;
-+ }
-+ return max;
-+}
-diff --git a/fs/gcdvdfs/dol.h b/fs/gcdvdfs/dol.h
-new file mode 100644
-index 0000000..32c6b43
---- /dev/null
-+++ b/fs/gcdvdfs/dol.h
-@@ -0,0 +1,20 @@
-+/*
-+ * fs/gcdvdfs/dol.h
-+ *
-+ * Nintendo GameCube Filesystem driver
-+ * Copyright (C) 2006 The GameCube Linux Team
-+ *
-+ * This program is free software; you can redistribute it and/or
-+ * modify it under the terms of the 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 __dol__h
-+#define __dol__h
-+
-+void gc_dvdfs_fix_raw_dol_header(struct gc_dvdfs_dol_header *pdh);
-+
-+u32 gc_dvdfs_get_dol_file_size(struct gc_dvdfs_dol_header *pdh);
-+
-+#endif
-diff --git a/fs/gcdvdfs/fst.c b/fs/gcdvdfs/fst.c
-new file mode 100644
-index 0000000..a2f8cda
---- /dev/null
-+++ b/fs/gcdvdfs/fst.c
-@@ -0,0 +1,105 @@
-+/*
-+ * fs/gcdvdfs/fst.c
-+ *
-+ * Nintendo GameCube Filesystem driver
-+ * Copyright (C) 2006 The GameCube Linux Team
-+ *
-+ * This program is free software; you can redistribute it and/or
-+ * modify it under the terms of the 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/module.h>
-+#include <linux/types.h>
-+#include <linux/errno.h>
-+#include <linux/fs.h>
-+#include <linux/init.h>
-+#include "fst.h"
-+
-+int gc_dvdfs_valid_file_entry(struct gc_dvdfs_fst *fst,struct gc_dvdfs_file_entry *pfe)
-+{
-+ unsigned int foffset = FILENAME_OFFSET(pfe);
-+
-+ if (((pfe->type != FST_FILE) && (pfe->type != FST_DIRECTORY)) ||
-+ (foffset >= fst->str_table_size))
-+ {
-+ return -EINVAL;
-+ }
-+ return 0;
-+}
-+
-+int gc_dvdfs_enumerate(struct gc_dvdfs_fst *fst,struct gc_dvdfs_file_entry *pfe,int (*callback)(struct gc_dvdfs_file_entry *pfe,void *param),void *param)
-+{
-+ /* get the filename */
-+ unsigned int i;
-+ unsigned int entries;
-+ int r;
-+
-+ /* only enumerate directories */
-+ if (pfe->type != FST_DIRECTORY)
-+ {
-+ return -EINVAL;
-+ }
-+
-+ entries = pfe->dir.offset_next;
-+ i=((unsigned int)pfe - (unsigned int)fst->root)/sizeof(struct gc_dvdfs_file_entry) + 1;
-+ /* check if out of bounds */
-+ if (i >= MAX_ENTRIES(fst) || entries > MAX_ENTRIES(fst))
-+ {
-+ return -EINVAL;
-+ }
-+
-+ /* loop through the files */
-+ while (i < entries)
-+ {
-+ /* do the callback */
-+ if ((r=callback(fst->root + i,param)) < 0)
-+ {
-+ return r;
-+ }
-+
-+ if (fst->root[i].type == FST_DIRECTORY)
-+ {
-+ if (fst->root[i].dir.offset_next <= i)
-+ {
-+ /* we're going backwards or looping, abort */
-+ return -EINVAL;
-+ }
-+ i = fst->root[i].dir.offset_next;
-+ }
-+ else
-+ {
-+ ++i;
-+ }
-+ }
-+ return 0;
-+}
-+
-+static int gc_dvdfs_get_directory_info_callback(struct gc_dvdfs_file_entry *pfe,void *param)
-+{
-+ struct gc_dvdfs_directory_info *di = (struct gc_dvdfs_directory_info*)param;
-+
-+ if (gc_dvdfs_valid_file_entry(di->fst,pfe) == 0)
-+ {
-+ if (pfe->type == FST_FILE)
-+ {
-+ di->total_files++;
-+ di->total_file_size += pfe->file.length;
-+ }
-+ else if (pfe->type == FST_DIRECTORY)
-+ {
-+ di->total_directories++;
-+ }
-+ }
-+ return 0;
-+}
-+
-+int gc_dvdfs_get_directory_info(struct gc_dvdfs_directory_info *di)
-+{
-+ di->total_files = 0;
-+ di->total_directories = 0;
-+ di->total_file_size = 0;
-+
-+ return gc_dvdfs_enumerate(di->fst,di->pfe,gc_dvdfs_get_directory_info_callback,di);
-+}
-diff --git a/fs/gcdvdfs/fst.h b/fs/gcdvdfs/fst.h
-new file mode 100644
-index 0000000..ca3f5e6
---- /dev/null
-+++ b/fs/gcdvdfs/fst.h
-@@ -0,0 +1,126 @@
-+/*
-+ * fs/gcdvdfs/fst.h
-+ *
-+ * Nintendo GameCube Filesystem driver
-+ * Copyright (C) 2006 The GameCube Linux Team
-+ *
-+ * This program is free software; you can redistribute it and/or
-+ * modify it under the terms of the 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 __fst__h
-+#define __fst__h
-+
-+#define FST_OFFSET 0x0424
-+
-+#define FST_FILE 0
-+#define FST_DIRECTORY 1
-+
-+#pragma pack(1)
-+struct gc_dvdfs_disc_header
-+{
-+ u32 game_code;
-+ u16 maker_code;
-+ u8 disc_id;
-+ u8 version;
-+ u8 streaming;
-+ u8 streamBufSize;
-+ u8 padding1[22];
-+ u8 game_name[992];
-+ u32 offset_dh_bin;
-+ u32 addr_debug_monitor;
-+ u8 padding2[24];
-+ u32 offset_bootfile;
-+ u32 offset_fst;
-+ u32 fst_size;
-+ u32 max_fst_size;
-+ u32 user_position;
-+ u32 user_length;
-+ u8 padding[7];
-+};
-+
-+struct gc_dvdfs_file_entry
-+{
-+ u8 type;
-+ u8 offset_filename[3];
-+ union
-+ {
-+ struct
-+ {
-+ u32 offset;
-+ u32 length; /* if root, number of entries */
-+ } file;
-+ struct
-+ {
-+ u32 offset_parent;
-+ u32 offset_next;
-+ } dir;
-+ };
-+};
-+
-+#define APPLOADER_OFFSET 0x2440
-+struct gc_dvdfs_apploader
-+{
-+ u8 version[10];
-+ u8 padding[6];
-+ u32 entry_point;
-+ u32 size;
-+};
-+
-+struct gc_dvdfs_dol_header
-+{
-+ u32 text_file_pos[7];
-+ u32 data_file_pos[11];
-+ u32 text_mem_pos[7];
-+ u32 data_mem_pos[11];
-+ u32 text_section_size[7];
-+ u32 data_section_size[11];
-+ u32 bss_mem_address;
-+ u32 bss_size;
-+ u32 entry_point;
-+};
-+
-+#pragma pack()
-+
-+struct gc_dvdfs_fst;
-+
-+struct gc_dvdfs_directory_info
-+{
-+ struct gc_dvdfs_fst *fst;
-+ struct gc_dvdfs_file_entry *pfe;
-+
-+ u32 total_files;
-+ u32 total_directories;
-+ u32 total_file_size;
-+};
-+
-+struct gc_dvdfs_fst
-+{
-+ struct gc_dvdfs_file_entry *root;
-+ const char *str_table;
-+ u32 size;
-+ u32 str_table_size;
-+ u32 dol_length;
-+ u32 dol_offset;
-+ u32 total_files;
-+ u32 total_directories;
-+ u32 total_file_size;
-+ struct gc_dvdfs_apploader apploader;
-+ struct gc_dvdfs_dol_header dol_header;
-+};
-+
-+#define MAX_ENTRIES(fst) (fst)->root->dir.offset_next
-+#define FILENAME_OFFSET(pfe) (((pfe)->offset_filename[0] << 16) | \
-+ ((pfe)->offset_filename[1] << 8) | \
-+ (pfe)->offset_filename[2])
-+
-+#define FILENAME(fst,pfe) ((fst)->str_table + FILENAME_OFFSET(pfe))
-+
-+int gc_dvdfs_valid_file_entry(struct gc_dvdfs_fst *fst,struct gc_dvdfs_file_entry *pfe);
-+int gc_dvdfs_enumerate(struct gc_dvdfs_fst *fst,struct gc_dvdfs_file_entry *pfe,int (*callback)(struct gc_dvdfs_file_entry *pfe,void *param),void *param);
-+
-+int gc_dvdfs_get_directory_info(struct gc_dvdfs_directory_info *di);
-+
-+#endif
-diff --git a/fs/gcdvdfs/inode.c b/fs/gcdvdfs/inode.c
-new file mode 100644
-index 0000000..ee490e1
---- /dev/null
-+++ b/fs/gcdvdfs/inode.c
-@@ -0,0 +1,105 @@
-+/*
-+ * fs/gcdvdfs/inode.c
-+ *
-+ * Nintendo GameCube Filesystem driver
-+ * Copyright (C) 2006 The GameCube Linux Team
-+ *
-+ * This program is free software; you can redistribute it and/or
-+ * modify it under the terms of the 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/module.h>
-+#include <linux/fs.h>
-+#include <linux/mm.h>
-+#include <linux/types.h>
-+#include <linux/errno.h>
-+#include <linux/vfs.h>
-+#include <linux/highmem.h>
-+#include <linux/blkdev.h>
-+
-+#include "fst.h"
-+#include "inode.h"
-+#include "dir.h"
-+#include "namei.h"
-+
-+extern int gc_dvdfs_read_into_memory(struct super_block *s,u32 offset,
-+ u32 size,unsigned char *data);
-+
-+static int gc_dvdfs_readpage(struct file *file,struct page *page)
-+{
-+ struct inode *inode = (struct inode*)page->mapping->host;
-+ struct gc_dvdfs_fst *fst = (struct gc_dvdfs_fst*)inode->i_sb->s_fs_info;
-+ struct gc_dvdfs_file_entry *pfe;
-+ void *buf;
-+ loff_t offset;
-+ loff_t block_base;
-+ loff_t len;
-+ int ret = 0;
-+
-+ switch (inode->i_ino)
-+ {
-+ case ROOT_INO:
-+ return -EIO;
-+ case APPLOADER_INO:
-+ block_base = APPLOADER_OFFSET;
-+ break;
-+ case BOOTDOL_INO:
-+ block_base = fst->dol_offset;
-+ break;
-+ default:
-+ pfe = INO_TO_PFE(fst,inode->i_ino);
-+ block_base = pfe->file.offset;
-+ break;
-+ }
-+
-+ get_page(page);
-+ ClearPageUptodate(page);
-+ ClearPageError(page);
-+ /* do a lock here */
-+
-+ offset = (page->index << PAGE_CACHE_SHIFT);
-+ block_base += offset;
-+ /* now map into kernel space and fill the page */
-+ kmap(page);
-+ buf = page_address(page);
-+ if (offset < inode->i_size)
-+ {
-+ len = min((loff_t)PAGE_SIZE,inode->i_size - offset);
-+ if (gc_dvdfs_read_into_memory(inode->i_sb,block_base,len,buf))
-+ {
-+ ret = -EIO;
-+ }
-+ }
-+ flush_dcache_page(page);
-+ kunmap(page);
-+
-+ /* unlock */
-+
-+ if (ret)
-+ {
-+ SetPageError(page);
-+ }
-+ else
-+ {
-+ SetPageUptodate(page);
-+ }
-+ page_cache_release(page);
-+
-+ unlock_page(page);
-+ return ret;
-+}
-+
-+struct address_space_operations gc_dvdfs_addr_operations =
-+{
-+ .readpage = gc_dvdfs_readpage,
-+};
-+
-+struct root_dir_entry root_dir_entries[] = {
-+ { "apploader", 9, DT_REG, APPLOADER_INO },
-+ { "boot.dol" , 8, DT_REG, BOOTDOL_INO },
-+ { "data" , 4, DT_DIR, DATA_INO }
-+};
-+
-+unsigned int num_root_dir_entries = sizeof(root_dir_entries) / sizeof(root_dir_entries[0]);
-diff --git a/fs/gcdvdfs/inode.h b/fs/gcdvdfs/inode.h
-new file mode 100644
-index 0000000..9e33e76
---- /dev/null
-+++ b/fs/gcdvdfs/inode.h
-@@ -0,0 +1,37 @@
-+/*
-+ * fs/gcdvdfs/inode.h
-+ *
-+ * Nintendo GameCube Filesystem driver
-+ * Copyright (C) 2006 The GameCube Linux Team
-+ *
-+ * This program is free software; you can redistribute it and/or
-+ * modify it under the terms of the 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 __inode_fst__
-+#define __inode_fst__
-+
-+#define ROOT_INO 1
-+#define APPLOADER_INO 2
-+#define BOOTDOL_INO 3
-+#define DATA_INO 4
-+
-+#define PFE_TO_INO(fst,pfe) (((unsigned long)(pfe) - (unsigned long)(fst)->root)/sizeof(struct gc_dvdfs_file_entry)+DATA_INO)
-+#define INO_TO_PFE(fst,ino) ((fst)->root + ((ino)-DATA_INO))
-+
-+struct root_dir_entry
-+{
-+ const char *name;
-+ unsigned int name_length;
-+ unsigned int filldir_type;
-+ unsigned int ino;
-+};
-+
-+extern struct root_dir_entry root_dir_entries[];
-+extern unsigned int num_root_dir_entries;
-+
-+extern struct address_space_operations gc_dvdfs_addr_operations;
-+
-+#endif
-diff --git a/fs/gcdvdfs/main.c b/fs/gcdvdfs/main.c
-new file mode 100644
-index 0000000..a69807b
---- /dev/null
-+++ b/fs/gcdvdfs/main.c
-@@ -0,0 +1,346 @@
-+/*
-+ * fs/gcdvdfs/main.c
-+ *
-+ * Nintendo GameCube Filesystem driver
-+ * Copyright (C) 2006 The GameCube Linux Team
-+ *
-+ * This program is free software; you can redistribute it and/or
-+ * modify it under the terms of the 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/module.h>
-+#include <linux/types.h>
-+#include <linux/errno.h>
-+#include <linux/vmalloc.h>
-+#include <linux/fs.h>
-+#include <linux/init.h>
-+#include <linux/genhd.h>
-+#include <linux/buffer_head.h>
-+#include <linux/statfs.h>
-+#include "fst.h"
-+#include "inode.h"
-+#include "dir.h"
-+#include "dol.h"
-+
-+#define GC_DVD_SECTOR_SIZE 2048
-+#define GC_DVD_MAX_SECTORS 712880
-+
-+#define FST_MAGIC 0x78B39EA1
-+#define DEBUG
-+
-+int gc_dvdfs_read_into_memory(struct super_block *s,u32 offset,u32 size,unsigned char *data)
-+{
-+ struct buffer_head *bh;
-+ u32 sector;
-+ u32 sector_end;
-+ u32 byte_start;
-+ u32 byte_len;
-+ unsigned char *start;
-+
-+ sector = offset >> s->s_blocksize_bits;
-+ sector_end = (offset + size - 1) >> s->s_blocksize_bits;
-+ while (sector <= sector_end)
-+ {
-+ if (!(bh = sb_bread(s,sector)))
-+ {
-+ return -EINVAL;
-+ }
-+ /* store data into the memory buffer */
-+ byte_start = sector << s->s_blocksize_bits;
-+ byte_len = bh->b_size;
-+ start = bh->b_data;
-+ /* check if not in the middle */
-+ if (byte_start < offset)
-+ {
-+ start = bh->b_data + (offset - byte_start);
-+ byte_len -= (offset - byte_start);
-+ }
-+ /* check if we will overflow */
-+ if (byte_len > size)
-+ {
-+ byte_len = size;
-+ }
-+ /* now copy the data */
-+ memcpy(data,start,byte_len);
-+ data += byte_len;
-+ size -= byte_len;
-+ /* move the sector along */
-+ sector += (bh->b_size >> s->s_blocksize_bits);
-+ brelse(bh);
-+ }
-+#ifdef DEBUG
-+ if (size != 0)
-+ {
-+ printk(KERN_INFO "WARNING - read_into_memory still has a size value %u\n",
-+ size);
-+ }
-+#endif
-+ return 0;
-+}
-+
-+static void gc_dvdfs_read_inode(struct inode *i)
-+{
-+ struct gc_dvdfs_directory_info di;
-+ unsigned int size;
-+
-+ di.fst = (struct gc_dvdfs_fst*)i->i_sb->s_fs_info;
-+ /* load the defaults for all inodes */
-+ i->i_mtime.tv_sec = i->i_atime.tv_sec = i->i_ctime.tv_sec = 0;
-+ i->i_mtime.tv_nsec = i->i_atime.tv_nsec = i->i_ctime.tv_nsec = 0;
-+ i->i_uid = 0;
-+ i->i_gid = 0;
-+ /* load based on type */
-+ if (i->i_ino == ROOT_INO)
-+ {
-+ i->i_fop = &gc_dvdfs_dir_operations;
-+ i->i_op = &gc_dvdfs_dir_inode_operations;
-+ i->i_mode = S_IFDIR | 0111;
-+ i->i_nlink = 3;
-+ size = 0;
-+ }
-+ else
-+ {
-+ if ((i->i_ino >= DATA_INO) &&
-+ (di.pfe = INO_TO_PFE(di.fst,i->i_ino)) &&
-+ (di.pfe->type == FST_DIRECTORY))
-+ {
-+ i->i_fop = &gc_dvdfs_dir_operations;
-+ i->i_op = &gc_dvdfs_dir_inode_operations;
-+ i->i_mode = S_IFDIR | 0111;
-+ /* compute the number of links */
-+ gc_dvdfs_get_directory_info(&di);
-+ i->i_nlink = 2 + di.total_directories;
-+
-+ size = sizeof(struct gc_dvdfs_file_entry);
-+ }
-+ else
-+ {
-+ i->i_fop = &generic_ro_fops;
-+ i->i_data.a_ops = &gc_dvdfs_addr_operations;
-+ i->i_mode = S_IFREG;
-+ i->i_nlink = 1;
-+ switch (i->i_ino)
-+ {
-+ case APPLOADER_INO:
-+ size = di.fst->apploader.size;
-+ break;
-+ case BOOTDOL_INO:
-+ size = di.fst->dol_length;
-+ break;
-+ default:
-+ size = di.pfe->file.length;
-+ break;
-+ }
-+ }
-+ }
-+
-+ i->i_mode |= 0444;
-+ i_size_write(i,size);
-+}
-+
-+static int gc_dvdfs_statfs(struct dentry * dentry,struct kstatfs *sfs)
-+{
-+ struct super_block *sb = dentry->d_sb;
-+ struct gc_dvdfs_fst *fst = (struct gc_dvdfs_fst*)sb->s_fs_info;
-+
-+ sfs->f_type = sb->s_magic;
-+ sfs->f_bsize = sb->s_blocksize;
-+ sfs->f_blocks = fst->total_file_size >> sb->s_blocksize_bits;
-+ sfs->f_bfree = 0;
-+ sfs->f_bavail = 0;
-+ sfs->f_files = fst->total_files;
-+ sfs->f_ffree = 0;
-+ /* sfs->f_fsid = 0; */
-+ sfs->f_namelen = 256;
-+ sfs->f_frsize = 0;
-+ return 0;
-+}
-+
-+static void gc_dvdfs_free_fst(struct gc_dvdfs_fst *fst)
-+{
-+ if (fst)
-+ {
-+ vfree(fst);
-+ }
-+}
-+
-+static void gc_dvdfs_put_super(struct super_block *sb)
-+{
-+ /* ok free my FST */
-+ if (sb->s_fs_info)
-+ {
-+ gc_dvdfs_free_fst((struct gc_dvdfs_fst*)sb->s_fs_info);
-+ sb->s_fs_info = NULL;
-+ }
-+}
-+
-+static struct super_operations gcdvdfs_ops = {
-+ .read_inode = gc_dvdfs_read_inode,
-+ .put_super = gc_dvdfs_put_super,
-+ .statfs = gc_dvdfs_statfs
-+};
-+
-+static int gc_dvdfs_validate_fst(struct gc_dvdfs_fst *fst)
-+{
-+ unsigned int entries;
-+ unsigned int i;
-+
-+ /* make sure the FST is completely valid */
-+ if (fst->root->type != FST_DIRECTORY)
-+ {
-+ printk(KERN_ERR "gcdvdfs: Root entry is not a directory!\n");
-+ return -EINVAL;
-+ }
-+
-+ entries = be32_to_cpu(fst->root->dir.offset_next);
-+ if (entries >= (fst->size / sizeof(struct gc_dvdfs_file_entry)))
-+ {
-+ printk(KERN_ERR "gcdvdfs: Too many entries, will overflow the FST!\n");
-+ return -EINVAL;
-+ }
-+ /* ok let's convert all the data to native format and compute total size*/
-+ for (i=0;i<entries;++i)
-+ {
-+#ifdef __LITTLE_ENDIAN
-+ fst->root[i].file.length = be32_to_cpu(fst->root[i].file.length);
-+ fst->root[i].file.offset = be32_to_cpu(fst->root[i].file.offset);
-+#endif
-+ if (fst->root[i].type == FST_FILE)
-+ {
-+ fst->total_files++;
-+ fst->total_file_size += fst->root[i].file.length;
-+ }
-+ else if (fst->root[i].type == FST_DIRECTORY)
-+ {
-+ fst->total_directories++;
-+ }
-+ }
-+
-+ return 0;
-+}
-+
-+static int gc_dvdfs_fill_super(struct super_block *s,void *data,int silent)
-+{
-+ struct buffer_head *bh;
-+ struct gc_dvdfs_disc_header *dh;
-+ struct gc_dvdfs_fst *fst;
-+ unsigned int fst_offset;
-+ unsigned int fst_size;
-+ unsigned int dol_offset;
-+
-+ sb_min_blocksize(s,GC_DVD_SECTOR_SIZE);
-+ /* s->s_maxbytes = 4*GC_DVD_SECTOR_SIZE; */
-+
-+ /* read the header and check results */
-+ if (!(bh = sb_bread(s,0)))
-+ {
-+ return -EINVAL;
-+ }
-+ else if (bh->b_size < sizeof(struct gc_dvdfs_disc_header))
-+ {
-+ brelse(bh);
-+ return -EINVAL;
-+ }
-+
-+ /* read the FST into memory */
-+ dh = (struct gc_dvdfs_disc_header*)bh->b_data;
-+ fst_offset = be32_to_cpu(dh->offset_fst);
-+ fst_size = be32_to_cpu(dh->fst_size);
-+ dol_offset = be32_to_cpu(dh->offset_bootfile);
-+ brelse(bh);
-+
-+ /* now allocate the fst */
-+ if (!(fst = vmalloc(sizeof(struct gc_dvdfs_fst) + fst_size)))
-+ {
-+ return -ENOMEM;
-+ }
-+ fst->size = fst_size;
-+ fst->root = (struct gc_dvdfs_file_entry*)((unsigned int)fst + sizeof(struct gc_dvdfs_fst));
-+ /* now try to read the fst */
-+ if (gc_dvdfs_read_into_memory(s,fst_offset,fst_size,(unsigned char*)fst->root))
-+ {
-+ printk(KERN_ERR "gcdvdfs: Unable to read FST into memory\n");
-+ goto fst_error;
-+ }
-+ /* now try to read the apploader */
-+ if (gc_dvdfs_read_into_memory(s,APPLOADER_OFFSET,sizeof(struct gc_dvdfs_apploader),(unsigned char*)&fst->apploader))
-+ {
-+ printk(KERN_ERR "gcdvdfs: Unable to read apploader into memory\n");
-+ goto fst_error;
-+ }
-+ /* fix up the apploader */
-+ fst->apploader.entry_point = be32_to_cpu(fst->apploader.entry_point);
-+ fst->apploader.size = be32_to_cpu(fst->apploader.size);
-+ /* now try to read the dol header */
-+ if (gc_dvdfs_read_into_memory(s,dol_offset,sizeof(struct gc_dvdfs_dol_header),(unsigned char*)&fst->dol_header))
-+ {
-+ printk(KERN_ERR "gcdvdfs: Unable to read DOL Header\n");
-+ goto fst_error;
-+ }
-+ gc_dvdfs_fix_raw_dol_header(&fst->dol_header);
-+
-+ fst->dol_offset = dol_offset;
-+ fst->dol_length = gc_dvdfs_get_dol_file_size(&fst->dol_header);
-+ /* compute the location of the string table */
-+ fst_offset = be32_to_cpu(fst->root->dir.offset_next) * sizeof(struct gc_dvdfs_file_entry);
-+ fst->str_table = (unsigned char*)fst->root + fst_offset;
-+ fst->str_table_size = fst->size - fst_offset;
-+ fst->total_files = 0;
-+ fst->total_directories = 0;
-+ fst->total_file_size = 0;
-+ /* now validate the fst */
-+ if (gc_dvdfs_validate_fst(fst))
-+ {
-+ goto fst_error;
-+ }
-+
-+ /* store my FST in s->s_fs_info */
-+ s->s_flags |= MS_RDONLY | MS_NOSUID | MS_NODEV | MS_NOATIME | MS_NODIRATIME;
-+ s->s_fs_info = fst;
-+ s->s_magic = FST_MAGIC;
-+ s->s_op = &gcdvdfs_ops;
-+ if (!(s->s_root = d_alloc_root(iget(s,ROOT_INO))))
-+ {
-+ goto fst_error;
-+ }
-+ return 0;
-+
-+ fst_error:
-+ gc_dvdfs_free_fst(fst);
-+ return -EINVAL;
-+}
-+
-+static int gc_dvdfs_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,gc_dvdfs_fill_super,mnt);
-+}
-+
-+static struct file_system_type gcdvdfs_type = {
-+ .owner = THIS_MODULE,
-+ .name = "gcdvdfs",
-+ .get_sb = gc_dvdfs_get_sb,
-+ /*.kill_sb = gc_dvdfs_kill_sb, */
-+ .kill_sb = kill_block_super,
-+ .fs_flags = FS_REQUIRES_DEV
-+};
-+
-+static int __init gc_dvdfs_init(void)
-+{
-+ printk(KERN_INFO "Gamecube DVD filesystem: by Todd Jeffreys\n");
-+ return register_filesystem(&gcdvdfs_type);
-+}
-+
-+static void __exit gc_dvdfs_exit(void)
-+{
-+ unregister_filesystem(&gcdvdfs_type);
-+}
-+
-+MODULE_LICENSE("GPL");
-+MODULE_AUTHOR("Todd Jeffreys");
-+MODULE_DESCRIPTION("Gamecube DVD filesystem");
-+
-+module_init(gc_dvdfs_init);
-+module_exit(gc_dvdfs_exit);
-diff --git a/fs/gcdvdfs/namei.c b/fs/gcdvdfs/namei.c
-new file mode 100644
-index 0000000..2488406
---- /dev/null
-+++ b/fs/gcdvdfs/namei.c
-@@ -0,0 +1,100 @@
-+/*
-+ * fs/gcdvdfs/namei.c
-+ *
-+ * Nintendo GameCube Filesystem driver
-+ * Copyright (C) 2006 The GameCube Linux Team
-+ *
-+ * This program is free software; you can redistribute it and/or
-+ * modify it under the terms of the 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/module.h>
-+#include <linux/types.h>
-+#include <linux/errno.h>
-+#include <linux/fs.h>
-+#include <linux/init.h>
-+#include <linux/genhd.h>
-+#include <linux/buffer_head.h>
-+#include <linux/statfs.h>
-+#include "fst.h"
-+#include "inode.h"
-+
-+/*
-+ i is the parent directory
-+ dentry I must complete
-+ nid is lookup nameidata
-+
-+ Complete by calling d_add(dentry,inode)
-+
-+ If name is not found, inode must be set to null.
-+
-+ Return an error only when the lookup fails due to hardware/other error
-+
-+*/
-+
-+struct gc_dvdfs_lookup_data
-+{
-+ struct gc_dvdfs_fst *fst;
-+ const char *pname;
-+ unsigned long ino;
-+};
-+
-+static int gc_dvdfs_lookup_callback(struct gc_dvdfs_file_entry *pfe,void *param)
-+{
-+ struct gc_dvdfs_lookup_data *data = (struct gc_dvdfs_lookup_data*)param;
-+
-+ if (gc_dvdfs_valid_file_entry(data->fst,pfe) == 0)
-+ {
-+ if (strcmp(FILENAME(data->fst,pfe),data->pname) == 0)
-+ {
-+ data->ino = PFE_TO_INO(data->fst,pfe);
-+ /* this will stop enumeration */
-+ return -1;
-+ }
-+ }
-+ return 0;
-+}
-+
-+struct dentry *gc_dvdfs_lookup(struct inode *dir,struct dentry *dentry,struct nameidata *nid)
-+{
-+ struct inode *inode = NULL;
-+ struct gc_dvdfs_lookup_data data;
-+ unsigned int i;
-+
-+ data.ino = 0;
-+ data.pname = dentry->d_name.name;
-+ /* handle special case of the root directory */
-+ if (dir->i_ino == ROOT_INO)
-+ {
-+ for (i=0;i<num_root_dir_entries;++i)
-+ {
-+ if (strcmp(data.pname,root_dir_entries[i].name) == 0)
-+ {
-+ data.ino = root_dir_entries[i].ino;
-+ break;
-+ }
-+ }
-+ }
-+ else if (dir->i_ino >= DATA_INO)
-+ {
-+ data.fst = (struct gc_dvdfs_fst*)dir->i_sb->s_fs_info;
-+
-+ gc_dvdfs_enumerate(data.fst,INO_TO_PFE(data.fst,dir->i_ino),
-+ gc_dvdfs_lookup_callback,&data);
-+ }
-+
-+ /* now convert the inode number into the structure */
-+ if (data.ino)
-+ {
-+ if (!(inode = iget(dir->i_sb,data.ino)))
-+ {
-+ return ERR_PTR(-EACCES);
-+ }
-+ }
-+
-+ d_add(dentry,inode);
-+ return NULL;
-+}
-diff --git a/fs/gcdvdfs/namei.h b/fs/gcdvdfs/namei.h
-new file mode 100644
-index 0000000..19e3da9
---- /dev/null
-+++ b/fs/gcdvdfs/namei.h
-@@ -0,0 +1,18 @@
-+/*
-+ * fs/gcdvdfs/namei.h
-+ *
-+ * Nintendo GameCube Filesystem driver
-+ * Copyright (C) 2006 The GameCube Linux Team
-+ *
-+ * This program is free software; you can redistribute it and/or
-+ * modify it under the terms of the 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 __gc_lookup__
-+#define __gc_lookup__
-+
-+struct dentry *gc_dvdfs_lookup(struct inode *dir,struct dentry *dentry,struct nameidata *nid);
-+
-+#endif
-diff --git a/include/linux/exi.h b/include/linux/exi.h
-new file mode 100644
-index 0000000..e5fc002
---- /dev/null
-+++ b/include/linux/exi.h
-@@ -0,0 +1,331 @@
-+/*
-+ * include/linux/exi.h
-+ *
-+ * Nintendo GameCube EXpansion Interface definitions
-+ * Copyright (C) 2004-2009 The GameCube Linux Team
-+ * Copyright (C) 2004 Arthur Othieno <a.othieno@bluewin.ch>
-+ * Copyright (C) 2004,2005 Todd Jeffreys <todd@voidpointer.org>
-+ * Copyright (C) 2005,2007,2008,2009 Albert Herranz
-+ *
-+ * This program is free software; you can redistribute it and/or
-+ * modify it under the terms of the 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 __EXI_H
-+#define __EXI_H
-+
-+#include <linux/device.h>
-+#include <linux/io.h>
-+
-+
-+struct exi_channel;
-+
-+/*
-+ *
-+ */
-+struct exi_device_id {
-+ unsigned int channel;
-+#define EXI_CHANNEL_ANY (~0)
-+
-+ unsigned int device;
-+#define EXI_DEVICE_ANY (~0)
-+
-+ u32 id;
-+#define EXI_ID_INVALID (~0)
-+#define EXI_ID_NONE (EXI_ID_INVALID-1)
-+};
-+
-+/*
-+ *
-+ */
-+struct exi_device {
-+ struct exi_channel *exi_channel;
-+
-+ struct exi_device_id eid;
-+ int frequency;
-+
-+ unsigned flags;
-+#define EXI_DEV_DYING (1<<0)
-+
-+ struct device dev;
-+};
-+
-+#define to_exi_device(n) container_of(n, struct exi_device, dev)
-+
-+struct exi_device *exi_get_exi_device(struct exi_channel *exi_channel,
-+ int device);
-+
-+/*
-+ *
-+ */
-+struct exi_driver {
-+ char *name;
-+ struct exi_device_id *eid_table;
-+ int frequency;
-+
-+ int (*probe) (struct exi_device *dev);
-+ void (*remove) (struct exi_device *dev);
-+
-+ struct device_driver driver;
-+};
-+
-+#define to_exi_driver(n) container_of(n, struct exi_driver, driver)
-+
-+
-+/*
-+ * EXpansion Interface devices and drivers.
-+ *
-+ */
-+extern struct exi_device *exi_device_get(struct exi_device *exi_device);
-+extern void exi_device_put(struct exi_device *exi_device);
-+
-+extern int exi_driver_register(struct exi_driver *exi_driver);
-+extern void exi_driver_unregister(struct exi_driver *exi_driver);
-+
-+static inline void *exi_get_drvdata(struct exi_device *exi_dev)
-+{
-+ return dev_get_drvdata(&exi_dev->dev);
-+}
-+
-+static inline void exi_set_drvdata(struct exi_device *exi_dev, void *data)
-+{
-+ dev_set_drvdata(&exi_dev->dev, data);
-+}
-+
-+static inline int exi_is_dying(struct exi_device *exi_device)
-+{
-+ return exi_device->flags & EXI_DEV_DYING;
-+}
-+
-+static inline int exi_set_dying(struct exi_device *exi_device, int status)
-+{
-+ if (status)
-+ exi_device->flags |= EXI_DEV_DYING;
-+ else
-+ exi_device->flags &= ~EXI_DEV_DYING;
-+
-+ return exi_is_dying(exi_device);
-+}
-+
-+extern u32 exi_get_id(struct exi_device *exi_device);
-+
-+/*
-+ * EXpansion Interface channels.
-+ *
-+ */
-+
-+extern void exi_channel_init(struct exi_channel *exi_channel,
-+ unsigned int channel);
-+
-+extern struct exi_channel *to_exi_channel(unsigned int channel);
-+extern unsigned int to_channel(struct exi_channel *exi_channel);
-+
-+static inline struct exi_channel *exi_get_exi_channel(struct exi_device *dev)
-+{
-+ return dev->exi_channel;
-+}
-+
-+#define EXI_EVENT_IRQ 0
-+#define EXI_EVENT_INSERT 1
-+#define EXI_EVENT_TC 2
-+
-+typedef int (*exi_event_handler_t)(struct exi_channel *exi_channel,
-+ unsigned int event_id, void *data);
-+
-+extern int exi_event_register(struct exi_channel *exi_channel,
-+ unsigned int event_id,
-+ struct exi_device *exi_device,
-+ exi_event_handler_t handler, void *data,
-+ unsigned int channel_mask);
-+extern int exi_event_unregister(struct exi_channel *exi_channel,
-+ unsigned int event_id);
-+
-+
-+/*
-+ * Commands.
-+ *
-+ *
-+ */
-+struct exi_command {
-+ int opcode;
-+#define EXI_OP_READ (0x00<<2) /* same as in EXIxCR */
-+#define EXI_OP_WRITE (0x01<<2) /* same as in EXIxCR */
-+#define EXI_OP_READWRITE (0x02<<2) /* same as in EXIxCR */
-+
-+#define EXI_OP_TAKE 0x0100
-+#define EXI_OP_GIVE 0x0200
-+#define EXI_OP_SELECT 0x0400
-+#define EXI_OP_DESELECT 0x0800
-+
-+#define EXI_OP_NOP -1
-+
-+ unsigned long flags;
-+#define EXI_CMD_NOWAIT (1<<0)
-+#define EXI_CMD_NODMA (1<<1)
-+#define EXI_CMD_IDI (1<<2)
-+
-+ void *data;
-+ size_t len;
-+ size_t bytes_left;
-+
-+ dma_addr_t dma_addr;
-+ size_t dma_len;
-+
-+ void *done_data;
-+ void (*done)(struct exi_command *cmd);
-+
-+ struct exi_channel *exi_channel;
-+ struct exi_device *exi_device;
-+};
-+
-+#include "../drivers/exi/exi-hw.h"
-+
-+static inline void exi_op_basic(struct exi_command *cmd,
-+ struct exi_channel *exi_channel)
-+{
-+ memset(cmd, 0, sizeof(*cmd));
-+ cmd->exi_channel = exi_channel;
-+ cmd->exi_device = exi_channel_owner(exi_channel);
-+}
-+
-+static inline void exi_op_nop(struct exi_command *cmd,
-+ struct exi_channel *exi_channel)
-+{
-+ exi_op_basic(cmd, exi_channel);
-+ cmd->opcode = EXI_OP_NOP;
-+}
-+
-+static inline void exi_op_take(struct exi_command *cmd,
-+ struct exi_device *exi_device)
-+{
-+ exi_op_basic(cmd, exi_device->exi_channel);
-+ cmd->opcode = EXI_OP_TAKE;
-+ cmd->exi_device = exi_device;
-+}
-+
-+static inline void exi_op_give(struct exi_command *cmd,
-+ struct exi_channel *exi_channel)
-+{
-+ exi_op_basic(cmd, exi_channel);
-+ cmd->opcode = EXI_OP_GIVE;
-+}
-+
-+static inline void exi_op_select(struct exi_command *cmd,
-+ struct exi_device *exi_device)
-+{
-+ exi_op_basic(cmd, exi_device->exi_channel);
-+ cmd->opcode = EXI_OP_SELECT;
-+ cmd->exi_device = exi_device;
-+}
-+
-+static inline void exi_op_deselect(struct exi_command *cmd,
-+ struct exi_channel *exi_channel)
-+{
-+ exi_op_basic(cmd, exi_channel);
-+ cmd->opcode = EXI_OP_DESELECT;
-+}
-+
-+static inline void exi_op_transfer(struct exi_command *cmd,
-+ struct exi_channel *exi_channel,
-+ void *data, size_t len, int opcode)
-+{
-+ exi_op_basic(cmd, exi_channel);
-+ cmd->opcode = opcode;
-+ cmd->data = data;
-+ cmd->len = len;
-+}
-+
-+
-+/*
-+ * EXpansion Interface interfaces.
-+ *
-+ */
-+
-+/*
-+ * Raw.
-+ */
-+extern void exi_select_raw(struct exi_channel *exi_channel,
-+ unsigned int device, unsigned int freq);
-+extern void exi_deselect_raw(struct exi_channel *exi_channel);
-+
-+#define exi_transfer_u8_raw __exi_transfer_raw_u8
-+#define exi_transfer_u16_raw __exi_transfer_raw_u16
-+#define exi_transfer_u32_raw __exi_transfer_raw_u32
-+
-+extern void exi_transfer_raw(struct exi_channel *exi_channel,
-+ void *data, size_t len, int mode);
-+extern void exi_dma_transfer_raw(struct exi_channel *channel,
-+ dma_addr_t data, size_t len, int mode);
-+
-+/*
-+ * Standard.
-+ */
-+
-+int exi_take(struct exi_device *exi_device, int wait);
-+int exi_give(struct exi_device *exi_device);
-+void exi_select(struct exi_device *exi_device);
-+void exi_deselect(struct exi_channel *exi_channel);
-+void exi_transfer(struct exi_channel *exi_channel,
-+ void *data, size_t len, int opcode, unsigned long flags);
-+
-+static inline int exi_dev_take(struct exi_device *exi_device)
-+{
-+ return exi_take(exi_device, 1);
-+}
-+
-+static inline int exi_dev_try_take(struct exi_device *exi_device)
-+{
-+ return exi_take(exi_device, 0);
-+}
-+
-+static inline int exi_dev_give(struct exi_device *exi_device)
-+{
-+ return exi_give(exi_device);
-+}
-+
-+static inline void exi_dev_select(struct exi_device *exi_device)
-+{
-+ exi_select(exi_device);
-+}
-+
-+static inline void exi_dev_deselect(struct exi_device *exi_device)
-+{
-+ exi_deselect(exi_device->exi_channel);
-+}
-+
-+static inline void exi_dev_transfer(struct exi_device *exi_device,
-+ void *data, size_t len, int opcode, unsigned long flags)
-+{
-+ exi_transfer(exi_device->exi_channel, data, len, opcode, flags);
-+}
-+
-+static inline void exi_dev_read(struct exi_device *dev, void *data, size_t len)
-+{
-+ exi_dev_transfer(dev, data, len, EXI_OP_READ, 0);
-+}
-+
-+static inline void exi_dev_write(struct exi_device *dev, void *data, size_t len)
-+{
-+ exi_dev_transfer(dev, data, len, EXI_OP_WRITE, 0);
-+}
-+
-+static inline void exi_dev_readwrite(struct exi_device *dev, void *data,
-+ size_t len)
-+{
-+ exi_dev_transfer(dev, data, len, EXI_OP_READWRITE, 0);
-+}
-+
-+static inline int exi_dev_set_freq(struct exi_device *dev, unsigned int freq)
-+{
-+ BUG_ON(freq > EXI_MAX_FREQ);
-+
-+ dev->frequency = freq;
-+
-+ return freq;
-+}
-+
-+#endif /* __EXI_H */
-+
-diff --git a/include/linux/fb.h b/include/linux/fb.h
-index 75a81ea..98ffee5 100644
---- a/include/linux/fb.h
-+++ b/include/linux/fb.h
-@@ -38,6 +38,11 @@ struct dentry;
- #define FBIOPUT_MODEINFO 0x4617
- #define FBIOGET_DISPINFO 0x4618
-
-+#define FBIOWAITRETRACE 0x4619
-+#define FBIOWAITPEFINISH 0x4620
-+#define FBIOVIRTTOPHYS 0x4621
-+#define FBIOFLIP 0x4622
-+#define FBIOFLIPHACK 0x4623 /* libsdl */
-
- #define FB_TYPE_PACKED_PIXELS 0 /* Packed Pixels */
- #define FB_TYPE_PLANES 1 /* Non interleaved planes */
-@@ -896,7 +901,13 @@ struct fb_info {
- #define fb_readq __raw_readq
- #define fb_writeb __raw_writeb
- #define fb_writew __raw_writew
--#define fb_writel __raw_writel
-+#ifndef CONFIG_FB_GAMECUBE /* XXX Why? O' why? */
-+# define fb_writel __raw_writel
-+#else
-+ extern unsigned int vifb_writel(unsigned int, void *);
-+# define fb_writel(b, addr) vifb_writel(b, addr)
-+# define fb_writel_real(b, addr) (*(/*volatile*/ u32 __iomem *)(addr) = (b))
-+#endif
- #define fb_writeq __raw_writeq
- #define fb_memset memset_io
-
-diff --git a/sound/ppc/Kconfig b/sound/ppc/Kconfig
-index 777de2b..82c5ad3 100644
---- a/sound/ppc/Kconfig
-+++ b/sound/ppc/Kconfig
-@@ -48,4 +48,22 @@ config SND_PS3_DEFAULT_START_DELAY
- depends on SND_PS3
- default "2000"
-
-+config SND_GAMECUBE
-+ tristate "Nintendo GameCube/Wii"
-+ depends on SND && GAMECUBE_COMMON
-+ help
-+ Say Y here to include support for audio on the Nintendo GameCube/Wii.
-+
-+ To compile this driver as a module, choose M here: the module
-+ will be called snd-gcn.
-+
-+config SND_GAMECUBE_MIC
-+ tristate "Nintendo GameCube Microphone (DOL-022)"
-+ depends on SND && GAMECUBE_EXI && EXPERIMENTAL
-+ help
-+ If you say yes to this option, support will be included for the
-+ Nintendo GameCube Microphone (DOL-022).
-+
-+ If in doubt, say N here.
-+
- endif # SND_PPC
-diff --git a/sound/ppc/Makefile b/sound/ppc/Makefile
-index 679c45a..fa77f53 100644
---- a/sound/ppc/Makefile
-+++ b/sound/ppc/Makefile
-@@ -4,7 +4,10 @@
- #
-
- snd-powermac-objs := powermac.o pmac.o awacs.o burgundy.o daca.o tumbler.o keywest.o beep.o
-+snd-gcn-objs := gcn-ai.o
-
- # Toplevel Module Dependency
- obj-$(CONFIG_SND_POWERMAC) += snd-powermac.o
- obj-$(CONFIG_SND_PS3) += snd_ps3.o
-+obj-$(CONFIG_SND_GAMECUBE) += snd-gcn.o
-+obj-$(CONFIG_SND_GAMECUBE_MIC) += gcn-mic.o
-diff --git a/sound/ppc/gcn-ai.c b/sound/ppc/gcn-ai.c
-new file mode 100644
-index 0000000..92dc264
---- /dev/null
-+++ b/sound/ppc/gcn-ai.c
-@@ -0,0 +1,598 @@
-+/*
-+ * sound/ppc/gcn-ai.c
-+ *
-+ * Nintendo GameCube/Wii Audio Interface (AI) driver
-+ * Copyright (C) 2004-2009 The GameCube Linux Team
-+ * Copyright (C) 2007,2008,2009 Albert Herranz
-+ *
-+ * Based on work from mist, kirin, groepaz, Steve_-, isobel and others.
-+ *
-+ * This program is free software; you can redistribute it and/or
-+ * modify it under the terms of the 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/module.h>
-+#include <linux/init.h>
-+#include <linux/of_platform.h>
-+#include <linux/interrupt.h>
-+#include <linux/dma-mapping.h>
-+#include <linux/io.h>
-+#include <sound/core.h>
-+#include <sound/pcm.h>
-+#define SNDRV_GET_ID
-+#include <sound/initval.h>
-+
-+
-+#define DRV_MODULE_NAME "gcn-ai"
-+#define DRV_DESCRIPTION "Nintendo GameCube/Wii Audio Interface (AI) driver"
-+#define DRV_AUTHOR "Michael Steil, " \
-+ "(kirin), " \
-+ "(groepaz), " \
-+ "Steven Looman, " \
-+ "Albert Herranz"
-+
-+static char ai_driver_version[] = "1.0i";
-+
-+#define drv_printk(level, format, arg...) \
-+ printk(level DRV_MODULE_NAME ": " format , ## arg)
-+
-+
-+/*
-+ * Hardware.
-+ *
-+ */
-+
-+/*
-+ * DSP registers.
-+ */
-+#define AI_DSP_CSR 0x0a /* 16 bits */
-+#define AI_CSR_RES (1<<0)
-+#define AI_CSR_PIINT (1<<1)
-+#define AI_CSR_HALT (1<<2)
-+#define AI_CSR_AIDINT (1<<3)
-+#define AI_CSR_AIDINTMASK (1<<4)
-+#define AI_CSR_ARINT (1<<5)
-+#define AI_CSR_ARINTMASK (1<<6)
-+#define AI_CSR_DSPINT (1<<7)
-+#define AI_CSR_DSPINTMASK (1<<8)
-+#define AI_CSR_DSPDMA (1<<9)
-+#define AI_CSR_RESETXXX (1<<11)
-+
-+#define AI_DSP_DMA_ADDRH 0x30 /* 16 bits */
-+
-+#define AI_DSP_DMA_ADDRL 0x32 /* 16 bits */
-+
-+#define AI_DSP_DMA_CTLLEN 0x36 /* 16 bits */
-+#define AI_CTLLEN_PLAY (1<<15)
-+
-+#define AI_DSP_DMA_LEFT 0x3a /* 16 bits */
-+
-+/*
-+ * AI registers.
-+ */
-+#define AI_AICR 0x00 /* 32 bits */
-+#define AI_AICR_RATE (1<<6)
-+
-+
-+/*
-+ * Sound chip.
-+ */
-+struct snd_gcn {
-+ struct snd_card *card;
-+ struct snd_pcm *pcm;
-+ struct snd_pcm_substream *playback_substream;
-+ struct snd_pcm_substream *capture_substream;
-+
-+ int start_play;
-+ int stop_play;
-+
-+ dma_addr_t dma_addr;
-+ size_t period_size;
-+ int nperiods;
-+ int cur_period;
-+
-+ void __iomem *dsp_base;
-+ void __iomem *ai_base;
-+ unsigned int irq;
-+
-+ struct device *dev;
-+};
-+
-+
-+/*
-+ * Hardware functions.
-+ *
-+ */
-+
-+static void ai_dsp_load_sample(void __iomem *dsp_base,
-+ void *addr, size_t size)
-+{
-+ u32 daddr = (unsigned long)addr;
-+
-+ out_be16(dsp_base + AI_DSP_DMA_ADDRH, daddr >> 16);
-+ out_be16(dsp_base + AI_DSP_DMA_ADDRL, daddr & 0xffff);
-+ out_be16(dsp_base + AI_DSP_DMA_CTLLEN,
-+ (in_be16(dsp_base + AI_DSP_DMA_CTLLEN) & AI_CTLLEN_PLAY) |
-+ size >> 5);
-+}
-+
-+static void ai_dsp_start_sample(void __iomem *dsp_base)
-+{
-+ out_be16(dsp_base + AI_DSP_DMA_CTLLEN,
-+ in_be16(dsp_base + AI_DSP_DMA_CTLLEN) | AI_CTLLEN_PLAY);
-+}
-+
-+static void ai_dsp_stop_sample(void __iomem *dsp_base)
-+{
-+ out_be16(dsp_base + AI_DSP_DMA_CTLLEN,
-+ in_be16(dsp_base + AI_DSP_DMA_CTLLEN) & ~AI_CTLLEN_PLAY);
-+}
-+
-+static int ai_dsp_get_remaining_byte_count(void __iomem *dsp_base)
-+{
-+ return in_be16(dsp_base + AI_DSP_DMA_LEFT) << 5;
-+}
-+
-+static void ai_enable_interrupts(void __iomem *dsp_base)
-+{
-+ unsigned long flags;
-+
-+ /* enable AI DMA and DSP interrupts */
-+ local_irq_save(flags);
-+ out_be16(dsp_base + AI_DSP_CSR,
-+ in_be16(dsp_base + AI_DSP_CSR) |
-+ AI_CSR_AIDINTMASK | AI_CSR_PIINT);
-+ local_irq_restore(flags);
-+}
-+
-+static void ai_disable_interrupts(void __iomem *dsp_base)
-+{
-+ unsigned long flags;
-+
-+ /* disable AI interrupts */
-+ local_irq_save(flags);
-+ out_be16(dsp_base + AI_DSP_CSR,
-+ in_be16(dsp_base + AI_DSP_CSR) & ~AI_CSR_AIDINTMASK);
-+ local_irq_restore(flags);
-+}
-+
-+static void ai_set_rate(void __iomem *ai_base, int fortyeight)
-+{
-+ /* set rate to 48KHz or 32KHz */
-+ if (fortyeight)
-+ out_be32(ai_base + AI_AICR,
-+ in_be32(ai_base + AI_AICR) & ~AI_AICR_RATE);
-+ else
-+ out_be32(ai_base + AI_AICR,
-+ in_be32(ai_base + AI_AICR) | AI_AICR_RATE);
-+}
-+
-+
-+static int index = SNDRV_DEFAULT_IDX1; /* index 0-MAX */
-+static char *id = SNDRV_DEFAULT_STR1; /* ID for this card */
-+
-+static struct snd_gcn *gcn_audio;
-+
-+static struct snd_pcm_hardware snd_gcn_playback = {
-+ .info = (SNDRV_PCM_INFO_MMAP | SNDRV_PCM_INFO_INTERLEAVED |
-+ SNDRV_PCM_INFO_BLOCK_TRANSFER | SNDRV_PCM_INFO_MMAP_VALID),
-+ .formats = SNDRV_PCM_FMTBIT_S16_BE,
-+ .rates = SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000,
-+ .rate_min = 32000,
-+ .rate_max = 48000,
-+ .channels_min = 2,
-+ .channels_max = 2,
-+ .buffer_bytes_max = 32768,
-+ .period_bytes_min = 32,
-+ .period_bytes_max = 32768,
-+ .periods_min = 1,
-+ .periods_max = 1024,
-+};
-+
-+static int snd_gcn_open(struct snd_pcm_substream *substream)
-+{
-+ struct snd_gcn *chip = snd_pcm_substream_chip(substream);
-+ struct snd_pcm_runtime *runtime = substream->runtime;
-+
-+ chip->playback_substream = substream;
-+ runtime->hw = snd_gcn_playback;
-+
-+ /* align to 32 bytes */
-+ snd_pcm_hw_constraint_step(runtime, 0, SNDRV_PCM_HW_PARAM_BUFFER_BYTES,
-+ 32);
-+ snd_pcm_hw_constraint_step(runtime, 0, SNDRV_PCM_HW_PARAM_PERIOD_BYTES,
-+ 32);
-+
-+ return 0;
-+}
-+
-+static int snd_gcn_close(struct snd_pcm_substream *substream)
-+{
-+ struct snd_gcn *chip = snd_pcm_substream_chip(substream);
-+
-+ chip->playback_substream = NULL;
-+ return 0;
-+}
-+
-+static int snd_gcn_hw_params(struct snd_pcm_substream *substream,
-+ struct snd_pcm_hw_params *hw_params)
-+{
-+ return snd_pcm_lib_malloc_pages(substream,
-+ params_buffer_bytes(hw_params));
-+}
-+
-+static int snd_gcn_hw_free(struct snd_pcm_substream *substream)
-+{
-+ return snd_pcm_lib_free_pages(substream);
-+}
-+
-+static int snd_gcn_prepare(struct snd_pcm_substream *substream)
-+{
-+ struct snd_gcn *chip = snd_pcm_substream_chip(substream);
-+ struct snd_pcm_runtime *runtime = substream->runtime;
-+
-+ /* set requested sample rate */
-+ switch (runtime->rate) {
-+ case 32000:
-+ ai_set_rate(chip->ai_base, 0);
-+ break;
-+ case 48000:
-+ ai_set_rate(chip->ai_base, 1);
-+ break;
-+ default:
-+ drv_printk(KERN_ERR, "unsupported rate %i\n", runtime->rate);
-+ return -EINVAL;
-+ }
-+
-+ return 0;
-+}
-+
-+static int snd_gcn_trigger(struct snd_pcm_substream *substream, int cmd)
-+{
-+ struct snd_gcn *chip = snd_pcm_substream_chip(substream);
-+ struct snd_pcm_runtime *runtime = substream->runtime;
-+
-+ switch (cmd) {
-+ case SNDRV_PCM_TRIGGER_START:
-+ /* do something to start the PCM engine */
-+ if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
-+ chip->period_size = snd_pcm_lib_period_bytes(substream);
-+ chip->nperiods = snd_pcm_lib_buffer_bytes(substream) /
-+ chip->period_size;
-+ chip->cur_period = 0;
-+ chip->stop_play = 0;
-+ chip->start_play = 1;
-+
-+ chip->dma_addr = dma_map_single(chip->dev,
-+ runtime->dma_area,
-+ chip->period_size,
-+ DMA_TO_DEVICE);
-+ ai_dsp_load_sample(chip->dsp_base, runtime->dma_area,
-+ chip->period_size);
-+ ai_dsp_start_sample(chip->dsp_base);
-+ }
-+ break;
-+ case SNDRV_PCM_TRIGGER_STOP:
-+ chip->stop_play = 1;
-+ break;
-+ default:
-+ return -EINVAL;
-+ }
-+
-+ return 0;
-+}
-+
-+static snd_pcm_uframes_t snd_gcn_pointer(struct snd_pcm_substream *substream)
-+{
-+ struct snd_gcn *chip = snd_pcm_substream_chip(substream);
-+ struct snd_pcm_runtime *runtime = substream->runtime;
-+ int left, bytes;
-+
-+ left = ai_dsp_get_remaining_byte_count(chip->dsp_base);
-+ bytes = chip->period_size * (chip->cur_period + 1);
-+
-+ return bytes_to_frames(runtime, bytes - left);
-+}
-+
-+static irqreturn_t snd_gcn_interrupt(int irq, void *dev)
-+{
-+ struct snd_gcn *chip = dev;
-+ void *addr;
-+ unsigned long flags;
-+ u16 csr;
-+
-+ /*
-+ * This is a shared interrupt. Do nothing if it ain't ours.
-+ */
-+ csr = in_be16(chip->dsp_base + AI_DSP_CSR);
-+ if (!(csr & AI_CSR_AIDINT))
-+ return IRQ_NONE;
-+
-+ if (chip->start_play) {
-+ chip->start_play = 0;
-+ } else {
-+ /* stop current sample */
-+ ai_dsp_stop_sample(chip->dsp_base);
-+ dma_unmap_single(chip->dev, chip->dma_addr, chip->period_size,
-+ DMA_TO_DEVICE);
-+
-+ /* load next sample if we are not stopping */
-+ if (!chip->stop_play) {
-+ if (chip->cur_period < (chip->nperiods - 1))
-+ chip->cur_period++;
-+ else
-+ chip->cur_period = 0;
-+
-+ addr = chip->playback_substream->runtime->dma_area
-+ + (chip->cur_period * chip->period_size);
-+ chip->dma_addr = dma_map_single(chip->dev,
-+ addr,
-+ chip->period_size,
-+ DMA_TO_DEVICE);
-+ ai_dsp_load_sample(chip->dsp_base, addr,
-+ chip->period_size);
-+ ai_dsp_start_sample(chip->dsp_base);
-+
-+ snd_pcm_period_elapsed(chip->playback_substream);
-+ }
-+ }
-+ /*
-+ * Ack the AI DMA interrupt, going through lengths to only ack
-+ * the audio part.
-+ */
-+ local_irq_save(flags);
-+ csr = in_be16(chip->dsp_base + AI_DSP_CSR);
-+ csr &= ~(AI_CSR_PIINT | AI_CSR_ARINT | AI_CSR_DSPINT);
-+ out_be16(chip->dsp_base + AI_DSP_CSR, csr);
-+ local_irq_restore(flags);
-+
-+ return IRQ_HANDLED;
-+}
-+
-+
-+static struct snd_pcm_ops snd_gcn_playback_ops = {
-+ .open = snd_gcn_open,
-+ .close = snd_gcn_close,
-+ .ioctl = snd_pcm_lib_ioctl,
-+ .hw_params = snd_gcn_hw_params,
-+ .hw_free = snd_gcn_hw_free,
-+ .prepare = snd_gcn_prepare,
-+ .trigger = snd_gcn_trigger,
-+ .pointer = snd_gcn_pointer,
-+};
-+
-+static int __devinit snd_gcn_new_pcm(struct snd_gcn *chip)
-+{
-+ struct snd_pcm *pcm;
-+ int retval;
-+
-+ retval = snd_pcm_new(chip->card, chip->card->shortname, 0, 1, 0, &pcm);
-+ if (retval < 0)
-+ return retval;
-+
-+ snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_PLAYBACK,
-+ &snd_gcn_playback_ops);
-+
-+ /* preallocate 64k buffer */
-+ snd_pcm_lib_preallocate_pages_for_all(pcm, SNDRV_DMA_TYPE_CONTINUOUS,
-+ snd_dma_continuous_data
-+ (GFP_KERNEL), 64 * 1024,
-+ 64 * 1024);
-+
-+ pcm->info_flags = 0;
-+ pcm->private_data = chip;
-+ strcpy(pcm->name, chip->card->shortname);
-+
-+ chip->pcm = pcm;
-+
-+ return 0;
-+}
-+
-+static void ai_shutdown(struct snd_gcn *chip)
-+{
-+ ai_dsp_stop_sample(chip->dsp_base);
-+ ai_disable_interrupts(chip->dsp_base);
-+}
-+
-+static int __devinit ai_init(struct snd_gcn *chip,
-+ struct resource *dsp, struct resource *ai,
-+ unsigned int irq)
-+{
-+ struct snd_card *card;
-+ int retval;
-+
-+ chip->dsp_base = ioremap(dsp->start, dsp->end - dsp->start + 1);
-+ chip->ai_base = ioremap(ai->start, ai->end - ai->start + 1);
-+ chip->irq = irq;
-+
-+ chip->stop_play = 1;
-+ card = chip->card;
-+
-+ strcpy(card->driver, DRV_MODULE_NAME);
-+ strcpy(card->shortname, card->driver);
-+ sprintf(card->longname, "Nintendo GameCube Audio Interface");
-+
-+ /* PCM */
-+ retval = snd_gcn_new_pcm(chip);
-+ if (retval < 0)
-+ goto err_new_pcm;
-+
-+ retval = request_irq(chip->irq, snd_gcn_interrupt,
-+ IRQF_DISABLED | IRQF_SHARED,
-+ card->shortname, chip);
-+ if (retval) {
-+ drv_printk(KERN_ERR, "unable to request IRQ %d\n", chip->irq);
-+ goto err_request_irq;
-+ }
-+ ai_enable_interrupts(chip->dsp_base);
-+
-+ gcn_audio = chip;
-+ retval = snd_card_register(card);
-+ if (retval) {
-+ drv_printk(KERN_ERR, "failed to register card\n");
-+ goto err_card_register;
-+ }
-+
-+ return 0;
-+
-+err_card_register:
-+ ai_disable_interrupts(chip->dsp_base);
-+ free_irq(chip->irq, chip);
-+err_request_irq:
-+err_new_pcm:
-+ iounmap(chip->dsp_base);
-+ iounmap(chip->ai_base);
-+ return retval;
-+}
-+
-+static void ai_exit(struct snd_gcn *chip)
-+{
-+ ai_dsp_stop_sample(chip->dsp_base);
-+ ai_disable_interrupts(chip->dsp_base);
-+
-+ free_irq(chip->irq, chip);
-+ iounmap(chip->dsp_base);
-+ iounmap(chip->ai_base);
-+}
-+
-+
-+/*
-+ * Device interfaces.
-+ *
-+ */
-+
-+static int ai_do_shutdown(struct device *dev)
-+{
-+ struct snd_gcn *chip;
-+
-+ chip = dev_get_drvdata(dev);
-+ if (chip) {
-+ ai_shutdown(chip);
-+ return 0;
-+ }
-+ return -ENODEV;
-+}
-+
-+static int __devinit ai_do_probe(struct device *dev,
-+ struct resource *dsp, struct resource *ai,
-+ unsigned int irq)
-+{
-+ struct snd_card *card;
-+ struct snd_gcn *chip;
-+ int retval;
-+
-+ card = snd_card_new(index, id, THIS_MODULE, sizeof(struct snd_gcn));
-+ if (!card) {
-+ drv_printk(KERN_ERR, "failed to allocate card\n");
-+ return -ENOMEM;
-+ }
-+ chip = (struct snd_gcn *)card->private_data;
-+ memset(chip, 0, sizeof(*chip));
-+ chip->card = card;
-+ dev_set_drvdata(dev, chip);
-+ chip->dev = dev;
-+
-+ retval = ai_init(chip, dsp, ai, irq);
-+ if (retval)
-+ snd_card_free(card);
-+
-+ return retval;
-+}
-+
-+static int ai_do_remove(struct device *dev)
-+{
-+ struct snd_gcn *chip;
-+
-+ chip = dev_get_drvdata(dev);
-+ if (chip) {
-+ ai_exit(chip);
-+ dev_set_drvdata(dev, NULL);
-+ snd_card_free(chip->card);
-+ return 0;
-+ }
-+ return -ENODEV;
-+}
-+
-+/*
-+ * OF Platform device interfaces.
-+ *
-+ */
-+
-+static int __init ai_of_probe(struct of_device *odev,
-+ const struct of_device_id *match)
-+{
-+ struct resource dsp, ai;
-+ int retval;
-+
-+ retval = of_address_to_resource(odev->node, 0, &dsp);
-+ if (retval) {
-+ drv_printk(KERN_ERR, "no dsp io memory range found\n");
-+ return -ENODEV;
-+ }
-+ retval = of_address_to_resource(odev->node, 1, &ai);
-+ if (retval) {
-+ drv_printk(KERN_ERR, "no ai io memory range found\n");
-+ return -ENODEV;
-+ }
-+
-+ return ai_do_probe(&odev->dev,
-+ &dsp, &ai, irq_of_parse_and_map(odev->node, 0));
-+}
-+
-+static int __exit ai_of_remove(struct of_device *odev)
-+{
-+ return ai_do_remove(&odev->dev);
-+}
-+
-+static int ai_of_shutdown(struct of_device *odev)
-+{
-+ return ai_do_shutdown(&odev->dev);
-+}
-+
-+
-+static struct of_device_id ai_of_match[] = {
-+ { .compatible = "nintendo,flipper-audio" },
-+ { .compatible = "nintendo,hollywood-audio" },
-+ { },
-+};
-+
-+MODULE_DEVICE_TABLE(of, ai_of_match);
-+
-+static struct of_platform_driver ai_of_driver = {
-+ .owner = THIS_MODULE,
-+ .name = DRV_MODULE_NAME,
-+ .match_table = ai_of_match,
-+ .probe = ai_of_probe,
-+ .remove = ai_of_remove,
-+ .shutdown = ai_of_shutdown,
-+};
-+
-+/*
-+ * Module interfaces.
-+ *
-+ */
-+
-+static int __init ai_init_module(void)
-+{
-+ drv_printk(KERN_INFO, "%s - version %s\n", DRV_DESCRIPTION,
-+ ai_driver_version);
-+
-+ return of_register_platform_driver(&ai_of_driver);
-+}
-+
-+static void __exit ai_exit_module(void)
-+{
-+ of_unregister_platform_driver(&ai_of_driver);
-+}
-+
-+module_init(ai_init_module);
-+module_exit(ai_exit_module);
-+
-+MODULE_DESCRIPTION(DRV_DESCRIPTION);
-+MODULE_AUTHOR(DRV_AUTHOR);
-+MODULE_LICENSE("GPL");
-+
-diff --git a/sound/ppc/gcn-mic.c b/sound/ppc/gcn-mic.c
-new file mode 100644
-index 0000000..9445a46
---- /dev/null
-+++ b/sound/ppc/gcn-mic.c
-@@ -0,0 +1,832 @@
-+/*
-+ * sound/ppc/gcn-mic.c
-+ *
-+ * Nintendo Microphone (DOL-022) driver
-+ * Copyright (C) 2006-2009 The GameCube Linux Team
-+ * Copyright (C) 2006,2007,2008,2009 Albert Herranz
-+ *
-+ * This program is free software; you can redistribute it and/or
-+ * modify it under the terms of the GNU General Public License
-+ * as published by the Free Software Foundation; either version 2
-+ * of the License, or (at your option) any later version.
-+ *
-+ */
-+
-+#define MIC_DEBUG
-+
-+#include <linux/kernel.h>
-+#include <linux/module.h>
-+#include <linux/init.h>
-+#include <linux/kthread.h>
-+#include <linux/delay.h>
-+#include <linux/freezer.h>
-+#include <linux/proc_fs.h>
-+#include <linux/exi.h>
-+
-+#include <sound/core.h>
-+#include <sound/pcm.h>
-+#define SNDRV_GET_ID
-+#include <sound/initval.h>
-+
-+#define DRV_MODULE_NAME "gcn-mic"
-+#define DRV_DESCRIPTION "Nintendo Microphone (DOL-022) driver"
-+#define DRV_AUTHOR "Albert Herranz"
-+
-+MODULE_AUTHOR(DRV_AUTHOR);
-+MODULE_DESCRIPTION(DRV_DESCRIPTION);
-+MODULE_LICENSE("GPL");
-+
-+static char mic_driver_version[] = "0.1i";
-+
-+#define mic_printk(level, format, arg...) \
-+ printk(level DRV_MODULE_NAME ": " format , ## arg)
-+
-+#ifdef MIC_DEBUG
-+# define DBG(fmt, args...) \
-+ printk(KERN_ERR "%s: " fmt, __func__ , ## args)
-+#else
-+# define DBG(fmt, args...)
-+#endif
-+
-+
-+#define MIC_EXI_ID 0x0a000000
-+
-+#define MIC_SLOTA_CHANNEL 0 /* EXI0xxx */
-+#define MIC_SLOTA_DEVICE 0 /* chip select, EXI0CSB0 */
-+
-+#define MIC_SLOTB_CHANNEL 1 /* EXI1xxx */
-+#define MIC_SLOTB_DEVICE 0 /* chip select, EXI1CSB0 */
-+
-+#define MIC_SPI_CLK_IDX EXI_CLK_16MHZ
-+
-+
-+struct mic_device {
-+ spinlock_t lock;
-+ unsigned long flags;
-+
-+ u16 status;
-+ u16 control;
-+#define MIC_CTL_RATE_MASK (0x3<<11)
-+#define MIC_CTL_RATE_11025 (0x0<<11)
-+#define MIC_CTL_RATE_22050 (0x1<<11)
-+#define MIC_CTL_RATE_44100 (0x2<<11)
-+#define MIC_CTL_PERIOD_MASK (0x3<<13)
-+#define MIC_CTL_PERIOD_32 (0x0<<13)
-+#define MIC_CTL_PERIOD_64 (0x1<<13)
-+#define MIC_CTL_PERIOD_128 (0x2<<13)
-+#define MIC_CTL_START_SAMPLING (1<<15)
-+
-+ struct task_struct *io_thread;
-+ wait_queue_head_t io_waitq;
-+ atomic_t io_pending;
-+
-+ struct snd_card *card;
-+ struct snd_pcm *pcm;
-+
-+ struct snd_pcm_substream *c_substream;
-+ u8 *c_orig, *c_cur;
-+ int c_left;
-+
-+ int running;
-+
-+#ifdef CONFIG_PROC_FS
-+ struct proc_dir_entry *proc;
-+#endif /* CONFIG_PROC_FS */
-+
-+ int refcnt;
-+ struct exi_device *exi_device;
-+};
-+
-+
-+/*
-+ *
-+ */
-+static void mic_hey(struct mic_device *dev)
-+{
-+ struct exi_device *exi_device = dev->exi_device;
-+ u8 cmd = 0xff;
-+
-+ exi_dev_select(exi_device);
-+ exi_dev_write(exi_device, &cmd, sizeof(cmd));
-+ exi_dev_deselect(exi_device);
-+}
-+
-+/*
-+ *
-+ */
-+static int mic_get_status(struct mic_device *dev)
-+{
-+ struct exi_device *exi_device = dev->exi_device;
-+ u8 cmd = 0x40;
-+
-+ exi_dev_select(exi_device);
-+ exi_dev_write(exi_device, &cmd, sizeof(cmd));
-+ exi_dev_read(exi_device, &dev->status, sizeof(dev->status));
-+ exi_dev_deselect(exi_device);
-+
-+ return dev->status;
-+}
-+
-+/*
-+ *
-+ */
-+static void mic_control(struct mic_device *dev)
-+{
-+ struct exi_device *exi_device = dev->exi_device;
-+ u8 cmd[3];
-+
-+ cmd[0] = 0x80;
-+ cmd[1] = dev->control >> 8;
-+ cmd[2] = dev->control & 0xff;
-+
-+ DBG("control 0x80%02x%02x\n", cmd[1], cmd[2]);
-+
-+ exi_dev_select(exi_device);
-+ exi_dev_write(exi_device, cmd, sizeof(cmd));
-+ exi_dev_deselect(exi_device);
-+
-+}
-+
-+/*
-+ *
-+ */
-+static void mic_read_period(struct mic_device *dev, void *buf, size_t len)
-+{
-+ struct exi_device *exi_device = dev->exi_device;
-+ u8 cmd = 0x20;
-+
-+ exi_dev_select(exi_device);
-+ exi_dev_write(exi_device, &cmd, sizeof(cmd));
-+ exi_dev_read(exi_device, buf, len);
-+ exi_dev_deselect(exi_device);
-+
-+/* DBG("mic cmd 0x20\n"); */
-+}
-+
-+/*
-+ *
-+ */
-+static void mic_enable_sampling(struct mic_device *dev, int enable)
-+{
-+ if (enable)
-+ dev->control |= MIC_CTL_START_SAMPLING;
-+ else
-+ dev->control &= ~MIC_CTL_START_SAMPLING;
-+}
-+
-+/*
-+ *
-+ */
-+static int mic_set_sample_rate(struct mic_device *dev, int rate)
-+{
-+ u16 control;
-+
-+ switch (rate) {
-+ case 11025:
-+ control = MIC_CTL_RATE_11025;
-+ break;
-+ case 22050:
-+ control = MIC_CTL_RATE_22050;
-+ break;
-+ case 44100:
-+ control = MIC_CTL_RATE_44100;
-+ break;
-+ default:
-+ mic_printk(KERN_ERR, "unsupported rate: %d\n", rate);
-+ return -EINVAL;
-+ }
-+ dev->control &= ~MIC_CTL_RATE_MASK;
-+ dev->control |= control;
-+ return 0;
-+}
-+
-+/*
-+ *
-+ */
-+static int mic_set_period(struct mic_device *dev, int period_bytes)
-+{
-+ u16 control;
-+
-+ switch (period_bytes) {
-+ case 32:
-+ control = MIC_CTL_PERIOD_32;
-+ break;
-+ case 64:
-+ control = MIC_CTL_PERIOD_64;
-+ break;
-+ case 128:
-+ control = MIC_CTL_PERIOD_128;
-+ break;
-+ default:
-+ mic_printk(KERN_ERR, "unsupported period: %d bytes\n",
-+ period_bytes);
-+ return -EINVAL;
-+ }
-+ dev->control &= ~MIC_CTL_PERIOD_MASK;
-+ dev->control |= control;
-+ return 0;
-+}
-+
-+/*
-+ * /proc support
-+ *
-+ */
-+
-+/*
-+ *
-+ */
-+static int mic_init_proc(struct mic_device *dev)
-+{
-+ return 0;
-+}
-+
-+/*
-+ *
-+ */
-+static void mic_exit_proc(struct mic_device *dev)
-+{
-+}
-+
-+
-+
-+/*
-+ * Driver
-+ *
-+ */
-+
-+static int index = SNDRV_DEFAULT_IDX1;
-+static char *id = SNDRV_DEFAULT_STR1;
-+
-+static struct snd_pcm_hardware mic_snd_capture = {
-+#if 0
-+ .info = (SNDRV_PCM_INFO_MMAP |
-+ SNDRV_PCM_INFO_INTERLEAVED | SNDRV_PCM_INFO_NONINTERLEAVED |
-+ SNDRV_PCM_INFO_BLOCK_TRANSFER |
-+ SNDRV_PCM_INFO_MMAP_VALID),
-+#endif
-+ .info = (SNDRV_PCM_INFO_INTERLEAVED | SNDRV_PCM_INFO_NONINTERLEAVED),
-+ .formats = SNDRV_PCM_FMTBIT_S16_BE,
-+ .rates = SNDRV_PCM_RATE_11025 | SNDRV_PCM_RATE_22050 |
-+ SNDRV_PCM_RATE_44100,
-+ .rate_min = 11025,
-+ .rate_max = 44100,
-+ .channels_min = 1,
-+ .channels_max = 1,
-+ .buffer_bytes_max = 32768,
-+ .period_bytes_min = 32,
-+ .period_bytes_max = 128,
-+ .periods_min = 1,
-+ .periods_max = 1024,
-+};
-+
-+#if 0
-+static unsigned int period_bytes[] = { 32, 64, 128 };
-+static struct snd_pcm_hw_constraint_list constraints_period_bytes = {
-+ .count = ARRAY_SIZE(period_bytes),
-+ .list = period_bytes,
-+ .mask = 0,
-+};
-+#endif
-+
-+/*
-+ *
-+ */
-+static void mic_wakeup_io_thread(struct mic_device *dev)
-+{
-+ if (!IS_ERR(dev->io_thread)) {
-+ atomic_inc(&dev->io_pending);
-+ wake_up(&dev->io_waitq);
-+ }
-+}
-+
-+/*
-+ *
-+ */
-+static void mic_stop_io_thread(struct mic_device *dev)
-+{
-+ if (!IS_ERR(dev->io_thread)) {
-+ atomic_inc(&dev->io_pending);
-+ kthread_stop(dev->io_thread);
-+ }
-+}
-+
-+/*
-+ * Input/Output thread. Receives audio samples from the microphone.
-+ */
-+static int mic_io_thread(void *param)
-+{
-+ struct mic_device *dev = param;
-+ struct snd_pcm_substream *substream;
-+ int period_bytes;
-+ u16 status;
-+
-+ set_user_nice(current, -20);
-+ set_current_state(TASK_RUNNING);
-+
-+ for (;;) {
-+ wait_event(dev->io_waitq, atomic_read(&dev->io_pending) > 0);
-+ atomic_dec(&dev->io_pending);
-+
-+ if (kthread_should_stop())
-+ break;
-+
-+ if (try_to_freeze())
-+ continue;
-+
-+ exi_dev_take(dev->exi_device);
-+ status = mic_get_status(dev);
-+ if (dev->running) {
-+ substream = dev->c_substream;
-+
-+ if (!dev->c_left) {
-+ dev->c_cur = dev->c_orig;
-+ dev->c_left =
-+ snd_pcm_lib_buffer_bytes(substream);
-+ }
-+
-+ period_bytes = snd_pcm_lib_period_bytes(substream);
-+ if (period_bytes > dev->c_left)
-+ period_bytes = dev->c_left;
-+ mic_read_period(dev, dev->c_cur, period_bytes);
-+ dev->c_cur += period_bytes;
-+ dev->c_left -= period_bytes;
-+
-+ exi_dev_give(dev->exi_device);
-+ snd_pcm_period_elapsed(substream);
-+ exi_dev_take(dev->exi_device);
-+
-+ if (status & 0x0200) {
-+ DBG("0x0200\n");
-+ mic_hey(dev);
-+ mic_enable_sampling(dev, 1);
-+ mic_control(dev);
-+ }
-+ } else {
-+ /* mic_enable_sampling(dev, 0); */
-+ dev->control = 0;
-+ mic_control(dev);
-+ }
-+ exi_dev_give(dev->exi_device);
-+ }
-+ return 0;
-+}
-+
-+/*
-+ *
-+ */
-+static int mic_event_handler(struct exi_channel *exi_channel,
-+ unsigned int event, void *dev0)
-+{
-+ struct mic_device *dev = (struct mic_device *)dev0;
-+
-+ /* exi channel is not taken, no exi operations here please */
-+ mic_wakeup_io_thread(dev);
-+
-+ return 0;
-+}
-+
-+static int hw_rule_period_bytes_by_rate(struct snd_pcm_hw_params *params,
-+ struct snd_pcm_hw_rule *rule)
-+{
-+ struct snd_interval *period_bytes =
-+ hw_param_interval(params, SNDRV_PCM_HW_PARAM_PERIOD_BYTES);
-+ struct snd_interval *rate =
-+ hw_param_interval(params, SNDRV_PCM_HW_PARAM_RATE);
-+
-+ DBG("rate: min %d, max %d\n", rate->min, rate->max);
-+
-+ if (rate->min == rate->max) {
-+ if (rate->min >= 44100) {
-+ struct snd_interval t = {
-+ .min = 128,
-+ .max = 128,
-+ .integer = 1,
-+ };
-+ return snd_interval_refine(period_bytes, &t);
-+ } else if (rate->min >= 22050) {
-+ struct snd_interval t = {
-+ .min = 32,
-+ .max = 32,
-+ .integer = 1,
-+ };
-+ return snd_interval_refine(period_bytes, &t);
-+ } else {
-+ struct snd_interval t = {
-+ .min = 32,
-+ .max = 32,
-+ .integer = 1,
-+ };
-+ return snd_interval_refine(period_bytes, &t);
-+ }
-+ }
-+ return 0;
-+}
-+
-+static int mic_snd_pcm_capture_open(struct snd_pcm_substream *substream)
-+{
-+ struct mic_device *dev = snd_pcm_substream_chip(substream);
-+ struct snd_pcm_runtime *runtime = substream->runtime;
-+ unsigned long flags;
-+ int retval;
-+
-+ DBG("enter\n");
-+
-+ spin_lock_irqsave(&dev->lock, flags);
-+ dev->running = 0;
-+ dev->c_substream = substream;
-+ spin_unlock_irqrestore(&dev->lock, flags);
-+
-+ runtime->hw = mic_snd_capture;
-+
-+#if 0
-+ /* only 32, 64 and 128 */
-+ retval = snd_pcm_hw_constraint_list(runtime, 0,
-+ SNDRV_PCM_HW_PARAM_PERIOD_BYTES,
-+ &constraints_period_bytes);
-+ if (retval < 0)
-+ return retval;
-+#endif
-+ snd_pcm_hw_rule_add(runtime, 0,
-+ SNDRV_PCM_HW_PARAM_PERIOD_BYTES,
-+ hw_rule_period_bytes_by_rate, 0,
-+ SNDRV_PCM_HW_PARAM_RATE, -1);
-+
-+ /* align to 32 bytes */
-+ retval = snd_pcm_hw_constraint_step(runtime, 0,
-+ SNDRV_PCM_HW_PARAM_BUFFER_BYTES,
-+ 32);
-+ return retval;
-+
-+}
-+
-+static int mic_snd_pcm_capture_close(struct snd_pcm_substream *substream)
-+{
-+ struct mic_device *dev = snd_pcm_substream_chip(substream);
-+ unsigned long flags;
-+
-+DBG("enter\n");
-+
-+ spin_lock_irqsave(&dev->lock, flags);
-+ dev->running = 0;
-+ dev->c_substream = NULL;
-+ spin_unlock_irqrestore(&dev->lock, flags);
-+
-+ mic_wakeup_io_thread(dev);
-+
-+ return 0;
-+}
-+
-+static int mic_snd_pcm_hw_params(struct snd_pcm_substream *substream,
-+ struct snd_pcm_hw_params *hw_params)
-+{
-+DBG("enter\n");
-+
-+ return snd_pcm_lib_malloc_pages(substream,
-+ params_buffer_bytes(hw_params));
-+}
-+
-+static int mic_snd_pcm_hw_free(struct snd_pcm_substream *substream)
-+{
-+DBG("enter\n");
-+
-+ snd_pcm_lib_free_pages(substream);
-+ return 0;
-+}
-+
-+static int mic_snd_pcm_prepare(struct snd_pcm_substream *substream)
-+{
-+ struct mic_device *dev = snd_pcm_substream_chip(substream);
-+ struct snd_pcm_runtime *runtime = substream->runtime;
-+ unsigned long flags;
-+ int retval;
-+
-+DBG("enter\n");
-+
-+ mic_printk(KERN_INFO, "rate=%d, channels=%d, sample_bits=%d\n",
-+ runtime->rate, runtime->channels,
-+ runtime->sample_bits);
-+ mic_printk(KERN_INFO, "format=%d, access=%d\n",
-+ runtime->format, runtime->access);
-+ mic_printk(KERN_INFO, "buffer_bytes=%d, period_bytes=%d\n",
-+ snd_pcm_lib_buffer_bytes(substream),
-+ snd_pcm_lib_period_bytes(substream));
-+
-+ spin_lock_irqsave(&dev->lock, flags);
-+ dev->c_orig = runtime->dma_area;
-+ dev->c_left = 0;
-+ spin_unlock_irqrestore(&dev->lock, flags);
-+
-+ retval = mic_set_sample_rate(dev, runtime->rate);
-+ if (retval < 0)
-+ return retval;
-+
-+ retval = mic_set_period(dev, snd_pcm_lib_period_bytes(substream));
-+
-+ return retval;
-+}
-+
-+static int mic_snd_pcm_trigger(struct snd_pcm_substream *substream, int cmd)
-+{
-+ struct mic_device *dev = snd_pcm_substream_chip(substream);
-+
-+ switch (cmd) {
-+ case SNDRV_PCM_TRIGGER_START:
-+ if (!dev->running) {
-+ DBG("trigger start\n");
-+ dev->running = 1;
-+ exi_dev_take(dev->exi_device);
-+ mic_hey(dev);
-+ mic_enable_sampling(dev, 1);
-+ mic_control(dev);
-+ exi_dev_give(dev->exi_device);
-+ }
-+ break;
-+ case SNDRV_PCM_TRIGGER_STOP:
-+ DBG("trigger stop\n");
-+ dev->running = 0;
-+ break;
-+ }
-+ return 0;
-+}
-+
-+static snd_pcm_uframes_t
-+mic_snd_pcm_pointer(struct snd_pcm_substream *substream)
-+{
-+ struct mic_device *dev = snd_pcm_substream_chip(substream);
-+ size_t ptr;
-+
-+ if (!dev->running || !dev->c_left)
-+ return 0;
-+
-+ ptr = dev->c_cur - dev->c_orig;
-+ return bytes_to_frames(substream->runtime, ptr);
-+}
-+
-+
-+static struct snd_pcm_ops mic_snd_pcm_capture_ops = {
-+ .open = mic_snd_pcm_capture_open,
-+ .close = mic_snd_pcm_capture_close,
-+ .ioctl = snd_pcm_lib_ioctl,
-+ .hw_params = mic_snd_pcm_hw_params,
-+ .hw_free = mic_snd_pcm_hw_free,
-+ .prepare = mic_snd_pcm_prepare,
-+ .trigger = mic_snd_pcm_trigger,
-+ .pointer = mic_snd_pcm_pointer,
-+};
-+
-+/*
-+ *
-+ */
-+static int mic_snd_new_pcm(struct mic_device *dev)
-+{
-+ struct snd_pcm *pcm;
-+ int retval;
-+
-+DBG("enter\n");
-+
-+ retval = snd_pcm_new(dev->card, dev->card->shortname, 0, 0, 1, &pcm);
-+ if (retval < 0)
-+ return retval;
-+
-+ pcm->private_data = dev;
-+ strcpy(pcm->name, dev->card->shortname);
-+ dev->pcm = pcm;
-+
-+ snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_CAPTURE,
-+ &mic_snd_pcm_capture_ops);
-+
-+ snd_pcm_lib_preallocate_pages_for_all(pcm, SNDRV_DMA_TYPE_CONTINUOUS,
-+ snd_dma_continuous_data
-+ (GFP_KERNEL),
-+ 32*1024, 32*1024);
-+ return 0;
-+}
-+
-+/*
-+ *
-+ */
-+static int mic_init_snd(struct mic_device *dev)
-+{
-+ struct snd_card *card;
-+ int retval = -ENOMEM;
-+
-+DBG("enter\n");
-+
-+ card = snd_card_new(index, id, THIS_MODULE, 0);
-+ if (!card) {
-+ mic_printk(KERN_ERR, "unable to create sound card\n");
-+ goto err_card;
-+ }
-+
-+ strcpy(card->driver, DRV_MODULE_NAME);
-+ strcpy(card->shortname, DRV_MODULE_NAME);
-+ strcpy(card->longname, "Nintendo GameCube Microphone");
-+
-+ dev->card = card;
-+
-+ retval = mic_snd_new_pcm(dev);
-+ if (retval < 0)
-+ goto err_new_pcm;
-+
-+ retval = snd_card_register(card);
-+ if (retval) {
-+ mic_printk(KERN_ERR, "unable to register sound card\n");
-+ goto err_card_register;
-+ }
-+
-+ return 0;
-+
-+err_card_register:
-+err_new_pcm:
-+ snd_card_free(card);
-+ dev->card = NULL;
-+err_card:
-+ return retval;
-+}
-+
-+/*
-+ *
-+ */
-+static void mic_exit_snd(struct mic_device *dev)
-+{
-+DBG("enter\n");
-+
-+ if (dev->card) {
-+ snd_card_disconnect(dev->card);
-+ snd_card_free_when_closed(dev->card);
-+
-+ dev->card = NULL;
-+ dev->pcm = NULL;
-+ dev->c_substream = NULL;
-+ }
-+}
-+
-+/*
-+ *
-+ */
-+static int mic_init(struct mic_device *dev)
-+{
-+ struct exi_device *exi_device = dev->exi_device;
-+ struct exi_channel *exi_channel = exi_get_exi_channel(exi_device);
-+ int channel;
-+ int retval = -ENOMEM;
-+
-+DBG("enter\n");
-+
-+ spin_lock_init(&dev->lock);
-+
-+ dev->running = 0;
-+
-+ retval = mic_init_snd(dev);
-+ if (retval)
-+ goto err_init_snd;
-+
-+ init_waitqueue_head(&dev->io_waitq);
-+ channel = to_channel(exi_get_exi_channel(dev->exi_device));
-+ dev->io_thread = kthread_run(mic_io_thread, dev, "kmicd/%d", channel);
-+ if (IS_ERR(dev->io_thread)) {
-+ mic_printk(KERN_ERR, "error creating io thread\n");
-+ goto err_io_thread;
-+ }
-+
-+ retval = exi_event_register(exi_channel, EXI_EVENT_IRQ,
-+ exi_device,
-+ mic_event_handler, dev,
-+ 0 /*(1 << to_channel(exi_channel))*/);
-+ if (retval) {
-+ mic_printk(KERN_ERR, "error registering exi event\n");
-+ goto err_event_register;
-+ }
-+
-+ retval = mic_init_proc(dev);
-+ if (retval)
-+ goto err_init_proc;
-+
-+ return 0;
-+
-+err_init_proc:
-+ exi_event_unregister(exi_channel, EXI_EVENT_IRQ);
-+err_event_register:
-+ mic_stop_io_thread(dev);
-+err_io_thread:
-+ mic_exit_snd(dev);
-+err_init_snd:
-+ return retval;
-+
-+}
-+
-+/*
-+ *
-+ */
-+static void mic_exit(struct mic_device *dev)
-+{
-+ struct exi_device *exi_device = dev->exi_device;
-+ struct exi_channel *exi_channel = exi_get_exi_channel(exi_device);
-+
-+DBG("enter\n");
-+
-+ dev->running = 0;
-+
-+ mic_exit_proc(dev);
-+
-+ exi_event_unregister(exi_channel, EXI_EVENT_IRQ);
-+
-+ if (!IS_ERR(dev->io_thread))
-+ mic_stop_io_thread(dev);
-+
-+ mic_exit_snd(dev);
-+}
-+
-+/*
-+ *
-+ */
-+static int mic_probe(struct exi_device *exi_device)
-+{
-+ struct mic_device *dev;
-+ int retval;
-+
-+ /* we only care about the microphone */
-+ if (exi_device->eid.id != MIC_EXI_ID)
-+ return -ENODEV;
-+
-+ DBG("Microphone inserted\n");
-+
-+ dev = kzalloc(sizeof(*dev), GFP_KERNEL);
-+ if (!dev)
-+ return -ENOMEM;
-+
-+ dev->exi_device = exi_device_get(exi_device);
-+ exi_set_drvdata(exi_device, dev);
-+
-+ retval = mic_init(dev);
-+ if (retval) {
-+ exi_set_drvdata(exi_device, NULL);
-+ exi_device_put(exi_device);
-+ dev->exi_device = NULL;
-+ kfree(dev);
-+ }
-+
-+ return retval;
-+}
-+
-+/*
-+ *
-+ */
-+static void mic_remove(struct exi_device *exi_device)
-+{
-+ struct mic_device *dev = exi_get_drvdata(exi_device);
-+
-+ DBG("Microphone removed\n");
-+
-+ if (dev) {
-+ mic_exit(dev);
-+ if (dev->exi_device)
-+ exi_device_put(dev->exi_device);
-+ dev->exi_device = NULL;
-+ kfree(dev);
-+ }
-+ exi_set_drvdata(exi_device, NULL);
-+}
-+
-+static struct exi_device_id mic_eid_table[] = {
-+ [0] = {
-+ .channel = MIC_SLOTA_CHANNEL,
-+ .device = MIC_SLOTA_DEVICE,
-+ .id = MIC_EXI_ID,
-+ },
-+ [1] = {
-+ .channel = MIC_SLOTB_CHANNEL,
-+ .device = MIC_SLOTB_DEVICE,
-+ .id = MIC_EXI_ID,
-+ },
-+ {.id = 0}
-+};
-+
-+static struct exi_driver mic_driver = {
-+ .name = DRV_MODULE_NAME,
-+ .eid_table = mic_eid_table,
-+ .frequency = MIC_SPI_CLK_IDX,
-+ .probe = mic_probe,
-+ .remove = mic_remove,
-+};
-+
-+static int __init mic_init_module(void)
-+{
-+ int retval = 0;
-+
-+ mic_printk(KERN_INFO, "%s - version %s\n", DRV_DESCRIPTION,
-+ mic_driver_version);
-+
-+ retval = exi_driver_register(&mic_driver);
-+
-+ return retval;
-+}
-+
-+static void __exit mic_exit_module(void)
-+{
-+ exi_driver_unregister(&mic_driver);
-+}
-+
-+module_init(mic_init_module);
-+module_exit(mic_exit_module);
-+
diff --git a/recipes/linux/linux/poodle/defconfig b/recipes/linux/linux/poodle/defconfig
new file mode 100644
index 0000000000..0f5bdade7e
--- /dev/null
+++ b/recipes/linux/linux/poodle/defconfig
@@ -0,0 +1,379 @@
+CONFIG_EXPERIMENTAL=y
+# CONFIG_LOCALVERSION_AUTO is not set
+CONFIG_SYSVIPC=y
+CONFIG_BSD_PROCESS_ACCT=y
+CONFIG_BSD_PROCESS_ACCT_V3=y
+CONFIG_IKCONFIG=m
+CONFIG_IKCONFIG_PROC=y
+CONFIG_LOG_BUF_SHIFT=14
+CONFIG_BLK_DEV_INITRD=y
+CONFIG_RD_BZIP2=y
+CONFIG_RD_LZMA=y
+CONFIG_RD_LZO=y
+# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
+CONFIG_EMBEDDED=y
+CONFIG_SLOB=y
+CONFIG_PROFILING=y
+CONFIG_OPROFILE=m
+CONFIG_MODULES=y
+CONFIG_MODULE_UNLOAD=y
+CONFIG_MODULE_FORCE_UNLOAD=y
+# CONFIG_LBDAF is not set
+CONFIG_IOSCHED_DEADLINE=m
+CONFIG_IOSCHED_CFQ=m
+CONFIG_ARCH_PXA=y
+CONFIG_PXA_SHARPSL=y
+CONFIG_MACH_POODLE=y
+CONFIG_PCCARD=y
+CONFIG_PCMCIA_PXA2XX=y
+CONFIG_NO_HZ=y
+CONFIG_HIGH_RES_TIMERS=y
+CONFIG_AEABI=y
+# CONFIG_OABI_COMPAT is not set
+CONFIG_ZBOOT_ROM_TEXT=0x0
+CONFIG_ZBOOT_ROM_BSS=0x0
+CONFIG_CMDLINE="console=ttyS0,115200n8 console=tty1 fbcon=rotate:1 quiet"
+CONFIG_KEXEC=y
+# CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS is not set
+CONFIG_BINFMT_AOUT=m
+CONFIG_BINFMT_MISC=m
+CONFIG_PM_RUNTIME=y
+CONFIG_APM_EMULATION=y
+CONFIG_NET=y
+CONFIG_PACKET=m
+CONFIG_UNIX=y
+CONFIG_XFRM_USER=m
+CONFIG_INET=y
+CONFIG_INET_XFRM_MODE_TRANSPORT=m
+CONFIG_INET_XFRM_MODE_TUNNEL=m
+CONFIG_INET_XFRM_MODE_BEET=m
+# CONFIG_INET_LRO is not set
+CONFIG_INET_DIAG=m
+CONFIG_INET6_AH=m
+CONFIG_INET6_ESP=m
+CONFIG_INET6_IPCOMP=m
+CONFIG_IPV6_TUNNEL=m
+CONFIG_NETFILTER=y
+CONFIG_NF_CONNTRACK=m
+CONFIG_NF_CONNTRACK_FTP=m
+CONFIG_NF_CONNTRACK_H323=m
+CONFIG_NF_CONNTRACK_IRC=m
+CONFIG_NF_CONNTRACK_SIP=m
+CONFIG_NF_CONNTRACK_IPV4=m
+CONFIG_IP_NF_IPTABLES=m
+CONFIG_IP_NF_MATCH_AH=m
+CONFIG_IP_NF_MATCH_ECN=m
+CONFIG_IP_NF_MATCH_TTL=m
+CONFIG_IP_NF_FILTER=m
+CONFIG_IP_NF_TARGET_REJECT=m
+CONFIG_IP_NF_TARGET_LOG=m
+CONFIG_IP_NF_TARGET_ULOG=m
+CONFIG_NF_NAT=m
+CONFIG_IP_NF_TARGET_MASQUERADE=m
+CONFIG_IP_NF_TARGET_NETMAP=m
+CONFIG_IP_NF_TARGET_REDIRECT=m
+CONFIG_IP_NF_MANGLE=m
+CONFIG_IP_NF_TARGET_ECN=m
+CONFIG_IP_NF_TARGET_TTL=m
+CONFIG_IP_NF_RAW=m
+CONFIG_IP_NF_ARPTABLES=m
+CONFIG_IP_NF_ARPFILTER=m
+CONFIG_IP_NF_ARP_MANGLE=m
+CONFIG_IRDA=m
+CONFIG_IRLAN=m
+CONFIG_IRNET=m
+CONFIG_IRCOMM=m
+CONFIG_PXA_FICP=m
+CONFIG_BT=m
+CONFIG_BT_L2CAP=y
+CONFIG_BT_SCO=y
+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
+CONFIG_BT_HCIBTUSB=m
+CONFIG_BT_HCIBTSDIO=m
+CONFIG_BT_HCIUART=m
+CONFIG_BT_HCIUART_H4=y
+CONFIG_BT_HCIUART_BCSP=y
+CONFIG_BT_HCIUART_ATH3K=y
+CONFIG_BT_HCIUART_LL=y
+CONFIG_BT_HCIBCM203X=m
+CONFIG_BT_HCIBPA10X=m
+CONFIG_BT_HCIBFUSB=m
+CONFIG_BT_HCIDTL1=m
+CONFIG_BT_HCIBT3C=m
+CONFIG_BT_HCIBLUECARD=m
+CONFIG_BT_HCIBTUART=m
+CONFIG_BT_HCIVHCI=m
+CONFIG_BT_MRVL=m
+CONFIG_BT_MRVL_SDIO=m
+CONFIG_BT_ATH3K=m
+CONFIG_CFG80211=m
+# CONFIG_CFG80211_DEFAULT_PS is not set
+CONFIG_MAC80211=m
+# CONFIG_MAC80211_RC_MINSTREL is not set
+CONFIG_DEVTMPFS=y
+CONFIG_DEVTMPFS_MOUNT=y
+CONFIG_MTD=y
+CONFIG_MTD_PARTITIONS=y
+CONFIG_MTD_CMDLINE_PARTS=y
+CONFIG_MTD_CHAR=y
+CONFIG_MTD_BLOCK=y
+CONFIG_MTD_ROM=y
+CONFIG_MTD_COMPLEX_MAPPINGS=y
+CONFIG_MTD_PHYSMAP=y
+CONFIG_MTD_NAND=y
+CONFIG_MTD_NAND_VERIFY_WRITE=y
+CONFIG_MTD_NAND_SHARPSL=y
+CONFIG_MTD_UBI=y
+CONFIG_MTD_UBI_GLUEBI=m
+CONFIG_BLK_DEV_LOOP=y
+CONFIG_MISC_DEVICES=y
+CONFIG_BLK_DEV_SD=y
+CONFIG_BLK_DEV_SR=m
+CONFIG_CHR_DEV_SG=m
+CONFIG_SCSI_MULTI_LUN=y
+CONFIG_ATA=y
+CONFIG_PATA_PXA=y
+CONFIG_PATA_PCMCIA=y
+CONFIG_NETDEVICES=y
+CONFIG_TUN=m
+CONFIG_NET_ETHERNET=y
+# CONFIG_NETDEV_1000 is not set
+# CONFIG_NETDEV_10000 is not set
+CONFIG_AIRO_CS=m
+CONFIG_HOSTAP=m
+CONFIG_HOSTAP_FIRMWARE=y
+CONFIG_HOSTAP_CS=m
+CONFIG_USB_CATC=m
+CONFIG_USB_KAWETH=m
+CONFIG_USB_PEGASUS=m
+CONFIG_USB_RTL8150=m
+CONFIG_USB_USBNET=m
+CONFIG_USB_NET_DM9601=m
+# CONFIG_USB_NET_CDC_SUBSET is not set
+CONFIG_USB_SIERRA_NET=m
+CONFIG_NET_PCMCIA=y
+CONFIG_PCMCIA_PCNET=m
+CONFIG_PPP=m
+CONFIG_PPP_ASYNC=m
+CONFIG_PPP_DEFLATE=m
+CONFIG_PPP_BSDCOMP=m
+# CONFIG_INPUT_MOUSEDEV_PSAUX is not set
+CONFIG_INPUT_MOUSEDEV_SCREEN_X=240
+CONFIG_INPUT_MOUSEDEV_SCREEN_Y=320
+CONFIG_INPUT_EVDEV=y
+CONFIG_INPUT_APMPOWER=y
+# CONFIG_KEYBOARD_ATKBD is not set
+CONFIG_KEYBOARD_GPIO=y
+CONFIG_KEYBOARD_LOCOMO=y
+# CONFIG_INPUT_MOUSE is not set
+CONFIG_INPUT_TOUCHSCREEN=y
+CONFIG_TOUCHSCREEN_ADS7846=y
+CONFIG_INPUT_MISC=y
+CONFIG_INPUT_UINPUT=m
+# CONFIG_SERIO is not set
+# CONFIG_LEGACY_PTYS is not set
+CONFIG_SERIAL_8250=m
+CONFIG_SERIAL_8250_CS=m
+CONFIG_SERIAL_PXA=y
+CONFIG_SERIAL_PXA_CONSOLE=y
+CONFIG_RAMOOPS=y
+CONFIG_I2C=y
+CONFIG_I2C_PXA=y
+CONFIG_SPI=y
+CONFIG_SPI_PXA2XX=y
+CONFIG_GPIO_SYSFS=y
+CONFIG_POWER_SUPPLY=y
+CONFIG_POWER_SUPPLY_DEBUG=y
+CONFIG_PDA_POWER=y
+CONFIG_APM_POWER=y
+CONFIG_SENSORS_MAX1111=y
+CONFIG_FB=y
+CONFIG_FB_PXA=y
+CONFIG_BACKLIGHT_LCD_SUPPORT=y
+CONFIG_LCD_CLASS_DEVICE=y
+CONFIG_BACKLIGHT_CLASS_DEVICE=y
+# CONFIG_BACKLIGHT_GENERIC is not set
+CONFIG_DISPLAY_SUPPORT=y
+CONFIG_FRAMEBUFFER_CONSOLE=y
+CONFIG_FRAMEBUFFER_CONSOLE_ROTATION=y
+CONFIG_FONTS=y
+CONFIG_FONT_8x8=y
+CONFIG_LOGO=y
+# CONFIG_LOGO_LINUX_MONO is not set
+# CONFIG_LOGO_LINUX_VGA16 is not set
+CONFIG_SOUND=m
+CONFIG_SND=m
+CONFIG_SND_SEQUENCER=m
+CONFIG_SND_MIXER_OSS=m
+CONFIG_SND_PCM_OSS=m
+CONFIG_SND_PXA2XX_AC97=m
+CONFIG_SND_USB_AUDIO=m
+CONFIG_SND_SOC=m
+CONFIG_SND_PXA2XX_SOC=m
+CONFIG_SND_PXA2XX_SOC_POODLE=m
+CONFIG_HID=m
+CONFIG_USB_KBD=m
+CONFIG_USB_MOUSE=m
+CONFIG_USB=m
+CONFIG_USB_DEBUG=y
+CONFIG_USB_ANNOUNCE_NEW_DEVICES=y
+CONFIG_USB_DEVICEFS=y
+CONFIG_USB_OTG_WHITELIST=y
+CONFIG_USB_MON=m
+CONFIG_USB_SL811_HCD=m
+CONFIG_USB_SL811_CS=m
+CONFIG_USB_ACM=m
+CONFIG_USB_PRINTER=m
+CONFIG_USB_STORAGE=m
+CONFIG_USB_MDC800=m
+CONFIG_USB_MICROTEK=m
+CONFIG_USB_SERIAL=m
+CONFIG_USB_SERIAL_GENERIC=y
+CONFIG_USB_SERIAL_BELKIN=m
+CONFIG_USB_SERIAL_DIGI_ACCELEPORT=m
+CONFIG_USB_SERIAL_CYPRESS_M8=m
+CONFIG_USB_SERIAL_EMPEG=m
+CONFIG_USB_SERIAL_FTDI_SIO=m
+CONFIG_USB_SERIAL_VISOR=m
+CONFIG_USB_SERIAL_IPAQ=m
+CONFIG_USB_SERIAL_IR=m
+CONFIG_USB_SERIAL_EDGEPORT=m
+CONFIG_USB_SERIAL_EDGEPORT_TI=m
+CONFIG_USB_SERIAL_GARMIN=m
+CONFIG_USB_SERIAL_IPW=m
+CONFIG_USB_SERIAL_KEYSPAN_PDA=m
+CONFIG_USB_SERIAL_KEYSPAN=m
+CONFIG_USB_SERIAL_KLSI=m
+CONFIG_USB_SERIAL_KOBIL_SCT=m
+CONFIG_USB_SERIAL_MCT_U232=m
+CONFIG_USB_SERIAL_PL2303=m
+CONFIG_USB_SERIAL_SAFE=m
+CONFIG_USB_SERIAL_TI=m
+CONFIG_USB_SERIAL_CYBERJACK=m
+CONFIG_USB_SERIAL_XIRCOM=m
+CONFIG_USB_SERIAL_OMNINET=m
+CONFIG_USB_EMI62=m
+CONFIG_USB_EMI26=m
+CONFIG_USB_RIO500=m
+CONFIG_USB_LEGOTOWER=m
+CONFIG_USB_LCD=m
+CONFIG_USB_LED=m
+CONFIG_USB_CYTHERM=m
+CONFIG_USB_IDMOUSE=m
+CONFIG_USB_GADGET=m
+CONFIG_USB_GADGET_DEBUG_FILES=y
+CONFIG_USB_GADGET_DEBUG_FS=y
+CONFIG_USB_ZERO=m
+CONFIG_USB_ETH=m
+CONFIG_USB_ETH_EEM=y
+CONFIG_USB_GADGETFS=m
+CONFIG_USB_FILE_STORAGE=m
+CONFIG_USB_MASS_STORAGE=m
+CONFIG_USB_G_SERIAL=m
+CONFIG_USB_CDC_COMPOSITE=m
+CONFIG_USB_G_MULTI=m
+CONFIG_USB_G_MULTI_CDC=y
+CONFIG_USB_GPIO_VBUS=m
+CONFIG_USB_ULPI=y
+CONFIG_NOP_USB_XCEIV=m
+CONFIG_MMC=y
+CONFIG_MMC_UNSAFE_RESUME=y
+CONFIG_MMC_PXA=y
+CONFIG_MMC_SPI=y
+CONFIG_NEW_LEDS=y
+CONFIG_LEDS_CLASS=y
+CONFIG_LEDS_LOCOMO=y
+CONFIG_LEDS_TRIGGERS=y
+CONFIG_LEDS_TRIGGER_TIMER=y
+CONFIG_LEDS_TRIGGER_HEARTBEAT=y
+CONFIG_RTC_CLASS=m
+CONFIG_RTC_DRV_SA1100=m
+CONFIG_RTC_DRV_PXA=m
+CONFIG_EXT2_FS=y
+CONFIG_EXT3_FS=y
+# CONFIG_EXT3_DEFAULTS_TO_ORDERED is not set
+# CONFIG_EXT3_FS_XATTR is not set
+CONFIG_EXT4_FS=y
+CONFIG_VFAT_FS=y
+CONFIG_TMPFS=y
+CONFIG_TMPFS_POSIX_ACL=y
+CONFIG_JFFS2_FS=y
+CONFIG_JFFS2_SUMMARY=y
+CONFIG_JFFS2_COMPRESSION_OPTIONS=y
+CONFIG_JFFS2_LZO=y
+CONFIG_JFFS2_RUBIN=y
+CONFIG_UBIFS_FS=y
+CONFIG_UBIFS_FS_ADVANCED_COMPR=y
+CONFIG_CRAMFS=m
+CONFIG_NFS_FS=m
+CONFIG_NFS_V3=y
+CONFIG_NFS_V4=y
+CONFIG_NFSD=m
+CONFIG_NFSD_V4=y
+CONFIG_CIFS=m
+CONFIG_PARTITION_ADVANCED=y
+CONFIG_NLS_DEFAULT="cp437"
+CONFIG_NLS_CODEPAGE_437=y
+CONFIG_NLS_CODEPAGE_737=m
+CONFIG_NLS_CODEPAGE_775=m
+CONFIG_NLS_CODEPAGE_850=m
+CONFIG_NLS_CODEPAGE_852=m
+CONFIG_NLS_CODEPAGE_855=m
+CONFIG_NLS_CODEPAGE_857=m
+CONFIG_NLS_CODEPAGE_860=m
+CONFIG_NLS_CODEPAGE_861=m
+CONFIG_NLS_CODEPAGE_862=m
+CONFIG_NLS_CODEPAGE_863=m
+CONFIG_NLS_CODEPAGE_864=m
+CONFIG_NLS_CODEPAGE_865=m
+CONFIG_NLS_CODEPAGE_866=m
+CONFIG_NLS_CODEPAGE_869=m
+CONFIG_NLS_CODEPAGE_936=m
+CONFIG_NLS_CODEPAGE_950=m
+CONFIG_NLS_CODEPAGE_932=m
+CONFIG_NLS_CODEPAGE_949=m
+CONFIG_NLS_CODEPAGE_874=m
+CONFIG_NLS_ISO8859_8=m
+CONFIG_NLS_CODEPAGE_1250=m
+CONFIG_NLS_CODEPAGE_1251=m
+CONFIG_NLS_ASCII=m
+CONFIG_NLS_ISO8859_1=y
+CONFIG_NLS_ISO8859_2=m
+CONFIG_NLS_ISO8859_3=m
+CONFIG_NLS_ISO8859_4=m
+CONFIG_NLS_ISO8859_5=m
+CONFIG_NLS_ISO8859_6=m
+CONFIG_NLS_ISO8859_7=m
+CONFIG_NLS_ISO8859_9=m
+CONFIG_NLS_ISO8859_13=m
+CONFIG_NLS_ISO8859_14=m
+CONFIG_NLS_ISO8859_15=m
+CONFIG_NLS_KOI8_R=m
+CONFIG_NLS_KOI8_U=m
+CONFIG_NLS_UTF8=y
+CONFIG_MAGIC_SYSRQ=y
+CONFIG_DEBUG_FS=y
+CONFIG_SYSCTL_SYSCALL_CHECK=y
+CONFIG_CRYPTO_NULL=m
+CONFIG_CRYPTO_TEST=m
+CONFIG_CRYPTO_PCBC=m
+CONFIG_CRYPTO_SHA256=m
+CONFIG_CRYPTO_SHA512=m
+CONFIG_CRYPTO_WP512=m
+CONFIG_CRYPTO_ANUBIS=m
+CONFIG_CRYPTO_BLOWFISH=m
+CONFIG_CRYPTO_CAMELLIA=m
+CONFIG_CRYPTO_CAST5=m
+CONFIG_CRYPTO_CAST6=m
+CONFIG_CRYPTO_KHAZAD=m
+CONFIG_CRYPTO_SERPENT=m
+CONFIG_CRYPTO_TEA=m
+CONFIG_CRYPTO_TWOFISH=m
+# CONFIG_CRYPTO_HW is not set
+CONFIG_CRC_CCITT=y
+CONFIG_LIBCRC32C=m
diff --git a/recipes/linux/linux/spitz/defconfig b/recipes/linux/linux/spitz/defconfig
index d396963a9f..43b22dc597 100644
--- a/recipes/linux/linux/spitz/defconfig
+++ b/recipes/linux/linux/spitz/defconfig
@@ -1,608 +1,66 @@
-#
-# Automatically generated make config: don't edit
-# Linux/arm 2.6.37-rc7 Kernel Configuration
-# Wed Dec 22 10:03:41 2010
-#
-CONFIG_ARM=y
-CONFIG_SYS_SUPPORTS_APM_EMULATION=y
-CONFIG_GENERIC_GPIO=y
-# CONFIG_ARCH_USES_GETTIMEOFFSET is not set
-CONFIG_GENERIC_CLOCKEVENTS=y
-CONFIG_HAVE_PROC_CPU=y
-CONFIG_GENERIC_HARDIRQS=y
-CONFIG_STACKTRACE_SUPPORT=y
-CONFIG_HAVE_LATENCYTOP_SUPPORT=y
-CONFIG_LOCKDEP_SUPPORT=y
-CONFIG_TRACE_IRQFLAGS_SUPPORT=y
-CONFIG_HARDIRQS_SW_RESEND=y
-CONFIG_GENERIC_IRQ_PROBE=y
-CONFIG_RWSEM_GENERIC_SPINLOCK=y
-CONFIG_ARCH_HAS_CPUFREQ=y
-CONFIG_ARCH_HAS_CPU_IDLE_WAIT=y
-CONFIG_GENERIC_HWEIGHT=y
-CONFIG_GENERIC_CALIBRATE_DELAY=y
-CONFIG_NEED_DMA_MAP_STATE=y
-CONFIG_ARCH_MTD_XIP=y
-CONFIG_GENERIC_HARDIRQS_NO__DO_IRQ=y
-CONFIG_VECTORS_BASE=0xffff0000
-CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
-CONFIG_CONSTRUCTORS=y
-CONFIG_HAVE_IRQ_WORK=y
-CONFIG_IRQ_WORK=y
-
-#
-# General setup
-#
CONFIG_EXPERIMENTAL=y
-CONFIG_BROKEN_ON_SMP=y
-CONFIG_INIT_ENV_ARG_LIMIT=32
-CONFIG_CROSS_COMPILE=""
-CONFIG_LOCALVERSION=""
# CONFIG_LOCALVERSION_AUTO is not set
-CONFIG_HAVE_KERNEL_GZIP=y
-CONFIG_HAVE_KERNEL_LZMA=y
-CONFIG_HAVE_KERNEL_LZO=y
-CONFIG_KERNEL_GZIP=y
-# CONFIG_KERNEL_LZMA is not set
-# CONFIG_KERNEL_LZO is not set
-CONFIG_SWAP=y
CONFIG_SYSVIPC=y
-CONFIG_SYSVIPC_SYSCTL=y
-# CONFIG_POSIX_MQUEUE is not set
CONFIG_BSD_PROCESS_ACCT=y
CONFIG_BSD_PROCESS_ACCT_V3=y
-# CONFIG_TASKSTATS is not set
-# CONFIG_AUDIT is not set
-# CONFIG_HAVE_GENERIC_HARDIRQS is not set
-CONFIG_SPARSE_IRQ=y
-
-#
-# RCU Subsystem
-#
-CONFIG_TINY_RCU=y
-# CONFIG_PREEMPT_RCU is not set
-# CONFIG_TREE_RCU_TRACE is not set
CONFIG_IKCONFIG=m
CONFIG_IKCONFIG_PROC=y
CONFIG_LOG_BUF_SHIFT=14
-# CONFIG_CGROUPS is not set
-# CONFIG_NAMESPACES is not set
-# CONFIG_SYSFS_DEPRECATED is not set
-# CONFIG_RELAY is not set
CONFIG_BLK_DEV_INITRD=y
-CONFIG_INITRAMFS_SOURCE=""
-CONFIG_RD_GZIP=y
CONFIG_RD_BZIP2=y
CONFIG_RD_LZMA=y
CONFIG_RD_LZO=y
# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
-CONFIG_SYSCTL=y
-CONFIG_ANON_INODES=y
CONFIG_EMBEDDED=y
-CONFIG_UID16=y
-CONFIG_SYSCTL_SYSCALL=y
-CONFIG_KALLSYMS=y
-# CONFIG_KALLSYMS_EXTRA_PASS is not set
-CONFIG_HOTPLUG=y
-CONFIG_PRINTK=y
-CONFIG_BUG=y
-CONFIG_ELF_CORE=y
-CONFIG_BASE_FULL=y
-CONFIG_FUTEX=y
-CONFIG_EPOLL=y
-CONFIG_SIGNALFD=y
-CONFIG_TIMERFD=y
-CONFIG_EVENTFD=y
-CONFIG_SHMEM=y
-CONFIG_AIO=y
-CONFIG_HAVE_PERF_EVENTS=y
-CONFIG_PERF_USE_VMALLOC=y
-
-#
-# Kernel Performance Events And Counters
-#
-CONFIG_PERF_EVENTS=y
-# CONFIG_PERF_COUNTERS is not set
-CONFIG_VM_EVENT_COUNTERS=y
-CONFIG_COMPAT_BRK=y
-# CONFIG_SLAB is not set
-# CONFIG_SLUB is not set
CONFIG_SLOB=y
CONFIG_PROFILING=y
CONFIG_OPROFILE=m
-CONFIG_HAVE_OPROFILE=y
-# CONFIG_KPROBES is not set
-CONFIG_HAVE_KPROBES=y
-CONFIG_HAVE_KRETPROBES=y
-CONFIG_HAVE_REGS_AND_STACK_ACCESS_API=y
-CONFIG_HAVE_CLK=y
-
-#
-# GCOV-based kernel profiling
-#
-# CONFIG_GCOV_KERNEL is not set
-CONFIG_HAVE_GENERIC_DMA_COHERENT=y
-CONFIG_RT_MUTEXES=y
-CONFIG_BASE_SMALL=0
CONFIG_MODULES=y
-# CONFIG_MODULE_FORCE_LOAD is not set
CONFIG_MODULE_UNLOAD=y
CONFIG_MODULE_FORCE_UNLOAD=y
-# CONFIG_MODVERSIONS is not set
-# CONFIG_MODULE_SRCVERSION_ALL is not set
-CONFIG_BLOCK=y
# CONFIG_LBDAF is not set
-CONFIG_BLK_DEV_BSG=y
-# CONFIG_BLK_DEV_INTEGRITY is not set
-
-#
-# IO Schedulers
-#
-CONFIG_IOSCHED_NOOP=y
CONFIG_IOSCHED_DEADLINE=m
CONFIG_IOSCHED_CFQ=m
-CONFIG_DEFAULT_NOOP=y
-CONFIG_DEFAULT_IOSCHED="noop"
-# CONFIG_INLINE_SPIN_TRYLOCK is not set
-# CONFIG_INLINE_SPIN_TRYLOCK_BH is not set
-# CONFIG_INLINE_SPIN_LOCK is not set
-# CONFIG_INLINE_SPIN_LOCK_BH is not set
-# CONFIG_INLINE_SPIN_LOCK_IRQ is not set
-# CONFIG_INLINE_SPIN_LOCK_IRQSAVE is not set
-CONFIG_INLINE_SPIN_UNLOCK=y
-# CONFIG_INLINE_SPIN_UNLOCK_BH is not set
-CONFIG_INLINE_SPIN_UNLOCK_IRQ=y
-# CONFIG_INLINE_SPIN_UNLOCK_IRQRESTORE is not set
-# CONFIG_INLINE_READ_TRYLOCK is not set
-# CONFIG_INLINE_READ_LOCK is not set
-# CONFIG_INLINE_READ_LOCK_BH is not set
-# CONFIG_INLINE_READ_LOCK_IRQ is not set
-# CONFIG_INLINE_READ_LOCK_IRQSAVE is not set
-CONFIG_INLINE_READ_UNLOCK=y
-# CONFIG_INLINE_READ_UNLOCK_BH is not set
-CONFIG_INLINE_READ_UNLOCK_IRQ=y
-# CONFIG_INLINE_READ_UNLOCK_IRQRESTORE is not set
-# CONFIG_INLINE_WRITE_TRYLOCK is not set
-# CONFIG_INLINE_WRITE_LOCK is not set
-# CONFIG_INLINE_WRITE_LOCK_BH is not set
-# CONFIG_INLINE_WRITE_LOCK_IRQ is not set
-# CONFIG_INLINE_WRITE_LOCK_IRQSAVE is not set
-CONFIG_INLINE_WRITE_UNLOCK=y
-# CONFIG_INLINE_WRITE_UNLOCK_BH is not set
-CONFIG_INLINE_WRITE_UNLOCK_IRQ=y
-# CONFIG_INLINE_WRITE_UNLOCK_IRQRESTORE is not set
-# CONFIG_MUTEX_SPIN_ON_OWNER is not set
-CONFIG_FREEZER=y
-
-#
-# System Type
-#
-CONFIG_MMU=y
-# CONFIG_ARCH_AAEC2000 is not set
-# CONFIG_ARCH_INTEGRATOR is not set
-# CONFIG_ARCH_REALVIEW is not set
-# CONFIG_ARCH_VERSATILE is not set
-# CONFIG_ARCH_VEXPRESS is not set
-# CONFIG_ARCH_AT91 is not set
-# CONFIG_ARCH_BCMRING is not set
-# CONFIG_ARCH_CLPS711X is not set
-# CONFIG_ARCH_CNS3XXX is not set
-# CONFIG_ARCH_GEMINI is not set
-# CONFIG_ARCH_EBSA110 is not set
-# CONFIG_ARCH_EP93XX is not set
-# CONFIG_ARCH_FOOTBRIDGE is not set
-# CONFIG_ARCH_MXC is not set
-# CONFIG_ARCH_STMP3XXX is not set
-# CONFIG_ARCH_NETX is not set
-# CONFIG_ARCH_H720X is not set
-# CONFIG_ARCH_IOP13XX is not set
-# CONFIG_ARCH_IOP32X is not set
-# CONFIG_ARCH_IOP33X is not set
-# CONFIG_ARCH_IXP23XX is not set
-# CONFIG_ARCH_IXP2000 is not set
-# CONFIG_ARCH_IXP4XX is not set
-# CONFIG_ARCH_DOVE is not set
-# CONFIG_ARCH_KIRKWOOD is not set
-# CONFIG_ARCH_LOKI is not set
-# CONFIG_ARCH_LPC32XX is not set
-# CONFIG_ARCH_MV78XX0 is not set
-# CONFIG_ARCH_ORION5X is not set
-# CONFIG_ARCH_MMP is not set
-# CONFIG_ARCH_KS8695 is not set
-# CONFIG_ARCH_NS9XXX is not set
-# CONFIG_ARCH_W90X900 is not set
-# CONFIG_ARCH_NUC93X is not set
-# CONFIG_ARCH_TEGRA is not set
-# CONFIG_ARCH_PNX4008 is not set
CONFIG_ARCH_PXA=y
-# CONFIG_ARCH_MSM is not set
-# CONFIG_ARCH_SHMOBILE is not set
-# CONFIG_ARCH_RPC is not set
-# CONFIG_ARCH_SA1100 is not set
-# CONFIG_ARCH_S3C2410 is not set
-# CONFIG_ARCH_S3C64XX is not set
-# CONFIG_ARCH_S5P64X0 is not set
-# CONFIG_ARCH_S5P6442 is not set
-# CONFIG_ARCH_S5PC100 is not set
-# CONFIG_ARCH_S5PV210 is not set
-# CONFIG_ARCH_S5PV310 is not set
-# CONFIG_ARCH_SHARK is not set
-# CONFIG_ARCH_TCC_926 is not set
-# CONFIG_ARCH_LH7A40X is not set
-# CONFIG_ARCH_U300 is not set
-# CONFIG_ARCH_U8500 is not set
-# CONFIG_ARCH_NOMADIK is not set
-# CONFIG_ARCH_DAVINCI is not set
-# CONFIG_ARCH_OMAP is not set
-# CONFIG_PLAT_SPEAR is not set
-
-#
-# Intel PXA2xx/PXA3xx Implementations
-#
-
-#
-# Intel/Marvell Dev Platforms (sorted by hardware release time)
-#
-# CONFIG_ARCH_LUBBOCK is not set
-# CONFIG_MACH_MAINSTONE is not set
-# CONFIG_MACH_ZYLONITE300 is not set
-# CONFIG_MACH_ZYLONITE320 is not set
-# CONFIG_MACH_LITTLETON is not set
-# CONFIG_MACH_TAVOREVB is not set
-# CONFIG_MACH_TAVOREVB3 is not set
-# CONFIG_MACH_SAAR is not set
-
-#
-# Third Party Dev Platforms (sorted by vendor name)
-#
-# CONFIG_ARCH_PXA_IDP is not set
-# CONFIG_ARCH_VIPER is not set
-# CONFIG_MACH_ARCOM_ZEUS is not set
-# CONFIG_MACH_BALLOON3 is not set
-# CONFIG_MACH_CSB726 is not set
-# CONFIG_MACH_ARMCORE is not set
-# CONFIG_MACH_EM_X270 is not set
-# CONFIG_MACH_EXEDA is not set
-# CONFIG_MACH_CM_X300 is not set
-# CONFIG_MACH_CAPC7117 is not set
-# CONFIG_ARCH_GUMSTIX is not set
-# CONFIG_MACH_INTELMOTE2 is not set
-# CONFIG_MACH_STARGATE2 is not set
-# CONFIG_MACH_XCEP is not set
-# CONFIG_TRIZEPS_PXA is not set
-# CONFIG_MACH_LOGICPD_PXA270 is not set
-# CONFIG_MACH_PCM027 is not set
-# CONFIG_MACH_COLIBRI is not set
-# CONFIG_MACH_COLIBRI300 is not set
-# CONFIG_MACH_COLIBRI320 is not set
-# CONFIG_MACH_VPAC270 is not set
-
-#
-# End-user Products (sorted by vendor name)
-#
-# CONFIG_MACH_H4700 is not set
-# CONFIG_MACH_H5000 is not set
-# CONFIG_MACH_HIMALAYA is not set
-# CONFIG_MACH_MAGICIAN is not set
-# CONFIG_MACH_MIOA701 is not set
-# CONFIG_PXA_EZX is not set
-# CONFIG_MACH_MP900C is not set
-# CONFIG_ARCH_PXA_PALM is not set
-# CONFIG_MACH_RAUMFELD_RC is not set
-# CONFIG_MACH_RAUMFELD_CONNECTOR is not set
-# CONFIG_MACH_RAUMFELD_SPEAKER is not set
CONFIG_PXA_SHARPSL=y
-# CONFIG_PXA_SHARPSL_DETECT_MACH_ID is not set
-# CONFIG_MACH_POODLE is not set
-# CONFIG_MACH_CORGI is not set
-# CONFIG_MACH_SHEPHERD is not set
-# CONFIG_MACH_HUSKY is not set
CONFIG_MACH_AKITA=y
-CONFIG_MACH_SPITZ=y
CONFIG_MACH_BORZOI=y
-# CONFIG_MACH_TOSA is not set
-# CONFIG_MACH_ICONTROL is not set
-# CONFIG_ARCH_PXA_ESERIES is not set
-# CONFIG_MACH_ZIPIT2 is not set
-CONFIG_PXA27x=y
-CONFIG_PXA_SHARP_Cxx00=y
-CONFIG_SHARPSL_PM=y
-CONFIG_SHARPSL_PM_MAX1111=y
-CONFIG_PXA_SSP=y
-CONFIG_PLAT_PXA=y
-
-#
-# Processor Type
-#
-CONFIG_CPU_XSCALE=y
-CONFIG_CPU_32v5=y
-CONFIG_CPU_ABRT_EV5T=y
-CONFIG_CPU_PABRT_LEGACY=y
-CONFIG_CPU_CACHE_VIVT=y
-CONFIG_CPU_TLB_V4WBI=y
-CONFIG_CPU_CP15=y
-CONFIG_CPU_CP15_MMU=y
-
-#
-# Processor Features
-#
-CONFIG_ARM_THUMB=y
-# CONFIG_CPU_DCACHE_DISABLE is not set
-CONFIG_ARM_L1_CACHE_SHIFT=5
-CONFIG_IWMMXT=y
-CONFIG_XSCALE_PMU=y
-CONFIG_CPU_HAS_PMU=y
-CONFIG_SHARP_PARAM=y
-CONFIG_SHARP_SCOOP=y
-CONFIG_COMMON_CLKDEV=y
-
-#
-# Bus support
-#
-# CONFIG_PCI_SYSCALL is not set
-# CONFIG_ARCH_SUPPORTS_MSI is not set
CONFIG_PCCARD=y
-CONFIG_PCMCIA=y
-CONFIG_PCMCIA_LOAD_CIS=y
-
-#
-# PC-card bridges
-#
-CONFIG_PCMCIA_SOC_COMMON=y
CONFIG_PCMCIA_PXA2XX=y
-# CONFIG_PCMCIA_DEBUG is not set
-
-#
-# Kernel Features
-#
-CONFIG_TICK_ONESHOT=y
CONFIG_NO_HZ=y
CONFIG_HIGH_RES_TIMERS=y
-CONFIG_GENERIC_CLOCKEVENTS_BUILD=y
-CONFIG_VMSPLIT_3G=y
-# CONFIG_VMSPLIT_2G is not set
-# CONFIG_VMSPLIT_1G is not set
-CONFIG_PAGE_OFFSET=0xC0000000
-CONFIG_PREEMPT_NONE=y
-# CONFIG_PREEMPT_VOLUNTARY is not set
-# CONFIG_PREEMPT is not set
-CONFIG_HZ=100
CONFIG_AEABI=y
# CONFIG_OABI_COMPAT is not set
-# CONFIG_ARCH_SPARSEMEM_DEFAULT is not set
-# CONFIG_ARCH_SELECT_MEMORY_MODEL is not set
-# CONFIG_HIGHMEM is not set
-CONFIG_HW_PERF_EVENTS=y
-CONFIG_SELECT_MEMORY_MODEL=y
-CONFIG_FLATMEM_MANUAL=y
-CONFIG_FLATMEM=y
-CONFIG_FLAT_NODE_MEM_MAP=y
-CONFIG_HAVE_MEMBLOCK=y
-CONFIG_PAGEFLAGS_EXTENDED=y
-CONFIG_SPLIT_PTLOCK_CPUS=999999
-# CONFIG_PHYS_ADDR_T_64BIT is not set
-CONFIG_ZONE_DMA_FLAG=0
-CONFIG_VIRT_TO_BUS=y
-# CONFIG_KSM is not set
-CONFIG_DEFAULT_MMAP_MIN_ADDR=4096
-CONFIG_NEED_PER_CPU_KM=y
-CONFIG_FORCE_MAX_ZONEORDER=11
-CONFIG_ALIGNMENT_TRAP=y
-# CONFIG_UACCESS_WITH_MEMCPY is not set
-# CONFIG_SECCOMP is not set
-# CONFIG_CC_STACKPROTECTOR is not set
-# CONFIG_DEPRECATED_PARAM_STRUCT is not set
-
-#
-# Boot options
-#
CONFIG_ZBOOT_ROM_TEXT=0x0
CONFIG_ZBOOT_ROM_BSS=0x0
-CONFIG_CMDLINE=" debug "
-# CONFIG_CMDLINE_FORCE is not set
-# CONFIG_XIP_KERNEL is not set
+CONFIG_CMDLINE="console=ttyS0,115200n8 console=tty1 fbcon=rotate:1 quiet"
CONFIG_KEXEC=y
-CONFIG_ATAGS_PROC=y
-# CONFIG_AUTO_ZRELADDR is not set
-
-#
-# CPU Power Management
-#
-# CONFIG_CPU_FREQ is not set
-# CONFIG_CPU_IDLE is not set
-
-#
-# Floating point emulation
-#
-
-#
-# At least one emulation must be selected
-#
-
-#
-# Userspace binary formats
-#
-CONFIG_BINFMT_ELF=y
# CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS is not set
-CONFIG_HAVE_AOUT=y
CONFIG_BINFMT_AOUT=m
CONFIG_BINFMT_MISC=m
-
-#
-# Power management options
-#
-CONFIG_PM=y
-# CONFIG_PM_DEBUG is not set
-CONFIG_PM_SLEEP=y
-CONFIG_SUSPEND_NVS=y
-CONFIG_SUSPEND=y
-CONFIG_SUSPEND_FREEZER=y
-CONFIG_APM_EMULATION=y
CONFIG_PM_RUNTIME=y
-CONFIG_PM_OPS=y
-CONFIG_ARCH_SUSPEND_POSSIBLE=y
CONFIG_NET=y
-
-#
-# Networking options
-#
CONFIG_PACKET=m
CONFIG_UNIX=y
-CONFIG_XFRM=y
CONFIG_XFRM_USER=m
-# CONFIG_XFRM_SUB_POLICY is not set
-# CONFIG_XFRM_MIGRATE is not set
-# CONFIG_XFRM_STATISTICS is not set
-CONFIG_XFRM_IPCOMP=m
-# 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 is not set
-# CONFIG_NET_IPIP is not set
-# CONFIG_NET_IPGRE_DEMUX is not set
-# CONFIG_ARPD is not set
-# CONFIG_SYN_COOKIES is not set
-# CONFIG_INET_AH is not set
-# CONFIG_INET_ESP is not set
-# CONFIG_INET_IPCOMP is not set
-# CONFIG_INET_XFRM_TUNNEL is not set
-CONFIG_INET_TUNNEL=m
CONFIG_INET_XFRM_MODE_TRANSPORT=m
CONFIG_INET_XFRM_MODE_TUNNEL=m
CONFIG_INET_XFRM_MODE_BEET=m
# CONFIG_INET_LRO is not set
CONFIG_INET_DIAG=m
-CONFIG_INET_TCP_DIAG=m
-# CONFIG_TCP_CONG_ADVANCED is not set
-CONFIG_TCP_CONG_CUBIC=y
-CONFIG_DEFAULT_TCP_CONG="cubic"
-# CONFIG_TCP_MD5SIG is not set
-CONFIG_IPV6=m
-# CONFIG_IPV6_PRIVACY is not set
-# CONFIG_IPV6_ROUTER_PREF is not set
-# CONFIG_IPV6_OPTIMISTIC_DAD is not set
CONFIG_INET6_AH=m
CONFIG_INET6_ESP=m
CONFIG_INET6_IPCOMP=m
-# CONFIG_IPV6_MIP6 is not set
-CONFIG_INET6_XFRM_TUNNEL=m
-CONFIG_INET6_TUNNEL=m
-CONFIG_INET6_XFRM_MODE_TRANSPORT=m
-CONFIG_INET6_XFRM_MODE_TUNNEL=m
-CONFIG_INET6_XFRM_MODE_BEET=m
-# CONFIG_INET6_XFRM_MODE_ROUTEOPTIMIZATION is not set
-CONFIG_IPV6_SIT=m
-# CONFIG_IPV6_SIT_6RD is not set
-CONFIG_IPV6_NDISC_NODETYPE=y
CONFIG_IPV6_TUNNEL=m
-# CONFIG_IPV6_MULTIPLE_TABLES is not set
-# CONFIG_IPV6_MROUTE is not set
-# CONFIG_NETWORK_SECMARK is not set
-# CONFIG_NETWORK_PHY_TIMESTAMPING is not set
CONFIG_NETFILTER=y
-# CONFIG_NETFILTER_DEBUG is not set
-CONFIG_NETFILTER_ADVANCED=y
-
-#
-# Core Netfilter Configuration
-#
-# CONFIG_NETFILTER_NETLINK_QUEUE is not set
-# CONFIG_NETFILTER_NETLINK_LOG is not set
CONFIG_NF_CONNTRACK=m
-# CONFIG_NF_CONNTRACK_MARK is not set
-# CONFIG_NF_CONNTRACK_EVENTS is not set
-# CONFIG_NF_CT_PROTO_DCCP is not set
-# CONFIG_NF_CT_PROTO_SCTP is not set
-# CONFIG_NF_CT_PROTO_UDPLITE is not set
-# CONFIG_NF_CONNTRACK_AMANDA is not set
CONFIG_NF_CONNTRACK_FTP=m
CONFIG_NF_CONNTRACK_H323=m
CONFIG_NF_CONNTRACK_IRC=m
-# CONFIG_NF_CONNTRACK_NETBIOS_NS is not set
-# CONFIG_NF_CONNTRACK_PPTP is not set
-# CONFIG_NF_CONNTRACK_SANE is not set
CONFIG_NF_CONNTRACK_SIP=m
-# CONFIG_NF_CONNTRACK_TFTP is not set
-# CONFIG_NF_CT_NETLINK is not set
-# CONFIG_NETFILTER_TPROXY is not set
-CONFIG_NETFILTER_XTABLES=m
-
-#
-# Xtables combined modules
-#
-# CONFIG_NETFILTER_XT_MARK is not set
-# CONFIG_NETFILTER_XT_CONNMARK is not set
-
-#
-# Xtables targets
-#
-# CONFIG_NETFILTER_XT_TARGET_CHECKSUM is not set
-# CONFIG_NETFILTER_XT_TARGET_CLASSIFY is not set
-# CONFIG_NETFILTER_XT_TARGET_CONNMARK is not set
-# CONFIG_NETFILTER_XT_TARGET_CT is not set
-# CONFIG_NETFILTER_XT_TARGET_DSCP is not set
-CONFIG_NETFILTER_XT_TARGET_HL=m
-# CONFIG_NETFILTER_XT_TARGET_IDLETIMER is not set
-# CONFIG_NETFILTER_XT_TARGET_LED 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_RATEEST is not set
-# CONFIG_NETFILTER_XT_TARGET_TEE is not set
-# CONFIG_NETFILTER_XT_TARGET_TRACE is not set
-# CONFIG_NETFILTER_XT_TARGET_TCPMSS is not set
-# CONFIG_NETFILTER_XT_TARGET_TCPOPTSTRIP is not set
-
-#
-# Xtables matches
-#
-# CONFIG_NETFILTER_XT_MATCH_CLUSTER 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_CPU 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_HL=m
-# CONFIG_NETFILTER_XT_MATCH_IPRANGE 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_OWNER is not set
-# CONFIG_NETFILTER_XT_MATCH_POLICY is not set
-# CONFIG_NETFILTER_XT_MATCH_PKTTYPE is not set
-# CONFIG_NETFILTER_XT_MATCH_QUOTA is not set
-# CONFIG_NETFILTER_XT_MATCH_RATEEST is not set
-# CONFIG_NETFILTER_XT_MATCH_REALM is not set
-# CONFIG_NETFILTER_XT_MATCH_RECENT 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_TIME is not set
-# CONFIG_NETFILTER_XT_MATCH_U32 is not set
-# CONFIG_IP_VS is not set
-
-#
-# IP: Netfilter Configuration
-#
-CONFIG_NF_DEFRAG_IPV4=m
CONFIG_NF_CONNTRACK_IPV4=m
-CONFIG_NF_CONNTRACK_PROC_COMPAT=y
-# CONFIG_IP_NF_QUEUE is not set
CONFIG_IP_NF_IPTABLES=m
-CONFIG_IP_NF_MATCH_ADDRTYPE=m
CONFIG_IP_NF_MATCH_AH=m
CONFIG_IP_NF_MATCH_ECN=m
CONFIG_IP_NF_MATCH_TTL=m
@@ -611,123 +69,37 @@ CONFIG_IP_NF_TARGET_REJECT=m
CONFIG_IP_NF_TARGET_LOG=m
CONFIG_IP_NF_TARGET_ULOG=m
CONFIG_NF_NAT=m
-CONFIG_NF_NAT_NEEDED=y
CONFIG_IP_NF_TARGET_MASQUERADE=m
CONFIG_IP_NF_TARGET_NETMAP=m
CONFIG_IP_NF_TARGET_REDIRECT=m
-CONFIG_NF_NAT_SNMP_BASIC=m
-CONFIG_NF_NAT_FTP=m
-CONFIG_NF_NAT_IRC=m
-# CONFIG_NF_NAT_TFTP is not set
-# CONFIG_NF_NAT_AMANDA is not set
-# CONFIG_NF_NAT_PPTP is not set
-CONFIG_NF_NAT_H323=m
-CONFIG_NF_NAT_SIP=m
CONFIG_IP_NF_MANGLE=m
-# CONFIG_IP_NF_TARGET_CLUSTERIP is not set
CONFIG_IP_NF_TARGET_ECN=m
CONFIG_IP_NF_TARGET_TTL=m
CONFIG_IP_NF_RAW=m
CONFIG_IP_NF_ARPTABLES=m
CONFIG_IP_NF_ARPFILTER=m
CONFIG_IP_NF_ARP_MANGLE=m
-
-#
-# IPv6: Netfilter Configuration
-#
-# CONFIG_NF_DEFRAG_IPV6 is not set
-# CONFIG_NF_CONNTRACK_IPV6 is not set
-# CONFIG_IP6_NF_QUEUE is not set
-# CONFIG_IP6_NF_IPTABLES is not set
-# CONFIG_IP_DCCP is not set
-# CONFIG_IP_SCTP is not set
-# CONFIG_RDS is not set
-# CONFIG_TIPC is not set
-# CONFIG_ATM is not set
-# CONFIG_L2TP is not set
-# CONFIG_BRIDGE is not set
-# CONFIG_NET_DSA is not set
-# CONFIG_VLAN_8021Q is not set
-# CONFIG_DECNET is not set
-# CONFIG_LLC2 is not set
-# CONFIG_IPX is not set
-# CONFIG_ATALK is not set
-# CONFIG_X25 is not set
-# CONFIG_LAPB is not set
-# CONFIG_ECONET is not set
-# CONFIG_WAN_ROUTER is not set
-# CONFIG_PHONET is not set
-# CONFIG_IEEE802154 is not set
-# CONFIG_NET_SCHED is not set
-# CONFIG_DCB is not set
-CONFIG_DNS_RESOLVER=y
-
-#
-# Network testing
-#
-# CONFIG_NET_PKTGEN is not set
-# CONFIG_HAMRADIO is not set
-# CONFIG_CAN is not set
CONFIG_IRDA=m
-
-#
-# IrDA protocols
-#
CONFIG_IRLAN=m
CONFIG_IRNET=m
CONFIG_IRCOMM=m
-# CONFIG_IRDA_ULTRA is not set
-
-#
-# IrDA options
-#
-# CONFIG_IRDA_CACHE_LAST_LSAP is not set
-# CONFIG_IRDA_FAST_RR is not set
-# CONFIG_IRDA_DEBUG is not set
-
-#
-# Infrared-port device drivers
-#
-
-#
-# SIR device drivers
-#
-# CONFIG_IRTTY_SIR is not set
-
-#
-# Dongle support
-#
-# CONFIG_KINGSUN_DONGLE is not set
-# CONFIG_KSDAZZLE_DONGLE is not set
-# CONFIG_KS959_DONGLE is not set
-
-#
-# FIR device drivers
-#
-# CONFIG_USB_IRDA is not set
-# CONFIG_SIGMATEL_FIR is not set
CONFIG_PXA_FICP=m
-# CONFIG_MCS_FIR is not set
CONFIG_BT=m
-CONFIG_BT_L2CAP=m
-CONFIG_BT_SCO=m
+CONFIG_BT_L2CAP=y
+CONFIG_BT_SCO=y
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_HCIBTUSB is not set
-# CONFIG_BT_HCIBTSDIO is not set
+CONFIG_BT_HCIBTUSB=m
+CONFIG_BT_HCIBTSDIO=m
CONFIG_BT_HCIUART=m
CONFIG_BT_HCIUART_H4=y
CONFIG_BT_HCIUART_BCSP=y
-# CONFIG_BT_HCIUART_ATH3K is not set
-# CONFIG_BT_HCIUART_LL is not set
+CONFIG_BT_HCIUART_ATH3K=y
+CONFIG_BT_HCIUART_LL=y
CONFIG_BT_HCIBCM203X=m
CONFIG_BT_HCIBPA10X=m
CONFIG_BT_HCIBFUSB=m
@@ -736,1088 +108,138 @@ CONFIG_BT_HCIBT3C=m
CONFIG_BT_HCIBLUECARD=m
CONFIG_BT_HCIBTUART=m
CONFIG_BT_HCIVHCI=m
-# CONFIG_BT_MRVL is not set
-# CONFIG_AF_RXRPC is not set
-CONFIG_WIRELESS=y
-CONFIG_WIRELESS_EXT=y
-CONFIG_WEXT_CORE=y
-CONFIG_WEXT_PROC=y
-CONFIG_WEXT_SPY=y
-CONFIG_WEXT_PRIV=y
+CONFIG_BT_MRVL=m
+CONFIG_BT_MRVL_SDIO=m
+CONFIG_BT_ATH3K=m
CONFIG_CFG80211=m
-# CONFIG_NL80211_TESTMODE is not set
-# CONFIG_CFG80211_DEVELOPER_WARNINGS is not set
-# CONFIG_CFG80211_REG_DEBUG is not set
# CONFIG_CFG80211_DEFAULT_PS is not set
-# CONFIG_CFG80211_DEBUGFS is not set
-# CONFIG_CFG80211_INTERNAL_REGDB is not set
-CONFIG_CFG80211_WEXT=y
-CONFIG_WIRELESS_EXT_SYSFS=y
-CONFIG_LIB80211=m
-CONFIG_LIB80211_CRYPT_WEP=m
-CONFIG_LIB80211_CRYPT_CCMP=m
-CONFIG_LIB80211_CRYPT_TKIP=m
-# CONFIG_LIB80211_DEBUG is not set
CONFIG_MAC80211=m
-# CONFIG_MAC80211_HAS_RC is not set
-# CONFIG_MAC80211_RC_PID is not set
# CONFIG_MAC80211_RC_MINSTREL is not set
-CONFIG_MAC80211_RC_DEFAULT=""
-
-#
-# Some wireless drivers require a rate control algorithm
-#
-# CONFIG_MAC80211_MESH is not set
-# CONFIG_MAC80211_LEDS is not set
-# CONFIG_MAC80211_DEBUGFS is not set
-# CONFIG_MAC80211_DEBUG_MENU is not set
-# CONFIG_WIMAX is not set
-# CONFIG_RFKILL is not set
-# CONFIG_NET_9P is not set
-# CONFIG_CAIF is not set
-# CONFIG_CEPH_LIB is not set
-
-#
-# Device Drivers
-#
-
-#
-# Generic Driver Options
-#
-CONFIG_UEVENT_HELPER_PATH=""
CONFIG_DEVTMPFS=y
CONFIG_DEVTMPFS_MOUNT=y
-CONFIG_STANDALONE=y
-CONFIG_PREVENT_FIRMWARE_BUILD=y
-CONFIG_FW_LOADER=y
-CONFIG_FIRMWARE_IN_KERNEL=y
-CONFIG_EXTRA_FIRMWARE=""
-# CONFIG_SYS_HYPERVISOR is not set
-# CONFIG_CONNECTOR is not set
CONFIG_MTD=y
-# CONFIG_MTD_DEBUG is not set
-# CONFIG_MTD_TESTS 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
-# CONFIG_MTD_AFS_PARTS is not set
-# CONFIG_MTD_AR7_PARTS is not set
-
-#
-# User Modules And Translation Layers
-#
CONFIG_MTD_CHAR=y
-CONFIG_MTD_BLKDEVS=y
CONFIG_MTD_BLOCK=y
-# CONFIG_FTL is not set
-# CONFIG_NFTL is not set
-# CONFIG_INFTL is not set
-# CONFIG_RFD_FTL is not set
-# CONFIG_SSFDC is not set
-# CONFIG_SM_FTL is not set
-# CONFIG_MTD_OOPS is not set
-
-#
-# RAM/ROM/Flash chip drivers
-#
-# CONFIG_MTD_CFI is not set
-# CONFIG_MTD_JEDECPROBE is not set
-CONFIG_MTD_MAP_BANK_WIDTH_1=y
-CONFIG_MTD_MAP_BANK_WIDTH_2=y
-CONFIG_MTD_MAP_BANK_WIDTH_4=y
-# CONFIG_MTD_MAP_BANK_WIDTH_8 is not set
-# CONFIG_MTD_MAP_BANK_WIDTH_16 is not set
-# CONFIG_MTD_MAP_BANK_WIDTH_32 is not set
-CONFIG_MTD_CFI_I1=y
-CONFIG_MTD_CFI_I2=y
-# CONFIG_MTD_CFI_I4 is not set
-# CONFIG_MTD_CFI_I8 is not set
-# CONFIG_MTD_RAM is not set
CONFIG_MTD_ROM=y
-# CONFIG_MTD_ABSENT is not set
-
-#
-# Mapping drivers for chip access
-#
CONFIG_MTD_COMPLEX_MAPPINGS=y
CONFIG_MTD_PHYSMAP=y
-# CONFIG_MTD_PHYSMAP_COMPAT is not set
-# CONFIG_MTD_PCMCIA is not set
-# CONFIG_MTD_GPIO_ADDR is not set
-# CONFIG_MTD_PLATRAM is not set
-
-#
-# Self-contained MTD device drivers
-#
-# CONFIG_MTD_DATAFLASH is not set
-# CONFIG_MTD_M25P80 is not set
-# CONFIG_MTD_SST25L 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_ECC=y
-# CONFIG_MTD_NAND_ECC_SMC is not set
CONFIG_MTD_NAND=y
CONFIG_MTD_NAND_VERIFY_WRITE=y
-# CONFIG_MTD_SM_COMMON is not set
-# CONFIG_MTD_NAND_MUSEUM_IDS is not set
-# CONFIG_MTD_NAND_H1900 is not set
-# CONFIG_MTD_NAND_GPIO is not set
-CONFIG_MTD_NAND_IDS=y
-# CONFIG_MTD_NAND_DISKONCHIP is not set
CONFIG_MTD_NAND_SHARPSL=y
-# 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
-
-#
-# LPDDR flash memory drivers
-#
-# CONFIG_MTD_LPDDR is not set
-CONFIG_MTD_UBI=m
-CONFIG_MTD_UBI_WL_THRESHOLD=4096
-CONFIG_MTD_UBI_BEB_RESERVE=1
+CONFIG_MTD_UBI=y
CONFIG_MTD_UBI_GLUEBI=m
-
-#
-# UBI debugging options
-#
-# CONFIG_MTD_UBI_DEBUG is not set
-# CONFIG_PARPORT is not set
-CONFIG_BLK_DEV=y
-# CONFIG_BLK_DEV_COW_COMMON is not set
CONFIG_BLK_DEV_LOOP=y
-# CONFIG_BLK_DEV_CRYPTOLOOP is not set
-
-#
-# DRBD disabled because PROC_FS, INET or CONNECTOR not selected
-#
-# CONFIG_BLK_DEV_NBD 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_MG_DISK is not set
-# CONFIG_BLK_DEV_RBD is not set
CONFIG_MISC_DEVICES=y
-# CONFIG_AD525X_DPOT is not set
-# CONFIG_ICS932S401 is not set
-# CONFIG_ENCLOSURE_SERVICES is not set
-# CONFIG_APDS9802ALS is not set
-# CONFIG_ISL29003 is not set
-# CONFIG_ISL29020 is not set
-# CONFIG_SENSORS_TSL2550 is not set
-# CONFIG_SENSORS_BH1780 is not set
-# CONFIG_SENSORS_BH1770 is not set
-# CONFIG_SENSORS_APDS990X is not set
-# CONFIG_HMC6352 is not set
-# CONFIG_DS1682 is not set
-# CONFIG_TI_DAC7512 is not set
-# CONFIG_BMP085 is not set
-# CONFIG_C2PORT is not set
-
-#
-# EEPROM support
-#
-# CONFIG_EEPROM_AT24 is not set
-# CONFIG_EEPROM_AT25 is not set
-# CONFIG_EEPROM_LEGACY is not set
-# CONFIG_EEPROM_MAX6875 is not set
-# CONFIG_EEPROM_93CX6 is not set
-# CONFIG_IWMC3200TOP is not set
-
-#
-# Texas Instruments shared transport line discipline
-#
-CONFIG_HAVE_IDE=y
-# CONFIG_IDE is not set
-
-#
-# SCSI device support
-#
-CONFIG_SCSI_MOD=y
-# 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=m
-# CONFIG_CHR_DEV_ST is not set
-# CONFIG_CHR_DEV_OSST is not set
+CONFIG_BLK_DEV_SD=y
CONFIG_BLK_DEV_SR=m
-# CONFIG_BLK_DEV_SR_VENDOR is not set
CONFIG_CHR_DEV_SG=m
-# CONFIG_CHR_DEV_SCH is not set
CONFIG_SCSI_MULTI_LUN=y
-# 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_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_ISCSI_BOOT_SYSFS is not set
-# CONFIG_LIBFC is not set
-# CONFIG_LIBFCOE is not set
-# CONFIG_SCSI_DEBUG is not set
-# CONFIG_SCSI_LOWLEVEL_PCMCIA is not set
-# CONFIG_SCSI_DH is not set
-# CONFIG_SCSI_OSD_INITIATOR is not set
CONFIG_ATA=y
-# CONFIG_ATA_NONSTANDARD is not set
-CONFIG_ATA_VERBOSE_ERROR=y
-CONFIG_SATA_PMP=y
-
-#
-# Controllers with non-SFF native interface
-#
-# CONFIG_SATA_AHCI_PLATFORM is not set
-CONFIG_ATA_SFF=y
-
-#
-# SFF controllers with custom DMA interface
-#
-CONFIG_ATA_BMDMA=y
-
-#
-# SATA SFF controllers with BMDMA
-#
-# CONFIG_SATA_MV is not set
-
-#
-# PATA SFF controllers with BMDMA
-#
-# CONFIG_PATA_PXA is not set
-
-#
-# PIO-only SFF controllers
-#
+CONFIG_PATA_PXA=y
CONFIG_PATA_PCMCIA=y
-CONFIG_PATA_PLATFORM=y
-
-#
-# Generic fallback / legacy drivers
-#
-# CONFIG_MD is not set
CONFIG_NETDEVICES=y
-# CONFIG_DUMMY is not set
-# CONFIG_BONDING is not set
-# CONFIG_MACVLAN is not set
-# CONFIG_EQUALIZER is not set
CONFIG_TUN=m
-# CONFIG_VETH is not set
-CONFIG_MII=m
-# CONFIG_PHYLIB is not set
CONFIG_NET_ETHERNET=y
-# CONFIG_AX88796 is not set
-# CONFIG_SMC91X is not set
-# CONFIG_DM9000 is not set
-# CONFIG_ENC28J60 is not set
-# CONFIG_ETHOC is not set
-# CONFIG_SMC911X is not set
-# CONFIG_SMSC911X is not set
-# CONFIG_DNET is not set
-# CONFIG_IBM_NEW_EMAC_ZMII is not set
-# CONFIG_IBM_NEW_EMAC_RGMII is not set
-# CONFIG_IBM_NEW_EMAC_TAH is not set
-# CONFIG_IBM_NEW_EMAC_EMAC4 is not set
-# CONFIG_IBM_NEW_EMAC_NO_FLOW_CTRL is not set
-# CONFIG_IBM_NEW_EMAC_MAL_CLR_ICINTSTAT is not set
-# CONFIG_IBM_NEW_EMAC_MAL_COMMON_ERR is not set
-# CONFIG_B44 is not set
-# CONFIG_KS8851 is not set
-# CONFIG_KS8851_MLL is not set
# CONFIG_NETDEV_1000 is not set
# CONFIG_NETDEV_10000 is not set
-CONFIG_WLAN=y
-# CONFIG_PCMCIA_RAYCS is not set
-# CONFIG_LIBERTAS_THINFIRM is not set
-# CONFIG_ATMEL is not set
-# CONFIG_AT76C50X_USB is not set
CONFIG_AIRO_CS=m
-# CONFIG_PCMCIA_WL3501 is not set
-# CONFIG_USB_ZD1201 is not set
-# CONFIG_USB_NET_RNDIS_WLAN is not set
-# CONFIG_RTL8187 is not set
-# CONFIG_MAC80211_HWSIM is not set
-# CONFIG_ATH_COMMON is not set
-# CONFIG_B43 is not set
-# CONFIG_B43LEGACY is not set
CONFIG_HOSTAP=m
CONFIG_HOSTAP_FIRMWARE=y
-# CONFIG_HOSTAP_FIRMWARE_NVRAM is not set
CONFIG_HOSTAP_CS=m
-# CONFIG_IWM is not set
-# CONFIG_LIBERTAS is not set
-# CONFIG_HERMES is not set
-# CONFIG_P54_COMMON is not set
-# CONFIG_RT2X00 is not set
-# CONFIG_WL1251 is not set
-# CONFIG_WL12XX is not set
-# CONFIG_ZD1211RW is not set
-
-#
-# Enable WiMAX (Networking options) to see the WiMAX drivers
-#
-
-#
-# USB Network Adapters
-#
CONFIG_USB_CATC=m
CONFIG_USB_KAWETH=m
CONFIG_USB_PEGASUS=m
CONFIG_USB_RTL8150=m
CONFIG_USB_USBNET=m
-CONFIG_USB_NET_AX8817X=m
-CONFIG_USB_NET_CDCETHER=m
-# CONFIG_USB_NET_CDC_EEM is not set
CONFIG_USB_NET_DM9601=m
-# CONFIG_USB_NET_SMSC75XX is not set
-# CONFIG_USB_NET_SMSC95XX is not set
-# CONFIG_USB_NET_GL620A is not set
-CONFIG_USB_NET_NET1080=m
-# CONFIG_USB_NET_PLUSB is not set
-# CONFIG_USB_NET_MCS7830 is not set
-# CONFIG_USB_NET_RNDIS_HOST is not set
# CONFIG_USB_NET_CDC_SUBSET is not set
-CONFIG_USB_NET_ZAURUS=m
-# CONFIG_USB_NET_CX82310_ETH is not set
-# CONFIG_USB_NET_INT51X1 is not set
-# CONFIG_USB_IPHETH is not set
CONFIG_USB_SIERRA_NET=m
CONFIG_NET_PCMCIA=y
-# CONFIG_PCMCIA_3C589 is not set
-# CONFIG_PCMCIA_3C574 is not set
-# CONFIG_PCMCIA_FMVJ18X is not set
CONFIG_PCMCIA_PCNET=m
-# CONFIG_PCMCIA_NMCLAN is not set
-# CONFIG_PCMCIA_SMC91C92 is not set
-# CONFIG_PCMCIA_XIRC2PS is not set
-# CONFIG_PCMCIA_AXNET is not set
-# CONFIG_WAN is not set
-
-#
-# CAIF transport drivers
-#
CONFIG_PPP=m
-# CONFIG_PPP_MULTILINK is not set
-# CONFIG_PPP_FILTER is not set
CONFIG_PPP_ASYNC=m
-# CONFIG_PPP_SYNC_TTY is not set
CONFIG_PPP_DEFLATE=m
CONFIG_PPP_BSDCOMP=m
-# CONFIG_PPP_MPPE is not set
-# CONFIG_PPPOE is not set
-# CONFIG_SLIP is not set
-CONFIG_SLHC=m
-# 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
-# CONFIG_INPUT_SPARSEKMAP is not set
-
-#
-# Userland interfaces
-#
-CONFIG_INPUT_MOUSEDEV=y
# CONFIG_INPUT_MOUSEDEV_PSAUX is not set
CONFIG_INPUT_MOUSEDEV_SCREEN_X=640
CONFIG_INPUT_MOUSEDEV_SCREEN_Y=480
-# CONFIG_INPUT_JOYDEV is not set
CONFIG_INPUT_EVDEV=y
-# CONFIG_INPUT_EVBUG is not set
CONFIG_INPUT_APMPOWER=y
-
-#
-# Input Device Drivers
-#
-CONFIG_INPUT_KEYBOARD=y
-# CONFIG_KEYBOARD_ADP5588 is not set
# CONFIG_KEYBOARD_ATKBD is not set
-# CONFIG_KEYBOARD_QT2160 is not set
-# CONFIG_KEYBOARD_LKKBD is not set
CONFIG_KEYBOARD_GPIO=y
-# CONFIG_KEYBOARD_GPIO_POLLED is not set
-# CONFIG_KEYBOARD_TCA6416 is not set
CONFIG_KEYBOARD_MATRIX=y
-# CONFIG_KEYBOARD_LM8323 is not set
-# CONFIG_KEYBOARD_MAX7359 is not set
-# CONFIG_KEYBOARD_MCS is not set
-# CONFIG_KEYBOARD_NEWTON is not set
-# CONFIG_KEYBOARD_OPENCORES is not set
-# CONFIG_KEYBOARD_PXA27x is not set
-# CONFIG_KEYBOARD_STOWAWAY is not set
-# CONFIG_KEYBOARD_SUNKBD is not set
-# CONFIG_KEYBOARD_XTKBD is not set
# CONFIG_INPUT_MOUSE is not set
-# CONFIG_INPUT_JOYSTICK is not set
-# CONFIG_INPUT_TABLET is not set
CONFIG_INPUT_TOUCHSCREEN=y
CONFIG_TOUCHSCREEN_ADS7846=y
-# CONFIG_TOUCHSCREEN_AD7877 is not set
-# CONFIG_TOUCHSCREEN_AD7879 is not set
-# CONFIG_TOUCHSCREEN_BU21013 is not set
-# CONFIG_TOUCHSCREEN_CY8CTMG110 is not set
-# CONFIG_TOUCHSCREEN_DYNAPRO is not set
-# CONFIG_TOUCHSCREEN_HAMPSHIRE is not set
-# CONFIG_TOUCHSCREEN_EETI is not set
-# CONFIG_TOUCHSCREEN_FUJITSU is not set
-# CONFIG_TOUCHSCREEN_GUNZE is not set
-# CONFIG_TOUCHSCREEN_ELO is not set
-# CONFIG_TOUCHSCREEN_WACOM_W8001 is not set
-# CONFIG_TOUCHSCREEN_MCS5000 is not set
-# CONFIG_TOUCHSCREEN_MTOUCH is not set
-# CONFIG_TOUCHSCREEN_INEXIO is not set
-# CONFIG_TOUCHSCREEN_MK712 is not set
-# CONFIG_TOUCHSCREEN_PENMOUNT is not set
-# CONFIG_TOUCHSCREEN_QT602240 is not set
-# CONFIG_TOUCHSCREEN_TOUCHRIGHT is not set
-# CONFIG_TOUCHSCREEN_TOUCHWIN is not set
-# CONFIG_TOUCHSCREEN_WM97XX is not set
-# CONFIG_TOUCHSCREEN_USB_COMPOSITE is not set
-# CONFIG_TOUCHSCREEN_TOUCHIT213 is not set
-# CONFIG_TOUCHSCREEN_TSC2007 is not set
-# CONFIG_TOUCHSCREEN_W90X900 is not set
-# CONFIG_TOUCHSCREEN_TPS6507X is not set
CONFIG_INPUT_MISC=y
-# CONFIG_INPUT_AD714X is not set
-# CONFIG_INPUT_ATI_REMOTE is not set
-# CONFIG_INPUT_ATI_REMOTE2 is not set
-# CONFIG_INPUT_KEYSPAN_REMOTE is not set
-# CONFIG_INPUT_POWERMATE is not set
-# CONFIG_INPUT_YEALINK is not set
-# CONFIG_INPUT_CM109 is not set
-CONFIG_INPUT_UINPUT=y
-# CONFIG_INPUT_PCF8574 is not set
-# CONFIG_INPUT_GPIO_ROTARY_ENCODER is not set
-# CONFIG_INPUT_ADXL34X is not set
-
-#
-# Hardware I/O ports
-#
+CONFIG_INPUT_UINPUT=m
# CONFIG_SERIO is not set
-# CONFIG_GAMEPORT is not set
-
-#
-# Character devices
-#
-CONFIG_VT=y
-CONFIG_CONSOLE_TRANSLATIONS=y
-CONFIG_VT_CONSOLE=y
-CONFIG_HW_CONSOLE=y
-# CONFIG_VT_HW_CONSOLE_BINDING is not set
-CONFIG_DEVKMEM=y
-# CONFIG_SERIAL_NONSTANDARD is not set
-# CONFIG_N_GSM is not set
-
-#
-# Serial drivers
-#
+# CONFIG_LEGACY_PTYS is not set
CONFIG_SERIAL_8250=m
CONFIG_SERIAL_8250_CS=m
-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_MAX3100 is not set
-# CONFIG_SERIAL_MAX3107 is not set
CONFIG_SERIAL_PXA=y
CONFIG_SERIAL_PXA_CONSOLE=y
-CONFIG_SERIAL_CORE=y
-CONFIG_SERIAL_CORE_CONSOLE=y
-# CONFIG_SERIAL_TIMBERDALE is not set
-# CONFIG_SERIAL_ALTERA_JTAGUART is not set
-# CONFIG_SERIAL_ALTERA_UART is not set
-CONFIG_UNIX98_PTYS=y
-# CONFIG_DEVPTS_MULTIPLE_INSTANCES is not set
-# CONFIG_LEGACY_PTYS is not set
-# CONFIG_TTY_PRINTK is not set
-# CONFIG_IPMI_HANDLER is not set
-CONFIG_HW_RANDOM=m
-# CONFIG_HW_RANDOM_TIMERIOMEM is not set
-# CONFIG_R3964 is not set
-
-#
-# PCMCIA character devices
-#
-# CONFIG_SYNCLINK_CS is not set
-# CONFIG_CARDMAN_4000 is not set
-# CONFIG_CARDMAN_4040 is not set
-# CONFIG_IPWIRELESS is not set
-# CONFIG_RAW_DRIVER is not set
-# CONFIG_TCG_TPM is not set
CONFIG_RAMOOPS=y
-CONFIG_I2C=y
-CONFIG_I2C_BOARDINFO=y
-CONFIG_I2C_COMPAT=y
-# CONFIG_I2C_CHARDEV is not set
-# CONFIG_I2C_MUX is not set
-CONFIG_I2C_HELPER_AUTO=y
-# CONFIG_I2C_ALGOBIT is not set
-# CONFIG_I2C_ALGOPCF is not set
-# CONFIG_I2C_ALGOPCA is not set
-
-#
-# I2C Hardware Bus support
-#
-
-#
-# I2C system bus drivers (mostly embedded / system-on-chip)
-#
-# CONFIG_I2C_DESIGNWARE is not set
-# CONFIG_I2C_GPIO is not set
-# CONFIG_I2C_OCORES is not set
-# CONFIG_I2C_PCA_PLATFORM is not set
-CONFIG_I2C_PXA=y
-# CONFIG_I2C_PXA_SLAVE is not set
-# CONFIG_I2C_SIMTEC is not set
-# CONFIG_I2C_XILINX is not set
-
-#
-# External I2C/SMBus adapter drivers
-#
-# CONFIG_I2C_PARPORT_LIGHT is not set
-# CONFIG_I2C_TAOS_EVM is not set
-# CONFIG_I2C_TINY_USB is not set
-
-#
-# Other I2C/SMBus bus drivers
-#
-# CONFIG_I2C_STUB 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_SPI=y
-CONFIG_SPI_MASTER=y
-
-#
-# SPI Master Controller Drivers
-#
-# CONFIG_SPI_BITBANG is not set
-# CONFIG_SPI_GPIO is not set
CONFIG_SPI_PXA2XX=y
-# CONFIG_SPI_XILINX is not set
-# CONFIG_SPI_DESIGNWARE is not set
-
-#
-# SPI Protocol Masters
-#
-# CONFIG_SPI_SPIDEV is not set
-# CONFIG_SPI_TLE62X0 is not set
-
-#
-# PPS support
-#
-# CONFIG_PPS is not set
-CONFIG_ARCH_REQUIRE_GPIOLIB=y
-CONFIG_GPIOLIB=y
CONFIG_GPIO_SYSFS=y
-
-#
-# Memory mapped GPIO expanders:
-#
-# CONFIG_GPIO_BASIC_MMIO is not set
-# CONFIG_GPIO_IT8761E is not set
-# CONFIG_GPIO_VX855 is not set
-
-#
-# I2C GPIO expanders:
-#
-# CONFIG_GPIO_MAX7300 is not set
-# CONFIG_GPIO_MAX732X is not set
-# CONFIG_GPIO_PCA953X is not set
-# CONFIG_GPIO_PCF857X is not set
-# CONFIG_GPIO_SX150X is not set
-# CONFIG_GPIO_ADP5588 is not set
-
-#
-# PCI GPIO expanders:
-#
-
-#
-# SPI GPIO expanders:
-#
-# CONFIG_GPIO_MAX7301 is not set
-# CONFIG_GPIO_MCP23S08 is not set
-# CONFIG_GPIO_MC33880 is not set
-# CONFIG_GPIO_74X164 is not set
-
-#
-# AC97 GPIO expanders:
-#
-
-#
-# MODULbus GPIO expanders:
-#
-# CONFIG_W1 is not set
CONFIG_POWER_SUPPLY=y
CONFIG_POWER_SUPPLY_DEBUG=y
CONFIG_PDA_POWER=y
CONFIG_APM_POWER=y
-# CONFIG_TEST_POWER is not set
-# CONFIG_BATTERY_DS2782 is not set
-# CONFIG_BATTERY_BQ20Z75 is not set
-# CONFIG_BATTERY_BQ27x00 is not set
-# CONFIG_BATTERY_MAX17040 is not set
-# CONFIG_CHARGER_ISP1704 is not set
-CONFIG_HWMON=y
-# CONFIG_HWMON_VID is not set
-# CONFIG_HWMON_DEBUG_CHIP is not set
-
-#
-# Native drivers
-#
-# CONFIG_SENSORS_AD7414 is not set
-# CONFIG_SENSORS_AD7418 is not set
-# CONFIG_SENSORS_ADCXX 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_ADT7411 is not set
-# CONFIG_SENSORS_ADT7462 is not set
-# CONFIG_SENSORS_ADT7470 is not set
-# CONFIG_SENSORS_ADT7475 is not set
-# CONFIG_SENSORS_ASC7621 is not set
-# CONFIG_SENSORS_ATXP1 is not set
-# CONFIG_SENSORS_DS1621 is not set
-# CONFIG_SENSORS_F71805F is not set
-# CONFIG_SENSORS_F71882FG is not set
-# CONFIG_SENSORS_F75375S is not set
-# CONFIG_SENSORS_G760A is not set
-# CONFIG_SENSORS_GL518SM is not set
-# CONFIG_SENSORS_GL520SM is not set
-# CONFIG_SENSORS_GPIO_FAN is not set
-# CONFIG_SENSORS_IT87 is not set
-# CONFIG_SENSORS_JC42 is not set
-# CONFIG_SENSORS_LM63 is not set
-# CONFIG_SENSORS_LM70 is not set
-# CONFIG_SENSORS_LM73 is not set
-# CONFIG_SENSORS_LM75 is not set
-# CONFIG_SENSORS_LM77 is not set
-# CONFIG_SENSORS_LM78 is not set
-# CONFIG_SENSORS_LM80 is not set
-# CONFIG_SENSORS_LM83 is not set
-# CONFIG_SENSORS_LM85 is not set
-# CONFIG_SENSORS_LM87 is not set
-# CONFIG_SENSORS_LM90 is not set
-# CONFIG_SENSORS_LM92 is not set
-# CONFIG_SENSORS_LM93 is not set
-# CONFIG_SENSORS_LTC4215 is not set
-# CONFIG_SENSORS_LTC4245 is not set
-# CONFIG_SENSORS_LTC4261 is not set
-# CONFIG_SENSORS_LM95241 is not set
-CONFIG_SENSORS_MAX1111=y
-# CONFIG_SENSORS_MAX1619 is not set
-# CONFIG_SENSORS_MAX6650 is not set
-# CONFIG_SENSORS_PC87360 is not set
-# CONFIG_SENSORS_PC87427 is not set
-# CONFIG_SENSORS_PCF8591 is not set
-# CONFIG_SENSORS_SHT15 is not set
-# CONFIG_SENSORS_SMM665 is not set
-# CONFIG_SENSORS_DME1737 is not set
-# CONFIG_SENSORS_EMC1403 is not set
-# CONFIG_SENSORS_EMC2103 is not set
-# CONFIG_SENSORS_SMSC47M1 is not set
-# CONFIG_SENSORS_SMSC47M192 is not set
-# CONFIG_SENSORS_SMSC47B397 is not set
-# CONFIG_SENSORS_ADS7828 is not set
-# CONFIG_SENSORS_ADS7871 is not set
-# CONFIG_SENSORS_AMC6821 is not set
-# CONFIG_SENSORS_THMC50 is not set
-# CONFIG_SENSORS_TMP102 is not set
-# CONFIG_SENSORS_TMP401 is not set
-# CONFIG_SENSORS_TMP421 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_W83795 is not set
-# CONFIG_SENSORS_W83L785TS is not set
-# CONFIG_SENSORS_W83L786NG is not set
-# CONFIG_SENSORS_W83627HF is not set
-# CONFIG_SENSORS_W83627EHF is not set
-# CONFIG_SENSORS_LIS3_SPI is not set
-# CONFIG_SENSORS_LIS3_I2C is not set
-# CONFIG_THERMAL is not set
-# CONFIG_WATCHDOG is not set
-CONFIG_SSB_POSSIBLE=y
-
-#
-# Sonics Silicon Backplane
-#
-# CONFIG_SSB is not set
-CONFIG_MFD_SUPPORT=y
-# CONFIG_MFD_CORE is not set
-# CONFIG_MFD_88PM860X is not set
-# CONFIG_MFD_SM501 is not set
-# CONFIG_MFD_ASIC3 is not set
-# CONFIG_HTC_EGPIO is not set
-# CONFIG_HTC_PASIC3 is not set
-# CONFIG_HTC_I2CPLD is not set
-# CONFIG_UCB1400_CORE is not set
-# CONFIG_TPS65010 is not set
-# CONFIG_TPS6507X is not set
-# CONFIG_TWL4030_CORE is not set
-# CONFIG_MFD_STMPE is not set
-# CONFIG_MFD_TC35892 is not set
-# CONFIG_MFD_TMIO is not set
-# CONFIG_MFD_T7L66XB is not set
-# CONFIG_MFD_TC6387XB is not set
-# CONFIG_MFD_TC6393XB is not set
-# CONFIG_PMIC_DA903X is not set
-# CONFIG_PMIC_ADP5520 is not set
-# CONFIG_MFD_MAX8925 is not set
-# CONFIG_MFD_MAX8998 is not set
-# CONFIG_MFD_WM8400 is not set
-# CONFIG_MFD_WM831X_I2C is not set
-# CONFIG_MFD_WM831X_SPI is not set
-# CONFIG_MFD_WM8350_I2C is not set
-# CONFIG_MFD_WM8994 is not set
-# CONFIG_MFD_PCF50633 is not set
-# CONFIG_MFD_MC13XXX is not set
-# CONFIG_ABX500_CORE is not set
-# CONFIG_EZX_PCAP is not set
-# CONFIG_MFD_TPS6586X is not set
-# CONFIG_REGULATOR is not set
-# CONFIG_MEDIA_SUPPORT is not set
-
-#
-# Graphics support
-#
-# CONFIG_DRM is not set
-# CONFIG_VGASTATE is not set
-# CONFIG_VIDEO_OUTPUT_CONTROL is not set
CONFIG_FB=y
-# CONFIG_FIRMWARE_EDID is not set
-# CONFIG_FB_DDC is not set
-# CONFIG_FB_BOOT_VESA_SUPPORT is not set
-CONFIG_FB_CFB_FILLRECT=y
-CONFIG_FB_CFB_COPYAREA=y
-CONFIG_FB_CFB_IMAGEBLIT=y
-# CONFIG_FB_CFB_REV_PIXELS_IN_BYTE is not set
-# CONFIG_FB_SYS_FILLRECT is not set
-# CONFIG_FB_SYS_COPYAREA is not set
-# CONFIG_FB_SYS_IMAGEBLIT is not set
-# CONFIG_FB_FOREIGN_ENDIAN is not set
-# CONFIG_FB_SYS_FOPS is not set
-# CONFIG_FB_SVGALIB is not set
-# CONFIG_FB_MACMODES is not set
-# CONFIG_FB_BACKLIGHT is not set
-# CONFIG_FB_MODE_HELPERS is not set
-# CONFIG_FB_TILEBLITTING is not set
-
-#
-# Frame buffer hardware drivers
-#
-# CONFIG_FB_S1D13XXX is not set
CONFIG_FB_PXA=y
CONFIG_FB_PXA_OVERLAY=y
CONFIG_FB_PXA_SMARTPANEL=y
CONFIG_FB_PXA_PARAMETERS=y
-# CONFIG_FB_MBX is not set
-# CONFIG_FB_W100 is not set
-# CONFIG_FB_VIRTUAL is not set
-# CONFIG_FB_METRONOME is not set
-# CONFIG_FB_MB862XX is not set
-# CONFIG_FB_BROADSHEET is not set
CONFIG_BACKLIGHT_LCD_SUPPORT=y
CONFIG_LCD_CLASS_DEVICE=y
CONFIG_LCD_CORGI=y
-# CONFIG_LCD_L4F00242T03 is not set
-# CONFIG_LCD_LMS283GF05 is not set
-# CONFIG_LCD_LTV350QV is not set
-# CONFIG_LCD_TDO24M is not set
-# CONFIG_LCD_VGG2432A4 is not set
-# CONFIG_LCD_PLATFORM is not set
-# CONFIG_LCD_S6E63M0 is not set
CONFIG_BACKLIGHT_CLASS_DEVICE=y
-CONFIG_BACKLIGHT_GENERIC=y
-# CONFIG_BACKLIGHT_ADP8860 is not set
-
-#
-# Display device support
-#
CONFIG_DISPLAY_SUPPORT=y
-
-#
-# Display hardware drivers
-#
-
-#
-# Console display driver support
-#
-CONFIG_DUMMY_CONSOLE=y
CONFIG_FRAMEBUFFER_CONSOLE=y
-# CONFIG_FRAMEBUFFER_CONSOLE_DETECT_PRIMARY is not set
CONFIG_FRAMEBUFFER_CONSOLE_ROTATION=y
CONFIG_FONTS=y
-# CONFIG_FONT_8x8 is not set
CONFIG_FONT_8x16=y
-# CONFIG_FONT_6x11 is not set
-# CONFIG_FONT_7x14 is not set
-# CONFIG_FONT_PEARL_8x8 is not set
-# CONFIG_FONT_ACORN_8x8 is not set
-# CONFIG_FONT_MINI_4x6 is not set
-# CONFIG_FONT_SUN8x16 is not set
-# CONFIG_FONT_SUN12x22 is not set
-# CONFIG_FONT_10x18 is not set
-# CONFIG_LOGO is not set
+CONFIG_LOGO=y
+# CONFIG_LOGO_LINUX_MONO is not set
+# CONFIG_LOGO_LINUX_VGA16 is not set
CONFIG_SOUND=m
-CONFIG_SOUND_OSS_CORE=y
-CONFIG_SOUND_OSS_CORE_PRECLAIM=y
CONFIG_SND=m
-CONFIG_SND_TIMER=m
-CONFIG_SND_PCM=m
-CONFIG_SND_HWDEP=m
-CONFIG_SND_RAWMIDI=m
-CONFIG_SND_JACK=y
CONFIG_SND_SEQUENCER=m
-# CONFIG_SND_SEQ_DUMMY is not set
-CONFIG_SND_OSSEMUL=y
CONFIG_SND_MIXER_OSS=m
CONFIG_SND_PCM_OSS=m
-CONFIG_SND_PCM_OSS_PLUGINS=y
-# CONFIG_SND_SEQUENCER_OSS is not set
-# CONFIG_SND_HRTIMER is not set
-# CONFIG_SND_DYNAMIC_MINORS is not set
-CONFIG_SND_SUPPORT_OLD_API=y
-CONFIG_SND_VERBOSE_PROCFS=y
-# CONFIG_SND_VERBOSE_PRINTK is not set
-# CONFIG_SND_DEBUG is not set
-CONFIG_SND_VMASTER=y
-CONFIG_SND_RAWMIDI_SEQ=m
-# CONFIG_SND_OPL3_LIB_SEQ is not set
-# CONFIG_SND_OPL4_LIB_SEQ is not set
-# CONFIG_SND_SBAWE_SEQ is not set
-# CONFIG_SND_EMU10K1_SEQ is not set
-CONFIG_SND_AC97_CODEC=m
-CONFIG_SND_DRIVERS=y
-# CONFIG_SND_DUMMY is not set
-# CONFIG_SND_ALOOP is not set
-# CONFIG_SND_VIRMIDI is not set
-# CONFIG_SND_MTPAV is not set
-# CONFIG_SND_SERIAL_U16550 is not set
-# CONFIG_SND_MPU401 is not set
-# CONFIG_SND_AC97_POWER_SAVE is not set
-CONFIG_SND_ARM=y
-CONFIG_SND_PXA2XX_PCM=m
-CONFIG_SND_PXA2XX_LIB=m
-CONFIG_SND_PXA2XX_LIB_AC97=y
CONFIG_SND_PXA2XX_AC97=m
-CONFIG_SND_SPI=y
-CONFIG_SND_USB=y
CONFIG_SND_USB_AUDIO=m
-# CONFIG_SND_USB_UA101 is not set
-# CONFIG_SND_USB_CAIAQ is not set
-CONFIG_SND_PCMCIA=y
-# CONFIG_SND_VXPOCKET is not set
-# CONFIG_SND_PDAUDIOCF is not set
CONFIG_SND_SOC=m
CONFIG_SND_PXA2XX_SOC=m
-CONFIG_SND_PXA2XX_SOC_I2S=m
CONFIG_SND_PXA2XX_SOC_SPITZ=m
-CONFIG_SND_SOC_I2C_AND_SPI=m
-# CONFIG_SND_SOC_ALL_CODECS is not set
-CONFIG_SND_SOC_WM8750=m
-# CONFIG_SOUND_PRIME is not set
-CONFIG_AC97_BUS=m
-CONFIG_HID_SUPPORT=y
CONFIG_HID=m
-# CONFIG_HIDRAW is not set
-
-#
-# USB Input Devices
-#
-CONFIG_USB_HID=m
-# CONFIG_HID_PID is not set
-# CONFIG_USB_HIDDEV is not set
-
-#
-# USB HID Boot Protocol drivers
-#
CONFIG_USB_KBD=m
CONFIG_USB_MOUSE=m
-
-#
-# Special HID drivers
-#
-# CONFIG_HID_3M_PCT is not set
-# CONFIG_HID_A4TECH is not set
-# CONFIG_HID_ACRUX_FF is not set
-# CONFIG_HID_APPLE is not set
-# CONFIG_HID_BELKIN is not set
-# CONFIG_HID_CANDO is not set
-# CONFIG_HID_CHERRY is not set
-# CONFIG_HID_CHICONY is not set
-# CONFIG_HID_PRODIKEYS is not set
-# CONFIG_HID_CYPRESS is not set
-# CONFIG_HID_DRAGONRISE is not set
-# CONFIG_HID_EGALAX is not set
-# CONFIG_HID_ELECOM is not set
-# CONFIG_HID_EZKEY is not set
-# CONFIG_HID_KYE is not set
-# CONFIG_HID_UCLOGIC is not set
-# CONFIG_HID_WALTOP is not set
-# CONFIG_HID_GYRATION is not set
-# CONFIG_HID_TWINHAN is not set
-# CONFIG_HID_KENSINGTON is not set
-# CONFIG_HID_LOGITECH is not set
-# CONFIG_HID_MAGICMOUSE is not set
-# CONFIG_HID_MICROSOFT is not set
-# CONFIG_HID_MOSART is not set
-# CONFIG_HID_MONTEREY is not set
-# CONFIG_HID_NTRIG is not set
-# CONFIG_HID_ORTEK is not set
-# CONFIG_HID_PANTHERLORD is not set
-# CONFIG_HID_PETALYNX is not set
-# CONFIG_HID_PICOLCD is not set
-# CONFIG_HID_QUANTA is not set
-# CONFIG_HID_ROCCAT is not set
-# CONFIG_HID_ROCCAT_KONE is not set
-# CONFIG_HID_ROCCAT_PYRA is not set
-# CONFIG_HID_SAMSUNG is not set
-# CONFIG_HID_SONY is not set
-# CONFIG_HID_STANTUM is not set
-# CONFIG_HID_SUNPLUS is not set
-# CONFIG_HID_GREENASIA is not set
-# CONFIG_HID_SMARTJOYPLUS is not set
-# CONFIG_HID_TOPSEED is not set
-# CONFIG_HID_THRUSTMASTER is not set
-# CONFIG_HID_WACOM is not set
-# CONFIG_HID_ZEROPLUS is not set
-# CONFIG_HID_ZYDACRON 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=m
CONFIG_USB_DEBUG=y
CONFIG_USB_ANNOUNCE_NEW_DEVICES=y
-
-#
-# Miscellaneous USB options
-#
CONFIG_USB_DEVICEFS=y
-CONFIG_USB_DEVICE_CLASS=y
-# CONFIG_USB_DYNAMIC_MINORS is not set
-# CONFIG_USB_SUSPEND is not set
CONFIG_USB_OTG_WHITELIST=y
-# CONFIG_USB_OTG_BLACKLIST_HUB is not set
CONFIG_USB_MON=m
-# CONFIG_USB_WUSB is not set
-# CONFIG_USB_WUSB_CBAF is not set
-
-#
-# USB Host Controller Drivers
-#
-# CONFIG_USB_C67X00_HCD is not set
-# CONFIG_USB_OXU210HP_HCD is not set
-# CONFIG_USB_ISP116X_HCD is not set
-# CONFIG_USB_ISP1760_HCD is not set
-# CONFIG_USB_ISP1362_HCD is not set
CONFIG_USB_OHCI_HCD=m
-# 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_SL811_HCD=m
CONFIG_USB_SL811_CS=m
-# CONFIG_USB_R8A66597_HCD is not set
-# CONFIG_USB_HWA_HCD is not set
-# CONFIG_USB_MUSB_HDRC is not set
-
-#
-# USB Device Class drivers
-#
CONFIG_USB_ACM=m
CONFIG_USB_PRINTER=m
-# CONFIG_USB_WDM is not set
-# CONFIG_USB_TMC is not set
-
-#
-# NOTE: USB_STORAGE depends on SCSI but BLK_DEV_SD may
-#
-
-#
-# also be needed; see USB_STORAGE Help for more info
-#
CONFIG_USB_STORAGE=m
-# CONFIG_USB_STORAGE_DEBUG is not set
-# CONFIG_USB_STORAGE_DATAFAB is not set
-# CONFIG_USB_STORAGE_FREECOM is not set
-# CONFIG_USB_STORAGE_ISD200 is not set
-# CONFIG_USB_STORAGE_USBAT is not set
-# CONFIG_USB_STORAGE_SDDR09 is not set
-# CONFIG_USB_STORAGE_SDDR55 is not set
-# CONFIG_USB_STORAGE_JUMPSHOT is not set
-# CONFIG_USB_STORAGE_ALAUDA is not set
-# CONFIG_USB_STORAGE_ONETOUCH is not set
-# CONFIG_USB_STORAGE_KARMA is not set
-# CONFIG_USB_STORAGE_CYPRESS_ATACB is not set
-# CONFIG_USB_UAS is not set
-# CONFIG_USB_LIBUSUAL is not set
-
-#
-# USB Imaging devices
-#
CONFIG_USB_MDC800=m
CONFIG_USB_MICROTEK=m
-
-#
-# USB port drivers
-#
CONFIG_USB_SERIAL=m
-CONFIG_USB_EZUSB=y
CONFIG_USB_SERIAL_GENERIC=y
-# CONFIG_USB_SERIAL_AIRCABLE is not set
-# CONFIG_USB_SERIAL_ARK3116 is not set
CONFIG_USB_SERIAL_BELKIN=m
-# CONFIG_USB_SERIAL_CH341 is not set
-# CONFIG_USB_SERIAL_WHITEHEAT is not set
CONFIG_USB_SERIAL_DIGI_ACCELEPORT=m
-# CONFIG_USB_SERIAL_CP210X is not set
CONFIG_USB_SERIAL_CYPRESS_M8=m
CONFIG_USB_SERIAL_EMPEG=m
CONFIG_USB_SERIAL_FTDI_SIO=m
-# CONFIG_USB_SERIAL_FUNSOFT is not set
CONFIG_USB_SERIAL_VISOR=m
CONFIG_USB_SERIAL_IPAQ=m
CONFIG_USB_SERIAL_IR=m
@@ -1825,394 +247,78 @@ CONFIG_USB_SERIAL_EDGEPORT=m
CONFIG_USB_SERIAL_EDGEPORT_TI=m
CONFIG_USB_SERIAL_GARMIN=m
CONFIG_USB_SERIAL_IPW=m
-# CONFIG_USB_SERIAL_IUU is not set
CONFIG_USB_SERIAL_KEYSPAN_PDA=m
CONFIG_USB_SERIAL_KEYSPAN=m
-# CONFIG_USB_SERIAL_KEYSPAN_MPR is not set
-# CONFIG_USB_SERIAL_KEYSPAN_USA28 is not set
-# CONFIG_USB_SERIAL_KEYSPAN_USA28X is not set
-# CONFIG_USB_SERIAL_KEYSPAN_USA28XA is not set
-# CONFIG_USB_SERIAL_KEYSPAN_USA28XB is not set
-# CONFIG_USB_SERIAL_KEYSPAN_USA19 is not set
-# CONFIG_USB_SERIAL_KEYSPAN_USA18X is not set
-# CONFIG_USB_SERIAL_KEYSPAN_USA19W is not set
-# CONFIG_USB_SERIAL_KEYSPAN_USA19QW is not set
-# CONFIG_USB_SERIAL_KEYSPAN_USA19QI is not set
-# CONFIG_USB_SERIAL_KEYSPAN_USA49W is not set
-# CONFIG_USB_SERIAL_KEYSPAN_USA49WLC is not set
CONFIG_USB_SERIAL_KLSI=m
CONFIG_USB_SERIAL_KOBIL_SCT=m
CONFIG_USB_SERIAL_MCT_U232=m
-# CONFIG_USB_SERIAL_MOS7720 is not set
-# CONFIG_USB_SERIAL_MOS7840 is not set
-# CONFIG_USB_SERIAL_MOTOROLA is not set
-# CONFIG_USB_SERIAL_NAVMAN is not set
CONFIG_USB_SERIAL_PL2303=m
-# CONFIG_USB_SERIAL_OTI6858 is not set
-# CONFIG_USB_SERIAL_QCAUX is not set
-# CONFIG_USB_SERIAL_QUALCOMM is not set
-# CONFIG_USB_SERIAL_SPCP8X5 is not set
-# CONFIG_USB_SERIAL_HP4X is not set
CONFIG_USB_SERIAL_SAFE=m
-# CONFIG_USB_SERIAL_SAFE_PADDED is not set
-# CONFIG_USB_SERIAL_SAMBA is not set
-# CONFIG_USB_SERIAL_SIEMENS_MPI is not set
-# CONFIG_USB_SERIAL_SIERRAWIRELESS is not set
-# CONFIG_USB_SERIAL_SYMBOL is not set
CONFIG_USB_SERIAL_TI=m
CONFIG_USB_SERIAL_CYBERJACK=m
CONFIG_USB_SERIAL_XIRCOM=m
-# CONFIG_USB_SERIAL_OPTION is not set
CONFIG_USB_SERIAL_OMNINET=m
-# CONFIG_USB_SERIAL_OPTICON is not set
-# CONFIG_USB_SERIAL_VIVOPAY_SERIAL is not set
-# CONFIG_USB_SERIAL_ZIO is not set
-# CONFIG_USB_SERIAL_SSU100 is not set
-# CONFIG_USB_SERIAL_DEBUG is not set
-
-#
-# USB Miscellaneous drivers
-#
CONFIG_USB_EMI62=m
CONFIG_USB_EMI26=m
-# CONFIG_USB_ADUTUX is not set
-# CONFIG_USB_SEVSEG is not set
CONFIG_USB_RIO500=m
CONFIG_USB_LEGOTOWER=m
CONFIG_USB_LCD=m
CONFIG_USB_LED=m
-# CONFIG_USB_CYPRESS_CY7C63 is not set
CONFIG_USB_CYTHERM=m
CONFIG_USB_IDMOUSE=m
-# 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
-# CONFIG_USB_ISIGHTFW is not set
-# CONFIG_USB_YUREX is not set
CONFIG_USB_GADGET=m
CONFIG_USB_GADGET_DEBUG_FILES=y
CONFIG_USB_GADGET_DEBUG_FS=y
-CONFIG_USB_GADGET_VBUS_DRAW=2
-CONFIG_USB_GADGET_SELECTED=y
-# CONFIG_USB_GADGET_R8A66597 is not set
CONFIG_USB_GADGET_PXA27X=y
-CONFIG_USB_PXA27X=m
-# CONFIG_USB_GADGET_M66592 is not set
-# CONFIG_USB_GADGET_DUMMY_HCD is not set
-# CONFIG_USB_GADGET_DUALSPEED is not set
CONFIG_USB_ZERO=m
-# CONFIG_USB_AUDIO is not set
CONFIG_USB_ETH=m
-CONFIG_USB_ETH_RNDIS=y
CONFIG_USB_ETH_EEM=y
CONFIG_USB_GADGETFS=m
-# CONFIG_USB_FUNCTIONFS is not set
CONFIG_USB_FILE_STORAGE=m
-# CONFIG_USB_FILE_STORAGE_TEST is not set
CONFIG_USB_MASS_STORAGE=m
CONFIG_USB_G_SERIAL=m
-# CONFIG_USB_MIDI_GADGET is not set
-# CONFIG_USB_G_PRINTER is not set
CONFIG_USB_CDC_COMPOSITE=m
CONFIG_USB_G_MULTI=m
-CONFIG_USB_G_MULTI_RNDIS=y
CONFIG_USB_G_MULTI_CDC=y
-# CONFIG_USB_G_HID is not set
-# CONFIG_USB_G_DBGP is not set
-
-#
-# OTG and related infrastructure
-#
-CONFIG_USB_OTG_UTILS=y
CONFIG_USB_GPIO_VBUS=m
CONFIG_USB_ULPI=y
CONFIG_NOP_USB_XCEIV=m
CONFIG_MMC=y
-# CONFIG_MMC_DEBUG is not set
CONFIG_MMC_UNSAFE_RESUME=y
-
-#
-# MMC/SD/SDIO Card Drivers
-#
-CONFIG_MMC_BLOCK=y
-CONFIG_MMC_BLOCK_MINORS=8
-CONFIG_MMC_BLOCK_BOUNCE=y
-# CONFIG_SDIO_UART is not set
-# CONFIG_MMC_TEST is not set
-
-#
-# MMC/SD/SDIO Host Controller Drivers
-#
CONFIG_MMC_PXA=y
-# CONFIG_MMC_SDHCI is not set
-# CONFIG_MMC_SDHCI_PXA is not set
CONFIG_MMC_SPI=y
-# CONFIG_MMC_USHC is not set
-# CONFIG_MEMSTICK is not set
CONFIG_NEW_LEDS=y
CONFIG_LEDS_CLASS=y
-
-#
-# LED drivers
-#
-# CONFIG_LEDS_PCA9532 is not set
-# CONFIG_LEDS_GPIO is not set
-# CONFIG_LEDS_LP3944 is not set
-# CONFIG_LEDS_LP5521 is not set
-# CONFIG_LEDS_LP5523 is not set
-# CONFIG_LEDS_PCA955X is not set
-# CONFIG_LEDS_DAC124S085 is not set
-# CONFIG_LEDS_BD2802 is not set
-# CONFIG_LEDS_LT3593 is not set
+CONFIG_LEDS_GPIO=y
CONFIG_LEDS_TRIGGERS=y
-
-#
-# LED Triggers
-#
CONFIG_LEDS_TRIGGER_TIMER=y
-# CONFIG_LEDS_TRIGGER_HEARTBEAT is not set
-# CONFIG_LEDS_TRIGGER_BACKLIGHT is not set
-# CONFIG_LEDS_TRIGGER_GPIO is not set
-# CONFIG_LEDS_TRIGGER_DEFAULT_ON is not set
-
-#
-# iptables trigger is under Netfilter config (LED target)
-#
-# CONFIG_ACCESSIBILITY is not set
-CONFIG_RTC_LIB=y
+CONFIG_LEDS_TRIGGER_HEARTBEAT=y
CONFIG_RTC_CLASS=m
-
-#
-# RTC interfaces
-#
-CONFIG_RTC_INTF_SYSFS=y
-CONFIG_RTC_INTF_PROC=y
-CONFIG_RTC_INTF_DEV=y
-# CONFIG_RTC_INTF_DEV_UIE_EMUL is not set
-# CONFIG_RTC_DRV_TEST is not set
-
-#
-# I2C RTC drivers
-#
-# CONFIG_RTC_DRV_DS1307 is not set
-# CONFIG_RTC_DRV_DS1374 is not set
-# CONFIG_RTC_DRV_DS1672 is not set
-# CONFIG_RTC_DRV_DS3232 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_ISL12022 is not set
-# CONFIG_RTC_DRV_X1205 is not set
-# CONFIG_RTC_DRV_PCF8563 is not set
-# CONFIG_RTC_DRV_PCF8583 is not set
-# CONFIG_RTC_DRV_M41T80 is not set
-# CONFIG_RTC_DRV_BQ32K is not set
-# CONFIG_RTC_DRV_S35390A is not set
-# CONFIG_RTC_DRV_FM3130 is not set
-# CONFIG_RTC_DRV_RX8581 is not set
-# CONFIG_RTC_DRV_RX8025 is not set
-
-#
-# SPI RTC drivers
-#
-# CONFIG_RTC_DRV_M41T94 is not set
-# CONFIG_RTC_DRV_DS1305 is not set
-# CONFIG_RTC_DRV_DS1390 is not set
-# CONFIG_RTC_DRV_MAX6902 is not set
-# CONFIG_RTC_DRV_R9701 is not set
-# CONFIG_RTC_DRV_RS5C348 is not set
-# CONFIG_RTC_DRV_DS3234 is not set
-# CONFIG_RTC_DRV_PCF2123 is not set
-
-#
-# Platform RTC drivers
-#
-# CONFIG_RTC_DRV_CMOS is not set
-# CONFIG_RTC_DRV_DS1286 is not set
-# CONFIG_RTC_DRV_DS1511 is not set
-# CONFIG_RTC_DRV_DS1553 is not set
-# CONFIG_RTC_DRV_DS1742 is not set
-# CONFIG_RTC_DRV_STK17TA8 is not set
-# CONFIG_RTC_DRV_M48T86 is not set
-# CONFIG_RTC_DRV_M48T35 is not set
-# CONFIG_RTC_DRV_M48T59 is not set
-# CONFIG_RTC_DRV_MSM6242 is not set
-# CONFIG_RTC_DRV_BQ4802 is not set
-# CONFIG_RTC_DRV_RP5C01 is not set
-# CONFIG_RTC_DRV_V3020 is not set
-
-#
-# on-CPU RTC drivers
-#
CONFIG_RTC_DRV_SA1100=m
CONFIG_RTC_DRV_PXA=m
-# CONFIG_DMADEVICES is not set
-# CONFIG_AUXDISPLAY is not set
-# CONFIG_UIO is not set
-# CONFIG_STAGING is not set
-
-#
-# File systems
-#
CONFIG_EXT2_FS=y
-# CONFIG_EXT2_FS_XATTR is not set
-# CONFIG_EXT2_FS_XIP is not set
CONFIG_EXT3_FS=y
# CONFIG_EXT3_DEFAULTS_TO_ORDERED is not set
# CONFIG_EXT3_FS_XATTR is not set
-# CONFIG_EXT4_FS is not set
-CONFIG_JBD=y
-# CONFIG_JBD_DEBUG is not set
-# CONFIG_REISERFS_FS is not set
-# CONFIG_JFS_FS is not set
-CONFIG_FS_POSIX_ACL=y
-# CONFIG_XFS_FS is not set
-# CONFIG_OCFS2_FS is not set
-# CONFIG_BTRFS_FS is not set
-# CONFIG_NILFS2_FS is not set
-CONFIG_EXPORTFS=m
-CONFIG_FILE_LOCKING=y
-CONFIG_FSNOTIFY=y
-CONFIG_DNOTIFY=y
-CONFIG_INOTIFY_USER=y
-# CONFIG_FANOTIFY is not set
-# CONFIG_QUOTA is not set
-# CONFIG_QUOTACTL is not set
-# CONFIG_AUTOFS4_FS is not set
-# CONFIG_FUSE_FS is not set
-CONFIG_GENERIC_ACL=y
-
-#
-# Caches
-#
-# CONFIG_FSCACHE is not set
-
-#
-# CD-ROM/DVD Filesystems
-#
-# CONFIG_ISO9660_FS is not set
-# CONFIG_UDF_FS is not set
-
-#
-# DOS/FAT/NT Filesystems
-#
-CONFIG_FAT_FS=m
-# CONFIG_MSDOS_FS is not set
-CONFIG_VFAT_FS=m
-CONFIG_FAT_DEFAULT_CODEPAGE=437
-CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1"
-# CONFIG_NTFS_FS is not set
-
-#
-# Pseudo filesystems
-#
-CONFIG_PROC_FS=y
-CONFIG_PROC_SYSCTL=y
-CONFIG_PROC_PAGE_MONITOR=y
-CONFIG_SYSFS=y
+CONFIG_EXT4_FS=y
+CONFIG_VFAT_FS=y
CONFIG_TMPFS=y
CONFIG_TMPFS_POSIX_ACL=y
-# CONFIG_HUGETLB_PAGE is not set
-# CONFIG_CONFIGFS_FS is not set
-CONFIG_MISC_FILESYSTEMS=y
-# CONFIG_ADFS_FS is not set
-# CONFIG_AFFS_FS is not set
-# CONFIG_ECRYPT_FS is not set
-# CONFIG_HFS_FS is not set
-# CONFIG_HFSPLUS_FS is not set
-# CONFIG_BEFS_FS is not set
-# CONFIG_BFS_FS is not set
-# CONFIG_EFS_FS is not set
CONFIG_JFFS2_FS=y
-CONFIG_JFFS2_FS_DEBUG=0
-CONFIG_JFFS2_FS_WRITEBUFFER=y
-# CONFIG_JFFS2_FS_WBUF_VERIFY is not set
CONFIG_JFFS2_SUMMARY=y
-# CONFIG_JFFS2_FS_XATTR is not set
CONFIG_JFFS2_COMPRESSION_OPTIONS=y
-CONFIG_JFFS2_ZLIB=y
CONFIG_JFFS2_LZO=y
-CONFIG_JFFS2_RTIME=y
CONFIG_JFFS2_RUBIN=y
-# CONFIG_JFFS2_CMODE_NONE is not set
-CONFIG_JFFS2_CMODE_PRIORITY=y
-# CONFIG_JFFS2_CMODE_SIZE is not set
-# CONFIG_JFFS2_CMODE_FAVOURLZO is not set
-CONFIG_UBIFS_FS=m
-# CONFIG_UBIFS_FS_XATTR is not set
-# CONFIG_UBIFS_FS_ADVANCED_COMPR is not set
-CONFIG_UBIFS_FS_LZO=y
-CONFIG_UBIFS_FS_ZLIB=y
-# CONFIG_UBIFS_FS_DEBUG is not set
-# CONFIG_LOGFS is not set
+CONFIG_UBIFS_FS=y
+CONFIG_UBIFS_FS_ADVANCED_COMPR=y
CONFIG_CRAMFS=m
-# CONFIG_SQUASHFS is not set
-# CONFIG_VXFS_FS is not set
-# CONFIG_MINIX_FS is not set
-# CONFIG_OMFS_FS is not set
-# CONFIG_HPFS_FS is not set
-# CONFIG_QNX4FS_FS is not set
-# CONFIG_ROMFS_FS is not set
-# CONFIG_SYSV_FS is not set
-# CONFIG_UFS_FS is not set
-CONFIG_NETWORK_FILESYSTEMS=y
CONFIG_NFS_FS=m
CONFIG_NFS_V3=y
-# CONFIG_NFS_V3_ACL is not set
CONFIG_NFS_V4=y
-# CONFIG_NFS_V4_1 is not set
-# CONFIG_NFS_USE_LEGACY_DNS is not set
-CONFIG_NFS_USE_KERNEL_DNS=y
-# CONFIG_NFS_USE_NEW_IDMAPPER is not set
CONFIG_NFSD=m
-CONFIG_NFSD_DEPRECATED=y
-CONFIG_NFSD_V3=y
-# CONFIG_NFSD_V3_ACL is not set
CONFIG_NFSD_V4=y
-CONFIG_LOCKD=m
-CONFIG_LOCKD_V4=y
-CONFIG_NFS_COMMON=y
-CONFIG_SUNRPC=m
-CONFIG_SUNRPC_GSS=m
-CONFIG_RPCSEC_GSS_KRB5=m
-# CONFIG_CEPH_FS is not set
CONFIG_CIFS=m
-# CONFIG_CIFS_STATS is not set
-# CONFIG_CIFS_WEAK_PW_HASH is not set
-# CONFIG_CIFS_UPCALL is not set
-# CONFIG_CIFS_XATTR is not set
-# CONFIG_CIFS_DEBUG2 is not set
-# CONFIG_CIFS_DFS_UPCALL is not set
-# CONFIG_CIFS_EXPERIMENTAL is not set
-# CONFIG_NCP_FS is not set
-# CONFIG_CODA_FS is not set
-# CONFIG_AFS_FS is not set
-
-#
-# Partition Types
-#
CONFIG_PARTITION_ADVANCED=y
-# CONFIG_ACORN_PARTITION is not set
-# CONFIG_OSF_PARTITION is not set
-# CONFIG_AMIGA_PARTITION is not set
-# CONFIG_ATARI_PARTITION is not set
-# CONFIG_MAC_PARTITION is not set
-CONFIG_MSDOS_PARTITION=y
-# CONFIG_BSD_DISKLABEL is not set
-# CONFIG_MINIX_SUBPARTITION is not set
-# CONFIG_SOLARIS_X86_PARTITION is not set
-# CONFIG_UNIXWARE_DISKLABEL is not set
-# CONFIG_LDM_PARTITION is not set
-# CONFIG_SGI_PARTITION is not set
-# CONFIG_ULTRIX_PARTITION is not set
-# CONFIG_SUN_PARTITION is not set
-# CONFIG_KARMA_PARTITION is not set
-# CONFIG_EFI_PARTITION is not set
-# CONFIG_SYSV68_PARTITION is not set
-CONFIG_NLS=y
CONFIG_NLS_DEFAULT="cp437"
CONFIG_NLS_CODEPAGE_437=y
CONFIG_NLS_CODEPAGE_737=m
@@ -2252,179 +358,24 @@ CONFIG_NLS_ISO8859_15=m
CONFIG_NLS_KOI8_R=m
CONFIG_NLS_KOI8_U=m
CONFIG_NLS_UTF8=y
-# CONFIG_DLM is not set
-
-#
-# Kernel hacking
-#
-# CONFIG_PRINTK_TIME is not set
-CONFIG_ENABLE_WARN_DEPRECATED=y
-CONFIG_ENABLE_MUST_CHECK=y
-CONFIG_FRAME_WARN=1024
CONFIG_MAGIC_SYSRQ=y
-# CONFIG_STRIP_ASM_SYMS is not set
-# CONFIG_UNUSED_SYMBOLS is not set
CONFIG_DEBUG_FS=y
-# CONFIG_HEADERS_CHECK is not set
-# CONFIG_DEBUG_KERNEL is not set
-# CONFIG_HARDLOCKUP_DETECTOR is not set
-CONFIG_BKL=y
-# CONFIG_SPARSE_RCU_POINTER is not set
-CONFIG_DEBUG_BUGVERBOSE=y
-# CONFIG_DEBUG_MEMORY_INIT is not set
-# CONFIG_LKDTM is not set
CONFIG_SYSCTL_SYSCALL_CHECK=y
-CONFIG_HAVE_FUNCTION_TRACER=y
-CONFIG_HAVE_DYNAMIC_FTRACE=y
-CONFIG_HAVE_FTRACE_MCOUNT_RECORD=y
-CONFIG_RING_BUFFER=y
-CONFIG_RING_BUFFER_ALLOW_SWAP=y
-CONFIG_TRACING_SUPPORT=y
-# CONFIG_FTRACE is not set
-# CONFIG_DYNAMIC_DEBUG is not set
-# CONFIG_ATOMIC64_SELFTEST is not set
-# CONFIG_SAMPLES is not set
-CONFIG_HAVE_ARCH_KGDB=y
-# CONFIG_STRICT_DEVMEM is not set
-CONFIG_ARM_UNWIND=y
-# CONFIG_DEBUG_USER is not set
-# CONFIG_OC_ETM is not set
-
-#
-# Security options
-#
-CONFIG_KEYS=y
-# CONFIG_KEYS_DEBUG_PROC_KEYS is not set
-# CONFIG_SECURITY_DMESG_RESTRICT is not set
-# CONFIG_SECURITY is not set
-# CONFIG_SECURITYFS is not set
-CONFIG_DEFAULT_SECURITY_DAC=y
-CONFIG_DEFAULT_SECURITY=""
-CONFIG_CRYPTO=y
-
-#
-# Crypto core or helper
-#
-CONFIG_CRYPTO_ALGAPI=m
-CONFIG_CRYPTO_ALGAPI2=m
-CONFIG_CRYPTO_AEAD=m
-CONFIG_CRYPTO_AEAD2=m
-CONFIG_CRYPTO_BLKCIPHER=m
-CONFIG_CRYPTO_BLKCIPHER2=m
-CONFIG_CRYPTO_HASH=m
-CONFIG_CRYPTO_HASH2=m
-CONFIG_CRYPTO_RNG=m
-CONFIG_CRYPTO_RNG2=m
-CONFIG_CRYPTO_PCOMP2=m
-CONFIG_CRYPTO_MANAGER=m
-CONFIG_CRYPTO_MANAGER2=m
-CONFIG_CRYPTO_MANAGER_DISABLE_TESTS=y
-# CONFIG_CRYPTO_GF128MUL is not set
CONFIG_CRYPTO_NULL=m
-CONFIG_CRYPTO_WORKQUEUE=m
-# CONFIG_CRYPTO_CRYPTD is not set
-CONFIG_CRYPTO_AUTHENC=m
CONFIG_CRYPTO_TEST=m
-
-#
-# Authenticated Encryption with Associated Data
-#
-# CONFIG_CRYPTO_CCM is not set
-# CONFIG_CRYPTO_GCM is not set
-# CONFIG_CRYPTO_SEQIV is not set
-
-#
-# Block modes
-#
-CONFIG_CRYPTO_CBC=m
-# CONFIG_CRYPTO_CTR is not set
-# CONFIG_CRYPTO_CTS is not set
-CONFIG_CRYPTO_ECB=m
-# CONFIG_CRYPTO_LRW is not set
CONFIG_CRYPTO_PCBC=m
-# CONFIG_CRYPTO_XTS is not set
-
-#
-# Hash modes
-#
-CONFIG_CRYPTO_HMAC=m
-# CONFIG_CRYPTO_XCBC is not set
-# CONFIG_CRYPTO_VMAC is not set
-
-#
-# Digest
-#
-CONFIG_CRYPTO_CRC32C=m
-# CONFIG_CRYPTO_GHASH is not set
-CONFIG_CRYPTO_MD4=m
-CONFIG_CRYPTO_MD5=m
-CONFIG_CRYPTO_MICHAEL_MIC=m
-# CONFIG_CRYPTO_RMD128 is not set
-# CONFIG_CRYPTO_RMD160 is not set
-# CONFIG_CRYPTO_RMD256 is not set
-# CONFIG_CRYPTO_RMD320 is not set
-CONFIG_CRYPTO_SHA1=m
CONFIG_CRYPTO_SHA256=m
CONFIG_CRYPTO_SHA512=m
-# CONFIG_CRYPTO_TGR192 is not set
CONFIG_CRYPTO_WP512=m
-
-#
-# Ciphers
-#
-CONFIG_CRYPTO_AES=m
CONFIG_CRYPTO_ANUBIS=m
-CONFIG_CRYPTO_ARC4=m
CONFIG_CRYPTO_BLOWFISH=m
CONFIG_CRYPTO_CAMELLIA=m
CONFIG_CRYPTO_CAST5=m
CONFIG_CRYPTO_CAST6=m
-CONFIG_CRYPTO_DES=m
-# CONFIG_CRYPTO_FCRYPT is not set
CONFIG_CRYPTO_KHAZAD=m
-# CONFIG_CRYPTO_SALSA20 is not set
-# CONFIG_CRYPTO_SEED is not set
CONFIG_CRYPTO_SERPENT=m
CONFIG_CRYPTO_TEA=m
CONFIG_CRYPTO_TWOFISH=m
-CONFIG_CRYPTO_TWOFISH_COMMON=m
-
-#
-# Compression
-#
-CONFIG_CRYPTO_DEFLATE=m
-# CONFIG_CRYPTO_ZLIB is not set
-CONFIG_CRYPTO_LZO=m
-
-#
-# Random Number Generation
-#
-CONFIG_CRYPTO_ANSI_CPRNG=m
# CONFIG_CRYPTO_HW is not set
-# CONFIG_BINARY_PRINTF is not set
-
-#
-# Library routines
-#
-CONFIG_BITREVERSE=y
-CONFIG_GENERIC_FIND_LAST_BIT=y
CONFIG_CRC_CCITT=y
-CONFIG_CRC16=m
-# CONFIG_CRC_T10DIF is not set
-CONFIG_CRC_ITU_T=y
-CONFIG_CRC32=y
-CONFIG_CRC7=y
CONFIG_LIBCRC32C=m
-CONFIG_ZLIB_INFLATE=y
-CONFIG_ZLIB_DEFLATE=y
-CONFIG_LZO_COMPRESS=y
-CONFIG_LZO_DECOMPRESS=y
-CONFIG_DECOMPRESS_GZIP=y
-CONFIG_DECOMPRESS_BZIP2=y
-CONFIG_DECOMPRESS_LZMA=y
-CONFIG_DECOMPRESS_LZO=y
-CONFIG_HAS_IOMEM=y
-CONFIG_HAS_IOPORT=y
-CONFIG_HAS_DMA=y
-CONFIG_NLATTR=y
-CONFIG_GENERIC_ATOMIC64=y
diff --git a/recipes/linux/linux/tosa/defconfig b/recipes/linux/linux/tosa/defconfig
index 6c8383761a..4b72d03f85 100644
--- a/recipes/linux/linux/tosa/defconfig
+++ b/recipes/linux/linux/tosa/defconfig
@@ -1,455 +1,67 @@
-#
-# Automatically generated make config: don't edit
-# Linux kernel version: 2.6.28
-# Thu Feb 19 21:40:37 2009
-#
-CONFIG_ARM=y
-CONFIG_SYS_SUPPORTS_APM_EMULATION=y
-CONFIG_GENERIC_GPIO=y
-CONFIG_GENERIC_TIME=y
-CONFIG_GENERIC_CLOCKEVENTS=y
-CONFIG_MMU=y
-# CONFIG_NO_IOPORT is not set
-CONFIG_GENERIC_HARDIRQS=y
-CONFIG_STACKTRACE_SUPPORT=y
-CONFIG_HAVE_LATENCYTOP_SUPPORT=y
-CONFIG_LOCKDEP_SUPPORT=y
-CONFIG_TRACE_IRQFLAGS_SUPPORT=y
-CONFIG_HARDIRQS_SW_RESEND=y
-CONFIG_GENERIC_IRQ_PROBE=y
-CONFIG_RWSEM_GENERIC_SPINLOCK=y
-# CONFIG_ARCH_HAS_ILOG2_U32 is not set
-# CONFIG_ARCH_HAS_ILOG2_U64 is not set
-CONFIG_GENERIC_HWEIGHT=y
-CONFIG_GENERIC_CALIBRATE_DELAY=y
-CONFIG_ARCH_MTD_XIP=y
-CONFIG_GENERIC_HARDIRQS_NO__DO_IRQ=y
-CONFIG_VECTORS_BASE=0xffff0000
-CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
-
-#
-# General setup
-#
CONFIG_EXPERIMENTAL=y
-CONFIG_BROKEN_ON_SMP=y
-CONFIG_LOCK_KERNEL=y
-CONFIG_INIT_ENV_ARG_LIMIT=32
-CONFIG_LOCALVERSION=""
-CONFIG_LOCALVERSION_AUTO=y
-CONFIG_SWAP=y
+# CONFIG_LOCALVERSION_AUTO is not set
CONFIG_SYSVIPC=y
-CONFIG_SYSVIPC_SYSCTL=y
-# CONFIG_POSIX_MQUEUE is not set
-# CONFIG_BSD_PROCESS_ACCT is not set
-# CONFIG_TASKSTATS is not set
-# CONFIG_AUDIT is not set
-# CONFIG_IKCONFIG is not set
+CONFIG_BSD_PROCESS_ACCT=y
+CONFIG_BSD_PROCESS_ACCT_V3=y
+CONFIG_IKCONFIG=m
+CONFIG_IKCONFIG_PROC=y
CONFIG_LOG_BUF_SHIFT=14
-# CONFIG_CGROUPS is not set
-# CONFIG_GROUP_SCHED is not set
-CONFIG_SYSFS_DEPRECATED=y
-CONFIG_SYSFS_DEPRECATED_V2=y
-# CONFIG_RELAY is not set
-# CONFIG_NAMESPACES is not set
-# CONFIG_BLK_DEV_INITRD is not set
-CONFIG_CC_OPTIMIZE_FOR_SIZE=y
-CONFIG_SYSCTL=y
+CONFIG_BLK_DEV_INITRD=y
+CONFIG_RD_BZIP2=y
+CONFIG_RD_LZMA=y
+CONFIG_RD_LZO=y
+# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
CONFIG_EMBEDDED=y
-CONFIG_UID16=y
-CONFIG_SYSCTL_SYSCALL=y
-CONFIG_KALLSYMS=y
-# CONFIG_KALLSYMS_EXTRA_PASS is not set
-CONFIG_HOTPLUG=y
-CONFIG_PRINTK=y
-CONFIG_BUG=y
-# CONFIG_ELF_CORE is not set
-CONFIG_COMPAT_BRK=y
-CONFIG_BASE_FULL=y
-CONFIG_FUTEX=y
-CONFIG_ANON_INODES=y
-CONFIG_EPOLL=y
-CONFIG_SIGNALFD=y
-CONFIG_TIMERFD=y
-CONFIG_EVENTFD=y
-CONFIG_SHMEM=y
-CONFIG_AIO=y
-CONFIG_VM_EVENT_COUNTERS=y
-CONFIG_SLAB=y
-# CONFIG_SLUB is not set
-# CONFIG_SLOB is not set
-# CONFIG_PROFILING is not set
-# CONFIG_MARKERS is not set
-CONFIG_HAVE_OPROFILE=y
-# CONFIG_KPROBES is not set
-CONFIG_HAVE_KPROBES=y
-CONFIG_HAVE_KRETPROBES=y
-CONFIG_HAVE_CLK=y
-CONFIG_HAVE_GENERIC_DMA_COHERENT=y
-CONFIG_SLABINFO=y
-CONFIG_RT_MUTEXES=y
-# CONFIG_TINY_SHMEM is not set
-CONFIG_BASE_SMALL=0
+CONFIG_SLOB=y
+CONFIG_PROFILING=y
+CONFIG_OPROFILE=m
CONFIG_MODULES=y
-# CONFIG_MODULE_FORCE_LOAD is not set
CONFIG_MODULE_UNLOAD=y
CONFIG_MODULE_FORCE_UNLOAD=y
-# 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
-# CONFIG_BLK_DEV_INTEGRITY is not set
-
-#
-# IO Schedulers
-#
-CONFIG_IOSCHED_NOOP=y
-CONFIG_IOSCHED_AS=m
+# CONFIG_LBDAF is not set
CONFIG_IOSCHED_DEADLINE=m
CONFIG_IOSCHED_CFQ=m
-# CONFIG_DEFAULT_AS is not set
-# CONFIG_DEFAULT_DEADLINE is not set
-# CONFIG_DEFAULT_CFQ is not set
-CONFIG_DEFAULT_NOOP=y
-CONFIG_DEFAULT_IOSCHED="noop"
-CONFIG_CLASSIC_RCU=y
-CONFIG_FREEZER=y
-
-#
-# System Type
-#
-# CONFIG_ARCH_AAEC2000 is not set
-# CONFIG_ARCH_INTEGRATOR is not set
-# CONFIG_ARCH_REALVIEW is not set
-# CONFIG_ARCH_VERSATILE is not set
-# CONFIG_ARCH_AT91 is not set
-# CONFIG_ARCH_CLPS7500 is not set
-# CONFIG_ARCH_CLPS711X is not set
-# CONFIG_ARCH_EBSA110 is not set
-# CONFIG_ARCH_EP93XX is not set
-# CONFIG_ARCH_FOOTBRIDGE is not set
-# CONFIG_ARCH_NETX is not set
-# CONFIG_ARCH_H720X is not set
-# CONFIG_ARCH_IMX is not set
-# CONFIG_ARCH_IOP13XX is not set
-# CONFIG_ARCH_IOP32X is not set
-# CONFIG_ARCH_IOP33X is not set
-# CONFIG_ARCH_IXP23XX is not set
-# CONFIG_ARCH_IXP2000 is not set
-# CONFIG_ARCH_IXP4XX is not set
-# CONFIG_ARCH_L7200 is not set
-# CONFIG_ARCH_KIRKWOOD is not set
-# CONFIG_ARCH_KS8695 is not set
-# CONFIG_ARCH_NS9XXX is not set
-# CONFIG_ARCH_LOKI is not set
-# CONFIG_ARCH_MV78XX0 is not set
-# CONFIG_ARCH_MXC is not set
-# CONFIG_ARCH_ORION5X is not set
-# CONFIG_ARCH_PNX4008 is not set
CONFIG_ARCH_PXA=y
-# CONFIG_ARCH_RPC is not set
-# CONFIG_ARCH_SA1100 is not set
-# CONFIG_ARCH_S3C2410 is not set
-# CONFIG_ARCH_SHARK is not set
-# CONFIG_ARCH_LH7A40X is not set
-# CONFIG_ARCH_DAVINCI is not set
-# CONFIG_ARCH_OMAP is not set
-# CONFIG_ARCH_MSM is not set
-
-#
-# Intel PXA2xx/PXA3xx Implementations
-#
-# CONFIG_ARCH_GUMSTIX is not set
-# CONFIG_ARCH_LUBBOCK is not set
-# CONFIG_MACH_LOGICPD_PXA270 is not set
-# CONFIG_MACH_MAINSTONE is not set
-# CONFIG_MACH_MP900C is not set
-# CONFIG_ARCH_PXA_IDP is not set
CONFIG_PXA_SHARPSL=y
-# CONFIG_MACH_POODLE is not set
-# CONFIG_MACH_CORGI is not set
-# CONFIG_MACH_SHEPHERD is not set
-# CONFIG_MACH_HUSKY is not set
-# CONFIG_MACH_AKITA is not set
-# CONFIG_MACH_SPITZ is not set
-# CONFIG_MACH_BORZOI is not set
CONFIG_MACH_TOSA=y
-# CONFIG_ARCH_VIPER is not set
-# CONFIG_ARCH_PXA_ESERIES is not set
-# CONFIG_TRIZEPS_PXA is not set
-# CONFIG_MACH_EM_X270 is not set
-# CONFIG_MACH_COLIBRI is not set
-# CONFIG_MACH_ZYLONITE is not set
-# CONFIG_MACH_LITTLETON is not set
-# CONFIG_MACH_TAVOREVB is not set
-# CONFIG_MACH_SAAR is not set
-# CONFIG_MACH_ARMCORE is not set
-# CONFIG_MACH_CM_X300 is not set
-# CONFIG_MACH_MAGICIAN is not set
-# CONFIG_MACH_MIOA701 is not set
-# CONFIG_MACH_PCM027 is not set
-# CONFIG_ARCH_PXA_PALM is not set
-# CONFIG_PXA_EZX is not set
-CONFIG_PXA25x=y
-# CONFIG_PXA_PWM is not set
-# CONFIG_TOSA_BT is not set
-CONFIG_PXA_HAVE_BOARD_IRQS=y
-
-#
-# Boot options
-#
-
-#
-# Power management
-#
-
-#
-# Processor Type
-#
-CONFIG_CPU_32=y
-CONFIG_CPU_XSCALE=y
-CONFIG_CPU_32v5=y
-CONFIG_CPU_ABRT_EV5T=y
-CONFIG_CPU_PABRT_NOIFAR=y
-CONFIG_CPU_CACHE_VIVT=y
-CONFIG_CPU_TLB_V4WBI=y
-CONFIG_CPU_CP15=y
-CONFIG_CPU_CP15_MMU=y
-
-#
-# Processor Features
-#
-CONFIG_ARM_THUMB=y
-# CONFIG_CPU_DCACHE_DISABLE is not set
-# CONFIG_OUTER_CACHE is not set
-# CONFIG_IWMMXT is not set
-CONFIG_XSCALE_PMU=y
-CONFIG_SHARP_PARAM=y
-CONFIG_SHARP_SCOOP=y
-
-#
-# Bus support
-#
-# CONFIG_PCI_SYSCALL is not set
-# CONFIG_ARCH_SUPPORTS_MSI is not set
+CONFIG_TOSA_BT=m
CONFIG_PCCARD=y
-# CONFIG_PCMCIA_DEBUG is not set
-CONFIG_PCMCIA=y
-CONFIG_PCMCIA_LOAD_CIS=y
-# CONFIG_PCMCIA_IOCTL is not set
-
-#
-# PC-card bridges
-#
CONFIG_PCMCIA_PXA2XX=y
-
-#
-# Kernel Features
-#
-CONFIG_TICK_ONESHOT=y
-# CONFIG_NO_HZ is not set
-# CONFIG_HIGH_RES_TIMERS is not set
-CONFIG_GENERIC_CLOCKEVENTS_BUILD=y
-CONFIG_VMSPLIT_3G=y
-# CONFIG_VMSPLIT_2G is not set
-# CONFIG_VMSPLIT_1G is not set
-CONFIG_PAGE_OFFSET=0xC0000000
-CONFIG_PREEMPT=y
-CONFIG_HZ=100
+CONFIG_NO_HZ=y
+CONFIG_HIGH_RES_TIMERS=y
CONFIG_AEABI=y
# CONFIG_OABI_COMPAT is not set
-CONFIG_ARCH_FLATMEM_HAS_HOLES=y
-# CONFIG_ARCH_SPARSEMEM_DEFAULT is not set
-# CONFIG_ARCH_SELECT_MEMORY_MODEL is not set
-CONFIG_SELECT_MEMORY_MODEL=y
-CONFIG_FLATMEM_MANUAL=y
-# CONFIG_DISCONTIGMEM_MANUAL is not set
-# CONFIG_SPARSEMEM_MANUAL is not set
-CONFIG_FLATMEM=y
-CONFIG_FLAT_NODE_MEM_MAP=y
-CONFIG_PAGEFLAGS_EXTENDED=y
-CONFIG_SPLIT_PTLOCK_CPUS=4096
-# CONFIG_RESOURCES_64BIT is not set
-# CONFIG_PHYS_ADDR_T_64BIT is not set
-CONFIG_ZONE_DMA_FLAG=0
-CONFIG_VIRT_TO_BUS=y
-CONFIG_UNEVICTABLE_LRU=y
-CONFIG_ALIGNMENT_TRAP=y
-
-#
-# Boot options
-#
CONFIG_ZBOOT_ROM_TEXT=0x0
CONFIG_ZBOOT_ROM_BSS=0x0
-CONFIG_CMDLINE=" debug "
-# CONFIG_XIP_KERNEL is not set
+CONFIG_CMDLINE="console=ttyS0,115200n8 console=tty1 quiet"
CONFIG_KEXEC=y
-CONFIG_ATAGS_PROC=y
-
-#
-# CPU Power Management
-#
-CONFIG_CPU_FREQ=y
-CONFIG_CPU_FREQ_TABLE=y
-# CONFIG_CPU_FREQ_DEBUG is not set
-CONFIG_CPU_FREQ_STAT=y
-# CONFIG_CPU_FREQ_STAT_DETAILS is not set
-CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE=y
-# CONFIG_CPU_FREQ_DEFAULT_GOV_POWERSAVE is not set
-# CONFIG_CPU_FREQ_DEFAULT_GOV_USERSPACE is not set
-# CONFIG_CPU_FREQ_DEFAULT_GOV_ONDEMAND is not set
-# CONFIG_CPU_FREQ_DEFAULT_GOV_CONSERVATIVE is not set
-CONFIG_CPU_FREQ_GOV_PERFORMANCE=y
-CONFIG_CPU_FREQ_GOV_POWERSAVE=y
-CONFIG_CPU_FREQ_GOV_USERSPACE=y
-CONFIG_CPU_FREQ_GOV_ONDEMAND=y
-CONFIG_CPU_FREQ_GOV_CONSERVATIVE=y
-CONFIG_CPU_FREQ_PXA=y
-# CONFIG_CPU_IDLE is not set
-
-#
-# Floating point emulation
-#
-
-#
-# At least one emulation must be selected
-#
-
-#
-# Userspace binary formats
-#
-CONFIG_BINFMT_ELF=y
# CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS is not set
-CONFIG_HAVE_AOUT=y
CONFIG_BINFMT_AOUT=m
CONFIG_BINFMT_MISC=m
-
-#
-# Power management options
-#
-CONFIG_PM=y
-# CONFIG_PM_DEBUG is not set
-CONFIG_PM_SLEEP=y
-CONFIG_SUSPEND=y
-CONFIG_SUSPEND_FREEZER=y
+CONFIG_PM_RUNTIME=y
CONFIG_APM_EMULATION=y
-CONFIG_ARCH_SUSPEND_POSSIBLE=y
CONFIG_NET=y
-
-#
-# Networking options
-#
CONFIG_PACKET=m
-CONFIG_PACKET_MMAP=y
CONFIG_UNIX=y
-CONFIG_XFRM=y
CONFIG_XFRM_USER=m
-# CONFIG_XFRM_SUB_POLICY is not set
-# CONFIG_XFRM_MIGRATE is not set
-# CONFIG_XFRM_STATISTICS is not set
-CONFIG_XFRM_IPCOMP=m
-CONFIG_NET_KEY=m
-# CONFIG_NET_KEY_MIGRATE 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 is not set
-# CONFIG_NET_IPIP is not set
-# CONFIG_NET_IPGRE is not set
-# CONFIG_ARPD is not set
-CONFIG_SYN_COOKIES=y
-# CONFIG_INET_AH is not set
-# CONFIG_INET_ESP is not set
-# CONFIG_INET_IPCOMP is not set
-# CONFIG_INET_XFRM_TUNNEL is not set
-CONFIG_INET_TUNNEL=m
CONFIG_INET_XFRM_MODE_TRANSPORT=m
CONFIG_INET_XFRM_MODE_TUNNEL=m
CONFIG_INET_XFRM_MODE_BEET=m
# CONFIG_INET_LRO is not set
CONFIG_INET_DIAG=m
-CONFIG_INET_TCP_DIAG=m
-# CONFIG_TCP_CONG_ADVANCED is not set
-CONFIG_TCP_CONG_CUBIC=y
-CONFIG_DEFAULT_TCP_CONG="cubic"
-# CONFIG_TCP_MD5SIG is not set
-CONFIG_IPV6=m
-# CONFIG_IPV6_PRIVACY is not set
-# CONFIG_IPV6_ROUTER_PREF is not set
-# CONFIG_IPV6_OPTIMISTIC_DAD is not set
CONFIG_INET6_AH=m
CONFIG_INET6_ESP=m
CONFIG_INET6_IPCOMP=m
-# CONFIG_IPV6_MIP6 is not set
-CONFIG_INET6_XFRM_TUNNEL=m
-CONFIG_INET6_TUNNEL=m
-CONFIG_INET6_XFRM_MODE_TRANSPORT=m
-CONFIG_INET6_XFRM_MODE_TUNNEL=m
-CONFIG_INET6_XFRM_MODE_BEET=m
-# CONFIG_INET6_XFRM_MODE_ROUTEOPTIMIZATION is not set
-CONFIG_IPV6_SIT=m
-CONFIG_IPV6_NDISC_NODETYPE=y
CONFIG_IPV6_TUNNEL=m
-# CONFIG_IPV6_MULTIPLE_TABLES is not set
-# CONFIG_IPV6_MROUTE is not set
-# CONFIG_NETWORK_SECMARK is not set
CONFIG_NETFILTER=y
-# CONFIG_NETFILTER_DEBUG is not set
-CONFIG_NETFILTER_ADVANCED=y
-
-#
-# Core Netfilter Configuration
-#
-# CONFIG_NETFILTER_NETLINK_QUEUE is not set
-# CONFIG_NETFILTER_NETLINK_LOG is not set
-# CONFIG_NF_CONNTRACK is not set
-CONFIG_NETFILTER_XTABLES=m
-# CONFIG_NETFILTER_XT_TARGET_CLASSIFY 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_RATEEST is not set
-# CONFIG_NETFILTER_XT_TARGET_TRACE is not set
-# CONFIG_NETFILTER_XT_TARGET_TCPMSS is not set
-# CONFIG_NETFILTER_XT_TARGET_TCPOPTSTRIP is not set
-# CONFIG_NETFILTER_XT_MATCH_COMMENT 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_IPRANGE 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_OWNER is not set
-# CONFIG_NETFILTER_XT_MATCH_POLICY is not set
-# CONFIG_NETFILTER_XT_MATCH_PKTTYPE is not set
-# CONFIG_NETFILTER_XT_MATCH_QUOTA is not set
-# CONFIG_NETFILTER_XT_MATCH_RATEEST is not set
-# CONFIG_NETFILTER_XT_MATCH_REALM is not set
-# CONFIG_NETFILTER_XT_MATCH_RECENT is not set
-# CONFIG_NETFILTER_XT_MATCH_SCTP 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_TIME is not set
-# CONFIG_NETFILTER_XT_MATCH_U32 is not set
-# CONFIG_IP_VS is not set
-
-#
-# IP: Netfilter Configuration
-#
-# CONFIG_NF_DEFRAG_IPV4 is not set
-CONFIG_IP_NF_QUEUE=m
+CONFIG_NF_CONNTRACK=m
+CONFIG_NF_CONNTRACK_FTP=m
+CONFIG_NF_CONNTRACK_H323=m
+CONFIG_NF_CONNTRACK_IRC=m
+CONFIG_NF_CONNTRACK_SIP=m
+CONFIG_NF_CONNTRACK_IPV4=m
CONFIG_IP_NF_IPTABLES=m
-CONFIG_IP_NF_MATCH_ADDRTYPE=m
CONFIG_IP_NF_MATCH_AH=m
CONFIG_IP_NF_MATCH_ECN=m
CONFIG_IP_NF_MATCH_TTL=m
@@ -457,6 +69,10 @@ CONFIG_IP_NF_FILTER=m
CONFIG_IP_NF_TARGET_REJECT=m
CONFIG_IP_NF_TARGET_LOG=m
CONFIG_IP_NF_TARGET_ULOG=m
+CONFIG_NF_NAT=m
+CONFIG_IP_NF_TARGET_MASQUERADE=m
+CONFIG_IP_NF_TARGET_NETMAP=m
+CONFIG_IP_NF_TARGET_REDIRECT=m
CONFIG_IP_NF_MANGLE=m
CONFIG_IP_NF_TARGET_ECN=m
CONFIG_IP_NF_TARGET_TTL=m
@@ -464,96 +80,27 @@ CONFIG_IP_NF_RAW=m
CONFIG_IP_NF_ARPTABLES=m
CONFIG_IP_NF_ARPFILTER=m
CONFIG_IP_NF_ARP_MANGLE=m
-
-#
-# IPv6: Netfilter Configuration
-#
-# CONFIG_IP6_NF_QUEUE is not set
-# CONFIG_IP6_NF_IPTABLES is not set
-# CONFIG_IP_DCCP is not set
-# CONFIG_IP_SCTP is not set
-# CONFIG_TIPC is not set
-# CONFIG_ATM is not set
-# CONFIG_BRIDGE is not set
-# CONFIG_NET_DSA is not set
-# CONFIG_VLAN_8021Q is not set
-# CONFIG_DECNET is not set
-# CONFIG_LLC2 is not set
-# CONFIG_IPX is not set
-# CONFIG_ATALK is not set
-# CONFIG_X25 is not set
-# CONFIG_LAPB is not set
-# CONFIG_ECONET is not set
-# CONFIG_WAN_ROUTER is not set
-# CONFIG_NET_SCHED is not set
-
-#
-# Network testing
-#
-# CONFIG_NET_PKTGEN is not set
-# CONFIG_HAMRADIO is not set
-# CONFIG_CAN is not set
CONFIG_IRDA=m
-
-#
-# IrDA protocols
-#
CONFIG_IRLAN=m
CONFIG_IRNET=m
CONFIG_IRCOMM=m
-# CONFIG_IRDA_ULTRA is not set
-
-#
-# IrDA options
-#
-# CONFIG_IRDA_CACHE_LAST_LSAP is not set
-# CONFIG_IRDA_FAST_RR is not set
-# CONFIG_IRDA_DEBUG is not set
-
-#
-# Infrared-port device drivers
-#
-
-#
-# SIR device drivers
-#
-# CONFIG_IRTTY_SIR is not set
-
-#
-# Dongle support
-#
-# CONFIG_KINGSUN_DONGLE is not set
-# CONFIG_KSDAZZLE_DONGLE is not set
-# CONFIG_KS959_DONGLE is not set
-
-#
-# FIR device drivers
-#
-# CONFIG_USB_IRDA is not set
-# CONFIG_SIGMATEL_FIR is not set
CONFIG_PXA_FICP=m
-# CONFIG_MCS_FIR is not set
CONFIG_BT=m
-CONFIG_BT_L2CAP=m
-CONFIG_BT_SCO=m
+CONFIG_BT_L2CAP=y
+CONFIG_BT_SCO=y
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 is not set
-# CONFIG_BT_HCIBTUSB is not set
-# CONFIG_BT_HCIBTSDIO is not set
+CONFIG_BT_HCIBTUSB=m
+CONFIG_BT_HCIBTSDIO=m
CONFIG_BT_HCIUART=m
CONFIG_BT_HCIUART_H4=y
CONFIG_BT_HCIUART_BCSP=y
-# CONFIG_BT_HCIUART_LL is not set
+CONFIG_BT_HCIUART_ATH3K=y
+CONFIG_BT_HCIUART_LL=y
CONFIG_BT_HCIBCM203X=m
CONFIG_BT_HCIBPA10X=m
CONFIG_BT_HCIBFUSB=m
@@ -562,898 +109,138 @@ CONFIG_BT_HCIBT3C=m
CONFIG_BT_HCIBLUECARD=m
CONFIG_BT_HCIBTUART=m
CONFIG_BT_HCIVHCI=m
-# CONFIG_AF_RXRPC is not set
-# CONFIG_PHONET is not set
-CONFIG_WIRELESS=y
-# CONFIG_CFG80211 is not set
-CONFIG_WIRELESS_OLD_REGULATORY=y
-CONFIG_WIRELESS_EXT=y
-CONFIG_WIRELESS_EXT_SYSFS=y
-# CONFIG_MAC80211 is not set
-CONFIG_IEEE80211=m
-# CONFIG_IEEE80211_DEBUG is not set
-CONFIG_IEEE80211_CRYPT_WEP=m
-CONFIG_IEEE80211_CRYPT_CCMP=m
-CONFIG_IEEE80211_CRYPT_TKIP=m
-# CONFIG_RFKILL is not set
-# CONFIG_NET_9P is not set
-
-#
-# Device Drivers
-#
-
-#
-# Generic Driver Options
-#
-CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
-CONFIG_STANDALONE=y
-CONFIG_PREVENT_FIRMWARE_BUILD=y
-CONFIG_FW_LOADER=y
-CONFIG_FIRMWARE_IN_KERNEL=y
-CONFIG_EXTRA_FIRMWARE=""
-# CONFIG_SYS_HYPERVISOR is not set
-# CONFIG_CONNECTOR is not set
+CONFIG_BT_MRVL=m
+CONFIG_BT_MRVL_SDIO=m
+CONFIG_BT_ATH3K=m
+CONFIG_CFG80211=m
+# CONFIG_CFG80211_DEFAULT_PS is not set
+CONFIG_MAC80211=m
+# CONFIG_MAC80211_RC_MINSTREL is not set
+CONFIG_DEVTMPFS=y
+CONFIG_DEVTMPFS_MOUNT=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 is not set
-# CONFIG_MTD_AFS_PARTS is not set
-# CONFIG_MTD_AR7_PARTS is not set
-
-#
-# User Modules And Translation Layers
-#
+CONFIG_MTD_CMDLINE_PARTS=y
CONFIG_MTD_CHAR=y
-CONFIG_MTD_BLKDEVS=y
CONFIG_MTD_BLOCK=y
-# CONFIG_FTL is not set
-# CONFIG_NFTL is not set
-# CONFIG_INFTL is not set
-# CONFIG_RFD_FTL is not set
-# CONFIG_SSFDC is not set
-# CONFIG_MTD_OOPS is not set
-
-#
-# RAM/ROM/Flash chip drivers
-#
-# CONFIG_MTD_CFI is not set
-# CONFIG_MTD_JEDECPROBE is not set
-CONFIG_MTD_MAP_BANK_WIDTH_1=y
-CONFIG_MTD_MAP_BANK_WIDTH_2=y
-CONFIG_MTD_MAP_BANK_WIDTH_4=y
-# CONFIG_MTD_MAP_BANK_WIDTH_8 is not set
-# CONFIG_MTD_MAP_BANK_WIDTH_16 is not set
-# CONFIG_MTD_MAP_BANK_WIDTH_32 is not set
-CONFIG_MTD_CFI_I1=y
-CONFIG_MTD_CFI_I2=y
-# CONFIG_MTD_CFI_I4 is not set
-# CONFIG_MTD_CFI_I8 is not set
-# CONFIG_MTD_RAM is not set
CONFIG_MTD_ROM=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_SHARP_SL=y
-# CONFIG_MTD_PLATRAM is not set
-
-#
-# Self-contained MTD device drivers
-#
-# CONFIG_MTD_DATAFLASH is not set
-# CONFIG_MTD_M25P80 is not set
-# CONFIG_MTD_SLRAM is not set
-# CONFIG_MTD_PHRAM is not set
-# CONFIG_MTD_MTDRAM is not set
-# CONFIG_MTD_BLOCK2MTD is not set
-
-#
-# Disk-On-Chip Device Drivers
-#
-# CONFIG_MTD_DOC2000 is not set
-# CONFIG_MTD_DOC2001 is not set
-# CONFIG_MTD_DOC2001PLUS is not set
+CONFIG_MTD_COMPLEX_MAPPINGS=y
+CONFIG_MTD_PHYSMAP=y
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_H1900 is not set
-# CONFIG_MTD_NAND_GPIO is not set
-CONFIG_MTD_NAND_IDS=y
-# CONFIG_MTD_NAND_DISKONCHIP is not set
-# CONFIG_MTD_NAND_SHARPSL is not set
CONFIG_MTD_NAND_TMIO=y
-# 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_PARPORT is not set
-CONFIG_BLK_DEV=y
-# CONFIG_BLK_DEV_COW_COMMON is not set
-CONFIG_BLK_DEV_LOOP=m
-# CONFIG_BLK_DEV_CRYPTOLOOP is not set
-# CONFIG_BLK_DEV_NBD is not set
-# CONFIG_BLK_DEV_UB is not set
-# CONFIG_BLK_DEV_RAM is not set
-# CONFIG_CDROM_PKTCDVD is not set
-# CONFIG_ATA_OVER_ETH is not set
+CONFIG_MTD_UBI=y
+CONFIG_MTD_UBI_GLUEBI=m
+CONFIG_BLK_DEV_LOOP=y
CONFIG_MISC_DEVICES=y
-# CONFIG_EEPROM_93CX6 is not set
-# CONFIG_ICS932S401 is not set
-# CONFIG_ENCLOSURE_SERVICES is not set
-# CONFIG_C2PORT is not set
-CONFIG_HAVE_IDE=y
-CONFIG_IDE=y
-
-#
-# Please see Documentation/ide/ide.txt for help/info on IDE drives
-#
-# CONFIG_BLK_DEV_IDE_SATA is not set
-CONFIG_IDE_GD=y
-CONFIG_IDE_GD_ATA=y
-# CONFIG_IDE_GD_ATAPI is not set
-CONFIG_BLK_DEV_IDECS=y
-CONFIG_BLK_DEV_IDECD=m
-CONFIG_BLK_DEV_IDECD_VERBOSE_ERRORS=y
-# CONFIG_BLK_DEV_IDETAPE 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_BLK_DEV_PLATFORM is not set
-# CONFIG_BLK_DEV_IDEDMA is not set
-
-#
-# SCSI device support
-#
-# CONFIG_RAID_ATTRS is not set
-CONFIG_SCSI=m
-CONFIG_SCSI_DMA=y
-# CONFIG_SCSI_TGT is not set
-# CONFIG_SCSI_NETLINK is not set
-CONFIG_SCSI_PROC_FS=y
-
-#
-# SCSI support type (disk, tape, CD-ROM)
-#
-CONFIG_BLK_DEV_SD=m
-CONFIG_CHR_DEV_ST=m
-CONFIG_CHR_DEV_OSST=m
+CONFIG_BLK_DEV_SD=y
CONFIG_BLK_DEV_SR=m
-# CONFIG_BLK_DEV_SR_VENDOR is not set
CONFIG_CHR_DEV_SG=m
-# CONFIG_CHR_DEV_SCH is not set
-
-#
-# Some SCSI devices (e.g. CD jukebox) support multiple LUNs
-#
CONFIG_SCSI_MULTI_LUN=y
-# 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_SCSI_DEBUG is not set
-# CONFIG_SCSI_LOWLEVEL_PCMCIA is not set
-# CONFIG_SCSI_DH is not set
-# CONFIG_ATA is not set
-CONFIG_MD=y
-# CONFIG_BLK_DEV_MD is not set
-CONFIG_BLK_DEV_DM=m
-# CONFIG_DM_DEBUG is not set
-CONFIG_DM_CRYPT=m
-CONFIG_DM_SNAPSHOT=m
-CONFIG_DM_MIRROR=m
-CONFIG_DM_ZERO=m
-CONFIG_DM_MULTIPATH=m
-# CONFIG_DM_DELAY is not set
-# CONFIG_DM_UEVENT is not set
+CONFIG_ATA=y
+# CONFIG_SATA_PMP is not set
+CONFIG_PATA_PXA=y
+CONFIG_PATA_PCMCIA=y
CONFIG_NETDEVICES=y
-# CONFIG_DUMMY is not set
-# CONFIG_BONDING is not set
-# CONFIG_MACVLAN is not set
-# CONFIG_EQUALIZER is not set
CONFIG_TUN=m
-# CONFIG_VETH is not set
-# CONFIG_PHYLIB is not set
CONFIG_NET_ETHERNET=y
-CONFIG_MII=m
-# CONFIG_AX88796 is not set
-# CONFIG_SMC91X is not set
-# CONFIG_DM9000 is not set
-# CONFIG_ENC28J60 is not set
-# CONFIG_SMC911X is not set
-# CONFIG_IBM_NEW_EMAC_ZMII is not set
-# CONFIG_IBM_NEW_EMAC_RGMII is not set
-# CONFIG_IBM_NEW_EMAC_TAH is not set
-# CONFIG_IBM_NEW_EMAC_EMAC4 is not set
-# CONFIG_IBM_NEW_EMAC_NO_FLOW_CTRL is not set
-# CONFIG_IBM_NEW_EMAC_MAL_CLR_ICINTSTAT is not set
-# CONFIG_IBM_NEW_EMAC_MAL_COMMON_ERR is not set
-# CONFIG_B44 is not set
-CONFIG_NETDEV_1000=y
-CONFIG_NETDEV_10000=y
-
-#
-# Wireless LAN
-#
-# CONFIG_WLAN_PRE80211 is not set
-CONFIG_WLAN_80211=y
-# CONFIG_PCMCIA_RAYCS is not set
-CONFIG_LIBERTAS=m
-CONFIG_LIBERTAS_USB=m
-CONFIG_LIBERTAS_CS=m
-CONFIG_LIBERTAS_SDIO=m
-# CONFIG_LIBERTAS_DEBUG is not set
-CONFIG_HERMES=m
-CONFIG_PCMCIA_HERMES=m
-CONFIG_PCMCIA_SPECTRUM=m
-CONFIG_ATMEL=m
-CONFIG_PCMCIA_ATMEL=m
+# CONFIG_NETDEV_1000 is not set
+# CONFIG_NETDEV_10000 is not set
CONFIG_AIRO_CS=m
-CONFIG_PCMCIA_WL3501=m
-CONFIG_USB_ZD1201=m
-# CONFIG_USB_NET_RNDIS_WLAN is not set
-# CONFIG_IWLWIFI_LEDS is not set
CONFIG_HOSTAP=m
CONFIG_HOSTAP_FIRMWARE=y
-# CONFIG_HOSTAP_FIRMWARE_NVRAM is not set
CONFIG_HOSTAP_CS=m
-
-#
-# USB Network Adapters
-#
CONFIG_USB_CATC=m
CONFIG_USB_KAWETH=m
CONFIG_USB_PEGASUS=m
CONFIG_USB_RTL8150=m
CONFIG_USB_USBNET=m
-CONFIG_USB_NET_AX8817X=m
-CONFIG_USB_NET_CDCETHER=m
-# CONFIG_USB_NET_DM9601 is not set
-# CONFIG_USB_NET_SMSC95XX is not set
-CONFIG_USB_NET_GL620A=m
-CONFIG_USB_NET_NET1080=m
-CONFIG_USB_NET_PLUSB=m
-# CONFIG_USB_NET_MCS7830 is not set
-# CONFIG_USB_NET_RNDIS_HOST is not set
+CONFIG_USB_NET_DM9601=m
# CONFIG_USB_NET_CDC_SUBSET is not set
-# CONFIG_USB_NET_ZAURUS is not set
+CONFIG_USB_SIERRA_NET=m
CONFIG_NET_PCMCIA=y
-# CONFIG_PCMCIA_3C589 is not set
-# CONFIG_PCMCIA_3C574 is not set
-# CONFIG_PCMCIA_FMVJ18X is not set
CONFIG_PCMCIA_PCNET=m
-# CONFIG_PCMCIA_NMCLAN is not set
-# CONFIG_PCMCIA_SMC91C92 is not set
-# CONFIG_PCMCIA_XIRC2PS is not set
-# CONFIG_PCMCIA_AXNET is not set
-# CONFIG_WAN is not set
CONFIG_PPP=m
-# CONFIG_PPP_MULTILINK is not set
-# CONFIG_PPP_FILTER is not set
CONFIG_PPP_ASYNC=m
-# CONFIG_PPP_SYNC_TTY is not set
CONFIG_PPP_DEFLATE=m
CONFIG_PPP_BSDCOMP=m
-# CONFIG_PPP_MPPE is not set
-# CONFIG_PPPOE is not set
-# CONFIG_PPPOL2TP is not set
-# CONFIG_SLIP is not set
-CONFIG_SLHC=m
-# CONFIG_NETCONSOLE is not set
-# CONFIG_NETPOLL is not set
-# CONFIG_NET_POLL_CONTROLLER is not set
-# CONFIG_ISDN is not set
-
-#
-# Input device support
-#
-CONFIG_INPUT=y
-# CONFIG_INPUT_FF_MEMLESS is not set
-# CONFIG_INPUT_POLLDEV is not set
-
-#
-# Userland interfaces
-#
-CONFIG_INPUT_MOUSEDEV=m
# CONFIG_INPUT_MOUSEDEV_PSAUX is not set
CONFIG_INPUT_MOUSEDEV_SCREEN_X=480
CONFIG_INPUT_MOUSEDEV_SCREEN_Y=640
-# CONFIG_INPUT_JOYDEV is not set
CONFIG_INPUT_EVDEV=y
-# CONFIG_INPUT_EVBUG is not set
-# CONFIG_INPUT_APMPOWER is not set
-
-#
-# Input Device Drivers
-#
-CONFIG_INPUT_KEYBOARD=y
+CONFIG_INPUT_APMPOWER=y
# CONFIG_KEYBOARD_ATKBD is not set
-# CONFIG_KEYBOARD_SUNKBD is not set
-# CONFIG_KEYBOARD_LKKBD is not set
-# CONFIG_KEYBOARD_XTKBD is not set
-# CONFIG_KEYBOARD_NEWTON is not set
-# CONFIG_KEYBOARD_STOWAWAY is not set
-# CONFIG_KEYBOARD_CORGI is not set
-# CONFIG_KEYBOARD_SPITZ is not set
-CONFIG_KEYBOARD_TOSA=y
-# CONFIG_KEYBOARD_TOSA_USE_EXT_KEYCODES is not set
CONFIG_KEYBOARD_GPIO=y
+CONFIG_KEYBOARD_MATRIX=y
# CONFIG_INPUT_MOUSE is not set
-# CONFIG_INPUT_JOYSTICK is not set
-# CONFIG_INPUT_TABLET is not set
CONFIG_INPUT_TOUCHSCREEN=y
-# CONFIG_TOUCHSCREEN_ADS7846 is not set
-# CONFIG_TOUCHSCREEN_CORGI is not set
-# CONFIG_TOUCHSCREEN_FUJITSU is not set
-# CONFIG_TOUCHSCREEN_GUNZE is not set
-# CONFIG_TOUCHSCREEN_ELO is not set
-# CONFIG_TOUCHSCREEN_MTOUCH is not set
-# CONFIG_TOUCHSCREEN_INEXIO is not set
-# CONFIG_TOUCHSCREEN_MK712 is not set
-# CONFIG_TOUCHSCREEN_PENMOUNT is not set
-# CONFIG_TOUCHSCREEN_TOUCHRIGHT is not set
-# CONFIG_TOUCHSCREEN_TOUCHWIN is not set
-CONFIG_TOUCHSCREEN_WM97XX=y
-# CONFIG_TOUCHSCREEN_WM9705 is not set
-CONFIG_TOUCHSCREEN_WM9712=y
-# CONFIG_TOUCHSCREEN_WM9713 is not set
-# CONFIG_TOUCHSCREEN_WM97XX_MAINSTONE is not set
-# CONFIG_TOUCHSCREEN_USB_COMPOSITE is not set
-# CONFIG_TOUCHSCREEN_TOUCHIT213 is not set
CONFIG_INPUT_MISC=y
-# CONFIG_INPUT_ATI_REMOTE is not set
-# CONFIG_INPUT_ATI_REMOTE2 is not set
-# CONFIG_INPUT_KEYSPAN_REMOTE is not set
-# CONFIG_INPUT_POWERMATE is not set
-# CONFIG_INPUT_YEALINK is not set
-# CONFIG_INPUT_CM109 is not set
CONFIG_INPUT_UINPUT=m
-
-#
-# Hardware I/O ports
-#
# CONFIG_SERIO is not set
-# CONFIG_GAMEPORT is not set
-
-#
-# Character devices
-#
-CONFIG_VT=y
-CONFIG_CONSOLE_TRANSLATIONS=y
-CONFIG_VT_CONSOLE=y
-CONFIG_HW_CONSOLE=y
-# CONFIG_VT_HW_CONSOLE_BINDING is not set
-CONFIG_DEVKMEM=y
-# CONFIG_SERIAL_NONSTANDARD is not set
-
-#
-# Serial drivers
-#
+# CONFIG_LEGACY_PTYS is not set
CONFIG_SERIAL_8250=m
CONFIG_SERIAL_8250_CS=m
-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_PXA=y
CONFIG_SERIAL_PXA_CONSOLE=y
-CONFIG_SERIAL_CORE=y
-CONFIG_SERIAL_CORE_CONSOLE=y
-CONFIG_UNIX98_PTYS=y
-# CONFIG_LEGACY_PTYS is not set
-# CONFIG_IPMI_HANDLER is not set
-CONFIG_HW_RANDOM=m
-# CONFIG_NVRAM is not set
-# CONFIG_R3964 is not set
-
-#
-# PCMCIA character devices
-#
-# CONFIG_SYNCLINK_CS is not set
-# CONFIG_CARDMAN_4000 is not set
-# CONFIG_CARDMAN_4040 is not set
-# CONFIG_IPWIRELESS is not set
-# CONFIG_RAW_DRIVER is not set
-# CONFIG_TCG_TPM is not set
+CONFIG_RAMOOPS=y
CONFIG_I2C=y
-CONFIG_I2C_BOARDINFO=y
-# CONFIG_I2C_CHARDEV is not set
-CONFIG_I2C_HELPER_AUTO=y
-
-#
-# I2C Hardware Bus support
-#
-
-#
-# I2C system bus drivers (mostly embedded / system-on-chip)
-#
-# CONFIG_I2C_GPIO is not set
-# CONFIG_I2C_OCORES is not set
CONFIG_I2C_PXA=y
-# CONFIG_I2C_PXA_SLAVE is not set
-# CONFIG_I2C_SIMTEC is not set
-
-#
-# External I2C/SMBus adapter drivers
-#
-# CONFIG_I2C_PARPORT_LIGHT is not set
-# CONFIG_I2C_TAOS_EVM is not set
-# CONFIG_I2C_TINY_USB is not set
-
-#
-# Other I2C/SMBus bus drivers
-#
-# CONFIG_I2C_PCA_PLATFORM is not set
-# CONFIG_I2C_STUB is not set
-
-#
-# Miscellaneous I2C Chip support
-#
-# CONFIG_DS1682 is not set
-# CONFIG_AT24 is not set
-# CONFIG_SENSORS_EEPROM is not set
-# CONFIG_SENSORS_PCF8574 is not set
-# CONFIG_PCF8575 is not set
-# CONFIG_SENSORS_PCA9539 is not set
-# CONFIG_SENSORS_PCF8591 is not set
-# CONFIG_TPS65010 is not set
-# CONFIG_SENSORS_MAX6875 is not set
-# CONFIG_SENSORS_TSL2550 is not set
-# CONFIG_I2C_DEBUG_CORE is not set
-# CONFIG_I2C_DEBUG_ALGO is not set
-# CONFIG_I2C_DEBUG_BUS is not set
-# CONFIG_I2C_DEBUG_CHIP is not set
CONFIG_SPI=y
-CONFIG_SPI_MASTER=y
-
-#
-# SPI Master Controller Drivers
-#
-# CONFIG_SPI_BITBANG is not set
-# CONFIG_SPI_PXA2XX is not set
-
-#
-# SPI Protocol Masters
-#
-# CONFIG_SPI_AT25 is not set
-# CONFIG_SPI_SPIDEV is not set
-# CONFIG_SPI_TLE62X0 is not set
-CONFIG_ARCH_REQUIRE_GPIOLIB=y
-CONFIG_GPIOLIB=y
-# CONFIG_GPIO_SYSFS is not set
-
-#
-# Memory mapped GPIO expanders:
-#
-
-#
-# I2C GPIO expanders:
-#
-# CONFIG_GPIO_MAX732X is not set
-# CONFIG_GPIO_PCA953X is not set
-# CONFIG_GPIO_PCF857X is not set
-
-#
-# PCI GPIO expanders:
-#
-
-#
-# SPI GPIO expanders:
-#
-# CONFIG_GPIO_MAX7301 is not set
-# CONFIG_GPIO_MCP23S08 is not set
-# CONFIG_W1 is not set
+CONFIG_SPI_PXA2XX=y
+CONFIG_GPIO_SYSFS=y
CONFIG_POWER_SUPPLY=y
-# CONFIG_POWER_SUPPLY_DEBUG is not set
+CONFIG_POWER_SUPPLY_DEBUG=y
CONFIG_PDA_POWER=y
CONFIG_APM_POWER=y
-# CONFIG_BATTERY_DS2760 is not set
-CONFIG_BATTERY_TOSA=y
-# CONFIG_BATTERY_WM97XX is not set
-# CONFIG_BATTERY_BQ27x00 is not set
-# CONFIG_HWMON is not set
-# CONFIG_THERMAL is not set
-# CONFIG_THERMAL_HWMON is not set
-# CONFIG_WATCHDOG is not set
-CONFIG_SSB_POSSIBLE=y
-
-#
-# Sonics Silicon Backplane
-#
-# CONFIG_SSB is not set
-
-#
-# Multifunction device drivers
-#
-CONFIG_MFD_CORE=y
-# CONFIG_MFD_SM501 is not set
-# CONFIG_MFD_ASIC3 is not set
-# CONFIG_HTC_EGPIO is not set
-# CONFIG_HTC_PASIC3 is not set
-# CONFIG_UCB1400_CORE is not set
-CONFIG_MFD_TMIO=y
-# CONFIG_MFD_T7L66XB is not set
-# CONFIG_MFD_TC6387XB is not set
+CONFIG_SENSORS_MAX1111=y
CONFIG_MFD_TC6393XB=y
-# CONFIG_PMIC_DA903X is not set
-# CONFIG_MFD_WM8400 is not set
-# CONFIG_MFD_WM8350_I2C is not set
-
-#
-# Multimedia devices
-#
-
-#
-# Multimedia core support
-#
-CONFIG_VIDEO_DEV=m
-CONFIG_VIDEO_V4L2_COMMON=m
-CONFIG_VIDEO_ALLOW_V4L1=y
-CONFIG_VIDEO_V4L1_COMPAT=y
-# CONFIG_DVB_CORE is not set
-CONFIG_VIDEO_MEDIA=m
-
-#
-# Multimedia drivers
-#
-# CONFIG_MEDIA_ATTACH is not set
-CONFIG_MEDIA_TUNER=m
-# CONFIG_MEDIA_TUNER_CUSTOMIZE is not set
-CONFIG_MEDIA_TUNER_SIMPLE=m
-CONFIG_MEDIA_TUNER_TDA8290=m
-CONFIG_MEDIA_TUNER_TDA9887=m
-CONFIG_MEDIA_TUNER_TEA5761=m
-CONFIG_MEDIA_TUNER_TEA5767=m
-CONFIG_MEDIA_TUNER_MT20XX=m
-CONFIG_MEDIA_TUNER_XC2028=m
-CONFIG_MEDIA_TUNER_XC5000=m
-CONFIG_VIDEO_V4L2=m
-CONFIG_VIDEO_V4L1=m
-CONFIG_VIDEO_CAPTURE_DRIVERS=y
-# CONFIG_VIDEO_ADV_DEBUG is not set
-# CONFIG_VIDEO_FIXED_MINOR_RANGES is not set
-CONFIG_VIDEO_HELPER_CHIPS_AUTO=y
-# CONFIG_VIDEO_VIVI is not set
-# CONFIG_VIDEO_CPIA is not set
-# CONFIG_VIDEO_CPIA2 is not set
-# CONFIG_VIDEO_SAA5246A is not set
-# CONFIG_VIDEO_SAA5249 is not set
-# CONFIG_SOC_CAMERA is not set
-CONFIG_V4L_USB_DRIVERS=y
-# CONFIG_USB_VIDEO_CLASS is not set
-CONFIG_USB_GSPCA=m
-# CONFIG_USB_M5602 is not set
-# CONFIG_USB_GSPCA_CONEX is not set
-# CONFIG_USB_GSPCA_ETOMS is not set
-# CONFIG_USB_GSPCA_FINEPIX is not set
-# CONFIG_USB_GSPCA_MARS is not set
-# CONFIG_USB_GSPCA_OV519 is not set
-# CONFIG_USB_GSPCA_PAC207 is not set
-# CONFIG_USB_GSPCA_PAC7311 is not set
-# CONFIG_USB_GSPCA_SONIXB is not set
-# CONFIG_USB_GSPCA_SONIXJ is not set
-# CONFIG_USB_GSPCA_SPCA500 is not set
-# CONFIG_USB_GSPCA_SPCA501 is not set
-# CONFIG_USB_GSPCA_SPCA505 is not set
-# CONFIG_USB_GSPCA_SPCA506 is not set
-# CONFIG_USB_GSPCA_SPCA508 is not set
-# CONFIG_USB_GSPCA_SPCA561 is not set
-# CONFIG_USB_GSPCA_STK014 is not set
-# CONFIG_USB_GSPCA_SUNPLUS is not set
-# CONFIG_USB_GSPCA_T613 is not set
-# CONFIG_USB_GSPCA_TV8532 is not set
-# CONFIG_USB_GSPCA_VC032X is not set
-# CONFIG_USB_GSPCA_ZC3XX is not set
-# CONFIG_VIDEO_PVRUSB2 is not set
-# CONFIG_VIDEO_EM28XX is not set
-# CONFIG_VIDEO_USBVISION is not set
-CONFIG_VIDEO_USBVIDEO=m
-CONFIG_USB_VICAM=m
-CONFIG_USB_IBMCAM=m
-CONFIG_USB_KONICAWC=m
-# CONFIG_USB_QUICKCAM_MESSENGER is not set
-# CONFIG_USB_ET61X251 is not set
-# CONFIG_VIDEO_OVCAMCHIP is not set
-CONFIG_USB_OV511=m
-CONFIG_USB_SE401=m
-CONFIG_USB_SN9C102=m
-CONFIG_USB_STV680=m
-# CONFIG_USB_ZC0301 is not set
-# CONFIG_USB_PWC is not set
-# CONFIG_USB_ZR364XX is not set
-# CONFIG_USB_STKWEBCAM is not set
-# CONFIG_USB_S2255 is not set
-CONFIG_RADIO_ADAPTERS=y
-CONFIG_USB_DSBR=m
-# CONFIG_USB_SI470X is not set
-# CONFIG_USB_MR800 is not set
-CONFIG_DAB=y
-CONFIG_USB_DABUSB=m
-
-#
-# Graphics support
-#
-# CONFIG_VGASTATE is not set
-# CONFIG_VIDEO_OUTPUT_CONTROL is not set
CONFIG_FB=y
-# CONFIG_FIRMWARE_EDID is not set
-# CONFIG_FB_DDC is not set
-# CONFIG_FB_BOOT_VESA_SUPPORT is not set
-CONFIG_FB_CFB_FILLRECT=y
-CONFIG_FB_CFB_COPYAREA=y
-CONFIG_FB_CFB_IMAGEBLIT=y
-# CONFIG_FB_CFB_REV_PIXELS_IN_BYTE is not set
-# CONFIG_FB_SYS_FILLRECT is not set
-# CONFIG_FB_SYS_COPYAREA is not set
-# CONFIG_FB_SYS_IMAGEBLIT is not set
-# CONFIG_FB_FOREIGN_ENDIAN is not set
-# CONFIG_FB_SYS_FOPS is not set
-# CONFIG_FB_SVGALIB is not set
-# CONFIG_FB_MACMODES is not set
-# CONFIG_FB_BACKLIGHT is not set
-# CONFIG_FB_MODE_HELPERS is not set
-# CONFIG_FB_TILEBLITTING is not set
-
-#
-# Frame buffer hardware drivers
-#
-# CONFIG_FB_S1D13XXX is not set
-# CONFIG_FB_PXA is not set
-# CONFIG_FB_MBX is not set
-# CONFIG_FB_W100 is not set
CONFIG_FB_TMIO=y
-CONFIG_FB_TMIO_ACCELL=y
-# CONFIG_FB_VIRTUAL is not set
-# CONFIG_FB_METRONOME is not set
-# CONFIG_FB_MB862XX is not set
CONFIG_BACKLIGHT_LCD_SUPPORT=y
CONFIG_LCD_CLASS_DEVICE=y
-# CONFIG_LCD_CORGI is not set
-# CONFIG_LCD_LTV350QV is not set
-# CONFIG_LCD_ILI9320 is not set
-# CONFIG_LCD_TDO24M is not set
-# CONFIG_LCD_VGG2432A4 is not set
-# CONFIG_LCD_PLATFORM is not set
CONFIG_LCD_TOSA=y
CONFIG_BACKLIGHT_CLASS_DEVICE=y
-# CONFIG_BACKLIGHT_CORGI is not set
CONFIG_BACKLIGHT_TOSA=y
-
-#
-# Display device support
-#
-# CONFIG_DISPLAY_SUPPORT is not set
-
-#
-# Console display driver support
-#
-# CONFIG_VGA_CONSOLE is not set
-CONFIG_DUMMY_CONSOLE=y
+CONFIG_DISPLAY_SUPPORT=y
CONFIG_FRAMEBUFFER_CONSOLE=y
-# CONFIG_FRAMEBUFFER_CONSOLE_DETECT_PRIMARY is not set
-# CONFIG_FRAMEBUFFER_CONSOLE_ROTATION is not set
CONFIG_FONTS=y
-CONFIG_FONT_8x8=y
-# CONFIG_FONT_8x16 is not set
-# CONFIG_FONT_6x11 is not set
-# CONFIG_FONT_7x14 is not set
-# CONFIG_FONT_PEARL_8x8 is not set
-# CONFIG_FONT_ACORN_8x8 is not set
-# CONFIG_FONT_MINI_4x6 is not set
-# CONFIG_FONT_SUN8x16 is not set
-# CONFIG_FONT_SUN12x22 is not set
-# CONFIG_FONT_10x18 is not set
-# CONFIG_LOGO is not set
-CONFIG_SOUND=y
-CONFIG_SOUND_OSS_CORE=y
-CONFIG_SND=y
-CONFIG_SND_TIMER=y
-CONFIG_SND_PCM=y
-CONFIG_SND_HWDEP=m
-CONFIG_SND_RAWMIDI=m
-# CONFIG_SND_SEQUENCER is not set
-CONFIG_SND_OSSEMUL=y
+CONFIG_FONT_8x16=y
+CONFIG_LOGO=y
+# CONFIG_LOGO_LINUX_MONO is not set
+# CONFIG_LOGO_LINUX_VGA16 is not set
+CONFIG_SOUND=m
+CONFIG_SND=m
+CONFIG_SND_SEQUENCER=m
CONFIG_SND_MIXER_OSS=m
CONFIG_SND_PCM_OSS=m
-CONFIG_SND_PCM_OSS_PLUGINS=y
-# 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
-CONFIG_SND_VMASTER=y
-CONFIG_SND_AC97_CODEC=y
-CONFIG_SND_DRIVERS=y
-CONFIG_SND_DUMMY=m
-# CONFIG_SND_MTPAV is not set
-# CONFIG_SND_SERIAL_U16550 is not set
-# CONFIG_SND_MPU401 is not set
-# CONFIG_SND_AC97_POWER_SAVE is not set
-CONFIG_SND_ARM=y
-CONFIG_SND_PXA2XX_LIB=y
-CONFIG_SND_PXA2XX_LIB_AC97=y
-# CONFIG_SND_PXA2XX_AC97 is not set
-CONFIG_SND_SPI=y
-CONFIG_SND_USB=y
+CONFIG_SND_PXA2XX_AC97=m
CONFIG_SND_USB_AUDIO=m
-# CONFIG_SND_USB_CAIAQ is not set
-CONFIG_SND_PCMCIA=y
-# CONFIG_SND_VXPOCKET is not set
-# CONFIG_SND_PDAUDIOCF is not set
-CONFIG_SND_SOC=y
-CONFIG_SND_SOC_AC97_BUS=y
-CONFIG_SND_PXA2XX_SOC=y
-CONFIG_SND_PXA2XX_SOC_AC97=y
-CONFIG_SND_PXA2XX_SOC_TOSA=y
-# CONFIG_SND_SOC_ALL_CODECS is not set
-CONFIG_SND_SOC_WM9712=y
-# CONFIG_SOUND_PRIME is not set
-CONFIG_AC97_BUS=y
-CONFIG_HID_SUPPORT=y
+CONFIG_SND_SOC=m
+CONFIG_SND_PXA2XX_SOC=m
+CONFIG_SND_PXA2XX_SOC_TOSA=m
CONFIG_HID=m
-# CONFIG_HID_DEBUG is not set
-# CONFIG_HIDRAW is not set
-
-#
-# USB Input Devices
-#
-CONFIG_USB_HID=m
-# CONFIG_HID_PID is not set
-# CONFIG_USB_HIDDEV is not set
-
-#
-# USB HID Boot Protocol drivers
-#
-# CONFIG_USB_KBD is not set
-# CONFIG_USB_MOUSE is not set
-
-#
-# Special HID drivers
-#
-CONFIG_HID_COMPAT=y
-CONFIG_HID_A4TECH=m
-CONFIG_HID_APPLE=m
-CONFIG_HID_BELKIN=m
-CONFIG_HID_BRIGHT=m
-CONFIG_HID_CHERRY=m
-CONFIG_HID_CHICONY=m
-CONFIG_HID_CYPRESS=m
-CONFIG_HID_DELL=m
-CONFIG_HID_EZKEY=m
-CONFIG_HID_GYRATION=m
-CONFIG_HID_LOGITECH=m
-# CONFIG_LOGITECH_FF is not set
-# CONFIG_LOGIRUMBLEPAD2_FF is not set
-CONFIG_HID_MICROSOFT=m
-CONFIG_HID_MONTEREY=m
-CONFIG_HID_PANTHERLORD=m
-# CONFIG_PANTHERLORD_FF is not set
-CONFIG_HID_PETALYNX=m
-CONFIG_HID_SAMSUNG=m
-CONFIG_HID_SONY=m
-CONFIG_HID_SUNPLUS=m
-# CONFIG_THRUSTMASTER_FF is not set
-# CONFIG_ZEROPLUS_FF is not set
-CONFIG_USB_SUPPORT=y
-CONFIG_USB_ARCH_HAS_HCD=y
-CONFIG_USB_ARCH_HAS_OHCI=y
-# CONFIG_USB_ARCH_HAS_EHCI is not set
+CONFIG_USB_KBD=m
+CONFIG_USB_MOUSE=m
CONFIG_USB=m
-# CONFIG_USB_DEBUG is not set
-# CONFIG_USB_ANNOUNCE_NEW_DEVICES is not set
-
-#
-# Miscellaneous USB options
-#
+CONFIG_USB_DEBUG=y
+CONFIG_USB_ANNOUNCE_NEW_DEVICES=y
CONFIG_USB_DEVICEFS=y
-CONFIG_USB_DEVICE_CLASS=y
-# CONFIG_USB_DYNAMIC_MINORS is not set
-# CONFIG_USB_SUSPEND is not set
-# CONFIG_USB_OTG is not set
-# CONFIG_USB_OTG_WHITELIST is not set
-# CONFIG_USB_OTG_BLACKLIST_HUB is not set
-CONFIG_USB_MON=y
-# CONFIG_USB_WUSB is not set
-# CONFIG_USB_WUSB_CBAF is not set
-
-#
-# USB Host Controller Drivers
-#
-# CONFIG_USB_C67X00_HCD is not set
-# CONFIG_USB_ISP116X_HCD is not set
-CONFIG_USB_OHCI_HCD=m
-# 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_OTG_WHITELIST=y
+CONFIG_USB_MON=m
CONFIG_USB_SL811_HCD=m
CONFIG_USB_SL811_CS=m
-# CONFIG_USB_R8A66597_HCD is not set
-# CONFIG_USB_HWA_HCD is not set
-# CONFIG_USB_MUSB_HDRC is not set
-# CONFIG_USB_GADGET_MUSB_HDRC is not set
-
-#
-# USB Device Class drivers
-#
CONFIG_USB_ACM=m
CONFIG_USB_PRINTER=m
-# CONFIG_USB_WDM is not set
-# CONFIG_USB_TMC is not set
-
-#
-# NOTE: USB_STORAGE depends on SCSI but BLK_DEV_SD may also be needed;
-#
-
-#
-# see USB_STORAGE Help for more information
-#
CONFIG_USB_STORAGE=m
-# CONFIG_USB_STORAGE_DEBUG is not set
-# CONFIG_USB_STORAGE_DATAFAB is not set
-# CONFIG_USB_STORAGE_FREECOM is not set
-# CONFIG_USB_STORAGE_ISD200 is not set
-# CONFIG_USB_STORAGE_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_ONETOUCH is not set
-# CONFIG_USB_STORAGE_KARMA is not set
-# CONFIG_USB_STORAGE_CYPRESS_ATACB is not set
-# CONFIG_USB_LIBUSUAL is not set
-
-#
-# USB Imaging devices
-#
CONFIG_USB_MDC800=m
CONFIG_USB_MICROTEK=m
-
-#
-# USB port drivers
-#
CONFIG_USB_SERIAL=m
-CONFIG_USB_EZUSB=y
CONFIG_USB_SERIAL_GENERIC=y
-# CONFIG_USB_SERIAL_AIRCABLE is not set
-# CONFIG_USB_SERIAL_ARK3116 is not set
CONFIG_USB_SERIAL_BELKIN=m
-# CONFIG_USB_SERIAL_CH341 is not set
-# CONFIG_USB_SERIAL_WHITEHEAT is not set
CONFIG_USB_SERIAL_DIGI_ACCELEPORT=m
-CONFIG_USB_SERIAL_CP2101=m
CONFIG_USB_SERIAL_CYPRESS_M8=m
CONFIG_USB_SERIAL_EMPEG=m
CONFIG_USB_SERIAL_FTDI_SIO=m
-# CONFIG_USB_SERIAL_FUNSOFT is not set
CONFIG_USB_SERIAL_VISOR=m
CONFIG_USB_SERIAL_IPAQ=m
CONFIG_USB_SERIAL_IR=m
@@ -1461,342 +248,79 @@ CONFIG_USB_SERIAL_EDGEPORT=m
CONFIG_USB_SERIAL_EDGEPORT_TI=m
CONFIG_USB_SERIAL_GARMIN=m
CONFIG_USB_SERIAL_IPW=m
-# CONFIG_USB_SERIAL_IUU is not set
CONFIG_USB_SERIAL_KEYSPAN_PDA=m
CONFIG_USB_SERIAL_KEYSPAN=m
-# CONFIG_USB_SERIAL_KEYSPAN_MPR is not set
-# CONFIG_USB_SERIAL_KEYSPAN_USA28 is not set
-# CONFIG_USB_SERIAL_KEYSPAN_USA28X is not set
-# CONFIG_USB_SERIAL_KEYSPAN_USA28XA is not set
-# CONFIG_USB_SERIAL_KEYSPAN_USA28XB is not set
-# CONFIG_USB_SERIAL_KEYSPAN_USA19 is not set
-# CONFIG_USB_SERIAL_KEYSPAN_USA18X is not set
-# CONFIG_USB_SERIAL_KEYSPAN_USA19W is not set
-# CONFIG_USB_SERIAL_KEYSPAN_USA19QW is not set
-# CONFIG_USB_SERIAL_KEYSPAN_USA19QI is not set
-# CONFIG_USB_SERIAL_KEYSPAN_USA49W is not set
-# CONFIG_USB_SERIAL_KEYSPAN_USA49WLC is not set
CONFIG_USB_SERIAL_KLSI=m
CONFIG_USB_SERIAL_KOBIL_SCT=m
CONFIG_USB_SERIAL_MCT_U232=m
-# CONFIG_USB_SERIAL_MOS7720 is not set
-# CONFIG_USB_SERIAL_MOS7840 is not set
-# CONFIG_USB_SERIAL_MOTOROLA is not set
-# CONFIG_USB_SERIAL_NAVMAN is not set
CONFIG_USB_SERIAL_PL2303=m
-# CONFIG_USB_SERIAL_OTI6858 is not set
-# CONFIG_USB_SERIAL_SPCP8X5 is not set
-# CONFIG_USB_SERIAL_HP4X is not set
CONFIG_USB_SERIAL_SAFE=m
-# CONFIG_USB_SERIAL_SAFE_PADDED is not set
-# CONFIG_USB_SERIAL_SIERRAWIRELESS is not set
CONFIG_USB_SERIAL_TI=m
CONFIG_USB_SERIAL_CYBERJACK=m
CONFIG_USB_SERIAL_XIRCOM=m
-# CONFIG_USB_SERIAL_OPTION is not set
CONFIG_USB_SERIAL_OMNINET=m
-# CONFIG_USB_SERIAL_DEBUG is not set
-
-#
-# USB Miscellaneous drivers
-#
CONFIG_USB_EMI62=m
CONFIG_USB_EMI26=m
-# CONFIG_USB_ADUTUX is not set
-# CONFIG_USB_SEVSEG is not set
CONFIG_USB_RIO500=m
CONFIG_USB_LEGOTOWER=m
CONFIG_USB_LCD=m
-# CONFIG_USB_BERRY_CHARGE is not set
CONFIG_USB_LED=m
-# CONFIG_USB_CYPRESS_CY7C63 is not set
CONFIG_USB_CYTHERM=m
-# CONFIG_USB_PHIDGET is not set
CONFIG_USB_IDMOUSE=m
-# 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
-# CONFIG_USB_ISIGHTFW is not set
-# CONFIG_USB_VST is not set
CONFIG_USB_GADGET=m
-# CONFIG_USB_GADGET_DEBUG_FILES is not set
-CONFIG_USB_GADGET_VBUS_DRAW=2
-CONFIG_USB_GADGET_SELECTED=y
-# CONFIG_USB_GADGET_AT91 is not set
-# CONFIG_USB_GADGET_ATMEL_USBA is not set
-# CONFIG_USB_GADGET_FSL_USB2 is not set
-# CONFIG_USB_GADGET_LH7A40X is not set
-# CONFIG_USB_GADGET_OMAP is not set
-CONFIG_USB_GADGET_PXA25X=y
-CONFIG_USB_PXA25X=m
-# CONFIG_USB_PXA25X_SMALL is not set
-# CONFIG_USB_GADGET_PXA27X is not set
-# CONFIG_USB_GADGET_S3C2410 is not set
-# CONFIG_USB_GADGET_M66592 is not set
-# CONFIG_USB_GADGET_AMD5536UDC is not set
-# CONFIG_USB_GADGET_FSL_QE is not set
-# CONFIG_USB_GADGET_NET2280 is not set
-# CONFIG_USB_GADGET_GOKU is not set
-# CONFIG_USB_GADGET_DUMMY_HCD is not set
-# CONFIG_USB_GADGET_DUALSPEED is not set
+CONFIG_USB_GADGET_DEBUG_FILES=y
+CONFIG_USB_GADGET_DEBUG_FS=y
CONFIG_USB_ZERO=m
CONFIG_USB_ETH=m
-CONFIG_USB_ETH_RNDIS=y
+CONFIG_USB_ETH_EEM=y
CONFIG_USB_GADGETFS=m
CONFIG_USB_FILE_STORAGE=m
-# CONFIG_USB_FILE_STORAGE_TEST is not set
+CONFIG_USB_MASS_STORAGE=m
CONFIG_USB_G_SERIAL=m
-# CONFIG_USB_MIDI_GADGET is not set
-# CONFIG_USB_G_PRINTER is not set
-# CONFIG_USB_CDC_COMPOSITE is not set
+CONFIG_USB_CDC_COMPOSITE=m
+CONFIG_USB_G_MULTI=m
+CONFIG_USB_G_MULTI_CDC=y
+CONFIG_USB_GPIO_VBUS=m
+CONFIG_USB_ULPI=y
+CONFIG_NOP_USB_XCEIV=m
CONFIG_MMC=y
-# CONFIG_MMC_DEBUG is not set
CONFIG_MMC_UNSAFE_RESUME=y
-
-#
-# MMC/SD/SDIO Card Drivers
-#
-CONFIG_MMC_BLOCK=y
-CONFIG_MMC_BLOCK_BOUNCE=y
-CONFIG_SDIO_UART=m
-# CONFIG_MMC_TEST is not set
-
-#
-# MMC/SD/SDIO Host Controller Drivers
-#
CONFIG_MMC_PXA=y
-# CONFIG_MMC_SDHCI is not set
-# CONFIG_MMC_SPI is not set
-# CONFIG_MMC_TMIO is not set
-# CONFIG_MEMSTICK is not set
-# CONFIG_ACCESSIBILITY is not set
+CONFIG_MMC_SPI=y
CONFIG_NEW_LEDS=y
CONFIG_LEDS_CLASS=y
-
-#
-# LED drivers
-#
-# CONFIG_LEDS_PCA9532 is not set
-# CONFIG_LEDS_GPIO is not set
-# CONFIG_LEDS_PCA955X is not set
-
-#
-# LED Triggers
-#
+CONFIG_LEDS_GPIO=y
CONFIG_LEDS_TRIGGERS=y
-CONFIG_LEDS_TRIGGER_TIMER=m
-CONFIG_LEDS_TRIGGER_IDE_DISK=y
-# CONFIG_LEDS_TRIGGER_HEARTBEAT is not set
-# CONFIG_LEDS_TRIGGER_BACKLIGHT is not set
-# CONFIG_LEDS_TRIGGER_DEFAULT_ON 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 is not set
-# CONFIG_RTC_DRV_DS1374 is not set
-# CONFIG_RTC_DRV_DS1672 is not set
-# CONFIG_RTC_DRV_MAX6900 is not set
-# CONFIG_RTC_DRV_RS5C372 is not set
-# CONFIG_RTC_DRV_ISL1208 is not set
-# CONFIG_RTC_DRV_X1205 is not set
-# CONFIG_RTC_DRV_PCF8563 is not set
-# CONFIG_RTC_DRV_PCF8583 is not set
-# CONFIG_RTC_DRV_M41T80 is not set
-# CONFIG_RTC_DRV_S35390A is not set
-# CONFIG_RTC_DRV_FM3130 is not set
-# CONFIG_RTC_DRV_RX8581 is not set
-
-#
-# SPI RTC drivers
-#
-# CONFIG_RTC_DRV_M41T94 is not set
-# CONFIG_RTC_DRV_DS1305 is not set
-# CONFIG_RTC_DRV_DS1390 is not set
-# CONFIG_RTC_DRV_MAX6902 is not set
-# CONFIG_RTC_DRV_R9701 is not set
-# CONFIG_RTC_DRV_RS5C348 is not set
-# CONFIG_RTC_DRV_DS3234 is not set
-
-#
-# Platform RTC drivers
-#
-# CONFIG_RTC_DRV_CMOS is not set
-# CONFIG_RTC_DRV_DS1286 is not set
-# CONFIG_RTC_DRV_DS1511 is not set
-# CONFIG_RTC_DRV_DS1553 is not set
-# CONFIG_RTC_DRV_DS1742 is not set
-# CONFIG_RTC_DRV_STK17TA8 is not set
-# CONFIG_RTC_DRV_M48T86 is not set
-# CONFIG_RTC_DRV_M48T35 is not set
-# CONFIG_RTC_DRV_M48T59 is not set
-# CONFIG_RTC_DRV_BQ4802 is not set
-# CONFIG_RTC_DRV_V3020 is not set
-
-#
-# on-CPU RTC drivers
-#
-CONFIG_RTC_DRV_SA1100=y
-# CONFIG_DMADEVICES is not set
-# CONFIG_REGULATOR is not set
-# CONFIG_UIO is not set
-
-#
-# File systems
-#
+CONFIG_LEDS_TRIGGER_TIMER=y
+CONFIG_LEDS_TRIGGER_HEARTBEAT=y
+CONFIG_RTC_CLASS=m
+CONFIG_RTC_DRV_SA1100=m
+CONFIG_RTC_DRV_PXA=m
CONFIG_EXT2_FS=y
-# CONFIG_EXT2_FS_XATTR is not set
-# CONFIG_EXT2_FS_XIP is not set
CONFIG_EXT3_FS=y
+# CONFIG_EXT3_DEFAULTS_TO_ORDERED is not set
# CONFIG_EXT3_FS_XATTR is not set
-# CONFIG_EXT4_FS 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_FILE_LOCKING=y
-# CONFIG_XFS_FS is not set
-# CONFIG_OCFS2_FS is not set
-CONFIG_DNOTIFY=y
-CONFIG_INOTIFY=y
-CONFIG_INOTIFY_USER=y
-# CONFIG_QUOTA is not set
-# CONFIG_AUTOFS_FS is not set
-# CONFIG_AUTOFS4_FS is not set
-CONFIG_FUSE_FS=m
-
-#
-# CD-ROM/DVD Filesystems
-#
-CONFIG_ISO9660_FS=m
-CONFIG_JOLIET=y
-# CONFIG_ZISOFS is not set
-# CONFIG_UDF_FS is not set
-
-#
-# DOS/FAT/NT Filesystems
-#
-CONFIG_FAT_FS=m
-CONFIG_MSDOS_FS=m
-CONFIG_VFAT_FS=m
-CONFIG_FAT_DEFAULT_CODEPAGE=437
-CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1"
-# CONFIG_NTFS_FS is not set
-
-#
-# Pseudo filesystems
-#
-CONFIG_PROC_FS=y
-CONFIG_PROC_SYSCTL=y
-CONFIG_PROC_PAGE_MONITOR=y
-CONFIG_SYSFS=y
+CONFIG_EXT4_FS=y
+CONFIG_VFAT_FS=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_TMPFS_POSIX_ACL=y
CONFIG_JFFS2_FS=y
-CONFIG_JFFS2_FS_DEBUG=0
-CONFIG_JFFS2_FS_WRITEBUFFER=y
-# CONFIG_JFFS2_FS_WBUF_VERIFY is not set
CONFIG_JFFS2_SUMMARY=y
-# CONFIG_JFFS2_FS_XATTR is not set
CONFIG_JFFS2_COMPRESSION_OPTIONS=y
-CONFIG_JFFS2_ZLIB=y
CONFIG_JFFS2_LZO=y
-CONFIG_JFFS2_RTIME=y
CONFIG_JFFS2_RUBIN=y
-# CONFIG_JFFS2_CMODE_NONE is not set
-CONFIG_JFFS2_CMODE_PRIORITY=y
-# CONFIG_JFFS2_CMODE_SIZE is not set
-# CONFIG_JFFS2_CMODE_FAVOURLZO is not set
+CONFIG_UBIFS_FS=y
+CONFIG_UBIFS_FS_ADVANCED_COMPR=y
CONFIG_CRAMFS=m
-# CONFIG_VXFS_FS is not set
-# CONFIG_MINIX_FS is not set
-# CONFIG_OMFS_FS is not set
-# CONFIG_HPFS_FS is not set
-# CONFIG_QNX4FS_FS is not set
-# CONFIG_ROMFS_FS is not set
-# CONFIG_SYSV_FS is not set
-# CONFIG_UFS_FS is not set
-CONFIG_NETWORK_FILESYSTEMS=y
CONFIG_NFS_FS=m
CONFIG_NFS_V3=y
-# CONFIG_NFS_V3_ACL is not set
CONFIG_NFS_V4=y
-# CONFIG_NFSD is not set
-CONFIG_LOCKD=m
-CONFIG_LOCKD_V4=y
-CONFIG_NFS_COMMON=y
-CONFIG_SUNRPC=m
-CONFIG_SUNRPC_GSS=m
-# CONFIG_SUNRPC_REGISTER_V4 is not set
-CONFIG_RPCSEC_GSS_KRB5=m
-# CONFIG_RPCSEC_GSS_SPKM3 is not set
-CONFIG_SMB_FS=m
-CONFIG_SMB_NLS_DEFAULT=y
-CONFIG_SMB_NLS_REMOTE="cp437"
+CONFIG_NFSD=m
+CONFIG_NFSD_V4=y
CONFIG_CIFS=m
-# CONFIG_CIFS_STATS is not set
-# CONFIG_CIFS_WEAK_PW_HASH is not set
-# CONFIG_CIFS_XATTR is not set
-# CONFIG_CIFS_DEBUG2 is not set
-# CONFIG_CIFS_EXPERIMENTAL 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=m
CONFIG_NLS_DEFAULT="cp437"
-CONFIG_NLS_CODEPAGE_437=m
+CONFIG_NLS_CODEPAGE_437=y
CONFIG_NLS_CODEPAGE_737=m
CONFIG_NLS_CODEPAGE_775=m
CONFIG_NLS_CODEPAGE_850=m
@@ -1820,7 +344,7 @@ CONFIG_NLS_ISO8859_8=m
CONFIG_NLS_CODEPAGE_1250=m
CONFIG_NLS_CODEPAGE_1251=m
CONFIG_NLS_ASCII=m
-CONFIG_NLS_ISO8859_1=m
+CONFIG_NLS_ISO8859_1=y
CONFIG_NLS_ISO8859_2=m
CONFIG_NLS_ISO8859_3=m
CONFIG_NLS_ISO8859_4=m
@@ -1833,156 +357,25 @@ CONFIG_NLS_ISO8859_14=m
CONFIG_NLS_ISO8859_15=m
CONFIG_NLS_KOI8_R=m
CONFIG_NLS_KOI8_U=m
-CONFIG_NLS_UTF8=m
-# CONFIG_DLM is not set
-
-#
-# Kernel hacking
-#
-# CONFIG_PRINTK_TIME is not set
-CONFIG_ENABLE_WARN_DEPRECATED=y
-CONFIG_ENABLE_MUST_CHECK=y
-CONFIG_FRAME_WARN=1024
+CONFIG_NLS_UTF8=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 is not set
-# CONFIG_DEBUG_BUGVERBOSE is not set
-# CONFIG_DEBUG_MEMORY_INIT is not set
-CONFIG_FRAME_POINTER=y
-# CONFIG_RCU_CPU_STALL_DETECTOR is not set
-# CONFIG_LATENCYTOP is not set
-# CONFIG_SYSCTL_SYSCALL_CHECK is not set
-CONFIG_HAVE_FUNCTION_TRACER=y
-
-#
-# Tracers
-#
-# CONFIG_DYNAMIC_PRINTK_DEBUG is not set
-# CONFIG_SAMPLES is not set
-CONFIG_HAVE_ARCH_KGDB=y
-# CONFIG_DEBUG_USER is not set
-
-#
-# Security options
-#
-# CONFIG_KEYS is not set
-# CONFIG_SECURITY is not set
-# CONFIG_SECURITYFS is not set
-# CONFIG_SECURITY_FILE_CAPABILITIES is not set
-CONFIG_CRYPTO=y
-
-#
-# Crypto core or helper
-#
-# CONFIG_CRYPTO_FIPS is not set
-CONFIG_CRYPTO_ALGAPI=m
-CONFIG_CRYPTO_ALGAPI2=m
-CONFIG_CRYPTO_AEAD=m
-CONFIG_CRYPTO_AEAD2=m
-CONFIG_CRYPTO_BLKCIPHER=m
-CONFIG_CRYPTO_BLKCIPHER2=m
-CONFIG_CRYPTO_HASH=m
-CONFIG_CRYPTO_HASH2=m
-CONFIG_CRYPTO_RNG2=m
-CONFIG_CRYPTO_MANAGER=m
-CONFIG_CRYPTO_MANAGER2=m
-# CONFIG_CRYPTO_GF128MUL is not set
+CONFIG_DEBUG_FS=y
+CONFIG_SYSCTL_SYSCALL_CHECK=y
CONFIG_CRYPTO_NULL=m
-# CONFIG_CRYPTO_CRYPTD is not set
-CONFIG_CRYPTO_AUTHENC=m
CONFIG_CRYPTO_TEST=m
-
-#
-# Authenticated Encryption with Associated Data
-#
-# CONFIG_CRYPTO_CCM is not set
-# CONFIG_CRYPTO_GCM is not set
-# CONFIG_CRYPTO_SEQIV is not set
-
-#
-# Block modes
-#
-CONFIG_CRYPTO_CBC=m
-# CONFIG_CRYPTO_CTR is not set
-# CONFIG_CRYPTO_CTS is not set
-CONFIG_CRYPTO_ECB=m
-# CONFIG_CRYPTO_LRW is not set
-# CONFIG_CRYPTO_PCBC is not set
-# CONFIG_CRYPTO_XTS is not set
-
-#
-# Hash modes
-#
-CONFIG_CRYPTO_HMAC=m
-# CONFIG_CRYPTO_XCBC is not set
-
-#
-# Digest
-#
-CONFIG_CRYPTO_CRC32C=m
-CONFIG_CRYPTO_MD4=m
-CONFIG_CRYPTO_MD5=m
-CONFIG_CRYPTO_MICHAEL_MIC=m
-# CONFIG_CRYPTO_RMD128 is not set
-# CONFIG_CRYPTO_RMD160 is not set
-# CONFIG_CRYPTO_RMD256 is not set
-# CONFIG_CRYPTO_RMD320 is not set
-CONFIG_CRYPTO_SHA1=m
+CONFIG_CRYPTO_PCBC=m
CONFIG_CRYPTO_SHA256=m
CONFIG_CRYPTO_SHA512=m
-# CONFIG_CRYPTO_TGR192 is not set
CONFIG_CRYPTO_WP512=m
-
-#
-# Ciphers
-#
-CONFIG_CRYPTO_AES=m
CONFIG_CRYPTO_ANUBIS=m
-CONFIG_CRYPTO_ARC4=m
CONFIG_CRYPTO_BLOWFISH=m
-# CONFIG_CRYPTO_CAMELLIA is not set
+CONFIG_CRYPTO_CAMELLIA=m
CONFIG_CRYPTO_CAST5=m
CONFIG_CRYPTO_CAST6=m
-CONFIG_CRYPTO_DES=m
-# CONFIG_CRYPTO_FCRYPT is not set
CONFIG_CRYPTO_KHAZAD=m
-# CONFIG_CRYPTO_SALSA20 is not set
-# CONFIG_CRYPTO_SEED is not set
CONFIG_CRYPTO_SERPENT=m
CONFIG_CRYPTO_TEA=m
CONFIG_CRYPTO_TWOFISH=m
-CONFIG_CRYPTO_TWOFISH_COMMON=m
-
-#
-# Compression
-#
-CONFIG_CRYPTO_DEFLATE=m
-# CONFIG_CRYPTO_LZO is not set
-
-#
-# Random Number Generation
-#
-# CONFIG_CRYPTO_ANSI_CPRNG is not set
-CONFIG_CRYPTO_HW=y
-
-#
-# Library routines
-#
-CONFIG_BITREVERSE=y
-CONFIG_CRC_CCITT=m
-# CONFIG_CRC16 is not set
-# CONFIG_CRC_T10DIF is not set
-# CONFIG_CRC_ITU_T is not set
-CONFIG_CRC32=y
-# CONFIG_CRC7 is not set
+# CONFIG_CRYPTO_HW is not set
+CONFIG_CRC_CCITT=y
CONFIG_LIBCRC32C=m
-CONFIG_ZLIB_INFLATE=y
-CONFIG_ZLIB_DEFLATE=y
-CONFIG_LZO_COMPRESS=y
-CONFIG_LZO_DECOMPRESS=y
-CONFIG_PLIST=y
-CONFIG_HAS_IOMEM=y
-CONFIG_HAS_IOPORT=y
-CONFIG_HAS_DMA=y