aboutsummaryrefslogtreecommitdiffstats
path: root/recipes/linux/linux-tornado-omap2/tornado-20070320.patch
diff options
context:
space:
mode:
Diffstat (limited to 'recipes/linux/linux-tornado-omap2/tornado-20070320.patch')
-rw-r--r--recipes/linux/linux-tornado-omap2/tornado-20070320.patch6081
1 files changed, 6081 insertions, 0 deletions
diff --git a/recipes/linux/linux-tornado-omap2/tornado-20070320.patch b/recipes/linux/linux-tornado-omap2/tornado-20070320.patch
new file mode 100644
index 0000000000..30a7752415
--- /dev/null
+++ b/recipes/linux/linux-tornado-omap2/tornado-20070320.patch
@@ -0,0 +1,6081 @@
+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
+
+ /*