h6300 kernel: update to 2.6.14.3 and remove 2.6.14-rc5
authorMika Laitio <lamikr@cc.jyu.fi>
Sat, 3 Dec 2005 22:13:21 +0000 (22:13 +0000)
committerOpenEmbedded Project <openembedded-devel@lists.openembedded.org>
Sat, 3 Dec 2005 22:13:21 +0000 (22:13 +0000)
packages/linux/linux-h6300-omap1-2.6.14-rc5/defconfig
        packages/linux/linux-h6300-omap1-2.6.14-rc5/h6300_omap1_2614rc5.patch
        packages/linux/linux-h6300-omap1_2.6.14-rc5.bb
packages/linux/linux-h6300-omap1_2.6.14.3.bb
packages/linux/linux-h6300-omap1-2.6.14.3/defconfig
packages/linux/linux-h6300-omap1-2.6.14.3/patch-linux-2614-omap2-to-2614_3-omap1-h6300

packages/linux/linux-h6300-omap1-2.6.14.3/.mtn2git_empty [moved from packages/linux/linux-h6300-omap1-2.6.14-rc5/.mtn2git_empty with 100% similarity]
packages/linux/linux-h6300-omap1-2.6.14.3/defconfig [moved from packages/linux/linux-h6300-omap1-2.6.14-rc5/defconfig with 98% similarity]
packages/linux/linux-h6300-omap1-2.6.14.3/patch-linux-2614-omap2-to-2614_3-omap1-h6300 [moved from packages/linux/linux-h6300-omap1-2.6.14-rc5/h6300_omap1_2614rc5.patch with 86% similarity]
packages/linux/linux-h6300-omap1_2.6.14.3.bb [moved from packages/linux/linux-h6300-omap1_2.6.14-rc5.bb with 51% similarity]

@@ -1,7 +1,7 @@
 #
 # Automatically generated make config: don't edit
-# Linux kernel version: 2.6.14-rc5-omap-h6300
-# Sun Oct 30 09:16:57 2005
+# Linux kernel version: 2.6.14.1-omap1-h6300
+# Wed Nov 23 00:43:00 2005
 #
 CONFIG_ARM=y
 CONFIG_MMU=y
@@ -1078,7 +1078,37 @@ CONFIG_SOUND=m
 #
 # Advanced Linux Sound Architecture
 #
-# CONFIG_SND is not set
+CONFIG_SND=m
+CONFIG_SND_TIMER=m
+CONFIG_SND_PCM=m
+# CONFIG_SND_SEQUENCER is not set
+# CONFIG_SND_MIXER_OSS is not set
+# CONFIG_SND_PCM_OSS is not set
+# CONFIG_SND_VERBOSE_PRINTK is not set
+# CONFIG_SND_DEBUG is not set
+
+#
+# Generic devices
+#
+# CONFIG_SND_DUMMY is not set
+# CONFIG_SND_MTPAV is not set
+# CONFIG_SND_SERIAL_U16550 is not set
+# CONFIG_SND_MPU401 is not set
+
+#
+# ALSA ARM devices
+#
+# CONFIG_SND_OMAP_AIC23 is not set
+CONFIG_SND_OMAP_TSC2101=m
+
+#
+# USB devices
+#
+# CONFIG_SND_USB_AUDIO is not set
+
+#
+# PCMCIA devices
+#
 
 #
 # Open Sound System
-diff -Naur /home/lamikr/own/h6340/kernel/linux-2.6.14-rc5/arch/arm/Kconfig bt_kernel/arch/arm/Kconfig
---- /home/lamikr/own/h6340/kernel/linux-2.6.14-rc5/arch/arm/Kconfig    2005-10-30 17:44:14.719521158 +0200
-+++ bt_kernel/arch/arm/Kconfig 2005-10-14 18:55:31.156317000 +0300
-@@ -725,6 +725,8 @@
- source "drivers/video/Kconfig"
-+source "drivers/telephony/Kconfig"
+diff -Naur linux-2.6.14-omap2/arch/arm/configs/omap_h6300_defconfig linux-h6300-omap2-2.6.14.3/arch/arm/configs/omap_h6300_defconfig
+--- linux-2.6.14-omap2/arch/arm/configs/omap_h6300_defconfig   1970-01-01 02:00:00.000000000 +0200
++++ linux-h6300-omap2-2.6.14.3/arch/arm/configs/omap_h6300_defconfig   2005-11-11 04:13:42.000000000 +0200
+@@ -0,0 +1,1538 @@
++#
++# Automatically generated make config: don't edit
++# Linux kernel version: 2.6.14-omap1-h6300
++# Thu Nov 10 05:21:43 2005
++#
++CONFIG_ARM=y
++CONFIG_MMU=y
++CONFIG_UID16=y
++CONFIG_RWSEM_GENERIC_SPINLOCK=y
++CONFIG_GENERIC_CALIBRATE_DELAY=y
 +
- source "sound/Kconfig"
- source "drivers/usb/Kconfig"
-diff -Naur /home/lamikr/own/h6340/kernel/linux-2.6.14-rc5/arch/arm/mach-omap1/board-h6300.c bt_kernel/arch/arm/mach-omap1/board-h6300.c
---- /home/lamikr/own/h6340/kernel/linux-2.6.14-rc5/arch/arm/mach-omap1/board-h6300.c   1970-01-01 02:00:00.000000000 +0200
-+++ bt_kernel/arch/arm/mach-omap1/board-h6300.c        2005-10-22 03:52:45.687256000 +0300
-@@ -0,0 +1,317 @@
-+/*
-+ * Modified from board-h6300.c
-+ *
-+ * Code for generic OMAP board. Should work on many OMAP systems where
-+ * the device drivers take care of all the necessary hardware initialization.
-+ * Do not put any board specific code to this file; create a new machine
-+ * type if you need custom low-level initializations.
-+ *
-+ * 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.
-+ */
++#
++# Code maturity level options
++#
++CONFIG_EXPERIMENTAL=y
++# CONFIG_CLEAN_COMPILE is not set
++CONFIG_BROKEN=y
++CONFIG_BROKEN_ON_SMP=y
++CONFIG_INIT_ENV_ARG_LIMIT=32
 +
-+#include <linux/kernel.h>
-+#include <linux/init.h>
-+#include <linux/device.h>
-+#include <linux/delay.h>
-+#include <linux/mtd/mtd.h>
-+#include <linux/mtd/partitions.h>
++#
++# General setup
++#
++CONFIG_LOCALVERSION=""
++CONFIG_LOCALVERSION_AUTO=y
++CONFIG_SWAP=y
++CONFIG_SYSVIPC=y
++CONFIG_POSIX_MQUEUE=y
++CONFIG_BSD_PROCESS_ACCT=y
++CONFIG_BSD_PROCESS_ACCT_V3=y
++CONFIG_SYSCTL=y
++# CONFIG_AUDIT is not set
++CONFIG_HOTPLUG=y
++CONFIG_KOBJECT_UEVENT=y
++CONFIG_IKCONFIG=y
++CONFIG_IKCONFIG_PROC=y
++CONFIG_INITRAMFS_SOURCE=""
++CONFIG_EMBEDDED=y
++CONFIG_KALLSYMS=y
++# CONFIG_KALLSYMS_ALL is not set
++# CONFIG_KALLSYMS_EXTRA_PASS is not set
++CONFIG_PRINTK=y
++CONFIG_BUG=y
++CONFIG_BASE_FULL=y
++CONFIG_FUTEX=y
++CONFIG_EPOLL=y
++CONFIG_CC_OPTIMIZE_FOR_SIZE=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_TINY_SHMEM is not set
++CONFIG_BASE_SMALL=0
 +
-+#include <asm/hardware.h>
-+#include <asm/mach-types.h>
-+#include <asm/mach/arch.h>
-+#include <asm/mach/flash.h>
-+#include <asm/mach/map.h>
++#
++# Loadable module support
++#
++CONFIG_MODULES=y
++CONFIG_MODULE_UNLOAD=y
++CONFIG_MODULE_FORCE_UNLOAD=y
++CONFIG_OBSOLETE_MODPARM=y
++# CONFIG_MODVERSIONS is not set
++# CONFIG_MODULE_SRCVERSION_ALL is not set
++CONFIG_KMOD=y
 +
-+#include <asm/arch/gpio.h>
++#
++# 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_CAMELOT 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_IMX is not set
++# CONFIG_ARCH_H720X is not set
++# CONFIG_ARCH_AAEC2000 is not set
 +
-+#include <asm/arch/tc.h>
-+#include <asm/arch/usb.h>
++#
++# TI OMAP Implementations
++#
++CONFIG_ARCH_OMAP1=y
++# CONFIG_ARCH_OMAP2 is not set
 +
-+#include <asm/arch/common.h>
++#
++# OMAP Feature Selections
++#
++# CONFIG_OMAP_RESET_CLOCKS is not set
++# CONFIG_OMAP_BOOT_TAG is not set
++CONFIG_OMAP_MUX=y
++# CONFIG_OMAP_MUX_DEBUG is not set
++CONFIG_OMAP_MUX_WARNINGS=y
++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
++CONFIG_OMAP_SERIAL_WAKE=y
 +
-+#include <asm/arch/h6300_uart_info.h>
++#
++# OMAP Core Type
++#
++# CONFIG_ARCH_OMAP730 is not set
++CONFIG_ARCH_OMAP15XX=y
++# CONFIG_ARCH_OMAP16XX is not set
 +
-+/*
-+ * Bluetooth - Relies on h6300_bt module,
-+ * so make the calls indirectly through pointers. Requires that the
-+ * h6300_bt bluetooth module be loaded before any attempt to use
-+ * bluetooth (obviously).
-+ */
++#
++# OMAP Board Type
++#
++# CONFIG_MACH_OMAP_INNOVATOR is not set
++CONFIG_MACH_OMAP_H6300=y
++# CONFIG_MACH_VOICEBLUE is not set
++# CONFIG_MACH_NETSTAR is not set
++# CONFIG_MACH_OMAP_PALMTE is not set
++# CONFIG_MACH_OMAP_GENERIC is not set
 +
-+static struct h6300_uart_funcs bt_funcs;
-+static struct h6300_uart_funcs gsm_funcs;
++#
++# OMAP CPU Speed
++#
++# CONFIG_OMAP_CLOCKS_SET_BY_BOOTLOADER is not set
++CONFIG_OMAP_ARM_168MHZ=y
++CONFIG_OMAP_ARM_150MHZ=y
++CONFIG_OMAP_ARM_120MHZ=y
++CONFIG_OMAP_ARM_60MHZ=y
++CONFIG_OMAP_ARM_30MHZ=y
++CONFIG_OMAP_DSP=y
++CONFIG_OMAP_DSP_MBCMD_VERBOSE=y
++CONFIG_OMAP_DSP_TASK_MULTIOPEN=y
++CONFIG_OMAP_DSP_FBEXPORT=y
 +
-+static void
-+h6300_bt_configure(struct uart_omap_port *up, int enable)
-+{
-+      printk(KERN_NOTICE "board-h6300.c, h6300_bt_configure() started\n");
-+      if (bt_funcs.configure != NULL)
-+              bt_funcs.configure(up, enable);
-+      printk(KERN_NOTICE "board-h6300.c, h6300_bt_configure() done\n");
-+}
++#
++# Processor Type
++#
++CONFIG_CPU_32=y
++CONFIG_CPU_ARM925T=y
++CONFIG_CPU_32v4=y
++CONFIG_CPU_ABRT_EV4T=y
++CONFIG_CPU_CACHE_V4WT=y
++CONFIG_CPU_CACHE_VIVT=y
++CONFIG_CPU_COPY_V4WB=y
++CONFIG_CPU_TLB_V4WBI=y
 +
-+static void
-+h6300_bt_set_txrx(struct uart_omap_port *up, int txrx)
-+{
-+      printk(KERN_NOTICE "board-h6300.c, h6300_bt_set_txrx() started\n");
-+      if (bt_funcs.set_txrx != NULL)
-+      {
-+              printk(KERN_NOTICE "board-h6300.c, h6300_bt_set_txrx(), bt_funcs.set_txrx != NULL\n");
-+              bt_funcs.set_txrx(up, txrx);
-+      }
-+      printk(KERN_NOTICE "board-h6300.c, h6300_bt_set_txrx() done\n");
-+}
++#
++# Processor Features
++#
++CONFIG_ARM_THUMB=y
++# CONFIG_CPU_ICACHE_DISABLE is not set
++# CONFIG_CPU_DCACHE_DISABLE is not set
++CONFIG_CPU_DCACHE_WRITETHROUGH=y
 +
-+static int
-+h6300_bt_get_txrx(struct uart_omap_port *up)
-+{
-+      int     retVal;
-+      
-+      printk(KERN_NOTICE "board-h6300.c, h6300_bt_get_txrx() started\n");
-+      if (bt_funcs.get_txrx != NULL)
-+      {
-+              retVal  = bt_funcs.get_txrx(up);
-+              printk(KERN_NOTICE "board-h6300.c, h6300_bt_get_txrx(), bt_funcs.get_trx != null, done, retVal %d\n", retVal);
-+              return retVal;
-+      }
-+      else
-+      {
-+              printk(KERN_NOTICE "board-h6300.c, h6300_bt_get_txrx() done, returning 0\n");
-+              return 0;
-+      }
-+}
++#
++# Bus support
++#
++CONFIG_ISA_DMA_API=y
 +
-+static struct platform_omap_serial_funcs h6300_omap_bt_funcs = {
-+      .configure      = h6300_bt_configure,
-+      .set_txrx       = h6300_bt_set_txrx,
-+      .get_txrx       = h6300_bt_get_txrx,
-+};
++#
++# PCCARD (PCMCIA/CardBus) support
++#
++CONFIG_PCCARD=m
++# CONFIG_PCMCIA_DEBUG is not set
++CONFIG_PCMCIA=m
++CONFIG_PCMCIA_LOAD_CIS=y
++CONFIG_PCMCIA_IOCTL=y
 +
-+struct platform_device btuart_device = {
-+      .name   = "h6300_bt",
-+      .id     = 1,
-+};
-+EXPORT_SYMBOL(btuart_device);
++#
++# PC-card bridges
++#
 +
-+static void
-+h6300_gsm_configure(struct uart_omap_port *up, int enable)
-+{
-+      printk(KERN_NOTICE "board-h6300.c, h6300_gsm_configure() started\n");
-+      if (gsm_funcs.configure != NULL)
-+              gsm_funcs.configure(up, enable);
-+      printk(KERN_NOTICE "board-h6300.c, h6300_gsm_configure() done\n");
-+}
++#
++# Kernel Features
++#
++# CONFIG_SMP is not set
++# CONFIG_PREEMPT is not set
++# CONFIG_NO_IDLE_HZ 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_LEDS=y
++CONFIG_LEDS_TIMER=y
++CONFIG_LEDS_CPU=y
++CONFIG_ALIGNMENT_TRAP=y
 +
-+static void
-+h6300_gsm_set_txrx(struct uart_omap_port *up, int txrx)
-+{
-+      printk(KERN_NOTICE "board-h6300.c, h6300_gsm_set_txrx() started\n");
-+      if (bt_funcs.set_txrx != NULL)
-+      {
-+              printk(KERN_NOTICE "board-h6300.c, h6300_gsm_set_txrx(), bt_funcs.set_txrx != NULL\n");
-+              gsm_funcs.set_txrx(up, txrx);
-+      }
-+      printk(KERN_NOTICE "board-h6300.c, h6300_gsm_set_txrx() done\n");
-+}
++#
++# Boot options
++#
++CONFIG_ZBOOT_ROM_TEXT=0x0
++CONFIG_ZBOOT_ROM_BSS=0x0
++CONFIG_CMDLINE="console=tty0 root=/dev/nfs nfsroot=192.168.2.1:/opt/h6300/rootfs,rsize=8192,wsize=8192 ip=192.168.2.2:192.168.2.1:192.168.2.1:255.0.0.0:ipaq:"
++# CONFIG_XIP_KERNEL is not set
 +
-+static int
-+h6300_gsm_get_txrx(struct uart_omap_port *up)
-+{
-+      int     retVal;
-+      
-+      printk(KERN_NOTICE "board-h6300.c, h6300_gsm_get_txrx() started\n");
-+      if (bt_funcs.get_txrx != NULL)
-+      {
-+              retVal  = gsm_funcs.get_txrx(up);
-+              printk(KERN_NOTICE "board-h6300.c, h6300_gsm_get_txrx(), bt_funcs.get_trx != null, done, retVal %d\n", retVal);
-+              return retVal;
-+      }
-+      else
-+      {
-+              printk(KERN_NOTICE "board-h6300.c, h6300_gsm_get_txrx() done, returning 0\n");
-+              return 0;
-+      }
-+}
++#
++# CPU Frequency scaling
++#
++CONFIG_CPU_FREQ=y
++CONFIG_CPU_FREQ_TABLE=y
++CONFIG_CPU_FREQ_DEBUG=y
++CONFIG_CPU_FREQ_STAT=y
++CONFIG_CPU_FREQ_STAT_DETAILS=y
++# CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE is not set
++CONFIG_CPU_FREQ_DEFAULT_GOV_USERSPACE=y
++CONFIG_CPU_FREQ_GOV_PERFORMANCE=y
++CONFIG_CPU_FREQ_GOV_POWERSAVE=y
++CONFIG_CPU_FREQ_GOV_USERSPACE=y
++CONFIG_CPU_FREQ_GOV_ONDEMAND=y
++# CONFIG_CPU_FREQ_GOV_CONSERVATIVE is not set
 +
-+static struct platform_omap_serial_funcs h6300_omap_gsm_funcs = {
-+      .configure      = h6300_gsm_configure,
-+      .set_txrx       = h6300_gsm_set_txrx,
-+      .get_txrx       = h6300_gsm_get_txrx,
-+};
++#
++# Floating point emulation
++#
 +
-+struct platform_device gsmuart_device = {
-+      .name   = "h6300_gsm",
-+      .id     = 1,
-+};
-+EXPORT_SYMBOL(gsmuart_device);
++#
++# At least one emulation must be selected
++#
++CONFIG_FPE_NWFPE=y
++CONFIG_FPE_NWFPE_XP=y
++# CONFIG_FPE_FASTFPE is not set
 +
-+#if 0
-+static struct mtd_partition h6300_partitions[] = {
-+      /* bootloader (U-Boot, etc) in first sector */
-+      {
-+            .name             = "bootloader",
-+            .offset           = 0,
-+            .size             = SZ_128K,
-+            .mask_flags       = MTD_WRITEABLE, /* force read-only */
-+      },
-+      /* bootloader params in the next sector */
-+      {
-+            .name             = "params",
-+            .offset           = MTDPART_OFS_APPEND,
-+            .size             = SZ_128K,
-+            .mask_flags       = 0,
-+      },
-+      /* kernel */
-+      {
-+            .name             = "kernel",
-+            .offset           = MTDPART_OFS_APPEND,
-+            .size             = SZ_2M,
-+            .mask_flags       = 0
-+      },
-+      /* rest of flash1 is a file system */
-+      {
-+            .name             = "rootfs",
-+            .offset           = MTDPART_OFS_APPEND,
-+            .size             = SZ_16M - SZ_2M - 2 * SZ_128K,
-+            .mask_flags       = 0
-+      },
-+      /* file system */
-+      {
-+            .name             = "filesystem",
-+            .offset           = MTDPART_OFS_APPEND,
-+            .size             = MTDPART_SIZ_FULL,
-+            .mask_flags       = 0
-+      }
-+};
++#
++# Userspace binary formats
++#
++CONFIG_BINFMT_ELF=y
++CONFIG_BINFMT_AOUT=y
++CONFIG_BINFMT_MISC=y
++# CONFIG_ARTHUR is not set
 +
-+static struct flash_platform_data h6300_flash_data = {
-+      .map_name       = "cfi_probe",
-+      .width          = 2,
-+      .parts          = h6300_partitions,
-+      .nr_parts       = ARRAY_SIZE(h6300_partitions),
-+};
++#
++# Power management options
++#
++CONFIG_PM=y
++CONFIG_APM=y
 +
-+static struct resource h6300_flash_resource = {
-+      .start          = OMAP_CS0_PHYS,
-+      .end            = OMAP_CS0_PHYS + SZ_32M - 1,
-+      .flags          = IORESOURCE_MEM,
-+};
++#
++# Networking
++#
++CONFIG_NET=y
 +
-+static struct platform_device h6300_flash_device = {
-+      .name   = "omapflash",
-+      .id             = 0,
-+      .dev    = {
-+              .platform_data  = &h6300_flash_data,
-+      },
-+      .num_resources  = 1,
-+      .resource       = &h6300_flash_resource,
-+};
-+#endif
++#
++# Networking options
++#
++CONFIG_PACKET=y
++# CONFIG_PACKET_MMAP is not set
++CONFIG_UNIX=y
++CONFIG_XFRM=y
++CONFIG_XFRM_USER=y
++# CONFIG_NET_KEY is not set
++CONFIG_INET=y
++CONFIG_IP_MULTICAST=y
++# CONFIG_IP_ADVANCED_ROUTER is not set
++CONFIG_IP_FIB_HASH=y
++CONFIG_IP_PNP=y
++CONFIG_IP_PNP_DHCP=y
++CONFIG_IP_PNP_BOOTP=y
++CONFIG_IP_PNP_RARP=y
++# CONFIG_NET_IPIP is not set
++# CONFIG_NET_IPGRE is not set
++# CONFIG_IP_MROUTE is not set
++# CONFIG_ARPD is not set
++CONFIG_SYN_COOKIES=y
++CONFIG_INET_AH=m
++CONFIG_INET_ESP=m
++CONFIG_INET_IPCOMP=m
++CONFIG_INET_TUNNEL=m
++CONFIG_INET_DIAG=y
++CONFIG_INET_TCP_DIAG=y
++# CONFIG_TCP_CONG_ADVANCED is not set
++CONFIG_TCP_CONG_BIC=y
 +
-+static struct resource h6300_wlan_resource[] = {
-+        [0] = {
-+                .start          = OMAP_CS1_PHYS,
-+                .end            = OMAP_CS1_PHYS + SZ_32M -1,
-+                .flags          = IORESOURCE_MEM,
-+        },
++#
++# IP: Virtual Server Configuration
++#
++# CONFIG_IP_VS is not set
++CONFIG_IPV6=y
++CONFIG_IPV6_PRIVACY=y
++CONFIG_INET6_AH=m
++CONFIG_INET6_ESP=m
++CONFIG_INET6_IPCOMP=m
++CONFIG_INET6_TUNNEL=m
++CONFIG_IPV6_TUNNEL=m
++CONFIG_NETFILTER=y
++# CONFIG_NETFILTER_DEBUG is not set
++CONFIG_BRIDGE_NETFILTER=y
++# CONFIG_NETFILTER_NETLINK is not set
 +
-+        [1] = {
-+                .start  = OMAP_GPIO_IRQ(11),
-+                .end    = OMAP_GPIO_IRQ(11),
-+                .flags  = IORESOURCE_IRQ,
-+        },
-+};
++#
++# IP: Netfilter Configuration
++#
++CONFIG_IP_NF_CONNTRACK=m
++CONFIG_IP_NF_CT_ACCT=y
++CONFIG_IP_NF_CONNTRACK_MARK=y
++# CONFIG_IP_NF_CONNTRACK_EVENTS is not set
++CONFIG_IP_NF_CT_PROTO_SCTP=m
++CONFIG_IP_NF_FTP=m
++CONFIG_IP_NF_IRC=m
++# CONFIG_IP_NF_NETBIOS_NS is not set
++CONFIG_IP_NF_TFTP=m
++# CONFIG_IP_NF_AMANDA is not set
++# CONFIG_IP_NF_PPTP is not set
++CONFIG_IP_NF_QUEUE=m
++CONFIG_IP_NF_IPTABLES=m
++CONFIG_IP_NF_MATCH_LIMIT=m
++CONFIG_IP_NF_MATCH_IPRANGE=m
++CONFIG_IP_NF_MATCH_MAC=m
++CONFIG_IP_NF_MATCH_PKTTYPE=m
++# CONFIG_IP_NF_MATCH_MARK is not set
++# CONFIG_IP_NF_MATCH_MULTIPORT is not set
++# CONFIG_IP_NF_MATCH_TOS is not set
++# CONFIG_IP_NF_MATCH_RECENT is not set
++# CONFIG_IP_NF_MATCH_ECN is not set
++# CONFIG_IP_NF_MATCH_DSCP is not set
++# CONFIG_IP_NF_MATCH_AH_ESP is not set
++# CONFIG_IP_NF_MATCH_LENGTH is not set
++# CONFIG_IP_NF_MATCH_TTL is not set
++# CONFIG_IP_NF_MATCH_TCPMSS is not set
++# CONFIG_IP_NF_MATCH_HELPER is not set
++# CONFIG_IP_NF_MATCH_STATE is not set
++# CONFIG_IP_NF_MATCH_CONNTRACK is not set
++# CONFIG_IP_NF_MATCH_OWNER is not set
++# CONFIG_IP_NF_MATCH_PHYSDEV is not set
++# CONFIG_IP_NF_MATCH_ADDRTYPE is not set
++# CONFIG_IP_NF_MATCH_REALM is not set
++# CONFIG_IP_NF_MATCH_SCTP is not set
++# CONFIG_IP_NF_MATCH_DCCP is not set
++# CONFIG_IP_NF_MATCH_COMMENT is not set
++# CONFIG_IP_NF_MATCH_CONNMARK is not set
++# CONFIG_IP_NF_MATCH_CONNBYTES is not set
++# CONFIG_IP_NF_MATCH_HASHLIMIT is not set
++# CONFIG_IP_NF_MATCH_STRING is not set
++# CONFIG_IP_NF_FILTER is not set
++# CONFIG_IP_NF_TARGET_LOG is not set
++# CONFIG_IP_NF_TARGET_ULOG is not set
++# CONFIG_IP_NF_TARGET_TCPMSS is not set
++# CONFIG_IP_NF_TARGET_NFQUEUE is not set
++# CONFIG_IP_NF_NAT is not set
++CONFIG_IP_NF_MANGLE=m
++# CONFIG_IP_NF_TARGET_TOS is not set
++# CONFIG_IP_NF_TARGET_ECN is not set
++# CONFIG_IP_NF_TARGET_DSCP is not set
++# CONFIG_IP_NF_TARGET_MARK is not set
++# CONFIG_IP_NF_TARGET_CLASSIFY is not set
++# CONFIG_IP_NF_TARGET_TTL is not set
++# CONFIG_IP_NF_TARGET_CONNMARK is not set
++# CONFIG_IP_NF_TARGET_CLUSTERIP is not set
++# CONFIG_IP_NF_RAW is not set
++# CONFIG_IP_NF_ARPTABLES is not set
 +
-+static struct platform_device h6300_wlan_device = {
-+        .name           = "tnetw1100b",
-+        .id             = 0,
-+        .num_resources  = 2,
-+        .resource       = h6300_wlan_resource,
-+};
++#
++# IPv6: Netfilter Configuration (EXPERIMENTAL)
++#
++CONFIG_IP6_NF_QUEUE=m
++CONFIG_IP6_NF_IPTABLES=m
++# CONFIG_IP6_NF_MATCH_LIMIT is not set
++CONFIG_IP6_NF_MATCH_MAC=m
++CONFIG_IP6_NF_MATCH_RT=m
++# CONFIG_IP6_NF_MATCH_OPTS is not set
++# CONFIG_IP6_NF_MATCH_FRAG is not set
++# CONFIG_IP6_NF_MATCH_HL is not set
++# CONFIG_IP6_NF_MATCH_MULTIPORT is not set
++# CONFIG_IP6_NF_MATCH_OWNER is not set
++# CONFIG_IP6_NF_MATCH_MARK is not set
++CONFIG_IP6_NF_MATCH_IPV6HEADER=m
++# CONFIG_IP6_NF_MATCH_AHESP is not set
++# CONFIG_IP6_NF_MATCH_LENGTH is not set
++# CONFIG_IP6_NF_MATCH_EUI64 is not set
++# CONFIG_IP6_NF_MATCH_PHYSDEV is not set
++CONFIG_IP6_NF_FILTER=m
++# CONFIG_IP6_NF_TARGET_LOG is not set
++# CONFIG_IP6_NF_TARGET_REJECT is not set
++# CONFIG_IP6_NF_TARGET_NFQUEUE is not set
++CONFIG_IP6_NF_MANGLE=m
++# CONFIG_IP6_NF_TARGET_MARK is not set
++# CONFIG_IP6_NF_TARGET_HL is not set
++CONFIG_IP6_NF_RAW=m
 +
-+static struct platform_device *h6300_devices[] __initdata = {
-+      &btuart_device,
-+      &gsmuart_device,
-+      &h6300_wlan_device,
-+      //&h6300_flash_device,
-+};
++#
++# Bridge: Netfilter Configuration
++#
++CONFIG_BRIDGE_NF_EBTABLES=m
++# CONFIG_BRIDGE_EBT_BROUTE is not set
++# CONFIG_BRIDGE_EBT_T_FILTER is not set
++# CONFIG_BRIDGE_EBT_T_NAT is not set
++# CONFIG_BRIDGE_EBT_802_3 is not set
++# CONFIG_BRIDGE_EBT_AMONG is not set
++# CONFIG_BRIDGE_EBT_ARP is not set
++# CONFIG_BRIDGE_EBT_IP is not set
++# CONFIG_BRIDGE_EBT_LIMIT is not set
++# CONFIG_BRIDGE_EBT_MARK is not set
++# CONFIG_BRIDGE_EBT_PKTTYPE is not set
++# CONFIG_BRIDGE_EBT_STP is not set
++# CONFIG_BRIDGE_EBT_VLAN is not set
++# CONFIG_BRIDGE_EBT_ARPREPLY is not set
++# CONFIG_BRIDGE_EBT_DNAT is not set
++# CONFIG_BRIDGE_EBT_MARK_T is not set
++# CONFIG_BRIDGE_EBT_REDIRECT is not set
++# CONFIG_BRIDGE_EBT_SNAT is not set
++# CONFIG_BRIDGE_EBT_LOG is not set
++# CONFIG_BRIDGE_EBT_ULOG is not set
 +
-+static void __init h6300_init_irq(void)
-+{
-+      omap_init_irq();
-+      omap_gpio_init();
++#
++# DCCP Configuration (EXPERIMENTAL)
++#
++# CONFIG_IP_DCCP is not set
 +
-+      omap_request_gpio (2);
-+      omap_set_gpio_direction (2, 0);
-+      omap_set_gpio_dataout (2, 1);
-+}
++#
++# SCTP Configuration (EXPERIMENTAL)
++#
++# CONFIG_IP_SCTP is not set
++# CONFIG_ATM is not set
++CONFIG_BRIDGE=y
++# 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
++# CONFIG_NET_SCHED is not set
++# CONFIG_NET_CLS_ROUTE is not set
 +
-+/* assume no Mini-AB port */
++#
++# Network testing
++#
++# CONFIG_NET_PKTGEN is not set
++# CONFIG_HAMRADIO is not set
++CONFIG_IRDA=m
 +
-+static struct omap_usb_config h6300_usb_config __initdata = {
-+      .hmc_mode       = 0,
-+      .register_dev   = 1,
-+      .pins[0]        = 0,
-+};
++#
++# IrDA protocols
++#
++CONFIG_IRLAN=m
++CONFIG_IRNET=m
++CONFIG_IRCOMM=m
++CONFIG_IRDA_ULTRA=y
 +
-+static struct omap_lcd_config h6300_lcd_config __initdata = {
-+      .panel_name     = "h6300",
-+      .ctrl_name      = "internal",
-+};
++#
++# IrDA options
++#
++CONFIG_IRDA_CACHE_LAST_LSAP=y
++CONFIG_IRDA_FAST_RR=y
++# CONFIG_IRDA_DEBUG is not set
 +
-+static struct omap_mmc_config h6300_mmc_config __initdata = {
-+      .mmc [0] = {
-+              .enabled        = 1,
-+              .wire4          = 1,
-+              .wp_pin         = OMAP_GPIO_IRQ(13),
-+              .power_pin      = -1,   /* FPGA F3 UIO42 */
-+              .switch_pin     = -1,   /* FPGA F4 UIO43 */
-+      },
-+};
++#
++# Infrared-port device drivers
++#
 +
-+static struct omap_uart_config h6300_uart_config __initdata = {
-+      .enabled_uarts = ((1 << 0) | (1 << 1) | (1 << 2)),
-+};
++#
++# SIR device drivers
++#
++# CONFIG_IRTTY_SIR is not set
 +
-+static struct omap_board_config_kernel h6300_config[] = {
-+      { OMAP_TAG_USB, &h6300_usb_config },
-+      { OMAP_TAG_MMC, &h6300_mmc_config },
-+      { OMAP_TAG_UART,        &h6300_uart_config },
-+      { OMAP_TAG_LCD, &h6300_lcd_config },
-+};
++#
++# Dongle support
++#
 +
-+static void __init h6300_init(void)
-+{
-+      int ret;
-+      
-+      ret = platform_add_devices(h6300_devices, ARRAY_SIZE(h6300_devices));
-+      if (ret) 
-+      {
-+              printk(KERN_WARNING "Unable to add h6300 platform devices like bluetooth");
-+      }
-+      omap_board_config               = h6300_config;
-+      omap_board_config_size  = ARRAY_SIZE(h6300_config);
-+      omap_serial_init();
-+}
++#
++# Old SIR device drivers
++#
++# CONFIG_IRPORT_SIR is not set
 +
-+static void __init h6300_map_io(void)
-+{
-+      omap_map_common_io();
-+      
-+      btuart_device.dev.platform_data = &h6300_omap_bt_funcs;
-+      gsmuart_device.dev.platform_data        = &h6300_omap_gsm_funcs;
-+}
++#
++# Old Serial dongle support
++#
 +
-+MACHINE_START(H6300, "HP iPAQ H6300")
-+      /* MAINTAINER("Everett Coleman II <gcc80x86@fuzzyneural.net>") */
-+      .phys_ram       = 0x10000000,
-+      .phys_io        = 0xfff00000,
-+      .io_pg_offst    = ((0xfef00000) >> 18) & 0xfffc,
-+      .boot_params    = 0x10000100,
-+      .map_io         = h6300_map_io,
-+      .init_irq       = h6300_init_irq,
-+      .init_machine   = h6300_init,
-+      .timer          = &omap_timer,
-+MACHINE_END
-diff -Naur /home/lamikr/own/h6340/kernel/linux-2.6.14-rc5/arch/arm/mach-omap1/Kconfig bt_kernel/arch/arm/mach-omap1/Kconfig
---- /home/lamikr/own/h6340/kernel/linux-2.6.14-rc5/arch/arm/mach-omap1/Kconfig 2005-10-30 17:44:15.310427101 +0200
-+++ bt_kernel/arch/arm/mach-omap1/Kconfig      2005-10-22 03:52:45.687256000 +0300
-@@ -26,6 +26,12 @@
-           TI OMAP 1510 or 1610 Innovator board support. Say Y here if you
-           have such a board.
-+config MACH_OMAP_H6300
-+      bool "HP IPaq H6300"
-+      depends on ARCH_OMAP1 && ARCH_OMAP15XX
-+      help
-+                      HP IPaq H6300 series.
++#
++# FIR device drivers
++#
++# CONFIG_USB_IRDA is not set
++# CONFIG_SIGMATEL_FIR is not set
++# CONFIG_NSC_FIR is not set
++# CONFIG_WINBOND_FIR is not set
++CONFIG_OMAP1610_IR=m
++CONFIG_SMC_IRCC_FIR=m
++# CONFIG_ALI_FIR is not set
++# CONFIG_VIA_FIR is not set
++CONFIG_BT=m
++CONFIG_BT_L2CAP=m
++# CONFIG_BT_SCO is not set
++CONFIG_BT_RFCOMM=m
++CONFIG_BT_RFCOMM_TTY=y
++CONFIG_BT_BNEP=m
++CONFIG_BT_BNEP_MC_FILTER=y
++CONFIG_BT_BNEP_PROTO_FILTER=y
++CONFIG_BT_HIDP=m
 +
- config MACH_OMAP_H2
-       bool "TI H2 Support"
-       depends on ARCH_OMAP1 && ARCH_OMAP16XX
-diff -Naur /home/lamikr/own/h6340/kernel/linux-2.6.14-rc5/arch/arm/mach-omap1/Makefile bt_kernel/arch/arm/mach-omap1/Makefile
---- /home/lamikr/own/h6340/kernel/linux-2.6.14-rc5/arch/arm/mach-omap1/Makefile        2005-10-30 17:44:15.334423281 +0200
-+++ bt_kernel/arch/arm/mach-omap1/Makefile     2005-10-22 03:52:45.687256000 +0300
-@@ -15,7 +15,8 @@
- obj-$(CONFIG_MACH_OMAP_H3)            += board-h3.o
- obj-$(CONFIG_MACH_VOICEBLUE)          += board-voiceblue.o
- obj-$(CONFIG_MACH_NETSTAR)            += board-netstar.o
--obj-$(CONFIG_MACH_OMAP_PALMTE)                += board-palmte.o
-+obj-$(CONFIG_MACH_OMAP_PALMTE)        += board-palmte.o
-+obj-$(CONFIG_MACH_OMAP_H6300)         += board-h6300.o
- ifeq ($(CONFIG_ARCH_OMAP15XX),y)
- # Innovator-1510 FPGA
-diff -Naur /home/lamikr/own/h6340/kernel/linux-2.6.14-rc5/arch/arm/mach-omap2/clock.h bt_kernel/arch/arm/mach-omap2/clock.h
---- /home/lamikr/own/h6340/kernel/linux-2.6.14-rc5/arch/arm/mach-omap2/clock.h 2005-10-30 17:44:15.870337978 +0200
-+++ bt_kernel/arch/arm/mach-omap2/clock.h      2005-10-30 16:32:39.609796000 +0200
-@@ -1469,7 +1469,7 @@
-       .parent         = &l4_ck,
-       .flags          = CLOCK_IN_OMAP242X | CLOCK_IN_OMAP243X,
-       .enable_reg     = (void __iomem *)&CM_ICLKEN2_CORE,
--      .enable_bit     = 3,
-+      .enable_bit     = 2,
-       .recalc         = &omap2_followparent_recalc,
- };
-@@ -1478,7 +1478,7 @@
-       .parent         = &func_48m_ck,
-       .flags          = CLOCK_IN_OMAP242X | CLOCK_IN_OMAP243X,
-       .enable_reg     = (void __iomem *)&CM_FCLKEN2_CORE,
--      .enable_bit     = 3,
-+      .enable_bit     = 2,
-       .recalc         = &omap2_followparent_recalc,
- };
-diff -Naur /home/lamikr/own/h6340/kernel/linux-2.6.14-rc5/arch/arm/plat-omap/devices.c bt_kernel/arch/arm/plat-omap/devices.c
---- /home/lamikr/own/h6340/kernel/linux-2.6.14-rc5/arch/arm/plat-omap/devices.c        2005-10-30 17:44:16.144294371 +0200
-+++ bt_kernel/arch/arm/plat-omap/devices.c     2005-10-22 03:52:45.687256000 +0300
-@@ -93,6 +93,9 @@
-       (void) platform_device_register(&omap_i2c_device1);
- }
-+#else
-+static inline void omap_init_i2c(void) {}
++#
++# Bluetooth device drivers
++#
++# CONFIG_BT_HCIUSB is not set
++CONFIG_BT_HCIUART=m
++CONFIG_BT_HCIUART_H4=y
++CONFIG_BT_HCIUART_BCSP=y
++# CONFIG_BT_HCIUART_BCSP_TXCRC is not set
++# CONFIG_BT_HCIBCM203X is not set
++# CONFIG_BT_HCIBPA10X is not set
++# CONFIG_BT_HCIBFUSB is not set
++# CONFIG_BT_HCIDTL1 is not set
++# CONFIG_BT_HCIBT3C is not set
++# CONFIG_BT_HCIBLUECARD is not set
++# CONFIG_BT_HCIBTUART is not set
++CONFIG_BT_HCIVHCI=m
++CONFIG_BT_H6300=m
++# CONFIG_IEEE80211 is not set
 +
- #endif
- /*-------------------------------------------------------------------------*/
-diff -Naur /home/lamikr/own/h6340/kernel/linux-2.6.14-rc5/arch/arm/plat-omap/dma.c bt_kernel/arch/arm/plat-omap/dma.c
---- /home/lamikr/own/h6340/kernel/linux-2.6.14-rc5/arch/arm/plat-omap/dma.c    2005-10-30 17:44:16.167290711 +0200
-+++ bt_kernel/arch/arm/plat-omap/dma.c 2005-10-30 16:32:39.609796000 +0200
-@@ -28,6 +28,7 @@
- #include <asm/hardware.h>
- #include <asm/dma.h>
- #include <asm/io.h>
-+#include <asm/mach-types.h>
- #include <asm/arch/tc.h>
-@@ -121,7 +122,8 @@
- }
- void omap_set_dma_transfer_params(int lch, int data_type, int elem_count,
--                                int frame_count, int sync_mode)
-+                                int frame_count, int sync_mode,
-+                                int dma_trigger, int src_or_dst_synch)
- {
-       u16 w;
-@@ -179,7 +181,8 @@
- void omap_set_dma_src_params(int lch, int src_port, int src_amode,
--                           unsigned long src_start)
-+                           unsigned long src_start,
-+                           int src_ei, int src_fi)
- {
-       u16 w;
-@@ -221,7 +224,14 @@
-       case OMAP_DMA_DATA_BURST_DIS:
-               break;
-       case OMAP_DMA_DATA_BURST_4:
--              w |= (0x01 << 7);
-+              if (machine_is_h6300())
-+              {
-+                      w |= (0x01 << 7);
-+              }
-+              else
-+              {
-+                      w |= (0x02 << 7);
-+              }
-               break;
-       case OMAP_DMA_DATA_BURST_8:
-               /* not supported by current hardware
-@@ -235,7 +245,8 @@
- }
- void omap_set_dma_dest_params(int lch, int dest_port, int dest_amode,
--                            unsigned long dest_start)
-+                            unsigned long dest_start,
-+                            int dst_ei, int dst_fi)
- {
-       u16 w;
-@@ -277,7 +288,14 @@
-       case OMAP_DMA_DATA_BURST_DIS:
-               break;
-       case OMAP_DMA_DATA_BURST_4:
--              w |= (0x01 << 14);
-+              if (machine_is_h6300())
-+              {
-+                      w |= (0x01 << 14);
-+              }
-+              else
-+              {
-+                      w |= (0x02 << 14);
-+              }
-               break;
-       case OMAP_DMA_DATA_BURST_8:
-               w |= (0x03 << 14);
-@@ -769,6 +787,10 @@
-       }
-       if (omap_dma_in_1510_mode()) {
-+              u16 l = omap_readw(OMAP1510_DMA_LCD_CTRL);
-+              l &= ~(1 << 6);
-+              omap_writew (l, OMAP1510_DMA_LCD_CTRL);
++#
++# Device Drivers
++#
 +
-               omap_writew(top >> 16, OMAP1510_DMA_LCD_TOP_F1_U);
-               omap_writew(top, OMAP1510_DMA_LCD_TOP_F1_L);
-               omap_writew(bottom >> 16, OMAP1510_DMA_LCD_BOT_F1_U);
-diff -Naur /home/lamikr/own/h6340/kernel/linux-2.6.14-rc5/arch/arm/plat-omap/mcbsp.c bt_kernel/arch/arm/plat-omap/mcbsp.c
---- /home/lamikr/own/h6340/kernel/linux-2.6.14-rc5/arch/arm/plat-omap/mcbsp.c  2005-10-30 17:44:16.477241375 +0200
-+++ bt_kernel/arch/arm/plat-omap/mcbsp.c       2005-10-30 16:32:39.609796000 +0200
-@@ -493,17 +493,20 @@
-       omap_set_dma_transfer_params(mcbsp[id].dma_tx_lch,
-                                    OMAP_DMA_DATA_TYPE_S16,
-                                    length >> 1, 1,
--                                   OMAP_DMA_SYNC_ELEMENT);
-+                                   OMAP_DMA_SYNC_ELEMENT,
-+                                   0, 0);
-       omap_set_dma_dest_params(mcbsp[id].dma_tx_lch,
-                                OMAP_DMA_PORT_TIPB,
-                                OMAP_DMA_AMODE_CONSTANT,
--                               mcbsp[id].io_base + OMAP_MCBSP_REG_DXR1);
-+                               mcbsp[id].io_base + OMAP_MCBSP_REG_DXR1,
-+                               0, 0);
-       omap_set_dma_src_params(mcbsp[id].dma_tx_lch,
-                               OMAP_DMA_PORT_EMIFF,
-                               OMAP_DMA_AMODE_POST_INC,
--                              buffer);
-+                              buffer,
-+                              0, 0);
-       omap_start_dma(mcbsp[id].dma_tx_lch);
-       wait_for_completion(&(mcbsp[id].tx_dma_completion));
-@@ -533,17 +536,20 @@
-       omap_set_dma_transfer_params(mcbsp[id].dma_rx_lch,
-                                    OMAP_DMA_DATA_TYPE_S16,
-                                    length >> 1, 1,
--                                   OMAP_DMA_SYNC_ELEMENT);
-+                                   OMAP_DMA_SYNC_ELEMENT,
-+                                   0, 0);
-       omap_set_dma_src_params(mcbsp[id].dma_rx_lch,
-                               OMAP_DMA_PORT_TIPB,
-                               OMAP_DMA_AMODE_CONSTANT,
--                              mcbsp[id].io_base + OMAP_MCBSP_REG_DRR1);
-+                              mcbsp[id].io_base + OMAP_MCBSP_REG_DRR1,
-+                              0, 0);
-       omap_set_dma_dest_params(mcbsp[id].dma_rx_lch,
-                                OMAP_DMA_PORT_EMIFF,
-                                OMAP_DMA_AMODE_POST_INC,
--                               buffer);
-+                               buffer,
-+                               0, 0);
-       omap_start_dma(mcbsp[id].dma_rx_lch);
-       wait_for_completion(&(mcbsp[id].rx_dma_completion));
-diff -Naur /home/lamikr/own/h6340/kernel/linux-2.6.14-rc5/arch/arm/tools/mach-types bt_kernel/arch/arm/tools/mach-types
---- /home/lamikr/own/h6340/kernel/linux-2.6.14-rc5/arch/arm/tools/mach-types   2005-10-20 09:23:05.000000000 +0300
-+++ bt_kernel/arch/arm/tools/mach-types        2005-10-22 03:52:45.687256000 +0300
-@@ -576,7 +576,7 @@
- s3c2460                       MACH_S3C2460            S3C2460                 560
- pdm                   MACH_PDM                PDM                     561
- h4700                 MACH_H4700              H4700                   562
--h6300                 MACH_H6300              H6300                   563
-+h6300                 MACH_OMAP_H6300         H6300                   563
- rz1700                        MACH_RZ1700             RZ1700                  564
- a716                  MACH_A716               A716                    565
- estk2440a             MACH_ESTK2440A          ESTK2440A               566
-diff -Naur /home/lamikr/own/h6340/kernel/linux-2.6.14-rc5/drivers/bluetooth/Kconfig bt_kernel/drivers/bluetooth/Kconfig
---- /home/lamikr/own/h6340/kernel/linux-2.6.14-rc5/drivers/bluetooth/Kconfig   2005-10-20 09:23:05.000000000 +0300
-+++ bt_kernel/drivers/bluetooth/Kconfig        2005-10-04 00:58:34.589442000 +0300
-@@ -163,6 +163,16 @@
-         Say Y here to compile support for virtual HCI devices into the
-         kernel or say M to compile it as module (hci_vhci).
-+        
-+config BT_H6300
-+      tristate "H6300 BRF6100 BT DRIVER"
-+      help
-+        Bluetooth H6300 BRF6100 driver.
-+        This driver provides the firmware loading mechanism for the BRF6100
-+        bt hardware in iPAQ h6300.
++#
++# Generic Driver Options
++#
++CONFIG_STANDALONE=y
++CONFIG_PREVENT_FIRMWARE_BUILD=y
++CONFIG_FW_LOADER=y
++# CONFIG_DEBUG_DRIVER is not set
 +
-+        Say Y here to compile support for BRF6100 BT devices into the
-+        kernel or say M to compile it as module (h6300_BT).     
- endmenu
-diff -Naur /home/lamikr/own/h6340/kernel/linux-2.6.14-rc5/drivers/bluetooth/Makefile bt_kernel/drivers/bluetooth/Makefile
---- /home/lamikr/own/h6340/kernel/linux-2.6.14-rc5/drivers/bluetooth/Makefile  2005-10-20 09:23:05.000000000 +0300
-+++ bt_kernel/drivers/bluetooth/Makefile       2005-09-28 01:04:13.052737000 +0300
-@@ -10,10 +10,11 @@
- obj-$(CONFIG_BT_HCIBFUSB)     += bfusb.o
- obj-$(CONFIG_BT_HCIDTL1)      += dtl1_cs.o
- obj-$(CONFIG_BT_HCIBT3C)      += bt3c_cs.o
--obj-$(CONFIG_BT_HCIBLUECARD)  += bluecard_cs.o
-+obj-$(CONFIG_BT_HCIBLUECARD)+= bluecard_cs.o
- obj-$(CONFIG_BT_HCIBTUART)    += btuart_cs.o
-+obj-$(CONFIG_BT_H6300)                += omap/
--hci_uart-y                            := hci_ldisc.o
-+hci_uart-y                                                    := hci_ldisc.o
- hci_uart-$(CONFIG_BT_HCIUART_H4)      += hci_h4.o
- hci_uart-$(CONFIG_BT_HCIUART_BCSP)    += hci_bcsp.o
--hci_uart-objs                         := $(hci_uart-y)
-+hci_uart-objs                                         := $(hci_uart-y)
-diff -Naur /home/lamikr/own/h6340/kernel/linux-2.6.14-rc5/drivers/bluetooth/omap/h6300_bt_brf6100.c bt_kernel/drivers/bluetooth/omap/h6300_bt_brf6100.c
---- /home/lamikr/own/h6340/kernel/linux-2.6.14-rc5/drivers/bluetooth/omap/h6300_bt_brf6100.c   1970-01-01 02:00:00.000000000 +0200
-+++ bt_kernel/drivers/bluetooth/omap/h6300_bt_brf6100.c        2005-10-06 02:34:39.057478000 +0300
-@@ -0,0 +1,153 @@
-+/* 
-+ * Bluetooth interface driver for TI BRF6100 on h6300
-+ * 
-+ * Copyright (C) 2005 Mika Laitio <lamikr@cc.jyu.fi>
-+ * Ideas taken from the brf6150 bt driver made by Todd Blumer for the pxa hx4700.
-+ * 
-+ * 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.
-+ */
++#
++# Memory Technology Devices (MTD)
++#
++CONFIG_MTD=y
++# CONFIG_MTD_DEBUG is not set
++CONFIG_MTD_CONCAT=y
++CONFIG_MTD_PARTITIONS=y
++CONFIG_MTD_REDBOOT_PARTS=y
++CONFIG_MTD_REDBOOT_DIRECTORY_BLOCK=-1
++# CONFIG_MTD_REDBOOT_PARTS_UNALLOCATED is not set
++# CONFIG_MTD_REDBOOT_PARTS_READONLY is not set
++# CONFIG_MTD_CMDLINE_PARTS is not set
++# CONFIG_MTD_AFS_PARTS is not set
 +
-+#include <linux/module.h>
-+#include <linux/kernel.h>
-+#include <linux/delay.h>
-+#include <linux/device.h>
++#
++# User Modules And Translation Layers
++#
++CONFIG_MTD_CHAR=y
++CONFIG_MTD_BLOCK=y
++# CONFIG_FTL is not set
++# CONFIG_NFTL is not set
++# CONFIG_INFTL is not set
 +
-+#include <asm/hardware.h>
-+#include <asm/arch/gpio.h>
++#
++# RAM/ROM/Flash chip drivers
++#
++CONFIG_MTD_CFI=m
++CONFIG_MTD_JEDECPROBE=m
++CONFIG_MTD_GEN_PROBE=m
++CONFIG_MTD_CFI_ADV_OPTIONS=y
++CONFIG_MTD_CFI_NOSWAP=y
++# CONFIG_MTD_CFI_BE_BYTE_SWAP is not set
++# CONFIG_MTD_CFI_LE_BYTE_SWAP is not set
++# CONFIG_MTD_CFI_GEOMETRY is not set
++CONFIG_MTD_MAP_BANK_WIDTH_1=y
++CONFIG_MTD_MAP_BANK_WIDTH_2=y
++CONFIG_MTD_MAP_BANK_WIDTH_4=y
++# CONFIG_MTD_MAP_BANK_WIDTH_8 is not set
++# CONFIG_MTD_MAP_BANK_WIDTH_16 is not set
++# CONFIG_MTD_MAP_BANK_WIDTH_32 is not set
++CONFIG_MTD_CFI_I1=y
++CONFIG_MTD_CFI_I2=y
++# CONFIG_MTD_CFI_I4 is not set
++# CONFIG_MTD_CFI_I8 is not set
++# CONFIG_MTD_OTP is not set
++CONFIG_MTD_CFI_INTELEXT=m
++CONFIG_MTD_CFI_AMDSTD=m
++CONFIG_MTD_CFI_AMDSTD_RETRY=1
++CONFIG_MTD_CFI_STAA=m
++CONFIG_MTD_CFI_UTIL=m
++# CONFIG_MTD_RAM is not set
++# CONFIG_MTD_ROM is not set
++CONFIG_MTD_ABSENT=m
++# CONFIG_MTD_OBSOLETE_CHIPS is not set
++# CONFIG_MTD_XIP is not set
 +
-+#include <asm/arch/h6300_uart_info.h>
-+#include "h6300_bt_led.h"
++#
++# Mapping drivers for chip access
++#
++CONFIG_MTD_COMPLEX_MAPPINGS=y
++CONFIG_MTD_PHYSMAP=m
++CONFIG_MTD_PHYSMAP_START=0x8000000
++CONFIG_MTD_PHYSMAP_LEN=0x4000000
++CONFIG_MTD_PHYSMAP_BANKWIDTH=2
++# CONFIG_MTD_ARM_INTEGRATOR is not set
++# CONFIG_MTD_EDB7312 is not set
++# CONFIG_MTD_IMPA7 is not set
++# CONFIG_MTD_OMAP_NOR is not set
++# CONFIG_MTD_PCMCIA is not set
++# CONFIG_MTD_PLATRAM is not set
 +
-+static void
-+h6300_bt_configure(struct uart_omap_port *up, int enable)
-+{
-+      printk(KERN_NOTICE "h6300_bt_brf6100.c h6300_bt_configure() started, enable = %d\n", enable);
-+      
-+      // printk( KERN_NOTICE "h6300 configure bluetooth: %d\n", enable );
-+      if (enable == 0) {
-+              omap_set_gpio_dataout(GPIO_N_BT_RST, 0);        // turn off gpio
-+              mdelay(5);
-+              h6300_clear_led(INDEX_BT_LED);
-+      }
-+      else if (enable == 1) {
-+              omap_set_gpio_dataout(GPIO_N_BT_RST, 1);        // turn on gpio
-+              mdelay(5);                              
-+      }
-+      else if (enable == 2) {
-+              /*
-+               * BRF6150's RTS goes low when firmware is ready
-+               * so check for CTS=1 (nCTS=0 -> CTS=1). Typical 150ms
-+               */
-+/*            
-+              int tries = 0; 
-+              do 
-+              {
-+                      mdelay(10);
-+              } 
-+              while ((BTMSR & MSR_CTS) == 0 && tries++ < 50);
-+*/                            
-+              h6300_set_led(INDEX_BT_LED, 16, 16);
-+      }
-+      printk(KERN_NOTICE "h6300_bt_brf6100.c h6300_bt_configure() done\n");
-+}
++#
++# Self-contained MTD device drivers
++#
++CONFIG_MTD_SLRAM=m
++CONFIG_MTD_PHRAM=m
++CONFIG_MTD_MTDRAM=m
++CONFIG_MTDRAM_TOTAL_SIZE=4096
++CONFIG_MTDRAM_ERASE_SIZE=128
++CONFIG_MTD_BLKMTD=m
++# CONFIG_MTD_BLOCK2MTD is not set
 +
-+static void
-+h6300_bt_set_txrx(struct uart_omap_port *up, int txrx)
-+{
-+      printk(KERN_NOTICE "h6300_bt_brf6100.c h6300_bt_set_txrx(), txrx = %d done\n", txrx);
-+      /* do nothing */
-+}
++#
++# Disk-On-Chip Device Drivers
++#
++CONFIG_MTD_DOC2000=m
++CONFIG_MTD_DOC2001=m
++CONFIG_MTD_DOC2001PLUS=m
++CONFIG_MTD_DOCPROBE=m
++CONFIG_MTD_DOCECC=m
++CONFIG_MTD_DOCPROBE_ADVANCED=y
++CONFIG_MTD_DOCPROBE_ADDRESS=0x0000
++CONFIG_MTD_DOCPROBE_HIGH=y
++CONFIG_MTD_DOCPROBE_55AA=y
 +
-+static int
-+h6300_bt_get_txrx(struct uart_omap_port *up)
-+{
-+      printk(KERN_NOTICE "h6300_bt_brf6100.c h6300_bt_get_txrx() done\n");
-+      /* do nothing */
-+      return 0;
-+}
++#
++# NAND Flash Device Drivers
++#
++CONFIG_MTD_NAND=m
++# CONFIG_MTD_NAND_VERIFY_WRITE is not set
++# CONFIG_MTD_NAND_TOTO is not set
++CONFIG_MTD_NAND_IDS=m
++CONFIG_MTD_NAND_DISKONCHIP=m
++CONFIG_MTD_NAND_DISKONCHIP_PROBE_ADVANCED=y
++CONFIG_MTD_NAND_DISKONCHIP_PROBE_ADDRESS=0x0
++# CONFIG_MTD_NAND_DISKONCHIP_PROBE_HIGH is not set
++CONFIG_MTD_NAND_DISKONCHIP_BBTWRITE=y
++# CONFIG_MTD_NAND_NANDSIM is not set
 +
-+static int
-+h6300_bt_probe(struct device *dev)
-+{
-+      struct h6300_uart_funcs *funcs = (struct h6300_uart_funcs *)dev->platform_data;
++#
++# Parallel port support
++#
++# CONFIG_PARPORT is not set
 +
-+      omap_request_gpio(GPIO_BT_PWR_EN);              // ask bt_power_en gpio, remember to release in remove_function
-+      omap_set_gpio_direction(GPIO_BT_PWR_EN, 1);     // set gpio direction to be output
-+      omap_set_gpio_dataout(GPIO_BT_PWR_EN, 1);       // turn on gpio
++#
++# Plug and Play support
++#
 +
-+      mdelay(200);
++#
++# Block devices
++#
++# CONFIG_BLK_DEV_COW_COMMON is not set
++CONFIG_BLK_DEV_LOOP=y
++CONFIG_BLK_DEV_CRYPTOLOOP=m
++# CONFIG_BLK_DEV_NBD is not set
++# CONFIG_BLK_DEV_UB is not set
++CONFIG_BLK_DEV_RAM=y
++CONFIG_BLK_DEV_RAM_COUNT=16
++CONFIG_BLK_DEV_RAM_SIZE=16384
++CONFIG_BLK_DEV_INITRD=y
++# CONFIG_CDROM_PKTCDVD is not set
 +
-+      omap_request_gpio(GPIO_N_BT_RST);               // ask bt_reset gpio, remember to release in remove_function
-+      omap_set_gpio_direction(GPIO_N_BT_RST, 1);      // set gpio direction to be output
-+      omap_set_gpio_dataout(GPIO_N_BT_RST, 1);        // turn on gpio
-+      
-+      /* configure bluetooth UART */
-+      //h6300_gpio_mode(GPIO_NR_H6300_BT_RXD_MD);
-+      //h6300_gpio_mode(GPIO_NR_H6300_BT_TXD_MD);
-+      //h6300_gpio_mode(GPIO_NR_H6300_BT_UART_CTS_MD);
-+      //h6300_gpio_mode(GPIO_NR_H6300_BT_UART_RTS_MD);
++#
++# IO Schedulers
++#
++CONFIG_IOSCHED_NOOP=y
++CONFIG_IOSCHED_AS=y
++CONFIG_IOSCHED_DEADLINE=y
++CONFIG_IOSCHED_CFQ=y
++# CONFIG_ATA_OVER_ETH is not set
 +
-+      funcs->configure        = h6300_bt_configure;
-+      funcs->set_txrx         = h6300_bt_set_txrx;
-+      funcs->get_txrx         = h6300_bt_get_txrx;
++#
++# ATA/ATAPI/MFM/RLL support
++#
++# CONFIG_IDE is not set
 +
-+      /* Make sure the LED is off */
-+      h6300_clear_led(INDEX_BT_LED);
-+      
-+      printk(KERN_NOTICE "h6300_bt_brf6100.c h6300_bt_probe() done\n");       
++#
++# SCSI device support
++#
++# CONFIG_RAID_ATTRS is not set
++# CONFIG_SCSI is not set
 +
-+      return 0;
-+}
++#
++# Multi-device support (RAID and LVM)
++#
++# CONFIG_MD is not set
 +
-+static int
-+h6300_bt_remove(struct device *dev)
-+{
-+      struct h6300_uart_funcs *funcs = (struct h6300_uart_funcs *)dev->platform_data;
-+      
-+      printk(KERN_NOTICE "h6300_bt_brf6100.c h6300_bt_remove() started\n");   
-+      
-+      omap_free_gpio(GPIO_BT_PWR_EN);
-+      omap_free_gpio(GPIO_N_BT_RST);
++#
++# Fusion MPT device support
++#
++# CONFIG_FUSION is not set
 +
-+      funcs->configure        = NULL;
-+      funcs->set_txrx         = NULL;
-+      funcs->get_txrx         = NULL;
++#
++# IEEE 1394 (FireWire) support
++#
++# CONFIG_IEEE1394 is not set
 +
-+      /* Make sure the LED is off */
-+      h6300_clear_led(INDEX_BT_LED);
-+      
-+      printk(KERN_NOTICE "h6300_bt_brf6100.c, h6300_bt_remove() done\n");
++#
++# I2O device support
++#
 +
-+      return 0;
-+}
++#
++# Network device support
++#
++CONFIG_NETDEVICES=y
++# CONFIG_DUMMY is not set
++# CONFIG_BONDING is not set
++# CONFIG_EQUALIZER is not set
++# CONFIG_TUN is not set
 +
-+static struct device_driver bt_driver = {
-+      .name     = "h6300_bt",
-+      .bus      = &platform_bus_type,
-+      .probe    = h6300_bt_probe,
-+      .remove   = h6300_bt_remove,
-+};
++#
++# PHY device support
++#
++# CONFIG_PHYLIB is not set
 +
-+static int __init
-+h6300_bt_init(void)
-+{
-+      printk(KERN_NOTICE "h6300 Bluetooth Driver init()\n");
-+      return driver_register(&bt_driver);
-+}
++#
++# Ethernet (10 or 100Mbit)
++#
++CONFIG_NET_ETHERNET=y
++CONFIG_MII=y
++CONFIG_SMC91X=y
++# CONFIG_DM9000 is not set
 +
-+static void __exit
-+h6300_bt_exit(void)
-+{
-+      printk(KERN_NOTICE "h6300 Bluetooth Driver exit()\n");
-+      driver_unregister(&bt_driver);
-+}
++#
++# Ethernet (1000 Mbit)
++#
 +
-+module_init(h6300_bt_init);
-+module_exit(h6300_bt_exit);
++#
++# Ethernet (10000 Mbit)
++#
 +
-+MODULE_AUTHOR("Mika Laitio, <lamikr@cc.jyu.fi>");
-+MODULE_DESCRIPTION("iPAQ h6300 BRF6100 Bluetooth driver.");
-+MODULE_LICENSE("GPL");
++#
++# Token Ring devices
++#
 +
-diff -Naur /home/lamikr/own/h6340/kernel/linux-2.6.14-rc5/drivers/bluetooth/omap/h6300_bt_led.c bt_kernel/drivers/bluetooth/omap/h6300_bt_led.c
---- /home/lamikr/own/h6340/kernel/linux-2.6.14-rc5/drivers/bluetooth/omap/h6300_bt_led.c       1970-01-01 02:00:00.000000000 +0200
-+++ bt_kernel/drivers/bluetooth/omap/h6300_bt_led.c    2005-10-06 02:34:39.057478000 +0300
-@@ -0,0 +1,41 @@
-+/* 
-+ * Bluetooth interface driver helper for controlling bluetooth leds available in iPAQ h6300.
-+ * 
-+ * Copyright (C) 2005 Mika Laitio  <lamikr@cc.jyu.fi>
-+ * Ideas from the brf6150 bt driver made by Todd Blumer for the pxa hx4700.
-+ * 
-+ * 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.
-+ */
++#
++# Wireless LAN (non-hamradio)
++#
++CONFIG_NET_RADIO=y
 +
-+#include <linux/module.h>
-+#include <linux/kernel.h>
-+#include <linux/delay.h>
-+#include <linux/device.h>
++#
++# Obsolete Wireless cards support (pre-802.11)
++#
++CONFIG_STRIP=y
++# CONFIG_PCMCIA_WAVELAN is not set
++# CONFIG_PCMCIA_NETWAVE is not set
 +
-+#include <asm/hardware.h>
-+#include <asm/arch/gpio.h>
++#
++# Wireless 802.11 Frequency Hopping cards support
++#
++# CONFIG_PCMCIA_RAYCS is not set
 +
-+/* 
-+ * Low level access for disabling h6300 bt led.
-+ *
-+ * TODO: implement for h6300 
-+ */
-+void h6300_clear_led(int led_num)
-+{
-+      printk(KERN_NOTICE "h6300_bt_led.c h6300_clear_led() done\n");
-+      //hx4700_set_led(led_num, 0, 16);
-+}
-+EXPORT_SYMBOL(h6300_clear_led);
++#
++# Wireless 802.11b ISA/PCI cards support
++#
++# CONFIG_AIRO is not set
++# CONFIG_HERMES is not set
++CONFIG_ATMEL=y
 +
-+/* 
-+ * Low level access for setting up the bt led.
-+ *
-+ * TODO: implement for h6300 
-+ */
-+void h6300_set_led(int led_num, int duty_time, int cycle_time)
-+{
-+      printk(KERN_NOTICE "h6300_bt_led.c h6300_set_led() done\n");
-+}
-+EXPORT_SYMBOL(h6300_set_led);
-diff -Naur /home/lamikr/own/h6340/kernel/linux-2.6.14-rc5/drivers/bluetooth/omap/h6300_bt_led.h bt_kernel/drivers/bluetooth/omap/h6300_bt_led.h
---- /home/lamikr/own/h6340/kernel/linux-2.6.14-rc5/drivers/bluetooth/omap/h6300_bt_led.h       1970-01-01 02:00:00.000000000 +0200
-+++ bt_kernel/drivers/bluetooth/omap/h6300_bt_led.h    2005-10-06 02:34:39.057478000 +0300
-@@ -0,0 +1,9 @@
-+#ifndef H6300_BT_LED_H_
-+#define H6300_BT_LED_H_
++#
++# Wireless 802.11b Pcmcia/Cardbus cards support
++#
++# CONFIG_AIRO_CS is not set
++# CONFIG_PCMCIA_ATMEL is not set
++# CONFIG_PCMCIA_WL3501 is not set
++# CONFIG_HOSTAP is not set
++CONFIG_NET_WIRELESS=y
++CONFIG_ACX=m
++# CONFIG_ACX_USB is not set
++CONFIG_ACX_CFI=y
 +
-+#define INDEX_BT_LED  2
++#
++# PCMCIA network device support
++#
++# CONFIG_NET_PCMCIA is not set
 +
-+void h6300_clear_led(int led_num);
-+void h6300_set_led(int led_num, int duty_time, int cycle_time);
++#
++# Wan interfaces
++#
++# CONFIG_WAN is not set
++CONFIG_PPP=y
++CONFIG_PPP_MULTILINK=y
++CONFIG_PPP_FILTER=y
++CONFIG_PPP_ASYNC=y
++CONFIG_PPP_SYNC_TTY=y
++CONFIG_PPP_DEFLATE=y
++CONFIG_PPP_BSDCOMP=y
++CONFIG_PPPOE=y
++# 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
 +
-+#endif /*H6300_BT_LED_H_*/
-diff -Naur /home/lamikr/own/h6340/kernel/linux-2.6.14-rc5/drivers/bluetooth/omap/Makefile bt_kernel/drivers/bluetooth/omap/Makefile
---- /home/lamikr/own/h6340/kernel/linux-2.6.14-rc5/drivers/bluetooth/omap/Makefile     1970-01-01 02:00:00.000000000 +0200
-+++ bt_kernel/drivers/bluetooth/omap/Makefile  2005-10-06 02:34:39.057478000 +0300
-@@ -0,0 +1,6 @@
 +#
-+# Makefile for the Linux iPAQ H6300 BRF6100 Bluetooth device drivers.
++# ISDN subsystem
 +#
++# CONFIG_ISDN is not set
 +
-+h6300_bt-objs                         := h6300_bt_led.o h6300_bt_brf6100.o
-+obj-$(CONFIG_BT_H6300)                += h6300_bt.o
-diff -Naur /home/lamikr/own/h6340/kernel/linux-2.6.14-rc5/drivers/char/.gitignore bt_kernel/drivers/char/.gitignore
---- /home/lamikr/own/h6340/kernel/linux-2.6.14-rc5/drivers/char/.gitignore     2005-10-20 09:23:05.000000000 +0300
-+++ bt_kernel/drivers/char/.gitignore  1970-01-01 02:00:00.000000000 +0200
-@@ -1,3 +0,0 @@
--consolemap_deftbl.c
--defkeymap.c
--
-diff -Naur /home/lamikr/own/h6340/kernel/linux-2.6.14-rc5/drivers/input/keyboard/omap-keypad.c bt_kernel/drivers/input/keyboard/omap-keypad.c
---- /home/lamikr/own/h6340/kernel/linux-2.6.14-rc5/drivers/input/keyboard/omap-keypad.c        2005-10-30 17:44:17.444087478 +0200
-+++ bt_kernel/drivers/input/keyboard/omap-keypad.c     2005-10-30 16:34:01.215220000 +0200
-@@ -5,10 +5,11 @@
-  *
-  * Copyright (C) 2003 Nokia Corporation
-  * Written by Timo Teräs <ext-timo.teras@nokia.com>
-+ * iPAQ h6300 key and joypad support added by Mika Laitio. (2005)
-  *
-  * Added support for H2 & H3 Keypad
-  * Copyright (C) 2004 Texas Instruments
-- *
-+ * 
-  * 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
-@@ -40,6 +41,7 @@
- #include <asm/arch/mux.h>
- #undef NEW_BOARD_LEARNING_MODE
-+//#define NEW_BOARD_LEARNING_MODE 1
- static void omap_kp_tasklet(unsigned long);
- static void omap_kp_timer(unsigned long);
-@@ -48,6 +50,8 @@
- static unsigned char keypad_state[8];
- static unsigned int keypad_irq = INT_KEYBOARD;
-+static int prevJoypadKeycodePressEmulated;
++#
++# Input device support
++#
++CONFIG_INPUT=y
 +
- static struct timer_list kp_timer;
- DECLARE_TASKLET_DISABLED(kp_tasklet, omap_kp_tasklet, 0);
-@@ -165,6 +169,47 @@
-       0
- };
-+#define _h6300_KEY_CALENDAR   67      // xmodmap 75 aka F9
-+#define _H6300_KEY_TELEPHONE  68      // xmodmap 76 aka F10
-+#define _H6300_KEY_HOMEPAGE   87      // xmodmap 87 aka Num_Lock
-+#define _H6300_KEY_MAIL               88      // xmodmap 88 aka Scroll_Lock
++#
++# Userland interfaces
++#
++# CONFIG_INPUT_MOUSEDEV is not set
++# CONFIG_INPUT_JOYDEV is not set
++CONFIG_INPUT_TSDEV=y
++CONFIG_INPUT_TSDEV_SCREEN_X=240
++CONFIG_INPUT_TSDEV_SCREEN_Y=320
++CONFIG_INPUT_EVDEV=y
++# CONFIG_INPUT_EVBUG is not set
 +
-+/*
-+ * Following 5 keypad events are not really sent to userspace. 
-+ * Instead if the good combination of them is sent, then that is send.
-+ * (up, right, down, left, enter)
++#
++# 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=m
++CONFIG_INPUT_MOUSE=y
++CONFIG_MOUSE_PS2=y
++CONFIG_MOUSE_SERIAL=y
++# CONFIG_MOUSE_VSXXXAA is not set
++# CONFIG_INPUT_JOYSTICK is not set
++CONFIG_INPUT_TOUCHSCREEN=y
++# CONFIG_TOUCHSCREEN_GUNZE is not set
++# CONFIG_TOUCHSCREEN_ELO is not set
++# CONFIG_TOUCHSCREEN_MTOUCH is not set
++# CONFIG_TOUCHSCREEN_MK712 is not set
++CONFIG_TOUCHSCREEN_OMAP=m
++CONFIG_INPUT_MISC=y
++CONFIG_INPUT_UINPUT=m
++
++#
++# Hardware I/O ports
++#
++CONFIG_SERIO=y
++CONFIG_SERIO_SERPORT=y
++CONFIG_SERIO_LIBPS2=y
++CONFIG_SERIO_RAW=y
++# 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=y
++# CONFIG_SERIAL_8250_CONSOLE is not set
++# CONFIG_SERIAL_8250_CS is not set
++CONFIG_SERIAL_8250_NR_UARTS=4
++# CONFIG_SERIAL_8250_EXTENDED is not set
++
++#
++# Non-8250 serial port support
++#
++CONFIG_SERIAL_CORE=y
++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=y
++
++#
++# Watchdog Device Drivers
++#
++CONFIG_SOFT_WATCHDOG=m
++
++#
++# USB-based Watchdog Cards
++#
++# CONFIG_USBPCWATCHDOG is not set
++CONFIG_NVRAM=y
++# CONFIG_RTC is not set
++CONFIG_OMAP_RTC=y
++# CONFIG_DTLK is not set
++# CONFIG_R3964 is not set
++
++#
++# Ftape, the floppy tape device driver
++#
++
++#
++# PCMCIA character devices
++#
++# CONFIG_SYNCLINK_CS is not set
++# CONFIG_RAW_DRIVER is not set
++
++#
++# TPM devices
++#
++
++#
++# I2C support
++#
++CONFIG_I2C=m
++CONFIG_I2C_CHARDEV=m
++
++#
++# I2C Algorithms
++#
++CONFIG_I2C_ALGOBIT=m
++CONFIG_I2C_ALGOPCF=m
++CONFIG_I2C_ALGOPCA=m
++
++#
++# I2C Hardware Bus support
++#
++CONFIG_I2C_PARPORT_LIGHT=m
++# CONFIG_I2C_STUB is not set
++# CONFIG_I2C_PCA_ISA is not set
++CONFIG_I2C_OMAP=m
++
++#
++# Miscellaneous I2C Chip support
++#
++# CONFIG_SENSORS_DS1337 is not set
++# CONFIG_SENSORS_DS1374 is not set
++# CONFIG_SENSORS_EEPROM is not set
++# CONFIG_SENSORS_PCF8574 is not set
++# CONFIG_SENSORS_PCA9539 is not set
++CONFIG_PCA9535=m
++# CONFIG_SENSORS_PCF8591 is not set
++# CONFIG_SENSORS_RTC8564 is not set
++# CONFIG_TPS65010 is not set
++CONFIG_SENSORS_TLV320AIC23=m
++# CONFIG_SENSORS_MAX6875 is not set
++# CONFIG_I2C_DEBUG_CORE is not set
++# CONFIG_I2C_DEBUG_ALGO is not set
++# CONFIG_I2C_DEBUG_BUS is not set
++# CONFIG_I2C_DEBUG_CHIP is not set
++
++#
++# Hardware Monitoring support
++#
++CONFIG_HWMON=y
++# CONFIG_HWMON_VID is not set
++# CONFIG_SENSORS_ADM1021 is not set
++# CONFIG_SENSORS_ADM1025 is not set
++# CONFIG_SENSORS_ADM1026 is not set
++# CONFIG_SENSORS_ADM1031 is not set
++# CONFIG_SENSORS_ADM9240 is not set
++# CONFIG_SENSORS_ASB100 is not set
++# CONFIG_SENSORS_ATXP1 is not set
++# CONFIG_SENSORS_DS1621 is not set
++# CONFIG_SENSORS_FSCHER is not set
++# CONFIG_SENSORS_FSCPOS is not set
++# CONFIG_SENSORS_GL518SM is not set
++# CONFIG_SENSORS_GL520SM is not set
++# CONFIG_SENSORS_IT87 is not set
++# CONFIG_SENSORS_LM63 is not set
++# CONFIG_SENSORS_LM75 is not set
++# CONFIG_SENSORS_LM77 is not set
++# CONFIG_SENSORS_LM78 is not set
++# CONFIG_SENSORS_LM80 is not set
++# CONFIG_SENSORS_LM83 is not set
++# CONFIG_SENSORS_LM85 is not set
++# CONFIG_SENSORS_LM87 is not set
++# CONFIG_SENSORS_LM90 is not set
++# CONFIG_SENSORS_LM92 is not set
++# CONFIG_SENSORS_MAX1619 is not set
++# CONFIG_SENSORS_PC87360 is not set
++# CONFIG_SENSORS_SMSC47M1 is not set
++# CONFIG_SENSORS_SMSC47B397 is not set
++# CONFIG_SENSORS_W83781D is not set
++# CONFIG_SENSORS_W83792D is not set
++# CONFIG_SENSORS_W83L785TS is not set
++# CONFIG_SENSORS_W83627HF is not set
++# CONFIG_SENSORS_W83627EHF is not set
++# CONFIG_HWMON_DEBUG_CHIP is not set
++
++#
++# 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 is not set
++# CONFIG_FB_CFB_COPYAREA is not set
++# CONFIG_FB_CFB_IMAGEBLIT is not set
++CONFIG_FB_SOFT_CURSOR=y
++# CONFIG_FB_MACMODES is not set
++CONFIG_FB_MODE_HELPERS=y
++# CONFIG_FB_TILEBLITTING is not set
++# CONFIG_FB_S1D13XXX is not set
++CONFIG_FB_OMAP=y
++CONFIG_FB_OMAP_LCDC_INTERNAL=y
++# CONFIG_FB_OMAP_LCDC_EXTERNAL is not set
++CONFIG_FB_OMAP_DMA_TUNE=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_FONTS=y
++# CONFIG_FONT_8x8 is not set
++# CONFIG_FONT_8x16 is not set
++# CONFIG_FONT_6x11 is not set
++# CONFIG_FONT_7x14 is not set
++# CONFIG_FONT_PEARL_8x8 is not set
++# CONFIG_FONT_ACORN_8x8 is not set
++CONFIG_FONT_MINI_4x6=y
++# CONFIG_FONT_SUN8x16 is not set
++# CONFIG_FONT_SUN12x22 is not set
++# CONFIG_FONT_10x18 is not set
++
++#
++# Logo configuration
++#
++CONFIG_LOGO=y
++# CONFIG_LOGO_LINUX_MONO is not set
++CONFIG_LOGO_LINUX_VGA16=y
++# CONFIG_LOGO_LINUX_CLUT224 is not set
++CONFIG_BACKLIGHT_LCD_SUPPORT=y
++CONFIG_BACKLIGHT_CLASS_DEVICE=y
++CONFIG_BACKLIGHT_DEVICE=y
++CONFIG_LCD_CLASS_DEVICE=y
++CONFIG_LCD_DEVICE=y
++
++#
++# Telephony Support
++#
++CONFIG_PHONE=m
++# CONFIG_PHONE_IXJ is not set
++CONFIG_GSM_H6300=m
++
++#
++# Sound
++#
++CONFIG_SOUND=m
++
++#
++# Advanced Linux Sound Architecture
++#
++# CONFIG_SND is not set
++
++#
++# Open Sound System
++#
++CONFIG_SOUND_PRIME=m
++CONFIG_SOUND_OMAP=m
++CONFIG_SOUND_OMAP_TSC2101=m
++# CONFIG_SOUND_MSNDCLAS is not set
++# CONFIG_SOUND_MSNDPIN is not set
++# CONFIG_SOUND_OSS is not set
++# CONFIG_SOUND_TVMIXER is not set
++# CONFIG_SOUND_AD1980 is not set
++
++#
++# USB support
++#
++CONFIG_USB_ARCH_HAS_HCD=y
++CONFIG_USB_ARCH_HAS_OHCI=y
++CONFIG_USB=y
++CONFIG_USB_DEBUG=y
++
++#
++# Miscellaneous USB options
++#
++CONFIG_USB_DEVICEFS=y
++# CONFIG_USB_BANDWIDTH is not set
++# CONFIG_USB_DYNAMIC_MINORS is not set
++# CONFIG_USB_SUSPEND is not set
++# CONFIG_USB_OTG is not set
++
++#
++# USB Host Controller Drivers
++#
++# CONFIG_USB_ISP116X_HCD is not set
++CONFIG_USB_OHCI_HCD=y
++# CONFIG_USB_OHCI_BIG_ENDIAN is not set
++CONFIG_USB_OHCI_LITTLE_ENDIAN=y
++# CONFIG_USB_SL811_HCD is not set
++
++#
++# USB Device Class drivers
++#
++# CONFIG_OBSOLETE_OSS_USB_DRIVER is not set
++
++#
++# USB Bluetooth TTY can only be used with disabled Bluetooth subsystem
++#
++CONFIG_USB_ACM=y
++# CONFIG_USB_PRINTER is not set
++
++#
++# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support' may also be needed; see USB_STORAGE Help for more information
++#
++# CONFIG_USB_STORAGE is not set
++
++#
++# USB Input Devices
++#
++# CONFIG_USB_HID is not set
++
++#
++# USB HID Boot Protocol drivers
++#
++# CONFIG_USB_KBD is not set
++# CONFIG_USB_MOUSE is not set
++# CONFIG_USB_AIPTEK is not set
++# CONFIG_USB_WACOM is not set
++# CONFIG_USB_ACECAD is not set
++# CONFIG_USB_KBTAB is not set
++# CONFIG_USB_POWERMATE is not set
++# CONFIG_USB_MTOUCH is not set
++# CONFIG_USB_ITMTOUCH is not set
++# CONFIG_USB_EGALAX is not set
++# CONFIG_USB_YEALINK is not set
++# CONFIG_USB_XPAD is not set
++# CONFIG_USB_ATI_REMOTE is not set
++# CONFIG_USB_KEYSPAN_REMOTE is not set
++# CONFIG_USB_APPLETOUCH is not set
++
++#
++# USB Imaging devices
++#
++# CONFIG_USB_MDC800 is not set
++
++#
++# USB Multimedia devices
++#
++# CONFIG_USB_DABUSB is not set
++
++#
++# Video4Linux support is needed for USB Multimedia device support
++#
++
++#
++# USB Network Adapters
++#
++# CONFIG_USB_CATC is not set
++# CONFIG_USB_KAWETH is not set
++# CONFIG_USB_PEGASUS is not set
++# CONFIG_USB_RTL8150 is not set
++CONFIG_USB_USBNET=y
++CONFIG_USB_NET_AX8817X=y
++CONFIG_USB_NET_CDCETHER=y
++# CONFIG_USB_NET_GL620A is not set
++CONFIG_USB_NET_NET1080=y
++# CONFIG_USB_NET_PLUSB is not set
++# CONFIG_USB_NET_RNDIS_HOST is not set
++# CONFIG_USB_NET_CDC_SUBSET is not set
++CONFIG_USB_NET_ZAURUS=y
++# CONFIG_USB_ZD1201 is not set
++CONFIG_USB_MON=y
++
++#
++# USB port drivers
++#
++
++#
++# USB Serial Converter support
++#
++CONFIG_USB_SERIAL=y
++CONFIG_USB_SERIAL_CONSOLE=y
++CONFIG_USB_SERIAL_GENERIC=y
++# CONFIG_USB_SERIAL_AIRPRIME is not set
++# CONFIG_USB_SERIAL_BELKIN is not set
++# CONFIG_USB_SERIAL_WHITEHEAT is not set
++# CONFIG_USB_SERIAL_DIGI_ACCELEPORT is not set
++# CONFIG_USB_SERIAL_CP2101 is not set
++# CONFIG_USB_SERIAL_CYPRESS_M8 is not set
++# CONFIG_USB_SERIAL_EMPEG is not set
++# CONFIG_USB_SERIAL_FTDI_SIO is not set
++CONFIG_USB_SERIAL_VISOR=y
++CONFIG_USB_SERIAL_IPAQ=y
++# CONFIG_USB_SERIAL_IR is not set
++# CONFIG_USB_SERIAL_EDGEPORT is not set
++# CONFIG_USB_SERIAL_EDGEPORT_TI is not set
++# CONFIG_USB_SERIAL_GARMIN is not set
++# CONFIG_USB_SERIAL_IPW is not set
++# CONFIG_USB_SERIAL_KEYSPAN_PDA is not set
++# CONFIG_USB_SERIAL_KEYSPAN is not set
++# CONFIG_USB_SERIAL_KLSI is not set
++# CONFIG_USB_SERIAL_KOBIL_SCT is not set
++# CONFIG_USB_SERIAL_MCT_U232 is not set
++# CONFIG_USB_SERIAL_PL2303 is not set
++# CONFIG_USB_SERIAL_HP4X is not set
++# CONFIG_USB_SERIAL_SAFE is not set
++# CONFIG_USB_SERIAL_TI is not set
++# CONFIG_USB_SERIAL_CYBERJACK is not set
++# CONFIG_USB_SERIAL_XIRCOM is not set
++# CONFIG_USB_SERIAL_OPTION is not set
++# CONFIG_USB_SERIAL_OMNINET is not set
++
++#
++# USB Miscellaneous drivers
++#
++# CONFIG_USB_EMI62 is not set
++# CONFIG_USB_EMI26 is not set
++# CONFIG_USB_AUERSWALD is not set
++# CONFIG_USB_RIO500 is not set
++# CONFIG_USB_LEGOTOWER is not set
++# CONFIG_USB_LCD is not set
++# CONFIG_USB_LED is not set
++# CONFIG_USB_CYTHERM is not set
++# CONFIG_USB_PHIDGETKIT is not set
++# CONFIG_USB_PHIDGETSERVO is not set
++# CONFIG_USB_IDMOUSE is not set
++# CONFIG_USB_LD is not set
++# CONFIG_USB_TEST is not set
++
++#
++# USB DSL modem 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=y
++CONFIG_MMC_BULKTRANSFER=y
++CONFIG_MMC_OMAP=y
++# CONFIG_MMC_WBSD is not set
++
++#
++# Synchronous Serial Interfaces (SSI)
++#
++CONFIG_OMAP_UWIRE=y
++CONFIG_OMAP_TSC2101=y
++
++#
++# File systems
++#
++CONFIG_EXT2_FS=y
++CONFIG_EXT2_FS_XATTR=y
++CONFIG_EXT2_FS_POSIX_ACL=y
++CONFIG_EXT2_FS_SECURITY=y
++# CONFIG_EXT2_FS_XIP is not set
++# CONFIG_EXT3_FS is not set
++# CONFIG_JBD is not set
++CONFIG_FS_MBCACHE=y
++# CONFIG_REISERFS_FS is not set
++# CONFIG_JFS_FS is not set
++CONFIG_FS_POSIX_ACL=y
++# CONFIG_XFS_FS is not set
++# CONFIG_MINIX_FS is not set
++CONFIG_ROMFS_FS=y
++CONFIG_INOTIFY=y
++# CONFIG_QUOTA is not set
++# CONFIG_DNOTIFY is not set
++# CONFIG_AUTOFS_FS is not set
++CONFIG_AUTOFS4_FS=y
++# CONFIG_FUSE_FS is not set
++
++#
++# CD-ROM/DVD Filesystems
++#
++# CONFIG_ISO9660_FS is not set
++# CONFIG_UDF_FS is not set
++
++#
++# DOS/FAT/NT Filesystems
++#
++CONFIG_FAT_FS=y
++CONFIG_MSDOS_FS=y
++CONFIG_VFAT_FS=y
++CONFIG_FAT_DEFAULT_CODEPAGE=437
++CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1"
++# CONFIG_NTFS_FS is not set
++
++#
++# Pseudo filesystems
++#
++CONFIG_PROC_FS=y
++CONFIG_SYSFS=y
++CONFIG_TMPFS=y
++# CONFIG_HUGETLBFS is not set
++# CONFIG_HUGETLB_PAGE is not set
++CONFIG_RAMFS=y
++# CONFIG_RELAYFS_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_JFFS_FS=y
++CONFIG_JFFS_FS_VERBOSE=0
++CONFIG_JFFS_PROC_FS=y
++CONFIG_JFFS2_FS=y
++CONFIG_JFFS2_FS_DEBUG=4
++CONFIG_JFFS2_FS_WRITEBUFFER=y
++CONFIG_JFFS2_COMPRESSION_OPTIONS=y
++CONFIG_JFFS2_ZLIB=y
++CONFIG_JFFS2_RTIME=y
++CONFIG_JFFS2_RUBIN=y
++# CONFIG_JFFS2_CMODE_NONE is not set
++CONFIG_JFFS2_CMODE_PRIORITY=y
++# CONFIG_JFFS2_CMODE_SIZE is not set
++CONFIG_CRAMFS=y
++# CONFIG_VXFS_FS is not set
++# CONFIG_HPFS_FS is not set
++# CONFIG_QNX4FS_FS is not set
++# CONFIG_SYSV_FS is not set
++# CONFIG_UFS_FS is not set
++
++#
++# Network File Systems
++#
++CONFIG_NFS_FS=y
++CONFIG_NFS_V3=y
++# CONFIG_NFS_V3_ACL is not set
++CONFIG_NFS_V4=y
++# CONFIG_NFS_DIRECTIO is not set
++# CONFIG_NFSD is not set
++CONFIG_ROOT_NFS=y
++CONFIG_LOCKD=y
++CONFIG_LOCKD_V4=y
++CONFIG_NFS_COMMON=y
++CONFIG_SUNRPC=y
++CONFIG_SUNRPC_GSS=y
++CONFIG_RPCSEC_GSS_KRB5=y
++# CONFIG_RPCSEC_GSS_SPKM3 is not set
++# CONFIG_SMB_FS is not set
++# CONFIG_CIFS is not set
++# CONFIG_NCP_FS is not set
++# CONFIG_CODA_FS is not set
++# CONFIG_AFS_FS is not set
++# CONFIG_9P_FS is not set
++
++#
++# Partition Types
++#
++CONFIG_PARTITION_ADVANCED=y
++# CONFIG_ACORN_PARTITION is not set
++# CONFIG_OSF_PARTITION is not set
++# CONFIG_AMIGA_PARTITION is not set
++# CONFIG_ATARI_PARTITION is not set
++# CONFIG_MAC_PARTITION is not set
++CONFIG_MSDOS_PARTITION=y
++# CONFIG_BSD_DISKLABEL is not set
++# CONFIG_MINIX_SUBPARTITION is not set
++# CONFIG_SOLARIS_X86_PARTITION is not set
++# CONFIG_UNIXWARE_DISKLABEL is not set
++# CONFIG_LDM_PARTITION is not set
++# CONFIG_SGI_PARTITION is not set
++# CONFIG_ULTRIX_PARTITION is not set
++# CONFIG_SUN_PARTITION is not set
++# CONFIG_EFI_PARTITION is not set
++
++#
++# Native Language Support
++#
++CONFIG_NLS=y
++CONFIG_NLS_DEFAULT="utf8"
++CONFIG_NLS_CODEPAGE_437=y
++# CONFIG_NLS_CODEPAGE_737 is not set
++# CONFIG_NLS_CODEPAGE_775 is not set
++# CONFIG_NLS_CODEPAGE_850 is not set
++# CONFIG_NLS_CODEPAGE_852 is not set
++# CONFIG_NLS_CODEPAGE_855 is not set
++# CONFIG_NLS_CODEPAGE_857 is not set
++# CONFIG_NLS_CODEPAGE_860 is not set
++# CONFIG_NLS_CODEPAGE_861 is not set
++# CONFIG_NLS_CODEPAGE_862 is not set
++# CONFIG_NLS_CODEPAGE_863 is not set
++# CONFIG_NLS_CODEPAGE_864 is not set
++# CONFIG_NLS_CODEPAGE_865 is not set
++# CONFIG_NLS_CODEPAGE_866 is not set
++# CONFIG_NLS_CODEPAGE_869 is not set
++# CONFIG_NLS_CODEPAGE_936 is not set
++# CONFIG_NLS_CODEPAGE_950 is not set
++# CONFIG_NLS_CODEPAGE_932 is not set
++# CONFIG_NLS_CODEPAGE_949 is not set
++# CONFIG_NLS_CODEPAGE_874 is not set
++# CONFIG_NLS_ISO8859_8 is not set
++# CONFIG_NLS_CODEPAGE_1250 is not set
++# CONFIG_NLS_CODEPAGE_1251 is not set
++# CONFIG_NLS_ASCII is not set
++CONFIG_NLS_ISO8859_1=y
++# CONFIG_NLS_ISO8859_2 is not set
++# CONFIG_NLS_ISO8859_3 is not set
++# CONFIG_NLS_ISO8859_4 is not set
++# CONFIG_NLS_ISO8859_5 is not set
++# CONFIG_NLS_ISO8859_6 is not set
++# CONFIG_NLS_ISO8859_7 is not set
++# CONFIG_NLS_ISO8859_9 is not set
++# CONFIG_NLS_ISO8859_13 is not set
++# CONFIG_NLS_ISO8859_14 is not set
++# CONFIG_NLS_ISO8859_15 is not set
++# CONFIG_NLS_KOI8_R is not set
++# CONFIG_NLS_KOI8_U is not set
++CONFIG_NLS_UTF8=y
++
++#
++# Profiling support
++#
++# CONFIG_PROFILING is not set
++
++#
++# Kernel hacking
++#
++# CONFIG_PRINTK_TIME is not set
++CONFIG_DEBUG_KERNEL=y
++CONFIG_MAGIC_SYSRQ=y
++CONFIG_LOG_BUF_SHIFT=17
++CONFIG_DETECT_SOFTLOCKUP=y
++# CONFIG_SCHEDSTATS is not set
++# CONFIG_DEBUG_SLAB 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_FRAME_POINTER=y
++# CONFIG_DEBUG_USER is not set
++# CONFIG_DEBUG_WAITQ is not set
++CONFIG_DEBUG_ERRORS=y
++CONFIG_DEBUG_LL=y
++# CONFIG_DEBUG_ICEDCC is not set
++
++#
++# Security options
++#
++# CONFIG_KEYS is not set
++# CONFIG_SECURITY is not set
++
++#
++# Cryptographic options
++#
++CONFIG_CRYPTO=y
++CONFIG_CRYPTO_HMAC=y
++# CONFIG_CRYPTO_NULL is not set
++# CONFIG_CRYPTO_MD4 is not set
++CONFIG_CRYPTO_MD5=y
++CONFIG_CRYPTO_SHA1=y
++# CONFIG_CRYPTO_SHA256 is not set
++# CONFIG_CRYPTO_SHA512 is not set
++# CONFIG_CRYPTO_WP512 is not set
++# CONFIG_CRYPTO_TGR192 is not set
++CONFIG_CRYPTO_DES=y
++# CONFIG_CRYPTO_BLOWFISH is not set
++# CONFIG_CRYPTO_TWOFISH is not set
++# CONFIG_CRYPTO_SERPENT is not set
++# CONFIG_CRYPTO_AES is not set
++# CONFIG_CRYPTO_CAST5 is not set
++# CONFIG_CRYPTO_CAST6 is not set
++# CONFIG_CRYPTO_TEA is not set
++# CONFIG_CRYPTO_ARC4 is not set
++# CONFIG_CRYPTO_KHAZAD is not set
++# CONFIG_CRYPTO_ANUBIS is not set
++CONFIG_CRYPTO_DEFLATE=m
++# CONFIG_CRYPTO_MICHAEL_MIC is not set
++# CONFIG_CRYPTO_CRC32C is not set
++# CONFIG_CRYPTO_TEST is not set
++
++#
++# Hardware crypto devices
++#
++
++#
++# Library routines
++#
++CONFIG_CRC_CCITT=y
++# CONFIG_CRC16 is not set
++CONFIG_CRC32=y
++CONFIG_LIBCRC32C=y
++CONFIG_ZLIB_INFLATE=y
++CONFIG_ZLIB_DEFLATE=y
++CONFIG_REED_SOLOMON=m
++CONFIG_REED_SOLOMON_DEC16=y
+diff -Naur linux-2.6.14-omap2/arch/arm/Kconfig linux-h6300-omap2-2.6.14.3/arch/arm/Kconfig
+--- linux-2.6.14-omap2/arch/arm/Kconfig        2005-12-02 01:53:31.000000000 +0200
++++ linux-h6300-omap2-2.6.14.3/arch/arm/Kconfig        2005-10-14 18:55:31.000000000 +0300
+@@ -725,6 +725,8 @@
+ source "drivers/video/Kconfig"
++source "drivers/telephony/Kconfig"
++
+ source "sound/Kconfig"
+ source "drivers/usb/Kconfig"
+diff -Naur linux-2.6.14-omap2/arch/arm/mach-omap1/board-h6300.c linux-h6300-omap2-2.6.14.3/arch/arm/mach-omap1/board-h6300.c
+--- linux-2.6.14-omap2/arch/arm/mach-omap1/board-h6300.c       1970-01-01 02:00:00.000000000 +0200
++++ linux-h6300-omap2-2.6.14.3/arch/arm/mach-omap1/board-h6300.c       2005-10-22 03:52:45.000000000 +0300
+@@ -0,0 +1,317 @@
++/*
++ * Modified from board-h6300.c
++ *
++ * Code for generic OMAP board. Should work on many OMAP systems where
++ * the device drivers take care of all the necessary hardware initialization.
++ * Do not put any board specific code to this file; create a new machine
++ * type if you need custom low-level initializations.
++ *
++ * This program is free software; you can redistribute it and/or modify
++ * it under the terms of the GNU General Public License version 2 as
++ * published by the Free Software Foundation.
++ */
++
++#include <linux/kernel.h>
++#include <linux/init.h>
++#include <linux/device.h>
++#include <linux/delay.h>
++#include <linux/mtd/mtd.h>
++#include <linux/mtd/partitions.h>
++
++#include <asm/hardware.h>
++#include <asm/mach-types.h>
++#include <asm/mach/arch.h>
++#include <asm/mach/flash.h>
++#include <asm/mach/map.h>
++
++#include <asm/arch/gpio.h>
++
++#include <asm/arch/tc.h>
++#include <asm/arch/usb.h>
++
++#include <asm/arch/common.h>
++
++#include <asm/arch/h6300_uart_info.h>
++
++/*
++ * Bluetooth - Relies on h6300_bt module,
++ * so make the calls indirectly through pointers. Requires that the
++ * h6300_bt bluetooth module be loaded before any attempt to use
++ * bluetooth (obviously).
++ */
++
++static struct h6300_uart_funcs bt_funcs;
++static struct h6300_uart_funcs gsm_funcs;
++
++static void
++h6300_bt_configure(struct uart_omap_port *up, int enable)
++{
++      printk(KERN_NOTICE "board-h6300.c, h6300_bt_configure() started\n");
++      if (bt_funcs.configure != NULL)
++              bt_funcs.configure(up, enable);
++      printk(KERN_NOTICE "board-h6300.c, h6300_bt_configure() done\n");
++}
++
++static void
++h6300_bt_set_txrx(struct uart_omap_port *up, int txrx)
++{
++      printk(KERN_NOTICE "board-h6300.c, h6300_bt_set_txrx() started\n");
++      if (bt_funcs.set_txrx != NULL)
++      {
++              printk(KERN_NOTICE "board-h6300.c, h6300_bt_set_txrx(), bt_funcs.set_txrx != NULL\n");
++              bt_funcs.set_txrx(up, txrx);
++      }
++      printk(KERN_NOTICE "board-h6300.c, h6300_bt_set_txrx() done\n");
++}
++
++static int
++h6300_bt_get_txrx(struct uart_omap_port *up)
++{
++      int     retVal;
++      
++      printk(KERN_NOTICE "board-h6300.c, h6300_bt_get_txrx() started\n");
++      if (bt_funcs.get_txrx != NULL)
++      {
++              retVal  = bt_funcs.get_txrx(up);
++              printk(KERN_NOTICE "board-h6300.c, h6300_bt_get_txrx(), bt_funcs.get_trx != null, done, retVal %d\n", retVal);
++              return retVal;
++      }
++      else
++      {
++              printk(KERN_NOTICE "board-h6300.c, h6300_bt_get_txrx() done, returning 0\n");
++              return 0;
++      }
++}
++
++static struct platform_omap_serial_funcs h6300_omap_bt_funcs = {
++      .configure      = h6300_bt_configure,
++      .set_txrx       = h6300_bt_set_txrx,
++      .get_txrx       = h6300_bt_get_txrx,
++};
++
++struct platform_device btuart_device = {
++      .name   = "h6300_bt",
++      .id     = 1,
++};
++EXPORT_SYMBOL(btuart_device);
++
++static void
++h6300_gsm_configure(struct uart_omap_port *up, int enable)
++{
++      printk(KERN_NOTICE "board-h6300.c, h6300_gsm_configure() started\n");
++      if (gsm_funcs.configure != NULL)
++              gsm_funcs.configure(up, enable);
++      printk(KERN_NOTICE "board-h6300.c, h6300_gsm_configure() done\n");
++}
++
++static void
++h6300_gsm_set_txrx(struct uart_omap_port *up, int txrx)
++{
++      printk(KERN_NOTICE "board-h6300.c, h6300_gsm_set_txrx() started\n");
++      if (bt_funcs.set_txrx != NULL)
++      {
++              printk(KERN_NOTICE "board-h6300.c, h6300_gsm_set_txrx(), bt_funcs.set_txrx != NULL\n");
++              gsm_funcs.set_txrx(up, txrx);
++      }
++      printk(KERN_NOTICE "board-h6300.c, h6300_gsm_set_txrx() done\n");
++}
++
++static int
++h6300_gsm_get_txrx(struct uart_omap_port *up)
++{
++      int     retVal;
++      
++      printk(KERN_NOTICE "board-h6300.c, h6300_gsm_get_txrx() started\n");
++      if (bt_funcs.get_txrx != NULL)
++      {
++              retVal  = gsm_funcs.get_txrx(up);
++              printk(KERN_NOTICE "board-h6300.c, h6300_gsm_get_txrx(), bt_funcs.get_trx != null, done, retVal %d\n", retVal);
++              return retVal;
++      }
++      else
++      {
++              printk(KERN_NOTICE "board-h6300.c, h6300_gsm_get_txrx() done, returning 0\n");
++              return 0;
++      }
++}
++
++static struct platform_omap_serial_funcs h6300_omap_gsm_funcs = {
++      .configure      = h6300_gsm_configure,
++      .set_txrx       = h6300_gsm_set_txrx,
++      .get_txrx       = h6300_gsm_get_txrx,
++};
++
++struct platform_device gsmuart_device = {
++      .name   = "h6300_gsm",
++      .id     = 1,
++};
++EXPORT_SYMBOL(gsmuart_device);
++
++#if 0
++static struct mtd_partition h6300_partitions[] = {
++      /* bootloader (U-Boot, etc) in first sector */
++      {
++            .name             = "bootloader",
++            .offset           = 0,
++            .size             = SZ_128K,
++            .mask_flags       = MTD_WRITEABLE, /* force read-only */
++      },
++      /* bootloader params in the next sector */
++      {
++            .name             = "params",
++            .offset           = MTDPART_OFS_APPEND,
++            .size             = SZ_128K,
++            .mask_flags       = 0,
++      },
++      /* kernel */
++      {
++            .name             = "kernel",
++            .offset           = MTDPART_OFS_APPEND,
++            .size             = SZ_2M,
++            .mask_flags       = 0
++      },
++      /* rest of flash1 is a file system */
++      {
++            .name             = "rootfs",
++            .offset           = MTDPART_OFS_APPEND,
++            .size             = SZ_16M - SZ_2M - 2 * SZ_128K,
++            .mask_flags       = 0
++      },
++      /* file system */
++      {
++            .name             = "filesystem",
++            .offset           = MTDPART_OFS_APPEND,
++            .size             = MTDPART_SIZ_FULL,
++            .mask_flags       = 0
++      }
++};
++
++static struct flash_platform_data h6300_flash_data = {
++      .map_name       = "cfi_probe",
++      .width          = 2,
++      .parts          = h6300_partitions,
++      .nr_parts       = ARRAY_SIZE(h6300_partitions),
++};
++
++static struct resource h6300_flash_resource = {
++      .start          = OMAP_CS0_PHYS,
++      .end            = OMAP_CS0_PHYS + SZ_32M - 1,
++      .flags          = IORESOURCE_MEM,
++};
++
++static struct platform_device h6300_flash_device = {
++      .name   = "omapflash",
++      .id             = 0,
++      .dev    = {
++              .platform_data  = &h6300_flash_data,
++      },
++      .num_resources  = 1,
++      .resource       = &h6300_flash_resource,
++};
++#endif
++
++static struct resource h6300_wlan_resource[] = {
++        [0] = {
++                .start          = OMAP_CS1_PHYS,
++                .end            = OMAP_CS1_PHYS + SZ_32M -1,
++                .flags          = IORESOURCE_MEM,
++        },
++
++        [1] = {
++                .start  = OMAP_GPIO_IRQ(11),
++                .end    = OMAP_GPIO_IRQ(11),
++                .flags  = IORESOURCE_IRQ,
++        },
++};
++
++static struct platform_device h6300_wlan_device = {
++        .name           = "tnetw1100b",
++        .id             = 0,
++        .num_resources  = 2,
++        .resource       = h6300_wlan_resource,
++};
++
++static struct platform_device *h6300_devices[] __initdata = {
++      &btuart_device,
++      &gsmuart_device,
++      &h6300_wlan_device,
++      //&h6300_flash_device,
++};
++
++static void __init h6300_init_irq(void)
++{
++      omap_init_irq();
++      omap_gpio_init();
++
++      omap_request_gpio (2);
++      omap_set_gpio_direction (2, 0);
++      omap_set_gpio_dataout (2, 1);
++}
++
++/* assume no Mini-AB port */
++
++static struct omap_usb_config h6300_usb_config __initdata = {
++      .hmc_mode       = 0,
++      .register_dev   = 1,
++      .pins[0]        = 0,
++};
++
++static struct omap_lcd_config h6300_lcd_config __initdata = {
++      .panel_name     = "h6300",
++      .ctrl_name      = "internal",
++};
++
++static struct omap_mmc_config h6300_mmc_config __initdata = {
++      .mmc [0] = {
++              .enabled        = 1,
++              .wire4          = 1,
++              .wp_pin         = OMAP_GPIO_IRQ(13),
++              .power_pin      = -1,   /* FPGA F3 UIO42 */
++              .switch_pin     = -1,   /* FPGA F4 UIO43 */
++      },
++};
++
++static struct omap_uart_config h6300_uart_config __initdata = {
++      .enabled_uarts = ((1 << 0) | (1 << 1) | (1 << 2)),
++};
++
++static struct omap_board_config_kernel h6300_config[] = {
++      { OMAP_TAG_USB, &h6300_usb_config },
++      { OMAP_TAG_MMC, &h6300_mmc_config },
++      { OMAP_TAG_UART,        &h6300_uart_config },
++      { OMAP_TAG_LCD, &h6300_lcd_config },
++};
++
++static void __init h6300_init(void)
++{
++      int ret;
++      
++      ret = platform_add_devices(h6300_devices, ARRAY_SIZE(h6300_devices));
++      if (ret) 
++      {
++              printk(KERN_WARNING "Unable to add h6300 platform devices like bluetooth");
++      }
++      omap_board_config               = h6300_config;
++      omap_board_config_size  = ARRAY_SIZE(h6300_config);
++      omap_serial_init();
++}
++
++static void __init h6300_map_io(void)
++{
++      omap_map_common_io();
++      
++      btuart_device.dev.platform_data = &h6300_omap_bt_funcs;
++      gsmuart_device.dev.platform_data        = &h6300_omap_gsm_funcs;
++}
++
++MACHINE_START(H6300, "HP iPAQ H6300")
++      /* MAINTAINER("Everett Coleman II <gcc80x86@fuzzyneural.net>") */
++      .phys_ram       = 0x10000000,
++      .phys_io        = 0xfff00000,
++      .io_pg_offst    = ((0xfef00000) >> 18) & 0xfffc,
++      .boot_params    = 0x10000100,
++      .map_io         = h6300_map_io,
++      .init_irq       = h6300_init_irq,
++      .init_machine   = h6300_init,
++      .timer          = &omap_timer,
++MACHINE_END
+diff -Naur linux-2.6.14-omap2/arch/arm/mach-omap1/Kconfig linux-h6300-omap2-2.6.14.3/arch/arm/mach-omap1/Kconfig
+--- linux-2.6.14-omap2/arch/arm/mach-omap1/Kconfig     2005-12-02 01:53:31.000000000 +0200
++++ linux-h6300-omap2-2.6.14.3/arch/arm/mach-omap1/Kconfig     2005-10-22 03:52:45.000000000 +0300
+@@ -26,6 +26,12 @@
+           TI OMAP 1510 or 1610 Innovator board support. Say Y here if you
+           have such a board.
++config MACH_OMAP_H6300
++      bool "HP IPaq H6300"
++      depends on ARCH_OMAP1 && ARCH_OMAP15XX
++      help
++                      HP IPaq H6300 series.
++
+ config MACH_OMAP_H2
+       bool "TI H2 Support"
+       depends on ARCH_OMAP1 && ARCH_OMAP16XX
+diff -Naur linux-2.6.14-omap2/arch/arm/mach-omap1/Makefile linux-h6300-omap2-2.6.14.3/arch/arm/mach-omap1/Makefile
+--- linux-2.6.14-omap2/arch/arm/mach-omap1/Makefile    2005-12-02 01:53:31.000000000 +0200
++++ linux-h6300-omap2-2.6.14.3/arch/arm/mach-omap1/Makefile    2005-10-22 03:52:45.000000000 +0300
+@@ -15,7 +15,8 @@
+ obj-$(CONFIG_MACH_OMAP_H3)            += board-h3.o
+ obj-$(CONFIG_MACH_VOICEBLUE)          += board-voiceblue.o
+ obj-$(CONFIG_MACH_NETSTAR)            += board-netstar.o
+-obj-$(CONFIG_MACH_OMAP_PALMTE)                += board-palmte.o
++obj-$(CONFIG_MACH_OMAP_PALMTE)        += board-palmte.o
++obj-$(CONFIG_MACH_OMAP_H6300)         += board-h6300.o
+ ifeq ($(CONFIG_ARCH_OMAP15XX),y)
+ # Innovator-1510 FPGA
+diff -Naur linux-2.6.14-omap2/arch/arm/mach-omap1/mux.c linux-h6300-omap2-2.6.14.3/arch/arm/mach-omap1/mux.c
+--- linux-2.6.14-omap2/arch/arm/mach-omap1/mux.c       2005-12-02 01:53:32.000000000 +0200
++++ linux-h6300-omap2-2.6.14.3/arch/arm/mach-omap1/mux.c       2005-11-11 04:13:42.000000000 +0200
+@@ -196,6 +196,13 @@
+ MUX_CFG("P15_1610_UWIRE_CS3",  8,   12,    1,   1,  22,   0,    1,     1,  1)
+ MUX_CFG("N15_1610_UWIRE_CS1",  7,   18,    2,   1,  14,   0,   NA,     0,  1)
++/* OMAP-1510 uWire */
++MUX_CFG("P15_1510_UWIRE_CS3",  8,   12,    1,  NA,   0,   0,  NA,  0,  1)
++MUX_CFG("N14_1510_UWIRE_CS0",  8,    9,    1,  NA,   0,   0,  NA,  0,  1)
++MUX_CFG("V19_1510_UWIRE_SCLK", 8,    6,    0,  NA,   0,   0,  NA,  0,  1)
++MUX_CFG("W21_1510_UWIRE_SDO",  8,    3,    0,  NA,   0,   0,  NA,  0,  1)
++MUX_CFG("U18_1510_UWIRE_SDI",  8,    0,    0,   1,  18,   0,  NA,  0,  1)
++
+ /* OMAP-1610 Flash */
+ MUX_CFG("L3_1610_FLASH_CS2B_OE",10,    6,    1,        NA,   0,   0,   NA,     0,  1)
+ MUX_CFG("M8_1610_FLASH_CS2B_WE",10,    3,    1,        NA,   0,   0,   NA,     0,  1)
+@@ -258,6 +265,7 @@
+ MUX_CFG("T20_1610_LOW_PWR",    7,   12,    1,   NA,   0,   0,   NA,    0,  0)
+ /* MCLK Settings */
++MUX_CFG("R10_1510_MCLK_ON",    B,   18,    0,   2,   22,   1,   NA,    1,  1)
+ MUX_CFG("V5_1710_MCLK_ON",     B,   15,    0,   NA,   0,   0,   NA,    0,  0)
+ MUX_CFG("V5_1710_MCLK_OFF",    B,   15,    6,   NA,   0,   0,   NA,    0,  0)
+ MUX_CFG("R10_1610_MCLK_ON",    B,   18,    0,   NA,  22,   0,   NA,    1,  0)
+diff -Naur linux-2.6.14-omap2/arch/arm/plat-omap/dma.c linux-h6300-omap2-2.6.14.3/arch/arm/plat-omap/dma.c
+--- linux-2.6.14-omap2/arch/arm/plat-omap/dma.c        2005-12-02 01:53:32.000000000 +0200
++++ linux-h6300-omap2-2.6.14.3/arch/arm/plat-omap/dma.c        2005-11-11 04:13:42.000000000 +0200
+@@ -30,6 +30,7 @@
+ #include <asm/hardware.h>
+ #include <asm/dma.h>
+ #include <asm/io.h>
++#include <asm/mach-types.h>
+ #include <asm/arch/tc.h>
+@@ -1086,6 +1087,10 @@
+       }
+       if (omap_dma_in_1510_mode()) {
++              u16 l = omap_readw(OMAP1510_DMA_LCD_CTRL);
++              l &= ~(1 << 6);
++              omap_writew (l, OMAP1510_DMA_LCD_CTRL);
++
+               omap_writew(top >> 16, OMAP1510_DMA_LCD_TOP_F1_U);
+               omap_writew(top, OMAP1510_DMA_LCD_TOP_F1_L);
+               omap_writew(bottom >> 16, OMAP1510_DMA_LCD_BOT_F1_U);
+diff -Naur linux-2.6.14-omap2/arch/arm/tools/mach-types linux-h6300-omap2-2.6.14.3/arch/arm/tools/mach-types
+--- linux-2.6.14-omap2/arch/arm/tools/mach-types       2005-10-28 03:02:08.000000000 +0300
++++ linux-h6300-omap2-2.6.14.3/arch/arm/tools/mach-types       2005-10-22 03:52:45.000000000 +0300
+@@ -576,7 +576,7 @@
+ s3c2460                       MACH_S3C2460            S3C2460                 560
+ pdm                   MACH_PDM                PDM                     561
+ h4700                 MACH_H4700              H4700                   562
+-h6300                 MACH_H6300              H6300                   563
++h6300                 MACH_OMAP_H6300         H6300                   563
+ rz1700                        MACH_RZ1700             RZ1700                  564
+ a716                  MACH_A716               A716                    565
+ estk2440a             MACH_ESTK2440A          ESTK2440A               566
+diff -Naur linux-2.6.14-omap2/arch/i386/kernel/cpu/mtrr/main.c linux-h6300-omap2-2.6.14.3/arch/i386/kernel/cpu/mtrr/main.c
+--- linux-2.6.14-omap2/arch/i386/kernel/cpu/mtrr/main.c        2005-10-28 03:02:08.000000000 +0300
++++ linux-h6300-omap2-2.6.14.3/arch/i386/kernel/cpu/mtrr/main.c        2005-12-02 01:34:34.000000000 +0200
+@@ -626,6 +626,14 @@
+               if (cpuid_eax(0x80000000) >= 0x80000008) {
+                       u32 phys_addr;
+                       phys_addr = cpuid_eax(0x80000008) & 0xff;
++                      /* CPUID workaround for Intel 0F33/0F34 CPU */
++                      if (boot_cpu_data.x86_vendor == X86_VENDOR_INTEL &&
++                          boot_cpu_data.x86 == 0xF &&
++                          boot_cpu_data.x86_model == 0x3 &&
++                          (boot_cpu_data.x86_mask == 0x3 ||
++                           boot_cpu_data.x86_mask == 0x4))
++                              phys_addr = 36;
++
+                       size_or_mask = ~((1 << (phys_addr - PAGE_SHIFT)) - 1);
+                       size_and_mask = ~size_or_mask & 0xfff00000;
+               } else if (boot_cpu_data.x86_vendor == X86_VENDOR_CENTAUR &&
+diff -Naur linux-2.6.14-omap2/arch/ppc64/Kconfig linux-h6300-omap2-2.6.14.3/arch/ppc64/Kconfig
+--- linux-2.6.14-omap2/arch/ppc64/Kconfig      2005-10-28 03:02:08.000000000 +0300
++++ linux-h6300-omap2-2.6.14.3/arch/ppc64/Kconfig      2005-12-02 01:34:35.000000000 +0200
+@@ -234,6 +234,10 @@
+         This option enables hardware multithreading on RS64 cpus.
+         pSeries systems p620 and p660 have such a cpu type.
++config NUMA
++      bool "NUMA support"
++      default y if DISCONTIGMEM || SPARSEMEM
++
+ config ARCH_SELECT_MEMORY_MODEL
+       def_bool y
+@@ -249,9 +253,6 @@
+       def_bool y
+       depends on ARCH_DISCONTIGMEM_ENABLE
+-config ARCH_FLATMEM_ENABLE
+-      def_bool y
+-
+ config ARCH_SPARSEMEM_ENABLE
+       def_bool y
+       depends on ARCH_DISCONTIGMEM_ENABLE
+@@ -274,10 +275,6 @@
+       def_bool y
+       depends on NEED_MULTIPLE_NODES
+-config NUMA
+-      bool "NUMA support"
+-      default y if DISCONTIGMEM || SPARSEMEM
+-
+ config SCHED_SMT
+       bool "SMT (Hyperthreading) scheduler support"
+       depends on SMP
+diff -Naur linux-2.6.14-omap2/arch/s390/appldata/appldata_base.c linux-h6300-omap2-2.6.14.3/arch/s390/appldata/appldata_base.c
+--- linux-2.6.14-omap2/arch/s390/appldata/appldata_base.c      2005-10-28 03:02:08.000000000 +0300
++++ linux-h6300-omap2-2.6.14.3/arch/s390/appldata/appldata_base.c      2005-11-23 01:44:02.000000000 +0200
+@@ -592,12 +592,15 @@
+  */
+ void appldata_unregister_ops(struct appldata_ops *ops)
+ {
++      void *table;
+       spin_lock(&appldata_ops_lock);
+-      unregister_sysctl_table(ops->sysctl_header);
+       list_del(&ops->list);
+-      kfree(ops->ctl_table);
++      /* at that point any incoming access will fail */
++      table = ops->ctl_table;
+       ops->ctl_table = NULL;
+       spin_unlock(&appldata_ops_lock);
++      unregister_sysctl_table(ops->sysctl_header);
++      kfree(table);
+       P_INFO("%s-ops unregistered!\n", ops->name);
+ }
+ /********************** module-ops management <END> **************************/
+diff -Naur linux-2.6.14-omap2/arch/x86_64/kernel/setup.c linux-h6300-omap2-2.6.14.3/arch/x86_64/kernel/setup.c
+--- linux-2.6.14-omap2/arch/x86_64/kernel/setup.c      2005-10-28 03:02:08.000000000 +0300
++++ linux-h6300-omap2-2.6.14.3/arch/x86_64/kernel/setup.c      2005-12-02 01:34:35.000000000 +0200
+@@ -993,6 +993,11 @@
+               unsigned eax = cpuid_eax(0x80000008);
+               c->x86_virt_bits = (eax >> 8) & 0xff;
+               c->x86_phys_bits = eax & 0xff;
++              /* CPUID workaround for Intel 0F34 CPU */
++              if (c->x86_vendor == X86_VENDOR_INTEL &&
++                  c->x86 == 0xF && c->x86_model == 0x3 &&
++                  c->x86_mask == 0x4)
++                      c->x86_phys_bits = 36;
+       }
+       if (c->x86 == 15)
+diff -Naur linux-2.6.14-omap2/drivers/block/cfq-iosched.c linux-h6300-omap2-2.6.14.3/drivers/block/cfq-iosched.c
+--- linux-2.6.14-omap2/drivers/block/cfq-iosched.c     2005-10-28 03:02:08.000000000 +0300
++++ linux-h6300-omap2-2.6.14.3/drivers/block/cfq-iosched.c     2005-11-23 01:44:02.000000000 +0200
+@@ -2260,10 +2260,8 @@
+       if (!atomic_dec_and_test(&cfqd->ref))
+               return;
+-      blk_put_queue(q);
+-
+       cfq_shutdown_timer_wq(cfqd);
+-      q->elevator->elevator_data = NULL;
++      blk_put_queue(q);
+       mempool_destroy(cfqd->crq_pool);
+       kfree(cfqd->crq_hash);
+diff -Naur linux-2.6.14-omap2/drivers/block/pktcdvd.c linux-h6300-omap2-2.6.14.3/drivers/block/pktcdvd.c
+--- linux-2.6.14-omap2/drivers/block/pktcdvd.c 2005-10-28 03:02:08.000000000 +0300
++++ linux-h6300-omap2-2.6.14.3/drivers/block/pktcdvd.c 2005-12-02 01:34:35.000000000 +0200
+@@ -1191,7 +1191,7 @@
+       struct packet_data *pkt;
+       int i;
+-      for (i = 0; i <= PACKET_NUM_STATES; i++)
++      for (i = 0; i < PACKET_NUM_STATES; i++)
+               states[i] = 0;
+       spin_lock(&pd->cdrw.active_list_lock);
+diff -Naur linux-2.6.14-omap2/drivers/bluetooth/Kconfig linux-h6300-omap2-2.6.14.3/drivers/bluetooth/Kconfig
+--- linux-2.6.14-omap2/drivers/bluetooth/Kconfig       2005-10-28 03:02:08.000000000 +0300
++++ linux-h6300-omap2-2.6.14.3/drivers/bluetooth/Kconfig       2005-10-04 00:58:34.000000000 +0300
+@@ -163,6 +163,16 @@
+         Say Y here to compile support for virtual HCI devices into the
+         kernel or say M to compile it as module (hci_vhci).
++        
++config BT_H6300
++      tristate "H6300 BRF6100 BT DRIVER"
++      help
++        Bluetooth H6300 BRF6100 driver.
++        This driver provides the firmware loading mechanism for the BRF6100
++        bt hardware in iPAQ h6300.
++
++        Say Y here to compile support for BRF6100 BT devices into the
++        kernel or say M to compile it as module (h6300_BT).     
+ endmenu
+diff -Naur linux-2.6.14-omap2/drivers/bluetooth/Makefile linux-h6300-omap2-2.6.14.3/drivers/bluetooth/Makefile
+--- linux-2.6.14-omap2/drivers/bluetooth/Makefile      2005-10-28 03:02:08.000000000 +0300
++++ linux-h6300-omap2-2.6.14.3/drivers/bluetooth/Makefile      2005-09-28 01:04:13.000000000 +0300
+@@ -10,10 +10,11 @@
+ obj-$(CONFIG_BT_HCIBFUSB)     += bfusb.o
+ obj-$(CONFIG_BT_HCIDTL1)      += dtl1_cs.o
+ obj-$(CONFIG_BT_HCIBT3C)      += bt3c_cs.o
+-obj-$(CONFIG_BT_HCIBLUECARD)  += bluecard_cs.o
++obj-$(CONFIG_BT_HCIBLUECARD)+= bluecard_cs.o
+ obj-$(CONFIG_BT_HCIBTUART)    += btuart_cs.o
++obj-$(CONFIG_BT_H6300)                += omap/
+-hci_uart-y                            := hci_ldisc.o
++hci_uart-y                                                    := hci_ldisc.o
+ hci_uart-$(CONFIG_BT_HCIUART_H4)      += hci_h4.o
+ hci_uart-$(CONFIG_BT_HCIUART_BCSP)    += hci_bcsp.o
+-hci_uart-objs                         := $(hci_uart-y)
++hci_uart-objs                                         := $(hci_uart-y)
+diff -Naur linux-2.6.14-omap2/drivers/bluetooth/omap/h6300_bt_brf6100.c linux-h6300-omap2-2.6.14.3/drivers/bluetooth/omap/h6300_bt_brf6100.c
+--- linux-2.6.14-omap2/drivers/bluetooth/omap/h6300_bt_brf6100.c       1970-01-01 02:00:00.000000000 +0200
++++ linux-h6300-omap2-2.6.14.3/drivers/bluetooth/omap/h6300_bt_brf6100.c       2005-12-02 00:45:30.000000000 +0200
+@@ -0,0 +1,153 @@
++/* 
++ * Bluetooth interface driver for TI BRF6100 on h6300
++ * 
++ * Copyright (C) 2005 Mika Laitio <lamikr@cc.jyu.fi>
++ * Ideas taken from the brf6150 bt driver made by Todd Blumer for the pxa hx4700.
++ * 
++ * 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.
 + */
-+#define       _H6300_JOYPAD_UP_RIGHT          1       // 00001
-+#define _H6300_JOYPAD_DOWN_RIGHT      2       // 00010
-+#define _h6300_JOYPAD_DOWN_LEFT               4       // 00100
-+#define _h6300_JOYPAD_UP_LEFT         8       // 01000
-+#define _H6300_JOYPAD_KEY_OK          16      // 10000
 +
-+static int h6300_keymap[] = {
-+      KEY(2, 0, _h6300_KEY_CALENDAR),         // address button in the bottom left    
-+      KEY(2, 3, _H6300_KEY_TELEPHONE),        // start call button in the bottom
-+      KEY(3, 1, _H6300_KEY_HOMEPAGE),         // stop call button in the bottom
-+      KEY(3, 4, _H6300_KEY_MAIL),             // messaging button in the bottom right
++#include <linux/module.h>
++#include <linux/kernel.h>
++#include <linux/delay.h>
++#include <linux/device.h>
 +
-+      KEY(0, 0, KEY_VOLUMEUP),        // volume up button in the right side
-+      KEY(0, 1, KEY_VOLUMEDOWN),      // volume down button in the right side
-+      KEY(3, 2, KEY_RECORD),          // record button in the left side
++#include <asm/hardware.h>
++#include <asm/arch/gpio.h>
++
++#include <asm/arch/h6300_uart_info.h>
++#include "h6300_bt_led.h"
++
++static void
++h6300_bt_configure(struct uart_omap_port *up, int enable)
++{
++      printk(KERN_NOTICE "h6300_bt_brf6100.c h6300_bt_configure() started, enable = %d\n", enable);
 +      
-+      KEY(1, 0, _h6300_JOYPAD_UP_LEFT),       
-+      KEY(1, 1, _h6300_JOYPAD_DOWN_LEFT),     
-+      KEY(1, 2, _H6300_JOYPAD_KEY_OK),                
-+      KEY(1, 3, _H6300_JOYPAD_DOWN_RIGHT),
-+      KEY(1, 4, _H6300_JOYPAD_UP_RIGHT),      
++      // printk( KERN_NOTICE "h6300 configure bluetooth: %d\n", enable );
++      if (enable == 0) {
++              omap_set_gpio_dataout(GPIO_N_BT_RST, 1);        // turn off gpio, note 1 == off for negative gpios
++              mdelay(5);
++              h6300_clear_led(INDEX_BT_LED);
++      }
++      else if (enable == 1) {
++              omap_set_gpio_dataout(GPIO_N_BT_RST, 1);        // turn on gpio, note 0 == on for negative gpios
++              mdelay(5);                              
++      }
++      else if (enable == 2) {
++              /*
++               * BRF6150's RTS goes low when firmware is ready
++               * so check for CTS=1 (nCTS=0 -> CTS=1). Typical 150ms
++               */
++/*            
++              int tries = 0; 
++              do 
++              {
++                      mdelay(10);
++              } 
++              while ((BTMSR & MSR_CTS) == 0 && tries++ < 50);
++*/                            
++              h6300_set_led(INDEX_BT_LED, 16, 16);
++      }
++      printk(KERN_NOTICE "h6300_bt_brf6100.c h6300_bt_configure() done\n");
++}
++
++static void
++h6300_bt_set_txrx(struct uart_omap_port *up, int txrx)
++{
++      printk(KERN_NOTICE "h6300_bt_brf6100.c h6300_bt_set_txrx(), txrx = %d done\n", txrx);
++      /* do nothing */
++}
++
++static int
++h6300_bt_get_txrx(struct uart_omap_port *up)
++{
++      printk(KERN_NOTICE "h6300_bt_brf6100.c h6300_bt_get_txrx() done\n");
++      /* do nothing */
++      return 0;
++}
++
++static int
++h6300_bt_probe(struct device *dev)
++{
++      struct h6300_uart_funcs *funcs = (struct h6300_uart_funcs *)dev->platform_data;
++
++      omap_request_gpio(GPIO_BT_PWR_EN);              // ask bt_power_en gpio, remember to release in remove_function
++      omap_set_gpio_direction(GPIO_BT_PWR_EN, 1);     // set gpio direction to be output
++      omap_set_gpio_dataout(GPIO_BT_PWR_EN, 1);       // turn on gpio
++
++      mdelay(200);
++
++      omap_request_gpio(GPIO_N_BT_RST);               // ask bt_reset gpio, remember to release in remove_function
++      omap_set_gpio_direction(GPIO_N_BT_RST, 1);      // set gpio direction to be output
++      omap_set_gpio_dataout(GPIO_N_BT_RST, 0);        // turn on gpio, note 0 == on for negative gpios
 +      
-+      KEY(5, 0, KEY_RIGHT),
-+      KEY(5, 1, KEY_DOWN),
-+      KEY(5, 2, KEY_LEFT),            
-+      KEY(5, 3, KEY_UP),
-+      KEY(5, 4, KEY_ENTER),
++      /* configure bluetooth UART */
++      //h6300_gpio_mode(GPIO_NR_H6300_BT_RXD_MD);
++      //h6300_gpio_mode(GPIO_NR_H6300_BT_TXD_MD);
++      //h6300_gpio_mode(GPIO_NR_H6300_BT_UART_CTS_MD);
++      //h6300_gpio_mode(GPIO_NR_H6300_BT_UART_RTS_MD);
 +
-+      0
++      funcs->configure        = h6300_bt_configure;
++      funcs->set_txrx         = h6300_bt_set_txrx;
++      funcs->get_txrx         = h6300_bt_get_txrx;
++
++      /* Make sure the LED is off */
++      h6300_clear_led(INDEX_BT_LED);
++      
++      printk(KERN_NOTICE "h6300_bt_brf6100.c h6300_bt_probe() done\n");       
++
++      return 0;
++}
++
++static int
++h6300_bt_remove(struct device *dev)
++{
++      struct h6300_uart_funcs *funcs = (struct h6300_uart_funcs *)dev->platform_data;
++      
++      printk(KERN_NOTICE "h6300_bt_brf6100.c h6300_bt_remove() started\n");   
++      
++      omap_free_gpio(GPIO_BT_PWR_EN);
++      omap_free_gpio(GPIO_N_BT_RST);
++
++      funcs->configure        = NULL;
++      funcs->set_txrx         = NULL;
++      funcs->get_txrx         = NULL;
++
++      /* Make sure the LED is off */
++      h6300_clear_led(INDEX_BT_LED);
++      
++      printk(KERN_NOTICE "h6300_bt_brf6100.c, h6300_bt_remove() done\n");
++
++      return 0;
++}
++
++static struct device_driver bt_driver = {
++      .name     = "h6300_bt",
++      .bus      = &platform_bus_type,
++      .probe    = h6300_bt_probe,
++      .remove   = h6300_bt_remove,
 +};
 +
- static int *keymap;
- static irqreturn_t omap_kp_interrupt(int irq, void *dev_id,
-@@ -191,7 +236,8 @@
-       for (col = 0; col < 8; col++) {
-               omap_writew(~(1 << col) & 0xff, OMAP_MPUIO_BASE + OMAP_MPUIO_KBC);
--              if (machine_is_omap_osk() || machine_is_omap_h2() || machine_is_omap_h3()) {
-+              if (machine_is_omap_osk() || machine_is_omap_h2() || machine_is_omap_h3()  || machine_is_h6300()) {
-+                      // makes keyboard act a little bit slower
-                       udelay(9);
-               } else {
-                       udelay(4);
-@@ -214,16 +260,24 @@
-       return -1;
- }
++static int __init
++h6300_bt_init(void)
++{
++      printk(KERN_NOTICE "h6300 Bluetooth Driver init()\n");
++      return driver_register(&bt_driver);
++}
++
++static void __exit
++h6300_bt_exit(void)
++{
++      printk(KERN_NOTICE "h6300 Bluetooth Driver exit()\n");
++      driver_unregister(&bt_driver);
++}
++
++module_init(h6300_bt_init);
++module_exit(h6300_bt_exit);
++
++MODULE_AUTHOR("Mika Laitio, <lamikr@cc.jyu.fi>");
++MODULE_DESCRIPTION("iPAQ h6300 BRF6100 Bluetooth driver.");
++MODULE_LICENSE("GPL");
++
+diff -Naur linux-2.6.14-omap2/drivers/bluetooth/omap/h6300_bt_led.c linux-h6300-omap2-2.6.14.3/drivers/bluetooth/omap/h6300_bt_led.c
+--- linux-2.6.14-omap2/drivers/bluetooth/omap/h6300_bt_led.c   1970-01-01 02:00:00.000000000 +0200
++++ linux-h6300-omap2-2.6.14.3/drivers/bluetooth/omap/h6300_bt_led.c   2005-10-06 02:34:39.000000000 +0300
+@@ -0,0 +1,41 @@
++/* 
++ * Bluetooth interface driver helper for controlling bluetooth leds available in iPAQ h6300.
++ * 
++ * Copyright (C) 2005 Mika Laitio  <lamikr@cc.jyu.fi>
++ * Ideas from the brf6150 bt driver made by Todd Blumer for the pxa hx4700.
++ * 
++ * This program is free software; you can redistribute it and/or modify
++ * it under the terms of the GNU General Public License version 2 as
++ * published by the Free Software Foundation.
++ */
++
++#include <linux/module.h>
++#include <linux/kernel.h>
++#include <linux/delay.h>
++#include <linux/device.h>
++
++#include <asm/hardware.h>
++#include <asm/arch/gpio.h>
++
++/* 
++ * Low level access for disabling h6300 bt led.
++ *
++ * TODO: implement for h6300 
++ */
++void h6300_clear_led(int led_num)
++{
++      printk(KERN_NOTICE "h6300_bt_led.c h6300_clear_led() done\n");
++      //hx4700_set_led(led_num, 0, 16);
++}
++EXPORT_SYMBOL(h6300_clear_led);
++
++/* 
++ * Low level access for setting up the bt led.
++ *
++ * TODO: implement for h6300 
++ */
++void h6300_set_led(int led_num, int duty_time, int cycle_time)
++{
++      printk(KERN_NOTICE "h6300_bt_led.c h6300_set_led() done\n");
++}
++EXPORT_SYMBOL(h6300_set_led);
+diff -Naur linux-2.6.14-omap2/drivers/bluetooth/omap/h6300_bt_led.h linux-h6300-omap2-2.6.14.3/drivers/bluetooth/omap/h6300_bt_led.h
+--- linux-2.6.14-omap2/drivers/bluetooth/omap/h6300_bt_led.h   1970-01-01 02:00:00.000000000 +0200
++++ linux-h6300-omap2-2.6.14.3/drivers/bluetooth/omap/h6300_bt_led.h   2005-10-06 02:34:39.000000000 +0300
+@@ -0,0 +1,9 @@
++#ifndef H6300_BT_LED_H_
++#define H6300_BT_LED_H_
++
++#define INDEX_BT_LED  2
++
++void h6300_clear_led(int led_num);
++void h6300_set_led(int led_num, int duty_time, int cycle_time);
++
++#endif /*H6300_BT_LED_H_*/
+diff -Naur linux-2.6.14-omap2/drivers/bluetooth/omap/Makefile linux-h6300-omap2-2.6.14.3/drivers/bluetooth/omap/Makefile
+--- linux-2.6.14-omap2/drivers/bluetooth/omap/Makefile 1970-01-01 02:00:00.000000000 +0200
++++ linux-h6300-omap2-2.6.14.3/drivers/bluetooth/omap/Makefile 2005-10-06 02:34:39.000000000 +0300
+@@ -0,0 +1,6 @@
++#
++# Makefile for the Linux iPAQ H6300 BRF6100 Bluetooth device drivers.
++#
++
++h6300_bt-objs                         := h6300_bt_led.o h6300_bt_brf6100.o
++obj-$(CONFIG_BT_H6300)                += h6300_bt.o
+diff -Naur linux-2.6.14-omap2/drivers/char/rtc.c linux-h6300-omap2-2.6.14.3/drivers/char/rtc.c
+--- linux-2.6.14-omap2/drivers/char/rtc.c      2005-10-28 03:02:08.000000000 +0300
++++ linux-h6300-omap2-2.6.14.3/drivers/char/rtc.c      2005-12-02 01:34:35.000000000 +0200
+@@ -149,8 +149,22 @@
+ #ifdef RTC_IRQ
+ static void rtc_dropped_irq(unsigned long data);
  
-+int is_key_down(unsigned char new_state[],
-+              int col,
-+              int row)
+-static void set_rtc_irq_bit(unsigned char bit);
+-static void mask_rtc_irq_bit(unsigned char bit);
++static void set_rtc_irq_bit_locked(unsigned char bit);
++static void mask_rtc_irq_bit_locked(unsigned char bit);
++
++static inline void set_rtc_irq_bit(unsigned char bit)
 +{
-+      return (new_state[col] & (1 << row)) ? 1 : 0;
++      spin_lock_irq(&rtc_lock);
++      set_rtc_irq_bit_locked(bit);
++      spin_unlock_irq(&rtc_lock);
 +}
 +
- static void omap_kp_tasklet(unsigned long data)
- {
-       unsigned char new_state[8], changed, key_down = 0;
-       int col, row;
-       int spurious = 0;
-+      int report_key, report_col, report_row, joypad_checked; // joypad specific variables
-       /* check for any changes */
-       omap_kp_scan_keypad(new_state);
--
-       /* check for changes and print those */
-+      joypad_checked  = 0;
-       for (col = 0; col < 8; col++) {
-               changed = new_state[col] ^ keypad_state[col];
-               key_down |= new_state[col];
-@@ -245,9 +299,173 @@
-                               spurious = 1;
-                               continue;
-                       }
--
--                      input_report_key(&omap_kp_dev, key,
--                                       new_state[col] & (1 << row));
-+                      if (machine_is_h6300() && 
-+                         ((col == 1) || (col == 5)))
-+                      {
-+                              if (col == 5)
-+                              {
-+                                      continue;
-+                              }
-+                              if ((joypad_checked == 0) &&
-+                                  ((key == _H6300_JOYPAD_KEY_OK) ||
-+                                   (key == _h6300_JOYPAD_UP_LEFT) ||
-+                                   (key == _H6300_JOYPAD_UP_RIGHT) ||
-+                                   (key == _H6300_JOYPAD_DOWN_RIGHT) ||
-+                                   (key == _h6300_JOYPAD_DOWN_LEFT)))
-+                              {
-+                                      if (is_key_down(new_state, col, row))
-+                                      {
-+                                              /*
-+                                               * only enter pressed
-+                                               * 1 0 0 _H6300_JOYPAD_KEY_OK 0 0
-+                                               * --> 100100 == 36
-+                                               */
-+                                               if (new_state[1] == 36)
-+                                               {
-+                                                      joypad_checked  = 1;
-+                                                      prevJoypadKeycodePressEmulated  = KEY_ENTER;
-+                                                      new_state[5]    = 48;   //110000
-+                                                      report_key      = prevJoypadKeycodePressEmulated;
-+                                                      report_col      = 5;
-+                                                      report_row      = 4;
-+                                                      input_report_key(&omap_kp_dev,
-+                                                                      report_key,
-+                                                                      new_state[report_col] & (1 << report_row));                                                     
-+                                               }                                              
-+                                              /*
-+                                               * enter, up_left and up_right sensors pressed.
-+                                               * 1 _H6300_JOYPAD_UP_RIGHT 0 _H6300_JOYPAD_KEY_OK 0 _h6300_JOYPAD_UP_LEFT
-+                                               * --> 110101 == 53
-+                                               * OR
-+                                               * 1 KEY_UP_RIGHT 0 0 0 _h6300_JOYPAD_UP_LEFT
-+                                               * --> 110001 == 42
-+                                               * --> move to up
-+                                               */
-+                                              else if ((new_state[1] == 53) ||
-+                                                       (new_state[1] == 49))
-+                                              {
-+                                                      joypad_checked  = 1;
-+                                                      prevJoypadKeycodePressEmulated  = KEY_UP;
-+                                                      new_state[5]    = 40;   //101000
-+                                                      report_key      = prevJoypadKeycodePressEmulated;
-+                                                      report_col      = 5;
-+                                                      report_row      = 3;
-+                                                      input_report_key(&omap_kp_dev,
-+                                                                      report_key,
-+                                                                      new_state[report_col] & (1 << report_row));
-+                                              }
-+                                              /*
-+                                               * enter, down_left and down_right sensors pressed
-+                                               * --> 101110 == 46
-+                                               * OR
-+                                               * down_left and down_right
-+                                               * -->101010 == 42
-+                                               * --> move to down
-+                                               */
-+                                              else if ((new_state[1] == 46) ||
-+                                                       (new_state[1] == 42))
-+                                              {
-+                                                      joypad_checked  = 1;
-+                                                      prevJoypadKeycodePressEmulated  = KEY_DOWN;
-+                                                      new_state[5]    = 34;   //100010
-+                                                      report_key      = prevJoypadKeycodePressEmulated;
-+                                                      report_col      = 5;
-+                                                      report_row      = 1;
-+                                                      input_report_key(&omap_kp_dev,
-+                                                                      report_key,
-+                                                                      new_state[report_col] & (1 << report_row));
-+                                              }                                                                                               
-+                                              /*
-+                                               * enter, up_right and down_right sensors pressed
-+                                               * --> 111100 == 60
-+                                               * or
-+                                               * down_right and up_right
-+                                               * --> 111000 == 56
-+                                               * --> move to right
-+                                               */
-+                                              else if ((new_state[1] == 60) ||
-+                                                       (new_state[1] == 56))
-+                                              {
-+                                                      joypad_checked  = 1;
-+                                                      prevJoypadKeycodePressEmulated  = KEY_RIGHT;
-+                                                      new_state[5]    = 33;   //100001
-+                                                      report_key      = prevJoypadKeycodePressEmulated;
-+                                                      report_col      = 5;
-+                                                      report_row      = 0;
-+                                                      input_report_key(&omap_kp_dev,
-+                                                                      report_key,
-+                                                                      new_state[report_col] & (1 << report_row));
-+                                              }
-+                                              /*
-+                                               * enter, up_left and down_left sensors pressed
-+                                               * --> 100111 == 39
-+                                               * or up_left and down_left
-+                                               * --> 100011 == 35
-+                                               * --> move to left
-+                                               */
-+                                              else if ((new_state[1] == 39) ||
-+                                                       (new_state[1] == 35))
-+                                              {
-+                                                      joypad_checked  = 1;
-+                                                      prevJoypadKeycodePressEmulated  = KEY_LEFT;
-+                                                      new_state[5]    = 36;   //100100
-+                                                      report_key      = prevJoypadKeycodePressEmulated;
-+                                                      report_col      = 5;
-+                                                      report_row      = 2;
-+                                                      input_report_key(&omap_kp_dev,
-+                                                                      report_key,
-+                                                                      new_state[report_col] & (1 << report_row));
-+                                              }
-+                                              else
-+                                              {
-+                                                      //printk("missed new_state = %d\n", new_state[1]);
-+                                              }
-+                                      }
-+                                      else
-+                                      {
-+                                              if (prevJoypadKeycodePressEmulated != 0)
-+                                              {
-+                                                      // report key up event
-+                                                      joypad_checked  = 1;
-+                                                      new_state[5]    = 32;   //100000
-+                                                      report_key      = prevJoypadKeycodePressEmulated;
-+                                                      report_col      = 5;
-+                                                      switch(prevJoypadKeycodePressEmulated)
-+                                                      {
-+                                                              case KEY_RIGHT:
-+                                                                      report_row      = 0;
-+                                                                      break;
-+                                                              case KEY_DOWN:
-+                                                                      report_row      = 1;
-+                                                                      break;
-+                                                              case KEY_LEFT:
-+                                                                      report_row      = 2;
-+                                                                      break;
-+                                                              case KEY_UP:
-+                                                                      report_row      = 3;
-+                                                                      break;
-+                                                              case KEY_ENTER:
-+                                                                      report_row      = 4;
-+                                                                      break;
-+                                                              default:
-+                                                                      printk(KERN_WARNING "Unknown iPAQ h6300 column 1 key = %d released. This should newer happen!\n",
-+                                                                              key);
-+                                                                      report_row      = 0;
-+                                                      }
-+                                                      input_report_key(&omap_kp_dev,
-+                                                                      report_key,
-+                                                                      new_state[report_col] & (1 << report_row));
-+                                                      prevJoypadKeycodePressEmulated  = 0;                                                            
-+                                              }
-+                                      }
-+                              }
-+                      }
-+                      else
-+                      {
-+                              input_report_key(&omap_kp_dev, 
-+                                              key,
-+                                              new_state[col] & (1 << row));
-+                      }
++static void mask_rtc_irq_bit(unsigned char bit)
++{
++      spin_lock_irq(&rtc_lock);
++      mask_rtc_irq_bit_locked(bit);
++      spin_unlock_irq(&rtc_lock);
++}
  #endif
+ static int rtc_proc_open(struct inode *inode, struct file *file);
+@@ -401,18 +415,19 @@
+       }
+       case RTC_PIE_OFF:       /* Mask periodic int. enab. bit */
+       {
+-              mask_rtc_irq_bit(RTC_PIE);
++              unsigned long flags; /* can be called from isr via rtc_control() */
++              spin_lock_irqsave (&rtc_lock, flags);
++              mask_rtc_irq_bit_locked(RTC_PIE);
+               if (rtc_status & RTC_TIMER_ON) {
+-                      spin_lock_irq (&rtc_lock);
+                       rtc_status &= ~RTC_TIMER_ON;
+                       del_timer(&rtc_irq_timer);
+-                      spin_unlock_irq (&rtc_lock);
                }
++              spin_unlock_irqrestore (&rtc_lock, flags);
+               return 0;
        }
-@@ -285,7 +503,12 @@
-       } else if (machine_is_omap_perseus2()) {
-               keymap = p2_keymap;
-               keypad_irq = INT_730_MPUIO_KEYPAD;
-+      } else if (machine_is_h6300()) {
-+              keymap = h6300_keymap;
-+              // set keyboard to send repeated key events if key is hold down
-+              set_bit(EV_REP, omap_kp_dev.evbit);
-       } else {
-+              printk("omap_keypad.c, keyMap = test_keymap\n");
-               keymap = test_keymap;
+       case RTC_PIE_ON:        /* Allow periodic ints          */
+       {
+-
++              unsigned long flags; /* can be called from isr via rtc_control() */
+               /*
+                * We don't really want Joe User enabling more
+                * than 64Hz of interrupts on a multi-user machine.
+@@ -421,14 +436,14 @@
+                       (!capable(CAP_SYS_RESOURCE)))
+                       return -EACCES;
++              spin_lock_irqsave (&rtc_lock, flags);
+               if (!(rtc_status & RTC_TIMER_ON)) {
+-                      spin_lock_irq (&rtc_lock);
+                       rtc_irq_timer.expires = jiffies + HZ/rtc_freq + 2*HZ/100;
+                       add_timer(&rtc_irq_timer);
+                       rtc_status |= RTC_TIMER_ON;
+-                      spin_unlock_irq (&rtc_lock);
+               }
+-              set_rtc_irq_bit(RTC_PIE);
++              set_rtc_irq_bit_locked(RTC_PIE);
++              spin_unlock_irqrestore (&rtc_lock, flags);
+               return 0;
        }
+       case RTC_UIE_OFF:       /* Mask ints from RTC updates.  */
+@@ -609,6 +624,7 @@
+       {
+               int tmp = 0;
+               unsigned char val;
++              unsigned long flags; /* can be called from isr via rtc_control() */
  
-@@ -335,6 +558,7 @@
+               /* 
+                * The max we can do is 8192Hz.
+@@ -631,9 +647,9 @@
+               if (arg != (1<<tmp))
+                       return -EINVAL;
  
-               omap_writew(0xff, OMAP_MPUIO_BASE + OMAP_MPUIO_GPIO_DEBOUNCING);
+-              spin_lock_irq(&rtc_lock);
++              spin_lock_irqsave(&rtc_lock, flags);
+               if (hpet_set_periodic_freq(arg)) {
+-                      spin_unlock_irq(&rtc_lock);
++                      spin_unlock_irqrestore(&rtc_lock, flags);
+                       return 0;
+               }
+               rtc_freq = arg;
+@@ -641,7 +657,7 @@
+               val = CMOS_READ(RTC_FREQ_SELECT) & 0xf0;
+               val |= (16 - tmp);
+               CMOS_WRITE(val, RTC_FREQ_SELECT);
+-              spin_unlock_irq(&rtc_lock);
++              spin_unlock_irqrestore(&rtc_lock, flags);
+               return 0;
        }
-+      prevJoypadKeycodePressEmulated          = 0;
+ #endif
+@@ -844,12 +860,15 @@
+ #ifndef RTC_IRQ
+       return -EIO;
+ #else
+-      spin_lock_irq(&rtc_task_lock);
++      unsigned long flags;
++      if (cmd != RTC_PIE_ON && cmd != RTC_PIE_OFF && cmd != RTC_IRQP_SET)
++              return -EINVAL;
++      spin_lock_irqsave(&rtc_task_lock, flags);
+       if (rtc_callback != task) {
+-              spin_unlock_irq(&rtc_task_lock);
++              spin_unlock_irqrestore(&rtc_task_lock, flags);
+               return -ENXIO;
+       }
+-      spin_unlock_irq(&rtc_task_lock);
++      spin_unlock_irqrestore(&rtc_task_lock, flags);
+       return rtc_do_ioctl(cmd, arg, 1);
+ #endif
+ }
+@@ -1306,40 +1325,32 @@
+  * meddles with the interrupt enable/disable bits.
+  */
  
-       /* scan current status and enable interrupt */
-       omap_kp_scan_keypad(keypad_state);
-diff -Naur /home/lamikr/own/h6340/kernel/linux-2.6.14-rc5/drivers/input/touchscreen/omap/Makefile bt_kernel/drivers/input/touchscreen/omap/Makefile
---- /home/lamikr/own/h6340/kernel/linux-2.6.14-rc5/drivers/input/touchscreen/omap/Makefile     2005-10-30 17:44:17.519075542 +0200
-+++ bt_kernel/drivers/input/touchscreen/omap/Makefile  2005-10-22 03:52:45.687256000 +0300
-@@ -8,5 +8,6 @@
- objs-$(CONFIG_ARCH_OMAP16XX)$(CONFIG_MACH_OMAP_H3) += ts_hx.o
- objs-$(CONFIG_ARCH_OMAP15XX)$(CONFIG_MACH_OMAP_INNOVATOR) += ts_inn1510.o
- objs-$(CONFIG_ARCH_OMAP16XX)$(CONFIG_MACH_OMAP_OSK) += ts_osk.o
-+objs-$(CONFIG_ARCH_OMAP15XX)$(CONFIG_MACH_OMAP_H6300) += ts_hx.o
+-static void mask_rtc_irq_bit(unsigned char bit)
++static void mask_rtc_irq_bit_locked(unsigned char bit)
+ {
+       unsigned char val;
  
- omapts-objs := omap_ts.o $(objs-yy)
-diff -Naur /home/lamikr/own/h6340/kernel/linux-2.6.14-rc5/drivers/input/touchscreen/omap/omap_ts.c bt_kernel/drivers/input/touchscreen/omap/omap_ts.c
---- /home/lamikr/own/h6340/kernel/linux-2.6.14-rc5/drivers/input/touchscreen/omap/omap_ts.c    2005-10-30 17:44:17.542071882 +0200
-+++ bt_kernel/drivers/input/touchscreen/omap/omap_ts.c 2005-10-22 03:52:45.687256000 +0300
-@@ -46,7 +46,7 @@
- #define OMAP_TS_NAME  "omap_ts"
+-      spin_lock_irq(&rtc_lock);
+-      if (hpet_mask_rtc_irq_bit(bit)) {
+-              spin_unlock_irq(&rtc_lock);
++      if (hpet_mask_rtc_irq_bit(bit))
+               return;
+-      }
+       val = CMOS_READ(RTC_CONTROL);
+       val &=  ~bit;
+       CMOS_WRITE(val, RTC_CONTROL);
+       CMOS_READ(RTC_INTR_FLAGS);
  
- static struct ts_device *__initdata ts_devs[] = {
--#if defined(CONFIG_MACH_OMAP_H2) || defined(CONFIG_MACH_OMAP_H3)
-+#if defined(CONFIG_MACH_OMAP_H2) || defined(CONFIG_MACH_OMAP_H3) || defined(CONFIG_MACH_OMAP_H6300)
-       &hx_ts,
- #endif
- #ifdef CONFIG_MACH_OMAP_OSK
-diff -Naur /home/lamikr/own/h6340/kernel/linux-2.6.14-rc5/drivers/input/touchscreen/omap/ts_hx.c bt_kernel/drivers/input/touchscreen/omap/ts_hx.c
---- /home/lamikr/own/h6340/kernel/linux-2.6.14-rc5/drivers/input/touchscreen/omap/ts_hx.c      2005-10-30 17:44:17.566068062 +0200
-+++ bt_kernel/drivers/input/touchscreen/omap/ts_hx.c   2005-09-28 02:45:59.570809000 +0300
-@@ -33,6 +33,7 @@
- #include <asm/arch/mux.h>
- #include <asm/arch/hardware.h>
- #include <asm/hardware/tsc2101.h>
-+#include <linux/delay.h>
+       rtc_irq_data = 0;
+-      spin_unlock_irq(&rtc_lock);
+ }
  
- #include "../drivers/ssi/omap-tsc2101.h"
- #include "omap_ts.h"
-@@ -88,14 +89,19 @@
-       } else if (machine_is_omap_h3()) {
-               gpio = H3_GPIO_NUM;
-               omap_cfg_reg(W19_1610_GPIO48);
-+      } else if (machine_is_h6300 ()) {
-+              gpio = 2;
-+              omap_cfg_reg(M14_1510_GPIO2);   
-       } else
-               return -ENODEV;
+-static void set_rtc_irq_bit(unsigned char bit)
++static void set_rtc_irq_bit_locked(unsigned char bit)
+ {
+       unsigned char val;
  
-       ts->irq = OMAP_GPIO_IRQ(gpio);
--      if (omap_request_gpio(gpio) != 0) {
--              printk(KERN_ERR "hX_ts_init.c: Could not reserve GPIO!\n");
--              return -EINVAL;
--      };
-+      if (!machine_is_h6300 ()){
-+              if (omap_request_gpio(gpio) != 0) {
-+                      printk(KERN_ERR "hX_ts_init.c: Could not reserve GPIO!\n");
-+                      return -EINVAL;
-+              };
-+      }
+-      spin_lock_irq(&rtc_lock);
+-      if (hpet_set_rtc_irq_bit(bit)) {
+-              spin_unlock_irq(&rtc_lock);
++      if (hpet_set_rtc_irq_bit(bit))
+               return;
+-      }
+       val = CMOS_READ(RTC_CONTROL);
+       val |= bit;
+       CMOS_WRITE(val, RTC_CONTROL);
+       CMOS_READ(RTC_INTR_FLAGS);
  
-       omap_set_gpio_direction(gpio, 1);
-       set_irq_type(ts->irq, IRQT_FALLING);
-@@ -180,5 +186,7 @@
-               omap_free_gpio(H2_GPIO_NUM);
-       else if (machine_is_omap_h3())
-               omap_free_gpio(H3_GPIO_NUM);
-+      else if (machine_is_h6300())
-+              omap_free_gpio(2);
+       rtc_irq_data = 0;
+-      spin_unlock_irq(&rtc_lock);
  }
  #endif
-diff -Naur /home/lamikr/own/h6340/kernel/linux-2.6.14-rc5/drivers/i2c/busses/i2c-omap.c bt_kernel/drivers/i2c/busses/i2c-omap.c
---- /home/lamikr/own/h6340/kernel/linux-2.6.14-rc5/drivers/i2c/busses/i2c-omap.c       2005-10-30 17:44:17.091143658 +0200
-+++ bt_kernel/drivers/i2c/busses/i2c-omap.c    2005-10-20 20:53:33.518825000 +0300
+diff -Naur linux-2.6.14-omap2/drivers/hwmon/it87.c linux-h6300-omap2-2.6.14.3/drivers/hwmon/it87.c
+--- linux-2.6.14-omap2/drivers/hwmon/it87.c    2005-10-28 03:02:08.000000000 +0300
++++ linux-h6300-omap2-2.6.14.3/drivers/hwmon/it87.c    2005-12-02 01:34:35.000000000 +0200
+@@ -522,8 +522,15 @@
+       struct i2c_client *client = to_i2c_client(dev);
+       struct it87_data *data = i2c_get_clientdata(client);
+       int val = simple_strtol(buf, NULL, 10);
++      u8 reg = it87_read_value(client, IT87_REG_FAN_DIV);
+       down(&data->update_lock);
++      switch (nr) {
++      case 0: data->fan_div[nr] = reg & 0x07; break;
++      case 1: data->fan_div[nr] = (reg >> 3) & 0x07; break;
++      case 2: data->fan_div[nr] = (reg & 0x40) ? 3 : 1; break;
++      }
++
+       data->fan_min[nr] = FAN_TO_REG(val, DIV_FROM_REG(data->fan_div[nr]));
+       it87_write_value(client, IT87_REG_FAN_MIN(nr), data->fan_min[nr]);
+       up(&data->update_lock);
+diff -Naur linux-2.6.14-omap2/drivers/hwmon/lm78.c linux-h6300-omap2-2.6.14.3/drivers/hwmon/lm78.c
+--- linux-2.6.14-omap2/drivers/hwmon/lm78.c    2005-10-28 03:02:08.000000000 +0300
++++ linux-h6300-omap2-2.6.14.3/drivers/hwmon/lm78.c    2005-12-02 01:34:35.000000000 +0200
+@@ -451,7 +451,7 @@
+ static ssize_t show_vid(struct device *dev, struct device_attribute *attr, char *buf)
+ {
+       struct lm78_data *data = lm78_update_device(dev);
+-      return sprintf(buf, "%d\n", vid_from_reg(82, data->vid));
++      return sprintf(buf, "%d\n", vid_from_reg(data->vid, 82));
+ }
+ static DEVICE_ATTR(cpu0_vid, S_IRUGO, show_vid, NULL);
+diff -Naur linux-2.6.14-omap2/drivers/hwmon/w83627hf.c linux-h6300-omap2-2.6.14.3/drivers/hwmon/w83627hf.c
+--- linux-2.6.14-omap2/drivers/hwmon/w83627hf.c        2005-10-28 03:02:08.000000000 +0300
++++ linux-h6300-omap2-2.6.14.3/drivers/hwmon/w83627hf.c        2005-12-02 01:34:35.000000000 +0200
+@@ -454,7 +454,9 @@
+               (w83627thf == data->type || w83637hf == data->type))
+               /* use VRM9 calculation */
+-              data->in_min[0] = (u8)(((val * 100) - 70000 + 244) / 488);
++              data->in_min[0] =
++                      SENSORS_LIMIT(((val * 100) - 70000 + 244) / 488, 0,
++                                      255);
+       else
+               /* use VRM8 (standard) calculation */
+               data->in_min[0] = IN_TO_REG(val);
+@@ -479,7 +481,9 @@
+               (w83627thf == data->type || w83637hf == data->type))
+               
+               /* use VRM9 calculation */
+-              data->in_max[0] = (u8)(((val * 100) - 70000 + 244) / 488);
++              data->in_max[0] =
++                      SENSORS_LIMIT(((val * 100) - 70000 + 244) / 488, 0,
++                                      255);
+       else
+               /* use VRM8 (standard) calculation */
+               data->in_max[0] = IN_TO_REG(val);
+diff -Naur linux-2.6.14-omap2/drivers/i2c/busses/i2c-omap.c linux-h6300-omap2-2.6.14.3/drivers/i2c/busses/i2c-omap.c
+--- linux-2.6.14-omap2/drivers/i2c/busses/i2c-omap.c   2005-12-02 01:53:32.000000000 +0200
++++ linux-h6300-omap2-2.6.14.3/drivers/i2c/busses/i2c-omap.c   2005-10-20 20:53:33.000000000 +0300
 @@ -124,10 +124,10 @@
  /* I2C System Configuration Register (OMAP_I2C_SYSC): */
  #define OMAP_I2C_SYSC_SRST            (1 << 1)        /* Soft Reset */
@@ -1207,9 +2575,9 @@ diff -Naur /home/lamikr/own/h6340/kernel/linux-2.6.14-rc5/drivers/i2c/busses/i2c
  static int i2c_debug;
  
  module_param(i2c_debug, int, 0);
-diff -Naur /home/lamikr/own/h6340/kernel/linux-2.6.14-rc5/drivers/i2c/chips/Kconfig bt_kernel/drivers/i2c/chips/Kconfig
---- /home/lamikr/own/h6340/kernel/linux-2.6.14-rc5/drivers/i2c/chips/Kconfig   2005-10-30 17:44:17.176130130 +0200
-+++ bt_kernel/drivers/i2c/chips/Kconfig        2005-10-14 18:55:31.156317000 +0300
+diff -Naur linux-2.6.14-omap2/drivers/i2c/chips/Kconfig linux-h6300-omap2-2.6.14.3/drivers/i2c/chips/Kconfig
+--- linux-2.6.14-omap2/drivers/i2c/chips/Kconfig       2005-12-02 01:53:32.000000000 +0200
++++ linux-h6300-omap2-2.6.14.3/drivers/i2c/chips/Kconfig       2005-10-14 18:55:31.000000000 +0300
 @@ -56,6 +56,16 @@
          This driver can also be built as a module.  If so, the module
          will be called pca9539.
@@ -1227,9 +2595,9 @@ diff -Naur /home/lamikr/own/h6340/kernel/linux-2.6.14-rc5/drivers/i2c/chips/Kcon
  config SENSORS_PCF8591
        tristate "Philips PCF8591"
        depends on I2C && EXPERIMENTAL
-diff -Naur /home/lamikr/own/h6340/kernel/linux-2.6.14-rc5/drivers/i2c/chips/Makefile bt_kernel/drivers/i2c/chips/Makefile
---- /home/lamikr/own/h6340/kernel/linux-2.6.14-rc5/drivers/i2c/chips/Makefile  2005-10-30 17:44:17.176130130 +0200
-+++ bt_kernel/drivers/i2c/chips/Makefile       2005-10-14 18:55:31.156317000 +0300
+diff -Naur linux-2.6.14-omap2/drivers/i2c/chips/Makefile linux-h6300-omap2-2.6.14.3/drivers/i2c/chips/Makefile
+--- linux-2.6.14-omap2/drivers/i2c/chips/Makefile      2005-12-02 01:53:32.000000000 +0200
++++ linux-h6300-omap2-2.6.14.3/drivers/i2c/chips/Makefile      2005-10-14 18:55:31.000000000 +0300
 @@ -16,6 +16,7 @@
  obj-$(CONFIG_SENSORS_TLV320AIC23) += tlv320aic23.o
  obj-$(CONFIG_GPIOEXPANDER_OMAP)       += gpio_expander_omap.o
@@ -1238,9 +2606,9 @@ diff -Naur /home/lamikr/own/h6340/kernel/linux-2.6.14-rc5/drivers/i2c/chips/Make
  
  ifeq ($(CONFIG_I2C_DEBUG_CHIP),y)
  EXTRA_CFLAGS += -DDEBUG
-diff -Naur /home/lamikr/own/h6340/kernel/linux-2.6.14-rc5/drivers/i2c/chips/pca9535.c bt_kernel/drivers/i2c/chips/pca9535.c
---- /home/lamikr/own/h6340/kernel/linux-2.6.14-rc5/drivers/i2c/chips/pca9535.c 1970-01-01 02:00:00.000000000 +0200
-+++ bt_kernel/drivers/i2c/chips/pca9535.c      2005-10-25 22:23:21.875634000 +0300
+diff -Naur linux-2.6.14-omap2/drivers/i2c/chips/pca9535.c linux-h6300-omap2-2.6.14.3/drivers/i2c/chips/pca9535.c
+--- linux-2.6.14-omap2/drivers/i2c/chips/pca9535.c     1970-01-01 02:00:00.000000000 +0200
++++ linux-h6300-omap2-2.6.14.3/drivers/i2c/chips/pca9535.c     2005-10-25 22:23:21.000000000 +0300
 @@ -0,0 +1,414 @@
 +/*
 +    Driver for Philips PCA9535 16-bit low power I/O port with interrupt
@@ -1656,249 +3024,590 @@ diff -Naur /home/lamikr/own/h6340/kernel/linux-2.6.14-rc5/drivers/i2c/chips/pca9
 +
 +module_init(pca9535_init);
 +module_exit(pca9535_exit);
-diff -Naur /home/lamikr/own/h6340/kernel/linux-2.6.14-rc5/drivers/i2c/i2c-core.c bt_kernel/drivers/i2c/i2c-core.c
---- /home/lamikr/own/h6340/kernel/linux-2.6.14-rc5/drivers/i2c/i2c-core.c      2005-10-20 09:23:05.000000000 +0300
-+++ bt_kernel/drivers/i2c/i2c-core.c   2005-10-22 03:52:45.687256000 +0300
-@@ -1180,8 +1180,12 @@
-                                               command,size,data);
-               up(&adapter->bus_lock);
-       } else
-+      {
-+              printk("i2c-core, calling i2c_smbus_xfer_emulated!");
-               res = i2c_smbus_xfer_emulated(adapter,addr,flags,read_write,
-                                             command,size,data);
-+              printk("i2c-core, i2c_smbus_xfer_emulated retVal = %d", res);
-+      }
+diff -Naur linux-2.6.14-omap2/drivers/input/keyboard/omap-keypad.c linux-h6300-omap2-2.6.14.3/drivers/input/keyboard/omap-keypad.c
+--- linux-2.6.14-omap2/drivers/input/keyboard/omap-keypad.c    2005-12-02 01:53:33.000000000 +0200
++++ linux-h6300-omap2-2.6.14.3/drivers/input/keyboard/omap-keypad.c    2005-11-04 03:06:04.000000000 +0200
+@@ -5,10 +5,11 @@
+  *
+  * Copyright (C) 2003 Nokia Corporation
+  * Written by Timo Teräs <ext-timo.teras@nokia.com>
++ * iPAQ h6300 key and joypad support added by Mika Laitio. (2005)
+  *
+  * Added support for H2 & H3 Keypad
+  * Copyright (C) 2004 Texas Instruments
+- *
++ * 
+  * 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
+@@ -40,6 +41,7 @@
+ #include <asm/arch/mux.h>
  
-       if(res >= 0 && swpec &&
-          size != I2C_SMBUS_QUICK && size != I2C_SMBUS_I2C_BLOCK_DATA &&
-diff -Naur /home/lamikr/own/h6340/kernel/linux-2.6.14-rc5/drivers/media/video/omap/omap16xxcam.c bt_kernel/drivers/media/video/omap/omap16xxcam.c
---- /home/lamikr/own/h6340/kernel/linux-2.6.14-rc5/drivers/media/video/omap/omap16xxcam.c      2005-10-30 17:44:17.750038779 +0200
-+++ bt_kernel/drivers/media/video/omap/omap16xxcam.c   2005-10-30 16:32:39.609796000 +0200
-@@ -325,18 +325,22 @@
-       
-       if (machine_is_omap_h3())
-               omap_set_dma_src_params(dmach, OMAP_DMA_PORT_OCP_T1,
--                          OMAP_DMA_AMODE_CONSTANT, CAM_CAMDATA_REG);
-+                          OMAP_DMA_AMODE_CONSTANT, CAM_CAMDATA_REG,
-+                          0, 0);
-       else
-               omap_set_dma_src_params(dmach, OMAP_DMA_PORT_TIPB,
--                          OMAP_DMA_AMODE_CONSTANT, CAM_CAMDATA_REG);
-+                          OMAP_DMA_AMODE_CONSTANT, CAM_CAMDATA_REG,
-+                          0, 0);
+ #undef NEW_BOARD_LEARNING_MODE
++//#define NEW_BOARD_LEARNING_MODE 1
+ static void omap_kp_tasklet(unsigned long);
+ static void omap_kp_timer(unsigned long);
+@@ -48,6 +50,8 @@
+ static unsigned char keypad_state[8];
+ static unsigned int keypad_irq = INT_KEYBOARD;
++static int prevJoypadKeycodePressEmulated;
++
+ static struct timer_list kp_timer;
+ DECLARE_TASKLET_DISABLED(kp_tasklet, omap_kp_tasklet, 0);
+@@ -165,6 +169,47 @@
+       0
+ };
++#define _h6300_KEY_CALENDAR   67      // xmodmap 75 aka F9
++#define _H6300_KEY_TELEPHONE  68      // xmodmap 76 aka F10
++#define _H6300_KEY_HOMEPAGE   87      // xmodmap 87 aka Num_Lock
++#define _H6300_KEY_MAIL               88      // xmodmap 88 aka Scroll_Lock
++
++/*
++ * Following 5 keypad events are not really sent to userspace. 
++ * Instead if the good combination of them is sent, then that is send.
++ * (up, right, down, left, enter)
++ */
++#define       _H6300_JOYPAD_UP_RIGHT          1       // 00001
++#define _H6300_JOYPAD_DOWN_RIGHT      2       // 00010
++#define _h6300_JOYPAD_DOWN_LEFT               4       // 00100
++#define _h6300_JOYPAD_UP_LEFT         8       // 01000
++#define _H6300_JOYPAD_KEY_OK          16      // 10000
++
++static int h6300_keymap[] = {
++      KEY(2, 0, _h6300_KEY_CALENDAR),         // address button in the bottom left    
++      KEY(2, 3, _H6300_KEY_TELEPHONE),        // start call button in the bottom
++      KEY(3, 1, _H6300_KEY_HOMEPAGE),         // stop call button in the bottom
++      KEY(3, 4, _H6300_KEY_MAIL),             // messaging button in the bottom right
++
++      KEY(0, 0, KEY_VOLUMEUP),        // volume up button in the right side
++      KEY(0, 1, KEY_VOLUMEDOWN),      // volume down button in the right side
++      KEY(3, 2, KEY_RECORD),          // record button in the left side
++      
++      KEY(1, 0, _h6300_JOYPAD_UP_LEFT),       
++      KEY(1, 1, _h6300_JOYPAD_DOWN_LEFT),     
++      KEY(1, 2, _H6300_JOYPAD_KEY_OK),                
++      KEY(1, 3, _H6300_JOYPAD_DOWN_RIGHT),
++      KEY(1, 4, _H6300_JOYPAD_UP_RIGHT),      
++      
++      KEY(5, 0, KEY_RIGHT),
++      KEY(5, 1, KEY_DOWN),
++      KEY(5, 2, KEY_LEFT),            
++      KEY(5, 3, KEY_UP),
++      KEY(5, 4, KEY_ENTER),
++
++      0
++};
++
+ static int *keymap;
+ static irqreturn_t omap_kp_interrupt(int irq, void *dev_id,
+@@ -191,7 +236,8 @@
+       for (col = 0; col < 8; col++) {
+               omap_writew(~(1 << col) & 0xff, OMAP_MPUIO_BASE + OMAP_MPUIO_KBC);
+-              if (machine_is_omap_osk() || machine_is_omap_h2() || machine_is_omap_h3()) {
++              if (machine_is_omap_osk() || machine_is_omap_h2() || machine_is_omap_h3()  || machine_is_h6300()) {
++                      // makes keyboard act a little bit slower
+                       udelay(9);
+               } else {
+                       udelay(4);
+@@ -214,26 +260,34 @@
+       return -1;
+ }
++int is_key_down(unsigned char new_state[],
++              int col,
++              int row)
++{
++      return (new_state[col] & (1 << row)) ? 1 : 0;
++}
++
+ static void omap_kp_tasklet(unsigned long data)
+ {
+       unsigned char new_state[8], changed, key_down = 0;
+       int col, row;
+       int spurious = 0;
++      int report_key, report_col, report_row, joypad_checked; // joypad specific variables
+       /* check for any changes */
+       omap_kp_scan_keypad(new_state);
+-
+       /* check for changes and print those */
++      joypad_checked  = 0;
+       for (col = 0; col < 8; col++) {
+               changed = new_state[col] ^ keypad_state[col];
+               key_down |= new_state[col];
+               if (changed == 0)
+                       continue;
+-
++                      
+               for (row = 0; row < 8; row++) {
+                       int key;
+                       if (!(changed & (1 << row)))
+-                              continue;
++                              continue;                               
+ #ifdef NEW_BOARD_LEARNING_MODE
+                       printk(KERN_INFO "omap-keypad: key %d-%d %s\n", col, row, (new_state[col] & (1 << row)) ? "pressed" : "released");
+ #else
+@@ -245,9 +299,173 @@
+                               spurious = 1;
+                               continue;
+                       }
+-
+-                      input_report_key(&omap_kp_dev, key,
+-                                       new_state[col] & (1 << row));
++                      if (machine_is_h6300() && 
++                         ((col == 1) || (col == 5)))
++                      {
++                              if (col == 5)
++                              {
++                                      continue;
++                              }
++                              if ((joypad_checked == 0) &&
++                                  ((key == _H6300_JOYPAD_KEY_OK) ||
++                                   (key == _h6300_JOYPAD_UP_LEFT) ||
++                                   (key == _H6300_JOYPAD_UP_RIGHT) ||
++                                   (key == _H6300_JOYPAD_DOWN_RIGHT) ||
++                                   (key == _h6300_JOYPAD_DOWN_LEFT)))
++                              {
++                                      if (is_key_down(new_state, col, row))
++                                      {
++                                              /*
++                                               * only enter pressed
++                                               * 1 0 0 _H6300_JOYPAD_KEY_OK 0 0
++                                               * --> 100100 == 36
++                                               */
++                                               if (new_state[1] == 36)
++                                               {
++                                                      joypad_checked  = 1;
++                                                      prevJoypadKeycodePressEmulated  = KEY_ENTER;
++                                                      new_state[5]    = 48;   //110000
++                                                      report_key      = prevJoypadKeycodePressEmulated;
++                                                      report_col      = 5;
++                                                      report_row      = 4;
++                                                      input_report_key(&omap_kp_dev,
++                                                                      report_key,
++                                                                      new_state[report_col] & (1 << report_row));                                                     
++                                               }                                              
++                                              /*
++                                               * enter, up_left and up_right sensors pressed.
++                                               * 1 _H6300_JOYPAD_UP_RIGHT 0 _H6300_JOYPAD_KEY_OK 0 _h6300_JOYPAD_UP_LEFT
++                                               * --> 110101 == 53
++                                               * OR
++                                               * 1 KEY_UP_RIGHT 0 0 0 _h6300_JOYPAD_UP_LEFT
++                                               * --> 110001 == 42
++                                               * --> move to up
++                                               */
++                                              else if ((new_state[1] == 53) ||
++                                                       (new_state[1] == 49))
++                                              {
++                                                      joypad_checked  = 1;
++                                                      prevJoypadKeycodePressEmulated  = KEY_UP;
++                                                      new_state[5]    = 40;   //101000
++                                                      report_key      = prevJoypadKeycodePressEmulated;
++                                                      report_col      = 5;
++                                                      report_row      = 3;
++                                                      input_report_key(&omap_kp_dev,
++                                                                      report_key,
++                                                                      new_state[report_col] & (1 << report_row));
++                                              }
++                                              /*
++                                               * enter, down_left and down_right sensors pressed
++                                               * --> 101110 == 46
++                                               * OR
++                                               * down_left and down_right
++                                               * -->101010 == 42
++                                               * --> move to down
++                                               */
++                                              else if ((new_state[1] == 46) ||
++                                                       (new_state[1] == 42))
++                                              {
++                                                      joypad_checked  = 1;
++                                                      prevJoypadKeycodePressEmulated  = KEY_DOWN;
++                                                      new_state[5]    = 34;   //100010
++                                                      report_key      = prevJoypadKeycodePressEmulated;
++                                                      report_col      = 5;
++                                                      report_row      = 1;
++                                                      input_report_key(&omap_kp_dev,
++                                                                      report_key,
++                                                                      new_state[report_col] & (1 << report_row));
++                                              }                                                                                               
++                                              /*
++                                               * enter, up_right and down_right sensors pressed
++                                               * --> 111100 == 60
++                                               * or
++                                               * down_right and up_right
++                                               * --> 111000 == 56
++                                               * --> move to right
++                                               */
++                                              else if ((new_state[1] == 60) ||
++                                                       (new_state[1] == 56))
++                                              {
++                                                      joypad_checked  = 1;
++                                                      prevJoypadKeycodePressEmulated  = KEY_RIGHT;
++                                                      new_state[5]    = 33;   //100001
++                                                      report_key      = prevJoypadKeycodePressEmulated;
++                                                      report_col      = 5;
++                                                      report_row      = 0;
++                                                      input_report_key(&omap_kp_dev,
++                                                                      report_key,
++                                                                      new_state[report_col] & (1 << report_row));
++                                              }
++                                              /*
++                                               * enter, up_left and down_left sensors pressed
++                                               * --> 100111 == 39
++                                               * or up_left and down_left
++                                               * --> 100011 == 35
++                                               * --> move to left
++                                               */
++                                              else if ((new_state[1] == 39) ||
++                                                       (new_state[1] == 35))
++                                              {
++                                                      joypad_checked  = 1;
++                                                      prevJoypadKeycodePressEmulated  = KEY_LEFT;
++                                                      new_state[5]    = 36;   //100100
++                                                      report_key      = prevJoypadKeycodePressEmulated;
++                                                      report_col      = 5;
++                                                      report_row      = 2;
++                                                      input_report_key(&omap_kp_dev,
++                                                                      report_key,
++                                                                      new_state[report_col] & (1 << report_row));
++                                              }
++                                              else
++                                              {
++                                                      //printk("missed new_state = %d\n", new_state[1]);
++                                              }
++                                      }
++                                      else
++                                      {
++                                              if (prevJoypadKeycodePressEmulated != 0)
++                                              {
++                                                      // report key up event
++                                                      joypad_checked  = 1;
++                                                      new_state[5]    = 32;   //100000
++                                                      report_key      = prevJoypadKeycodePressEmulated;
++                                                      report_col      = 5;
++                                                      switch(prevJoypadKeycodePressEmulated)
++                                                      {
++                                                              case KEY_RIGHT:
++                                                                      report_row      = 0;
++                                                                      break;
++                                                              case KEY_DOWN:
++                                                                      report_row      = 1;
++                                                                      break;
++                                                              case KEY_LEFT:
++                                                                      report_row      = 2;
++                                                                      break;
++                                                              case KEY_UP:
++                                                                      report_row      = 3;
++                                                                      break;
++                                                              case KEY_ENTER:
++                                                                      report_row      = 4;
++                                                                      break;
++                                                              default:
++                                                                      printk(KERN_WARNING "Unknown iPAQ h6300 column 1 key = %d released. This should newer happen!\n",
++                                                                              key);
++                                                                      report_row      = 0;
++                                                      }
++                                                      input_report_key(&omap_kp_dev,
++                                                                      report_key,
++                                                                      new_state[report_col] & (1 << report_row));
++                                                      prevJoypadKeycodePressEmulated  = 0;                                                            
++                                              }
++                                      }
++                              }
++                      }
++                      else
++                      {
++                              input_report_key(&omap_kp_dev, 
++                                              key,
++                                              new_state[col] & (1 << row));
++                      }
+ #endif
+               }
+       }
+@@ -285,7 +503,12 @@
+       } else if (machine_is_omap_perseus2()) {
+               keymap = p2_keymap;
+               keypad_irq = INT_730_MPUIO_KEYPAD;
++      } else if (machine_is_h6300()) {
++              keymap = h6300_keymap;
++              // set keyboard to send repeated key events if key is hold down
++              set_bit(EV_REP, omap_kp_dev.evbit);
+       } else {
++              printk("omap_keypad.c, keyMap = test_keymap\n");
+               keymap = test_keymap;
+       }
  
-       omap_set_dma_dest_params(dmach, OMAP_DMA_PORT_EMIFF,
--                           OMAP_DMA_AMODE_POST_INC, sg_dma_address(sglist));
-+                           OMAP_DMA_AMODE_POST_INC, sg_dma_address(sglist),
-+                           0, 0);
+@@ -305,7 +528,7 @@
+       omap_kp_dev.name = "omap-keypad";
+       input_register_device(&omap_kp_dev);
  
-       omap_set_dma_transfer_params(dmach, OMAP_DMA_DATA_TYPE_S32,
-                       FIFO_TRIGGER_LVL, 
-                       sg_dma_len(sglist)/(4 * FIFO_TRIGGER_LVL), 
--                      OMAP_DMA_SYNC_FRAME);
-+                      OMAP_DMA_SYNC_FRAME,
-+                      0, 0);
-       
+-      if (machine_is_omap_h2() || machine_is_omap_h3()) {
++      if (machine_is_omap_h2() || machine_is_omap_h3() || machine_is_h6300()) {
+               omap_cfg_reg(F18_1610_KBC0);
+               omap_cfg_reg(D20_1610_KBC1);
+               omap_cfg_reg(D19_1610_KBC2);
+@@ -335,6 +558,7 @@
  
-       omap_writew(omap_readw(OMAP_DMA_CLNK_CTRL(dmach)) & ~(1<<15), 
-diff -Naur /home/lamikr/own/h6340/kernel/linux-2.6.14-rc5/drivers/mmc/omap.c bt_kernel/drivers/mmc/omap.c
---- /home/lamikr/own/h6340/kernel/linux-2.6.14-rc5/drivers/mmc/omap.c  2005-10-30 17:44:17.905014111 +0200
-+++ bt_kernel/drivers/mmc/omap.c       2005-10-30 16:32:39.609796000 +0200
-@@ -4,6 +4,7 @@
-  *  Copyright (C) 2004 Nokia Corporation
-  *  Written by Tuukka Tikkanen and Juha Yrjölä <juha.yrjola@nokia.com>
-  *  Misc hacks here and there by Tony Lindgren <tony@atomide.com>
-+ *  Other hacks (DMA, SD, etc) by David Brownell
-  *
-  * 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
-@@ -703,20 +704,24 @@
-               buf = 0x800f | ((frame - 1) << 8);
-               omap_set_dma_src_params(dma_ch, OMAP_DMA_PORT_TIPB,
-                                       OMAP_DMA_AMODE_CONSTANT,
--                                      data_addr);
-+                                      data_addr,
-+                                      0, 0);
-               omap_set_dma_dest_params(dma_ch, OMAP_DMA_PORT_EMIFF,
-                                       OMAP_DMA_AMODE_POST_INC,
--                                      sg_dma_address(sg));
-+                                      sg_dma_address(sg),
-+                                      0, 0);
-               omap_set_dma_dest_data_pack(dma_ch, 1);
-               omap_set_dma_dest_burst_mode(dma_ch, OMAP_DMA_DATA_BURST_4);
-       } else {
-               buf = 0x0f80 | ((frame - 1) << 0);
-               omap_set_dma_dest_params(dma_ch, OMAP_DMA_PORT_TIPB,
-                                       OMAP_DMA_AMODE_CONSTANT,
--                                      data_addr);
-+                                      data_addr,
-+                                      0, 0);
-               omap_set_dma_src_params(dma_ch, OMAP_DMA_PORT_EMIFF,
-                                       OMAP_DMA_AMODE_POST_INC,
--                                      sg_dma_address(sg));
-+                                      sg_dma_address(sg),
-+                                      0, 0);
-               omap_set_dma_src_data_pack(dma_ch, 1);
-               omap_set_dma_src_burst_mode(dma_ch, OMAP_DMA_DATA_BURST_4);
+               omap_writew(0xff, OMAP_MPUIO_BASE + OMAP_MPUIO_GPIO_DEBOUNCING);
        }
-@@ -727,7 +732,8 @@
++      prevJoypadKeycodePressEmulated          = 0;
  
-       OMAP_MMC_WRITE(host->base, BUF, buf);
-       omap_set_dma_transfer_params(dma_ch, OMAP_DMA_DATA_TYPE_S16,
--                      frame, count, OMAP_DMA_SYNC_FRAME);
-+                      frame, count, OMAP_DMA_SYNC_FRAME,
-+                      0, 0);
- }
+       /* scan current status and enable interrupt */
+       omap_kp_scan_keypad(keypad_state);
+diff -Naur linux-2.6.14-omap2/drivers/input/touchscreen/omap/Makefile linux-h6300-omap2-2.6.14.3/drivers/input/touchscreen/omap/Makefile
+--- linux-2.6.14-omap2/drivers/input/touchscreen/omap/Makefile 2005-12-02 01:53:33.000000000 +0200
++++ linux-h6300-omap2-2.6.14.3/drivers/input/touchscreen/omap/Makefile 2005-10-22 03:52:45.000000000 +0300
+@@ -8,5 +8,6 @@
+ objs-$(CONFIG_ARCH_OMAP16XX)$(CONFIG_MACH_OMAP_H3) += ts_hx.o
+ objs-$(CONFIG_ARCH_OMAP15XX)$(CONFIG_MACH_OMAP_INNOVATOR) += ts_inn1510.o
+ objs-$(CONFIG_ARCH_OMAP16XX)$(CONFIG_MACH_OMAP_OSK) += ts_osk.o
++objs-$(CONFIG_ARCH_OMAP15XX)$(CONFIG_MACH_OMAP_H6300) += ts_hx.o
  
- /* a scatterlist segment completed */
-@@ -767,9 +773,6 @@
+ omapts-objs := omap_ts.o $(objs-yy)
+diff -Naur linux-2.6.14-omap2/drivers/input/touchscreen/omap/omap_ts.c linux-h6300-omap2-2.6.14.3/drivers/input/touchscreen/omap/omap_ts.c
+--- linux-2.6.14-omap2/drivers/input/touchscreen/omap/omap_ts.c        2005-12-02 01:53:33.000000000 +0200
++++ linux-h6300-omap2-2.6.14.3/drivers/input/touchscreen/omap/omap_ts.c        2005-10-22 03:52:45.000000000 +0300
+@@ -46,7 +46,7 @@
+ #define OMAP_TS_NAME  "omap_ts"
  
-       host->sg_idx++;
-       if (host->sg_idx < host->sg_len) {
--              /* REVISIT we only checked the first segment
--               * for being a dma candidate ...
--               */
-               mmc_omap_prepare_dma(host, host->data);
-               omap_start_dma(host->dma_ch);
+ static struct ts_device *__initdata ts_devs[] = {
+-#if defined(CONFIG_MACH_OMAP_H2) || defined(CONFIG_MACH_OMAP_H3)
++#if defined(CONFIG_MACH_OMAP_H2) || defined(CONFIG_MACH_OMAP_H3) || defined(CONFIG_MACH_OMAP_H6300)
+       &hx_ts,
+ #endif
+ #ifdef CONFIG_MACH_OMAP_OSK
+diff -Naur linux-2.6.14-omap2/drivers/input/touchscreen/omap/ts_hx.c linux-h6300-omap2-2.6.14.3/drivers/input/touchscreen/omap/ts_hx.c
+--- linux-2.6.14-omap2/drivers/input/touchscreen/omap/ts_hx.c  2005-12-02 01:53:33.000000000 +0200
++++ linux-h6300-omap2-2.6.14.3/drivers/input/touchscreen/omap/ts_hx.c  2005-09-28 02:45:59.000000000 +0300
+@@ -33,6 +33,7 @@
+ #include <asm/arch/mux.h>
+ #include <asm/arch/hardware.h>
+ #include <asm/hardware/tsc2101.h>
++#include <linux/delay.h>
+ #include "../drivers/ssi/omap-tsc2101.h"
+ #include "omap_ts.h"
+@@ -88,14 +89,19 @@
+       } else if (machine_is_omap_h3()) {
+               gpio = H3_GPIO_NUM;
+               omap_cfg_reg(W19_1610_GPIO48);
++      } else if (machine_is_h6300 ()) {
++              gpio = 2;
++              omap_cfg_reg(M14_1510_GPIO2);   
        } else
-@@ -1089,9 +1092,10 @@
-               if (dsor > 250)
-                       dsor = 250;
-               dsor++;
--      }
+               return -ENODEV;
  
--      /* REVISIT:  if (ios->bus_width == MMC_BUS_WIDTH_4) dsor |= 1 << 15; */
-+              if (ios->bus_width == MMC_BUS_WIDTH_4)
-+                      dsor |= 1 << 15;
+       ts->irq = OMAP_GPIO_IRQ(gpio);
+-      if (omap_request_gpio(gpio) != 0) {
+-              printk(KERN_ERR "hX_ts_init.c: Could not reserve GPIO!\n");
+-              return -EINVAL;
+-      };
++      if (!machine_is_h6300 ()){
++              if (omap_request_gpio(gpio) != 0) {
++                      printk(KERN_ERR "hX_ts_init.c: Could not reserve GPIO!\n");
++                      return -EINVAL;
++              };
 +      }
  
-       switch (ios->power_mode) {
-       case MMC_POWER_OFF:
-@@ -1132,9 +1136,17 @@
-       clk_unuse(host->fclk);
+       omap_set_gpio_direction(gpio, 1);
+       set_irq_type(ts->irq, IRQT_FALLING);
+@@ -180,5 +186,7 @@
+               omap_free_gpio(H2_GPIO_NUM);
+       else if (machine_is_omap_h3())
+               omap_free_gpio(H3_GPIO_NUM);
++      else if (machine_is_h6300())
++              omap_free_gpio(2);
  }
+ #endif
+diff -Naur linux-2.6.14-omap2/drivers/isdn/hardware/eicon/os_4bri.c linux-h6300-omap2-2.6.14.3/drivers/isdn/hardware/eicon/os_4bri.c
+--- linux-2.6.14-omap2/drivers/isdn/hardware/eicon/os_4bri.c   2005-10-28 03:02:08.000000000 +0300
++++ linux-h6300-omap2-2.6.14.3/drivers/isdn/hardware/eicon/os_4bri.c   2005-12-02 01:34:35.000000000 +0200
+@@ -16,6 +16,7 @@
+ #include "diva_pci.h"
+ #include "mi_pc.h"
+ #include "dsrv4bri.h"
++#include "helpers.h"
  
-+static int mmc_omap_get_ro(struct mmc_host *mmc)
-+{
-+      struct mmc_omap_host *host = mmc_priv(mmc);
-+
-+      return host->wp_pin && omap_get_gpio_datain(host->wp_pin);
-+}
-+
- static struct mmc_host_ops mmc_omap_ops = {
-       .request        = mmc_omap_request,
-       .set_ios        = mmc_omap_set_ios,
-+      .get_ro         = mmc_omap_get_ro,
- };
- static int __init mmc_omap_probe(struct device *dev)
-@@ -1192,9 +1204,7 @@
-               goto out;
-       }
+ static void *diva_xdiLoadFileFile = NULL;
+ static dword diva_xdiLoadFileLength = 0;
+@@ -815,7 +816,7 @@
+       return (ret);
+ }
  
--      /* REVISIT:  SD-only support, when core merged
--       *  - if (minfo->wire4) mmc->caps |= MMC_CAP_4_BIT_DATA;
--       *  - mmc_omap_ops.get_ro uses wp_pin to sense slider
-+      /* REVISIT:
-        * Also, use minfo->cover to decide how to manage
-        * the card detect sensing.
-        */
-@@ -1212,6 +1222,9 @@
-       host->irq = pdev->resource[1].start;
-       host->base = (void __iomem *)pdev->resource[0].start;
+-void *xdiLoadFile(char *FileName, unsigned long *FileLength,
++void *xdiLoadFile(char *FileName, dword *FileLength,
+                 unsigned long lim)
+ {
+       void *ret = diva_xdiLoadFileFile;
+diff -Naur linux-2.6.14-omap2/drivers/mmc/mmc.c linux-h6300-omap2-2.6.14.3/drivers/mmc/mmc.c
+--- linux-2.6.14-omap2/drivers/mmc/mmc.c       2005-12-02 01:53:33.000000000 +0200
++++ linux-h6300-omap2-2.6.14.3/drivers/mmc/mmc.c       2005-11-05 00:46:08.000000000 +0200
+@@ -495,6 +495,7 @@
  
-+       if (minfo->wire4)
-+               mmc->caps |= MMC_CAP_4_BIT_DATA;
-+
-       mmc->ops = &mmc_omap_ops;
-       mmc->f_min = 400000;
-       mmc->f_max = 24000000;
-diff -Naur /home/lamikr/own/h6340/kernel/linux-2.6.14-rc5/drivers/mtd/nand/omap-hw.c bt_kernel/drivers/mtd/nand/omap-hw.c
---- /home/lamikr/own/h6340/kernel/linux-2.6.14-rc5/drivers/mtd/nand/omap-hw.c  2005-10-30 17:44:18.133977666 +0200
-+++ bt_kernel/drivers/mtd/nand/omap-hw.c       2005-10-30 16:32:39.609796000 +0200
-@@ -232,25 +232,30 @@
-       fifo_reg = NAND_BASE + NND_FIFO;
-       if (is_write) {
-               omap_set_dma_dest_params(dma_ch, OMAP_DMA_PORT_TIPB,
--                                       OMAP_DMA_AMODE_CONSTANT, fifo_reg);
-+                                       OMAP_DMA_AMODE_CONSTANT, fifo_reg,
-+                                       0, 0);
-               omap_set_dma_src_params(dma_ch, OMAP_DMA_PORT_EMIFF,
-                                       OMAP_DMA_AMODE_POST_INC,
--                                      virt_to_phys(addr));
-+                                      virt_to_phys(addr),
-+                                      0, 0);
- //            omap_set_dma_src_burst_mode(dma_ch, OMAP_DMA_DATA_BURST_4);
-               /* Set POSTWRITE bit */
-               nand_write_reg(NND_CTRL, nand_read_reg(NND_CTRL) | (1 << 16));
-       } else {
-               omap_set_dma_src_params(dma_ch, OMAP_DMA_PORT_TIPB,
--                                      OMAP_DMA_AMODE_CONSTANT, fifo_reg);
-+                                      OMAP_DMA_AMODE_CONSTANT, fifo_reg,
-+                                      0, 0);
-               omap_set_dma_dest_params(dma_ch, OMAP_DMA_PORT_EMIFF,
-                                        OMAP_DMA_AMODE_POST_INC,
--                                       virt_to_phys(addr));
-+                                       virt_to_phys(addr),
-+                                       0, 0);
- //            omap_set_dma_dest_burst_mode(dma_ch, OMAP_DMA_DATA_BURST_8);
-               /* Set PREFETCH bit */
-               nand_write_reg(NND_CTRL, nand_read_reg(NND_CTRL) | (1 << 17));
+               case 2: /* MMC v2.0 - v2.2 */
+               case 3: /* MMC v3.1 - v3.3 */
++              case 4: /* MMC v4 */
+                       card->cid.manfid        = UNSTUFF_BITS(resp, 120, 8);
+                       card->cid.oemid         = UNSTUFF_BITS(resp, 104, 16);
+                       card->cid.prod_name[0]  = UNSTUFF_BITS(resp, 96, 8);
+diff -Naur linux-2.6.14-omap2/drivers/net/wan/hdlc_cisco.c linux-h6300-omap2-2.6.14.3/drivers/net/wan/hdlc_cisco.c
+--- linux-2.6.14-omap2/drivers/net/wan/hdlc_cisco.c    2005-10-28 03:02:08.000000000 +0300
++++ linux-h6300-omap2-2.6.14.3/drivers/net/wan/hdlc_cisco.c    2005-12-02 01:34:35.000000000 +0200
+@@ -192,7 +192,9 @@
+                                              "uptime %ud%uh%um%us)\n",
+                                              dev->name, days, hrs,
+                                              min, sec);
++#if 0
+                                       netif_carrier_on(dev);
++#endif
+                                       hdlc->state.cisco.up = 1;
+                               }
+                       }
+@@ -225,7 +227,9 @@
+                      hdlc->state.cisco.settings.timeout * HZ)) {
+               hdlc->state.cisco.up = 0;
+               printk(KERN_INFO "%s: Link down\n", dev->name);
++#if 0
+               netif_carrier_off(dev);
++#endif
        }
-       omap_set_dma_transfer_params(dma_ch, OMAP_DMA_DATA_TYPE_S32, block_size / 4,
--                                   block_count, OMAP_DMA_SYNC_FRAME);
-+                                   block_count, OMAP_DMA_SYNC_FRAME,
-+                                   0, 0);
-       init_completion(&comp);
  
-       len = u32_count << 2;
-diff -Naur /home/lamikr/own/h6340/kernel/linux-2.6.14-rc5/drivers/net/irda/omap1610-ir.c bt_kernel/drivers/net/irda/omap1610-ir.c
---- /home/lamikr/own/h6340/kernel/linux-2.6.14-rc5/drivers/net/irda/omap1610-ir.c      2005-10-30 17:44:18.200967003 +0200
-+++ bt_kernel/drivers/net/irda/omap1610-ir.c   2005-10-30 16:32:39.609796000 +0200
-@@ -166,14 +166,16 @@
- static void omap1610_irda_start_rx_dma(struct omap1610_irda *si)
+       cisco_keepalive_send(dev, CISCO_KEEPALIVE_REQ,
+@@ -261,8 +265,10 @@
  {
-       /* Configure DMA */
--      omap_set_dma_src_params(si->rx_dma_channel, 0x3, 0x0, (unsigned long)UART3_RHR);
-+      omap_set_dma_src_params(si->rx_dma_channel, 0x3, 0x0, (unsigned long)UART3_RHR,
-+                              0, 0);
+       hdlc_device *hdlc = dev_to_hdlc(dev);
+       del_timer_sync(&hdlc->state.cisco.timer);
++#if 0
+       if (netif_carrier_ok(dev))
+               netif_carrier_off(dev);
++#endif
+       hdlc->state.cisco.up = 0;
+       hdlc->state.cisco.request_sent = 0;
+ }
+diff -Naur linux-2.6.14-omap2/drivers/net/wan/hdlc_fr.c linux-h6300-omap2-2.6.14.3/drivers/net/wan/hdlc_fr.c
+--- linux-2.6.14-omap2/drivers/net/wan/hdlc_fr.c       2005-10-28 03:02:08.000000000 +0300
++++ linux-h6300-omap2-2.6.14.3/drivers/net/wan/hdlc_fr.c       2005-12-02 01:34:35.000000000 +0200
+@@ -545,8 +545,10 @@
+       hdlc->state.fr.reliable = reliable;
+       if (reliable) {
++#if 0
+               if (!netif_carrier_ok(dev))
+                       netif_carrier_on(dev);
++#endif
  
-       omap_enable_dma_irq(si->rx_dma_channel, 0x01);
+               hdlc->state.fr.n391cnt = 0; /* Request full status */
+               hdlc->state.fr.dce_changed = 1;
+@@ -560,8 +562,10 @@
+                       }
+               }
+       } else {
++#if 0
+               if (netif_carrier_ok(dev))
+                       netif_carrier_off(dev);
++#endif
+               while (pvc) {           /* Deactivate all PVCs */
+                       pvc_carrier(0, pvc);
+diff -Naur linux-2.6.14-omap2/drivers/net/wan/hdlc_generic.c linux-h6300-omap2-2.6.14.3/drivers/net/wan/hdlc_generic.c
+--- linux-2.6.14-omap2/drivers/net/wan/hdlc_generic.c  2005-10-28 03:02:08.000000000 +0300
++++ linux-h6300-omap2-2.6.14.3/drivers/net/wan/hdlc_generic.c  2005-12-02 01:34:35.000000000 +0200
+@@ -79,11 +79,13 @@
+       hdlc_device *hdlc = dev_to_hdlc(dev);
+       if (hdlc->proto.start)
+               return hdlc->proto.start(dev);
++#if 0
+ #ifdef DEBUG_LINK
+       if (netif_carrier_ok(dev))
+               printk(KERN_ERR "hdlc_set_carrier_on(): already on\n");
+ #endif
+       netif_carrier_on(dev);
++#endif
+ }
  
-       omap_set_dma_dest_params(si->rx_dma_channel, 0x0, 0x1,
--                               si->rx_buf_dma_phys);
-+                               si->rx_buf_dma_phys,
-+                               0, 0);
  
--      omap_set_dma_transfer_params(si->rx_dma_channel, 0x0, 4096, 0x1, 0x0);
-+      omap_set_dma_transfer_params(si->rx_dma_channel, 0x0, 4096, 0x1, 0x0, 0, 0);
+@@ -94,11 +96,13 @@
+       if (hdlc->proto.stop)
+               return hdlc->proto.stop(dev);
  
-       omap_start_dma(si->rx_dma_channel);
++#if 0
+ #ifdef DEBUG_LINK
+       if (!netif_carrier_ok(dev))
+               printk(KERN_ERR "hdlc_set_carrier_off(): already off\n");
+ #endif
+       netif_carrier_off(dev);
++#endif
  }
-@@ -183,14 +185,16 @@
-       __ECHO_IN;
  
-       /* Configure DMA */
--      omap_set_dma_dest_params(si->tx_dma_channel, 0x03, 0x0, (unsigned long)UART3_THR);
-+      omap_set_dma_dest_params(si->tx_dma_channel, 0x03, 0x0, (unsigned long)UART3_THR,
-+                              0, 0);
  
-       omap_enable_dma_irq(si->tx_dma_channel, 0x01);
+@@ -294,8 +298,10 @@
+       if (result != 0)
+               return -EIO;
++#if 0
+       if (netif_carrier_ok(dev))
+               netif_carrier_off(dev); /* no carrier until DCD goes up */
++#endif
  
-       omap_set_dma_src_params(si->tx_dma_channel, 0x0, 0x1,
--                              si->tx_buf_dma_phys);
-+                              si->tx_buf_dma_phys,
-+                              0, 0);
+       return 0;
+ }
+diff -Naur linux-2.6.14-omap2/drivers/net/wireless/airo.c linux-h6300-omap2-2.6.14.3/drivers/net/wireless/airo.c
+--- linux-2.6.14-omap2/drivers/net/wireless/airo.c     2005-10-28 03:02:08.000000000 +0300
++++ linux-h6300-omap2-2.6.14.3/drivers/net/wireless/airo.c     2005-11-23 01:44:02.000000000 +0200
+@@ -46,6 +46,8 @@
+ #include <linux/pci.h>
+ #include <asm/uaccess.h>
  
--      omap_set_dma_transfer_params(si->tx_dma_channel, 0x0, size, 0x1, 0x0);
-+      omap_set_dma_transfer_params(si->tx_dma_channel, 0x0, size, 0x1, 0x0, 0, 0);
++#include "airo.h"
++
+ #ifdef CONFIG_PCI
+ static struct pci_device_id card_ids[] = {
+       { 0x14b9, 1, PCI_ANY_ID, PCI_ANY_ID, },
+diff -Naur linux-2.6.14-omap2/drivers/net/wireless/airo_cs.c linux-h6300-omap2-2.6.14.3/drivers/net/wireless/airo_cs.c
+--- linux-2.6.14-omap2/drivers/net/wireless/airo_cs.c  2005-10-28 03:02:08.000000000 +0300
++++ linux-h6300-omap2-2.6.14.3/drivers/net/wireless/airo_cs.c  2005-11-23 01:44:02.000000000 +0200
+@@ -42,6 +42,8 @@
+ #include <asm/io.h>
+ #include <asm/system.h>
  
-       HDBG1(1);
++#include "airo.h"
++
+ /*
+    All the PCMCIA modules use PCMCIA_DEBUG to control debugging.  If
+    you do not define PCMCIA_DEBUG at all, all the debug code will be
+@@ -78,10 +80,6 @@
+    event handler. 
+ */
  
-diff -Naur /home/lamikr/own/h6340/kernel/linux-2.6.14-rc5/drivers/net/wireless/Kconfig bt_kernel/drivers/net/wireless/Kconfig
---- /home/lamikr/own/h6340/kernel/linux-2.6.14-rc5/drivers/net/wireless/Kconfig        2005-10-20 09:23:05.000000000 +0300
-+++ bt_kernel/drivers/net/wireless/Kconfig     2005-10-22 03:52:45.687256000 +0300
+-struct net_device *init_airo_card( int, int, int, struct device * );
+-void stop_airo_card( struct net_device *, int );
+-int reset_airo_card( struct net_device * );
+-
+ static void airo_config(dev_link_t *link);
+ static void airo_release(dev_link_t *link);
+ static int airo_event(event_t event, int priority,
+diff -Naur linux-2.6.14-omap2/drivers/net/wireless/airo.h linux-h6300-omap2-2.6.14.3/drivers/net/wireless/airo.h
+--- linux-2.6.14-omap2/drivers/net/wireless/airo.h     1970-01-01 02:00:00.000000000 +0200
++++ linux-h6300-omap2-2.6.14.3/drivers/net/wireless/airo.h     2005-11-23 01:44:02.000000000 +0200
+@@ -0,0 +1,9 @@
++#ifndef _AIRO_H_
++#define _AIRO_H_
++
++struct net_device *init_airo_card(unsigned short irq, int port, int is_pcmcia,
++                                struct device *dmdev);
++int reset_airo_card(struct net_device *dev);
++void stop_airo_card(struct net_device *dev, int freeres);
++
++#endif  /*  _AIRO_H_  */
+diff -Naur linux-2.6.14-omap2/drivers/net/wireless/Kconfig linux-h6300-omap2-2.6.14.3/drivers/net/wireless/Kconfig
+--- linux-2.6.14-omap2/drivers/net/wireless/Kconfig    2005-10-28 03:02:08.000000000 +0300
++++ linux-h6300-omap2-2.6.14.3/drivers/net/wireless/Kconfig    2005-10-22 03:52:45.000000000 +0300
 @@ -483,5 +483,7 @@
        depends on NET_RADIO && (ISA || PCI || PPC_PMAC || PCMCIA)
        default y
@@ -1907,17 +3616,41 @@ diff -Naur /home/lamikr/own/h6340/kernel/linux-2.6.14-rc5/drivers/net/wireless/K
 +
  endmenu
  
-diff -Naur /home/lamikr/own/h6340/kernel/linux-2.6.14-rc5/drivers/net/wireless/Makefile bt_kernel/drivers/net/wireless/Makefile
---- /home/lamikr/own/h6340/kernel/linux-2.6.14-rc5/drivers/net/wireless/Makefile       2005-10-20 09:23:05.000000000 +0300
-+++ bt_kernel/drivers/net/wireless/Makefile    2005-10-14 18:55:31.156317000 +0300
+diff -Naur linux-2.6.14-omap2/drivers/net/wireless/Makefile linux-h6300-omap2-2.6.14.3/drivers/net/wireless/Makefile
+--- linux-2.6.14-omap2/drivers/net/wireless/Makefile   2005-10-28 03:02:08.000000000 +0300
++++ linux-h6300-omap2-2.6.14.3/drivers/net/wireless/Makefile   2005-10-14 18:55:31.000000000 +0300
 @@ -39,3 +39,4 @@
  # 16-bit wireless PCMCIA client drivers
  obj-$(CONFIG_PCMCIA_RAYCS)    += ray_cs.o
  obj-$(CONFIG_PCMCIA_WL3501)   += wl3501_cs.o
 +obj-$(CONFIG_ACX)             += tiacx/
-diff -Naur /home/lamikr/own/h6340/kernel/linux-2.6.14-rc5/drivers/net/wireless/tiacx/acx_config.h bt_kernel/drivers/net/wireless/tiacx/acx_config.h
---- /home/lamikr/own/h6340/kernel/linux-2.6.14-rc5/drivers/net/wireless/tiacx/acx_config.h     1970-01-01 02:00:00.000000000 +0200
-+++ bt_kernel/drivers/net/wireless/tiacx/acx_config.h  2005-09-28 23:54:23.938287000 +0300
+diff -Naur linux-2.6.14-omap2/drivers/net/wireless/prism54/islpci_eth.c linux-h6300-omap2-2.6.14.3/drivers/net/wireless/prism54/islpci_eth.c
+--- linux-2.6.14-omap2/drivers/net/wireless/prism54/islpci_eth.c       2005-10-28 03:02:08.000000000 +0300
++++ linux-h6300-omap2-2.6.14.3/drivers/net/wireless/prism54/islpci_eth.c       2005-11-23 01:44:02.000000000 +0200
+@@ -97,12 +97,6 @@
+       /* lock the driver code */
+       spin_lock_irqsave(&priv->slock, flags);
+-      /* determine the amount of fragments needed to store the frame */
+-
+-      frame_size = skb->len < ETH_ZLEN ? ETH_ZLEN : skb->len;
+-      if (init_wds)
+-              frame_size += 6;
+-
+       /* check whether the destination queue has enough fragments for the frame */
+       curr_frag = le32_to_cpu(cb->driver_curr_frag[ISL38XX_CB_TX_DATA_LQ]);
+       if (unlikely(curr_frag - priv->free_data_tx >= ISL38XX_CB_TX_QSIZE)) {
+@@ -213,6 +207,7 @@
+       /* store the skb address for future freeing  */
+       priv->data_low_tx[index] = skb;
+       /* set the proper fragment start address and size information */
++      frame_size = skb->len;
+       fragment->size = cpu_to_le16(frame_size);
+       fragment->flags = cpu_to_le16(0);       /* set to 1 if more fragments */
+       fragment->address = cpu_to_le32(pci_map_address);
+diff -Naur linux-2.6.14-omap2/drivers/net/wireless/tiacx/acx_config.h linux-h6300-omap2-2.6.14.3/drivers/net/wireless/tiacx/acx_config.h
+--- linux-2.6.14-omap2/drivers/net/wireless/tiacx/acx_config.h 1970-01-01 02:00:00.000000000 +0200
++++ linux-h6300-omap2-2.6.14.3/drivers/net/wireless/tiacx/acx_config.h 2005-09-28 23:54:23.000000000 +0300
 @@ -0,0 +1,44 @@
 +/* temporary hack until proper Kconfig integration */
 +#define CONFIG_ACX_PCI 1
@@ -1963,9 +3696,9 @@ diff -Naur /home/lamikr/own/h6340/kernel/linux-2.6.14-rc5/drivers/net/wireless/t
 +/* 0 - normal mode */
 +/* 1 - development/debug: probe for IEs on modprobe */
 +#define CMD_DISCOVERY 0
-diff -Naur /home/lamikr/own/h6340/kernel/linux-2.6.14-rc5/drivers/net/wireless/tiacx/acx_func.h bt_kernel/drivers/net/wireless/tiacx/acx_func.h
---- /home/lamikr/own/h6340/kernel/linux-2.6.14-rc5/drivers/net/wireless/tiacx/acx_func.h       1970-01-01 02:00:00.000000000 +0200
-+++ bt_kernel/drivers/net/wireless/tiacx/acx_func.h    2005-09-28 23:54:23.938287000 +0300
+diff -Naur linux-2.6.14-omap2/drivers/net/wireless/tiacx/acx_func.h linux-h6300-omap2-2.6.14.3/drivers/net/wireless/tiacx/acx_func.h
+--- linux-2.6.14-omap2/drivers/net/wireless/tiacx/acx_func.h   1970-01-01 02:00:00.000000000 +0200
++++ linux-h6300-omap2-2.6.14.3/drivers/net/wireless/tiacx/acx_func.h   2005-09-28 23:54:23.000000000 +0300
 @@ -0,0 +1,660 @@
 +/***********************************************************************
 +** Copyright (C) 2003  ACX100 Open Source Project
@@ -2627,9 +4360,9 @@ diff -Naur /home/lamikr/own/h6340/kernel/linux-2.6.14-rc5/drivers/net/wireless/t
 +void __exit acxpci_e_cleanup_module(void);
 +void __exit acxusb_e_cleanup_module(void);
 +#endif
-diff -Naur /home/lamikr/own/h6340/kernel/linux-2.6.14-rc5/drivers/net/wireless/tiacx/acx.h bt_kernel/drivers/net/wireless/tiacx/acx.h
---- /home/lamikr/own/h6340/kernel/linux-2.6.14-rc5/drivers/net/wireless/tiacx/acx.h    1970-01-01 02:00:00.000000000 +0200
-+++ bt_kernel/drivers/net/wireless/tiacx/acx.h 2005-09-28 23:54:23.938287000 +0300
+diff -Naur linux-2.6.14-omap2/drivers/net/wireless/tiacx/acx.h linux-h6300-omap2-2.6.14.3/drivers/net/wireless/tiacx/acx.h
+--- linux-2.6.14-omap2/drivers/net/wireless/tiacx/acx.h        1970-01-01 02:00:00.000000000 +0200
++++ linux-h6300-omap2-2.6.14.3/drivers/net/wireless/tiacx/acx.h        2005-09-28 23:54:23.000000000 +0300
 @@ -0,0 +1,6 @@
 +#include "acx_config.h"
 +#include "wlan_compat.h"
@@ -2637,9 +4370,9 @@ diff -Naur /home/lamikr/own/h6340/kernel/linux-2.6.14-rc5/drivers/net/wireless/t
 +#include "wlan_mgmt.h"
 +#include "acx_struct.h"
 +#include "acx_func.h"
-diff -Naur /home/lamikr/own/h6340/kernel/linux-2.6.14-rc5/drivers/net/wireless/tiacx/acx_struct.h bt_kernel/drivers/net/wireless/tiacx/acx_struct.h
---- /home/lamikr/own/h6340/kernel/linux-2.6.14-rc5/drivers/net/wireless/tiacx/acx_struct.h     1970-01-01 02:00:00.000000000 +0200
-+++ bt_kernel/drivers/net/wireless/tiacx/acx_struct.h  2005-10-29 22:02:44.690471000 +0300
+diff -Naur linux-2.6.14-omap2/drivers/net/wireless/tiacx/acx_struct.h linux-h6300-omap2-2.6.14.3/drivers/net/wireless/tiacx/acx_struct.h
+--- linux-2.6.14-omap2/drivers/net/wireless/tiacx/acx_struct.h 1970-01-01 02:00:00.000000000 +0200
++++ linux-h6300-omap2-2.6.14.3/drivers/net/wireless/tiacx/acx_struct.h 2005-10-29 22:02:44.000000000 +0300
 @@ -0,0 +1,1966 @@
 +/***********************************************************************
 +** Copyright (C) 2003  ACX100 Open Source Project
@@ -4607,9 +6340,9 @@ diff -Naur /home/lamikr/own/h6340/kernel/linux-2.6.14-rc5/drivers/net/wireless/t
 +extern const u8 reg_domain_ids_len;
 +
 +extern const struct iw_handler_def acx_ioctl_handler_def;
-diff -Naur /home/lamikr/own/h6340/kernel/linux-2.6.14-rc5/drivers/net/wireless/tiacx/cfi.c bt_kernel/drivers/net/wireless/tiacx/cfi.c
---- /home/lamikr/own/h6340/kernel/linux-2.6.14-rc5/drivers/net/wireless/tiacx/cfi.c    1970-01-01 02:00:00.000000000 +0200
-+++ bt_kernel/drivers/net/wireless/tiacx/cfi.c 2005-10-29 22:02:44.690471000 +0300
+diff -Naur linux-2.6.14-omap2/drivers/net/wireless/tiacx/cfi.c linux-h6300-omap2-2.6.14.3/drivers/net/wireless/tiacx/cfi.c
+--- linux-2.6.14-omap2/drivers/net/wireless/tiacx/cfi.c        1970-01-01 02:00:00.000000000 +0200
++++ linux-h6300-omap2-2.6.14.3/drivers/net/wireless/tiacx/cfi.c        2005-10-29 22:02:44.000000000 +0300
 @@ -0,0 +1,4779 @@
 +/***********************************************************************
 +** Copyright (C) 2003  ACX100 Open Source Project
@@ -9390,9 +11123,9 @@ diff -Naur /home/lamikr/own/h6340/kernel/linux-2.6.14-rc5/drivers/net/wireless/t
 +
 +      FN_EXIT0;
 +}
-diff -Naur /home/lamikr/own/h6340/kernel/linux-2.6.14-rc5/drivers/net/wireless/tiacx/common.c bt_kernel/drivers/net/wireless/tiacx/common.c
---- /home/lamikr/own/h6340/kernel/linux-2.6.14-rc5/drivers/net/wireless/tiacx/common.c 1970-01-01 02:00:00.000000000 +0200
-+++ bt_kernel/drivers/net/wireless/tiacx/common.c      2005-09-28 23:54:23.938287000 +0300
+diff -Naur linux-2.6.14-omap2/drivers/net/wireless/tiacx/common.c linux-h6300-omap2-2.6.14.3/drivers/net/wireless/tiacx/common.c
+--- linux-2.6.14-omap2/drivers/net/wireless/tiacx/common.c     1970-01-01 02:00:00.000000000 +0200
++++ linux-h6300-omap2-2.6.14.3/drivers/net/wireless/tiacx/common.c     2005-09-28 23:54:23.000000000 +0300
 @@ -0,0 +1,6590 @@
 +/***********************************************************************
 +** Copyright (C) 2003  ACX100 Open Source Project
@@ -15984,9 +17717,9 @@ diff -Naur /home/lamikr/own/h6340/kernel/linux-2.6.14-rc5/drivers/net/wireless/t
 +
 +module_init(acx_e_init_module)
 +module_exit(acx_e_cleanup_module)
-diff -Naur /home/lamikr/own/h6340/kernel/linux-2.6.14-rc5/drivers/net/wireless/tiacx/conv.c bt_kernel/drivers/net/wireless/tiacx/conv.c
---- /home/lamikr/own/h6340/kernel/linux-2.6.14-rc5/drivers/net/wireless/tiacx/conv.c   1970-01-01 02:00:00.000000000 +0200
-+++ bt_kernel/drivers/net/wireless/tiacx/conv.c        2005-09-28 23:54:23.938287000 +0300
+diff -Naur linux-2.6.14-omap2/drivers/net/wireless/tiacx/conv.c linux-h6300-omap2-2.6.14.3/drivers/net/wireless/tiacx/conv.c
+--- linux-2.6.14-omap2/drivers/net/wireless/tiacx/conv.c       1970-01-01 02:00:00.000000000 +0200
++++ linux-h6300-omap2-2.6.14.3/drivers/net/wireless/tiacx/conv.c       2005-09-28 23:54:23.000000000 +0300
 @@ -0,0 +1,508 @@
 +/***********************************************************************
 +** Copyright (C) 2003  ACX100 Open Source Project
@@ -16496,9 +18229,9 @@ diff -Naur /home/lamikr/own/h6340/kernel/linux-2.6.14-rc5/drivers/net/wireless/t
 +      FN_EXIT1((int)NULL);
 +      return NULL;
 +}
-diff -Naur /home/lamikr/own/h6340/kernel/linux-2.6.14-rc5/drivers/net/wireless/tiacx/ioctl.c bt_kernel/drivers/net/wireless/tiacx/ioctl.c
---- /home/lamikr/own/h6340/kernel/linux-2.6.14-rc5/drivers/net/wireless/tiacx/ioctl.c  1970-01-01 02:00:00.000000000 +0200
-+++ bt_kernel/drivers/net/wireless/tiacx/ioctl.c       2005-09-28 23:54:23.938287000 +0300
+diff -Naur linux-2.6.14-omap2/drivers/net/wireless/tiacx/ioctl.c linux-h6300-omap2-2.6.14.3/drivers/net/wireless/tiacx/ioctl.c
+--- linux-2.6.14-omap2/drivers/net/wireless/tiacx/ioctl.c      1970-01-01 02:00:00.000000000 +0200
++++ linux-h6300-omap2-2.6.14.3/drivers/net/wireless/tiacx/ioctl.c      2005-09-28 23:54:23.000000000 +0300
 @@ -0,0 +1,3060 @@
 +/***********************************************************************
 +** Copyright (C) 2003  ACX100 Open Source Project
@@ -19560,9 +21293,9 @@ diff -Naur /home/lamikr/own/h6340/kernel/linux-2.6.14-rc5/drivers/net/wireless/t
 +      return result;
 +}
 +#endif /* WE < 13 */
-diff -Naur /home/lamikr/own/h6340/kernel/linux-2.6.14-rc5/drivers/net/wireless/tiacx/Kconfig bt_kernel/drivers/net/wireless/tiacx/Kconfig
---- /home/lamikr/own/h6340/kernel/linux-2.6.14-rc5/drivers/net/wireless/tiacx/Kconfig  1970-01-01 02:00:00.000000000 +0200
-+++ bt_kernel/drivers/net/wireless/tiacx/Kconfig       2005-09-28 23:54:23.938287000 +0300
+diff -Naur linux-2.6.14-omap2/drivers/net/wireless/tiacx/Kconfig linux-h6300-omap2-2.6.14.3/drivers/net/wireless/tiacx/Kconfig
+--- linux-2.6.14-omap2/drivers/net/wireless/tiacx/Kconfig      1970-01-01 02:00:00.000000000 +0200
++++ linux-h6300-omap2-2.6.14.3/drivers/net/wireless/tiacx/Kconfig      2005-09-28 23:54:23.000000000 +0300
 @@ -0,0 +1,59 @@
 +config ACX
 +      tristate "TI acx100/acx111 802.11b/g wireless chipsets"
@@ -19623,9 +21356,9 @@ diff -Naur /home/lamikr/own/h6340/kernel/linux-2.6.14-rc5/drivers/net/wireless/t
 +      depends on  ACX
 +      ---help---
 +      Include Compact Flash support.
-diff -Naur /home/lamikr/own/h6340/kernel/linux-2.6.14-rc5/drivers/net/wireless/tiacx/macros.h bt_kernel/drivers/net/wireless/tiacx/macros.h
---- /home/lamikr/own/h6340/kernel/linux-2.6.14-rc5/drivers/net/wireless/tiacx/macros.h 1970-01-01 02:00:00.000000000 +0200
-+++ bt_kernel/drivers/net/wireless/tiacx/macros.h      2005-09-28 23:54:23.938287000 +0300
+diff -Naur linux-2.6.14-omap2/drivers/net/wireless/tiacx/macros.h linux-h6300-omap2-2.6.14.3/drivers/net/wireless/tiacx/macros.h
+--- linux-2.6.14-omap2/drivers/net/wireless/tiacx/macros.h     1970-01-01 02:00:00.000000000 +0200
++++ linux-h6300-omap2-2.6.14.3/drivers/net/wireless/tiacx/macros.h     2005-09-28 23:54:23.000000000 +0300
 @@ -0,0 +1,33 @@
 +#ifndef _MACROS_H
 +#define _MACROS_H
@@ -19660,9 +21393,9 @@ diff -Naur /home/lamikr/own/h6340/kernel/linux-2.6.14-rc5/drivers/net/wireless/t
 +}
 +
 +#endif
-diff -Naur /home/lamikr/own/h6340/kernel/linux-2.6.14-rc5/drivers/net/wireless/tiacx/Makefile bt_kernel/drivers/net/wireless/tiacx/Makefile
---- /home/lamikr/own/h6340/kernel/linux-2.6.14-rc5/drivers/net/wireless/tiacx/Makefile 1970-01-01 02:00:00.000000000 +0200
-+++ bt_kernel/drivers/net/wireless/tiacx/Makefile      2005-09-28 23:54:23.938287000 +0300
+diff -Naur linux-2.6.14-omap2/drivers/net/wireless/tiacx/Makefile linux-h6300-omap2-2.6.14.3/drivers/net/wireless/tiacx/Makefile
+--- linux-2.6.14-omap2/drivers/net/wireless/tiacx/Makefile     1970-01-01 02:00:00.000000000 +0200
++++ linux-h6300-omap2-2.6.14.3/drivers/net/wireless/tiacx/Makefile     2005-09-28 23:54:23.000000000 +0300
 @@ -0,0 +1,9 @@
 +#Use this if you have proper Kconfig integration:
 +
@@ -19673,9 +21406,9 @@ diff -Naur /home/lamikr/own/h6340/kernel/linux-2.6.14-rc5/drivers/net/wireless/t
 +acx-obj-$(CONFIG_ACX_CFI) += cfi.o
 +
 +acx-objs := wlan.o conv.o ioctl.o common.o $(acx-obj-y)
-diff -Naur /home/lamikr/own/h6340/kernel/linux-2.6.14-rc5/drivers/net/wireless/tiacx/pci.c bt_kernel/drivers/net/wireless/tiacx/pci.c
---- /home/lamikr/own/h6340/kernel/linux-2.6.14-rc5/drivers/net/wireless/tiacx/pci.c    1970-01-01 02:00:00.000000000 +0200
-+++ bt_kernel/drivers/net/wireless/tiacx/pci.c 2005-09-28 23:54:23.938287000 +0300
+diff -Naur linux-2.6.14-omap2/drivers/net/wireless/tiacx/pci.c linux-h6300-omap2-2.6.14.3/drivers/net/wireless/tiacx/pci.c
+--- linux-2.6.14-omap2/drivers/net/wireless/tiacx/pci.c        1970-01-01 02:00:00.000000000 +0200
++++ linux-h6300-omap2-2.6.14.3/drivers/net/wireless/tiacx/pci.c        2005-09-28 23:54:23.000000000 +0300
 @@ -0,0 +1,4840 @@
 +/***********************************************************************
 +** Copyright (C) 2003  ACX100 Open Source Project
@@ -24517,9 +26250,9 @@ diff -Naur /home/lamikr/own/h6340/kernel/linux-2.6.14-rc5/drivers/net/wireless/t
 +
 +      FN_EXIT0;
 +}
-diff -Naur /home/lamikr/own/h6340/kernel/linux-2.6.14-rc5/drivers/net/wireless/tiacx/setrate.c bt_kernel/drivers/net/wireless/tiacx/setrate.c
---- /home/lamikr/own/h6340/kernel/linux-2.6.14-rc5/drivers/net/wireless/tiacx/setrate.c        1970-01-01 02:00:00.000000000 +0200
-+++ bt_kernel/drivers/net/wireless/tiacx/setrate.c     2005-09-28 23:54:23.938287000 +0300
+diff -Naur linux-2.6.14-omap2/drivers/net/wireless/tiacx/setrate.c linux-h6300-omap2-2.6.14.3/drivers/net/wireless/tiacx/setrate.c
+--- linux-2.6.14-omap2/drivers/net/wireless/tiacx/setrate.c    1970-01-01 02:00:00.000000000 +0200
++++ linux-h6300-omap2-2.6.14.3/drivers/net/wireless/tiacx/setrate.c    2005-09-28 23:54:23.000000000 +0300
 @@ -0,0 +1,213 @@
 +/* TODO: stop #including, move into wireless.c
 + * until then, keep in sync copies in prism54/ and acx/ dirs
@@ -24734,9 +26467,9 @@ diff -Naur /home/lamikr/own/h6340/kernel/linux-2.6.14-rc5/drivers/net/wireless/t
 +              return -EINVAL;
 +      return 0;
 +}
-diff -Naur /home/lamikr/own/h6340/kernel/linux-2.6.14-rc5/drivers/net/wireless/tiacx/usb.c bt_kernel/drivers/net/wireless/tiacx/usb.c
---- /home/lamikr/own/h6340/kernel/linux-2.6.14-rc5/drivers/net/wireless/tiacx/usb.c    1970-01-01 02:00:00.000000000 +0200
-+++ bt_kernel/drivers/net/wireless/tiacx/usb.c 2005-09-28 23:54:23.938287000 +0300
+diff -Naur linux-2.6.14-omap2/drivers/net/wireless/tiacx/usb.c linux-h6300-omap2-2.6.14.3/drivers/net/wireless/tiacx/usb.c
+--- linux-2.6.14-omap2/drivers/net/wireless/tiacx/usb.c        1970-01-01 02:00:00.000000000 +0200
++++ linux-h6300-omap2-2.6.14.3/drivers/net/wireless/tiacx/usb.c        2005-09-28 23:54:23.000000000 +0300
 @@ -0,0 +1,1700 @@
 +/***********************************************************************
 +** Copyright (C) 2003  ACX100 Open Source Project
@@ -26438,9 +28171,9 @@ diff -Naur /home/lamikr/own/h6340/kernel/linux-2.6.14-rc5/drivers/net/wireless/t
 +#endif /* UNUSED */
 +
 +#endif /* ACX_DEBUG */
-diff -Naur /home/lamikr/own/h6340/kernel/linux-2.6.14-rc5/drivers/net/wireless/tiacx/wlan.c bt_kernel/drivers/net/wireless/tiacx/wlan.c
---- /home/lamikr/own/h6340/kernel/linux-2.6.14-rc5/drivers/net/wireless/tiacx/wlan.c   1970-01-01 02:00:00.000000000 +0200
-+++ bt_kernel/drivers/net/wireless/tiacx/wlan.c        2005-09-28 23:54:23.938287000 +0300
+diff -Naur linux-2.6.14-omap2/drivers/net/wireless/tiacx/wlan.c linux-h6300-omap2-2.6.14.3/drivers/net/wireless/tiacx/wlan.c
+--- linux-2.6.14-omap2/drivers/net/wireless/tiacx/wlan.c       1970-01-01 02:00:00.000000000 +0200
++++ linux-h6300-omap2-2.6.14.3/drivers/net/wireless/tiacx/wlan.c       2005-09-28 23:54:23.000000000 +0300
 @@ -0,0 +1,392 @@
 +/***********************************************************************
 +** Copyright (C) 2003  ACX100 Open Source Project
@@ -26834,9 +28567,9 @@ diff -Naur /home/lamikr/own/h6340/kernel/linux-2.6.14-rc5/drivers/net/wireless/t
 +
 +      /*-- Information elements */
 +}
-diff -Naur /home/lamikr/own/h6340/kernel/linux-2.6.14-rc5/drivers/net/wireless/tiacx/wlan_compat.h bt_kernel/drivers/net/wireless/tiacx/wlan_compat.h
---- /home/lamikr/own/h6340/kernel/linux-2.6.14-rc5/drivers/net/wireless/tiacx/wlan_compat.h    1970-01-01 02:00:00.000000000 +0200
-+++ bt_kernel/drivers/net/wireless/tiacx/wlan_compat.h 2005-09-28 23:54:23.938287000 +0300
+diff -Naur linux-2.6.14-omap2/drivers/net/wireless/tiacx/wlan_compat.h linux-h6300-omap2-2.6.14.3/drivers/net/wireless/tiacx/wlan_compat.h
+--- linux-2.6.14-omap2/drivers/net/wireless/tiacx/wlan_compat.h        1970-01-01 02:00:00.000000000 +0200
++++ linux-h6300-omap2-2.6.14.3/drivers/net/wireless/tiacx/wlan_compat.h        2005-09-28 23:54:23.000000000 +0300
 @@ -0,0 +1,297 @@
 +/***********************************************************************
 +** Copyright (C) 2003  ACX100 Open Source Project
@@ -27135,9 +28868,9 @@ diff -Naur /home/lamikr/own/h6340/kernel/linux-2.6.14-rc5/drivers/net/wireless/t
 +      u8      oui[WLAN_IEEE_OUI_LEN] __WLAN_ATTRIB_PACK__;
 +      u16     type __WLAN_ATTRIB_PACK__;
 +} wlan_snap_t;
-diff -Naur /home/lamikr/own/h6340/kernel/linux-2.6.14-rc5/drivers/net/wireless/tiacx/wlan_hdr.h bt_kernel/drivers/net/wireless/tiacx/wlan_hdr.h
---- /home/lamikr/own/h6340/kernel/linux-2.6.14-rc5/drivers/net/wireless/tiacx/wlan_hdr.h       1970-01-01 02:00:00.000000000 +0200
-+++ bt_kernel/drivers/net/wireless/tiacx/wlan_hdr.h    2005-09-28 23:54:23.938287000 +0300
+diff -Naur linux-2.6.14-omap2/drivers/net/wireless/tiacx/wlan_hdr.h linux-h6300-omap2-2.6.14.3/drivers/net/wireless/tiacx/wlan_hdr.h
+--- linux-2.6.14-omap2/drivers/net/wireless/tiacx/wlan_hdr.h   1970-01-01 02:00:00.000000000 +0200
++++ linux-h6300-omap2-2.6.14.3/drivers/net/wireless/tiacx/wlan_hdr.h   2005-09-28 23:54:23.000000000 +0300
 @@ -0,0 +1,497 @@
 +/***********************************************************************
 +** Copyright (C) 2003  ACX100 Open Source Project
@@ -27636,9 +29369,9 @@ diff -Naur /home/lamikr/own/h6340/kernel/linux-2.6.14-rc5/drivers/net/wireless/t
 +#define WLANSNIFFFRM_rate     0x8041
 +#define WLANSNIFFFRM_istx     0x9041
 +#define WLANSNIFFFRM_frmlen   0xA041
-diff -Naur /home/lamikr/own/h6340/kernel/linux-2.6.14-rc5/drivers/net/wireless/tiacx/wlan_mgmt.h bt_kernel/drivers/net/wireless/tiacx/wlan_mgmt.h
---- /home/lamikr/own/h6340/kernel/linux-2.6.14-rc5/drivers/net/wireless/tiacx/wlan_mgmt.h      1970-01-01 02:00:00.000000000 +0200
-+++ bt_kernel/drivers/net/wireless/tiacx/wlan_mgmt.h   2005-09-28 23:54:23.938287000 +0300
+diff -Naur linux-2.6.14-omap2/drivers/net/wireless/tiacx/wlan_mgmt.h linux-h6300-omap2-2.6.14.3/drivers/net/wireless/tiacx/wlan_mgmt.h
+--- linux-2.6.14-omap2/drivers/net/wireless/tiacx/wlan_mgmt.h  1970-01-01 02:00:00.000000000 +0200
++++ linux-h6300-omap2-2.6.14.3/drivers/net/wireless/tiacx/wlan_mgmt.h  2005-09-28 23:54:23.000000000 +0300
 @@ -0,0 +1,579 @@
 +/***********************************************************************
 +** Copyright (C) 2003  ACX100 Open Source Project
@@ -28219,17 +29952,9 @@ diff -Naur /home/lamikr/own/h6340/kernel/linux-2.6.14-rc5/drivers/net/wireless/t
 +              ie->virt_bm[0] = 0;
 +      return p + len + 3 + 2;
 +}
-diff -Naur /home/lamikr/own/h6340/kernel/linux-2.6.14-rc5/drivers/pci/.gitignore bt_kernel/drivers/pci/.gitignore
---- /home/lamikr/own/h6340/kernel/linux-2.6.14-rc5/drivers/pci/.gitignore      2005-10-20 09:23:05.000000000 +0300
-+++ bt_kernel/drivers/pci/.gitignore   1970-01-01 02:00:00.000000000 +0200
-@@ -1,4 +0,0 @@
--classlist.h
--devlist.h
--gen-devlist
--
-diff -Naur /home/lamikr/own/h6340/kernel/linux-2.6.14-rc5/drivers/ssi/omap-tsc2101.c bt_kernel/drivers/ssi/omap-tsc2101.c
---- /home/lamikr/own/h6340/kernel/linux-2.6.14-rc5/drivers/ssi/omap-tsc2101.c  2005-10-30 17:44:18.415932786 +0200
-+++ bt_kernel/drivers/ssi/omap-tsc2101.c       2005-10-22 03:52:45.687256000 +0300
+diff -Naur linux-2.6.14-omap2/drivers/ssi/omap-tsc2101.c linux-h6300-omap2-2.6.14.3/drivers/ssi/omap-tsc2101.c
+--- linux-2.6.14-omap2/drivers/ssi/omap-tsc2101.c      2005-12-02 01:53:33.000000000 +0200
++++ linux-h6300-omap2-2.6.14.3/drivers/ssi/omap-tsc2101.c      2005-10-22 03:52:45.000000000 +0300
 @@ -36,10 +36,11 @@
  #include <asm/arch/hardware.h>
  #include <asm/hardware/tsc2101.h>
@@ -28407,9 +30132,9 @@ diff -Naur /home/lamikr/own/h6340/kernel/linux-2.6.14-rc5/drivers/ssi/omap-tsc21
 -    ("Glue audio driver for the TI OMAP1610/OMAP1710 TSC2101 codec.");
 +    ("Glue audio driver for the TI OMAP1510/1610/OMAP1710 TSC2101 codec.");
  MODULE_LICENSE("GPL");
-diff -Naur /home/lamikr/own/h6340/kernel/linux-2.6.14-rc5/drivers/ssi/omap-uwire.c bt_kernel/drivers/ssi/omap-uwire.c
---- /home/lamikr/own/h6340/kernel/linux-2.6.14-rc5/drivers/ssi/omap-uwire.c    2005-10-30 17:44:18.435929603 +0200
-+++ bt_kernel/drivers/ssi/omap-uwire.c 2005-08-12 13:46:22.016114000 +0300
+diff -Naur linux-2.6.14-omap2/drivers/ssi/omap-uwire.c linux-h6300-omap2-2.6.14.3/drivers/ssi/omap-uwire.c
+--- linux-2.6.14-omap2/drivers/ssi/omap-uwire.c        2005-12-02 01:53:33.000000000 +0200
++++ linux-h6300-omap2-2.6.14.3/drivers/ssi/omap-uwire.c        2005-08-12 13:46:22.000000000 +0300
 @@ -212,6 +212,10 @@
                omap_cfg_reg(N14_1610_UWIRE_CS0);
                omap_cfg_reg(P15_1610_UWIRE_CS3);
@@ -28421,9 +30146,9 @@ diff -Naur /home/lamikr/own/h6340/kernel/linux-2.6.14-rc5/drivers/ssi/omap-uwire
        if (machine_is_omap_perseus2()) {
                /* configure pins: MPU_UW_nSCS1, MPU_UW_SDO, MPU_UW_SCLK */
                int val = omap_readl(OMAP730_IO_CONF_9) & ~0x00EEE000;
-diff -Naur /home/lamikr/own/h6340/kernel/linux-2.6.14-rc5/drivers/telephony/Kconfig bt_kernel/drivers/telephony/Kconfig
---- /home/lamikr/own/h6340/kernel/linux-2.6.14-rc5/drivers/telephony/Kconfig   2005-10-20 09:23:05.000000000 +0300
-+++ bt_kernel/drivers/telephony/Kconfig        2005-10-06 02:34:39.057478000 +0300
+diff -Naur linux-2.6.14-omap2/drivers/telephony/Kconfig linux-h6300-omap2-2.6.14.3/drivers/telephony/Kconfig
+--- linux-2.6.14-omap2/drivers/telephony/Kconfig       2005-10-28 03:02:08.000000000 +0300
++++ linux-h6300-omap2-2.6.14.3/drivers/telephony/Kconfig       2005-10-06 02:34:39.000000000 +0300
 @@ -41,7 +41,18 @@
        help
          Say Y here to configure in PCMCIA service support for the Quicknet
@@ -28444,9 +30169,9 @@ diff -Naur /home/lamikr/own/h6340/kernel/linux-2.6.14-rc5/drivers/telephony/Kcon
  
  endmenu
  
-diff -Naur /home/lamikr/own/h6340/kernel/linux-2.6.14-rc5/drivers/telephony/Makefile bt_kernel/drivers/telephony/Makefile
---- /home/lamikr/own/h6340/kernel/linux-2.6.14-rc5/drivers/telephony/Makefile  2005-10-20 09:23:05.000000000 +0300
-+++ bt_kernel/drivers/telephony/Makefile       2005-10-06 02:34:39.057478000 +0300
+diff -Naur linux-2.6.14-omap2/drivers/telephony/Makefile linux-h6300-omap2-2.6.14.3/drivers/telephony/Makefile
+--- linux-2.6.14-omap2/drivers/telephony/Makefile      2005-10-28 03:02:08.000000000 +0300
++++ linux-h6300-omap2-2.6.14.3/drivers/telephony/Makefile      2005-10-06 02:34:39.000000000 +0300
 @@ -2,6 +2,7 @@
  # Makefile for drivers/telephony
  #
@@ -28458,9 +30183,9 @@ diff -Naur /home/lamikr/own/h6340/kernel/linux-2.6.14-rc5/drivers/telephony/Make
 +obj-$(CONFIG_PHONE_IXJ)                       += ixj.o
 +obj-$(CONFIG_PHONE_IXJ_PCMCIA)        += ixj_pcmcia.o
 +obj-$(CONFIG_GSM_H6300)                       += omap/
-diff -Naur /home/lamikr/own/h6340/kernel/linux-2.6.14-rc5/drivers/telephony/omap/h6300_gsm_led.c bt_kernel/drivers/telephony/omap/h6300_gsm_led.c
---- /home/lamikr/own/h6340/kernel/linux-2.6.14-rc5/drivers/telephony/omap/h6300_gsm_led.c      1970-01-01 02:00:00.000000000 +0200
-+++ bt_kernel/drivers/telephony/omap/h6300_gsm_led.c   2005-10-06 02:34:39.057478000 +0300
+diff -Naur linux-2.6.14-omap2/drivers/telephony/omap/h6300_gsm_led.c linux-h6300-omap2-2.6.14.3/drivers/telephony/omap/h6300_gsm_led.c
+--- linux-2.6.14-omap2/drivers/telephony/omap/h6300_gsm_led.c  1970-01-01 02:00:00.000000000 +0200
++++ linux-h6300-omap2-2.6.14.3/drivers/telephony/omap/h6300_gsm_led.c  2005-10-06 02:34:39.000000000 +0300
 @@ -0,0 +1,40 @@
 +/* 
 + * GSM interface driver helper for controlling bluetooth leds available in iPAQ h6300.
@@ -28502,9 +30227,9 @@ diff -Naur /home/lamikr/own/h6340/kernel/linux-2.6.14-rc5/drivers/telephony/omap
 +      printk(KERN_NOTICE "h6300_gsm_led.c h6300_set_gsm_led() done\n");
 +}
 +EXPORT_SYMBOL(h6300_set_gsm_led);
-diff -Naur /home/lamikr/own/h6340/kernel/linux-2.6.14-rc5/drivers/telephony/omap/h6300_gsm_led.h bt_kernel/drivers/telephony/omap/h6300_gsm_led.h
---- /home/lamikr/own/h6340/kernel/linux-2.6.14-rc5/drivers/telephony/omap/h6300_gsm_led.h      1970-01-01 02:00:00.000000000 +0200
-+++ bt_kernel/drivers/telephony/omap/h6300_gsm_led.h   2005-10-06 02:34:39.057478000 +0300
+diff -Naur linux-2.6.14-omap2/drivers/telephony/omap/h6300_gsm_led.h linux-h6300-omap2-2.6.14.3/drivers/telephony/omap/h6300_gsm_led.h
+--- linux-2.6.14-omap2/drivers/telephony/omap/h6300_gsm_led.h  1970-01-01 02:00:00.000000000 +0200
++++ linux-h6300-omap2-2.6.14.3/drivers/telephony/omap/h6300_gsm_led.h  2005-10-06 02:34:39.000000000 +0300
 @@ -0,0 +1,10 @@
 +#ifndef H6300_GSM_LED_H_
 +#define H6300_GSM_LED_H_
@@ -28516,9 +30241,9 @@ diff -Naur /home/lamikr/own/h6340/kernel/linux-2.6.14-rc5/drivers/telephony/omap
 +
 +
 +#endif /*H6300_GSM_LED_H_*/
-diff -Naur /home/lamikr/own/h6340/kernel/linux-2.6.14-rc5/drivers/telephony/omap/h6300_gsm_p5186.c bt_kernel/drivers/telephony/omap/h6300_gsm_p5186.c
---- /home/lamikr/own/h6340/kernel/linux-2.6.14-rc5/drivers/telephony/omap/h6300_gsm_p5186.c    1970-01-01 02:00:00.000000000 +0200
-+++ bt_kernel/drivers/telephony/omap/h6300_gsm_p5186.c 2005-10-20 20:57:07.074687000 +0300
+diff -Naur linux-2.6.14-omap2/drivers/telephony/omap/h6300_gsm_p5186.c linux-h6300-omap2-2.6.14.3/drivers/telephony/omap/h6300_gsm_p5186.c
+--- linux-2.6.14-omap2/drivers/telephony/omap/h6300_gsm_p5186.c        1970-01-01 02:00:00.000000000 +0200
++++ linux-h6300-omap2-2.6.14.3/drivers/telephony/omap/h6300_gsm_p5186.c        2005-10-20 20:57:07.000000000 +0300
 @@ -0,0 +1,171 @@
 +/* 
 + * Wavecom P5186 GPRS and GSM module driver for iPAQ h6300.
@@ -28691,9 +30416,9 @@ diff -Naur /home/lamikr/own/h6340/kernel/linux-2.6.14-rc5/drivers/telephony/omap
 +MODULE_DESCRIPTION("iPAQ h6300 Wavecom P5186 GPRS and GSM module driver.");
 +MODULE_LICENSE("GPL");
 +
-diff -Naur /home/lamikr/own/h6340/kernel/linux-2.6.14-rc5/drivers/telephony/omap/Makefile bt_kernel/drivers/telephony/omap/Makefile
---- /home/lamikr/own/h6340/kernel/linux-2.6.14-rc5/drivers/telephony/omap/Makefile     1970-01-01 02:00:00.000000000 +0200
-+++ bt_kernel/drivers/telephony/omap/Makefile  2005-10-06 02:34:39.057478000 +0300
+diff -Naur linux-2.6.14-omap2/drivers/telephony/omap/Makefile linux-h6300-omap2-2.6.14.3/drivers/telephony/omap/Makefile
+--- linux-2.6.14-omap2/drivers/telephony/omap/Makefile 1970-01-01 02:00:00.000000000 +0200
++++ linux-h6300-omap2-2.6.14.3/drivers/telephony/omap/Makefile 2005-10-06 02:34:39.000000000 +0300
 @@ -0,0 +1,6 @@
 +#
 +# Makefile for the Linux iPAQ H6300 BRF6100 Bluetooth device drivers.
@@ -28701,83 +30426,155 @@ diff -Naur /home/lamikr/own/h6340/kernel/linux-2.6.14-rc5/drivers/telephony/omap
 +
 +h6300_gsm-objs                        := h6300_gsm_led.o h6300_gsm_p5186.o
 +obj-$(CONFIG_GSM_H6300)       += h6300_gsm.o
-diff -Naur /home/lamikr/own/h6340/kernel/linux-2.6.14-rc5/drivers/usb/gadget/omap_udc.c bt_kernel/drivers/usb/gadget/omap_udc.c
---- /home/lamikr/own/h6340/kernel/linux-2.6.14-rc5/drivers/usb/gadget/omap_udc.c       2005-10-30 17:44:18.495920054 +0200
-+++ bt_kernel/drivers/usb/gadget/omap_udc.c    2005-10-30 16:32:39.609796000 +0200
-@@ -622,17 +622,24 @@
-                       || (cpu_is_omap15xx() && length < ep->maxpacket)) {
-               txdma_ctrl = UDC_TXN_EOT | length;
-               omap_set_dma_transfer_params(ep->lch, OMAP_DMA_DATA_TYPE_S8,
--                              length, 1, sync_mode);
-+                              length, 1, sync_mode, 0, 0);
-       } else {
-               length = min(length / ep->maxpacket,
-                               (unsigned) UDC_TXN_TSC + 1);
-               txdma_ctrl = length;
--              omap_set_dma_transfer_params(ep->lch, OMAP_DMA_DATA_TYPE_S16,
--                              ep->ep.maxpacket >> 1, length, sync_mode);
-+              if (machine_is_h6300())
-+                      omap_set_dma_transfer_params(ep->lch, OMAP_DMA_DATA_TYPE_S8,
-+                                      ep->ep.maxpacket, length, sync_mode,
-+                                      0, 0);
-+              else
-+                      omap_set_dma_transfer_params(ep->lch, OMAP_DMA_DATA_TYPE_S16,
-+                                      ep->ep.maxpacket >> 1, length, sync_mode,
-+                                      0, 0);
-               length *= ep->maxpacket;
-       }
-       omap_set_dma_src_params(ep->lch, OMAP_DMA_PORT_EMIFF,
--              OMAP_DMA_AMODE_POST_INC, req->req.dma + req->req.actual);
-+              OMAP_DMA_AMODE_POST_INC, req->req.dma + req->req.actual,
-+              0, 0);
+diff -Naur linux-2.6.14-omap2/drivers/usb/core/sysfs.c linux-h6300-omap2-2.6.14.3/drivers/usb/core/sysfs.c
+--- linux-2.6.14-omap2/drivers/usb/core/sysfs.c        2005-10-28 03:02:08.000000000 +0300
++++ linux-h6300-omap2-2.6.14.3/drivers/usb/core/sysfs.c        2005-11-23 01:44:02.000000000 +0200
+@@ -292,30 +292,23 @@
+ {
+       struct usb_interface *intf;
+       struct usb_device *udev;
+-      int len;
++      struct usb_host_interface *alt;
  
-       omap_start_dma(ep->lch);
-       ep->dma_counter = dma_csac(ep->lch);
-@@ -675,11 +682,19 @@
-       packets = (req->req.length - req->req.actual) / ep->ep.maxpacket;
-       packets = min(packets, (unsigned)UDC_RXN_TC + 1);
-       req->dma_bytes = packets * ep->ep.maxpacket;
--      omap_set_dma_transfer_params(ep->lch, OMAP_DMA_DATA_TYPE_S16,
--                      ep->ep.maxpacket >> 1, packets,
--                      OMAP_DMA_SYNC_ELEMENT);
-+      if (machine_is_h6300())
-+              omap_set_dma_transfer_params(ep->lch, OMAP_DMA_DATA_TYPE_S8,
-+                              ep->ep.maxpacket, packets,
-+                              OMAP_DMA_SYNC_ELEMENT,
-+                              0, 0);
-+      else
-+              omap_set_dma_transfer_params(ep->lch, OMAP_DMA_DATA_TYPE_S16,
-+                              ep->ep.maxpacket >> 1, packets,
-+                              OMAP_DMA_SYNC_ELEMENT,
-+                              0, 0);
-       omap_set_dma_dest_params(ep->lch, OMAP_DMA_PORT_EMIFF,
--              OMAP_DMA_AMODE_POST_INC, req->req.dma + req->req.actual);
-+              OMAP_DMA_AMODE_POST_INC, req->req.dma + req->req.actual,
-+              0, 0);
-       ep->dma_counter = DMA_DEST_LAST(ep->lch);
+       intf = to_usb_interface(dev);
+       udev = interface_to_usbdev(intf);
++      alt = intf->cur_altsetting;
  
-       UDC_RXDMA_REG(ep->dma_channel) = UDC_RXN_STOP | (packets - 1);
-@@ -822,7 +837,8 @@
-                       omap_set_dma_dest_params(ep->lch,
-                               OMAP_DMA_PORT_TIPB,
-                               OMAP_DMA_AMODE_CONSTANT,
--                              (unsigned long) io_v2p((u32)&UDC_DATA_DMA_REG));
-+                              (unsigned long) io_v2p((u32)&UDC_DATA_DMA_REG),
-+                              0, 0);
-               }
-       } else {
-               status = omap_request_dma(OMAP_DMA_USB_W2FC_RX0 - 1 + channel,
-@@ -833,7 +849,8 @@
-                       omap_set_dma_src_params(ep->lch,
-                               OMAP_DMA_PORT_TIPB,
-                               OMAP_DMA_AMODE_CONSTANT,
--                              (unsigned long) io_v2p((u32)&UDC_DATA_DMA_REG));
-+                              (unsigned long) io_v2p((u32)&UDC_DATA_DMA_REG),
-+                              0, 0);
-                       /* EMIFF */
-                       omap_set_dma_dest_burst_mode(ep->lch,
-                                               OMAP_DMA_DATA_BURST_4);
-@@ -2103,7 +2120,7 @@
+-      len = sprintf(buf, "usb:v%04Xp%04Xd%04Xdc%02Xdsc%02Xdp%02Xic",
+-                             le16_to_cpu(udev->descriptor.idVendor),
+-                             le16_to_cpu(udev->descriptor.idProduct),
+-                             le16_to_cpu(udev->descriptor.bcdDevice),
+-                             udev->descriptor.bDeviceClass,
+-                             udev->descriptor.bDeviceSubClass,
+-                             udev->descriptor.bDeviceProtocol);
+-      buf += len;
+-
+-      if (udev->descriptor.bDeviceClass == 0) {
+-              struct usb_host_interface *alt = intf->cur_altsetting;
+-
+-              return len + sprintf(buf, "%02Xisc%02Xip%02X\n",
+-                             alt->desc.bInterfaceClass,
+-                             alt->desc.bInterfaceSubClass,
+-                             alt->desc.bInterfaceProtocol);
+-      } else {
+-              return len + sprintf(buf, "*isc*ip*\n");
+-      }
++      return sprintf(buf, "usb:v%04Xp%04Xd%04Xdc%02Xdsc%02Xdp%02X"
++                      "ic%02Xisc%02Xip%02X\n",
++                      le16_to_cpu(udev->descriptor.idVendor),
++                      le16_to_cpu(udev->descriptor.idProduct),
++                      le16_to_cpu(udev->descriptor.bcdDevice),
++                      udev->descriptor.bDeviceClass,
++                      udev->descriptor.bDeviceSubClass,
++                      udev->descriptor.bDeviceProtocol,
++                      alt->desc.bInterfaceClass,
++                      alt->desc.bInterfaceSubClass,
++                      alt->desc.bInterfaceProtocol);
+ }
+ static DEVICE_ATTR(modalias, S_IRUGO, show_modalias, NULL);
+diff -Naur linux-2.6.14-omap2/drivers/usb/core/usb.c linux-h6300-omap2-2.6.14.3/drivers/usb/core/usb.c
+--- linux-2.6.14-omap2/drivers/usb/core/usb.c  2005-10-28 03:02:08.000000000 +0300
++++ linux-h6300-omap2-2.6.14.3/drivers/usb/core/usb.c  2005-11-23 01:44:02.000000000 +0200
+@@ -557,6 +557,7 @@
+ {
+       struct usb_interface *intf;
+       struct usb_device *usb_dev;
++      struct usb_host_interface *alt;
+       int i = 0;
+       int length = 0;
+@@ -573,7 +574,8 @@
+       intf = to_usb_interface(dev);
+       usb_dev = interface_to_usbdev (intf);
+-      
++      alt = intf->cur_altsetting;
++
+       if (usb_dev->devnum < 0) {
+               pr_debug ("usb %s: already deleted?\n", dev->bus_id);
+               return -ENODEV;
+@@ -615,46 +617,27 @@
+                               usb_dev->descriptor.bDeviceProtocol))
+               return -ENOMEM;
+-      if (usb_dev->descriptor.bDeviceClass == 0) {
+-              struct usb_host_interface *alt = intf->cur_altsetting;
++      if (add_hotplug_env_var(envp, num_envp, &i,
++                              buffer, buffer_size, &length,
++                              "INTERFACE=%d/%d/%d",
++                              alt->desc.bInterfaceClass,
++                              alt->desc.bInterfaceSubClass,
++                              alt->desc.bInterfaceProtocol))
++              return -ENOMEM;
+-              /* 2.4 only exposed interface zero.  in 2.5, hotplug
+-               * agents are called for all interfaces, and can use
+-               * $DEVPATH/bInterfaceNumber if necessary.
+-               */
+-              if (add_hotplug_env_var(envp, num_envp, &i,
+-                                      buffer, buffer_size, &length,
+-                                      "INTERFACE=%d/%d/%d",
+-                                      alt->desc.bInterfaceClass,
+-                                      alt->desc.bInterfaceSubClass,
+-                                      alt->desc.bInterfaceProtocol))
+-                      return -ENOMEM;
+-
+-              if (add_hotplug_env_var(envp, num_envp, &i,
+-                                      buffer, buffer_size, &length,
+-                                      "MODALIAS=usb:v%04Xp%04Xd%04Xdc%02Xdsc%02Xdp%02Xic%02Xisc%02Xip%02X",
+-                                      le16_to_cpu(usb_dev->descriptor.idVendor),
+-                                      le16_to_cpu(usb_dev->descriptor.idProduct),
+-                                      le16_to_cpu(usb_dev->descriptor.bcdDevice),
+-                                      usb_dev->descriptor.bDeviceClass,
+-                                      usb_dev->descriptor.bDeviceSubClass,
+-                                      usb_dev->descriptor.bDeviceProtocol,
+-                                      alt->desc.bInterfaceClass,
+-                                      alt->desc.bInterfaceSubClass,
+-                                      alt->desc.bInterfaceProtocol))
+-                      return -ENOMEM;
+-      } else {
+-              if (add_hotplug_env_var(envp, num_envp, &i,
+-                                      buffer, buffer_size, &length,
+-                                      "MODALIAS=usb:v%04Xp%04Xd%04Xdc%02Xdsc%02Xdp%02Xic*isc*ip*",
+-                                      le16_to_cpu(usb_dev->descriptor.idVendor),
+-                                      le16_to_cpu(usb_dev->descriptor.idProduct),
+-                                      le16_to_cpu(usb_dev->descriptor.bcdDevice),
+-                                      usb_dev->descriptor.bDeviceClass,
+-                                      usb_dev->descriptor.bDeviceSubClass,
+-                                      usb_dev->descriptor.bDeviceProtocol))
+-                      return -ENOMEM;
+-      }
++      if (add_hotplug_env_var(envp, num_envp, &i,
++                              buffer, buffer_size, &length,
++                              "MODALIAS=usb:v%04Xp%04Xd%04Xdc%02Xdsc%02Xdp%02Xic%02Xisc%02Xip%02X",
++                              le16_to_cpu(usb_dev->descriptor.idVendor),
++                              le16_to_cpu(usb_dev->descriptor.idProduct),
++                              le16_to_cpu(usb_dev->descriptor.bcdDevice),
++                              usb_dev->descriptor.bDeviceClass,
++                              usb_dev->descriptor.bDeviceSubClass,
++                              usb_dev->descriptor.bDeviceProtocol,
++                              alt->desc.bInterfaceClass,
++                              alt->desc.bInterfaceSubClass,
++                              alt->desc.bInterfaceProtocol))
++              return -ENOMEM;
+       envp[i] = NULL;
+diff -Naur linux-2.6.14-omap2/drivers/usb/gadget/omap_udc.c linux-h6300-omap2-2.6.14.3/drivers/usb/gadget/omap_udc.c
+--- linux-2.6.14-omap2/drivers/usb/gadget/omap_udc.c   2005-12-02 01:53:33.000000000 +0200
++++ linux-h6300-omap2-2.6.14.3/drivers/usb/gadget/omap_udc.c   2005-11-11 04:13:42.000000000 +0200
+@@ -59,7 +59,8 @@
+ #undef        USB_TRACE
+ /* bulk DMA seems to be behaving for both IN and OUT */
+-#define       USE_DMA
++//#define     USE_DMA
++#undef USE_DMA
+ /* ISO too */
+ #define       USE_ISO
+@@ -2109,7 +2110,7 @@
        /* boards that don't have VBUS sensing can't autogate 48MHz;
         * can't enter deep sleep while a gadget driver is active.
         */
@@ -28786,7 +30583,7 @@ diff -Naur /home/lamikr/own/h6340/kernel/linux-2.6.14-rc5/drivers/usb/gadget/oma
                omap_vbus_session(&udc->gadget, 1);
  
  done:
-@@ -2121,7 +2138,7 @@
+@@ -2127,7 +2128,7 @@
        if (!driver || driver != udc->driver)
                return -EINVAL;
  
@@ -28795,7 +30592,7 @@ diff -Naur /home/lamikr/own/h6340/kernel/linux-2.6.14-rc5/drivers/usb/gadget/oma
                omap_vbus_session(&udc->gadget, 0);
  
        if (udc->transceiver)
-@@ -2729,7 +2746,7 @@
+@@ -2735,7 +2736,7 @@
                hmc = HMC_1510;
                type = "(unknown)";
  
@@ -28804,20 +30601,9 @@ diff -Naur /home/lamikr/own/h6340/kernel/linux-2.6.14-rc5/drivers/usb/gadget/oma
                        /* just set up software VBUS detect, and then
                         * later rig it so we always report VBUS.
                         * FIXME without really sensing VBUS, we can't
-diff -Naur /home/lamikr/own/h6340/kernel/linux-2.6.14-rc5/drivers/video/logo/.gitignore bt_kernel/drivers/video/logo/.gitignore
---- /home/lamikr/own/h6340/kernel/linux-2.6.14-rc5/drivers/video/logo/.gitignore       2005-10-20 09:23:05.000000000 +0300
-+++ bt_kernel/drivers/video/logo/.gitignore    1970-01-01 02:00:00.000000000 +0200
-@@ -1,7 +0,0 @@
--#
--# Generated files
--#
--*_mono.c
--*_vga16.c
--*_clut224.c
--*_gray256.c
-diff -Naur /home/lamikr/own/h6340/kernel/linux-2.6.14-rc5/drivers/video/omap/lcd_h6300.c bt_kernel/drivers/video/omap/lcd_h6300.c
---- /home/lamikr/own/h6340/kernel/linux-2.6.14-rc5/drivers/video/omap/lcd_h6300.c      1970-01-01 02:00:00.000000000 +0200
-+++ bt_kernel/drivers/video/omap/lcd_h6300.c   2005-10-30 16:32:39.609796000 +0200
+diff -Naur linux-2.6.14-omap2/drivers/video/omap/lcd_h6300.c linux-h6300-omap2-2.6.14.3/drivers/video/omap/lcd_h6300.c
+--- linux-2.6.14-omap2/drivers/video/omap/lcd_h6300.c  1970-01-01 02:00:00.000000000 +0200
++++ linux-h6300-omap2-2.6.14.3/drivers/video/omap/lcd_h6300.c  2005-11-11 04:13:42.000000000 +0200
 @@ -0,0 +1,107 @@
 +/*
 + * File: drivers/video/omap_new/lcd-h6300.c
@@ -28861,7 +30647,7 @@ diff -Naur /home/lamikr/own/h6340/kernel/linux-2.6.14-rc5/drivers/video/omap/lcd
 +      if ((h6300_lcd_ck = clk_get (NULL, "lcd_ck")) == NULL) {
 +              printk(KERN_ERR "Unable to get the clock LCD_CK!!!\n");
 +              return -EPERM;
-+      } clk_enable (h6300_lcd_ck);
++      } clk_enable(h6300_lcd_ck);
 +*/
 +      DBGLEAVE(1);
 +      printk(KERN_INFO "lcd_h6300.c: h6300_panel_init() done\n");
@@ -28873,7 +30659,7 @@ diff -Naur /home/lamikr/own/h6340/kernel/linux-2.6.14-rc5/drivers/video/omap/lcd
 +      DBGENTER(1);
 +/*
 +      if (h6300_lcd_ck) {
-+              clk_disable (h6300_lcd_ck);
++              clk_disable(h6300_lcd_ck);
 +              clk_put (h6300_lcd_ck);
 +              h6300_lcd_ck = NULL;
 +      }
@@ -28920,1849 +30706,2202 @@ diff -Naur /home/lamikr/own/h6340/kernel/linux-2.6.14-rc5/drivers/video/omap/lcd
 +      .vbp            = 3,
 +      .pcd            = 0,
 +
-+      .init           = h6300_panel_init,
-+      .cleanup        = h6300_panel_cleanup,
-+      .enable         = h6300_panel_enable,
-+      .disable        = h6300_panel_disable,
-+      .get_caps       = h6300_panel_get_caps,
-+};
-diff -Naur /home/lamikr/own/h6340/kernel/linux-2.6.14-rc5/drivers/video/omap/Makefile bt_kernel/drivers/video/omap/Makefile
---- /home/lamikr/own/h6340/kernel/linux-2.6.14-rc5/drivers/video/omap/Makefile 2005-10-30 17:44:18.730882654 +0200
-+++ bt_kernel/drivers/video/omap/Makefile      2005-10-22 03:52:45.687256000 +0300
-@@ -21,6 +21,7 @@
- objs-$(CONFIG_ARCH_OMAP15XX)$(CONFIG_MACH_OMAP_INNOVATOR) += lcd_inn1510.o
- objs-y$(CONFIG_MACH_OMAP_OSK) += lcd_osk.o
- objs-y$(CONFIG_MACH_OMAP_PERSEUS2) += lcd_p2.o
-+objs-$(CONFIG_ARCH_OMAP15XX)$(CONFIG_MACH_OMAP_H6300) += lcd_h6300.o
++      .init           = h6300_panel_init,
++      .cleanup        = h6300_panel_cleanup,
++      .enable         = h6300_panel_enable,
++      .disable        = h6300_panel_disable,
++      .get_caps       = h6300_panel_get_caps,
++};
+diff -Naur linux-2.6.14-omap2/drivers/video/omap/Makefile linux-h6300-omap2-2.6.14.3/drivers/video/omap/Makefile
+--- linux-2.6.14-omap2/drivers/video/omap/Makefile     2005-12-02 01:53:33.000000000 +0200
++++ linux-h6300-omap2-2.6.14.3/drivers/video/omap/Makefile     2005-10-22 03:52:45.000000000 +0300
+@@ -21,6 +21,7 @@
+ objs-$(CONFIG_ARCH_OMAP15XX)$(CONFIG_MACH_OMAP_INNOVATOR) += lcd_inn1510.o
+ objs-y$(CONFIG_MACH_OMAP_OSK) += lcd_osk.o
+ objs-y$(CONFIG_MACH_OMAP_PERSEUS2) += lcd_p2.o
++objs-$(CONFIG_ARCH_OMAP15XX)$(CONFIG_MACH_OMAP_H6300) += lcd_h6300.o
+ omapfb-objs := $(objs-yy)
+diff -Naur linux-2.6.14-omap2/drivers/video/omap/omapfb_main.c linux-h6300-omap2-2.6.14.3/drivers/video/omap/omapfb_main.c
+--- linux-2.6.14-omap2/drivers/video/omap/omapfb_main.c        2005-12-02 01:53:33.000000000 +0200
++++ linux-h6300-omap2-2.6.14.3/drivers/video/omap/omapfb_main.c        2005-10-24 19:16:46.000000000 +0300
+@@ -89,6 +89,7 @@
+ extern struct lcd_panel innovator1610_panel;
+ extern struct lcd_panel innovator1510_panel;
+ extern struct lcd_panel lph8923_panel;
++extern struct lcd_panel h6300_panel;
+ static struct lcd_panel *panels[] = {
+ #ifdef CONFIG_MACH_OMAP_H2
+@@ -109,6 +110,9 @@
+ #ifdef CONFIG_MACH_OMAP_PALMTE
+       &palmte_panel,
+ #endif
++#ifdef CONFIG_MACH_OMAP_H6300
++      &h6300_panel,
++#endif
+ #ifdef CONFIG_MACH_OMAP_INNOVATOR
+diff -Naur linux-2.6.14-omap2/fs/exec.c linux-h6300-omap2-2.6.14.3/fs/exec.c
+--- linux-2.6.14-omap2/fs/exec.c       2005-10-28 03:02:08.000000000 +0300
++++ linux-h6300-omap2-2.6.14.3/fs/exec.c       2005-11-23 01:44:02.000000000 +0200
+@@ -593,6 +593,7 @@
+       struct signal_struct *sig = tsk->signal;
+       struct sighand_struct *newsighand, *oldsighand = tsk->sighand;
+       spinlock_t *lock = &oldsighand->siglock;
++      struct task_struct *leader = NULL;
+       int count;
+       /*
+@@ -668,7 +669,7 @@
+        * and to assume its PID:
+        */
+       if (!thread_group_leader(current)) {
+-              struct task_struct *leader = current->group_leader, *parent;
++              struct task_struct *parent;
+               struct dentry *proc_dentry1, *proc_dentry2;
+               unsigned long exit_state, ptrace;
+@@ -677,6 +678,7 @@
+                * It should already be zombie at this point, most
+                * of the time.
+                */
++              leader = current->group_leader;
+               while (leader->exit_state != EXIT_ZOMBIE)
+                       yield();
+@@ -736,7 +738,6 @@
+               proc_pid_flush(proc_dentry2);
+               BUG_ON(exit_state != EXIT_ZOMBIE);
+-              release_task(leader);
+         }
+       /*
+@@ -746,8 +747,11 @@
+       sig->flags = 0;
+ no_thread_group:
+-      BUG_ON(atomic_read(&sig->count) != 1);
+       exit_itimers(sig);
++      if (leader)
++              release_task(leader);
++
++      BUG_ON(atomic_read(&sig->count) != 1);
  
- omapfb-objs := $(objs-yy)
+       if (atomic_read(&oldsighand->count) == 1) {
+               /*
+diff -Naur linux-2.6.14-omap2/fs/locks.c linux-h6300-omap2-2.6.14.3/fs/locks.c
+--- linux-2.6.14-omap2/fs/locks.c      2005-10-28 03:02:08.000000000 +0300
++++ linux-h6300-omap2-2.6.14.3/fs/locks.c      2005-12-02 01:34:35.000000000 +0200
+@@ -1418,7 +1418,7 @@
+       lock_kernel();
+       error = __setlease(filp, arg, &flp);
+-      if (error)
++      if (error || arg == F_UNLCK)
+               goto out_unlock;
+       error = fasync_helper(fd, filp, 1, &flp->fl_fasync);
+diff -Naur linux-2.6.14-omap2/fs/xfs/Kconfig linux-h6300-omap2-2.6.14.3/fs/xfs/Kconfig
+--- linux-2.6.14-omap2/fs/xfs/Kconfig  2005-10-28 03:02:08.000000000 +0300
++++ linux-h6300-omap2-2.6.14.3/fs/xfs/Kconfig  2005-11-23 01:44:02.000000000 +0200
+@@ -24,7 +24,7 @@
+       default y
+ config XFS_QUOTA
+-      tristate "XFS Quota support"
++      bool "XFS Quota support"
+       depends on XFS_FS
+       help
+         If you say Y here, you will be able to set limits for disk usage on
+diff -Naur linux-2.6.14-omap2/include/asm-alpha/barrier.h linux-h6300-omap2-2.6.14.3/include/asm-alpha/barrier.h
+--- linux-2.6.14-omap2/include/asm-alpha/barrier.h     2005-10-28 03:02:08.000000000 +0300
++++ linux-h6300-omap2-2.6.14.3/include/asm-alpha/barrier.h     2005-11-23 01:44:02.000000000 +0200
+@@ -1,6 +1,8 @@
+ #ifndef __BARRIER_H
+ #define __BARRIER_H
++#include <asm/compiler.h>
++
+ #define mb() \
+ __asm__ __volatile__("mb": : :"memory")
  
-diff -Naur /home/lamikr/own/h6340/kernel/linux-2.6.14-rc5/drivers/video/omap/omapfb.h bt_kernel/drivers/video/omap/omapfb.h
---- /home/lamikr/own/h6340/kernel/linux-2.6.14-rc5/drivers/video/omap/omapfb.h 1970-01-01 02:00:00.000000000 +0200
-+++ bt_kernel/drivers/video/omap/omapfb.h      2005-08-12 13:46:22.016114000 +0300
-@@ -0,0 +1,325 @@
+diff -Naur linux-2.6.14-omap2/include/asm-arm/arch-omap/board-h6300.h linux-h6300-omap2-2.6.14.3/include/asm-arm/arch-omap/board-h6300.h
+--- linux-2.6.14-omap2/include/asm-arm/arch-omap/board-h6300.h 1970-01-01 02:00:00.000000000 +0200
++++ linux-h6300-omap2-2.6.14.3/include/asm-arm/arch-omap/board-h6300.h 2005-08-12 13:46:22.000000000 +0300
+@@ -0,0 +1,40 @@
 +/*
-+ * File: drivers/video/omap_new/omapfb.c
-+ *
-+ * Framebuffer driver for TI OMAP boards
++ * linux/include/asm-arm/arch-omap/board-innovator.h
 + *
-+ * Copyright (C) 2004 Nokia Corporation
-+ * Author: Imre Deak <imre.deak@nokia.com>
++ * Copyright (C) 2001 RidgeRun, Inc.
 + *
 + * This program is free software; you can redistribute it and/or modify it
 + * under the terms of the GNU General Public License as published by the
 + * Free Software Foundation; either version 2 of the License, or (at your
 + * option) any later version.
 + *
-+ * This program is distributed in the hope that it will be useful, but
-+ * WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-+ * General Public License for more details.
++ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED
++ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
++ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
++ * NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
++ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
++ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
++ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
++ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
++ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
++ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 + *
 + * You should have received a copy of the GNU General Public License along
 + * with this program; if not, write to the Free Software Foundation, Inc.,
-+ * 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
++ * 675 Mass Ave, Cambridge, MA 02139, USA.
 + */
++#ifndef __ASM_ARCH_H6300_H
++#define __ASM_ARCH_H6300_H
 +
-+#ifndef __OMAPFB_H
-+#define __OMAPFB_H
-+
-+/* IOCTL commands. */
-+
-+#define OMAP_IOW(num, dtype)  _IOW('O', num, dtype)
-+#define OMAP_IOR(num, dtype)  _IOR('O', num, dtype)
-+#define OMAP_IOWR(num, dtype) _IOWR('O', num, dtype)
-+#define OMAP_IO(num)          _IO('O', num)
-+
-+#define OMAPFB_FILLRECT               OMAP_IOW(0, struct fb_fillrect)
-+#define OMAPFB_COPYAREA               OMAP_IOW(1, struct fb_copyarea)
-+#define OMAPFB_IMAGEBLIT      OMAP_IOW(2, struct fb_image)
-+
-+#define OMAPFB_TRANSPARENT_BLIT       OMAP_IOW(30, struct fb_image)
-+#define OMAPFB_MIRROR         OMAP_IOW(31, int)
-+#define OMAPFB_SCALE          OMAP_IOW(32, struct fb_scale)
-+#define OMAPFB_SELECT_VIS_FRAME       OMAP_IOW(33, int)
-+#define OMAPFB_SELECT_SRC_FRAME OMAP_IOW(34, int)
-+#define OMAPFB_SELECT_DST_FRAME       OMAP_IOW(35, int)
-+#define OMAPFB_GET_FRAME_OFFSET       OMAP_IOWR(36, struct fb_frame_offset)
-+#define OMAPFB_SYNC_GFX               OMAP_IO(37)
-+#define OMAPFB_VSYNC          OMAP_IO(38)
-+#define OMAPFB_LATE_ACTIVATE  OMAP_IO(39)
-+#define OMAPFB_SET_UPDATE_MODE        OMAP_IOW(40, enum fb_update_mode)
-+#define OMAPFB_UPDATE_WINDOW  OMAP_IOW(41, struct fb_update_window)
-+#define OMAPFB_GET_CAPS               OMAP_IOR(42, unsigned long)
-+#define OMAPFB_GET_UPDATE_MODE        OMAP_IOW(43, enum fb_update_mode)
-+#define OMAPFB_GET_GFX_STATUS OMAP_IOR(44, unsigned long)
-+
-+#define FBCAPS_GENERIC_MASK   0x00000fff
-+#define FBCAPS_LCDC_MASK      0x00fff000
-+#define FBCAPS_PANEL_MASK     0xff000000
-+
-+#define FBCAPS_MANUAL_UPDATE  0x00001000
-+#define FBCAPS_SET_BACKLIGHT  0x01000000
-+
-+enum omapfb_gfx_status {
-+      OMAPFB_GFX_STATUS_OK    = 0,
-+      OMAPFB_GFX_STATUS_CHANGED
-+};
++#ifndef OMAP_SDRAM_DEVICE
++#define OMAP_SDRAM_DEVICE                     D256M_1X16_4B
++#endif
 +
-+#define OMAPFB_UPDATE_FAILED  0x01
-+#define OMAPFB_FILLRECT_FAILED        0x02
-+#define OMAPFB_COPYAREA_FAILED        0x04
-+#define OMAPFB_IMGBLIT_FAILED 0x08
-+
-+struct fb_copyarea_ext {
-+      __u32 dx;
-+      __u32 dy;
-+      __u32 width;
-+      __u32 height;
-+      __u32 sx;
-+      __u32 sy;
-+      __u32 trans_color;
-+      __u32 rev_dir;
-+};
++#define OMAP1510P1_IMIF_PRI_VALUE             0x00
++#define OMAP1510P1_EMIFS_PRI_VALUE            0x00
++#define OMAP1510P1_EMIFF_PRI_VALUE            0x00
 +
-+struct fb_scale {
-+      unsigned int xscale, yscale;
-+};
++#define NR_FPGA_IRQS          24
++#define NR_IRQS                 IH_BOARD_BASE + NR_FPGA_IRQS
 +
-+struct fb_frame_offset {
-+      unsigned int idx;
-+      unsigned long offset;
-+};
++#endif /* __ASM_ARCH_H6300_H */
+diff -Naur linux-2.6.14-omap2/include/asm-arm/arch-omap/h6300_uart_info.h linux-h6300-omap2-2.6.14.3/include/asm-arm/arch-omap/h6300_uart_info.h
+--- linux-2.6.14-omap2/include/asm-arm/arch-omap/h6300_uart_info.h     1970-01-01 02:00:00.000000000 +0200
++++ linux-h6300-omap2-2.6.14.3/include/asm-arm/arch-omap/h6300_uart_info.h     2005-10-14 18:55:31.000000000 +0300
+@@ -0,0 +1,33 @@
++/*
++ * Support file for calling h6300 uart configuration functions.
++ * Used at least by h6300_bt driver.
++ * 
++ * Copyright (c) 2005 SDG Systems, LLC
++ * 2005-03-29   Todd Blumer     Converted  basic structure to support hx4700
++ * 2005-10-03   Mika Laitio (lamikr@cc.jyu.fi)        Reorganized for the iPAQ h6300 bt driver.
++ */
 +
-+struct fb_update_window {
-+      unsigned int x, y;
-+      unsigned int width, height;
-+};
++#ifndef _H6300_UART_INFO_H
++#define _H6300_UART_INFO_H
 +
-+enum fb_update_mode {
-+      FB_UPDATE_DISABLED = 0,
-+      FB_AUTO_UPDATE,
-+      FB_MANUAL_UPDATE
-+};
++#include "omap_serial.h"
 +
-+#ifdef __KERNEL__
++#define GPIO_BT_PWR_EN 3
++#define GPIO_N_BT_RST 9
 +
-+#include <linux/completion.h>
-+#include <linux/interrupt.h>
-+#include <linux/fb.h>
-+
-+#define OMAPFB_DEVICE "omapfb"
-+#define OMAPFB_DRIVER "omapfb"
-+
-+#define PRNERR(fmt, args...)  printk(KERN_ERR OMAPFB_DRIVER ": " fmt, ## args)
-+
-+#define GFX_FIFO_SIZE 2
-+
-+#define LCD_PANEL_TFT 0x01
-+
-+#define OMAP_LCDC_INV_VSYNC             0x01
-+#define OMAP_LCDC_INV_HSYNC             0x02
-+#define OMAP_LCDC_INV_PIX_CLOCK         0x04
-+#define OMAP_LCDC_INV_OUTPUT_EN         0x08
-+#define OMAP_LCDC_HSVS_RISING_EDGE      0x10
-+#define OMAP_LCDC_HSVS_OPPOSITE         0x20
-+
-+struct lcdc_video_mode {
-+      u16     x_res, y_res;
-+      u32     pixel_clock;    /* In kHz */
-+      int     bpp;
-+      u8      hsw;            /* Horizontal synchronization pulse width */
-+      u8      hfp;            /* Horizontal front porch */
-+      u8      hbp;            /* Horizontal back porch */
-+      u8      vsw;            /* Vertical synchronization pulse width */
-+      u8      vfp;            /* Vertical front porch */
-+      u8      vbp;            /* Vertical back porch */
-+      u8      acb;            /* ac-bias pin frequency */
-+      u8      pcd;            /* Pixel clock divider (this will change) */
-+      u8  flags;
-+};
++#define GPIO_I2C_GPRS_RESET 16
++#define GPIO_I2C_MIC_OP_EN 10
++#define GPIO_I2C_SPK_OP_PD 11
 +
-+struct lcd_panel {
-+      const char *name;
-+      int  config;
-+      int  signals;
-+      struct lcdc_video_mode *video_mode;
-+
-+      int  (*init)    (struct lcd_panel *panel);
-+      void (*cleanup) (struct lcd_panel *panel);
-+      int  (*enable)  (struct lcd_panel *panel);
-+      void (*disable) (struct lcd_panel *panel);
-+      unsigned long (*get_caps)(struct lcd_panel *panel);
-+      int           (*set_bklight_level)(struct lcd_panel *panel,
-+                                         unsigned int level);
-+      unsigned int  (*get_bklight_level)(struct lcd_panel *panel);
-+      unsigned int  (*get_bklight_max)  (struct lcd_panel *panel);
-+};
++#define GPIO_VALUE_OFF        0
++#define GPIO_VALUE_ON 1
 +
-+struct omapfb_device;
-+
-+struct lcd_ctrl {
-+      const char      *name;
-+      void            *data;
-+      int             (*init)           (struct omapfb_device *fbdev);
-+      void            (*cleanup)        (struct omapfb_device *fbdev);
-+      void            (*get_mem_layout) (struct omapfb_device *fbdev,
-+                                         unsigned long *size,
-+                                         unsigned long *fb_org);
-+      unsigned long   (*get_caps)       (struct omapfb_device *fbdev);
-+      int             (*set_update_mode)(struct omapfb_device *fbdev,
-+                                         enum fb_update_mode mode);
-+      enum fb_update_mode (*get_update_mode)(struct omapfb_device *fbdev);
-+      int             (*update_window)  (struct omapfb_device *fbdev,
-+                                         struct fb_update_window *win);
-+      void            (*suspend)        (struct omapfb_device *fbdev);
-+      void            (*resume)         (struct omapfb_device *fbdev);
-+      void            (*change_mode)    (struct omapfb_device *fbdev);
-+};
++#define GPIO_DIR_OUTPUT 1
 +
-+enum omapfb_state {
-+      OMAPFB_DISABLED = 0,
-+      OMAPFB_SUSPENDED= 99,
-+      OMAPFB_ACTIVE   = 100
++struct h6300_uart_funcs {
++      void (*configure)( struct uart_omap_port *up, int state);
++      void (*set_txrx)( struct uart_omap_port *up, int txrx);
++      int (*get_txrx)( struct uart_omap_port *up);
 +};
 +
-+struct gfx_lchannel {
-+      int                     lch_num;
-+      struct gfx_lchannel     *next, *prev;
++#endif
+diff -Naur linux-2.6.14-omap2/include/asm-arm/arch-omap/hardware.h linux-h6300-omap2-2.6.14.3/include/asm-arm/arch-omap/hardware.h
+--- linux-2.6.14-omap2/include/asm-arm/arch-omap/hardware.h    2005-12-02 01:53:34.000000000 +0200
++++ linux-h6300-omap2-2.6.14.3/include/asm-arm/arch-omap/hardware.h    2005-10-22 03:52:45.000000000 +0300
+@@ -290,6 +290,10 @@
+ #include "board-innovator.h"
+ #endif
++#ifdef CONFIG_MACH_OMAP_H6300
++#include "board-h6300.h"
++#endif
++
+ #ifdef CONFIG_MACH_OMAP_H2
+ #include "board-h2.h"
+ #endif
+diff -Naur linux-2.6.14-omap2/include/asm-arm/arch-omap/irqs.h linux-h6300-omap2-2.6.14.3/include/asm-arm/arch-omap/irqs.h
+--- linux-2.6.14-omap2/include/asm-arm/arch-omap/irqs.h        2005-12-02 01:53:34.000000000 +0200
++++ linux-h6300-omap2-2.6.14.3/include/asm-arm/arch-omap/irqs.h        2005-11-11 04:13:42.000000000 +0200
+@@ -237,7 +237,7 @@
+ #define INT_24XX_SDMA_IRQ1    13
+ #define INT_24XX_SDMA_IRQ2    14
+ #define INT_24XX_SDMA_IRQ3    15
+-#define INT_24XX_DSS_IRQ      25
++#define INT_24XX_DSS_IRQ              25
+ #define INT_24XX_GPIO_BANK1   29
+ #define INT_24XX_GPIO_BANK2   30
+ #define INT_24XX_GPIO_BANK3   31
+diff -Naur linux-2.6.14-omap2/include/asm-arm/arch-omap/mux.h linux-h6300-omap2-2.6.14.3/include/asm-arm/arch-omap/mux.h
+--- linux-2.6.14-omap2/include/asm-arm/arch-omap/mux.h 2005-12-02 01:53:34.000000000 +0200
++++ linux-h6300-omap2-2.6.14.3/include/asm-arm/arch-omap/mux.h 2005-10-14 18:55:31.000000000 +0300
+@@ -316,6 +316,13 @@
+       P15_1610_UWIRE_CS3,
+       N15_1610_UWIRE_CS1,
++      /* OMAP-1510 uWire */
++      P15_1510_UWIRE_CS3,
++      N14_1510_UWIRE_CS0,
++      V19_1510_UWIRE_SCLK,
++      W21_1510_UWIRE_SDO,
++      U18_1510_UWIRE_SDI,
++
+       /* OMAP-1610 Flash */
+       L3_1610_FLASH_CS2B_OE,
+       M8_1610_FLASH_CS2B_WE,
+@@ -380,6 +387,7 @@
+       T20_1610_LOW_PWR,
+       /* MCLK Settings */
++      R10_1510_MCLK_ON,
+       V5_1710_MCLK_ON,
+       V5_1710_MCLK_OFF,
+       R10_1610_MCLK_ON,
+diff -Naur linux-2.6.14-omap2/include/asm-arm/arch-omap/omapfb.h linux-h6300-omap2-2.6.14.3/include/asm-arm/arch-omap/omapfb.h
+--- linux-2.6.14-omap2/include/asm-arm/arch-omap/omapfb.h      2005-12-02 01:53:34.000000000 +0200
++++ linux-h6300-omap2-2.6.14.3/include/asm-arm/arch-omap/omapfb.h      2005-11-11 04:13:42.000000000 +0200
+@@ -267,6 +267,7 @@
+ extern struct lcd_panel osk_panel;
+ extern struct lcd_panel innovator1610_panel;
+ extern struct lcd_panel innovator1510_panel;
++extern struct lcd_panel h6300_panel;
+ #ifdef CONFIG_ARCH_OMAP1
+ extern struct lcd_ctrl omap1_lcd_ctrl;
+diff -Naur linux-2.6.14-omap2/include/asm-arm/arch-omap/omap_serial.h linux-h6300-omap2-2.6.14.3/include/asm-arm/arch-omap/omap_serial.h
+--- linux-2.6.14-omap2/include/asm-arm/arch-omap/omap_serial.h 1970-01-01 02:00:00.000000000 +0200
++++ linux-h6300-omap2-2.6.14.3/include/asm-arm/arch-omap/omap_serial.h 2005-10-04 00:58:34.000000000 +0300
+@@ -0,0 +1,62 @@
++/*
++ * Omap/h6300 serial driver private interface. 
++ * Code originates from the pxa-serial.h available in the handheld org drivers
++ * for iPAQ PXA4700.
++ *
++ * Copyright (c) 2005 SDG Systems, LLC
++ * 2005-03-29   Todd Blumer     Converted  basic structure to support hx4700
++ * 2005-10-03   Mika Laitio (lamikr@cc.jyu.fi)        Reorganized for the iPAQ h6300 bt driver.
++ */
++ 
++#ifndef _OMAP_SERIAL_H
++#define _OMAP_SERIAL_H
++
++#define OMAP_SERIAL_TX 1
++#define OMAP_SERIAL_RX 2
++
++#include <linux/tty.h>
++#include <linux/serial_core.h>
++
++struct platform_omap_serial_funcs;
++
++struct uart_omap_port {
++      struct uart_port                        port;
++      unsigned char                           ier;
++      unsigned char                           lcr;
++      unsigned char                           mcr;
++      unsigned int                            lsr_break_flag;
++      unsigned int                            cken;
++      char                                    *name;
++      struct platform_omap_serial_funcs       *pf;
 +};
 +
-+struct gfx_dma {
-+      spinlock_t              spinlock;
-+
-+      struct completion       sync_complete;          /* Signalled when the
-+                                                         fifo gets empty */
-+      volatile int            done;                   /* Indicates the
-+                                                         end of a DMA chain
-+                                                         transfer */
-+      struct gfx_lchannel     fifo[GFX_FIFO_SIZE];
-+      struct gfx_lchannel     *f_head, *f_tail;       /* Process and insert
-+                                                         points on the
-+                                                         fifo */
-+      struct gfx_lchannel     *f_chain_end;           /* Points to the new
-+                                                         chain end */
-+      struct semaphore        f_free;                 /* # of free lch-s */
-+      int                     f_run;                  /* # of active lch-s */
-+      int                     f_wait;                 /* # of lch-s
-+                                                         waiting */
-+      struct tasklet_struct   dequeue_tasklet;        /* Processes new DMA
-+                                                         chain  transfers on
-+                                                         the fifo */
++/* A pointer to such a structure can be contained in the platform_data
++ * field of every PXA UART platform_device. If the field is NULL, the
++ * serial port works as usual.
++ *
++ * For the sake of simplicity/performance no one of the function pointers
++ * in the structure below can be NULL.
++ */
++struct platform_omap_serial_funcs {
++      /* Platform-specific function to initialize whatever is connected
++         to this serial port... enable=1 -> enable transceiver,
++         0 -> disable transceiver. */
++      void (*configure) (struct uart_omap_port *up, int enable);
++        /* Platform-specific function to enable or disable the individual
++           transmitter/receiver submodules. On transceivers without echo
++           cancellation (e.g. SIR) transmitter always has priority, e.g.
++           if both bits are set, only the transmitter is enabled. */
++        void (*set_txrx) (struct uart_omap_port *up, int txrx);
++      /* Get the current state of tx/rx (see bitflags above) */
++      int (*get_txrx) (struct uart_omap_port *up);
 +};
 +
-+#define OMAPFB_RQUEUE_SIZE 20
++/*
++ * The variables below are located in arch/arm/mach-omap/board_h6300.c
++ * Machine-specific code may want to put a pointer to a static
++ * platform_pxa_serial_funcs structure in the dev.platform_data
++ * field of the respective port device.
++ */
++extern struct platform_device btuart_device;
++
++#endif
+diff -Naur linux-2.6.14-omap2/include/asm-arm/arch-omap/pca9535.h linux-h6300-omap2-2.6.14.3/include/asm-arm/arch-omap/pca9535.h
+--- linux-2.6.14-omap2/include/asm-arm/arch-omap/pca9535.h     1970-01-01 02:00:00.000000000 +0200
++++ linux-h6300-omap2-2.6.14.3/include/asm-arm/arch-omap/pca9535.h     2005-10-25 03:24:45.000000000 +0300
+@@ -0,0 +1,39 @@
++#ifndef _PCA9535_H
++#define _PCA9535_H
 +
-+struct omapfb_fillrect_params
-+{
-+      struct fb_info          *fbi;
-+      struct fb_fillrect      rect; 
++enum  pca9535_gpios {
++      GPIO0 = 0,
++      GPIO1 = 1,
++      GPIO2 = 2,
++      GPIO3 = 3,
++      GPIO4 = 4,
++      GPIO5 = 5,
++      GPIO6 = 6,
++      GPIO7 = 7,
++      GPIO8 = 8,
++      GPIO9 = 9,
++      GPIO10 = 10,
++      GPIO11 = 11,
++      GPIO12 = 12,
++      GPIO13 = 13,
++      GPIO14 = 14,
++      GPIO15 = 15,
++      GPIO16 = 16,
++      GPIO17 = 17
 +};
 +
-+struct omapfb_copyarea_params
-+{
-+      struct fb_info          *fbi;
-+      struct fb_copyarea_ext  area;
++enum gpio_values {
++      HI      = 0,
++      LOW     = 1
 +};
 +
-+struct omapfb_update_window_params
-+{
-+      struct fb_info          *fbi;
-+      struct fb_update_window win;
++enum gpio_direction {
++      GPIO_INPUT      = 0,
++      GPIO_OUTPUT     = 1
 +};
 +
-+struct omapfb_imageblit_params
-+{
-+      struct fb_info  *fbi;
-+      struct fb_image image;
-+      int             flags;
-+};
++extern int pca9535_gpio_read(int gpio);
++extern int pca9535_gpio_write(int gpio, unsigned char val);   
++extern int pca9535_gpio_direction(int gpio, unsigned char direction);
++
++#endif
+diff -Naur linux-2.6.14-omap2/include/linux/proc_fs.h linux-h6300-omap2-2.6.14.3/include/linux/proc_fs.h
+--- linux-2.6.14-omap2/include/linux/proc_fs.h 2005-10-28 03:02:08.000000000 +0300
++++ linux-h6300-omap2-2.6.14.3/include/linux/proc_fs.h 2005-11-23 01:44:02.000000000 +0200
+@@ -66,6 +66,7 @@
+       write_proc_t *write_proc;
+       atomic_t count;         /* use count */
+       int deleted;            /* delete flag */
++      void *set;
+ };
+ struct kcore_list {
+diff -Naur linux-2.6.14-omap2/include/linux/sysctl.h linux-h6300-omap2-2.6.14.3/include/linux/sysctl.h
+--- linux-2.6.14-omap2/include/linux/sysctl.h  2005-10-28 03:02:08.000000000 +0300
++++ linux-h6300-omap2-2.6.14.3/include/linux/sysctl.h  2005-11-23 01:44:02.000000000 +0200
+@@ -24,6 +24,7 @@
+ #include <linux/compiler.h>
+ struct file;
++struct completion;
+ #define CTL_MAXNAME 10                /* how many path components do we allow in a
+                                  call to sysctl?   In other words, what is
+@@ -925,6 +926,8 @@
+ {
+       ctl_table *ctl_table;
+       struct list_head ctl_entry;
++      int used;
++      struct completion *unregistering;
+ };
+ struct ctl_table_header * register_sysctl_table(ctl_table * table, 
+diff -Naur linux-2.6.14-omap2/include/net/ipv6.h linux-h6300-omap2-2.6.14.3/include/net/ipv6.h
+--- linux-2.6.14-omap2/include/net/ipv6.h      2005-10-28 03:02:08.000000000 +0300
++++ linux-h6300-omap2-2.6.14.3/include/net/ipv6.h      2005-12-02 01:34:35.000000000 +0200
+@@ -237,6 +237,8 @@
+                                                  int newtype,
+                                                  struct ipv6_opt_hdr __user *newopt,
+                                                  int newoptlen);
++struct ipv6_txoptions *ipv6_fixup_options(struct ipv6_txoptions *opt_space,
++                                        struct ipv6_txoptions *opt);
+ extern int ip6_frag_nqueues;
+ extern atomic_t ip6_frag_mem;
+diff -Naur linux-2.6.14-omap2/kernel/ptrace.c linux-h6300-omap2-2.6.14.3/kernel/ptrace.c
+--- linux-2.6.14-omap2/kernel/ptrace.c 2005-10-28 03:02:08.000000000 +0300
++++ linux-h6300-omap2-2.6.14.3/kernel/ptrace.c 2005-11-23 01:44:02.000000000 +0200
+@@ -152,7 +152,7 @@
+       retval = -EPERM;
+       if (task->pid <= 1)
+               goto bad;
+-      if (task == current)
++      if (task->tgid == current->tgid)
+               goto bad;
+       /* the same process cannot be attached many times */
+       if (task->ptrace & PT_PTRACED)
+diff -Naur linux-2.6.14-omap2/kernel/signal.c linux-h6300-omap2-2.6.14.3/kernel/signal.c
+--- linux-2.6.14-omap2/kernel/signal.c 2005-10-28 03:02:08.000000000 +0300
++++ linux-h6300-omap2-2.6.14.3/kernel/signal.c 2005-12-02 01:34:35.000000000 +0200
+@@ -406,6 +406,8 @@
+ void exit_signal(struct task_struct *tsk)
+ {
++      atomic_dec(&tsk->signal->live);
++
+       write_lock_irq(&tasklist_lock);
+       __exit_signal(tsk);
+       write_unlock_irq(&tasklist_lock);
+@@ -1522,7 +1524,7 @@
+       psig = tsk->parent->sighand;
+       spin_lock_irqsave(&psig->siglock, flags);
+-      if (sig == SIGCHLD &&
++      if (!tsk->ptrace && sig == SIGCHLD &&
+           (psig->action[SIGCHLD-1].sa.sa_handler == SIG_IGN ||
+            (psig->action[SIGCHLD-1].sa.sa_flags & SA_NOCLDWAIT))) {
+               /*
+diff -Naur linux-2.6.14-omap2/kernel/sysctl.c linux-h6300-omap2-2.6.14.3/kernel/sysctl.c
+--- linux-2.6.14-omap2/kernel/sysctl.c 2005-10-28 03:02:08.000000000 +0300
++++ linux-h6300-omap2-2.6.14.3/kernel/sysctl.c 2005-11-23 01:44:02.000000000 +0200
+@@ -169,7 +169,7 @@
+ extern struct proc_dir_entry *proc_sys_root;
+-static void register_proc_table(ctl_table *, struct proc_dir_entry *);
++static void register_proc_table(ctl_table *, struct proc_dir_entry *, void *);
+ static void unregister_proc_table(ctl_table *, struct proc_dir_entry *);
+ #endif
+@@ -992,10 +992,51 @@
+ extern void init_irq_proc (void);
++static DEFINE_SPINLOCK(sysctl_lock);
 +
-+union req_params
++/* called under sysctl_lock */
++static int use_table(struct ctl_table_header *p)
 +{
-+      /* All possible requests are to be listed here */
-+      struct omapfb_fillrect_params           fillrect;
-+      struct omapfb_copyarea_params           copyarea;
-+      struct omapfb_update_window_params      update_window;
-+      struct omapfb_imageblit_params          imageblit;
-+};
++      if (unlikely(p->unregistering))
++              return 0;
++      p->used++;
++      return 1;
++}
 +
-+struct omapfb_request
++/* called under sysctl_lock */
++static void unuse_table(struct ctl_table_header *p)
 +{
-+      struct list_head        entry;
-+      int                     (*function)(void *par);
-+      union req_params        par;
-+};
++      if (!--p->used)
++              if (unlikely(p->unregistering))
++                      complete(p->unregistering);
++}
 +
-+struct omapfb_rqueue
++/* called under sysctl_lock, will reacquire if has to wait */
++static void start_unregistering(struct ctl_table_header *p)
 +{
-+      spinlock_t              lock;
-+      struct list_head        free_list;
-+      struct list_head        pending_list;
-+      struct completion       rqueue_empty;
-+      struct semaphore        free_sema;
-+      struct omapfb_request   req_pool[OMAPFB_RQUEUE_SIZE];
-+      struct work_struct      work;
-+      unsigned long           status;
-+};
-+
-+struct omapfb_device {
-+      int                     state;
-+      int                     ext_lcdc;               /* Using external
-+                                                           LCD controller */
-+      void                    *lcddma_base;           /* MPU virtual
-+                                                         address */
-+      dma_addr_t              lcddma_handle;          /* Bus physical
-+                                                         address */
-+      unsigned long           lcddma_mem_size;
-+      unsigned long           palette_org;            /* Palette offset into
-+                                                         lcddma_base/handle */
-+      unsigned long           frame0_org, frame1_org; /* Frame offsets for
-+                                                         back and front
-+                                                         frame buffers into
-+                                                         lcddma_base/handle */
-+      unsigned long           vis_frame_org;          /* Offset of visible
-+                                                         frame buffer.
-+                                                         = frame0/1_org */
-+      unsigned long           src_frame_org;          /* Offset of source
-+                                                         frame for drawing
-+                                                         operations.
-+                                                         = frame0/1_org */
-+      unsigned long           dst_frame_org;          /* Offset of dest
-+                                                         frame for drawing
-+                                                         operations.
-+                                                         = frame0/1_org */
-+      unsigned long           view_org;               /* View offset into
-+                                                         lcddma_base/handle+
-+                                                         vis_frame_org.
-+                                                         Used for panning */
-+      unsigned long           palette_size;
-+      int                     xscale, yscale, mirror; /* transformations.
-+                                                         rotate is stored in
-+                                                         fb_info->var */
-+
-+      u32                     pseudo_palette[17];
-+
-+      struct gfx_dma          gfx;                    /* Accelerator */
-+      struct omapfb_rqueue    rqueue;
-+      struct lcd_panel        *panel;                 /* LCD panel */
-+      struct lcd_ctrl         *ctrl;                  /* LCD controller */
-+
-+      struct fb_info          *fb_info;               /* Linux fbdev
-+                                                         framework data */
-+      struct device           *dev;
-+};
++      /*
++       * if p->used is 0, nobody will ever touch that entry again;
++       * we'll eliminate all paths to it before dropping sysctl_lock
++       */
++      if (unlikely(p->used)) {
++              struct completion wait;
++              init_completion(&wait);
++              p->unregistering = &wait;
++              spin_unlock(&sysctl_lock);
++              wait_for_completion(&wait);
++              spin_lock(&sysctl_lock);
++      }
++      /*
++       * do not remove from the list until nobody holds it; walking the
++       * list in do_sysctl() relies on that.
++       */
++      list_del_init(&p->ctl_entry);
++}
 +
-+extern struct lcd_panel h3_panel;
-+extern struct lcd_panel h2_panel;
-+extern struct lcd_panel p2_panel;
-+extern struct lcd_panel osk_panel;
-+extern struct lcd_panel innovator1610_panel;
-+extern struct lcd_panel innovator1510_panel;
-+extern struct lcd_panel h6300_panel;
+ void __init sysctl_init(void)
+ {
+ #ifdef CONFIG_PROC_FS
+-      register_proc_table(root_table, proc_sys_root);
++      register_proc_table(root_table, proc_sys_root, &root_table_header);
+       init_irq_proc();
+ #endif
+ }
+@@ -1004,6 +1045,7 @@
+              void __user *newval, size_t newlen)
+ {
+       struct list_head *tmp;
++      int error = -ENOTDIR;
+       if (nlen <= 0 || nlen >= CTL_MAXNAME)
+               return -ENOTDIR;
+@@ -1012,20 +1054,30 @@
+               if (!oldlenp || get_user(old_len, oldlenp))
+                       return -EFAULT;
+       }
++      spin_lock(&sysctl_lock);
+       tmp = &root_table_header.ctl_entry;
+       do {
+               struct ctl_table_header *head =
+                       list_entry(tmp, struct ctl_table_header, ctl_entry);
+               void *context = NULL;
+-              int error = parse_table(name, nlen, oldval, oldlenp, 
++
++              if (!use_table(head))
++                      continue;
 +
-+extern struct lcd_ctrl omapfb_lcdc_ctrl;
++              spin_unlock(&sysctl_lock);
 +
-+#endif /* __KERNEL__ */
++              error = parse_table(name, nlen, oldval, oldlenp, 
+                                       newval, newlen, head->ctl_table,
+                                       &context);
+               kfree(context);
 +
-+#endif /* __OMAPFB_H */
-diff -Naur /home/lamikr/own/h6340/kernel/linux-2.6.14-rc5/drivers/video/omap/omapfb_main.c bt_kernel/drivers/video/omap/omapfb_main.c
---- /home/lamikr/own/h6340/kernel/linux-2.6.14-rc5/drivers/video/omap/omapfb_main.c    2005-10-30 17:44:18.967844936 +0200
-+++ bt_kernel/drivers/video/omap/omapfb_main.c 2005-10-24 19:16:46.600530000 +0300
-@@ -89,6 +89,7 @@
- extern struct lcd_panel innovator1610_panel;
- extern struct lcd_panel innovator1510_panel;
- extern struct lcd_panel lph8923_panel;
-+extern struct lcd_panel h6300_panel;
++              spin_lock(&sysctl_lock);
++              unuse_table(head);
+               if (error != -ENOTDIR)
+-                      return error;
+-              tmp = tmp->next;
+-      } while (tmp != &root_table_header.ctl_entry);
+-      return -ENOTDIR;
++                      break;
++      } while ((tmp = tmp->next) != &root_table_header.ctl_entry);
++      spin_unlock(&sysctl_lock);
++      return error;
+ }
  
- static struct lcd_panel *panels[] = {
- #ifdef CONFIG_MACH_OMAP_H2
-@@ -109,6 +110,9 @@
- #ifdef CONFIG_MACH_OMAP_PALMTE
-       &palmte_panel,
+ asmlinkage long sys_sysctl(struct __sysctl_args __user *args)
+@@ -1236,12 +1288,16 @@
+               return NULL;
+       tmp->ctl_table = table;
+       INIT_LIST_HEAD(&tmp->ctl_entry);
++      tmp->used = 0;
++      tmp->unregistering = NULL;
++      spin_lock(&sysctl_lock);
+       if (insert_at_head)
+               list_add(&tmp->ctl_entry, &root_table_header.ctl_entry);
+       else
+               list_add_tail(&tmp->ctl_entry, &root_table_header.ctl_entry);
++      spin_unlock(&sysctl_lock);
+ #ifdef CONFIG_PROC_FS
+-      register_proc_table(table, proc_sys_root);
++      register_proc_table(table, proc_sys_root, tmp);
  #endif
-+#ifdef CONFIG_MACH_OMAP_H6300
-+      &h6300_panel,
-+#endif
+       return tmp;
+ }
+@@ -1255,10 +1311,13 @@
+  */
+ void unregister_sysctl_table(struct ctl_table_header * header)
+ {
+-      list_del(&header->ctl_entry);
++      might_sleep();
++      spin_lock(&sysctl_lock);
++      start_unregistering(header);
+ #ifdef CONFIG_PROC_FS
+       unregister_proc_table(header->ctl_table, proc_sys_root);
+ #endif
++      spin_unlock(&sysctl_lock);
+       kfree(header);
+ }
  
- #ifdef CONFIG_MACH_OMAP_INNOVATOR
+@@ -1269,7 +1328,7 @@
+ #ifdef CONFIG_PROC_FS
+ /* Scan the sysctl entries in table and add them all into /proc */
+-static void register_proc_table(ctl_table * table, struct proc_dir_entry *root)
++static void register_proc_table(ctl_table * table, struct proc_dir_entry *root, void *set)
+ {
+       struct proc_dir_entry *de;
+       int len;
+@@ -1305,13 +1364,14 @@
+                       de = create_proc_entry(table->procname, mode, root);
+                       if (!de)
+                               continue;
++                      de->set = set;
+                       de->data = (void *) table;
+                       if (table->proc_handler)
+                               de->proc_fops = &proc_sys_file_operations;
+               }
+               table->de = de;
+               if (de->mode & S_IFDIR)
+-                      register_proc_table(table->child, de);
++                      register_proc_table(table->child, de, set);
+       }
+ }
+@@ -1336,6 +1396,13 @@
+                               continue;
+               }
++              /*
++               * In any case, mark the entry as goner; we'll keep it
++               * around if it's busy, but we'll know to do nothing with
++               * its fields.  We are under sysctl_lock here.
++               */
++              de->data = NULL;
++
+               /* Don't unregister proc entries that are still being used.. */
+               if (atomic_read(&de->count))
+                       continue;
+@@ -1349,27 +1416,38 @@
+                         size_t count, loff_t *ppos)
+ {
+       int op;
+-      struct proc_dir_entry *de;
++      struct proc_dir_entry *de = PDE(file->f_dentry->d_inode);
+       struct ctl_table *table;
+       size_t res;
+-      ssize_t error;
+-      
+-      de = PDE(file->f_dentry->d_inode);
+-      if (!de || !de->data)
+-              return -ENOTDIR;
+-      table = (struct ctl_table *) de->data;
+-      if (!table || !table->proc_handler)
+-              return -ENOTDIR;
+-      op = (write ? 002 : 004);
+-      if (ctl_perm(table, op))
+-              return -EPERM;
++      ssize_t error = -ENOTDIR;
+       
+-      res = count;
+-
+-      error = (*table->proc_handler) (table, write, file, buf, &res, ppos);
+-      if (error)
+-              return error;
+-      return res;
++      spin_lock(&sysctl_lock);
++      if (de && de->data && use_table(de->set)) {
++              /*
++               * at that point we know that sysctl was not unregistered
++               * and won't be until we finish
++               */
++              spin_unlock(&sysctl_lock);
++              table = (struct ctl_table *) de->data;
++              if (!table || !table->proc_handler)
++                      goto out;
++              error = -EPERM;
++              op = (write ? 002 : 004);
++              if (ctl_perm(table, op))
++                      goto out;
++              
++              /* careful: calling conventions are nasty here */
++              res = count;
++              error = (*table->proc_handler)(table, write, file,
++                                              buf, &res, ppos);
++              if (!error)
++                      error = res;
++      out:
++              spin_lock(&sysctl_lock);
++              unuse_table(de->set);
++      }
++      spin_unlock(&sysctl_lock);
++      return error;
+ }
  
-@@ -260,18 +264,40 @@
-                       u_int blue, u_int transp, int update_hw_pal)
+ static int proc_opensys(struct inode *inode, struct file *file)
+diff -Naur linux-2.6.14-omap2/Makefile linux-h6300-omap2-2.6.14.3/Makefile
+--- linux-2.6.14-omap2/Makefile        2005-12-02 01:53:31.000000000 +0200
++++ linux-h6300-omap2-2.6.14.3/Makefile        2005-12-02 01:34:34.000000000 +0200
+@@ -1,7 +1,7 @@
+ VERSION = 2
+ PATCHLEVEL = 6
+ SUBLEVEL = 14
+-EXTRAVERSION =
++EXTRAVERSION = .3
+ NAME=Affluent Albatross
+ # *DOCUMENTATION*
+@@ -11,7 +11,7 @@
+ # expect to learn how to build the kernel reading this file.
+ # Add custom flags here to avoid conflict with updates
+-EXTRAVERSION := $(EXTRAVERSION)-omap2
++EXTRAVERSION := $(EXTRAVERSION)-omap1-h6300
+ # Do not print "Entering directory ..."
+ MAKEFLAGS += --no-print-directory
+diff -Naur linux-2.6.14-omap2/net/core/datagram.c linux-h6300-omap2-2.6.14.3/net/core/datagram.c
+--- linux-2.6.14-omap2/net/core/datagram.c     2005-10-28 03:02:08.000000000 +0300
++++ linux-h6300-omap2-2.6.14.3/net/core/datagram.c     2005-11-23 01:44:02.000000000 +0200
+@@ -213,6 +213,10 @@
+ {
+       int i, err, fraglen, end = 0;
+       struct sk_buff *next = skb_shinfo(skb)->frag_list;
++
++      if (!len)
++              return 0;
++
+ next_skb:
+       fraglen = skb_headlen(skb);
+       i = -1;
+diff -Naur linux-2.6.14-omap2/net/ipv4/ipvs/ip_vs_core.c linux-h6300-omap2-2.6.14.3/net/ipv4/ipvs/ip_vs_core.c
+--- linux-2.6.14-omap2/net/ipv4/ipvs/ip_vs_core.c      2005-10-28 03:02:08.000000000 +0300
++++ linux-h6300-omap2-2.6.14.3/net/ipv4/ipvs/ip_vs_core.c      2005-11-23 01:44:02.000000000 +0200
+@@ -1009,11 +1009,10 @@
+               if (sysctl_ip_vs_expire_nodest_conn) {
+                       /* try to expire the connection immediately */
+                       ip_vs_conn_expire_now(cp);
+-              } else {
+-                      /* don't restart its timer, and silently
+-                         drop the packet. */
+-                      __ip_vs_conn_put(cp);
+               }
++              /* don't restart its timer, and silently
++                 drop the packet. */
++              __ip_vs_conn_put(cp);
+               return NF_DROP;
+       }
+diff -Naur linux-2.6.14-omap2/net/ipv4/netfilter/ip_conntrack_ftp.c linux-h6300-omap2-2.6.14.3/net/ipv4/netfilter/ip_conntrack_ftp.c
+--- linux-2.6.14-omap2/net/ipv4/netfilter/ip_conntrack_ftp.c   2005-10-28 03:02:08.000000000 +0300
++++ linux-h6300-omap2-2.6.14.3/net/ipv4/netfilter/ip_conntrack_ftp.c   2005-12-02 01:34:35.000000000 +0200
+@@ -29,9 +29,9 @@
+ static DEFINE_SPINLOCK(ip_ftp_lock);
+ #define MAX_PORTS 8
+-static short ports[MAX_PORTS];
++static unsigned short ports[MAX_PORTS];
+ static int ports_c;
+-module_param_array(ports, short, &ports_c, 0400);
++module_param_array(ports, ushort, &ports_c, 0400);
+ static int loose;
+ module_param(loose, int, 0600);
+diff -Naur linux-2.6.14-omap2/net/ipv4/netfilter/ip_conntrack_irc.c linux-h6300-omap2-2.6.14.3/net/ipv4/netfilter/ip_conntrack_irc.c
+--- linux-2.6.14-omap2/net/ipv4/netfilter/ip_conntrack_irc.c   2005-10-28 03:02:08.000000000 +0300
++++ linux-h6300-omap2-2.6.14.3/net/ipv4/netfilter/ip_conntrack_irc.c   2005-12-02 01:34:35.000000000 +0200
+@@ -34,7 +34,7 @@
+ #include <linux/moduleparam.h>
+ #define MAX_PORTS 8
+-static short ports[MAX_PORTS];
++static unsigned short ports[MAX_PORTS];
+ static int ports_c;
+ static int max_dcc_channels = 8;
+ static unsigned int dcc_timeout = 300;
+@@ -52,7 +52,7 @@
+ MODULE_AUTHOR("Harald Welte <laforge@netfilter.org>");
+ MODULE_DESCRIPTION("IRC (DCC) connection tracking helper");
+ MODULE_LICENSE("GPL");
+-module_param_array(ports, short, &ports_c, 0400);
++module_param_array(ports, ushort, &ports_c, 0400);
+ MODULE_PARM_DESC(ports, "port numbers of IRC servers");
+ module_param(max_dcc_channels, int, 0400);
+ MODULE_PARM_DESC(max_dcc_channels, "max number of expected DCC channels per IRC session");
+diff -Naur linux-2.6.14-omap2/net/ipv4/netfilter/ip_conntrack_netlink.c linux-h6300-omap2-2.6.14.3/net/ipv4/netfilter/ip_conntrack_netlink.c
+--- linux-2.6.14-omap2/net/ipv4/netfilter/ip_conntrack_netlink.c       2005-10-28 03:02:08.000000000 +0300
++++ linux-h6300-omap2-2.6.14.3/net/ipv4/netfilter/ip_conntrack_netlink.c       2005-12-02 01:34:35.000000000 +0200
+@@ -58,14 +58,17 @@
+                           const struct ip_conntrack_tuple *tuple)
+ {
+       struct ip_conntrack_protocol *proto;
++      int ret = 0;
+       NFA_PUT(skb, CTA_PROTO_NUM, sizeof(u_int8_t), &tuple->dst.protonum);
+       proto = ip_conntrack_proto_find_get(tuple->dst.protonum);
+-      if (proto && proto->tuple_to_nfattr)
+-              return proto->tuple_to_nfattr(skb, tuple);
++      if (likely(proto && proto->tuple_to_nfattr)) {
++              ret = proto->tuple_to_nfattr(skb, tuple);
++              ip_conntrack_proto_put(proto);
++      }
+-      return 0;
++      return ret;
+ nfattr_failure:
+       return -1;
+diff -Naur linux-2.6.14-omap2/net/ipv4/netfilter/ip_conntrack_proto_icmp.c linux-h6300-omap2-2.6.14.3/net/ipv4/netfilter/ip_conntrack_proto_icmp.c
+--- linux-2.6.14-omap2/net/ipv4/netfilter/ip_conntrack_proto_icmp.c    2005-10-28 03:02:08.000000000 +0300
++++ linux-h6300-omap2-2.6.14.3/net/ipv4/netfilter/ip_conntrack_proto_icmp.c    2005-12-02 01:34:35.000000000 +0200
+@@ -296,7 +296,8 @@
+                               struct ip_conntrack_tuple *tuple)
+ {
+       if (!tb[CTA_PROTO_ICMP_TYPE-1]
+-          || !tb[CTA_PROTO_ICMP_CODE-1])
++          || !tb[CTA_PROTO_ICMP_CODE-1]
++          || !tb[CTA_PROTO_ICMP_ID-1])
+               return -1;
+       tuple->dst.u.icmp.type = 
+diff -Naur linux-2.6.14-omap2/net/ipv4/netfilter/ip_conntrack_proto_tcp.c linux-h6300-omap2-2.6.14.3/net/ipv4/netfilter/ip_conntrack_proto_tcp.c
+--- linux-2.6.14-omap2/net/ipv4/netfilter/ip_conntrack_proto_tcp.c     2005-10-28 03:02:08.000000000 +0300
++++ linux-h6300-omap2-2.6.14.3/net/ipv4/netfilter/ip_conntrack_proto_tcp.c     2005-12-02 01:34:35.000000000 +0200
+@@ -362,6 +362,11 @@
+       struct nfattr *attr = cda[CTA_PROTOINFO_TCP-1];
+       struct nfattr *tb[CTA_PROTOINFO_TCP_MAX];
++      /* updates could not contain anything about the private
++       * protocol info, in that case skip the parsing */
++      if (!attr)
++              return 0;
++
+         if (nfattr_parse_nested(tb, CTA_PROTOINFO_TCP_MAX, attr) < 0)
+                 goto nfattr_failure;
+@@ -813,6 +818,7 @@
  {
-       struct omapfb_device *fbdev = (struct omapfb_device *)info->par;
--      u16 pal;
-       int r = 0;
+       [TH_SYN]                        = 1,
+       [TH_SYN|TH_ACK]                 = 1,
++      [TH_SYN|TH_PUSH]                = 1,
+       [TH_SYN|TH_ACK|TH_PUSH]         = 1,
+       [TH_RST]                        = 1,
+       [TH_RST|TH_ACK]                 = 1,
+diff -Naur linux-2.6.14-omap2/net/ipv4/netfilter/ip_conntrack_tftp.c linux-h6300-omap2-2.6.14.3/net/ipv4/netfilter/ip_conntrack_tftp.c
+--- linux-2.6.14-omap2/net/ipv4/netfilter/ip_conntrack_tftp.c  2005-10-28 03:02:08.000000000 +0300
++++ linux-h6300-omap2-2.6.14.3/net/ipv4/netfilter/ip_conntrack_tftp.c  2005-12-02 01:34:35.000000000 +0200
+@@ -26,9 +26,9 @@
+ MODULE_LICENSE("GPL");
+ #define MAX_PORTS 8
+-static short ports[MAX_PORTS];
++static unsigned short ports[MAX_PORTS];
+ static int ports_c;
+-module_param_array(ports, short, &ports_c, 0400);
++module_param_array(ports, ushort, &ports_c, 0400);
+ MODULE_PARM_DESC(ports, "port numbers of tftp servers");
  
--      if (regno < 16) {
--              pal = ((red >> 11) << 11) | ((green >> 10) << 5) | (blue >> 11);
--              ((u32 *)(info->pseudo_palette))[regno] = pal;
+ #if 0
+diff -Naur linux-2.6.14-omap2/net/ipv4/netfilter/ip_nat_core.c linux-h6300-omap2-2.6.14.3/net/ipv4/netfilter/ip_nat_core.c
+--- linux-2.6.14-omap2/net/ipv4/netfilter/ip_nat_core.c        2005-10-28 03:02:08.000000000 +0300
++++ linux-h6300-omap2-2.6.14.3/net/ipv4/netfilter/ip_nat_core.c        2005-12-02 01:34:35.000000000 +0200
+@@ -66,10 +66,8 @@
+        * removed until we've grabbed the reference */
+       preempt_disable();
+       p = __ip_nat_proto_find(protonum);
+-      if (p) {
+-              if (!try_module_get(p->me))
+-                      p = &ip_nat_unknown_protocol;
 -      }
-+      switch (fbdev->color_mode) {
-+      case OMAPFB_COLOR_YUV422:
-+      case OMAPFB_COLOR_YUV420:
-+              r = -EINVAL;
-+              break;
-+      case OMAPFB_COLOR_CLUT_8BPP:
-+      case OMAPFB_COLOR_CLUT_4BPP:
-+      case OMAPFB_COLOR_CLUT_2BPP:
-+      case OMAPFB_COLOR_CLUT_1BPP:
-+              if (fbdev->ctrl->setcolreg)
-+                      r = fbdev->ctrl->setcolreg(regno, red, green, blue,
-+                                                      transp, update_hw_pal);
-+              /* Fallthrough */
-+      case OMAPFB_COLOR_RGB565:
-+              if (r != 0)
-+                      break;
++      if (!try_module_get(p->me))
++              p = &ip_nat_unknown_protocol;
+       preempt_enable();
  
--      if (fbdev->ctrl->setcolreg)
--              r = fbdev->ctrl->setcolreg(regno, red, green, blue, transp,
--                                              update_hw_pal);
-+              if (regno < 0) {
-+                      r = -EINVAL;
-+                      break;
-+              }
+       return p;
+diff -Naur linux-2.6.14-omap2/net/ipv4/netfilter/ip_nat_helper_pptp.c linux-h6300-omap2-2.6.14.3/net/ipv4/netfilter/ip_nat_helper_pptp.c
+--- linux-2.6.14-omap2/net/ipv4/netfilter/ip_nat_helper_pptp.c 2005-10-28 03:02:08.000000000 +0300
++++ linux-h6300-omap2-2.6.14.3/net/ipv4/netfilter/ip_nat_helper_pptp.c 2005-12-02 01:34:35.000000000 +0200
+@@ -73,6 +73,7 @@
+       struct ip_conntrack_tuple t;
+       struct ip_ct_pptp_master *ct_pptp_info;
+       struct ip_nat_pptp *nat_pptp_info;
++      struct ip_nat_range range;
+       ct_pptp_info = &master->help.ct_pptp_info;
+       nat_pptp_info = &master->nat.help.nat_pptp_info;
+@@ -110,7 +111,30 @@
+               DEBUGP("not found!\n");
+       }
+-      ip_nat_follow_master(ct, exp);
++      /* This must be a fresh one. */
++      BUG_ON(ct->status & IPS_NAT_DONE_MASK);
++
++      /* Change src to where master sends to */
++      range.flags = IP_NAT_RANGE_MAP_IPS;
++      range.min_ip = range.max_ip
++              = ct->master->tuplehash[!exp->dir].tuple.dst.ip;
++      if (exp->dir == IP_CT_DIR_ORIGINAL) {
++              range.flags |= IP_NAT_RANGE_PROTO_SPECIFIED;
++              range.min = range.max = exp->saved_proto;
++      }
++      /* hook doesn't matter, but it has to do source manip */
++      ip_nat_setup_info(ct, &range, NF_IP_POST_ROUTING);
++
++      /* For DST manip, map port here to where it's expected. */
++      range.flags = IP_NAT_RANGE_MAP_IPS;
++      range.min_ip = range.max_ip
++              = ct->master->tuplehash[!exp->dir].tuple.src.ip;
++      if (exp->dir == IP_CT_DIR_REPLY) {
++              range.flags |= IP_NAT_RANGE_PROTO_SPECIFIED;
++              range.min = range.max = exp->saved_proto;
++      }
++      /* hook doesn't matter, but it has to do destination manip */
++      ip_nat_setup_info(ct, &range, NF_IP_PRE_ROUTING);
+ }
+ /* outbound packets == from PNS to PAC */
+@@ -213,7 +237,7 @@
+       /* alter expectation for PNS->PAC direction */
+       invert_tuplepr(&inv_t, &expect_orig->tuple);
+-      expect_orig->saved_proto.gre.key = htons(nat_pptp_info->pac_call_id);
++      expect_orig->saved_proto.gre.key = htons(ct_pptp_info->pns_call_id);
+       expect_orig->tuple.src.u.gre.key = htons(nat_pptp_info->pns_call_id);
+       expect_orig->tuple.dst.u.gre.key = htons(ct_pptp_info->pac_call_id);
+       inv_t.src.ip = reply_t->src.ip;
+diff -Naur linux-2.6.14-omap2/net/ipv4/netfilter/ip_nat_proto_gre.c linux-h6300-omap2-2.6.14.3/net/ipv4/netfilter/ip_nat_proto_gre.c
+--- linux-2.6.14-omap2/net/ipv4/netfilter/ip_nat_proto_gre.c   2005-10-28 03:02:08.000000000 +0300
++++ linux-h6300-omap2-2.6.14.3/net/ipv4/netfilter/ip_nat_proto_gre.c   2005-12-02 01:34:35.000000000 +0200
+@@ -139,8 +139,8 @@
+                       break;
+               case GRE_VERSION_PPTP:
+                       DEBUGP("call_id -> 0x%04x\n", 
+-                              ntohl(tuple->dst.u.gre.key));
+-                      pgreh->call_id = htons(ntohl(tuple->dst.u.gre.key));
++                              ntohs(tuple->dst.u.gre.key));
++                      pgreh->call_id = tuple->dst.u.gre.key;
+                       break;
+               default:
+                       DEBUGP("can't nat unknown GRE version\n");
+diff -Naur linux-2.6.14-omap2/net/ipv4/netfilter/ip_nat_proto_unknown.c linux-h6300-omap2-2.6.14.3/net/ipv4/netfilter/ip_nat_proto_unknown.c
+--- linux-2.6.14-omap2/net/ipv4/netfilter/ip_nat_proto_unknown.c       2005-10-28 03:02:08.000000000 +0300
++++ linux-h6300-omap2-2.6.14.3/net/ipv4/netfilter/ip_nat_proto_unknown.c       2005-12-02 01:34:35.000000000 +0200
+@@ -62,7 +62,7 @@
+ struct ip_nat_protocol ip_nat_unknown_protocol = {
+       .name                   = "unknown",
+-      .me                     = THIS_MODULE,
++      /* .me isn't set: getting a ref to this cannot fail. */
+       .manip_pkt              = unknown_manip_pkt,
+       .in_range               = unknown_in_range,
+       .unique_tuple           = unknown_unique_tuple,
+diff -Naur linux-2.6.14-omap2/net/ipv4/tcp_bic.c linux-h6300-omap2-2.6.14.3/net/ipv4/tcp_bic.c
+--- linux-2.6.14-omap2/net/ipv4/tcp_bic.c      2005-10-28 03:02:08.000000000 +0300
++++ linux-h6300-omap2-2.6.14.3/net/ipv4/tcp_bic.c      2005-11-23 01:44:02.000000000 +0200
+@@ -27,7 +27,7 @@
+                                         */
+ static int fast_convergence = 1;
+-static int max_increment = 32;
++static int max_increment = 16;
+ static int low_window = 14;
+ static int beta = 819;                /* = 819/1024 (BICTCP_BETA_SCALE) */
+ static int low_utilization_threshold = 153;
+diff -Naur linux-2.6.14-omap2/net/ipv6/datagram.c linux-h6300-omap2-2.6.14.3/net/ipv6/datagram.c
+--- linux-2.6.14-omap2/net/ipv6/datagram.c     2005-10-28 03:02:08.000000000 +0300
++++ linux-h6300-omap2-2.6.14.3/net/ipv6/datagram.c     2005-12-02 01:34:35.000000000 +0200
+@@ -437,7 +437,7 @@
+                               break;
+                       case IPPROTO_AH:
+                               nexthdr = ptr[0];
+-                              len = (ptr[1] + 1) << 2;
++                              len = (ptr[1] + 2) << 2;
+                               break;
+                       default:
+                               nexthdr = ptr[0];
+diff -Naur linux-2.6.14-omap2/net/ipv6/exthdrs.c linux-h6300-omap2-2.6.14.3/net/ipv6/exthdrs.c
+--- linux-2.6.14-omap2/net/ipv6/exthdrs.c      2005-10-28 03:02:08.000000000 +0300
++++ linux-h6300-omap2-2.6.14.3/net/ipv6/exthdrs.c      2005-12-02 01:34:35.000000000 +0200
+@@ -628,6 +628,7 @@
+       if (!tot_len)
+               return NULL;
  
-+              if (regno < 16) {
-+                      u16 pal;
-+                      pal = ((red >> 11) << 11) | ((green >> 10) << 5) |
-+                              (blue >> 11);
-+                      ((u32 *)(info->pseudo_palette))[regno] = pal;
++      tot_len += sizeof(*opt2);
+       opt2 = sock_kmalloc(sk, tot_len, GFP_ATOMIC);
+       if (!opt2)
+               return ERR_PTR(-ENOBUFS);
+@@ -668,7 +669,26 @@
+       return opt2;
+ out:
+-      sock_kfree_s(sk, p, tot_len);
++      sock_kfree_s(sk, opt2, opt2->tot_len);
+       return ERR_PTR(err);
+ }
++struct ipv6_txoptions *ipv6_fixup_options(struct ipv6_txoptions *opt_space,
++                                        struct ipv6_txoptions *opt)
++{
++      /*
++       * ignore the dest before srcrt unless srcrt is being included.
++       * --yoshfuji
++       */
++      if (opt && opt->dst0opt && !opt->srcrt) {
++              if (opt_space != opt) {
++                      memcpy(opt_space, opt, sizeof(*opt_space));
++                      opt = opt_space;
 +              }
-+              break;
-+      default:
-+              BUG();
++              opt->opt_nflen -= ipv6_optlen(opt->dst0opt);
++              opt->dst0opt = NULL;
 +      }
-       return r;
++
++      return opt;
++}
++
+diff -Naur linux-2.6.14-omap2/net/ipv6/ip6_flowlabel.c linux-h6300-omap2-2.6.14.3/net/ipv6/ip6_flowlabel.c
+--- linux-2.6.14-omap2/net/ipv6/ip6_flowlabel.c        2005-10-28 03:02:08.000000000 +0300
++++ linux-h6300-omap2-2.6.14.3/net/ipv6/ip6_flowlabel.c        2005-12-02 01:34:35.000000000 +0200
+@@ -225,20 +225,16 @@
+                                        struct ip6_flowlabel * fl,
+                                        struct ipv6_txoptions * fopt)
+ {
+-      struct ipv6_txoptions * fl_opt = fl ? fl->opt : NULL;
++      struct ipv6_txoptions * fl_opt = fl->opt;
+-      if (fopt == NULL || fopt->opt_flen == 0) {
+-              if (!fl_opt || !fl_opt->dst0opt || fl_opt->srcrt)
+-                      return fl_opt;
+-      }
++      if (fopt == NULL || fopt->opt_flen == 0)
++              return fl_opt;
+       if (fl_opt != NULL) {
+               opt_space->hopopt = fl_opt->hopopt;
+-              opt_space->dst0opt = fl_opt->srcrt ? fl_opt->dst0opt : NULL;
++              opt_space->dst0opt = fl_opt->dst0opt;
+               opt_space->srcrt = fl_opt->srcrt;
+               opt_space->opt_nflen = fl_opt->opt_nflen;
+-              if (fl_opt->dst0opt && !fl_opt->srcrt)
+-                      opt_space->opt_nflen -= ipv6_optlen(fl_opt->dst0opt);
+       } else {
+               if (fopt->opt_nflen == 0)
+                       return fopt;
+diff -Naur linux-2.6.14-omap2/net/ipv6/raw.c linux-h6300-omap2-2.6.14.3/net/ipv6/raw.c
+--- linux-2.6.14-omap2/net/ipv6/raw.c  2005-10-28 03:02:08.000000000 +0300
++++ linux-h6300-omap2-2.6.14.3/net/ipv6/raw.c  2005-12-02 01:34:35.000000000 +0200
+@@ -756,7 +756,9 @@
+       }
+       if (opt == NULL)
+               opt = np->opt;
+-      opt = fl6_merge_options(&opt_space, flowlabel, opt);
++      if (flowlabel)
++              opt = fl6_merge_options(&opt_space, flowlabel, opt);
++      opt = ipv6_fixup_options(&opt_space, opt);
+       fl.proto = proto;
+       rawv6_probe_proto_opt(&fl, msg);
+diff -Naur linux-2.6.14-omap2/net/ipv6/udp.c linux-h6300-omap2-2.6.14.3/net/ipv6/udp.c
+--- linux-2.6.14-omap2/net/ipv6/udp.c  2005-10-28 03:02:08.000000000 +0300
++++ linux-h6300-omap2-2.6.14.3/net/ipv6/udp.c  2005-12-02 01:34:35.000000000 +0200
+@@ -778,7 +778,9 @@
+       }
+       if (opt == NULL)
+               opt = np->opt;
+-      opt = fl6_merge_options(&opt_space, flowlabel, opt);
++      if (flowlabel)
++              opt = fl6_merge_options(&opt_space, flowlabel, opt);
++      opt = ipv6_fixup_options(&opt_space, opt);
+       fl->proto = IPPROTO_UDP;
+       ipv6_addr_copy(&fl->fl6_dst, daddr);
+diff -Naur linux-2.6.14-omap2/net/netfilter/nf_queue.c linux-h6300-omap2-2.6.14.3/net/netfilter/nf_queue.c
+--- linux-2.6.14-omap2/net/netfilter/nf_queue.c        2005-10-28 03:02:08.000000000 +0300
++++ linux-h6300-omap2-2.6.14.3/net/netfilter/nf_queue.c        2005-12-02 01:34:35.000000000 +0200
+@@ -117,7 +117,7 @@
+       /* QUEUE == DROP if noone is waiting, to be safe. */
+       read_lock(&queue_handler_lock);
+-      if (!queue_handler[pf]->outfn) {
++      if (!queue_handler[pf] || !queue_handler[pf]->outfn) {
+               read_unlock(&queue_handler_lock);
+               kfree_skb(*skb);
+               return 1;
+diff -Naur linux-2.6.14-omap2/sound/arm/Kconfig linux-h6300-omap2-2.6.14.3/sound/arm/Kconfig
+--- linux-2.6.14-omap2/sound/arm/Kconfig       2005-12-02 01:53:34.000000000 +0200
++++ linux-h6300-omap2-2.6.14.3/sound/arm/Kconfig       2005-11-13 02:15:10.000000000 +0200
+@@ -45,5 +45,15 @@
+         To compile this driver as a module, choose M here: the module
+         will be called snd-omap-aic23.
++        
++config SND_OMAP_TSC2101
++      tristate "OMAP TSC2101 driver (iPaq H63xx)"
++      depends ARCH_OMAP && SND
++      select SND_PCM
++      help
++              ALSA driver for TI TSC2101.
++
++              To compile this driver as a module, choose M here: the module
++              will be called snd-omap-tsc2101.
+ endmenu
+diff -Naur linux-2.6.14-omap2/sound/arm/Makefile linux-h6300-omap2-2.6.14.3/sound/arm/Makefile
+--- linux-2.6.14-omap2/sound/arm/Makefile      2005-12-02 01:53:34.000000000 +0200
++++ linux-h6300-omap2-2.6.14.3/sound/arm/Makefile      2005-11-13 02:15:10.000000000 +0200
+@@ -16,3 +16,6 @@
+ obj-$(CONFIG_SND_OMAP_AIC23) += snd-omap-aic23.o
+ snd-omap-aic23-objs := omap-aic23.o omap-alsa-dma.o omap-alsa-mixer.o
++
++obj-$(CONFIG_SND_OMAP_TSC2101) += snd-omap-tsc2101.o
++snd-omap-tsc2101-objs := omap-tsc2101.o omap-alsa-dma.o
+diff -Naur linux-2.6.14-omap2/sound/arm/omap-aic23.c linux-h6300-omap2-2.6.14.3/sound/arm/omap-aic23.c
+--- linux-2.6.14-omap2/sound/arm/omap-aic23.c  2005-12-02 01:53:34.000000000 +0200
++++ linux-h6300-omap2-2.6.14.3/sound/arm/omap-aic23.c  2005-11-13 02:15:10.000000000 +0200
+@@ -262,144 +262,6 @@
  }
  
-diff -Naur /home/lamikr/own/h6340/kernel/linux-2.6.14-rc5/.gitignore bt_kernel/.gitignore
---- /home/lamikr/own/h6340/kernel/linux-2.6.14-rc5/.gitignore  2005-10-20 09:23:05.000000000 +0300
-+++ bt_kernel/.gitignore       1970-01-01 02:00:00.000000000 +0200
-@@ -1,30 +0,0 @@
--#
--# NOTE! Don't add files that are generated in specific
--# subdirectories here. Add them in the ".gitignore" file
--# in that subdirectory instead.
--#
--# Normal rules
--#
--.*
--*.o
--*.a
--*.s
--*.ko
--*.mod.c
+ /* 
+- * DMA functions 
+- * Depends on omap-aic23-dma.c functions and (omap) dma.c
+- * 
+- */
+-#define DMA_BUF_SIZE  1024 * 8
 -
--#
--# Top-level generic files
--#
--vmlinux*
--System.map
--Module.symvers
+-static int audio_dma_request(struct audio_stream *s,
+-                           void (*callback) (void *))
+-{
+-      int err;
 -
--#
--# Generated include files
--#
--include/asm
--include/config
--include/linux/autoconf.h
--include/linux/compile.h
--include/linux/version.h
+-      err = omap_request_sound_dma(s->dma_dev, s->id, s, &s->lch);
+-      if (err < 0)
+-              printk(KERN_ERR "unable to grab audio dma 0x%x\n",
+-                     s->dma_dev);
+-      return err;
+-}
 -
-diff -Naur /home/lamikr/own/h6340/kernel/linux-2.6.14-rc5/include/asm-arm/arch-omap/board-h6300.h bt_kernel/include/asm-arm/arch-omap/board-h6300.h
---- /home/lamikr/own/h6340/kernel/linux-2.6.14-rc5/include/asm-arm/arch-omap/board-h6300.h     1970-01-01 02:00:00.000000000 +0200
-+++ bt_kernel/include/asm-arm/arch-omap/board-h6300.h  2005-08-12 13:46:22.016114000 +0300
-@@ -0,0 +1,40 @@
-+/*
-+ * linux/include/asm-arm/arch-omap/board-innovator.h
-+ *
-+ * Copyright (C) 2001 RidgeRun, Inc.
-+ *
-+ * This program is free software; you can redistribute it and/or modify it
-+ * under the terms of the GNU General Public License as published by the
-+ * Free Software Foundation; either version 2 of the License, or (at your
-+ * option) any later version.
-+ *
-+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED
-+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
-+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
-+ * NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
-+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
-+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
-+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
-+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-+ *
-+ * You should have received a copy of the GNU General Public License along
-+ * with this program; if not, write to the Free Software Foundation, Inc.,
-+ * 675 Mass Ave, Cambridge, MA 02139, USA.
-+ */
-+#ifndef __ASM_ARCH_H6300_H
-+#define __ASM_ARCH_H6300_H
-+
-+#ifndef OMAP_SDRAM_DEVICE
-+#define OMAP_SDRAM_DEVICE                     D256M_1X16_4B
-+#endif
-+
-+#define OMAP1510P1_IMIF_PRI_VALUE             0x00
-+#define OMAP1510P1_EMIFS_PRI_VALUE            0x00
-+#define OMAP1510P1_EMIFF_PRI_VALUE            0x00
-+
-+#define NR_FPGA_IRQS          24
-+#define NR_IRQS                 IH_BOARD_BASE + NR_FPGA_IRQS
-+
-+#endif /* __ASM_ARCH_H6300_H */
-diff -Naur /home/lamikr/own/h6340/kernel/linux-2.6.14-rc5/include/asm-arm/arch-omap/cpu.h bt_kernel/include/asm-arm/arch-omap/cpu.h
---- /home/lamikr/own/h6340/kernel/linux-2.6.14-rc5/include/asm-arm/arch-omap/cpu.h     2005-10-30 17:44:19.208806581 +0200
-+++ bt_kernel/include/asm-arm/arch-omap/cpu.h  2005-10-30 16:32:39.609796000 +0200
-@@ -215,4 +215,9 @@
- #  define cpu_is_omap2420()           1
- #endif
+-static int audio_dma_free(struct audio_stream *s)
+-{
+-      int err = 0;
+-
+-      err = omap_free_sound_dma(s, &s->lch);
+-      if (err < 0)
+-              printk(KERN_ERR "Unable to free audio dma channels!\n");
+-      return err;
+-}
+-
+-/*
+- *  This function should calculate the current position of the dma in the
+- *  buffer. It will help alsa middle layer to continue update the buffer.
+- *  Its correctness is crucial for good functioning.
+- */
+-static u_int audio_get_dma_pos(struct audio_stream *s)
+-{
+-      snd_pcm_substream_t *substream = s->stream;
+-      snd_pcm_runtime_t *runtime = substream->runtime;
+-      unsigned int offset;
+-      unsigned long flags;
+-      dma_addr_t count;
+-      ADEBUG();
+-
+-      /* this must be called w/ interrupts locked as requested in dma.c */
+-      spin_lock_irqsave(&s->dma_lock, flags);
+-
+-      /* For the current period let's see where we are */
+-      count = omap_get_dma_src_addr_counter(s->lch[s->dma_q_head]);
+-
+-      spin_unlock_irqrestore(&s->dma_lock, flags);
+-
+-      /* Now, the position related to the end of that period */
+-      offset = bytes_to_frames(runtime, s->offset) - bytes_to_frames(runtime, count);
+-
+-      if (offset >= runtime->buffer_size || offset < 0)
+-              offset = 0;
+-
+-      return offset;
+-}
+-
+-/*
+- * this stops the dma and clears the dma ptrs
+- */
+-static void audio_stop_dma(struct audio_stream *s)
+-{
+-      unsigned long flags;
+-      ADEBUG();
+-
+-      spin_lock_irqsave(&s->dma_lock, flags);
+-      s->active = 0;
+-      s->period = 0;
+-      s->periods = 0;
+-
+-      /* this stops the dma channel and clears the buffer ptrs */
+-      omap_audio_stop_dma(s);
+-
+-      omap_clear_sound_dma(s);
+-
+-      spin_unlock_irqrestore(&s->dma_lock, flags);
+-}
+-
+-/*
+- *  Main dma routine, requests dma according where you are in main alsa buffer
+- */
+-static void audio_process_dma(struct audio_stream *s)
+-{
+-      snd_pcm_substream_t *substream = s->stream;
+-      snd_pcm_runtime_t *runtime;
+-      unsigned int dma_size;
+-      unsigned int offset;
+-      int ret;
+-
+-      runtime = substream->runtime;
+-      if (s->active) {
+-              dma_size = frames_to_bytes(runtime, runtime->period_size);
+-              offset = dma_size * s->period;
+-              snd_assert(dma_size <= DMA_BUF_SIZE,);
+-              ret =
+-                  omap_start_sound_dma(s,
+-                                       (dma_addr_t) runtime->dma_area +
+-                                       offset, dma_size);
+-              if (ret) {
+-                      printk(KERN_ERR
+-                             "audio_process_dma: cannot queue DMA buffer (%i)\n",
+-                             ret);
+-                      return;
+-              }
+-
+-              s->period++;
+-              s->period %= runtime->periods;
+-              s->periods++;
+-              s->offset = offset;
+-      }
+-}
+-
+-/* 
+- *  This is called when dma IRQ occurs at the end of each transmited block
+- */
+-void audio_dma_callback(void *data)
+-{
+-      struct audio_stream *s = data;
+-
+-      /* 
+-       * If we are getting a callback for an active stream then we inform
+-       * the PCM middle layer we've finished a period
+-       */
+-      if (s->active)
+-              snd_pcm_period_elapsed(s->stream);
+-
+-      spin_lock(&s->dma_lock);
+-      if (s->periods > 0) {
+-              s->periods--;
+-      }
+-      audio_process_dma(s);
+-      spin_unlock(&s->dma_lock);
+-}
+-
+-
+-/* 
+  * Alsa section
+  * PCM settings and callbacks
+  */
+diff -Naur linux-2.6.14-omap2/sound/arm/omap-aic23.h linux-h6300-omap2-2.6.14.3/sound/arm/omap-aic23.h
+--- linux-2.6.14-omap2/sound/arm/omap-aic23.h  2005-12-02 01:53:34.000000000 +0200
++++ linux-h6300-omap2-2.6.14.3/sound/arm/omap-aic23.h  2005-11-13 02:15:10.000000000 +0200
+@@ -43,6 +43,7 @@
+ #include <asm/arch/dma.h>
+ #include <sound/core.h>
+ #include <sound/pcm.h>
++#include "omap-alsa-dma.h"
  
-+/* Macros to detect if we have OMAP1 or OMAP2 */
-+#define cpu_class_is_omap1() (cpu_is_omap730() || cpu_is_omap15xx() || \
-+ cpu_is_omap16xx())
-+#define cpu_class_is_omap2() cpu_is_omap24xx()
-+
- #endif
-diff -Naur /home/lamikr/own/h6340/kernel/linux-2.6.14-rc5/include/asm-arm/arch-omap/dma.h bt_kernel/include/asm-arm/arch-omap/dma.h
---- /home/lamikr/own/h6340/kernel/linux-2.6.14-rc5/include/asm-arm/arch-omap/dma.h     2005-10-20 09:23:05.000000000 +0300
-+++ bt_kernel/include/asm-arm/arch-omap/dma.h  2005-10-30 16:32:39.609796000 +0200
-@@ -217,19 +217,22 @@
- extern void omap_stop_dma(int lch);
- extern void omap_set_dma_transfer_params(int lch, int data_type,
-                                        int elem_count, int frame_count,
--                                       int sync_mode);
-+                                       int sync_mode,
-+                                       int dma_trigger, int src_or_dst_synch);
- extern void omap_set_dma_color_mode(int lch, enum omap_dma_color_mode mode,
-                                   u32 color);
+ #define DEFAULT_OUTPUT_VOLUME         0x60
+ #define DEFAULT_INPUT_VOLUME          0x00    /* 0 ==> mute line in */
+@@ -67,27 +68,6 @@
+ #define DEFAULT_ANALOG_AUDIO_CONTROL  DAC_SELECTED | STE_ENABLED | BYPASS_ON | INSEL_MIC | MICB_20DB
  
- extern void omap_set_dma_src_params(int lch, int src_port, int src_amode,
--                                  unsigned long src_start);
-+                                  unsigned long src_start,
-+                                  int src_ei, int src_fi);
- extern void omap_set_dma_src_index(int lch, int eidx, int fidx);
- extern void omap_set_dma_src_data_pack(int lch, int enable);
- extern void omap_set_dma_src_burst_mode(int lch,
-                                       enum omap_dma_burst_mode burst_mode);
+ /*
+- * Buffer management for alsa and dma
+- */
+-struct audio_stream {
+-      char *id;               /* identification string */
+-      int stream_id;          /* numeric identification */
+-      int dma_dev;            /* dma number of that device */
+-      int *lch;               /* Chain of channels this stream is linked to */
+-      char started;           /* to store if the chain was started or not */
+-      int dma_q_head;         /* DMA Channel Q Head */
+-      int dma_q_tail;         /* DMA Channel Q Tail */
+-      char dma_q_count;       /* DMA Channel Q Count */
+-      int active:1;           /* we are using this stream for transfer now */
+-      int period;             /* current transfer period */
+-      int periods;            /* current count of periods registerd in the DMA engine */
+-      spinlock_t dma_lock;    /* for locking in DMA operations */
+-      snd_pcm_substream_t *stream;    /* the pcm stream */
+-      unsigned linked:1;      /* dma channels linked */
+-      int offset;             /* store start position of the last period in the alsa buffer */
+-};
+-
+-/*
+  * Alsa card structure for aic23
+  */
+ struct snd_card_omap_aic23 {
+@@ -99,7 +79,6 @@
  
- extern void omap_set_dma_dest_params(int lch, int dest_port, int dest_amode,
--                                   unsigned long dest_start);
-+                                   unsigned long dest_start,
-+                                   int dst_ei, int dst_fi);
- extern void omap_set_dma_dest_index(int lch, int eidx, int fidx);
- extern void omap_set_dma_dest_data_pack(int lch, int enable);
- extern void omap_set_dma_dest_burst_mode(int lch,
-diff -Naur /home/lamikr/own/h6340/kernel/linux-2.6.14-rc5/include/asm-arm/arch-omap/hardware.h bt_kernel/include/asm-arm/arch-omap/hardware.h
---- /home/lamikr/own/h6340/kernel/linux-2.6.14-rc5/include/asm-arm/arch-omap/hardware.h        2005-10-30 17:44:19.364781754 +0200
-+++ bt_kernel/include/asm-arm/arch-omap/hardware.h     2005-10-22 03:52:45.687256000 +0300
-@@ -290,6 +290,10 @@
- #include "board-innovator.h"
- #endif
+ /*********** Function Prototypes *************************/
  
-+#ifdef CONFIG_MACH_OMAP_H6300
-+#include "board-h6300.h"
-+#endif
+-void audio_dma_callback(void *);
+ int snd_omap_mixer(struct snd_card_omap_aic23 *);
+ void snd_omap_init_mixer(void);
+ /* Clock functions */
+diff -Naur linux-2.6.14-omap2/sound/arm/omap-alsa-dma.c linux-h6300-omap2-2.6.14.3/sound/arm/omap-alsa-dma.c
+--- linux-2.6.14-omap2/sound/arm/omap-alsa-dma.c       2005-12-02 01:53:34.000000000 +0200
++++ linux-h6300-omap2-2.6.14.3/sound/arm/omap-alsa-dma.c       2005-11-13 02:15:10.000000000 +0200
+@@ -440,6 +440,134 @@
+       return;
+ }
++int audio_dma_request(struct audio_stream *s,
++                           void (*callback) (void *))
++{
++      int err;
 +
- #ifdef CONFIG_MACH_OMAP_H2
- #include "board-h2.h"
- #endif
-diff -Naur /home/lamikr/own/h6340/kernel/linux-2.6.14-rc5/include/asm-arm/arch-omap/h6300_uart_info.h bt_kernel/include/asm-arm/arch-omap/h6300_uart_info.h
---- /home/lamikr/own/h6340/kernel/linux-2.6.14-rc5/include/asm-arm/arch-omap/h6300_uart_info.h 1970-01-01 02:00:00.000000000 +0200
-+++ bt_kernel/include/asm-arm/arch-omap/h6300_uart_info.h      2005-10-14 18:55:31.156317000 +0300
-@@ -0,0 +1,33 @@
-+/*
-+ * Support file for calling h6300 uart configuration functions.
-+ * Used at least by h6300_bt driver.
-+ * 
-+ * Copyright (c) 2005 SDG Systems, LLC
-+ * 2005-03-29   Todd Blumer     Converted  basic structure to support hx4700
-+ * 2005-10-03   Mika Laitio (lamikr@cc.jyu.fi)        Reorganized for the iPAQ h6300 bt driver.
-+ */
++      err = omap_request_sound_dma(s->dma_dev, s->id, s, &s->lch);
++      if (err < 0)
++              printk(KERN_ERR "unable to grab audio dma 0x%x\n",
++                     s->dma_dev);
++      return err;
++}
 +
-+#ifndef _H6300_UART_INFO_H
-+#define _H6300_UART_INFO_H
++int audio_dma_free(struct audio_stream *s)
++{
++      int err = 0;
 +
-+#include "omap_serial.h"
++      err = omap_free_sound_dma(s, &s->lch);
++      if (err < 0)
++              printk(KERN_ERR "Unable to free audio dma channels!\n");
++      return err;
++}
++
++/*
++ *  This function should calculate the current position of the dma in the
++ *  buffer. It will help alsa middle layer to continue update the buffer.
++ *  Its correctness is crucial for good functioning.
++ */
++u_int audio_get_dma_pos(struct audio_stream *s)
++{
++      snd_pcm_substream_t *substream = s->stream;
++      snd_pcm_runtime_t *runtime = substream->runtime;
++      unsigned int offset;
++      unsigned long flags;
++      dma_addr_t count;
 +
-+#define GPIO_BT_PWR_EN 3
-+#define GPIO_N_BT_RST 9
++      /* this must be called w/ interrupts locked as requested in dma.c */
++      spin_lock_irqsave(&s->dma_lock, flags);
 +
-+#define GPIO_I2C_GPRS_RESET 16
-+#define GPIO_I2C_MIC_OP_EN 10
-+#define GPIO_I2C_SPK_OP_PD 11
++      /* For the current period let's see where we are */
++      count = omap_get_dma_src_addr_counter(s->lch[s->dma_q_head]);
 +
-+#define GPIO_VALUE_OFF        0
-+#define GPIO_VALUE_ON 1
++      spin_unlock_irqrestore(&s->dma_lock, flags);
 +
-+#define GPIO_DIR_OUTPUT 1
++      /* Now, the position related to the end of that period */
++      offset = bytes_to_frames(runtime, s->offset) - bytes_to_frames(runtime, count);
 +
-+struct h6300_uart_funcs {
-+      void (*configure)( struct uart_omap_port *up, int state);
-+      void (*set_txrx)( struct uart_omap_port *up, int txrx);
-+      int (*get_txrx)( struct uart_omap_port *up);
-+};
++      if (offset >= runtime->buffer_size || offset < 0)
++              offset = 0;
 +
-+#endif
-diff -Naur /home/lamikr/own/h6340/kernel/linux-2.6.14-rc5/include/asm-arm/arch-omap/mux.h bt_kernel/include/asm-arm/arch-omap/mux.h
---- /home/lamikr/own/h6340/kernel/linux-2.6.14-rc5/include/asm-arm/arch-omap/mux.h     2005-10-30 17:44:19.465765680 +0200
-+++ bt_kernel/include/asm-arm/arch-omap/mux.h  2005-10-14 18:55:31.156317000 +0300
-@@ -316,6 +316,13 @@
-       P15_1610_UWIRE_CS3,
-       N15_1610_UWIRE_CS1,
-+      /* OMAP-1510 uWire */
-+      P15_1510_UWIRE_CS3,
-+      N14_1510_UWIRE_CS0,
-+      V19_1510_UWIRE_SCLK,
-+      W21_1510_UWIRE_SDO,
-+      U18_1510_UWIRE_SDI,
++      return offset;
++}
 +
-       /* OMAP-1610 Flash */
-       L3_1610_FLASH_CS2B_OE,
-       M8_1610_FLASH_CS2B_WE,
-@@ -380,6 +387,7 @@
-       T20_1610_LOW_PWR,
-       /* MCLK Settings */
-+      R10_1510_MCLK_ON,
-       V5_1710_MCLK_ON,
-       V5_1710_MCLK_OFF,
-       R10_1610_MCLK_ON,
-diff -Naur /home/lamikr/own/h6340/kernel/linux-2.6.14-rc5/include/asm-arm/arch-omap/omapfb.h bt_kernel/include/asm-arm/arch-omap/omapfb.h
---- /home/lamikr/own/h6340/kernel/linux-2.6.14-rc5/include/asm-arm/arch-omap/omapfb.h  2005-10-30 17:44:19.557751038 +0200
-+++ bt_kernel/include/asm-arm/arch-omap/omapfb.h       2005-10-22 03:52:45.687256000 +0300
-@@ -267,6 +267,7 @@
- extern struct lcd_panel osk_panel;
- extern struct lcd_panel innovator1610_panel;
- extern struct lcd_panel innovator1510_panel;
-+extern struct lcd_panel h6300_panel;
- #ifdef CONFIG_ARCH_OMAP1
- extern struct lcd_ctrl omap1_lcd_ctrl;
-diff -Naur /home/lamikr/own/h6340/kernel/linux-2.6.14-rc5/include/asm-arm/arch-omap/omap_serial.h bt_kernel/include/asm-arm/arch-omap/omap_serial.h
---- /home/lamikr/own/h6340/kernel/linux-2.6.14-rc5/include/asm-arm/arch-omap/omap_serial.h     1970-01-01 02:00:00.000000000 +0200
-+++ bt_kernel/include/asm-arm/arch-omap/omap_serial.h  2005-10-04 00:58:34.589442000 +0300
-@@ -0,0 +1,62 @@
 +/*
-+ * Omap/h6300 serial driver private interface. 
-+ * Code originates from the pxa-serial.h available in the handheld org drivers
-+ * for iPAQ PXA4700.
-+ *
-+ * Copyright (c) 2005 SDG Systems, LLC
-+ * 2005-03-29   Todd Blumer     Converted  basic structure to support hx4700
-+ * 2005-10-03   Mika Laitio (lamikr@cc.jyu.fi)        Reorganized for the iPAQ h6300 bt driver.
++ * this stops the dma and clears the dma ptrs
 + */
-+ 
-+#ifndef _OMAP_SERIAL_H
-+#define _OMAP_SERIAL_H
-+
-+#define OMAP_SERIAL_TX 1
-+#define OMAP_SERIAL_RX 2
++void audio_stop_dma(struct audio_stream *s)
++{
++      unsigned long flags;
 +
-+#include <linux/tty.h>
-+#include <linux/serial_core.h>
++      spin_lock_irqsave(&s->dma_lock, flags);
++      s->active = 0;
++      s->period = 0;
++      s->periods = 0;
 +
-+struct platform_omap_serial_funcs;
++      /* this stops the dma channel and clears the buffer ptrs */
++      omap_audio_stop_dma(s);
 +
-+struct uart_omap_port {
-+      struct uart_port                        port;
-+      unsigned char                           ier;
-+      unsigned char                           lcr;
-+      unsigned char                           mcr;
-+      unsigned int                            lsr_break_flag;
-+      unsigned int                            cken;
-+      char                                    *name;
-+      struct platform_omap_serial_funcs       *pf;
-+};
++      omap_clear_sound_dma(s);
 +
-+/* A pointer to such a structure can be contained in the platform_data
-+ * field of every PXA UART platform_device. If the field is NULL, the
-+ * serial port works as usual.
-+ *
-+ * For the sake of simplicity/performance no one of the function pointers
-+ * in the structure below can be NULL.
-+ */
-+struct platform_omap_serial_funcs {
-+      /* Platform-specific function to initialize whatever is connected
-+         to this serial port... enable=1 -> enable transceiver,
-+         0 -> disable transceiver. */
-+      void (*configure) (struct uart_omap_port *up, int enable);
-+        /* Platform-specific function to enable or disable the individual
-+           transmitter/receiver submodules. On transceivers without echo
-+           cancellation (e.g. SIR) transmitter always has priority, e.g.
-+           if both bits are set, only the transmitter is enabled. */
-+        void (*set_txrx) (struct uart_omap_port *up, int txrx);
-+      /* Get the current state of tx/rx (see bitflags above) */
-+      int (*get_txrx) (struct uart_omap_port *up);
-+};
++      spin_unlock_irqrestore(&s->dma_lock, flags);
++}
 +
 +/*
-+ * The variables below are located in arch/arm/mach-omap/board_h6300.c
-+ * Machine-specific code may want to put a pointer to a static
-+ * platform_pxa_serial_funcs structure in the dev.platform_data
-+ * field of the respective port device.
++ *  Main dma routine, requests dma according where you are in main alsa buffer
 + */
-+extern struct platform_device btuart_device;
++void audio_process_dma(struct audio_stream *s)
++{
++      snd_pcm_substream_t *substream = s->stream;
++      snd_pcm_runtime_t *runtime;
++      unsigned int dma_size;
++      unsigned int offset;
++      int ret;
 +
-+#endif
-diff -Naur /home/lamikr/own/h6340/kernel/linux-2.6.14-rc5/include/asm-arm/arch-omap/pca9535.h bt_kernel/include/asm-arm/arch-omap/pca9535.h
---- /home/lamikr/own/h6340/kernel/linux-2.6.14-rc5/include/asm-arm/arch-omap/pca9535.h 1970-01-01 02:00:00.000000000 +0200
-+++ bt_kernel/include/asm-arm/arch-omap/pca9535.h      2005-10-25 03:24:45.525766000 +0300
-@@ -0,0 +1,39 @@
-+#ifndef _PCA9535_H
-+#define _PCA9535_H
++      runtime = substream->runtime;
++      if (s->active) {
++              dma_size = frames_to_bytes(runtime, runtime->period_size);
++              offset = dma_size * s->period;
++              snd_assert(dma_size <= DMA_BUF_SIZE,);
++              ret =
++                  omap_start_sound_dma(s,
++                                       (dma_addr_t) runtime->dma_area +
++                                       offset, dma_size);
++              if (ret) {
++                      printk(KERN_ERR
++                             "audio_process_dma: cannot queue DMA buffer (%i)\n",
++                             ret);
++                      return;
++              }
 +
-+enum  pca9535_gpios {
-+      GPIO0 = 0,
-+      GPIO1 = 1,
-+      GPIO2 = 2,
-+      GPIO3 = 3,
-+      GPIO4 = 4,
-+      GPIO5 = 5,
-+      GPIO6 = 6,
-+      GPIO7 = 7,
-+      GPIO8 = 8,
-+      GPIO9 = 9,
-+      GPIO10 = 10,
-+      GPIO11 = 11,
-+      GPIO12 = 12,
-+      GPIO13 = 13,
-+      GPIO14 = 14,
-+      GPIO15 = 15,
-+      GPIO16 = 16,
-+      GPIO17 = 17
-+};
++              s->period++;
++              s->period %= runtime->periods;
++              s->periods++;
++              s->offset = offset;
++      }
++}
 +
-+enum gpio_values {
-+      HI      = 0,
-+      LOW     = 1
-+};
++/* 
++ *  This is called when dma IRQ occurs at the end of each transmited block
++ */
++void audio_dma_callback(void *data)
++{
++      struct audio_stream *s = data;
 +
-+enum gpio_direction {
-+      GPIO_INPUT      = 0,
-+      GPIO_OUTPUT     = 1
-+};
++      /* 
++       * If we are getting a callback for an active stream then we inform
++       * the PCM middle layer we've finished a period
++       */
++      if (s->active)
++              snd_pcm_period_elapsed(s->stream);
 +
-+extern int pca9535_gpio_read(int gpio);
-+extern int pca9535_gpio_write(int gpio, unsigned char val);   
-+extern int pca9535_gpio_direction(int gpio, unsigned char direction);
++      spin_lock(&s->dma_lock);
++      if (s->periods > 0) {
++              s->periods--;
++      }
++      audio_process_dma(s);
++      spin_unlock(&s->dma_lock);
++}
 +
-+#endif
-diff -Naur /home/lamikr/own/h6340/kernel/linux-2.6.14-rc5/lib/.gitignore bt_kernel/lib/.gitignore
---- /home/lamikr/own/h6340/kernel/linux-2.6.14-rc5/lib/.gitignore      2005-10-20 09:23:05.000000000 +0300
-+++ bt_kernel/lib/.gitignore   1970-01-01 02:00:00.000000000 +0200
-@@ -1,6 +0,0 @@
--#
--# Generated files
--#
--gen_crc32table
--crc32table.h
--
-diff -Naur /home/lamikr/own/h6340/kernel/linux-2.6.14-rc5/Makefile bt_kernel/Makefile
---- /home/lamikr/own/h6340/kernel/linux-2.6.14-rc5/Makefile    2005-10-30 17:44:14.606539141 +0200
-+++ bt_kernel/Makefile 2005-10-22 03:52:45.687256000 +0300
-@@ -11,7 +11,7 @@
- # expect to learn how to build the kernel reading this file.
+ MODULE_AUTHOR("Texas Instruments");
+ MODULE_DESCRIPTION
+     ("Common DMA handling for Audio driver on OMAP processors");
+diff -Naur linux-2.6.14-omap2/sound/arm/omap-alsa-dma.h linux-h6300-omap2-2.6.14.3/sound/arm/omap-alsa-dma.h
+--- linux-2.6.14-omap2/sound/arm/omap-alsa-dma.h       2005-12-02 01:53:34.000000000 +0200
++++ linux-h6300-omap2-2.6.14.3/sound/arm/omap-alsa-dma.h       2005-11-13 02:15:10.000000000 +0200
+@@ -30,7 +30,13 @@
  
- # Add custom flags here to avoid conflict with updates
--EXTRAVERSION :=  $(EXTRAVERSION)-omap1
-+EXTRAVERSION :=  $(EXTRAVERSION)-omap-h6300
+ /************************** INCLUDES *************************************/
  
- # Do not print "Entering directory ..."
- MAKEFLAGS += --no-print-directory
-diff -Naur /home/lamikr/own/h6340/kernel/linux-2.6.14-rc5/scripts/basic/.gitignore bt_kernel/scripts/basic/.gitignore
---- /home/lamikr/own/h6340/kernel/linux-2.6.14-rc5/scripts/basic/.gitignore    2005-10-20 09:23:05.000000000 +0300
-+++ bt_kernel/scripts/basic/.gitignore 1970-01-01 02:00:00.000000000 +0200
-@@ -1,3 +0,0 @@
--fixdep
--split-include
--docproc
-diff -Naur /home/lamikr/own/h6340/kernel/linux-2.6.14-rc5/scripts/.gitignore bt_kernel/scripts/.gitignore
---- /home/lamikr/own/h6340/kernel/linux-2.6.14-rc5/scripts/.gitignore  2005-10-20 09:23:05.000000000 +0300
-+++ bt_kernel/scripts/.gitignore       1970-01-01 02:00:00.000000000 +0200
-@@ -1,4 +0,0 @@
--conmakehash
--kallsyms
--pnmtologo
--
-diff -Naur /home/lamikr/own/h6340/kernel/linux-2.6.14-rc5/scripts/kconfig/.gitignore bt_kernel/scripts/kconfig/.gitignore
---- /home/lamikr/own/h6340/kernel/linux-2.6.14-rc5/scripts/kconfig/.gitignore  2005-10-20 09:23:05.000000000 +0300
-+++ bt_kernel/scripts/kconfig/.gitignore       1970-01-01 02:00:00.000000000 +0200
-@@ -1,16 +0,0 @@
--#
--# Generated files
--#
--config*
--lex.*.c
--*.tab.c
--*.tab.h
--
--#
--# configuration programs
--#
--conf
--mconf
--qconf
--gconf
--kxgettext
-diff -Naur /home/lamikr/own/h6340/kernel/linux-2.6.14-rc5/scripts/mod/.gitignore bt_kernel/scripts/mod/.gitignore
---- /home/lamikr/own/h6340/kernel/linux-2.6.14-rc5/scripts/mod/.gitignore      2005-10-20 09:23:05.000000000 +0300
-+++ bt_kernel/scripts/mod/.gitignore   1970-01-01 02:00:00.000000000 +0200
-@@ -1,4 +0,0 @@
--elfconfig.h
--mk_elfconfig
--modpost
--
-diff -Naur /home/lamikr/own/h6340/kernel/linux-2.6.14-rc5/sound/arm/Kconfig bt_kernel/sound/arm/Kconfig
---- /home/lamikr/own/h6340/kernel/linux-2.6.14-rc5/sound/arm/Kconfig   2005-10-30 17:44:20.184651252 +0200
-+++ bt_kernel/sound/arm/Kconfig        2005-10-14 18:55:31.156317000 +0300
-@@ -15,6 +15,13 @@
-         To compile this driver as a module, choose M here: the module
-         will be called snd-sa11xx-uda1341.
+-#include "omap-aic23.h"
++/* h6300 tsc2101 changes start */
++//#include "omap-aic23.h"
++#include <sound/driver.h>
++#include <asm/arch/dma.h>
++#include <sound/core.h>
++#include <sound/pcm.h>
++/* h6300 tsc2101 changes end */
  
-+config SND_OMAP_TSC2101
-+      tristate "OMAP TSC2101 driver (iPaq H63xx)"
-+      depends ARCH_OMAP1
-+      select SND_PCM
-+      help
-+              ALSA driver for TI TSC2101.
-+
- config SND_ARMAACI
-       tristate "ARM PrimeCell PL041 AC Link support"
-       depends on SND && ARM_AMBA
-diff -Naur /home/lamikr/own/h6340/kernel/linux-2.6.14-rc5/sound/arm/Makefile bt_kernel/sound/arm/Makefile
---- /home/lamikr/own/h6340/kernel/linux-2.6.14-rc5/sound/arm/Makefile  2005-10-30 17:44:20.234643295 +0200
-+++ bt_kernel/sound/arm/Makefile       2005-10-14 18:55:31.156317000 +0300
-@@ -16,3 +16,6 @@
+ /************************** GLOBAL MACROS *************************************/
  
- obj-$(CONFIG_SND_OMAP_AIC23) += snd-omap-aic23.o
- snd-omap-aic23-objs := omap-aic23.o omap-alsa-dma.o omap-alsa-mixer.o
-+
-+obj-$(CONFIG_SND) += \
-+      omap/
-diff -Naur /home/lamikr/own/h6340/kernel/linux-2.6.14-rc5/sound/arm/omap/Makefile bt_kernel/sound/arm/omap/Makefile
---- /home/lamikr/own/h6340/kernel/linux-2.6.14-rc5/sound/arm/omap/Makefile     1970-01-01 02:00:00.000000000 +0200
-+++ bt_kernel/sound/arm/omap/Makefile  2005-08-12 13:46:22.016114000 +0300
-@@ -0,0 +1,8 @@
-+#
-+# Makefile for ALSA
-+#
-+
-+snd-omap-tsc2101-objs := tsc2101_main.o tsc2101_mix.o tsc2101_pcm.o
+@@ -39,8 +45,33 @@
+ #define DMA_FREE(s)           omap_free_sound_dma(s, &s->lch)
+ #define DMA_CLEAR(s)          omap_clear_sound_dma(s)
++/* h6300 tsc2101 changes start */
++#define DMA_BUF_SIZE  1024 * 8
 +
-+# Toplevel Module Dependency
-+obj-$(CONFIG_SND_OMAP_TSC2101)   += snd-omap-tsc2101.o
-diff -Naur /home/lamikr/own/h6340/kernel/linux-2.6.14-rc5/sound/arm/omap/omap-tsc2101.h bt_kernel/sound/arm/omap/omap-tsc2101.h
---- /home/lamikr/own/h6340/kernel/linux-2.6.14-rc5/sound/arm/omap/omap-tsc2101.h       1970-01-01 02:00:00.000000000 +0200
-+++ bt_kernel/sound/arm/omap/omap-tsc2101.h    2005-08-20 00:24:45.622662000 +0300
-@@ -0,0 +1,81 @@
+ /************************** GLOBAL DATA STRUCTURES *********************************/
 +/*
-+ *  OMAP tsc2101 soundcard
-+ *  Copyright (c) by Everett Coleman II <gcc80x86@fuzzyneural.net>
-+ *
-+ *   This program is free software; you can redistribute it and/or modify
-+ *   it under the terms of the GNU General Public License as published by
-+ *   the Free Software Foundation; either version 2 of the License, or
-+ *   (at your option) any later version.
-+ *
-+ *   This program is distributed in the hope that it will be useful,
-+ *   but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-+ *   GNU General Public License for more details.
-+ *
-+ *   You should have received a copy of the GNU General Public License
-+ *   along with this program; if not, write to the Free Software
-+ *   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
-+ *
++ * Buffer management for alsa and dma
 + */
-+#ifndef __SOUND_OMAP_TSC2101_H
-+# define __SOUND_OMAP_TSC2101_H 1
-+
-+# include <sound/driver.h>
-+# include <linux/init.h>
-+# include <sound/core.h>
-+# include <sound/initval.h>
-+# include <sound/control.h>
-+# include <sound/pcm.h>
-+# include <asm/arch/dma.h>
-+# include <asm/hardware/tsc2101.h>
-+# include <../drivers/ssi/omap-tsc2101.h>
-+
-+# define TSC2101_AUDIO_CODEC_REGISTERS 2
-+# define OUTPUT_VOLUME_MIN  0
-+# define OUTPUT_VOLUME_MAX  127
-+# define AUDIO_RATE_DEFAULT 44100
-+# define AUDIO_BPS_DEFAULT  16
-+
-+# define AUDIO_DMA_BUF_SIZE (8 * 1024)
-+
-+# define AUDIO_DMA_RX OMAP_DMA_MCBSP1_RX
-+# define AUDIO_DMA_TX OMAP_DMA_MCBSP1_TX
-+# define AUDIO_MCBSP  OMAP_MCBSP1
-+
-+# define DEBUG 1
-+# ifdef DEBUG
-+#  define dprintk(x, y...) printk (x, ##y);
-+# else
-+#  define dprintk(x, y...) {}
-+# endif /* DEBUG */
-+
-+//# define DUMP_TSC2101_REGISTERS
-+
-+typedef struct audio_stream {
-+      char *id;
-+      int sid;
-+      int dev;
-+      int channel;
-+      spinlock_t lock;
-+      unsigned int offset, period, position;
-+      u8 active;
-+      snd_pcm_substream_t *stream;
-+} audio_stream_t;
-+
-+typedef struct snd_card_tsc2101 {
-+      snd_card_t *card;
-+      snd_pcm_t  *pcm;
++struct audio_stream {
++      char *id;               /* identification string */
++      int stream_id;          /* numeric identification */
++      int dma_dev;            /* dma number of that device */
++      int *lch;               /* Chain of channels this stream is linked to */
++      char started;           /* to store if the chain was started or not */
++      int dma_q_head;         /* DMA Channel Q Head */
++      int dma_q_tail;         /* DMA Channel Q Tail */
++      char dma_q_count;       /* DMA Channel Q Count */
++      int active:1;           /* we are using this stream for transfer now */
++      int period;             /* current transfer period */
++      int periods;            /* current count of periods registerd in the DMA engine */
++      spinlock_t dma_lock;    /* for locking in DMA operations */
++      snd_pcm_substream_t *stream;    /* the pcm stream */
++      unsigned linked:1;      /* dma channels linked */
++      int offset;             /* store start position of the last period in the alsa buffer */
++};
++/* h6300 tsc2101 changes end */
 +
-+      long samplerate;
-+      audio_stream_t s[2];
-+} snd_card_tsc2101_t;
-+
-+# ifdef DUMP_TSC2101_REGISTERS
-+void dump_tsc2101_reg (void);
-+# endif /* DUMP_TSC2101_REGISTERS */
-+
-+int snd_tsc2101_setup_mix (snd_card_tsc2101_t *);
-+int snd_tsc2101_setup_pcm (snd_card_tsc2101_t *);
-+void snd_tsc2101_disable_pcm (snd_card_tsc2101_t *);
-+
-+#endif /* __SOUND_OMAP_TSC2101_H */
-diff -Naur /home/lamikr/own/h6340/kernel/linux-2.6.14-rc5/sound/arm/omap/tsc2101_main.c bt_kernel/sound/arm/omap/tsc2101_main.c
---- /home/lamikr/own/h6340/kernel/linux-2.6.14-rc5/sound/arm/omap/tsc2101_main.c       1970-01-01 02:00:00.000000000 +0200
-+++ bt_kernel/sound/arm/omap/tsc2101_main.c    2005-08-12 13:46:22.016114000 +0300
-@@ -0,0 +1,109 @@
-+/*
-+ *  OMAP tsc2101 soundcard
-+ *  Copyright (c) by Everett Coleman II <gcc80x86@fuzzyneural.net>
-+ *
-+ *   This program is free software; you can redistribute it and/or modify
-+ *   it under the terms of the GNU General Public License as published by
-+ *   the Free Software Foundation; either version 2 of the License, or
-+ *   (at your option) any later version.
-+ *
-+ *   This program is distributed in the hope that it will be useful,
-+ *   but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-+ *   GNU General Public License for more details.
-+ *
-+ *   You should have received a copy of the GNU General Public License
-+ *   along with this program; if not, write to the Free Software
-+ *   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
-+ *
-+ */
+ typedef void (*dma_callback_t) (int lch, u16 ch_status, void *data);
+ /**************** ARCH SPECIFIC FUNCIONS *******************************************/
+@@ -54,6 +85,14 @@
+ int omap_start_sound_dma(struct audio_stream *s, dma_addr_t dma_ptr,
+                        u_int dma_size);
++/* h6300 tsc2101 changes start */
+ void omap_audio_stop_dma(struct audio_stream *s);
++void audio_dma_callback(void *);
++void audio_process_dma(struct audio_stream *s);
++u_int audio_get_dma_pos(struct audio_stream *s);
++int audio_dma_request(struct audio_stream *s, void (*callback) (void *));
++int audio_dma_free(struct audio_stream *s);
++void audio_stop_dma(struct audio_stream *s);
++/* h6300 tsc2101 changes end */
+ #endif
+diff -Naur linux-2.6.14-omap2/sound/arm/omap-tsc2101.c linux-h6300-omap2-2.6.14.3/sound/arm/omap-tsc2101.c
+--- linux-2.6.14-omap2/sound/arm/omap-tsc2101.c        1970-01-01 02:00:00.000000000 +0200
++++ linux-h6300-omap2-2.6.14.3/sound/arm/omap-tsc2101.c        2005-11-13 02:15:10.000000000 +0200
+@@ -0,0 +1,665 @@
++#include <linux/config.h>
++#include <sound/driver.h>
++#include <linux/module.h>
++#include <linux/device.h>
++#include <linux/moduleparam.h>
++#include <linux/init.h>
++#include <linux/errno.h>
++#include <linux/ioctl.h>
++#include <linux/delay.h>
++#include <linux/slab.h>
++
++#ifdef CONFIG_PM
++#include <linux/pm.h>
++#endif
 +
 +#include <asm/hardware.h>
 +#include <asm/mach-types.h>
++#include <asm/arch/dma.h>
++#include <asm/hardware/tsc2101.h>
++#include <../drivers/ssi/omap-tsc2101.h>
++#include <asm/arch/mcbsp.h>
++
++#include <sound/core.h>
++#include <sound/pcm.h>
++#include <sound/initval.h>
++#include <sound/memalloc.h>
++
++#include "omap-alsa-dma.h"
 +#include "omap-tsc2101.h"
 +
-+#ifdef DUMP_TSC2101_REGISTERS
-+void
-+dump_tsc2101_reg (void) {
-+      int i=0;
-+      printk ("TSC2101 Register DUMP:\n");
-+      for (i=0; i <= 0x27; i++) {
-+              printk ("0x%02x: %04x    ", i, omap_tsc2101_read (TSC2101_AUDIO_CODEC_REGISTERS, i));
-+              if ((i % 4) == 3)
-+                      printk ("\n");
-+      } printk ("\n");
-+} /* dump_tsc2101_reg */
-+#endif /* DUMP_TSC2101_REGISTERS */
-+
-+/* Globals
-+ **********/
-+static struct snd_card_tsc2101 *tsc2101=NULL;
-+static char *id=NULL;
-+
-+/* Module init/exit Functions
-+ ****************************/
-+static void
-+snd_tsc2101_free (snd_card_t *card) {
-+      snd_card_tsc2101_t *chip=card->private_data;
++//#undef DEBUG
++#define DEBUG
 +
-+      tsc2101=0;
-+      card->private_data=0;
-+      kfree (chip);
-+} /* snd_tsc2101_free */
++#ifdef DEBUG
++#define ADEBUG() printk("XXX Alsa debug f:%s, l:%d\n", __FUNCTION__, __LINE__)
++#else
++#define ADEBUG()              /* nop */
++#endif
 +
-+static int __init
-+alsa_card_tsc2101_init (void) {
-+      int err=0;
-+      snd_card_t *card;
++#define TSC2101_MASTER
++
++#define DEFAULT_BITPERSAMPLE          16
++#define AUDIO_RATE_DEFAULT              44100
++#define AUDIO_MCBSP                   OMAP_MCBSP1
++#define NUMBER_SAMPLE_RATES_SUPPORTED 16
++#define PAGE2_AUDIO_CODEC_REGISTERS   (2)
++
++MODULE_AUTHOR("Everett Coleman, Daniel Petrini, David Cohen, Anderson Briglia - INdT");
++MODULE_LICENSE("GPL");
++MODULE_DESCRIPTION("OMAP TSC2101 driver for ALSA");
++MODULE_SUPPORTED_DEVICE("{{TSC2101,OMAP TSC2101}}");
++MODULE_ALIAS("omap_mcbsp.1");
++
++static char *id = NULL;       
++MODULE_PARM_DESC(id, "OMAP ALSA Driver for TSC2101 chip.");
++
++static struct snd_card_omap_tsc2101 *omap_tsc2101 = NULL;
++
++static struct omap_mcbsp_reg_cfg initial_config_mcbsp = {
++#ifdef CONFIG_MACH_H6300
++      .spcr2 = 0x0005,
++      .spcr1 = 0x0005,
++      .rcr2  = 0x8041,
++      .rcr1  = 0x8041,
++      .xcr2  = 0x00a1,
++      .xcr1  = 0x00a1,
++      .srgr2 = 0xb000,
++      .srgr1 = 0xb000,
++      .pcr0  = 0x0081,
++#else
++      .spcr2 = FREE | FRST | GRST | XRST | XINTM(3),
++      .spcr1 = RINTM(3) | RRST,
++      .rcr2  = RPHASE | RFRLEN2(OMAP_MCBSP_WORD_8) |
++               RWDLEN2(OMAP_MCBSP_WORD_16) | RDATDLY(1),
++      .rcr1  = RFRLEN1(OMAP_MCBSP_WORD_8) | RWDLEN1(OMAP_MCBSP_WORD_16),
++      .xcr2  = XPHASE | XFRLEN2(OMAP_MCBSP_WORD_8) |
++               XWDLEN2(OMAP_MCBSP_WORD_16) | XDATDLY(1) | XFIG,
++      .xcr1  = XFRLEN1(OMAP_MCBSP_WORD_8) | XWDLEN1(OMAP_MCBSP_WORD_16),
++      .srgr1 = FWID(15),
++      .srgr2 = GSYNC | CLKSP | FSGM | FPER(31),
++
++      /* platform specific initialization */
++# if defined(CONFIG_MACH_OMAP_H2)
++      .pcr0  = CLKXM | CLKRM | FSXP | FSRP | CLKXP | CLKRP,
++# elif defined(CONFIG_MACH_OMAP_H3)
++
++#  ifndef TSC2101_MASTER
++      .pcr0  = FSXM | FSRM | CLKXM | CLKRM | CLKXP | CLKRP,
++#  else
++      .pcr0  = CLKRM | SCLKME | FSXP | FSRP | CLKXP | CLKRP,
++#  endif /* !TSC2101_MASTER */
++# endif       /* CONFIG_MACH_OMAP_H2 */
++#endif /* CONFIG_MACH_H6300 */
++};
++
++static unsigned int rates[] = {
++      7350,  8000,  8018,  8727,  
++      8820,  9600,  11025, 12000, 
++      14700, 16000, 22050, 24000, 
++      29400, 32000, 44100, 48000
++};
++
++static snd_pcm_hw_constraint_list_t hw_constraints_rates = {
++      .count = ARRAY_SIZE(rates),
++      .list = rates,
++      .mask = 0,
++};
 +
-+      if (!machine_is_h6300 ())
-+              return -ENODEV;
++struct sample_rate_reg_info {
++      u16 sample_rate;
++      u8  divisor;
++      u8  fs_44kHz;
++};
 +
-+      if ((card=snd_card_new (-1, id, THIS_MODULE, sizeof (snd_card_tsc2101_t))) == 0)
-+              return -ENOMEM;
-+      if ((tsc2101=kcalloc (1, sizeof (*tsc2101), GFP_KERNEL)) == 0)
-+              return -ENOMEM;
++static const struct sample_rate_reg_info
++reg_info[NUMBER_SAMPLE_RATES_SUPPORTED] = {
++      {48000, 0, 0}, {44100, 0, 1}, {32000, 1, 0}, {29400, 1, 1},
++      {24000, 2, 0}, {22050, 2, 1}, {16000, 3, 0}, {14700, 3, 1},
++      {12000, 4, 0}, {11025, 4, 1}, {9600,  5, 0}, {8820,  5, 1},
++      {8727,  6, 0}, {8018,  6, 1}, {8000,  7, 0}, {7350,  7, 1}
++};
 +
-+      card->private_data=(void *)tsc2101;
-+      card->private_free=snd_tsc2101_free;
++static snd_pcm_hardware_t snd_omap_tsc2101_capture = {
++      .info = (SNDRV_PCM_INFO_INTERLEAVED | SNDRV_PCM_INFO_BLOCK_TRANSFER |
++               SNDRV_PCM_INFO_MMAP | SNDRV_PCM_INFO_MMAP_VALID),
++      .formats = (SNDRV_PCM_FMTBIT_S16_LE),
++      .rates = (SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 |
++                SNDRV_PCM_RATE_22050 | SNDRV_PCM_RATE_32000 |
++                SNDRV_PCM_RATE_44100 | SNDRV_PCM_RATE_48000 |
++                SNDRV_PCM_RATE_88200 | SNDRV_PCM_RATE_96000 |
++                SNDRV_PCM_RATE_KNOT),
++      .rate_min = 7350,
++      .rate_max = 48000,
++      .channels_min = 2,
++      .channels_max = 2,
++      .buffer_bytes_max = 128 * 1024,
++      .period_bytes_min = 32,
++      .period_bytes_max = 8 * 1024,
++      .periods_min = 16,
++      .periods_max = 255,
++      .fifo_size = 0,
++};
 +
-+      tsc2101->card=card;
-+      tsc2101->samplerate=AUDIO_RATE_DEFAULT;
++static snd_pcm_hardware_t snd_omap_tsc2101_playback = {
++      .info = (SNDRV_PCM_INFO_INTERLEAVED | SNDRV_PCM_INFO_BLOCK_TRANSFER |
++               SNDRV_PCM_INFO_MMAP | SNDRV_PCM_INFO_MMAP_VALID),      
++      .formats = (SNDRV_PCM_FMTBIT_S16_LE),
++      .rates = (SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 |
++                SNDRV_PCM_RATE_22050 | SNDRV_PCM_RATE_32000 |
++                SNDRV_PCM_RATE_44100 | SNDRV_PCM_RATE_48000 |
++                SNDRV_PCM_RATE_88200 | SNDRV_PCM_RATE_96000 |
++                SNDRV_PCM_RATE_KNOT),
++      .rate_min = 7350,
++      .rate_max = 48000,
++      .channels_min = 2,
++      .channels_max = 2,
++      .buffer_bytes_max = 128 * 1024,
++      .period_bytes_min = 32,
++      .period_bytes_max = 8 * 1024,
++      .periods_min = 16,
++      .periods_max = 255,
++      .fifo_size = 0,
++};
 +
-+      if ((err=snd_tsc2101_setup_pcm (tsc2101)) < 0)
-+              goto nodev;
-+      if ((err=snd_tsc2101_setup_mix (tsc2101)) < 0)
-+              goto nodev;
++static __inline__ void
++audio_tsc2101_write (u8 address, u16 data) {
++      omap_tsc2101_write (PAGE2_AUDIO_CODEC_REGISTERS, address, data);
++} /* audio_tsc2101_write */
 +
-+      // TODO: PM
++static __inline__ u16
++audio_tsc2101_read (u8 address) {
++      return (omap_tsc2101_read(PAGE2_AUDIO_CODEC_REGISTERS, address));
++} /* audio_tsc2101_read */
 +
-+      strncpy (card->driver, "TSC2101", sizeof (card->driver));
-+      strncpy (card->shortname, "OMAP TSC2101", sizeof (card->shortname));
-+      strncpy (card->longname, "TI OMAP TSC2101 Audio Codec", sizeof (card->longname));
 +
-+      if ((err=snd_card_register (card)) == 0) {
-+              printk (KERN_INFO "TSC2101 audio support initialized\n");
-+              return 0;
-+      }
 +
-+nodev:
-+      snd_tsc2101_disable_pcm (tsc2101);
-+      snd_card_free (card);
-+      return err;
-+} /* alsa_card_tsc2101_init */
 +
-+static void __exit
-+alsa_card_tsc2101_exit (void) {
-+      snd_tsc2101_disable_pcm (tsc2101);
-+      snd_card_free(tsc2101->card);
-+} /* alsa_card_tsc2101_exit */
 +
-+module_init(alsa_card_tsc2101_init)
-+module_exit(alsa_card_tsc2101_exit)
 +
-+MODULE_AUTHOR("Everett Coleman II <gcc80x86@fuzzyneural.net>");
-+MODULE_DESCRIPTION("TI TSC2101 Audio Driver");
-+MODULE_LICENSE("GPL");
 +
-+module_param(id, charp, 0444);
-+MODULE_PARM_DESC(id, "ID string for OMAP TSC2101 soundcard.");
-diff -Naur /home/lamikr/own/h6340/kernel/linux-2.6.14-rc5/sound/arm/omap/tsc2101_mix.c bt_kernel/sound/arm/omap/tsc2101_mix.c
---- /home/lamikr/own/h6340/kernel/linux-2.6.14-rc5/sound/arm/omap/tsc2101_mix.c        1970-01-01 02:00:00.000000000 +0200
-+++ bt_kernel/sound/arm/omap/tsc2101_mix.c     2005-08-12 13:46:22.016114000 +0300
-@@ -0,0 +1,211 @@
-+/*
-+ *  OMAP tsc2101 soundcard
-+ *  Copyright (c) by Everett Coleman II <gcc80x86@fuzzyneural.net>
-+ *
-+ *   This program is free software; you can redistribute it and/or modify
-+ *   it under the terms of the GNU General Public License as published by
-+ *   the Free Software Foundation; either version 2 of the License, or
-+ *   (at your option) any later version.
-+ *
-+ *   This program is distributed in the hope that it will be useful,
-+ *   but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-+ *   GNU General Public License for more details.
-+ *
-+ *   You should have received a copy of the GNU General Public License
-+ *   along with this program; if not, write to the Free Software
-+ *   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
-+ *
-+ */
 +
-+#include "omap-tsc2101.h"
 +
-+static int
-+__pcm_playback_volume_info (snd_kcontrol_t *kcontrol, snd_ctl_elem_info_t *uinfo) {
-+      uinfo->type =SNDRV_CTL_ELEM_TYPE_INTEGER;
-+      uinfo->count=2;
-+      uinfo->value.integer.min=OUTPUT_VOLUME_MIN;
-+      uinfo->value.integer.max=OUTPUT_VOLUME_MAX;
-+      return 0;
-+} /* __pcm_playback_volume_info */
 +
-+# define dgc_dalvl_extract(x) ((x & 0x7f00) >> 8)
-+# define dgc_darvl_extract(x) ((x & 0x007f))
-+static int
-+__pcm_playback_volume_get (snd_kcontrol_t *kcontrol, snd_ctl_elem_value_t *ucontrol) {
-+      u16 val=omap_tsc2101_read (TSC2101_AUDIO_CODEC_REGISTERS, TSC2101_DAC_GAIN_CTRL);
-+      ucontrol->value.integer.value[0]=dgc_dalvl_extract(val); // L
-+      ucontrol->value.integer.value[1]=dgc_darvl_extract(val); // R
-+      return 0;
-+} /* __pcm_playback_volume_get */
++void
++snd_omap_tsc2101_free (snd_card_t * card) {
++      struct snd_card_omap_tsc2101 *chip = card->private_data;
++      ADEBUG();
++      
++      /* TODO
++       * Turn off codec after it is done.
++       * Can't do it immediately, since it may still have
++       * buffered data.
++       */
 +
-+static int
-+__pcm_playback_volume_put (snd_kcontrol_t *kcontrol, snd_ctl_elem_value_t *ucontrol) {
-+      u16 val=omap_tsc2101_read (TSC2101_AUDIO_CODEC_REGISTERS, TSC2101_DAC_GAIN_CTRL);
-+      int count=0;
-+      if (dgc_dalvl_extract(val) != ucontrol->value.integer.value[0]) {
-+              val=(val & ~DGC_DALVL(OUTPUT_VOLUME_MAX)) |
-+                      DGC_DALVL(ucontrol->value.integer.value[0]);
-+              count++;
-+      } /* L */
 +
-+      if (dgc_darvl_extract(val) != ucontrol->value.integer.value[1]) {
-+              val=(val & ~DGC_DARVL(OUTPUT_VOLUME_MAX)) |
-+                      DGC_DARVL((u16)ucontrol->value.integer.value[1]);
-+              count++;
-+      } /* R */
 +
-+      if (count)
-+              omap_tsc2101_write (TSC2101_AUDIO_CODEC_REGISTERS, TSC2101_DAC_GAIN_CTRL, val);
 +
-+      return count;
-+} /* __pcm_playback_volume_put */
++      audio_dma_free (&chip->s[SNDRV_PCM_STREAM_PLAYBACK]);
++      audio_dma_free (&chip->s[SNDRV_PCM_STREAM_CAPTURE]);
++} /* snd_omap_tsc2101_free */
 +
++#ifdef CONFIG_PM
 +static int
-+__pcm_playback_switch_info (snd_kcontrol_t *kcontrol, snd_ctl_elem_info_t *uinfo) {
-+      uinfo->type =SNDRV_CTL_ELEM_TYPE_BOOLEAN;
-+      uinfo->count=2;
-+      uinfo->value.integer.min=0;
-+      uinfo->value.integer.max=1;
++snd_omap_tsc2101_suspend (snd_card_t * card, pm_message_t state) {
++      // TODO: function
 +      return 0;
-+} /* __pcm_playback_switch_info */
++} /* snd_omap_tsc2101_suspend */
 +
 +static int
-+__pcm_playback_switch_get (snd_kcontrol_t *kcontrol, snd_ctl_elem_value_t *ucontrol) {
-+      u16 val=omap_tsc2101_read (TSC2101_AUDIO_CODEC_REGISTERS, TSC2101_DAC_GAIN_CTRL);
-+      ucontrol->value.integer.value[0]=(val & DGC_DALMU) == DGC_DALMU; // L
-+      ucontrol->value.integer.value[1]=(val & DGC_DARMU) == DGC_DARMU; // R
++snd_omap_tsc2101_resume (snd_card_t * card) {
++      // TODO: function
 +      return 0;
-+} /* __pcm_playback_switch_get */
-+
-+static int
-+__pcm_playback_switch_put (snd_kcontrol_t *kcontrol, snd_ctl_elem_value_t *ucontrol) {
-+      u16 val=omap_tsc2101_read (TSC2101_AUDIO_CODEC_REGISTERS, TSC2101_DAC_GAIN_CTRL);
-+      int count=0;
-+
-+      if (((val & DGC_DALMU) == DGC_DALMU) != ucontrol->value.integer.value[0]) {
-+              val=(val & ~DGC_DALMU) |
-+                      (ucontrol->value.integer.value[0] ? DGC_DALMU : 0);
-+              count++;
-+      } /* L */
-+      if (((val & DGC_DARMU) == DGC_DARMU) != ucontrol->value.integer.value[1]) {
-+              val=(val & ~DGC_DARMU) |
-+                      (ucontrol->value.integer.value[1] ? DGC_DARMU : 0);
-+              count++;
-+      } /* R */
-+
-+      if (count)
-+              omap_tsc2101_write (TSC2101_AUDIO_CODEC_REGISTERS, TSC2101_DAC_GAIN_CTRL, val);
-+      return count;
-+} /* __pcm_playback_switch_put */
++} /* snd_omap_tsc2101_resume */
 +
 +static int
-+__line_playback_volume_info (snd_kcontrol_t *kcontrol, snd_ctl_elem_info_t *uinfo) {
-+      uinfo->type =SNDRV_CTL_ELEM_TYPE_INTEGER;
-+      uinfo->count=1;
-+      uinfo->value.integer.min=OUTPUT_VOLUME_MIN;
-+      uinfo->value.integer.max=OUTPUT_VOLUME_MAX;
++omap_tsc2101_suspend (struct device *dev, pm_message_t state, u32 level) {
++      // TODO: function
 +      return 0;
-+} /* __line_playback_volume_info */
++} /* omap_tsc2101_suspend */
 +
-+#define hgc_adpga_hed_extract(x) ((x & 0x7f00) >> 8)
 +static int
-+__line_playback_volume_get (snd_kcontrol_t *kcontrol, snd_ctl_elem_value_t *ucontrol) {
-+      u16 val=omap_tsc2101_read (TSC2101_AUDIO_CODEC_REGISTERS, TSC2101_HEADSET_GAIN_CTRL);
-+      ucontrol->value.integer.value[0]=hgc_adpga_hed_extract(val);
++omap_tsc2101_resume (struct device *dev, u32 level) {
++      // TODO: function
 +      return 0;
-+} /* __line_playback_volume_get */
++} /* omap_tsc2101_resume */
 +
-+static int
-+__line_playback_volume_put (snd_kcontrol_t *kcontrol, snd_ctl_elem_value_t *ucontrol) {
-+      u16 val=omap_tsc2101_read (TSC2101_AUDIO_CODEC_REGISTERS, TSC2101_HEADSET_GAIN_CTRL);
-+      int count=0;
-+      if (hgc_adpga_hed_extract(val) != ucontrol->value.integer.value[0]) {
-+              val=(val & ~HGC_ADPGA_HED(OUTPUT_VOLUME_MAX)) |
-+                      HGC_ADPGA_HED((u16)ucontrol->value.integer.value[0]);
-+              count++;
-+      }
-+      if (count)
-+              omap_tsc2101_write (TSC2101_AUDIO_CODEC_REGISTERS, TSC2101_HEADSET_GAIN_CTRL, val);
-+      return count;
-+} /* __line_playback_volume_put */
++#else
++# define snd_omap_tsc2101_suspend NULL
++# define snd_omap_tsc2101_resume  NULL
++# define omap_tsc2101_suspend     NULL
++# define omap_tsc2101_resume      NULL
++#endif        /* CONFIG_PM */
 +
-+static int
-+__line_playback_switch_info (snd_kcontrol_t *kcontrol, snd_ctl_elem_info_t *uinfo) {
-+      uinfo->type =SNDRV_CTL_ELEM_TYPE_BOOLEAN;
-+      uinfo->count=1;
-+      uinfo->value.integer.min=0;
-+      uinfo->value.integer.max=1;
-+      return 0;
-+} /* __line_playback_switch_info */
++static inline void
++tsc2101_configure (void) {
++      audio_tsc2101_write (TSC2101_CODEC_POWER_CTRL, 0x0000);
 +
-+static int
-+__line_playback_switch_get (snd_kcontrol_t *kcontrol, snd_ctl_elem_value_t *ucontrol) {
-+      u16 val=omap_tsc2101_read (TSC2101_AUDIO_CODEC_REGISTERS, TSC2101_HEADSET_GAIN_CTRL);
-+      ucontrol->value.integer.value[0]=(val & HGC_ADMUT_HED) == HGC_ADMUT_HED;
-+      return 0;
-+} /* __line_playback_switch_get */
++      /*Mute Analog Sidetone */
++      /*Select MIC_INHED input for headset */
++      /*Cell Phone In not connected */
++      audio_tsc2101_write (TSC2101_MIXER_PGA_CTRL,
++                          MPC_ASTMU | MPC_ASTG(0x40) | MPC_MICADC);
 +
-+static int
-+__line_playback_switch_put (snd_kcontrol_t *kcontrol, snd_ctl_elem_value_t *ucontrol) {
-+      u16 val=omap_tsc2101_read (TSC2101_AUDIO_CODEC_REGISTERS, TSC2101_HEADSET_GAIN_CTRL);
-+      int count=0;
++      /* Set record source */
++      // TODO:MIXER tsc2101_update (SET_RECSRC, tsc2101_local.recsrc);
 +
-+      if (((val & HGC_ADMUT_HED) == HGC_ADMUT_HED) != ucontrol->value.integer.value[0]) {
-+              val=(val & ~HGC_ADMUT_HED) | 
-+                      (ucontrol->value.integer.value[0] ? HGC_ADMUT_HED : 0);
-+              count++;
-+      }
-+      
-+      if (count)
-+              omap_tsc2101_write (TSC2101_AUDIO_CODEC_REGISTERS, TSC2101_HEADSET_GAIN_CTRL, val);
-+      return count;
-+} /* __line_playback_switch_put */
-+
-+
-+static snd_kcontrol_new_t tsc2101_control[] __devinitdata={
-+      { .name  = "PCM Playback Volume",
-+              .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
-+              .index = 0,
-+              .access= SNDRV_CTL_ELEM_ACCESS_READWRITE,
-+              .info  = __pcm_playback_volume_info,
-+              .get   = __pcm_playback_volume_get,
-+              .put   = __pcm_playback_volume_put,
-+      }, {
-+              .name  = "PCM Playback Switch",
-+              .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
-+              .index = 0,
-+              .access= SNDRV_CTL_ELEM_ACCESS_READWRITE,
-+              .info  = __pcm_playback_switch_info,
-+              .get   = __pcm_playback_switch_get,
-+              .put   = __pcm_playback_switch_put,
-+      }, {
-+              .name  = "Line Playback Volume",
-+              .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
-+              .index = 1,
-+              .access= SNDRV_CTL_ELEM_ACCESS_READWRITE,
-+              .info  = __line_playback_volume_info,
-+              .get   = __line_playback_volume_get,
-+              .put   = __line_playback_volume_put,
-+      }, {
-+              .name  = "Line Playback Switch",
-+              .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
-+              .index = 1,
-+              .access= SNDRV_CTL_ELEM_ACCESS_READWRITE,
-+              .info  = __line_playback_switch_info,
-+              .get   = __line_playback_switch_get,
-+              .put   = __line_playback_switch_put,
-+      }
-+};
++      /* ADC, DAC, Analog Sidetone, cellphone, buzzer softstepping enabled */
++      /* 1dB AGC hysteresis */
++      /* MICes bias 2V */
++      audio_tsc2101_write (TSC2101_AUDIO_CTRL_4, AC4_MB_HED(0));
 +
-+int
-+snd_tsc2101_setup_mix (snd_card_tsc2101_t *tsc2101) {
-+      int i=0, err=0;
++      /* Set codec output volume */
++      audio_tsc2101_write (TSC2101_DAC_GAIN_CTRL, 0x0000);
 +
-+      if (!tsc2101)
-+              return -EINVAL;
-+      for (i=0; i < ARRAY_SIZE(tsc2101_control); i++)
-+              if ((err=snd_ctl_add (tsc2101->card, snd_ctl_new1 (&tsc2101_control[i], tsc2101->card))) < 0)
-+                      return err;
-+      return 0;
-+} /* snd_tsc2101_setup_mix */
-diff -Naur /home/lamikr/own/h6340/kernel/linux-2.6.14-rc5/sound/arm/omap/tsc2101_pcm.c bt_kernel/sound/arm/omap/tsc2101_pcm.c
---- /home/lamikr/own/h6340/kernel/linux-2.6.14-rc5/sound/arm/omap/tsc2101_pcm.c        1970-01-01 02:00:00.000000000 +0200
-+++ bt_kernel/sound/arm/omap/tsc2101_pcm.c     2005-08-31 01:22:50.289885000 +0300
-@@ -0,0 +1,555 @@
-+/*
-+ *  OMAP tsc2101 soundcard
-+ *  Copyright (c) by Everett Coleman II <gcc80x86@fuzzyneural.net>
-+ *
-+ *   This program is free software; you can redistribute it and/or modify
-+ *   it under the terms of the GNU General Public License as published by
-+ *   the Free Software Foundation; either version 2 of the License, or
-+ *   (at your option) any later version.
-+ *
-+ *   This program is distributed in the hope that it will be useful,
-+ *   but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-+ *   GNU General Public License for more details.
-+ *
-+ *   You should have received a copy of the GNU General Public License
-+ *   along with this program; if not, write to the Free Software
-+ *   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
-+ *
-+ */
++      /* DAC left and right routed to SPK2 */
++      /* SPK1/2 unmuted */
++      audio_tsc2101_write (TSC2101_AUDIO_CTRL_5,
++                          AC5_DAC2SPK1(3) | AC5_AST2SPK1 | AC5_KCL2SPK1 |
++                          AC5_DAC2SPK2(3) | AC5_AST2SPK2 | AC5_KCL2SPK2 |
++                          AC5_HDSCPTC);
 +
-+#include <asm/arch/mcbsp.h>
-+#include <linux/delay.h>
-+#include <asm/arch/gpio.h>
-+#include "omap-tsc2101.h"
++      /* OUT8P/N muted, CPOUT muted */
 +
-+static snd_pcm_hardware_t pcm_hardware[2] = {
-+      {
-+              .info =
-+                      SNDRV_PCM_INFO_INTERLEAVED |
-+                      SNDRV_PCM_INFO_BLOCK_TRANSFER   |
-+                      SNDRV_PCM_INFO_MMAP |
-+                      SNDRV_PCM_INFO_MMAP_VALID |
-+                      SNDRV_PCM_INFO_PAUSE |
-+                      SNDRV_PCM_INFO_RESUME,
-+              .formats = SNDRV_PCM_FMTBIT_U16_LE,
-+              .rates   = 
-+                      SNDRV_PCM_RATE_8000_44100 | 
-+                      SNDRV_PCM_RATE_KNOT,
-+              .rate_min         = 7350,
-+              .rate_max         = 48000,
-+              .channels_min     = 2,
-+              .channels_max     = 2,
-+              .buffer_bytes_max = 128 * 1024,
-+              .period_bytes_min = 64,
-+              .period_bytes_max = AUDIO_DMA_BUF_SIZE,
-+              .periods_min      = 2,
-+              .periods_max      = 255,
-+              .fifo_size        = 0,
-+      }, {
-+              .info =
-+                      SNDRV_PCM_INFO_INTERLEAVED |
-+                      SNDRV_PCM_INFO_BLOCK_TRANSFER   |
-+                      SNDRV_PCM_INFO_MMAP |
-+                      SNDRV_PCM_INFO_MMAP_VALID |
-+                      SNDRV_PCM_INFO_PAUSE |
-+                      SNDRV_PCM_INFO_RESUME,
-+                      .formats = SNDRV_PCM_FMTBIT_U16_LE,
-+                      .rates   = 
-+                              SNDRV_PCM_RATE_8000_44100 | 
-+                              SNDRV_PCM_RATE_KNOT,
-+                      .rate_min         = 7350,
-+                      .rate_max         = 48000,
-+                      .channels_min     = 2,
-+                      .channels_max     = 2,
-+                      .buffer_bytes_max = 128 * 1024,
-+                      .period_bytes_min = 64,
-+                      .period_bytes_max = AUDIO_DMA_BUF_SIZE,
-+                      .periods_min      = 2,
-+                      .periods_max      = 255,
-+                      .fifo_size        = 0,
-+      }
-+};
++      audio_tsc2101_write (TSC2101_AUDIO_CTRL_6,
++                          AC6_MUTLSPK | AC6_MUTSPK2 | AC6_LDSCPTC |
++                          AC6_VGNDSCPTC);
 +
-+static unsigned int rate_list[] = {
-+      7350,  8000,  8018,  8727, 
-+      8820,  9600,  11025, 12000,
-+      14700, 16000, 22050, 24000,
-+      29400, 32000, 44100, 48000
-+};
++      /* Headset/Hook switch detect disabled */
++      audio_tsc2101_write (TSC2101_AUDIO_CTRL_7, 0x0000);
 +
-+static snd_pcm_hw_constraint_list_t rate_constraint = {
-+      .count = ARRAY_SIZE (rate_list),
-+      .list  = rate_list,
-+      .mask  = 0,
-+};
++      /* Left line input volume control */
++      // TODO:MIXER tsc2101_update (SET_LINE, tsc2101_local.line);
 +
++      /* mic input volume control */
++      // TODO:MIXER tsc2101_update(SET_MIC, tsc2101_local.mic);
++
++      /* Left/Right headphone channel volume control */
++      /* Zero-cross detect on */
++      // TODO:MIXER tsc2101_update (SET_VOLUME, tsc2101_local.volume);
++} /* tsc2101_configure */
 +
 +static int
-+__tsc2101_open (snd_pcm_substream_t *substream) {
++snd_card_omap_tsc2101_open (snd_pcm_substream_t * substream) {
++      struct snd_card_omap_tsc2101 *chip = snd_pcm_substream_chip(substream);
 +      snd_pcm_runtime_t *runtime = substream->runtime;
-+      snd_card_tsc2101_t *chip = snd_pcm_substream_chip (substream);
-+      int sid   = substream->pstr->stream, err;
-+
-+      dprintk ("[%s]\n", __FUNCTION__);
-+      chip->s[sid].stream = substream;
-+      runtime->hw = pcm_hardware[sid];
++      int stream_id = substream->pstr->stream;
++      int err;
++      ADEBUG();
 +
++      chip->s[stream_id].stream = substream;
++      
++//    TODO: turn audio on, power on
++      
++      if (stream_id == SNDRV_PCM_STREAM_PLAYBACK)
++              runtime->hw = snd_omap_tsc2101_playback;
++      else
++              runtime->hw = snd_omap_tsc2101_capture;
 +      if ((err = snd_pcm_hw_constraint_integer(runtime, SNDRV_PCM_HW_PARAM_PERIODS)) < 0)
 +              return err;
-+      if ((err = snd_pcm_hw_constraint_list(runtime, 0, SNDRV_PCM_HW_PARAM_RATE, &rate_constraint)) < 0)
++      if ((err = snd_pcm_hw_constraint_list(runtime, 0, SNDRV_PCM_HW_PARAM_RATE, &hw_constraints_rates)) < 0)
 +              return err;
-+
-+      dprintk ("[%s] pass\n", __FUNCTION__);
 +      return 0;
-+} /* __tsc2101_open */
++} /* snd_card_omap_tsc2101_open */
 +
 +static int
-+__tsc2101_close (snd_pcm_substream_t *substream) {
-+      snd_card_tsc2101_t *chip = snd_pcm_substream_chip (substream);
-+      dprintk ("[%s]\n", __FUNCTION__);
-+      chip->s[substream->pstr->stream].stream = 0;
-+      dprintk ("[%s] pass\n", __FUNCTION__);
++snd_card_omap_tsc2101_close (snd_pcm_substream_t *substream) {
++      struct snd_card_omap_tsc2101 *chip = snd_pcm_substream_chip(substream);
++      ADEBUG();
++      
++      // TODO: omap_tsc2101_clock_off();
++      chip->s[substream->pstr->stream].stream = NULL;
 +      return 0;
-+} /* __tsc2101_close */
++} /* snd_card_omap_tsc2101_close */
 +
 +static int
-+__tsc2101_hw_params (snd_pcm_substream_t *substream, snd_pcm_hw_params_t *hw_params) {
-+      dprintk ("[%s> pass\n", __FUNCTION__);
-+      return snd_pcm_lib_malloc_pages (substream, params_buffer_bytes (hw_params));
-+} /* __tsc2101_hw_params */
++snd_omap_tsc2101_hw_params (snd_pcm_substream_t *substream, snd_pcm_hw_params_t *hw_params) {
++      return snd_pcm_lib_malloc_pages(substream, params_buffer_bytes(hw_params));
++} /* snd_omap_tsc2101_hw_params */
 +
 +static int
-+__tsc2101_hw_free (snd_pcm_substream_t *substream) {
-+      dprintk ("[%s> pass\n", __FUNCTION__);
-+      return snd_pcm_lib_free_pages (substream);
-+} /* __tsc2101_hw_free */
-+
-+static struct omap_mcbsp_reg_cfg mcbsp_cfg = {
-+//    .pcr0  = FSXM | FSRM | CLKXM | CLKRM | CLKXP | CLKRP,
-+//    .pcr0  = CLKXP | CLKRP,
-+      .pcr0  = CLKRM | SCLKME | FSXP | FSRP | CLKXP | CLKRP,
-+
-+//    .spcr2 = FREE | FRST | GRST | XRST | XINTM(3) | XEMPTY,
-+//    .spcr1 = RINTM(3) | RRST | RFULL,
-+      .spcr2 = FREE | FRST | GRST | XRST | XINTM(3),
-+      .spcr1 = RINTM(3) | RRST,
-+
-+      .rcr2  = RPHASE | RFRLEN2(OMAP_MCBSP_WORD_8) |
-+               RWDLEN2(OMAP_MCBSP_WORD_16) | RDATDLY(1),
-+      .rcr1  = RFRLEN1(OMAP_MCBSP_WORD_8) | RWDLEN1(OMAP_MCBSP_WORD_16),
-+      .xcr2  = XPHASE | XFRLEN2(OMAP_MCBSP_WORD_8) |
-+               XWDLEN2(OMAP_MCBSP_WORD_16) | XDATDLY(1) | XFIG,
-+      .xcr1  = XFRLEN1(OMAP_MCBSP_WORD_8) | XWDLEN1(OMAP_MCBSP_WORD_16),
-+      .srgr1 = FWID(15),
-+      .srgr2 = GSYNC | CLKSP | FSGM | FPER(31),
-+};
++snd_omap_tsc2101_hw_free (snd_pcm_substream_t *substream) {
++      return snd_pcm_lib_free_pages(substream);
++} /* snd_omap_tsc2101_hw_free */
 +
 +static int
-+__set_samplerate (snd_card_tsc2101_t *tsc2101, long sample_rate) {
-+      static u8 div_list[] = {
-+              7, 7, 6, 6,
-+              5, 5, 4, 4,
-+              3, 3, 2, 2,
-+              1, 1, 0, 0
-+      };
-+      int i = 0, clkgdv = 0;
-+      u8  khz  = 0;
++omap_tsc2101_set_samplerate (struct snd_card_omap_tsc2101 *omap_tsc2101, long rate) {
++      u8 count = 0;
 +      u16 data = 0;
++      int clkgdv = 0;
++
++      if (rate >= 48000)
++              rate = 48000;
++      else if (rate >= 44100)
++              rate = 44100;
++      else if (rate >= 32000)
++              rate = 32000;
++      else if (rate >= 29400)
++              rate = 29400;
++      else if (rate >= 24000)
++              rate = 24000;
++      else if (rate >= 22050)
++              rate = 22050;
++      else if (rate >= 16000)
++              rate = 16000;
++      else if (rate >= 14700)
++              rate = 14700;
++      else if (rate >= 12000)
++              rate = 12000;
++      else if (rate >= 11025)
++              rate = 11025;
++      else if (rate >= 9600)
++              rate = 9600;
++      else if (rate >= 8820)
++              rate = 8820;
++      else if (rate >= 8727)
++              rate = 8727;
++      else if (rate >= 8018)
++              rate = 8018;
++      else if (rate >= 8000)
++              rate = 8000;
++      else
++              rate = 7350;
 +
-+      dprintk ("[%s]\n", __FUNCTION__);
-+      udelay (125);
-+      for (i=rate_constraint.count-1; i >= 0 ; i--)
-+              if (sample_rate >= rate_list[i])
-+                      break;
-+      if (i == -1)
-+              i=0;
-+      khz=(i%2) ? 0 : 1;
++      /* wait for any frame to complete */
++      udelay(125);
 +
-+      dprintk ("rate=%u\n", rate_list[i]);
++      /* Search for the right sample rate */
++      while ((reg_info[count].sample_rate != rate) &&
++             (count < NUMBER_SAMPLE_RATES_SUPPORTED)) {
++              count++;
++      }
++      if (count == NUMBER_SAMPLE_RATES_SUPPORTED) {
++              printk(KERN_ERR "Invalid Sample Rate %d requested\n",
++                     (int)rate);
++              return -EPERM;
++      }
 +
-+      data=omap_tsc2101_read (TSC2101_AUDIO_CODEC_REGISTERS, TSC2101_AUDIO_CTRL_1);
++      /* Set AC1 */
++      data = audio_tsc2101_read(TSC2101_AUDIO_CTRL_1);
++      /*Clear prev settings */
 +      data &= ~(AC1_DACFS(0x07) | AC1_ADCFS(0x07));
-+      data |= AC1_DACFS(div_list[i])
-+              | AC1_ADCFS(div_list[i]);
-+      omap_tsc2101_write (TSC2101_AUDIO_CODEC_REGISTERS, TSC2101_AUDIO_CTRL_1, data);
-+
-+      data=omap_tsc2101_read (TSC2101_AUDIO_CODEC_REGISTERS, TSC2101_AUDIO_CTRL_3);
++      data |=
++          AC1_DACFS(reg_info[count].divisor) | AC1_ADCFS(reg_info[count].
++                                                         divisor);
++      audio_tsc2101_write(TSC2101_AUDIO_CTRL_1, data);
++
++      /* Set the AC3 */
++      data = audio_tsc2101_read(TSC2101_AUDIO_CTRL_3);
++      /*Clear prev settings */
 +      data &= ~(AC3_REFFS | AC3_SLVMS);
-+      data |= (khz) ? AC3_REFFS : 0;
++      data |= (reg_info[count].fs_44kHz) ? AC3_REFFS : 0;
++#ifdef TSC2101_MASTER
 +      data |= AC3_SLVMS;
-+      omap_tsc2101_write (TSC2101_AUDIO_CODEC_REGISTERS, TSC2101_AUDIO_CTRL_3, data);
-+
-+      if (khz) {
-+              omap_tsc2101_write (
-+                              TSC2101_AUDIO_CODEC_REGISTERS, TSC2101_PLL_PROG_1,
-+                              PLL1_PLLSEL | PLL1_PVAL(1) | PLL1_I_VAL(7));
-+              omap_tsc2101_write (
-+                              TSC2101_AUDIO_CODEC_REGISTERS, TSC2101_PLL_PROG_2,
-+                              PLL2_D_VAL(0x1490));
-+
++#endif                                /* #ifdef TSC2101_MASTER */
++      audio_tsc2101_write(TSC2101_AUDIO_CTRL_3, data);
++
++      /* program the PLLs */
++      if (reg_info[count].fs_44kHz) {
++              /* 44.1 khz - 12 MHz Mclk */
++              audio_tsc2101_write(TSC2101_PLL_PROG_1, PLL1_PLLSEL | PLL1_PVAL(1) | PLL1_I_VAL(7));    /* PVAL 1; I_VAL 7 */
++              audio_tsc2101_write(TSC2101_PLL_PROG_2, PLL2_D_VAL(0x1490));    /* D_VAL 5264 */
 +      } else {
-+              omap_tsc2101_write (
-+                              TSC2101_AUDIO_CODEC_REGISTERS, TSC2101_PLL_PROG_1,
-+                              PLL1_PLLSEL | PLL1_PVAL(1) | PLL1_I_VAL(8));
-+              omap_tsc2101_write (
-+                              TSC2101_AUDIO_CODEC_REGISTERS, TSC2101_PLL_PROG_2,
-+                              PLL2_D_VAL(0x780));
++              /* 48 khz - 12 Mhz Mclk */
++              audio_tsc2101_write(TSC2101_PLL_PROG_1, PLL1_PLLSEL | PLL1_PVAL(1) | PLL1_I_VAL(8));    /* PVAL 1; I_VAL 8 */
++              audio_tsc2101_write(TSC2101_PLL_PROG_2, PLL2_D_VAL(0x780));     /* D_VAL 1920 */
 +      }
 +
-+      tsc2101->samplerate=rate_list[i];
++      omap_tsc2101->samplerate = rate;
++
++      /* Set the sample rate */
++#ifndef TSC2101_MASTER
++      clkgdv =
++          DEFAULT_MCBSP_CLOCK / (rate *
++                                 (DEFAULT_BITPERSAMPLE * 2 - 1));
++      if (clkgdv)
++              initial_config_mcbsp.srgr1 =
++                  (FWID(DEFAULT_BITPERSAMPLE - 1) | CLKGDV(clkgdv));
++      else
++              return (1);
 +
-+      mcbsp_cfg.srgr1 =
-+          (FWID(AUDIO_BPS_DEFAULT - 1) | CLKGDV(clkgdv));
-+      mcbsp_cfg.srgr2 =
-+          ((GSYNC | CLKSP | FSGM | FPER(AUDIO_BPS_DEFAULT * 2 - 1)));
++      /* Stereo Mode */
++      initial_config_mcbsp.srgr2 =
++          (CLKSM | FSGM | FPER(DEFAULT_BITPERSAMPLE * 2 - 1));
++#else
++      initial_config_mcbsp.srgr1 =
++          (FWID(DEFAULT_BITPERSAMPLE - 1) | CLKGDV(clkgdv));
++      initial_config_mcbsp.srgr2 =
++          ((GSYNC | CLKSP | FSGM | FPER(DEFAULT_BITPERSAMPLE * 2 - 1)));
 +
-+      omap_mcbsp_config(AUDIO_MCBSP, &mcbsp_cfg);
-+      dprintk ("[%s] pass\n", __FUNCTION__);
++#endif                                /* end of #ifdef TSC2101_MASTER */
++      omap_mcbsp_config(AUDIO_MCBSP, &initial_config_mcbsp);
 +      return 0;
-+} /* __set_samplerate */
++} /* omap_tsc2101_set_samplerate */
 +
 +static int
-+__tsc2101_prepare (snd_pcm_substream_t *substream) {
++snd_omap_tsc2101_prepare (snd_pcm_substream_t *substream) {
++      struct snd_card_omap_tsc2101 *chip = snd_pcm_substream_chip(substream);
 +      snd_pcm_runtime_t *runtime = substream->runtime;
-+      snd_card_tsc2101_t *chip   = snd_pcm_substream_chip (substream);
-+      audio_stream_t *s = &chip->s[substream->pstr->stream];
++      struct audio_stream *s = &chip->s[substream->pstr->stream];
 +
-+      dprintk ("[%s]\n", __FUNCTION__);
-+      __set_samplerate (chip, runtime->rate);
++      /* set requested samplerate */
++      omap_tsc2101_set_samplerate (chip, runtime->rate);
 +
-+      // set FMT here ????
-+      s->period  =0;
-+      s->offset  =0;
-+      s->position=0;
-+      dprintk ("[%s] pass\n", __FUNCTION__);
++      s->period = 0;
++      s->periods = 0;
 +      return 0;
-+} /* __tsc2101_prepare */
-+
-+# define DCSR_ERROR           0x3
-+# define DCSR_END_BLOCK       (1 << 5)
-+# define DCCR_EN              (1 << 7)
-+static void
-+tsc2101_playback_callback (int channel, u16 ch_status, void *data) {
-+      audio_stream_t *s=(audio_stream_t *)data;
-+
-+      dprintk ("[%s]\n", __FUNCTION__);
-+
-+      if (ch_status & DCSR_ERROR) {
-+              omap_writew (omap_readw (OMAP_DMA_CCR (channel)) &
-+                              ~DCCR_EN, OMAP_DMA_CCR (channel));
-+              printk (KERN_ERR "[%s] DCSR_ERROR!\n", __FUNCTION__);
-+              dprintk ("[%s] x-fail\n", __FUNCTION__);
-+              return;
-+      }
-+
-+      if (!(ch_status & DCSR_END_BLOCK)) {
-+              dprintk ("[%s] y-fail\n", __FUNCTION__);
-+              return;
-+      }
-+
-+      if (s->active) {
-+              unsigned int dma_size;
-+              unsigned int offset;
-+              snd_pcm_runtime_t *runtime;
-+
-+              snd_pcm_period_elapsed (s->stream);
-+
-+              spin_lock (&s->lock);
-+              runtime=s->stream->runtime;
-+
-+              dma_size = frames_to_bytes(runtime, runtime->period_size);
-+              offset = dma_size * s->period;
-+              snd_assert(dma_size <= AUDIO_DMA_BUF_SIZE,);
-+
-+              dprintk ("pb: offset=%08lx size=%u period=%u\n", (unsigned long)(runtime->dma_area + offset), dma_size, s->period);
-+#if 0
-+              omap_set_dma_transfer_params(channel, OMAP_DMA_DATA_TYPES16, 32, dma_size/(2*32), OMAP_DMA_SYNC_ELEMENT);
-+              omap_set_dma_dest_params(channel, OMAP_DMA_PORT_MPUI, OMAP_DMA_AMODE_CONSTANT, (OMAP1510_MCBSP1_BASE + OMAP_MCBSP_REG_DXR1));
-+              omap_set_dma_src_params(channel, 0x00, 0x01, (unsigned long)(runtime->dma_area + offset));
-+              omap_start_dma (channel);
-+#else
-+//            omap_set_gpio_dataout (2, 1);
-+              omap_set_dma_transfer_params (channel,
-+                              OMAP_DMA_DATA_TYPE_S16,
-+                              dma_size >> 1, 1,
-+                              OMAP_DMA_SYNC_ELEMENT
-+                              );
-+              omap_set_dma_dest_params (channel,
-+//                            OMAP_DMA_PORT_TIPB,
-+                              OMAP_DMA_PORT_MPUI,
-+                              OMAP_DMA_AMODE_CONSTANT,
-+                              (OMAP1510_MCBSP1_BASE + OMAP_MCBSP_REG_DXR1)
-+                              );
-+              omap_set_dma_src_params (channel,
-+                              OMAP_DMA_PORT_EMIFF,
-+                              OMAP_DMA_AMODE_POST_INC,
-+                              runtime->dma_area + offset
-+                              );
-+              omap_start_dma (channel);
-+//            omap_set_gpio_dataout (2, 0);
-+#endif
-+
-+              s->period++;
-+              s->period %= runtime->periods;
-+//            s->periods++;
-+
-+              s->offset = offset;
-+
-+              spin_unlock (&s->lock);
-+      }
-+
-+      dprintk ("[%s] pass\n", __FUNCTION__);
-+} /* tsc2101_playback_callback */
-+
-+static void
-+tsc2101_capture_callback (int channel, u16 ch_status, void *data) {
-+      dprintk ("[%s]\n", __FUNCTION__);
-+      omap_start_dma (channel);
-+      dprintk ("[%s] pass\n", __FUNCTION__);
-+} /* tsc2101_capture_callback */
++} /* snd_omap_tsc2101_prepare */
 +
 +static int
-+__tsc2101_trigger (snd_pcm_substream_t *substream, int command) {
-+      snd_card_tsc2101_t *chip = snd_pcm_substream_chip (substream);
-+      audio_stream_t *s        = &chip->s[substream->pstr->stream];
-+      int err=0;
-+
-+      dprintk ("[%s]\n", __FUNCTION__);
-+
-+      switch (command) {
-+              case SNDRV_PCM_TRIGGER_START:
-+                      dprintk ("[%s] command=start(%d)\n", __FUNCTION__, command);
-+                      s->active++;
-+                      omap_clear_dma (s->channel);
-+                      if (s->sid == SNDRV_PCM_STREAM_PLAYBACK)
-+                              tsc2101_playback_callback (s->channel, 32, (void *)s);
-+                      else
-+                              tsc2101_capture_callback  (s->channel, 32, (void *)s);
-+                      break;
-+
-+              case SNDRV_PCM_TRIGGER_STOP:
-+                      dprintk ("[%s] command=stop(%d)\n", __FUNCTION__, command);
-+                      // TODO: be sure that all data has been xfered
-+                      s->active--;
-+                      spin_lock (&s->lock);
-+                      omap_clear_dma (s->channel);
-+                      omap_stop_dma (s->channel);
-+                      spin_unlock (&s->lock);
-+                      break;
-+
-+              case SNDRV_PCM_TRIGGER_SUSPEND:
-+                      dprintk ("[%s] command=suspend(%d)\n", __FUNCTION__, command);
-+              case SNDRV_PCM_TRIGGER_RESUME:
-+                      dprintk ("[%s] command=resume(%d)\n", __FUNCTION__, command);
-+              case SNDRV_PCM_TRIGGER_PAUSE_PUSH:
-+                      dprintk ("[%s] command=pause.push(%d)\n", __FUNCTION__, command);
-+              case SNDRV_PCM_TRIGGER_PAUSE_RELEASE:
-+                      dprintk ("[%s] command=pause.release(%d)\n", __FUNCTION__, command);
-+              default:
-+                      err = -EINVAL;
-+                      break;
-+      } /* switch (command) */
++snd_omap_tsc2101_trigger (snd_pcm_substream_t *substream, int cmd) {
++      struct snd_card_omap_tsc2101 *chip = snd_pcm_substream_chip(substream);
++      int stream_id = substream->pstr->stream;
++      struct audio_stream *s = &chip->s[stream_id];
++      int err = 0;
++      ADEBUG();
 +
-+      dprintk ("[%s] exit (%d)\n", __FUNCTION__, err);
++      /* note local interrupts are already disabled in the midlevel code */
++      spin_lock(&s->dma_lock);
++      switch (cmd) {
++      case SNDRV_PCM_TRIGGER_START:
++              /* requested stream startup */
++              s->active = 1;
++              audio_process_dma(s);
++              break;
++      case SNDRV_PCM_TRIGGER_STOP:
++              /* requested stream shutdown */
++              audio_stop_dma(s);
++              break;
++      default:
++              err = -EINVAL;
++              break;
++      }
++      spin_unlock(&s->dma_lock);
 +      return err;
-+} /* __tsc2101_trigger */
++} /* snd_omap_tsc2101_trigger */
 +
 +static snd_pcm_uframes_t
-+__tsc2101_pointer (snd_pcm_substream_t *substream) {
-+      snd_card_tsc2101_t *chip   = snd_pcm_substream_chip (substream);
-+      snd_pcm_runtime_t *runtime = substream->runtime;
-+      audio_stream_t *s = &chip->s[substream->pstr->stream];
-+      unsigned long flags;
-+      snd_pcm_uframes_t offset;
-+      dma_addr_t ptr;
-+
-+      dprintk ("[%s]\n", __FUNCTION__);
-+
-+      spin_lock_irqsave (&s->lock, flags);
-+      ptr=omap_get_dma_src_pos (s->channel);
-+      dprintk ("xxxx: [%08lx,%08lx] ptr=%08lx:%08lx\n",
-+                      (unsigned long)runtime->dma_area,
-+                      (unsigned long)runtime->dma_addr,
-+                      (unsigned long)ptr,
-+                      (unsigned long)runtime->buffer_size);
-+      spin_unlock_irqrestore (&s->lock, flags);
-+
-+      offset=bytes_to_frames (runtime, ptr - runtime->dma_addr);
-+      if ((offset >= runtime->buffer_size) || (offset < 0))
-+              offset=0;
-+      dprintk ("[%s] pass:%lu\n", __FUNCTION__, offset);
-+      return offset;
-+} /* __tsc2101_pointer */
-+
-+static snd_pcm_ops_t playback_ops = {
-+      .open      = __tsc2101_open,
-+      .close     = __tsc2101_close,
++snd_omap_tsc2101_pointer (snd_pcm_substream_t *substream) {
++      struct snd_card_omap_tsc2101 *chip = snd_pcm_substream_chip(substream);
++      return audio_get_dma_pos(&chip->s[substream->pstr->stream]);
++} /* snd_omap_tsc2101_pointer */
++
++static snd_pcm_ops_t snd_card_omap_tsc2101_playback_ops = {
++      .open      = snd_card_omap_tsc2101_open,
++      .close     = snd_card_omap_tsc2101_close,
 +      .ioctl     = snd_pcm_lib_ioctl,
-+      .hw_params = __tsc2101_hw_params,
-+      .hw_free   = __tsc2101_hw_free,
-+      .prepare   = __tsc2101_prepare,
-+      .trigger   = __tsc2101_trigger,
-+      .pointer   = __tsc2101_pointer,
++      .hw_params = snd_omap_tsc2101_hw_params,
++      .hw_free   = snd_omap_tsc2101_hw_free,
++      .prepare   = snd_omap_tsc2101_prepare,
++      .trigger   = snd_omap_tsc2101_trigger,
++      .pointer   = snd_omap_tsc2101_pointer,
 +};
 +
-+static snd_pcm_ops_t capture_ops = {
-+      .open      = __tsc2101_open,
-+      .close     = __tsc2101_close,
++static snd_pcm_ops_t snd_card_omap_tsc2101_capture_ops = {
++      .open      = snd_card_omap_tsc2101_open,
++      .close     = snd_card_omap_tsc2101_close,
 +      .ioctl     = snd_pcm_lib_ioctl,
-+      .hw_params = __tsc2101_hw_params,
-+      .hw_free   = __tsc2101_hw_free,
-+      .prepare   = __tsc2101_prepare,
-+      .trigger   = __tsc2101_trigger,
-+      .pointer   = __tsc2101_pointer,
++      .hw_params = snd_omap_tsc2101_hw_params,
++      .hw_free   = snd_omap_tsc2101_hw_free,
++      .prepare   = snd_omap_tsc2101_prepare,
++      .trigger   = snd_omap_tsc2101_trigger,
++      .pointer   = snd_omap_tsc2101_pointer,
 +};
 +
 +static void
-+tsc2101_audio_init (snd_card_tsc2101_t *tsc2101) {
-+      dprintk ("[%s]\n", __FUNCTION__);
-+      omap_set_gpio_dataout (2, 0);
-+      omap_set_gpio_direction (2, 0);
-+
-+      /* initialize mcbsp */
++omap_tsc2101_audio_init (struct snd_card_omap_tsc2101 *omap_tsc2101) {
++      /* Setup DMA stuff */
++      omap_tsc2101->s[SNDRV_PCM_STREAM_PLAYBACK].id = "Alsa TSC2101 out";
++      omap_tsc2101->s[SNDRV_PCM_STREAM_PLAYBACK].stream_id =
++          SNDRV_PCM_STREAM_PLAYBACK;
++      omap_tsc2101->s[SNDRV_PCM_STREAM_PLAYBACK].dma_dev =
++          OMAP_DMA_MCBSP1_TX;
++
++      omap_tsc2101->s[SNDRV_PCM_STREAM_CAPTURE].id = "Alsa TSC2101 in";
++      omap_tsc2101->s[SNDRV_PCM_STREAM_CAPTURE].stream_id =
++          SNDRV_PCM_STREAM_CAPTURE;
++      omap_tsc2101->s[SNDRV_PCM_STREAM_CAPTURE].dma_dev =
++          OMAP_DMA_MCBSP1_RX;
++
++      /* configuring the McBSP */
 +      omap_mcbsp_request (AUDIO_MCBSP);
++
++      /* if configured, then stop mcbsp */
 +      omap_mcbsp_stop (AUDIO_MCBSP);
 +
-+      omap_mcbsp_config (AUDIO_MCBSP, &mcbsp_cfg);
++      omap_mcbsp_config (AUDIO_MCBSP, &initial_config_mcbsp);
 +      omap_mcbsp_start (AUDIO_MCBSP);
 +
-+      omap_tsc2101_enable ();
-+#if 0
-+      omap_tsc2101_write (
-+                      TSC2101_AUDIO_CODEC_REGISTERS,
-+                      TSC2101_CODEC_POWER_CTRL,
-+                      0x0000);
-+      omap_tsc2101_write (
-+                      TSC2101_AUDIO_CODEC_REGISTERS,
-+                      TSC2101_AUDIO_CTRL_5,
-+                      AC5_DAC2SPK1(3) | AC5_AST2SPK1 | AC5_KCL2SPK1 |
-+                      AC5_DAC2SPK2(3) | AC5_AST2SPK2 | AC5_KCL2SPK2 |
-+                      AC5_HDSCPTC);
-+#else
-+#ifdef DUMP_TSC2101_REGISTERS
-+      dump_tsc2101_reg ();
-+#endif /* DUMP_TSC2101_REGISTERS */
++      tsc2101_configure ();
++} /* omap_tsc2101_audio_init */
 +
-+      omap_tsc2101_write (2, TSC2101_CODEC_POWER_CTRL, 0x0000);
++static int __init
++snd_card_omap_tsc2101_pcm (struct snd_card_omap_tsc2101 *omap_tsc2101, int device) {
++      snd_pcm_t *pcm;
++      int err;
++      ADEBUG();
 +
-+      /*Mute Analog Sidetone */
-+      /*Select MIC_INHED input for headset */
-+      /*Cell Phone In not connected */
-+      omap_tsc2101_write (2, TSC2101_MIXER_PGA_CTRL,
-+                          MPC_ASTMU | MPC_ASTG(0x40) | MPC_MICADC);
++      if ((err = snd_pcm_new (omap_tsc2101->card, "TSC2101 PCM", device, 1, 1, &pcm)) < 0)
++              return err;
 +
-+      /* Set record source */
-+      omap_tsc2101_write (2, TSC2101_MIXER_PGA_CTRL, MPC_MICSEL(0));
++      snd_pcm_lib_preallocate_pages_for_all (pcm,
++                      SNDRV_DMA_TYPE_CONTINUOUS,
++                      snd_dma_continuous_data (GFP_KERNEL),
++                      128 * 1024, 128 * 1024);
 +
-+      /* ADC, DAC, Analog Sidetone, cellphone, buzzer softstepping enabled */
-+      /* 1dB AGC hysteresis */
-+      /* MICes bias 2V */
-+      omap_tsc2101_write (2, TSC2101_AUDIO_CTRL_4, AC4_MB_HED(0));
++      snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_PLAYBACK,
++                      &snd_card_omap_tsc2101_playback_ops);
++      snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_CAPTURE,
++                      &snd_card_omap_tsc2101_capture_ops);
 +
-+      /* Set codec output volume */
-+      omap_tsc2101_write (2, TSC2101_DAC_GAIN_CTRL, 0x0000);
++      pcm->private_data = omap_tsc2101;
++      pcm->info_flags = 0;
++      strcpy (pcm->name, "omap tsc2101 pcm");
 +
-+      /* DAC left and right routed to SPK2 */
-+      /* SPK1/2 unmuted */
-+      omap_tsc2101_write (2, TSC2101_AUDIO_CTRL_5,
-+                          AC5_DAC2SPK1(3) | AC5_AST2SPK1 | AC5_KCL2SPK1 |
-+                          AC5_DAC2SPK2(3) | AC5_AST2SPK2 | AC5_KCL2SPK2 |
-+                          AC5_HDSCPTC);
++      omap_tsc2101_audio_init (omap_tsc2101);
 +
-+      /* OUT8P/N muted, CPOUT muted */
++      audio_dma_request(&omap_tsc2101->s[SNDRV_PCM_STREAM_PLAYBACK],
++                        audio_dma_callback);
++      audio_dma_request(&omap_tsc2101->s[SNDRV_PCM_STREAM_CAPTURE],
++                        audio_dma_callback);
 +
-+      omap_tsc2101_write (2, TSC2101_AUDIO_CTRL_6,
-+                          AC6_MUTLSPK | AC6_MUTSPK2 | AC6_LDSCPTC |
-+                          AC6_VGNDSCPTC);
++      omap_tsc2101->pcm = pcm;
++      return 0;
++} /* snd_card_omap_tsc2101_pcm */
 +
-+      /* Headset/Hook switch detect disabled */
-+      omap_tsc2101_write (2, TSC2101_AUDIO_CTRL_7, 0x0000);
++static int __init
++snd_omap_tsc2101_probe (struct device *dev) {
++      int err = 0;
++      snd_card_t *card;
++      ADEBUG();
 +
-+      /* mic input volume control */
-+      omap_tsc2101_write(2, TSC2101_HANDSET_GAIN_CTRL, HNGC_ADPGA_HND(25));
-+#endif
++      if ((card = snd_card_new (-1, id, THIS_MODULE, sizeof (omap_tsc2101))) == NULL)
++              return -ENOMEM;
++      if ((omap_tsc2101 = kcalloc (1, sizeof (*omap_tsc2101), GFP_KERNEL)) == NULL)
++              return -ENOMEM;
 +
-+#ifdef DUMP_TSC2101_REGISTERS
-+      dump_tsc2101_reg ();
-+#endif /* DUMP_TSC2101_REGISTERS */
++      card->private_data = (void *)omap_tsc2101;
++      card->private_free = snd_omap_tsc2101_free;
++      omap_tsc2101->card       = card;
++      omap_tsc2101->samplerate = AUDIO_RATE_DEFAULT;
 +
-+      __set_samplerate (tsc2101, tsc2101->samplerate);
-+      dprintk ("[%s] pass\n", __FUNCTION__);
-+} /* tsc2101_audio_init */
++      spin_lock_init(&omap_tsc2101->s[0].dma_lock);
++      spin_lock_init(&omap_tsc2101->s[1].dma_lock);
 +
-+int
-+snd_tsc2101_setup_pcm (snd_card_tsc2101_t *tsc2101) {
-+      snd_pcm_t *pcm=0;
-+      int err=0;
++      // TODO: setup mixer (fail, goto nodev)
 +
-+      dprintk ("[%s]\n", __FUNCTION__);
-+      if (!tsc2101)
-+              return -EINVAL;
-+      if ((err=snd_pcm_new (tsc2101->card, "TSC2101 PCM", 0, 1, 1, &pcm)) < 0)
-+              return err;
++      if ((err = snd_card_omap_tsc2101_pcm (omap_tsc2101, 0)) < 0)
++              goto nodev;
 +
-+      if ((err=snd_pcm_lib_preallocate_pages_for_all (pcm, SNDRV_DMA_TYPE_CONTINUOUS, snd_dma_continuous_data (GFP_KERNEL), 128, 128*1024)) < 0)
-+              return err;
++      snd_card_set_pm_callback (card, snd_omap_tsc2101_suspend, snd_omap_tsc2101_resume, omap_tsc2101);
 +
-+      snd_pcm_set_ops (pcm, SNDRV_PCM_STREAM_PLAYBACK, &playback_ops);
-+      snd_pcm_set_ops (pcm, SNDRV_PCM_STREAM_CAPTURE,  &capture_ops);
++      strcpy (card->driver,    "TSC2101");
++      strcpy (card->shortname, "TI TSC2101");
++      strcpy (card->longname,  "TI OMAP TSC2101");
 +
-+      pcm->private_data=tsc2101;
-+      pcm->info_flags = 0;
-+      strncpy (pcm->name, "TSC2101 PCM", sizeof (pcm->name));
-+
-+      spin_lock_init (&tsc2101->s[SNDRV_PCM_STREAM_PLAYBACK].lock);
-+      tsc2101->s[SNDRV_PCM_STREAM_PLAYBACK].id      = "TSC2101 out";
-+      tsc2101->s[SNDRV_PCM_STREAM_PLAYBACK].sid     = SNDRV_PCM_STREAM_PLAYBACK;
-+      tsc2101->s[SNDRV_PCM_STREAM_PLAYBACK].dev = AUDIO_DMA_TX;
-+      if ((err=omap_request_dma (
-+                                      tsc2101->s[SNDRV_PCM_STREAM_PLAYBACK].dev,
-+                                      tsc2101->s[SNDRV_PCM_STREAM_PLAYBACK].id,
-+                                      tsc2101_playback_callback,
-+                                      (void *)&tsc2101->s[SNDRV_PCM_STREAM_PLAYBACK],
-+                                      &tsc2101->s[SNDRV_PCM_STREAM_PLAYBACK].channel)) < 0)
-+              return err;
-+      dprintk ("TX dev=%u channel=%u\n", tsc2101->s[SNDRV_PCM_STREAM_PLAYBACK].dev, tsc2101->s[SNDRV_PCM_STREAM_PLAYBACK].channel);
-+
-+      spin_lock_init (&tsc2101->s[SNDRV_PCM_STREAM_CAPTURE].lock);
-+      tsc2101->s[SNDRV_PCM_STREAM_CAPTURE].id      = "TSC2101 in";
-+      tsc2101->s[SNDRV_PCM_STREAM_CAPTURE].sid     = SNDRV_PCM_STREAM_CAPTURE;
-+      tsc2101->s[SNDRV_PCM_STREAM_CAPTURE].dev = AUDIO_DMA_RX;
-+      if ((err=omap_request_dma (
-+                                      tsc2101->s[SNDRV_PCM_STREAM_CAPTURE].dev,
-+                                      tsc2101->s[SNDRV_PCM_STREAM_CAPTURE].id,
-+                                      tsc2101_capture_callback,
-+                                      (void *)&tsc2101->s[SNDRV_PCM_STREAM_CAPTURE],
-+                                      &tsc2101->s[SNDRV_PCM_STREAM_CAPTURE].channel)) < 0)
-+              return err;
-+      dprintk ("RX dev=%u channel=%u\n", tsc2101->s[SNDRV_PCM_STREAM_CAPTURE].dev, tsc2101->s[SNDRV_PCM_STREAM_CAPTURE].channel);
++      // TODO: init mixer
 +
-+      tsc2101_audio_init (tsc2101);
++      if ((err = snd_card_register (card)) == 0) {
++              printk(KERN_INFO "TSC2101 audio support initialized\n");
++              dev_set_drvdata(dev, card); 
++              return 0;
++      }
++      
++nodev:
++      printk  (KERN_ERR "failed to initialize TSC2101\n");
++      snd_omap_tsc2101_free (card);
++      return err;
++} /* snd_omap_tsc2101_probe */
 +
-+      tsc2101->pcm=pcm;
-+      dprintk ("[%s] pass\n", __FUNCTION__);
++static int
++snd_omap_tsc2101_remove (struct device *dev) {
++      snd_card_t *card = dev_get_drvdata(dev);
++      struct snd_card_omap_tsc2101 *chip = card->private_data;
++      
++      snd_card_free(card);
++      omap_tsc2101       = NULL;
++      card->private_data = NULL;
++      kfree (chip);
++      dev_set_drvdata (dev, NULL); 
 +      return 0;
-+} /* snd_tsc2101_setup_pcm */
++} /* snd_omap_tsc2101_remove */
++
++static struct device_driver omap_alsa_driver = {
++      .name    = "omap_mcbsp",
++      .bus     = &platform_bus_type,
++      .probe   = snd_omap_tsc2101_probe,
++      .remove  = snd_omap_tsc2101_remove,
++      .suspend = omap_tsc2101_suspend, 
++      .resume  = omap_tsc2101_resume, 
++};
 +
-+void
-+snd_tsc2101_disable_pcm (snd_card_tsc2101_t *tsc2101) {
-+      dprintk ("[%s]\n", __FUNCTION__);
-+      omap_stop_dma (tsc2101->s[SNDRV_PCM_STREAM_PLAYBACK].channel);
-+      omap_free_dma (tsc2101->s[SNDRV_PCM_STREAM_PLAYBACK].channel);
-+      omap_stop_dma (tsc2101->s[SNDRV_PCM_STREAM_CAPTURE].channel);
-+      omap_free_dma (tsc2101->s[SNDRV_PCM_STREAM_CAPTURE].channel);
++static void
++omap_alsa_device_release (struct device *dev) {
++      /* Nothing */
++}
 +
-+      set_current_state(TASK_INTERRUPTIBLE);
-+      schedule_timeout(2);
++static struct platform_device omap_alsa_device = {
++      .name = "omap_mcbsp",
++      .id   = -1,
++      .dev  = {
++              .release = omap_alsa_device_release,
++      },
++};
 +
-+      omap_mcbsp_stop (AUDIO_MCBSP);
-+      omap_mcbsp_free (AUDIO_MCBSP);
-+
-+      omap_tsc2101_write(TSC2101_AUDIO_CODEC_REGISTERS, TSC2101_CODEC_POWER_CTRL, ~(CPC_SP1PWDN | CPC_SP2PWDN | CPC_BASSBC));
-+      omap_tsc2101_disable ();
-+      dprintk ("[%s] pass\n", __FUNCTION__);
-+} /* snd_tsc2101_disable_pcm */
-diff -Naur /home/lamikr/own/h6340/kernel/linux-2.6.14-rc5/sound/arm/omap-alsa-dma.c bt_kernel/sound/arm/omap-alsa-dma.c
---- /home/lamikr/own/h6340/kernel/linux-2.6.14-rc5/sound/arm/omap-alsa-dma.c   2005-10-30 17:44:20.392618150 +0200
-+++ bt_kernel/sound/arm/omap-alsa-dma.c        2005-10-30 16:32:39.609796000 +0200
-@@ -325,9 +325,11 @@
-       int cfn = dma_size / (2 * cen);
-       FN_IN;
-       omap_set_dma_dest_params(channel, 0x05, 0x00,
--                               (OMAP1610_MCBSP1_BASE + 0x806));
--      omap_set_dma_src_params(channel, 0x00, 0x01, dma_ptr);
--      omap_set_dma_transfer_params(channel, dt, cen, cfn, 0x00);
-+                              (OMAP1610_MCBSP1_BASE + 0x806),
-+                              0, 0);
-+      omap_set_dma_src_params(channel, 0x00, 0x01, dma_ptr,
-+                              0, 0);
-+      omap_set_dma_transfer_params(channel, dt, cen, cfn, 0x00, 0, 0);
-       FN_OUT(0);
-       return 0;
- }
-@@ -341,9 +343,10 @@
-       int cfn = dma_size / (2 * cen);
-       FN_IN;
-       omap_set_dma_src_params(channel, 0x05, 0x00,
--                              (OMAP1610_MCBSP1_BASE + 0x802));
--      omap_set_dma_dest_params(channel, 0x00, 0x01, dma_ptr);
--      omap_set_dma_transfer_params(channel, dt, cen, cfn, 0x00);
-+                             (OMAP1610_MCBSP1_BASE + 0x802),
-+                             0, 0);
-+      omap_set_dma_dest_params(channel, 0x00, 0x01, dma_ptr, 0, 0);
-+      omap_set_dma_transfer_params(channel, dt, cen, cfn, 0x00, 0, 0);        
-       FN_OUT(0);
-       return 0;
- }
-diff -Naur /home/lamikr/own/h6340/kernel/linux-2.6.14-rc5/sound/oss/Kconfig bt_kernel/sound/oss/Kconfig
---- /home/lamikr/own/h6340/kernel/linux-2.6.14-rc5/sound/oss/Kconfig   2005-10-30 17:44:20.459607487 +0200
-+++ bt_kernel/sound/oss/Kconfig        2005-10-22 03:52:45.687256000 +0300
++static int __init
++omap_tsc2101_init (void) {
++      int err;
++
++      ADEBUG();
++      if ((err = platform_device_register (&omap_alsa_device)) != 0)
++              return err;
++      if ((err = driver_register (&omap_alsa_driver)) != 0)
++              platform_device_unregister (&omap_alsa_device);
++      return err;
++} /* omap_tsc2101_init */
++
++static void __exit
++omap_tsc2101_exit (void) {
++      ADEBUG();
++      driver_unregister (&omap_alsa_driver);
++      platform_device_unregister (&omap_alsa_device);
++} /* omap_tsc2101_exit */
++
++module_init (omap_tsc2101_init);
++module_exit (omap_tsc2101_exit);
+diff -Naur linux-2.6.14-omap2/sound/arm/omap-tsc2101.h linux-h6300-omap2-2.6.14.3/sound/arm/omap-tsc2101.h
+--- linux-2.6.14-omap2/sound/arm/omap-tsc2101.h        1970-01-01 02:00:00.000000000 +0200
++++ linux-h6300-omap2-2.6.14.3/sound/arm/omap-tsc2101.h        2005-11-13 02:15:10.000000000 +0200
+@@ -0,0 +1,13 @@
++#ifndef __OMAP_AUDIO_TSC2101_H
++#define __OMAP_AUDIO_TSC2101_H
++
++# include "omap-alsa-dma.h"
++
++struct snd_card_omap_tsc2101 {
++      snd_card_t *card;
++      snd_pcm_t *pcm;
++      long samplerate;
++      struct audio_stream s[2];       /* playback & capture */
++};
++
++#endif /* __OMAP_AUDIO_TSC2101_H */
+diff -Naur linux-2.6.14-omap2/sound/oss/Kconfig linux-h6300-omap2-2.6.14.3/sound/oss/Kconfig
+--- linux-2.6.14-omap2/sound/oss/Kconfig       2005-12-02 01:53:34.000000000 +0200
++++ linux-h6300-omap2-2.6.14.3/sound/oss/Kconfig       2005-10-22 03:52:45.000000000 +0300
 @@ -12,7 +12,7 @@
  
  config SOUND_OMAP_TSC2101
@@ -30772,40 +32911,9 @@ diff -Naur /home/lamikr/own/h6340/kernel/linux-2.6.14-rc5/sound/oss/Kconfig bt_k
        select OMAP_TSC2101
        select OMAP_UWIRE if ARCH_OMAP
        ---help---
-diff -Naur /home/lamikr/own/h6340/kernel/linux-2.6.14-rc5/sound/oss/omap-audio-dma-intfc.c bt_kernel/sound/oss/omap-audio-dma-intfc.c
---- /home/lamikr/own/h6340/kernel/linux-2.6.14-rc5/sound/oss/omap-audio-dma-intfc.c    2005-10-30 17:44:20.656576134 +0200
-+++ bt_kernel/sound/oss/omap-audio-dma-intfc.c 2005-10-30 16:32:39.609796000 +0200
-@@ -701,9 +701,10 @@
-       int cfn = dma_size / (2 * cen);
-       FN_IN;
-       omap_set_dma_dest_params(channel, 0x05, 0x00,
--                               (OMAP1610_MCBSP1_BASE + 0x806));
--      omap_set_dma_src_params(channel, 0x00, 0x01, dma_ptr);
--      omap_set_dma_transfer_params(channel, dt, cen, cfn, 0x00);
-+                               (OMAP1610_MCBSP1_BASE + 0x806),
-+                               0, 0);
-+      omap_set_dma_src_params(channel, 0x00, 0x01, dma_ptr, 0, 0);
-+      omap_set_dma_transfer_params(channel, dt, cen, cfn, 0x00, 0, 0);
-       FN_OUT(0);
-       return 0;
- }
-@@ -716,9 +717,10 @@
-       int cfn = dma_size / (2 * cen);
-       FN_IN;
-       omap_set_dma_src_params(channel, 0x05, 0x00,
--                              (OMAP1610_MCBSP1_BASE + 0x802));
--      omap_set_dma_dest_params(channel, 0x00, 0x01, dma_ptr);
--      omap_set_dma_transfer_params(channel, dt, cen, cfn, 0x00);
-+                              (OMAP1610_MCBSP1_BASE + 0x802),
-+                              0, 0);
-+      omap_set_dma_dest_params(channel, 0x00, 0x01, dma_ptr, 0, 0);
-+      omap_set_dma_transfer_params(channel, dt, cen, cfn, 0x00, 0, 0);
-       FN_OUT(0);
-       return 0;
- }
-diff -Naur /home/lamikr/own/h6340/kernel/linux-2.6.14-rc5/sound/oss/omap-audio-tsc2101.c bt_kernel/sound/oss/omap-audio-tsc2101.c
---- /home/lamikr/own/h6340/kernel/linux-2.6.14-rc5/sound/oss/omap-audio-tsc2101.c      2005-10-30 17:44:20.697569609 +0200
-+++ bt_kernel/sound/oss/omap-audio-tsc2101.c   2005-10-22 03:52:45.687256000 +0300
+diff -Naur linux-2.6.14-omap2/sound/oss/omap-audio-tsc2101.c linux-h6300-omap2-2.6.14.3/sound/oss/omap-audio-tsc2101.c
+--- linux-2.6.14-omap2/sound/oss/omap-audio-tsc2101.c  2005-12-02 01:53:34.000000000 +0200
++++ linux-h6300-omap2-2.6.14.3/sound/oss/omap-audio-tsc2101.c  2005-10-22 03:52:45.000000000 +0300
 @@ -48,7 +48,7 @@
  #include "omap-audio.h"
  #include "omap-audio-dma-intfc.h"
@@ -30868,14 +32976,3 @@ diff -Naur /home/lamikr/own/h6340/kernel/linux-2.6.14-rc5/sound/oss/omap-audio-t
  };
  
  /***************************** MODULES SPECIFIC FUNCTION PROTOTYPES ********************/
-diff -Naur /home/lamikr/own/h6340/kernel/linux-2.6.14-rc5/usr/.gitignore bt_kernel/usr/.gitignore
---- /home/lamikr/own/h6340/kernel/linux-2.6.14-rc5/usr/.gitignore      2005-10-20 09:23:05.000000000 +0300
-+++ bt_kernel/usr/.gitignore   1970-01-01 02:00:00.000000000 +0200
-@@ -1,7 +0,0 @@
--#
--# Generated files
--#
--gen_init_cpio
--initramfs_data.cpio
--initramfs_data.cpio.gz
--initramfs_list
@@ -3,12 +3,12 @@ MAINTAINER = "Mika Laitio <lamikr@cc.jyu.fi>"
 SECTION = "kernel"
 LICENSE = "GPL"
 
-SRC_URI = "http://www.kernel.org/pub/linux/kernel/v2.6/testing/linux-2.6.14-rc5.tar.bz2 \
-           http://www.muru.com/linux/omap/patches/patch-2.6.14-rc5-omap1.bz2;patch=1 \
-           file://h6300_omap1_2614rc5.patch;patch=1 \
+SRC_URI = "http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.14.tar.bz2 \
+           http://www.muru.com/linux/omap/patches/patch-2.6.14-omap2.bz2;patch=1 \
+           file://patch-linux-2614-omap2-to-2614_3-omap1-h6300;patch=1 \
            file://defconfig"
 
-S = "${WORKDIR}/linux-2.6.14-rc5"
+S = "${WORKDIR}/linux-2.6.14"
 
 inherit kernel