Index: linux-2.6.16/arch/arm/boot/compressed/misc.c
===================================================================
--- linux-2.6.16.orig/arch/arm/boot/compressed/misc.c	2006-03-20 06:53:29.000000000 +0100
+++ linux-2.6.16/arch/arm/boot/compressed/misc.c	2007-04-12 10:36:19.000000000 +0200
@@ -22,6 +22,19 @@
 
 #include <asm/arch/uncompress.h>
 
+#include <linux/autoconf.h>
+
+#ifdef CONFIG_EFB_DEBUG
+# define SCREEN_W 240
+# define SCREEN_H 320
+#endif
+
+
+static unsigned short *vram = 0;
+static unsigned int current_pix = 0;
+static unsigned int y = 0;
+
+
 #ifdef STANDALONE_DEBUG
 #define putstr printf
 #endif
@@ -260,6 +273,38 @@
 	return inbuf[0];
 }
 
+#ifdef CONFIG_EFB_DEBUG
+/*
+ * put a new pixel. on the frame buffer
+ */
+static void putpix(void)
+{
+	if (current_pix  == SCREEN_W) {
+		current_pix = 0;
+	}
+	vram[current_pix] = 0xFFFF;
+	++current_pix;
+	vram[current_pix] = 0x0;
+	++current_pix;
+}
+
+/*
+ * clear the whole screen
+ */
+static void clear_screen(void)
+{
+	unsigned int i;
+	
+	vram = (unsigned short *)0x20001020;
+	current_pix = 0;
+	
+	for (i = 0; i < SCREEN_W * SCREEN_H; ++i) {
+		vram[i] = 0;
+	}
+}
+#endif
+
+
 /* ===========================================================================
  * Write the output window window[0..outcnt-1] and update crc and bytes_out.
  * (Used for the decompressed data only.)
@@ -280,7 +325,8 @@
 	bytes_out += (ulg)outcnt;
 	output_ptr += (ulg)outcnt;
 	outcnt = 0;
-	putstr(".");
+/* 	putstr("."); */
+	putpix();
 }
 
 #ifndef arch_error
@@ -291,7 +337,7 @@
 {
 	arch_error(x);
 
-	putstr("\n\n");
+/* 	putstr("\n\n"); */
 	putstr(x);
 	putstr("\n\n -- System halted");
 
@@ -309,12 +355,16 @@
 	free_mem_ptr_end	= free_mem_ptr_end_p;
 	__machine_arch_type	= arch_id;
 
+#ifdef CONFIG_EFB_DEBUG
+	clear_screen();
+#endif
+
 	arch_decomp_setup();
 
 	makecrc();
-	putstr("Uncompressing Linux...");
+/* 	putstr("Uncompressing Linux..."); */
 	gunzip();
-	putstr(" done, booting the kernel.\n");
+/* 	putstr(" done, booting the kernel.\n"); */
 	return output_ptr;
 }
 #else
Index: linux-2.6.16/arch/arm/configs/tornado_ccboot_defconfig
===================================================================
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
+++ linux-2.6.16/arch/arm/configs/tornado_ccboot_defconfig	2007-04-12 10:36:19.000000000 +0200
@@ -0,0 +1,797 @@
+#
+# Automatically generated make config: don't edit
+# Linux kernel version: 2.6.16.2-omap1
+# Tue Aug  1 01:17:51 2006
+#
+CONFIG_ARM=y
+CONFIG_MMU=y
+CONFIG_RWSEM_GENERIC_SPINLOCK=y
+CONFIG_GENERIC_CALIBRATE_DELAY=y
+
+#
+# Code maturity level options
+#
+CONFIG_EXPERIMENTAL=y
+CONFIG_BROKEN_ON_SMP=y
+CONFIG_LOCK_KERNEL=y
+CONFIG_INIT_ENV_ARG_LIMIT=32
+
+#
+# General setup
+#
+CONFIG_LOCALVERSION=""
+CONFIG_LOCALVERSION_AUTO=y
+CONFIG_SWAP=y
+# CONFIG_SYSVIPC is not set
+# CONFIG_POSIX_MQUEUE is not set
+# CONFIG_BSD_PROCESS_ACCT is not set
+# CONFIG_SYSCTL is not set
+# CONFIG_AUDIT is not set
+# CONFIG_IKCONFIG is not set
+CONFIG_INITRAMFS_SOURCE=""
+CONFIG_UID16=y
+CONFIG_CC_OPTIMIZE_FOR_SIZE=y
+CONFIG_EMBEDDED=y
+# CONFIG_KALLSYMS is not set
+CONFIG_HOTPLUG=y
+# CONFIG_PRINTK is not set
+# CONFIG_BUG is not set
+# CONFIG_ELF_CORE is not set
+# CONFIG_BASE_FULL is not set
+# CONFIG_FUTEX is not set
+# CONFIG_EPOLL is not set
+# CONFIG_SHMEM is not set
+CONFIG_CC_ALIGN_FUNCTIONS=0
+CONFIG_CC_ALIGN_LABELS=0
+CONFIG_CC_ALIGN_LOOPS=0
+CONFIG_CC_ALIGN_JUMPS=0
+CONFIG_SLAB=y
+CONFIG_TINY_SHMEM=y
+CONFIG_BASE_SMALL=1
+# CONFIG_SLOB is not set
+
+#
+# Loadable module support
+#
+# CONFIG_MODULES is not set
+
+#
+# Block layer
+#
+
+#
+# IO Schedulers
+#
+CONFIG_IOSCHED_NOOP=y
+# CONFIG_IOSCHED_AS is not set
+CONFIG_IOSCHED_DEADLINE=y
+# CONFIG_IOSCHED_CFQ is not set
+# CONFIG_DEFAULT_AS is not set
+CONFIG_DEFAULT_DEADLINE=y
+# CONFIG_DEFAULT_CFQ is not set
+# CONFIG_DEFAULT_NOOP is not set
+CONFIG_DEFAULT_IOSCHED="deadline"
+
+#
+# System Type
+#
+# CONFIG_ARCH_CLPS7500 is not set
+# CONFIG_ARCH_CLPS711X is not set
+# CONFIG_ARCH_CO285 is not set
+# CONFIG_ARCH_EBSA110 is not set
+# CONFIG_ARCH_FOOTBRIDGE is not set
+# CONFIG_ARCH_INTEGRATOR is not set
+# CONFIG_ARCH_IOP3XX is not set
+# CONFIG_ARCH_IXP4XX is not set
+# CONFIG_ARCH_IXP2000 is not set
+# CONFIG_ARCH_L7200 is not set
+# CONFIG_ARCH_PXA is not set
+# CONFIG_ARCH_RPC is not set
+# CONFIG_ARCH_SA1100 is not set
+# CONFIG_ARCH_S3C2410 is not set
+# CONFIG_ARCH_SHARK is not set
+# CONFIG_ARCH_LH7A40X is not set
+CONFIG_ARCH_OMAP=y
+# CONFIG_ARCH_VERSATILE is not set
+# CONFIG_ARCH_REALVIEW is not set
+# CONFIG_ARCH_IMX is not set
+# CONFIG_ARCH_H720X is not set
+# CONFIG_ARCH_AAEC2000 is not set
+# CONFIG_ARCH_AT91RM9200 is not set
+
+#
+# TI OMAP Implementations
+#
+CONFIG_ARCH_OMAP_OTG=y
+CONFIG_ARCH_OMAP1=y
+# CONFIG_ARCH_OMAP2 is not set
+
+#
+# OMAP Feature Selections
+#
+# CONFIG_OMAP_RESET_CLOCKS is not set
+# CONFIG_OMAP_BOOT_TAG is not set
+# CONFIG_OMAP_MUX is not set
+CONFIG_OMAP_MPU_TIMER=y
+# CONFIG_OMAP_32K_TIMER is not set
+CONFIG_OMAP_LL_DEBUG_UART1=y
+# CONFIG_OMAP_LL_DEBUG_UART2 is not set
+# CONFIG_OMAP_LL_DEBUG_UART3 is not set
+
+#
+# OMAP Core Type
+#
+CONFIG_ARCH_OMAP730=y
+# CONFIG_ARCH_OMAP15XX is not set
+# CONFIG_ARCH_OMAP16XX is not set
+
+#
+# OMAP Board Type
+#
+# CONFIG_MACH_OMAP_PERSEUS2 is not set
+
+#
+# OMAP CPU Speed
+#
+# CONFIG_OMAP_CLOCKS_SET_BY_BOOTLOADER is not set
+CONFIG_OMAP_ARM_195MHZ=y
+# CONFIG_OMAP_ARM_182MHZ is not set
+# CONFIG_OMAP_ARM_168MHZ is not set
+# CONFIG_OMAP_ARM_120MHZ is not set
+# CONFIG_OMAP_ARM_60MHZ is not set
+# CONFIG_OMAP_ARM_30MHZ is not set
+CONFIG_MACH_TORNADO=y
+CONFIG_EFB_DEBUG=y
+
+#
+# Processor Type
+#
+CONFIG_CPU_32=y
+CONFIG_CPU_ARM926T=y
+CONFIG_CPU_32v5=y
+CONFIG_CPU_ABRT_EV5TJ=y
+CONFIG_CPU_CACHE_VIVT=y
+CONFIG_CPU_COPY_V4WB=y
+CONFIG_CPU_TLB_V4WBI=y
+
+#
+# Processor Features
+#
+# CONFIG_ARM_THUMB is not set
+# CONFIG_CPU_ICACHE_DISABLE is not set
+# CONFIG_CPU_DCACHE_DISABLE is not set
+# CONFIG_CPU_DCACHE_WRITETHROUGH is not set
+# CONFIG_CPU_CACHE_ROUND_ROBIN is not set
+CONFIG_KEXEC=y
+
+#
+# Bus support
+#
+
+#
+# PCCARD (PCMCIA/CardBus) support
+#
+# CONFIG_PCCARD is not set
+
+#
+# Kernel Features
+#
+CONFIG_PREEMPT=y
+# CONFIG_NO_IDLE_HZ is not set
+# CONFIG_AEABI is not set
+# CONFIG_ARCH_DISCONTIGMEM_ENABLE is not set
+CONFIG_SELECT_MEMORY_MODEL=y
+CONFIG_FLATMEM_MANUAL=y
+# CONFIG_DISCONTIGMEM_MANUAL is not set
+# CONFIG_SPARSEMEM_MANUAL is not set
+CONFIG_FLATMEM=y
+CONFIG_FLAT_NODE_MEM_MAP=y
+# CONFIG_SPARSEMEM_STATIC is not set
+CONFIG_SPLIT_PTLOCK_CPUS=4096
+# CONFIG_LEDS is not set
+CONFIG_ALIGNMENT_TRAP=y
+
+#
+# Boot options
+#
+CONFIG_ZBOOT_ROM_TEXT=0x0
+CONFIG_ZBOOT_ROM_BSS=0x0
+CONFIG_CMDLINE=""
+# CONFIG_XIP_KERNEL is not set
+
+#
+# CPU Frequency scaling
+#
+# CONFIG_CPU_FREQ is not set
+
+#
+# Floating point emulation
+#
+
+#
+# At least one emulation must be selected
+#
+CONFIG_FPE_NWFPE=y
+# CONFIG_FPE_NWFPE_XP is not set
+# CONFIG_FPE_FASTFPE is not set
+# CONFIG_VFP is not set
+
+#
+# Userspace binary formats
+#
+CONFIG_BINFMT_ELF=y
+# CONFIG_BINFMT_AOUT is not set
+# CONFIG_BINFMT_MISC is not set
+# CONFIG_ARTHUR is not set
+
+#
+# Power management options
+#
+# CONFIG_PM is not set
+# CONFIG_APM is not set
+
+#
+# Networking
+#
+CONFIG_NET=y
+
+#
+# Networking options
+#
+# CONFIG_NETDEBUG is not set
+CONFIG_PACKET=y
+# CONFIG_PACKET_MMAP is not set
+CONFIG_UNIX=y
+CONFIG_XFRM=y
+# CONFIG_XFRM_USER is not set
+CONFIG_NET_KEY=y
+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 is not set
+# CONFIG_INET_AH is not set
+# CONFIG_INET_ESP is not set
+# CONFIG_INET_IPCOMP is not set
+# CONFIG_INET_TUNNEL is not set
+CONFIG_INET_DIAG=y
+CONFIG_INET_TCP_DIAG=y
+# CONFIG_TCP_CONG_ADVANCED is not set
+CONFIG_TCP_CONG_BIC=y
+# CONFIG_IPV6 is not set
+# CONFIG_NETFILTER is not set
+
+#
+# DCCP Configuration (EXPERIMENTAL)
+#
+# CONFIG_IP_DCCP is not set
+
+#
+# SCTP Configuration (EXPERIMENTAL)
+#
+# CONFIG_IP_SCTP is not set
+
+#
+# TIPC Configuration (EXPERIMENTAL)
+#
+# CONFIG_TIPC is not set
+# CONFIG_ATM is not set
+# CONFIG_BRIDGE is not set
+# CONFIG_VLAN_8021Q is not set
+# CONFIG_DECNET is not set
+# CONFIG_LLC2 is not set
+# CONFIG_IPX is not set
+# CONFIG_ATALK is not set
+# CONFIG_X25 is not set
+# CONFIG_LAPB is not set
+# CONFIG_NET_DIVERT is not set
+# CONFIG_ECONET is not set
+# CONFIG_WAN_ROUTER is not set
+
+#
+# QoS and/or fair queueing
+#
+# CONFIG_NET_SCHED is not set
+
+#
+# Network testing
+#
+# CONFIG_NET_PKTGEN is not set
+# CONFIG_HAMRADIO is not set
+# CONFIG_IRDA is not set
+# CONFIG_BT is not set
+# CONFIG_IEEE80211 is not set
+
+#
+# Device Drivers
+#
+
+#
+# Generic Driver Options
+#
+CONFIG_STANDALONE=y
+CONFIG_PREVENT_FIRMWARE_BUILD=y
+CONFIG_FW_LOADER=y
+# CONFIG_DEBUG_DRIVER is not set
+
+#
+# Connector - unified userspace <-> kernelspace linker
+#
+# CONFIG_CONNECTOR is not set
+
+#
+# Memory Technology Devices (MTD)
+#
+# CONFIG_MTD is not set
+
+#
+# Parallel port support
+#
+# CONFIG_PARPORT is not set
+
+#
+# Plug and Play support
+#
+
+#
+# Block devices
+#
+# CONFIG_BLK_DEV_COW_COMMON is not set
+# CONFIG_BLK_DEV_LOOP is not set
+# CONFIG_BLK_DEV_NBD is not set
+CONFIG_BLK_DEV_RAM=y
+CONFIG_BLK_DEV_RAM_COUNT=1
+CONFIG_BLK_DEV_RAM_SIZE=4096
+CONFIG_BLK_DEV_INITRD=y
+# CONFIG_CDROM_PKTCDVD is not set
+# CONFIG_ATA_OVER_ETH is not set
+
+#
+# SCSI device support
+#
+# CONFIG_RAID_ATTRS is not set
+# CONFIG_SCSI is not set
+
+#
+# Multi-device support (RAID and LVM)
+#
+# CONFIG_MD is not set
+
+#
+# Fusion MPT device support
+#
+# CONFIG_FUSION is not set
+
+#
+# IEEE 1394 (FireWire) support
+#
+
+#
+# I2O device support
+#
+
+#
+# Network device support
+#
+# CONFIG_NETDEVICES is not set
+# CONFIG_DUMMY is not set
+# CONFIG_BONDING is not set
+# CONFIG_EQUALIZER is not set
+# CONFIG_TUN is not set
+
+#
+# PHY device support
+#
+
+#
+# Ethernet (10 or 100Mbit)
+#
+# CONFIG_NET_ETHERNET is not set
+
+#
+# Ethernet (1000 Mbit)
+#
+
+#
+# Ethernet (10000 Mbit)
+#
+# CONFIG_PPP is not set
+# CONFIG_SLIP is not set
+# CONFIG_SHAPER is not set
+# CONFIG_NETCONSOLE is not set
+# CONFIG_NETPOLL is not set
+# CONFIG_NET_POLL_CONTROLLER is not set
+
+#
+# ISDN subsystem
+#
+# CONFIG_ISDN is not set
+
+#
+# Input device support
+#
+CONFIG_INPUT=y
+
+#
+# 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 is not set
+# CONFIG_INPUT_TSDEV is not set
+# CONFIG_INPUT_EVDEV is not set
+# CONFIG_INPUT_EVBUG is not set
+
+#
+# Input Device Drivers
+#
+CONFIG_INPUT_KEYBOARD=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_OMAP is not set
+CONFIG_TORNADO_KEYPAD=y
+# CONFIG_INPUT_MOUSE is not set
+# CONFIG_INPUT_JOYSTICK is not set
+# CONFIG_INPUT_TOUCHSCREEN is not set
+# CONFIG_INPUT_MISC is not set
+
+#
+# Hardware I/O ports
+#
+# CONFIG_SERIO is not set
+# CONFIG_GAMEPORT is not set
+
+#
+# Character devices
+#
+CONFIG_VT=y
+CONFIG_VT_CONSOLE=y
+CONFIG_HW_CONSOLE=y
+# CONFIG_SERIAL_NONSTANDARD is not set
+
+#
+# Serial drivers
+#
+# CONFIG_SERIAL_8250 is not set
+
+#
+# Non-8250 serial port support
+#
+CONFIG_UNIX98_PTYS=y
+CONFIG_LEGACY_PTYS=y
+CONFIG_LEGACY_PTY_COUNT=256
+
+#
+# IPMI
+#
+# CONFIG_IPMI_HANDLER is not set
+
+#
+# Watchdog Cards
+#
+CONFIG_WATCHDOG=y
+# CONFIG_WATCHDOG_NOWAYOUT is not set
+
+#
+# Watchdog Device Drivers
+#
+# CONFIG_SOFT_WATCHDOG is not set
+CONFIG_OMAP730_WATCHDOG=y
+CONFIG_TORNADO_VIBRATOR=y
+CONFIG_TORNADO_LEDS=y
+# CONFIG_NVRAM is not set
+# CONFIG_RTC is not set
+# CONFIG_OMAP_RTC is not set
+# CONFIG_DTLK is not set
+# CONFIG_R3964 is not set
+
+#
+# Ftape, the floppy tape device driver
+#
+# CONFIG_RAW_DRIVER is not set
+
+#
+# TPM devices
+#
+# CONFIG_TCG_TPM is not set
+# CONFIG_TELCLOCK is not set
+
+#
+# I2C support
+#
+# CONFIG_I2C is not set
+
+#
+# SPI support
+#
+# CONFIG_SPI is not set
+# CONFIG_SPI_MASTER is not set
+
+#
+# Dallas's 1-wire bus
+#
+# CONFIG_W1 is not set
+
+#
+# Hardware Monitoring support
+#
+# CONFIG_HWMON is not set
+# CONFIG_HWMON_VID is not set
+
+#
+# Misc devices
+#
+
+#
+# Multimedia Capabilities Port drivers
+#
+
+#
+# Multimedia devices
+#
+# CONFIG_VIDEO_DEV is not set
+
+#
+# Digital Video Broadcasting Devices
+#
+# CONFIG_DVB is not set
+
+#
+# Graphics support
+#
+CONFIG_FB=y
+CONFIG_FB_CFB_FILLRECT=y
+CONFIG_FB_CFB_COPYAREA=y
+CONFIG_FB_CFB_IMAGEBLIT=y
+# CONFIG_FB_MACMODES is not set
+# CONFIG_FB_MODE_HELPERS is not set
+# CONFIG_FB_TILEBLITTING is not set
+# CONFIG_FB_S1D13XXX is not set
+# CONFIG_FB_OMAP is not set
+CONFIG_FB_VSFB=y
+# CONFIG_FB_VIRTUAL is not set
+
+#
+# Console display driver support
+#
+# CONFIG_VGA_CONSOLE is not set
+CONFIG_DUMMY_CONSOLE=y
+CONFIG_FRAMEBUFFER_CONSOLE=y
+CONFIG_FRAMEBUFFER_CONSOLE_ROTATION=y
+CONFIG_FONTS=y
+# CONFIG_FONT_8x8 is not set
+# CONFIG_FONT_8x16 is not set
+CONFIG_FONT_6x11=y
+# 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
+
+#
+# Logo configuration
+#
+# CONFIG_LOGO is not set
+CONFIG_BACKLIGHT_LCD_SUPPORT=y
+CONFIG_BACKLIGHT_CLASS_DEVICE=y
+CONFIG_BACKLIGHT_DEVICE=y
+# CONFIG_LCD_CLASS_DEVICE is not set
+CONFIG_BACKLIGHT_TORNADO=y
+
+#
+# Sound
+#
+# CONFIG_SOUND is not set
+
+#
+# USB support
+#
+CONFIG_USB_ARCH_HAS_HCD=y
+CONFIG_USB_ARCH_HAS_OHCI=y
+# CONFIG_USB is not set
+
+#
+# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
+#
+
+#
+# USB Gadget Support
+#
+CONFIG_USB_GADGET=y
+CONFIG_USB_GADGET_DEBUG_FILES=y
+CONFIG_USB_GADGET_SELECTED=y
+# CONFIG_USB_GADGET_NET2280 is not set
+# CONFIG_USB_GADGET_PXA2XX is not set
+# CONFIG_USB_GADGET_GOKU is not set
+# CONFIG_USB_GADGET_LH7A40X is not set
+CONFIG_USB_GADGET_OMAP=y
+CONFIG_USB_OMAP=y
+# CONFIG_USB_GADGET_DUMMY_HCD is not set
+# CONFIG_USB_GADGET_DUALSPEED is not set
+# CONFIG_USB_ZERO is not set
+CONFIG_USB_ETH=y
+# CONFIG_USB_ETH_RNDIS is not set
+# CONFIG_USB_GADGETFS is not set
+# CONFIG_USB_FILE_STORAGE is not set
+# CONFIG_USB_G_SERIAL is not set
+
+#
+# MMC/SD Card support
+#
+CONFIG_MMC=y
+# CONFIG_MMC_DEBUG is not set
+CONFIG_MMC_BLOCK=y
+# CONFIG_MMC_BLOCK_BROKEN_RFD is not set
+# CONFIG_MMC_BULKTRANSFER is not set
+CONFIG_MMC_OMAP=y
+
+#
+# Synchronous Serial Interfaces (SSI)
+#
+# CONFIG_OMAP_UWIRE is not set
+# CONFIG_OMAP_TSC2101 is not set
+
+#
+# CBUS support
+#
+# CONFIG_CBUS is not set
+
+#
+# File systems
+#
+CONFIG_EXT2_FS=y
+# CONFIG_EXT2_FS_XATTR is not set
+# CONFIG_EXT2_FS_XIP is not set
+# CONFIG_EXT3_FS is not set
+# CONFIG_REISERFS_FS is not set
+# CONFIG_JFS_FS is not set
+# CONFIG_FS_POSIX_ACL is not set
+# CONFIG_XFS_FS is not set
+# CONFIG_OCFS2_FS is not set
+# CONFIG_MINIX_FS is not set
+CONFIG_ROMFS_FS=y
+# CONFIG_INOTIFY is not set
+# CONFIG_QUOTA is not set
+CONFIG_DNOTIFY=y
+# CONFIG_AUTOFS_FS is not set
+# CONFIG_AUTOFS4_FS is not set
+# CONFIG_FUSE_FS is not set
+
+#
+# CD-ROM/DVD Filesystems
+#
+# CONFIG_ISO9660_FS is not set
+# CONFIG_UDF_FS is not set
+
+#
+# DOS/FAT/NT Filesystems
+#
+# CONFIG_MSDOS_FS is not set
+# CONFIG_VFAT_FS is not set
+# CONFIG_NTFS_FS is not set
+
+#
+# Pseudo filesystems
+#
+CONFIG_PROC_FS=y
+CONFIG_SYSFS=y
+# CONFIG_TMPFS is not set
+# CONFIG_HUGETLB_PAGE is not set
+CONFIG_RAMFS=y
+# CONFIG_RELAYFS_FS is not set
+# CONFIG_CONFIGFS_FS is not set
+
+#
+# Miscellaneous filesystems
+#
+# CONFIG_ADFS_FS is not set
+# CONFIG_AFFS_FS is not set
+# CONFIG_HFS_FS is not set
+# CONFIG_HFSPLUS_FS is not set
+# CONFIG_BEFS_FS is not set
+# CONFIG_BFS_FS is not set
+# CONFIG_EFS_FS is not set
+# CONFIG_CRAMFS is not set
+# CONFIG_VXFS_FS is not set
+# CONFIG_HPFS_FS is not set
+# CONFIG_QNX4FS_FS is not set
+# CONFIG_SYSV_FS is not set
+# CONFIG_UFS_FS is not set
+
+#
+# Network File Systems
+#
+CONFIG_NFS_FS=y
+CONFIG_NFS_V3=y
+# CONFIG_NFS_V3_ACL is not set
+# CONFIG_NFS_V4 is not set
+# CONFIG_NFS_DIRECTIO is not set
+# CONFIG_NFSD is not set
+CONFIG_LOCKD=y
+CONFIG_LOCKD_V4=y
+CONFIG_NFS_COMMON=y
+CONFIG_SUNRPC=y
+# CONFIG_RPCSEC_GSS_KRB5 is not set
+# CONFIG_RPCSEC_GSS_SPKM3 is not set
+# CONFIG_SMB_FS is not set
+# CONFIG_CIFS is not set
+# CONFIG_NCP_FS is not set
+# CONFIG_CODA_FS is not set
+# CONFIG_AFS_FS is not set
+# CONFIG_9P_FS is not set
+
+#
+# Partition Types
+#
+# CONFIG_PARTITION_ADVANCED is not set
+CONFIG_MSDOS_PARTITION=y
+
+#
+# Native Language Support
+#
+# CONFIG_NLS is not set
+
+#
+# Profiling support
+#
+# CONFIG_PROFILING is not set
+
+#
+# Kernel hacking
+#
+# CONFIG_PRINTK_TIME is not set
+# CONFIG_MAGIC_SYSRQ is not set
+CONFIG_DEBUG_KERNEL=y
+CONFIG_LOG_BUF_SHIFT=14
+# CONFIG_DETECT_SOFTLOCKUP is not set
+# CONFIG_SCHEDSTATS is not set
+# CONFIG_DEBUG_SLAB is not set
+CONFIG_DEBUG_PREEMPT=y
+# CONFIG_DEBUG_MUTEXES is not set
+# CONFIG_DEBUG_SPINLOCK is not set
+# CONFIG_DEBUG_SPINLOCK_SLEEP is not set
+# CONFIG_DEBUG_KOBJECT is not set
+# CONFIG_DEBUG_INFO is not set
+# CONFIG_DEBUG_FS is not set
+# CONFIG_DEBUG_VM is not set
+CONFIG_FRAME_POINTER=y
+# CONFIG_FORCED_INLINING is not set
+# CONFIG_RCU_TORTURE_TEST is not set
+# CONFIG_DEBUG_USER is not set
+# CONFIG_DEBUG_WAITQ is not set
+CONFIG_DEBUG_ERRORS=y
+# CONFIG_DEBUG_LL is not set
+
+#
+# Security options
+#
+# CONFIG_KEYS is not set
+# CONFIG_SECURITY is not set
+
+#
+# Cryptographic options
+#
+# CONFIG_CRYPTO is not set
+
+#
+# Hardware crypto devices
+#
+
+#
+# Library routines
+#
+# CONFIG_CRC_CCITT is not set
+# CONFIG_CRC16 is not set
+CONFIG_CRC32=y
+# CONFIG_LIBCRC32C is not set
Index: linux-2.6.16/arch/arm/configs/tornado_defconfig
===================================================================
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
+++ linux-2.6.16/arch/arm/configs/tornado_defconfig	2007-04-12 10:36:19.000000000 +0200
@@ -0,0 +1,849 @@
+#
+# Automatically generated make config: don't edit
+# Linux kernel version: 2.6.16.9-omap1
+# Tue Mar 20 11:07:50 2007
+#
+CONFIG_ARM=y
+CONFIG_MMU=y
+CONFIG_RWSEM_GENERIC_SPINLOCK=y
+CONFIG_GENERIC_CALIBRATE_DELAY=y
+
+#
+# Code maturity level options
+#
+CONFIG_EXPERIMENTAL=y
+CONFIG_BROKEN_ON_SMP=y
+CONFIG_LOCK_KERNEL=y
+CONFIG_INIT_ENV_ARG_LIMIT=32
+
+#
+# General setup
+#
+CONFIG_LOCALVERSION=""
+CONFIG_LOCALVERSION_AUTO=y
+CONFIG_SWAP=y
+# CONFIG_SYSVIPC is not set
+CONFIG_POSIX_MQUEUE=y
+# CONFIG_BSD_PROCESS_ACCT is not set
+CONFIG_SYSCTL=y
+# CONFIG_AUDIT is not set
+# CONFIG_IKCONFIG is not set
+CONFIG_INITRAMFS_SOURCE=""
+CONFIG_UID16=y
+CONFIG_CC_OPTIMIZE_FOR_SIZE=y
+CONFIG_EMBEDDED=y
+CONFIG_KALLSYMS=y
+# CONFIG_KALLSYMS_ALL is not set
+# CONFIG_KALLSYMS_EXTRA_PASS is not set
+CONFIG_HOTPLUG=y
+CONFIG_PRINTK=y
+CONFIG_BUG=y
+# CONFIG_ELF_CORE is not set
+# CONFIG_BASE_FULL is not set
+CONFIG_FUTEX=y
+CONFIG_EPOLL=y
+CONFIG_SHMEM=y
+CONFIG_CC_ALIGN_FUNCTIONS=0
+CONFIG_CC_ALIGN_LABELS=0
+CONFIG_CC_ALIGN_LOOPS=0
+CONFIG_CC_ALIGN_JUMPS=0
+CONFIG_SLAB=y
+CONFIG_TINY_SHMEM=y
+CONFIG_BASE_SMALL=1
+# CONFIG_SLOB is not set
+
+#
+# Loadable module support
+#
+CONFIG_MODULES=y
+CONFIG_MODULE_UNLOAD=y
+# CONFIG_MODULE_FORCE_UNLOAD is not set
+CONFIG_OBSOLETE_MODPARM=y
+# CONFIG_MODVERSIONS is not set
+# CONFIG_MODULE_SRCVERSION_ALL is not set
+# CONFIG_KMOD is not set
+
+#
+# Block layer
+#
+
+#
+# IO Schedulers
+#
+CONFIG_IOSCHED_NOOP=y
+# CONFIG_IOSCHED_AS is not set
+CONFIG_IOSCHED_DEADLINE=y
+# CONFIG_IOSCHED_CFQ is not set
+# CONFIG_DEFAULT_AS is not set
+CONFIG_DEFAULT_DEADLINE=y
+# CONFIG_DEFAULT_CFQ is not set
+# CONFIG_DEFAULT_NOOP is not set
+CONFIG_DEFAULT_IOSCHED="deadline"
+
+#
+# System Type
+#
+# CONFIG_ARCH_CLPS7500 is not set
+# CONFIG_ARCH_CLPS711X is not set
+# CONFIG_ARCH_CO285 is not set
+# CONFIG_ARCH_EBSA110 is not set
+# CONFIG_ARCH_FOOTBRIDGE is not set
+# CONFIG_ARCH_INTEGRATOR is not set
+# CONFIG_ARCH_IOP3XX is not set
+# CONFIG_ARCH_IXP4XX is not set
+# CONFIG_ARCH_IXP2000 is not set
+# CONFIG_ARCH_L7200 is not set
+# CONFIG_ARCH_PXA is not set
+# CONFIG_ARCH_RPC is not set
+# CONFIG_ARCH_SA1100 is not set
+# CONFIG_ARCH_S3C2410 is not set
+# CONFIG_ARCH_SHARK is not set
+# CONFIG_ARCH_LH7A40X is not set
+CONFIG_ARCH_OMAP=y
+# CONFIG_ARCH_VERSATILE is not set
+# CONFIG_ARCH_REALVIEW is not set
+# CONFIG_ARCH_IMX is not set
+# CONFIG_ARCH_H720X is not set
+# CONFIG_ARCH_AAEC2000 is not set
+# CONFIG_ARCH_AT91RM9200 is not set
+
+#
+# TI OMAP Implementations
+#
+CONFIG_ARCH_OMAP_OTG=y
+CONFIG_ARCH_OMAP1=y
+# CONFIG_ARCH_OMAP2 is not set
+
+#
+# OMAP Feature Selections
+#
+# CONFIG_OMAP_RESET_CLOCKS is not set
+# CONFIG_OMAP_BOOT_TAG is not set
+# CONFIG_OMAP_MUX is not set
+CONFIG_OMAP_MPU_TIMER=y
+# CONFIG_OMAP_32K_TIMER is not set
+CONFIG_OMAP_LL_DEBUG_UART1=y
+# CONFIG_OMAP_LL_DEBUG_UART2 is not set
+# CONFIG_OMAP_LL_DEBUG_UART3 is not set
+
+#
+# OMAP Core Type
+#
+CONFIG_ARCH_OMAP730=y
+# CONFIG_ARCH_OMAP15XX is not set
+# CONFIG_ARCH_OMAP16XX is not set
+
+#
+# OMAP Board Type
+#
+# CONFIG_MACH_OMAP_PERSEUS2 is not set
+
+#
+# OMAP CPU Speed
+#
+# CONFIG_OMAP_CLOCKS_SET_BY_BOOTLOADER is not set
+CONFIG_OMAP_ARM_195MHZ=y
+# CONFIG_OMAP_ARM_182MHZ is not set
+# CONFIG_OMAP_ARM_168MHZ is not set
+# CONFIG_OMAP_ARM_120MHZ is not set
+# CONFIG_OMAP_ARM_60MHZ is not set
+# CONFIG_OMAP_ARM_30MHZ is not set
+CONFIG_MACH_TORNADO=y
+CONFIG_EFB_DEBUG=y
+
+#
+# Processor Type
+#
+CONFIG_CPU_32=y
+CONFIG_CPU_ARM926T=y
+CONFIG_CPU_32v5=y
+CONFIG_CPU_ABRT_EV5TJ=y
+CONFIG_CPU_CACHE_VIVT=y
+CONFIG_CPU_COPY_V4WB=y
+CONFIG_CPU_TLB_V4WBI=y
+
+#
+# Processor Features
+#
+# CONFIG_ARM_THUMB is not set
+# CONFIG_CPU_ICACHE_DISABLE is not set
+# CONFIG_CPU_DCACHE_DISABLE is not set
+# CONFIG_CPU_DCACHE_WRITETHROUGH is not set
+# CONFIG_CPU_CACHE_ROUND_ROBIN is not set
+CONFIG_KEXEC=y
+
+#
+# Bus support
+#
+
+#
+# PCCARD (PCMCIA/CardBus) support
+#
+# CONFIG_PCCARD is not set
+
+#
+# Kernel Features
+#
+CONFIG_PREEMPT=y
+# CONFIG_NO_IDLE_HZ is not set
+# CONFIG_AEABI is not set
+# CONFIG_ARCH_DISCONTIGMEM_ENABLE is not set
+CONFIG_SELECT_MEMORY_MODEL=y
+CONFIG_FLATMEM_MANUAL=y
+# CONFIG_DISCONTIGMEM_MANUAL is not set
+# CONFIG_SPARSEMEM_MANUAL is not set
+CONFIG_FLATMEM=y
+CONFIG_FLAT_NODE_MEM_MAP=y
+# CONFIG_SPARSEMEM_STATIC is not set
+CONFIG_SPLIT_PTLOCK_CPUS=4096
+# CONFIG_LEDS is not set
+CONFIG_ALIGNMENT_TRAP=y
+
+#
+# Boot options
+#
+CONFIG_ZBOOT_ROM_TEXT=0x0
+CONFIG_ZBOOT_ROM_BSS=0x0
+CONFIG_CMDLINE=""
+# CONFIG_XIP_KERNEL is not set
+
+#
+# CPU Frequency scaling
+#
+# CONFIG_CPU_FREQ is not set
+
+#
+# Floating point emulation
+#
+
+#
+# At least one emulation must be selected
+#
+CONFIG_FPE_NWFPE=y
+# CONFIG_FPE_NWFPE_XP is not set
+# CONFIG_FPE_FASTFPE is not set
+# CONFIG_VFP is not set
+
+#
+# Userspace binary formats
+#
+CONFIG_BINFMT_ELF=y
+# CONFIG_BINFMT_AOUT is not set
+# CONFIG_BINFMT_MISC is not set
+# CONFIG_ARTHUR is not set
+
+#
+# Power management options
+#
+CONFIG_PM=y
+CONFIG_PM_LEGACY=y
+# CONFIG_PM_DEBUG is not set
+CONFIG_APM=y
+
+#
+# Networking
+#
+CONFIG_NET=y
+
+#
+# Networking options
+#
+# CONFIG_NETDEBUG is not set
+CONFIG_PACKET=y
+# CONFIG_PACKET_MMAP is not set
+CONFIG_UNIX=y
+CONFIG_XFRM=y
+# CONFIG_XFRM_USER is not set
+CONFIG_NET_KEY=y
+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 is not set
+# CONFIG_INET_AH is not set
+# CONFIG_INET_ESP is not set
+# CONFIG_INET_IPCOMP is not set
+# CONFIG_INET_TUNNEL is not set
+CONFIG_INET_DIAG=y
+CONFIG_INET_TCP_DIAG=y
+# CONFIG_TCP_CONG_ADVANCED is not set
+CONFIG_TCP_CONG_BIC=y
+# CONFIG_IPV6 is not set
+# CONFIG_NETFILTER is not set
+
+#
+# DCCP Configuration (EXPERIMENTAL)
+#
+# CONFIG_IP_DCCP is not set
+
+#
+# SCTP Configuration (EXPERIMENTAL)
+#
+# CONFIG_IP_SCTP is not set
+
+#
+# TIPC Configuration (EXPERIMENTAL)
+#
+# CONFIG_TIPC is not set
+# CONFIG_ATM is not set
+# CONFIG_BRIDGE is not set
+# CONFIG_VLAN_8021Q is not set
+# CONFIG_DECNET is not set
+# CONFIG_LLC2 is not set
+# CONFIG_IPX is not set
+# CONFIG_ATALK is not set
+# CONFIG_X25 is not set
+# CONFIG_LAPB is not set
+# CONFIG_NET_DIVERT is not set
+# CONFIG_ECONET is not set
+# CONFIG_WAN_ROUTER is not set
+
+#
+# QoS and/or fair queueing
+#
+# CONFIG_NET_SCHED is not set
+
+#
+# Network testing
+#
+# CONFIG_NET_PKTGEN is not set
+# CONFIG_HAMRADIO is not set
+# CONFIG_IRDA is not set
+# CONFIG_BT is not set
+# CONFIG_IEEE80211 is not set
+
+#
+# Device Drivers
+#
+
+#
+# Generic Driver Options
+#
+CONFIG_STANDALONE=y
+CONFIG_PREVENT_FIRMWARE_BUILD=y
+CONFIG_FW_LOADER=y
+# CONFIG_DEBUG_DRIVER is not set
+
+#
+# Connector - unified userspace <-> kernelspace linker
+#
+# CONFIG_CONNECTOR is not set
+
+#
+# Memory Technology Devices (MTD)
+#
+# CONFIG_MTD is not set
+
+#
+# Parallel port support
+#
+# CONFIG_PARPORT is not set
+
+#
+# Plug and Play support
+#
+
+#
+# Block devices
+#
+# CONFIG_BLK_DEV_COW_COMMON is not set
+# CONFIG_BLK_DEV_LOOP is not set
+# CONFIG_BLK_DEV_NBD is not set
+CONFIG_BLK_DEV_RAM=y
+CONFIG_BLK_DEV_RAM_COUNT=1
+CONFIG_BLK_DEV_RAM_SIZE=4096
+CONFIG_BLK_DEV_INITRD=y
+# CONFIG_CDROM_PKTCDVD is not set
+# CONFIG_ATA_OVER_ETH is not set
+
+#
+# SCSI device support
+#
+# CONFIG_RAID_ATTRS is not set
+# CONFIG_SCSI is not set
+
+#
+# Multi-device support (RAID and LVM)
+#
+# CONFIG_MD is not set
+
+#
+# Fusion MPT device support
+#
+# CONFIG_FUSION is not set
+
+#
+# IEEE 1394 (FireWire) support
+#
+
+#
+# I2O device support
+#
+
+#
+# Network device support
+#
+# CONFIG_NETDEVICES is not set
+# CONFIG_DUMMY is not set
+# CONFIG_BONDING is not set
+# CONFIG_EQUALIZER is not set
+# CONFIG_TUN is not set
+
+#
+# PHY device support
+#
+
+#
+# Ethernet (10 or 100Mbit)
+#
+# CONFIG_NET_ETHERNET is not set
+
+#
+# Ethernet (1000 Mbit)
+#
+
+#
+# Ethernet (10000 Mbit)
+#
+# CONFIG_PPP is not set
+# CONFIG_SLIP is not set
+# CONFIG_SHAPER is not set
+# CONFIG_NETCONSOLE is not set
+# CONFIG_NETPOLL is not set
+# CONFIG_NET_POLL_CONTROLLER is not set
+
+#
+# ISDN subsystem
+#
+# CONFIG_ISDN is not set
+
+#
+# Input device support
+#
+CONFIG_INPUT=y
+
+#
+# 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 is not set
+# CONFIG_INPUT_TSDEV is not set
+# CONFIG_INPUT_EVDEV is not set
+# CONFIG_INPUT_EVBUG is not set
+
+#
+# Input Device Drivers
+#
+CONFIG_INPUT_KEYBOARD=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_OMAP is not set
+CONFIG_TORNADO_KEYPAD=y
+# CONFIG_INPUT_MOUSE is not set
+# CONFIG_INPUT_JOYSTICK is not set
+# CONFIG_INPUT_TOUCHSCREEN is not set
+# CONFIG_INPUT_MISC is not set
+
+#
+# Hardware I/O ports
+#
+# CONFIG_SERIO is not set
+# CONFIG_GAMEPORT is not set
+
+#
+# Character devices
+#
+CONFIG_VT=y
+CONFIG_VT_CONSOLE=y
+CONFIG_HW_CONSOLE=y
+# CONFIG_SERIAL_NONSTANDARD is not set
+
+#
+# Serial drivers
+#
+# CONFIG_SERIAL_8250 is not set
+
+#
+# Non-8250 serial port support
+#
+CONFIG_UNIX98_PTYS=y
+CONFIG_LEGACY_PTYS=y
+CONFIG_LEGACY_PTY_COUNT=256
+
+#
+# IPMI
+#
+# CONFIG_IPMI_HANDLER is not set
+
+#
+# Watchdog Cards
+#
+CONFIG_WATCHDOG=y
+# CONFIG_WATCHDOG_NOWAYOUT is not set
+
+#
+# Watchdog Device Drivers
+#
+# CONFIG_SOFT_WATCHDOG is not set
+CONFIG_OMAP730_WATCHDOG=y
+CONFIG_TORNADO_VIBRATOR=y
+CONFIG_TORNADO_LEDS=y
+# CONFIG_NVRAM is not set
+# CONFIG_RTC is not set
+# CONFIG_OMAP_RTC is not set
+# CONFIG_DTLK is not set
+# CONFIG_R3964 is not set
+
+#
+# Ftape, the floppy tape device driver
+#
+# CONFIG_RAW_DRIVER is not set
+
+#
+# TPM devices
+#
+# CONFIG_TCG_TPM is not set
+# CONFIG_TELCLOCK is not set
+
+#
+# I2C support
+#
+# CONFIG_I2C is not set
+
+#
+# SPI support
+#
+# CONFIG_SPI is not set
+# CONFIG_SPI_MASTER is not set
+
+#
+# Dallas's 1-wire bus
+#
+# CONFIG_W1 is not set
+
+#
+# Hardware Monitoring support
+#
+# CONFIG_HWMON is not set
+# CONFIG_HWMON_VID is not set
+
+#
+# Misc devices
+#
+
+#
+# Multimedia Capabilities Port drivers
+#
+
+#
+# Multimedia devices
+#
+# CONFIG_VIDEO_DEV is not set
+
+#
+# Digital Video Broadcasting Devices
+#
+# CONFIG_DVB is not set
+
+#
+# Graphics support
+#
+CONFIG_FB=y
+CONFIG_FB_CFB_FILLRECT=y
+CONFIG_FB_CFB_COPYAREA=y
+CONFIG_FB_CFB_IMAGEBLIT=y
+# CONFIG_FB_MACMODES is not set
+# CONFIG_FB_MODE_HELPERS is not set
+# CONFIG_FB_TILEBLITTING is not set
+# CONFIG_FB_S1D13XXX is not set
+# CONFIG_FB_OMAP is not set
+CONFIG_FB_VSFB=y
+# CONFIG_FB_VIRTUAL is not set
+
+#
+# Console display driver support
+#
+# CONFIG_VGA_CONSOLE is not set
+CONFIG_DUMMY_CONSOLE=y
+CONFIG_FRAMEBUFFER_CONSOLE=y
+CONFIG_FRAMEBUFFER_CONSOLE_ROTATION=y
+CONFIG_FONTS=y
+# CONFIG_FONT_8x8 is not set
+# CONFIG_FONT_8x16 is not set
+CONFIG_FONT_6x11=y
+# 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
+
+#
+# Logo configuration
+#
+# CONFIG_LOGO is not set
+CONFIG_BACKLIGHT_LCD_SUPPORT=y
+CONFIG_BACKLIGHT_CLASS_DEVICE=y
+CONFIG_BACKLIGHT_DEVICE=y
+# CONFIG_LCD_CLASS_DEVICE is not set
+CONFIG_BACKLIGHT_TORNADO=y
+
+#
+# Sound
+#
+CONFIG_SOUND=y
+
+#
+# Advanced Linux Sound Architecture
+#
+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_SEQUENCER_OSS=y
+# CONFIG_SND_DYNAMIC_MINORS is not set
+CONFIG_SND_SUPPORT_OLD_API=y
+# CONFIG_SND_VERBOSE_PRINTK is not set
+# CONFIG_SND_DEBUG is not set
+
+#
+# Generic devices
+#
+# 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
+
+#
+# ALSA ARM devices
+#
+# CONFIG_SND_OMAP_AIC23 is not set
+# CONFIG_SND_OMAP_TSC2101 is not set
+
+#
+# Open Sound System
+#
+# CONFIG_SOUND_PRIME is not set
+
+#
+# USB support
+#
+CONFIG_USB_ARCH_HAS_HCD=y
+CONFIG_USB_ARCH_HAS_OHCI=y
+# CONFIG_USB is not set
+
+#
+# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
+#
+
+#
+# USB Gadget Support
+#
+CONFIG_USB_GADGET=y
+CONFIG_USB_GADGET_DEBUG_FILES=y
+CONFIG_USB_GADGET_SELECTED=y
+# CONFIG_USB_GADGET_NET2280 is not set
+# CONFIG_USB_GADGET_PXA2XX is not set
+# CONFIG_USB_GADGET_GOKU is not set
+# CONFIG_USB_GADGET_LH7A40X is not set
+CONFIG_USB_GADGET_OMAP=y
+CONFIG_USB_OMAP=y
+# CONFIG_USB_GADGET_DUMMY_HCD is not set
+# CONFIG_USB_GADGET_DUALSPEED is not set
+# CONFIG_USB_ZERO is not set
+CONFIG_USB_ETH=y
+# CONFIG_USB_ETH_RNDIS is not set
+# CONFIG_USB_GADGETFS is not set
+# CONFIG_USB_FILE_STORAGE is not set
+# CONFIG_USB_G_SERIAL is not set
+
+#
+# MMC/SD Card support
+#
+CONFIG_MMC=y
+# CONFIG_MMC_DEBUG is not set
+CONFIG_MMC_BLOCK=y
+# CONFIG_MMC_BLOCK_BROKEN_RFD is not set
+# CONFIG_MMC_BULKTRANSFER is not set
+CONFIG_MMC_OMAP=y
+
+#
+# Synchronous Serial Interfaces (SSI)
+#
+# CONFIG_OMAP_UWIRE is not set
+# CONFIG_OMAP_TSC2101 is not set
+
+#
+# CBUS support
+#
+# CONFIG_CBUS is not set
+
+#
+# File systems
+#
+CONFIG_EXT2_FS=y
+# CONFIG_EXT2_FS_XATTR is not set
+# CONFIG_EXT2_FS_XIP is not set
+# CONFIG_EXT3_FS is not set
+# CONFIG_REISERFS_FS is not set
+# CONFIG_JFS_FS is not set
+# CONFIG_FS_POSIX_ACL is not set
+# CONFIG_XFS_FS is not set
+# CONFIG_OCFS2_FS is not set
+# CONFIG_MINIX_FS is not set
+CONFIG_ROMFS_FS=y
+# CONFIG_INOTIFY is not set
+# CONFIG_QUOTA is not set
+CONFIG_DNOTIFY=y
+# CONFIG_AUTOFS_FS is not set
+# CONFIG_AUTOFS4_FS is not set
+# CONFIG_FUSE_FS is not set
+
+#
+# CD-ROM/DVD Filesystems
+#
+# CONFIG_ISO9660_FS is not set
+# CONFIG_UDF_FS is not set
+
+#
+# DOS/FAT/NT Filesystems
+#
+# CONFIG_MSDOS_FS is not set
+# CONFIG_VFAT_FS is not set
+# CONFIG_NTFS_FS is not set
+
+#
+# Pseudo filesystems
+#
+CONFIG_PROC_FS=y
+CONFIG_SYSFS=y
+# CONFIG_TMPFS is not set
+# CONFIG_HUGETLB_PAGE is not set
+CONFIG_RAMFS=y
+# CONFIG_RELAYFS_FS is not set
+# CONFIG_CONFIGFS_FS is not set
+
+#
+# Miscellaneous filesystems
+#
+# CONFIG_ADFS_FS is not set
+# CONFIG_AFFS_FS is not set
+# CONFIG_HFS_FS is not set
+# CONFIG_HFSPLUS_FS is not set
+# CONFIG_BEFS_FS is not set
+# CONFIG_BFS_FS is not set
+# CONFIG_EFS_FS is not set
+# CONFIG_CRAMFS is not set
+# CONFIG_VXFS_FS is not set
+# CONFIG_HPFS_FS is not set
+# CONFIG_QNX4FS_FS is not set
+# CONFIG_SYSV_FS is not set
+# CONFIG_UFS_FS is not set
+
+#
+# Network File Systems
+#
+CONFIG_NFS_FS=y
+CONFIG_NFS_V3=y
+# CONFIG_NFS_V3_ACL is not set
+# CONFIG_NFS_V4 is not set
+# CONFIG_NFS_DIRECTIO is not set
+# CONFIG_NFSD is not set
+CONFIG_LOCKD=y
+CONFIG_LOCKD_V4=y
+CONFIG_NFS_COMMON=y
+CONFIG_SUNRPC=y
+# CONFIG_RPCSEC_GSS_KRB5 is not set
+# CONFIG_RPCSEC_GSS_SPKM3 is not set
+# CONFIG_SMB_FS is not set
+# CONFIG_CIFS is not set
+# CONFIG_NCP_FS is not set
+# CONFIG_CODA_FS is not set
+# CONFIG_AFS_FS is not set
+# CONFIG_9P_FS is not set
+
+#
+# Partition Types
+#
+# CONFIG_PARTITION_ADVANCED is not set
+CONFIG_MSDOS_PARTITION=y
+
+#
+# Native Language Support
+#
+# CONFIG_NLS is not set
+
+#
+# Profiling support
+#
+# CONFIG_PROFILING is not set
+
+#
+# Kernel hacking
+#
+# CONFIG_PRINTK_TIME is not set
+# CONFIG_MAGIC_SYSRQ is not set
+CONFIG_DEBUG_KERNEL=y
+CONFIG_LOG_BUF_SHIFT=14
+# CONFIG_DETECT_SOFTLOCKUP is not set
+# CONFIG_SCHEDSTATS is not set
+# CONFIG_DEBUG_SLAB is not set
+CONFIG_DEBUG_PREEMPT=y
+# CONFIG_DEBUG_MUTEXES is not set
+# CONFIG_DEBUG_SPINLOCK is not set
+# CONFIG_DEBUG_SPINLOCK_SLEEP is not set
+# CONFIG_DEBUG_KOBJECT is not set
+# CONFIG_DEBUG_BUGVERBOSE is not set
+# CONFIG_DEBUG_INFO is not set
+# CONFIG_DEBUG_FS is not set
+# CONFIG_DEBUG_VM is not set
+CONFIG_FRAME_POINTER=y
+# CONFIG_FORCED_INLINING is not set
+# CONFIG_RCU_TORTURE_TEST is not set
+# CONFIG_DEBUG_USER is not set
+# CONFIG_DEBUG_WAITQ is not set
+CONFIG_DEBUG_ERRORS=y
+# CONFIG_DEBUG_LL is not set
+
+#
+# Security options
+#
+# CONFIG_KEYS is not set
+CONFIG_SECURITY=y
+CONFIG_SECURITY_NETWORK=y
+# CONFIG_SECURITY_NETWORK_XFRM is not set
+# CONFIG_SECURITY_CAPABILITIES is not set
+# CONFIG_SECURITY_SECLVL is not set
+
+#
+# Cryptographic options
+#
+# CONFIG_CRYPTO is not set
+
+#
+# Hardware crypto devices
+#
+
+#
+# Library routines
+#
+# CONFIG_CRC_CCITT is not set
+# CONFIG_CRC16 is not set
+CONFIG_CRC32=y
+# CONFIG_LIBCRC32C is not set
Index: linux-2.6.16/arch/arm/Kconfig
===================================================================
--- linux-2.6.16.orig/arch/arm/Kconfig	2007-04-12 10:36:06.000000000 +0200
+++ linux-2.6.16/arch/arm/Kconfig	2007-04-12 10:36:19.000000000 +0200
@@ -298,6 +298,23 @@
 	depends on CPU_XSCALE && !XSCALE_PMU_TIMER
 	default y
 
+config KEXEC
+	bool "Kexec system call (EXPERIMENTAL)"
+	depends on EXPERIMENTAL
+	help
+	  kexec is a system call that implements the ability to shutdown your
+	  current kernel, and to start another kernel.  It is like a reboot
+	  but it is indepedent of the system firmware.   And like a reboot
+	  you can start any kernel with it, not just Linux.
+
+	  The name comes from the similiarity to the exec system call.
+
+	  It is an ongoing process to be certain the hardware in a machine
+	  is properly shutdown, so do not be surprised if this code does not
+	  initially work for you.  It may help to enable device hotplugging
+	  support.  As of this writing the exact hardware interface is
+	  strongly in flux, so no good recommendation can be made.
+
 endmenu
 
 source "arch/arm/common/Kconfig"
Index: linux-2.6.16/arch/arm/kernel/calls.S
===================================================================
--- linux-2.6.16.orig/arch/arm/kernel/calls.S	2006-03-20 06:53:29.000000000 +0100
+++ linux-2.6.16/arch/arm/kernel/calls.S	2007-04-12 10:36:19.000000000 +0200
@@ -198,7 +198,7 @@
 		CALL(sys_sigaltstack_wrapper)
 		CALL(sys_sendfile)
 		CALL(sys_ni_syscall)
-		CALL(sys_ni_syscall)
+		CALL(sys_kexec_load)
 /* 190 */	CALL(sys_vfork_wrapper)
 		CALL(sys_getrlimit)
 		CALL(sys_mmap2)
Index: linux-2.6.16/arch/arm/kernel/head.S
===================================================================
--- linux-2.6.16.orig/arch/arm/kernel/head.S	2006-03-20 06:53:29.000000000 +0100
+++ linux-2.6.16/arch/arm/kernel/head.S	2007-04-12 10:36:19.000000000 +0200
@@ -36,6 +36,79 @@
 #define KERNEL_RAM_ADDR	(PAGE_OFFSET + TEXT_OFFSET)
 
 /*
+ * debug macros, while the MMU is of
+ */
+.macro	pix_ok /* blue */
+#ifdef CONFIG_EFB_DEBUG
+	mov	r12, #0x0014
+	add	r12, r12, #0x00140000
+	str	r12, [r11]
+	add	r11, r11, #4
+	str	r12, [r11]
+	add	r11, r11, #4
+	str	r12, [r11]
+	add	r11, r11, #4
+	str	r12, [r11]
+	add	r11, r11, #4
+	add	r11, r11, #4
+#endif
+.endm
+	
+.macro	pix_ko /* red */
+#ifdef CONFIG_EFB_DEBUG
+	mov	r12, #0xF800
+	add	r12, r12, #0xF8000000
+	str	r12, [r11]
+	add	r11, r11, #4
+	str	r12, [r11]
+	add	r11, r11, #4
+	str	r12, [r11]
+	add	r11, r11, #4
+	str	r12, [r11]
+	add	r11, r11, #4
+	add	r11, r11, #4
+#endif
+.endm
+
+.macro	pix_ctr /* white */
+#ifdef CONFIG_EFB_DEBUG
+	mov	r12, #-1
+	str	r12, [r11]
+	add	r11, r11, #4
+	str	r12, [r11]
+	add	r11, r11, #4
+	str	r12, [r11]
+	add	r11, r11, #4
+	str	r12, [r11]
+	add	r11, r11, #4
+	add	r11, r11, #4
+#endif
+.endm
+	
+/*
+ * a more mmu aware code: the frame buffer is mapped at 0xD0001020,
+ * see arch/arm/mach-omap/debug.c
+ */
+.macro pix_mmu /* black pixel */
+#ifdef CONFIG_EFB_DEBUG
+	mov	r11, #0xD0000000
+	add	r11, r11, #0x1000
+	add	r11, r11, #0x20
+/*	mov     r12, #0x00FF */
+/* 	add     r12, r12, #0x00FF0000 */
+	mov	r12, #0
+	str     r12, [r11]
+	add     r11, r11, #4
+	str     r12, [r11]
+	add     r11, r11, #4
+	str     r12, [r11]
+	add     r11, r11, #4
+	str     r12, [r11]
+	add     r11, r11, #4
+#endif
+.endm
+	
+/*
  * swapper_pg_dir is the virtual address of the initial page table.
  * We place the page tables 16K below KERNEL_RAM_ADDR.  Therefore, we must
  * make sure that KERNEL_RAM_ADDR is correctly set.  Currently, we expect
@@ -80,14 +153,31 @@
 	__INIT
 	.type	stext, %function
 ENTRY(stext)
+
+	/*
+	 * r11 stores the beginning of the VRAM (0x20001020)
+	 */
+	mov	r11, #0x20000000
+	add	r11, r11, #0x1000
+	add	r11, r11, #0x20
+	
+	pix_ok
+
 	msr	cpsr_c, #PSR_F_BIT | PSR_I_BIT | MODE_SVC @ ensure svc mode
 						@ and irqs disabled
 	bl	__lookup_processor_type		@ r5=procinfo r9=cpuid
 	movs	r10, r5				@ invalid processor (r5=0)?
 	beq	__error_p			@ yes, error 'p'
+
+	pix_ok
+	
 	bl	__lookup_machine_type		@ r5=machinfo
 	movs	r8, r5				@ invalid machine (r5=0)?
 	beq	__error_a			@ yes, error 'a'
+
+	pix_ok
+
+		
 	bl	__create_page_tables
 
 	/*
@@ -232,14 +322,22 @@
 	.align	5
 	.type	__turn_mmu_on, %function
 __turn_mmu_on:
+
+	pix_ok
+	
 	mov	r0, r0
 	mcr	p15, 0, r0, c1, c0, 0		@ write control reg
 	mrc	p15, 0, r3, c0, c0, 0		@ read id reg
 	mov	r3, r3
 	mov	r3, r3
+
+	pix_mmu
+
 	mov	pc, r13
 
 
+1:
+	b 1b
 
 /*
  * Setup the initial page tables.  We only setup the barest
@@ -363,6 +461,18 @@
 	str	r3, [r0]
 #endif
 #endif
+
+#ifdef CONFIG_EFB_DEBUG
+	/*
+	 * map frame buffer from 0x20000000 to 0xD0000000
+	 * in order to help debugging
+	 */
+	add	r0, r4, #0xD0000000 >> 18
+	mov	r3, #0x20000000
+	add	r3, r3, r7
+	str	r3, [r0]
+#endif
+
 	mov	pc, lr
 	.ltorg
 
@@ -380,6 +490,7 @@
 
 	.type	__error_p, %function
 __error_p:
+	pix_ko
 #ifdef CONFIG_DEBUG_LL
 	adr	r0, str_p1
 	bl	printascii
@@ -390,6 +501,7 @@
 
 	.type	__error_a, %function
 __error_a:
+	pix_ko
 #ifdef CONFIG_DEBUG_LL
 	mov	r4, r1				@ preserve machine ID
 	adr	r0, str_a1
Index: linux-2.6.16/arch/arm/kernel/machine_kexec.c
===================================================================
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
+++ linux-2.6.16/arch/arm/kernel/machine_kexec.c	2007-04-12 10:36:19.000000000 +0200
@@ -0,0 +1,77 @@
+/*
+ * machine_kexec.c - handle transition of Linux booting another kernel
+ */
+
+#include <linux/mm.h>
+#include <linux/kexec.h>
+#include <linux/delay.h>
+#include <linux/reboot.h>
+#include <asm/pgtable.h>
+#include <asm/pgalloc.h>
+#include <asm/mmu_context.h>
+#include <asm/io.h>
+#include <asm/cacheflush.h>
+#include <asm/mach-types.h>
+
+const extern unsigned char relocate_new_kernel[];
+const extern unsigned int relocate_new_kernel_size;
+
+extern unsigned long kexec_start_address;
+extern unsigned long kexec_indirection_page;
+extern unsigned long kexec_mach_type;
+
+/*
+ * Provide a dummy crash_notes definition while crash dump arrives to arm.
+ * This prevents breakage of crash_notes attribute in kernel/ksysfs.c.
+ */
+/* note_buf_t *crash_notes; */
+
+int machine_kexec_prepare(struct kimage *image)
+{
+	return 0;
+}
+
+void machine_kexec_cleanup(struct kimage *image)
+{
+}
+
+void machine_shutdown(void)
+{
+}
+
+void machine_crash_shutdown(struct pt_regs *regs)
+{
+}
+
+void machine_kexec(struct kimage *image)
+{
+	unsigned long page_list;
+	unsigned long reboot_code_buffer_phys;
+	void *reboot_code_buffer;
+
+
+	page_list = image->head & PAGE_MASK;
+
+	/* we need both effective and real address here */
+	reboot_code_buffer_phys =
+	    page_to_pfn(image->control_code_page) << PAGE_SHIFT;
+	reboot_code_buffer = page_address(image->control_code_page);
+
+	/* Prepare parameters for reboot_code_buffer*/
+	kexec_start_address = image->start; 
+	kexec_indirection_page = page_list;
+	kexec_mach_type = machine_arch_type;
+		
+	/* copy our kernel relocation code to the control code page */
+	memcpy(reboot_code_buffer,
+	       relocate_new_kernel, relocate_new_kernel_size);
+
+		
+	flush_icache_range(reboot_code_buffer,
+			   reboot_code_buffer + KEXEC_CONTROL_CODE_SIZE);
+	printk(KERN_INFO "Bye!\n");
+
+	cpu_proc_fin();
+	setup_mm_for_reboot(0); /* mode is not used, so just pass 0*/
+	cpu_reset(reboot_code_buffer_phys);
+}
Index: linux-2.6.16/arch/arm/kernel/Makefile
===================================================================
--- linux-2.6.16.orig/arch/arm/kernel/Makefile	2006-03-20 06:53:29.000000000 +0100
+++ linux-2.6.16/arch/arm/kernel/Makefile	2007-04-12 10:36:19.000000000 +0200
@@ -21,6 +21,7 @@
 obj-$(CONFIG_PCI)		+= bios32.o
 obj-$(CONFIG_SMP)		+= smp.o
 obj-$(CONFIG_OABI_COMPAT)	+= sys_oabi-compat.o
+obj-$(CONFIG_KEXEC)		+= machine_kexec.o relocate_kernel.o
 
 obj-$(CONFIG_IWMMXT)		+= iwmmxt.o
 AFLAGS_iwmmxt.o			:= -Wa,-mcpu=iwmmxt
Index: linux-2.6.16/arch/arm/kernel/relocate_kernel.S
===================================================================
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
+++ linux-2.6.16/arch/arm/kernel/relocate_kernel.S	2007-04-12 10:36:19.000000000 +0200
@@ -0,0 +1,74 @@
+/*
+ * relocate_kernel.S - put the kernel image in place to boot
+ */
+
+#include <asm/kexec.h>
+                                                                                
+	.globl relocate_new_kernel
+relocate_new_kernel:
+	
+	ldr	r0,kexec_indirection_page
+	ldr	r1,kexec_start_address
+	
+
+0:	/* top, read another word for the indirection page */
+	ldr	r3, [r0],#4
+
+	/* Is it a destination page. Put destination address to r4 */
+	tst	r3,#1,0
+	beq	1f
+	bic	r4,r3,#1
+	b	0b
+1: 
+	/* Is it an indirection page */
+	tst	r3,#2,0
+	beq	1f
+	bic	r0,r3,#2
+	b	0b
+1:
+
+	/* are we done ? */
+	tst	r3,#4,0
+	beq	1f
+	b	2f
+
+1:
+	/* is it source ? */
+	tst	r3,#8,0
+	beq	0b
+	bic r3,r3,#8
+	mov r6,#1024
+9:
+	ldr r5,[r3],#4
+	str r5,[r4],#4
+	subs r6,r6,#1
+	bne 9b
+	b 0b
+
+2:
+	/* Jump to relocated kernel */
+	mov lr,r1
+	mov r0,#0
+	ldr r1,kexec_mach_type
+	mov r2,#0
+	mov pc,lr
+
+	.globl kexec_start_address
+kexec_start_address:
+	.long	0x0
+
+	.globl kexec_indirection_page
+kexec_indirection_page:
+	.long	0x0
+	
+	.globl kexec_mach_type
+kexec_mach_type:
+	.long	0x0
+
+relocate_new_kernel_end:
+
+	.globl relocate_new_kernel_size
+relocate_new_kernel_size:	
+	.long relocate_new_kernel_end - relocate_new_kernel
+
+
Index: linux-2.6.16/arch/arm/kernel/setup.c
===================================================================
--- linux-2.6.16.orig/arch/arm/kernel/setup.c	2006-03-20 06:53:29.000000000 +0100
+++ linux-2.6.16/arch/arm/kernel/setup.c	2007-04-12 10:36:19.000000000 +0200
@@ -768,6 +768,16 @@
 	memcpy(saved_command_line, from, COMMAND_LINE_SIZE);
 	saved_command_line[COMMAND_LINE_SIZE-1] = '\0';
 	parse_cmdline(cmdline_p, from);
+
+#ifdef CONFIG_EFB_DEBUG
+	/*
+	 * paging_init is going to wipe out any section other than the
+	 * kernel code and data allocated in head.S so the framebuffer
+	 * is going not to be available during paging_init.
+	 */
+	efb_disable();
+#endif
+
 	paging_init(&meminfo, mdesc);
 	request_standard_resources(&meminfo, mdesc);
 
Index: linux-2.6.16/arch/arm/kernel/traps.c
===================================================================
--- linux-2.6.16.orig/arch/arm/kernel/traps.c	2006-03-20 06:53:29.000000000 +0100
+++ linux-2.6.16/arch/arm/kernel/traps.c	2007-04-12 10:36:19.000000000 +0200
@@ -55,10 +55,10 @@
 void dump_backtrace_entry(unsigned long where, unsigned long from)
 {
 #ifdef CONFIG_KALLSYMS
-	printk("[<%08lx>] ", where);
+/* 	printk("[<%08lx>] ", where); */
 	print_symbol("(%s) ", where);
-	printk("from [<%08lx>] ", from);
-	print_symbol("(%s)\n", from);
+/* 	printk("from [<%08lx>] ", from); */
+/* 	print_symbol("(%s)\n", from); */
 #else
 	printk("Function entered at [<%08lx>] from [<%08lx>]\n", where, from);
 #endif
@@ -205,7 +205,7 @@
 
 	printk("Internal error: %s: %x [#%d]\n", str, err, ++die_counter);
 	print_modules();
-	__show_regs(regs);
+/* 	__show_regs(regs); */
 	printk("Process %s (pid: %d, stack limit = 0x%p)\n",
 		tsk->comm, tsk->pid, thread + 1);
 
@@ -547,7 +547,7 @@
 		       current->pid, current->comm, no);
 		dump_instr(regs);
 		if (user_mode(regs)) {
-			__show_regs(regs);
+/* 			__show_regs(regs); */
 			c_backtrace(regs->ARM_fp, processor_mode(regs));
 		}
 	}
Index: linux-2.6.16/arch/arm/lib/backtrace.S
===================================================================
--- linux-2.6.16.orig/arch/arm/lib/backtrace.S	2006-03-20 06:53:29.000000000 +0100
+++ linux-2.6.16/arch/arm/lib/backtrace.S	2007-04-12 10:36:19.000000000 +0200
@@ -103,7 +103,9 @@
 		.align	0
 1007:		ldr	r0, =.Lbad
 		mov	r1, frame
+#ifdef CONFIG_PRINTK
 		bl	printk
+#endif
 		LOADREGS(fd, sp!, {r4 - r8, pc})
 		.ltorg
 		.previous
@@ -138,12 +140,16 @@
 		ldr	r2, [stack], #-4
 		mov	r1, reg
 		adr	r0, .Lfp
+#ifdef CONFIG_PRINTK
 		bl	printk
+#endif
 2:		subs	reg, reg, #1
 		bpl	1b
 		teq	r7, #0
 		adrne	r0, .Lcr
+#ifdef CONFIG_PRINTK
 		blne	printk
+#endif
 		mov	r0, stack
 		LOADREGS(fd, sp!, {instr, reg, stack, r7, pc})
 
Index: linux-2.6.16/arch/arm/mach-omap1/clock.c
===================================================================
--- linux-2.6.16.orig/arch/arm/mach-omap1/clock.c	2007-04-12 10:36:07.000000000 +0200
+++ linux-2.6.16/arch/arm/mach-omap1/clock.c	2007-04-12 10:36:19.000000000 +0200
@@ -267,11 +267,13 @@
 	if (!ptr->rate)
 		return -EINVAL;
 
+#if 0
 	/*
 	 * In most cases we should not need to reprogram DPLL.
 	 * Reprogramming the DPLL is tricky, it must be done from SRAM.
 	 */
 	omap_sram_reprogram_clock(ptr->dpllctl_val, ptr->ckctl_val);
+#endif
 
 	ck_dpll1.rate = ptr->pll_rate;
 	propagate_rate(&ck_dpll1);
@@ -774,12 +776,13 @@
 	omap_writew(1, ARM_RSTCT2);
 	omap_writew(0x400, ARM_IDLECT1);
 
+
 	/*
 	 * According to OMAP5910 Erratum SYS_DMA_1, bit DMACK_REQ (bit 8)
 	 * of the ARM_IDLECT2 register must be set to zero. The power-on
 	 * default value of this bit is one.
 	 */
-	omap_writew(0x0000, ARM_IDLECT2);	/* Turn LCD clock off also */
+	omap_writew(0x0008, ARM_IDLECT2);	/* But keep LCD clock active ...  */
 
 	/*
 	 * Only enable those clocks we will need, let the drivers
Index: linux-2.6.16/arch/arm/mach-omap1/clock.h
===================================================================
--- linux-2.6.16.orig/arch/arm/mach-omap1/clock.h	2007-04-12 10:36:07.000000000 +0200
+++ linux-2.6.16/arch/arm/mach-omap1/clock.h	2007-04-12 10:36:19.000000000 +0200
@@ -182,7 +182,7 @@
 static struct clk arm_ck = {
 	.name		= "arm_ck",
 	.parent		= &ck_dpll1,
-	.flags		= CLOCK_IN_OMAP1510 | CLOCK_IN_OMAP16XX |
+	.flags		= CLOCK_IN_OMAP1510 | CLOCK_IN_OMAP16XX | CLOCK_IN_OMAP730 |
 			  CLOCK_IN_OMAP310 | RATE_CKCTL | RATE_PROPAGATES |
 			  ALWAYS_ENABLED,
 	.rate_offset	= CKCTL_ARMDIV_OFFSET,
@@ -196,7 +196,7 @@
 		.name		= "armper_ck",
 		.parent		= &ck_dpll1,
 		.flags		= CLOCK_IN_OMAP1510 | CLOCK_IN_OMAP16XX |
-				  CLOCK_IN_OMAP310 | RATE_CKCTL |
+				  CLOCK_IN_OMAP310 | CLOCK_IN_OMAP730 | RATE_CKCTL |
 				  CLOCK_IDLE_CONTROL,
 		.enable_reg	= (void __iomem *)ARM_IDLECT2,
 		.enable_bit	= EN_PERCK,
@@ -715,6 +715,20 @@
 	.disable	= &omap1_clk_disable_generic,
 };
 
+static struct clk mmc_ck_730 = {
+	.name		= "mmc_ck",
+	.id		= 3,
+	/* Functional clock is direct from ULPD, interface clock is ARMPER */
+	.parent		= &armper_ck.clk,
+	.rate		= 48000000,
+	.flags		= CLOCK_IN_OMAP730 |
+			  RATE_FIXED | ENABLE_REG_32BIT | CLOCK_NO_IDLE_PARENT,
+	.enable_reg	= (void __iomem *)SOFT_REQ_REG,
+	.enable_bit	= 12,
+	.enable		= &omap1_clk_enable_generic,
+	.disable	= &omap1_clk_disable_generic,
+};
+
 static struct clk virtual_ck_mpu = {
 	.name		= "mpu",
 	.flags		= CLOCK_IN_OMAP1510 | CLOCK_IN_OMAP16XX |
@@ -799,6 +813,7 @@
 	&bclk_1510,  &bclk_16xx,
 	&mmc1_ck,
 	&mmc2_ck,
+	&mmc_ck_730,
 	/* Virtual clocks */
 	&virtual_ck_mpu,
 	&i2c_fck,
Index: linux-2.6.16/arch/arm/mach-omap1/efb.c
===================================================================
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
+++ linux-2.6.16/arch/arm/mach-omap1/efb.c	2007-04-12 10:36:19.000000000 +0200
@@ -0,0 +1,200 @@
+/*
+** efb.c for efb in /home/nico/work/tornado/linux-tornado
+** 
+** Made by nico
+** Login   <nico@chac.le-poulpe.net>
+** 
+** Started on  Wed Apr  5 18:55:08 2006 nico
+** Last update Thu May 11 13:50:52 2006 nico
+*/
+
+/*
+ *
+ * early frame buffer debug routines.
+ * Copyright (C) 2006 Nicolas Schichan
+ *
+ * This  program is  free  software; you  can  redistribute it  and/or
+ * modify  it under the  terms of  the GNU  General Public  License as
+ * published by the Free Software  Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ * 
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT  ANY  WARRANTY;  without   even  the  implied  warranty  of
+ * MERCHANTABILITY or  FITNESS FOR A PARTICULAR PURPOSE.   See the GNU
+ * General Public License for more details.
+ * 
+ * You should have  received a copy of the  GNU General Public License
+ * along  with  this program;  if  not,  write  to the  Free  Software
+ * Foundation,  Inc.,  51 Franklin  Street,  Fifth  Floor, Boston,  MA
+ * 02110-1301, USA. 
+ *
+ */
+
+#include <asm/mach-types.h>
+#include <asm/arch/efb.h>
+
+static void efb_move_screen_up(void);
+static void blit_char(unsigned int x, unsigned int y, char c);
+
+#define PIX16(R, G, B) (((R >> 3) << 11) | ((G >> 2) << 5) | ((B >> 3)))
+
+
+/* 0xD0000000 is where OMAP730_SRAM is mapped by head.S */
+/*
+ * Windows CE seems to have physical frame buffer mapped to
+ * 0x20001020. we try to keep this space available at virtual address
+ * 0xD0001020 during kernel boot. This is strange as this is not page
+ * aligned. However even if I don't know how to do it, there must be a
+ * way to configure the framebuffer location inside the sram.
+ *
+ * TODO: see omap730 TRM.
+ */
+static unsigned short __initdata *vram = (unsigned short *)0xD0001020;
+
+/*
+ * no  attribute since it is used by efb_putstr which has no
+ * attribute ...
+ */
+static int enabled = 0;
+
+unsigned int efb_width;
+unsigned int efb_height;
+
+void __init efb_init(void)
+{
+	unsigned int i;
+
+	/*
+	 * only htc typhoon is known to have 176x220 screen. all other
+	 * machines have 320x240 screens.
+	 */
+	if (machine_is_typhoon()) {
+		efb_width = 176;
+		efb_height = 220;
+	} else {
+		efb_width = 240;
+		efb_height = 320;
+	}
+
+	for (i = 0; i < efb_width * efb_height; ++i) {
+		vram[i] = 0;
+	}
+
+	efb_enable();
+}
+
+
+/*
+ * Write a pixel with color (r,g,b) at screen coordinate (x,y)
+ */
+static void __init dbg_pix(int x, int y, int r, int g, int b)
+{
+	unsigned short pix = PIX16(r, g, b);
+
+	vram[y * efb_width + x] = pix;
+}
+
+
+static __initdata int x = 1;
+static __initdata int  y = 0;
+
+
+/*
+ * put string s to the frame buffer using the 5x5 font.
+ * 
+ * this functions has no __init attribute since it is can be called in printk.
+ */
+void efb_putstr(const char *s)
+{
+	if (enabled == 0)
+		return ;
+
+	while (*s) {
+		if (*s == '\n')
+			goto newline;
+		blit_char(x, y, *s);
+		x += 6;
+
+		if (x + 6 > efb_width) {
+		newline:
+			if (y + 6 > efb_height - 6)
+				efb_move_screen_up();
+			else
+				y += 6;
+			x = 1;
+		}
+		++s;
+	}
+}
+
+#define NR_LINE (efb_height / 6)
+
+#define FONT_WIDTH 5
+#define FONT_HEIGHT 5
+
+/*
+ * blit a char on the screen at position (x,y)
+ */
+static __init void blit_char(unsigned int x, unsigned int y, char c)
+{
+	const char *cur_font;
+	int i, j;
+
+	/*
+	 * do not blit glyph if some part of it are ofscreen.
+	 */
+	if (x + FONT_WIDTH > efb_width)
+		return;
+	if (y + FONT_HEIGHT > efb_height)
+		return;
+
+	cur_font = efb_font[(unsigned int)c];
+	for (j= 0; j < FONT_HEIGHT; ++j) {
+		for (i = 0; i < FONT_WIDTH; ++i) {
+			if (cur_font[j * FONT_WIDTH + i])
+				dbg_pix(x + i, y + j, 255, 255, 255);
+			else
+				dbg_pix(x + i, y + j, 0, 0, 0);
+		}
+	}
+}
+
+/*
+ * perform some basic one way scrolling.
+ *
+ * for each line l do
+ *   clear line l
+ *   break if l is the last line
+ *   copy next line over l
+ * done
+ *
+ * It is not possible to scroll back.
+ */
+static void __init efb_move_screen_up(void)
+{
+	int i, k;
+	int start1, start2;
+
+	for (k = 0; 1; ++k) {
+		start1 = efb_width * 6 * k;
+		start2 = efb_width * 6 * (k + 1);
+		/* clear the n current line */
+		for (i = 0; i < 6 * efb_width; ++i)
+			vram[start1 + i] = 0;
+		if (k == NR_LINE - 1)
+			break;
+		/* copy the next line to the current line */
+		for (i = 0; i < 6 * efb_width; ++i)
+			vram[start1 + i] = vram[start2 +i];
+	}
+}
+
+void __init efb_disable(void)
+{
+	enabled = 0;
+}
+
+void __init efb_enable(void)
+{
+	enabled = 1;
+}
Index: linux-2.6.16/arch/arm/mach-omap1/efb-font5x5.c
===================================================================
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
+++ linux-2.6.16/arch/arm/mach-omap1/efb-font5x5.c	2007-04-12 10:36:19.000000000 +0200
@@ -0,0 +1,982 @@
+
+/* 
+ * file generated by makecfont.pl and bmp2c
+ * resources for a simple 5x5 font
+ */
+
+const char efb_font[255][25] = {
+	/* not available */
+	{ 0x00 },
+	/* not available */
+	{ 0x00 },
+	/* not available */
+	{ 0x00 },
+	/* not available */
+	{ 0x00 },
+	/* not available */
+	{ 0x00 },
+	/* not available */
+	{ 0x00 },
+	/* not available */
+	{ 0x00 },
+	/* not available */
+	{ 0x00 },
+	/* not available */
+	{ 0x00 },
+	/* not available */
+	{ 0x00 },
+	/* not available */
+	{ 0x00 },
+	/* not available */
+	{ 0x00 },
+	/* not available */
+	{ 0x00 },
+	/* not available */
+	{ 0x00 },
+	/* not available */
+	{ 0x00 },
+	/* not available */
+	{ 0x00 },
+	/* not available */
+	{ 0x00 },
+	/* not available */
+	{ 0x00 },
+	/* not available */
+	{ 0x00 },
+	/* not available */
+	{ 0x00 },
+	/* not available */
+	{ 0x00 },
+	/* not available */
+	{ 0x00 },
+	/* not available */
+	{ 0x00 },
+	/* not available */
+	{ 0x00 },
+	/* not available */
+	{ 0x00 },
+	/* not available */
+	{ 0x00 },
+	/* not available */
+	{ 0x00 },
+	/* not available */
+	{ 0x00 },
+	/* not available */
+	{ 0x00 },
+	/* not available */
+	{ 0x00 },
+	/* not available */
+	{ 0x00 },
+	/* not available */
+	{ 0x00 },
+	/* not available */
+	{ 0x00 },
+	/* not available */
+	{ 0x00 },
+	/* not available */
+	{ 0x00 },
+	/* not available */
+	{ 0x00 },
+	/* not available */
+	{ 0x00 },
+	/* not available */
+	{ 0x00 },
+	/* not available */
+	{ 0x00 },
+	/* not available */
+	{ 0x00 },
+	/* lpar.bmp */
+	{
+		0x00, 0x00, 0xFF, 0x00, 0x00, 
+		0x00, 0xFF, 0x00, 0x00, 0x00, 
+		0x00, 0xFF, 0x00, 0x00, 0x00, 
+		0x00, 0xFF, 0x00, 0x00, 0x00, 
+		0x00, 0x00, 0xFF, 0x00, 0x00, 
+	},
+	/* rpar.bmp */
+	{
+		0x00, 0x00, 0xFF, 0x00, 0x00, 
+		0x00, 0x00, 0x00, 0xFF, 0x00, 
+		0x00, 0x00, 0x00, 0xFF, 0x00, 
+		0x00, 0x00, 0x00, 0xFF, 0x00, 
+		0x00, 0x00, 0xFF, 0x00, 0x00, 
+	},
+	/* star.bmp */
+	{
+		0xFF, 0x00, 0xFF, 0x00, 0xFF, 
+		0x00, 0xFF, 0xFF, 0xFF, 0x00, 
+		0x00, 0x00, 0xFF, 0x00, 0x00, 
+		0x00, 0xFF, 0xFF, 0xFF, 0x00, 
+		0xFF, 0x00, 0xFF, 0x00, 0xFF, 
+	},
+	/* not available */
+	{ 0x00 },
+	/* not available */
+	{ 0x00 },
+	/* dash.bmp */
+	{
+		0x00, 0x00, 0x00, 0x00, 0x00, 
+		0x00, 0x00, 0x00, 0x00, 0x00, 
+		0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 
+		0x00, 0x00, 0x00, 0x00, 0x00, 
+		0x00, 0x00, 0x00, 0x00, 0x00, 
+	},
+	/* dot.bmp */
+	{
+		0x00, 0x00, 0x00, 0x00, 0x00, 
+		0x00, 0x00, 0x00, 0x00, 0x00, 
+		0x00, 0x00, 0x00, 0x00, 0x00, 
+		0x00, 0x00, 0x00, 0x00, 0x00, 
+		0x00, 0x00, 0xFF, 0x00, 0x00, 
+	},
+	/* slash.bmp */
+	{
+		0x00, 0x00, 0x00, 0x00, 0xFF, 
+		0x00, 0x00, 0x00, 0xFF, 0x00, 
+		0x00, 0x00, 0xFF, 0x00, 0x00, 
+		0x00, 0xFF, 0x00, 0x00, 0x00, 
+		0xFF, 0x00, 0x00, 0x00, 0x00, 
+	},
+	/* 0.bmp */
+	{
+		0x00, 0xFF, 0xFF, 0xFF, 0x00, 
+		0xFF, 0x00, 0x00, 0xFF, 0xFF, 
+		0xFF, 0x00, 0xFF, 0x00, 0xFF, 
+		0xFF, 0xFF, 0x00, 0x00, 0xFF, 
+		0x00, 0xFF, 0xFF, 0xFF, 0x00, 
+	},
+	/* 1.bmp */
+	{
+		0x00, 0x00, 0xFF, 0x00, 0x00, 
+		0x00, 0xFF, 0xFF, 0x00, 0x00, 
+		0x00, 0x00, 0xFF, 0x00, 0x00, 
+		0x00, 0x00, 0xFF, 0x00, 0x00, 
+		0x00, 0xFF, 0xFF, 0xFF, 0x00, 
+	},
+	/* 2.bmp */
+	{
+		0x00, 0xFF, 0xFF, 0x00, 0x00, 
+		0x00, 0x00, 0x00, 0xFF, 0x00, 
+		0x00, 0x00, 0xFF, 0x00, 0x00, 
+		0x00, 0xFF, 0x00, 0x00, 0x00, 
+		0x00, 0xFF, 0xFF, 0xFF, 0x00, 
+	},
+	/* 3.bmp */
+	{
+		0xFF, 0xFF, 0xFF, 0xFF, 0x00, 
+		0x00, 0x00, 0x00, 0x00, 0xFF, 
+		0xFF, 0xFF, 0xFF, 0xFF, 0x00, 
+		0x00, 0x00, 0x00, 0x00, 0xFF, 
+		0xFF, 0xFF, 0xFF, 0xFF, 0x00, 
+	},
+	/* 4.bmp */
+	{
+		0xFF, 0x00, 0xFF, 0x00, 0x00, 
+		0xFF, 0x00, 0xFF, 0x00, 0x00, 
+		0xFF, 0xFF, 0xFF, 0xFF, 0x00, 
+		0x00, 0x00, 0xFF, 0x00, 0x00, 
+		0x00, 0x00, 0xFF, 0x00, 0x00, 
+	},
+	/* 5.bmp */
+	{
+		0x00, 0xFF, 0xFF, 0xFF, 0x00, 
+		0x00, 0xFF, 0x00, 0x00, 0x00, 
+		0x00, 0xFF, 0xFF, 0x00, 0x00, 
+		0x00, 0x00, 0x00, 0xFF, 0x00, 
+		0x00, 0xFF, 0xFF, 0x00, 0x00, 
+	},
+	/* 6.bmp */
+	{
+		0x00, 0xFF, 0xFF, 0xFF, 0x00, 
+		0xFF, 0x00, 0x00, 0x00, 0x00, 
+		0xFF, 0xFF, 0xFF, 0xFF, 0x00, 
+		0xFF, 0x00, 0x00, 0x00, 0xFF, 
+		0x00, 0xFF, 0xFF, 0xFF, 0x00, 
+	},
+	/* 7.bmp */
+	{
+		0x00, 0xFF, 0xFF, 0xFF, 0x00, 
+		0x00, 0x00, 0x00, 0xFF, 0x00, 
+		0x00, 0x00, 0xFF, 0x00, 0x00, 
+		0x00, 0x00, 0xFF, 0x00, 0x00, 
+		0x00, 0x00, 0xFF, 0x00, 0x00, 
+	},
+	/* 8.bmp */
+	{
+		0x00, 0xFF, 0xFF, 0xFF, 0x00, 
+		0xFF, 0x00, 0x00, 0x00, 0xFF, 
+		0x00, 0xFF, 0xFF, 0xFF, 0x00, 
+		0xFF, 0x00, 0x00, 0x00, 0xFF, 
+		0x00, 0xFF, 0xFF, 0xFF, 0x00, 
+	},
+	/* 9.bmp */
+	{
+		0x00, 0xFF, 0xFF, 0xFF, 0x00, 
+		0xFF, 0x00, 0x00, 0x00, 0xFF, 
+		0x00, 0xFF, 0xFF, 0xFF, 0xFF, 
+		0x00, 0x00, 0x00, 0x00, 0xFF, 
+		0x00, 0xFF, 0xFF, 0xFF, 0x00, 
+	},
+	/* ddot.bmp */
+	{
+		0x00, 0x00, 0x00, 0x00, 0x00, 
+		0x00, 0x00, 0x00, 0x00, 0x00, 
+		0x00, 0x00, 0xFF, 0x00, 0x00, 
+		0x00, 0x00, 0x00, 0x00, 0x00, 
+		0x00, 0x00, 0xFF, 0x00, 0x00, 
+	},
+	/* not available */
+	{ 0x00 },
+	/* lchev.bmp */
+	{
+		0x00, 0x00, 0x00, 0x00, 0xFF, 
+		0x00, 0x00, 0xFF, 0xFF, 0x00, 
+		0xFF, 0xFF, 0x00, 0x00, 0x00, 
+		0x00, 0x00, 0xFF, 0xFF, 0x00, 
+		0x00, 0x00, 0x00, 0x00, 0xFF, 
+	},
+	/* eq.bmp */
+	{
+		0x00, 0x00, 0x00, 0x00, 0x00, 
+		0x00, 0xFF, 0xFF, 0xFF, 0x00, 
+		0x00, 0x00, 0x00, 0x00, 0x00, 
+		0x00, 0xFF, 0xFF, 0xFF, 0x00, 
+		0x00, 0x00, 0x00, 0x00, 0x00, 
+	},
+	/* rchev.bmp */
+	{
+		0xFF, 0x00, 0x00, 0x00, 0x00, 
+		0x00, 0xFF, 0xFF, 0x00, 0x00, 
+		0x00, 0x00, 0x00, 0xFF, 0xFF, 
+		0x00, 0xFF, 0xFF, 0x00, 0x00, 
+		0xFF, 0x00, 0x00, 0x00, 0x00, 
+	},
+	/* not available */
+	{ 0x00 },
+	/* not available */
+	{ 0x00 },
+	/* A.bmp */
+	{
+		0x00, 0x00, 0xFF, 0x00, 0x00, 
+		0x00, 0xFF, 0x00, 0xFF, 0x00, 
+		0xFF, 0x00, 0x00, 0x00, 0xFF, 
+		0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 
+		0xFF, 0x00, 0x00, 0x00, 0xFF, 
+	},
+	/* B.bmp */
+	{
+		0xFF, 0xFF, 0xFF, 0xFF, 0x00, 
+		0xFF, 0x00, 0x00, 0x00, 0xFF, 
+		0xFF, 0xFF, 0xFF, 0xFF, 0x00, 
+		0xFF, 0x00, 0x00, 0x00, 0xFF, 
+		0xFF, 0xFF, 0xFF, 0xFF, 0x00, 
+	},
+	/* C.bmp */
+	{
+		0x00, 0xFF, 0xFF, 0xFF, 0x00, 
+		0xFF, 0x00, 0x00, 0x00, 0xFF, 
+		0xFF, 0x00, 0x00, 0x00, 0x00, 
+		0xFF, 0x00, 0x00, 0x00, 0xFF, 
+		0x00, 0xFF, 0xFF, 0xFF, 0x00, 
+	},
+	/* D.bmp */
+	{
+		0xFF, 0xFF, 0xFF, 0xFF, 0x00, 
+		0xFF, 0x00, 0x00, 0x00, 0xFF, 
+		0xFF, 0x00, 0x00, 0x00, 0xFF, 
+		0xFF, 0x00, 0x00, 0x00, 0xFF, 
+		0xFF, 0xFF, 0xFF, 0xFF, 0x00, 
+	},
+	/* E.bmp */
+	{
+		0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 
+		0xFF, 0x00, 0x00, 0x00, 0x00, 
+		0xFF, 0xFF, 0xFF, 0xFF, 0x00, 
+		0xFF, 0x00, 0x00, 0x00, 0x00, 
+		0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 
+	},
+	/* F.bmp */
+	{
+		0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 
+		0xFF, 0x00, 0x00, 0x00, 0x00, 
+		0xFF, 0xFF, 0xFF, 0xFF, 0x00, 
+		0xFF, 0x00, 0x00, 0x00, 0x00, 
+		0xFF, 0x00, 0x00, 0x00, 0x00, 
+	},
+	/* G.bmp */
+	{
+		0x00, 0xFF, 0xFF, 0xFF, 0x00, 
+		0xFF, 0x00, 0x00, 0x00, 0x00, 
+		0xFF, 0x00, 0x00, 0xFF, 0xFF, 
+		0xFF, 0x00, 0x00, 0x00, 0xFF, 
+		0x00, 0xFF, 0xFF, 0xFF, 0x00, 
+	},
+	/* H.bmp */
+	{
+		0xFF, 0x00, 0x00, 0x00, 0xFF, 
+		0xFF, 0x00, 0x00, 0x00, 0xFF, 
+		0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 
+		0xFF, 0x00, 0x00, 0x00, 0xFF, 
+		0xFF, 0x00, 0x00, 0x00, 0xFF, 
+	},
+	/* I.bmp */
+	{
+		0x00, 0xFF, 0xFF, 0xFF, 0x00, 
+		0x00, 0x00, 0xFF, 0x00, 0x00, 
+		0x00, 0x00, 0xFF, 0x00, 0x00, 
+		0x00, 0x00, 0xFF, 0x00, 0x00, 
+		0x00, 0xFF, 0xFF, 0xFF, 0x00, 
+	},
+	/* J.bmp */
+	{
+		0x00, 0x00, 0x00, 0x00, 0xFF, 
+		0x00, 0x00, 0x00, 0x00, 0xFF, 
+		0x00, 0x00, 0x00, 0x00, 0xFF, 
+		0xFF, 0x00, 0x00, 0x00, 0xFF, 
+		0x00, 0xFF, 0xFF, 0xFF, 0x00, 
+	},
+	/* K.bmp */
+	{
+		0xFF, 0x00, 0x00, 0x00, 0xFF, 
+		0xFF, 0x00, 0xFF, 0xFF, 0x00, 
+		0xFF, 0xFF, 0x00, 0x00, 0x00, 
+		0xFF, 0x00, 0xFF, 0xFF, 0x00, 
+		0xFF, 0x00, 0x00, 0x00, 0xFF, 
+	},
+	/* L.bmp */
+	{
+		0xFF, 0x00, 0x00, 0x00, 0x00, 
+		0xFF, 0x00, 0x00, 0x00, 0x00, 
+		0xFF, 0x00, 0x00, 0x00, 0x00, 
+		0xFF, 0x00, 0x00, 0x00, 0x00, 
+		0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 
+	},
+	/* M.bmp */
+	{
+		0xFF, 0x00, 0x00, 0x00, 0xFF, 
+		0xFF, 0xFF, 0x00, 0xFF, 0xFF, 
+		0xFF, 0x00, 0xFF, 0x00, 0xFF, 
+		0xFF, 0x00, 0x00, 0x00, 0xFF, 
+		0xFF, 0x00, 0x00, 0x00, 0xFF, 
+	},
+	/* N.bmp */
+	{
+		0xFF, 0x00, 0x00, 0x00, 0xFF, 
+		0xFF, 0xFF, 0x00, 0x00, 0xFF, 
+		0xFF, 0x00, 0xFF, 0x00, 0xFF, 
+		0xFF, 0x00, 0x00, 0xFF, 0xFF, 
+		0xFF, 0x00, 0x00, 0x00, 0xFF, 
+	},
+	/* O.bmp */
+	{
+		0x00, 0xFF, 0xFF, 0xFF, 0x00, 
+		0xFF, 0x00, 0x00, 0x00, 0xFF, 
+		0xFF, 0x00, 0x00, 0x00, 0xFF, 
+		0xFF, 0x00, 0x00, 0x00, 0xFF, 
+		0x00, 0xFF, 0xFF, 0xFF, 0x00, 
+	},
+	/* P.bmp */
+	{
+		0xFF, 0xFF, 0xFF, 0xFF, 0x00, 
+		0xFF, 0x00, 0x00, 0x00, 0xFF, 
+		0xFF, 0xFF, 0xFF, 0xFF, 0x00, 
+		0xFF, 0x00, 0x00, 0x00, 0x00, 
+		0xFF, 0x00, 0x00, 0x00, 0x00, 
+	},
+	/* Q.bmp */
+	{
+		0x00, 0xFF, 0xFF, 0xFF, 0x00, 
+		0xFF, 0x00, 0x00, 0x00, 0xFF, 
+		0xFF, 0x00, 0x00, 0x00, 0xFF, 
+		0xFF, 0x00, 0x00, 0xFF, 0x00, 
+		0x00, 0xFF, 0xFF, 0x00, 0xFF, 
+	},
+	/* R.bmp */
+	{
+		0xFF, 0xFF, 0xFF, 0xFF, 0x00, 
+		0xFF, 0x00, 0x00, 0x00, 0xFF, 
+		0xFF, 0xFF, 0xFF, 0xFF, 0x00, 
+		0xFF, 0x00, 0x00, 0x00, 0xFF, 
+		0xFF, 0x00, 0x00, 0x00, 0xFF, 
+	},
+	/* S.bmp */
+	{
+		0x00, 0xFF, 0xFF, 0xFF, 0xFF, 
+		0xFF, 0x00, 0x00, 0x00, 0x00, 
+		0x00, 0xFF, 0xFF, 0xFF, 0x00, 
+		0x00, 0x00, 0x00, 0x00, 0xFF, 
+		0xFF, 0xFF, 0xFF, 0xFF, 0x00, 
+	},
+	/* T.bmp */
+	{
+		0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 
+		0x00, 0x00, 0xFF, 0x00, 0x00, 
+		0x00, 0x00, 0xFF, 0x00, 0x00, 
+		0x00, 0x00, 0xFF, 0x00, 0x00, 
+		0x00, 0x00, 0xFF, 0x00, 0x00, 
+	},
+	/* U.bmp */
+	{
+		0xFF, 0x00, 0x00, 0x00, 0xFF, 
+		0xFF, 0x00, 0x00, 0x00, 0xFF, 
+		0xFF, 0x00, 0x00, 0x00, 0xFF, 
+		0xFF, 0x00, 0x00, 0x00, 0xFF, 
+		0x00, 0xFF, 0xFF, 0xFF, 0x00, 
+	},
+	/* V.bmp */
+	{
+		0xFF, 0x00, 0x00, 0x00, 0xFF, 
+		0xFF, 0x00, 0x00, 0x00, 0xFF, 
+		0x00, 0xFF, 0x00, 0xFF, 0x00, 
+		0x00, 0xFF, 0x00, 0xFF, 0x00, 
+		0x00, 0x00, 0xFF, 0x00, 0x00, 
+	},
+	/* W.bmp */
+	{
+		0xFF, 0x00, 0xFF, 0x00, 0xFF, 
+		0xFF, 0x00, 0xFF, 0x00, 0xFF, 
+		0xFF, 0x00, 0xFF, 0x00, 0xFF, 
+		0x00, 0xFF, 0x00, 0xFF, 0x00, 
+		0x00, 0xFF, 0x00, 0xFF, 0x00, 
+	},
+	/* X.bmp */
+	{
+		0xFF, 0x00, 0x00, 0x00, 0xFF, 
+		0x00, 0xFF, 0x00, 0xFF, 0x00, 
+		0x00, 0x00, 0xFF, 0x00, 0x00, 
+		0x00, 0xFF, 0x00, 0xFF, 0x00, 
+		0xFF, 0x00, 0x00, 0x00, 0xFF, 
+	},
+	/* Y.bmp */
+	{
+		0xFF, 0x00, 0x00, 0x00, 0xFF, 
+		0x00, 0xFF, 0x00, 0xFF, 0x00, 
+		0x00, 0x00, 0xFF, 0x00, 0x00, 
+		0x00, 0xFF, 0x00, 0x00, 0x00, 
+		0xFF, 0x00, 0x00, 0x00, 0x00, 
+	},
+	/* Z.bmp */
+	{
+		0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 
+		0x00, 0x00, 0x00, 0xFF, 0x00, 
+		0x00, 0x00, 0xFF, 0x00, 0x00, 
+		0x00, 0xFF, 0x00, 0x00, 0x00, 
+		0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 
+	},
+	/* ldash.bmp */
+	{
+		0x00, 0xFF, 0xFF, 0xFF, 0x00, 
+		0x00, 0xFF, 0x00, 0x00, 0x00, 
+		0x00, 0xFF, 0x00, 0x00, 0x00, 
+		0x00, 0xFF, 0x00, 0x00, 0x00, 
+		0x00, 0xFF, 0xFF, 0xFF, 0x00, 
+	},
+	/* aslash.bmp */
+	{
+		0xFF, 0x00, 0x00, 0x00, 0x00, 
+		0x00, 0xFF, 0x00, 0x00, 0x00, 
+		0x00, 0x00, 0xFF, 0x00, 0x00, 
+		0x00, 0x00, 0x00, 0xFF, 0x00, 
+		0x00, 0x00, 0x00, 0x00, 0xFF, 
+	},
+	/* rdash.bmp */
+	{
+		0x00, 0xFF, 0xFF, 0xFF, 0x00, 
+		0x00, 0x00, 0x00, 0xFF, 0x00, 
+		0x00, 0x00, 0x00, 0xFF, 0x00, 
+		0x00, 0x00, 0x00, 0xFF, 0x00, 
+		0x00, 0xFF, 0xFF, 0xFF, 0x00, 
+	},
+	/* not available */
+	{ 0x00 },
+	/* _.bmp */
+	{
+		0x00, 0x00, 0x00, 0x00, 0x00, 
+		0x00, 0x00, 0x00, 0x00, 0x00, 
+		0x00, 0x00, 0x00, 0x00, 0x00, 
+		0x00, 0x00, 0x00, 0x00, 0x00, 
+		0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 
+	},
+	/* not available */
+	{ 0x00 },
+	/* a.bmp */
+	{
+		0x00, 0x00, 0xFF, 0x00, 0x00, 
+		0x00, 0xFF, 0x00, 0xFF, 0x00, 
+		0xFF, 0x00, 0x00, 0x00, 0xFF, 
+		0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 
+		0xFF, 0x00, 0x00, 0x00, 0xFF, 
+	},
+	/* b.bmp */
+	{
+		0xFF, 0xFF, 0xFF, 0xFF, 0x00, 
+		0xFF, 0x00, 0x00, 0x00, 0xFF, 
+		0xFF, 0xFF, 0xFF, 0xFF, 0x00, 
+		0xFF, 0x00, 0x00, 0x00, 0xFF, 
+		0xFF, 0xFF, 0xFF, 0xFF, 0x00, 
+	},
+	/* c.bmp */
+	{
+		0x00, 0xFF, 0xFF, 0xFF, 0x00, 
+		0xFF, 0x00, 0x00, 0x00, 0xFF, 
+		0xFF, 0x00, 0x00, 0x00, 0x00, 
+		0xFF, 0x00, 0x00, 0x00, 0xFF, 
+		0x00, 0xFF, 0xFF, 0xFF, 0x00, 
+	},
+	/* d.bmp */
+	{
+		0xFF, 0xFF, 0xFF, 0xFF, 0x00, 
+		0xFF, 0x00, 0x00, 0x00, 0xFF, 
+		0xFF, 0x00, 0x00, 0x00, 0xFF, 
+		0xFF, 0x00, 0x00, 0x00, 0xFF, 
+		0xFF, 0xFF, 0xFF, 0xFF, 0x00, 
+	},
+	/* e.bmp */
+	{
+		0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 
+		0xFF, 0x00, 0x00, 0x00, 0x00, 
+		0xFF, 0xFF, 0xFF, 0xFF, 0x00, 
+		0xFF, 0x00, 0x00, 0x00, 0x00, 
+		0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 
+	},
+	/* f.bmp */
+	{
+		0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 
+		0xFF, 0x00, 0x00, 0x00, 0x00, 
+		0xFF, 0xFF, 0xFF, 0xFF, 0x00, 
+		0xFF, 0x00, 0x00, 0x00, 0x00, 
+		0xFF, 0x00, 0x00, 0x00, 0x00, 
+	},
+	/* g.bmp */
+	{
+		0x00, 0xFF, 0xFF, 0xFF, 0x00, 
+		0xFF, 0x00, 0x00, 0x00, 0x00, 
+		0xFF, 0x00, 0x00, 0xFF, 0xFF, 
+		0xFF, 0x00, 0x00, 0x00, 0xFF, 
+		0x00, 0xFF, 0xFF, 0xFF, 0x00, 
+	},
+	/* h.bmp */
+	{
+		0xFF, 0x00, 0x00, 0x00, 0xFF, 
+		0xFF, 0x00, 0x00, 0x00, 0xFF, 
+		0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 
+		0xFF, 0x00, 0x00, 0x00, 0xFF, 
+		0xFF, 0x00, 0x00, 0x00, 0xFF, 
+	},
+	/* i.bmp */
+	{
+		0x00, 0xFF, 0xFF, 0xFF, 0x00, 
+		0x00, 0x00, 0xFF, 0x00, 0x00, 
+		0x00, 0x00, 0xFF, 0x00, 0x00, 
+		0x00, 0x00, 0xFF, 0x00, 0x00, 
+		0x00, 0xFF, 0xFF, 0xFF, 0x00, 
+	},
+	/* j.bmp */
+	{
+		0x00, 0x00, 0x00, 0x00, 0xFF, 
+		0x00, 0x00, 0x00, 0x00, 0xFF, 
+		0x00, 0x00, 0x00, 0x00, 0xFF, 
+		0xFF, 0x00, 0x00, 0x00, 0xFF, 
+		0x00, 0xFF, 0xFF, 0xFF, 0x00, 
+	},
+	/* k.bmp */
+	{
+		0xFF, 0x00, 0x00, 0x00, 0xFF, 
+		0xFF, 0x00, 0xFF, 0xFF, 0x00, 
+		0xFF, 0xFF, 0x00, 0x00, 0x00, 
+		0xFF, 0x00, 0xFF, 0xFF, 0x00, 
+		0xFF, 0x00, 0x00, 0x00, 0xFF, 
+	},
+	/* l.bmp */
+	{
+		0xFF, 0x00, 0x00, 0x00, 0x00, 
+		0xFF, 0x00, 0x00, 0x00, 0x00, 
+		0xFF, 0x00, 0x00, 0x00, 0x00, 
+		0xFF, 0x00, 0x00, 0x00, 0x00, 
+		0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 
+	},
+	/* m.bmp */
+	{
+		0xFF, 0x00, 0x00, 0x00, 0xFF, 
+		0xFF, 0xFF, 0x00, 0xFF, 0xFF, 
+		0xFF, 0x00, 0xFF, 0x00, 0xFF, 
+		0xFF, 0x00, 0x00, 0x00, 0xFF, 
+		0xFF, 0x00, 0x00, 0x00, 0xFF, 
+	},
+	/* n.bmp */
+	{
+		0xFF, 0x00, 0x00, 0x00, 0xFF, 
+		0xFF, 0xFF, 0x00, 0x00, 0xFF, 
+		0xFF, 0x00, 0xFF, 0x00, 0xFF, 
+		0xFF, 0x00, 0x00, 0xFF, 0xFF, 
+		0xFF, 0x00, 0x00, 0x00, 0xFF, 
+	},
+	/* o.bmp */
+	{
+		0x00, 0xFF, 0xFF, 0xFF, 0x00, 
+		0xFF, 0x00, 0x00, 0x00, 0xFF, 
+		0xFF, 0x00, 0x00, 0x00, 0xFF, 
+		0xFF, 0x00, 0x00, 0x00, 0xFF, 
+		0x00, 0xFF, 0xFF, 0xFF, 0x00, 
+	},
+	/* p.bmp */
+	{
+		0xFF, 0xFF, 0xFF, 0xFF, 0x00, 
+		0xFF, 0x00, 0x00, 0x00, 0xFF, 
+		0xFF, 0xFF, 0xFF, 0xFF, 0x00, 
+		0xFF, 0x00, 0x00, 0x00, 0x00, 
+		0xFF, 0x00, 0x00, 0x00, 0x00, 
+	},
+	/* q.bmp */
+	{
+		0x00, 0xFF, 0xFF, 0xFF, 0x00, 
+		0xFF, 0x00, 0x00, 0x00, 0xFF, 
+		0xFF, 0x00, 0x00, 0x00, 0xFF, 
+		0xFF, 0x00, 0x00, 0xFF, 0x00, 
+		0x00, 0xFF, 0xFF, 0x00, 0xFF, 
+	},
+	/* r.bmp */
+	{
+		0xFF, 0xFF, 0xFF, 0xFF, 0x00, 
+		0xFF, 0x00, 0x00, 0x00, 0xFF, 
+		0xFF, 0xFF, 0xFF, 0xFF, 0x00, 
+		0xFF, 0x00, 0x00, 0x00, 0xFF, 
+		0xFF, 0x00, 0x00, 0x00, 0xFF, 
+	},
+	/* s.bmp */
+	{
+		0x00, 0xFF, 0xFF, 0xFF, 0xFF, 
+		0xFF, 0x00, 0x00, 0x00, 0x00, 
+		0x00, 0xFF, 0xFF, 0xFF, 0x00, 
+		0x00, 0x00, 0x00, 0x00, 0xFF, 
+		0xFF, 0xFF, 0xFF, 0xFF, 0x00, 
+	},
+	/* t.bmp */
+	{
+		0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 
+		0x00, 0x00, 0xFF, 0x00, 0x00, 
+		0x00, 0x00, 0xFF, 0x00, 0x00, 
+		0x00, 0x00, 0xFF, 0x00, 0x00, 
+		0x00, 0x00, 0xFF, 0x00, 0x00, 
+	},
+	/* u.bmp */
+	{
+		0xFF, 0x00, 0x00, 0x00, 0xFF, 
+		0xFF, 0x00, 0x00, 0x00, 0xFF, 
+		0xFF, 0x00, 0x00, 0x00, 0xFF, 
+		0xFF, 0x00, 0x00, 0x00, 0xFF, 
+		0x00, 0xFF, 0xFF, 0xFF, 0x00, 
+	},
+	/* v.bmp */
+	{
+		0xFF, 0x00, 0x00, 0x00, 0xFF, 
+		0xFF, 0x00, 0x00, 0x00, 0xFF, 
+		0x00, 0xFF, 0x00, 0xFF, 0x00, 
+		0x00, 0xFF, 0x00, 0xFF, 0x00, 
+		0x00, 0x00, 0xFF, 0x00, 0x00, 
+	},
+	/* w.bmp */
+	{
+		0xFF, 0x00, 0xFF, 0x00, 0xFF, 
+		0xFF, 0x00, 0xFF, 0x00, 0xFF, 
+		0xFF, 0x00, 0xFF, 0x00, 0xFF, 
+		0x00, 0xFF, 0x00, 0xFF, 0x00, 
+		0x00, 0xFF, 0x00, 0xFF, 0x00, 
+	},
+	/* x.bmp */
+	{
+		0xFF, 0x00, 0x00, 0x00, 0xFF, 
+		0x00, 0xFF, 0x00, 0xFF, 0x00, 
+		0x00, 0x00, 0xFF, 0x00, 0x00, 
+		0x00, 0xFF, 0x00, 0xFF, 0x00, 
+		0xFF, 0x00, 0x00, 0x00, 0xFF, 
+	},
+	/* y.bmp */
+	{
+		0xFF, 0x00, 0x00, 0x00, 0xFF, 
+		0x00, 0xFF, 0x00, 0xFF, 0x00, 
+		0x00, 0x00, 0xFF, 0x00, 0x00, 
+		0x00, 0xFF, 0x00, 0x00, 0x00, 
+		0xFF, 0x00, 0x00, 0x00, 0x00, 
+	},
+	/* z.bmp */
+	{
+		0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 
+		0x00, 0x00, 0x00, 0xFF, 0x00, 
+		0x00, 0x00, 0xFF, 0x00, 0x00, 
+		0x00, 0xFF, 0x00, 0x00, 0x00, 
+		0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 
+	},
+	/* not available */
+	{ 0x00 },
+	/* pipe.bmp */
+	{
+		0x00, 0x00, 0xFF, 0x00, 0x00, 
+		0x00, 0x00, 0xFF, 0x00, 0x00, 
+		0x00, 0x00, 0xFF, 0x00, 0x00, 
+		0x00, 0x00, 0xFF, 0x00, 0x00, 
+		0x00, 0x00, 0xFF, 0x00, 0x00, 
+	},
+	/* not available */
+	{ 0x00 },
+	/* not available */
+	{ 0x00 },
+	/* not available */
+	{ 0x00 },
+	/* not available */
+	{ 0x00 },
+	/* not available */
+	{ 0x00 },
+	/* not available */
+	{ 0x00 },
+	/* not available */
+	{ 0x00 },
+	/* not available */
+	{ 0x00 },
+	/* not available */
+	{ 0x00 },
+	/* not available */
+	{ 0x00 },
+	/* not available */
+	{ 0x00 },
+	/* not available */
+	{ 0x00 },
+	/* not available */
+	{ 0x00 },
+	/* not available */
+	{ 0x00 },
+	/* not available */
+	{ 0x00 },
+	/* not available */
+	{ 0x00 },
+	/* not available */
+	{ 0x00 },
+	/* not available */
+	{ 0x00 },
+	/* not available */
+	{ 0x00 },
+	/* not available */
+	{ 0x00 },
+	/* not available */
+	{ 0x00 },
+	/* not available */
+	{ 0x00 },
+	/* not available */
+	{ 0x00 },
+	/* not available */
+	{ 0x00 },
+	/* not available */
+	{ 0x00 },
+	/* not available */
+	{ 0x00 },
+	/* not available */
+	{ 0x00 },
+	/* not available */
+	{ 0x00 },
+	/* not available */
+	{ 0x00 },
+	/* not available */
+	{ 0x00 },
+	/* not available */
+	{ 0x00 },
+	/* not available */
+	{ 0x00 },
+	/* not available */
+	{ 0x00 },
+	/* not available */
+	{ 0x00 },
+	/* not available */
+	{ 0x00 },
+	/* not available */
+	{ 0x00 },
+	/* not available */
+	{ 0x00 },
+	/* not available */
+	{ 0x00 },
+	/* not available */
+	{ 0x00 },
+	/* not available */
+	{ 0x00 },
+	/* not available */
+	{ 0x00 },
+	/* not available */
+	{ 0x00 },
+	/* not available */
+	{ 0x00 },
+	/* not available */
+	{ 0x00 },
+	/* not available */
+	{ 0x00 },
+	/* not available */
+	{ 0x00 },
+	/* not available */
+	{ 0x00 },
+	/* not available */
+	{ 0x00 },
+	/* not available */
+	{ 0x00 },
+	/* not available */
+	{ 0x00 },
+	/* not available */
+	{ 0x00 },
+	/* not available */
+	{ 0x00 },
+	/* not available */
+	{ 0x00 },
+	/* not available */
+	{ 0x00 },
+	/* not available */
+	{ 0x00 },
+	/* not available */
+	{ 0x00 },
+	/* not available */
+	{ 0x00 },
+	/* not available */
+	{ 0x00 },
+	/* not available */
+	{ 0x00 },
+	/* not available */
+	{ 0x00 },
+	/* not available */
+	{ 0x00 },
+	/* not available */
+	{ 0x00 },
+	/* not available */
+	{ 0x00 },
+	/* not available */
+	{ 0x00 },
+	/* not available */
+	{ 0x00 },
+	/* not available */
+	{ 0x00 },
+	/* not available */
+	{ 0x00 },
+	/* not available */
+	{ 0x00 },
+	/* not available */
+	{ 0x00 },
+	/* not available */
+	{ 0x00 },
+	/* not available */
+	{ 0x00 },
+	/* not available */
+	{ 0x00 },
+	/* not available */
+	{ 0x00 },
+	/* not available */
+	{ 0x00 },
+	/* not available */
+	{ 0x00 },
+	/* not available */
+	{ 0x00 },
+	/* not available */
+	{ 0x00 },
+	/* not available */
+	{ 0x00 },
+	/* not available */
+	{ 0x00 },
+	/* not available */
+	{ 0x00 },
+	/* not available */
+	{ 0x00 },
+	/* not available */
+	{ 0x00 },
+	/* not available */
+	{ 0x00 },
+	/* not available */
+	{ 0x00 },
+	/* not available */
+	{ 0x00 },
+	/* not available */
+	{ 0x00 },
+	/* not available */
+	{ 0x00 },
+	/* not available */
+	{ 0x00 },
+	/* not available */
+	{ 0x00 },
+	/* not available */
+	{ 0x00 },
+	/* not available */
+	{ 0x00 },
+	/* not available */
+	{ 0x00 },
+	/* not available */
+	{ 0x00 },
+	/* not available */
+	{ 0x00 },
+	/* not available */
+	{ 0x00 },
+	/* not available */
+	{ 0x00 },
+	/* not available */
+	{ 0x00 },
+	/* not available */
+	{ 0x00 },
+	/* not available */
+	{ 0x00 },
+	/* not available */
+	{ 0x00 },
+	/* not available */
+	{ 0x00 },
+	/* not available */
+	{ 0x00 },
+	/* not available */
+	{ 0x00 },
+	/* not available */
+	{ 0x00 },
+	/* not available */
+	{ 0x00 },
+	/* not available */
+	{ 0x00 },
+	/* not available */
+	{ 0x00 },
+	/* not available */
+	{ 0x00 },
+	/* not available */
+	{ 0x00 },
+	/* not available */
+	{ 0x00 },
+	/* not available */
+	{ 0x00 },
+	/* not available */
+	{ 0x00 },
+	/* not available */
+	{ 0x00 },
+	/* not available */
+	{ 0x00 },
+	/* not available */
+	{ 0x00 },
+	/* not available */
+	{ 0x00 },
+	/* not available */
+	{ 0x00 },
+	/* not available */
+	{ 0x00 },
+	/* not available */
+	{ 0x00 },
+	/* not available */
+	{ 0x00 },
+	/* not available */
+	{ 0x00 },
+	/* not available */
+	{ 0x00 },
+	/* not available */
+	{ 0x00 },
+	/* not available */
+	{ 0x00 },
+	/* not available */
+	{ 0x00 },
+	/* not available */
+	{ 0x00 },
+	/* not available */
+	{ 0x00 },
+	/* not available */
+	{ 0x00 },
+	/* not available */
+	{ 0x00 },
+	/* not available */
+	{ 0x00 },
+};
+
+/* c'�tais vraiment tres int�ressant */
Index: linux-2.6.16/arch/arm/mach-omap1/io.c
===================================================================
--- linux-2.6.16.orig/arch/arm/mach-omap1/io.c	2007-04-12 10:36:07.000000000 +0200
+++ linux-2.6.16/arch/arm/mach-omap1/io.c	2007-04-12 10:36:19.000000000 +0200
@@ -20,6 +20,8 @@
 #include <asm/arch/tc.h>
 #include <asm/arch/omapfb.h>
 
+#include <asm/arch/efb.h>
+
 extern int omap1_clk_init(void);
 extern void omap_check_revision(void);
 extern void omap_sram_init(void);
@@ -49,7 +51,7 @@
 		.pfn		= __phys_to_pfn(OMAP730_DSPREG_START),
 		.length		= OMAP730_DSPREG_SIZE,
 		.type		= MT_DEVICE
-	}
+	},
 };
 #endif
 
@@ -143,4 +145,3 @@
 
 	omap1_mux_init();
 }
-
Index: linux-2.6.16/arch/arm/mach-omap1/Kconfig
===================================================================
--- linux-2.6.16.orig/arch/arm/mach-omap1/Kconfig	2007-04-12 10:36:07.000000000 +0200
+++ linux-2.6.16/arch/arm/mach-omap1/Kconfig	2007-04-12 10:36:19.000000000 +0200
@@ -171,3 +171,10 @@
 
 source "arch/arm/plat-omap/dsp/Kconfig"
 
+source "arch/arm/mach-omap1/tornado/Kconfig"
+
+config EFB_DEBUG
+	bool "Early Frame Buffer debugging routines"
+	depends on MACH_TORNADO
+	help
+	  Output in the framebuffer of the HTC phones as early as possible (experimental, ...).
Index: linux-2.6.16/arch/arm/mach-omap1/Makefile
===================================================================
--- linux-2.6.16.orig/arch/arm/mach-omap1/Makefile	2007-04-12 10:36:07.000000000 +0200
+++ linux-2.6.16/arch/arm/mach-omap1/Makefile	2007-04-12 10:36:19.000000000 +0200
@@ -37,3 +37,5 @@
 led-$(CONFIG_MACH_OMAP_OSK)		+= leds-osk.o
 obj-$(CONFIG_LEDS)			+= $(led-y)
 
+obj-y += tornado/
+obj-$(CONFIG_EFB_DEBUG) += efb.o efb-font5x5.o
Index: linux-2.6.16/arch/arm/mach-omap1/tornado/Kconfig
===================================================================
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
+++ linux-2.6.16/arch/arm/mach-omap1/tornado/Kconfig	2007-04-12 10:36:19.000000000 +0200
@@ -0,0 +1,5 @@
+config MACH_TORNADO
+	bool "HTC Tornado Support"
+	depends on ARCH_OMAP730
+	help
+	  HTC Tornado smartphone support (AKA SPV C600, QTEK 8310, ...)
Index: linux-2.6.16/arch/arm/mach-omap1/tornado/Makefile
===================================================================
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
+++ linux-2.6.16/arch/arm/mach-omap1/tornado/Makefile	2007-04-12 10:36:19.000000000 +0200
@@ -0,0 +1,11 @@
+##
+## Makefile for linux-on-tornado in /home/nico/work/tornado/linux-tornado
+## 
+## Made by nico
+## Login   <nico@chac.le-poulpe.net>
+## 
+## Started on  Wed Apr  5 17:20:58 2006 nico
+## Last update Thu May 11 12:34:33 2006 nico
+##
+
+obj-$(CONFIG_MACH_TORNADO) += tornado.o
Index: linux-2.6.16/arch/arm/mach-omap1/tornado/tornado.c
===================================================================
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
+++ linux-2.6.16/arch/arm/mach-omap1/tornado/tornado.c	2007-04-12 10:36:19.000000000 +0200
@@ -0,0 +1,242 @@
+/*
+** tornado.c for linux-on-tornado in /home/nico/work/tornado/linux-tornado
+** 
+** Made by nico
+** Login   <nico@chac.le-poulpe.net>
+** 
+** Started on  Wed Apr  5 17:20:24 2006 nico
+** Last update Fri Jul  7 01:31:54 2006 nico
+*/
+
+/*
+ *
+ * HTC Tornado init stuff
+ * Copyright (C) 2006 Nicolas Schichan
+ *
+ * This  program is  free  software; you  can  redistribute it  and/or
+ * modify  it under the  terms of  the GNU  General Public  License as
+ * published by the Free Software  Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ * 
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT  ANY  WARRANTY;  without   even  the  implied  warranty  of
+ * MERCHANTABILITY or  FITNESS FOR A PARTICULAR PURPOSE.   See the GNU
+ * General Public License for more details.
+ * 
+ * You should have  received a copy of the  GNU General Public License
+ * along  with  this program;  if  not,  write  to the  Free  Software
+ * Foundation,  Inc.,  51 Franklin  Street,  Fifth  Floor, Boston,  MA
+ * 02110-1301, USA. 
+ *
+ */
+
+#include <linux/kernel.h>
+#include <linux/init.h>
+#include <linux/platform_device.h>
+
+#include <asm/mach-types.h>
+#include <asm/mach/arch.h>
+#include <asm/mach/map.h>
+#include <asm/arch/omap730.h>
+#include <asm/page.h>
+#include <asm/memory.h>
+#include <asm/arch/common.h>
+#include <asm/arch/board.h>
+#include <asm/arch/efb.h>
+#include <asm/arch/io.h>
+#include <asm/arch/irqs.h>
+#include <asm/arch/gpio.h>
+
+#include <linux/delay.h>
+
+#define TORNADO_GPIO_DM 35
+#define TORNADO_GPIO_DP 36
+
+static void __init
+tornado_map_io(void)
+{
+
+	omap1_map_common_io();
+
+#ifdef CONFIG_EFB_DEBUG
+	/*
+	 * reenable simple framebuffer output on HTC typhoon:
+	 * now safe to do it: sram has been remapped.
+	 */
+	efb_enable();
+#endif
+	printk("tornado_map_io done.\n");
+}
+
+static void __init
+tornado_usb_enable(void)
+{
+	unsigned int tries = 20;
+	printk("trying to enable USB.\n");
+
+	/* force USB_EN GPIO to 0 */
+	do {
+		omap_set_gpio_direction(33, 0); /* output */
+		omap_set_gpio_dataout(33, 0); /* low */
+		--tries;
+	} while(omap_get_gpio_datain(33) && tries);
+	if (tries) {
+		printk("unable to reset USB_EN GPIO after 20 tries.\n");
+		printk("I will try to continue anyway: USB may not be available.\n");
+	}
+	printk("USB_EN to 0 after %i tries.\n", tries);
+
+	omap_set_gpio_dataout(73, 0);
+	
+	omap_set_gpio_direction(TORNADO_GPIO_DM, 1); /* input */
+	
+	/* get uart control from GSM */
+	
+	/* select GPIO35 for D_MCLK_OUT */
+	/* select GPIO36 for D_CRESET */
+	omap_writel(omap_readl(OMAP730_IO_CONF_3) & 0xffffffcc, OMAP730_IO_CONF_3);
+	omap_writel(omap_readl(OMAP730_IO_CONF_3) | 0x000000cc, OMAP730_IO_CONF_3);
+	
+
+	omap_set_gpio_direction(TORNADO_GPIO_DP, 1); /* input */
+
+	/* select D_DM, D_DP for D_DM and disable PE_DM control */
+	omap_writel(omap_readl(OMAP730_IO_CONF_2) & 0xff1fffff, OMAP730_IO_CONF_2);
+	omap_writel(omap_readl(OMAP730_IO_CONF_2) | 0x00100000, OMAP730_IO_CONF_2);
+	mdelay(100);
+
+	/* select USB_VBUSI for D_VBUSI, enable PE_VIBUSI pull enable control  */
+	omap_writel(omap_readl(OMAP730_IO_CONF_2) & 0xf1ffffff, OMAP730_IO_CONF_2);
+	omap_writel(omap_readl(OMAP730_IO_CONF_2) | 0x01000000, OMAP730_IO_CONF_2);
+
+	/* set USB_VBUS_CTRL */
+	omap_writel(omap_readl(OMAP730_MODE_1) | (1 << 25), OMAP730_MODE_1);
+}
+
+static void __init
+tornado_usb_otg(void)
+{
+	/* clock configuration */
+	omap_writew(omap_readw(ULPD_SOFT_REQ) | (1 << 8) | SOFT_USB_CLK_REQ, ULPD_SOFT_REQ);
+
+	//  clk_enable(&l3_ocpi_ck);
+	omap_writew(omap_readw(ARM_IDLECT3) | (1 << 0), ARM_IDLECT3);
+
+	/* pin muxing */
+	omap_writel(omap_readl(OMAP730_MODE_1) & ~(1 <<  2), OMAP730_MODE_1);
+	omap_writel(omap_readl(OMAP730_MODE_1) & ~(1 <<  3), OMAP730_MODE_1);
+	omap_writel(omap_readl(OMAP730_MODE_1) |  (1 << 15), OMAP730_MODE_1);
+	omap_writel(omap_readl(OMAP730_MODE_1) |  (1 << 23), OMAP730_MODE_1);
+	omap_writel(omap_readl(OMAP730_MODE_1) |  (1 << 26), OMAP730_MODE_1);
+	omap_writel(omap_readl(OMAP730_MODE_1) |  (1 << 25), OMAP730_MODE_1);
+	omap_writel(omap_readl(OMAP730_MODE_1) & ~(1 << 24), OMAP730_MODE_1);
+	omap_writel(omap_readl(OMAP730_MODE_1) & ~(1 << 10), OMAP730_MODE_1);
+	omap_writel(omap_readl(OMAP730_MODE_1) & ~(1 << 11), OMAP730_MODE_1);
+}
+
+static struct omap_usb_config tornado_usb_config __initdata =
+{
+	.register_dev   = 1,
+	.register_host  = 0,
+	.otg            = 0,
+	.hmc_mode       = 4,
+	.pins[0]        = 2,
+	.pins[1]        = 0,
+	.pins[2]        = 0,
+};
+
+static struct omap_mmc_config tornado_mmc_config __initdata = 
+{
+	.mmc[0] = {
+		.enabled = 1,
+		.nomux = 1,
+		.wire4 = 1,
+		.power_pin = -1,
+		.switch_pin = -1,
+	}
+};
+
+static struct omap_board_config_kernel tornado_config[] = 
+{
+	{ OMAP_TAG_USB, &tornado_usb_config },
+	{ OMAP_TAG_MMC, &tornado_mmc_config },
+};
+
+static void __init
+tornado_mmc_init(void)
+{
+	unsigned int tries;
+
+# define	OMAP_MMC_REG_SYSC	(0xfffb7800 + 0x32)
+# define	OMAP_MMC_REG_SYSS	(0xfffb7800 + 0x34)
+# define	OMAP_MMC_REG_CTO	(0xfffb7800 + 0x0e)
+# define	OMAP_MMC_REG_DTO	(0xfffb7800 + 0x1c)
+
+	/* put mmc host into reset ... */
+	omap_writew(1, OMAP_MMC_REG_SYSC);
+
+	tries = 100;
+	while (omap_readw(OMAP_MMC_REG_SYSS) == 0 && tries) {
+		mdelay(50);
+		--tries;
+	}
+	printk("MMC host reset done: remaining tries: %i\n", tries);
+
+	/* force mode 0 for D_SMC_DAT3, D_SMC_DAT2, D_SMC, no pull up enable */
+	omap_writel(omap_readl(OMAP730_IO_CONF_2) & ~(0xF << 8), OMAP730_IO_CONF_2);
+	omap_writel(omap_readl(OMAP730_IO_CONF_2) & ~(0xF << 12), OMAP730_IO_CONF_2);
+	omap_writel(omap_readl(OMAP730_IO_CONF_2) & ~(0xF << 16), OMAP730_IO_CONF_2);
+}
+
+struct platform_device gsm_device = {
+	.name = "typhoon-gsm",
+	.id = 1
+};
+
+static struct platform_device *devices[] __initdata = {
+	&gsm_device,
+};
+
+static void __init
+tornado_init(void)
+{
+	printk("Tornado init.\n");
+	omap_board_config = tornado_config;
+	omap_board_config_size = ARRAY_SIZE(tornado_config);
+
+	platform_add_devices(devices, ARRAY_SIZE(devices));
+
+	if (omap_readl(OMAP_WDT_TIMER_MODE) & 0x8000) {
+		/*
+		 * disable a potentially running watchdog timer before
+		 * it kills us.
+		 */
+		printk("OMAP730 Watchdog seems to be activated, disabling it for now.\n");
+		omap_writel(0xF5, OMAP_WDT_TIMER_MODE);
+		omap_writel(0xA0, OMAP_WDT_TIMER_MODE);
+	}
+
+	tornado_usb_otg();
+	tornado_usb_enable();
+	tornado_mmc_init();
+}
+
+static void __init
+tornado_init_irq(void)
+{
+	printk("tornado_init_irq.\n");
+	omap1_init_common_hw();
+	omap_init_irq();
+	omap_gpio_init();
+}
+
+MACHINE_START(TORNADO, "HTC Tornado")
+	/* Maintainer: Nicolas Schichan <nico@chac.le-poulpe.net> */
+	.phys_io	= 0xfff00000,
+	.io_pg_offst	= ((0xfef00000) >> 18) & 0xfffc,
+	.boot_params	= 0x10000100,
+	.map_io		= tornado_map_io,
+	.init_irq	= tornado_init_irq,
+	.init_machine	= tornado_init,
+	.timer		= &omap_timer,
+MACHINE_END
Index: linux-2.6.16/arch/arm/plat-omap/sram.c
===================================================================
--- linux-2.6.16.orig/arch/arm/plat-omap/sram.c	2007-04-12 10:36:07.000000000 +0200
+++ linux-2.6.16/arch/arm/plat-omap/sram.c	2007-04-12 10:36:19.000000000 +0200
@@ -33,9 +33,12 @@
 #define OMAP2_SRAM_PUB_VA	0xd0000800
 
 #if defined(CONFIG_ARCH_OMAP24XX)
-#define SRAM_BOOTLOADER_SZ	0x00
+# define SRAM_BOOTLOADER_SZ	0x00
+#elif defined(CONFIG_EFB_DEBUG)
+/* reserve memory for frame buffer too ... */
+# define SRAM_BOOTLOADER_SZ	(0x1020 + 320 * 240 * 2)
 #else
-#define SRAM_BOOTLOADER_SZ	0x80
+# define SRAM_BOOTLOADER_SZ	0x80
 #endif
 
 #define VA_REQINFOPERM0		IO_ADDRESS(0x68005048)
Index: linux-2.6.16/arch/arm/plat-omap/usb.c
===================================================================
--- linux-2.6.16.orig/arch/arm/plat-omap/usb.c	2006-03-20 06:53:29.000000000 +0100
+++ linux-2.6.16/arch/arm/plat-omap/usb.c	2007-04-12 10:36:19.000000000 +0200
@@ -123,11 +123,11 @@
 		 *  - only peripherals may use the internal D+/D- pulldowns
 		 *  - OTG support on this port not yet written
 		 */
-
-		USB_TRANSCEIVER_CTRL_REG &= ~(7 << 4);
-		if (!is_device)
-			USB_TRANSCEIVER_CTRL_REG |= (3 << 1);
-
+		if (!cpu_is_omap730()) {
+			USB_TRANSCEIVER_CTRL_REG &= ~(7 << 4);
+			if (!is_device)
+				USB_TRANSCEIVER_CTRL_REG |= (3 << 1);
+		}
 		return 3 << 16;
 	}
 
@@ -457,6 +457,11 @@
 		syscon &= ~DEV_IDLE_EN;
 		udc_device.dev.platform_data = config;
 		/* FIXME patch IRQ numbers for omap730 */
+		if (cpu_is_omap730()) {
+			udc_resources[1].start = INT_730_USB_GENI;
+			udc_resources[2].start = INT_730_USB_NON_ISO;
+			udc_resources[3].start = INT_730_USB_ISO;
+		}
 		status = platform_device_register(&udc_device);
 		if (status)
 			pr_debug("can't register UDC device, %d\n", status);
Index: linux-2.6.16/arch/arm/tools/mach-types
===================================================================
--- linux-2.6.16.orig/arch/arm/tools/mach-types	2006-03-20 06:53:29.000000000 +0100
+++ linux-2.6.16/arch/arm/tools/mach-types	2007-04-12 10:36:19.000000000 +0200
@@ -969,3 +969,4 @@
 fujitsu_wimaxsoc	MACH_FUJITSU_WIMAXSOC	FUJITSU_WIMAXSOC	956
 dualpcmodem		MACH_DUALPCMODEM	DUALPCMODEM		957
 gesbc9312		MACH_GESBC9312		GESBC9312		958
+htc_tornado		MACH_TORNADO		TORNADO			6665
Index: linux-2.6.16/ChangeLog
===================================================================
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
+++ linux-2.6.16/ChangeLog	2007-04-12 10:36:19.000000000 +0200
@@ -0,0 +1,3 @@
+2006-04-10  nico  <nico@localhost.localdomain>
+
+	* wizard-keypad.c: support for arrow keys (GPIO based).
Index: linux-2.6.16/drivers/char/Kconfig
===================================================================
--- linux-2.6.16.orig/drivers/char/Kconfig	2007-04-12 10:36:08.000000000 +0200
+++ linux-2.6.16/drivers/char/Kconfig	2007-04-12 10:36:19.000000000 +0200
@@ -678,6 +678,21 @@
 
 	  If unsure, say N.
 
+config TORNADO_VIBRATOR
+	tristate "HTC Tornado vibrator"
+	depends on MACH_TORNADO
+	help
+	  HTC Tornado vibrator support. supports for misc
+	  device with minor number 240. implements two IOCTLs:
+	  VIBRATOR_ENABLE and VIBRATOR_DISABLE.
+
+config TORNADO_LEDS
+	tristate "HTC Tornado led driver"
+	depends on MACH_TORNADO
+	help
+	  HTC Tornado led driver. misc device with minor
+	  number 241.
+
 config NVRAM
 	tristate "/dev/nvram support"
 	depends on ATARI || X86 || ARM || GENERIC_NVRAM
Index: linux-2.6.16/drivers/char/Makefile
===================================================================
--- linux-2.6.16.orig/drivers/char/Makefile	2007-04-12 10:36:07.000000000 +0200
+++ linux-2.6.16/drivers/char/Makefile	2007-04-12 10:36:19.000000000 +0200
@@ -97,6 +97,10 @@
 
 obj-$(CONFIG_HANGCHECK_TIMER) += hangcheck-timer.o
 obj-$(CONFIG_TCG_TPM) += tpm/
+
+obj-$(CONFIG_TORNADO_VIBRATOR) += tornado-vibrator.o
+obj-$(CONFIG_TORNADO_LEDS) += tornado-leds.o
+
 # Files generated that shall be removed upon make clean
 clean-files := consolemap_deftbl.c defkeymap.c qtronixmap.c
 
Index: linux-2.6.16/drivers/char/tornado-leds.c
===================================================================
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
+++ linux-2.6.16/drivers/char/tornado-leds.c	2007-04-12 10:36:19.000000000 +0200
@@ -0,0 +1,253 @@
+/*
+** tornado-leds.c for leds in /home/nico/work/tornado/linux-tornado
+** 
+** Made by nico
+** Login   <nico@chac.le-poulpe.net>
+** 
+** Started on  Mon Apr 17 11:19:59 2006 nico
+** Last update Thu May 25 15:32:23 2006 nico
+*/
+
+/*
+ *
+ * HTC Tornado LED driver.
+ * Copyright (C) 2006 Nicolas Schichan
+ *
+ * This  program is  free  software; you  can  redistribute it  and/or
+ * modify  it under the  terms of  the GNU  General Public  License as
+ * published by the Free Software  Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ * 
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT  ANY  WARRANTY;  without   even  the  implied  warranty  of
+ * MERCHANTABILITY or  FITNESS FOR A PARTICULAR PURPOSE.   See the GNU
+ * General Public License for more details.
+ * 
+ * You should have  received a copy of the  GNU General Public License
+ * along  with  this program;  if  not,  write  to the  Free  Software
+ * Foundation,  Inc.,  51 Franklin  Street,  Fifth  Floor, Boston,  MA
+ * 02110-1301, USA. 
+ *
+ */
+
+#include <linux/init.h>
+#include <linux/miscdevice.h>
+#include <linux/moduleparam.h>
+#include <linux/fs.h>
+#include <linux/bitops.h>
+
+#include <asm/arch/gpio.h>
+
+#define LEDS_MINOR 241
+
+/*
+ * ioctl definitions.
+ */
+#define IOCTL_LED_ENABLE	0x4242 /* param: color */
+#define IOCTL_LED_BLINK		0x4243 /* param: color */
+#define IOCTL_LED_DISABLE	0x4244 /* no param */
+#define IOCTL_KPLED_ENABLE	0x4245 /* no param */
+#define IOCTL_KPLED_DISABLE	0x4246 /* no param */
+
+#define PARAM_LED_RED		0x666
+#define PARAM_LED_GREEN		0x667
+#define PARAM_LED_BLUE		0x668
+
+/*
+ * hw def
+ */
+#define TORNADO_LED_BASE	0xFFFBA800
+/* PM Reg: enable led clock when set to 1 */
+#define TORNADO_LED_PMR		0xFFFBA801
+
+/* TORNADO_LED_ENABLE register layout */
+/*
+  bit 7:	ON
+  bit 6:	BLINK
+  bit 5-3:	off time.
+  bit 0-2:	on time.
+
+*/
+
+#define TORNADO_GPIO_LED_GREEN             79
+#define TORNADO_GPIO_LED_RED              128
+#define TORNADO_GPIO_LED_BLUE             140
+#define TORNADO_GPIO_KPLED		   16
+
+
+/* in TORNADO_LED_ENABLE */
+#define LED_ON			(1 << 7)
+#define LED_BLINK		(1 << 6)
+#define LED_ONTIME(x)		((x) & 0x7)
+#define LED_OFFTIME(x)		(((x) & 0x7) << 3)
+
+#define LED_BASE_REG __REG8(TORNADO_LED_BASE)
+#define LED_PM_REG __REG8(TORNADO_LED_PMR)
+
+static unsigned long use;
+
+static int
+tornado_leds_open(struct inode *inode, struct file *file)
+{
+	/* ensure exclusive access */
+	if (test_and_set_bit(0, &use))
+		return -EBUSY;
+
+	return 0;
+}
+
+static int led_set_color(unsigned long color)
+{
+	switch (color) {
+	case PARAM_LED_RED:
+		omap_set_gpio_dataout(TORNADO_GPIO_LED_RED, 1);
+		omap_set_gpio_dataout(TORNADO_GPIO_LED_GREEN, 0);
+		omap_set_gpio_dataout(TORNADO_GPIO_LED_BLUE, 0);
+		break;
+	case PARAM_LED_GREEN:
+		omap_set_gpio_dataout(TORNADO_GPIO_LED_RED, 0);
+		omap_set_gpio_dataout(TORNADO_GPIO_LED_GREEN, 1);
+		omap_set_gpio_dataout(TORNADO_GPIO_LED_BLUE, 0);
+		break;
+	case PARAM_LED_BLUE:
+		omap_set_gpio_dataout(TORNADO_GPIO_LED_RED, 0);
+		omap_set_gpio_dataout(TORNADO_GPIO_LED_GREEN, 0);
+		omap_set_gpio_dataout(TORNADO_GPIO_LED_BLUE, 1);
+		break;
+	default:
+		return -EINVAL;
+	}
+	return 0;
+}
+
+/*
+ * FIXME: on the HTC Tornado, the blue led is not the same as the
+ * red/green led, there may be some gpio changes / special register
+ * settings for this.
+ */
+static int
+tornado_leds_ioctl(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg)
+{
+	switch (cmd) {
+	case IOCTL_LED_ENABLE:
+		LED_PM_REG = 0; /* disable blink clock */
+		LED_BASE_REG = LED_ON;
+		return led_set_color(arg);
+
+	case IOCTL_LED_BLINK:
+		LED_PM_REG = 1;
+		LED_BASE_REG = 0x7F; /* LED_BLINK | LED_ONTIME(1) | LED_OFFTIME(3); */
+		printk("IOCTL_LED_BLINK (reg = %02x).\n", LED_BASE_REG);
+		return led_set_color(arg);
+
+	case IOCTL_LED_DISABLE:
+		LED_PM_REG = 0;
+		LED_BASE_REG = 0;
+		omap_set_gpio_dataout(TORNADO_GPIO_LED_RED, 0);
+		omap_set_gpio_dataout(TORNADO_GPIO_LED_GREEN, 0);
+		break;
+
+	case IOCTL_KPLED_ENABLE:
+		omap_set_gpio_dataout(TORNADO_GPIO_KPLED, 1);
+		break;
+
+	case IOCTL_KPLED_DISABLE:
+		omap_set_gpio_dataout(TORNADO_GPIO_KPLED, 0);
+		break;
+	default:
+		return -EINVAL;
+	}
+	return 0;
+}
+
+static int
+tornado_leds_release(struct inode *inode, struct file *file)
+{
+	use = 0;
+	return 0;
+}
+
+struct file_operations tornado_leds_fops =
+{
+	.owner = THIS_MODULE,
+	.ioctl = tornado_leds_ioctl,
+	.open = tornado_leds_open,
+	.release = tornado_leds_release,
+};
+
+struct miscdevice tornado_leds_device = 
+{
+	.minor = LEDS_MINOR,
+	.name = "tornado-leds",
+	.fops = &tornado_leds_fops,
+};
+
+static int __init
+tornado_leds_init(void)
+{
+	int ret;
+
+	omap_request_gpio(TORNADO_GPIO_LED_RED);
+	omap_request_gpio(TORNADO_GPIO_LED_GREEN);
+	omap_request_gpio(TORNADO_GPIO_LED_BLUE);
+	omap_request_gpio(TORNADO_GPIO_KPLED);
+
+	ret = misc_register(&tornado_leds_device);
+	if (ret)
+		return ret;
+
+	/*
+	 * init hw
+	 */
+	/* clear GSM_LPG1 and select GPIO_140 & LPG1 pullup enable control  */
+        omap_writel(omap_readl(OMAP730_IO_CONF_10) & ~0x20, OMAP730_IO_CONF_10);
+        omap_writel(omap_readl(OMAP730_IO_CONF_10) |  0xd0, OMAP730_IO_CONF_10);
+
+/* 	omap_set_gpio_dataout(140, 1); */
+
+	/* clear GSM_LPG2 and select GPIO_141 & LPG2 pullup enable control  */
+        omap_writel(omap_readl(OMAP730_IO_CONF_10) & ~0x200, OMAP730_IO_CONF_10);
+        omap_writel(omap_readl(OMAP730_IO_CONF_10) |  0xd00, OMAP730_IO_CONF_10);
+
+/* 	omap_set_gpio_dataout(141, 1); */
+
+        omap_set_gpio_direction(TORNADO_GPIO_LED_RED, 0); /* out */
+        omap_set_gpio_direction(TORNADO_GPIO_LED_GREEN, 0); /* out */
+        omap_set_gpio_direction(TORNADO_GPIO_LED_BLUE, 0); /* out */
+        omap_set_gpio_direction(TORNADO_GPIO_KPLED, 0); /* out */
+
+	/* enable lpg1 and lpg2 */
+        omap_writel(omap_readl(OMAP730_MODE_1) | (3 << 28), OMAP730_MODE_1);
+
+	/* disable led activation */
+	LED_PM_REG = 0;
+	LED_BASE_REG = 0;
+	omap_set_gpio_dataout(TORNADO_GPIO_LED_RED, 0);
+	omap_set_gpio_dataout(TORNADO_GPIO_LED_GREEN, 0);
+	omap_set_gpio_dataout(TORNADO_GPIO_LED_BLUE, 0);
+	omap_set_gpio_dataout(TORNADO_GPIO_KPLED, 0);
+
+	printk("HTC Tornado led driver.\n");
+	return 0;
+}
+
+static void __exit
+tornado_leds_exit(void)
+{
+	misc_deregister(&tornado_leds_device);
+
+	/* disable lpg 1 and lpg2 */
+        omap_writel(omap_readl(OMAP730_MODE_1) & ~(3 << 28), OMAP730_MODE_1);
+	LED_BASE_REG = 0;
+	LED_PM_REG = 0;
+	omap_free_gpio(TORNADO_GPIO_LED_RED);
+	omap_free_gpio(TORNADO_GPIO_LED_GREEN);
+	omap_free_gpio(TORNADO_GPIO_LED_BLUE);
+	omap_free_gpio(TORNADO_GPIO_KPLED);
+}
+
+module_init(tornado_leds_init);
+module_exit(tornado_leds_exit);
+
+MODULE_AUTHOR("Nicolas Schichan");
+MODULE_LICENSE("GPL");
Index: linux-2.6.16/drivers/char/tornado-vibrator.c
===================================================================
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
+++ linux-2.6.16/drivers/char/tornado-vibrator.c	2007-04-12 10:36:19.000000000 +0200
@@ -0,0 +1,144 @@
+/*
+** tornado-vibrator.c for vibrator in /home/nico/work/tornado/linux-tornado
+** 
+** Made by nico
+** Login   <nico@chac.le-poulpe.net>
+** 
+** Started on  Mon Apr 10 15:21:27 2006 nico
+** Last update Thu May 25 13:44:23 2006 nico
+*/
+
+#include <linux/init.h>
+#include <linux/miscdevice.h>
+#include <linux/moduleparam.h>
+#include <linux/fs.h>
+#include <linux/bitops.h>
+
+#include <asm/arch/gpio.h>
+#include "tornado-vibrator.h"
+
+/*
+ *
+ * HTC Tornado vibrator driver.
+ * Copyright (C) 2006 Nicolas Schichan
+ *
+ * This  program is  free  software; you  can  redistribute it  and/or
+ * modify  it under the  terms of  the GNU  General Public  License as
+ * published by the Free Software  Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ * 
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT  ANY  WARRANTY;  without   even  the  implied  warranty  of
+ * MERCHANTABILITY or  FITNESS FOR A PARTICULAR PURPOSE.   See the GNU
+ * General Public License for more details.
+ * 
+ * You should have  received a copy of the  GNU General Public License
+ * along  with  this program;  if  not,  write  to the  Free  Software
+ * Foundation,  Inc.,  51 Franklin  Street,  Fifth  Floor, Boston,  MA
+ * 02110-1301, USA. 
+ *
+ */
+
+/*
+ * quite a simple driver: only put GPIO 34 in OUT mode and set it to 1
+ * to enable the vibrator or 0 to disable it.
+ */
+
+static long use;
+
+/*
+ * ensure only process opens the file, ad set GPIO direction to 0 (OUT)
+ */
+static int
+tornado_vibrator_open(struct inode *inode, struct file *file)
+{
+	if (test_and_set_bit(0, &use))
+		return -EBUSY;
+
+
+	/* out GPIO */
+	omap_set_gpio_direction(TORNADO_VIBRATOR_GPIO, 0);
+	return 0;
+}
+
+/*
+ * device ioctl handler. only VIBRATOR_ENABLE or VIBRATOR_DISABLE are
+ * recognized.
+ */
+static int
+tornado_vibrator_ioctl(struct inode *inode, struct file *file, 
+				  unsigned int cmd, unsigned long arg)
+{
+	switch (cmd) {
+	case VIBRATOR_ENABLE:
+		omap_set_gpio_dataout(TORNADO_VIBRATOR_GPIO, 1);
+		return 0;
+	case VIBRATOR_DISABLE:
+		omap_set_gpio_dataout(TORNADO_VIBRATOR_GPIO, 0);
+		return 0;
+	default:
+		return -EOPNOTSUPP;
+	}
+}
+
+/*
+ * set use variable to zero so that the next open on the file
+ * successes.
+ */
+static int
+tornado_vibrator_release(struct inode *inode, struct file *file)
+{
+	use = 0;
+	return 0;
+}
+
+struct file_operations tornado_vibrator_fops =
+{
+	.owner = THIS_MODULE,
+	.ioctl = tornado_vibrator_ioctl,
+	.open = tornado_vibrator_open,
+	.release = tornado_vibrator_release,
+};
+
+struct miscdevice tornado_vibrator_dev =
+{
+	.minor = VIBRATOR_MINOR,
+	.name = "tornado-vibrator",
+	.fops = &tornado_vibrator_fops,
+};
+
+/*
+ * make sure we can use the GPIO and register the device.
+ */
+static int __init
+tornado_vibrator_init(void)
+{
+	int ret;
+
+	if (omap_request_gpio(TORNADO_VIBRATOR_GPIO))
+		return -EBUSY;
+
+	ret = misc_register(&tornado_vibrator_dev);
+	if (ret)
+		return ret;
+
+	printk("HTC Tornado Vibrator driver.\n");
+	return 0;
+}
+
+/*
+ * deregister device and free the GPIO.
+ */
+static void __init
+tornado_vibrator_exit(void)
+{
+	misc_deregister(&tornado_vibrator_dev);
+	omap_set_gpio_dataout(TORNADO_VIBRATOR_GPIO, 0);
+	omap_free_gpio(TORNADO_VIBRATOR_GPIO);
+}
+
+module_init(tornado_vibrator_init);
+module_exit(tornado_vibrator_exit);
+
+MODULE_AUTHOR("Nicolas Schichan");
+MODULE_LICENSE("GPL");
Index: linux-2.6.16/drivers/char/tornado-vibrator.h
===================================================================
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
+++ linux-2.6.16/drivers/char/tornado-vibrator.h	2007-04-12 10:36:19.000000000 +0200
@@ -0,0 +1,44 @@
+/*
+** tornado-vibrator.h for vibrator in /home/nico/work/tornado/linux-tornado
+** 
+** Made by nico
+** Login   <nico@chac.le-poulpe.net>
+** 
+** Started on  Mon Apr 10 15:54:33 2006 nico
+** Last update Thu May 25 13:44:38 2006 nico
+*/
+
+/*
+ *
+ * HTC Tornado vibrator driver
+ * Copyright (C) 2006 Nicolas Schichan
+ *
+ * This  program is  free  software; you  can  redistribute it  and/or
+ * modify  it under the  terms of  the GNU  General Public  License as
+ * published by the Free Software  Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ * 
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT  ANY  WARRANTY;  without   even  the  implied  warranty  of
+ * MERCHANTABILITY or  FITNESS FOR A PARTICULAR PURPOSE.   See the GNU
+ * General Public License for more details.
+ * 
+ * You should have  received a copy of the  GNU General Public License
+ * along  with  this program;  if  not,  write  to the  Free  Software
+ * Foundation,  Inc.,  51 Franklin  Street,  Fifth  Floor, Boston,  MA
+ * 02110-1301, USA. 
+ *
+ */
+
+
+#ifndef __TORNADO_VIBRATOR
+# define __TORNADO_VIBRATOR
+
+# define VIBRATOR_ENABLE 0x42
+# define VIBRATOR_DISABLE 0x43
+
+# define VIBRATOR_MINOR 240
+
+# define TORNADO_VIBRATOR_GPIO 34
+
+#endif /* !__TORNADO_VIBRATOR */
Index: linux-2.6.16/drivers/char/vt.c
===================================================================
--- linux-2.6.16.orig/drivers/char/vt.c	2006-03-20 06:53:29.000000000 +0100
+++ linux-2.6.16/drivers/char/vt.c	2007-04-12 10:36:19.000000000 +0200
@@ -2155,6 +2155,8 @@
 
 #ifdef CONFIG_VT_CONSOLE
 
+extern int in_printk;
+
 /*
  *	Console on virtual terminal
  *
@@ -2169,6 +2171,7 @@
 	const ushort *start;
 	ushort cnt = 0;
 	ushort myx;
+	unsigned char old_color = 0;
 
 	/* console busy or not yet initialized */
 	if (!printable || test_and_set_bit(0, &printing))
@@ -2196,6 +2199,11 @@
 
 	start = (ushort *)vc->vc_pos;
 
+	if (in_printk) {
+		old_color = vc->vc_color;
+		vc->vc_color = 0x2;
+		update_attr(vc);
+	}
 	/* Contrived structure to try to emulate original need_wrap behaviour
 	 * Problems caused when we have need_wrap set on '\n' character */
 	while (count--) {
@@ -2242,6 +2250,10 @@
 		}
 	}
 	set_cursor(vc);
+	if (in_printk) {
+		vc->vc_color = old_color;
+		update_attr(vc);
+	}
 
 quit:
 	clear_bit(0, &printing);
Index: linux-2.6.16/drivers/char/watchdog/Kconfig
===================================================================
--- linux-2.6.16.orig/drivers/char/watchdog/Kconfig	2007-04-12 10:36:07.000000000 +0200
+++ linux-2.6.16/drivers/char/watchdog/Kconfig	2007-04-12 10:36:19.000000000 +0200
@@ -656,4 +656,10 @@
 	  Support for TI OMAP1610/OMAP1710/OMAP2420 watchdog. Say 'Y' here to enable the
 	  OMAP1610/OMAP1710 watchdog timer.
 
+config OMAP730_WATCHDOG
+	tristate "OMAP730/OMAP850 Watchdog"
+	depends on WATCHDOG && ARCH_OMAP730
+	help
+	  Support for TI OMAP730/OMAP850 Watchdog.
+
 endmenu
Index: linux-2.6.16/drivers/char/watchdog/Makefile
===================================================================
--- linux-2.6.16.orig/drivers/char/watchdog/Makefile	2007-04-12 10:36:07.000000000 +0200
+++ linux-2.6.16/drivers/char/watchdog/Makefile	2007-04-12 10:36:19.000000000 +0200
@@ -28,6 +28,7 @@
 obj-$(CONFIG_IXP2000_WATCHDOG) += ixp2000_wdt.o
 obj-$(CONFIG_IXP4XX_WATCHDOG) += ixp4xx_wdt.o
 obj-$(CONFIG_OMAP_WATCHDOG) += omap_wdt.o
+obj-$(CONFIG_OMAP730_WATCHDOG) += omap730_wdt.o
 obj-$(CONFIG_S3C2410_WATCHDOG) += s3c2410_wdt.o
 obj-$(CONFIG_SA1100_WATCHDOG) += sa1100_wdt.o
 obj-$(CONFIG_MPCORE_WATCHDOG) += mpcore_wdt.o
Index: linux-2.6.16/drivers/char/watchdog/omap730_wdt.c
===================================================================
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
+++ linux-2.6.16/drivers/char/watchdog/omap730_wdt.c	2007-04-12 10:36:19.000000000 +0200
@@ -0,0 +1,225 @@
+/*
+** omap730_wdt.c for linux-typhoon/tornado in /home/nico/work/spvc500/linux-omap-typhoon
+** 
+** Made by nico
+** Login   <nico@chac.le-poulpe.net>
+** 
+** Started on  Thu Mar 16 14:42:35 2006 nico
+** Last update Thu May 11 13:56:24 2006 nico
+*/
+
+/*
+ *
+ * OMAP730 watchdog driver.
+ * Copyright (C) 2006 Nicolas Schichan
+ *
+ * This  program is  free  software; you  can  redistribute it  and/or
+ * modify  it under the  terms of  the GNU  General Public  License as
+ * published by the Free Software  Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ * 
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT  ANY  WARRANTY;  without   even  the  implied  warranty  of
+ * MERCHANTABILITY or  FITNESS FOR A PARTICULAR PURPOSE.   See the GNU
+ * General Public License for more details.
+ * 
+ * You should have  received a copy of the  GNU General Public License
+ * along  with  this program;  if  not,  write  to the  Free  Software
+ * Foundation,  Inc.,  51 Franklin  Street,  Fifth  Floor, Boston,  MA
+ * 02110-1301, USA. 
+ *
+ */
+
+/*
+ * based on omap_wdt.c.
+ */
+
+#include <linux/module.h>
+#include <linux/config.h>
+#include <linux/types.h>
+#include <linux/kernel.h>
+#include <linux/fs.h>
+#include <linux/mm.h>
+#include <linux/miscdevice.h>
+#include <linux/watchdog.h>
+#include <linux/reboot.h>
+#include <linux/smp_lock.h>
+#include <linux/init.h>
+#include <linux/err.h>
+
+#include <asm/io.h>
+#include <asm/uaccess.h>
+#include <asm/hardware.h>
+#include <asm/bitops.h>
+/* #include <asm/hardware/clock.h> */
+
+#include <linux/moduleparam.h>
+
+#include <asm/arch/hardware.h>
+#include <asm/delay.h>
+
+#define WDT_EN 0
+#define WDT_DISABLE_ON_CLOSE 1
+
+static unsigned long omap_wdt_users;
+static struct miscdevice omap_wdt_miscdev; /* Forward declaration */
+
+/*
+ * TRM says that the same value cannot be used to reinitialize the
+ * watchdog timer, so alternate 0xFFFF 0xFFFE.
+ */
+static void 
+omap730_wdt_ping(void)
+{
+	static int mod = 0;
+
+	if (mod)
+		omap_writel(0xFFFF, OMAP_WDT_LOAD_TIM);
+	else
+		omap_writel(0xFFFE, OMAP_WDT_LOAD_TIM);
+
+	mod = (mod + 1) & 0x1;
+}
+
+static void
+omap730_wdt_enable(void)
+{
+	unsigned long wdt_ctl;
+	unsigned long arm_idlect2;
+
+	omap_writel(0x8000, OMAP_WDT_TIMER_MODE);
+	wdt_ctl = omap_readl(OMAP_WDT_TIMER);
+
+	arm_idlect2 = omap_readl(ARM_IDLECT2);
+	arm_idlect2 |= 0x1; /* enable watchdog clock */
+	omap_writel(arm_idlect2, ARM_IDLECT2);
+	
+}
+
+static void
+omap730_wdt_disable(void)
+{
+	unsigned long arm_idlect2;
+
+	if ((omap_readl(OMAP_WDT_TIMER_MODE) & 0x8000) == 0x8000) {
+
+		arm_idlect2 = omap_readl(ARM_IDLECT2);
+		arm_idlect2 &= ~0x1; /* disable watchdog clock */
+		omap_writel(arm_idlect2, ARM_IDLECT2);
+
+		/*
+		 * sequence required to disable watchdog. do not try
+		 * to disable watchdog if timer is not active (see
+		 * TRM).
+		 */
+		omap_writel(0xF5, OMAP_WDT_TIMER_MODE);
+		omap_writel(0xA0, OMAP_WDT_TIMER_MODE);
+	}
+}
+
+/*
+ * Allow only one person to hold it open
+ */
+static int
+omap730_wdt_open(struct inode *inode, struct file *file)
+{
+	if (test_and_set_bit(WDT_EN, &omap_wdt_users))
+		return -EBUSY;
+
+	omap730_wdt_enable();
+	return 0;
+}
+
+static int
+omap730_wdt_release(struct inode *inode, struct file *file)
+{
+	if (omap_wdt_users && test_bit(WDT_DISABLE_ON_CLOSE, &omap_wdt_users)) {
+		printk("omap730_wdt: disabling watchdog.\n");
+		omap730_wdt_disable();
+	} else {
+		printk(KERN_CRIT "omap730_wdt: Unexpected close: watchdog still active !\n");
+	}
+	omap_wdt_users = 0;
+	return 0;
+}
+
+static ssize_t
+omap730_wdt_write(struct file *file, const char *data, size_t len, loff_t * ppos)
+{
+	if (len) {
+#ifndef CONFIG_WATCHDOG_NOWAYOUT
+		size_t i;
+
+		for (i = 0; i < len; ++i) {
+			char c;
+			if (get_user(c, data + i))
+				return -EFAULT;
+			if (c == 'V') {
+				printk("watchdog will be disabled on close.\n");
+				set_bit(WDT_DISABLE_ON_CLOSE, (unsigned long*)&omap_wdt_users);
+			}
+		}
+#endif
+		omap730_wdt_ping();
+		return 1;
+	}
+	return 0;
+}
+
+/*
+ * KISS: only support KEEPALIVE for now.
+ */
+static int
+omap730_wdt_ioctl(struct inode *inode, struct file *file,
+			     unsigned int cmd, unsigned long arg)
+{
+	switch (cmd) {
+	case WDIOC_KEEPALIVE:
+		omap730_wdt_ping();
+		return 0;
+	default:
+		return -ENOIOCTLCMD;
+	}
+}
+
+static struct file_operations omap_wdt_fops = {
+	.owner = THIS_MODULE,
+	.write = omap730_wdt_write,
+	.ioctl = omap730_wdt_ioctl,
+	.open = omap730_wdt_open,
+	.release = omap730_wdt_release,
+};
+
+static struct miscdevice omap_wdt_miscdev = {
+	.minor = WATCHDOG_MINOR,
+	.name = "omap730_wdt",
+	.fops = &omap_wdt_fops
+};
+
+static int __init
+omap730_wdt_init(void)
+{
+	int ret;
+
+	ret = misc_register(&omap_wdt_miscdev);
+
+	if (ret)
+		return ret;
+
+	omap730_wdt_disable();
+	printk(KERN_INFO "TI OMAP Watchdog Timer for OMAP730\n");
+
+	return 0;
+}
+
+static void __exit
+omap730_wdt_exit(void)
+{
+	misc_deregister(&omap_wdt_miscdev);
+}
+
+module_init(omap730_wdt_init);
+module_exit(omap730_wdt_exit);
+
+MODULE_AUTHOR("Nicolas Schichan");
+MODULE_LICENSE("GPL");
Index: linux-2.6.16/drivers/input/keyboard/Kconfig
===================================================================
--- linux-2.6.16.orig/drivers/input/keyboard/Kconfig	2007-04-12 10:36:07.000000000 +0200
+++ linux-2.6.16/drivers/input/keyboard/Kconfig	2007-04-12 10:36:19.000000000 +0200
@@ -193,6 +193,13 @@
 	  To compile this driver as a module, choose M here: the
 	  module will be called omap-keypad.
 
+config TORNADO_KEYPAD
+	bool "HTC Tornado keypad support"
+	depends on MACH_TORNADO
+	help
+	  Say y here if you want to use the keypad of your HTC Tornado
+	  Phone.
+
 config OMAP_PS2
 	tristate "TI OMAP Innovator 1510 PS/2 keyboard & mouse support"
 	depends on ARCH_OMAP15XX && MACH_OMAP_INNOVATOR
Index: linux-2.6.16/drivers/input/keyboard/Makefile
===================================================================
--- linux-2.6.16.orig/drivers/input/keyboard/Makefile	2007-04-12 10:36:07.000000000 +0200
+++ linux-2.6.16/drivers/input/keyboard/Makefile	2007-04-12 10:36:19.000000000 +0200
@@ -16,4 +16,5 @@
 obj-$(CONFIG_KEYBOARD_HIL)		+= hil_kbd.o
 obj-$(CONFIG_KEYBOARD_HIL_OLD)		+= hilkbd.o
 obj-$(CONFIG_KEYBOARD_OMAP)             += omap-keypad.o
+obj-$(CONFIG_TORNADO_KEYPAD)		+= tornado-keypad.o
 obj-$(CONFIG_OMAP_PS2)			+= innovator_ps2.o
Index: linux-2.6.16/drivers/input/keyboard/omap-keypad.c
===================================================================
--- linux-2.6.16.orig/drivers/input/keyboard/omap-keypad.c	2007-04-12 10:36:07.000000000 +0200
+++ linux-2.6.16/drivers/input/keyboard/omap-keypad.c	2007-04-12 10:36:19.000000000 +0200
@@ -43,7 +43,7 @@
 #include <asm/mach-types.h>
 #include <asm/arch/mux.h>
 
-#undef NEW_BOARD_LEARNING_MODE
+#define NEW_BOARD_LEARNING_MODE
 
 static void omap_kp_tasklet(unsigned long);
 static void omap_kp_timer(unsigned long);
@@ -292,6 +292,7 @@
 	struct omap_kp_platform_data *pdata =  pdev->dev.platform_data;
 	int i;
 
+	printk("omap_kp_probe.\n");
 	if (!pdata->rows || !pdata->cols || !pdata->keymap) {
 		printk(KERN_ERR "No rows, cols or keymap from pdata\n");
 		return -EINVAL;
Index: linux-2.6.16/drivers/input/keyboard/tornado-keypad.c
===================================================================
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
+++ linux-2.6.16/drivers/input/keyboard/tornado-keypad.c	2007-04-12 10:36:19.000000000 +0200
@@ -0,0 +1,463 @@
+/*
+** wizard-keypad.c for wizard-keypad in /home/nico/work/tornado/linux-tornado
+** 
+** Made by nico
+** Login   <nico@chac.le-poulpe.net>
+** 
+** Started on  Thu Apr  6 17:27:18 2006 nico
+** Last update Thu May 25 14:12:34 2006 nico
+*/
+
+/*
+ * HTC Tornado keypad driver.
+ * Copyright (C) 2006 Nicolas Schichan
+ *
+ * This  program is  free  software; you  can  redistribute it  and/or
+ * modify  it under the  terms of  the GNU  General Public  License as
+ * published by the Free Software  Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ * 
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT  ANY  WARRANTY;  without   even  the  implied  warranty  of
+ * MERCHANTABILITY or  FITNESS FOR A PARTICULAR PURPOSE.   See the GNU
+ * General Public License for more details.
+ * 
+ * You should have  received a copy of the  GNU General Public License
+ * along  with  this program;  if  not,  write  to the  Free  Software
+ * Foundation,  Inc.,  51 Franklin  Street,  Fifth  Floor, Boston,  MA
+ * 02110-1301, USA. 
+ *
+ */
+
+/*
+ * based on omap-keypad.c
+ */
+
+#include <linux/init.h>
+#include <linux/kernel.h>
+#include <linux/interrupt.h>
+#include <linux/types.h>
+#include <linux/input.h>
+
+#include <asm/arch/gpio.h>
+#include <asm/arch/io.h>
+#include <asm/mach-types.h>
+#include <asm/delay.h>
+
+#undef DEBUG
+// #define DEBUG
+
+struct input_dev *tornado_kp_dev = NULL;
+
+static unsigned char kp_state[8];
+static void tornado_kp_tasklet(unsigned long);
+static void tornado_kp_gpio_tasklet(unsigned long);
+static DECLARE_TASKLET_DISABLED(kp_tasklet, tornado_kp_tasklet, 0);
+static DECLARE_TASKLET_DISABLED(kp_gpio_tasklet, tornado_kp_gpio_tasklet, 0);
+static struct timer_list kp_timer;
+static struct timer_list kp_gpio_timer;
+
+unsigned int gpio_mask = 0;
+unsigned int kp_gpio = 0;
+
+#define TORNADO_KP_GPIO 76
+
+/*
+ * key tables. a bit more complex than those in the omap-keypad
+ * driver: HTC devices keys events tends to trigger two or more
+ * row/col.
+ */
+struct htc_key
+{
+	/*
+	 * input key constant as defined in input.h
+	 */
+	int key;
+	/* rc stands for row/col
+	 * 2 * k -> col;
+	 * 2 * k + 1-> row
+	 */
+	char rc[6]; 
+};
+
+struct gpio_key
+{
+	int key;
+	unsigned int mask;
+};
+
+static struct htc_key *htc_keys = NULL;
+static unsigned int htc_keys_size = 0;
+static struct gpio_key *gpio_keys = 0;
+static unsigned int gpio_keys_size= 0;
+
+
+/*
+ * Tornado stuff ...
+ */
+static struct htc_key tornado_keys[] =
+{
+	/* misc keys below the screen */
+	{ KEY_F3,		{ 1,3 } }, /* SK1 */
+	{ KEY_BACKSPACE,	{ 4,3 } },
+	{ KEY_HOME,		{ 3,3 } },
+	{ KEY_F4,		{ 2,3 } }, /* SK2 */
+	{ KEY_F5,		{ 3,5 } }, /* compose */
+	{ KEY_ESC,		{ 4,5 } }, /* hangup */
+
+	/* digit keys */
+	{ KEY_1, { 1,0 } },
+	{ KEY_2, { 2,0 } },
+	{ KEY_3, { 3,0 } },
+	{ KEY_4, { 4,0 } },
+	{ KEY_5, { 1,1 } },
+	{ KEY_6, { 2,1 } },
+	{ KEY_7, { 3,1 } },
+	{ KEY_8, { 4,1 } },
+	{ KEY_9, { 1,2 } },
+	{ KEY_0, { 2,2 } },
+	{ KEY_KPASTERISK, { 3,2 } },
+	{ KEY_SPACE, { 4,2 } },
+
+	/* side buttons: currently bogus  */
+/* 	{ KEY_CAMERA, { 5,6, 6,6 } }, */
+/* 	{ KEY_VOLUMEUP, { 4,6, 5,6 } }, */
+/* 	{ KEY_VOLUMEDOWN, { 7,6, 6,6 } }, */
+/* 	{ KEY_FAVORITES, { 2,6, 3,6 } } */
+
+	/* add side keys: photo, volume, ...*/
+
+};
+
+static struct gpio_key tornado_gpio_keys[] = 
+{
+	{ KEY_ENTER, 0x1 },
+	{ KEY_LEFT, 0x19 },
+	{ KEY_RIGHT, 0x7 },
+	{ KEY_UP, 0x15 },
+	{ KEY_DOWN, 0xB },
+};
+
+/*
+ * handy macros for kp register manipulation
+ */
+# define KBD_MASKIT __REG16((long)OMAP_MPUIO_BASE + OMAP_MPUIO_KBD_MASKIT)
+# define KBC __REG16((long)OMAP_MPUIO_BASE + OMAP_MPUIO_KBC)
+# define KBR_LATCH __REG16((long)OMAP_MPUIO_BASE + OMAP_MPUIO_KBR_LATCH)
+
+/*
+ * return the key code understood by input_report_key
+ */
+static int
+tornado_find_key(unsigned char *new_state, unsigned int *key_state)
+{
+	int i;
+	unsigned char changed;
+
+	/* scan normal keypad keys*/
+	for (i = 0; i < htc_keys_size; ++i) {
+		struct htc_key *wk = &htc_keys[i];
+		int j;
+		int pressed = 0;
+
+		for (j = 0; j < 3; ++j) {
+			int col;
+			int row;
+
+			col = wk->rc[2 * j];
+			row = wk->rc[2 * j + 1];
+
+
+			/* end of key list reached: OK */
+			if (row == 0 && col == 0) {
+				goto ok;
+			}
+
+			changed = new_state[col] ^ kp_state[col];
+			pressed |= new_state[col] & (1 << row);
+
+
+			/* if state of the row/col has not changed, try another key */
+			if ( (changed & (1 << row)) == 0) {
+				break ;
+			}
+
+			if (j == 2) {
+			ok:
+				/*
+				 * all events have been scanned for
+				 * this key: we found it !
+				 */
+				*key_state = pressed;
+				return wk->key;
+			}
+		}
+	}
+	return -1;
+}
+
+/*
+ * read row and col register and update the state array.
+ */
+static void
+tornado_scan_keypad(unsigned char *state)
+{
+	unsigned int col;
+
+	/* scan MPUIO keypad keys */
+	KBC = 0xFF;
+	for (col = 0; col < 8; ++col) {
+		KBC = ~(1 << col) & 0xFF;
+		udelay(4);
+		state[col] = ~(KBR_LATCH) & 0xFF;
+	}
+	KBC = 0x00;
+
+	udelay(2);
+}
+
+/*
+ * returns 1 if a key was pressed or 0 if a key was released.
+ */
+static int
+tornado_key_pressed(unsigned char *state)
+{
+	unsigned int col;
+	int key_down = 0;
+
+	for (col = 0; col < 8; ++col) {
+#ifdef DEBUG
+		unsigned char changed;
+		unsigned int row;
+
+		changed = kp_state[col] ^ state[col];
+
+		for (row = 0; row < 8; ++row) {
+			unsigned int pressed;
+
+			pressed = state[col] & (1 << row);
+			if (changed & (1 << row)) {
+				printk("key down: %i-%i: %s\n", col, row, pressed ? "pressed" : "released");
+			}
+
+		}
+#endif
+		key_down |= state[col];
+	}
+
+	return key_down;
+}
+
+/*
+ * the real work is done here: at the end, if a key is pressed, keep
+ * kp interrupt masked and schedule a call to the tasklet after a bit
+ * (mod_timer ...). this is done to avoid the trigger of too much kp
+ * interrupts .
+ */
+static void 
+tornado_kp_tasklet(unsigned long param)
+{
+	unsigned char state[8];
+	int key_down;
+	int pressed = 0;
+	int key;
+
+	tornado_scan_keypad(state);
+	key_down = tornado_key_pressed(state);
+
+	key = tornado_find_key(state, &pressed);
+	if (key != -1) {
+
+		input_report_key(tornado_kp_dev, key, pressed);
+	}
+
+	memcpy(kp_state, state, sizeof (kp_state));
+
+	if (key_down) {
+		/*
+		 * if a key is down, poll the keypad and keep irq
+		 * disabled
+		 */
+		int delay = HZ / 20;
+
+		mod_timer(&kp_timer, jiffies + delay);
+	} else
+		KBD_MASKIT = 0;
+}
+
+static void
+tornado_kp_timer(unsigned long data)
+{
+	tasklet_schedule(&kp_tasklet);
+}
+
+/*
+ * nothing is done here: disable KP interrupts and schedule a call to
+ * tornado_kp_tasklet.
+ */
+static irqreturn_t 
+tornado_kp_interrupt(int irq, void *dev_id, struct pt_regs *regs)
+{
+	/* disable keypad interrupts and schedule the tasklet */
+	KBD_MASKIT = 1;
+	tasklet_schedule(&kp_tasklet);
+
+	return IRQ_HANDLED;
+}
+
+static void
+tornado_kp_gpio_tasklet(unsigned long param)
+{
+	unsigned int mask;
+	unsigned int changed;
+	unsigned int pressed;
+	static int old_key = 0;
+	int key;
+	int i;
+
+
+	/* GPIO are active low ! */
+	mask = !omap_get_gpio_datain(76);
+	mask |= !omap_get_gpio_datain(80) << 1;
+	mask |= !omap_get_gpio_datain(81) << 2;
+	mask |= !omap_get_gpio_datain(82) << 3;
+	mask |= !omap_get_gpio_datain(83) << 4;
+
+	pressed = mask & 0x1;
+
+
+	changed = mask ^ gpio_mask;
+	if (changed == 0)
+		goto end;
+
+	if (pressed == 0)
+		key = 0;
+	else {
+		key = 0;
+		for (i = 0; i < 5; ++i) {
+			if (gpio_keys[i].mask == mask) {
+				key = gpio_keys[i].key;
+				break;
+			}
+		}
+	}
+
+	if (key != old_key) {
+		if (old_key)
+			input_report_key(tornado_kp_dev, old_key, 0);
+		if (key)
+			input_report_key(tornado_kp_dev, key, 1);
+		old_key = key;
+	}
+
+	gpio_mask = mask;
+
+ end:
+	if (pressed) {
+		int delay = HZ / 20;
+		mod_timer(&kp_gpio_timer, jiffies + delay);
+	} else {
+		enable_irq(OMAP_GPIO_IRQ(kp_gpio));
+	}
+}
+
+static irqreturn_t 
+tornado_kp_gpio_interrupt(int irq, void *dev_id, struct pt_regs *regs)
+{
+	disable_irq(OMAP_GPIO_IRQ(kp_gpio));
+	tasklet_schedule(&kp_gpio_tasklet);
+	return IRQ_HANDLED;
+}
+
+static void
+tornado_kp_gpio_timer(unsigned long data)
+{
+	tasklet_schedule(&kp_gpio_tasklet);
+}
+
+static int __init
+tornado_kp_init(void)
+{
+	unsigned int i;
+
+	printk("HTC Tornado Keypad Driver.\n");
+
+	KBD_MASKIT = 1;
+
+	/* select key tables */
+	if (machine_is_htc_tornado()) {
+		htc_keys = tornado_keys;
+		htc_keys_size = ARRAY_SIZE(tornado_keys);
+		gpio_keys = tornado_gpio_keys;
+		gpio_keys_size = ARRAY_SIZE(tornado_gpio_keys);
+		kp_gpio = TORNADO_KP_GPIO;
+
+		printk("Using HTC Tornado keymap.\n");
+	} else {
+		printk("machine is unknown: not loading driver.\n");
+		return -EINVAL;
+	}
+
+	tornado_kp_dev = input_allocate_device();
+	if (tornado_kp_dev == NULL) {
+		printk("unable to allocate tornado_kp_dev.\n");
+		return -ENOMEM;
+	}
+	tornado_kp_dev->name = "tornado-keypad";
+
+
+	init_timer(&kp_timer);
+	kp_timer.function = tornado_kp_timer;
+	tasklet_enable(&kp_tasklet);
+	if (request_irq(INT_730_MPUIO_KEYPAD, tornado_kp_interrupt, 0, "tornado-keypad", 0)) {
+		printk("unable to get IRQ for tornado-keypad.\n");
+		return -EBUSY;
+	}
+
+	set_bit(EV_KEY, tornado_kp_dev->evbit);
+	for (i = 0; i < KEY_MAX; ++i) {
+		set_bit(i, tornado_kp_dev->keybit);
+	}
+	input_register_device(tornado_kp_dev);
+
+	if (kp_gpio) {
+		/* request arrow keys GPIOS */
+		if (omap_request_gpio(kp_gpio) < 0) {
+			printk("unable to request GPIO %i\n", 76);
+			return -EBUSY;
+		}
+		/* set gpio mode to IN for all kp gpios */
+		omap_set_gpio_direction(kp_gpio, 1);
+		omap_set_gpio_direction(80, 1);
+		omap_set_gpio_direction(81, 1);
+		omap_set_gpio_direction(82, 1);
+		omap_set_gpio_direction(83, 1);
+
+		init_timer(&kp_gpio_timer);
+		kp_gpio_timer.function = tornado_kp_gpio_timer;
+		tasklet_enable(&kp_gpio_tasklet);
+
+		/* be notified when keys are pressed */
+		if (request_irq(OMAP_GPIO_IRQ(kp_gpio), tornado_kp_gpio_interrupt, SA_TRIGGER_FALLING, "tornado-kp-gpio", 0)) {
+			printk("unable to request GPIO IRQ %i\n", 76);
+			return -EBUSY;
+		}
+	}
+
+	tornado_scan_keypad(kp_state);
+	KBD_MASKIT = 0;
+	return 0;
+}
+
+void __exit
+tornado_kp_exit(void)
+{
+	KBD_MASKIT = 1;
+}
+
+module_init(tornado_kp_init);
+module_exit(tornado_kp_exit);
+
+MODULE_AUTHOR("Nicolas Schichan <nico@chac.le-poulpe.net>");
+MODULE_LICENSE("GPL");
+MODULE_DESCRIPTION("HTC Tornado Keypad Driver");
Index: linux-2.6.16/drivers/mmc/omap.c
===================================================================
--- linux-2.6.16.orig/drivers/mmc/omap.c	2007-04-12 10:36:07.000000000 +0200
+++ linux-2.6.16/drivers/mmc/omap.c	2007-04-12 10:36:19.000000000 +0200
@@ -160,10 +160,10 @@
 	u32 resptype;
 	u32 cmdtype;
 
-	pr_debug("MMC%d: CMD%d, argument 0x%08x%s%s%s%s\n",
+	pr_debug("MMC%d: CMD%d, argument 0x%08x%s%s\n",
 		host->id, cmd->opcode, cmd->arg,
-		(cmd->flags & MMC_RSP_SHORT) ?  ", 32-bit response" : "",
-		(cmd->flags & MMC_RSP_LONG) ?  ", 128-bit response" : "",
+/* 		(cmd->flags & MMC_RSP_SHORT) ?  ", 32-bit response" : "", */
+/* 		(cmd->flags & MMC_RSP_LONG) ?  ", 128-bit response" : "", */
 		(cmd->flags & MMC_RSP_CRC) ?  ", CRC" : "",
 		(cmd->flags & MMC_RSP_BUSY) ?  ", busy notification" : "");
 
Index: linux-2.6.16/drivers/mmc/omap.h
===================================================================
--- linux-2.6.16.orig/drivers/mmc/omap.h	2007-04-12 10:36:07.000000000 +0200
+++ linux-2.6.16/drivers/mmc/omap.h	2007-04-12 10:36:19.000000000 +0200
@@ -1,31 +1,66 @@
 #ifndef	DRIVERS_MEDIA_MMC_OMAP_H
 #define	DRIVERS_MEDIA_MMC_OMAP_H
 
-#define	OMAP_MMC_REG_CMD	0x00
-#define	OMAP_MMC_REG_ARGL	0x04
-#define	OMAP_MMC_REG_ARGH	0x08
-#define	OMAP_MMC_REG_CON	0x0c
-#define	OMAP_MMC_REG_STAT	0x10
-#define	OMAP_MMC_REG_IE		0x14
-#define	OMAP_MMC_REG_CTO	0x18
-#define	OMAP_MMC_REG_DTO	0x1c
-#define	OMAP_MMC_REG_DATA	0x20
-#define	OMAP_MMC_REG_BLEN	0x24
-#define	OMAP_MMC_REG_NBLK	0x28
-#define	OMAP_MMC_REG_BUF	0x2c
-#define OMAP_MMC_REG_SDIO	0x34
-#define	OMAP_MMC_REG_REV	0x3c
-#define	OMAP_MMC_REG_RSP0	0x40
-#define	OMAP_MMC_REG_RSP1	0x44
-#define	OMAP_MMC_REG_RSP2	0x48
-#define	OMAP_MMC_REG_RSP3	0x4c
-#define	OMAP_MMC_REG_RSP4	0x50
-#define	OMAP_MMC_REG_RSP5	0x54
-#define	OMAP_MMC_REG_RSP6	0x58
-#define	OMAP_MMC_REG_RSP7	0x5c
-#define	OMAP_MMC_REG_IOSR	0x60
-#define	OMAP_MMC_REG_SYSC	0x64
-#define	OMAP_MMC_REG_SYSS	0x68
+#ifdef CONFIG_ARCH_OMAP730
+/*
+ * unlike other omap architectures, omap730 has 16bits MMC register
+ * offsets ...
+ */
+# define	OMAP_MMC_REG_CMD	0x00
+# define	OMAP_MMC_REG_ARGL	0x02
+# define	OMAP_MMC_REG_ARGH	0x04
+# define	OMAP_MMC_REG_CON	0x06
+# define	OMAP_MMC_REG_STAT	0x08
+# define	OMAP_MMC_REG_IE		0x0a
+# define	OMAP_MMC_REG_CTO	0x0c
+# define	OMAP_MMC_REG_DTO	0x0e
+# define	OMAP_MMC_REG_DATA	0x10
+# define	OMAP_MMC_REG_BLEN	0x12
+# define	OMAP_MMC_REG_NBLK	0x14
+# define	OMAP_MMC_REG_BUF	0x16
+# define	OMAP_MMC_REG_SDIO	0x1a
+# define	OMAP_MMC_REG_REV	0x1e
+# define	OMAP_MMC_REG_RSP0	0x20
+# define	OMAP_MMC_REG_RSP1	0x22
+# define	OMAP_MMC_REG_RSP2	0x24
+# define	OMAP_MMC_REG_RSP3	0x26
+# define	OMAP_MMC_REG_RSP4	0x28
+# define	OMAP_MMC_REG_RSP5	0x2a
+# define	OMAP_MMC_REG_RSP6	0x2c
+# define	OMAP_MMC_REG_RSP7	0x2e
+# define	OMAP_MMC_REG_IOSR	0x30
+# define	OMAP_MMC_REG_SYSC	0x32
+# define	OMAP_MMC_REG_SYSS	0x34
+
+#else
+
+# define	OMAP_MMC_REG_CMD	0x00
+# define	OMAP_MMC_REG_ARGL	0x04
+# define	OMAP_MMC_REG_ARGH	0x08
+# define	OMAP_MMC_REG_CON	0x0c
+# define	OMAP_MMC_REG_STAT	0x10
+# define	OMAP_MMC_REG_IE		0x14
+# define	OMAP_MMC_REG_CTO	0x18
+# define	OMAP_MMC_REG_DTO	0x1c
+# define	OMAP_MMC_REG_DATA	0x20
+# define	OMAP_MMC_REG_BLEN	0x24
+# define	OMAP_MMC_REG_NBLK	0x28
+# define	OMAP_MMC_REG_BUF	0x2c
+# define	OMAP_MMC_REG_SDIO	0x34
+# define	OMAP_MMC_REG_REV	0x3c
+# define	OMAP_MMC_REG_RSP0	0x40
+# define	OMAP_MMC_REG_RSP1	0x44
+# define	OMAP_MMC_REG_RSP2	0x48
+# define	OMAP_MMC_REG_RSP3	0x4c
+# define	OMAP_MMC_REG_RSP4	0x50
+# define	OMAP_MMC_REG_RSP5	0x54
+# define	OMAP_MMC_REG_RSP6	0x58
+# define	OMAP_MMC_REG_RSP7	0x5c
+# define	OMAP_MMC_REG_IOSR	0x60
+# define	OMAP_MMC_REG_SYSC	0x64
+# define	OMAP_MMC_REG_SYSS	0x68
+
+#endif
 
 #define	OMAP_MMC_STAT_CARD_ERR		(1 << 14)
 #define	OMAP_MMC_STAT_CARD_IRQ		(1 << 13)
Index: linux-2.6.16/drivers/usb/gadget/omap_udc.c
===================================================================
--- linux-2.6.16.orig/drivers/usb/gadget/omap_udc.c	2007-04-12 10:36:07.000000000 +0200
+++ linux-2.6.16/drivers/usb/gadget/omap_udc.c	2007-04-12 10:36:19.000000000 +0200
@@ -60,7 +60,7 @@
 #undef	USB_TRACE
 
 /* bulk DMA seems to be behaving for both IN and OUT */
-#define	USE_DMA
+/* #define	USE_DMA */
 
 /* ISO too */
 #define	USE_ISO
@@ -2147,7 +2147,8 @@
 	/* boards that don't have VBUS sensing can't autogate 48MHz;
 	 * can't enter deep sleep while a gadget driver is active.
 	 */
-	if (machine_is_omap_innovator() || machine_is_omap_osk())
+	if (machine_is_omap_innovator() || machine_is_omap_osk() ||
+	    machine_is_htc_tornado())
 		omap_vbus_session(&udc->gadget, 1);
 
 done:
@@ -2170,7 +2171,8 @@
 	if (udc->dc_clk != NULL)
 		omap_udc_enable_clock(1);
 
-	if (machine_is_omap_innovator() || machine_is_omap_osk())
+	if (machine_is_omap_innovator() || machine_is_omap_osk() ||
+	    machine_is_htc_tornado())
 		omap_vbus_session(&udc->gadget, 0);
 
 	if (udc->transceiver)
Index: linux-2.6.16/drivers/video/backlight/Kconfig
===================================================================
--- linux-2.6.16.orig/drivers/video/backlight/Kconfig	2006-03-20 06:53:29.000000000 +0100
+++ linux-2.6.16/drivers/video/backlight/Kconfig	2007-04-12 10:36:19.000000000 +0200
@@ -58,3 +58,10 @@
 	  If you have a HP Jornada 680, say y to enable the
 	  backlight driver.
 
+
+config BACKLIGHT_TORNADO
+	tristate "HTC Tornado Backlight Driver."
+	depends on BACKLIGHT_DEVICE && MACH_TORNADO
+	default y
+	help
+	  Backlight driver for the HTC Tornado smartphones.
Index: linux-2.6.16/drivers/video/backlight/Makefile
===================================================================
--- linux-2.6.16.orig/drivers/video/backlight/Makefile	2006-03-20 06:53:29.000000000 +0100
+++ linux-2.6.16/drivers/video/backlight/Makefile	2007-04-12 10:36:19.000000000 +0200
@@ -5,3 +5,4 @@
 obj-$(CONFIG_BACKLIGHT_CORGI)	+= corgi_bl.o
 obj-$(CONFIG_BACKLIGHT_HP680)	+= hp680_bl.o
 obj-$(CONFIG_SHARP_LOCOMO)	+= locomolcd.o
+obj-$(CONFIG_BACKLIGHT_TORNADO)	+= tornado-bl.o
\ No newline at end of file
Index: linux-2.6.16/drivers/video/backlight/tornado-bl.c
===================================================================
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
+++ linux-2.6.16/drivers/video/backlight/tornado-bl.c	2007-04-12 10:36:19.000000000 +0200
@@ -0,0 +1,224 @@
+/*
+** tornado-bl.c for bl in /home/nico/work/tornado/linux-tornado
+** 
+** Made by nico
+** Login   <nico@chac.le-poulpe.net>
+** 
+** Started on  Wed Apr 12 16:53:40 2006 nico
+** Last update Thu May 25 13:53:14 2006 nico
+*/
+
+/*
+ *
+ * HTC Tornado & Typhoon backlight driver.
+ * Copyright (C) 2006 Nicolas Schichan
+ *
+ * This  program is  free  software; you  can  redistribute it  and/or
+ * modify  it under the  terms of  the GNU  General Public  License as
+ * published by the Free Software  Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ * 
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT  ANY  WARRANTY;  without   even  the  implied  warranty  of
+ * MERCHANTABILITY or  FITNESS FOR A PARTICULAR PURPOSE.   See the GNU
+ * General Public License for more details.
+ * 
+ * You should have  received a copy of the  GNU General Public License
+ * along  with  this program;  if  not,  write  to the  Free  Software
+ * Foundation,  Inc.,  51 Franklin  Street,  Fifth  Floor, Boston,  MA
+ * 02110-1301, USA. 
+ *
+ */
+
+#include <linux/module.h>
+#include <linux/kernel.h>
+#include <linux/init.h>
+#include <linux/device.h>
+#include <linux/spinlock.h>
+#include <linux/fb.h>
+#include <linux/backlight.h>
+#include <linux/platform_device.h>
+
+#include <asm/mach-types.h>
+#include <asm/arch/gpio.h>
+#include <linux/delay.h>
+
+#define TORNADO_LCD_RESET_GPIO 15
+#define TORNADO_LCD_OUT_EN_GPIO 77
+#define TORNADO_LCD_POWER_GPIO 121
+#define TORNADO_BL_GPIO 126
+#define TORNADO_LCD_INTENSITY_GPIO 124
+#define TORNADO_LCD_CLOCK_GPIO 127
+
+static int tornado_bl_powermode = FB_BLANK_UNBLANK;
+static int current_intensity = 1;
+
+
+/*
+ * TODO: see TRM to disable also the internal lcd clock and reenable
+ * it when needed.
+ */
+static int
+tornado_bl_set_power(struct backlight_device *bd, int state)
+{
+	if (state == tornado_bl_powermode)
+		return 0;
+	switch (state) {
+	case FB_BLANK_NORMAL:
+	case FB_BLANK_VSYNC_SUSPEND:
+	case FB_BLANK_HSYNC_SUSPEND:
+	case FB_BLANK_POWERDOWN:
+		omap_set_gpio_dataout(TORNADO_BL_GPIO, 0);
+		omap_set_gpio_dataout(TORNADO_LCD_CLOCK_GPIO, 0);
+		omap_set_gpio_dataout(TORNADO_LCD_INTENSITY_GPIO, 0);
+
+		omap_set_gpio_dataout(TORNADO_LCD_OUT_EN_GPIO, 0);
+		omap_set_gpio_dataout(TORNADO_LCD_RESET_GPIO, 0);
+		omap_set_gpio_dataout(TORNADO_LCD_POWER_GPIO, 0);
+		break;
+
+	case FB_BLANK_UNBLANK:
+		omap_set_gpio_dataout(TORNADO_LCD_POWER_GPIO, 1);
+		omap_set_gpio_dataout(TORNADO_LCD_RESET_GPIO, 1);
+		omap_set_gpio_dataout(TORNADO_LCD_OUT_EN_GPIO, 1);
+
+		omap_set_gpio_dataout(TORNADO_LCD_CLOCK_GPIO, 1);
+		/* restore previous lcd intensity */
+		omap_set_gpio_dataout(TORNADO_LCD_INTENSITY_GPIO, current_intensity);
+		/*
+		 * need to sleep a little bit to allow lcd clock to
+		 * resume completly. avoids a white flickering screen
+		 * that would otherwise be visible for a few
+		 * milliseconds.
+		 *
+		 * we use schedule timoueout here to allow any process
+		 * that might want to use the CPU to run. this should
+		 * not be a problem here.
+		 */
+		schedule_timeout_interruptible(10);
+		omap_set_gpio_dataout(TORNADO_BL_GPIO, 1);
+		break;
+	}
+	tornado_bl_powermode = state;
+	return 0;
+}
+
+static int
+tornado_bl_get_power(struct backlight_device *bd)
+{
+	return tornado_bl_powermode;
+}
+
+static int
+tornado_bl_get_intensity(struct backlight_device *bd)
+{
+	return current_intensity;
+}
+
+static int
+tornado_bl_set_intensity(struct backlight_device *bd, int intensity)
+{
+	if (intensity < 0)
+		intensity = 0;
+	if (intensity > 1)
+		intensity = 1;
+	omap_set_gpio_dataout(TORNADO_LCD_INTENSITY_GPIO, intensity);
+	current_intensity = intensity;
+
+	return 0;
+}
+
+static struct backlight_properties tornado_bl = {
+	.owner		= THIS_MODULE,
+	.get_power      = tornado_bl_get_power,
+	.max_brightness	= 1,
+	.set_power      = tornado_bl_set_power,
+	.set_brightness	= tornado_bl_set_intensity,
+	.get_brightness	= tornado_bl_get_intensity,
+};
+
+static struct backlight_device *tornado_backlight_device;
+
+static int __init
+tornado_bl_probe(struct device *dev)
+{
+	tornado_backlight_device = backlight_device_register("tornado-bl", NULL, &tornado_bl);
+	if (IS_ERR(tornado_backlight_device))
+		return PTR_ERR(tornado_backlight_device);
+	return 0;
+}
+
+static int __init
+tornado_bl_remove(struct device *dev)
+{
+	printk("deregistering tornado-bl device.\n");
+	backlight_device_unregister(tornado_backlight_device);
+	return 0;
+}
+
+static struct device_driver tornado_bl_driver = {
+	.name		= "tornado-bl",
+	.bus		= &platform_bus_type,
+	.probe		= tornado_bl_probe,
+	.remove		= tornado_bl_remove,
+	.suspend	= NULL,
+	.resume		= NULL,
+};
+
+static struct platform_device tornado_bl_device = {
+	.name	= "tornado-bl",
+	.id	= -1,
+};
+
+
+static int __init
+tornado_bl_init(void)
+{
+	int ret;
+
+	omap_request_gpio(TORNADO_LCD_RESET_GPIO);
+	omap_request_gpio(TORNADO_LCD_OUT_EN_GPIO);
+	omap_request_gpio(TORNADO_LCD_POWER_GPIO);
+	omap_request_gpio(TORNADO_BL_GPIO);
+	omap_request_gpio(TORNADO_LCD_INTENSITY_GPIO);
+	omap_request_gpio(TORNADO_LCD_CLOCK_GPIO);
+
+	ret = driver_register(&tornado_bl_driver);
+	if (ret)
+		goto error;
+
+	ret = platform_device_register(&tornado_bl_device);
+	if (ret)
+		goto error;
+
+	omap_set_gpio_direction(TORNADO_BL_GPIO, 0); /* out */
+	printk("HTC Tornado Backlight driver.\n");
+	return 0;
+
+ error:
+	platform_device_unregister(&tornado_bl_device);
+	driver_unregister(&tornado_bl_driver);
+	omap_free_gpio(TORNADO_BL_GPIO);
+	return ret;
+}
+
+static void __exit
+tornado_bl_exit(void)
+{
+	/* FIXME: this freezes the system when unloading ... */
+	platform_device_unregister(&tornado_bl_device);
+	driver_unregister(&tornado_bl_driver);
+	omap_request_gpio(TORNADO_LCD_RESET_GPIO);
+	omap_request_gpio(TORNADO_LCD_OUT_EN_GPIO);
+	omap_request_gpio(TORNADO_LCD_POWER_GPIO);
+	omap_request_gpio(TORNADO_BL_GPIO);
+	omap_request_gpio(TORNADO_LCD_INTENSITY_GPIO);
+	omap_request_gpio(TORNADO_LCD_CLOCK_GPIO);
+}
+
+module_init(tornado_bl_init);
+module_exit(tornado_bl_exit);
+
+MODULE_AUTHOR("Nicolas Schichan");
+MODULE_DESCRIPTION("HTC Tornado LCD Backlight driver.");
+MODULE_LICENSE("GPL");
Index: linux-2.6.16/drivers/video/Kconfig
===================================================================
--- linux-2.6.16.orig/drivers/video/Kconfig	2007-04-12 10:36:07.000000000 +0200
+++ linux-2.6.16/drivers/video/Kconfig	2007-04-12 10:36:19.000000000 +0200
@@ -1428,6 +1428,16 @@
 
 source "drivers/video/omap/Kconfig"
 
+config FB_VSFB
+	bool "VSFB for HTC OMAP based phones"
+	depends on FB && MACH_TORNADO
+	select FB_CFB_FILLRECT
+	select FB_CFB_COPYAREA
+	select FB_CFB_IMAGEBLIT
+	help
+	  Hacked version of the original VSFB for HTC based OMAP
+	  smartphones (320x240 screen and vram at 0x20001020).
+
 config FB_VIRTUAL
 	tristate "Virtual Frame Buffer support (ONLY FOR TESTING!)"
 	depends on FB
Index: linux-2.6.16/drivers/video/logo/Kconfig
===================================================================
--- linux-2.6.16.orig/drivers/video/logo/Kconfig	2006-03-20 06:53:29.000000000 +0100
+++ linux-2.6.16/drivers/video/logo/Kconfig	2007-04-12 10:36:20.000000000 +0200
@@ -71,4 +71,3 @@
 	default y
 
 endmenu
-
Index: linux-2.6.16/drivers/video/logo/logo.c
===================================================================
--- linux-2.6.16.orig/drivers/video/logo/logo.c	2006-03-20 06:53:29.000000000 +0100
+++ linux-2.6.16/drivers/video/logo/logo.c	2007-04-12 10:36:20.000000000 +0200
@@ -35,7 +35,6 @@
 extern const struct linux_logo logo_superh_clut224;
 extern const struct linux_logo logo_m32r_clut224;
 
-
 const struct linux_logo *fb_find_logo(int depth)
 {
 	const struct linux_logo *logo = NULL;
@@ -102,6 +101,7 @@
 		/* M32R Linux logo */
 		logo = &logo_m32r_clut224;
 #endif
+
 	}
 	return logo;
 }
Index: linux-2.6.16/drivers/video/Makefile
===================================================================
--- linux-2.6.16.orig/drivers/video/Makefile	2007-04-12 10:36:07.000000000 +0200
+++ linux-2.6.16/drivers/video/Makefile	2007-04-12 10:36:20.000000000 +0200
@@ -100,6 +100,7 @@
 obj-$(CONFIG_FB_VGA16)            += vga16fb.o vgastate.o
 obj-$(CONFIG_FB_OF)               += offb.o
 obj-$(CONFIG_FB_OMAP)		  += omap/ cfbcopyarea.o cfbfillrect.o cfbimgblt.o
+obj-$(CONFIG_FB_VSFB)		  += vsfb.o
 
 # the test framebuffer is last
 obj-$(CONFIG_FB_VIRTUAL)          += vfb.o
Index: linux-2.6.16/drivers/video/vsfb.c
===================================================================
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
+++ linux-2.6.16/drivers/video/vsfb.c	2007-04-12 10:36:20.000000000 +0200
@@ -0,0 +1,187 @@
+/*
+ *  linux/drivers/video/vsfb.c
+ *
+ *  Copyright (C) 2003 Ian Molton
+ *
+ * Based on acornfb by Russell King
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ * Frame buffer code for Simple platforms
+ *
+ */
+
+#include <linux/config.h>
+#include <linux/module.h>
+#include <linux/kernel.h>
+#include <linux/sched.h>
+#include <linux/errno.h>
+#include <linux/string.h>
+#include <linux/ctype.h>
+#include <linux/mm.h>
+#include <linux/tty.h>
+#include <linux/slab.h>
+#include <linux/init.h>
+#include <linux/fb.h>
+#include <linux/ioport.h>
+
+#include <asm/hardware.h>
+#include <asm/io.h>
+#include <asm/irq.h>
+#include <asm/mach-types.h>
+#include <asm/uaccess.h>
+
+#include <linux/config.h>
+
+#undef FBCON_HAS_CFB8
+#undef FBCON_HAS_CFB2
+#undef FBCON_HAS_CFB4
+#undef FBCON_HAS_CFB32
+
+/* for screen geometry information */
+#include <asm/arch/efb.h>
+
+#define DEFAULT_BPP	16
+#define SCREEN_BASE	(0x20001020)
+
+static struct fb_info fb_info;
+static u32 colreg[17]; // Copied from other driver - but is 17 correct?
+
+
+static int
+vsfb_setcolreg(u_int regno, u_int red, u_int green, u_int blue,
+		  u_int trans, struct fb_info *info)
+{
+        if (regno > 16)
+                return 1;
+
+        ((u32 *)(info->pseudo_palette))[regno] = (red & 0xf800) | ((green & 0xfc00) >> 5) | ((blue & 0xf800) >> 11);
+
+	return 0;
+}
+
+/* extern int soft_cursor(struct fb_info *info, struct fb_cursor *cursor); */
+
+static struct fb_ops vsfb_ops = {
+	.owner		= THIS_MODULE,
+	.fb_setcolreg	= vsfb_setcolreg,
+	.fb_fillrect	= cfb_fillrect,
+	.fb_copyarea	= cfb_copyarea,
+	.fb_imageblit	= cfb_imageblit,
+	.fb_cursor	= NULL,
+};
+
+/*
+ * some members are initialized with 0: they will be properly
+ * initialized at run time, depending on the machine we are running
+ * on.
+ */
+static struct fb_var_screeninfo vsfb_var = {
+        .xres           = 0,
+        .yres           = 0, 
+        .xres_virtual   = 0, 
+        .yres_virtual   = 0, 
+        .bits_per_pixel = 16,
+        .red            = { 11, 5, 0 },
+        .green          = {  5, 6, 0 },
+        .blue           = {  0, 5, 0 },
+        .activate       = FB_ACTIVATE_NOW,
+        .height         = -1,
+        .width          = -1,
+        .vmode          = FB_VMODE_NONINTERLACED,
+	.pixclock	= 12500, /* same as pixclock as P2 frame buffer driver. */
+};
+
+static struct fb_fix_screeninfo vsfb_fix = {
+        .id             = "HTC VSFB",
+        .smem_start     = SCREEN_BASE,
+        .smem_len       = 0, 
+        .type           = FB_TYPE_PACKED_PIXELS,
+        .visual         = FB_VISUAL_TRUECOLOR,
+        .line_length    = 0, 
+        .accel          = FB_ACCEL_NONE,
+};
+
+#define OMAP_LCDC_BASE                  0xfffec000
+#define OMAP_LCDC_CONTROL               (OMAP_LCDC_BASE + 0x00)
+#define OMAP_LCDC_STATUS                (OMAP_LCDC_BASE + 0x10)
+#define OMAP_DMA_LCD_BASE               0xfffee300
+#define OMAP_DMA_LCD_CCR                (OMAP_DMA_LCD_BASE + 0xc2)
+#define OMAP_DMA_LCD_CTRL               (OMAP_DMA_LCD_BASE + 0xc4)
+
+int __init
+vsfb_init(void)
+{
+
+	printk("VSFB Frame buffer driver for HTC OMAP Based Phones.\n");
+
+	fb_info.fix = vsfb_fix;
+	fb_info.var = vsfb_var;
+
+        fb_info.fbops           = &vsfb_ops;
+        fb_info.flags           = FBINFO_FLAG_DEFAULT;
+        fb_info.pseudo_palette  = colreg;
+        fb_alloc_cmap(&fb_info.cmap, 16, 0);
+
+	if (machine_is_typhoon()) {
+		fb_info.var.xres = 176;
+		fb_info.var.yres = 220;
+	} else {
+		fb_info.var.xres = 240;
+		fb_info.var.yres = 320;
+	}
+
+	fb_info.var.xres_virtual = fb_info.var.xres;
+	fb_info.var.yres_virtual = fb_info.var.yres;
+	fb_info.fix.line_length = fb_info.var.xres * 2;
+	fb_info.fix.smem_len = fb_info.var.xres * fb_info.var.yres * 2;
+
+#ifdef CONFIG_EFB_DEBUG
+	/*
+	 * disable efb so that only one acces the frame buffer
+	 */
+	efb_disable();
+#endif
+
+
+	/* Try to grab our phys memory space... */
+	if (!(request_mem_region(fb_info.fix.smem_start, fb_info.fix.smem_len, "HTC vsfb"))){
+#ifdef CONFIG_EFB_DEBUG
+		efb_enable();
+#endif
+		printk("unable to request addr %p (len %i) for HTC VSFB.\n", fb_info.fix.smem_start, fb_info.fix.smem_len);
+		return -ENOMEM;
+	}
+
+	/* Try to map this so we can access it */
+	fb_info.screen_base    = ioremap(fb_info.fix.smem_start, fb_info.fix.smem_len);
+	if (!fb_info.screen_base) {
+#ifdef CONFIG_EFB_DEBUG
+		efb_enable();
+#endif
+		printk("unable to ioremap %p for HTC vsfb.\n", fb_info.fix.smem_start);
+		release_mem_region(fb_info.fix.smem_start, fb_info.fix.smem_len);
+		return -EIO;
+	}
+
+	printk(KERN_INFO "vsfb: framebuffer at 0x%lx, mapped to 0x%p, size %dk\n", 
+	       fb_info.fix.smem_start, fb_info.screen_base, fb_info.fix.smem_len/1024);
+
+	if (register_framebuffer(&fb_info) < 0){
+#ifdef CONFIG_EFB_DEBUG
+		efb_enable();
+#endif
+		iounmap(fb_info.screen_base);
+		release_mem_region(fb_info.fix.smem_start, fb_info.fix.smem_len);
+		return -EINVAL;
+	}
+
+	return 0;
+}
+
+module_init(vsfb_init);
+MODULE_AUTHOR("Nicolas Schichan (based on VSFB by Ian Molton (based on acornfb by RMK and parts of anakinfb))");
+MODULE_DESCRIPTION("HTC Very Simple framebuffer driver");
+MODULE_LICENSE("GPL");
Index: linux-2.6.16/include/asm-arm/arch-omap/efb.h
===================================================================
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
+++ linux-2.6.16/include/asm-arm/arch-omap/efb.h	2007-04-12 10:36:20.000000000 +0200
@@ -0,0 +1,56 @@
+/*
+** efb.h for efb in /home/nico/work/tornado/linux-tornado
+** 
+** Made by nico
+** Login   <nico@chac.le-poulpe.net>
+** 
+** Started on  Wed Apr  5 18:58:04 2006 nico
+** Last update Thu May 11 13:58:28 2006 nico
+*/
+
+/*
+ *
+ * 
+ * Copyright (C) 2006 Nicolas Schichan
+ *
+ * This  program is  free  software; you  can  redistribute it  and/or
+ * modify  it under the  terms of  the GNU  General Public  License as
+ * published by the Free Software  Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ * 
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT  ANY  WARRANTY;  without   even  the  implied  warranty  of
+ * MERCHANTABILITY or  FITNESS FOR A PARTICULAR PURPOSE.   See the GNU
+ * General Public License for more details.
+ * 
+ * You should have  received a copy of the  GNU General Public License
+ * along  with  this program;  if  not,  write  to the  Free  Software
+ * Foundation,  Inc.,  51 Franklin  Street,  Fifth  Floor, Boston,  MA
+ * 02110-1301, USA. 
+ *
+ */
+
+#ifndef _EFB_H
+# define _EFB_H
+
+# include <linux/init.h>
+
+/*
+ * TODO: add __init and __initdata where applicable.
+ */
+
+void efb_init(void);
+void efb_putstr(const char *str);
+
+void efb_disable(void);
+void efb_enable(void);
+
+/* #define EFB_WIDTH 240 */
+/* #define EFB_HEIGHT 320 */
+
+extern const char efb_font[255][25];
+
+extern unsigned int efb_width;
+extern unsigned int efb_height;
+
+#endif /* !_EFB_H */
Index: linux-2.6.16/include/asm-arm/arch-omap/omap730.h
===================================================================
--- linux-2.6.16.orig/include/asm-arm/arch-omap/omap730.h	2006-03-20 06:53:29.000000000 +0100
+++ linux-2.6.16/include/asm-arm/arch-omap/omap730.h	2007-04-12 10:36:20.000000000 +0200
@@ -99,4 +99,3 @@
 #define OMAP730_PCC_UPLD_CTRL		(OMAP730_PCC_UPLD_CTRL_BASE + 0x00)
 
 #endif /*  __ASM_ARCH_OMAP730_H */
-
Index: linux-2.6.16/include/asm-arm/kexec.h
===================================================================
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
+++ linux-2.6.16/include/asm-arm/kexec.h	2007-04-12 10:36:20.000000000 +0200
@@ -0,0 +1,33 @@
+#ifndef _ARM_KEXEC_H
+#define _ARM_KEXEC_H
+
+#ifdef CONFIG_KEXEC
+
+/* Maximum physical address we can use pages from */
+#define KEXEC_SOURCE_MEMORY_LIMIT (-1UL)
+/* Maximum address we can reach in physical address mode */
+#define KEXEC_DESTINATION_MEMORY_LIMIT (-1UL)
+/* Maximum address we can use for the control code buffer */
+#define KEXEC_CONTROL_MEMORY_LIMIT TASK_SIZE
+
+#define KEXEC_CONTROL_CODE_SIZE	4096
+
+#define KEXEC_ARCH KEXEC_ARCH_ARM
+
+#ifndef __ASSEMBLY__
+
+#define MAX_NOTE_BYTES 1024
+
+struct kimage;
+
+static inline void crash_setup_regs(struct pt_regs *newregs,
+				    struct pt_regs *oldregs)
+{
+	/* Dummy implementation for now */
+}
+
+#endif /* __ASSEMBLY__ */
+
+#endif /* CONFIG_KEXEC */
+
+#endif /* _ARM_KEXEC_H */
Index: linux-2.6.16/include/asm-arm/unistd.h
===================================================================
--- linux-2.6.16.orig/include/asm-arm/unistd.h	2006-03-20 06:53:29.000000000 +0100
+++ linux-2.6.16/include/asm-arm/unistd.h	2007-04-12 10:36:20.000000000 +0200
@@ -216,7 +216,7 @@
 #define __NR_sigaltstack		(__NR_SYSCALL_BASE+186)
 #define __NR_sendfile			(__NR_SYSCALL_BASE+187)
 					/* 188 reserved */
-					/* 189 reserved */
+#define __NR_sys_kexec_load		(__NR_SYSCALL_BASE+189)	/* 189 was reserved, temporarily use it for sys_kexec_load */
 #define __NR_vfork			(__NR_SYSCALL_BASE+190)
 #define __NR_ugetrlimit			(__NR_SYSCALL_BASE+191)	/* SuS compliant getrlimit */
 #define __NR_mmap2			(__NR_SYSCALL_BASE+192)
Index: linux-2.6.16/include/linux/kexec.h
===================================================================
--- linux-2.6.16.orig/include/linux/kexec.h	2006-03-20 06:53:29.000000000 +0100
+++ linux-2.6.16/include/linux/kexec.h	2007-04-12 10:36:20.000000000 +0200
@@ -119,6 +119,7 @@
 #define KEXEC_ARCH_PPC     (20 << 16)
 #define KEXEC_ARCH_PPC64   (21 << 16)
 #define KEXEC_ARCH_IA_64   (50 << 16)
+#define KEXEC_ARCH_ARM     (40 << 16)
 #define KEXEC_ARCH_S390    (22 << 16)
 #define KEXEC_ARCH_SH      (42 << 16)
 
Index: linux-2.6.16/init/main.c
===================================================================
--- linux-2.6.16.orig/init/main.c	2006-03-20 06:53:29.000000000 +0100
+++ linux-2.6.16/init/main.c	2007-04-12 10:36:20.000000000 +0200
@@ -58,6 +58,10 @@
 #include <asm/smp.h>
 #endif
 
+#ifdef CONFIG_EFB_DEBUG
+#include <asm/arch/efb.h>
+#endif
+
 /*
  * This is one of the first .c files built. Error out early if we have compiler
  * trouble.
@@ -442,6 +446,12 @@
 {
 	char * command_line;
 	extern struct kernel_param __start___param[], __stop___param[];
+
+#ifdef CONFIG_EFB_DEBUG
+	efb_init();
+	efb_putstr("Rock'n Roll !\n");
+#endif
+
 /*
  * Interrupts are still disabled. Do necessary setups, then
  * enable them
Index: linux-2.6.16/kernel/printk.c
===================================================================
--- linux-2.6.16.orig/kernel/printk.c	2007-04-12 10:36:08.000000000 +0200
+++ linux-2.6.16/kernel/printk.c	2007-04-12 10:36:20.000000000 +0200
@@ -34,12 +34,16 @@
 
 #include <asm/uaccess.h>
 
+#include <asm/arch/efb.h>
+
 #define __LOG_BUF_LEN	(1 << CONFIG_LOG_BUF_SHIFT)
 
-#ifdef        CONFIG_DEBUG_LL
-extern void printascii(char *);
+#ifdef CONFIG_EFB_DEBUG
+#include <asm/arch/efb.h>
 #endif
 
+int in_printk;
+
 /* printk's without a loglevel use this.. */
 #define DEFAULT_MESSAGE_LOGLEVEL 4 /* KERN_WARNING */
 
@@ -367,10 +371,12 @@
 {
 	struct console *con;
 
+	in_printk = 1;
 	for (con = console_drivers; con; con = con->next) {
 		if ((con->flags & CON_ENABLED) && con->write)
 			con->write(con, &LOG_BUF(start), end - start);
 	}
+	in_printk = 0;
 }
 
 /*
@@ -551,8 +557,8 @@
 	/* Emit the output into the temporary buffer */
 	printed_len = vscnprintf(printk_buf, sizeof(printk_buf), fmt, args);
 
-#ifdef	CONFIG_DEBUG_LL
-	printascii(printk_buf);
+#ifdef CONFIG_EFB_DEBUG
+	efb_putstr(printk_buf);
 #endif
 
 	/*