summaryrefslogtreecommitdiff
path: root/packages/linux
diff options
context:
space:
mode:
authorMika Laitio <lamikr@cc.jyu.fi>2005-12-03 22:13:21 +0000
committerOpenEmbedded Project <openembedded-devel@lists.openembedded.org>2005-12-03 22:13:21 +0000
commitec3bff608d703cd39e2db1d6d747a063385cbe0a (patch)
tree800c0be60e896bcb24e19d12a0dc439885c2ce11 /packages/linux
parente279d73e06478c9f5bc1ef2e22e8bc3c047779ec (diff)
h6300 kernel: update to 2.6.14.3 and remove 2.6.14-rc5
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
Diffstat (limited to 'packages/linux')
-rw-r--r--packages/linux/linux-h6300-omap1-2.6.14.3/.mtn2git_empty (renamed from packages/linux/linux-h6300-omap1-2.6.14-rc5/.mtn2git_empty)0
-rw-r--r--packages/linux/linux-h6300-omap1-2.6.14.3/defconfig (renamed from packages/linux/linux-h6300-omap1-2.6.14-rc5/defconfig)36
-rw-r--r--packages/linux/linux-h6300-omap1-2.6.14.3/patch-linux-2614-omap2-to-2614_3-omap1-h6300 (renamed from packages/linux/linux-h6300-omap1-2.6.14-rc5/h6300_omap1_2614rc5.patch)6989
-rw-r--r--packages/linux/linux-h6300-omap1_2.6.14.3.bb (renamed from packages/linux/linux-h6300-omap1_2.6.14-rc5.bb)8
4 files changed, 4580 insertions, 2453 deletions
diff --git a/packages/linux/linux-h6300-omap1-2.6.14-rc5/.mtn2git_empty b/packages/linux/linux-h6300-omap1-2.6.14.3/.mtn2git_empty
index e69de29bb2..e69de29bb2 100644
--- a/packages/linux/linux-h6300-omap1-2.6.14-rc5/.mtn2git_empty
+++ b/packages/linux/linux-h6300-omap1-2.6.14.3/.mtn2git_empty
diff --git a/packages/linux/linux-h6300-omap1-2.6.14-rc5/defconfig b/packages/linux/linux-h6300-omap1-2.6.14.3/defconfig
index 8e76562fb3..40f2840644 100644
--- a/packages/linux/linux-h6300-omap1-2.6.14-rc5/defconfig
+++ b/packages/linux/linux-h6300-omap1-2.6.14.3/defconfig
@@ -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 --git a/packages/linux/linux-h6300-omap1-2.6.14-rc5/h6300_omap1_2614rc5.patch b/packages/linux/linux-h6300-omap1-2.6.14.3/patch-linux-2614-omap2-to-2614_3-omap1-h6300
index 435a5f12a2..e7e442e7c2 100644
--- a/packages/linux/linux-h6300-omap1-2.6.14-rc5/h6300_omap1_2614rc5.patch
+++ b/packages/linux/linux-h6300-omap1-2.6.14.3/patch-linux-2614-omap2-to-2614_3-omap1-h6300
@@ -1,6 +1,1548 @@
-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
+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
++
++#
++# 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
++
++#
++# 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
++
++#
++# 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
++
++#
++# 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
++
++#
++# TI OMAP Implementations
++#
++CONFIG_ARCH_OMAP1=y
++# CONFIG_ARCH_OMAP2 is not set
++
++#
++# OMAP Feature Selections
++#
++# CONFIG_OMAP_RESET_CLOCKS is not set
++# CONFIG_OMAP_BOOT_TAG is not set
++CONFIG_OMAP_MUX=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
++
++#
++# OMAP Core Type
++#
++# CONFIG_ARCH_OMAP730 is not set
++CONFIG_ARCH_OMAP15XX=y
++# CONFIG_ARCH_OMAP16XX is not set
++
++#
++# 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
++
++#
++# 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
++
++#
++# 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
++
++#
++# 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
++
++#
++# Bus support
++#
++CONFIG_ISA_DMA_API=y
++
++#
++# 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
++
++#
++# PC-card bridges
++#
++
++#
++# 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
++
++#
++# 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
++
++#
++# 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
++
++#
++# Floating point emulation
++#
++
++#
++# At least one emulation must be selected
++#
++CONFIG_FPE_NWFPE=y
++CONFIG_FPE_NWFPE_XP=y
++# CONFIG_FPE_FASTFPE is not set
++
++#
++# Userspace binary formats
++#
++CONFIG_BINFMT_ELF=y
++CONFIG_BINFMT_AOUT=y
++CONFIG_BINFMT_MISC=y
++# CONFIG_ARTHUR is not set
++
++#
++# Power management options
++#
++CONFIG_PM=y
++CONFIG_APM=y
++
++#
++# Networking
++#
++CONFIG_NET=y
++
++#
++# 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
++
++#
++# 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
++
++#
++# 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
++
++#
++# 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
++
++#
++# 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
++
++#
++# DCCP Configuration (EXPERIMENTAL)
++#
++# CONFIG_IP_DCCP is not set
++
++#
++# 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
++
++#
++# Network testing
++#
++# CONFIG_NET_PKTGEN is not set
++# CONFIG_HAMRADIO is not set
++CONFIG_IRDA=m
++
++#
++# IrDA protocols
++#
++CONFIG_IRLAN=m
++CONFIG_IRNET=m
++CONFIG_IRCOMM=m
++CONFIG_IRDA_ULTRA=y
++
++#
++# IrDA options
++#
++CONFIG_IRDA_CACHE_LAST_LSAP=y
++CONFIG_IRDA_FAST_RR=y
++# CONFIG_IRDA_DEBUG is not set
++
++#
++# Infrared-port device drivers
++#
++
++#
++# SIR device drivers
++#
++# CONFIG_IRTTY_SIR is not set
++
++#
++# Dongle support
++#
++
++#
++# Old SIR device drivers
++#
++# CONFIG_IRPORT_SIR is not set
++
++#
++# Old Serial dongle support
++#
++
++#
++# 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
++
++#
++# 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
++
++#
++# Device Drivers
++#
++
++#
++# Generic Driver Options
++#
++CONFIG_STANDALONE=y
++CONFIG_PREVENT_FIRMWARE_BUILD=y
++CONFIG_FW_LOADER=y
++# CONFIG_DEBUG_DRIVER is not set
++
++#
++# 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
++
++#
++# 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
++
++#
++# 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
++
++#
++# 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
++
++#
++# 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
++
++#
++# 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
++
++#
++# 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
++
++#
++# Parallel port support
++#
++# CONFIG_PARPORT is not set
++
++#
++# Plug and Play support
++#
++
++#
++# Block devices
++#
++# CONFIG_BLK_DEV_COW_COMMON is not set
++CONFIG_BLK_DEV_LOOP=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
++
++#
++# 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
++
++#
++# ATA/ATAPI/MFM/RLL support
++#
++# CONFIG_IDE is not set
++
++#
++# SCSI device support
++#
++# CONFIG_RAID_ATTRS is not set
++# CONFIG_SCSI is not set
++
++#
++# Multi-device support (RAID and LVM)
++#
++# CONFIG_MD is not set
++
++#
++# Fusion MPT device support
++#
++# CONFIG_FUSION is not set
++
++#
++# IEEE 1394 (FireWire) support
++#
++# CONFIG_IEEE1394 is not set
++
++#
++# I2O device support
++#
++
++#
++# 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
++
++#
++# PHY device support
++#
++# CONFIG_PHYLIB is not set
++
++#
++# Ethernet (10 or 100Mbit)
++#
++CONFIG_NET_ETHERNET=y
++CONFIG_MII=y
++CONFIG_SMC91X=y
++# CONFIG_DM9000 is not set
++
++#
++# Ethernet (1000 Mbit)
++#
++
++#
++# Ethernet (10000 Mbit)
++#
++
++#
++# Token Ring devices
++#
++
++#
++# Wireless LAN (non-hamradio)
++#
++CONFIG_NET_RADIO=y
++
++#
++# Obsolete Wireless cards support (pre-802.11)
++#
++CONFIG_STRIP=y
++# CONFIG_PCMCIA_WAVELAN is not set
++# CONFIG_PCMCIA_NETWAVE is not set
++
++#
++# Wireless 802.11 Frequency Hopping cards support
++#
++# CONFIG_PCMCIA_RAYCS is not set
++
++#
++# Wireless 802.11b ISA/PCI cards support
++#
++# CONFIG_AIRO is not set
++# CONFIG_HERMES is not set
++CONFIG_ATMEL=y
++
++#
++# 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
++
++#
++# PCMCIA network device support
++#
++# CONFIG_NET_PCMCIA is not set
++
++#
++# 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
++
++#
++# ISDN subsystem
++#
++# CONFIG_ISDN is not set
++
++#
++# Input device support
++#
++CONFIG_INPUT=y
++
++#
++# 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
++
++#
++# 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"
@@ -10,9 +1552,9 @@ diff -Naur /home/lamikr/own/h6340/kernel/linux-2.6.14-rc5/arch/arm/Kconfig bt_ke
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
+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
@@ -331,9 +1873,9 @@ diff -Naur /home/lamikr/own/h6340/kernel/linux-2.6.14-rc5/arch/arm/mach-omap1/bo
+ .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
+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.
@@ -347,9 +1889,9 @@ diff -Naur /home/lamikr/own/h6340/kernel/linux-2.6.14-rc5/arch/arm/mach-omap1/Kc
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
+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
@@ -360,44 +1902,35 @@ diff -Naur /home/lamikr/own/h6340/kernel/linux-2.6.14-rc5/arch/arm/mach-omap1/Ma
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);
- }
+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)
-+#else
-+static inline void omap_init_i2c(void) {}
-+
- #endif
++/* 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)
- /*-------------------------------------------------------------------------*/
-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 @@
+ /* 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>
@@ -405,69 +1938,7 @@ diff -Naur /home/lamikr/own/h6340/kernel/linux-2.6.14-rc5/arch/arm/plat-omap/dma
#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 @@
+@@ -1086,6 +1087,10 @@
}
if (omap_dma_in_1510_mode()) {
@@ -478,60 +1949,9 @@ diff -Naur /home/lamikr/own/h6340/kernel/linux-2.6.14-rc5/arch/arm/plat-omap/dma
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
+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
@@ -541,9 +1961,125 @@ diff -Naur /home/lamikr/own/h6340/kernel/linux-2.6.14-rc5/arch/arm/tools/mach-ty
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
+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
@@ -561,9 +2097,9 @@ diff -Naur /home/lamikr/own/h6340/kernel/linux-2.6.14-rc5/drivers/bluetooth/Kcon
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
+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
@@ -579,9 +2115,9 @@ diff -Naur /home/lamikr/own/h6340/kernel/linux-2.6.14-rc5/drivers/bluetooth/Make
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
+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
@@ -612,12 +2148,12 @@ diff -Naur /home/lamikr/own/h6340/kernel/linux-2.6.14-rc5/drivers/bluetooth/omap
+
+ // printk( KERN_NOTICE "h6300 configure bluetooth: %d\n", enable );
+ if (enable == 0) {
-+ omap_set_gpio_dataout(GPIO_N_BT_RST, 0); // turn off gpio
++ 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
++ omap_set_gpio_dataout(GPIO_N_BT_RST, 1); // turn on gpio, note 0 == on for negative gpios
+ mdelay(5);
+ }
+ else if (enable == 2) {
@@ -666,7 +2202,7 @@ diff -Naur /home/lamikr/own/h6340/kernel/linux-2.6.14-rc5/drivers/bluetooth/omap
+
+ 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
++ omap_set_gpio_dataout(GPIO_N_BT_RST, 0); // turn on gpio, note 0 == on for negative gpios
+
+ /* configure bluetooth UART */
+ //h6300_gpio_mode(GPIO_NR_H6300_BT_RXD_MD);
@@ -736,9 +2272,9 @@ diff -Naur /home/lamikr/own/h6340/kernel/linux-2.6.14-rc5/drivers/bluetooth/omap
+MODULE_DESCRIPTION("iPAQ h6300 BRF6100 Bluetooth driver.");
+MODULE_LICENSE("GPL");
+
-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
+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.
@@ -781,9 +2317,9 @@ diff -Naur /home/lamikr/own/h6340/kernel/linux-2.6.14-rc5/drivers/bluetooth/omap
+ 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
+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_
@@ -794,9 +2330,9 @@ diff -Naur /home/lamikr/own/h6340/kernel/linux-2.6.14-rc5/drivers/bluetooth/omap
+void h6300_set_led(int led_num, int duty_time, int cycle_time);
+
+#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
+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.
@@ -804,396 +2340,228 @@ diff -Naur /home/lamikr/own/h6340/kernel/linux-2.6.14-rc5/drivers/bluetooth/omap
+
+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
+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);
- 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
+-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);
+
-+/*
-+ * 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,16 +260,24 @@
- return -1;
- }
-
-+int is_key_down(unsigned char new_state[],
-+ int col,
-+ int row)
++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
- 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);
+ 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;
- 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);
-
++static int prevJoypadKeycodePressEmulated;
++
+ static struct timer_list kp_timer;
+ DECLARE_TASKLET_DISABLED(kp_tasklet, omap_kp_tasklet, 0);
- 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);
+@@ -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 {
- 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);
++ printk("omap_keypad.c, keyMap = test_keymap\n");
+ keymap = test_keymap;
}
-@@ -727,7 +732,8 @@
- 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);
- }
+@@ -305,7 +528,7 @@
+ omap_kp_dev.name = "omap-keypad";
+ input_register_device(&omap_kp_dev);
- /* a scatterlist segment completed */
-@@ -767,9 +773,6 @@
+- 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 @@
- 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);
+ omap_writew(0xff, OMAP_MPUIO_BASE + OMAP_MPUIO_GPIO_DEBOUNCING);
+ }
++ prevJoypadKeycodePressEmulated = 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
+
+ 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"
+
+ 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 @@
- omap_enable_dma_irq(si->rx_dma_channel, 0x01);
+ hdlc->state.fr.reliable = reliable;
+ if (reliable) {
++#if 0
+ if (!netif_carrier_ok(dev))
+ 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);
+ 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_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);
- omap_start_dma(si->rx_dma_channel);
+@@ -94,11 +96,13 @@
+ if (hdlc->proto.stop)
+ return hdlc->proto.stop(dev);
+
++#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;
+ }
@@ -28926,9 +30712,9 @@ diff -Naur /home/lamikr/own/h6340/kernel/linux-2.6.14-rc5/drivers/video/omap/lcd
+ .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
+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
@@ -28937,338 +30723,9 @@ diff -Naur /home/lamikr/own/h6340/kernel/linux-2.6.14-rc5/drivers/video/omap/Mak
omapfb-objs := $(objs-yy)
-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 @@
-+/*
-+ * File: drivers/video/omap_new/omapfb.c
-+ *
-+ * Framebuffer driver for TI OMAP boards
-+ *
-+ * Copyright (C) 2004 Nokia Corporation
-+ * Author: Imre Deak <imre.deak@nokia.com>
-+ *
-+ * This program is free software; you can redistribute it and/or modify it
-+ * under the terms of the GNU General Public License as published by the
-+ * Free Software Foundation; either version 2 of the License, or (at your
-+ * option) any later version.
-+ *
-+ * This 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.
-+ */
-+
-+#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
-+};
-+
-+#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;
-+};
-+
-+struct fb_scale {
-+ unsigned int xscale, yscale;
-+};
-+
-+struct fb_frame_offset {
-+ unsigned int idx;
-+ unsigned long offset;
-+};
-+
-+struct fb_update_window {
-+ unsigned int x, y;
-+ unsigned int width, height;
-+};
-+
-+enum fb_update_mode {
-+ FB_UPDATE_DISABLED = 0,
-+ FB_AUTO_UPDATE,
-+ FB_MANUAL_UPDATE
-+};
-+
-+#ifdef __KERNEL__
-+
-+#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;
-+};
-+
-+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);
-+};
-+
-+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);
-+};
-+
-+enum omapfb_state {
-+ OMAPFB_DISABLED = 0,
-+ OMAPFB_SUSPENDED= 99,
-+ OMAPFB_ACTIVE = 100
-+};
-+
-+struct gfx_lchannel {
-+ int lch_num;
-+ struct gfx_lchannel *next, *prev;
-+};
-+
-+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 */
-+};
-+
-+#define OMAPFB_RQUEUE_SIZE 20
-+
-+struct omapfb_fillrect_params
-+{
-+ struct fb_info *fbi;
-+ struct fb_fillrect rect;
-+};
-+
-+struct omapfb_copyarea_params
-+{
-+ struct fb_info *fbi;
-+ struct fb_copyarea_ext area;
-+};
-+
-+struct omapfb_update_window_params
-+{
-+ struct fb_info *fbi;
-+ struct fb_update_window win;
-+};
-+
-+struct omapfb_imageblit_params
-+{
-+ struct fb_info *fbi;
-+ struct fb_image image;
-+ int flags;
-+};
-+
-+union req_params
-+{
-+ /* 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;
-+};
-+
-+struct omapfb_request
-+{
-+ struct list_head entry;
-+ int (*function)(void *par);
-+ union req_params par;
-+};
-+
-+struct omapfb_rqueue
-+{
-+ 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;
-+};
-+
-+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;
-+
-+extern struct lcd_ctrl omapfb_lcdc_ctrl;
-+
-+#endif /* __KERNEL__ */
-+
-+#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
+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;
@@ -29287,92 +30744,94 @@ diff -Naur /home/lamikr/own/h6340/kernel/linux-2.6.14-rc5/drivers/video/omap/oma
#ifdef CONFIG_MACH_OMAP_INNOVATOR
-@@ -260,18 +264,40 @@
- u_int blue, u_int transp, int update_hw_pal)
- {
- struct omapfb_device *fbdev = (struct omapfb_device *)info->par;
-- u16 pal;
- int r = 0;
+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;
-- if (regno < 16) {
-- pal = ((red >> 11) << 11) | ((green >> 10) << 5) | (blue >> 11);
-- ((u32 *)(info->pseudo_palette))[regno] = pal;
-- }
-+ 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;
+ /*
+@@ -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;
-- if (fbdev->ctrl->setcolreg)
-- r = fbdev->ctrl->setcolreg(regno, red, green, blue, transp,
-- update_hw_pal);
-+ if (regno < 0) {
-+ r = -EINVAL;
-+ break;
-+ }
+@@ -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();
-+ if (regno < 16) {
-+ u16 pal;
-+ pal = ((red >> 11) << 11) | ((green >> 10) << 5) |
-+ (blue >> 11);
-+ ((u32 *)(info->pseudo_palette))[regno] = pal;
-+ }
-+ break;
-+ default:
-+ BUG();
-+ }
- return r;
- }
+@@ -736,7 +738,6 @@
+ proc_pid_flush(proc_dentry2);
-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
--
--#
--# Top-level generic files
--#
--vmlinux*
--System.map
--Module.symvers
--
--#
--# Generated include files
--#
--include/asm
--include/config
--include/linux/autoconf.h
--include/linux/compile.h
--include/linux/version.h
--
-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
+ 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);
+
+ 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 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 @@
+/*
+ * linux/include/asm-arm/arch-omap/board-innovator.h
@@ -29414,65 +30873,9 @@ diff -Naur /home/lamikr/own/h6340/kernel/linux-2.6.14-rc5/include/asm-arm/arch-o
+#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
-
-+/* 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);
-
- 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);
-
- 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
-
-+#ifdef CONFIG_MACH_OMAP_H6300
-+#include "board-h6300.h"
-+#endif
-+
- #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
+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.
@@ -29507,9 +30910,35 @@ diff -Naur /home/lamikr/own/h6340/kernel/linux-2.6.14-rc5/include/asm-arm/arch-o
+};
+
+#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
+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,
@@ -29532,9 +30961,9 @@ diff -Naur /home/lamikr/own/h6340/kernel/linux-2.6.14-rc5/include/asm-arm/arch-o
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
+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;
@@ -29543,9 +30972,9 @@ diff -Naur /home/lamikr/own/h6340/kernel/linux-2.6.14-rc5/include/asm-arm/arch-o
#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
+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.
@@ -29609,9 +31038,9 @@ diff -Naur /home/lamikr/own/h6340/kernel/linux-2.6.14-rc5/include/asm-arm/arch-o
+extern struct platform_device btuart_device;
+
+#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
+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
@@ -29652,1117 +31081,1827 @@ diff -Naur /home/lamikr/own/h6340/kernel/linux-2.6.14-rc5/include/asm-arm/arch-o
+extern int pca9535_gpio_direction(int gpio, unsigned char direction);
+
+#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 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);
++
++/* called under sysctl_lock */
++static int use_table(struct ctl_table_header *p)
++{
++ if (unlikely(p->unregistering))
++ return 0;
++ p->used++;
++ return 1;
++}
++
++/* called under sysctl_lock */
++static void unuse_table(struct ctl_table_header *p)
++{
++ if (!--p->used)
++ if (unlikely(p->unregistering))
++ complete(p->unregistering);
++}
++
++/* called under sysctl_lock, will reacquire if has to wait */
++static void start_unregistering(struct ctl_table_header *p)
++{
++ /*
++ * 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);
++}
++
+ 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;
++
++ spin_unlock(&sysctl_lock);
++
++ error = parse_table(name, nlen, oldval, oldlenp,
+ newval, newlen, head->ctl_table,
+ &context);
+ kfree(context);
++
++ 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;
+ }
+
+ 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
+ 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);
+ }
+
+@@ -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;
-
-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
+- 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;
+ }
+
+ 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)-omap1
-+EXTRAVERSION := $(EXTRAVERSION)-omap-h6300
+-EXTRAVERSION := $(EXTRAVERSION)-omap2
++EXTRAVERSION := $(EXTRAVERSION)-omap1-h6300
# 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.
+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 @@
+ {
+ [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 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;
+- }
++ if (!try_module_get(p->me))
++ p = &ip_nat_unknown_protocol;
+ preempt_enable();
+
+ 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;
+
++ 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;
++ }
++ opt->opt_nflen -= ipv6_optlen(opt->dst0opt);
++ opt->dst0opt = NULL;
++ }
++
++ 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_OMAP1
++ depends ARCH_OMAP && SND
+ 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
++ 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/
-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
-+#
++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 @@
+ }
+
+ /*
+- * DMA functions
+- * Depends on omap-aic23-dma.c functions and (omap) dma.c
+- *
+- */
+-#define DMA_BUF_SIZE 1024 * 8
+-
+-static int audio_dma_request(struct audio_stream *s,
+- void (*callback) (void *))
+-{
+- int err;
+-
+- 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;
+-}
+-
+-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"
+
+ #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
+
+ /*
+- * 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 @@
+
+ /*********** Function Prototypes *************************/
+
+-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;
+
-+snd-omap-tsc2101-objs := tsc2101_main.o tsc2101_mix.o tsc2101_pcm.o
++ 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;
++}
+
-+# 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 @@
-+/*
-+ * 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
-+ *
-+ */
-+#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;
++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;
++}
+
-+ 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
-+ *
++ * 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;
+
-+#include <asm/hardware.h>
-+#include <asm/mach-types.h>
-+#include "omap-tsc2101.h"
++ /* this must be called w/ interrupts locked as requested in dma.c */
++ spin_lock_irqsave(&s->dma_lock, flags);
+
-+#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;
++ /* For the current period let's see where we are */
++ count = omap_get_dma_src_addr_counter(s->lch[s->dma_q_head]);
+
-+ tsc2101=0;
-+ card->private_data=0;
-+ kfree (chip);
-+} /* snd_tsc2101_free */
++ spin_unlock_irqrestore(&s->dma_lock, flags);
+
-+static int __init
-+alsa_card_tsc2101_init (void) {
-+ int err=0;
-+ snd_card_t *card;
++ /* Now, the position related to the end of that period */
++ offset = bytes_to_frames(runtime, s->offset) - bytes_to_frames(runtime, count);
+
-+ if (!machine_is_h6300 ())
-+ return -ENODEV;
++ if (offset >= runtime->buffer_size || offset < 0)
++ offset = 0;
+
-+ 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;
++ return offset;
++}
+
-+ card->private_data=(void *)tsc2101;
-+ card->private_free=snd_tsc2101_free;
++/*
++ * this stops the dma and clears the dma ptrs
++ */
++void audio_stop_dma(struct audio_stream *s)
++{
++ unsigned long flags;
+
-+ tsc2101->card=card;
-+ tsc2101->samplerate=AUDIO_RATE_DEFAULT;
++ spin_lock_irqsave(&s->dma_lock, flags);
++ s->active = 0;
++ s->period = 0;
++ s->periods = 0;
+
-+ if ((err=snd_tsc2101_setup_pcm (tsc2101)) < 0)
-+ goto nodev;
-+ if ((err=snd_tsc2101_setup_mix (tsc2101)) < 0)
-+ goto nodev;
++ /* this stops the dma channel and clears the buffer ptrs */
++ omap_audio_stop_dma(s);
+
-+ // TODO: PM
++ omap_clear_sound_dma(s);
+
-+ 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));
++ spin_unlock_irqrestore(&s->dma_lock, flags);
++}
+
-+ if ((err=snd_card_register (card)) == 0) {
-+ printk (KERN_INFO "TSC2101 audio support initialized\n");
-+ return 0;
++/*
++ * Main dma routine, requests dma according where you are in main alsa buffer
++ */
++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;
+ }
++}
+
-+nodev:
-+ snd_tsc2101_disable_pcm (tsc2101);
-+ snd_card_free (card);
-+ return err;
-+} /* alsa_card_tsc2101_init */
++/*
++ * 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;
+
-+static void __exit
-+alsa_card_tsc2101_exit (void) {
-+ snd_tsc2101_disable_pcm (tsc2101);
-+ snd_card_free(tsc2101->card);
-+} /* alsa_card_tsc2101_exit */
++ /*
++ * 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);
+
-+module_init(alsa_card_tsc2101_init)
-+module_exit(alsa_card_tsc2101_exit)
++ spin_lock(&s->dma_lock);
++ if (s->periods > 0) {
++ s->periods--;
++ }
++ audio_process_dma(s);
++ spin_unlock(&s->dma_lock);
++}
+
-+MODULE_AUTHOR("Everett Coleman II <gcc80x86@fuzzyneural.net>");
-+MODULE_DESCRIPTION("TI TSC2101 Audio Driver");
-+MODULE_LICENSE("GPL");
+ 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 @@
+
+ /************************** INCLUDES *************************************/
+
+-#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 */
+
+ /************************** GLOBAL MACROS *************************************/
+
+@@ -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
+
-+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 @@
+ /************************** 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
+ */
++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 */
+
-+#include "omap-tsc2101.h"
+ 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>
+
-+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 */
++#ifdef CONFIG_PM
++#include <linux/pm.h>
++#endif
+
-+# 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 */
++#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>
+
-+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 */
++#include <sound/core.h>
++#include <sound/pcm.h>
++#include <sound/initval.h>
++#include <sound/memalloc.h>
+
-+ 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 */
++#include "omap-alsa-dma.h"
++#include "omap-tsc2101.h"
+
-+ if (count)
-+ omap_tsc2101_write (TSC2101_AUDIO_CODEC_REGISTERS, TSC2101_DAC_GAIN_CTRL, val);
++//#undef DEBUG
++#define DEBUG
+
-+ return count;
-+} /* __pcm_playback_volume_put */
++#ifdef DEBUG
++#define ADEBUG() printk("XXX Alsa debug f:%s, l:%d\n", __FUNCTION__, __LINE__)
++#else
++#define ADEBUG() /* nop */
++#endif
+
-+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;
-+ return 0;
-+} /* __pcm_playback_switch_info */
++#define TSC2101_MASTER
+
-+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
-+ return 0;
-+} /* __pcm_playback_switch_get */
++#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)
+
-+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;
++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");
+
-+ 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 */
++static char *id = NULL;
++MODULE_PARM_DESC(id, "OMAP ALSA Driver for TSC2101 chip.");
+
-+ if (count)
-+ omap_tsc2101_write (TSC2101_AUDIO_CODEC_REGISTERS, TSC2101_DAC_GAIN_CTRL, val);
-+ return count;
-+} /* __pcm_playback_switch_put */
++static struct snd_card_omap_tsc2101 *omap_tsc2101 = NULL;
+
-+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;
-+ return 0;
-+} /* __line_playback_volume_info */
++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),
+
-+#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);
-+ return 0;
-+} /* __line_playback_volume_get */
++ /* platform specific initialization */
++# if defined(CONFIG_MACH_OMAP_H2)
++ .pcr0 = CLKXM | CLKRM | FSXP | FSRP | CLKXP | CLKRP,
++# elif defined(CONFIG_MACH_OMAP_H3)
+
-+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 */
++# 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 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 unsigned int rates[] = {
++ 7350, 8000, 8018, 8727,
++ 8820, 9600, 11025, 12000,
++ 14700, 16000, 22050, 24000,
++ 29400, 32000, 44100, 48000
++};
+
-+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 */
++static snd_pcm_hw_constraint_list_t hw_constraints_rates = {
++ .count = ARRAY_SIZE(rates),
++ .list = rates,
++ .mask = 0,
++};
+
-+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;
++struct sample_rate_reg_info {
++ u16 sample_rate;
++ u8 divisor;
++ u8 fs_44kHz;
++};
+
-+ 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,
-+ }
++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}
+};
+
-+int
-+snd_tsc2101_setup_mix (snd_card_tsc2101_t *tsc2101) {
-+ int i=0, err=0;
++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,
++};
+
-+ 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
-+ *
-+ */
++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,
++};
+
-+#include <asm/arch/mcbsp.h>
-+#include <linux/delay.h>
-+#include <asm/arch/gpio.h>
-+#include "omap-tsc2101.h"
++static __inline__ void
++audio_tsc2101_write (u8 address, u16 data) {
++ omap_tsc2101_write (PAGE2_AUDIO_CODEC_REGISTERS, address, data);
++} /* audio_tsc2101_write */
++
++static __inline__ u16
++audio_tsc2101_read (u8 address) {
++ return (omap_tsc2101_read(PAGE2_AUDIO_CODEC_REGISTERS, address));
++} /* audio_tsc2101_read */
+
-+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,
-+ }
-+};
+
-+static unsigned int rate_list[] = {
-+ 7350, 8000, 8018, 8727,
-+ 8820, 9600, 11025, 12000,
-+ 14700, 16000, 22050, 24000,
-+ 29400, 32000, 44100, 48000
-+};
+
-+static snd_pcm_hw_constraint_list_t rate_constraint = {
-+ .count = ARRAY_SIZE (rate_list),
-+ .list = rate_list,
-+ .mask = 0,
-+};
+
+
-+static int
-+__tsc2101_open (snd_pcm_substream_t *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];
+
-+ 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)
-+ return err;
+
-+ dprintk ("[%s] pass\n", __FUNCTION__);
++
++
++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.
++ */
++
++
++
++
++ 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
++snd_omap_tsc2101_suspend (snd_card_t * card, pm_message_t state) {
++ // TODO: function
+ return 0;
-+} /* __tsc2101_open */
++} /* snd_omap_tsc2101_suspend */
+
+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_omap_tsc2101_resume (snd_card_t * card) {
++ // TODO: function
+ return 0;
-+} /* __tsc2101_close */
++} /* snd_omap_tsc2101_resume */
+
+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 */
++omap_tsc2101_suspend (struct device *dev, pm_message_t state, u32 level) {
++ // TODO: function
++ return 0;
++} /* omap_tsc2101_suspend */
+
+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,
++omap_tsc2101_resume (struct device *dev, u32 level) {
++ // TODO: function
++ return 0;
++} /* omap_tsc2101_resume */
+
-+// .spcr2 = FREE | FRST | GRST | XRST | XINTM(3) | XEMPTY,
-+// .spcr1 = RINTM(3) | RRST | RFULL,
-+ .spcr2 = FREE | FRST | GRST | XRST | XINTM(3),
-+ .spcr1 = RINTM(3) | RRST,
++#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 */
+
-+ .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),
-+};
++static inline void
++tsc2101_configure (void) {
++ audio_tsc2101_write (TSC2101_CODEC_POWER_CTRL, 0x0000);
+
-+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;
-+ u16 data = 0;
++ /*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);
+
-+ 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;
++ /* Set record source */
++ // TODO:MIXER tsc2101_update (SET_RECSRC, tsc2101_local.recsrc);
+
-+ dprintk ("rate=%u\n", rate_list[i]);
++ /* 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));
+
-+ data=omap_tsc2101_read (TSC2101_AUDIO_CODEC_REGISTERS, TSC2101_AUDIO_CTRL_1);
-+ 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);
++ /* Set codec output volume */
++ audio_tsc2101_write (TSC2101_DAC_GAIN_CTRL, 0x0000);
+
-+ data=omap_tsc2101_read (TSC2101_AUDIO_CODEC_REGISTERS, TSC2101_AUDIO_CTRL_3);
-+ data &= ~(AC3_REFFS | AC3_SLVMS);
-+ data |= (khz) ? AC3_REFFS : 0;
-+ data |= AC3_SLVMS;
-+ omap_tsc2101_write (TSC2101_AUDIO_CODEC_REGISTERS, TSC2101_AUDIO_CTRL_3, data);
++ /* 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);
+
-+ 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));
++ /* OUT8P/N muted, CPOUT muted */
+
-+ } 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));
-+ }
++ audio_tsc2101_write (TSC2101_AUDIO_CTRL_6,
++ AC6_MUTLSPK | AC6_MUTSPK2 | AC6_LDSCPTC |
++ AC6_VGNDSCPTC);
+
-+ tsc2101->samplerate=rate_list[i];
++ /* Headset/Hook switch detect disabled */
++ audio_tsc2101_write (TSC2101_AUDIO_CTRL_7, 0x0000);
+
-+ mcbsp_cfg.srgr1 =
-+ (FWID(AUDIO_BPS_DEFAULT - 1) | CLKGDV(clkgdv));
-+ mcbsp_cfg.srgr2 =
-+ ((GSYNC | CLKSP | FSGM | FPER(AUDIO_BPS_DEFAULT * 2 - 1)));
++ /* Left line input volume control */
++ // TODO:MIXER tsc2101_update (SET_LINE, tsc2101_local.line);
+
-+ omap_mcbsp_config(AUDIO_MCBSP, &mcbsp_cfg);
-+ dprintk ("[%s] pass\n", __FUNCTION__);
-+ return 0;
-+} /* __set_samplerate */
++ /* 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_prepare (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);
-+ audio_stream_t *s = &chip->s[substream->pstr->stream];
++ int stream_id = substream->pstr->stream;
++ int err;
++ ADEBUG();
+
-+ dprintk ("[%s]\n", __FUNCTION__);
-+ __set_samplerate (chip, runtime->rate);
++ 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, &hw_constraints_rates)) < 0)
++ return err;
++ return 0;
++} /* snd_card_omap_tsc2101_open */
+
-+ // set FMT here ????
-+ s->period =0;
-+ s->offset =0;
-+ s->position=0;
-+ dprintk ("[%s] pass\n", __FUNCTION__);
++static int
++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_prepare */
++} /* snd_card_omap_tsc2101_close */
+
-+# 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;
++static int
++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 */
+
-+ dprintk ("[%s]\n", __FUNCTION__);
++static int
++snd_omap_tsc2101_hw_free (snd_pcm_substream_t *substream) {
++ return snd_pcm_lib_free_pages(substream);
++} /* snd_omap_tsc2101_hw_free */
+
-+ 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;
-+ }
++static int
++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;
+
-+ if (!(ch_status & DCSR_END_BLOCK)) {
-+ dprintk ("[%s] y-fail\n", __FUNCTION__);
-+ return;
-+ }
++ /* wait for any frame to complete */
++ udelay(125);
+
-+ if (s->active) {
-+ unsigned int dma_size;
-+ unsigned int offset;
-+ snd_pcm_runtime_t *runtime;
++ /* 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;
++ }
+
-+ snd_pcm_period_elapsed (s->stream);
++ /* Set AC1 */
++ data = audio_tsc2101_read(TSC2101_AUDIO_CTRL_1);
++ /*Clear prev settings */
++ data &= ~(AC1_DACFS(0x07) | AC1_ADCFS(0x07));
++ 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 |= (reg_info[count].fs_44kHz) ? AC3_REFFS : 0;
++#ifdef TSC2101_MASTER
++ data |= AC3_SLVMS;
++#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 {
++ /* 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 */
++ }
+
-+ spin_lock (&s->lock);
-+ runtime=s->stream->runtime;
++ omap_tsc2101->samplerate = rate;
+
-+ dma_size = frames_to_bytes(runtime, runtime->period_size);
-+ offset = dma_size * s->period;
-+ snd_assert(dma_size <= AUDIO_DMA_BUF_SIZE,);
++ /* 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);
+
-+ 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);
++ /* Stereo Mode */
++ initial_config_mcbsp.srgr2 =
++ (CLKSM | FSGM | FPER(DEFAULT_BITPERSAMPLE * 2 - 1));
+#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++;
++ initial_config_mcbsp.srgr1 =
++ (FWID(DEFAULT_BITPERSAMPLE - 1) | CLKGDV(clkgdv));
++ initial_config_mcbsp.srgr2 =
++ ((GSYNC | CLKSP | FSGM | FPER(DEFAULT_BITPERSAMPLE * 2 - 1)));
+
-+ s->offset = offset;
++#endif /* end of #ifdef TSC2101_MASTER */
++ omap_mcbsp_config(AUDIO_MCBSP, &initial_config_mcbsp);
++ return 0;
++} /* omap_tsc2101_set_samplerate */
+
-+ spin_unlock (&s->lock);
-+ }
++static int
++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;
++ struct audio_stream *s = &chip->s[substream->pstr->stream];
+
-+ dprintk ("[%s] pass\n", __FUNCTION__);
-+} /* tsc2101_playback_callback */
++ /* set requested samplerate */
++ omap_tsc2101_set_samplerate (chip, runtime->rate);
+
-+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 */
++ s->period = 0;
++ s->periods = 0;
++ return 0;
++} /* 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
diff --git a/packages/linux/linux-h6300-omap1_2.6.14-rc5.bb b/packages/linux/linux-h6300-omap1_2.6.14.3.bb
index 5053f95c27..3e40f1278a 100644
--- a/packages/linux/linux-h6300-omap1_2.6.14-rc5.bb
+++ b/packages/linux/linux-h6300-omap1_2.6.14.3.bb
@@ -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