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