# This is a BitKeeper generated diff -Nru style patch.
#
# ChangeSet
#   2004/05/25 22:24:29-07:00 torvalds@ppc970.osdl.org 
#   Remove bogus test preprocessor test.
#   
#   PAGE_SIZE isn't even always defined at this point,
#   which makes us test undefined preprocessor symbols.
#   
#   It so happens that the test works in that case,
#   but since the test is a bit pointless in the first
#   place...
# 
# include/asm-ppc64/thread_info.h
#   2004/05/25 22:24:23-07:00 torvalds@ppc970.osdl.org +0 -4
#   Remove bogus test preprocessor test.
#   
#   PAGE_SIZE isn't even always defined at this point,
#   which makes us test undefined preprocessor symbols.
#   
#   It so happens that the test works in that case,
#   but since the test is a bit pointless in the first
#   place...
# 
# ChangeSet
#   2004/05/25 22:22:33-07:00 torvalds@ppc970.osdl.org 
#   Make constant types explicit, rather than depend on
#   some rather subtle C type expansion rules.
#   
#   This makes sparse happier.
# 
# include/linux/idr.h
#   2004/05/25 22:22:27-07:00 torvalds@ppc970.osdl.org +2 -2
#   Make constant types explicit, rather than depend on
#   some rather subtle C type expansion rules.
# 
# include/asm-ppc64/page.h
#   2004/05/25 22:22:27-07:00 torvalds@ppc970.osdl.org +12 -10
#   Make constant types explicit, rather than depend on
#   some rather subtle C type expansion rules.
# 
# include/asm-ppc64/mmu_context.h
#   2004/05/25 22:22:27-07:00 torvalds@ppc970.osdl.org +2 -2
#   Make constant types explicit, rather than depend on
#   some rather subtle C type expansion rules.
# 
# include/asm-ppc64/mmu.h
#   2004/05/25 22:22:27-07:00 torvalds@ppc970.osdl.org +1 -1
#   Make constant types explicit, rather than depend on
#   some rather subtle C type expansion rules.
# 
# ChangeSet
#   2004/05/25 22:21:34-07:00 torvalds@ppc970.osdl.org 
#   Don't return void types from void functions.
#   
#   This helps reduce sparse noise.
# 
# include/asm-ppc64/eeh.h
#   2004/05/25 22:21:29-07:00 torvalds@ppc970.osdl.org +3 -3
#   Don't return void types from void functions.
# 
# drivers/net/tokenring/olympic.c
#   2004/05/25 22:21:29-07:00 torvalds@ppc970.osdl.org +1 -1
#   Don't return void types from void functions.
# 
# ChangeSet
#   2004/05/25 13:09:27-07:00 sxking@qwest.net 
#   [IPSEC]: Fix buglet in AF_KEY spddelete
#   
#   When trying to spddelete individual entries using setkey, spddelete always 
#   fails.  The culprit is in net/af_key.c; spdadd sets the family field of the 
#   selector when creating an entry, but spddelete doesn't when building a 
#   selector to match for xfrm_policy_bysel.  Trivial fix is to have spddelete 
#   set the family field in the selector in same way spdadd does.
# 
# net/key/af_key.c
#   2004/05/25 13:09:13-07:00 sxking@qwest.net +1 -1
#   [IPSEC]: Fix buglet in AF_KEY spddelete
#   
#   When trying to spddelete individual entries using setkey, spddelete always 
#   fails.  The culprit is in net/af_key.c; spdadd sets the family field of the 
#   selector when creating an entry, but spddelete doesn't when building a 
#   selector to match for xfrm_policy_bysel.  Trivial fix is to have spddelete 
#   set the family field in the selector in same way spdadd does.
# 
# ChangeSet
#   2004/05/25 13:06:21-07:00 davem@nuts.davemloft.net 
#   [TG3]: Update driver version and reldate.
# 
# drivers/net/tg3.c
#   2004/05/25 13:06:06-07:00 davem@nuts.davemloft.net +2 -2
#   [TG3]: Update driver version and reldate.
# 
# ChangeSet
#   2004/05/25 13:04:59-07:00 torvalds@ppc970.osdl.org 
#   Introduce architecture-specific "ptep_update_dirty_accessed()"
#   helper function to write-back the dirty and accessed bits from
#   ptep_establish().
#   
#   Right now this defaults to the same old "set_pte()" that we've
#   always done, except for x86 where we now fix the (unlikely)
#   race in updating accessed bits and dropping a concurrent dirty
#   bit.
# 
# include/asm-i386/pgtable.h
#   2004/05/25 13:04:54-07:00 torvalds@ppc970.osdl.org +10 -0
#   Introduce architecture-specific "ptep_update_dirty_accessed()"
#   helper function to write-back the dirty and accessed bits from
#   ptep_establish().
#   
#   Right now this defaults to the same old "set_pte()" that we've
#   always done, except for x86 where we now fix the (unlikely)
#   race in updating accessed bits and dropping a concurrent dirty
#   bit.
# 
# include/asm-generic/pgtable.h
#   2004/05/25 13:04:54-07:00 torvalds@ppc970.osdl.org +6 -1
#   Introduce architecture-specific "ptep_update_dirty_accessed()"
#   helper function to write-back the dirty and accessed bits from
#   ptep_establish().
#   
#   Right now this defaults to the same old "set_pte()" that we've
#   always done, except for x86 where we now fix the (unlikely)
#   race in updating accessed bits and dropping a concurrent dirty
#   bit.
# 
# ChangeSet
#   2004/05/25 13:04:23-07:00 akepner@sgi.com 
#   [TG3]: Make sure RX/TX flow control settings actually get set.
# 
# drivers/net/tg3.c
#   2004/05/25 13:04:09-07:00 akepner@sgi.com +10 -0
#   [TG3]: Make sure RX/TX flow control settings actually get set.
# 
# ChangeSet
#   2004/05/25 12:37:15-07:00 torvalds@ppc970.osdl.org 
#   Pass in a "dirty" argument to ptep_establish in 
#   preparation for pte update race fix.
#   
#   This does not actually use the information yet, but
#   the next few patches will start to put it to some
#   good use.
# 
# mm/memory.c
#   2004/05/25 12:37:09-07:00 torvalds@ppc970.osdl.org +3 -3
#   Pass in a "dirty" argument to ptep_establish in 
#   preparation for pte update race fix.
#   
#   This does not actually use the information yet, but
#   the next few patches will start to put it to some
#   good use.
# 
# include/asm-s390/pgtable.h
#   2004/05/25 12:37:09-07:00 torvalds@ppc970.osdl.org +2 -1
#   Pass in a "dirty" argument to ptep_establish in 
#   preparation for pte update race fix.
#   
#   This does not actually use the information yet, but
#   the next few patches will start to put it to some
#   good use.
# 
# include/asm-generic/pgtable.h
#   2004/05/25 12:37:09-07:00 torvalds@ppc970.osdl.org +1 -1
#   Pass in a "dirty" argument to ptep_establish in 
#   preparation for pte update race fix.
#   
#   This does not actually use the information yet, but
#   the next few patches will start to put it to some
#   good use.
# 
# ChangeSet
#   2004/05/25 11:11:46-07:00 ak@muc.de 
#   [PATCH] Fix nodemask clearing bug in NUMA API
#   
#   Fix over long nodemask clearing in get_mem_policy() by using the
#   right size for the node mask.
# 
# mm/mempolicy.c
#   2004/05/25 10:59:34-07:00 ak@muc.de +5 -6
#   Fix nodemask clearing bug in NUMA API
# 
# ChangeSet
#   2004/05/25 11:04:01-07:00 linux-kernel@vortech.net 
#   [VLAN]: Use KERN_INFO for VLAN_INF.
# 
# net/8021q/vlan.h
#   2004/05/25 11:03:48-07:00 linux-kernel@vortech.net +1 -1
#   [VLAN]: Use KERN_INFO for VLAN_INF.
# 
# ChangeSet
#   2004/05/25 11:02:48-07:00 herbert@gondor.apana.org.au 
#   [IPSEC]: Use add_timer() in xfrm_state_find.
# 
# net/xfrm/xfrm_state.c
#   2004/05/25 11:02:35-07:00 herbert@gondor.apana.org.au +2 -1
#   [IPSEC]: Use add_timer() in xfrm_state_find.
# 
# ChangeSet
#   2004/05/25 11:02:07-07:00 herbert@gondor.apana.org.au 
#   [IPSEC]: Fix outdated comment in __xfrm_state_delete.
# 
# net/xfrm/xfrm_state.c
#   2004/05/25 11:01:54-07:00 herbert@gondor.apana.org.au +3 -7
#   [IPSEC]: Fix outdated comment in __xfrm_state_delete.
# 
# ChangeSet
#   2004/05/25 11:01:22-07:00 herbert@gondor.apana.org.au 
#   [IPSEC]: Do not leak entries in xfrm_state_find.
#   
#   In xfrm_state_find, the larval state never actually matures with
#   Openswan so it only ever gets deleted by the timer which means
#   that the time crash can't happen :)  It becomes a (possible) memory
#   leak instead.
# 
# net/xfrm/xfrm_state.c
#   2004/05/25 11:01:09-07:00 herbert@gondor.apana.org.au +6 -10
#   [IPSEC]: Do not leak entries in xfrm_state_find.
#   
#   In xfrm_state_find, the larval state never actually matures with
#   Openswan so it only ever gets deleted by the timer which means
#   that the time crash can't happen :)  It becomes a (possible) memory
#   leak instead.
# 
# ChangeSet
#   2004/05/25 10:58:43-07:00 shemminger@osdl.org 
#   [BRIDGE]: Update bridge.txt
#   
#   Trent Jarvi <taj@www.linux.org.uk> noticed this.  The file was out of date
#   with current web site and maintainer.  Please apply to 2.4 and 2.6.
#   
#   Signed-off-by: Stephen Hemminger <shemminger@osdl.org>
# 
# Documentation/networking/bridge.txt
#   2004/05/25 10:58:30-07:00 shemminger@osdl.org +6 -9
#   [BRIDGE]: Update bridge.txt
#   
#   Trent Jarvi <taj@www.linux.org.uk> noticed this.  The file was out of date
#   with current web site and maintainer.  Please apply to 2.4 and 2.6.
#   
#   Signed-off-by: Stephen Hemminger <shemminger@osdl.org>
# 
# ChangeSet
#   2004/05/25 10:27:46-07:00 paulus@samba.org 
#   [PATCH] IRQ stacks for PPC64
#   
#   Even with a 16kB stack, we have been seeing stack overflows on PPC64
#   under stress.  This patch implements separate per-cpu stacks for
#   processing interrupts and softirqs, along the lines of the
#   CONFIG_4KSTACKS stuff on x86.  At the moment the stacks are still 16kB
#   but I hope we can reduce that to 8kB in future.  (Gcc is capable of
#   adding instructions to the function prolog to check the stack pointer
#   whenever it moves it downwards, and I want to use that when I try
#   using 8kB stacks so I can be confident that we aren't overflowing the
#   stack.)
#   
#   Signed-off-by: Paul Mackerras <paulus@samba.org>
# 
# include/asm-ppc64/irq.h
#   2004/05/25 00:31:51-07:00 paulus@samba.org +21 -1
#   IRQ stacks for PPC64
# 
# include/asm-ppc64/bitops.h
#   2004/05/25 00:31:51-07:00 paulus@samba.org +14 -0
#   IRQ stacks for PPC64
# 
# arch/ppc64/kernel/setup.c
#   2004/05/25 00:51:56-07:00 paulus@samba.org +19 -0
#   IRQ stacks for PPC64
# 
# arch/ppc64/kernel/process.c
#   2004/05/25 01:10:19-07:00 paulus@samba.org +12 -0
#   IRQ stacks for PPC64
# 
# arch/ppc64/kernel/misc.S
#   2004/05/25 00:31:51-07:00 paulus@samba.org +24 -0
#   IRQ stacks for PPC64
# 
# arch/ppc64/kernel/irq.c
#   2004/05/25 00:49:37-07:00 paulus@samba.org +69 -4
#   IRQ stacks for PPC64
# 
# arch/ppc64/Kconfig
#   2004/05/25 00:31:51-07:00 paulus@samba.org +7 -0
#   IRQ stacks for PPC64
# 
# ChangeSet
#   2004/05/25 10:06:18-07:00 mingo@elte.hu 
#   [PATCH] x86-bigsmp: use fixed interrupt delivery
#   
#   This patch, from Venkatesh Pallipadi, changes x86 IO-APICs to use fixed
#   interrupt delivery instead of lowest priority to support larger number
#   of CPUs.  Only bigsmp is affected by this cleanup. 
#   
#   From: Venkatesh Pallipadi <venkatesh.pallipadi@intel.com>
#   Signed-off-by: Ingo Molnar <mingo@elte.hu>
# 
# include/asm-i386/mach-bigsmp/mach_apic.h
#   2004/05/24 17:00:00-07:00 mingo@elte.hu +11 -25
#   x86-bigsmp: use fixed interrupt delivery
# 
# include/asm-i386/hw_irq.h
#   2004/05/24 17:00:00-07:00 mingo@elte.hu +1 -1
#   x86-bigsmp: use fixed interrupt delivery
# 
# arch/i386/kernel/smpboot.c
#   2004/05/24 17:00:00-07:00 mingo@elte.hu +1 -2
#   x86-bigsmp: use fixed interrupt delivery
# 
# arch/i386/kernel/io_apic.c
#   2004/05/24 17:00:00-07:00 mingo@elte.hu +2 -2
#   x86-bigsmp: use fixed interrupt delivery
# 
# ChangeSet
#   2004/05/25 08:45:46-07:00 akpm@osdl.org 
#   [PATCH] missing compat ioctl mapping for DM_REMOVE_ALL
#   
#   Signed-off-by: Marcus Meissner <meissner@suse.de>
#   
#   Added missing DM_REMOVE_ALL call.
# 
# include/linux/compat_ioctl.h
#   2004/05/25 03:39:34-07:00 akpm@osdl.org +1 -0
#   missing compat ioctl mapping for DM_REMOVE_ALL
# 
# ChangeSet
#   2004/05/25 08:45:35-07:00 akpm@osdl.org 
#   [PATCH] sched_yield() microoptimisation
#   
#   Signed-off-by: Ingo Molnar <mingo@elte.hu>
#   
#   We can avoid the local_irq_enable() in sched_yield() because schedule()
#   unconditionally enables interrupts anyway.
# 
# kernel/sched.c
#   2004/05/25 02:53:10-07:00 akpm@osdl.org +1 -2
#   sched_yield() microoptimisation
# 
# ChangeSet
#   2004/05/25 08:45:24-07:00 akpm@osdl.org 
#   [PATCH] sched.h comment typo fix
#   
#   Signed-off-by: Christian Meder <chris@onestepahead.de>
#   Signed-off-by: Ingo Molnar <mingo@elte.hu>
#   
#   sched.h typo fix from Christian Meder.
# 
# include/linux/sched.h
#   2004/05/25 02:53:10-07:00 akpm@osdl.org +1 -1
#   sched.h comment typo fix
# 
# ChangeSet
#   2004/05/25 08:45:13-07:00 akpm@osdl.org 
#   [PATCH] Subject: Re: Help understanding slow down
#   
#   Signed-off-by: Ingo Molnar <mingo@elte.hu>
#   
#   Add a warning that "idle=poll" is a performance hit on hyperthreaded CPUs.
# 
# arch/i386/kernel/process.c
#   2004/05/25 02:53:10-07:00 akpm@osdl.org +4 -0
#   Subject: Re: Help understanding slow down
# 
# ChangeSet
#   2004/05/25 08:45:03-07:00 akpm@osdl.org 
#   [PATCH] No interpretation of HD spindown timeout in laptop mode ACPI binding script.
#   
#   From: Bart Samwel <bart@samwel.tk>
#   
#   Currently the ACPI binding script in the Laptop Mode doc always says "20
#   seconds" and "2 hours" for the timeouts it uses.  This is incorrect if the
#   user changed the config values, so we print something more general.
# 
# Documentation/laptop-mode.txt
#   2004/05/25 02:53:09-07:00 akpm@osdl.org +2 -2
#   No interpretation of HD spindown timeout in laptop mode ACPI binding script.
# 
# ChangeSet
#   2004/05/25 08:44:52-07:00 akpm@osdl.org 
#   [PATCH] rmap build fix
#   
#   From: William Lee Irwin III <wli@holomorphy.com>
#   
#   PMD_SIZE is not a compile-time constant on sparc.  Use min() in there so
#   that the cluster size will be evaluated at runtime if the architecture
#   insists on doing that.
# 
# mm/rmap.c
#   2004/05/25 02:53:09-07:00 akpm@osdl.org +1 -5
#   rmap build fix
# 
# ChangeSet
#   2004/05/25 08:44:41-07:00 akpm@osdl.org 
#   [PATCH] ir-kbd-gpio.c build fix
#   
#   It's initialising slot 24 in two places.  Gerd Knorr <kraxel@bytesex.org> says
#   "This one should be 23.".
# 
# drivers/media/video/ir-kbd-gpio.c
#   2004/05/25 02:53:09-07:00 akpm@osdl.org +1 -1
#   ir-kbd-gpio.c build fix
# 
# ChangeSet
#   2004/05/25 08:44:29-07:00 akpm@osdl.org 
#   [PATCH] Revert bogus x86-64 change
#   
#   From: Andi Kleen <ak@muc.de>
#   
#   The 32bit generic nops added with a previous patch to x86-64 alternative()
#   are not completely 64bit clean.  This caused crashes in some cases.  This
#   patch reverts this broken change.
# 
# include/asm-x86_64/processor.h
#   2004/05/25 02:53:09-07:00 akpm@osdl.org +0 -20
#   Revert bogus x86-64 change
# 
# ChangeSet
#   2004/05/25 08:44:14-07:00 akpm@osdl.org 
#   [PATCH] isapnp sb16 virtual pc
#   
#   From: David Sanders <linux@sandersweb.net>
#   
#   Patch adds support for the emulated Soundblaster 16 in Virtual PC 2004.
# 
# sound/oss/sb_card.h
#   2004/05/25 02:53:09-07:00 akpm@osdl.org +2 -0
#   isapnp sb16 virtual pc
# 
# sound/oss/sb_card.c
#   2004/05/25 02:53:09-07:00 akpm@osdl.org +7 -0
#   isapnp sb16 virtual pc
# 
# sound/isa/sb/sb16.c
#   2004/05/25 02:53:09-07:00 akpm@osdl.org +2 -0
#   isapnp sb16 virtual pc
# 
# ChangeSet
#   2004/05/25 08:44:01-07:00 akpm@osdl.org 
#   [PATCH] ext2: fix build with DEBUG=y
#   
#   From: FabF <fabian.frederick@skynet.be>
# 
# fs/ext2/ialloc.c
#   2004/05/25 02:53:09-07:00 akpm@osdl.org +2 -2
#   ext2: fix build with DEBUG=y
# 
# ChangeSet
#   2004/05/25 08:43:49-07:00 akpm@osdl.org 
#   [PATCH] minor sched.c cleanup
#   
#   Signed-off-by: Christian Meder <chris@onestepahead.de>
#   Signed-off-by: Ingo Molnar <mingo@elte.hu>
#   
#   The following obviously correct patch from Christian Meder simplifies the
#   DELTA() define.
# 
# kernel/sched.c
#   2004/05/25 02:58:45-07:00 akpm@osdl.org +1 -2
#   minor sched.c cleanup
# 
# ChangeSet
#   2004/05/25 08:43:39-07:00 akpm@osdl.org 
#   [PATCH] Really enable NUMA API on x86-64
#   
#   From: Andi Kleen <ak@muc.de>
#   
#   Really enable the NUMA API system calls on x86-64.
# 
# include/asm-x86_64/unistd.h
#   2004/05/25 02:53:08-07:00 akpm@osdl.org +3 -3
#   Really enable NUMA API on x86-64
# 
# ChangeSet
#   2004/05/25 08:43:28-07:00 akpm@osdl.org 
#   [PATCH] remap_file_pages: fix syscall declaration
#   
#   Signed-off-by: Hugh Dickins <hugh@veritas.com>
#   
#   sys_remap_file_pages is declared as asmlinkage in mm/fremap.c, but is the one
#   syscall declared without asmlinkage in include/linux/syscalls.h.
# 
# include/linux/syscalls.h
#   2004/05/25 02:53:08-07:00 akpm@osdl.org +1 -1
#   remap_file_pages: fix syscall declaration
# 
# ChangeSet
#   2004/05/25 08:43:17-07:00 akpm@osdl.org 
#   [PATCH] remap_file_pages: implement MAP_POPULATE for all protections
#   
#   Signed-off-by: Hugh Dickins <hugh@veritas.com>
#   
#   It seems eccentric to implement MAP_POPULATE only on PROT_NONE mappings:
#   do_mmap_pgoff is passing down prot, then sys_remap_file_pages verifies it's
#   not set.  I guess that's an oversight from when we realized that the prot arg
#   to sys_remap_file_pages was misdesigned.
#   
#   There's another oddity whose heritage is harder for me to understand, so
#   please let me leave it to you: sys_remap_file_pages is declared as asmlinkage
#   in mm/fremap.c, but is the one syscall declared without asmlinkage in
#   include/linux/syscalls.h.
# 
# mm/mmap.c
#   2004/05/25 02:53:08-07:00 akpm@osdl.org +1 -1
#   remap_file_pages: implement MAP_POPULATE for all protections
# 
# ChangeSet
#   2004/05/25 08:43:06-07:00 akpm@osdl.org 
#   [PATCH] Fix for lockup in reiserfs acl/xattrs
#   
#   From: Jeff Mahoney <jeffm@suse.com>
#   
#   The following is a patch to fix a locking problem in ACL/xattr code. It
#   manifests when a user attempts to set an xattr on a file which they do
#   not own, and on which an ACL is applied.
#   
#   What happens is this:
#   reiserfs_setxattr [write lock inode xattr sem]
#     ->xattr_set
#       -> lookup
#          -> __reiserfs_permission [if conditions above are met, and need_lock=
#    is
#             unset, read lock inode xattr sem] *lockup*
#   
#   Since we already keep track of when to lock during permission calls, the
#   fix is simple: just make the locking conditional as it was before.
#   
#   Credits to Andreas Gruenbacher <agruen@suse.de>
# 
# fs/reiserfs/xattr.c
#   2004/05/25 02:53:08-07:00 akpm@osdl.org +6 -4
#   Fix for lockup in reiserfs acl/xattrs
# 
# ChangeSet
#   2004/05/25 08:42:56-07:00 akpm@osdl.org 
#   [PATCH] UDF: directory reading fix
#   
#   From: Ben Fennema <bfennema@falcon.csc.calpoly.edu>
#   
#   The problem occured when files were stored on the disc in 16-bit per
#   character mode when all the upper bits were 0.  The fs module
#   converted the file name given by the user to a 8-bit per character
#   string to compare, so the comparison always failed.
#   
#   The patch maps the file from disc into the current locale and then
#   compares it directly to the file name given by the user.
# 
# fs/udf/namei.c
#   2004/05/25 02:53:08-07:00 akpm@osdl.org +11 -9
#   UDF: directory reading fix
# 
# ChangeSet
#   2004/05/25 08:42:45-07:00 akpm@osdl.org 
#   [PATCH] bk-kernel-howto reversion
#   
#   From: Rusty Russell <rusty@rustcorp.com.au>
#   
#   This one snuck through - Jeff prefers the bk:// addresses.
# 
# Documentation/BK-usage/gcapatch
#   2004/05/25 02:53:08-07:00 akpm@osdl.org +1 -1
#   bk-kernel-howto reversion
# 
# Documentation/BK-usage/bk-kernel-howto.txt
#   2004/05/25 02:53:08-07:00 akpm@osdl.org +1 -1
#   bk-kernel-howto reversion
# 
# ChangeSet
#   2004/05/25 08:42:34-07:00 akpm@osdl.org 
#   [PATCH] CREDITS is unmaintained
#   
#   From: Adrian Bunk <bunk@fs.tum.de>
#   
#   This information seems to be quite outdated.
# 
# MAINTAINERS
#   2004/05/25 02:53:08-07:00 akpm@osdl.org +0 -5
#   CREDITS is unmaintained
# 
# ChangeSet
#   2004/05/25 08:42:23-07:00 akpm@osdl.org 
#   [PATCH] H8/300 ne driver module fix
#   
#   From: Yoshinori Sato <ysato@users.sourceforge.jp>
#   
#   - module support fix
# 
# drivers/net/ne-h8300.c
#   2004/05/25 02:53:07-07:00 akpm@osdl.org +22 -13
#   H8/300 ne driver module fix
# 
# drivers/net/Kconfig
#   2004/05/25 02:53:07-07:00 akpm@osdl.org +1 -1
#   H8/300 ne driver module fix
# 
# drivers/net/8390.h
#   2004/05/25 02:53:07-07:00 akpm@osdl.org +1 -1
#   H8/300 ne driver module fix
# 
# ChangeSet
#   2004/05/25 08:42:12-07:00 akpm@osdl.org 
#   [PATCH] H8/300 module fix
#   
#   From: Yoshinori Sato <ysato@users.sourceforge.jp>
#   
#   - fix relocation
#   - define SYMBOL_PREFIX
# 
# scripts/mk_elfconfig.c
#   2004/05/25 02:53:07-07:00 akpm@osdl.org +1 -1
#   H8/300 module fix
# 
# include/asm-h8300/module.h
#   2004/05/25 02:53:07-07:00 akpm@osdl.org +2 -0
#   H8/300 module fix
# 
# arch/h8300/kernel/module.c
#   2004/05/25 02:53:07-07:00 akpm@osdl.org +5 -5
#   H8/300 module fix
# 
# arch/h8300/kernel/h8300_ksyms.c
#   2004/05/25 02:53:07-07:00 akpm@osdl.org +2 -0
#   H8/300 module fix
# 
# ChangeSet
#   2004/05/25 08:42:00-07:00 akpm@osdl.org 
#   [PATCH] Fix various memory leaks
#   
#   From: Yury Umanets <torque@ukrpost.net>
#   
#   Thanks to smatch I have found few memory leaks and other related issues.
# 
# net/irda/ircomm/ircomm_tty.c
#   2004/05/25 02:53:07-07:00 akpm@osdl.org +5 -1
#   Fix various memory leaks
# 
# drivers/video/aty/atyfb_base.c
#   2004/05/25 02:53:07-07:00 akpm@osdl.org +24 -13
#   Fix various memory leaks
# 
# drivers/usb/misc/emi62.c
#   2004/05/25 02:53:07-07:00 akpm@osdl.org +2 -0
#   Fix various memory leaks
# 
# drivers/usb/misc/emi26.c
#   2004/05/25 02:53:07-07:00 akpm@osdl.org +1 -1
#   Fix various memory leaks
# 
# drivers/usb/input/hiddev.c
#   2004/05/25 02:53:07-07:00 akpm@osdl.org +1 -1
#   Fix various memory leaks
# 
# ChangeSet
#   2004/05/25 08:41:49-07:00 akpm@osdl.org 
#   [PATCH] v4l: use saa7111 i2c module in V4L MXB driver
#   
#   From: Michael Hunold <hunold@convergence.de>
#   
#   The attached patch changes my "Multimedia eXtension Board" (MXB)
#   Video4Linux-driver to use the standard saa7111 video decoder infrastructure
#   (to which I recently submitted changes through Ronald Bultje) instead of
#   some home-brewn direct-access stuff.
#   
#   Nothing serious, but it removes code duplication and makes the code use the
#   video decoder api.
# 
# drivers/media/video/mxb.c
#   2004/05/25 02:53:07-07:00 akpm@osdl.org +69 -134
#   v4l: use saa7111 i2c module in V4L MXB driver
# 
# ChangeSet
#   2004/05/25 08:41:40-07:00 akpm@osdl.org 
#   [PATCH] initramfs uncpio fix
#   
#   From: <viro@parcelfarce.linux.theplanet.co.uk>
#   
#   init/initramfs.c::do_skip() has an off-by-one that leads to unpacking
#   failures for some gzipped cpio images.  We have
#   
#   static int __init do_skip(void)
#   {
#           if (this_header + count <= next_header) {
#                   eat(count);
#                   return 1;
#           } else {
#                   eat(next_header - this_header);
#                   state = next_state;
#                   return 0;
#           }
#   }
#   
#   and that <= should actually be <.  It almost never matters, since if we hit
#   the boundary case (header ending exactly on the gunzip window end) the
#   current variant will simply end up doing extra call of do_skip() when we
#   get to the next window and that will finish the work (assign state).  The
#   only exception is when we hit that in the last window.  That is, if there's
#   nothing after the final header (trailer).  Then we miss the final state
#   transition (Skip -> Reset) and get "junk in archive" panic.  Normally
#   cpio(1) pads the image to multiple of 512, so we actually have a bunch of
#   zeroes after the trailer.  And that almost always saves our butts - trailer
#   is followed by zeroes, so we get to Reset state just fine.
#   
#   So we never see that on small in-kernel image (it's less than 512 bytes, so
#   it gets a lot of padding) and we almost never see that on external ones
#   (1:127 odds of hitting the bug).
# 
# init/initramfs.c
#   2004/05/25 02:53:07-07:00 akpm@osdl.org +1 -1
#   initramfs uncpio fix
# 
# ChangeSet
#   2004/05/25 08:41:29-07:00 akpm@osdl.org 
#   [PATCH] FAT: small fixes
#   
#   From: OGAWA Hirofumi <hirofumi@mail.parknet.co.jp>
#   
#   - use fat_fs_panic() instead of BUG() if it read a corrupted inode.
#   
#   - add missing "\n".
# 
# fs/fat/inode.c
#   2004/05/25 02:53:07-07:00 akpm@osdl.org +1 -1
#   FAT: small fixes
# 
# fs/fat/file.c
#   2004/05/25 02:53:07-07:00 akpm@osdl.org +2 -1
#   FAT: small fixes
# 
# ChangeSet
#   2004/05/25 08:41:18-07:00 akpm@osdl.org 
#   [PATCH] swsusp: fix swsusp with intel-agp
#   
#   From: Pavel Machek <pavel@suse.cz>
#   
#   swsusp contained rather nasty bug where it killed machine when intel-agp or
#   anything else split kernel 4MB mapping.  Herbert Xu diagnosed this.  Fixed by
#   switching to "known good" mapping for during suspend/resume.
# 
# arch/i386/power/swsusp.S
#   2004/05/25 02:53:07-07:00 akpm@osdl.org +1 -1
#   swsusp: fix swsusp with intel-agp
# 
# arch/i386/power/pmdisk.S
#   2004/05/25 02:53:07-07:00 akpm@osdl.org +1 -1
#   swsusp: fix swsusp with intel-agp
# 
# arch/i386/mm/init.c
#   2004/05/25 02:53:07-07:00 akpm@osdl.org +21 -0
#   swsusp: fix swsusp with intel-agp
# 
# ChangeSet
#   2004/05/25 08:41:07-07:00 akpm@osdl.org 
#   [PATCH] Don't use "cut" in laptop mode control script -- it is in /usr.
#   
#   From: Bart Samwel <bart@samwel.tk>
#   
#   We don't want to use "cut" in the laptop mode control script, because that
#   is in /usr.  This patch is from Jasper Spaans.
# 
# Documentation/laptop-mode.txt
#   2004/05/25 02:58:45-07:00 akpm@osdl.org +7 -1
#   Don't use "cut" in laptop mode control script -- it is in /usr.
# 
# ChangeSet
#   2004/05/25 08:40:54-07:00 akpm@osdl.org 
#   [PATCH] matroxfb: Add support for mapping CRTC<->outputs at boot time
#   
#   Signed-off-by: Petr Vandrovec <vandrove@vc.cvut.cz>
#   
#   Some people expressed interest in having possibility to set CRTC <->
#   outputs mapping at boot time, without having to use 'matroxset' later after
#   kernel boots.
#   
#   This patch adds option 'video=matroxfb:outputs:XYZ', where X sets which
#   CRTC will connect to primary output, Y sets secondary output and Z sets DVI
#   output.
#   
#   In addition to that I also added missing memset() into maven, which was
#   broken since i2c was kobjectified.
# 
# drivers/video/matrox/matroxfb_maven.c
#   2004/05/25 02:53:06-07:00 akpm@osdl.org +2 -1
#   matroxfb: Add support for mapping CRTC<->outputs at boot time
# 
# drivers/video/matrox/matroxfb_g450.c
#   2004/05/25 02:53:06-07:00 akpm@osdl.org +2 -2
#   matroxfb: Add support for mapping CRTC<->outputs at boot time
# 
# drivers/video/matrox/matroxfb_crtc2.c
#   2004/05/25 02:53:06-07:00 akpm@osdl.org +0 -9
#   matroxfb: Add support for mapping CRTC<->outputs at boot time
# 
# drivers/video/matrox/matroxfb_base.h
#   2004/05/25 02:53:06-07:00 akpm@osdl.org +1 -0
#   matroxfb: Add support for mapping CRTC<->outputs at boot time
# 
# drivers/video/matrox/matroxfb_base.c
#   2004/05/25 02:53:06-07:00 akpm@osdl.org +54 -8
#   matroxfb: Add support for mapping CRTC<->outputs at boot time
# 
# drivers/video/matrox/matroxfb_Ti3026.c
#   2004/05/25 02:53:06-07:00 akpm@osdl.org +1 -1
#   matroxfb: Add support for mapping CRTC<->outputs at boot time
# 
# drivers/video/matrox/matroxfb_DAC1064.c
#   2004/05/25 02:53:06-07:00 akpm@osdl.org +2 -2
#   matroxfb: Add support for mapping CRTC<->outputs at boot time
# 
# ChangeSet
#   2004/05/25 08:40:43-07:00 akpm@osdl.org 
#   [PATCH] ext3: remove duplicated ext3_std_error() call
#   
#   From: Andi Kleen <ak@muc.de>
#   
#   When start_transaction() detects an error it already calls ext3_std_error. 
#   No need to do it again in the caller.
# 
# fs/ext3/inode.c
#   2004/05/25 02:53:06-07:00 akpm@osdl.org +0 -2
#   ext3: remove duplicated ext3_std_error() call
# 
# ChangeSet
#   2004/05/25 08:40:34-07:00 akpm@osdl.org 
#   [PATCH] make i386 dma-mapping.h includeable standalone
#   
#   From: Christoph Hellwig <hch@lst.de>
#   
#   From: Debian kernel package, author probably Herbert Xu
#   
#   Include asm/io.h and asm/scatterlist.h in include/asm-i386/dma-mapping.h to
#   make it useable standalone, which is already true for most architectures.
# 
# include/asm-i386/dma-mapping.h
#   2004/05/25 02:53:06-07:00 akpm@osdl.org +2 -0
#   make i386 dma-mapping.h includeable standalone
# 
# ChangeSet
#   2004/05/25 08:40:22-07:00 akpm@osdl.org 
#   [PATCH] befs: typo fix
#   
#   From: "Sergey S. Kostyliov" <rathamahata@php4.ru>
#   
#   Fix a typo in an error message.
# 
# fs/befs/linuxvfs.c
#   2004/05/25 02:53:06-07:00 akpm@osdl.org +1 -1
#   befs: typo fix
# 
# ChangeSet
#   2004/05/25 08:40:12-07:00 akpm@osdl.org 
#   [PATCH] include linux/selection.h for color_table in drivers/video/tgafb.c
#   
#   From: Christoph Hellwig <hch@lst.de>
#   
#   From: Debian kernel package, author probably Herbert Xu
# 
# drivers/video/tgafb.c
#   2004/05/25 02:53:06-07:00 akpm@osdl.org +1 -0
#   include linux/selection.h for color_table in drivers/video/tgafb.c
# 
# ChangeSet
#   2004/05/25 08:40:01-07:00 akpm@osdl.org 
#   [PATCH] include linux/root_dev.h for ROOT_DEV in drivers/mtd/maps/uclinux.c
#   
#   From: Christoph Hellwig <hch@lst.de>
#   
#   * Include linux/root_dev.h for ROOT_DEV in drivers/mtd/maps/uclinux.c
# 
# drivers/mtd/maps/uclinux.c
#   2004/05/25 02:53:06-07:00 akpm@osdl.org +1 -0
#   include linux/root_dev.h for ROOT_DEV in drivers/mtd/maps/uclinux.c
# 
# ChangeSet
#   2004/05/25 08:39:49-07:00 akpm@osdl.org 
#   [PATCH] missing init.h in drivers/mtd/chips/sharp.c
#   
#   From: Christoph Hellwig <hch@lst.de>
#   
#   again needed by most non-x86 arches.
#   
#    * Include linux/init.h for __init
# 
# drivers/mtd/chips/sharp.c
#   2004/05/25 02:53:05-07:00 akpm@osdl.org +1 -0
#   missing init.h in drivers/mtd/chips/sharp.c
# 
# ChangeSet
#   2004/05/25 08:39:38-07:00 akpm@osdl.org 
#   [PATCH] add one more neomagic audio device id
#   
#   From: Christoph Hellwig <hch@lst.de>
#   
#   From: Mattia Monga via Debian kernel package
#   
#   Add support for nm256xl+ in sound/oss/nm256_audio.c
# 
# sound/pci/nm256/nm256.c
#   2004/05/25 02:53:05-07:00 akpm@osdl.org +7 -0
#   add one more neomagic audio device id
# 
# sound/oss/nm256_audio.c
#   2004/05/25 02:53:05-07:00 akpm@osdl.org +5 -0
#   add one more neomagic audio device id
# 
# ChangeSet
#   2004/05/25 08:39:28-07:00 akpm@osdl.org 
#   [PATCH] remove a dead variable from isofs
#   
#   From: Christoph Hellwig <hch@lst.de>
#   
#   From: Debian kernel package, author is probably Herbert Xu
#   
#    * Do not get seqno since we will not use it in fs/isofs/inode.c
# 
# fs/isofs/inode.c
#   2004/05/25 02:53:05-07:00 akpm@osdl.org +1 -4
#   remove a dead variable from isofs
# 
# ChangeSet
#   2004/05/25 08:39:18-07:00 akpm@osdl.org 
#   [PATCH] fix a bash-ism in toplevel Makefile
#   
#   From: Christoph Hellwig <hch@lst.de>
#   
#   From: Debian kernel package, author probably Herbert Xu.
#   
#    * Fixed bashism in Makefile
# 
# Makefile
#   2004/05/25 02:53:05-07:00 akpm@osdl.org +1 -1
#   fix a bash-ism in toplevel Makefile
# 
# ChangeSet
#   2004/05/25 08:39:07-07:00 akpm@osdl.org 
#   [PATCH] befs: nls fix
#   
#   From: "Sergey S. Kostyliov" <rathamahata@php4.ru>
#   
#   Fix nls support for character sets with character width large than 1.
# 
# fs/befs/linuxvfs.c
#   2004/05/25 02:58:49-07:00 akpm@osdl.org +1 -1
#   befs: nls fix
# 
# ChangeSet
#   2004/05/25 08:38:57-07:00 akpm@osdl.org 
#   [PATCH] hfsplus: update dir time after change
#   
#   From: Roman Zippel <zippel@linux-m68k.org>
#   
#   Update dir ctime/mtime when adding/removing an entry.
# 
# fs/hfsplus/catalog.c
#   2004/05/25 02:53:05-07:00 akpm@osdl.org +4 -0
#   hfsplus: update dir time after change
# 
# fs/hfs/catalog.c
#   2004/05/25 02:53:05-07:00 akpm@osdl.org +4 -0
#   hfsplus: update dir time after change
# 
# ChangeSet
#   2004/05/25 08:38:46-07:00 akpm@osdl.org 
#   [PATCH] hfsplus: don't release not existing nodes
#   
#   From: Roman Zippel <zippel@linux-m68k.org>
#   
#   When releasing a page don't try to release not existing nodes.
# 
# fs/hfsplus/inode.c
#   2004/05/25 02:53:05-07:00 akpm@osdl.org +1 -1
#   hfsplus: don't release not existing nodes
# 
# fs/hfs/inode.c
#   2004/05/25 02:53:05-07:00 akpm@osdl.org +1 -1
#   hfsplus: don't release not existing nodes
# 
# ChangeSet
#   2004/05/25 08:38:35-07:00 akpm@osdl.org 
#   [PATCH] hfsplus: completely remove half inserted catalog entry
#   
#   From: Roman Zippel <zippel@linux-m68k.org>
#   
#   If the inserting of the file or dir record failed, remove the previously
#   inserted thread record.
# 
# fs/hfsplus/catalog.c
#   2004/05/25 02:58:51-07:00 akpm@osdl.org +15 -8
#   hfsplus: completely remove half inserted catalog entry
# 
# fs/hfs/catalog.c
#   2004/05/25 02:58:51-07:00 akpm@osdl.org +15 -8
#   hfsplus: completely remove half inserted catalog entry
# 
# ChangeSet
#   2004/05/25 08:38:25-07:00 akpm@osdl.org 
#   [PATCH] hfsplus: delete inode properly
#   
#   From: Roman Zippel <zippel@linux-m68k.org>
#   
#   Call hfsplus_delete_inode() to delete an inode when adding it to the
#   filesystem failed, so superblock info is correctly updated.
# 
# fs/hfsplus/dir.c
#   2004/05/25 02:53:04-07:00 akpm@osdl.org +5 -1
#   hfsplus: delete inode properly
# 
# ChangeSet
#   2004/05/25 08:38:14-07:00 akpm@osdl.org 
#   [PATCH] hfsplus: correct dentry initialization for dir dentries.
#   
#   From: Roman Zippel <zippel@linux-m68k.org>
#   
#   Initialize d_fsdata field also for dir dentries, use hfsplus_instantiate
#   helper function for this.
# 
# fs/hfsplus/dir.c
#   2004/05/25 02:58:51-07:00 akpm@osdl.org +13 -9
#   hfsplus: correct dentry initialization for dir dentries.
# 
# ChangeSet
#   2004/05/25 08:38:04-07:00 akpm@osdl.org 
#   [PATCH] hfsplus: fix key length for index nodes
#   
#   From: Roman Zippel <zippel@linux-m68k.org>
#   
#   Use the correct key length for index nodes.
# 
# fs/hfsplus/brec.c
#   2004/05/25 02:53:04-07:00 akpm@osdl.org +2 -2
#   hfsplus: fix key length for index nodes
# 
# ChangeSet
#   2004/05/25 08:37:53-07:00 akpm@osdl.org 
#   [PATCH] Decrease srtuct file size by 8
#   
#   From: Kurt Garloff <garloff@suse.de>
#   
#   Attached patch decreases the size of struct file by 8 bytes on 64 bit arches
#   by avoiding unecessary padding.
# 
# include/linux/fs.h
#   2004/05/25 02:53:04-07:00 akpm@osdl.org +2 -2
#   Decrease srtuct file size by 8
# 
# ChangeSet
#   2004/05/25 08:37:44-07:00 akpm@osdl.org 
#   [PATCH] remove stale comments above struct page
#   
#   From: Christoph Hellwig <hch@lst.de>
#   
#   struct page easily fits into a single cacheline with any recent CPU, and the
#   ordering isn't as described anymore anyway.
# 
# include/linux/mm.h
#   2004/05/25 02:53:04-07:00 akpm@osdl.org +0 -7
#   remove stale comments above struct page
# 
# ChangeSet
#   2004/05/25 08:37:33-07:00 akpm@osdl.org 
#   [PATCH] don't export vma_prio_tree_next
#   
#   From: Christoph Hellwig <hch@lst.de>
#   
#   there's no user is modules, the function isn't in mainline and I don't see why
#   modules should use it.
# 
# mm/prio_tree.c
#   2004/05/25 02:53:04-07:00 akpm@osdl.org +0 -1
#   don't export vma_prio_tree_next
# 
# ChangeSet
#   2004/05/25 08:37:14-07:00 akpm@osdl.org 
#   [PATCH] Fix race condition with current->group_info
#   
#   From: Olaf Kirch <okir@suse.de>
#   
#   I have been chasing a corruption of current->group_info on PPC during NFS
#   stress tests.  The problem seems to be that nfsd is messing with its
#   group_info quite a bit, while some monitoring processes look at
#   /proc/<pid>/status and do a get_group_info/put_group_info without any locking.
#   
#   This problem can be reproduced on ppc platforms within a few seconds if you
#   generate some NFS load and do a "cat /proc/XXX/status" of an nfsd thread in a
#   tight loop.
#   
#   I therefore think changes to current->group_info, and querying it from a
#   different process, needs to be protected using the task_lock.
#   
#   (akpm: task->group_info here is safe against exit() because the task holds a
#   ref on group_info which is released in __put_task_struct, and the /proc file
#   has a ref on the task_struct).
# 
# kernel/sys.c
#   2004/05/25 02:53:03-07:00 akpm@osdl.org +5 -0
#   Fix race condition with current->group_info
# 
# fs/proc/array.c
#   2004/05/25 02:53:03-07:00 akpm@osdl.org +7 -4
#   Fix race condition with current->group_info
# 
# ChangeSet
#   2004/05/25 08:36:57-07:00 akpm@osdl.org 
#   [PATCH] ep_send_events() stack reduction
#   
#   ep_send_events() uses ~350 bytes of stack for a local buffer of events to send
#   to userspace.  The patch fixes that by removing the double-buffering
#   altogether.  A pipe-based microbenchmark from Davide Libenzi
#   <davidel@xmailserver.org> was sped up by 1-2%.
# 
# fs/eventpoll.c
#   2004/05/25 02:53:03-07:00 akpm@osdl.org +8 -28
#   ep_send_events() stack reduction
# 
# ChangeSet
#   2004/05/25 08:36:46-07:00 akpm@osdl.org 
#   [PATCH] Fix the mangled-oops-output-on-SMP problem
#   
#   From: Ingo Molnar <mingo@elte.hu>
#   
#   printk currently does
#   
#   	if (oops_in_progres)
#   		bust_printk_locks();
#   
#   which means that once we oops, the printk locking is 100% ineffective and
#   multiple CPUs make an unreadable mess on a serial console.  It's a significant
#   development hassle.
#   
#   Fix that up by only popping locks once per ten seconds.
#   
#   akpm@osdl.org did:
#   
#     - Bump the timeout to 30 seconds - 9600 baud is slow.
#   
#     - Handle jiffy wraps: change the logic so that we only skip the lockbust
#       if the current time is within 30 seconds of the previous lockbusting
#       attempt.
# 
# kernel/printk.c
#   2004/05/25 02:53:03-07:00 akpm@osdl.org +23 -6
#   Fix the mangled-oops-output-on-SMP problem
# 
# ChangeSet
#   2004/05/25 08:36:31-07:00 akpm@osdl.org 
#   [PATCH] Prevent scary warnings from knfsd
#   
#   From: "J. Bruce Fields" <bfields@fieldses.org>
#   
#   The kernel currently prints:
#   
#    nfsd: nobody listening for auth.unix.ip upcall; has some daemon not been started?
#   
#   on every bootup, during initscripts.
#   
#   Neil Brown <neilb@cse.unsw.edu.au> says:
#   
#     It was part of the recent set of idmapper patches.  Bruce wanted the admin
#     to get a warning when the idmapper daemon wasn't running.  I thought the
#     same warning should apply to any daemon that responded to upcalls.
#   
#     In the case of auth.unix.ip it isn't strictly necessary for a daemon to be
#     running (for comparability with 2.4).
#   
#     You can get rid of the warning by doing:
#   
#       mount -t nfsd nfsd /proc/fs/nfs
#   
#     before mountd is started (init scripts should start doing this I hope, but
#     distributions don't tend to use the init script from nfs-utils, so it is
#     hard to push it).  This will trigger mountd to listen on auth.unix.ip and
#     others.
#   
#   
#   That's a hassle, so Bruce's patch limits the warning purely to the new
#   idmapper cache.  It provides a callback in the cache_detail that individual
#   caches can use to log messages when upcalls fail because a userspace daemon
#   not running.  Implement this method for the idmapping caches.
# 
# net/sunrpc/cache.c
#   2004/05/25 02:53:03-07:00 akpm@osdl.org +2 -3
#   Prevent scary warnings from knfsd
# 
# include/linux/sunrpc/cache.h
#   2004/05/25 02:53:03-07:00 akpm@osdl.org +1 -0
#   Prevent scary warnings from knfsd
# 
# fs/nfsd/nfs4idmap.c
#   2004/05/25 02:53:03-07:00 akpm@osdl.org +10 -0
#   Prevent scary warnings from knfsd
# 
# ChangeSet
#   2004/05/25 08:36:18-07:00 akpm@osdl.org 
#   [PATCH] Fix userspace include of linux/fs.h
#   
#   From: Mans Rullgard <mru@kth.se>
#   
#   There are a few include which should have been under __KERNEL__.
# 
# include/linux/fs.h
#   2004/05/25 02:58:52-07:00 akpm@osdl.org +3 -3
#   Fix userspace include of linux/fs.h
# 
# ChangeSet
#   2004/05/25 08:36:02-07:00 akpm@osdl.org 
#   [PATCH] use SLAB_PANIC in ll_rw_blk.c
# 
# drivers/block/ll_rw_blk.c
#   2004/05/25 02:53:03-07:00 akpm@osdl.org +3 -9
#   use SLAB_PANIC in ll_rw_blk.c
# 
# ChangeSet
#   2004/05/25 08:35:48-07:00 akpm@osdl.org 
#   [PATCH] ppc64: avoid bogus real IRQ numbers
#   
#   Signed-off-by: Paul Mackerras <paulus@samba.org>
#   
#   Early in the boot process on pSeries machines, we look in the Open Firmware
#   device tree for information about the interrupt assignments, and assign
#   virtual IRQ numbers for each physical IRQ.  There is currently a couple of
#   bugs in this code which result in us assigning virtual IRQs for nonexistent
#   physical IRQs.  This causes problems when we call the firmware to enable or
#   disable those nonexistent physical IRQs.  Some versions at least of the
#   firmware will hit an assertion failure and crash the machine when this
#   happens.
#   
#   This patch fixes the bugs and ensures that we don't try and use nonexistent
#   physical IRQ numbers.  One bug was that we were mapping ISA interrupts,
#   which is unnecessary since virtual IRQ numbers 0 - 15 are reserved for
#   them.  The other was that when we had a PCI interrupt (which is always in
#   the range 1 to 4, corresponding to INTA to INTD) which didn't have a
#   mapping in the PCI host bridge above it, we were just using the original
#   number (usually 1) rather than ignoring it.
# 
# arch/ppc64/kernel/prom.c
#   2004/05/25 02:53:03-07:00 akpm@osdl.org +24 -15
#   ppc64: avoid bogus real IRQ numbers
# 
# ChangeSet
#   2004/05/25 08:35:31-07:00 akpm@osdl.org 
#   [PATCH] ppc64: bump IOMMU_MAX_ORDER
#   
#   Signed-off-by: Anton Blanchard <anton@samba.org>
#   
#   We have cards that want over 2MB of PCI consistent memory.  The
#   IOMAP_MAX_ORDER limit is just to catch bad drivers early, so we can bump
#   this a bit.
#   
#   We want some room to grow but our maximum get_free_pages allocation on
#   ppc64 is currently 16MB, so it doesnt make sense to go above that.
# 
# include/asm-ppc64/iommu.h
#   2004/05/25 02:53:02-07:00 akpm@osdl.org +3 -3
#   ppc64: bump IOMMU_MAX_ORDER
# 
# ChangeSet
#   2004/05/25 08:35:13-07:00 akpm@osdl.org 
#   [PATCH] ppc64: small enter_rtas fix
#   
#   From: Anton Blanchard <anton@samba.org>
#   
#   enter_rtas now takes an unsigned long.
# 
# arch/ppc64/xmon/xmon.c
#   2004/05/25 02:53:02-07:00 akpm@osdl.org +1 -1
#   ppc64: small enter_rtas fix
# 
# ChangeSet
#   2004/05/25 08:34:57-07:00 akpm@osdl.org 
#   [PATCH] dynamic addition of virtual disks on PPC64 iSeries
#   
#   From: Stephen Rothwell <sfr@canb.auug.org.au>
#   
#   This patch allows us to dynamically add virtual disks to an iSeries partition.
#    It works like this: after you have created the virtual disk file on OS/400
#   and attached it to the Linux partition, you need to write to
#   /sys/bus/vio/drivers/viodasd/probe (it doesn't matter what you write).  This
#   will do the probe.  It calls add_disk() for each new disk, so we get hotplug
#   events as a side effect.
#   
#   This was the nicest way I could think of doing this as the interface to the
#   hypervisor is polled ...
# 
# drivers/block/viodasd.c
#   2004/05/25 02:53:02-07:00 akpm@osdl.org +37 -7
#   dynamic addition of virtual disks on PPC64 iSeries
# 
# ChangeSet
#   2004/05/25 08:34:44-07:00 akpm@osdl.org 
#   [PATCH] ppc64: fix to viopath.c
#   
#   From: Anton Blanchard <anton@samba.org>
#   
#   From: Olaf Hering and Nathan Lynch:
#   
#   Fix a couple of nasty lurking bugs in viopath.c and add information
#   required to know if the iseries_veth module should be loaded on legacy
#   iSeries systems.
# 
# arch/ppc64/kernel/viopath.c
#   2004/05/25 02:53:02-07:00 akpm@osdl.org +14 -3
#   ppc64: fix to viopath.c
# 
# ChangeSet
#   2004/05/25 08:34:35-07:00 akpm@osdl.org 
#   [PATCH] ppc64: NUMA fixes
#   
#   From: Anton Blanchard <anton@samba.org>
#   
#   From: Anton Blanchard, Dave Hansen and Olof Johansson:
#   
#   Fix multiple bugs in the ppc64 NUMA topology probe code.
#   
#   - We were using HW cpu numbers instead of logical ones.  615, 630, 650,
#     some 670 and some 690 SMP will all fail to boot without this patch.
#   
#   - The old code would BUG() when it got confused (more NUMA zones than the
#     kernel is configured for etc).
#   
#   - The common depth calculation was incorrect.  Dave found an OF property
#     that gives us exactly what we want.
#   
#   - Things were broken on SMT machines.
#   
#   The new code should work on those broken systems and should no longer BUG()
#   but fall back to a flat topology when it gets confused.
# 
# include/asm-ppc64/mmzone.h
#   2004/05/25 02:53:02-07:00 akpm@osdl.org +0 -1
#   ppc64: NUMA fixes
# 
# arch/ppc64/mm/numa.c
#   2004/05/25 02:53:02-07:00 akpm@osdl.org +172 -88
#   ppc64: NUMA fixes
# 
# ChangeSet
#   2004/05/25 08:34:24-07:00 akpm@osdl.org 
#   [PATCH] ppc64: fix inline spinlocks
#   
#   From: Anton Blanchard <anton@samba.org>
#   
#   In _raw_spin_lock_flags we were branching to the wrong spot and would
#   restore random stuff to the MSR.
# 
# include/asm-ppc64/spinlock.h
#   2004/05/25 02:53:02-07:00 akpm@osdl.org +1 -1
#   ppc64: fix inline spinlocks
# 
# ChangeSet
#   2004/05/25 08:05:12-07:00 davej@redhat.com 
#   [PATCH] Make early_cpu_detect() set x86_cache_alignment on pre-cpuid CPU's too
#   
#   From: Zdenek Pavlas <pavlas@nextra.cz>
#   
#   On any x86 without cpuid, early_cpu_detect() left x86_cache_alignment as
#   zero, so kmem_cache_init() calls cache_estimate() with align == 0, and
#   it loops forever. I've tried this trivial fix, and it works for me.
#   
#   Andi Kleen looked over this, and ok'd it.
# 
# arch/i386/kernel/cpu/common.c
#   2004/05/24 17:00:00-07:00 davej@redhat.com +2 -2
#   Make early_cpu_detect() set x86_cache_alignment on pre-cpuid CPU's too
# 
# ChangeSet
#   2004/05/24 17:19:59-07:00 paulus@samba.org 
#   [PATCH] ppc64: better stack traces
#   
#   This improves the stack traces we get on PPC64 by putting a marker in
#   those stack frames that are created as a result of an interrupt or
#   exception.  The marker is "regshere" (0x7265677368657265).
#   
#   With this, stack traces show where exceptions have occurred, which can
#   be very useful.  This also improves the accuracy of the trace because
#   the relevant return address can be in the link register at the time of
#   the exception rather than on the stack.  We now print the PC and
#   exception type for each exception frame, and then the link register if
#   appropriate as the next item in the trace.
# 
# arch/ppc64/xmon/xmon.c
#   2004/05/24 15:35:48-07:00 paulus@samba.org +1 -8
#   ppc64: better stack traces
# 
# arch/ppc64/kernel/process.c
#   2004/05/24 14:44:44-07:00 paulus@samba.org +41 -17
#   ppc64: better stack traces
# 
# arch/ppc64/kernel/head.S
#   2004/05/24 14:42:19-07:00 paulus@samba.org +4 -0
#   ppc64: better stack traces
# 
# ChangeSet
#   2004/05/24 23:14:52+01:00 rmk@flint.arm.linux.org.uk 
#   [ARM] pxa2xx_udc needs asm/mach-types.h
# 
# drivers/usb/gadget/pxa2xx_udc.c
#   2004/05/24 23:12:51+01:00 rmk@flint.arm.linux.org.uk +1 -0
#   pxa2xx_udc needs asm/mach-types.h
# 
# ChangeSet
#   2004/05/24 22:42:29+01:00 rmk@flint.arm.linux.org.uk 
#   [ARM] Fix lubbock PCMCIA driver.
#   
#   - access SA1111 GPIO using sa1111_set_io functions.
#   - access Lubbock misc register using lubbock_set_misc_wr
#   - fix CF voltage selection.
#   - don't fiddle with PCMCIA voltage selection when selecting CF
#     voltage.
#   - wait for the voltage switches to stabilise before reading the
#     new card state.
# 
# drivers/pcmcia/sa1111_generic.h
#   2004/05/24 22:40:05+01:00 rmk@flint.arm.linux.org.uk +1 -1
#   lubbock pcmcia takes sa1111_dev.
# 
# drivers/pcmcia/sa1111_generic.c
#   2004/05/24 22:40:04+01:00 rmk@flint.arm.linux.org.uk +1 -1
#   lubbock pcmcia takes sa1111_dev.
# 
# drivers/pcmcia/pxa2xx_lubbock.c
#   2004/05/24 22:40:04+01:00 rmk@flint.arm.linux.org.uk +169 -154
#   Fix lubbock PCMCIA driver.
#   - access SA1111 GPIO using sa1111_set_io functions
#   - access Lubbock misc register using lubbock_set_misc_wr
#   - fix CF voltage selection.
#   - don't fiddle with PCMCIA voltage selection when selecting CF
#     voltage.
#   - wait for the voltage switches to stabilise before reading the
#     new card state.
# 
# ChangeSet
#   2004/05/24 10:15:43-07:00 herbert@gondor.apana.org.au 
#   [IPSEC]: Use add_timer in find_acq.
# 
# net/ipv6/xfrm6_state.c
#   2004/05/24 10:15:30-07:00 herbert@gondor.apana.org.au +2 -1
#   [IPSEC]: Use add_timer in find_acq.
# 
# net/ipv4/xfrm4_state.c
#   2004/05/24 10:15:30-07:00 herbert@gondor.apana.org.au +2 -1
#   [IPSEC]: Use add_timer in find_acq.
# 
# ChangeSet
#   2004/05/24 10:13:27-07:00 herbert@gondor.apana.org.au 
#   [IPSEC]: Fix OOPS when deleting an ip address.
#   
#   Looks like I was too hasty in blaming myself :) Although my patch does
#   fix a real bug, it cannot have been responsible for the crash that the OP
#   reported.  The reason is that the state timer always keeps a reference to
#   the state so even if it is incorrectly re-added the reference will prevent
#   the crash.
#   
#   Hence the problem is still a bug in the ref counting.  I think I've found
#   the real culprit now.  __xfrm?_find_acq() is missing an xfrm_state_hold
#   on the create path.  This also explains why I never see it myself since
#   Openswan never creates states through that code-path.
# 
# net/ipv6/xfrm6_state.c
#   2004/05/24 10:13:13-07:00 herbert@gondor.apana.org.au +3 -3
#   [IPSEC]: Fix OOPS when deleting an ip address.
#   
#   Looks like I was too hasty in blaming myself :) Although my patch does
#   fix a real bug, it cannot have been responsible for the crash that the OP
#   reported.  The reason is that the state timer always keeps a reference to
#   the state so even if it is incorrectly re-added the reference will prevent
#   the crash.
#   
#   Hence the problem is still a bug in the ref counting.  I think I've found
#   the real culprit now.  __xfrm?_find_acq() is missing an xfrm_state_hold
#   on the create path.  This also explains why I never see it myself since
#   Openswan never creates states through that code-path.
# 
# net/ipv4/xfrm4_state.c
#   2004/05/24 10:13:13-07:00 herbert@gondor.apana.org.au +3 -3
#   [IPSEC]: Fix OOPS when deleting an ip address.
#   
#   Looks like I was too hasty in blaming myself :) Although my patch does
#   fix a real bug, it cannot have been responsible for the crash that the OP
#   reported.  The reason is that the state timer always keeps a reference to
#   the state so even if it is incorrectly re-added the reference will prevent
#   the crash.
#   
#   Hence the problem is still a bug in the ref counting.  I think I've found
#   the real culprit now.  __xfrm?_find_acq() is missing an xfrm_state_hold
#   on the create path.  This also explains why I never see it myself since
#   Openswan never creates states through that code-path.
# 
# ChangeSet
#   2004/05/24 17:29:49+01:00 rmk@flint.arm.linux.org.uk 
#   [ARM] Don't reference __machine_arch_type directly.
# 
# include/asm-arm/arch-ixp4xx/uncompress.h
#   2004/05/24 17:27:46+01:00 rmk@flint.arm.linux.org.uk +1 -1
#   uncompress.h references __machine_arch_type.  Bad.  Use
#   machine_is_adi_coyote() instead.
# 
# ChangeSet
#   2004/05/24 17:18:24+01:00 icampbell@com.rmk.(none) 
#   [ARM PATCH] 1893/1: define __ARCH_WANT_SYS_PAUSE for ARM
#   
#   Patch from Ian Campbell
#   
#   The recent changeset "Sanitise handling of unneeded syscall stubs" missed
#   
#   __ARCH_WANT_SYS_PAUSE from include/asm-arm/unistd.h.
#   
# 
# include/asm-arm/unistd.h
#   2004/05/24 10:15:25+01:00 icampbell@com.rmk.(none) +1 -0
#   [PATCH] 1893/1: define __ARCH_WANT_SYS_PAUSE for ARM
# 
# ChangeSet
#   2004/05/24 17:14:00+01:00 rmk@flint.arm.linux.org.uk 
#   [ARM] Remove needless include of asm/mach-types.h
# 
# include/asm-arm/arch-pxa/hardware.h
#   2004/05/24 17:11:51+01:00 rmk@flint.arm.linux.org.uk +0 -3
#   Remove needless include of asm/mach-types.h
# 
# include/asm-arm/arch-omap/uncompress.h
#   2004/05/24 17:11:51+01:00 rmk@flint.arm.linux.org.uk +0 -1
#   Remove needless include of asm/mach-types.h
# 
# include/asm-arm/arch-omap/hardware.h
#   2004/05/24 17:11:50+01:00 rmk@flint.arm.linux.org.uk +0 -1
#   Remove needless include of asm/mach-types.h
# 
# include/asm-arm/arch-lh7a40x/hardware.h
#   2004/05/24 17:11:50+01:00 rmk@flint.arm.linux.org.uk +0 -2
#   Remove needless include of asm/mach-types.h
# 
# arch/arm/mach-s3c2410/s3c2410.c
#   2004/05/24 17:11:50+01:00 rmk@flint.arm.linux.org.uk +0 -1
#   Remove needless include of asm/mach-types.h
# 
# arch/arm/mach-omap/bus.c
#   2004/05/24 17:11:50+01:00 rmk@flint.arm.linux.org.uk +0 -1
#   Remove needless include of asm/mach-types.h
# 
# arch/arm/mach-ixp4xx/common.c
#   2004/05/24 17:11:50+01:00 rmk@flint.arm.linux.org.uk +0 -1
#   Remove needless include of asm/mach-types.h
# 
# arch/arm/mach-iop3xx/xs80200-irq.c
#   2004/05/24 17:11:50+01:00 rmk@flint.arm.linux.org.uk +0 -2
#   Remove needless include of asm/mach-types.h
# 
# arch/arm/mach-iop3xx/mm.c
#   2004/05/24 17:11:49+01:00 rmk@flint.arm.linux.org.uk +0 -1
#   Remove needless include of asm/mach-types.h
# 
# arch/arm/mach-iop3xx/mm-321.c
#   2004/05/24 17:11:49+01:00 rmk@flint.arm.linux.org.uk +0 -1
#   Remove needless include of asm/mach-types.h
# 
# arch/arm/mach-iop3xx/iq80310-time.c
#   2004/05/24 17:11:49+01:00 rmk@flint.arm.linux.org.uk +0 -1
#   Remove needless include of asm/mach-types.h
# 
# arch/arm/mach-iop3xx/iq80310-irq.c
#   2004/05/24 17:11:48+01:00 rmk@flint.arm.linux.org.uk +0 -2
#   Remove needless include of asm/mach-types.h
# 
# arch/arm/mach-iop3xx/iop321-time.c
#   2004/05/24 17:11:48+01:00 rmk@flint.arm.linux.org.uk +0 -1
#   Remove needless include of asm/mach-types.h
# 
# arch/arm/mach-iop3xx/iop310-irq.c
#   2004/05/24 17:11:48+01:00 rmk@flint.arm.linux.org.uk +0 -2
#   Remove needless include of asm/mach-types.h
# 
# arch/arm/mach-adifcc/irq.c
#   2004/05/24 17:11:48+01:00 rmk@flint.arm.linux.org.uk +0 -2
#   Remove needless include of asm/mach-types.h
# 
# arch/arm/kernel/arch.c
#   2004/05/24 17:11:48+01:00 rmk@flint.arm.linux.org.uk +0 -1
#   Remove needless include of asm/mach-types.h
# 
# ChangeSet
#   2004/05/24 08:20:03-07:00 James.Bottomley@SteelEye.com 
#   [PATCH] pa-risc: kernel/fork.c broken by the new rmap
#   
#   Any architecture (like pa-risc) that makes use of the helper function
#   flush_dcache_mmap_lock() won't compile with the new rmap due to use of
#   the wrong "mapping". 
#   
#   Trivial fix.
# 
# kernel/fork.c
#   2004/05/23 08:27:29-07:00 James.Bottomley@SteelEye.com +2 -2
#   pa-risc: kernel/fork.c broken by the new rmap
# 
# ChangeSet
#   2004/05/24 08:16:24-07:00 torvalds@ppc970.osdl.org 
#   Merge bk://linux-scsi.bkbits.net/scsi-for-linus-2.6
#   into ppc970.osdl.org:/home/torvalds/v2.6/linux
# 
# drivers/scsi/sg.c
#   2004/05/24 08:16:21-07:00 torvalds@ppc970.osdl.org +0 -0
#   Auto merged
# 
# drivers/scsi/dpt_i2o.c
#   2004/05/24 08:16:20-07:00 torvalds@ppc970.osdl.org +0 -0
#   Auto merged
# 
# drivers/scsi/Kconfig
#   2004/05/24 08:16:20-07:00 torvalds@ppc970.osdl.org +0 -0
#   Auto merged
# 
# ChangeSet
#   2004/05/24 13:16:26+01:00 rmk@flint.arm.linux.org.uk 
#   [ARM] Enable IRQs over context switches
#   
#   Disabling IRQs over context switches causes unreasonable IRQ latency
#   on VIVT cached machines, so provide our own prepare_arch_switch(),
#   finish_arch_switch() and task_running() implementations.  We provide
#   an optimised UP version so we don't end up needlessly incrementing
#   and decrementing the preempt count.
# 
# include/asm-arm/system.h
#   2004/05/24 13:13:54+01:00 rmk@flint.arm.linux.org.uk +34 -8
#   Enable IRQs over context switches such that we do not end up with high
#   IRQ latency.
# 
# ChangeSet
#   2004/05/24 12:17:09+01:00 rmk@flint.arm.linux.org.uk 
#   [ARM] Fix sorting of machine class symbols.
#   
#   These are supposed to be ordered by option name.
# 
# arch/arm/Kconfig
#   2004/05/24 12:14:29+01:00 rmk@flint.arm.linux.org.uk +8 -8
#   Sort machine class symbols by option name.
# 
# ChangeSet
#   2004/05/24 00:34:23+01:00 rmk@flint.arm.linux.org.uk 
#   [ARM] Remove old static GPIO port definitions for SA1111.
#   
#   Using these old definitions on PXA will result in randomly
#   scribbling over memory.  Remove them.
# 
# include/asm-arm/hardware/sa1111.h
#   2004/05/24 00:28:08+01:00 rmk@flint.arm.linux.org.uk +0 -16
#   Remove old static GPIO port definitions.
# 
# ChangeSet
#   2004/05/23 16:19:28-07:00 vadim@cs.washington.edu 
#   [NET]: Save some space with sysfs strings.
# 
# net/core/net-sysfs.c
#   2004/05/23 16:19:10-07:00 vadim@cs.washington.edu +3 -3
#   [NET]: Save some space with sysfs strings.
# 
# ChangeSet
#   2004/05/23 16:13:00-07:00 davem@nuts.davemloft.net 
#   Merge http://linux-mh.bkbits.net/bluetooth-2.6
#   into nuts.davemloft.net:/disk1/BK/net-2.6
# 
# drivers/bluetooth/hci_ldisc.c
#   2004/05/23 16:12:52-07:00 davem@nuts.davemloft.net +0 -0
#   Auto merged
# 
# ChangeSet
#   2004/05/24 00:09:54+01:00 rmk@flint.arm.linux.org.uk 
#   [ARM] PXAFB bug fixes
#   
#   - There are only 16 entries in the pseudo palette
#   - For dual-panel displays, we need to halve the display height
#   - When disabling the LCD controller, use LCCR0_DIS (aka slow disable)
#     rather than quick disable.
#   - Clean up compiler warnings.
# 
# drivers/video/pxafb.c
#   2004/05/24 00:07:57+01:00 rmk@flint.arm.linux.org.uk +20 -15
#   Collection of bug fixes:
#   - There are only 16 entries in the pseudo palette
#   - For dual-panel displays, we need to halve the display height
#   - When disabling the LCD controller, use LCCR0_DIS (aka slow disable)
#     rather than quick disable.
#   - Clean up compiler warnings.
# 
# ChangeSet
#   2004/05/23 23:52:39+01:00 rmk@flint.arm.linux.org.uk 
#   [ARM] Remove SA1111 PS/2 IRQ_HANDLED handling.
#   
#   Some SA1111 devices are unable to clear the PS/2 receive IRQ before
#   it has been serviced, so we always re-enter the handler one more
#   time than is strictly necessary.  We can't clear the IRQ after
#   servicing because that causes race conditions with other SA1111
#   devices, so we take the easy option and always return IRQ_HANDLED.
# 
# drivers/input/serio/sa1111ps2.c
#   2004/05/23 23:50:37+01:00 rmk@flint.arm.linux.org.uk +1 -4
#   Remove IRQ_HANDLED handling.
# 
# ChangeSet
#   2004/05/23 23:41:39+01:00 rmk@flint.arm.linux.org.uk 
#   [ARM] Update PXA serial driver.
#   
#   - Move CKEN manipulation into power management handling (so we don't
#     shut down the clock to the console port.)
#   - .iotype should be using UPIO_xxx not SERIAL_IO_xxx
#   - Remove each port when module is unloaded.
#   - Remove needless #include.
#   - Remove ASYNC_SKIP_TEST - we don't have any tests to skip.
# 
# drivers/serial/pxa.c
#   2004/05/23 23:39:21+01:00 rmk@flint.arm.linux.org.uk +11 -12
#   Move CKEN manipulation into power management handling (so we don't
#   shut down the clock to the console port.)
#   .iotype should be using UPIO_xxx not SERIAL_IO_xxx
#   Remove each port when module is unloaded.
#   Remove needless #include.
#   Remove ASYNC_SKIP_TEST - we don't have any tests to skip.
# 
# ChangeSet
#   2004/05/23 23:29:13+01:00 rmk@flint.arm.linux.org.uk 
#   [ARM] Add LCD display parameters for Lubbock board.
# 
# arch/arm/mach-pxa/lubbock.c
#   2004/05/23 23:27:13+01:00 rmk@flint.arm.linux.org.uk +22 -1
#   Add Lubbock's LCD display parameters.
# 
# ChangeSet
#   2004/05/23 23:23:59+01:00 rmk@flint.arm.linux.org.uk 
#   [ARM] Add lubbock_set_misc_wr()
#   
#   This provides an atomic method to update the Lubbock board specific
#   register from various drivers.
# 
# include/asm-arm/arch-pxa/lubbock.h
#   2004/05/23 23:21:57+01:00 rmk@flint.arm.linux.org.uk +3 -0
#   Provide prototype for lubbock_set_misc_wr()
# 
# arch/arm/mach-pxa/lubbock.c
#   2004/05/23 23:21:57+01:00 rmk@flint.arm.linux.org.uk +11 -0
#   Provide atomic method to update LUB_MISC_WR shared register.
# 
# ChangeSet
#   2004/05/23 22:06:28+01:00 rmk@flint.arm.linux.org.uk 
#   [ARM] Provide coherent_dma_mask for PXA MCI device.
# 
# arch/arm/mach-pxa/generic.c
#   2004/05/23 22:03:28+01:00 rmk@flint.arm.linux.org.uk +1 -0
#   Provide coherent_dma_mask for PXA MCI device.
# 
# ChangeSet
#   2004/05/23 21:56:17+01:00 rmk@flint.arm.linux.org.uk 
#   [ARM] Fix oops in dma_unmap_single()
#   
#   Fix an oops caused by a missing failure return value for devices which
#   do not require DMA bouncing.
# 
# arch/arm/common/dmabounce.c
#   2004/05/23 21:53:40+01:00 rmk@flint.arm.linux.org.uk +1 -0
#   Return NULL on failure to find device.
# 
# ChangeSet
#   2004/05/23 12:22:09-07:00 viro@parcelfarce.linux.theplanet.co.uk 
#   [PATCH] ncpfs compat ioctls
#   
#   This takes ncpfs ioctl handling into fs/compat_ioctl.c, removing it from
#   ppc64 and sparc64 code.
#   
#   Code sanitized, switched to compat_alloc_user_space(), bunch of
#   {k,v}malloc() killed.
# 
# fs/compat_ioctl.c
#   2004/05/23 11:49:32-07:00 viro@parcelfarce.linux.theplanet.co.uk +193 -0
#   ncpfs compat ioctls
# 
# arch/sparc64/kernel/ioctl32.c
#   2004/05/23 11:48:42-07:00 viro@parcelfarce.linux.theplanet.co.uk +0 -320
#   ncpfs compat ioctls
# 
# arch/ppc64/kernel/ioctl32.c
#   2004/05/23 11:48:42-07:00 viro@parcelfarce.linux.theplanet.co.uk +0 -312
#   ncpfs compat ioctls
# 
# ChangeSet
#   2004/05/23 11:44:28-05:00 brking@us.ibm.com 
#   [PATCH] ipr driver version 2.0.7
#   
#   Bump driver version
# 
# drivers/scsi/ipr.h
#   2004/05/21 19:55:12-05:00 brking@us.ibm.com +2 -2
#   ipr driver version 2.0.7
# 
# ChangeSet
#   2004/05/23 11:37:37-05:00 brking@us.ibm.com 
#   [PATCH] ipr remove anonymous unions for gcc 2.95
#   
#   This patch removes all usage of anonymous unions from the ipr
#   driver since gcc 2.95 does not support anonymous unions.
# 
# drivers/scsi/ipr.h
#   2004/05/22 17:05:26-05:00 brking@us.ibm.com +7 -7
#   top### Change the comments to ChangeSet|1.1651 below
#   [PATCH] ipr remove anonymous unions for gcc 2.95
#   
#   This patch removes all usage of anonymous unions from the ipr
#   driver since gcc 2.95 does not support anonymous unions.
#   
#   ipr remove anonymous unions for gcc 2.95
# 
# drivers/scsi/ipr.c
#   2004/05/22 14:50:39-05:00 brking@us.ibm.com +51 -49
#   ipr remove anonymous unions for gcc 2.95
# 
# ChangeSet
#   2004/05/23 11:25:01-05:00 brking@us.ibm.com 
#   [PATCH] ipr fix for ioa reset timeout oops
#   
#   This patch fixes an oops discovered in test which can occur
#   on bad hardware if the ipr adapter times out coming operational. 
# 
# drivers/scsi/ipr.c
#   2004/05/22 17:17:47-05:00 brking@us.ibm.com +2 -0
#   ipr fix for ioa reset timeout oops
# 
# ChangeSet
#   2004/05/23 11:22:07-05:00 brking@us.ibm.com 
#   [PATCH] ipr add error logs to abort and reset paths
#   
#   This patch adds additional error logging to abort, device reset,
#   and bus reset paths to help in diagnosing scsi problems on ipr.
# 
# drivers/scsi/ipr.h
#   2004/05/22 14:49:07-05:00 brking@us.ibm.com +1 -0
#   ipr add error logs to abort and reset paths
# 
# drivers/scsi/ipr.c
#   2004/05/22 14:49:38-05:00 brking@us.ibm.com +4 -0
#   ipr add error logs to abort and reset paths
# 
# ChangeSet
#   2004/05/23 11:19:21-05:00 brking@us.ibm.com 
#   [PATCH] ipr gcc attributes fixes
#   
#   This patch fixes an issue where ipr was including a kernel
#   data structure, list_head, in a packed structure, which causes
#   compile issues on some architectures, and is just a bad thing to do.
# 
# drivers/scsi/ipr.h
#   2004/05/22 19:10:04-05:00 brking@us.ibm.com +5 -5
#   ipr gcc attributes fixes
# 
# drivers/scsi/ipr.c
#   2004/05/22 19:08:01-05:00 brking@us.ibm.com +29 -28
#   ipr gcc attributes fixes
# 
# ChangeSet
#   2004/05/23 11:17:44-05:00 jejb@mulgrave.(none) 
#   initial 2.6 fixup for ATP870U scsi
#   
#   From: 	Alan Cox <alan@redhat.com>
#   
#   Pretty minimal. queue_command is now called locked, this requires propogating
#   some small locking changes for send_s870
# 
# drivers/scsi/atp870u.c
#   2004/05/23 11:17:20-05:00 jejb@mulgrave.(none) +23 -17
#   initial 2.6 fixup for ATP870U scsi
# 
# ChangeSet
#   2004/05/23 13:43:34+02:00 marcel@holtmann.org 
#   [Bluetooth] Define .kobj.k_name for the fake device
#   
#   The PCMCIA devices are not devices for the kernel and the bt3c_cs
#   driver uses a fake device for calling request_firmware(). The fake
#   device initialization must also set .kobj.k_name to prevent an oops
#   until PCMCIA devices are fully integrated into the driver model.
# 
# drivers/bluetooth/bt3c_cs.c
#   2004/05/23 13:37:31+02:00 marcel@holtmann.org +3 -0
#   Define .kobj.k_name for the fake device
# 
# ChangeSet
#   2004/05/23 13:31:00+02:00 marcel@holtmann.org 
#   [Bluetooth] Use try_module_get() for RFCOMM sessions
#   
#   It is not possible to use __module_get() when adding a new RFCOMM
#   session, because there is a case where no reference count is hold.
#   This happens when the module is not in use right now and an incoming
#   connection occurs.
# 
# net/bluetooth/rfcomm/core.c
#   2004/05/23 13:26:59+02:00 marcel@holtmann.org +13 -12
#   Use try_module_get() for RFCOMM sessions
# 
# ChangeSet
#   2004/05/23 10:22:27+02:00 perex@suse.cz 
#   ALSA CVS update - Jaroslav Kysela <perex@suse.cz>
#   PCM Midlevel,ALSA Core
#   Added SNDRV_PCM_SYNC_PTR_APPL and SNDRV_PCM_SYNC_PTR_AVAIL_MIN extensions
#   to SYNC_PTR ioctl for PCM API.
# 
# sound/core/pcm_native.c
#   2004/05/22 05:12:57+02:00 perex@suse.cz +8 -2
#   ALSA CVS update
#   D:2004/05/22 11:12:57
#   C:PCM Midlevel,ALSA Core
#   A:Jaroslav Kysela <perex@suse.cz>
#   F:core/pcm_native.c:1.90->1.91 
#   F:include/asound.h:1.39->1.40 
#   L:Added SNDRV_PCM_SYNC_PTR_APPL and SNDRV_PCM_SYNC_PTR_AVAIL_MIN extensions
#   L:to SYNC_PTR ioctl for PCM API.
# 
# include/sound/asound.h
#   2004/05/22 05:12:58+02:00 perex@suse.cz +2 -0
#   ALSA CVS update
#   D:2004/05/22 11:12:57
#   C:PCM Midlevel,ALSA Core
#   A:Jaroslav Kysela <perex@suse.cz>
#   F:core/pcm_native.c:1.90->1.91 
#   F:include/asound.h:1.39->1.40 
#   L:Added SNDRV_PCM_SYNC_PTR_APPL and SNDRV_PCM_SYNC_PTR_AVAIL_MIN extensions
#   L:to SYNC_PTR ioctl for PCM API.
# 
# ChangeSet
#   2004/05/23 10:22:01+02:00 perex@suse.cz 
#   ALSA CVS update - Takashi Iwai <tiwai@suse.de>
#   VIA82xx driver
#   - added the DXS entry for ECS K7VTA3 v8.0
#   - fixed the DXS entry for ASUS A7V8X to NO_VRA.
# 
# sound/pci/via82xx.c
#   2004/05/21 06:11:39+02:00 perex@suse.cz +2 -1
#   ALSA CVS update
#   D:2004/05/21 12:11:39
#   C:VIA82xx driver
#   A:Takashi Iwai <tiwai@suse.de>
#   F:pci/via82xx.c:1.100->1.101 
#   L:- added the DXS entry for ECS K7VTA3 v8.0
#   L:- fixed the DXS entry for ASUS A7V8X to NO_VRA.
# 
# ChangeSet
#   2004/05/23 10:21:22+02:00 perex@suse.cz 
#   ALSA CVS update - Takashi Iwai <tiwai@suse.de>
#   ALSA Core
#   added reverse selections of components to CONFIG_SND_BIT32_EMUL.
# 
# sound/core/Kconfig
#   2004/05/19 12:00:23+02:00 perex@suse.cz +11 -4
#   ALSA CVS update
#   D:2004/05/19 18:00:23
#   C:ALSA Core
#   A:Takashi Iwai <tiwai@suse.de>
#   F:core/Kconfig:1.3->1.4 
#   L:added reverse selections of components to CONFIG_SND_BIT32_EMUL.
# 
# ChangeSet
#   2004/05/23 10:14:09+02:00 perex@suse.cz 
#   ALSA CVS update - Takashi Iwai <tiwai@suse.de>
#   PCI drivers,ICE1712 driver,ICE1724 driver
#   - improved the description of ice1724 driver on Kconfig.
#   - better support of VT1720 with snd-ice1724 driver.
#   - check PCI subsystem IDs when no EEPROM is available (ice1724 only)
#   - change the driver name string if given in the board list.
#   - merged prodigy 7.1 support into aureon.c.  they are almost identical.
#   - allow to use PDMA4 and RMDA1 for non-SPDIF purpose if specified (ice1724 only).
# 
# sound/pci/ice1712/ice1724.c
#   2004/05/18 13:32:40+02:00 perex@suse.cz +150 -45
#   ALSA CVS update
#   D:2004/05/18 19:32:40
#   C:PCI drivers,ICE1712 driver,ICE1724 driver
#   A:Takashi Iwai <tiwai@suse.de>
#   F:pci/Kconfig:1.27->1.28 
#   F:pci/ice1712/Makefile:1.10->1.11 
#   F:pci/ice1712/aureon.c:1.9->1.10 
#   F:pci/ice1712/aureon.h:1.3->1.4 
#   F:pci/ice1712/ice1712.c:1.52->1.53 
#   F:pci/ice1712/ice1712.h:1.20->1.21 
#   F:pci/ice1712/ice1724.c:1.30->1.31 
#   F:pci/ice1712/prodigy.c:1.5->1.6(DEAD) 
#   F:pci/ice1712/prodigy.h:1.1->1.2(DEAD) 
#   L:- improved the description of ice1724 driver on Kconfig.
#   L:- better support of VT1720 with snd-ice1724 driver.
#   L:- check PCI subsystem IDs when no EEPROM is available (ice1724 only)
#   L:- change the driver name string if given in the board list.
#   L:- merged prodigy 7.1 support into aureon.c.  they are almost identical.
#   L:- allow to use PDMA4 and RMDA1 for non-SPDIF purpose if specified (ice1724 only).
# 
# sound/pci/ice1712/ice1712.h
#   2004/05/18 13:32:40+02:00 perex@suse.cz +5 -0
#   ALSA CVS update
#   D:2004/05/18 19:32:40
#   C:PCI drivers,ICE1712 driver,ICE1724 driver
#   A:Takashi Iwai <tiwai@suse.de>
#   F:pci/Kconfig:1.27->1.28 
#   F:pci/ice1712/Makefile:1.10->1.11 
#   F:pci/ice1712/aureon.c:1.9->1.10 
#   F:pci/ice1712/aureon.h:1.3->1.4 
#   F:pci/ice1712/ice1712.c:1.52->1.53 
#   F:pci/ice1712/ice1712.h:1.20->1.21 
#   F:pci/ice1712/ice1724.c:1.30->1.31 
#   F:pci/ice1712/prodigy.c:1.5->1.6(DEAD) 
#   F:pci/ice1712/prodigy.h:1.1->1.2(DEAD) 
#   L:- improved the description of ice1724 driver on Kconfig.
#   L:- better support of VT1720 with snd-ice1724 driver.
#   L:- check PCI subsystem IDs when no EEPROM is available (ice1724 only)
#   L:- change the driver name string if given in the board list.
#   L:- merged prodigy 7.1 support into aureon.c.  they are almost identical.
#   L:- allow to use PDMA4 and RMDA1 for non-SPDIF purpose if specified (ice1724 only).
# 
# sound/pci/ice1712/ice1712.c
#   2004/05/18 13:32:40+02:00 perex@suse.cz +2 -0
#   ALSA CVS update
#   D:2004/05/18 19:32:40
#   C:PCI drivers,ICE1712 driver,ICE1724 driver
#   A:Takashi Iwai <tiwai@suse.de>
#   F:pci/Kconfig:1.27->1.28 
#   F:pci/ice1712/Makefile:1.10->1.11 
#   F:pci/ice1712/aureon.c:1.9->1.10 
#   F:pci/ice1712/aureon.h:1.3->1.4 
#   F:pci/ice1712/ice1712.c:1.52->1.53 
#   F:pci/ice1712/ice1712.h:1.20->1.21 
#   F:pci/ice1712/ice1724.c:1.30->1.31 
#   F:pci/ice1712/prodigy.c:1.5->1.6(DEAD) 
#   F:pci/ice1712/prodigy.h:1.1->1.2(DEAD) 
#   L:- improved the description of ice1724 driver on Kconfig.
#   L:- better support of VT1720 with snd-ice1724 driver.
#   L:- check PCI subsystem IDs when no EEPROM is available (ice1724 only)
#   L:- change the driver name string if given in the board list.
#   L:- merged prodigy 7.1 support into aureon.c.  they are almost identical.
#   L:- allow to use PDMA4 and RMDA1 for non-SPDIF purpose if specified (ice1724 only).
# 
# sound/pci/ice1712/aureon.h
#   2004/05/18 13:32:40+02:00 perex@suse.cz +7 -1
#   ALSA CVS update
#   D:2004/05/18 19:32:40
#   C:PCI drivers,ICE1712 driver,ICE1724 driver
#   A:Takashi Iwai <tiwai@suse.de>
#   F:pci/Kconfig:1.27->1.28 
#   F:pci/ice1712/Makefile:1.10->1.11 
#   F:pci/ice1712/aureon.c:1.9->1.10 
#   F:pci/ice1712/aureon.h:1.3->1.4 
#   F:pci/ice1712/ice1712.c:1.52->1.53 
#   F:pci/ice1712/ice1712.h:1.20->1.21 
#   F:pci/ice1712/ice1724.c:1.30->1.31 
#   F:pci/ice1712/prodigy.c:1.5->1.6(DEAD) 
#   F:pci/ice1712/prodigy.h:1.1->1.2(DEAD) 
#   L:- improved the description of ice1724 driver on Kconfig.
#   L:- better support of VT1720 with snd-ice1724 driver.
#   L:- check PCI subsystem IDs when no EEPROM is available (ice1724 only)
#   L:- change the driver name string if given in the board list.
#   L:- merged prodigy 7.1 support into aureon.c.  they are almost identical.
#   L:- allow to use PDMA4 and RMDA1 for non-SPDIF purpose if specified (ice1724 only).
# 
# sound/pci/ice1712/aureon.c
#   2004/05/18 13:32:40+02:00 perex@suse.cz +207 -14
#   ALSA CVS update
#   D:2004/05/18 19:32:40
#   C:PCI drivers,ICE1712 driver,ICE1724 driver
#   A:Takashi Iwai <tiwai@suse.de>
#   F:pci/Kconfig:1.27->1.28 
#   F:pci/ice1712/Makefile:1.10->1.11 
#   F:pci/ice1712/aureon.c:1.9->1.10 
#   F:pci/ice1712/aureon.h:1.3->1.4 
#   F:pci/ice1712/ice1712.c:1.52->1.53 
#   F:pci/ice1712/ice1712.h:1.20->1.21 
#   F:pci/ice1712/ice1724.c:1.30->1.31 
#   F:pci/ice1712/prodigy.c:1.5->1.6(DEAD) 
#   F:pci/ice1712/prodigy.h:1.1->1.2(DEAD) 
#   L:- improved the description of ice1724 driver on Kconfig.
#   L:- better support of VT1720 with snd-ice1724 driver.
#   L:- check PCI subsystem IDs when no EEPROM is available (ice1724 only)
#   L:- change the driver name string if given in the board list.
#   L:- merged prodigy 7.1 support into aureon.c.  they are almost identical.
#   L:- allow to use PDMA4 and RMDA1 for non-SPDIF purpose if specified (ice1724 only).
# 
# sound/pci/ice1712/Makefile
#   2004/05/18 13:32:40+02:00 perex@suse.cz +1 -1
#   ALSA CVS update
#   D:2004/05/18 19:32:40
#   C:PCI drivers,ICE1712 driver,ICE1724 driver
#   A:Takashi Iwai <tiwai@suse.de>
#   F:pci/Kconfig:1.27->1.28 
#   F:pci/ice1712/Makefile:1.10->1.11 
#   F:pci/ice1712/aureon.c:1.9->1.10 
#   F:pci/ice1712/aureon.h:1.3->1.4 
#   F:pci/ice1712/ice1712.c:1.52->1.53 
#   F:pci/ice1712/ice1712.h:1.20->1.21 
#   F:pci/ice1712/ice1724.c:1.30->1.31 
#   F:pci/ice1712/prodigy.c:1.5->1.6(DEAD) 
#   F:pci/ice1712/prodigy.h:1.1->1.2(DEAD) 
#   L:- improved the description of ice1724 driver on Kconfig.
#   L:- better support of VT1720 with snd-ice1724 driver.
#   L:- check PCI subsystem IDs when no EEPROM is available (ice1724 only)
#   L:- change the driver name string if given in the board list.
#   L:- merged prodigy 7.1 support into aureon.c.  they are almost identical.
#   L:- allow to use PDMA4 and RMDA1 for non-SPDIF purpose if specified (ice1724 only).
# 
# sound/pci/Kconfig
#   2004/05/18 13:32:40+02:00 perex@suse.cz +3 -3
#   ALSA CVS update
#   D:2004/05/18 19:32:40
#   C:PCI drivers,ICE1712 driver,ICE1724 driver
#   A:Takashi Iwai <tiwai@suse.de>
#   F:pci/Kconfig:1.27->1.28 
#   F:pci/ice1712/Makefile:1.10->1.11 
#   F:pci/ice1712/aureon.c:1.9->1.10 
#   F:pci/ice1712/aureon.h:1.3->1.4 
#   F:pci/ice1712/ice1712.c:1.52->1.53 
#   F:pci/ice1712/ice1712.h:1.20->1.21 
#   F:pci/ice1712/ice1724.c:1.30->1.31 
#   F:pci/ice1712/prodigy.c:1.5->1.6(DEAD) 
#   F:pci/ice1712/prodigy.h:1.1->1.2(DEAD) 
#   L:- improved the description of ice1724 driver on Kconfig.
#   L:- better support of VT1720 with snd-ice1724 driver.
#   L:- check PCI subsystem IDs when no EEPROM is available (ice1724 only)
#   L:- change the driver name string if given in the board list.
#   L:- merged prodigy 7.1 support into aureon.c.  they are almost identical.
#   L:- allow to use PDMA4 and RMDA1 for non-SPDIF purpose if specified (ice1724 only).
# 
# BitKeeper/deleted/.del-prodigy.h~5d73c21f8cc0fcef
#   2004/05/23 10:13:52+02:00 perex@suse.cz +0 -0
#   Delete: sound/pci/ice1712/prodigy.h
# 
# BitKeeper/deleted/.del-prodigy.c~c182fb7e0e72b8a
#   2004/05/23 10:13:52+02:00 perex@suse.cz +0 -0
#   Delete: sound/pci/ice1712/prodigy.c
# 
# ChangeSet
#   2004/05/22 11:57:26-05:00 hch@lst.de 
#   [PATCH] remove an unused function from NC53c406a
#   
#   and here's a variant using #if 0
# 
# drivers/scsi/NCR53c406a.c
#   2004/05/22 11:44:31-05:00 hch@lst.de +2 -1
#   remove an unused function from NC53c406a
# 
# ChangeSet
#   2004/05/22 10:50:24-05:00 g.liakhovetski@gmx.de 
#   [PATCH] tmscsim: trivial updates
#   
#   Here comes the next (trivial) patch. I just want to get it out of the way
#   to make the next (scary) patch smaller and simpler. This one doesn't
#   modify the object code either. Actually, well, it does - it makes a few
#   objects, that were previously declared extern static. And removes a couple
#   more defines.
# 
# drivers/scsi/tmscsim.c
#   2004/05/21 18:14:48-05:00 g.liakhovetski@gmx.de +45 -55
#   tmscsim: trivial updates
# 
# drivers/scsi/scsiiom.c
#   2004/05/21 18:42:35-05:00 g.liakhovetski@gmx.de +5 -5
#   tmscsim: trivial updates
# 
# drivers/scsi/dc390.h
#   2004/05/21 16:11:32-05:00 g.liakhovetski@gmx.de +5 -5
#   tmscsim: trivial updates
# 
# ChangeSet
#   2004/05/22 10:16:19+02:00 perex@suse.cz 
#   Merge suse.cz:/home/perex/bk/linux-sound/linux-2.5
#   into suse.cz:/home/perex/bk/linux-sound/linux-sound
# 
# sound/pci/au88x0/au88x0_game.c
#   2004/05/22 10:16:12+02:00 perex@suse.cz +0 -0
#   Auto merged
# 
# include/linux/pci_ids.h
#   2004/05/22 10:16:11+02:00 perex@suse.cz +0 -0
#   Auto merged
# 
# ChangeSet
#   2004/05/21 10:53:24-05:00 jejb@mulgrave.(none) 
#   SCSI: make inquiry timeout tuneable
#   
#   From: garloff@suse.de
#   
#   Feature
#   
#   Make the timeout for INQUIRY during SCSI scan adjustable via boot parameter.
#   Note that the second INQUIRY does use a shorter timeout, as the long timeout
#   is for recovery from the initial reset, not because existing devices would
#   take so long to answer INQUIRY. SPC3 says that INQUIRY should be available
#   right away, but real life is different unfortunately.
# 
# drivers/scsi/scsi_scan.c
#   2004/05/21 10:53:07-05:00 jejb@mulgrave.(none) +9 -2
#   SCSI: make inquiry timeout tuneable
# 
# ChangeSet
#   2004/05/21 10:51:57-05:00 jejb@mulgrave.(none) 
#   SCSI: make SCSI REPORT LUNS the default
#   
#   From: garloff@suse.de
#   
#   Cleanup/Feature
#   
#   Remove CONFIG_SCSI_REPORT_LUNS config option.
#   Instead provide BLIST_NOREPORTLUN that can be passed as default_dev_flags
#   (but also per device if needed).
#   Provide BLIST_REPORTLUN2 that allows trying to use REPORT_LUNS for SCSI-2
#   devices, if they are connected to a host adapter supporting more than 8 LUNs
#   (and thus avoiding the usual USB crap to render this feature useless when
#   used with default_dev_flags).
#   
#    drivers/scsi/Kconfig        |   11 -----------
#    drivers/scsi/scsi_scan.c    |   19 +++++++++----------
#    include/scsi/scsi_devinfo.h |    3 +++
#    3 files changed, 12 insertions(+), 21 deletions(-)
# 
# include/scsi/scsi_devinfo.h
#   2004/05/21 10:51:42-05:00 jejb@mulgrave.(none) +3 -0
#   SCSI: make SCSI REPORT LUNS the default
# 
# drivers/scsi/scsi_scan.c
#   2004/05/21 10:51:42-05:00 jejb@mulgrave.(none) +9 -10
#   SCSI: make SCSI REPORT LUNS the default
# 
# drivers/scsi/Kconfig
#   2004/05/21 10:51:42-05:00 jejb@mulgrave.(none) +0 -11
#   SCSI: make SCSI REPORT LUNS the default
# 
# ChangeSet
#   2004/05/21 10:48:13-05:00 jejb@mulgrave.(none) 
#   SCSI: deprecate BLIST_FORCELUN
#   
#   From: garloff@suse.de
#   
#   Cleanup
#   
#   Mark BLIST_FORCELUN as deprecated, as we don't want to collect a list
#   of perfectly working multi-LUN devices with BLIST_FORCELUN. Instead
#   document max_luns boot/module parameter.
# 
# include/scsi/scsi_devinfo.h
#   2004/05/21 10:47:57-05:00 jejb@mulgrave.(none) +2 -1
#   SCSI: deprecate BLIST_FORCELUN
# 
# drivers/scsi/Kconfig
#   2004/05/21 10:47:57-05:00 jejb@mulgrave.(none) +2 -2
#   SCSI: deprecate BLIST_FORCELUN
# 
# ChangeSet
#   2004/05/21 10:46:21-05:00 jejb@mulgrave.(none) 
#   SCSI: logging optimisation
#   
#   From: garloff@suse.de
#   
#   Optimization.
#   
#   Tell the compiler that the SCSI LOG will not likely happen.
# 
# drivers/scsi/scsi_logging.h
#   2004/05/21 10:46:04-05:00 jejb@mulgrave.(none) +1 -1
#   SCSI: logging optimisation
# 
# ChangeSet
#   2004/05/21 10:31:54-05:00 rusty@rustcorp.com.au 
#   [PATCH] [TRIVIAL 2.6] drivers_scsi_nsp32.c: kill duplicate
#   
#    From:  a.othieno@bluewin.ch (Arthur Othieno)
# 
# drivers/scsi/nsp32.c
#   2004/05/20 00:59:33-05:00 rusty@rustcorp.com.au +0 -1
#   [TRIVIAL 2.6] drivers_scsi_nsp32.c: kill duplicate
# 
# ChangeSet
#   2004/05/21 10:30:21-05:00 g.liakhovetski@gmx.de 
#   [PATCH] tmscsim: remove legacy and void code
#   
#   This one is purely cosmetic - it removes legacy (pre 2.4) and some void
#   (e.g. #defined as nothing locks) code. So, it doesn't affect the resulting
#   object file.
# 
# drivers/scsi/tmscsim.c
#   2004/05/20 18:09:04-05:00 g.liakhovetski@gmx.de +7 -157
#   tmscsim: remove legacy and void code
# 
# drivers/scsi/scsiiom.c
#   2004/05/20 18:09:12-05:00 g.liakhovetski@gmx.de +2 -18
#   tmscsim: remove legacy and void code
# 
# ChangeSet
#   2004/05/21 10:28:12-05:00 g.liakhovetski@gmx.de 
#   tmscsim: remove procfs write support from tmscsim
#   
#   From: Christoph Hellwig <hch@lst.de>
#   
#   When looking at the driver after reviewing the changes I stubled over
#   that code.  Almost all of the funcitonality (except DUMP) should go
#   through the midlayer and will at least cause some confusion if it
#   doesn't.
#   
#   Also the implementation isn't exactly nice, like kmalloced scsi commands
#   and the tytpical 'parsing' macros cut & pasted over all historic scsi
#   drivers.  I think we're better of removing it completly and maybe readd
#   dump as a sysfs attribute if needed.
#   
#   500 lines of code gone.
# 
# drivers/scsi/tmscsim.c
#   2004/01/31 00:41:21-06:00 g.liakhovetski@gmx.de +1 -500
#   tmscsim: remove procfs write support from tmscsim
# 
# ChangeSet
#   2004/05/21 10:27:19-05:00 akpm@osdl.org 
#   [PATCH] qlogicfas408.c warning fix
#   
#   drivers/scsi/qlogicfas.c:190: warning: initialization from incompatible pointer type
# 
# drivers/scsi/qlogicfas408.h
#   2004/05/16 02:45:03-05:00 akpm@osdl.org +1 -1
#   qlogicfas408.c warning fix
# 
# drivers/scsi/qlogicfas408.c
#   2004/05/16 02:45:04-05:00 akpm@osdl.org +1 -1
#   qlogicfas408.c warning fix
# 
# ChangeSet
#   2004/05/21 10:21:03-05:00 g.liakhovetski@gmx.de 
#   [PATCH] tmscsim: no internal queue
#   
#   Here comes the 2nd one. I wanted to get Christoph's patches now in, but
#   already the first his patch comes on the top of this one: remove internal
#   command queuing in the driver. And, in fact, it fixes some bugs in it. So,
#   they should go in together. Here's the original comment from Christoph's
#   email of 1 Feb 2004:
#   
#   <start quote>
#   
#   Patch looks mostly good for me.  But there's some fishyness in queuecommand,
#   mostly from before you patch:
#   
#    - many failure cases return one with the new EH code although we wouldn't
#      want to requeue the midlayer in that case.  I removed the ifdef and added
#      a failed goto to handle them.
#    - we need to set cmd->result onlyh if we have an error instead of always
#      an overriding it - else it will leak to the midlayer in the return 1
#      case.
#    - the check for ids out of range are superflous (this was one of the errors
#      above, I decided to remove it instead of fixing it).
#    - you don't do DC390_UNLOCK_ACB when failing.  While it's a noop I think
#      it's bad to have locking macros in place and don't balance them.  You
#      should probably remove it completly in one of the next patches.
#    - the pDCB->pWaitingSRB looks a bit strange.  By unifying the the codepathes
#      it becomes much more readable.
#   
#   <end quote>
# 
# drivers/scsi/tmscsim.h
#   2004/03/04 15:21:39-06:00 g.liakhovetski@gmx.de +6 -17
#   tmscsim: no internal queue
# 
# drivers/scsi/tmscsim.c
#   2004/05/19 18:03:25-05:00 g.liakhovetski@gmx.de +26 -153
#   tmscsim: no internal queue
# 
# drivers/scsi/scsiiom.c
#   2004/03/04 15:21:39-06:00 g.liakhovetski@gmx.de +0 -3
#   tmscsim: no internal queue
# 
# ChangeSet
#   2004/05/21 10:16:18-05:00 hch@lst.de 
#   [PATCH] fix assorted wd7000 warnings
#   
#    - needs linux/delay.h for udelay
#    - C doesn't allow taking addresses of register variables and gcc even
#      complains these days
# 
# drivers/scsi/wd7000.c
#   2004/05/19 12:46:14-05:00 hch@lst.de +4 -3
#   fix assorted wd7000 warnings
# 
# ChangeSet
#   2004/05/21 10:07:05-05:00 g.liakhovetski@gmx.de 
#   [PATCH] tmscsim: 64-bit cleanup
#   
#   Ok, here comes the first one. I chose this one because it fixes an actual
#   bug in the driver. This bug was (partially) introduced by myself when
#   porting to 2.6. Partly the reason was that I disliked using
#   function-like macros as lvalues:
#   
#   sg_dma_address(x) = ...
#   sg_dma_len(x) = ...
#   
#   [OT] wouldn't it be better to introduce some macros like
#   set_sg_dma_{address|len}(x, y)?
#   
#   A part of the original patch has already been merged (s/UINT/ULONG/), so,
#   the actual version is re-diffed against 2.6.6-bk6 and re-tested (on a
#   plain Pentium).
#   
#   Also updates the driver-version, printed on startup.
# 
# drivers/scsi/tmscsim.c
#   2004/04/13 17:50:05-05:00 g.liakhovetski@gmx.de +11 -7
#   tmscsim: 64-bit cleanup
# 
# drivers/scsi/scsiiom.c
#   2004/04/13 17:46:19-05:00 g.liakhovetski@gmx.de +7 -5
#   tmscsim: 64-bit cleanup
# 
# drivers/scsi/dc390.h
#   2004/04/13 17:50:26-05:00 g.liakhovetski@gmx.de +1 -1
#   tmscsim: 64-bit cleanup
# 
# ChangeSet
#   2004/05/20 19:01:34+02:00 marcel@holtmann.org 
#   [Bluetooth] Kill duplicate includes
#   
#   This patch removes the duplicate inclusion of linux/config.h in the
#   hci_uart driver.
#   
#   Patch from Arthur Othieno <a.othieno@bluewin.ch>
# 
# drivers/bluetooth/hci_ldisc.c
#   2004/05/20 18:57:49+02:00 marcel@holtmann.org +0 -1
#   Kill duplicate includes
# 
# drivers/bluetooth/hci_bcsp.c
#   2004/05/20 18:57:33+02:00 marcel@holtmann.org +0 -1
#   Kill duplicate includes
# 
# ChangeSet
#   2004/05/19 21:26:04-07:00 akepner@sgi.com 
#   [TG3]: Fix ethtool -S.
# 
# drivers/net/tg3.c
#   2004/05/19 21:25:43-07:00 akepner@sgi.com +1 -1
#   [TG3]: Fix ethtool -S.
# 
# ChangeSet
#   2004/05/19 21:16:59-07:00 gnb@melbourne.sgi.com 
#   [TG3]: Add more ethtool -S stats.
# 
# drivers/net/tg3.h
#   2004/05/19 21:16:34-07:00 gnb@melbourne.sgi.com +52 -0
#   [TG3]: Add more ethtool -S stats.
# 
# drivers/net/tg3.c
#   2004/05/19 21:16:34-07:00 gnb@melbourne.sgi.com +102 -2
#   [TG3]: Add more ethtool -S stats.
# 
# ChangeSet
#   2004/05/19 21:15:59-07:00 gnb@melbourne.sgi.com 
#   [TG3]: Count rx_discards in rx_errors.
# 
# drivers/net/tg3.c
#   2004/05/19 21:15:38-07:00 gnb@melbourne.sgi.com +2 -1
#   [TG3]: Count rx_discards in rx_errors.
# 
# ChangeSet
#   2004/05/19 21:02:13-07:00 davem@nuts.davemloft.net 
#   Merge bk://kernel.bkbits.net/jgarzik/tg3-2.6
#   into nuts.davemloft.net:/disk1/BK/tg3-2.6
# 
# drivers/net/tg3.c
#   2004/05/19 21:02:01-07:00 davem@nuts.davemloft.net +0 -0
#   Auto merged
# 
# ChangeSet
#   2004/05/19 11:12:20-05:00 jejb@mulgrave.(none) 
#   SCSI: fix Stack overflow when lldd returns SCSI_MLQUEUE_DEVICE_BUSY
#   
#   From: 	Heiko Carstens <Heiko.Carstens@de.ibm.com>
#   
#   This happened when sending out the inquiry command and the LLDD was in
#   recovery for the specific LUN and returned SCSI_MLQUEUE_DEVICE_BUSY.
#   Problem is that max_device_blocked gets set _after_ the inquiry command
#   finished. In this specific case max_device_blocked was 0 and thus the
#   device was never blocked resulting in the observed stack overflow.
#   I moved the initializazion of max_device_blocked from scsi_add_lun to
#   sdev_alloc_sdev and the problem is gone.
# 
# drivers/scsi/scsi_scan.c
#   2004/05/19 11:11:55-05:00 jejb@mulgrave.(none) +5 -4
#   SCSI: fix Stack overflow when lldd returns SCSI_MLQUEUE_DEVICE_BUSY
# 
# ChangeSet
#   2004/05/18 22:02:38+01:00 rmk@flint.arm.linux.org.uk 
#   [PCMCIA] Convert IO resource allocation to use struct resource.
#   
#   This causes PCMCIA to use struct resource internally for IO resources.
#   This means that we can keep track of the resource pointer, expand
#   this resource if necessary, and use release_resource() on it when
#   we're done.
#   
#   This eventually means that we can change these to normal resources
#   which aren't marked busy.
# 
# include/pcmcia/ss.h
#   2004/05/18 22:00:16+01:00 rmk@flint.arm.linux.org.uk +1 -0
#   Add struct resource to io_window_t.
# 
# drivers/pcmcia/rsrc_mgr.c
#   2004/05/18 22:00:16+01:00 rmk@flint.arm.linux.org.uk +32 -7
#   Add adjust_io_region to expand already allocated IO resources.
#   find_io_region now returns a struct resource.
# 
# drivers/pcmcia/cs_internal.h
#   2004/05/18 22:00:15+01:00 rmk@flint.arm.linux.org.uk +3 -1
#   Add and update function prototypes for find_io_region and
#   adjust_io_region.
# 
# drivers/pcmcia/cs.c
#   2004/05/18 22:00:15+01:00 rmk@flint.arm.linux.org.uk +13 -7
#   Use struct resource when manipulating IO regions.
# 
# ChangeSet
#   2004/05/18 21:52:46+01:00 rmk@flint.arm.linux.org.uk 
#   [PCMCIA] Fix a couple of resource bugs.
#   
#   Fix resource database bug where base + num wraps to zero.  Also,
#   ensure that we always take the resource semaphore whenever we
#   allocate a resource.
# 
# drivers/pcmcia/rsrc_mgr.c
#   2004/05/18 21:50:46+01:00 rmk@flint.arm.linux.org.uk +6 -10
#   Fix resource database bug where base + num wraps to zero.
#   Ensure that we always take the resource semaphore whenever we
#   allocate a resource.
# 
# ChangeSet
#   2004/05/18 13:50:23+02:00 perex@suse.cz 
#   ALSA CVS sync
# 
# include/sound/version.h
#   2004/05/18 13:50:09+02:00 perex@suse.cz +1 -1
#   ALSA CVS sync
# 
# ChangeSet
#   2004/05/17 15:35:07+02:00 perex@suse.cz 
#   ALSA CVS update - Jaroslav Kysela <perex@suse.cz>
#   PCM Midlevel
#   Call hwsync at the start of SYNC_PTR ioctl
# 
# sound/core/pcm_native.c
#   2004/05/17 01:58:42+02:00 perex@suse.cz +7 -5
#   ALSA CVS update
#   D:2004/05/17 07:58:42
#   C:PCM Midlevel
#   A:Jaroslav Kysela <perex@suse.cz>
#   F:core/pcm_native.c:1.89->1.90 
#   L:Call hwsync at the start of SYNC_PTR ioctl
# 
# ChangeSet
#   2004/05/17 15:34:43+02:00 perex@suse.cz 
#   ALSA CVS update - Jaroslav Kysela <perex@suse.cz>
#   PCM Midlevel,ALSA Core
#   Added SYNC_PTR ioctl for the PCM interface.
# 
# sound/core/pcm_native.c
#   2004/05/17 01:47:18+02:00 perex@suse.cz +33 -0
#   ALSA CVS update
#   D:2004/05/17 07:47:18
#   C:PCM Midlevel,ALSA Core
#   A:Jaroslav Kysela <perex@suse.cz>
#   F:core/pcm_native.c:1.88->1.89 
#   F:include/asound.h:1.38->1.39 
#   L:Added SYNC_PTR ioctl for the PCM interface.
# 
# include/sound/asound.h
#   2004/05/17 01:47:18+02:00 perex@suse.cz +16 -1
#   ALSA CVS update
#   D:2004/05/17 07:47:18
#   C:PCM Midlevel,ALSA Core
#   A:Jaroslav Kysela <perex@suse.cz>
#   F:core/pcm_native.c:1.88->1.89 
#   F:include/asound.h:1.38->1.39 
#   L:Added SYNC_PTR ioctl for the PCM interface.
# 
# ChangeSet
#   2004/05/17 15:34:22+02:00 perex@suse.cz 
#   ALSA CVS update - Jaroslav Kysela <perex@suse.cz>
#   ICE1712 driver
#   <Dirk.Kalis@t-online.de>
#   ice1712 patch for dsp24 value cards
#   Without this patch in envy24control no controls for DAC and ADC
#   available because no number of dacs and adcs is given.
# 
# sound/pci/ice1712/hoontech.h
#   2004/05/16 08:40:00+02:00 perex@suse.cz +7 -0
#   ALSA CVS update
#   D:2004/05/16 14:40:00
#   C:ICE1712 driver
#   A:Jaroslav Kysela <perex@suse.cz>
#   F:pci/ice1712/hoontech.c:1.6->1.7 
#   F:pci/ice1712/hoontech.h:1.4->1.5 
#   L:<Dirk.Kalis@t-online.de>
#   L:ice1712 patch for dsp24 value cards
#   L:Without this patch in envy24control no controls for DAC and ADC
#   L:available because no number of dacs and adcs is given.
# 
# sound/pci/ice1712/hoontech.c
#   2004/05/16 08:40:00+02:00 perex@suse.cz +73 -0
#   ALSA CVS update
#   D:2004/05/16 14:40:00
#   C:ICE1712 driver
#   A:Jaroslav Kysela <perex@suse.cz>
#   F:pci/ice1712/hoontech.c:1.6->1.7 
#   F:pci/ice1712/hoontech.h:1.4->1.5 
#   L:<Dirk.Kalis@t-online.de>
#   L:ice1712 patch for dsp24 value cards
#   L:Without this patch in envy24control no controls for DAC and ADC
#   L:available because no number of dacs and adcs is given.
# 
# ChangeSet
#   2004/05/17 15:33:58+02:00 perex@suse.cz 
#   ALSA CVS update - Takashi Iwai <tiwai@suse.de>
#   ICE1712 driver
#   fixes by Christoph Haderer <chris_web@gmx.at>:
#   - added the support of DAC/ADC mute switches
#   - fixed the capture route enum.
# 
# sound/pci/ice1712/aureon.c
#   2004/05/14 08:08:15+02:00 perex@suse.cz +109 -14
#   ALSA CVS update
#   D:2004/05/14 14:08:15
#   C:ICE1712 driver
#   A:Takashi Iwai <tiwai@suse.de>
#   F:pci/ice1712/aureon.c:1.8->1.9 
#   L:fixes by Christoph Haderer <chris_web@gmx.at>:
#   L:- added the support of DAC/ADC mute switches
#   L:- fixed the capture route enum.
# 
# ChangeSet
#   2004/05/17 15:33:36+02:00 perex@suse.cz 
#   ALSA CVS update - Takashi Iwai <tiwai@suse.de>
#   ICE1712 driver
#   Added the support of Aureon 7.1-Universe.
# 
# sound/pci/ice1712/aureon.h
#   2004/05/14 06:00:24+02:00 perex@suse.cz +3 -1
#   ALSA CVS update
#   D:2004/05/14 12:00:23
#   C:ICE1712 driver
#   A:Takashi Iwai <tiwai@suse.de>
#   F:pci/ice1712/aureon.c:1.7->1.8 
#   F:pci/ice1712/aureon.h:1.2->1.3 
#   L:Added the support of Aureon 7.1-Universe.
# 
# sound/pci/ice1712/aureon.c
#   2004/05/14 06:00:23+02:00 perex@suse.cz +8 -0
#   ALSA CVS update
#   D:2004/05/14 12:00:23
#   C:ICE1712 driver
#   A:Takashi Iwai <tiwai@suse.de>
#   F:pci/ice1712/aureon.c:1.7->1.8 
#   F:pci/ice1712/aureon.h:1.2->1.3 
#   L:Added the support of Aureon 7.1-Universe.
# 
# ChangeSet
#   2004/05/17 15:33:15+02:00 perex@suse.cz 
#   ALSA CVS update - Takashi Iwai <tiwai@suse.de>
#   ICE1712 driver
#   added headphone amplifier switch.
#   initial patch by Radoslaw 'AstralStorm' Szkodzinski.
# 
# sound/pci/ice1712/aureon.c
#   2004/05/14 05:49:26+02:00 perex@suse.cz +58 -0
#   ALSA CVS update
#   D:2004/05/14 11:49:26
#   C:ICE1712 driver
#   A:Takashi Iwai <tiwai@suse.de>
#   F:pci/ice1712/aureon.c:1.6->1.7 
#   L:added headphone amplifier switch.
#   L:initial patch by Radoslaw 'AstralStorm' Szkodzinski.
# 
# ChangeSet
#   2004/05/17 15:32:48+02:00 perex@suse.cz 
#   ALSA CVS update - Takashi Iwai <tiwai@suse.de>
#   RME HDSP driver,RME9652 driver
#   fixed invalid spin_lock/unlock_irq() in the prepare callback.
# 
# sound/pci/rme9652/rme9652.c
#   2004/05/14 05:31:00+02:00 perex@suse.cz +2 -2
#   ALSA CVS update
#   D:2004/05/14 11:30:59
#   C:RME HDSP driver,RME9652 driver
#   A:Takashi Iwai <tiwai@suse.de>
#   F:pci/rme9652/hdsp.c:1.57->1.58 
#   F:pci/rme9652/rme9652.c:1.44->1.45 
#   L:fixed invalid spin_lock/unlock_irq() in the prepare callback.
# 
# sound/pci/rme9652/hdsp.c
#   2004/05/14 05:30:59+02:00 perex@suse.cz +2 -2
#   ALSA CVS update
#   D:2004/05/14 11:30:59
#   C:RME HDSP driver,RME9652 driver
#   A:Takashi Iwai <tiwai@suse.de>
#   F:pci/rme9652/hdsp.c:1.57->1.58 
#   F:pci/rme9652/rme9652.c:1.44->1.45 
#   L:fixed invalid spin_lock/unlock_irq() in the prepare callback.
# 
# ChangeSet
#   2004/05/17 15:32:27+02:00 perex@suse.cz 
#   ALSA CVS update - Takashi Iwai <tiwai@suse.de>
#   CS4236+ driver
#   Added the new pnp id for an Intel mobo.
# 
# sound/isa/cs423x/cs4236.c
#   2004/05/14 05:15:54+02:00 perex@suse.cz +2 -0
#   ALSA CVS update
#   D:2004/05/14 11:15:54
#   C:CS4236+ driver
#   A:Takashi Iwai <tiwai@suse.de>
#   F:isa/cs423x/cs4236.c:1.42->1.43 
#   L:Added the new pnp id for an Intel mobo.
# 
# ChangeSet
#   2004/05/17 15:32:03+02:00 perex@suse.cz 
#   ALSA CVS update - Takashi Iwai <tiwai@suse.de>
#   ATIIXP driver
#   - probe only audio codecs.
#   - use enums instead of embedded numbers.
#   - added KERN_ERR prefix to the error messages.
# 
# sound/pci/atiixp.c
#   2004/05/13 13:40:18+02:00 perex@suse.cz +36 -26
#   ALSA CVS update
#   D:2004/05/13 19:40:18
#   C:ATIIXP driver
#   A:Takashi Iwai <tiwai@suse.de>
#   F:pci/atiixp.c:1.8->1.9 
#   L:- probe only audio codecs.
#   L:- use enums instead of embedded numbers.
#   L:- added KERN_ERR prefix to the error messages.
# 
# ChangeSet
#   2004/05/17 15:31:38+02:00 perex@suse.cz 
#   ALSA CVS update - Takashi Iwai <tiwai@suse.de>
#   PPC PMAC driver,PPC Tumbler driver
#   Giuliano Pochini <pochini@shiny.it>:
#   fixed the return value of interrupt handlers.
# 
# sound/ppc/tumbler.c
#   2004/05/13 13:38:56+02:00 perex@suse.cz +1 -1
#   ALSA CVS update
#   D:2004/05/13 19:38:56
#   C:PPC PMAC driver,PPC Tumbler driver
#   A:Takashi Iwai <tiwai@suse.de>
#   F:ppc/pmac.c:1.29->1.30 
#   F:ppc/tumbler.c:1.30->1.31 
#   L:Giuliano Pochini <pochini@shiny.it>:
#   L:fixed the return value of interrupt handlers.
# 
# sound/ppc/pmac.c
#   2004/05/13 13:38:56+02:00 perex@suse.cz +3 -3
#   ALSA CVS update
#   D:2004/05/13 19:38:56
#   C:PPC PMAC driver,PPC Tumbler driver
#   A:Takashi Iwai <tiwai@suse.de>
#   F:ppc/pmac.c:1.29->1.30 
#   F:ppc/tumbler.c:1.30->1.31 
#   L:Giuliano Pochini <pochini@shiny.it>:
#   L:fixed the return value of interrupt handlers.
# 
# ChangeSet
#   2004/05/17 15:31:16+02:00 perex@suse.cz 
#   ALSA CVS update - Takashi Iwai <tiwai@suse.de>
#   PCM Midlevel
#   fixed the buffer id confliction in the case of CONTINUOUS or ISA buffers.
# 
# sound/core/pcm_memory.c
#   2004/05/13 13:37:10+02:00 perex@suse.cz +5 -1
#   ALSA CVS update
#   D:2004/05/13 19:37:10
#   C:PCM Midlevel
#   A:Takashi Iwai <tiwai@suse.de>
#   F:core/pcm_memory.c:1.26->1.27 
#   L:fixed the buffer id confliction in the case of CONTINUOUS or ISA buffers.
# 
# ChangeSet
#   2004/05/17 15:30:56+02:00 perex@suse.cz 
#   ALSA CVS update - Clemens Ladisch <clemens@ladisch.de>
#   USB generic driver
#   fix typo
# 
# sound/usb/usbquirks.h
#   2004/05/12 01:29:22+02:00 perex@suse.cz +1 -0
#   ALSA CVS update
#   D:2004/05/12 07:29:22
#   C:USB generic driver
#   A:Clemens Ladisch <clemens@ladisch.de>
#   F:usb/usbquirks.h:1.32->1.33 
#   L:fix typo
# 
# ChangeSet
#   2004/05/17 15:30:31+02:00 perex@suse.cz 
#   ALSA CVS update - Clemens Ladisch <clemens@ladisch.de>
#   USB generic driver
#   Roland UA-1000 support
# 
# sound/usb/usbquirks.h
#   2004/05/11 06:58:11+02:00 perex@suse.cz +55 -0
#   ALSA CVS update
#   D:2004/05/11 12:58:11
#   C:USB generic driver
#   A:Clemens Ladisch <clemens@ladisch.de>
#   F:usb/usbquirks.h:1.31->1.32 
#   L:Roland UA-1000 support
# 
# ChangeSet
#   2004/05/17 15:30:09+02:00 perex@suse.cz 
#   ALSA CVS update - Clemens Ladisch <clemens@ladisch.de>
#   AC97 Codec Core
#   STAC9758: stereo mutes, jack configuration
# 
# sound/pci/ac97/ac97_patch.c
#   2004/05/11 03:32:58+02:00 perex@suse.cz +162 -3
#   ALSA CVS update
#   D:2004/05/11 09:32:58
#   C:AC97 Codec Core
#   A:Clemens Ladisch <clemens@ladisch.de>
#   F:pci/ac97/ac97_patch.c:1.48->1.49 
#   L:STAC9758: stereo mutes, jack configuration
# 
# ChangeSet
#   2004/05/17 15:29:43+02:00 perex@suse.cz 
#   ALSA CVS update - Takashi Iwai <tiwai@suse.de>
#   PARISC Harmony driver
#   - fixed the buffer allocation with the new API.
#   - optimized the rate and format setting.
#   - removed redundant call of buffer release.
#   - removed invalid __devinit prefix.
# 
# sound/parisc/harmony.c
#   2004/05/07 12:04:31+02:00 perex@suse.cz +76 -99
#   ALSA CVS update
#   D:2004/05/07 18:04:31
#   C:PARISC Harmony driver
#   A:Takashi Iwai <tiwai@suse.de>
#   F:parisc/harmony.c:1.9->1.10 
#   L:- fixed the buffer allocation with the new API.
#   L:- optimized the rate and format setting.
#   L:- removed redundant call of buffer release.
#   L:- removed invalid __devinit prefix.
# 
# ChangeSet
#   2004/05/17 15:29:19+02:00 perex@suse.cz 
#   ALSA CVS update - Takashi Iwai <tiwai@suse.de>
#   Documentation,ICE1724 driver,ICE1712 driver
#   - added model module option to specify board model to snd-ice1712 and snd-ice1724
#     drivers.
#   - removed ez8 option from ice1724.  this can be specified as 'model=ez8' option.
#   - rewritten some struct init in C99 style.
#   - function for accessing i2c of ice1724 (for future use).
# 
# sound/pci/ice1712/revo.c
#   2004/05/07 05:19:00+02:00 perex@suse.cz +5 -4
#   ALSA CVS update
#   D:2004/05/07 11:18:59
#   C:Documentation,ICE1724 driver,ICE1712 driver
#   A:Takashi Iwai <tiwai@suse.de>
#   F:Documentation/ALSA-Configuration.txt:1.43->1.44 
#   F:pci/ice1712/amp.c:1.4->1.5 
#   F:pci/ice1712/aureon.c:1.5->1.6 
#   F:pci/ice1712/delta.c:1.16->1.17 
#   F:pci/ice1712/envy24ht.h:1.3->1.4 
#   F:pci/ice1712/ews.c:1.16->1.17 
#   F:pci/ice1712/hoontech.c:1.5->1.6 
#   F:pci/ice1712/hoontech.h:1.3->1.4 
#   F:pci/ice1712/ice1712.c:1.51->1.52 
#   F:pci/ice1712/ice1712.h:1.19->1.20 
#   F:pci/ice1712/ice1724.c:1.29->1.30 
#   F:pci/ice1712/prodigy.c:1.4->1.5 
#   F:pci/ice1712/revo.c:1.5->1.6 
#   L:- added model module option to specify board model to snd-ice1712 and snd-ice1724
#   L:  drivers.
#   L:- removed ez8 option from ice1724.  this can be specified as 'model=ez8' option.
#   L:- rewritten some struct init in C99 style.
#   L:- function for accessing i2c of ice1724 (for future use).
# 
# sound/pci/ice1712/prodigy.c
#   2004/05/07 05:19:00+02:00 perex@suse.cz +1 -0
#   ALSA CVS update
#   D:2004/05/07 11:18:59
#   C:Documentation,ICE1724 driver,ICE1712 driver
#   A:Takashi Iwai <tiwai@suse.de>
#   F:Documentation/ALSA-Configuration.txt:1.43->1.44 
#   F:pci/ice1712/amp.c:1.4->1.5 
#   F:pci/ice1712/aureon.c:1.5->1.6 
#   F:pci/ice1712/delta.c:1.16->1.17 
#   F:pci/ice1712/envy24ht.h:1.3->1.4 
#   F:pci/ice1712/ews.c:1.16->1.17 
#   F:pci/ice1712/hoontech.c:1.5->1.6 
#   F:pci/ice1712/hoontech.h:1.3->1.4 
#   F:pci/ice1712/ice1712.c:1.51->1.52 
#   F:pci/ice1712/ice1712.h:1.19->1.20 
#   F:pci/ice1712/ice1724.c:1.29->1.30 
#   F:pci/ice1712/prodigy.c:1.4->1.5 
#   F:pci/ice1712/revo.c:1.5->1.6 
#   L:- added model module option to specify board model to snd-ice1712 and snd-ice1724
#   L:  drivers.
#   L:- removed ez8 option from ice1724.  this can be specified as 'model=ez8' option.
#   L:- rewritten some struct init in C99 style.
#   L:- function for accessing i2c of ice1724 (for future use).
# 
# sound/pci/ice1712/ice1724.c
#   2004/05/07 05:19:00+02:00 perex@suse.cz +38 -24
#   ALSA CVS update
#   D:2004/05/07 11:18:59
#   C:Documentation,ICE1724 driver,ICE1712 driver
#   A:Takashi Iwai <tiwai@suse.de>
#   F:Documentation/ALSA-Configuration.txt:1.43->1.44 
#   F:pci/ice1712/amp.c:1.4->1.5 
#   F:pci/ice1712/aureon.c:1.5->1.6 
#   F:pci/ice1712/delta.c:1.16->1.17 
#   F:pci/ice1712/envy24ht.h:1.3->1.4 
#   F:pci/ice1712/ews.c:1.16->1.17 
#   F:pci/ice1712/hoontech.c:1.5->1.6 
#   F:pci/ice1712/hoontech.h:1.3->1.4 
#   F:pci/ice1712/ice1712.c:1.51->1.52 
#   F:pci/ice1712/ice1712.h:1.19->1.20 
#   F:pci/ice1712/ice1724.c:1.29->1.30 
#   F:pci/ice1712/prodigy.c:1.4->1.5 
#   F:pci/ice1712/revo.c:1.5->1.6 
#   L:- added model module option to specify board model to snd-ice1712 and snd-ice1724
#   L:  drivers.
#   L:- removed ez8 option from ice1724.  this can be specified as 'model=ez8' option.
#   L:- rewritten some struct init in C99 style.
#   L:- function for accessing i2c of ice1724 (for future use).
# 
# sound/pci/ice1712/ice1712.h
#   2004/05/07 05:19:00+02:00 perex@suse.cz +1 -1
#   ALSA CVS update
#   D:2004/05/07 11:18:59
#   C:Documentation,ICE1724 driver,ICE1712 driver
#   A:Takashi Iwai <tiwai@suse.de>
#   F:Documentation/ALSA-Configuration.txt:1.43->1.44 
#   F:pci/ice1712/amp.c:1.4->1.5 
#   F:pci/ice1712/aureon.c:1.5->1.6 
#   F:pci/ice1712/delta.c:1.16->1.17 
#   F:pci/ice1712/envy24ht.h:1.3->1.4 
#   F:pci/ice1712/ews.c:1.16->1.17 
#   F:pci/ice1712/hoontech.c:1.5->1.6 
#   F:pci/ice1712/hoontech.h:1.3->1.4 
#   F:pci/ice1712/ice1712.c:1.51->1.52 
#   F:pci/ice1712/ice1712.h:1.19->1.20 
#   F:pci/ice1712/ice1724.c:1.29->1.30 
#   F:pci/ice1712/prodigy.c:1.4->1.5 
#   F:pci/ice1712/revo.c:1.5->1.6 
#   L:- added model module option to specify board model to snd-ice1712 and snd-ice1724
#   L:  drivers.
#   L:- removed ez8 option from ice1724.  this can be specified as 'model=ez8' option.
#   L:- rewritten some struct init in C99 style.
#   L:- function for accessing i2c of ice1724 (for future use).
# 
# sound/pci/ice1712/ice1712.c
#   2004/05/07 05:18:59+02:00 perex@suse.cz +34 -21
#   ALSA CVS update
#   D:2004/05/07 11:18:59
#   C:Documentation,ICE1724 driver,ICE1712 driver
#   A:Takashi Iwai <tiwai@suse.de>
#   F:Documentation/ALSA-Configuration.txt:1.43->1.44 
#   F:pci/ice1712/amp.c:1.4->1.5 
#   F:pci/ice1712/aureon.c:1.5->1.6 
#   F:pci/ice1712/delta.c:1.16->1.17 
#   F:pci/ice1712/envy24ht.h:1.3->1.4 
#   F:pci/ice1712/ews.c:1.16->1.17 
#   F:pci/ice1712/hoontech.c:1.5->1.6 
#   F:pci/ice1712/hoontech.h:1.3->1.4 
#   F:pci/ice1712/ice1712.c:1.51->1.52 
#   F:pci/ice1712/ice1712.h:1.19->1.20 
#   F:pci/ice1712/ice1724.c:1.29->1.30 
#   F:pci/ice1712/prodigy.c:1.4->1.5 
#   F:pci/ice1712/revo.c:1.5->1.6 
#   L:- added model module option to specify board model to snd-ice1712 and snd-ice1724
#   L:  drivers.
#   L:- removed ez8 option from ice1724.  this can be specified as 'model=ez8' option.
#   L:- rewritten some struct init in C99 style.
#   L:- function for accessing i2c of ice1724 (for future use).
# 
# sound/pci/ice1712/hoontech.h
#   2004/05/07 05:18:59+02:00 perex@suse.cz +5 -3
#   ALSA CVS update
#   D:2004/05/07 11:18:59
#   C:Documentation,ICE1724 driver,ICE1712 driver
#   A:Takashi Iwai <tiwai@suse.de>
#   F:Documentation/ALSA-Configuration.txt:1.43->1.44 
#   F:pci/ice1712/amp.c:1.4->1.5 
#   F:pci/ice1712/aureon.c:1.5->1.6 
#   F:pci/ice1712/delta.c:1.16->1.17 
#   F:pci/ice1712/envy24ht.h:1.3->1.4 
#   F:pci/ice1712/ews.c:1.16->1.17 
#   F:pci/ice1712/hoontech.c:1.5->1.6 
#   F:pci/ice1712/hoontech.h:1.3->1.4 
#   F:pci/ice1712/ice1712.c:1.51->1.52 
#   F:pci/ice1712/ice1712.h:1.19->1.20 
#   F:pci/ice1712/ice1724.c:1.29->1.30 
#   F:pci/ice1712/prodigy.c:1.4->1.5 
#   F:pci/ice1712/revo.c:1.5->1.6 
#   L:- added model module option to specify board model to snd-ice1712 and snd-ice1724
#   L:  drivers.
#   L:- removed ez8 option from ice1724.  this can be specified as 'model=ez8' option.
#   L:- rewritten some struct init in C99 style.
#   L:- function for accessing i2c of ice1724 (for future use).
# 
# sound/pci/ice1712/hoontech.c
#   2004/05/07 05:18:59+02:00 perex@suse.cz +25 -20
#   ALSA CVS update
#   D:2004/05/07 11:18:59
#   C:Documentation,ICE1724 driver,ICE1712 driver
#   A:Takashi Iwai <tiwai@suse.de>
#   F:Documentation/ALSA-Configuration.txt:1.43->1.44 
#   F:pci/ice1712/amp.c:1.4->1.5 
#   F:pci/ice1712/aureon.c:1.5->1.6 
#   F:pci/ice1712/delta.c:1.16->1.17 
#   F:pci/ice1712/envy24ht.h:1.3->1.4 
#   F:pci/ice1712/ews.c:1.16->1.17 
#   F:pci/ice1712/hoontech.c:1.5->1.6 
#   F:pci/ice1712/hoontech.h:1.3->1.4 
#   F:pci/ice1712/ice1712.c:1.51->1.52 
#   F:pci/ice1712/ice1712.h:1.19->1.20 
#   F:pci/ice1712/ice1724.c:1.29->1.30 
#   F:pci/ice1712/prodigy.c:1.4->1.5 
#   F:pci/ice1712/revo.c:1.5->1.6 
#   L:- added model module option to specify board model to snd-ice1712 and snd-ice1724
#   L:  drivers.
#   L:- removed ez8 option from ice1724.  this can be specified as 'model=ez8' option.
#   L:- rewritten some struct init in C99 style.
#   L:- function for accessing i2c of ice1724 (for future use).
# 
# sound/pci/ice1712/ews.c
#   2004/05/07 05:18:59+02:00 perex@suse.cz +25 -20
#   ALSA CVS update
#   D:2004/05/07 11:18:59
#   C:Documentation,ICE1724 driver,ICE1712 driver
#   A:Takashi Iwai <tiwai@suse.de>
#   F:Documentation/ALSA-Configuration.txt:1.43->1.44 
#   F:pci/ice1712/amp.c:1.4->1.5 
#   F:pci/ice1712/aureon.c:1.5->1.6 
#   F:pci/ice1712/delta.c:1.16->1.17 
#   F:pci/ice1712/envy24ht.h:1.3->1.4 
#   F:pci/ice1712/ews.c:1.16->1.17 
#   F:pci/ice1712/hoontech.c:1.5->1.6 
#   F:pci/ice1712/hoontech.h:1.3->1.4 
#   F:pci/ice1712/ice1712.c:1.51->1.52 
#   F:pci/ice1712/ice1712.h:1.19->1.20 
#   F:pci/ice1712/ice1724.c:1.29->1.30 
#   F:pci/ice1712/prodigy.c:1.4->1.5 
#   F:pci/ice1712/revo.c:1.5->1.6 
#   L:- added model module option to specify board model to snd-ice1712 and snd-ice1724
#   L:  drivers.
#   L:- removed ez8 option from ice1724.  this can be specified as 'model=ez8' option.
#   L:- rewritten some struct init in C99 style.
#   L:- function for accessing i2c of ice1724 (for future use).
# 
# sound/pci/ice1712/envy24ht.h
#   2004/05/07 05:18:59+02:00 perex@suse.cz +3 -0
#   ALSA CVS update
#   D:2004/05/07 11:18:59
#   C:Documentation,ICE1724 driver,ICE1712 driver
#   A:Takashi Iwai <tiwai@suse.de>
#   F:Documentation/ALSA-Configuration.txt:1.43->1.44 
#   F:pci/ice1712/amp.c:1.4->1.5 
#   F:pci/ice1712/aureon.c:1.5->1.6 
#   F:pci/ice1712/delta.c:1.16->1.17 
#   F:pci/ice1712/envy24ht.h:1.3->1.4 
#   F:pci/ice1712/ews.c:1.16->1.17 
#   F:pci/ice1712/hoontech.c:1.5->1.6 
#   F:pci/ice1712/hoontech.h:1.3->1.4 
#   F:pci/ice1712/ice1712.c:1.51->1.52 
#   F:pci/ice1712/ice1712.h:1.19->1.20 
#   F:pci/ice1712/ice1724.c:1.29->1.30 
#   F:pci/ice1712/prodigy.c:1.4->1.5 
#   F:pci/ice1712/revo.c:1.5->1.6 
#   L:- added model module option to specify board model to snd-ice1712 and snd-ice1724
#   L:  drivers.
#   L:- removed ez8 option from ice1724.  this can be specified as 'model=ez8' option.
#   L:- rewritten some struct init in C99 style.
#   L:- function for accessing i2c of ice1724 (for future use).
# 
# sound/pci/ice1712/delta.c
#   2004/05/07 05:18:59+02:00 perex@suse.cz +58 -50
#   ALSA CVS update
#   D:2004/05/07 11:18:59
#   C:Documentation,ICE1724 driver,ICE1712 driver
#   A:Takashi Iwai <tiwai@suse.de>
#   F:Documentation/ALSA-Configuration.txt:1.43->1.44 
#   F:pci/ice1712/amp.c:1.4->1.5 
#   F:pci/ice1712/aureon.c:1.5->1.6 
#   F:pci/ice1712/delta.c:1.16->1.17 
#   F:pci/ice1712/envy24ht.h:1.3->1.4 
#   F:pci/ice1712/ews.c:1.16->1.17 
#   F:pci/ice1712/hoontech.c:1.5->1.6 
#   F:pci/ice1712/hoontech.h:1.3->1.4 
#   F:pci/ice1712/ice1712.c:1.51->1.52 
#   F:pci/ice1712/ice1712.h:1.19->1.20 
#   F:pci/ice1712/ice1724.c:1.29->1.30 
#   F:pci/ice1712/prodigy.c:1.4->1.5 
#   F:pci/ice1712/revo.c:1.5->1.6 
#   L:- added model module option to specify board model to snd-ice1712 and snd-ice1724
#   L:  drivers.
#   L:- removed ez8 option from ice1724.  this can be specified as 'model=ez8' option.
#   L:- rewritten some struct init in C99 style.
#   L:- function for accessing i2c of ice1724 (for future use).
# 
# sound/pci/ice1712/aureon.c
#   2004/05/07 05:18:59+02:00 perex@suse.cz +2 -0
#   ALSA CVS update
#   D:2004/05/07 11:18:59
#   C:Documentation,ICE1724 driver,ICE1712 driver
#   A:Takashi Iwai <tiwai@suse.de>
#   F:Documentation/ALSA-Configuration.txt:1.43->1.44 
#   F:pci/ice1712/amp.c:1.4->1.5 
#   F:pci/ice1712/aureon.c:1.5->1.6 
#   F:pci/ice1712/delta.c:1.16->1.17 
#   F:pci/ice1712/envy24ht.h:1.3->1.4 
#   F:pci/ice1712/ews.c:1.16->1.17 
#   F:pci/ice1712/hoontech.c:1.5->1.6 
#   F:pci/ice1712/hoontech.h:1.3->1.4 
#   F:pci/ice1712/ice1712.c:1.51->1.52 
#   F:pci/ice1712/ice1712.h:1.19->1.20 
#   F:pci/ice1712/ice1724.c:1.29->1.30 
#   F:pci/ice1712/prodigy.c:1.4->1.5 
#   F:pci/ice1712/revo.c:1.5->1.6 
#   L:- added model module option to specify board model to snd-ice1712 and snd-ice1724
#   L:  drivers.
#   L:- removed ez8 option from ice1724.  this can be specified as 'model=ez8' option.
#   L:- rewritten some struct init in C99 style.
#   L:- function for accessing i2c of ice1724 (for future use).
# 
# sound/pci/ice1712/amp.c
#   2004/05/07 05:18:59+02:00 perex@suse.cz +5 -4
#   ALSA CVS update
#   D:2004/05/07 11:18:59
#   C:Documentation,ICE1724 driver,ICE1712 driver
#   A:Takashi Iwai <tiwai@suse.de>
#   F:Documentation/ALSA-Configuration.txt:1.43->1.44 
#   F:pci/ice1712/amp.c:1.4->1.5 
#   F:pci/ice1712/aureon.c:1.5->1.6 
#   F:pci/ice1712/delta.c:1.16->1.17 
#   F:pci/ice1712/envy24ht.h:1.3->1.4 
#   F:pci/ice1712/ews.c:1.16->1.17 
#   F:pci/ice1712/hoontech.c:1.5->1.6 
#   F:pci/ice1712/hoontech.h:1.3->1.4 
#   F:pci/ice1712/ice1712.c:1.51->1.52 
#   F:pci/ice1712/ice1712.h:1.19->1.20 
#   F:pci/ice1712/ice1724.c:1.29->1.30 
#   F:pci/ice1712/prodigy.c:1.4->1.5 
#   F:pci/ice1712/revo.c:1.5->1.6 
#   L:- added model module option to specify board model to snd-ice1712 and snd-ice1724
#   L:  drivers.
#   L:- removed ez8 option from ice1724.  this can be specified as 'model=ez8' option.
#   L:- rewritten some struct init in C99 style.
#   L:- function for accessing i2c of ice1724 (for future use).
# 
# Documentation/sound/alsa/ALSA-Configuration.txt
#   2004/05/07 05:18:59+02:00 perex@suse.cz +7 -0
#   ALSA CVS update
#   D:2004/05/07 11:18:59
#   C:Documentation,ICE1724 driver,ICE1712 driver
#   A:Takashi Iwai <tiwai@suse.de>
#   F:Documentation/ALSA-Configuration.txt:1.43->1.44 
#   F:pci/ice1712/amp.c:1.4->1.5 
#   F:pci/ice1712/aureon.c:1.5->1.6 
#   F:pci/ice1712/delta.c:1.16->1.17 
#   F:pci/ice1712/envy24ht.h:1.3->1.4 
#   F:pci/ice1712/ews.c:1.16->1.17 
#   F:pci/ice1712/hoontech.c:1.5->1.6 
#   F:pci/ice1712/hoontech.h:1.3->1.4 
#   F:pci/ice1712/ice1712.c:1.51->1.52 
#   F:pci/ice1712/ice1712.h:1.19->1.20 
#   F:pci/ice1712/ice1724.c:1.29->1.30 
#   F:pci/ice1712/prodigy.c:1.4->1.5 
#   F:pci/ice1712/revo.c:1.5->1.6 
#   L:- added model module option to specify board model to snd-ice1712 and snd-ice1724
#   L:  drivers.
#   L:- removed ez8 option from ice1724.  this can be specified as 'model=ez8' option.
#   L:- rewritten some struct init in C99 style.
#   L:- function for accessing i2c of ice1724 (for future use).
# 
# ChangeSet
#   2004/05/17 15:28:56+02:00 perex@suse.cz 
#   ALSA CVS update - Takashi Iwai <tiwai@suse.de>
#   Sound Core PDAudioCF driver
#   - fixed the changed function decleration.
#   - fixed the return value from cast check.
# 
# sound/pcmcia/pdaudiocf/pdaudiocf_irq.c
#   2004/05/07 05:10:26+02:00 perex@suse.cz +1 -1
#   ALSA CVS update
#   D:2004/05/07 11:10:26
#   C:Sound Core PDAudioCF driver
#   A:Takashi Iwai <tiwai@suse.de>
#   F:pcmcia/pdaudiocf/pdaudiocf.h:1.5->1.6 
#   F:pcmcia/pdaudiocf/pdaudiocf_irq.c:1.4->1.5 
#   L:- fixed the changed function decleration.
#   L:- fixed the return value from cast check.
# 
# sound/pcmcia/pdaudiocf/pdaudiocf.h
#   2004/05/07 05:10:26+02:00 perex@suse.cz +1 -1
#   ALSA CVS update
#   D:2004/05/07 11:10:26
#   C:Sound Core PDAudioCF driver
#   A:Takashi Iwai <tiwai@suse.de>
#   F:pcmcia/pdaudiocf/pdaudiocf.h:1.5->1.6 
#   F:pcmcia/pdaudiocf/pdaudiocf_irq.c:1.4->1.5 
#   L:- fixed the changed function decleration.
#   L:- fixed the return value from cast check.
# 
# ChangeSet
#   2004/05/17 15:28:36+02:00 perex@suse.cz 
#   ALSA CVS update - Takashi Iwai <tiwai@suse.de>
#   VIA82xx driver
#   renamed the elements of 'input source select' control to avoid confusion.
#   
#   formerly used words 'Line' and 'Mic', which have nothing to do with
#   the actual connections.
# 
# sound/pci/via82xx.c
#   2004/05/06 08:27:23+02:00 perex@suse.cz +4 -1
#   ALSA CVS update
#   D:2004/05/06 14:27:23
#   C:VIA82xx driver
#   A:Takashi Iwai <tiwai@suse.de>
#   F:pci/via82xx.c:1.99->1.100 
#   L:renamed the elements of 'input source select' control to avoid confusion.
#   L:
#   L:formerly used words 'Line' and 'Mic', which have nothing to do with
#   L:the actual connections.
# 
# ChangeSet
#   2004/05/17 15:28:08+02:00 perex@suse.cz 
#   ALSA CVS update - Takashi Iwai <tiwai@suse.de>
#   Documentation,CMIPCI driver
#   make soft_ac3 option conditional again.
#   
#   this will make it possible for old chips to feed the IEC958 data
#   without conversion (sometimes useful, e.g. for apps using mmap).
# 
# sound/pci/cmipci.c
#   2004/05/06 08:17:02+02:00 perex@suse.cz +10 -4
#   ALSA CVS update
#   D:2004/05/06 14:17:02
#   C:Documentation,CMIPCI driver
#   A:Takashi Iwai <tiwai@suse.de>
#   F:Documentation/ALSA-Configuration.txt:1.42->1.43 
#   F:Documentation/CMIPCI.txt:1.5->1.6 
#   F:pci/cmipci.c:1.64->1.65 
#   L:make soft_ac3 option conditional again.
#   L:
#   L:this will make it possible for old chips to feed the IEC958 data
#   L:without conversion (sometimes useful, e.g. for apps using mmap).
# 
# Documentation/sound/alsa/CMIPCI.txt
#   2004/05/06 08:17:02+02:00 perex@suse.cz +2 -2
#   ALSA CVS update
#   D:2004/05/06 14:17:02
#   C:Documentation,CMIPCI driver
#   A:Takashi Iwai <tiwai@suse.de>
#   F:Documentation/ALSA-Configuration.txt:1.42->1.43 
#   F:Documentation/CMIPCI.txt:1.5->1.6 
#   F:pci/cmipci.c:1.64->1.65 
#   L:make soft_ac3 option conditional again.
#   L:
#   L:this will make it possible for old chips to feed the IEC958 data
#   L:without conversion (sometimes useful, e.g. for apps using mmap).
# 
# Documentation/sound/alsa/ALSA-Configuration.txt
#   2004/05/06 08:17:02+02:00 perex@suse.cz +2 -1
#   ALSA CVS update
#   D:2004/05/06 14:17:02
#   C:Documentation,CMIPCI driver
#   A:Takashi Iwai <tiwai@suse.de>
#   F:Documentation/ALSA-Configuration.txt:1.42->1.43 
#   F:Documentation/CMIPCI.txt:1.5->1.6 
#   F:pci/cmipci.c:1.64->1.65 
#   L:make soft_ac3 option conditional again.
#   L:
#   L:this will make it possible for old chips to feed the IEC958 data
#   L:without conversion (sometimes useful, e.g. for apps using mmap).
# 
# ChangeSet
#   2004/05/17 15:27:42+02:00 perex@suse.cz 
#   ALSA CVS update - Jaroslav Kysela <perex@suse.cz>
#   Sound Core PDAudioCF driver
#   Updated interrupt function to 2.6 irq API
# 
# sound/pcmcia/pdaudiocf/pdaudiocf_irq.c
#   2004/05/05 08:29:56+02:00 perex@suse.cz +3 -2
#   ALSA CVS update
#   D:2004/05/05 14:29:56
#   C:Sound Core PDAudioCF driver
#   A:Jaroslav Kysela <perex@suse.cz>
#   F:pcmcia/pdaudiocf/pdaudiocf_irq.c:1.3->1.4 
#   L:Updated interrupt function to 2.6 irq API
# 
# ChangeSet
#   2004/05/17 15:27:17+02:00 perex@suse.cz 
#   ALSA CVS update - Jaroslav Kysela <perex@suse.cz>
#   EMU10K1/EMU10K2 driver
#   Credits for SB Live (c) 2003
# 
# sound/pci/emu10k1/emumixer.c
#   2004/05/05 08:20:23+02:00 perex@suse.cz +5 -0
#   ALSA CVS update
#   D:2004/05/05 14:20:23
#   C:EMU10K1/EMU10K2 driver
#   A:Jaroslav Kysela <perex@suse.cz>
#   F:pci/emu10k1/emumixer.c:1.21->1.22 
#   L:Credits for SB Live (c) 2003
# 
# ChangeSet
#   2004/05/17 15:26:57+02:00 perex@suse.cz 
#   ALSA CVS update - Clemens Ladisch <clemens@ladisch.de>
#   USB generic driver
#   (Alan Stern) use altsetting number instead of index in messages
# 
# sound/usb/usbaudio.c
#   2004/05/05 03:50:45+02:00 perex@suse.cz +2 -2
#   ALSA CVS update
#   D:2004/05/05 09:50:45
#   C:USB generic driver
#   A:Clemens Ladisch <clemens@ladisch.de>
#   F:usb/usbaudio.c:1.99->1.100 
#   L:(Alan Stern) use altsetting number instead of index in messages
# 
# ChangeSet
#   2004/05/17 15:26:35+02:00 perex@suse.cz 
#   ALSA CVS update - Takashi Iwai <tiwai@suse.de>
#   Documentation
#   added the document about Audigy mixer implementation by Peter Zubaj.
#   it is not target to users, rather to developers.
# 
# Documentation/sound/alsa/Audigy-mixer.txt
#   2004/05/17 13:27:25+02:00 perex@suse.cz +345 -0
#   ALSA CVS update
#   D:2004/05/04 16:51:39
#   C:Documentation
#   A:Takashi Iwai <tiwai@suse.de>
#   F:Documentation/Audigy-mixer.txt:INITIAL->1.1 
#   L:added the document about Audigy mixer implementation by Peter Zubaj.
#   L:it is not target to users, rather to developers.
# 
# Documentation/sound/alsa/Audigy-mixer.txt
#   2004/05/17 13:27:25+02:00 perex@suse.cz +0 -0
#   BitKeeper file /home/perex/bk/linux-sound/work/Documentation/sound/alsa/Audigy-mixer.txt
# 
# ChangeSet
#   2004/05/17 15:26:10+02:00 perex@suse.cz 
#   ALSA CVS update - Takashi Iwai <tiwai@suse.de>
#   ATIIXP driver
#   - fixed the direct SPDIF playback mode.  (still experimental)
#   - use the different driver id name for the direct spdif mode, so that
#     alsa-lib can read another corresponding configuration.
# 
# sound/pci/atiixp.c
#   2004/05/04 10:24:29+02:00 perex@suse.cz +8 -8
#   ALSA CVS update
#   D:2004/05/04 16:24:29
#   C:ATIIXP driver
#   A:Takashi Iwai <tiwai@suse.de>
#   F:pci/atiixp.c:1.7->1.8 
#   L:- fixed the direct SPDIF playback mode.  (still experimental)
#   L:- use the different driver id name for the direct spdif mode, so that
#   L:  alsa-lib can read another corresponding configuration.
# 
# ChangeSet
#   2004/05/17 15:25:49+02:00 perex@suse.cz 
#   ALSA CVS update - Takashi Iwai <tiwai@suse.de>
#   Documentation,CMIPCI driver
#   dropped the software encoding of AC3 stream in the driver.
#   this is done now in alsa-lib.
#   soft_ac3 module option is kept for backward compatibility but not
#   referred at all.
# 
# sound/pci/cmipci.c
#   2004/05/04 10:21:57+02:00 perex@suse.cz +53 -442
#   ALSA CVS update
#   D:2004/05/04 16:21:57
#   C:Documentation,CMIPCI driver
#   A:Takashi Iwai <tiwai@suse.de>
#   F:Documentation/ALSA-Configuration.txt:1.41->1.42 
#   F:pci/cmipci.c:1.63->1.64 
#   L:dropped the software encoding of AC3 stream in the driver.
#   L:this is done now in alsa-lib.
#   L:soft_ac3 module option is kept for backward compatibility but not
#   L:referred at all.
# 
# Documentation/sound/alsa/ALSA-Configuration.txt
#   2004/05/04 10:21:57+02:00 perex@suse.cz +1 -2
#   ALSA CVS update
#   D:2004/05/04 16:21:57
#   C:Documentation,CMIPCI driver
#   A:Takashi Iwai <tiwai@suse.de>
#   F:Documentation/ALSA-Configuration.txt:1.41->1.42 
#   F:pci/cmipci.c:1.63->1.64 
#   L:dropped the software encoding of AC3 stream in the driver.
#   L:this is done now in alsa-lib.
#   L:soft_ac3 module option is kept for backward compatibility but not
#   L:referred at all.
# 
# ChangeSet
#   2004/05/17 15:25:22+02:00 perex@suse.cz 
#   ALSA CVS update - Takashi Iwai <tiwai@suse.de>
#   Documentation,NM256 driver
#   - added a blacklist to avoid the possible hang-up at module loading.
#   - added notes about the hang-up problem to ALSA-Configuration.txt.
# 
# sound/pci/nm256/nm256.c
#   2004/05/04 10:19:25+02:00 perex@suse.cz +29 -0
#   ALSA CVS update
#   D:2004/05/04 16:19:25
#   C:Documentation,NM256 driver
#   A:Takashi Iwai <tiwai@suse.de>
#   F:Documentation/ALSA-Configuration.txt:1.40->1.41 
#   F:pci/nm256/nm256.c:1.37->1.38 
#   L:- added a blacklist to avoid the possible hang-up at module loading.
#   L:- added notes about the hang-up problem to ALSA-Configuration.txt.
# 
# Documentation/sound/alsa/ALSA-Configuration.txt
#   2004/05/04 10:19:25+02:00 perex@suse.cz +19 -2
#   ALSA CVS update
#   D:2004/05/04 16:19:25
#   C:Documentation,NM256 driver
#   A:Takashi Iwai <tiwai@suse.de>
#   F:Documentation/ALSA-Configuration.txt:1.40->1.41 
#   F:pci/nm256/nm256.c:1.37->1.38 
#   L:- added a blacklist to avoid the possible hang-up at module loading.
#   L:- added notes about the hang-up problem to ALSA-Configuration.txt.
# 
# ChangeSet
#   2004/05/17 15:25:00+02:00 perex@suse.cz 
#   ALSA CVS update - Takashi Iwai <tiwai@suse.de>
#   PCM Midlevel
#   fixed the bit width of IEC958_SUBFRAME_* formats from 24 to 32.
# 
# sound/core/pcm_misc.c
#   2004/05/04 10:09:50+02:00 perex@suse.cz +1 -1
#   ALSA CVS update
#   D:2004/05/04 16:09:50
#   C:PCM Midlevel
#   A:Takashi Iwai <tiwai@suse.de>
#   F:core/pcm_misc.c:1.12->1.13 
#   L:fixed the bit width of IEC958_SUBFRAME_* formats from 24 to 32.
# 
# ChangeSet
#   2004/05/17 15:24:35+02:00 perex@suse.cz 
#   ALSA CVS update - Takashi Iwai <tiwai@suse.de>
#   VIA82xx driver
#   fixed again the DXS entry for m680x to 48k-fixed rate.
# 
# sound/pci/via82xx.c
#   2004/05/04 10:09:08+02:00 perex@suse.cz +1 -1
#   ALSA CVS update
#   D:2004/05/04 16:09:08
#   C:VIA82xx driver
#   A:Takashi Iwai <tiwai@suse.de>
#   F:pci/via82xx.c:1.98->1.99 
#   L:fixed again the DXS entry for m680x to 48k-fixed rate.
# 
# ChangeSet
#   2004/05/17 15:24:11+02:00 perex@suse.cz 
#   ALSA CVS update - Clemens Ladisch <clemens@ladisch.de>
#   ALSA<-OSS emulation
#   don't return negative byte count from GET[IO]PTR ioctl
# 
# sound/core/oss/pcm_oss.c
#   2004/05/04 08:02:02+02:00 perex@suse.cz +3 -3
#   ALSA CVS update
#   D:2004/05/04 14:02:02
#   C:ALSA<-OSS emulation
#   A:Clemens Ladisch <clemens@ladisch.de>
#   F:core/oss/pcm_oss.c:1.68->1.69 
#   L:don't return negative byte count from GET[IO]PTR ioctl
# 
# ChangeSet
#   2004/05/17 15:23:52+02:00 perex@suse.cz 
#   ALSA CVS update - Clemens Ladisch <clemens@ladisch.de>
#   ICE1712 driver
#   fix Hoontech DSP* box configuration
# 
# sound/pci/ice1712/hoontech.c
#   2004/05/04 01:46:29+02:00 perex@suse.cz +13 -8
#   ALSA CVS update
#   D:2004/05/04 07:46:29
#   C:ICE1712 driver
#   A:Clemens Ladisch <clemens@ladisch.de>
#   F:pci/ice1712/hoontech.c:1.4->1.5 
#   L:fix Hoontech DSP* box configuration
# 
# ChangeSet
#   2004/05/17 15:23:29+02:00 perex@suse.cz 
#   ALSA CVS update - Takashi Iwai <tiwai@suse.de>
#   Documentation
#   - fixed some obsolete descriptions and typos.
#   - a bit more detailed description about addition of the new driver.
# 
# Documentation/sound/alsa/DocBook/writing-an-alsa-driver.tmpl
#   2004/05/03 12:37:55+02:00 perex@suse.cz +13 -8
#   ALSA CVS update
#   D:2004/05/03 18:37:55
#   C:Documentation
#   A:Takashi Iwai <tiwai@suse.de>
#   F:Documentation/DocBook/writing-an-alsa-driver.tmpl:1.27->1.28 
#   L:- fixed some obsolete descriptions and typos.
#   L:- a bit more detailed description about addition of the new driver.
# 
# ChangeSet
#   2004/05/17 15:23:08+02:00 perex@suse.cz 
#   ALSA CVS update - Takashi Iwai <tiwai@suse.de>
#   SA11xx UDA1341 driver,UDA1341
#   - clean up PM codes using the new PM callback functions.
# 
# sound/arm/sa11xx-uda1341.c
#   2004/05/03 12:36:50+02:00 perex@suse.cz +10 -55
#   ALSA CVS update
#   D:2004/05/03 18:36:50
#   C:SA11xx UDA1341 driver,UDA1341
#   A:Takashi Iwai <tiwai@suse.de>
#   F:arm/sa11xx-uda1341.c:1.14->1.15 
#   F:include/uda1341.h:1.5->1.6 
#   L:- clean up PM codes using the new PM callback functions.
# 
# include/sound/uda1341.h
#   2004/05/03 12:36:50+02:00 perex@suse.cz +1 -1
#   ALSA CVS update
#   D:2004/05/03 18:36:50
#   C:SA11xx UDA1341 driver,UDA1341
#   A:Takashi Iwai <tiwai@suse.de>
#   F:arm/sa11xx-uda1341.c:1.14->1.15 
#   F:include/uda1341.h:1.5->1.6 
#   L:- clean up PM codes using the new PM callback functions.
# 
# ChangeSet
#   2004/05/17 15:22:44+02:00 perex@suse.cz 
#   ALSA CVS update - Takashi Iwai <tiwai@suse.de>
#   ALSA Core
#   - added the generic PM callback registration.
#   - rewritten ISA callbacks to use the new one.
# 
# sound/core/sound.c
#   2004/05/03 12:36:07+02:00 perex@suse.cz +1 -3
#   ALSA CVS update
#   D:2004/05/03 18:36:07
#   C:ALSA Core
#   A:Takashi Iwai <tiwai@suse.de>
#   F:core/init.c:1.45->1.46 
#   F:core/sound.c:1.61->1.62 
#   F:include/core.h:1.50->1.51 
#   L:- added the generic PM callback registration.
#   L:- rewritten ISA callbacks to use the new one.
# 
# sound/core/init.c
#   2004/05/03 12:36:07+02:00 perex@suse.cz +9 -9
#   ALSA CVS update
#   D:2004/05/03 18:36:07
#   C:ALSA Core
#   A:Takashi Iwai <tiwai@suse.de>
#   F:core/init.c:1.45->1.46 
#   F:core/sound.c:1.61->1.62 
#   F:include/core.h:1.50->1.51 
#   L:- added the generic PM callback registration.
#   L:- rewritten ISA callbacks to use the new one.
# 
# include/sound/core.h
#   2004/05/03 12:36:07+02:00 perex@suse.cz +4 -1
#   ALSA CVS update
#   D:2004/05/03 18:36:07
#   C:ALSA Core
#   A:Takashi Iwai <tiwai@suse.de>
#   F:core/init.c:1.45->1.46 
#   F:core/sound.c:1.61->1.62 
#   F:include/core.h:1.50->1.51 
#   L:- added the generic PM callback registration.
#   L:- rewritten ISA callbacks to use the new one.
# 
# ChangeSet
#   2004/05/17 15:22:22+02:00 perex@suse.cz 
#   ALSA CVS update - Takashi Iwai <tiwai@suse.de>
#   ES1968 driver
#   - set ACPI D3 at suspend.
#   - fixed the interrupt disabling at shutdown.
#   - enabled PM for compaq Armada.
# 
# sound/pci/es1968.c
#   2004/05/03 12:34:48+02:00 perex@suse.cz +7 -2
#   ALSA CVS update
#   D:2004/05/03 18:34:48
#   C:ES1968 driver
#   A:Takashi Iwai <tiwai@suse.de>
#   F:pci/es1968.c:1.65->1.66 
#   L:- set ACPI D3 at suspend.
#   L:- fixed the interrupt disabling at shutdown.
#   L:- enabled PM for compaq Armada.
# 
# ChangeSet
#   2004/05/17 15:21:59+02:00 perex@suse.cz 
#   ALSA CVS update - Takashi Iwai <tiwai@suse.de>
#   AC97 Codec Core
#   try to mute and power down in the destructor (to shut up noises).
# 
# sound/pci/ac97/ac97_codec.c
#   2004/05/03 12:32:57+02:00 perex@suse.cz +25 -7
#   ALSA CVS update
#   D:2004/05/03 18:32:57
#   C:AC97 Codec Core
#   A:Takashi Iwai <tiwai@suse.de>
#   F:pci/ac97/ac97_codec.c:1.131->1.132 
#   L:try to mute and power down in the destructor (to shut up noises).
# 
# ChangeSet
#   2004/05/17 15:21:39+02:00 perex@suse.cz 
#   ALSA CVS update - Clemens Ladisch <clemens@ladisch.de>
#   CS4231 driver
#   add missing closing brace
# 
# sound/isa/cs423x/cs4231_lib.c
#   2004/05/03 09:37:05+02:00 perex@suse.cz +1 -0
#   ALSA CVS update
#   D:2004/05/03 15:37:05
#   C:CS4231 driver
#   A:Clemens Ladisch <clemens@ladisch.de>
#   F:isa/cs423x/cs4231_lib.c:1.40->1.41 
#   L:add missing closing brace
# 
# ChangeSet
#   2004/05/17 15:21:16+02:00 perex@suse.cz 
#   ALSA CVS update - Jaroslav Kysela <perex@suse.cz>
#   RME HDSP driver
#   HDSP9632 has also firmware version 0x97
# 
# sound/pci/rme9652/hdsp.c
#   2004/05/03 04:01:17+02:00 perex@suse.cz +3 -0
#   ALSA CVS update
#   D:2004/05/03 10:01:17
#   C:RME HDSP driver
#   A:Jaroslav Kysela <perex@suse.cz>
#   F:pci/rme9652/hdsp.c:1.56->1.57 
#   L:HDSP9632 has also firmware version 0x97
# 
# ChangeSet
#   2004/05/17 15:20:55+02:00 perex@suse.cz 
#   ALSA CVS update - Jaroslav Kysela <perex@suse.cz>
#   Documentation,EMU10K1/EMU10K2 driver
#   Initial attempt to add support for SB Live 5.1 (c) 2003
# 
# sound/pci/emu10k1/emumixer.c
#   2004/05/03 03:43:04+02:00 perex@suse.cz +6 -0
#   ALSA CVS update
#   D:2004/05/03 09:43:04
#   C:Documentation,EMU10K1/EMU10K2 driver
#   A:Jaroslav Kysela <perex@suse.cz>
#   F:Documentation/ALSA-Configuration.txt:1.39->1.40 
#   F:include/emu10k1.h:1.38->1.39 
#   F:pci/emu10k1/emu10k1_main.c:1.32->1.33 
#   F:pci/emu10k1/emufx.c:1.51->1.52 
#   F:pci/emu10k1/emumixer.c:1.20->1.21 
#   L:Initial attempt to add support for SB Live 5.1 (c) 2003
# 
# sound/pci/emu10k1/emufx.c
#   2004/05/03 03:43:04+02:00 perex@suse.cz +12 -8
#   ALSA CVS update
#   D:2004/05/03 09:43:04
#   C:Documentation,EMU10K1/EMU10K2 driver
#   A:Jaroslav Kysela <perex@suse.cz>
#   F:Documentation/ALSA-Configuration.txt:1.39->1.40 
#   F:include/emu10k1.h:1.38->1.39 
#   F:pci/emu10k1/emu10k1_main.c:1.32->1.33 
#   F:pci/emu10k1/emufx.c:1.51->1.52 
#   F:pci/emu10k1/emumixer.c:1.20->1.21 
#   L:Initial attempt to add support for SB Live 5.1 (c) 2003
# 
# sound/pci/emu10k1/emu10k1_main.c
#   2004/05/03 03:43:04+02:00 perex@suse.cz +1 -1
#   ALSA CVS update
#   D:2004/05/03 09:43:04
#   C:Documentation,EMU10K1/EMU10K2 driver
#   A:Jaroslav Kysela <perex@suse.cz>
#   F:Documentation/ALSA-Configuration.txt:1.39->1.40 
#   F:include/emu10k1.h:1.38->1.39 
#   F:pci/emu10k1/emu10k1_main.c:1.32->1.33 
#   F:pci/emu10k1/emufx.c:1.51->1.52 
#   F:pci/emu10k1/emumixer.c:1.20->1.21 
#   L:Initial attempt to add support for SB Live 5.1 (c) 2003
# 
# include/sound/emu10k1.h
#   2004/05/03 03:43:04+02:00 perex@suse.cz +8 -4
#   ALSA CVS update
#   D:2004/05/03 09:43:04
#   C:Documentation,EMU10K1/EMU10K2 driver
#   A:Jaroslav Kysela <perex@suse.cz>
#   F:Documentation/ALSA-Configuration.txt:1.39->1.40 
#   F:include/emu10k1.h:1.38->1.39 
#   F:pci/emu10k1/emu10k1_main.c:1.32->1.33 
#   F:pci/emu10k1/emufx.c:1.51->1.52 
#   F:pci/emu10k1/emumixer.c:1.20->1.21 
#   L:Initial attempt to add support for SB Live 5.1 (c) 2003
# 
# Documentation/sound/alsa/ALSA-Configuration.txt
#   2004/05/03 03:43:04+02:00 perex@suse.cz +2 -1
#   ALSA CVS update
#   D:2004/05/03 09:43:04
#   C:Documentation,EMU10K1/EMU10K2 driver
#   A:Jaroslav Kysela <perex@suse.cz>
#   F:Documentation/ALSA-Configuration.txt:1.39->1.40 
#   F:include/emu10k1.h:1.38->1.39 
#   F:pci/emu10k1/emu10k1_main.c:1.32->1.33 
#   F:pci/emu10k1/emufx.c:1.51->1.52 
#   F:pci/emu10k1/emumixer.c:1.20->1.21 
#   L:Initial attempt to add support for SB Live 5.1 (c) 2003
# 
# ChangeSet
#   2004/05/17 15:20:32+02:00 perex@suse.cz 
#   ALSA CVS update - Takashi Iwai <tiwai@suse.de>
#   VIA82xx driver
#   added DXS whitelist for (eMachines) m680x.
# 
# sound/pci/via82xx.c
#   2004/05/02 05:15:40+02:00 perex@suse.cz +1 -0
#   ALSA CVS update
#   D:2004/05/02 11:15:40
#   C:VIA82xx driver
#   A:Takashi Iwai <tiwai@suse.de>
#   F:pci/via82xx.c:1.97->1.98 
#   L:added DXS whitelist for (eMachines) m680x.
# 
# ChangeSet
#   2004/05/17 15:20:12+02:00 perex@suse.cz 
#   ALSA CVS update - Takashi Iwai <tiwai@suse.de>
#   CS4231 driver
#   checks the PCM substream pointers to fix oops/panic in the interrupt
#   handler.
# 
# sound/isa/cs423x/cs4231_lib.c
#   2004/05/01 04:01:11+02:00 perex@suse.cz +15 -8
#   ALSA CVS update
#   D:2004/05/01 10:01:11
#   C:CS4231 driver
#   A:Takashi Iwai <tiwai@suse.de>
#   F:isa/cs423x/cs4231_lib.c:1.39->1.40 
#   L:checks the PCM substream pointers to fix oops/panic in the interrupt
#   L:handler.
# 
# ChangeSet
#   2004/05/17 15:19:51+02:00 perex@suse.cz 
#   ALSA CVS update - Clemens Ladisch <clemens@ladisch.de>
#   Intel8x0 driver
#   check that period interrupt really has occured;
#   clear only those interrupts that have been handled
# 
# sound/pci/intel8x0.c
#   2004/04/26 02:47:09+02:00 perex@suse.cz +7 -3
#   ALSA CVS update
#   D:2004/04/26 08:47:09
#   C:Intel8x0 driver
#   A:Clemens Ladisch <clemens@ladisch.de>
#   F:pci/intel8x0.c:1.136->1.137 
#   L:check that period interrupt really has occured;
#   L:clear only those interrupts that have been handled
# 
# ChangeSet
#   2004/05/17 15:19:27+02:00 perex@suse.cz 
#   ALSA CVS update - Clemens Ladisch <clemens@ladisch.de>
#   ALSA<-OSS emulation,ALSA sequencer,ALSA<-OSS sequencer,OPL4
#   make some module parameters sysfs-writable, where appropriate
# 
# sound/drivers/opl4/opl4_seq.c
#   2004/04/26 02:31:23+02:00 perex@suse.cz +1 -1
#   ALSA CVS update
#   D:2004/04/26 08:31:22
#   C:ALSA<-OSS emulation,ALSA sequencer,ALSA<-OSS sequencer,OPL4
#   A:Clemens Ladisch <clemens@ladisch.de>
#   F:core/oss/pcm_oss.c:1.67->1.68 
#   F:core/seq/seq.c:1.11->1.12 
#   F:core/seq/seq_midi.c:1.19->1.20 
#   F:core/seq/oss/seq_oss.c:1.12->1.13 
#   F:drivers/opl4/opl4_seq.c:1.3->1.4 
#   L:make some module parameters sysfs-writable, where appropriate
# 
# sound/core/seq/seq_midi.c
#   2004/04/26 02:31:23+02:00 perex@suse.cz +2 -2
#   ALSA CVS update
#   D:2004/04/26 08:31:22
#   C:ALSA<-OSS emulation,ALSA sequencer,ALSA<-OSS sequencer,OPL4
#   A:Clemens Ladisch <clemens@ladisch.de>
#   F:core/oss/pcm_oss.c:1.67->1.68 
#   F:core/seq/seq.c:1.11->1.12 
#   F:core/seq/seq_midi.c:1.19->1.20 
#   F:core/seq/oss/seq_oss.c:1.12->1.13 
#   F:drivers/opl4/opl4_seq.c:1.3->1.4 
#   L:make some module parameters sysfs-writable, where appropriate
# 
# sound/core/seq/seq.c
#   2004/04/26 02:31:23+02:00 perex@suse.cz +6 -6
#   ALSA CVS update
#   D:2004/04/26 08:31:22
#   C:ALSA<-OSS emulation,ALSA sequencer,ALSA<-OSS sequencer,OPL4
#   A:Clemens Ladisch <clemens@ladisch.de>
#   F:core/oss/pcm_oss.c:1.67->1.68 
#   F:core/seq/seq.c:1.11->1.12 
#   F:core/seq/seq_midi.c:1.19->1.20 
#   F:core/seq/oss/seq_oss.c:1.12->1.13 
#   F:drivers/opl4/opl4_seq.c:1.3->1.4 
#   L:make some module parameters sysfs-writable, where appropriate
# 
# sound/core/seq/oss/seq_oss.c
#   2004/04/26 02:31:23+02:00 perex@suse.cz +1 -1
#   ALSA CVS update
#   D:2004/04/26 08:31:22
#   C:ALSA<-OSS emulation,ALSA sequencer,ALSA<-OSS sequencer,OPL4
#   A:Clemens Ladisch <clemens@ladisch.de>
#   F:core/oss/pcm_oss.c:1.67->1.68 
#   F:core/seq/seq.c:1.11->1.12 
#   F:core/seq/seq_midi.c:1.19->1.20 
#   F:core/seq/oss/seq_oss.c:1.12->1.13 
#   F:drivers/opl4/opl4_seq.c:1.3->1.4 
#   L:make some module parameters sysfs-writable, where appropriate
# 
# sound/core/oss/pcm_oss.c
#   2004/04/26 02:31:22+02:00 perex@suse.cz +1 -1
#   ALSA CVS update
#   D:2004/04/26 08:31:22
#   C:ALSA<-OSS emulation,ALSA sequencer,ALSA<-OSS sequencer,OPL4
#   A:Clemens Ladisch <clemens@ladisch.de>
#   F:core/oss/pcm_oss.c:1.67->1.68 
#   F:core/seq/seq.c:1.11->1.12 
#   F:core/seq/seq_midi.c:1.19->1.20 
#   F:core/seq/oss/seq_oss.c:1.12->1.13 
#   F:drivers/opl4/opl4_seq.c:1.3->1.4 
#   L:make some module parameters sysfs-writable, where appropriate
# 
# ChangeSet
#   2004/05/17 15:19:06+02:00 perex@suse.cz 
#   ALSA CVS update - Takashi Iwai <tiwai@suse.de>
#   PARISC Harmony driver
#   fixed compilation - using struct parisc_device for DMA allocation.
# 
# sound/parisc/harmony.c
#   2004/04/24 15:01:49+02:00 perex@suse.cz +7 -29
#   ALSA CVS update
#   D:2004/04/24 21:01:49
#   C:PARISC Harmony driver
#   A:Takashi Iwai <tiwai@suse.de>
#   F:parisc/harmony.c:1.8->1.9 
#   L:fixed compilation - using struct parisc_device for DMA allocation.
# 
# ChangeSet
#   2004/05/17 11:37:11+02:00 perex@suse.cz 
#   Merge suse.cz:/home/perex/bk/linux-sound/linux-2.5
#   into suse.cz:/home/perex/bk/linux-sound/linux-sound
# 
# sound/pcmcia/pdaudiocf/pdaudiocf.c
#   2004/05/17 11:36:58+02:00 perex@suse.cz +0 -0
#   Auto merged
# 
# sound/isa/wavefront/wavefront_synth.c
#   2004/05/17 11:36:58+02:00 perex@suse.cz +0 -0
#   Auto merged
# 
# sound/isa/es1688/es1688.c
#   2004/05/17 11:36:57+02:00 perex@suse.cz +0 -0
#   Auto merged
# 
# include/linux/pci_ids.h
#   2004/05/17 11:36:57+02:00 perex@suse.cz +0 -0
#   Auto merged
# 
# ChangeSet
#   2004/05/15 08:42:53-05:00 jejb@mulgrave.(none) 
#   scsi sg: fix smp_call_function() with intrs disabled
#   
#   From: 	Matthew Wilcox <willy@debian.org>,
#   	Douglas Gilbert <dougg@torque.net>
#   
#     - Fix vmalloc,vfree with intrs disabled
#     - bump version number
#     - introduce MODULE_VERSION
#     - increase over allocation of sg_dev_arr from 6 to 32
# 
# drivers/scsi/sg.c
#   2004/05/15 08:42:13-05:00 jejb@mulgrave.(none) +77 -76
#   scsi sg: fix smp_call_function() with intrs disabled
# 
# ChangeSet
#   2004/05/15 08:37:26-05:00 akpm@osdl.org 
#   [PATCH] Fix dpt_i2o
#   
#   From: Go Taniguchi <go@turbolinux.co.jp>
#   
#   Make it build (and work) again.
# 
# drivers/scsi/dpti.h
#   2004/04/27 03:58:25-05:00 akpm@osdl.org +2 -2
#   Fix dpt_i2o
# 
# drivers/scsi/dpt_i2o.c
#   2004/04/27 03:58:25-05:00 akpm@osdl.org +118 -38
#   Fix dpt_i2o
# 
# drivers/scsi/Kconfig
#   2004/04/27 03:58:25-05:00 akpm@osdl.org +1 -1
#   Fix dpt_i2o
# 
# ChangeSet
#   2004/05/13 15:03:44-05:00 jejb@mulgrave.(none) 
#   gdth driver update to 3.04
#   
#   From: 	Leubner, Achim <Achim_Leubner@adaptec.com>
#   
#   - Support for drives > 2 TB implemented
#   - 64-bit DMA support depending on the controller firmware version implemented
#   - Some important bug fixes made
# 
# drivers/scsi/gdth_proc.h
#   2004/05/13 15:02:45-05:00 jejb@mulgrave.(none) +9 -20
#   gdth driver update to 3.04
# 
# drivers/scsi/gdth_proc.c
#   2004/05/13 15:02:45-05:00 jejb@mulgrave.(none) +525 -1066
#   gdth driver update to 3.04
# 
# drivers/scsi/gdth_ioctl.h
#   2004/05/13 15:02:45-05:00 jejb@mulgrave.(none) +41 -9
#   gdth driver update to 3.04
# 
# drivers/scsi/gdth.h
#   2004/05/13 15:02:45-05:00 jejb@mulgrave.(none) +115 -42
#   gdth driver update to 3.04
# 
# drivers/scsi/gdth.c
#   2004/05/13 15:02:45-05:00 jejb@mulgrave.(none) +1758 -1354
#   gdth driver update to 3.04
# 
# ChangeSet
#   2004/05/13 12:40:33-05:00 dougg@torque.net 
#   [PATCH] st.c for GET_IDLUN
#   
#   A little more testing of st's SG_IO ioctl turned up a
#   small problem.
#   
#   This is the corresponding patch that was applied to the
#   sd driver when it received the block layer SG_IO ioctl.
#   
#   For least surprise of lk 2.4 utilities that use the
#   SCSI_IOCTL_GET_IDLUN and SCSI_IOCTL_GET_BUS_NUMBER
#   ioctls (e.g. sg_map) it is better to return the correct
#   values rather than 0.
# 
# drivers/scsi/st.c
#   2004/04/25 03:13:50-05:00 dougg@torque.net +11 -5
#   st.c for GET_IDLUN
# 
# ChangeSet
#   2004/05/13 12:36:42-05:00 jejb@mulgrave.(none) 
#   Fix SCSI device state model
#   
#   Following a prior patch, we made cancel the sole
#   route into deleted, but forgot to update the 
#   state model checks to reflect this.
#   
#   offline and created also go to cancel
# 
# drivers/scsi/scsi_lib.c
#   2004/05/13 12:36:01-05:00 jejb@mulgrave.(none) +2 -2
#   Fix SCSI device state model
# 
# ChangeSet
#   2004/05/11 11:16:45-05:00 jejb@mulgrave.(none) 
#   Make st support the scsi_device timeout
#   
#   From: 	Brian King <brking@us.ibm.com>
# 
# drivers/scsi/st.h
#   2004/05/11 11:16:20-05:00 jejb@mulgrave.(none) +0 -1
#   Make st support the scsi_device timeout
# 
# drivers/scsi/st.c
#   2004/05/11 11:16:20-05:00 jejb@mulgrave.(none) +19 -19
#   Make st support the scsi_device timeout
# 
# ChangeSet
#   2004/05/11 10:33:58-05:00 alan@redhat.com 
#   [PATCH] PATCH: Do something about aacraid
#   
#   This is a fairly minimal fix for aacraid. It removes the happy cast
#   pointers to u32 garbage in the 2.6 code and replaces it with the working
#   2.4 equivalents. I've not backported any of the other changes from 2.4 to
#   2.6 yet, and some things have gone which are good to be gone (eg the
#   proc/scsi horror). There is a certain amount of white space noise caused
#   by realigning with the 2.4 code so I could see what was going on.
#   
#   Tested on a dual opteron
# 
# drivers/scsi/aacraid/sa.c
#   2004/05/10 15:21:30-05:00 alan@redhat.com +5 -0
#   PATCH: Do something about aacraid
# 
# drivers/scsi/aacraid/dpcsup.c
#   2004/05/10 15:23:18-05:00 alan@redhat.com +34 -19
#   PATCH: Do something about aacraid
# 
# drivers/scsi/aacraid/commsup.c
#   2004/05/10 15:16:08-05:00 alan@redhat.com +48 -33
#   PATCH: Do something about aacraid
# 
# drivers/scsi/aacraid/comminit.c
#   2004/05/10 15:11:56-05:00 alan@redhat.com +6 -3
#   PATCH: Do something about aacraid
# 
# drivers/scsi/aacraid/commctrl.c
#   2004/05/10 15:22:40-05:00 alan@redhat.com +20 -17
#   PATCH: Do something about aacraid
# 
# drivers/scsi/aacraid/aacraid.h
#   2004/05/10 15:02:37-05:00 alan@redhat.com +35 -122
#   PATCH: Do something about aacraid
# 
# drivers/scsi/aacraid/README
#   2004/05/10 15:20:16-05:00 alan@redhat.com +6 -2
#   PATCH: Do something about aacraid
# 
# ChangeSet
#   2004/05/10 13:08:44-04:00 jgarzik@redhat.com 
#   [netdrvr tg3] netdev_priv
# 
# drivers/net/tg3.c
#   2004/05/10 13:07:02-04:00 jgarzik@redhat.com +38 -36
#   [netdrvr tg3] netdev_priv
# 
# ChangeSet
#   2004/04/24 16:33:25+02:00 perex@suse.cz 
#   ALSA CVS update - Jaroslav Kysela <perex@suse.cz>
#   OPL3SA2 driver
#   Added YMH0801 ISA PnP ID - OPL3-SA2
# 
# sound/isa/opl3sa2.c
#   2004/04/24 07:07:50+02:00 perex@suse.cz +2 -0
#   ALSA CVS update
#   D:2004/04/24 13:07:50
#   C:OPL3SA2 driver
#   A:Jaroslav Kysela <perex@suse.cz>
#   F:isa/opl3sa2.c:1.34->1.35 
#   L:Added YMH0801 ISA PnP ID - OPL3-SA2
# 
# ChangeSet
#   2004/04/24 16:33:07+02:00 perex@suse.cz 
#   ALSA CVS update - Takashi Iwai <tiwai@suse.de>
#   VIA82xx driver
#   - added the experimental PM support.
# 
# sound/pci/via82xx.c
#   2004/04/23 10:08:11+02:00 perex@suse.cz +94 -0
#   ALSA CVS update
#   D:2004/04/23 16:08:11
#   C:VIA82xx driver
#   A:Takashi Iwai <tiwai@suse.de>
#   F:pci/via82xx.c:1.96->1.97 
#   L:- added the experimental PM support.
# 
# ChangeSet
#   2004/04/24 16:32:49+02:00 perex@suse.cz 
#   ALSA CVS update - Takashi Iwai <tiwai@suse.de>
#   PCI drivers,ATIIXP driver
#   - added IXP 300 to descriptions and comments.
#   - fixed the codec probing without the proper interrupts.
#   - added the experimental PM support.
# 
# sound/pci/atiixp.c
#   2004/04/23 10:07:54+02:00 perex@suse.cz +81 -7
#   ALSA CVS update
#   D:2004/04/23 16:07:54
#   C:PCI drivers,ATIIXP driver
#   A:Takashi Iwai <tiwai@suse.de>
#   F:pci/Kconfig:1.26->1.27 
#   F:pci/atiixp.c:1.6->1.7 
#   L:- added IXP 300 to descriptions and comments.
#   L:- fixed the codec probing without the proper interrupts.
#   L:- added the experimental PM support.
# 
# sound/pci/Kconfig
#   2004/04/23 10:07:54+02:00 perex@suse.cz +2 -2
#   ALSA CVS update
#   D:2004/04/23 16:07:54
#   C:PCI drivers,ATIIXP driver
#   A:Takashi Iwai <tiwai@suse.de>
#   F:pci/Kconfig:1.26->1.27 
#   F:pci/atiixp.c:1.6->1.7 
#   L:- added IXP 300 to descriptions and comments.
#   L:- fixed the codec probing without the proper interrupts.
#   L:- added the experimental PM support.
# 
# ChangeSet
#   2004/04/24 16:32:26+02:00 perex@suse.cz 
#   ALSA CVS update - Takashi Iwai <tiwai@suse.de>
#   AC97 Codec Core
#   fixed the compilation without CONFIG_SND_DEBUG.
# 
# sound/pci/ac97/ac97_patch.c
#   2004/04/23 10:05:27+02:00 perex@suse.cz +2 -2
#   ALSA CVS update
#   D:2004/04/23 16:05:27
#   C:AC97 Codec Core
#   A:Takashi Iwai <tiwai@suse.de>
#   F:pci/ac97/ac97_patch.c:1.47->1.48 
#   L:fixed the compilation without CONFIG_SND_DEBUG.
# 
# ChangeSet
#   2004/04/24 16:32:05+02:00 perex@suse.cz 
#   ALSA CVS update - Takashi Iwai <tiwai@suse.de>
#   PPC Keywest driver,PPC PMAC driver,PPC PowerMac driver
#   PPC Tumbler driver
#   fixed the oops on resume and the initialization of chip.
# 
# sound/ppc/tumbler.c
#   2004/04/23 09:18:25+02:00 perex@suse.cz +2 -0
#   ALSA CVS update
#   D:2004/04/23 15:18:25
#   C:PPC Keywest driver,PPC PMAC driver,PPC PowerMac driver
#   C:PPC Tumbler driver
#   A:Takashi Iwai <tiwai@suse.de>
#   F:ppc/keywest.c:1.16->1.17 
#   F:ppc/pmac.h:1.13->1.14 
#   F:ppc/powermac.c:1.16->1.17 
#   F:ppc/tumbler.c:1.29->1.30 
#   L:fixed the oops on resume and the initialization of chip.
# 
# sound/ppc/powermac.c
#   2004/04/23 09:18:25+02:00 perex@suse.cz +1 -1
#   ALSA CVS update
#   D:2004/04/23 15:18:25
#   C:PPC Keywest driver,PPC PMAC driver,PPC PowerMac driver
#   C:PPC Tumbler driver
#   A:Takashi Iwai <tiwai@suse.de>
#   F:ppc/keywest.c:1.16->1.17 
#   F:ppc/pmac.h:1.13->1.14 
#   F:ppc/powermac.c:1.16->1.17 
#   F:ppc/tumbler.c:1.29->1.30 
#   L:fixed the oops on resume and the initialization of chip.
# 
# sound/ppc/pmac.h
#   2004/04/23 09:18:25+02:00 perex@suse.cz +1 -0
#   ALSA CVS update
#   D:2004/04/23 15:18:25
#   C:PPC Keywest driver,PPC PMAC driver,PPC PowerMac driver
#   C:PPC Tumbler driver
#   A:Takashi Iwai <tiwai@suse.de>
#   F:ppc/keywest.c:1.16->1.17 
#   F:ppc/pmac.h:1.13->1.14 
#   F:ppc/powermac.c:1.16->1.17 
#   F:ppc/tumbler.c:1.29->1.30 
#   L:fixed the oops on resume and the initialization of chip.
# 
# sound/ppc/keywest.c
#   2004/04/23 09:18:25+02:00 perex@suse.cz +12 -6
#   ALSA CVS update
#   D:2004/04/23 15:18:25
#   C:PPC Keywest driver,PPC PMAC driver,PPC PowerMac driver
#   C:PPC Tumbler driver
#   A:Takashi Iwai <tiwai@suse.de>
#   F:ppc/keywest.c:1.16->1.17 
#   F:ppc/pmac.h:1.13->1.14 
#   F:ppc/powermac.c:1.16->1.17 
#   F:ppc/tumbler.c:1.29->1.30 
#   L:fixed the oops on resume and the initialization of chip.
# 
# ChangeSet
#   2004/04/24 16:31:45+02:00 perex@suse.cz 
#   ALSA CVS update - Jaroslav Kysela <perex@suse.cz>
#   AC97 Codec Core
#   ac97->pci might be null
# 
# sound/pci/ac97/ac97_patch.c
#   2004/04/21 13:50:52+02:00 perex@suse.cz +2 -1
#   ALSA CVS update
#   D:2004/04/21 19:50:52
#   C:AC97 Codec Core
#   A:Jaroslav Kysela <perex@suse.cz>
#   F:pci/ac97/ac97_patch.c:1.46->1.47 
#   L:ac97->pci might be null
# 
# ChangeSet
#   2004/04/24 16:31:21+02:00 perex@suse.cz 
#   ALSA CVS update - Jaroslav Kysela <perex@suse.cz>
#   AC97 Codec Core
#   patch_sigmatel_stac9758
#     - initialize with default values from datasheet
#     - apply old initialization only for Gateway M675 notebook
# 
# sound/pci/ac97/ac97_patch.c
#   2004/04/21 13:44:13+02:00 perex@suse.cz +28 -8
#   ALSA CVS update
#   D:2004/04/21 19:44:13
#   C:AC97 Codec Core
#   A:Jaroslav Kysela <perex@suse.cz>
#   F:pci/ac97/ac97_patch.c:1.45->1.46 
#   L:patch_sigmatel_stac9758
#   L:  - initialize with default values from datasheet
#   L:  - apply old initialization only for Gateway M675 notebook
# 
# ChangeSet
#   2004/04/24 16:31:02+02:00 perex@suse.cz 
#   ALSA CVS update - Jaroslav Kysela <perex@suse.cz>
#   Intel8x0 driver
#   From: Giridhar Pemmasani <giri@lmc.cs.sunysb.edu>
#   
#   It seems that pci config space is messed up after resume for Intel ICH4
#   audio controller (on Dell Latitude D600, but I notice that others also
#   complain about this problem).  Consequently resume from S3 causes oops with
#   snd_intel8x0 module.  If the module is removed before suspend and loaded
#   afterwards, I still get oops.  The following simple patch fixes the
#   problem.  With this, I can leave alsa untouched during suspend/resume.
# 
# sound/pci/intel8x0.c
#   2004/04/21 13:18:27+02:00 perex@suse.cz +6 -0
#   ALSA CVS update
#   D:2004/04/21 19:18:27
#   C:Intel8x0 driver
#   A:Jaroslav Kysela <perex@suse.cz>
#   F:pci/intel8x0.c:1.135->1.136 
#   L:From: Giridhar Pemmasani <giri@lmc.cs.sunysb.edu>
#   L:
#   L:It seems that pci config space is messed up after resume for Intel ICH4
#   L:audio controller (on Dell Latitude D600, but I notice that others also
#   L:complain about this problem).  Consequently resume from S3 causes oops with
#   L:snd_intel8x0 module.  If the module is removed before suspend and loaded
#   L:afterwards, I still get oops.  The following simple patch fixes the
#   L:problem.  With this, I can leave alsa untouched during suspend/resume.
# 
# ChangeSet
#   2004/04/24 16:30:42+02:00 perex@suse.cz 
#   ALSA CVS update - Jaroslav Kysela <perex@suse.cz>
#   Opti9xx drivers
#   Fixed irq&dma initialization for <93x chips
# 
# sound/isa/opti9xx/opti92x-ad1848.c
#   2004/04/19 14:16:49+02:00 perex@suse.cz +4 -0
#   ALSA CVS update
#   D:2004/04/19 20:16:49
#   C:Opti9xx drivers
#   A:Jaroslav Kysela <perex@suse.cz>
#   F:isa/opti9xx/opti92x-ad1848.c:1.43->1.44 
#   L:Fixed irq&dma initialization for <93x chips
# 
# ChangeSet
#   2004/04/24 16:30:24+02:00 perex@suse.cz 
#   ALSA CVS update - Jaroslav Kysela <perex@suse.cz>
#   AC97 Codec Core
#   Fixed AD18xx PCM bit handling
# 
# sound/pci/ac97/ac97_codec.c
#   2004/04/19 13:11:29+02:00 perex@suse.cz +1 -1
#   ALSA CVS update
#   D:2004/04/19 19:11:29
#   C:AC97 Codec Core
#   A:Jaroslav Kysela <perex@suse.cz>
#   F:pci/ac97/ac97_codec.c:1.130->1.131 
#   L:Fixed AD18xx PCM bit handling
# 
# ChangeSet
#   2004/04/24 16:30:01+02:00 perex@suse.cz 
#   ALSA CVS update - Takashi Iwai <tiwai@suse.de>
#   Documentation,AC97 Codec Core
#   added the write support to ac97#x-x+regs proc file.
#   
#   this is for debugging purpose, and enabled only when CONFIG_SND_DEBUG is set.
#   it allows the user to modify AC97 register bits without compiling the sources.
# 
# sound/pci/ac97/ac97_proc.c
#   2004/04/16 13:29:12+02:00 perex@suse.cz +22 -0
#   ALSA CVS update
#   D:2004/04/16 19:29:12
#   C:Documentation,AC97 Codec Core
#   A:Takashi Iwai <tiwai@suse.de>
#   F:Documentation/Procfile.txt:1.1->1.2 
#   F:pci/ac97/ac97_proc.c:1.6->1.7 
#   L:added the write support to ac97#x-x+regs proc file.
#   L:
#   L:this is for debugging purpose, and enabled only when CONFIG_SND_DEBUG is set.
#   L:it allows the user to modify AC97 register bits without compiling the sources.
# 
# Documentation/sound/alsa/Procfile.txt
#   2004/04/16 13:29:12+02:00 perex@suse.cz +6 -0
#   ALSA CVS update
#   D:2004/04/16 19:29:12
#   C:Documentation,AC97 Codec Core
#   A:Takashi Iwai <tiwai@suse.de>
#   F:Documentation/Procfile.txt:1.1->1.2 
#   F:pci/ac97/ac97_proc.c:1.6->1.7 
#   L:added the write support to ac97#x-x+regs proc file.
#   L:
#   L:this is for debugging purpose, and enabled only when CONFIG_SND_DEBUG is set.
#   L:it allows the user to modify AC97 register bits without compiling the sources.
# 
# ChangeSet
#   2004/04/24 16:29:42+02:00 perex@suse.cz 
#   ALSA CVS update - Takashi Iwai <tiwai@suse.de>
#   AC97 Codec Core
#   added the mic/center sharing switch of cm9739 codec again.
# 
# sound/pci/ac97/ac97_patch.c
#   2004/04/16 13:25:15+02:00 perex@suse.cz +32 -3
#   ALSA CVS update
#   D:2004/04/16 19:25:15
#   C:AC97 Codec Core
#   A:Takashi Iwai <tiwai@suse.de>
#   F:pci/ac97/ac97_patch.c:1.44->1.45 
#   L:added the mic/center sharing switch of cm9739 codec again.
# 
# ChangeSet
#   2004/04/24 16:29:18+02:00 perex@suse.cz 
#   ALSA CVS update - Takashi Iwai <tiwai@suse.de>
#   Control Midlevel
#   - fixed the compilation without CONFIG_PM.
#   - fixed the return value of POWER ioctl.
# 
# sound/core/control.c
#   2004/04/16 10:50:24+02:00 perex@suse.cz +3 -1
#   ALSA CVS update
#   D:2004/04/16 16:50:24
#   C:Control Midlevel
#   A:Takashi Iwai <tiwai@suse.de>
#   F:core/control.c:1.42->1.43 
#   L:- fixed the compilation without CONFIG_PM.
#   L:- fixed the return value of POWER ioctl.
# 
# ChangeSet
#   2004/04/24 16:29:00+02:00 perex@suse.cz 
#   ALSA CVS update - Takashi Iwai <tiwai@suse.de>
#   AC97 Codec Core
#   - fixed the center/mic share switch on ALC65x.
#   - created AC97_SINGLE_VALUME() macro.
# 
# sound/pci/ac97/ac97_patch.c
#   2004/04/16 10:01:08+02:00 perex@suse.cz +2 -0
#   ALSA CVS update
#   D:2004/04/16 16:01:06
#   C:AC97 Codec Core
#   A:Takashi Iwai <tiwai@suse.de>
#   F:pci/ac97/ac97_codec.c:1.129->1.130 
#   F:pci/ac97/ac97_local.h:1.4->1.5 
#   F:pci/ac97/ac97_patch.c:1.43->1.44 
#   L:- fixed the center/mic share switch on ALC65x.
#   L:- created AC97_SINGLE_VALUME() macro.
# 
# sound/pci/ac97/ac97_local.h
#   2004/04/16 10:01:08+02:00 perex@suse.cz +2 -1
#   ALSA CVS update
#   D:2004/04/16 16:01:06
#   C:AC97 Codec Core
#   A:Takashi Iwai <tiwai@suse.de>
#   F:pci/ac97/ac97_codec.c:1.129->1.130 
#   F:pci/ac97/ac97_local.h:1.4->1.5 
#   F:pci/ac97/ac97_patch.c:1.43->1.44 
#   L:- fixed the center/mic share switch on ALC65x.
#   L:- created AC97_SINGLE_VALUME() macro.
# 
# sound/pci/ac97/ac97_codec.c
#   2004/04/16 10:01:06+02:00 perex@suse.cz +1 -1
#   ALSA CVS update
#   D:2004/04/16 16:01:06
#   C:AC97 Codec Core
#   A:Takashi Iwai <tiwai@suse.de>
#   F:pci/ac97/ac97_codec.c:1.129->1.130 
#   F:pci/ac97/ac97_local.h:1.4->1.5 
#   F:pci/ac97/ac97_patch.c:1.43->1.44 
#   L:- fixed the center/mic share switch on ALC65x.
#   L:- created AC97_SINGLE_VALUME() macro.
# 
# ChangeSet
#   2004/04/24 16:28:38+02:00 perex@suse.cz 
#   ALSA CVS update - Takashi Iwai <tiwai@suse.de>
#   ATIIXP driver
#   - added the PCI id entry for SB300.
#   - added the missing terminator to the PCI id list.
# 
# sound/pci/atiixp.c
#   2004/04/16 09:48:14+02:00 perex@suse.cz +3 -1
#   ALSA CVS update
#   D:2004/04/16 15:48:14
#   C:ATIIXP driver
#   A:Takashi Iwai <tiwai@suse.de>
#   F:pci/atiixp.c:1.5->1.6 
#   L:- added the PCI id entry for SB300.
#   L:- added the missing terminator to the PCI id list.
# 
# ChangeSet
#   2004/04/24 16:28:19+02:00 perex@suse.cz 
#   ALSA CVS update - Takashi Iwai <tiwai@suse.de>
#   PPC PMAC driver
#   fixed the missing function declarations.
# 
# sound/ppc/pmac.c
#   2004/04/16 09:20:18+02:00 perex@suse.cz +2 -0
#   ALSA CVS update
#   D:2004/04/16 15:20:18
#   C:PPC PMAC driver
#   A:Takashi Iwai <tiwai@suse.de>
#   F:ppc/pmac.c:1.28->1.29 
#   L:fixed the missing function declarations.
# 
# ChangeSet
#   2004/04/24 16:27:55+02:00 perex@suse.cz 
#   ALSA CVS update - Jaroslav Kysela <perex@suse.cz>
#   ICE1712 driver
#   <Dirk.Kalis@t-online.de>
#   added a control for default rate in the ice1712 driver
# 
# sound/pci/ice1712/ice1712.c
#   2004/04/16 08:08:35+02:00 perex@suse.cz +71 -0
#   ALSA CVS update
#   D:2004/04/16 14:08:35
#   C:ICE1712 driver
#   A:Jaroslav Kysela <perex@suse.cz>
#   F:pci/ice1712/ice1712.c:1.50->1.51 
#   L:<Dirk.Kalis@t-online.de>
#   L:added a control for default rate in the ice1712 driver
# 
# ChangeSet
#   2004/04/24 16:27:36+02:00 perex@suse.cz 
#   ALSA CVS update - Takashi Iwai <tiwai@suse.de>
#   PPC PMAC driver
#   another fix for the new suspend/resume.
# 
# sound/ppc/pmac.c
#   2004/04/16 04:25:56+02:00 perex@suse.cz +4 -10
#   ALSA CVS update
#   D:2004/04/16 10:25:56
#   C:PPC PMAC driver
#   A:Takashi Iwai <tiwai@suse.de>
#   F:ppc/pmac.c:1.27->1.28 
#   L:another fix for the new suspend/resume.
# 
# ChangeSet
#   2004/04/24 16:27:15+02:00 perex@suse.cz 
#   ALSA CVS update - Takashi Iwai <tiwai@suse.de>
#   Memalloc module
#   removed the obsolete hack for dev_alloc_coherent() with dev = 0.
# 
# sound/core/memalloc.c
#   2004/04/16 04:06:57+02:00 perex@suse.cz +0 -25
#   ALSA CVS update
#   D:2004/04/16 10:06:57
#   C:Memalloc module
#   A:Takashi Iwai <tiwai@suse.de>
#   F:core/memalloc.c:1.30->1.31 
#   L:removed the obsolete hack for dev_alloc_coherent() with dev = 0.
# 
# ChangeSet
#   2004/04/24 16:26:49+02:00 perex@suse.cz 
#   ALSA CVS update - Takashi Iwai <tiwai@suse.de>
#   PPC PMAC driver
#   fixed the suspend/resume with the new ALSA common callbacks.
# 
# sound/ppc/pmac.h
#   2004/04/15 11:23:18+02:00 perex@suse.cz +0 -1
#   ALSA CVS update
#   D:2004/04/15 17:23:18
#   C:PPC PMAC driver
#   A:Takashi Iwai <tiwai@suse.de>
#   F:ppc/pmac.c:1.26->1.27 
#   F:ppc/pmac.h:1.12->1.13 
#   L:fixed the suspend/resume with the new ALSA common callbacks.
# 
# sound/ppc/pmac.c
#   2004/04/15 11:23:18+02:00 perex@suse.cz +9 -36
#   ALSA CVS update
#   D:2004/04/15 17:23:18
#   C:PPC PMAC driver
#   A:Takashi Iwai <tiwai@suse.de>
#   F:ppc/pmac.c:1.26->1.27 
#   F:ppc/pmac.h:1.12->1.13 
#   L:fixed the suspend/resume with the new ALSA common callbacks.
# 
# ChangeSet
#   2004/04/24 15:59:07+02:00 perex@suse.cz 
#   ALSA CVS update - Takashi Iwai <tiwai@suse.de>
#   PCM Midlevel
#   fixed the deadlock of power_lock in suspend (by Terry Loftin)
# 
# sound/core/pcm_native.c
#   2004/04/15 04:16:13+02:00 perex@suse.cz +1 -1
#   ALSA CVS update
#   D:2004/04/15 10:16:13
#   C:PCM Midlevel
#   A:Takashi Iwai <tiwai@suse.de>
#   F:core/pcm_native.c:1.87->1.88 
#   L:fixed the deadlock of power_lock in suspend (by Terry Loftin)
# 
# ChangeSet
#   2004/04/24 15:58:48+02:00 perex@suse.cz 
#   ALSA CVS update - Takashi Iwai <tiwai@suse.de>
#   CS4281 driver,ES1968 driver,Maestro3 driver,ALI5451 driver
#   CS46xx driver,NM256 driver,Trident driver,YMFPCI driver
#   - call snd_ac97_suspend() in the suspend callback.
#   - suspend/resume secondary codecs, too.
# 
# sound/pci/ymfpci/ymfpci_main.c
#   2004/04/14 12:27:06+02:00 perex@suse.cz +1 -0
#   ALSA CVS update
#   D:2004/04/14 18:27:04
#   C:CS4281 driver,ES1968 driver,Maestro3 driver,ALI5451 driver
#   C:CS46xx driver,NM256 driver,Trident driver,YMFPCI driver
#   A:Takashi Iwai <tiwai@suse.de>
#   F:pci/cs4281.c:1.53->1.54 
#   F:pci/es1968.c:1.64->1.65 
#   F:pci/maestro3.c:1.51->1.52 
#   F:pci/ali5451/ali5451.c:1.47->1.48 
#   F:pci/cs46xx/cs46xx_lib.c:1.72->1.73 
#   F:pci/nm256/nm256.c:1.36->1.37 
#   F:pci/trident/trident_main.c:1.56->1.57 
#   F:pci/ymfpci/ymfpci_main.c:1.50->1.51 
#   L:- call snd_ac97_suspend() in the suspend callback.
#   L:- suspend/resume secondary codecs, too.
# 
# sound/pci/trident/trident_main.c
#   2004/04/14 12:27:05+02:00 perex@suse.cz +7 -0
#   ALSA CVS update
#   D:2004/04/14 18:27:04
#   C:CS4281 driver,ES1968 driver,Maestro3 driver,ALI5451 driver
#   C:CS46xx driver,NM256 driver,Trident driver,YMFPCI driver
#   A:Takashi Iwai <tiwai@suse.de>
#   F:pci/cs4281.c:1.53->1.54 
#   F:pci/es1968.c:1.64->1.65 
#   F:pci/maestro3.c:1.51->1.52 
#   F:pci/ali5451/ali5451.c:1.47->1.48 
#   F:pci/cs46xx/cs46xx_lib.c:1.72->1.73 
#   F:pci/nm256/nm256.c:1.36->1.37 
#   F:pci/trident/trident_main.c:1.56->1.57 
#   F:pci/ymfpci/ymfpci_main.c:1.50->1.51 
#   L:- call snd_ac97_suspend() in the suspend callback.
#   L:- suspend/resume secondary codecs, too.
# 
# sound/pci/nm256/nm256.c
#   2004/04/14 12:27:05+02:00 perex@suse.cz +1 -0
#   ALSA CVS update
#   D:2004/04/14 18:27:04
#   C:CS4281 driver,ES1968 driver,Maestro3 driver,ALI5451 driver
#   C:CS46xx driver,NM256 driver,Trident driver,YMFPCI driver
#   A:Takashi Iwai <tiwai@suse.de>
#   F:pci/cs4281.c:1.53->1.54 
#   F:pci/es1968.c:1.64->1.65 
#   F:pci/maestro3.c:1.51->1.52 
#   F:pci/ali5451/ali5451.c:1.47->1.48 
#   F:pci/cs46xx/cs46xx_lib.c:1.72->1.73 
#   F:pci/nm256/nm256.c:1.36->1.37 
#   F:pci/trident/trident_main.c:1.56->1.57 
#   F:pci/ymfpci/ymfpci_main.c:1.50->1.51 
#   L:- call snd_ac97_suspend() in the suspend callback.
#   L:- suspend/resume secondary codecs, too.
# 
# sound/pci/maestro3.c
#   2004/04/14 12:27:04+02:00 perex@suse.cz +1 -0
#   ALSA CVS update
#   D:2004/04/14 18:27:04
#   C:CS4281 driver,ES1968 driver,Maestro3 driver,ALI5451 driver
#   C:CS46xx driver,NM256 driver,Trident driver,YMFPCI driver
#   A:Takashi Iwai <tiwai@suse.de>
#   F:pci/cs4281.c:1.53->1.54 
#   F:pci/es1968.c:1.64->1.65 
#   F:pci/maestro3.c:1.51->1.52 
#   F:pci/ali5451/ali5451.c:1.47->1.48 
#   F:pci/cs46xx/cs46xx_lib.c:1.72->1.73 
#   F:pci/nm256/nm256.c:1.36->1.37 
#   F:pci/trident/trident_main.c:1.56->1.57 
#   F:pci/ymfpci/ymfpci_main.c:1.50->1.51 
#   L:- call snd_ac97_suspend() in the suspend callback.
#   L:- suspend/resume secondary codecs, too.
# 
# sound/pci/es1968.c
#   2004/04/14 12:27:04+02:00 perex@suse.cz +1 -0
#   ALSA CVS update
#   D:2004/04/14 18:27:04
#   C:CS4281 driver,ES1968 driver,Maestro3 driver,ALI5451 driver
#   C:CS46xx driver,NM256 driver,Trident driver,YMFPCI driver
#   A:Takashi Iwai <tiwai@suse.de>
#   F:pci/cs4281.c:1.53->1.54 
#   F:pci/es1968.c:1.64->1.65 
#   F:pci/maestro3.c:1.51->1.52 
#   F:pci/ali5451/ali5451.c:1.47->1.48 
#   F:pci/cs46xx/cs46xx_lib.c:1.72->1.73 
#   F:pci/nm256/nm256.c:1.36->1.37 
#   F:pci/trident/trident_main.c:1.56->1.57 
#   F:pci/ymfpci/ymfpci_main.c:1.50->1.51 
#   L:- call snd_ac97_suspend() in the suspend callback.
#   L:- suspend/resume secondary codecs, too.
# 
# sound/pci/cs46xx/cs46xx_lib.c
#   2004/04/14 12:27:05+02:00 perex@suse.cz +7 -0
#   ALSA CVS update
#   D:2004/04/14 18:27:04
#   C:CS4281 driver,ES1968 driver,Maestro3 driver,ALI5451 driver
#   C:CS46xx driver,NM256 driver,Trident driver,YMFPCI driver
#   A:Takashi Iwai <tiwai@suse.de>
#   F:pci/cs4281.c:1.53->1.54 
#   F:pci/es1968.c:1.64->1.65 
#   F:pci/maestro3.c:1.51->1.52 
#   F:pci/ali5451/ali5451.c:1.47->1.48 
#   F:pci/cs46xx/cs46xx_lib.c:1.72->1.73 
#   F:pci/nm256/nm256.c:1.36->1.37 
#   F:pci/trident/trident_main.c:1.56->1.57 
#   F:pci/ymfpci/ymfpci_main.c:1.50->1.51 
#   L:- call snd_ac97_suspend() in the suspend callback.
#   L:- suspend/resume secondary codecs, too.
# 
# sound/pci/cs4281.c
#   2004/04/14 12:27:04+02:00 perex@suse.cz +5 -0
#   ALSA CVS update
#   D:2004/04/14 18:27:04
#   C:CS4281 driver,ES1968 driver,Maestro3 driver,ALI5451 driver
#   C:CS46xx driver,NM256 driver,Trident driver,YMFPCI driver
#   A:Takashi Iwai <tiwai@suse.de>
#   F:pci/cs4281.c:1.53->1.54 
#   F:pci/es1968.c:1.64->1.65 
#   F:pci/maestro3.c:1.51->1.52 
#   F:pci/ali5451/ali5451.c:1.47->1.48 
#   F:pci/cs46xx/cs46xx_lib.c:1.72->1.73 
#   F:pci/nm256/nm256.c:1.36->1.37 
#   F:pci/trident/trident_main.c:1.56->1.57 
#   F:pci/ymfpci/ymfpci_main.c:1.50->1.51 
#   L:- call snd_ac97_suspend() in the suspend callback.
#   L:- suspend/resume secondary codecs, too.
# 
# sound/pci/ali5451/ali5451.c
#   2004/04/14 12:27:05+02:00 perex@suse.cz +6 -2
#   ALSA CVS update
#   D:2004/04/14 18:27:04
#   C:CS4281 driver,ES1968 driver,Maestro3 driver,ALI5451 driver
#   C:CS46xx driver,NM256 driver,Trident driver,YMFPCI driver
#   A:Takashi Iwai <tiwai@suse.de>
#   F:pci/cs4281.c:1.53->1.54 
#   F:pci/es1968.c:1.64->1.65 
#   F:pci/maestro3.c:1.51->1.52 
#   F:pci/ali5451/ali5451.c:1.47->1.48 
#   F:pci/cs46xx/cs46xx_lib.c:1.72->1.73 
#   F:pci/nm256/nm256.c:1.36->1.37 
#   F:pci/trident/trident_main.c:1.56->1.57 
#   F:pci/ymfpci/ymfpci_main.c:1.50->1.51 
#   L:- call snd_ac97_suspend() in the suspend callback.
#   L:- suspend/resume secondary codecs, too.
# 
# ChangeSet
#   2004/04/24 15:58:26+02:00 perex@suse.cz 
#   ALSA CVS update - Takashi Iwai <tiwai@suse.de>
#   AC97 Codec Core
#   - export snd_ac97_suspend().
#   - mute MASTER and HEADPHONE volumes in suspend to avoid possible clicks.
# 
# sound/pci/ac97/ac97_codec.c
#   2004/04/14 12:25:51+02:00 perex@suse.cz +9 -0
#   ALSA CVS update
#   D:2004/04/14 18:25:51
#   C:AC97 Codec Core
#   A:Takashi Iwai <tiwai@suse.de>
#   F:pci/ac97/ac97_codec.c:1.128->1.129 
#   L:- export snd_ac97_suspend().
#   L:- mute MASTER and HEADPHONE volumes in suspend to avoid possible clicks.
# 
# ChangeSet
#   2004/04/24 15:58:04+02:00 perex@suse.cz 
#   ALSA CVS update - Takashi Iwai <tiwai@suse.de>
#   Intel8x0 driver,Intel8x0-modem driver
#   - probe only audio (intel8x0) or modem (intel8x0m) codecs.
#   - call snd_ac97_suspend() in the suspend callback.
# 
# sound/pci/intel8x0m.c
#   2004/04/14 12:24:32+02:00 perex@suse.cz +3 -0
#   ALSA CVS update
#   D:2004/04/14 18:24:32
#   C:Intel8x0 driver,Intel8x0-modem driver
#   A:Takashi Iwai <tiwai@suse.de>
#   F:pci/intel8x0.c:1.134->1.135 
#   F:pci/intel8x0m.c:1.4->1.5 
#   L:- probe only audio (intel8x0) or modem (intel8x0m) codecs.
#   L:- call snd_ac97_suspend() in the suspend callback.
# 
# sound/pci/intel8x0.c
#   2004/04/14 12:24:32+02:00 perex@suse.cz +6 -1
#   ALSA CVS update
#   D:2004/04/14 18:24:32
#   C:Intel8x0 driver,Intel8x0-modem driver
#   A:Takashi Iwai <tiwai@suse.de>
#   F:pci/intel8x0.c:1.134->1.135 
#   F:pci/intel8x0m.c:1.4->1.5 
#   L:- probe only audio (intel8x0) or modem (intel8x0m) codecs.
#   L:- call snd_ac97_suspend() in the suspend callback.
# 
# ChangeSet
#   2004/04/24 15:57:44+02:00 perex@suse.cz 
#   ALSA CVS update - Clemens Ladisch <clemens@ladisch.de>
#   USB generic driver
#   Edirol UA-700 advanced modes support
# 
# sound/usb/usbquirks.h
#   2004/04/14 12:11:22+02:00 perex@suse.cz +24 -6
#   ALSA CVS update
#   D:2004/04/14 18:11:20
#   C:USB generic driver
#   A:Clemens Ladisch <clemens@ladisch.de>
#   F:usb/usbaudio.c:1.98->1.99 
#   F:usb/usbaudio.h:1.30->1.31 
#   F:usb/usbquirks.h:1.30->1.31 
#   L:Edirol UA-700 advanced modes support
# 
# sound/usb/usbaudio.h
#   2004/04/14 12:11:21+02:00 perex@suse.cz +3 -0
#   ALSA CVS update
#   D:2004/04/14 18:11:20
#   C:USB generic driver
#   A:Clemens Ladisch <clemens@ladisch.de>
#   F:usb/usbaudio.c:1.98->1.99 
#   F:usb/usbaudio.h:1.30->1.31 
#   F:usb/usbquirks.h:1.30->1.31 
#   L:Edirol UA-700 advanced modes support
# 
# sound/usb/usbaudio.c
#   2004/04/14 12:11:20+02:00 perex@suse.cz +79 -0
#   ALSA CVS update
#   D:2004/04/14 18:11:20
#   C:USB generic driver
#   A:Clemens Ladisch <clemens@ladisch.de>
#   F:usb/usbaudio.c:1.98->1.99 
#   F:usb/usbaudio.h:1.30->1.31 
#   F:usb/usbquirks.h:1.30->1.31 
#   L:Edirol UA-700 advanced modes support
# 
# ChangeSet
#   2004/04/24 15:57:23+02:00 perex@suse.cz 
#   ALSA CVS update - Takashi Iwai <tiwai@suse.de>
#   Memalloc module
#   fixed the allocation of coherent DMA pages under 32bit mask.
# 
# sound/core/memalloc.c
#   2004/04/14 04:44:16+02:00 perex@suse.cz +9 -2
#   ALSA CVS update
#   D:2004/04/14 10:44:16
#   C:Memalloc module
#   A:Takashi Iwai <tiwai@suse.de>
#   F:core/memalloc.c:1.29->1.30 
#   L:fixed the allocation of coherent DMA pages under 32bit mask.
# 
# ChangeSet
#   2004/04/24 15:57:05+02:00 perex@suse.cz 
#   ALSA CVS update - Takashi Iwai <tiwai@suse.de>
#   Intel8x0 driver
#   fixed MX440 workaround in suspend/resume.
# 
# sound/pci/intel8x0.c
#   2004/04/13 11:22:54+02:00 perex@suse.cz +17 -0
#   ALSA CVS update
#   D:2004/04/13 17:22:54
#   C:Intel8x0 driver
#   A:Takashi Iwai <tiwai@suse.de>
#   F:pci/intel8x0.c:1.133->1.134 
#   L:fixed MX440 workaround in suspend/resume.
# 
# ChangeSet
#   2004/04/24 15:56:47+02:00 perex@suse.cz 
#   ALSA CVS update - Takashi Iwai <tiwai@suse.de>
#   ICE1712 driver
#   added Event Electronics EZ8 support by Doug McLain <nostar@comcast.net>
# 
# sound/pci/ice1712/ice1712.h
#   2004/04/13 10:39:21+02:00 perex@suse.cz +1 -0
#   ALSA CVS update
#   D:2004/04/13 16:39:21
#   C:ICE1712 driver
#   A:Takashi Iwai <tiwai@suse.de>
#   F:pci/ice1712/hoontech.c:1.3->1.4 
#   F:pci/ice1712/ice1712.c:1.49->1.50 
#   F:pci/ice1712/ice1712.h:1.18->1.19 
#   L:added Event Electronics EZ8 support by Doug McLain <nostar@comcast.net>
# 
# sound/pci/ice1712/ice1712.c
#   2004/04/13 10:39:21+02:00 perex@suse.cz +11 -2
#   ALSA CVS update
#   D:2004/04/13 16:39:21
#   C:ICE1712 driver
#   A:Takashi Iwai <tiwai@suse.de>
#   F:pci/ice1712/hoontech.c:1.3->1.4 
#   F:pci/ice1712/ice1712.c:1.49->1.50 
#   F:pci/ice1712/ice1712.h:1.18->1.19 
#   L:added Event Electronics EZ8 support by Doug McLain <nostar@comcast.net>
# 
# sound/pci/ice1712/hoontech.c
#   2004/04/13 10:39:21+02:00 perex@suse.cz +14 -0
#   ALSA CVS update
#   D:2004/04/13 16:39:21
#   C:ICE1712 driver
#   A:Takashi Iwai <tiwai@suse.de>
#   F:pci/ice1712/hoontech.c:1.3->1.4 
#   F:pci/ice1712/ice1712.c:1.49->1.50 
#   F:pci/ice1712/ice1712.h:1.18->1.19 
#   L:added Event Electronics EZ8 support by Doug McLain <nostar@comcast.net>
# 
# ChangeSet
#   2004/04/24 15:56:24+02:00 perex@suse.cz 
#   ALSA CVS update - Takashi Iwai <tiwai@suse.de>
#   PCI drivers,au88x0 driver
#   bugfixes and VIA/AMD chipset automatic workaround by Manuel Jander <manuel.jander@mat.utfsm.cl>
# 
# sound/pci/au88x0/au88x0_synth.c
#   2004/04/13 10:26:28+02:00 perex@suse.cz +13 -11
#   ALSA CVS update
#   D:2004/04/13 16:26:27
#   C:PCI drivers,au88x0 driver
#   A:Takashi Iwai <tiwai@suse.de>
#   F:pci/Kconfig:1.25->1.26 
#   F:pci/au88x0/au8810.h:1.2->1.3 
#   F:pci/au88x0/au8820.h:1.2->1.3 
#   F:pci/au88x0/au8830.h:1.2->1.3 
#   F:pci/au88x0/au88x0.c:1.8->1.9 
#   F:pci/au88x0/au88x0.h:1.3->1.4 
#   F:pci/au88x0/au88x0_a3d.c:1.2->1.3 
#   F:pci/au88x0/au88x0_core.c:1.3->1.4 
#   F:pci/au88x0/au88x0_eq.c:1.1->1.2 
#   F:pci/au88x0/au88x0_game.c:1.2->1.3 
#   F:pci/au88x0/au88x0_pcm.c:1.2->1.3 
#   F:pci/au88x0/au88x0_synth.c:1.1->1.2 
#   L:bugfixes and VIA/AMD chipset automatic workaround by Manuel Jander <manuel.jander@mat.utfsm.cl>
# 
# sound/pci/au88x0/au88x0_pcm.c
#   2004/04/13 10:26:28+02:00 perex@suse.cz +9 -14
#   ALSA CVS update
#   D:2004/04/13 16:26:27
#   C:PCI drivers,au88x0 driver
#   A:Takashi Iwai <tiwai@suse.de>
#   F:pci/Kconfig:1.25->1.26 
#   F:pci/au88x0/au8810.h:1.2->1.3 
#   F:pci/au88x0/au8820.h:1.2->1.3 
#   F:pci/au88x0/au8830.h:1.2->1.3 
#   F:pci/au88x0/au88x0.c:1.8->1.9 
#   F:pci/au88x0/au88x0.h:1.3->1.4 
#   F:pci/au88x0/au88x0_a3d.c:1.2->1.3 
#   F:pci/au88x0/au88x0_core.c:1.3->1.4 
#   F:pci/au88x0/au88x0_eq.c:1.1->1.2 
#   F:pci/au88x0/au88x0_game.c:1.2->1.3 
#   F:pci/au88x0/au88x0_pcm.c:1.2->1.3 
#   F:pci/au88x0/au88x0_synth.c:1.1->1.2 
#   L:bugfixes and VIA/AMD chipset automatic workaround by Manuel Jander <manuel.jander@mat.utfsm.cl>
# 
# sound/pci/au88x0/au88x0_game.c
#   2004/04/13 10:26:28+02:00 perex@suse.cz +7 -5
#   ALSA CVS update
#   D:2004/04/13 16:26:27
#   C:PCI drivers,au88x0 driver
#   A:Takashi Iwai <tiwai@suse.de>
#   F:pci/Kconfig:1.25->1.26 
#   F:pci/au88x0/au8810.h:1.2->1.3 
#   F:pci/au88x0/au8820.h:1.2->1.3 
#   F:pci/au88x0/au8830.h:1.2->1.3 
#   F:pci/au88x0/au88x0.c:1.8->1.9 
#   F:pci/au88x0/au88x0.h:1.3->1.4 
#   F:pci/au88x0/au88x0_a3d.c:1.2->1.3 
#   F:pci/au88x0/au88x0_core.c:1.3->1.4 
#   F:pci/au88x0/au88x0_eq.c:1.1->1.2 
#   F:pci/au88x0/au88x0_game.c:1.2->1.3 
#   F:pci/au88x0/au88x0_pcm.c:1.2->1.3 
#   F:pci/au88x0/au88x0_synth.c:1.1->1.2 
#   L:bugfixes and VIA/AMD chipset automatic workaround by Manuel Jander <manuel.jander@mat.utfsm.cl>
# 
# sound/pci/au88x0/au88x0_eq.c
#   2004/04/13 10:26:28+02:00 perex@suse.cz +3 -1
#   ALSA CVS update
#   D:2004/04/13 16:26:27
#   C:PCI drivers,au88x0 driver
#   A:Takashi Iwai <tiwai@suse.de>
#   F:pci/Kconfig:1.25->1.26 
#   F:pci/au88x0/au8810.h:1.2->1.3 
#   F:pci/au88x0/au8820.h:1.2->1.3 
#   F:pci/au88x0/au8830.h:1.2->1.3 
#   F:pci/au88x0/au88x0.c:1.8->1.9 
#   F:pci/au88x0/au88x0.h:1.3->1.4 
#   F:pci/au88x0/au88x0_a3d.c:1.2->1.3 
#   F:pci/au88x0/au88x0_core.c:1.3->1.4 
#   F:pci/au88x0/au88x0_eq.c:1.1->1.2 
#   F:pci/au88x0/au88x0_game.c:1.2->1.3 
#   F:pci/au88x0/au88x0_pcm.c:1.2->1.3 
#   F:pci/au88x0/au88x0_synth.c:1.1->1.2 
#   L:bugfixes and VIA/AMD chipset automatic workaround by Manuel Jander <manuel.jander@mat.utfsm.cl>
# 
# sound/pci/au88x0/au88x0_core.c
#   2004/04/13 10:26:28+02:00 perex@suse.cz +27 -34
#   ALSA CVS update
#   D:2004/04/13 16:26:27
#   C:PCI drivers,au88x0 driver
#   A:Takashi Iwai <tiwai@suse.de>
#   F:pci/Kconfig:1.25->1.26 
#   F:pci/au88x0/au8810.h:1.2->1.3 
#   F:pci/au88x0/au8820.h:1.2->1.3 
#   F:pci/au88x0/au8830.h:1.2->1.3 
#   F:pci/au88x0/au88x0.c:1.8->1.9 
#   F:pci/au88x0/au88x0.h:1.3->1.4 
#   F:pci/au88x0/au88x0_a3d.c:1.2->1.3 
#   F:pci/au88x0/au88x0_core.c:1.3->1.4 
#   F:pci/au88x0/au88x0_eq.c:1.1->1.2 
#   F:pci/au88x0/au88x0_game.c:1.2->1.3 
#   F:pci/au88x0/au88x0_pcm.c:1.2->1.3 
#   F:pci/au88x0/au88x0_synth.c:1.1->1.2 
#   L:bugfixes and VIA/AMD chipset automatic workaround by Manuel Jander <manuel.jander@mat.utfsm.cl>
# 
# sound/pci/au88x0/au88x0_a3d.c
#   2004/04/13 10:26:28+02:00 perex@suse.cz +6 -0
#   ALSA CVS update
#   D:2004/04/13 16:26:27
#   C:PCI drivers,au88x0 driver
#   A:Takashi Iwai <tiwai@suse.de>
#   F:pci/Kconfig:1.25->1.26 
#   F:pci/au88x0/au8810.h:1.2->1.3 
#   F:pci/au88x0/au8820.h:1.2->1.3 
#   F:pci/au88x0/au8830.h:1.2->1.3 
#   F:pci/au88x0/au88x0.c:1.8->1.9 
#   F:pci/au88x0/au88x0.h:1.3->1.4 
#   F:pci/au88x0/au88x0_a3d.c:1.2->1.3 
#   F:pci/au88x0/au88x0_core.c:1.3->1.4 
#   F:pci/au88x0/au88x0_eq.c:1.1->1.2 
#   F:pci/au88x0/au88x0_game.c:1.2->1.3 
#   F:pci/au88x0/au88x0_pcm.c:1.2->1.3 
#   F:pci/au88x0/au88x0_synth.c:1.1->1.2 
#   L:bugfixes and VIA/AMD chipset automatic workaround by Manuel Jander <manuel.jander@mat.utfsm.cl>
# 
# sound/pci/au88x0/au88x0.h
#   2004/04/13 10:26:27+02:00 perex@suse.cz +9 -7
#   ALSA CVS update
#   D:2004/04/13 16:26:27
#   C:PCI drivers,au88x0 driver
#   A:Takashi Iwai <tiwai@suse.de>
#   F:pci/Kconfig:1.25->1.26 
#   F:pci/au88x0/au8810.h:1.2->1.3 
#   F:pci/au88x0/au8820.h:1.2->1.3 
#   F:pci/au88x0/au8830.h:1.2->1.3 
#   F:pci/au88x0/au88x0.c:1.8->1.9 
#   F:pci/au88x0/au88x0.h:1.3->1.4 
#   F:pci/au88x0/au88x0_a3d.c:1.2->1.3 
#   F:pci/au88x0/au88x0_core.c:1.3->1.4 
#   F:pci/au88x0/au88x0_eq.c:1.1->1.2 
#   F:pci/au88x0/au88x0_game.c:1.2->1.3 
#   F:pci/au88x0/au88x0_pcm.c:1.2->1.3 
#   F:pci/au88x0/au88x0_synth.c:1.1->1.2 
#   L:bugfixes and VIA/AMD chipset automatic workaround by Manuel Jander <manuel.jander@mat.utfsm.cl>
# 
# sound/pci/au88x0/au88x0.c
#   2004/04/13 10:26:27+02:00 perex@suse.cz +54 -44
#   ALSA CVS update
#   D:2004/04/13 16:26:27
#   C:PCI drivers,au88x0 driver
#   A:Takashi Iwai <tiwai@suse.de>
#   F:pci/Kconfig:1.25->1.26 
#   F:pci/au88x0/au8810.h:1.2->1.3 
#   F:pci/au88x0/au8820.h:1.2->1.3 
#   F:pci/au88x0/au8830.h:1.2->1.3 
#   F:pci/au88x0/au88x0.c:1.8->1.9 
#   F:pci/au88x0/au88x0.h:1.3->1.4 
#   F:pci/au88x0/au88x0_a3d.c:1.2->1.3 
#   F:pci/au88x0/au88x0_core.c:1.3->1.4 
#   F:pci/au88x0/au88x0_eq.c:1.1->1.2 
#   F:pci/au88x0/au88x0_game.c:1.2->1.3 
#   F:pci/au88x0/au88x0_pcm.c:1.2->1.3 
#   F:pci/au88x0/au88x0_synth.c:1.1->1.2 
#   L:bugfixes and VIA/AMD chipset automatic workaround by Manuel Jander <manuel.jander@mat.utfsm.cl>
# 
# sound/pci/au88x0/au8830.h
#   2004/04/13 10:26:27+02:00 perex@suse.cz +4 -4
#   ALSA CVS update
#   D:2004/04/13 16:26:27
#   C:PCI drivers,au88x0 driver
#   A:Takashi Iwai <tiwai@suse.de>
#   F:pci/Kconfig:1.25->1.26 
#   F:pci/au88x0/au8810.h:1.2->1.3 
#   F:pci/au88x0/au8820.h:1.2->1.3 
#   F:pci/au88x0/au8830.h:1.2->1.3 
#   F:pci/au88x0/au88x0.c:1.8->1.9 
#   F:pci/au88x0/au88x0.h:1.3->1.4 
#   F:pci/au88x0/au88x0_a3d.c:1.2->1.3 
#   F:pci/au88x0/au88x0_core.c:1.3->1.4 
#   F:pci/au88x0/au88x0_eq.c:1.1->1.2 
#   F:pci/au88x0/au88x0_game.c:1.2->1.3 
#   F:pci/au88x0/au88x0_pcm.c:1.2->1.3 
#   F:pci/au88x0/au88x0_synth.c:1.1->1.2 
#   L:bugfixes and VIA/AMD chipset automatic workaround by Manuel Jander <manuel.jander@mat.utfsm.cl>
# 
# sound/pci/au88x0/au8820.h
#   2004/04/13 10:26:27+02:00 perex@suse.cz +2 -2
#   ALSA CVS update
#   D:2004/04/13 16:26:27
#   C:PCI drivers,au88x0 driver
#   A:Takashi Iwai <tiwai@suse.de>
#   F:pci/Kconfig:1.25->1.26 
#   F:pci/au88x0/au8810.h:1.2->1.3 
#   F:pci/au88x0/au8820.h:1.2->1.3 
#   F:pci/au88x0/au8830.h:1.2->1.3 
#   F:pci/au88x0/au88x0.c:1.8->1.9 
#   F:pci/au88x0/au88x0.h:1.3->1.4 
#   F:pci/au88x0/au88x0_a3d.c:1.2->1.3 
#   F:pci/au88x0/au88x0_core.c:1.3->1.4 
#   F:pci/au88x0/au88x0_eq.c:1.1->1.2 
#   F:pci/au88x0/au88x0_game.c:1.2->1.3 
#   F:pci/au88x0/au88x0_pcm.c:1.2->1.3 
#   F:pci/au88x0/au88x0_synth.c:1.1->1.2 
#   L:bugfixes and VIA/AMD chipset automatic workaround by Manuel Jander <manuel.jander@mat.utfsm.cl>
# 
# sound/pci/au88x0/au8810.h
#   2004/04/13 10:26:27+02:00 perex@suse.cz +62 -44
#   ALSA CVS update
#   D:2004/04/13 16:26:27
#   C:PCI drivers,au88x0 driver
#   A:Takashi Iwai <tiwai@suse.de>
#   F:pci/Kconfig:1.25->1.26 
#   F:pci/au88x0/au8810.h:1.2->1.3 
#   F:pci/au88x0/au8820.h:1.2->1.3 
#   F:pci/au88x0/au8830.h:1.2->1.3 
#   F:pci/au88x0/au88x0.c:1.8->1.9 
#   F:pci/au88x0/au88x0.h:1.3->1.4 
#   F:pci/au88x0/au88x0_a3d.c:1.2->1.3 
#   F:pci/au88x0/au88x0_core.c:1.3->1.4 
#   F:pci/au88x0/au88x0_eq.c:1.1->1.2 
#   F:pci/au88x0/au88x0_game.c:1.2->1.3 
#   F:pci/au88x0/au88x0_pcm.c:1.2->1.3 
#   F:pci/au88x0/au88x0_synth.c:1.1->1.2 
#   L:bugfixes and VIA/AMD chipset automatic workaround by Manuel Jander <manuel.jander@mat.utfsm.cl>
# 
# sound/pci/Kconfig
#   2004/04/13 10:26:27+02:00 perex@suse.cz +8 -0
#   ALSA CVS update
#   D:2004/04/13 16:26:27
#   C:PCI drivers,au88x0 driver
#   A:Takashi Iwai <tiwai@suse.de>
#   F:pci/Kconfig:1.25->1.26 
#   F:pci/au88x0/au8810.h:1.2->1.3 
#   F:pci/au88x0/au8820.h:1.2->1.3 
#   F:pci/au88x0/au8830.h:1.2->1.3 
#   F:pci/au88x0/au88x0.c:1.8->1.9 
#   F:pci/au88x0/au88x0.h:1.3->1.4 
#   F:pci/au88x0/au88x0_a3d.c:1.2->1.3 
#   F:pci/au88x0/au88x0_core.c:1.3->1.4 
#   F:pci/au88x0/au88x0_eq.c:1.1->1.2 
#   F:pci/au88x0/au88x0_game.c:1.2->1.3 
#   F:pci/au88x0/au88x0_pcm.c:1.2->1.3 
#   F:pci/au88x0/au88x0_synth.c:1.1->1.2 
#   L:bugfixes and VIA/AMD chipset automatic workaround by Manuel Jander <manuel.jander@mat.utfsm.cl>
# 
# ChangeSet
#   2004/04/24 15:50:42+02:00 perex@suse.cz 
#   ALSA CVS update - Takashi Iwai <tiwai@suse.de>
#   Documentation,ALS4000 driver,ATIIXP driver,AZT3328 driver,BT87x driver
#   CMIPCI driver,CS4281 driver,ENS1370/1+ driver,ES1938 driver
#   ES1968 driver,FM801 driver,Intel8x0 driver,Intel8x0-modem driver
#   Maestro3 driver,RME32 driver,RME96 driver,SonicVibes driver
#   VIA82xx driver,ALI5451 driver,au88x0 driver,CS46xx driver
#   EMU10K1/EMU10K2 driver,ICE1712 driver,ICE1724 driver,KORG1212 driver
#   MIXART driver,NM256 driver,RME HDSP driver,RME9652 driver
#   Trident driver,Digigram VX222 driver,YMFPCI driver
#   - removed superfluous warning messages after pci_module_init().
#     (2.6 kernel doesn't return the error anyway...)
#   - store card pointer in pci_drvdata instead of chip pointer.
#     this would make easier to add PM support.
# 
# sound/pci/ymfpci/ymfpci.c
#   2004/04/13 09:59:17+02:00 perex@suse.cz +1 -9
#   ALSA CVS update
#   D:2004/04/13 15:58:59
#   C:Documentation,ALS4000 driver,ATIIXP driver,AZT3328 driver,BT87x driver
#   C:CMIPCI driver,CS4281 driver,ENS1370/1+ driver,ES1938 driver
#   C:ES1968 driver,FM801 driver,Intel8x0 driver,Intel8x0-modem driver
#   C:Maestro3 driver,RME32 driver,RME96 driver,SonicVibes driver
#   C:VIA82xx driver,ALI5451 driver,au88x0 driver,CS46xx driver
#   C:EMU10K1/EMU10K2 driver,ICE1712 driver,ICE1724 driver,KORG1212 driver
#   C:MIXART driver,NM256 driver,RME HDSP driver,RME9652 driver
#   C:Trident driver,Digigram VX222 driver,YMFPCI driver
#   A:Takashi Iwai <tiwai@suse.de>
#   F:Documentation/DocBook/writing-an-alsa-driver.tmpl:1.26->1.27 
#   F:pci/als4000.c:1.32->1.33 
#   F:pci/atiixp.c:1.4->1.5 
#   F:pci/azt3328.c:1.12->1.13 
#   F:pci/bt87x.c:1.4->1.5 
#   F:pci/cmipci.c:1.62->1.63 
#   F:pci/cs4281.c:1.52->1.53 
#   F:pci/ens1370.c:1.59->1.60 
#   F:pci/es1938.c:1.34->1.35 
#   F:pci/es1968.c:1.63->1.64 
#   F:pci/fm801.c:1.44->1.45 
#   F:pci/intel8x0.c:1.132->1.133 
#   F:pci/intel8x0m.c:1.3->1.4 
#   F:pci/maestro3.c:1.50->1.51 
#   F:pci/rme32.c:1.32->1.33 
#   F:pci/rme96.c:1.34->1.35 
#   F:pci/sonicvibes.c:1.34->1.35 
#   F:pci/via82xx.c:1.95->1.96 
#   F:pci/ali5451/ali5451.c:1.46->1.47 
#   F:pci/au88x0/au88x0.c:1.7->1.8 
#   F:pci/cs46xx/cs46xx.c:1.26->1.27 
#   F:pci/emu10k1/emu10k1.c:1.23->1.24 
#   F:pci/ice1712/ice1712.c:1.48->1.49 
#   F:pci/ice1712/ice1724.c:1.28->1.29 
#   F:pci/korg1212/korg1212.c:1.37->1.38 
#   F:pci/mixart/mixart.c:1.7->1.8 
#   F:pci/nm256/nm256.c:1.35->1.36 
#   F:pci/rme9652/hdsp.c:1.55->1.56 
#   F:pci/rme9652/rme9652.c:1.43->1.44 
#   F:pci/trident/trident.c:1.23->1.24 
#   F:pci/vx222/vx222.c:1.4->1.5 
#   F:pci/ymfpci/ymfpci.c:1.35->1.36 
#   L:- removed superfluous warning messages after pci_module_init().
#   L:  (2.6 kernel doesn't return the error anyway...)
#   L:- store card pointer in pci_drvdata instead of chip pointer.
#   L:  this would make easier to add PM support.
# 
# sound/pci/vx222/vx222.c
#   2004/04/13 09:59:17+02:00 perex@suse.cz +1 -9
#   ALSA CVS update
#   D:2004/04/13 15:58:59
#   C:Documentation,ALS4000 driver,ATIIXP driver,AZT3328 driver,BT87x driver
#   C:CMIPCI driver,CS4281 driver,ENS1370/1+ driver,ES1938 driver
#   C:ES1968 driver,FM801 driver,Intel8x0 driver,Intel8x0-modem driver
#   C:Maestro3 driver,RME32 driver,RME96 driver,SonicVibes driver
#   C:VIA82xx driver,ALI5451 driver,au88x0 driver,CS46xx driver
#   C:EMU10K1/EMU10K2 driver,ICE1712 driver,ICE1724 driver,KORG1212 driver
#   C:MIXART driver,NM256 driver,RME HDSP driver,RME9652 driver
#   C:Trident driver,Digigram VX222 driver,YMFPCI driver
#   A:Takashi Iwai <tiwai@suse.de>
#   F:Documentation/DocBook/writing-an-alsa-driver.tmpl:1.26->1.27 
#   F:pci/als4000.c:1.32->1.33 
#   F:pci/atiixp.c:1.4->1.5 
#   F:pci/azt3328.c:1.12->1.13 
#   F:pci/bt87x.c:1.4->1.5 
#   F:pci/cmipci.c:1.62->1.63 
#   F:pci/cs4281.c:1.52->1.53 
#   F:pci/ens1370.c:1.59->1.60 
#   F:pci/es1938.c:1.34->1.35 
#   F:pci/es1968.c:1.63->1.64 
#   F:pci/fm801.c:1.44->1.45 
#   F:pci/intel8x0.c:1.132->1.133 
#   F:pci/intel8x0m.c:1.3->1.4 
#   F:pci/maestro3.c:1.50->1.51 
#   F:pci/rme32.c:1.32->1.33 
#   F:pci/rme96.c:1.34->1.35 
#   F:pci/sonicvibes.c:1.34->1.35 
#   F:pci/via82xx.c:1.95->1.96 
#   F:pci/ali5451/ali5451.c:1.46->1.47 
#   F:pci/au88x0/au88x0.c:1.7->1.8 
#   F:pci/cs46xx/cs46xx.c:1.26->1.27 
#   F:pci/emu10k1/emu10k1.c:1.23->1.24 
#   F:pci/ice1712/ice1712.c:1.48->1.49 
#   F:pci/ice1712/ice1724.c:1.28->1.29 
#   F:pci/korg1212/korg1212.c:1.37->1.38 
#   F:pci/mixart/mixart.c:1.7->1.8 
#   F:pci/nm256/nm256.c:1.35->1.36 
#   F:pci/rme9652/hdsp.c:1.55->1.56 
#   F:pci/rme9652/rme9652.c:1.43->1.44 
#   F:pci/trident/trident.c:1.23->1.24 
#   F:pci/vx222/vx222.c:1.4->1.5 
#   F:pci/ymfpci/ymfpci.c:1.35->1.36 
#   L:- removed superfluous warning messages after pci_module_init().
#   L:  (2.6 kernel doesn't return the error anyway...)
#   L:- store card pointer in pci_drvdata instead of chip pointer.
#   L:  this would make easier to add PM support.
# 
# sound/pci/via82xx.c
#   2004/04/13 09:59:00+02:00 perex@suse.cz +1 -9
#   ALSA CVS update
#   D:2004/04/13 15:58:59
#   C:Documentation,ALS4000 driver,ATIIXP driver,AZT3328 driver,BT87x driver
#   C:CMIPCI driver,CS4281 driver,ENS1370/1+ driver,ES1938 driver
#   C:ES1968 driver,FM801 driver,Intel8x0 driver,Intel8x0-modem driver
#   C:Maestro3 driver,RME32 driver,RME96 driver,SonicVibes driver
#   C:VIA82xx driver,ALI5451 driver,au88x0 driver,CS46xx driver
#   C:EMU10K1/EMU10K2 driver,ICE1712 driver,ICE1724 driver,KORG1212 driver
#   C:MIXART driver,NM256 driver,RME HDSP driver,RME9652 driver
#   C:Trident driver,Digigram VX222 driver,YMFPCI driver
#   A:Takashi Iwai <tiwai@suse.de>
#   F:Documentation/DocBook/writing-an-alsa-driver.tmpl:1.26->1.27 
#   F:pci/als4000.c:1.32->1.33 
#   F:pci/atiixp.c:1.4->1.5 
#   F:pci/azt3328.c:1.12->1.13 
#   F:pci/bt87x.c:1.4->1.5 
#   F:pci/cmipci.c:1.62->1.63 
#   F:pci/cs4281.c:1.52->1.53 
#   F:pci/ens1370.c:1.59->1.60 
#   F:pci/es1938.c:1.34->1.35 
#   F:pci/es1968.c:1.63->1.64 
#   F:pci/fm801.c:1.44->1.45 
#   F:pci/intel8x0.c:1.132->1.133 
#   F:pci/intel8x0m.c:1.3->1.4 
#   F:pci/maestro3.c:1.50->1.51 
#   F:pci/rme32.c:1.32->1.33 
#   F:pci/rme96.c:1.34->1.35 
#   F:pci/sonicvibes.c:1.34->1.35 
#   F:pci/via82xx.c:1.95->1.96 
#   F:pci/ali5451/ali5451.c:1.46->1.47 
#   F:pci/au88x0/au88x0.c:1.7->1.8 
#   F:pci/cs46xx/cs46xx.c:1.26->1.27 
#   F:pci/emu10k1/emu10k1.c:1.23->1.24 
#   F:pci/ice1712/ice1712.c:1.48->1.49 
#   F:pci/ice1712/ice1724.c:1.28->1.29 
#   F:pci/korg1212/korg1212.c:1.37->1.38 
#   F:pci/mixart/mixart.c:1.7->1.8 
#   F:pci/nm256/nm256.c:1.35->1.36 
#   F:pci/rme9652/hdsp.c:1.55->1.56 
#   F:pci/rme9652/rme9652.c:1.43->1.44 
#   F:pci/trident/trident.c:1.23->1.24 
#   F:pci/vx222/vx222.c:1.4->1.5 
#   F:pci/ymfpci/ymfpci.c:1.35->1.36 
#   L:- removed superfluous warning messages after pci_module_init().
#   L:  (2.6 kernel doesn't return the error anyway...)
#   L:- store card pointer in pci_drvdata instead of chip pointer.
#   L:  this would make easier to add PM support.
# 
# sound/pci/trident/trident.c
#   2004/04/13 09:59:17+02:00 perex@suse.cz +1 -9
#   ALSA CVS update
#   D:2004/04/13 15:58:59
#   C:Documentation,ALS4000 driver,ATIIXP driver,AZT3328 driver,BT87x driver
#   C:CMIPCI driver,CS4281 driver,ENS1370/1+ driver,ES1938 driver
#   C:ES1968 driver,FM801 driver,Intel8x0 driver,Intel8x0-modem driver
#   C:Maestro3 driver,RME32 driver,RME96 driver,SonicVibes driver
#   C:VIA82xx driver,ALI5451 driver,au88x0 driver,CS46xx driver
#   C:EMU10K1/EMU10K2 driver,ICE1712 driver,ICE1724 driver,KORG1212 driver
#   C:MIXART driver,NM256 driver,RME HDSP driver,RME9652 driver
#   C:Trident driver,Digigram VX222 driver,YMFPCI driver
#   A:Takashi Iwai <tiwai@suse.de>
#   F:Documentation/DocBook/writing-an-alsa-driver.tmpl:1.26->1.27 
#   F:pci/als4000.c:1.32->1.33 
#   F:pci/atiixp.c:1.4->1.5 
#   F:pci/azt3328.c:1.12->1.13 
#   F:pci/bt87x.c:1.4->1.5 
#   F:pci/cmipci.c:1.62->1.63 
#   F:pci/cs4281.c:1.52->1.53 
#   F:pci/ens1370.c:1.59->1.60 
#   F:pci/es1938.c:1.34->1.35 
#   F:pci/es1968.c:1.63->1.64 
#   F:pci/fm801.c:1.44->1.45 
#   F:pci/intel8x0.c:1.132->1.133 
#   F:pci/intel8x0m.c:1.3->1.4 
#   F:pci/maestro3.c:1.50->1.51 
#   F:pci/rme32.c:1.32->1.33 
#   F:pci/rme96.c:1.34->1.35 
#   F:pci/sonicvibes.c:1.34->1.35 
#   F:pci/via82xx.c:1.95->1.96 
#   F:pci/ali5451/ali5451.c:1.46->1.47 
#   F:pci/au88x0/au88x0.c:1.7->1.8 
#   F:pci/cs46xx/cs46xx.c:1.26->1.27 
#   F:pci/emu10k1/emu10k1.c:1.23->1.24 
#   F:pci/ice1712/ice1712.c:1.48->1.49 
#   F:pci/ice1712/ice1724.c:1.28->1.29 
#   F:pci/korg1212/korg1212.c:1.37->1.38 
#   F:pci/mixart/mixart.c:1.7->1.8 
#   F:pci/nm256/nm256.c:1.35->1.36 
#   F:pci/rme9652/hdsp.c:1.55->1.56 
#   F:pci/rme9652/rme9652.c:1.43->1.44 
#   F:pci/trident/trident.c:1.23->1.24 
#   F:pci/vx222/vx222.c:1.4->1.5 
#   F:pci/ymfpci/ymfpci.c:1.35->1.36 
#   L:- removed superfluous warning messages after pci_module_init().
#   L:  (2.6 kernel doesn't return the error anyway...)
#   L:- store card pointer in pci_drvdata instead of chip pointer.
#   L:  this would make easier to add PM support.
# 
# sound/pci/sonicvibes.c
#   2004/04/13 09:59:00+02:00 perex@suse.cz +1 -9
#   ALSA CVS update
#   D:2004/04/13 15:58:59
#   C:Documentation,ALS4000 driver,ATIIXP driver,AZT3328 driver,BT87x driver
#   C:CMIPCI driver,CS4281 driver,ENS1370/1+ driver,ES1938 driver
#   C:ES1968 driver,FM801 driver,Intel8x0 driver,Intel8x0-modem driver
#   C:Maestro3 driver,RME32 driver,RME96 driver,SonicVibes driver
#   C:VIA82xx driver,ALI5451 driver,au88x0 driver,CS46xx driver
#   C:EMU10K1/EMU10K2 driver,ICE1712 driver,ICE1724 driver,KORG1212 driver
#   C:MIXART driver,NM256 driver,RME HDSP driver,RME9652 driver
#   C:Trident driver,Digigram VX222 driver,YMFPCI driver
#   A:Takashi Iwai <tiwai@suse.de>
#   F:Documentation/DocBook/writing-an-alsa-driver.tmpl:1.26->1.27 
#   F:pci/als4000.c:1.32->1.33 
#   F:pci/atiixp.c:1.4->1.5 
#   F:pci/azt3328.c:1.12->1.13 
#   F:pci/bt87x.c:1.4->1.5 
#   F:pci/cmipci.c:1.62->1.63 
#   F:pci/cs4281.c:1.52->1.53 
#   F:pci/ens1370.c:1.59->1.60 
#   F:pci/es1938.c:1.34->1.35 
#   F:pci/es1968.c:1.63->1.64 
#   F:pci/fm801.c:1.44->1.45 
#   F:pci/intel8x0.c:1.132->1.133 
#   F:pci/intel8x0m.c:1.3->1.4 
#   F:pci/maestro3.c:1.50->1.51 
#   F:pci/rme32.c:1.32->1.33 
#   F:pci/rme96.c:1.34->1.35 
#   F:pci/sonicvibes.c:1.34->1.35 
#   F:pci/via82xx.c:1.95->1.96 
#   F:pci/ali5451/ali5451.c:1.46->1.47 
#   F:pci/au88x0/au88x0.c:1.7->1.8 
#   F:pci/cs46xx/cs46xx.c:1.26->1.27 
#   F:pci/emu10k1/emu10k1.c:1.23->1.24 
#   F:pci/ice1712/ice1712.c:1.48->1.49 
#   F:pci/ice1712/ice1724.c:1.28->1.29 
#   F:pci/korg1212/korg1212.c:1.37->1.38 
#   F:pci/mixart/mixart.c:1.7->1.8 
#   F:pci/nm256/nm256.c:1.35->1.36 
#   F:pci/rme9652/hdsp.c:1.55->1.56 
#   F:pci/rme9652/rme9652.c:1.43->1.44 
#   F:pci/trident/trident.c:1.23->1.24 
#   F:pci/vx222/vx222.c:1.4->1.5 
#   F:pci/ymfpci/ymfpci.c:1.35->1.36 
#   L:- removed superfluous warning messages after pci_module_init().
#   L:  (2.6 kernel doesn't return the error anyway...)
#   L:- store card pointer in pci_drvdata instead of chip pointer.
#   L:  this would make easier to add PM support.
# 
# sound/pci/rme9652/rme9652.c
#   2004/04/13 09:59:17+02:00 perex@suse.cz +1 -8
#   ALSA CVS update
#   D:2004/04/13 15:58:59
#   C:Documentation,ALS4000 driver,ATIIXP driver,AZT3328 driver,BT87x driver
#   C:CMIPCI driver,CS4281 driver,ENS1370/1+ driver,ES1938 driver
#   C:ES1968 driver,FM801 driver,Intel8x0 driver,Intel8x0-modem driver
#   C:Maestro3 driver,RME32 driver,RME96 driver,SonicVibes driver
#   C:VIA82xx driver,ALI5451 driver,au88x0 driver,CS46xx driver
#   C:EMU10K1/EMU10K2 driver,ICE1712 driver,ICE1724 driver,KORG1212 driver
#   C:MIXART driver,NM256 driver,RME HDSP driver,RME9652 driver
#   C:Trident driver,Digigram VX222 driver,YMFPCI driver
#   A:Takashi Iwai <tiwai@suse.de>
#   F:Documentation/DocBook/writing-an-alsa-driver.tmpl:1.26->1.27 
#   F:pci/als4000.c:1.32->1.33 
#   F:pci/atiixp.c:1.4->1.5 
#   F:pci/azt3328.c:1.12->1.13 
#   F:pci/bt87x.c:1.4->1.5 
#   F:pci/cmipci.c:1.62->1.63 
#   F:pci/cs4281.c:1.52->1.53 
#   F:pci/ens1370.c:1.59->1.60 
#   F:pci/es1938.c:1.34->1.35 
#   F:pci/es1968.c:1.63->1.64 
#   F:pci/fm801.c:1.44->1.45 
#   F:pci/intel8x0.c:1.132->1.133 
#   F:pci/intel8x0m.c:1.3->1.4 
#   F:pci/maestro3.c:1.50->1.51 
#   F:pci/rme32.c:1.32->1.33 
#   F:pci/rme96.c:1.34->1.35 
#   F:pci/sonicvibes.c:1.34->1.35 
#   F:pci/via82xx.c:1.95->1.96 
#   F:pci/ali5451/ali5451.c:1.46->1.47 
#   F:pci/au88x0/au88x0.c:1.7->1.8 
#   F:pci/cs46xx/cs46xx.c:1.26->1.27 
#   F:pci/emu10k1/emu10k1.c:1.23->1.24 
#   F:pci/ice1712/ice1712.c:1.48->1.49 
#   F:pci/ice1712/ice1724.c:1.28->1.29 
#   F:pci/korg1212/korg1212.c:1.37->1.38 
#   F:pci/mixart/mixart.c:1.7->1.8 
#   F:pci/nm256/nm256.c:1.35->1.36 
#   F:pci/rme9652/hdsp.c:1.55->1.56 
#   F:pci/rme9652/rme9652.c:1.43->1.44 
#   F:pci/trident/trident.c:1.23->1.24 
#   F:pci/vx222/vx222.c:1.4->1.5 
#   F:pci/ymfpci/ymfpci.c:1.35->1.36 
#   L:- removed superfluous warning messages after pci_module_init().
#   L:  (2.6 kernel doesn't return the error anyway...)
#   L:- store card pointer in pci_drvdata instead of chip pointer.
#   L:  this would make easier to add PM support.
# 
# sound/pci/rme9652/hdsp.c
#   2004/04/13 09:59:02+02:00 perex@suse.cz +1 -8
#   ALSA CVS update
#   D:2004/04/13 15:58:59
#   C:Documentation,ALS4000 driver,ATIIXP driver,AZT3328 driver,BT87x driver
#   C:CMIPCI driver,CS4281 driver,ENS1370/1+ driver,ES1938 driver
#   C:ES1968 driver,FM801 driver,Intel8x0 driver,Intel8x0-modem driver
#   C:Maestro3 driver,RME32 driver,RME96 driver,SonicVibes driver
#   C:VIA82xx driver,ALI5451 driver,au88x0 driver,CS46xx driver
#   C:EMU10K1/EMU10K2 driver,ICE1712 driver,ICE1724 driver,KORG1212 driver
#   C:MIXART driver,NM256 driver,RME HDSP driver,RME9652 driver
#   C:Trident driver,Digigram VX222 driver,YMFPCI driver
#   A:Takashi Iwai <tiwai@suse.de>
#   F:Documentation/DocBook/writing-an-alsa-driver.tmpl:1.26->1.27 
#   F:pci/als4000.c:1.32->1.33 
#   F:pci/atiixp.c:1.4->1.5 
#   F:pci/azt3328.c:1.12->1.13 
#   F:pci/bt87x.c:1.4->1.5 
#   F:pci/cmipci.c:1.62->1.63 
#   F:pci/cs4281.c:1.52->1.53 
#   F:pci/ens1370.c:1.59->1.60 
#   F:pci/es1938.c:1.34->1.35 
#   F:pci/es1968.c:1.63->1.64 
#   F:pci/fm801.c:1.44->1.45 
#   F:pci/intel8x0.c:1.132->1.133 
#   F:pci/intel8x0m.c:1.3->1.4 
#   F:pci/maestro3.c:1.50->1.51 
#   F:pci/rme32.c:1.32->1.33 
#   F:pci/rme96.c:1.34->1.35 
#   F:pci/sonicvibes.c:1.34->1.35 
#   F:pci/via82xx.c:1.95->1.96 
#   F:pci/ali5451/ali5451.c:1.46->1.47 
#   F:pci/au88x0/au88x0.c:1.7->1.8 
#   F:pci/cs46xx/cs46xx.c:1.26->1.27 
#   F:pci/emu10k1/emu10k1.c:1.23->1.24 
#   F:pci/ice1712/ice1712.c:1.48->1.49 
#   F:pci/ice1712/ice1724.c:1.28->1.29 
#   F:pci/korg1212/korg1212.c:1.37->1.38 
#   F:pci/mixart/mixart.c:1.7->1.8 
#   F:pci/nm256/nm256.c:1.35->1.36 
#   F:pci/rme9652/hdsp.c:1.55->1.56 
#   F:pci/rme9652/rme9652.c:1.43->1.44 
#   F:pci/trident/trident.c:1.23->1.24 
#   F:pci/vx222/vx222.c:1.4->1.5 
#   F:pci/ymfpci/ymfpci.c:1.35->1.36 
#   L:- removed superfluous warning messages after pci_module_init().
#   L:  (2.6 kernel doesn't return the error anyway...)
#   L:- store card pointer in pci_drvdata instead of chip pointer.
#   L:  this would make easier to add PM support.
# 
# sound/pci/rme96.c
#   2004/04/13 09:59:00+02:00 perex@suse.cz +1 -9
#   ALSA CVS update
#   D:2004/04/13 15:58:59
#   C:Documentation,ALS4000 driver,ATIIXP driver,AZT3328 driver,BT87x driver
#   C:CMIPCI driver,CS4281 driver,ENS1370/1+ driver,ES1938 driver
#   C:ES1968 driver,FM801 driver,Intel8x0 driver,Intel8x0-modem driver
#   C:Maestro3 driver,RME32 driver,RME96 driver,SonicVibes driver
#   C:VIA82xx driver,ALI5451 driver,au88x0 driver,CS46xx driver
#   C:EMU10K1/EMU10K2 driver,ICE1712 driver,ICE1724 driver,KORG1212 driver
#   C:MIXART driver,NM256 driver,RME HDSP driver,RME9652 driver
#   C:Trident driver,Digigram VX222 driver,YMFPCI driver
#   A:Takashi Iwai <tiwai@suse.de>
#   F:Documentation/DocBook/writing-an-alsa-driver.tmpl:1.26->1.27 
#   F:pci/als4000.c:1.32->1.33 
#   F:pci/atiixp.c:1.4->1.5 
#   F:pci/azt3328.c:1.12->1.13 
#   F:pci/bt87x.c:1.4->1.5 
#   F:pci/cmipci.c:1.62->1.63 
#   F:pci/cs4281.c:1.52->1.53 
#   F:pci/ens1370.c:1.59->1.60 
#   F:pci/es1938.c:1.34->1.35 
#   F:pci/es1968.c:1.63->1.64 
#   F:pci/fm801.c:1.44->1.45 
#   F:pci/intel8x0.c:1.132->1.133 
#   F:pci/intel8x0m.c:1.3->1.4 
#   F:pci/maestro3.c:1.50->1.51 
#   F:pci/rme32.c:1.32->1.33 
#   F:pci/rme96.c:1.34->1.35 
#   F:pci/sonicvibes.c:1.34->1.35 
#   F:pci/via82xx.c:1.95->1.96 
#   F:pci/ali5451/ali5451.c:1.46->1.47 
#   F:pci/au88x0/au88x0.c:1.7->1.8 
#   F:pci/cs46xx/cs46xx.c:1.26->1.27 
#   F:pci/emu10k1/emu10k1.c:1.23->1.24 
#   F:pci/ice1712/ice1712.c:1.48->1.49 
#   F:pci/ice1712/ice1724.c:1.28->1.29 
#   F:pci/korg1212/korg1212.c:1.37->1.38 
#   F:pci/mixart/mixart.c:1.7->1.8 
#   F:pci/nm256/nm256.c:1.35->1.36 
#   F:pci/rme9652/hdsp.c:1.55->1.56 
#   F:pci/rme9652/rme9652.c:1.43->1.44 
#   F:pci/trident/trident.c:1.23->1.24 
#   F:pci/vx222/vx222.c:1.4->1.5 
#   F:pci/ymfpci/ymfpci.c:1.35->1.36 
#   L:- removed superfluous warning messages after pci_module_init().
#   L:  (2.6 kernel doesn't return the error anyway...)
#   L:- store card pointer in pci_drvdata instead of chip pointer.
#   L:  this would make easier to add PM support.
# 
# sound/pci/rme32.c
#   2004/04/13 09:59:00+02:00 perex@suse.cz +1 -9
#   ALSA CVS update
#   D:2004/04/13 15:58:59
#   C:Documentation,ALS4000 driver,ATIIXP driver,AZT3328 driver,BT87x driver
#   C:CMIPCI driver,CS4281 driver,ENS1370/1+ driver,ES1938 driver
#   C:ES1968 driver,FM801 driver,Intel8x0 driver,Intel8x0-modem driver
#   C:Maestro3 driver,RME32 driver,RME96 driver,SonicVibes driver
#   C:VIA82xx driver,ALI5451 driver,au88x0 driver,CS46xx driver
#   C:EMU10K1/EMU10K2 driver,ICE1712 driver,ICE1724 driver,KORG1212 driver
#   C:MIXART driver,NM256 driver,RME HDSP driver,RME9652 driver
#   C:Trident driver,Digigram VX222 driver,YMFPCI driver
#   A:Takashi Iwai <tiwai@suse.de>
#   F:Documentation/DocBook/writing-an-alsa-driver.tmpl:1.26->1.27 
#   F:pci/als4000.c:1.32->1.33 
#   F:pci/atiixp.c:1.4->1.5 
#   F:pci/azt3328.c:1.12->1.13 
#   F:pci/bt87x.c:1.4->1.5 
#   F:pci/cmipci.c:1.62->1.63 
#   F:pci/cs4281.c:1.52->1.53 
#   F:pci/ens1370.c:1.59->1.60 
#   F:pci/es1938.c:1.34->1.35 
#   F:pci/es1968.c:1.63->1.64 
#   F:pci/fm801.c:1.44->1.45 
#   F:pci/intel8x0.c:1.132->1.133 
#   F:pci/intel8x0m.c:1.3->1.4 
#   F:pci/maestro3.c:1.50->1.51 
#   F:pci/rme32.c:1.32->1.33 
#   F:pci/rme96.c:1.34->1.35 
#   F:pci/sonicvibes.c:1.34->1.35 
#   F:pci/via82xx.c:1.95->1.96 
#   F:pci/ali5451/ali5451.c:1.46->1.47 
#   F:pci/au88x0/au88x0.c:1.7->1.8 
#   F:pci/cs46xx/cs46xx.c:1.26->1.27 
#   F:pci/emu10k1/emu10k1.c:1.23->1.24 
#   F:pci/ice1712/ice1712.c:1.48->1.49 
#   F:pci/ice1712/ice1724.c:1.28->1.29 
#   F:pci/korg1212/korg1212.c:1.37->1.38 
#   F:pci/mixart/mixart.c:1.7->1.8 
#   F:pci/nm256/nm256.c:1.35->1.36 
#   F:pci/rme9652/hdsp.c:1.55->1.56 
#   F:pci/rme9652/rme9652.c:1.43->1.44 
#   F:pci/trident/trident.c:1.23->1.24 
#   F:pci/vx222/vx222.c:1.4->1.5 
#   F:pci/ymfpci/ymfpci.c:1.35->1.36 
#   L:- removed superfluous warning messages after pci_module_init().
#   L:  (2.6 kernel doesn't return the error anyway...)
#   L:- store card pointer in pci_drvdata instead of chip pointer.
#   L:  this would make easier to add PM support.
# 
# sound/pci/nm256/nm256.c
#   2004/04/13 09:59:02+02:00 perex@suse.cz +1 -8
#   ALSA CVS update
#   D:2004/04/13 15:58:59
#   C:Documentation,ALS4000 driver,ATIIXP driver,AZT3328 driver,BT87x driver
#   C:CMIPCI driver,CS4281 driver,ENS1370/1+ driver,ES1938 driver
#   C:ES1968 driver,FM801 driver,Intel8x0 driver,Intel8x0-modem driver
#   C:Maestro3 driver,RME32 driver,RME96 driver,SonicVibes driver
#   C:VIA82xx driver,ALI5451 driver,au88x0 driver,CS46xx driver
#   C:EMU10K1/EMU10K2 driver,ICE1712 driver,ICE1724 driver,KORG1212 driver
#   C:MIXART driver,NM256 driver,RME HDSP driver,RME9652 driver
#   C:Trident driver,Digigram VX222 driver,YMFPCI driver
#   A:Takashi Iwai <tiwai@suse.de>
#   F:Documentation/DocBook/writing-an-alsa-driver.tmpl:1.26->1.27 
#   F:pci/als4000.c:1.32->1.33 
#   F:pci/atiixp.c:1.4->1.5 
#   F:pci/azt3328.c:1.12->1.13 
#   F:pci/bt87x.c:1.4->1.5 
#   F:pci/cmipci.c:1.62->1.63 
#   F:pci/cs4281.c:1.52->1.53 
#   F:pci/ens1370.c:1.59->1.60 
#   F:pci/es1938.c:1.34->1.35 
#   F:pci/es1968.c:1.63->1.64 
#   F:pci/fm801.c:1.44->1.45 
#   F:pci/intel8x0.c:1.132->1.133 
#   F:pci/intel8x0m.c:1.3->1.4 
#   F:pci/maestro3.c:1.50->1.51 
#   F:pci/rme32.c:1.32->1.33 
#   F:pci/rme96.c:1.34->1.35 
#   F:pci/sonicvibes.c:1.34->1.35 
#   F:pci/via82xx.c:1.95->1.96 
#   F:pci/ali5451/ali5451.c:1.46->1.47 
#   F:pci/au88x0/au88x0.c:1.7->1.8 
#   F:pci/cs46xx/cs46xx.c:1.26->1.27 
#   F:pci/emu10k1/emu10k1.c:1.23->1.24 
#   F:pci/ice1712/ice1712.c:1.48->1.49 
#   F:pci/ice1712/ice1724.c:1.28->1.29 
#   F:pci/korg1212/korg1212.c:1.37->1.38 
#   F:pci/mixart/mixart.c:1.7->1.8 
#   F:pci/nm256/nm256.c:1.35->1.36 
#   F:pci/rme9652/hdsp.c:1.55->1.56 
#   F:pci/rme9652/rme9652.c:1.43->1.44 
#   F:pci/trident/trident.c:1.23->1.24 
#   F:pci/vx222/vx222.c:1.4->1.5 
#   F:pci/ymfpci/ymfpci.c:1.35->1.36 
#   L:- removed superfluous warning messages after pci_module_init().
#   L:  (2.6 kernel doesn't return the error anyway...)
#   L:- store card pointer in pci_drvdata instead of chip pointer.
#   L:  this would make easier to add PM support.
# 
# sound/pci/mixart/mixart.c
#   2004/04/13 09:59:02+02:00 perex@suse.cz +1 -9
#   ALSA CVS update
#   D:2004/04/13 15:58:59
#   C:Documentation,ALS4000 driver,ATIIXP driver,AZT3328 driver,BT87x driver
#   C:CMIPCI driver,CS4281 driver,ENS1370/1+ driver,ES1938 driver
#   C:ES1968 driver,FM801 driver,Intel8x0 driver,Intel8x0-modem driver
#   C:Maestro3 driver,RME32 driver,RME96 driver,SonicVibes driver
#   C:VIA82xx driver,ALI5451 driver,au88x0 driver,CS46xx driver
#   C:EMU10K1/EMU10K2 driver,ICE1712 driver,ICE1724 driver,KORG1212 driver
#   C:MIXART driver,NM256 driver,RME HDSP driver,RME9652 driver
#   C:Trident driver,Digigram VX222 driver,YMFPCI driver
#   A:Takashi Iwai <tiwai@suse.de>
#   F:Documentation/DocBook/writing-an-alsa-driver.tmpl:1.26->1.27 
#   F:pci/als4000.c:1.32->1.33 
#   F:pci/atiixp.c:1.4->1.5 
#   F:pci/azt3328.c:1.12->1.13 
#   F:pci/bt87x.c:1.4->1.5 
#   F:pci/cmipci.c:1.62->1.63 
#   F:pci/cs4281.c:1.52->1.53 
#   F:pci/ens1370.c:1.59->1.60 
#   F:pci/es1938.c:1.34->1.35 
#   F:pci/es1968.c:1.63->1.64 
#   F:pci/fm801.c:1.44->1.45 
#   F:pci/intel8x0.c:1.132->1.133 
#   F:pci/intel8x0m.c:1.3->1.4 
#   F:pci/maestro3.c:1.50->1.51 
#   F:pci/rme32.c:1.32->1.33 
#   F:pci/rme96.c:1.34->1.35 
#   F:pci/sonicvibes.c:1.34->1.35 
#   F:pci/via82xx.c:1.95->1.96 
#   F:pci/ali5451/ali5451.c:1.46->1.47 
#   F:pci/au88x0/au88x0.c:1.7->1.8 
#   F:pci/cs46xx/cs46xx.c:1.26->1.27 
#   F:pci/emu10k1/emu10k1.c:1.23->1.24 
#   F:pci/ice1712/ice1712.c:1.48->1.49 
#   F:pci/ice1712/ice1724.c:1.28->1.29 
#   F:pci/korg1212/korg1212.c:1.37->1.38 
#   F:pci/mixart/mixart.c:1.7->1.8 
#   F:pci/nm256/nm256.c:1.35->1.36 
#   F:pci/rme9652/hdsp.c:1.55->1.56 
#   F:pci/rme9652/rme9652.c:1.43->1.44 
#   F:pci/trident/trident.c:1.23->1.24 
#   F:pci/vx222/vx222.c:1.4->1.5 
#   F:pci/ymfpci/ymfpci.c:1.35->1.36 
#   L:- removed superfluous warning messages after pci_module_init().
#   L:  (2.6 kernel doesn't return the error anyway...)
#   L:- store card pointer in pci_drvdata instead of chip pointer.
#   L:  this would make easier to add PM support.
# 
# sound/pci/maestro3.c
#   2004/04/13 09:59:00+02:00 perex@suse.cz +1 -9
#   ALSA CVS update
#   D:2004/04/13 15:58:59
#   C:Documentation,ALS4000 driver,ATIIXP driver,AZT3328 driver,BT87x driver
#   C:CMIPCI driver,CS4281 driver,ENS1370/1+ driver,ES1938 driver
#   C:ES1968 driver,FM801 driver,Intel8x0 driver,Intel8x0-modem driver
#   C:Maestro3 driver,RME32 driver,RME96 driver,SonicVibes driver
#   C:VIA82xx driver,ALI5451 driver,au88x0 driver,CS46xx driver
#   C:EMU10K1/EMU10K2 driver,ICE1712 driver,ICE1724 driver,KORG1212 driver
#   C:MIXART driver,NM256 driver,RME HDSP driver,RME9652 driver
#   C:Trident driver,Digigram VX222 driver,YMFPCI driver
#   A:Takashi Iwai <tiwai@suse.de>
#   F:Documentation/DocBook/writing-an-alsa-driver.tmpl:1.26->1.27 
#   F:pci/als4000.c:1.32->1.33 
#   F:pci/atiixp.c:1.4->1.5 
#   F:pci/azt3328.c:1.12->1.13 
#   F:pci/bt87x.c:1.4->1.5 
#   F:pci/cmipci.c:1.62->1.63 
#   F:pci/cs4281.c:1.52->1.53 
#   F:pci/ens1370.c:1.59->1.60 
#   F:pci/es1938.c:1.34->1.35 
#   F:pci/es1968.c:1.63->1.64 
#   F:pci/fm801.c:1.44->1.45 
#   F:pci/intel8x0.c:1.132->1.133 
#   F:pci/intel8x0m.c:1.3->1.4 
#   F:pci/maestro3.c:1.50->1.51 
#   F:pci/rme32.c:1.32->1.33 
#   F:pci/rme96.c:1.34->1.35 
#   F:pci/sonicvibes.c:1.34->1.35 
#   F:pci/via82xx.c:1.95->1.96 
#   F:pci/ali5451/ali5451.c:1.46->1.47 
#   F:pci/au88x0/au88x0.c:1.7->1.8 
#   F:pci/cs46xx/cs46xx.c:1.26->1.27 
#   F:pci/emu10k1/emu10k1.c:1.23->1.24 
#   F:pci/ice1712/ice1712.c:1.48->1.49 
#   F:pci/ice1712/ice1724.c:1.28->1.29 
#   F:pci/korg1212/korg1212.c:1.37->1.38 
#   F:pci/mixart/mixart.c:1.7->1.8 
#   F:pci/nm256/nm256.c:1.35->1.36 
#   F:pci/rme9652/hdsp.c:1.55->1.56 
#   F:pci/rme9652/rme9652.c:1.43->1.44 
#   F:pci/trident/trident.c:1.23->1.24 
#   F:pci/vx222/vx222.c:1.4->1.5 
#   F:pci/ymfpci/ymfpci.c:1.35->1.36 
#   L:- removed superfluous warning messages after pci_module_init().
#   L:  (2.6 kernel doesn't return the error anyway...)
#   L:- store card pointer in pci_drvdata instead of chip pointer.
#   L:  this would make easier to add PM support.
# 
# sound/pci/korg1212/korg1212.c
#   2004/04/13 09:59:02+02:00 perex@suse.cz +3 -12
#   ALSA CVS update
#   D:2004/04/13 15:58:59
#   C:Documentation,ALS4000 driver,ATIIXP driver,AZT3328 driver,BT87x driver
#   C:CMIPCI driver,CS4281 driver,ENS1370/1+ driver,ES1938 driver
#   C:ES1968 driver,FM801 driver,Intel8x0 driver,Intel8x0-modem driver
#   C:Maestro3 driver,RME32 driver,RME96 driver,SonicVibes driver
#   C:VIA82xx driver,ALI5451 driver,au88x0 driver,CS46xx driver
#   C:EMU10K1/EMU10K2 driver,ICE1712 driver,ICE1724 driver,KORG1212 driver
#   C:MIXART driver,NM256 driver,RME HDSP driver,RME9652 driver
#   C:Trident driver,Digigram VX222 driver,YMFPCI driver
#   A:Takashi Iwai <tiwai@suse.de>
#   F:Documentation/DocBook/writing-an-alsa-driver.tmpl:1.26->1.27 
#   F:pci/als4000.c:1.32->1.33 
#   F:pci/atiixp.c:1.4->1.5 
#   F:pci/azt3328.c:1.12->1.13 
#   F:pci/bt87x.c:1.4->1.5 
#   F:pci/cmipci.c:1.62->1.63 
#   F:pci/cs4281.c:1.52->1.53 
#   F:pci/ens1370.c:1.59->1.60 
#   F:pci/es1938.c:1.34->1.35 
#   F:pci/es1968.c:1.63->1.64 
#   F:pci/fm801.c:1.44->1.45 
#   F:pci/intel8x0.c:1.132->1.133 
#   F:pci/intel8x0m.c:1.3->1.4 
#   F:pci/maestro3.c:1.50->1.51 
#   F:pci/rme32.c:1.32->1.33 
#   F:pci/rme96.c:1.34->1.35 
#   F:pci/sonicvibes.c:1.34->1.35 
#   F:pci/via82xx.c:1.95->1.96 
#   F:pci/ali5451/ali5451.c:1.46->1.47 
#   F:pci/au88x0/au88x0.c:1.7->1.8 
#   F:pci/cs46xx/cs46xx.c:1.26->1.27 
#   F:pci/emu10k1/emu10k1.c:1.23->1.24 
#   F:pci/ice1712/ice1712.c:1.48->1.49 
#   F:pci/ice1712/ice1724.c:1.28->1.29 
#   F:pci/korg1212/korg1212.c:1.37->1.38 
#   F:pci/mixart/mixart.c:1.7->1.8 
#   F:pci/nm256/nm256.c:1.35->1.36 
#   F:pci/rme9652/hdsp.c:1.55->1.56 
#   F:pci/rme9652/rme9652.c:1.43->1.44 
#   F:pci/trident/trident.c:1.23->1.24 
#   F:pci/vx222/vx222.c:1.4->1.5 
#   F:pci/ymfpci/ymfpci.c:1.35->1.36 
#   L:- removed superfluous warning messages after pci_module_init().
#   L:  (2.6 kernel doesn't return the error anyway...)
#   L:- store card pointer in pci_drvdata instead of chip pointer.
#   L:  this would make easier to add PM support.
# 
# sound/pci/intel8x0m.c
#   2004/04/13 09:59:00+02:00 perex@suse.cz +1 -10
#   ALSA CVS update
#   D:2004/04/13 15:58:59
#   C:Documentation,ALS4000 driver,ATIIXP driver,AZT3328 driver,BT87x driver
#   C:CMIPCI driver,CS4281 driver,ENS1370/1+ driver,ES1938 driver
#   C:ES1968 driver,FM801 driver,Intel8x0 driver,Intel8x0-modem driver
#   C:Maestro3 driver,RME32 driver,RME96 driver,SonicVibes driver
#   C:VIA82xx driver,ALI5451 driver,au88x0 driver,CS46xx driver
#   C:EMU10K1/EMU10K2 driver,ICE1712 driver,ICE1724 driver,KORG1212 driver
#   C:MIXART driver,NM256 driver,RME HDSP driver,RME9652 driver
#   C:Trident driver,Digigram VX222 driver,YMFPCI driver
#   A:Takashi Iwai <tiwai@suse.de>
#   F:Documentation/DocBook/writing-an-alsa-driver.tmpl:1.26->1.27 
#   F:pci/als4000.c:1.32->1.33 
#   F:pci/atiixp.c:1.4->1.5 
#   F:pci/azt3328.c:1.12->1.13 
#   F:pci/bt87x.c:1.4->1.5 
#   F:pci/cmipci.c:1.62->1.63 
#   F:pci/cs4281.c:1.52->1.53 
#   F:pci/ens1370.c:1.59->1.60 
#   F:pci/es1938.c:1.34->1.35 
#   F:pci/es1968.c:1.63->1.64 
#   F:pci/fm801.c:1.44->1.45 
#   F:pci/intel8x0.c:1.132->1.133 
#   F:pci/intel8x0m.c:1.3->1.4 
#   F:pci/maestro3.c:1.50->1.51 
#   F:pci/rme32.c:1.32->1.33 
#   F:pci/rme96.c:1.34->1.35 
#   F:pci/sonicvibes.c:1.34->1.35 
#   F:pci/via82xx.c:1.95->1.96 
#   F:pci/ali5451/ali5451.c:1.46->1.47 
#   F:pci/au88x0/au88x0.c:1.7->1.8 
#   F:pci/cs46xx/cs46xx.c:1.26->1.27 
#   F:pci/emu10k1/emu10k1.c:1.23->1.24 
#   F:pci/ice1712/ice1712.c:1.48->1.49 
#   F:pci/ice1712/ice1724.c:1.28->1.29 
#   F:pci/korg1212/korg1212.c:1.37->1.38 
#   F:pci/mixart/mixart.c:1.7->1.8 
#   F:pci/nm256/nm256.c:1.35->1.36 
#   F:pci/rme9652/hdsp.c:1.55->1.56 
#   F:pci/rme9652/rme9652.c:1.43->1.44 
#   F:pci/trident/trident.c:1.23->1.24 
#   F:pci/vx222/vx222.c:1.4->1.5 
#   F:pci/ymfpci/ymfpci.c:1.35->1.36 
#   L:- removed superfluous warning messages after pci_module_init().
#   L:  (2.6 kernel doesn't return the error anyway...)
#   L:- store card pointer in pci_drvdata instead of chip pointer.
#   L:  this would make easier to add PM support.
# 
# sound/pci/intel8x0.c
#   2004/04/13 09:59:00+02:00 perex@suse.cz +2 -5
#   ALSA CVS update
#   D:2004/04/13 15:58:59
#   C:Documentation,ALS4000 driver,ATIIXP driver,AZT3328 driver,BT87x driver
#   C:CMIPCI driver,CS4281 driver,ENS1370/1+ driver,ES1938 driver
#   C:ES1968 driver,FM801 driver,Intel8x0 driver,Intel8x0-modem driver
#   C:Maestro3 driver,RME32 driver,RME96 driver,SonicVibes driver
#   C:VIA82xx driver,ALI5451 driver,au88x0 driver,CS46xx driver
#   C:EMU10K1/EMU10K2 driver,ICE1712 driver,ICE1724 driver,KORG1212 driver
#   C:MIXART driver,NM256 driver,RME HDSP driver,RME9652 driver
#   C:Trident driver,Digigram VX222 driver,YMFPCI driver
#   A:Takashi Iwai <tiwai@suse.de>
#   F:Documentation/DocBook/writing-an-alsa-driver.tmpl:1.26->1.27 
#   F:pci/als4000.c:1.32->1.33 
#   F:pci/atiixp.c:1.4->1.5 
#   F:pci/azt3328.c:1.12->1.13 
#   F:pci/bt87x.c:1.4->1.5 
#   F:pci/cmipci.c:1.62->1.63 
#   F:pci/cs4281.c:1.52->1.53 
#   F:pci/ens1370.c:1.59->1.60 
#   F:pci/es1938.c:1.34->1.35 
#   F:pci/es1968.c:1.63->1.64 
#   F:pci/fm801.c:1.44->1.45 
#   F:pci/intel8x0.c:1.132->1.133 
#   F:pci/intel8x0m.c:1.3->1.4 
#   F:pci/maestro3.c:1.50->1.51 
#   F:pci/rme32.c:1.32->1.33 
#   F:pci/rme96.c:1.34->1.35 
#   F:pci/sonicvibes.c:1.34->1.35 
#   F:pci/via82xx.c:1.95->1.96 
#   F:pci/ali5451/ali5451.c:1.46->1.47 
#   F:pci/au88x0/au88x0.c:1.7->1.8 
#   F:pci/cs46xx/cs46xx.c:1.26->1.27 
#   F:pci/emu10k1/emu10k1.c:1.23->1.24 
#   F:pci/ice1712/ice1712.c:1.48->1.49 
#   F:pci/ice1712/ice1724.c:1.28->1.29 
#   F:pci/korg1212/korg1212.c:1.37->1.38 
#   F:pci/mixart/mixart.c:1.7->1.8 
#   F:pci/nm256/nm256.c:1.35->1.36 
#   F:pci/rme9652/hdsp.c:1.55->1.56 
#   F:pci/rme9652/rme9652.c:1.43->1.44 
#   F:pci/trident/trident.c:1.23->1.24 
#   F:pci/vx222/vx222.c:1.4->1.5 
#   F:pci/ymfpci/ymfpci.c:1.35->1.36 
#   L:- removed superfluous warning messages after pci_module_init().
#   L:  (2.6 kernel doesn't return the error anyway...)
#   L:- store card pointer in pci_drvdata instead of chip pointer.
#   L:  this would make easier to add PM support.
# 
# sound/pci/ice1712/ice1724.c
#   2004/04/13 09:59:01+02:00 perex@suse.cz +1 -9
#   ALSA CVS update
#   D:2004/04/13 15:58:59
#   C:Documentation,ALS4000 driver,ATIIXP driver,AZT3328 driver,BT87x driver
#   C:CMIPCI driver,CS4281 driver,ENS1370/1+ driver,ES1938 driver
#   C:ES1968 driver,FM801 driver,Intel8x0 driver,Intel8x0-modem driver
#   C:Maestro3 driver,RME32 driver,RME96 driver,SonicVibes driver
#   C:VIA82xx driver,ALI5451 driver,au88x0 driver,CS46xx driver
#   C:EMU10K1/EMU10K2 driver,ICE1712 driver,ICE1724 driver,KORG1212 driver
#   C:MIXART driver,NM256 driver,RME HDSP driver,RME9652 driver
#   C:Trident driver,Digigram VX222 driver,YMFPCI driver
#   A:Takashi Iwai <tiwai@suse.de>
#   F:Documentation/DocBook/writing-an-alsa-driver.tmpl:1.26->1.27 
#   F:pci/als4000.c:1.32->1.33 
#   F:pci/atiixp.c:1.4->1.5 
#   F:pci/azt3328.c:1.12->1.13 
#   F:pci/bt87x.c:1.4->1.5 
#   F:pci/cmipci.c:1.62->1.63 
#   F:pci/cs4281.c:1.52->1.53 
#   F:pci/ens1370.c:1.59->1.60 
#   F:pci/es1938.c:1.34->1.35 
#   F:pci/es1968.c:1.63->1.64 
#   F:pci/fm801.c:1.44->1.45 
#   F:pci/intel8x0.c:1.132->1.133 
#   F:pci/intel8x0m.c:1.3->1.4 
#   F:pci/maestro3.c:1.50->1.51 
#   F:pci/rme32.c:1.32->1.33 
#   F:pci/rme96.c:1.34->1.35 
#   F:pci/sonicvibes.c:1.34->1.35 
#   F:pci/via82xx.c:1.95->1.96 
#   F:pci/ali5451/ali5451.c:1.46->1.47 
#   F:pci/au88x0/au88x0.c:1.7->1.8 
#   F:pci/cs46xx/cs46xx.c:1.26->1.27 
#   F:pci/emu10k1/emu10k1.c:1.23->1.24 
#   F:pci/ice1712/ice1712.c:1.48->1.49 
#   F:pci/ice1712/ice1724.c:1.28->1.29 
#   F:pci/korg1212/korg1212.c:1.37->1.38 
#   F:pci/mixart/mixart.c:1.7->1.8 
#   F:pci/nm256/nm256.c:1.35->1.36 
#   F:pci/rme9652/hdsp.c:1.55->1.56 
#   F:pci/rme9652/rme9652.c:1.43->1.44 
#   F:pci/trident/trident.c:1.23->1.24 
#   F:pci/vx222/vx222.c:1.4->1.5 
#   F:pci/ymfpci/ymfpci.c:1.35->1.36 
#   L:- removed superfluous warning messages after pci_module_init().
#   L:  (2.6 kernel doesn't return the error anyway...)
#   L:- store card pointer in pci_drvdata instead of chip pointer.
#   L:  this would make easier to add PM support.
# 
# sound/pci/ice1712/ice1712.c
#   2004/04/13 09:59:01+02:00 perex@suse.cz +1 -9
#   ALSA CVS update
#   D:2004/04/13 15:58:59
#   C:Documentation,ALS4000 driver,ATIIXP driver,AZT3328 driver,BT87x driver
#   C:CMIPCI driver,CS4281 driver,ENS1370/1+ driver,ES1938 driver
#   C:ES1968 driver,FM801 driver,Intel8x0 driver,Intel8x0-modem driver
#   C:Maestro3 driver,RME32 driver,RME96 driver,SonicVibes driver
#   C:VIA82xx driver,ALI5451 driver,au88x0 driver,CS46xx driver
#   C:EMU10K1/EMU10K2 driver,ICE1712 driver,ICE1724 driver,KORG1212 driver
#   C:MIXART driver,NM256 driver,RME HDSP driver,RME9652 driver
#   C:Trident driver,Digigram VX222 driver,YMFPCI driver
#   A:Takashi Iwai <tiwai@suse.de>
#   F:Documentation/DocBook/writing-an-alsa-driver.tmpl:1.26->1.27 
#   F:pci/als4000.c:1.32->1.33 
#   F:pci/atiixp.c:1.4->1.5 
#   F:pci/azt3328.c:1.12->1.13 
#   F:pci/bt87x.c:1.4->1.5 
#   F:pci/cmipci.c:1.62->1.63 
#   F:pci/cs4281.c:1.52->1.53 
#   F:pci/ens1370.c:1.59->1.60 
#   F:pci/es1938.c:1.34->1.35 
#   F:pci/es1968.c:1.63->1.64 
#   F:pci/fm801.c:1.44->1.45 
#   F:pci/intel8x0.c:1.132->1.133 
#   F:pci/intel8x0m.c:1.3->1.4 
#   F:pci/maestro3.c:1.50->1.51 
#   F:pci/rme32.c:1.32->1.33 
#   F:pci/rme96.c:1.34->1.35 
#   F:pci/sonicvibes.c:1.34->1.35 
#   F:pci/via82xx.c:1.95->1.96 
#   F:pci/ali5451/ali5451.c:1.46->1.47 
#   F:pci/au88x0/au88x0.c:1.7->1.8 
#   F:pci/cs46xx/cs46xx.c:1.26->1.27 
#   F:pci/emu10k1/emu10k1.c:1.23->1.24 
#   F:pci/ice1712/ice1712.c:1.48->1.49 
#   F:pci/ice1712/ice1724.c:1.28->1.29 
#   F:pci/korg1212/korg1212.c:1.37->1.38 
#   F:pci/mixart/mixart.c:1.7->1.8 
#   F:pci/nm256/nm256.c:1.35->1.36 
#   F:pci/rme9652/hdsp.c:1.55->1.56 
#   F:pci/rme9652/rme9652.c:1.43->1.44 
#   F:pci/trident/trident.c:1.23->1.24 
#   F:pci/vx222/vx222.c:1.4->1.5 
#   F:pci/ymfpci/ymfpci.c:1.35->1.36 
#   L:- removed superfluous warning messages after pci_module_init().
#   L:  (2.6 kernel doesn't return the error anyway...)
#   L:- store card pointer in pci_drvdata instead of chip pointer.
#   L:  this would make easier to add PM support.
# 
# sound/pci/fm801.c
#   2004/04/13 09:59:00+02:00 perex@suse.cz +1 -9
#   ALSA CVS update
#   D:2004/04/13 15:58:59
#   C:Documentation,ALS4000 driver,ATIIXP driver,AZT3328 driver,BT87x driver
#   C:CMIPCI driver,CS4281 driver,ENS1370/1+ driver,ES1938 driver
#   C:ES1968 driver,FM801 driver,Intel8x0 driver,Intel8x0-modem driver
#   C:Maestro3 driver,RME32 driver,RME96 driver,SonicVibes driver
#   C:VIA82xx driver,ALI5451 driver,au88x0 driver,CS46xx driver
#   C:EMU10K1/EMU10K2 driver,ICE1712 driver,ICE1724 driver,KORG1212 driver
#   C:MIXART driver,NM256 driver,RME HDSP driver,RME9652 driver
#   C:Trident driver,Digigram VX222 driver,YMFPCI driver
#   A:Takashi Iwai <tiwai@suse.de>
#   F:Documentation/DocBook/writing-an-alsa-driver.tmpl:1.26->1.27 
#   F:pci/als4000.c:1.32->1.33 
#   F:pci/atiixp.c:1.4->1.5 
#   F:pci/azt3328.c:1.12->1.13 
#   F:pci/bt87x.c:1.4->1.5 
#   F:pci/cmipci.c:1.62->1.63 
#   F:pci/cs4281.c:1.52->1.53 
#   F:pci/ens1370.c:1.59->1.60 
#   F:pci/es1938.c:1.34->1.35 
#   F:pci/es1968.c:1.63->1.64 
#   F:pci/fm801.c:1.44->1.45 
#   F:pci/intel8x0.c:1.132->1.133 
#   F:pci/intel8x0m.c:1.3->1.4 
#   F:pci/maestro3.c:1.50->1.51 
#   F:pci/rme32.c:1.32->1.33 
#   F:pci/rme96.c:1.34->1.35 
#   F:pci/sonicvibes.c:1.34->1.35 
#   F:pci/via82xx.c:1.95->1.96 
#   F:pci/ali5451/ali5451.c:1.46->1.47 
#   F:pci/au88x0/au88x0.c:1.7->1.8 
#   F:pci/cs46xx/cs46xx.c:1.26->1.27 
#   F:pci/emu10k1/emu10k1.c:1.23->1.24 
#   F:pci/ice1712/ice1712.c:1.48->1.49 
#   F:pci/ice1712/ice1724.c:1.28->1.29 
#   F:pci/korg1212/korg1212.c:1.37->1.38 
#   F:pci/mixart/mixart.c:1.7->1.8 
#   F:pci/nm256/nm256.c:1.35->1.36 
#   F:pci/rme9652/hdsp.c:1.55->1.56 
#   F:pci/rme9652/rme9652.c:1.43->1.44 
#   F:pci/trident/trident.c:1.23->1.24 
#   F:pci/vx222/vx222.c:1.4->1.5 
#   F:pci/ymfpci/ymfpci.c:1.35->1.36 
#   L:- removed superfluous warning messages after pci_module_init().
#   L:  (2.6 kernel doesn't return the error anyway...)
#   L:- store card pointer in pci_drvdata instead of chip pointer.
#   L:  this would make easier to add PM support.
# 
# sound/pci/es1968.c
#   2004/04/13 09:59:00+02:00 perex@suse.cz +1 -12
#   ALSA CVS update
#   D:2004/04/13 15:58:59
#   C:Documentation,ALS4000 driver,ATIIXP driver,AZT3328 driver,BT87x driver
#   C:CMIPCI driver,CS4281 driver,ENS1370/1+ driver,ES1938 driver
#   C:ES1968 driver,FM801 driver,Intel8x0 driver,Intel8x0-modem driver
#   C:Maestro3 driver,RME32 driver,RME96 driver,SonicVibes driver
#   C:VIA82xx driver,ALI5451 driver,au88x0 driver,CS46xx driver
#   C:EMU10K1/EMU10K2 driver,ICE1712 driver,ICE1724 driver,KORG1212 driver
#   C:MIXART driver,NM256 driver,RME HDSP driver,RME9652 driver
#   C:Trident driver,Digigram VX222 driver,YMFPCI driver
#   A:Takashi Iwai <tiwai@suse.de>
#   F:Documentation/DocBook/writing-an-alsa-driver.tmpl:1.26->1.27 
#   F:pci/als4000.c:1.32->1.33 
#   F:pci/atiixp.c:1.4->1.5 
#   F:pci/azt3328.c:1.12->1.13 
#   F:pci/bt87x.c:1.4->1.5 
#   F:pci/cmipci.c:1.62->1.63 
#   F:pci/cs4281.c:1.52->1.53 
#   F:pci/ens1370.c:1.59->1.60 
#   F:pci/es1938.c:1.34->1.35 
#   F:pci/es1968.c:1.63->1.64 
#   F:pci/fm801.c:1.44->1.45 
#   F:pci/intel8x0.c:1.132->1.133 
#   F:pci/intel8x0m.c:1.3->1.4 
#   F:pci/maestro3.c:1.50->1.51 
#   F:pci/rme32.c:1.32->1.33 
#   F:pci/rme96.c:1.34->1.35 
#   F:pci/sonicvibes.c:1.34->1.35 
#   F:pci/via82xx.c:1.95->1.96 
#   F:pci/ali5451/ali5451.c:1.46->1.47 
#   F:pci/au88x0/au88x0.c:1.7->1.8 
#   F:pci/cs46xx/cs46xx.c:1.26->1.27 
#   F:pci/emu10k1/emu10k1.c:1.23->1.24 
#   F:pci/ice1712/ice1712.c:1.48->1.49 
#   F:pci/ice1712/ice1724.c:1.28->1.29 
#   F:pci/korg1212/korg1212.c:1.37->1.38 
#   F:pci/mixart/mixart.c:1.7->1.8 
#   F:pci/nm256/nm256.c:1.35->1.36 
#   F:pci/rme9652/hdsp.c:1.55->1.56 
#   F:pci/rme9652/rme9652.c:1.43->1.44 
#   F:pci/trident/trident.c:1.23->1.24 
#   F:pci/vx222/vx222.c:1.4->1.5 
#   F:pci/ymfpci/ymfpci.c:1.35->1.36 
#   L:- removed superfluous warning messages after pci_module_init().
#   L:  (2.6 kernel doesn't return the error anyway...)
#   L:- store card pointer in pci_drvdata instead of chip pointer.
#   L:  this would make easier to add PM support.
# 
# sound/pci/es1938.c
#   2004/04/13 09:59:00+02:00 perex@suse.cz +1 -9
#   ALSA CVS update
#   D:2004/04/13 15:58:59
#   C:Documentation,ALS4000 driver,ATIIXP driver,AZT3328 driver,BT87x driver
#   C:CMIPCI driver,CS4281 driver,ENS1370/1+ driver,ES1938 driver
#   C:ES1968 driver,FM801 driver,Intel8x0 driver,Intel8x0-modem driver
#   C:Maestro3 driver,RME32 driver,RME96 driver,SonicVibes driver
#   C:VIA82xx driver,ALI5451 driver,au88x0 driver,CS46xx driver
#   C:EMU10K1/EMU10K2 driver,ICE1712 driver,ICE1724 driver,KORG1212 driver
#   C:MIXART driver,NM256 driver,RME HDSP driver,RME9652 driver
#   C:Trident driver,Digigram VX222 driver,YMFPCI driver
#   A:Takashi Iwai <tiwai@suse.de>
#   F:Documentation/DocBook/writing-an-alsa-driver.tmpl:1.26->1.27 
#   F:pci/als4000.c:1.32->1.33 
#   F:pci/atiixp.c:1.4->1.5 
#   F:pci/azt3328.c:1.12->1.13 
#   F:pci/bt87x.c:1.4->1.5 
#   F:pci/cmipci.c:1.62->1.63 
#   F:pci/cs4281.c:1.52->1.53 
#   F:pci/ens1370.c:1.59->1.60 
#   F:pci/es1938.c:1.34->1.35 
#   F:pci/es1968.c:1.63->1.64 
#   F:pci/fm801.c:1.44->1.45 
#   F:pci/intel8x0.c:1.132->1.133 
#   F:pci/intel8x0m.c:1.3->1.4 
#   F:pci/maestro3.c:1.50->1.51 
#   F:pci/rme32.c:1.32->1.33 
#   F:pci/rme96.c:1.34->1.35 
#   F:pci/sonicvibes.c:1.34->1.35 
#   F:pci/via82xx.c:1.95->1.96 
#   F:pci/ali5451/ali5451.c:1.46->1.47 
#   F:pci/au88x0/au88x0.c:1.7->1.8 
#   F:pci/cs46xx/cs46xx.c:1.26->1.27 
#   F:pci/emu10k1/emu10k1.c:1.23->1.24 
#   F:pci/ice1712/ice1712.c:1.48->1.49 
#   F:pci/ice1712/ice1724.c:1.28->1.29 
#   F:pci/korg1212/korg1212.c:1.37->1.38 
#   F:pci/mixart/mixart.c:1.7->1.8 
#   F:pci/nm256/nm256.c:1.35->1.36 
#   F:pci/rme9652/hdsp.c:1.55->1.56 
#   F:pci/rme9652/rme9652.c:1.43->1.44 
#   F:pci/trident/trident.c:1.23->1.24 
#   F:pci/vx222/vx222.c:1.4->1.5 
#   F:pci/ymfpci/ymfpci.c:1.35->1.36 
#   L:- removed superfluous warning messages after pci_module_init().
#   L:  (2.6 kernel doesn't return the error anyway...)
#   L:- store card pointer in pci_drvdata instead of chip pointer.
#   L:  this would make easier to add PM support.
# 
# sound/pci/ens1370.c
#   2004/04/13 09:59:00+02:00 perex@suse.cz +1 -9
#   ALSA CVS update
#   D:2004/04/13 15:58:59
#   C:Documentation,ALS4000 driver,ATIIXP driver,AZT3328 driver,BT87x driver
#   C:CMIPCI driver,CS4281 driver,ENS1370/1+ driver,ES1938 driver
#   C:ES1968 driver,FM801 driver,Intel8x0 driver,Intel8x0-modem driver
#   C:Maestro3 driver,RME32 driver,RME96 driver,SonicVibes driver
#   C:VIA82xx driver,ALI5451 driver,au88x0 driver,CS46xx driver
#   C:EMU10K1/EMU10K2 driver,ICE1712 driver,ICE1724 driver,KORG1212 driver
#   C:MIXART driver,NM256 driver,RME HDSP driver,RME9652 driver
#   C:Trident driver,Digigram VX222 driver,YMFPCI driver
#   A:Takashi Iwai <tiwai@suse.de>
#   F:Documentation/DocBook/writing-an-alsa-driver.tmpl:1.26->1.27 
#   F:pci/als4000.c:1.32->1.33 
#   F:pci/atiixp.c:1.4->1.5 
#   F:pci/azt3328.c:1.12->1.13 
#   F:pci/bt87x.c:1.4->1.5 
#   F:pci/cmipci.c:1.62->1.63 
#   F:pci/cs4281.c:1.52->1.53 
#   F:pci/ens1370.c:1.59->1.60 
#   F:pci/es1938.c:1.34->1.35 
#   F:pci/es1968.c:1.63->1.64 
#   F:pci/fm801.c:1.44->1.45 
#   F:pci/intel8x0.c:1.132->1.133 
#   F:pci/intel8x0m.c:1.3->1.4 
#   F:pci/maestro3.c:1.50->1.51 
#   F:pci/rme32.c:1.32->1.33 
#   F:pci/rme96.c:1.34->1.35 
#   F:pci/sonicvibes.c:1.34->1.35 
#   F:pci/via82xx.c:1.95->1.96 
#   F:pci/ali5451/ali5451.c:1.46->1.47 
#   F:pci/au88x0/au88x0.c:1.7->1.8 
#   F:pci/cs46xx/cs46xx.c:1.26->1.27 
#   F:pci/emu10k1/emu10k1.c:1.23->1.24 
#   F:pci/ice1712/ice1712.c:1.48->1.49 
#   F:pci/ice1712/ice1724.c:1.28->1.29 
#   F:pci/korg1212/korg1212.c:1.37->1.38 
#   F:pci/mixart/mixart.c:1.7->1.8 
#   F:pci/nm256/nm256.c:1.35->1.36 
#   F:pci/rme9652/hdsp.c:1.55->1.56 
#   F:pci/rme9652/rme9652.c:1.43->1.44 
#   F:pci/trident/trident.c:1.23->1.24 
#   F:pci/vx222/vx222.c:1.4->1.5 
#   F:pci/ymfpci/ymfpci.c:1.35->1.36 
#   L:- removed superfluous warning messages after pci_module_init().
#   L:  (2.6 kernel doesn't return the error anyway...)
#   L:- store card pointer in pci_drvdata instead of chip pointer.
#   L:  this would make easier to add PM support.
# 
# sound/pci/emu10k1/emu10k1.c
#   2004/04/13 09:59:01+02:00 perex@suse.cz +1 -9
#   ALSA CVS update
#   D:2004/04/13 15:58:59
#   C:Documentation,ALS4000 driver,ATIIXP driver,AZT3328 driver,BT87x driver
#   C:CMIPCI driver,CS4281 driver,ENS1370/1+ driver,ES1938 driver
#   C:ES1968 driver,FM801 driver,Intel8x0 driver,Intel8x0-modem driver
#   C:Maestro3 driver,RME32 driver,RME96 driver,SonicVibes driver
#   C:VIA82xx driver,ALI5451 driver,au88x0 driver,CS46xx driver
#   C:EMU10K1/EMU10K2 driver,ICE1712 driver,ICE1724 driver,KORG1212 driver
#   C:MIXART driver,NM256 driver,RME HDSP driver,RME9652 driver
#   C:Trident driver,Digigram VX222 driver,YMFPCI driver
#   A:Takashi Iwai <tiwai@suse.de>
#   F:Documentation/DocBook/writing-an-alsa-driver.tmpl:1.26->1.27 
#   F:pci/als4000.c:1.32->1.33 
#   F:pci/atiixp.c:1.4->1.5 
#   F:pci/azt3328.c:1.12->1.13 
#   F:pci/bt87x.c:1.4->1.5 
#   F:pci/cmipci.c:1.62->1.63 
#   F:pci/cs4281.c:1.52->1.53 
#   F:pci/ens1370.c:1.59->1.60 
#   F:pci/es1938.c:1.34->1.35 
#   F:pci/es1968.c:1.63->1.64 
#   F:pci/fm801.c:1.44->1.45 
#   F:pci/intel8x0.c:1.132->1.133 
#   F:pci/intel8x0m.c:1.3->1.4 
#   F:pci/maestro3.c:1.50->1.51 
#   F:pci/rme32.c:1.32->1.33 
#   F:pci/rme96.c:1.34->1.35 
#   F:pci/sonicvibes.c:1.34->1.35 
#   F:pci/via82xx.c:1.95->1.96 
#   F:pci/ali5451/ali5451.c:1.46->1.47 
#   F:pci/au88x0/au88x0.c:1.7->1.8 
#   F:pci/cs46xx/cs46xx.c:1.26->1.27 
#   F:pci/emu10k1/emu10k1.c:1.23->1.24 
#   F:pci/ice1712/ice1712.c:1.48->1.49 
#   F:pci/ice1712/ice1724.c:1.28->1.29 
#   F:pci/korg1212/korg1212.c:1.37->1.38 
#   F:pci/mixart/mixart.c:1.7->1.8 
#   F:pci/nm256/nm256.c:1.35->1.36 
#   F:pci/rme9652/hdsp.c:1.55->1.56 
#   F:pci/rme9652/rme9652.c:1.43->1.44 
#   F:pci/trident/trident.c:1.23->1.24 
#   F:pci/vx222/vx222.c:1.4->1.5 
#   F:pci/ymfpci/ymfpci.c:1.35->1.36 
#   L:- removed superfluous warning messages after pci_module_init().
#   L:  (2.6 kernel doesn't return the error anyway...)
#   L:- store card pointer in pci_drvdata instead of chip pointer.
#   L:  this would make easier to add PM support.
# 
# sound/pci/cs46xx/cs46xx.c
#   2004/04/13 09:59:00+02:00 perex@suse.cz +1 -9
#   ALSA CVS update
#   D:2004/04/13 15:58:59
#   C:Documentation,ALS4000 driver,ATIIXP driver,AZT3328 driver,BT87x driver
#   C:CMIPCI driver,CS4281 driver,ENS1370/1+ driver,ES1938 driver
#   C:ES1968 driver,FM801 driver,Intel8x0 driver,Intel8x0-modem driver
#   C:Maestro3 driver,RME32 driver,RME96 driver,SonicVibes driver
#   C:VIA82xx driver,ALI5451 driver,au88x0 driver,CS46xx driver
#   C:EMU10K1/EMU10K2 driver,ICE1712 driver,ICE1724 driver,KORG1212 driver
#   C:MIXART driver,NM256 driver,RME HDSP driver,RME9652 driver
#   C:Trident driver,Digigram VX222 driver,YMFPCI driver
#   A:Takashi Iwai <tiwai@suse.de>
#   F:Documentation/DocBook/writing-an-alsa-driver.tmpl:1.26->1.27 
#   F:pci/als4000.c:1.32->1.33 
#   F:pci/atiixp.c:1.4->1.5 
#   F:pci/azt3328.c:1.12->1.13 
#   F:pci/bt87x.c:1.4->1.5 
#   F:pci/cmipci.c:1.62->1.63 
#   F:pci/cs4281.c:1.52->1.53 
#   F:pci/ens1370.c:1.59->1.60 
#   F:pci/es1938.c:1.34->1.35 
#   F:pci/es1968.c:1.63->1.64 
#   F:pci/fm801.c:1.44->1.45 
#   F:pci/intel8x0.c:1.132->1.133 
#   F:pci/intel8x0m.c:1.3->1.4 
#   F:pci/maestro3.c:1.50->1.51 
#   F:pci/rme32.c:1.32->1.33 
#   F:pci/rme96.c:1.34->1.35 
#   F:pci/sonicvibes.c:1.34->1.35 
#   F:pci/via82xx.c:1.95->1.96 
#   F:pci/ali5451/ali5451.c:1.46->1.47 
#   F:pci/au88x0/au88x0.c:1.7->1.8 
#   F:pci/cs46xx/cs46xx.c:1.26->1.27 
#   F:pci/emu10k1/emu10k1.c:1.23->1.24 
#   F:pci/ice1712/ice1712.c:1.48->1.49 
#   F:pci/ice1712/ice1724.c:1.28->1.29 
#   F:pci/korg1212/korg1212.c:1.37->1.38 
#   F:pci/mixart/mixart.c:1.7->1.8 
#   F:pci/nm256/nm256.c:1.35->1.36 
#   F:pci/rme9652/hdsp.c:1.55->1.56 
#   F:pci/rme9652/rme9652.c:1.43->1.44 
#   F:pci/trident/trident.c:1.23->1.24 
#   F:pci/vx222/vx222.c:1.4->1.5 
#   F:pci/ymfpci/ymfpci.c:1.35->1.36 
#   L:- removed superfluous warning messages after pci_module_init().
#   L:  (2.6 kernel doesn't return the error anyway...)
#   L:- store card pointer in pci_drvdata instead of chip pointer.
#   L:  this would make easier to add PM support.
# 
# sound/pci/cs4281.c
#   2004/04/13 09:59:00+02:00 perex@suse.cz +1 -9
#   ALSA CVS update
#   D:2004/04/13 15:58:59
#   C:Documentation,ALS4000 driver,ATIIXP driver,AZT3328 driver,BT87x driver
#   C:CMIPCI driver,CS4281 driver,ENS1370/1+ driver,ES1938 driver
#   C:ES1968 driver,FM801 driver,Intel8x0 driver,Intel8x0-modem driver
#   C:Maestro3 driver,RME32 driver,RME96 driver,SonicVibes driver
#   C:VIA82xx driver,ALI5451 driver,au88x0 driver,CS46xx driver
#   C:EMU10K1/EMU10K2 driver,ICE1712 driver,ICE1724 driver,KORG1212 driver
#   C:MIXART driver,NM256 driver,RME HDSP driver,RME9652 driver
#   C:Trident driver,Digigram VX222 driver,YMFPCI driver
#   A:Takashi Iwai <tiwai@suse.de>
#   F:Documentation/DocBook/writing-an-alsa-driver.tmpl:1.26->1.27 
#   F:pci/als4000.c:1.32->1.33 
#   F:pci/atiixp.c:1.4->1.5 
#   F:pci/azt3328.c:1.12->1.13 
#   F:pci/bt87x.c:1.4->1.5 
#   F:pci/cmipci.c:1.62->1.63 
#   F:pci/cs4281.c:1.52->1.53 
#   F:pci/ens1370.c:1.59->1.60 
#   F:pci/es1938.c:1.34->1.35 
#   F:pci/es1968.c:1.63->1.64 
#   F:pci/fm801.c:1.44->1.45 
#   F:pci/intel8x0.c:1.132->1.133 
#   F:pci/intel8x0m.c:1.3->1.4 
#   F:pci/maestro3.c:1.50->1.51 
#   F:pci/rme32.c:1.32->1.33 
#   F:pci/rme96.c:1.34->1.35 
#   F:pci/sonicvibes.c:1.34->1.35 
#   F:pci/via82xx.c:1.95->1.96 
#   F:pci/ali5451/ali5451.c:1.46->1.47 
#   F:pci/au88x0/au88x0.c:1.7->1.8 
#   F:pci/cs46xx/cs46xx.c:1.26->1.27 
#   F:pci/emu10k1/emu10k1.c:1.23->1.24 
#   F:pci/ice1712/ice1712.c:1.48->1.49 
#   F:pci/ice1712/ice1724.c:1.28->1.29 
#   F:pci/korg1212/korg1212.c:1.37->1.38 
#   F:pci/mixart/mixart.c:1.7->1.8 
#   F:pci/nm256/nm256.c:1.35->1.36 
#   F:pci/rme9652/hdsp.c:1.55->1.56 
#   F:pci/rme9652/rme9652.c:1.43->1.44 
#   F:pci/trident/trident.c:1.23->1.24 
#   F:pci/vx222/vx222.c:1.4->1.5 
#   F:pci/ymfpci/ymfpci.c:1.35->1.36 
#   L:- removed superfluous warning messages after pci_module_init().
#   L:  (2.6 kernel doesn't return the error anyway...)
#   L:- store card pointer in pci_drvdata instead of chip pointer.
#   L:  this would make easier to add PM support.
# 
# sound/pci/cmipci.c
#   2004/04/13 09:59:00+02:00 perex@suse.cz +1 -9
#   ALSA CVS update
#   D:2004/04/13 15:58:59
#   C:Documentation,ALS4000 driver,ATIIXP driver,AZT3328 driver,BT87x driver
#   C:CMIPCI driver,CS4281 driver,ENS1370/1+ driver,ES1938 driver
#   C:ES1968 driver,FM801 driver,Intel8x0 driver,Intel8x0-modem driver
#   C:Maestro3 driver,RME32 driver,RME96 driver,SonicVibes driver
#   C:VIA82xx driver,ALI5451 driver,au88x0 driver,CS46xx driver
#   C:EMU10K1/EMU10K2 driver,ICE1712 driver,ICE1724 driver,KORG1212 driver
#   C:MIXART driver,NM256 driver,RME HDSP driver,RME9652 driver
#   C:Trident driver,Digigram VX222 driver,YMFPCI driver
#   A:Takashi Iwai <tiwai@suse.de>
#   F:Documentation/DocBook/writing-an-alsa-driver.tmpl:1.26->1.27 
#   F:pci/als4000.c:1.32->1.33 
#   F:pci/atiixp.c:1.4->1.5 
#   F:pci/azt3328.c:1.12->1.13 
#   F:pci/bt87x.c:1.4->1.5 
#   F:pci/cmipci.c:1.62->1.63 
#   F:pci/cs4281.c:1.52->1.53 
#   F:pci/ens1370.c:1.59->1.60 
#   F:pci/es1938.c:1.34->1.35 
#   F:pci/es1968.c:1.63->1.64 
#   F:pci/fm801.c:1.44->1.45 
#   F:pci/intel8x0.c:1.132->1.133 
#   F:pci/intel8x0m.c:1.3->1.4 
#   F:pci/maestro3.c:1.50->1.51 
#   F:pci/rme32.c:1.32->1.33 
#   F:pci/rme96.c:1.34->1.35 
#   F:pci/sonicvibes.c:1.34->1.35 
#   F:pci/via82xx.c:1.95->1.96 
#   F:pci/ali5451/ali5451.c:1.46->1.47 
#   F:pci/au88x0/au88x0.c:1.7->1.8 
#   F:pci/cs46xx/cs46xx.c:1.26->1.27 
#   F:pci/emu10k1/emu10k1.c:1.23->1.24 
#   F:pci/ice1712/ice1712.c:1.48->1.49 
#   F:pci/ice1712/ice1724.c:1.28->1.29 
#   F:pci/korg1212/korg1212.c:1.37->1.38 
#   F:pci/mixart/mixart.c:1.7->1.8 
#   F:pci/nm256/nm256.c:1.35->1.36 
#   F:pci/rme9652/hdsp.c:1.55->1.56 
#   F:pci/rme9652/rme9652.c:1.43->1.44 
#   F:pci/trident/trident.c:1.23->1.24 
#   F:pci/vx222/vx222.c:1.4->1.5 
#   F:pci/ymfpci/ymfpci.c:1.35->1.36 
#   L:- removed superfluous warning messages after pci_module_init().
#   L:  (2.6 kernel doesn't return the error anyway...)
#   L:- store card pointer in pci_drvdata instead of chip pointer.
#   L:  this would make easier to add PM support.
# 
# sound/pci/bt87x.c
#   2004/04/13 09:59:00+02:00 perex@suse.cz +3 -14
#   ALSA CVS update
#   D:2004/04/13 15:58:59
#   C:Documentation,ALS4000 driver,ATIIXP driver,AZT3328 driver,BT87x driver
#   C:CMIPCI driver,CS4281 driver,ENS1370/1+ driver,ES1938 driver
#   C:ES1968 driver,FM801 driver,Intel8x0 driver,Intel8x0-modem driver
#   C:Maestro3 driver,RME32 driver,RME96 driver,SonicVibes driver
#   C:VIA82xx driver,ALI5451 driver,au88x0 driver,CS46xx driver
#   C:EMU10K1/EMU10K2 driver,ICE1712 driver,ICE1724 driver,KORG1212 driver
#   C:MIXART driver,NM256 driver,RME HDSP driver,RME9652 driver
#   C:Trident driver,Digigram VX222 driver,YMFPCI driver
#   A:Takashi Iwai <tiwai@suse.de>
#   F:Documentation/DocBook/writing-an-alsa-driver.tmpl:1.26->1.27 
#   F:pci/als4000.c:1.32->1.33 
#   F:pci/atiixp.c:1.4->1.5 
#   F:pci/azt3328.c:1.12->1.13 
#   F:pci/bt87x.c:1.4->1.5 
#   F:pci/cmipci.c:1.62->1.63 
#   F:pci/cs4281.c:1.52->1.53 
#   F:pci/ens1370.c:1.59->1.60 
#   F:pci/es1938.c:1.34->1.35 
#   F:pci/es1968.c:1.63->1.64 
#   F:pci/fm801.c:1.44->1.45 
#   F:pci/intel8x0.c:1.132->1.133 
#   F:pci/intel8x0m.c:1.3->1.4 
#   F:pci/maestro3.c:1.50->1.51 
#   F:pci/rme32.c:1.32->1.33 
#   F:pci/rme96.c:1.34->1.35 
#   F:pci/sonicvibes.c:1.34->1.35 
#   F:pci/via82xx.c:1.95->1.96 
#   F:pci/ali5451/ali5451.c:1.46->1.47 
#   F:pci/au88x0/au88x0.c:1.7->1.8 
#   F:pci/cs46xx/cs46xx.c:1.26->1.27 
#   F:pci/emu10k1/emu10k1.c:1.23->1.24 
#   F:pci/ice1712/ice1712.c:1.48->1.49 
#   F:pci/ice1712/ice1724.c:1.28->1.29 
#   F:pci/korg1212/korg1212.c:1.37->1.38 
#   F:pci/mixart/mixart.c:1.7->1.8 
#   F:pci/nm256/nm256.c:1.35->1.36 
#   F:pci/rme9652/hdsp.c:1.55->1.56 
#   F:pci/rme9652/rme9652.c:1.43->1.44 
#   F:pci/trident/trident.c:1.23->1.24 
#   F:pci/vx222/vx222.c:1.4->1.5 
#   F:pci/ymfpci/ymfpci.c:1.35->1.36 
#   L:- removed superfluous warning messages after pci_module_init().
#   L:  (2.6 kernel doesn't return the error anyway...)
#   L:- store card pointer in pci_drvdata instead of chip pointer.
#   L:  this would make easier to add PM support.
# 
# sound/pci/azt3328.c
#   2004/04/13 09:59:00+02:00 perex@suse.cz +8 -20
#   ALSA CVS update
#   D:2004/04/13 15:58:59
#   C:Documentation,ALS4000 driver,ATIIXP driver,AZT3328 driver,BT87x driver
#   C:CMIPCI driver,CS4281 driver,ENS1370/1+ driver,ES1938 driver
#   C:ES1968 driver,FM801 driver,Intel8x0 driver,Intel8x0-modem driver
#   C:Maestro3 driver,RME32 driver,RME96 driver,SonicVibes driver
#   C:VIA82xx driver,ALI5451 driver,au88x0 driver,CS46xx driver
#   C:EMU10K1/EMU10K2 driver,ICE1712 driver,ICE1724 driver,KORG1212 driver
#   C:MIXART driver,NM256 driver,RME HDSP driver,RME9652 driver
#   C:Trident driver,Digigram VX222 driver,YMFPCI driver
#   A:Takashi Iwai <tiwai@suse.de>
#   F:Documentation/DocBook/writing-an-alsa-driver.tmpl:1.26->1.27 
#   F:pci/als4000.c:1.32->1.33 
#   F:pci/atiixp.c:1.4->1.5 
#   F:pci/azt3328.c:1.12->1.13 
#   F:pci/bt87x.c:1.4->1.5 
#   F:pci/cmipci.c:1.62->1.63 
#   F:pci/cs4281.c:1.52->1.53 
#   F:pci/ens1370.c:1.59->1.60 
#   F:pci/es1938.c:1.34->1.35 
#   F:pci/es1968.c:1.63->1.64 
#   F:pci/fm801.c:1.44->1.45 
#   F:pci/intel8x0.c:1.132->1.133 
#   F:pci/intel8x0m.c:1.3->1.4 
#   F:pci/maestro3.c:1.50->1.51 
#   F:pci/rme32.c:1.32->1.33 
#   F:pci/rme96.c:1.34->1.35 
#   F:pci/sonicvibes.c:1.34->1.35 
#   F:pci/via82xx.c:1.95->1.96 
#   F:pci/ali5451/ali5451.c:1.46->1.47 
#   F:pci/au88x0/au88x0.c:1.7->1.8 
#   F:pci/cs46xx/cs46xx.c:1.26->1.27 
#   F:pci/emu10k1/emu10k1.c:1.23->1.24 
#   F:pci/ice1712/ice1712.c:1.48->1.49 
#   F:pci/ice1712/ice1724.c:1.28->1.29 
#   F:pci/korg1212/korg1212.c:1.37->1.38 
#   F:pci/mixart/mixart.c:1.7->1.8 
#   F:pci/nm256/nm256.c:1.35->1.36 
#   F:pci/rme9652/hdsp.c:1.55->1.56 
#   F:pci/rme9652/rme9652.c:1.43->1.44 
#   F:pci/trident/trident.c:1.23->1.24 
#   F:pci/vx222/vx222.c:1.4->1.5 
#   F:pci/ymfpci/ymfpci.c:1.35->1.36 
#   L:- removed superfluous warning messages after pci_module_init().
#   L:  (2.6 kernel doesn't return the error anyway...)
#   L:- store card pointer in pci_drvdata instead of chip pointer.
#   L:  this would make easier to add PM support.
# 
# sound/pci/au88x0/au88x0.c
#   2004/04/13 09:59:00+02:00 perex@suse.cz +4 -21
#   ALSA CVS update
#   D:2004/04/13 15:58:59
#   C:Documentation,ALS4000 driver,ATIIXP driver,AZT3328 driver,BT87x driver
#   C:CMIPCI driver,CS4281 driver,ENS1370/1+ driver,ES1938 driver
#   C:ES1968 driver,FM801 driver,Intel8x0 driver,Intel8x0-modem driver
#   C:Maestro3 driver,RME32 driver,RME96 driver,SonicVibes driver
#   C:VIA82xx driver,ALI5451 driver,au88x0 driver,CS46xx driver
#   C:EMU10K1/EMU10K2 driver,ICE1712 driver,ICE1724 driver,KORG1212 driver
#   C:MIXART driver,NM256 driver,RME HDSP driver,RME9652 driver
#   C:Trident driver,Digigram VX222 driver,YMFPCI driver
#   A:Takashi Iwai <tiwai@suse.de>
#   F:Documentation/DocBook/writing-an-alsa-driver.tmpl:1.26->1.27 
#   F:pci/als4000.c:1.32->1.33 
#   F:pci/atiixp.c:1.4->1.5 
#   F:pci/azt3328.c:1.12->1.13 
#   F:pci/bt87x.c:1.4->1.5 
#   F:pci/cmipci.c:1.62->1.63 
#   F:pci/cs4281.c:1.52->1.53 
#   F:pci/ens1370.c:1.59->1.60 
#   F:pci/es1938.c:1.34->1.35 
#   F:pci/es1968.c:1.63->1.64 
#   F:pci/fm801.c:1.44->1.45 
#   F:pci/intel8x0.c:1.132->1.133 
#   F:pci/intel8x0m.c:1.3->1.4 
#   F:pci/maestro3.c:1.50->1.51 
#   F:pci/rme32.c:1.32->1.33 
#   F:pci/rme96.c:1.34->1.35 
#   F:pci/sonicvibes.c:1.34->1.35 
#   F:pci/via82xx.c:1.95->1.96 
#   F:pci/ali5451/ali5451.c:1.46->1.47 
#   F:pci/au88x0/au88x0.c:1.7->1.8 
#   F:pci/cs46xx/cs46xx.c:1.26->1.27 
#   F:pci/emu10k1/emu10k1.c:1.23->1.24 
#   F:pci/ice1712/ice1712.c:1.48->1.49 
#   F:pci/ice1712/ice1724.c:1.28->1.29 
#   F:pci/korg1212/korg1212.c:1.37->1.38 
#   F:pci/mixart/mixart.c:1.7->1.8 
#   F:pci/nm256/nm256.c:1.35->1.36 
#   F:pci/rme9652/hdsp.c:1.55->1.56 
#   F:pci/rme9652/rme9652.c:1.43->1.44 
#   F:pci/trident/trident.c:1.23->1.24 
#   F:pci/vx222/vx222.c:1.4->1.5 
#   F:pci/ymfpci/ymfpci.c:1.35->1.36 
#   L:- removed superfluous warning messages after pci_module_init().
#   L:  (2.6 kernel doesn't return the error anyway...)
#   L:- store card pointer in pci_drvdata instead of chip pointer.
#   L:  this would make easier to add PM support.
# 
# sound/pci/atiixp.c
#   2004/04/13 09:59:00+02:00 perex@suse.cz +1 -10
#   ALSA CVS update
#   D:2004/04/13 15:58:59
#   C:Documentation,ALS4000 driver,ATIIXP driver,AZT3328 driver,BT87x driver
#   C:CMIPCI driver,CS4281 driver,ENS1370/1+ driver,ES1938 driver
#   C:ES1968 driver,FM801 driver,Intel8x0 driver,Intel8x0-modem driver
#   C:Maestro3 driver,RME32 driver,RME96 driver,SonicVibes driver
#   C:VIA82xx driver,ALI5451 driver,au88x0 driver,CS46xx driver
#   C:EMU10K1/EMU10K2 driver,ICE1712 driver,ICE1724 driver,KORG1212 driver
#   C:MIXART driver,NM256 driver,RME HDSP driver,RME9652 driver
#   C:Trident driver,Digigram VX222 driver,YMFPCI driver
#   A:Takashi Iwai <tiwai@suse.de>
#   F:Documentation/DocBook/writing-an-alsa-driver.tmpl:1.26->1.27 
#   F:pci/als4000.c:1.32->1.33 
#   F:pci/atiixp.c:1.4->1.5 
#   F:pci/azt3328.c:1.12->1.13 
#   F:pci/bt87x.c:1.4->1.5 
#   F:pci/cmipci.c:1.62->1.63 
#   F:pci/cs4281.c:1.52->1.53 
#   F:pci/ens1370.c:1.59->1.60 
#   F:pci/es1938.c:1.34->1.35 
#   F:pci/es1968.c:1.63->1.64 
#   F:pci/fm801.c:1.44->1.45 
#   F:pci/intel8x0.c:1.132->1.133 
#   F:pci/intel8x0m.c:1.3->1.4 
#   F:pci/maestro3.c:1.50->1.51 
#   F:pci/rme32.c:1.32->1.33 
#   F:pci/rme96.c:1.34->1.35 
#   F:pci/sonicvibes.c:1.34->1.35 
#   F:pci/via82xx.c:1.95->1.96 
#   F:pci/ali5451/ali5451.c:1.46->1.47 
#   F:pci/au88x0/au88x0.c:1.7->1.8 
#   F:pci/cs46xx/cs46xx.c:1.26->1.27 
#   F:pci/emu10k1/emu10k1.c:1.23->1.24 
#   F:pci/ice1712/ice1712.c:1.48->1.49 
#   F:pci/ice1712/ice1724.c:1.28->1.29 
#   F:pci/korg1212/korg1212.c:1.37->1.38 
#   F:pci/mixart/mixart.c:1.7->1.8 
#   F:pci/nm256/nm256.c:1.35->1.36 
#   F:pci/rme9652/hdsp.c:1.55->1.56 
#   F:pci/rme9652/rme9652.c:1.43->1.44 
#   F:pci/trident/trident.c:1.23->1.24 
#   F:pci/vx222/vx222.c:1.4->1.5 
#   F:pci/ymfpci/ymfpci.c:1.35->1.36 
#   L:- removed superfluous warning messages after pci_module_init().
#   L:  (2.6 kernel doesn't return the error anyway...)
#   L:- store card pointer in pci_drvdata instead of chip pointer.
#   L:  this would make easier to add PM support.
# 
# sound/pci/als4000.c
#   2004/04/13 09:58:59+02:00 perex@suse.cz +1 -9
#   ALSA CVS update
#   D:2004/04/13 15:58:59
#   C:Documentation,ALS4000 driver,ATIIXP driver,AZT3328 driver,BT87x driver
#   C:CMIPCI driver,CS4281 driver,ENS1370/1+ driver,ES1938 driver
#   C:ES1968 driver,FM801 driver,Intel8x0 driver,Intel8x0-modem driver
#   C:Maestro3 driver,RME32 driver,RME96 driver,SonicVibes driver
#   C:VIA82xx driver,ALI5451 driver,au88x0 driver,CS46xx driver
#   C:EMU10K1/EMU10K2 driver,ICE1712 driver,ICE1724 driver,KORG1212 driver
#   C:MIXART driver,NM256 driver,RME HDSP driver,RME9652 driver
#   C:Trident driver,Digigram VX222 driver,YMFPCI driver
#   A:Takashi Iwai <tiwai@suse.de>
#   F:Documentation/DocBook/writing-an-alsa-driver.tmpl:1.26->1.27 
#   F:pci/als4000.c:1.32->1.33 
#   F:pci/atiixp.c:1.4->1.5 
#   F:pci/azt3328.c:1.12->1.13 
#   F:pci/bt87x.c:1.4->1.5 
#   F:pci/cmipci.c:1.62->1.63 
#   F:pci/cs4281.c:1.52->1.53 
#   F:pci/ens1370.c:1.59->1.60 
#   F:pci/es1938.c:1.34->1.35 
#   F:pci/es1968.c:1.63->1.64 
#   F:pci/fm801.c:1.44->1.45 
#   F:pci/intel8x0.c:1.132->1.133 
#   F:pci/intel8x0m.c:1.3->1.4 
#   F:pci/maestro3.c:1.50->1.51 
#   F:pci/rme32.c:1.32->1.33 
#   F:pci/rme96.c:1.34->1.35 
#   F:pci/sonicvibes.c:1.34->1.35 
#   F:pci/via82xx.c:1.95->1.96 
#   F:pci/ali5451/ali5451.c:1.46->1.47 
#   F:pci/au88x0/au88x0.c:1.7->1.8 
#   F:pci/cs46xx/cs46xx.c:1.26->1.27 
#   F:pci/emu10k1/emu10k1.c:1.23->1.24 
#   F:pci/ice1712/ice1712.c:1.48->1.49 
#   F:pci/ice1712/ice1724.c:1.28->1.29 
#   F:pci/korg1212/korg1212.c:1.37->1.38 
#   F:pci/mixart/mixart.c:1.7->1.8 
#   F:pci/nm256/nm256.c:1.35->1.36 
#   F:pci/rme9652/hdsp.c:1.55->1.56 
#   F:pci/rme9652/rme9652.c:1.43->1.44 
#   F:pci/trident/trident.c:1.23->1.24 
#   F:pci/vx222/vx222.c:1.4->1.5 
#   F:pci/ymfpci/ymfpci.c:1.35->1.36 
#   L:- removed superfluous warning messages after pci_module_init().
#   L:  (2.6 kernel doesn't return the error anyway...)
#   L:- store card pointer in pci_drvdata instead of chip pointer.
#   L:  this would make easier to add PM support.
# 
# sound/pci/ali5451/ali5451.c
#   2004/04/13 09:59:00+02:00 perex@suse.cz +1 -9
#   ALSA CVS update
#   D:2004/04/13 15:58:59
#   C:Documentation,ALS4000 driver,ATIIXP driver,AZT3328 driver,BT87x driver
#   C:CMIPCI driver,CS4281 driver,ENS1370/1+ driver,ES1938 driver
#   C:ES1968 driver,FM801 driver,Intel8x0 driver,Intel8x0-modem driver
#   C:Maestro3 driver,RME32 driver,RME96 driver,SonicVibes driver
#   C:VIA82xx driver,ALI5451 driver,au88x0 driver,CS46xx driver
#   C:EMU10K1/EMU10K2 driver,ICE1712 driver,ICE1724 driver,KORG1212 driver
#   C:MIXART driver,NM256 driver,RME HDSP driver,RME9652 driver
#   C:Trident driver,Digigram VX222 driver,YMFPCI driver
#   A:Takashi Iwai <tiwai@suse.de>
#   F:Documentation/DocBook/writing-an-alsa-driver.tmpl:1.26->1.27 
#   F:pci/als4000.c:1.32->1.33 
#   F:pci/atiixp.c:1.4->1.5 
#   F:pci/azt3328.c:1.12->1.13 
#   F:pci/bt87x.c:1.4->1.5 
#   F:pci/cmipci.c:1.62->1.63 
#   F:pci/cs4281.c:1.52->1.53 
#   F:pci/ens1370.c:1.59->1.60 
#   F:pci/es1938.c:1.34->1.35 
#   F:pci/es1968.c:1.63->1.64 
#   F:pci/fm801.c:1.44->1.45 
#   F:pci/intel8x0.c:1.132->1.133 
#   F:pci/intel8x0m.c:1.3->1.4 
#   F:pci/maestro3.c:1.50->1.51 
#   F:pci/rme32.c:1.32->1.33 
#   F:pci/rme96.c:1.34->1.35 
#   F:pci/sonicvibes.c:1.34->1.35 
#   F:pci/via82xx.c:1.95->1.96 
#   F:pci/ali5451/ali5451.c:1.46->1.47 
#   F:pci/au88x0/au88x0.c:1.7->1.8 
#   F:pci/cs46xx/cs46xx.c:1.26->1.27 
#   F:pci/emu10k1/emu10k1.c:1.23->1.24 
#   F:pci/ice1712/ice1712.c:1.48->1.49 
#   F:pci/ice1712/ice1724.c:1.28->1.29 
#   F:pci/korg1212/korg1212.c:1.37->1.38 
#   F:pci/mixart/mixart.c:1.7->1.8 
#   F:pci/nm256/nm256.c:1.35->1.36 
#   F:pci/rme9652/hdsp.c:1.55->1.56 
#   F:pci/rme9652/rme9652.c:1.43->1.44 
#   F:pci/trident/trident.c:1.23->1.24 
#   F:pci/vx222/vx222.c:1.4->1.5 
#   F:pci/ymfpci/ymfpci.c:1.35->1.36 
#   L:- removed superfluous warning messages after pci_module_init().
#   L:  (2.6 kernel doesn't return the error anyway...)
#   L:- store card pointer in pci_drvdata instead of chip pointer.
#   L:  this would make easier to add PM support.
# 
# Documentation/sound/alsa/DocBook/writing-an-alsa-driver.tmpl
#   2004/04/13 09:58:59+02:00 perex@suse.cz +2 -20
#   ALSA CVS update
#   D:2004/04/13 15:58:59
#   C:Documentation,ALS4000 driver,ATIIXP driver,AZT3328 driver,BT87x driver
#   C:CMIPCI driver,CS4281 driver,ENS1370/1+ driver,ES1938 driver
#   C:ES1968 driver,FM801 driver,Intel8x0 driver,Intel8x0-modem driver
#   C:Maestro3 driver,RME32 driver,RME96 driver,SonicVibes driver
#   C:VIA82xx driver,ALI5451 driver,au88x0 driver,CS46xx driver
#   C:EMU10K1/EMU10K2 driver,ICE1712 driver,ICE1724 driver,KORG1212 driver
#   C:MIXART driver,NM256 driver,RME HDSP driver,RME9652 driver
#   C:Trident driver,Digigram VX222 driver,YMFPCI driver
#   A:Takashi Iwai <tiwai@suse.de>
#   F:Documentation/DocBook/writing-an-alsa-driver.tmpl:1.26->1.27 
#   F:pci/als4000.c:1.32->1.33 
#   F:pci/atiixp.c:1.4->1.5 
#   F:pci/azt3328.c:1.12->1.13 
#   F:pci/bt87x.c:1.4->1.5 
#   F:pci/cmipci.c:1.62->1.63 
#   F:pci/cs4281.c:1.52->1.53 
#   F:pci/ens1370.c:1.59->1.60 
#   F:pci/es1938.c:1.34->1.35 
#   F:pci/es1968.c:1.63->1.64 
#   F:pci/fm801.c:1.44->1.45 
#   F:pci/intel8x0.c:1.132->1.133 
#   F:pci/intel8x0m.c:1.3->1.4 
#   F:pci/maestro3.c:1.50->1.51 
#   F:pci/rme32.c:1.32->1.33 
#   F:pci/rme96.c:1.34->1.35 
#   F:pci/sonicvibes.c:1.34->1.35 
#   F:pci/via82xx.c:1.95->1.96 
#   F:pci/ali5451/ali5451.c:1.46->1.47 
#   F:pci/au88x0/au88x0.c:1.7->1.8 
#   F:pci/cs46xx/cs46xx.c:1.26->1.27 
#   F:pci/emu10k1/emu10k1.c:1.23->1.24 
#   F:pci/ice1712/ice1712.c:1.48->1.49 
#   F:pci/ice1712/ice1724.c:1.28->1.29 
#   F:pci/korg1212/korg1212.c:1.37->1.38 
#   F:pci/mixart/mixart.c:1.7->1.8 
#   F:pci/nm256/nm256.c:1.35->1.36 
#   F:pci/rme9652/hdsp.c:1.55->1.56 
#   F:pci/rme9652/rme9652.c:1.43->1.44 
#   F:pci/trident/trident.c:1.23->1.24 
#   F:pci/vx222/vx222.c:1.4->1.5 
#   F:pci/ymfpci/ymfpci.c:1.35->1.36 
#   L:- removed superfluous warning messages after pci_module_init().
#   L:  (2.6 kernel doesn't return the error anyway...)
#   L:- store card pointer in pci_drvdata instead of chip pointer.
#   L:  this would make easier to add PM support.
# 
# ChangeSet
#   2004/04/24 15:50:18+02:00 perex@suse.cz 
#   ALSA CVS update - Clemens Ladisch <clemens@ladisch.de>
#   USB generic driver
#   use wrapper function for usb_control_msg()
#   to prevent DMA'ing from/to the stack
# 
# sound/usb/usbmixer.c
#   2004/04/13 02:56:34+02:00 perex@suse.cz +2 -2
#   ALSA CVS update
#   D:2004/04/13 08:56:23
#   C:USB generic driver
#   A:Clemens Ladisch <clemens@ladisch.de>
#   F:usb/usbaudio.c:1.97->1.98 
#   F:usb/usbaudio.h:1.29->1.30 
#   F:usb/usbmixer.c:1.26->1.27 
#   L:use wrapper function for usb_control_msg()
#   L:to prevent DMA'ing from/to the stack
# 
# sound/usb/usbaudio.h
#   2004/04/13 02:56:24+02:00 perex@suse.cz +2 -0
#   ALSA CVS update
#   D:2004/04/13 08:56:23
#   C:USB generic driver
#   A:Clemens Ladisch <clemens@ladisch.de>
#   F:usb/usbaudio.c:1.97->1.98 
#   F:usb/usbaudio.h:1.29->1.30 
#   F:usb/usbmixer.c:1.26->1.27 
#   L:use wrapper function for usb_control_msg()
#   L:to prevent DMA'ing from/to the stack
# 
# sound/usb/usbaudio.c
#   2004/04/13 02:56:23+02:00 perex@suse.cz +30 -4
#   ALSA CVS update
#   D:2004/04/13 08:56:23
#   C:USB generic driver
#   A:Clemens Ladisch <clemens@ladisch.de>
#   F:usb/usbaudio.c:1.97->1.98 
#   F:usb/usbaudio.h:1.29->1.30 
#   F:usb/usbmixer.c:1.26->1.27 
#   L:use wrapper function for usb_control_msg()
#   L:to prevent DMA'ing from/to the stack
# 
# ChangeSet
#   2004/04/24 15:49:59+02:00 perex@suse.cz 
#   ALSA CVS update - Clemens Ladisch <clemens@ladisch.de>
#   ALSA sequencer
#   load snd-seq-dummy automatically, as documented in seq_dummy.c
# 
# sound/core/seq/seq.c
#   2004/04/13 02:40:44+02:00 perex@suse.cz +4 -0
#   ALSA CVS update
#   D:2004/04/13 08:40:44
#   C:ALSA sequencer
#   A:Clemens Ladisch <clemens@ladisch.de>
#   F:core/seq/seq.c:1.10->1.11 
#   L:load snd-seq-dummy automatically, as documented in seq_dummy.c
# 
# ChangeSet
#   2004/04/24 15:49:37+02:00 perex@suse.cz 
#   ALSA CVS update - Jaroslav Kysela <perex@suse.cz>
#   Trident driver,CS4231 driver,PARISC Harmony driver
#   Remove all old SNDRV_DMA_TYPE_PCI references
# 
# sound/parisc/harmony.c
#   2004/04/08 12:10:08+02:00 perex@suse.cz +1 -1
#   ALSA CVS update
#   D:2004/04/08 18:10:08
#   C:Trident driver,CS4231 driver,PARISC Harmony driver
#   A:Jaroslav Kysela <perex@suse.cz>
#   F:include/trident.h:1.17->1.18 
#   F:isa/cs423x/cs4231_lib.c:1.38->1.39 
#   F:parisc/harmony.c:1.6->1.7 
#   L:Remove all old SNDRV_DMA_TYPE_PCI references
# 
# sound/isa/cs423x/cs4231_lib.c
#   2004/04/08 12:10:08+02:00 perex@suse.cz +1 -1
#   ALSA CVS update
#   D:2004/04/08 18:10:08
#   C:Trident driver,CS4231 driver,PARISC Harmony driver
#   A:Jaroslav Kysela <perex@suse.cz>
#   F:include/trident.h:1.17->1.18 
#   F:isa/cs423x/cs4231_lib.c:1.38->1.39 
#   F:parisc/harmony.c:1.6->1.7 
#   L:Remove all old SNDRV_DMA_TYPE_PCI references
# 
# include/sound/trident.h
#   2004/04/08 12:10:08+02:00 perex@suse.cz +0 -7
#   ALSA CVS update
#   D:2004/04/08 18:10:08
#   C:Trident driver,CS4231 driver,PARISC Harmony driver
#   A:Jaroslav Kysela <perex@suse.cz>
#   F:include/trident.h:1.17->1.18 
#   F:isa/cs423x/cs4231_lib.c:1.38->1.39 
#   F:parisc/harmony.c:1.6->1.7 
#   L:Remove all old SNDRV_DMA_TYPE_PCI references
# 
# ChangeSet
#   2004/04/24 15:49:19+02:00 perex@suse.cz 
#   ALSA CVS update - Takashi Iwai <tiwai@suse.de>
#   ALI5451 driver
#   Clean up of power-management codes.
#   
#   - moved commonly used codes to the core layer.
#   - using the unified suspend/resume callbacks for PCI and ISA
#   - added snd_card_set_pm_callbacks() and snd_card_set_isa_pm_callbacks()
#     as the registration functions.
# 
# sound/pci/ali5451/ali5451.c
#   2004/04/08 12:04:21+02:00 perex@suse.cz +11 -22
#   ALSA CVS update
#   D:2004/04/08 18:04:21
#   C:ALI5451 driver
#   A:Takashi Iwai <tiwai@suse.de>
#   F:pci/ali5451/ali5451.c:1.45->1.46 
#   L:Clean up of power-management codes.
#   L:
#   L:- moved commonly used codes to the core layer.
#   L:- using the unified suspend/resume callbacks for PCI and ISA
#   L:- added snd_card_set_pm_callbacks() and snd_card_set_isa_pm_callbacks()
#   L:  as the registration functions.
# 
# ChangeSet
#   2004/04/24 15:48:59+02:00 perex@suse.cz 
#   ALSA CVS update - Takashi Iwai <tiwai@suse.de>
#   Documentation,Control Midlevel,ALSA Core,AD1848 driver,CS4231 driver
#   CS46xx driver,Trident driver,YMFPCI driver,ES18xx driver,OPL3SA2 driver
#   ATIIXP driver,CS4281 driver,ES1968 driver,Intel8x0 driver
#   Intel8x0-modem driver,Maestro3 driver,ALI5451 driver,NM256 driver
#   Sound Core PDAudioCF driver
#   Clean up of power-management codes.
#   
#   - moved commonly used codes to the core layer.
#   - using the unified suspend/resume callbacks for PCI and ISA
#   - added snd_card_set_pm_callbacks() and snd_card_set_isa_pm_callbacks()
#     as the registration functions.
# 
# sound/pcmcia/pdaudiocf/pdaudiocf_core.c
#   2004/04/08 11:35:01+02:00 perex@suse.cz +5 -28
#   ALSA CVS update
#   D:2004/04/08 17:34:59
#   C:Documentation,Control Midlevel,ALSA Core,AD1848 driver,CS4231 driver
#   C:CS46xx driver,Trident driver,YMFPCI driver,ES18xx driver,OPL3SA2 driver
#   C:ATIIXP driver,CS4281 driver,ES1968 driver,Intel8x0 driver
#   C:Intel8x0-modem driver,Maestro3 driver,ALI5451 driver,NM256 driver
#   C:Sound Core PDAudioCF driver
#   A:Takashi Iwai <tiwai@suse.de>
#   F:Documentation/DocBook/writing-an-alsa-driver.tmpl:1.25->1.26 
#   F:core/control.c:1.41->1.42 
#   F:core/init.c:1.44->1.45 
#   F:core/sound.c:1.60->1.61 
#   F:include/ad1848.h:1.9->1.10 
#   F:include/core.h:1.49->1.50 
#   F:include/cs4231.h:1.7->1.8 
#   F:include/cs46xx.h:1.18->1.19 
#   F:include/trident.h:1.16->1.17 
#   F:include/ymfpci.h:1.14->1.15 
#   F:isa/es18xx.c:1.45->1.46 
#   F:isa/opl3sa2.c:1.33->1.34 
#   F:isa/ad1848/ad1848_lib.c:1.34->1.35 
#   F:isa/cs423x/cs4231_lib.c:1.37->1.38 
#   F:pci/atiixp.c:1.3->1.4 
#   F:pci/cs4281.c:1.51->1.52 
#   F:pci/es1968.c:1.62->1.63 
#   F:pci/intel8x0.c:1.131->1.132 
#   F:pci/intel8x0m.c:1.2->1.3 
#   F:pci/maestro3.c:1.49->1.50 
#   F:pci/ali5451/ali5451.c:1.44->1.45 
#   F:pci/cs46xx/cs46xx.c:1.25->1.26 
#   F:pci/cs46xx/cs46xx_lib.c:1.71->1.72 
#   F:pci/nm256/nm256.c:1.34->1.35 
#   F:pci/trident/trident.c:1.22->1.23 
#   F:pci/trident/trident_main.c:1.55->1.56 
#   F:pci/ymfpci/ymfpci.c:1.34->1.35 
#   F:pci/ymfpci/ymfpci_main.c:1.49->1.50 
#   F:pcmcia/pdaudiocf/pdaudiocf.c:1.5->1.6 
#   F:pcmcia/pdaudiocf/pdaudiocf.h:1.4->1.5 
#   F:pcmcia/pdaudiocf/pdaudiocf_core.c:1.2->1.3 
#   L:Clean up of power-management codes.
#   L:
#   L:- moved commonly used codes to the core layer.
#   L:- using the unified suspend/resume callbacks for PCI and ISA
#   L:- added snd_card_set_pm_callbacks() and snd_card_set_isa_pm_callbacks()
#   L:  as the registration functions.
# 
# sound/pcmcia/pdaudiocf/pdaudiocf.h
#   2004/04/08 11:35:01+02:00 perex@suse.cz +2 -3
#   ALSA CVS update
#   D:2004/04/08 17:34:59
#   C:Documentation,Control Midlevel,ALSA Core,AD1848 driver,CS4231 driver
#   C:CS46xx driver,Trident driver,YMFPCI driver,ES18xx driver,OPL3SA2 driver
#   C:ATIIXP driver,CS4281 driver,ES1968 driver,Intel8x0 driver
#   C:Intel8x0-modem driver,Maestro3 driver,ALI5451 driver,NM256 driver
#   C:Sound Core PDAudioCF driver
#   A:Takashi Iwai <tiwai@suse.de>
#   F:Documentation/DocBook/writing-an-alsa-driver.tmpl:1.25->1.26 
#   F:core/control.c:1.41->1.42 
#   F:core/init.c:1.44->1.45 
#   F:core/sound.c:1.60->1.61 
#   F:include/ad1848.h:1.9->1.10 
#   F:include/core.h:1.49->1.50 
#   F:include/cs4231.h:1.7->1.8 
#   F:include/cs46xx.h:1.18->1.19 
#   F:include/trident.h:1.16->1.17 
#   F:include/ymfpci.h:1.14->1.15 
#   F:isa/es18xx.c:1.45->1.46 
#   F:isa/opl3sa2.c:1.33->1.34 
#   F:isa/ad1848/ad1848_lib.c:1.34->1.35 
#   F:isa/cs423x/cs4231_lib.c:1.37->1.38 
#   F:pci/atiixp.c:1.3->1.4 
#   F:pci/cs4281.c:1.51->1.52 
#   F:pci/es1968.c:1.62->1.63 
#   F:pci/intel8x0.c:1.131->1.132 
#   F:pci/intel8x0m.c:1.2->1.3 
#   F:pci/maestro3.c:1.49->1.50 
#   F:pci/ali5451/ali5451.c:1.44->1.45 
#   F:pci/cs46xx/cs46xx.c:1.25->1.26 
#   F:pci/cs46xx/cs46xx_lib.c:1.71->1.72 
#   F:pci/nm256/nm256.c:1.34->1.35 
#   F:pci/trident/trident.c:1.22->1.23 
#   F:pci/trident/trident_main.c:1.55->1.56 
#   F:pci/ymfpci/ymfpci.c:1.34->1.35 
#   F:pci/ymfpci/ymfpci_main.c:1.49->1.50 
#   F:pcmcia/pdaudiocf/pdaudiocf.c:1.5->1.6 
#   F:pcmcia/pdaudiocf/pdaudiocf.h:1.4->1.5 
#   F:pcmcia/pdaudiocf/pdaudiocf_core.c:1.2->1.3 
#   L:Clean up of power-management codes.
#   L:
#   L:- moved commonly used codes to the core layer.
#   L:- using the unified suspend/resume callbacks for PCI and ISA
#   L:- added snd_card_set_pm_callbacks() and snd_card_set_isa_pm_callbacks()
#   L:  as the registration functions.
# 
# sound/pcmcia/pdaudiocf/pdaudiocf.c
#   2004/04/08 11:35:00+02:00 perex@suse.cz +3 -6
#   ALSA CVS update
#   D:2004/04/08 17:34:59
#   C:Documentation,Control Midlevel,ALSA Core,AD1848 driver,CS4231 driver
#   C:CS46xx driver,Trident driver,YMFPCI driver,ES18xx driver,OPL3SA2 driver
#   C:ATIIXP driver,CS4281 driver,ES1968 driver,Intel8x0 driver
#   C:Intel8x0-modem driver,Maestro3 driver,ALI5451 driver,NM256 driver
#   C:Sound Core PDAudioCF driver
#   A:Takashi Iwai <tiwai@suse.de>
#   F:Documentation/DocBook/writing-an-alsa-driver.tmpl:1.25->1.26 
#   F:core/control.c:1.41->1.42 
#   F:core/init.c:1.44->1.45 
#   F:core/sound.c:1.60->1.61 
#   F:include/ad1848.h:1.9->1.10 
#   F:include/core.h:1.49->1.50 
#   F:include/cs4231.h:1.7->1.8 
#   F:include/cs46xx.h:1.18->1.19 
#   F:include/trident.h:1.16->1.17 
#   F:include/ymfpci.h:1.14->1.15 
#   F:isa/es18xx.c:1.45->1.46 
#   F:isa/opl3sa2.c:1.33->1.34 
#   F:isa/ad1848/ad1848_lib.c:1.34->1.35 
#   F:isa/cs423x/cs4231_lib.c:1.37->1.38 
#   F:pci/atiixp.c:1.3->1.4 
#   F:pci/cs4281.c:1.51->1.52 
#   F:pci/es1968.c:1.62->1.63 
#   F:pci/intel8x0.c:1.131->1.132 
#   F:pci/intel8x0m.c:1.2->1.3 
#   F:pci/maestro3.c:1.49->1.50 
#   F:pci/ali5451/ali5451.c:1.44->1.45 
#   F:pci/cs46xx/cs46xx.c:1.25->1.26 
#   F:pci/cs46xx/cs46xx_lib.c:1.71->1.72 
#   F:pci/nm256/nm256.c:1.34->1.35 
#   F:pci/trident/trident.c:1.22->1.23 
#   F:pci/trident/trident_main.c:1.55->1.56 
#   F:pci/ymfpci/ymfpci.c:1.34->1.35 
#   F:pci/ymfpci/ymfpci_main.c:1.49->1.50 
#   F:pcmcia/pdaudiocf/pdaudiocf.c:1.5->1.6 
#   F:pcmcia/pdaudiocf/pdaudiocf.h:1.4->1.5 
#   F:pcmcia/pdaudiocf/pdaudiocf_core.c:1.2->1.3 
#   L:Clean up of power-management codes.
#   L:
#   L:- moved commonly used codes to the core layer.
#   L:- using the unified suspend/resume callbacks for PCI and ISA
#   L:- added snd_card_set_pm_callbacks() and snd_card_set_isa_pm_callbacks()
#   L:  as the registration functions.
# 
# sound/pci/ymfpci/ymfpci_main.c
#   2004/04/08 11:35:00+02:00 perex@suse.cz +6 -30
#   ALSA CVS update
#   D:2004/04/08 17:34:59
#   C:Documentation,Control Midlevel,ALSA Core,AD1848 driver,CS4231 driver
#   C:CS46xx driver,Trident driver,YMFPCI driver,ES18xx driver,OPL3SA2 driver
#   C:ATIIXP driver,CS4281 driver,ES1968 driver,Intel8x0 driver
#   C:Intel8x0-modem driver,Maestro3 driver,ALI5451 driver,NM256 driver
#   C:Sound Core PDAudioCF driver
#   A:Takashi Iwai <tiwai@suse.de>
#   F:Documentation/DocBook/writing-an-alsa-driver.tmpl:1.25->1.26 
#   F:core/control.c:1.41->1.42 
#   F:core/init.c:1.44->1.45 
#   F:core/sound.c:1.60->1.61 
#   F:include/ad1848.h:1.9->1.10 
#   F:include/core.h:1.49->1.50 
#   F:include/cs4231.h:1.7->1.8 
#   F:include/cs46xx.h:1.18->1.19 
#   F:include/trident.h:1.16->1.17 
#   F:include/ymfpci.h:1.14->1.15 
#   F:isa/es18xx.c:1.45->1.46 
#   F:isa/opl3sa2.c:1.33->1.34 
#   F:isa/ad1848/ad1848_lib.c:1.34->1.35 
#   F:isa/cs423x/cs4231_lib.c:1.37->1.38 
#   F:pci/atiixp.c:1.3->1.4 
#   F:pci/cs4281.c:1.51->1.52 
#   F:pci/es1968.c:1.62->1.63 
#   F:pci/intel8x0.c:1.131->1.132 
#   F:pci/intel8x0m.c:1.2->1.3 
#   F:pci/maestro3.c:1.49->1.50 
#   F:pci/ali5451/ali5451.c:1.44->1.45 
#   F:pci/cs46xx/cs46xx.c:1.25->1.26 
#   F:pci/cs46xx/cs46xx_lib.c:1.71->1.72 
#   F:pci/nm256/nm256.c:1.34->1.35 
#   F:pci/trident/trident.c:1.22->1.23 
#   F:pci/trident/trident_main.c:1.55->1.56 
#   F:pci/ymfpci/ymfpci.c:1.34->1.35 
#   F:pci/ymfpci/ymfpci_main.c:1.49->1.50 
#   F:pcmcia/pdaudiocf/pdaudiocf.c:1.5->1.6 
#   F:pcmcia/pdaudiocf/pdaudiocf.h:1.4->1.5 
#   F:pcmcia/pdaudiocf/pdaudiocf_core.c:1.2->1.3 
#   L:Clean up of power-management codes.
#   L:
#   L:- moved commonly used codes to the core layer.
#   L:- using the unified suspend/resume callbacks for PCI and ISA
#   L:- added snd_card_set_pm_callbacks() and snd_card_set_isa_pm_callbacks()
#   L:  as the registration functions.
# 
# sound/pci/ymfpci/ymfpci.c
#   2004/04/08 11:35:00+02:00 perex@suse.cz +3 -23
#   ALSA CVS update
#   D:2004/04/08 17:34:59
#   C:Documentation,Control Midlevel,ALSA Core,AD1848 driver,CS4231 driver
#   C:CS46xx driver,Trident driver,YMFPCI driver,ES18xx driver,OPL3SA2 driver
#   C:ATIIXP driver,CS4281 driver,ES1968 driver,Intel8x0 driver
#   C:Intel8x0-modem driver,Maestro3 driver,ALI5451 driver,NM256 driver
#   C:Sound Core PDAudioCF driver
#   A:Takashi Iwai <tiwai@suse.de>
#   F:Documentation/DocBook/writing-an-alsa-driver.tmpl:1.25->1.26 
#   F:core/control.c:1.41->1.42 
#   F:core/init.c:1.44->1.45 
#   F:core/sound.c:1.60->1.61 
#   F:include/ad1848.h:1.9->1.10 
#   F:include/core.h:1.49->1.50 
#   F:include/cs4231.h:1.7->1.8 
#   F:include/cs46xx.h:1.18->1.19 
#   F:include/trident.h:1.16->1.17 
#   F:include/ymfpci.h:1.14->1.15 
#   F:isa/es18xx.c:1.45->1.46 
#   F:isa/opl3sa2.c:1.33->1.34 
#   F:isa/ad1848/ad1848_lib.c:1.34->1.35 
#   F:isa/cs423x/cs4231_lib.c:1.37->1.38 
#   F:pci/atiixp.c:1.3->1.4 
#   F:pci/cs4281.c:1.51->1.52 
#   F:pci/es1968.c:1.62->1.63 
#   F:pci/intel8x0.c:1.131->1.132 
#   F:pci/intel8x0m.c:1.2->1.3 
#   F:pci/maestro3.c:1.49->1.50 
#   F:pci/ali5451/ali5451.c:1.44->1.45 
#   F:pci/cs46xx/cs46xx.c:1.25->1.26 
#   F:pci/cs46xx/cs46xx_lib.c:1.71->1.72 
#   F:pci/nm256/nm256.c:1.34->1.35 
#   F:pci/trident/trident.c:1.22->1.23 
#   F:pci/trident/trident_main.c:1.55->1.56 
#   F:pci/ymfpci/ymfpci.c:1.34->1.35 
#   F:pci/ymfpci/ymfpci_main.c:1.49->1.50 
#   F:pcmcia/pdaudiocf/pdaudiocf.c:1.5->1.6 
#   F:pcmcia/pdaudiocf/pdaudiocf.h:1.4->1.5 
#   F:pcmcia/pdaudiocf/pdaudiocf_core.c:1.2->1.3 
#   L:Clean up of power-management codes.
#   L:
#   L:- moved commonly used codes to the core layer.
#   L:- using the unified suspend/resume callbacks for PCI and ISA
#   L:- added snd_card_set_pm_callbacks() and snd_card_set_isa_pm_callbacks()
#   L:  as the registration functions.
# 
# sound/pci/trident/trident_main.c
#   2004/04/08 11:35:00+02:00 perex@suse.cz +10 -36
#   ALSA CVS update
#   D:2004/04/08 17:34:59
#   C:Documentation,Control Midlevel,ALSA Core,AD1848 driver,CS4231 driver
#   C:CS46xx driver,Trident driver,YMFPCI driver,ES18xx driver,OPL3SA2 driver
#   C:ATIIXP driver,CS4281 driver,ES1968 driver,Intel8x0 driver
#   C:Intel8x0-modem driver,Maestro3 driver,ALI5451 driver,NM256 driver
#   C:Sound Core PDAudioCF driver
#   A:Takashi Iwai <tiwai@suse.de>
#   F:Documentation/DocBook/writing-an-alsa-driver.tmpl:1.25->1.26 
#   F:core/control.c:1.41->1.42 
#   F:core/init.c:1.44->1.45 
#   F:core/sound.c:1.60->1.61 
#   F:include/ad1848.h:1.9->1.10 
#   F:include/core.h:1.49->1.50 
#   F:include/cs4231.h:1.7->1.8 
#   F:include/cs46xx.h:1.18->1.19 
#   F:include/trident.h:1.16->1.17 
#   F:include/ymfpci.h:1.14->1.15 
#   F:isa/es18xx.c:1.45->1.46 
#   F:isa/opl3sa2.c:1.33->1.34 
#   F:isa/ad1848/ad1848_lib.c:1.34->1.35 
#   F:isa/cs423x/cs4231_lib.c:1.37->1.38 
#   F:pci/atiixp.c:1.3->1.4 
#   F:pci/cs4281.c:1.51->1.52 
#   F:pci/es1968.c:1.62->1.63 
#   F:pci/intel8x0.c:1.131->1.132 
#   F:pci/intel8x0m.c:1.2->1.3 
#   F:pci/maestro3.c:1.49->1.50 
#   F:pci/ali5451/ali5451.c:1.44->1.45 
#   F:pci/cs46xx/cs46xx.c:1.25->1.26 
#   F:pci/cs46xx/cs46xx_lib.c:1.71->1.72 
#   F:pci/nm256/nm256.c:1.34->1.35 
#   F:pci/trident/trident.c:1.22->1.23 
#   F:pci/trident/trident_main.c:1.55->1.56 
#   F:pci/ymfpci/ymfpci.c:1.34->1.35 
#   F:pci/ymfpci/ymfpci_main.c:1.49->1.50 
#   F:pcmcia/pdaudiocf/pdaudiocf.c:1.5->1.6 
#   F:pcmcia/pdaudiocf/pdaudiocf.h:1.4->1.5 
#   F:pcmcia/pdaudiocf/pdaudiocf_core.c:1.2->1.3 
#   L:Clean up of power-management codes.
#   L:
#   L:- moved commonly used codes to the core layer.
#   L:- using the unified suspend/resume callbacks for PCI and ISA
#   L:- added snd_card_set_pm_callbacks() and snd_card_set_isa_pm_callbacks()
#   L:  as the registration functions.
# 
# sound/pci/trident/trident.c
#   2004/04/08 11:35:00+02:00 perex@suse.cz +3 -23
#   ALSA CVS update
#   D:2004/04/08 17:34:59
#   C:Documentation,Control Midlevel,ALSA Core,AD1848 driver,CS4231 driver
#   C:CS46xx driver,Trident driver,YMFPCI driver,ES18xx driver,OPL3SA2 driver
#   C:ATIIXP driver,CS4281 driver,ES1968 driver,Intel8x0 driver
#   C:Intel8x0-modem driver,Maestro3 driver,ALI5451 driver,NM256 driver
#   C:Sound Core PDAudioCF driver
#   A:Takashi Iwai <tiwai@suse.de>
#   F:Documentation/DocBook/writing-an-alsa-driver.tmpl:1.25->1.26 
#   F:core/control.c:1.41->1.42 
#   F:core/init.c:1.44->1.45 
#   F:core/sound.c:1.60->1.61 
#   F:include/ad1848.h:1.9->1.10 
#   F:include/core.h:1.49->1.50 
#   F:include/cs4231.h:1.7->1.8 
#   F:include/cs46xx.h:1.18->1.19 
#   F:include/trident.h:1.16->1.17 
#   F:include/ymfpci.h:1.14->1.15 
#   F:isa/es18xx.c:1.45->1.46 
#   F:isa/opl3sa2.c:1.33->1.34 
#   F:isa/ad1848/ad1848_lib.c:1.34->1.35 
#   F:isa/cs423x/cs4231_lib.c:1.37->1.38 
#   F:pci/atiixp.c:1.3->1.4 
#   F:pci/cs4281.c:1.51->1.52 
#   F:pci/es1968.c:1.62->1.63 
#   F:pci/intel8x0.c:1.131->1.132 
#   F:pci/intel8x0m.c:1.2->1.3 
#   F:pci/maestro3.c:1.49->1.50 
#   F:pci/ali5451/ali5451.c:1.44->1.45 
#   F:pci/cs46xx/cs46xx.c:1.25->1.26 
#   F:pci/cs46xx/cs46xx_lib.c:1.71->1.72 
#   F:pci/nm256/nm256.c:1.34->1.35 
#   F:pci/trident/trident.c:1.22->1.23 
#   F:pci/trident/trident_main.c:1.55->1.56 
#   F:pci/ymfpci/ymfpci.c:1.34->1.35 
#   F:pci/ymfpci/ymfpci_main.c:1.49->1.50 
#   F:pcmcia/pdaudiocf/pdaudiocf.c:1.5->1.6 
#   F:pcmcia/pdaudiocf/pdaudiocf.h:1.4->1.5 
#   F:pcmcia/pdaudiocf/pdaudiocf_core.c:1.2->1.3 
#   L:Clean up of power-management codes.
#   L:
#   L:- moved commonly used codes to the core layer.
#   L:- using the unified suspend/resume callbacks for PCI and ISA
#   L:- added snd_card_set_pm_callbacks() and snd_card_set_isa_pm_callbacks()
#   L:  as the registration functions.
# 
# sound/pci/nm256/nm256.c
#   2004/04/08 11:35:00+02:00 perex@suse.cz +9 -55
#   ALSA CVS update
#   D:2004/04/08 17:34:59
#   C:Documentation,Control Midlevel,ALSA Core,AD1848 driver,CS4231 driver
#   C:CS46xx driver,Trident driver,YMFPCI driver,ES18xx driver,OPL3SA2 driver
#   C:ATIIXP driver,CS4281 driver,ES1968 driver,Intel8x0 driver
#   C:Intel8x0-modem driver,Maestro3 driver,ALI5451 driver,NM256 driver
#   C:Sound Core PDAudioCF driver
#   A:Takashi Iwai <tiwai@suse.de>
#   F:Documentation/DocBook/writing-an-alsa-driver.tmpl:1.25->1.26 
#   F:core/control.c:1.41->1.42 
#   F:core/init.c:1.44->1.45 
#   F:core/sound.c:1.60->1.61 
#   F:include/ad1848.h:1.9->1.10 
#   F:include/core.h:1.49->1.50 
#   F:include/cs4231.h:1.7->1.8 
#   F:include/cs46xx.h:1.18->1.19 
#   F:include/trident.h:1.16->1.17 
#   F:include/ymfpci.h:1.14->1.15 
#   F:isa/es18xx.c:1.45->1.46 
#   F:isa/opl3sa2.c:1.33->1.34 
#   F:isa/ad1848/ad1848_lib.c:1.34->1.35 
#   F:isa/cs423x/cs4231_lib.c:1.37->1.38 
#   F:pci/atiixp.c:1.3->1.4 
#   F:pci/cs4281.c:1.51->1.52 
#   F:pci/es1968.c:1.62->1.63 
#   F:pci/intel8x0.c:1.131->1.132 
#   F:pci/intel8x0m.c:1.2->1.3 
#   F:pci/maestro3.c:1.49->1.50 
#   F:pci/ali5451/ali5451.c:1.44->1.45 
#   F:pci/cs46xx/cs46xx.c:1.25->1.26 
#   F:pci/cs46xx/cs46xx_lib.c:1.71->1.72 
#   F:pci/nm256/nm256.c:1.34->1.35 
#   F:pci/trident/trident.c:1.22->1.23 
#   F:pci/trident/trident_main.c:1.55->1.56 
#   F:pci/ymfpci/ymfpci.c:1.34->1.35 
#   F:pci/ymfpci/ymfpci_main.c:1.49->1.50 
#   F:pcmcia/pdaudiocf/pdaudiocf.c:1.5->1.6 
#   F:pcmcia/pdaudiocf/pdaudiocf.h:1.4->1.5 
#   F:pcmcia/pdaudiocf/pdaudiocf_core.c:1.2->1.3 
#   L:Clean up of power-management codes.
#   L:
#   L:- moved commonly used codes to the core layer.
#   L:- using the unified suspend/resume callbacks for PCI and ISA
#   L:- added snd_card_set_pm_callbacks() and snd_card_set_isa_pm_callbacks()
#   L:  as the registration functions.
# 
# sound/pci/maestro3.c
#   2004/04/08 11:35:00+02:00 perex@suse.cz +13 -57
#   ALSA CVS update
#   D:2004/04/08 17:34:59
#   C:Documentation,Control Midlevel,ALSA Core,AD1848 driver,CS4231 driver
#   C:CS46xx driver,Trident driver,YMFPCI driver,ES18xx driver,OPL3SA2 driver
#   C:ATIIXP driver,CS4281 driver,ES1968 driver,Intel8x0 driver
#   C:Intel8x0-modem driver,Maestro3 driver,ALI5451 driver,NM256 driver
#   C:Sound Core PDAudioCF driver
#   A:Takashi Iwai <tiwai@suse.de>
#   F:Documentation/DocBook/writing-an-alsa-driver.tmpl:1.25->1.26 
#   F:core/control.c:1.41->1.42 
#   F:core/init.c:1.44->1.45 
#   F:core/sound.c:1.60->1.61 
#   F:include/ad1848.h:1.9->1.10 
#   F:include/core.h:1.49->1.50 
#   F:include/cs4231.h:1.7->1.8 
#   F:include/cs46xx.h:1.18->1.19 
#   F:include/trident.h:1.16->1.17 
#   F:include/ymfpci.h:1.14->1.15 
#   F:isa/es18xx.c:1.45->1.46 
#   F:isa/opl3sa2.c:1.33->1.34 
#   F:isa/ad1848/ad1848_lib.c:1.34->1.35 
#   F:isa/cs423x/cs4231_lib.c:1.37->1.38 
#   F:pci/atiixp.c:1.3->1.4 
#   F:pci/cs4281.c:1.51->1.52 
#   F:pci/es1968.c:1.62->1.63 
#   F:pci/intel8x0.c:1.131->1.132 
#   F:pci/intel8x0m.c:1.2->1.3 
#   F:pci/maestro3.c:1.49->1.50 
#   F:pci/ali5451/ali5451.c:1.44->1.45 
#   F:pci/cs46xx/cs46xx.c:1.25->1.26 
#   F:pci/cs46xx/cs46xx_lib.c:1.71->1.72 
#   F:pci/nm256/nm256.c:1.34->1.35 
#   F:pci/trident/trident.c:1.22->1.23 
#   F:pci/trident/trident_main.c:1.55->1.56 
#   F:pci/ymfpci/ymfpci.c:1.34->1.35 
#   F:pci/ymfpci/ymfpci_main.c:1.49->1.50 
#   F:pcmcia/pdaudiocf/pdaudiocf.c:1.5->1.6 
#   F:pcmcia/pdaudiocf/pdaudiocf.h:1.4->1.5 
#   F:pcmcia/pdaudiocf/pdaudiocf_core.c:1.2->1.3 
#   L:Clean up of power-management codes.
#   L:
#   L:- moved commonly used codes to the core layer.
#   L:- using the unified suspend/resume callbacks for PCI and ISA
#   L:- added snd_card_set_pm_callbacks() and snd_card_set_isa_pm_callbacks()
#   L:  as the registration functions.
# 
# sound/pci/intel8x0m.c
#   2004/04/08 11:35:00+02:00 perex@suse.cz +9 -64
#   ALSA CVS update
#   D:2004/04/08 17:34:59
#   C:Documentation,Control Midlevel,ALSA Core,AD1848 driver,CS4231 driver
#   C:CS46xx driver,Trident driver,YMFPCI driver,ES18xx driver,OPL3SA2 driver
#   C:ATIIXP driver,CS4281 driver,ES1968 driver,Intel8x0 driver
#   C:Intel8x0-modem driver,Maestro3 driver,ALI5451 driver,NM256 driver
#   C:Sound Core PDAudioCF driver
#   A:Takashi Iwai <tiwai@suse.de>
#   F:Documentation/DocBook/writing-an-alsa-driver.tmpl:1.25->1.26 
#   F:core/control.c:1.41->1.42 
#   F:core/init.c:1.44->1.45 
#   F:core/sound.c:1.60->1.61 
#   F:include/ad1848.h:1.9->1.10 
#   F:include/core.h:1.49->1.50 
#   F:include/cs4231.h:1.7->1.8 
#   F:include/cs46xx.h:1.18->1.19 
#   F:include/trident.h:1.16->1.17 
#   F:include/ymfpci.h:1.14->1.15 
#   F:isa/es18xx.c:1.45->1.46 
#   F:isa/opl3sa2.c:1.33->1.34 
#   F:isa/ad1848/ad1848_lib.c:1.34->1.35 
#   F:isa/cs423x/cs4231_lib.c:1.37->1.38 
#   F:pci/atiixp.c:1.3->1.4 
#   F:pci/cs4281.c:1.51->1.52 
#   F:pci/es1968.c:1.62->1.63 
#   F:pci/intel8x0.c:1.131->1.132 
#   F:pci/intel8x0m.c:1.2->1.3 
#   F:pci/maestro3.c:1.49->1.50 
#   F:pci/ali5451/ali5451.c:1.44->1.45 
#   F:pci/cs46xx/cs46xx.c:1.25->1.26 
#   F:pci/cs46xx/cs46xx_lib.c:1.71->1.72 
#   F:pci/nm256/nm256.c:1.34->1.35 
#   F:pci/trident/trident.c:1.22->1.23 
#   F:pci/trident/trident_main.c:1.55->1.56 
#   F:pci/ymfpci/ymfpci.c:1.34->1.35 
#   F:pci/ymfpci/ymfpci_main.c:1.49->1.50 
#   F:pcmcia/pdaudiocf/pdaudiocf.c:1.5->1.6 
#   F:pcmcia/pdaudiocf/pdaudiocf.h:1.4->1.5 
#   F:pcmcia/pdaudiocf/pdaudiocf_core.c:1.2->1.3 
#   L:Clean up of power-management codes.
#   L:
#   L:- moved commonly used codes to the core layer.
#   L:- using the unified suspend/resume callbacks for PCI and ISA
#   L:- added snd_card_set_pm_callbacks() and snd_card_set_isa_pm_callbacks()
#   L:  as the registration functions.
# 
# sound/pci/intel8x0.c
#   2004/04/08 11:35:00+02:00 perex@suse.cz +9 -63
#   ALSA CVS update
#   D:2004/04/08 17:34:59
#   C:Documentation,Control Midlevel,ALSA Core,AD1848 driver,CS4231 driver
#   C:CS46xx driver,Trident driver,YMFPCI driver,ES18xx driver,OPL3SA2 driver
#   C:ATIIXP driver,CS4281 driver,ES1968 driver,Intel8x0 driver
#   C:Intel8x0-modem driver,Maestro3 driver,ALI5451 driver,NM256 driver
#   C:Sound Core PDAudioCF driver
#   A:Takashi Iwai <tiwai@suse.de>
#   F:Documentation/DocBook/writing-an-alsa-driver.tmpl:1.25->1.26 
#   F:core/control.c:1.41->1.42 
#   F:core/init.c:1.44->1.45 
#   F:core/sound.c:1.60->1.61 
#   F:include/ad1848.h:1.9->1.10 
#   F:include/core.h:1.49->1.50 
#   F:include/cs4231.h:1.7->1.8 
#   F:include/cs46xx.h:1.18->1.19 
#   F:include/trident.h:1.16->1.17 
#   F:include/ymfpci.h:1.14->1.15 
#   F:isa/es18xx.c:1.45->1.46 
#   F:isa/opl3sa2.c:1.33->1.34 
#   F:isa/ad1848/ad1848_lib.c:1.34->1.35 
#   F:isa/cs423x/cs4231_lib.c:1.37->1.38 
#   F:pci/atiixp.c:1.3->1.4 
#   F:pci/cs4281.c:1.51->1.52 
#   F:pci/es1968.c:1.62->1.63 
#   F:pci/intel8x0.c:1.131->1.132 
#   F:pci/intel8x0m.c:1.2->1.3 
#   F:pci/maestro3.c:1.49->1.50 
#   F:pci/ali5451/ali5451.c:1.44->1.45 
#   F:pci/cs46xx/cs46xx.c:1.25->1.26 
#   F:pci/cs46xx/cs46xx_lib.c:1.71->1.72 
#   F:pci/nm256/nm256.c:1.34->1.35 
#   F:pci/trident/trident.c:1.22->1.23 
#   F:pci/trident/trident_main.c:1.55->1.56 
#   F:pci/ymfpci/ymfpci.c:1.34->1.35 
#   F:pci/ymfpci/ymfpci_main.c:1.49->1.50 
#   F:pcmcia/pdaudiocf/pdaudiocf.c:1.5->1.6 
#   F:pcmcia/pdaudiocf/pdaudiocf.h:1.4->1.5 
#   F:pcmcia/pdaudiocf/pdaudiocf_core.c:1.2->1.3 
#   L:Clean up of power-management codes.
#   L:
#   L:- moved commonly used codes to the core layer.
#   L:- using the unified suspend/resume callbacks for PCI and ISA
#   L:- added snd_card_set_pm_callbacks() and snd_card_set_isa_pm_callbacks()
#   L:  as the registration functions.
# 
# sound/pci/es1968.c
#   2004/04/08 11:35:00+02:00 perex@suse.cz +12 -59
#   ALSA CVS update
#   D:2004/04/08 17:34:59
#   C:Documentation,Control Midlevel,ALSA Core,AD1848 driver,CS4231 driver
#   C:CS46xx driver,Trident driver,YMFPCI driver,ES18xx driver,OPL3SA2 driver
#   C:ATIIXP driver,CS4281 driver,ES1968 driver,Intel8x0 driver
#   C:Intel8x0-modem driver,Maestro3 driver,ALI5451 driver,NM256 driver
#   C:Sound Core PDAudioCF driver
#   A:Takashi Iwai <tiwai@suse.de>
#   F:Documentation/DocBook/writing-an-alsa-driver.tmpl:1.25->1.26 
#   F:core/control.c:1.41->1.42 
#   F:core/init.c:1.44->1.45 
#   F:core/sound.c:1.60->1.61 
#   F:include/ad1848.h:1.9->1.10 
#   F:include/core.h:1.49->1.50 
#   F:include/cs4231.h:1.7->1.8 
#   F:include/cs46xx.h:1.18->1.19 
#   F:include/trident.h:1.16->1.17 
#   F:include/ymfpci.h:1.14->1.15 
#   F:isa/es18xx.c:1.45->1.46 
#   F:isa/opl3sa2.c:1.33->1.34 
#   F:isa/ad1848/ad1848_lib.c:1.34->1.35 
#   F:isa/cs423x/cs4231_lib.c:1.37->1.38 
#   F:pci/atiixp.c:1.3->1.4 
#   F:pci/cs4281.c:1.51->1.52 
#   F:pci/es1968.c:1.62->1.63 
#   F:pci/intel8x0.c:1.131->1.132 
#   F:pci/intel8x0m.c:1.2->1.3 
#   F:pci/maestro3.c:1.49->1.50 
#   F:pci/ali5451/ali5451.c:1.44->1.45 
#   F:pci/cs46xx/cs46xx.c:1.25->1.26 
#   F:pci/cs46xx/cs46xx_lib.c:1.71->1.72 
#   F:pci/nm256/nm256.c:1.34->1.35 
#   F:pci/trident/trident.c:1.22->1.23 
#   F:pci/trident/trident_main.c:1.55->1.56 
#   F:pci/ymfpci/ymfpci.c:1.34->1.35 
#   F:pci/ymfpci/ymfpci_main.c:1.49->1.50 
#   F:pcmcia/pdaudiocf/pdaudiocf.c:1.5->1.6 
#   F:pcmcia/pdaudiocf/pdaudiocf.h:1.4->1.5 
#   F:pcmcia/pdaudiocf/pdaudiocf_core.c:1.2->1.3 
#   L:Clean up of power-management codes.
#   L:
#   L:- moved commonly used codes to the core layer.
#   L:- using the unified suspend/resume callbacks for PCI and ISA
#   L:- added snd_card_set_pm_callbacks() and snd_card_set_isa_pm_callbacks()
#   L:  as the registration functions.
# 
# sound/pci/cs46xx/cs46xx_lib.c
#   2004/04/08 11:35:00+02:00 perex@suse.cz +6 -33
#   ALSA CVS update
#   D:2004/04/08 17:34:59
#   C:Documentation,Control Midlevel,ALSA Core,AD1848 driver,CS4231 driver
#   C:CS46xx driver,Trident driver,YMFPCI driver,ES18xx driver,OPL3SA2 driver
#   C:ATIIXP driver,CS4281 driver,ES1968 driver,Intel8x0 driver
#   C:Intel8x0-modem driver,Maestro3 driver,ALI5451 driver,NM256 driver
#   C:Sound Core PDAudioCF driver
#   A:Takashi Iwai <tiwai@suse.de>
#   F:Documentation/DocBook/writing-an-alsa-driver.tmpl:1.25->1.26 
#   F:core/control.c:1.41->1.42 
#   F:core/init.c:1.44->1.45 
#   F:core/sound.c:1.60->1.61 
#   F:include/ad1848.h:1.9->1.10 
#   F:include/core.h:1.49->1.50 
#   F:include/cs4231.h:1.7->1.8 
#   F:include/cs46xx.h:1.18->1.19 
#   F:include/trident.h:1.16->1.17 
#   F:include/ymfpci.h:1.14->1.15 
#   F:isa/es18xx.c:1.45->1.46 
#   F:isa/opl3sa2.c:1.33->1.34 
#   F:isa/ad1848/ad1848_lib.c:1.34->1.35 
#   F:isa/cs423x/cs4231_lib.c:1.37->1.38 
#   F:pci/atiixp.c:1.3->1.4 
#   F:pci/cs4281.c:1.51->1.52 
#   F:pci/es1968.c:1.62->1.63 
#   F:pci/intel8x0.c:1.131->1.132 
#   F:pci/intel8x0m.c:1.2->1.3 
#   F:pci/maestro3.c:1.49->1.50 
#   F:pci/ali5451/ali5451.c:1.44->1.45 
#   F:pci/cs46xx/cs46xx.c:1.25->1.26 
#   F:pci/cs46xx/cs46xx_lib.c:1.71->1.72 
#   F:pci/nm256/nm256.c:1.34->1.35 
#   F:pci/trident/trident.c:1.22->1.23 
#   F:pci/trident/trident_main.c:1.55->1.56 
#   F:pci/ymfpci/ymfpci.c:1.34->1.35 
#   F:pci/ymfpci/ymfpci_main.c:1.49->1.50 
#   F:pcmcia/pdaudiocf/pdaudiocf.c:1.5->1.6 
#   F:pcmcia/pdaudiocf/pdaudiocf.h:1.4->1.5 
#   F:pcmcia/pdaudiocf/pdaudiocf_core.c:1.2->1.3 
#   L:Clean up of power-management codes.
#   L:
#   L:- moved commonly used codes to the core layer.
#   L:- using the unified suspend/resume callbacks for PCI and ISA
#   L:- added snd_card_set_pm_callbacks() and snd_card_set_isa_pm_callbacks()
#   L:  as the registration functions.
# 
# sound/pci/cs46xx/cs46xx.c
#   2004/04/08 11:35:00+02:00 perex@suse.cz +3 -23
#   ALSA CVS update
#   D:2004/04/08 17:34:59
#   C:Documentation,Control Midlevel,ALSA Core,AD1848 driver,CS4231 driver
#   C:CS46xx driver,Trident driver,YMFPCI driver,ES18xx driver,OPL3SA2 driver
#   C:ATIIXP driver,CS4281 driver,ES1968 driver,Intel8x0 driver
#   C:Intel8x0-modem driver,Maestro3 driver,ALI5451 driver,NM256 driver
#   C:Sound Core PDAudioCF driver
#   A:Takashi Iwai <tiwai@suse.de>
#   F:Documentation/DocBook/writing-an-alsa-driver.tmpl:1.25->1.26 
#   F:core/control.c:1.41->1.42 
#   F:core/init.c:1.44->1.45 
#   F:core/sound.c:1.60->1.61 
#   F:include/ad1848.h:1.9->1.10 
#   F:include/core.h:1.49->1.50 
#   F:include/cs4231.h:1.7->1.8 
#   F:include/cs46xx.h:1.18->1.19 
#   F:include/trident.h:1.16->1.17 
#   F:include/ymfpci.h:1.14->1.15 
#   F:isa/es18xx.c:1.45->1.46 
#   F:isa/opl3sa2.c:1.33->1.34 
#   F:isa/ad1848/ad1848_lib.c:1.34->1.35 
#   F:isa/cs423x/cs4231_lib.c:1.37->1.38 
#   F:pci/atiixp.c:1.3->1.4 
#   F:pci/cs4281.c:1.51->1.52 
#   F:pci/es1968.c:1.62->1.63 
#   F:pci/intel8x0.c:1.131->1.132 
#   F:pci/intel8x0m.c:1.2->1.3 
#   F:pci/maestro3.c:1.49->1.50 
#   F:pci/ali5451/ali5451.c:1.44->1.45 
#   F:pci/cs46xx/cs46xx.c:1.25->1.26 
#   F:pci/cs46xx/cs46xx_lib.c:1.71->1.72 
#   F:pci/nm256/nm256.c:1.34->1.35 
#   F:pci/trident/trident.c:1.22->1.23 
#   F:pci/trident/trident_main.c:1.55->1.56 
#   F:pci/ymfpci/ymfpci.c:1.34->1.35 
#   F:pci/ymfpci/ymfpci_main.c:1.49->1.50 
#   F:pcmcia/pdaudiocf/pdaudiocf.c:1.5->1.6 
#   F:pcmcia/pdaudiocf/pdaudiocf.h:1.4->1.5 
#   F:pcmcia/pdaudiocf/pdaudiocf_core.c:1.2->1.3 
#   L:Clean up of power-management codes.
#   L:
#   L:- moved commonly used codes to the core layer.
#   L:- using the unified suspend/resume callbacks for PCI and ISA
#   L:- added snd_card_set_pm_callbacks() and snd_card_set_isa_pm_callbacks()
#   L:  as the registration functions.
# 
# sound/pci/cs4281.c
#   2004/04/08 11:35:00+02:00 perex@suse.cz +11 -55
#   ALSA CVS update
#   D:2004/04/08 17:34:59
#   C:Documentation,Control Midlevel,ALSA Core,AD1848 driver,CS4231 driver
#   C:CS46xx driver,Trident driver,YMFPCI driver,ES18xx driver,OPL3SA2 driver
#   C:ATIIXP driver,CS4281 driver,ES1968 driver,Intel8x0 driver
#   C:Intel8x0-modem driver,Maestro3 driver,ALI5451 driver,NM256 driver
#   C:Sound Core PDAudioCF driver
#   A:Takashi Iwai <tiwai@suse.de>
#   F:Documentation/DocBook/writing-an-alsa-driver.tmpl:1.25->1.26 
#   F:core/control.c:1.41->1.42 
#   F:core/init.c:1.44->1.45 
#   F:core/sound.c:1.60->1.61 
#   F:include/ad1848.h:1.9->1.10 
#   F:include/core.h:1.49->1.50 
#   F:include/cs4231.h:1.7->1.8 
#   F:include/cs46xx.h:1.18->1.19 
#   F:include/trident.h:1.16->1.17 
#   F:include/ymfpci.h:1.14->1.15 
#   F:isa/es18xx.c:1.45->1.46 
#   F:isa/opl3sa2.c:1.33->1.34 
#   F:isa/ad1848/ad1848_lib.c:1.34->1.35 
#   F:isa/cs423x/cs4231_lib.c:1.37->1.38 
#   F:pci/atiixp.c:1.3->1.4 
#   F:pci/cs4281.c:1.51->1.52 
#   F:pci/es1968.c:1.62->1.63 
#   F:pci/intel8x0.c:1.131->1.132 
#   F:pci/intel8x0m.c:1.2->1.3 
#   F:pci/maestro3.c:1.49->1.50 
#   F:pci/ali5451/ali5451.c:1.44->1.45 
#   F:pci/cs46xx/cs46xx.c:1.25->1.26 
#   F:pci/cs46xx/cs46xx_lib.c:1.71->1.72 
#   F:pci/nm256/nm256.c:1.34->1.35 
#   F:pci/trident/trident.c:1.22->1.23 
#   F:pci/trident/trident_main.c:1.55->1.56 
#   F:pci/ymfpci/ymfpci.c:1.34->1.35 
#   F:pci/ymfpci/ymfpci_main.c:1.49->1.50 
#   F:pcmcia/pdaudiocf/pdaudiocf.c:1.5->1.6 
#   F:pcmcia/pdaudiocf/pdaudiocf.h:1.4->1.5 
#   F:pcmcia/pdaudiocf/pdaudiocf_core.c:1.2->1.3 
#   L:Clean up of power-management codes.
#   L:
#   L:- moved commonly used codes to the core layer.
#   L:- using the unified suspend/resume callbacks for PCI and ISA
#   L:- added snd_card_set_pm_callbacks() and snd_card_set_isa_pm_callbacks()
#   L:  as the registration functions.
# 
# sound/pci/atiixp.c
#   2004/04/08 11:35:00+02:00 perex@suse.cz +2 -4
#   ALSA CVS update
#   D:2004/04/08 17:34:59
#   C:Documentation,Control Midlevel,ALSA Core,AD1848 driver,CS4231 driver
#   C:CS46xx driver,Trident driver,YMFPCI driver,ES18xx driver,OPL3SA2 driver
#   C:ATIIXP driver,CS4281 driver,ES1968 driver,Intel8x0 driver
#   C:Intel8x0-modem driver,Maestro3 driver,ALI5451 driver,NM256 driver
#   C:Sound Core PDAudioCF driver
#   A:Takashi Iwai <tiwai@suse.de>
#   F:Documentation/DocBook/writing-an-alsa-driver.tmpl:1.25->1.26 
#   F:core/control.c:1.41->1.42 
#   F:core/init.c:1.44->1.45 
#   F:core/sound.c:1.60->1.61 
#   F:include/ad1848.h:1.9->1.10 
#   F:include/core.h:1.49->1.50 
#   F:include/cs4231.h:1.7->1.8 
#   F:include/cs46xx.h:1.18->1.19 
#   F:include/trident.h:1.16->1.17 
#   F:include/ymfpci.h:1.14->1.15 
#   F:isa/es18xx.c:1.45->1.46 
#   F:isa/opl3sa2.c:1.33->1.34 
#   F:isa/ad1848/ad1848_lib.c:1.34->1.35 
#   F:isa/cs423x/cs4231_lib.c:1.37->1.38 
#   F:pci/atiixp.c:1.3->1.4 
#   F:pci/cs4281.c:1.51->1.52 
#   F:pci/es1968.c:1.62->1.63 
#   F:pci/intel8x0.c:1.131->1.132 
#   F:pci/intel8x0m.c:1.2->1.3 
#   F:pci/maestro3.c:1.49->1.50 
#   F:pci/ali5451/ali5451.c:1.44->1.45 
#   F:pci/cs46xx/cs46xx.c:1.25->1.26 
#   F:pci/cs46xx/cs46xx_lib.c:1.71->1.72 
#   F:pci/nm256/nm256.c:1.34->1.35 
#   F:pci/trident/trident.c:1.22->1.23 
#   F:pci/trident/trident_main.c:1.55->1.56 
#   F:pci/ymfpci/ymfpci.c:1.34->1.35 
#   F:pci/ymfpci/ymfpci_main.c:1.49->1.50 
#   F:pcmcia/pdaudiocf/pdaudiocf.c:1.5->1.6 
#   F:pcmcia/pdaudiocf/pdaudiocf.h:1.4->1.5 
#   F:pcmcia/pdaudiocf/pdaudiocf_core.c:1.2->1.3 
#   L:Clean up of power-management codes.
#   L:
#   L:- moved commonly used codes to the core layer.
#   L:- using the unified suspend/resume callbacks for PCI and ISA
#   L:- added snd_card_set_pm_callbacks() and snd_card_set_isa_pm_callbacks()
#   L:  as the registration functions.
# 
# sound/pci/ali5451/ali5451.c
#   2004/04/08 11:35:00+02:00 perex@suse.cz +2 -4
#   ALSA CVS update
#   D:2004/04/08 17:34:59
#   C:Documentation,Control Midlevel,ALSA Core,AD1848 driver,CS4231 driver
#   C:CS46xx driver,Trident driver,YMFPCI driver,ES18xx driver,OPL3SA2 driver
#   C:ATIIXP driver,CS4281 driver,ES1968 driver,Intel8x0 driver
#   C:Intel8x0-modem driver,Maestro3 driver,ALI5451 driver,NM256 driver
#   C:Sound Core PDAudioCF driver
#   A:Takashi Iwai <tiwai@suse.de>
#   F:Documentation/DocBook/writing-an-alsa-driver.tmpl:1.25->1.26 
#   F:core/control.c:1.41->1.42 
#   F:core/init.c:1.44->1.45 
#   F:core/sound.c:1.60->1.61 
#   F:include/ad1848.h:1.9->1.10 
#   F:include/core.h:1.49->1.50 
#   F:include/cs4231.h:1.7->1.8 
#   F:include/cs46xx.h:1.18->1.19 
#   F:include/trident.h:1.16->1.17 
#   F:include/ymfpci.h:1.14->1.15 
#   F:isa/es18xx.c:1.45->1.46 
#   F:isa/opl3sa2.c:1.33->1.34 
#   F:isa/ad1848/ad1848_lib.c:1.34->1.35 
#   F:isa/cs423x/cs4231_lib.c:1.37->1.38 
#   F:pci/atiixp.c:1.3->1.4 
#   F:pci/cs4281.c:1.51->1.52 
#   F:pci/es1968.c:1.62->1.63 
#   F:pci/intel8x0.c:1.131->1.132 
#   F:pci/intel8x0m.c:1.2->1.3 
#   F:pci/maestro3.c:1.49->1.50 
#   F:pci/ali5451/ali5451.c:1.44->1.45 
#   F:pci/cs46xx/cs46xx.c:1.25->1.26 
#   F:pci/cs46xx/cs46xx_lib.c:1.71->1.72 
#   F:pci/nm256/nm256.c:1.34->1.35 
#   F:pci/trident/trident.c:1.22->1.23 
#   F:pci/trident/trident_main.c:1.55->1.56 
#   F:pci/ymfpci/ymfpci.c:1.34->1.35 
#   F:pci/ymfpci/ymfpci_main.c:1.49->1.50 
#   F:pcmcia/pdaudiocf/pdaudiocf.c:1.5->1.6 
#   F:pcmcia/pdaudiocf/pdaudiocf.h:1.4->1.5 
#   F:pcmcia/pdaudiocf/pdaudiocf_core.c:1.2->1.3 
#   L:Clean up of power-management codes.
#   L:
#   L:- moved commonly used codes to the core layer.
#   L:- using the unified suspend/resume callbacks for PCI and ISA
#   L:- added snd_card_set_pm_callbacks() and snd_card_set_isa_pm_callbacks()
#   L:  as the registration functions.
# 
# sound/isa/opl3sa2.c
#   2004/04/08 11:34:59+02:00 perex@suse.cz +11 -66
#   ALSA CVS update
#   D:2004/04/08 17:34:59
#   C:Documentation,Control Midlevel,ALSA Core,AD1848 driver,CS4231 driver
#   C:CS46xx driver,Trident driver,YMFPCI driver,ES18xx driver,OPL3SA2 driver
#   C:ATIIXP driver,CS4281 driver,ES1968 driver,Intel8x0 driver
#   C:Intel8x0-modem driver,Maestro3 driver,ALI5451 driver,NM256 driver
#   C:Sound Core PDAudioCF driver
#   A:Takashi Iwai <tiwai@suse.de>
#   F:Documentation/DocBook/writing-an-alsa-driver.tmpl:1.25->1.26 
#   F:core/control.c:1.41->1.42 
#   F:core/init.c:1.44->1.45 
#   F:core/sound.c:1.60->1.61 
#   F:include/ad1848.h:1.9->1.10 
#   F:include/core.h:1.49->1.50 
#   F:include/cs4231.h:1.7->1.8 
#   F:include/cs46xx.h:1.18->1.19 
#   F:include/trident.h:1.16->1.17 
#   F:include/ymfpci.h:1.14->1.15 
#   F:isa/es18xx.c:1.45->1.46 
#   F:isa/opl3sa2.c:1.33->1.34 
#   F:isa/ad1848/ad1848_lib.c:1.34->1.35 
#   F:isa/cs423x/cs4231_lib.c:1.37->1.38 
#   F:pci/atiixp.c:1.3->1.4 
#   F:pci/cs4281.c:1.51->1.52 
#   F:pci/es1968.c:1.62->1.63 
#   F:pci/intel8x0.c:1.131->1.132 
#   F:pci/intel8x0m.c:1.2->1.3 
#   F:pci/maestro3.c:1.49->1.50 
#   F:pci/ali5451/ali5451.c:1.44->1.45 
#   F:pci/cs46xx/cs46xx.c:1.25->1.26 
#   F:pci/cs46xx/cs46xx_lib.c:1.71->1.72 
#   F:pci/nm256/nm256.c:1.34->1.35 
#   F:pci/trident/trident.c:1.22->1.23 
#   F:pci/trident/trident_main.c:1.55->1.56 
#   F:pci/ymfpci/ymfpci.c:1.34->1.35 
#   F:pci/ymfpci/ymfpci_main.c:1.49->1.50 
#   F:pcmcia/pdaudiocf/pdaudiocf.c:1.5->1.6 
#   F:pcmcia/pdaudiocf/pdaudiocf.h:1.4->1.5 
#   F:pcmcia/pdaudiocf/pdaudiocf_core.c:1.2->1.3 
#   L:Clean up of power-management codes.
#   L:
#   L:- moved commonly used codes to the core layer.
#   L:- using the unified suspend/resume callbacks for PCI and ISA
#   L:- added snd_card_set_pm_callbacks() and snd_card_set_isa_pm_callbacks()
#   L:  as the registration functions.
# 
# sound/isa/es18xx.c
#   2004/04/08 11:34:59+02:00 perex@suse.cz +7 -58
#   ALSA CVS update
#   D:2004/04/08 17:34:59
#   C:Documentation,Control Midlevel,ALSA Core,AD1848 driver,CS4231 driver
#   C:CS46xx driver,Trident driver,YMFPCI driver,ES18xx driver,OPL3SA2 driver
#   C:ATIIXP driver,CS4281 driver,ES1968 driver,Intel8x0 driver
#   C:Intel8x0-modem driver,Maestro3 driver,ALI5451 driver,NM256 driver
#   C:Sound Core PDAudioCF driver
#   A:Takashi Iwai <tiwai@suse.de>
#   F:Documentation/DocBook/writing-an-alsa-driver.tmpl:1.25->1.26 
#   F:core/control.c:1.41->1.42 
#   F:core/init.c:1.44->1.45 
#   F:core/sound.c:1.60->1.61 
#   F:include/ad1848.h:1.9->1.10 
#   F:include/core.h:1.49->1.50 
#   F:include/cs4231.h:1.7->1.8 
#   F:include/cs46xx.h:1.18->1.19 
#   F:include/trident.h:1.16->1.17 
#   F:include/ymfpci.h:1.14->1.15 
#   F:isa/es18xx.c:1.45->1.46 
#   F:isa/opl3sa2.c:1.33->1.34 
#   F:isa/ad1848/ad1848_lib.c:1.34->1.35 
#   F:isa/cs423x/cs4231_lib.c:1.37->1.38 
#   F:pci/atiixp.c:1.3->1.4 
#   F:pci/cs4281.c:1.51->1.52 
#   F:pci/es1968.c:1.62->1.63 
#   F:pci/intel8x0.c:1.131->1.132 
#   F:pci/intel8x0m.c:1.2->1.3 
#   F:pci/maestro3.c:1.49->1.50 
#   F:pci/ali5451/ali5451.c:1.44->1.45 
#   F:pci/cs46xx/cs46xx.c:1.25->1.26 
#   F:pci/cs46xx/cs46xx_lib.c:1.71->1.72 
#   F:pci/nm256/nm256.c:1.34->1.35 
#   F:pci/trident/trident.c:1.22->1.23 
#   F:pci/trident/trident_main.c:1.55->1.56 
#   F:pci/ymfpci/ymfpci.c:1.34->1.35 
#   F:pci/ymfpci/ymfpci_main.c:1.49->1.50 
#   F:pcmcia/pdaudiocf/pdaudiocf.c:1.5->1.6 
#   F:pcmcia/pdaudiocf/pdaudiocf.h:1.4->1.5 
#   F:pcmcia/pdaudiocf/pdaudiocf_core.c:1.2->1.3 
#   L:Clean up of power-management codes.
#   L:
#   L:- moved commonly used codes to the core layer.
#   L:- using the unified suspend/resume callbacks for PCI and ISA
#   L:- added snd_card_set_pm_callbacks() and snd_card_set_isa_pm_callbacks()
#   L:  as the registration functions.
# 
# sound/isa/cs423x/cs4231_lib.c
#   2004/04/08 11:34:59+02:00 perex@suse.cz +17 -21
#   ALSA CVS update
#   D:2004/04/08 17:34:59
#   C:Documentation,Control Midlevel,ALSA Core,AD1848 driver,CS4231 driver
#   C:CS46xx driver,Trident driver,YMFPCI driver,ES18xx driver,OPL3SA2 driver
#   C:ATIIXP driver,CS4281 driver,ES1968 driver,Intel8x0 driver
#   C:Intel8x0-modem driver,Maestro3 driver,ALI5451 driver,NM256 driver
#   C:Sound Core PDAudioCF driver
#   A:Takashi Iwai <tiwai@suse.de>
#   F:Documentation/DocBook/writing-an-alsa-driver.tmpl:1.25->1.26 
#   F:core/control.c:1.41->1.42 
#   F:core/init.c:1.44->1.45 
#   F:core/sound.c:1.60->1.61 
#   F:include/ad1848.h:1.9->1.10 
#   F:include/core.h:1.49->1.50 
#   F:include/cs4231.h:1.7->1.8 
#   F:include/cs46xx.h:1.18->1.19 
#   F:include/trident.h:1.16->1.17 
#   F:include/ymfpci.h:1.14->1.15 
#   F:isa/es18xx.c:1.45->1.46 
#   F:isa/opl3sa2.c:1.33->1.34 
#   F:isa/ad1848/ad1848_lib.c:1.34->1.35 
#   F:isa/cs423x/cs4231_lib.c:1.37->1.38 
#   F:pci/atiixp.c:1.3->1.4 
#   F:pci/cs4281.c:1.51->1.52 
#   F:pci/es1968.c:1.62->1.63 
#   F:pci/intel8x0.c:1.131->1.132 
#   F:pci/intel8x0m.c:1.2->1.3 
#   F:pci/maestro3.c:1.49->1.50 
#   F:pci/ali5451/ali5451.c:1.44->1.45 
#   F:pci/cs46xx/cs46xx.c:1.25->1.26 
#   F:pci/cs46xx/cs46xx_lib.c:1.71->1.72 
#   F:pci/nm256/nm256.c:1.34->1.35 
#   F:pci/trident/trident.c:1.22->1.23 
#   F:pci/trident/trident_main.c:1.55->1.56 
#   F:pci/ymfpci/ymfpci.c:1.34->1.35 
#   F:pci/ymfpci/ymfpci_main.c:1.49->1.50 
#   F:pcmcia/pdaudiocf/pdaudiocf.c:1.5->1.6 
#   F:pcmcia/pdaudiocf/pdaudiocf.h:1.4->1.5 
#   F:pcmcia/pdaudiocf/pdaudiocf_core.c:1.2->1.3 
#   L:Clean up of power-management codes.
#   L:
#   L:- moved commonly used codes to the core layer.
#   L:- using the unified suspend/resume callbacks for PCI and ISA
#   L:- added snd_card_set_pm_callbacks() and snd_card_set_isa_pm_callbacks()
#   L:  as the registration functions.
# 
# sound/isa/ad1848/ad1848_lib.c
#   2004/04/08 11:34:59+02:00 perex@suse.cz +10 -55
#   ALSA CVS update
#   D:2004/04/08 17:34:59
#   C:Documentation,Control Midlevel,ALSA Core,AD1848 driver,CS4231 driver
#   C:CS46xx driver,Trident driver,YMFPCI driver,ES18xx driver,OPL3SA2 driver
#   C:ATIIXP driver,CS4281 driver,ES1968 driver,Intel8x0 driver
#   C:Intel8x0-modem driver,Maestro3 driver,ALI5451 driver,NM256 driver
#   C:Sound Core PDAudioCF driver
#   A:Takashi Iwai <tiwai@suse.de>
#   F:Documentation/DocBook/writing-an-alsa-driver.tmpl:1.25->1.26 
#   F:core/control.c:1.41->1.42 
#   F:core/init.c:1.44->1.45 
#   F:core/sound.c:1.60->1.61 
#   F:include/ad1848.h:1.9->1.10 
#   F:include/core.h:1.49->1.50 
#   F:include/cs4231.h:1.7->1.8 
#   F:include/cs46xx.h:1.18->1.19 
#   F:include/trident.h:1.16->1.17 
#   F:include/ymfpci.h:1.14->1.15 
#   F:isa/es18xx.c:1.45->1.46 
#   F:isa/opl3sa2.c:1.33->1.34 
#   F:isa/ad1848/ad1848_lib.c:1.34->1.35 
#   F:isa/cs423x/cs4231_lib.c:1.37->1.38 
#   F:pci/atiixp.c:1.3->1.4 
#   F:pci/cs4281.c:1.51->1.52 
#   F:pci/es1968.c:1.62->1.63 
#   F:pci/intel8x0.c:1.131->1.132 
#   F:pci/intel8x0m.c:1.2->1.3 
#   F:pci/maestro3.c:1.49->1.50 
#   F:pci/ali5451/ali5451.c:1.44->1.45 
#   F:pci/cs46xx/cs46xx.c:1.25->1.26 
#   F:pci/cs46xx/cs46xx_lib.c:1.71->1.72 
#   F:pci/nm256/nm256.c:1.34->1.35 
#   F:pci/trident/trident.c:1.22->1.23 
#   F:pci/trident/trident_main.c:1.55->1.56 
#   F:pci/ymfpci/ymfpci.c:1.34->1.35 
#   F:pci/ymfpci/ymfpci_main.c:1.49->1.50 
#   F:pcmcia/pdaudiocf/pdaudiocf.c:1.5->1.6 
#   F:pcmcia/pdaudiocf/pdaudiocf.h:1.4->1.5 
#   F:pcmcia/pdaudiocf/pdaudiocf_core.c:1.2->1.3 
#   L:Clean up of power-management codes.
#   L:
#   L:- moved commonly used codes to the core layer.
#   L:- using the unified suspend/resume callbacks for PCI and ISA
#   L:- added snd_card_set_pm_callbacks() and snd_card_set_isa_pm_callbacks()
#   L:  as the registration functions.
# 
# sound/core/sound.c
#   2004/04/08 11:34:59+02:00 perex@suse.cz +8 -0
#   ALSA CVS update
#   D:2004/04/08 17:34:59
#   C:Documentation,Control Midlevel,ALSA Core,AD1848 driver,CS4231 driver
#   C:CS46xx driver,Trident driver,YMFPCI driver,ES18xx driver,OPL3SA2 driver
#   C:ATIIXP driver,CS4281 driver,ES1968 driver,Intel8x0 driver
#   C:Intel8x0-modem driver,Maestro3 driver,ALI5451 driver,NM256 driver
#   C:Sound Core PDAudioCF driver
#   A:Takashi Iwai <tiwai@suse.de>
#   F:Documentation/DocBook/writing-an-alsa-driver.tmpl:1.25->1.26 
#   F:core/control.c:1.41->1.42 
#   F:core/init.c:1.44->1.45 
#   F:core/sound.c:1.60->1.61 
#   F:include/ad1848.h:1.9->1.10 
#   F:include/core.h:1.49->1.50 
#   F:include/cs4231.h:1.7->1.8 
#   F:include/cs46xx.h:1.18->1.19 
#   F:include/trident.h:1.16->1.17 
#   F:include/ymfpci.h:1.14->1.15 
#   F:isa/es18xx.c:1.45->1.46 
#   F:isa/opl3sa2.c:1.33->1.34 
#   F:isa/ad1848/ad1848_lib.c:1.34->1.35 
#   F:isa/cs423x/cs4231_lib.c:1.37->1.38 
#   F:pci/atiixp.c:1.3->1.4 
#   F:pci/cs4281.c:1.51->1.52 
#   F:pci/es1968.c:1.62->1.63 
#   F:pci/intel8x0.c:1.131->1.132 
#   F:pci/intel8x0m.c:1.2->1.3 
#   F:pci/maestro3.c:1.49->1.50 
#   F:pci/ali5451/ali5451.c:1.44->1.45 
#   F:pci/cs46xx/cs46xx.c:1.25->1.26 
#   F:pci/cs46xx/cs46xx_lib.c:1.71->1.72 
#   F:pci/nm256/nm256.c:1.34->1.35 
#   F:pci/trident/trident.c:1.22->1.23 
#   F:pci/trident/trident_main.c:1.55->1.56 
#   F:pci/ymfpci/ymfpci.c:1.34->1.35 
#   F:pci/ymfpci/ymfpci_main.c:1.49->1.50 
#   F:pcmcia/pdaudiocf/pdaudiocf.c:1.5->1.6 
#   F:pcmcia/pdaudiocf/pdaudiocf.h:1.4->1.5 
#   F:pcmcia/pdaudiocf/pdaudiocf_core.c:1.2->1.3 
#   L:Clean up of power-management codes.
#   L:
#   L:- moved commonly used codes to the core layer.
#   L:- using the unified suspend/resume callbacks for PCI and ISA
#   L:- added snd_card_set_pm_callbacks() and snd_card_set_isa_pm_callbacks()
#   L:  as the registration functions.
# 
# sound/core/init.c
#   2004/04/08 11:34:59+02:00 perex@suse.cz +97 -0
#   ALSA CVS update
#   D:2004/04/08 17:34:59
#   C:Documentation,Control Midlevel,ALSA Core,AD1848 driver,CS4231 driver
#   C:CS46xx driver,Trident driver,YMFPCI driver,ES18xx driver,OPL3SA2 driver
#   C:ATIIXP driver,CS4281 driver,ES1968 driver,Intel8x0 driver
#   C:Intel8x0-modem driver,Maestro3 driver,ALI5451 driver,NM256 driver
#   C:Sound Core PDAudioCF driver
#   A:Takashi Iwai <tiwai@suse.de>
#   F:Documentation/DocBook/writing-an-alsa-driver.tmpl:1.25->1.26 
#   F:core/control.c:1.41->1.42 
#   F:core/init.c:1.44->1.45 
#   F:core/sound.c:1.60->1.61 
#   F:include/ad1848.h:1.9->1.10 
#   F:include/core.h:1.49->1.50 
#   F:include/cs4231.h:1.7->1.8 
#   F:include/cs46xx.h:1.18->1.19 
#   F:include/trident.h:1.16->1.17 
#   F:include/ymfpci.h:1.14->1.15 
#   F:isa/es18xx.c:1.45->1.46 
#   F:isa/opl3sa2.c:1.33->1.34 
#   F:isa/ad1848/ad1848_lib.c:1.34->1.35 
#   F:isa/cs423x/cs4231_lib.c:1.37->1.38 
#   F:pci/atiixp.c:1.3->1.4 
#   F:pci/cs4281.c:1.51->1.52 
#   F:pci/es1968.c:1.62->1.63 
#   F:pci/intel8x0.c:1.131->1.132 
#   F:pci/intel8x0m.c:1.2->1.3 
#   F:pci/maestro3.c:1.49->1.50 
#   F:pci/ali5451/ali5451.c:1.44->1.45 
#   F:pci/cs46xx/cs46xx.c:1.25->1.26 
#   F:pci/cs46xx/cs46xx_lib.c:1.71->1.72 
#   F:pci/nm256/nm256.c:1.34->1.35 
#   F:pci/trident/trident.c:1.22->1.23 
#   F:pci/trident/trident_main.c:1.55->1.56 
#   F:pci/ymfpci/ymfpci.c:1.34->1.35 
#   F:pci/ymfpci/ymfpci_main.c:1.49->1.50 
#   F:pcmcia/pdaudiocf/pdaudiocf.c:1.5->1.6 
#   F:pcmcia/pdaudiocf/pdaudiocf.h:1.4->1.5 
#   F:pcmcia/pdaudiocf/pdaudiocf_core.c:1.2->1.3 
#   L:Clean up of power-management codes.
#   L:
#   L:- moved commonly used codes to the core layer.
#   L:- using the unified suspend/resume callbacks for PCI and ISA
#   L:- added snd_card_set_pm_callbacks() and snd_card_set_isa_pm_callbacks()
#   L:  as the registration functions.
# 
# sound/core/control.c
#   2004/04/08 11:34:59+02:00 perex@suse.cz +27 -2
#   ALSA CVS update
#   D:2004/04/08 17:34:59
#   C:Documentation,Control Midlevel,ALSA Core,AD1848 driver,CS4231 driver
#   C:CS46xx driver,Trident driver,YMFPCI driver,ES18xx driver,OPL3SA2 driver
#   C:ATIIXP driver,CS4281 driver,ES1968 driver,Intel8x0 driver
#   C:Intel8x0-modem driver,Maestro3 driver,ALI5451 driver,NM256 driver
#   C:Sound Core PDAudioCF driver
#   A:Takashi Iwai <tiwai@suse.de>
#   F:Documentation/DocBook/writing-an-alsa-driver.tmpl:1.25->1.26 
#   F:core/control.c:1.41->1.42 
#   F:core/init.c:1.44->1.45 
#   F:core/sound.c:1.60->1.61 
#   F:include/ad1848.h:1.9->1.10 
#   F:include/core.h:1.49->1.50 
#   F:include/cs4231.h:1.7->1.8 
#   F:include/cs46xx.h:1.18->1.19 
#   F:include/trident.h:1.16->1.17 
#   F:include/ymfpci.h:1.14->1.15 
#   F:isa/es18xx.c:1.45->1.46 
#   F:isa/opl3sa2.c:1.33->1.34 
#   F:isa/ad1848/ad1848_lib.c:1.34->1.35 
#   F:isa/cs423x/cs4231_lib.c:1.37->1.38 
#   F:pci/atiixp.c:1.3->1.4 
#   F:pci/cs4281.c:1.51->1.52 
#   F:pci/es1968.c:1.62->1.63 
#   F:pci/intel8x0.c:1.131->1.132 
#   F:pci/intel8x0m.c:1.2->1.3 
#   F:pci/maestro3.c:1.49->1.50 
#   F:pci/ali5451/ali5451.c:1.44->1.45 
#   F:pci/cs46xx/cs46xx.c:1.25->1.26 
#   F:pci/cs46xx/cs46xx_lib.c:1.71->1.72 
#   F:pci/nm256/nm256.c:1.34->1.35 
#   F:pci/trident/trident.c:1.22->1.23 
#   F:pci/trident/trident_main.c:1.55->1.56 
#   F:pci/ymfpci/ymfpci.c:1.34->1.35 
#   F:pci/ymfpci/ymfpci_main.c:1.49->1.50 
#   F:pcmcia/pdaudiocf/pdaudiocf.c:1.5->1.6 
#   F:pcmcia/pdaudiocf/pdaudiocf.h:1.4->1.5 
#   F:pcmcia/pdaudiocf/pdaudiocf_core.c:1.2->1.3 
#   L:Clean up of power-management codes.
#   L:
#   L:- moved commonly used codes to the core layer.
#   L:- using the unified suspend/resume callbacks for PCI and ISA
#   L:- added snd_card_set_pm_callbacks() and snd_card_set_isa_pm_callbacks()
#   L:  as the registration functions.
# 
# include/sound/ymfpci.h
#   2004/04/08 11:34:59+02:00 perex@suse.cz +0 -5
#   ALSA CVS update
#   D:2004/04/08 17:34:59
#   C:Documentation,Control Midlevel,ALSA Core,AD1848 driver,CS4231 driver
#   C:CS46xx driver,Trident driver,YMFPCI driver,ES18xx driver,OPL3SA2 driver
#   C:ATIIXP driver,CS4281 driver,ES1968 driver,Intel8x0 driver
#   C:Intel8x0-modem driver,Maestro3 driver,ALI5451 driver,NM256 driver
#   C:Sound Core PDAudioCF driver
#   A:Takashi Iwai <tiwai@suse.de>
#   F:Documentation/DocBook/writing-an-alsa-driver.tmpl:1.25->1.26 
#   F:core/control.c:1.41->1.42 
#   F:core/init.c:1.44->1.45 
#   F:core/sound.c:1.60->1.61 
#   F:include/ad1848.h:1.9->1.10 
#   F:include/core.h:1.49->1.50 
#   F:include/cs4231.h:1.7->1.8 
#   F:include/cs46xx.h:1.18->1.19 
#   F:include/trident.h:1.16->1.17 
#   F:include/ymfpci.h:1.14->1.15 
#   F:isa/es18xx.c:1.45->1.46 
#   F:isa/opl3sa2.c:1.33->1.34 
#   F:isa/ad1848/ad1848_lib.c:1.34->1.35 
#   F:isa/cs423x/cs4231_lib.c:1.37->1.38 
#   F:pci/atiixp.c:1.3->1.4 
#   F:pci/cs4281.c:1.51->1.52 
#   F:pci/es1968.c:1.62->1.63 
#   F:pci/intel8x0.c:1.131->1.132 
#   F:pci/intel8x0m.c:1.2->1.3 
#   F:pci/maestro3.c:1.49->1.50 
#   F:pci/ali5451/ali5451.c:1.44->1.45 
#   F:pci/cs46xx/cs46xx.c:1.25->1.26 
#   F:pci/cs46xx/cs46xx_lib.c:1.71->1.72 
#   F:pci/nm256/nm256.c:1.34->1.35 
#   F:pci/trident/trident.c:1.22->1.23 
#   F:pci/trident/trident_main.c:1.55->1.56 
#   F:pci/ymfpci/ymfpci.c:1.34->1.35 
#   F:pci/ymfpci/ymfpci_main.c:1.49->1.50 
#   F:pcmcia/pdaudiocf/pdaudiocf.c:1.5->1.6 
#   F:pcmcia/pdaudiocf/pdaudiocf.h:1.4->1.5 
#   F:pcmcia/pdaudiocf/pdaudiocf_core.c:1.2->1.3 
#   L:Clean up of power-management codes.
#   L:
#   L:- moved commonly used codes to the core layer.
#   L:- using the unified suspend/resume callbacks for PCI and ISA
#   L:- added snd_card_set_pm_callbacks() and snd_card_set_isa_pm_callbacks()
#   L:  as the registration functions.
# 
# include/sound/trident.h
#   2004/04/08 11:34:59+02:00 perex@suse.cz +0 -6
#   ALSA CVS update
#   D:2004/04/08 17:34:59
#   C:Documentation,Control Midlevel,ALSA Core,AD1848 driver,CS4231 driver
#   C:CS46xx driver,Trident driver,YMFPCI driver,ES18xx driver,OPL3SA2 driver
#   C:ATIIXP driver,CS4281 driver,ES1968 driver,Intel8x0 driver
#   C:Intel8x0-modem driver,Maestro3 driver,ALI5451 driver,NM256 driver
#   C:Sound Core PDAudioCF driver
#   A:Takashi Iwai <tiwai@suse.de>
#   F:Documentation/DocBook/writing-an-alsa-driver.tmpl:1.25->1.26 
#   F:core/control.c:1.41->1.42 
#   F:core/init.c:1.44->1.45 
#   F:core/sound.c:1.60->1.61 
#   F:include/ad1848.h:1.9->1.10 
#   F:include/core.h:1.49->1.50 
#   F:include/cs4231.h:1.7->1.8 
#   F:include/cs46xx.h:1.18->1.19 
#   F:include/trident.h:1.16->1.17 
#   F:include/ymfpci.h:1.14->1.15 
#   F:isa/es18xx.c:1.45->1.46 
#   F:isa/opl3sa2.c:1.33->1.34 
#   F:isa/ad1848/ad1848_lib.c:1.34->1.35 
#   F:isa/cs423x/cs4231_lib.c:1.37->1.38 
#   F:pci/atiixp.c:1.3->1.4 
#   F:pci/cs4281.c:1.51->1.52 
#   F:pci/es1968.c:1.62->1.63 
#   F:pci/intel8x0.c:1.131->1.132 
#   F:pci/intel8x0m.c:1.2->1.3 
#   F:pci/maestro3.c:1.49->1.50 
#   F:pci/ali5451/ali5451.c:1.44->1.45 
#   F:pci/cs46xx/cs46xx.c:1.25->1.26 
#   F:pci/cs46xx/cs46xx_lib.c:1.71->1.72 
#   F:pci/nm256/nm256.c:1.34->1.35 
#   F:pci/trident/trident.c:1.22->1.23 
#   F:pci/trident/trident_main.c:1.55->1.56 
#   F:pci/ymfpci/ymfpci.c:1.34->1.35 
#   F:pci/ymfpci/ymfpci_main.c:1.49->1.50 
#   F:pcmcia/pdaudiocf/pdaudiocf.c:1.5->1.6 
#   F:pcmcia/pdaudiocf/pdaudiocf.h:1.4->1.5 
#   F:pcmcia/pdaudiocf/pdaudiocf_core.c:1.2->1.3 
#   L:Clean up of power-management codes.
#   L:
#   L:- moved commonly used codes to the core layer.
#   L:- using the unified suspend/resume callbacks for PCI and ISA
#   L:- added snd_card_set_pm_callbacks() and snd_card_set_isa_pm_callbacks()
#   L:  as the registration functions.
# 
# include/sound/cs46xx.h
#   2004/04/08 11:34:59+02:00 perex@suse.cz +0 -8
#   ALSA CVS update
#   D:2004/04/08 17:34:59
#   C:Documentation,Control Midlevel,ALSA Core,AD1848 driver,CS4231 driver
#   C:CS46xx driver,Trident driver,YMFPCI driver,ES18xx driver,OPL3SA2 driver
#   C:ATIIXP driver,CS4281 driver,ES1968 driver,Intel8x0 driver
#   C:Intel8x0-modem driver,Maestro3 driver,ALI5451 driver,NM256 driver
#   C:Sound Core PDAudioCF driver
#   A:Takashi Iwai <tiwai@suse.de>
#   F:Documentation/DocBook/writing-an-alsa-driver.tmpl:1.25->1.26 
#   F:core/control.c:1.41->1.42 
#   F:core/init.c:1.44->1.45 
#   F:core/sound.c:1.60->1.61 
#   F:include/ad1848.h:1.9->1.10 
#   F:include/core.h:1.49->1.50 
#   F:include/cs4231.h:1.7->1.8 
#   F:include/cs46xx.h:1.18->1.19 
#   F:include/trident.h:1.16->1.17 
#   F:include/ymfpci.h:1.14->1.15 
#   F:isa/es18xx.c:1.45->1.46 
#   F:isa/opl3sa2.c:1.33->1.34 
#   F:isa/ad1848/ad1848_lib.c:1.34->1.35 
#   F:isa/cs423x/cs4231_lib.c:1.37->1.38 
#   F:pci/atiixp.c:1.3->1.4 
#   F:pci/cs4281.c:1.51->1.52 
#   F:pci/es1968.c:1.62->1.63 
#   F:pci/intel8x0.c:1.131->1.132 
#   F:pci/intel8x0m.c:1.2->1.3 
#   F:pci/maestro3.c:1.49->1.50 
#   F:pci/ali5451/ali5451.c:1.44->1.45 
#   F:pci/cs46xx/cs46xx.c:1.25->1.26 
#   F:pci/cs46xx/cs46xx_lib.c:1.71->1.72 
#   F:pci/nm256/nm256.c:1.34->1.35 
#   F:pci/trident/trident.c:1.22->1.23 
#   F:pci/trident/trident_main.c:1.55->1.56 
#   F:pci/ymfpci/ymfpci.c:1.34->1.35 
#   F:pci/ymfpci/ymfpci_main.c:1.49->1.50 
#   F:pcmcia/pdaudiocf/pdaudiocf.c:1.5->1.6 
#   F:pcmcia/pdaudiocf/pdaudiocf.h:1.4->1.5 
#   F:pcmcia/pdaudiocf/pdaudiocf_core.c:1.2->1.3 
#   L:Clean up of power-management codes.
#   L:
#   L:- moved commonly used codes to the core layer.
#   L:- using the unified suspend/resume callbacks for PCI and ISA
#   L:- added snd_card_set_pm_callbacks() and snd_card_set_isa_pm_callbacks()
#   L:  as the registration functions.
# 
# include/sound/cs4231.h
#   2004/04/08 11:34:59+02:00 perex@suse.cz +0 -1
#   ALSA CVS update
#   D:2004/04/08 17:34:59
#   C:Documentation,Control Midlevel,ALSA Core,AD1848 driver,CS4231 driver
#   C:CS46xx driver,Trident driver,YMFPCI driver,ES18xx driver,OPL3SA2 driver
#   C:ATIIXP driver,CS4281 driver,ES1968 driver,Intel8x0 driver
#   C:Intel8x0-modem driver,Maestro3 driver,ALI5451 driver,NM256 driver
#   C:Sound Core PDAudioCF driver
#   A:Takashi Iwai <tiwai@suse.de>
#   F:Documentation/DocBook/writing-an-alsa-driver.tmpl:1.25->1.26 
#   F:core/control.c:1.41->1.42 
#   F:core/init.c:1.44->1.45 
#   F:core/sound.c:1.60->1.61 
#   F:include/ad1848.h:1.9->1.10 
#   F:include/core.h:1.49->1.50 
#   F:include/cs4231.h:1.7->1.8 
#   F:include/cs46xx.h:1.18->1.19 
#   F:include/trident.h:1.16->1.17 
#   F:include/ymfpci.h:1.14->1.15 
#   F:isa/es18xx.c:1.45->1.46 
#   F:isa/opl3sa2.c:1.33->1.34 
#   F:isa/ad1848/ad1848_lib.c:1.34->1.35 
#   F:isa/cs423x/cs4231_lib.c:1.37->1.38 
#   F:pci/atiixp.c:1.3->1.4 
#   F:pci/cs4281.c:1.51->1.52 
#   F:pci/es1968.c:1.62->1.63 
#   F:pci/intel8x0.c:1.131->1.132 
#   F:pci/intel8x0m.c:1.2->1.3 
#   F:pci/maestro3.c:1.49->1.50 
#   F:pci/ali5451/ali5451.c:1.44->1.45 
#   F:pci/cs46xx/cs46xx.c:1.25->1.26 
#   F:pci/cs46xx/cs46xx_lib.c:1.71->1.72 
#   F:pci/nm256/nm256.c:1.34->1.35 
#   F:pci/trident/trident.c:1.22->1.23 
#   F:pci/trident/trident_main.c:1.55->1.56 
#   F:pci/ymfpci/ymfpci.c:1.34->1.35 
#   F:pci/ymfpci/ymfpci_main.c:1.49->1.50 
#   F:pcmcia/pdaudiocf/pdaudiocf.c:1.5->1.6 
#   F:pcmcia/pdaudiocf/pdaudiocf.h:1.4->1.5 
#   F:pcmcia/pdaudiocf/pdaudiocf_core.c:1.2->1.3 
#   L:Clean up of power-management codes.
#   L:
#   L:- moved commonly used codes to the core layer.
#   L:- using the unified suspend/resume callbacks for PCI and ISA
#   L:- added snd_card_set_pm_callbacks() and snd_card_set_isa_pm_callbacks()
#   L:  as the registration functions.
# 
# include/sound/core.h
#   2004/04/08 11:34:59+02:00 perex@suse.cz +21 -2
#   ALSA CVS update
#   D:2004/04/08 17:34:59
#   C:Documentation,Control Midlevel,ALSA Core,AD1848 driver,CS4231 driver
#   C:CS46xx driver,Trident driver,YMFPCI driver,ES18xx driver,OPL3SA2 driver
#   C:ATIIXP driver,CS4281 driver,ES1968 driver,Intel8x0 driver
#   C:Intel8x0-modem driver,Maestro3 driver,ALI5451 driver,NM256 driver
#   C:Sound Core PDAudioCF driver
#   A:Takashi Iwai <tiwai@suse.de>
#   F:Documentation/DocBook/writing-an-alsa-driver.tmpl:1.25->1.26 
#   F:core/control.c:1.41->1.42 
#   F:core/init.c:1.44->1.45 
#   F:core/sound.c:1.60->1.61 
#   F:include/ad1848.h:1.9->1.10 
#   F:include/core.h:1.49->1.50 
#   F:include/cs4231.h:1.7->1.8 
#   F:include/cs46xx.h:1.18->1.19 
#   F:include/trident.h:1.16->1.17 
#   F:include/ymfpci.h:1.14->1.15 
#   F:isa/es18xx.c:1.45->1.46 
#   F:isa/opl3sa2.c:1.33->1.34 
#   F:isa/ad1848/ad1848_lib.c:1.34->1.35 
#   F:isa/cs423x/cs4231_lib.c:1.37->1.38 
#   F:pci/atiixp.c:1.3->1.4 
#   F:pci/cs4281.c:1.51->1.52 
#   F:pci/es1968.c:1.62->1.63 
#   F:pci/intel8x0.c:1.131->1.132 
#   F:pci/intel8x0m.c:1.2->1.3 
#   F:pci/maestro3.c:1.49->1.50 
#   F:pci/ali5451/ali5451.c:1.44->1.45 
#   F:pci/cs46xx/cs46xx.c:1.25->1.26 
#   F:pci/cs46xx/cs46xx_lib.c:1.71->1.72 
#   F:pci/nm256/nm256.c:1.34->1.35 
#   F:pci/trident/trident.c:1.22->1.23 
#   F:pci/trident/trident_main.c:1.55->1.56 
#   F:pci/ymfpci/ymfpci.c:1.34->1.35 
#   F:pci/ymfpci/ymfpci_main.c:1.49->1.50 
#   F:pcmcia/pdaudiocf/pdaudiocf.c:1.5->1.6 
#   F:pcmcia/pdaudiocf/pdaudiocf.h:1.4->1.5 
#   F:pcmcia/pdaudiocf/pdaudiocf_core.c:1.2->1.3 
#   L:Clean up of power-management codes.
#   L:
#   L:- moved commonly used codes to the core layer.
#   L:- using the unified suspend/resume callbacks for PCI and ISA
#   L:- added snd_card_set_pm_callbacks() and snd_card_set_isa_pm_callbacks()
#   L:  as the registration functions.
# 
# include/sound/ad1848.h
#   2004/04/08 11:34:59+02:00 perex@suse.cz +0 -3
#   ALSA CVS update
#   D:2004/04/08 17:34:59
#   C:Documentation,Control Midlevel,ALSA Core,AD1848 driver,CS4231 driver
#   C:CS46xx driver,Trident driver,YMFPCI driver,ES18xx driver,OPL3SA2 driver
#   C:ATIIXP driver,CS4281 driver,ES1968 driver,Intel8x0 driver
#   C:Intel8x0-modem driver,Maestro3 driver,ALI5451 driver,NM256 driver
#   C:Sound Core PDAudioCF driver
#   A:Takashi Iwai <tiwai@suse.de>
#   F:Documentation/DocBook/writing-an-alsa-driver.tmpl:1.25->1.26 
#   F:core/control.c:1.41->1.42 
#   F:core/init.c:1.44->1.45 
#   F:core/sound.c:1.60->1.61 
#   F:include/ad1848.h:1.9->1.10 
#   F:include/core.h:1.49->1.50 
#   F:include/cs4231.h:1.7->1.8 
#   F:include/cs46xx.h:1.18->1.19 
#   F:include/trident.h:1.16->1.17 
#   F:include/ymfpci.h:1.14->1.15 
#   F:isa/es18xx.c:1.45->1.46 
#   F:isa/opl3sa2.c:1.33->1.34 
#   F:isa/ad1848/ad1848_lib.c:1.34->1.35 
#   F:isa/cs423x/cs4231_lib.c:1.37->1.38 
#   F:pci/atiixp.c:1.3->1.4 
#   F:pci/cs4281.c:1.51->1.52 
#   F:pci/es1968.c:1.62->1.63 
#   F:pci/intel8x0.c:1.131->1.132 
#   F:pci/intel8x0m.c:1.2->1.3 
#   F:pci/maestro3.c:1.49->1.50 
#   F:pci/ali5451/ali5451.c:1.44->1.45 
#   F:pci/cs46xx/cs46xx.c:1.25->1.26 
#   F:pci/cs46xx/cs46xx_lib.c:1.71->1.72 
#   F:pci/nm256/nm256.c:1.34->1.35 
#   F:pci/trident/trident.c:1.22->1.23 
#   F:pci/trident/trident_main.c:1.55->1.56 
#   F:pci/ymfpci/ymfpci.c:1.34->1.35 
#   F:pci/ymfpci/ymfpci_main.c:1.49->1.50 
#   F:pcmcia/pdaudiocf/pdaudiocf.c:1.5->1.6 
#   F:pcmcia/pdaudiocf/pdaudiocf.h:1.4->1.5 
#   F:pcmcia/pdaudiocf/pdaudiocf_core.c:1.2->1.3 
#   L:Clean up of power-management codes.
#   L:
#   L:- moved commonly used codes to the core layer.
#   L:- using the unified suspend/resume callbacks for PCI and ISA
#   L:- added snd_card_set_pm_callbacks() and snd_card_set_isa_pm_callbacks()
#   L:  as the registration functions.
# 
# Documentation/sound/alsa/DocBook/writing-an-alsa-driver.tmpl
#   2004/04/08 11:34:59+02:00 perex@suse.cz +36 -114
#   ALSA CVS update
#   D:2004/04/08 17:34:59
#   C:Documentation,Control Midlevel,ALSA Core,AD1848 driver,CS4231 driver
#   C:CS46xx driver,Trident driver,YMFPCI driver,ES18xx driver,OPL3SA2 driver
#   C:ATIIXP driver,CS4281 driver,ES1968 driver,Intel8x0 driver
#   C:Intel8x0-modem driver,Maestro3 driver,ALI5451 driver,NM256 driver
#   C:Sound Core PDAudioCF driver
#   A:Takashi Iwai <tiwai@suse.de>
#   F:Documentation/DocBook/writing-an-alsa-driver.tmpl:1.25->1.26 
#   F:core/control.c:1.41->1.42 
#   F:core/init.c:1.44->1.45 
#   F:core/sound.c:1.60->1.61 
#   F:include/ad1848.h:1.9->1.10 
#   F:include/core.h:1.49->1.50 
#   F:include/cs4231.h:1.7->1.8 
#   F:include/cs46xx.h:1.18->1.19 
#   F:include/trident.h:1.16->1.17 
#   F:include/ymfpci.h:1.14->1.15 
#   F:isa/es18xx.c:1.45->1.46 
#   F:isa/opl3sa2.c:1.33->1.34 
#   F:isa/ad1848/ad1848_lib.c:1.34->1.35 
#   F:isa/cs423x/cs4231_lib.c:1.37->1.38 
#   F:pci/atiixp.c:1.3->1.4 
#   F:pci/cs4281.c:1.51->1.52 
#   F:pci/es1968.c:1.62->1.63 
#   F:pci/intel8x0.c:1.131->1.132 
#   F:pci/intel8x0m.c:1.2->1.3 
#   F:pci/maestro3.c:1.49->1.50 
#   F:pci/ali5451/ali5451.c:1.44->1.45 
#   F:pci/cs46xx/cs46xx.c:1.25->1.26 
#   F:pci/cs46xx/cs46xx_lib.c:1.71->1.72 
#   F:pci/nm256/nm256.c:1.34->1.35 
#   F:pci/trident/trident.c:1.22->1.23 
#   F:pci/trident/trident_main.c:1.55->1.56 
#   F:pci/ymfpci/ymfpci.c:1.34->1.35 
#   F:pci/ymfpci/ymfpci_main.c:1.49->1.50 
#   F:pcmcia/pdaudiocf/pdaudiocf.c:1.5->1.6 
#   F:pcmcia/pdaudiocf/pdaudiocf.h:1.4->1.5 
#   F:pcmcia/pdaudiocf/pdaudiocf_core.c:1.2->1.3 
#   L:Clean up of power-management codes.
#   L:
#   L:- moved commonly used codes to the core layer.
#   L:- using the unified suspend/resume callbacks for PCI and ISA
#   L:- added snd_card_set_pm_callbacks() and snd_card_set_isa_pm_callbacks()
#   L:  as the registration functions.
# 
# ChangeSet
#   2004/04/24 15:48:26+02:00 perex@suse.cz 
#   ALSA CVS update - Takashi Iwai <tiwai@suse.de>
#   Documentation,SA11xx UDA1341 driver,Memalloc module,PCM Midlevel
#   RawMidi Midlevel,RTC timer driver,ALSA Core,Timer Midlevel
#   ALSA<-OSS emulation,ALSA sequencer,ALSA<-OSS sequencer,Generic drivers
#   MPU401 UART,OPL3,OPL4,ALS100 driver,AZT2320 driver,CMI8330 driver
#   DT019x driver,ES18xx driver,OPL3SA2 driver,Sound Galaxy driver
#   Sound Scape driver,AD1816A driver,AD1848 driver,CS4231 driver
#   CS4236+ driver,PC98(CS423x) driver,ES1688 driver,GUS Classic driver
#   GUS Extreme driver,GUS MAX driver,AMD InterWave driver,Opti9xx drivers
#   EMU8000 driver,ES968 driver,SB16/AWE driver,SB8 driver
#   Wavefront drivers,PARISC Harmony driver,ALS4000 driver,ATIIXP driver
#   AZT3328 driver,BT87x driver,CMIPCI driver,CS4281 driver
#   ENS1370/1+ driver,ES1938 driver,ES1968 driver,FM801 driver
#   Intel8x0 driver,Intel8x0-modem driver,Maestro3 driver,RME32 driver
#   RME96 driver,SonicVibes driver,VIA82xx driver,AC97 Codec Core
#   ALI5451 driver,au88x0 driver,CS46xx driver,EMU10K1/EMU10K2 driver
#   ICE1712 driver,ICE1724 driver,KORG1212 driver,MIXART driver
#   NM256 driver,RME HDSP driver,RME9652 driver,Trident driver
#   Digigram VX222 driver,YMFPCI driver,Sound Core PDAudioCF driver
#   Digigram VX Pocket driver,PPC PowerMac driver,SPARC AMD7930 driver
#   SPARC cs4231 driver,USB generic driver
#   use the new module_param*() functions.
# 
# sound/usb/usbaudio.c
#   2004/04/07 12:48:23+02:00 perex@suse.cz +9 -31
#   ALSA CVS update
#   D:2004/04/07 18:48:10
#   C:Documentation,SA11xx UDA1341 driver,Memalloc module,PCM Midlevel
#   C:RawMidi Midlevel,RTC timer driver,ALSA Core,Timer Midlevel
#   C:ALSA<-OSS emulation,ALSA sequencer,ALSA<-OSS sequencer,Generic drivers
#   C:MPU401 UART,OPL3,OPL4,ALS100 driver,AZT2320 driver,CMI8330 driver
#   C:DT019x driver,ES18xx driver,OPL3SA2 driver,Sound Galaxy driver
#   C:Sound Scape driver,AD1816A driver,AD1848 driver,CS4231 driver
#   C:CS4236+ driver,PC98(CS423x) driver,ES1688 driver,GUS Classic driver
#   C:GUS Extreme driver,GUS MAX driver,AMD InterWave driver,Opti9xx drivers
#   C:EMU8000 driver,ES968 driver,SB16/AWE driver,SB8 driver
#   C:Wavefront drivers,PARISC Harmony driver,ALS4000 driver,ATIIXP driver
#   C:AZT3328 driver,BT87x driver,CMIPCI driver,CS4281 driver
#   C:ENS1370/1+ driver,ES1938 driver,ES1968 driver,FM801 driver
#   C:Intel8x0 driver,Intel8x0-modem driver,Maestro3 driver,RME32 driver
#   C:RME96 driver,SonicVibes driver,VIA82xx driver,AC97 Codec Core
#   C:ALI5451 driver,au88x0 driver,CS46xx driver,EMU10K1/EMU10K2 driver
#   C:ICE1712 driver,ICE1724 driver,KORG1212 driver,MIXART driver
#   C:NM256 driver,RME HDSP driver,RME9652 driver,Trident driver
#   C:Digigram VX222 driver,YMFPCI driver,Sound Core PDAudioCF driver
#   C:Digigram VX Pocket driver,PPC PowerMac driver,SPARC AMD7930 driver
#   C:SPARC cs4231 driver,USB generic driver
#   A:Takashi Iwai <tiwai@suse.de>
#   F:Documentation/DocBook/writing-an-alsa-driver.tmpl:1.24->1.25 
#   F:arm/sa11xx-uda1341.c:1.13->1.14 
#   F:core/memalloc.c:1.28->1.29 
#   F:core/pcm_memory.c:1.25->1.26 
#   F:core/rawmidi.c:1.41->1.42 
#   F:core/rtctimer.c:1.19->1.20 
#   F:core/sound.c:1.59->1.60 
#   F:core/timer.c:1.56->1.57 
#   F:core/oss/pcm_oss.c:1.66->1.67 
#   F:core/seq/seq.c:1.9->1.10 
#   F:core/seq/seq_dummy.c:1.10->1.11 
#   F:core/seq/seq_midi.c:1.18->1.19 
#   F:core/seq/oss/seq_oss.c:1.11->1.12 
#   F:core/seq/oss/seq_oss_init.c:1.11->1.12 
#   F:drivers/dummy.c:1.26->1.27 
#   F:drivers/mtpav.c:1.26->1.27 
#   F:drivers/serial-u16550.c:1.25->1.26 
#   F:drivers/virmidi.c:1.11->1.12 
#   F:drivers/mpu401/mpu401.c:1.16->1.17 
#   F:drivers/opl3/opl3_seq.c:1.12->1.13 
#   F:drivers/opl4/opl4_seq.c:1.2->1.3 
#   F:include/initval.h:1.19->1.20 
#   F:isa/als100.c:1.24->1.25 
#   F:isa/azt2320.c:1.24->1.25 
#   F:isa/cmi8330.c:1.28->1.29 
#   F:isa/dt019x.c:1.18->1.19 
#   F:isa/es18xx.c:1.44->1.45 
#   F:isa/opl3sa2.c:1.32->1.33 
#   F:isa/sgalaxy.c:1.19->1.20 
#   F:isa/sscape.c:1.11->1.12 
#   F:isa/ad1816a/ad1816a.c:1.18->1.19 
#   F:isa/ad1848/ad1848.c:1.10->1.11 
#   F:isa/cs423x/cs4231.c:1.12->1.13 
#   F:isa/cs423x/cs4236.c:1.41->1.42 
#   F:isa/cs423x/pc98.c:1.7->1.8 
#   F:isa/es1688/es1688.c:1.14->1.15 
#   F:isa/gus/gusclassic.c:1.13->1.14 
#   F:isa/gus/gusextreme.c:1.15->1.16 
#   F:isa/gus/gusmax.c:1.14->1.15 
#   F:isa/gus/interwave.c:1.32->1.33 
#   F:isa/opti9xx/opti92x-ad1848.c:1.42->1.43 
#   F:isa/sb/emu8000_patch.c:1.8->1.9 
#   F:isa/sb/es968.c:1.24->1.25 
#   F:isa/sb/sb16.c:1.45->1.46 
#   F:isa/sb/sb8.c:1.18->1.19 
#   F:isa/wavefront/wavefront.c:1.27->1.28 
#   F:isa/wavefront/wavefront_synth.c:1.14->1.15 
#   F:parisc/harmony.c:1.5->1.6 
#   F:pci/als4000.c:1.31->1.32 
#   F:pci/atiixp.c:1.2->1.3 
#   F:pci/azt3328.c:1.11->1.12 
#   F:pci/bt87x.c:1.3->1.4 
#   F:pci/cmipci.c:1.61->1.62 
#   F:pci/cs4281.c:1.50->1.51 
#   F:pci/ens1370.c:1.58->1.59 
#   F:pci/es1938.c:1.33->1.34 
#   F:pci/es1968.c:1.61->1.62 
#   F:pci/fm801.c:1.43->1.44 
#   F:pci/intel8x0.c:1.130->1.131 
#   F:pci/intel8x0m.c:1.1->1.2 
#   F:pci/maestro3.c:1.48->1.49 
#   F:pci/rme32.c:1.31->1.32 
#   F:pci/rme96.c:1.33->1.34 
#   F:pci/sonicvibes.c:1.33->1.34 
#   F:pci/via82xx.c:1.94->1.95 
#   F:pci/ac97/ac97_codec.c:1.127->1.128 
#   F:pci/ali5451/ali5451.c:1.43->1.44 
#   F:pci/au88x0/au88x0.c:1.6->1.7 
#   F:pci/cs46xx/cs46xx.c:1.24->1.25 
#   F:pci/emu10k1/emu10k1.c:1.22->1.23 
#   F:pci/ice1712/ice1712.c:1.47->1.48 
#   F:pci/ice1712/ice1724.c:1.27->1.28 
#   F:pci/korg1212/korg1212.c:1.36->1.37 
#   F:pci/mixart/mixart.c:1.6->1.7 
#   F:pci/nm256/nm256.c:1.33->1.34 
#   F:pci/rme9652/hdsp.c:1.54->1.55 
#   F:pci/rme9652/rme9652.c:1.42->1.43 
#   F:pci/trident/trident.c:1.21->1.22 
#   F:pci/vx222/vx222.c:1.3->1.4 
#   F:pci/ymfpci/ymfpci.c:1.33->1.34 
#   F:pcmcia/pdaudiocf/pdaudiocf.c:1.4->1.5 
#   F:pcmcia/vx/vxpocket.c:1.3->1.4 
#   F:ppc/powermac.c:1.15->1.16 
#   F:sparc/amd7930.c:1.8->1.9 
#   F:sparc/cs4231.c:1.12->1.13 
#   F:usb/usbaudio.c:1.96->1.97 
#   L:use the new module_param*() functions.
# 
# sound/sparc/cs4231.c
#   2004/04/07 12:48:22+02:00 perex@suse.cz +5 -25
#   ALSA CVS update
#   D:2004/04/07 18:48:10
#   C:Documentation,SA11xx UDA1341 driver,Memalloc module,PCM Midlevel
#   C:RawMidi Midlevel,RTC timer driver,ALSA Core,Timer Midlevel
#   C:ALSA<-OSS emulation,ALSA sequencer,ALSA<-OSS sequencer,Generic drivers
#   C:MPU401 UART,OPL3,OPL4,ALS100 driver,AZT2320 driver,CMI8330 driver
#   C:DT019x driver,ES18xx driver,OPL3SA2 driver,Sound Galaxy driver
#   C:Sound Scape driver,AD1816A driver,AD1848 driver,CS4231 driver
#   C:CS4236+ driver,PC98(CS423x) driver,ES1688 driver,GUS Classic driver
#   C:GUS Extreme driver,GUS MAX driver,AMD InterWave driver,Opti9xx drivers
#   C:EMU8000 driver,ES968 driver,SB16/AWE driver,SB8 driver
#   C:Wavefront drivers,PARISC Harmony driver,ALS4000 driver,ATIIXP driver
#   C:AZT3328 driver,BT87x driver,CMIPCI driver,CS4281 driver
#   C:ENS1370/1+ driver,ES1938 driver,ES1968 driver,FM801 driver
#   C:Intel8x0 driver,Intel8x0-modem driver,Maestro3 driver,RME32 driver
#   C:RME96 driver,SonicVibes driver,VIA82xx driver,AC97 Codec Core
#   C:ALI5451 driver,au88x0 driver,CS46xx driver,EMU10K1/EMU10K2 driver
#   C:ICE1712 driver,ICE1724 driver,KORG1212 driver,MIXART driver
#   C:NM256 driver,RME HDSP driver,RME9652 driver,Trident driver
#   C:Digigram VX222 driver,YMFPCI driver,Sound Core PDAudioCF driver
#   C:Digigram VX Pocket driver,PPC PowerMac driver,SPARC AMD7930 driver
#   C:SPARC cs4231 driver,USB generic driver
#   A:Takashi Iwai <tiwai@suse.de>
#   F:Documentation/DocBook/writing-an-alsa-driver.tmpl:1.24->1.25 
#   F:arm/sa11xx-uda1341.c:1.13->1.14 
#   F:core/memalloc.c:1.28->1.29 
#   F:core/pcm_memory.c:1.25->1.26 
#   F:core/rawmidi.c:1.41->1.42 
#   F:core/rtctimer.c:1.19->1.20 
#   F:core/sound.c:1.59->1.60 
#   F:core/timer.c:1.56->1.57 
#   F:core/oss/pcm_oss.c:1.66->1.67 
#   F:core/seq/seq.c:1.9->1.10 
#   F:core/seq/seq_dummy.c:1.10->1.11 
#   F:core/seq/seq_midi.c:1.18->1.19 
#   F:core/seq/oss/seq_oss.c:1.11->1.12 
#   F:core/seq/oss/seq_oss_init.c:1.11->1.12 
#   F:drivers/dummy.c:1.26->1.27 
#   F:drivers/mtpav.c:1.26->1.27 
#   F:drivers/serial-u16550.c:1.25->1.26 
#   F:drivers/virmidi.c:1.11->1.12 
#   F:drivers/mpu401/mpu401.c:1.16->1.17 
#   F:drivers/opl3/opl3_seq.c:1.12->1.13 
#   F:drivers/opl4/opl4_seq.c:1.2->1.3 
#   F:include/initval.h:1.19->1.20 
#   F:isa/als100.c:1.24->1.25 
#   F:isa/azt2320.c:1.24->1.25 
#   F:isa/cmi8330.c:1.28->1.29 
#   F:isa/dt019x.c:1.18->1.19 
#   F:isa/es18xx.c:1.44->1.45 
#   F:isa/opl3sa2.c:1.32->1.33 
#   F:isa/sgalaxy.c:1.19->1.20 
#   F:isa/sscape.c:1.11->1.12 
#   F:isa/ad1816a/ad1816a.c:1.18->1.19 
#   F:isa/ad1848/ad1848.c:1.10->1.11 
#   F:isa/cs423x/cs4231.c:1.12->1.13 
#   F:isa/cs423x/cs4236.c:1.41->1.42 
#   F:isa/cs423x/pc98.c:1.7->1.8 
#   F:isa/es1688/es1688.c:1.14->1.15 
#   F:isa/gus/gusclassic.c:1.13->1.14 
#   F:isa/gus/gusextreme.c:1.15->1.16 
#   F:isa/gus/gusmax.c:1.14->1.15 
#   F:isa/gus/interwave.c:1.32->1.33 
#   F:isa/opti9xx/opti92x-ad1848.c:1.42->1.43 
#   F:isa/sb/emu8000_patch.c:1.8->1.9 
#   F:isa/sb/es968.c:1.24->1.25 
#   F:isa/sb/sb16.c:1.45->1.46 
#   F:isa/sb/sb8.c:1.18->1.19 
#   F:isa/wavefront/wavefront.c:1.27->1.28 
#   F:isa/wavefront/wavefront_synth.c:1.14->1.15 
#   F:parisc/harmony.c:1.5->1.6 
#   F:pci/als4000.c:1.31->1.32 
#   F:pci/atiixp.c:1.2->1.3 
#   F:pci/azt3328.c:1.11->1.12 
#   F:pci/bt87x.c:1.3->1.4 
#   F:pci/cmipci.c:1.61->1.62 
#   F:pci/cs4281.c:1.50->1.51 
#   F:pci/ens1370.c:1.58->1.59 
#   F:pci/es1938.c:1.33->1.34 
#   F:pci/es1968.c:1.61->1.62 
#   F:pci/fm801.c:1.43->1.44 
#   F:pci/intel8x0.c:1.130->1.131 
#   F:pci/intel8x0m.c:1.1->1.2 
#   F:pci/maestro3.c:1.48->1.49 
#   F:pci/rme32.c:1.31->1.32 
#   F:pci/rme96.c:1.33->1.34 
#   F:pci/sonicvibes.c:1.33->1.34 
#   F:pci/via82xx.c:1.94->1.95 
#   F:pci/ac97/ac97_codec.c:1.127->1.128 
#   F:pci/ali5451/ali5451.c:1.43->1.44 
#   F:pci/au88x0/au88x0.c:1.6->1.7 
#   F:pci/cs46xx/cs46xx.c:1.24->1.25 
#   F:pci/emu10k1/emu10k1.c:1.22->1.23 
#   F:pci/ice1712/ice1712.c:1.47->1.48 
#   F:pci/ice1712/ice1724.c:1.27->1.28 
#   F:pci/korg1212/korg1212.c:1.36->1.37 
#   F:pci/mixart/mixart.c:1.6->1.7 
#   F:pci/nm256/nm256.c:1.33->1.34 
#   F:pci/rme9652/hdsp.c:1.54->1.55 
#   F:pci/rme9652/rme9652.c:1.42->1.43 
#   F:pci/trident/trident.c:1.21->1.22 
#   F:pci/vx222/vx222.c:1.3->1.4 
#   F:pci/ymfpci/ymfpci.c:1.33->1.34 
#   F:pcmcia/pdaudiocf/pdaudiocf.c:1.4->1.5 
#   F:pcmcia/vx/vxpocket.c:1.3->1.4 
#   F:ppc/powermac.c:1.15->1.16 
#   F:sparc/amd7930.c:1.8->1.9 
#   F:sparc/cs4231.c:1.12->1.13 
#   F:usb/usbaudio.c:1.96->1.97 
#   L:use the new module_param*() functions.
# 
# sound/sparc/amd7930.c
#   2004/04/07 12:48:22+02:00 perex@suse.cz +5 -25
#   ALSA CVS update
#   D:2004/04/07 18:48:10
#   C:Documentation,SA11xx UDA1341 driver,Memalloc module,PCM Midlevel
#   C:RawMidi Midlevel,RTC timer driver,ALSA Core,Timer Midlevel
#   C:ALSA<-OSS emulation,ALSA sequencer,ALSA<-OSS sequencer,Generic drivers
#   C:MPU401 UART,OPL3,OPL4,ALS100 driver,AZT2320 driver,CMI8330 driver
#   C:DT019x driver,ES18xx driver,OPL3SA2 driver,Sound Galaxy driver
#   C:Sound Scape driver,AD1816A driver,AD1848 driver,CS4231 driver
#   C:CS4236+ driver,PC98(CS423x) driver,ES1688 driver,GUS Classic driver
#   C:GUS Extreme driver,GUS MAX driver,AMD InterWave driver,Opti9xx drivers
#   C:EMU8000 driver,ES968 driver,SB16/AWE driver,SB8 driver
#   C:Wavefront drivers,PARISC Harmony driver,ALS4000 driver,ATIIXP driver
#   C:AZT3328 driver,BT87x driver,CMIPCI driver,CS4281 driver
#   C:ENS1370/1+ driver,ES1938 driver,ES1968 driver,FM801 driver
#   C:Intel8x0 driver,Intel8x0-modem driver,Maestro3 driver,RME32 driver
#   C:RME96 driver,SonicVibes driver,VIA82xx driver,AC97 Codec Core
#   C:ALI5451 driver,au88x0 driver,CS46xx driver,EMU10K1/EMU10K2 driver
#   C:ICE1712 driver,ICE1724 driver,KORG1212 driver,MIXART driver
#   C:NM256 driver,RME HDSP driver,RME9652 driver,Trident driver
#   C:Digigram VX222 driver,YMFPCI driver,Sound Core PDAudioCF driver
#   C:Digigram VX Pocket driver,PPC PowerMac driver,SPARC AMD7930 driver
#   C:SPARC cs4231 driver,USB generic driver
#   A:Takashi Iwai <tiwai@suse.de>
#   F:Documentation/DocBook/writing-an-alsa-driver.tmpl:1.24->1.25 
#   F:arm/sa11xx-uda1341.c:1.13->1.14 
#   F:core/memalloc.c:1.28->1.29 
#   F:core/pcm_memory.c:1.25->1.26 
#   F:core/rawmidi.c:1.41->1.42 
#   F:core/rtctimer.c:1.19->1.20 
#   F:core/sound.c:1.59->1.60 
#   F:core/timer.c:1.56->1.57 
#   F:core/oss/pcm_oss.c:1.66->1.67 
#   F:core/seq/seq.c:1.9->1.10 
#   F:core/seq/seq_dummy.c:1.10->1.11 
#   F:core/seq/seq_midi.c:1.18->1.19 
#   F:core/seq/oss/seq_oss.c:1.11->1.12 
#   F:core/seq/oss/seq_oss_init.c:1.11->1.12 
#   F:drivers/dummy.c:1.26->1.27 
#   F:drivers/mtpav.c:1.26->1.27 
#   F:drivers/serial-u16550.c:1.25->1.26 
#   F:drivers/virmidi.c:1.11->1.12 
#   F:drivers/mpu401/mpu401.c:1.16->1.17 
#   F:drivers/opl3/opl3_seq.c:1.12->1.13 
#   F:drivers/opl4/opl4_seq.c:1.2->1.3 
#   F:include/initval.h:1.19->1.20 
#   F:isa/als100.c:1.24->1.25 
#   F:isa/azt2320.c:1.24->1.25 
#   F:isa/cmi8330.c:1.28->1.29 
#   F:isa/dt019x.c:1.18->1.19 
#   F:isa/es18xx.c:1.44->1.45 
#   F:isa/opl3sa2.c:1.32->1.33 
#   F:isa/sgalaxy.c:1.19->1.20 
#   F:isa/sscape.c:1.11->1.12 
#   F:isa/ad1816a/ad1816a.c:1.18->1.19 
#   F:isa/ad1848/ad1848.c:1.10->1.11 
#   F:isa/cs423x/cs4231.c:1.12->1.13 
#   F:isa/cs423x/cs4236.c:1.41->1.42 
#   F:isa/cs423x/pc98.c:1.7->1.8 
#   F:isa/es1688/es1688.c:1.14->1.15 
#   F:isa/gus/gusclassic.c:1.13->1.14 
#   F:isa/gus/gusextreme.c:1.15->1.16 
#   F:isa/gus/gusmax.c:1.14->1.15 
#   F:isa/gus/interwave.c:1.32->1.33 
#   F:isa/opti9xx/opti92x-ad1848.c:1.42->1.43 
#   F:isa/sb/emu8000_patch.c:1.8->1.9 
#   F:isa/sb/es968.c:1.24->1.25 
#   F:isa/sb/sb16.c:1.45->1.46 
#   F:isa/sb/sb8.c:1.18->1.19 
#   F:isa/wavefront/wavefront.c:1.27->1.28 
#   F:isa/wavefront/wavefront_synth.c:1.14->1.15 
#   F:parisc/harmony.c:1.5->1.6 
#   F:pci/als4000.c:1.31->1.32 
#   F:pci/atiixp.c:1.2->1.3 
#   F:pci/azt3328.c:1.11->1.12 
#   F:pci/bt87x.c:1.3->1.4 
#   F:pci/cmipci.c:1.61->1.62 
#   F:pci/cs4281.c:1.50->1.51 
#   F:pci/ens1370.c:1.58->1.59 
#   F:pci/es1938.c:1.33->1.34 
#   F:pci/es1968.c:1.61->1.62 
#   F:pci/fm801.c:1.43->1.44 
#   F:pci/intel8x0.c:1.130->1.131 
#   F:pci/intel8x0m.c:1.1->1.2 
#   F:pci/maestro3.c:1.48->1.49 
#   F:pci/rme32.c:1.31->1.32 
#   F:pci/rme96.c:1.33->1.34 
#   F:pci/sonicvibes.c:1.33->1.34 
#   F:pci/via82xx.c:1.94->1.95 
#   F:pci/ac97/ac97_codec.c:1.127->1.128 
#   F:pci/ali5451/ali5451.c:1.43->1.44 
#   F:pci/au88x0/au88x0.c:1.6->1.7 
#   F:pci/cs46xx/cs46xx.c:1.24->1.25 
#   F:pci/emu10k1/emu10k1.c:1.22->1.23 
#   F:pci/ice1712/ice1712.c:1.47->1.48 
#   F:pci/ice1712/ice1724.c:1.27->1.28 
#   F:pci/korg1212/korg1212.c:1.36->1.37 
#   F:pci/mixart/mixart.c:1.6->1.7 
#   F:pci/nm256/nm256.c:1.33->1.34 
#   F:pci/rme9652/hdsp.c:1.54->1.55 
#   F:pci/rme9652/rme9652.c:1.42->1.43 
#   F:pci/trident/trident.c:1.21->1.22 
#   F:pci/vx222/vx222.c:1.3->1.4 
#   F:pci/ymfpci/ymfpci.c:1.33->1.34 
#   F:pcmcia/pdaudiocf/pdaudiocf.c:1.4->1.5 
#   F:pcmcia/vx/vxpocket.c:1.3->1.4 
#   F:ppc/powermac.c:1.15->1.16 
#   F:sparc/amd7930.c:1.8->1.9 
#   F:sparc/cs4231.c:1.12->1.13 
#   F:usb/usbaudio.c:1.96->1.97 
#   L:use the new module_param*() functions.
# 
# sound/ppc/powermac.c
#   2004/04/07 12:48:22+02:00 perex@suse.cz +5 -28
#   ALSA CVS update
#   D:2004/04/07 18:48:10
#   C:Documentation,SA11xx UDA1341 driver,Memalloc module,PCM Midlevel
#   C:RawMidi Midlevel,RTC timer driver,ALSA Core,Timer Midlevel
#   C:ALSA<-OSS emulation,ALSA sequencer,ALSA<-OSS sequencer,Generic drivers
#   C:MPU401 UART,OPL3,OPL4,ALS100 driver,AZT2320 driver,CMI8330 driver
#   C:DT019x driver,ES18xx driver,OPL3SA2 driver,Sound Galaxy driver
#   C:Sound Scape driver,AD1816A driver,AD1848 driver,CS4231 driver
#   C:CS4236+ driver,PC98(CS423x) driver,ES1688 driver,GUS Classic driver
#   C:GUS Extreme driver,GUS MAX driver,AMD InterWave driver,Opti9xx drivers
#   C:EMU8000 driver,ES968 driver,SB16/AWE driver,SB8 driver
#   C:Wavefront drivers,PARISC Harmony driver,ALS4000 driver,ATIIXP driver
#   C:AZT3328 driver,BT87x driver,CMIPCI driver,CS4281 driver
#   C:ENS1370/1+ driver,ES1938 driver,ES1968 driver,FM801 driver
#   C:Intel8x0 driver,Intel8x0-modem driver,Maestro3 driver,RME32 driver
#   C:RME96 driver,SonicVibes driver,VIA82xx driver,AC97 Codec Core
#   C:ALI5451 driver,au88x0 driver,CS46xx driver,EMU10K1/EMU10K2 driver
#   C:ICE1712 driver,ICE1724 driver,KORG1212 driver,MIXART driver
#   C:NM256 driver,RME HDSP driver,RME9652 driver,Trident driver
#   C:Digigram VX222 driver,YMFPCI driver,Sound Core PDAudioCF driver
#   C:Digigram VX Pocket driver,PPC PowerMac driver,SPARC AMD7930 driver
#   C:SPARC cs4231 driver,USB generic driver
#   A:Takashi Iwai <tiwai@suse.de>
#   F:Documentation/DocBook/writing-an-alsa-driver.tmpl:1.24->1.25 
#   F:arm/sa11xx-uda1341.c:1.13->1.14 
#   F:core/memalloc.c:1.28->1.29 
#   F:core/pcm_memory.c:1.25->1.26 
#   F:core/rawmidi.c:1.41->1.42 
#   F:core/rtctimer.c:1.19->1.20 
#   F:core/sound.c:1.59->1.60 
#   F:core/timer.c:1.56->1.57 
#   F:core/oss/pcm_oss.c:1.66->1.67 
#   F:core/seq/seq.c:1.9->1.10 
#   F:core/seq/seq_dummy.c:1.10->1.11 
#   F:core/seq/seq_midi.c:1.18->1.19 
#   F:core/seq/oss/seq_oss.c:1.11->1.12 
#   F:core/seq/oss/seq_oss_init.c:1.11->1.12 
#   F:drivers/dummy.c:1.26->1.27 
#   F:drivers/mtpav.c:1.26->1.27 
#   F:drivers/serial-u16550.c:1.25->1.26 
#   F:drivers/virmidi.c:1.11->1.12 
#   F:drivers/mpu401/mpu401.c:1.16->1.17 
#   F:drivers/opl3/opl3_seq.c:1.12->1.13 
#   F:drivers/opl4/opl4_seq.c:1.2->1.3 
#   F:include/initval.h:1.19->1.20 
#   F:isa/als100.c:1.24->1.25 
#   F:isa/azt2320.c:1.24->1.25 
#   F:isa/cmi8330.c:1.28->1.29 
#   F:isa/dt019x.c:1.18->1.19 
#   F:isa/es18xx.c:1.44->1.45 
#   F:isa/opl3sa2.c:1.32->1.33 
#   F:isa/sgalaxy.c:1.19->1.20 
#   F:isa/sscape.c:1.11->1.12 
#   F:isa/ad1816a/ad1816a.c:1.18->1.19 
#   F:isa/ad1848/ad1848.c:1.10->1.11 
#   F:isa/cs423x/cs4231.c:1.12->1.13 
#   F:isa/cs423x/cs4236.c:1.41->1.42 
#   F:isa/cs423x/pc98.c:1.7->1.8 
#   F:isa/es1688/es1688.c:1.14->1.15 
#   F:isa/gus/gusclassic.c:1.13->1.14 
#   F:isa/gus/gusextreme.c:1.15->1.16 
#   F:isa/gus/gusmax.c:1.14->1.15 
#   F:isa/gus/interwave.c:1.32->1.33 
#   F:isa/opti9xx/opti92x-ad1848.c:1.42->1.43 
#   F:isa/sb/emu8000_patch.c:1.8->1.9 
#   F:isa/sb/es968.c:1.24->1.25 
#   F:isa/sb/sb16.c:1.45->1.46 
#   F:isa/sb/sb8.c:1.18->1.19 
#   F:isa/wavefront/wavefront.c:1.27->1.28 
#   F:isa/wavefront/wavefront_synth.c:1.14->1.15 
#   F:parisc/harmony.c:1.5->1.6 
#   F:pci/als4000.c:1.31->1.32 
#   F:pci/atiixp.c:1.2->1.3 
#   F:pci/azt3328.c:1.11->1.12 
#   F:pci/bt87x.c:1.3->1.4 
#   F:pci/cmipci.c:1.61->1.62 
#   F:pci/cs4281.c:1.50->1.51 
#   F:pci/ens1370.c:1.58->1.59 
#   F:pci/es1938.c:1.33->1.34 
#   F:pci/es1968.c:1.61->1.62 
#   F:pci/fm801.c:1.43->1.44 
#   F:pci/intel8x0.c:1.130->1.131 
#   F:pci/intel8x0m.c:1.1->1.2 
#   F:pci/maestro3.c:1.48->1.49 
#   F:pci/rme32.c:1.31->1.32 
#   F:pci/rme96.c:1.33->1.34 
#   F:pci/sonicvibes.c:1.33->1.34 
#   F:pci/via82xx.c:1.94->1.95 
#   F:pci/ac97/ac97_codec.c:1.127->1.128 
#   F:pci/ali5451/ali5451.c:1.43->1.44 
#   F:pci/au88x0/au88x0.c:1.6->1.7 
#   F:pci/cs46xx/cs46xx.c:1.24->1.25 
#   F:pci/emu10k1/emu10k1.c:1.22->1.23 
#   F:pci/ice1712/ice1712.c:1.47->1.48 
#   F:pci/ice1712/ice1724.c:1.27->1.28 
#   F:pci/korg1212/korg1212.c:1.36->1.37 
#   F:pci/mixart/mixart.c:1.6->1.7 
#   F:pci/nm256/nm256.c:1.33->1.34 
#   F:pci/rme9652/hdsp.c:1.54->1.55 
#   F:pci/rme9652/rme9652.c:1.42->1.43 
#   F:pci/trident/trident.c:1.21->1.22 
#   F:pci/vx222/vx222.c:1.3->1.4 
#   F:pci/ymfpci/ymfpci.c:1.33->1.34 
#   F:pcmcia/pdaudiocf/pdaudiocf.c:1.4->1.5 
#   F:pcmcia/vx/vxpocket.c:1.3->1.4 
#   F:ppc/powermac.c:1.15->1.16 
#   F:sparc/amd7930.c:1.8->1.9 
#   F:sparc/cs4231.c:1.12->1.13 
#   F:usb/usbaudio.c:1.96->1.97 
#   L:use the new module_param*() functions.
# 
# sound/pcmcia/vx/vxpocket.c
#   2004/04/07 12:48:22+02:00 perex@suse.cz +8 -6
#   ALSA CVS update
#   D:2004/04/07 18:48:10
#   C:Documentation,SA11xx UDA1341 driver,Memalloc module,PCM Midlevel
#   C:RawMidi Midlevel,RTC timer driver,ALSA Core,Timer Midlevel
#   C:ALSA<-OSS emulation,ALSA sequencer,ALSA<-OSS sequencer,Generic drivers
#   C:MPU401 UART,OPL3,OPL4,ALS100 driver,AZT2320 driver,CMI8330 driver
#   C:DT019x driver,ES18xx driver,OPL3SA2 driver,Sound Galaxy driver
#   C:Sound Scape driver,AD1816A driver,AD1848 driver,CS4231 driver
#   C:CS4236+ driver,PC98(CS423x) driver,ES1688 driver,GUS Classic driver
#   C:GUS Extreme driver,GUS MAX driver,AMD InterWave driver,Opti9xx drivers
#   C:EMU8000 driver,ES968 driver,SB16/AWE driver,SB8 driver
#   C:Wavefront drivers,PARISC Harmony driver,ALS4000 driver,ATIIXP driver
#   C:AZT3328 driver,BT87x driver,CMIPCI driver,CS4281 driver
#   C:ENS1370/1+ driver,ES1938 driver,ES1968 driver,FM801 driver
#   C:Intel8x0 driver,Intel8x0-modem driver,Maestro3 driver,RME32 driver
#   C:RME96 driver,SonicVibes driver,VIA82xx driver,AC97 Codec Core
#   C:ALI5451 driver,au88x0 driver,CS46xx driver,EMU10K1/EMU10K2 driver
#   C:ICE1712 driver,ICE1724 driver,KORG1212 driver,MIXART driver
#   C:NM256 driver,RME HDSP driver,RME9652 driver,Trident driver
#   C:Digigram VX222 driver,YMFPCI driver,Sound Core PDAudioCF driver
#   C:Digigram VX Pocket driver,PPC PowerMac driver,SPARC AMD7930 driver
#   C:SPARC cs4231 driver,USB generic driver
#   A:Takashi Iwai <tiwai@suse.de>
#   F:Documentation/DocBook/writing-an-alsa-driver.tmpl:1.24->1.25 
#   F:arm/sa11xx-uda1341.c:1.13->1.14 
#   F:core/memalloc.c:1.28->1.29 
#   F:core/pcm_memory.c:1.25->1.26 
#   F:core/rawmidi.c:1.41->1.42 
#   F:core/rtctimer.c:1.19->1.20 
#   F:core/sound.c:1.59->1.60 
#   F:core/timer.c:1.56->1.57 
#   F:core/oss/pcm_oss.c:1.66->1.67 
#   F:core/seq/seq.c:1.9->1.10 
#   F:core/seq/seq_dummy.c:1.10->1.11 
#   F:core/seq/seq_midi.c:1.18->1.19 
#   F:core/seq/oss/seq_oss.c:1.11->1.12 
#   F:core/seq/oss/seq_oss_init.c:1.11->1.12 
#   F:drivers/dummy.c:1.26->1.27 
#   F:drivers/mtpav.c:1.26->1.27 
#   F:drivers/serial-u16550.c:1.25->1.26 
#   F:drivers/virmidi.c:1.11->1.12 
#   F:drivers/mpu401/mpu401.c:1.16->1.17 
#   F:drivers/opl3/opl3_seq.c:1.12->1.13 
#   F:drivers/opl4/opl4_seq.c:1.2->1.3 
#   F:include/initval.h:1.19->1.20 
#   F:isa/als100.c:1.24->1.25 
#   F:isa/azt2320.c:1.24->1.25 
#   F:isa/cmi8330.c:1.28->1.29 
#   F:isa/dt019x.c:1.18->1.19 
#   F:isa/es18xx.c:1.44->1.45 
#   F:isa/opl3sa2.c:1.32->1.33 
#   F:isa/sgalaxy.c:1.19->1.20 
#   F:isa/sscape.c:1.11->1.12 
#   F:isa/ad1816a/ad1816a.c:1.18->1.19 
#   F:isa/ad1848/ad1848.c:1.10->1.11 
#   F:isa/cs423x/cs4231.c:1.12->1.13 
#   F:isa/cs423x/cs4236.c:1.41->1.42 
#   F:isa/cs423x/pc98.c:1.7->1.8 
#   F:isa/es1688/es1688.c:1.14->1.15 
#   F:isa/gus/gusclassic.c:1.13->1.14 
#   F:isa/gus/gusextreme.c:1.15->1.16 
#   F:isa/gus/gusmax.c:1.14->1.15 
#   F:isa/gus/interwave.c:1.32->1.33 
#   F:isa/opti9xx/opti92x-ad1848.c:1.42->1.43 
#   F:isa/sb/emu8000_patch.c:1.8->1.9 
#   F:isa/sb/es968.c:1.24->1.25 
#   F:isa/sb/sb16.c:1.45->1.46 
#   F:isa/sb/sb8.c:1.18->1.19 
#   F:isa/wavefront/wavefront.c:1.27->1.28 
#   F:isa/wavefront/wavefront_synth.c:1.14->1.15 
#   F:parisc/harmony.c:1.5->1.6 
#   F:pci/als4000.c:1.31->1.32 
#   F:pci/atiixp.c:1.2->1.3 
#   F:pci/azt3328.c:1.11->1.12 
#   F:pci/bt87x.c:1.3->1.4 
#   F:pci/cmipci.c:1.61->1.62 
#   F:pci/cs4281.c:1.50->1.51 
#   F:pci/ens1370.c:1.58->1.59 
#   F:pci/es1938.c:1.33->1.34 
#   F:pci/es1968.c:1.61->1.62 
#   F:pci/fm801.c:1.43->1.44 
#   F:pci/intel8x0.c:1.130->1.131 
#   F:pci/intel8x0m.c:1.1->1.2 
#   F:pci/maestro3.c:1.48->1.49 
#   F:pci/rme32.c:1.31->1.32 
#   F:pci/rme96.c:1.33->1.34 
#   F:pci/sonicvibes.c:1.33->1.34 
#   F:pci/via82xx.c:1.94->1.95 
#   F:pci/ac97/ac97_codec.c:1.127->1.128 
#   F:pci/ali5451/ali5451.c:1.43->1.44 
#   F:pci/au88x0/au88x0.c:1.6->1.7 
#   F:pci/cs46xx/cs46xx.c:1.24->1.25 
#   F:pci/emu10k1/emu10k1.c:1.22->1.23 
#   F:pci/ice1712/ice1712.c:1.47->1.48 
#   F:pci/ice1712/ice1724.c:1.27->1.28 
#   F:pci/korg1212/korg1212.c:1.36->1.37 
#   F:pci/mixart/mixart.c:1.6->1.7 
#   F:pci/nm256/nm256.c:1.33->1.34 
#   F:pci/rme9652/hdsp.c:1.54->1.55 
#   F:pci/rme9652/rme9652.c:1.42->1.43 
#   F:pci/trident/trident.c:1.21->1.22 
#   F:pci/vx222/vx222.c:1.3->1.4 
#   F:pci/ymfpci/ymfpci.c:1.33->1.34 
#   F:pcmcia/pdaudiocf/pdaudiocf.c:1.4->1.5 
#   F:pcmcia/vx/vxpocket.c:1.3->1.4 
#   F:ppc/powermac.c:1.15->1.16 
#   F:sparc/amd7930.c:1.8->1.9 
#   F:sparc/cs4231.c:1.12->1.13 
#   F:usb/usbaudio.c:1.96->1.97 
#   L:use the new module_param*() functions.
# 
# sound/pcmcia/pdaudiocf/pdaudiocf.c
#   2004/04/07 12:48:22+02:00 perex@suse.cz +7 -5
#   ALSA CVS update
#   D:2004/04/07 18:48:10
#   C:Documentation,SA11xx UDA1341 driver,Memalloc module,PCM Midlevel
#   C:RawMidi Midlevel,RTC timer driver,ALSA Core,Timer Midlevel
#   C:ALSA<-OSS emulation,ALSA sequencer,ALSA<-OSS sequencer,Generic drivers
#   C:MPU401 UART,OPL3,OPL4,ALS100 driver,AZT2320 driver,CMI8330 driver
#   C:DT019x driver,ES18xx driver,OPL3SA2 driver,Sound Galaxy driver
#   C:Sound Scape driver,AD1816A driver,AD1848 driver,CS4231 driver
#   C:CS4236+ driver,PC98(CS423x) driver,ES1688 driver,GUS Classic driver
#   C:GUS Extreme driver,GUS MAX driver,AMD InterWave driver,Opti9xx drivers
#   C:EMU8000 driver,ES968 driver,SB16/AWE driver,SB8 driver
#   C:Wavefront drivers,PARISC Harmony driver,ALS4000 driver,ATIIXP driver
#   C:AZT3328 driver,BT87x driver,CMIPCI driver,CS4281 driver
#   C:ENS1370/1+ driver,ES1938 driver,ES1968 driver,FM801 driver
#   C:Intel8x0 driver,Intel8x0-modem driver,Maestro3 driver,RME32 driver
#   C:RME96 driver,SonicVibes driver,VIA82xx driver,AC97 Codec Core
#   C:ALI5451 driver,au88x0 driver,CS46xx driver,EMU10K1/EMU10K2 driver
#   C:ICE1712 driver,ICE1724 driver,KORG1212 driver,MIXART driver
#   C:NM256 driver,RME HDSP driver,RME9652 driver,Trident driver
#   C:Digigram VX222 driver,YMFPCI driver,Sound Core PDAudioCF driver
#   C:Digigram VX Pocket driver,PPC PowerMac driver,SPARC AMD7930 driver
#   C:SPARC cs4231 driver,USB generic driver
#   A:Takashi Iwai <tiwai@suse.de>
#   F:Documentation/DocBook/writing-an-alsa-driver.tmpl:1.24->1.25 
#   F:arm/sa11xx-uda1341.c:1.13->1.14 
#   F:core/memalloc.c:1.28->1.29 
#   F:core/pcm_memory.c:1.25->1.26 
#   F:core/rawmidi.c:1.41->1.42 
#   F:core/rtctimer.c:1.19->1.20 
#   F:core/sound.c:1.59->1.60 
#   F:core/timer.c:1.56->1.57 
#   F:core/oss/pcm_oss.c:1.66->1.67 
#   F:core/seq/seq.c:1.9->1.10 
#   F:core/seq/seq_dummy.c:1.10->1.11 
#   F:core/seq/seq_midi.c:1.18->1.19 
#   F:core/seq/oss/seq_oss.c:1.11->1.12 
#   F:core/seq/oss/seq_oss_init.c:1.11->1.12 
#   F:drivers/dummy.c:1.26->1.27 
#   F:drivers/mtpav.c:1.26->1.27 
#   F:drivers/serial-u16550.c:1.25->1.26 
#   F:drivers/virmidi.c:1.11->1.12 
#   F:drivers/mpu401/mpu401.c:1.16->1.17 
#   F:drivers/opl3/opl3_seq.c:1.12->1.13 
#   F:drivers/opl4/opl4_seq.c:1.2->1.3 
#   F:include/initval.h:1.19->1.20 
#   F:isa/als100.c:1.24->1.25 
#   F:isa/azt2320.c:1.24->1.25 
#   F:isa/cmi8330.c:1.28->1.29 
#   F:isa/dt019x.c:1.18->1.19 
#   F:isa/es18xx.c:1.44->1.45 
#   F:isa/opl3sa2.c:1.32->1.33 
#   F:isa/sgalaxy.c:1.19->1.20 
#   F:isa/sscape.c:1.11->1.12 
#   F:isa/ad1816a/ad1816a.c:1.18->1.19 
#   F:isa/ad1848/ad1848.c:1.10->1.11 
#   F:isa/cs423x/cs4231.c:1.12->1.13 
#   F:isa/cs423x/cs4236.c:1.41->1.42 
#   F:isa/cs423x/pc98.c:1.7->1.8 
#   F:isa/es1688/es1688.c:1.14->1.15 
#   F:isa/gus/gusclassic.c:1.13->1.14 
#   F:isa/gus/gusextreme.c:1.15->1.16 
#   F:isa/gus/gusmax.c:1.14->1.15 
#   F:isa/gus/interwave.c:1.32->1.33 
#   F:isa/opti9xx/opti92x-ad1848.c:1.42->1.43 
#   F:isa/sb/emu8000_patch.c:1.8->1.9 
#   F:isa/sb/es968.c:1.24->1.25 
#   F:isa/sb/sb16.c:1.45->1.46 
#   F:isa/sb/sb8.c:1.18->1.19 
#   F:isa/wavefront/wavefront.c:1.27->1.28 
#   F:isa/wavefront/wavefront_synth.c:1.14->1.15 
#   F:parisc/harmony.c:1.5->1.6 
#   F:pci/als4000.c:1.31->1.32 
#   F:pci/atiixp.c:1.2->1.3 
#   F:pci/azt3328.c:1.11->1.12 
#   F:pci/bt87x.c:1.3->1.4 
#   F:pci/cmipci.c:1.61->1.62 
#   F:pci/cs4281.c:1.50->1.51 
#   F:pci/ens1370.c:1.58->1.59 
#   F:pci/es1938.c:1.33->1.34 
#   F:pci/es1968.c:1.61->1.62 
#   F:pci/fm801.c:1.43->1.44 
#   F:pci/intel8x0.c:1.130->1.131 
#   F:pci/intel8x0m.c:1.1->1.2 
#   F:pci/maestro3.c:1.48->1.49 
#   F:pci/rme32.c:1.31->1.32 
#   F:pci/rme96.c:1.33->1.34 
#   F:pci/sonicvibes.c:1.33->1.34 
#   F:pci/via82xx.c:1.94->1.95 
#   F:pci/ac97/ac97_codec.c:1.127->1.128 
#   F:pci/ali5451/ali5451.c:1.43->1.44 
#   F:pci/au88x0/au88x0.c:1.6->1.7 
#   F:pci/cs46xx/cs46xx.c:1.24->1.25 
#   F:pci/emu10k1/emu10k1.c:1.22->1.23 
#   F:pci/ice1712/ice1712.c:1.47->1.48 
#   F:pci/ice1712/ice1724.c:1.27->1.28 
#   F:pci/korg1212/korg1212.c:1.36->1.37 
#   F:pci/mixart/mixart.c:1.6->1.7 
#   F:pci/nm256/nm256.c:1.33->1.34 
#   F:pci/rme9652/hdsp.c:1.54->1.55 
#   F:pci/rme9652/rme9652.c:1.42->1.43 
#   F:pci/trident/trident.c:1.21->1.22 
#   F:pci/vx222/vx222.c:1.3->1.4 
#   F:pci/ymfpci/ymfpci.c:1.33->1.34 
#   F:pcmcia/pdaudiocf/pdaudiocf.c:1.4->1.5 
#   F:pcmcia/vx/vxpocket.c:1.3->1.4 
#   F:ppc/powermac.c:1.15->1.16 
#   F:sparc/amd7930.c:1.8->1.9 
#   F:sparc/cs4231.c:1.12->1.13 
#   F:usb/usbaudio.c:1.96->1.97 
#   L:use the new module_param*() functions.
# 
# sound/pci/ymfpci/ymfpci.c
#   2004/04/07 12:48:21+02:00 perex@suse.cz +9 -32
#   ALSA CVS update
#   D:2004/04/07 18:48:10
#   C:Documentation,SA11xx UDA1341 driver,Memalloc module,PCM Midlevel
#   C:RawMidi Midlevel,RTC timer driver,ALSA Core,Timer Midlevel
#   C:ALSA<-OSS emulation,ALSA sequencer,ALSA<-OSS sequencer,Generic drivers
#   C:MPU401 UART,OPL3,OPL4,ALS100 driver,AZT2320 driver,CMI8330 driver
#   C:DT019x driver,ES18xx driver,OPL3SA2 driver,Sound Galaxy driver
#   C:Sound Scape driver,AD1816A driver,AD1848 driver,CS4231 driver
#   C:CS4236+ driver,PC98(CS423x) driver,ES1688 driver,GUS Classic driver
#   C:GUS Extreme driver,GUS MAX driver,AMD InterWave driver,Opti9xx drivers
#   C:EMU8000 driver,ES968 driver,SB16/AWE driver,SB8 driver
#   C:Wavefront drivers,PARISC Harmony driver,ALS4000 driver,ATIIXP driver
#   C:AZT3328 driver,BT87x driver,CMIPCI driver,CS4281 driver
#   C:ENS1370/1+ driver,ES1938 driver,ES1968 driver,FM801 driver
#   C:Intel8x0 driver,Intel8x0-modem driver,Maestro3 driver,RME32 driver
#   C:RME96 driver,SonicVibes driver,VIA82xx driver,AC97 Codec Core
#   C:ALI5451 driver,au88x0 driver,CS46xx driver,EMU10K1/EMU10K2 driver
#   C:ICE1712 driver,ICE1724 driver,KORG1212 driver,MIXART driver
#   C:NM256 driver,RME HDSP driver,RME9652 driver,Trident driver
#   C:Digigram VX222 driver,YMFPCI driver,Sound Core PDAudioCF driver
#   C:Digigram VX Pocket driver,PPC PowerMac driver,SPARC AMD7930 driver
#   C:SPARC cs4231 driver,USB generic driver
#   A:Takashi Iwai <tiwai@suse.de>
#   F:Documentation/DocBook/writing-an-alsa-driver.tmpl:1.24->1.25 
#   F:arm/sa11xx-uda1341.c:1.13->1.14 
#   F:core/memalloc.c:1.28->1.29 
#   F:core/pcm_memory.c:1.25->1.26 
#   F:core/rawmidi.c:1.41->1.42 
#   F:core/rtctimer.c:1.19->1.20 
#   F:core/sound.c:1.59->1.60 
#   F:core/timer.c:1.56->1.57 
#   F:core/oss/pcm_oss.c:1.66->1.67 
#   F:core/seq/seq.c:1.9->1.10 
#   F:core/seq/seq_dummy.c:1.10->1.11 
#   F:core/seq/seq_midi.c:1.18->1.19 
#   F:core/seq/oss/seq_oss.c:1.11->1.12 
#   F:core/seq/oss/seq_oss_init.c:1.11->1.12 
#   F:drivers/dummy.c:1.26->1.27 
#   F:drivers/mtpav.c:1.26->1.27 
#   F:drivers/serial-u16550.c:1.25->1.26 
#   F:drivers/virmidi.c:1.11->1.12 
#   F:drivers/mpu401/mpu401.c:1.16->1.17 
#   F:drivers/opl3/opl3_seq.c:1.12->1.13 
#   F:drivers/opl4/opl4_seq.c:1.2->1.3 
#   F:include/initval.h:1.19->1.20 
#   F:isa/als100.c:1.24->1.25 
#   F:isa/azt2320.c:1.24->1.25 
#   F:isa/cmi8330.c:1.28->1.29 
#   F:isa/dt019x.c:1.18->1.19 
#   F:isa/es18xx.c:1.44->1.45 
#   F:isa/opl3sa2.c:1.32->1.33 
#   F:isa/sgalaxy.c:1.19->1.20 
#   F:isa/sscape.c:1.11->1.12 
#   F:isa/ad1816a/ad1816a.c:1.18->1.19 
#   F:isa/ad1848/ad1848.c:1.10->1.11 
#   F:isa/cs423x/cs4231.c:1.12->1.13 
#   F:isa/cs423x/cs4236.c:1.41->1.42 
#   F:isa/cs423x/pc98.c:1.7->1.8 
#   F:isa/es1688/es1688.c:1.14->1.15 
#   F:isa/gus/gusclassic.c:1.13->1.14 
#   F:isa/gus/gusextreme.c:1.15->1.16 
#   F:isa/gus/gusmax.c:1.14->1.15 
#   F:isa/gus/interwave.c:1.32->1.33 
#   F:isa/opti9xx/opti92x-ad1848.c:1.42->1.43 
#   F:isa/sb/emu8000_patch.c:1.8->1.9 
#   F:isa/sb/es968.c:1.24->1.25 
#   F:isa/sb/sb16.c:1.45->1.46 
#   F:isa/sb/sb8.c:1.18->1.19 
#   F:isa/wavefront/wavefront.c:1.27->1.28 
#   F:isa/wavefront/wavefront_synth.c:1.14->1.15 
#   F:parisc/harmony.c:1.5->1.6 
#   F:pci/als4000.c:1.31->1.32 
#   F:pci/atiixp.c:1.2->1.3 
#   F:pci/azt3328.c:1.11->1.12 
#   F:pci/bt87x.c:1.3->1.4 
#   F:pci/cmipci.c:1.61->1.62 
#   F:pci/cs4281.c:1.50->1.51 
#   F:pci/ens1370.c:1.58->1.59 
#   F:pci/es1938.c:1.33->1.34 
#   F:pci/es1968.c:1.61->1.62 
#   F:pci/fm801.c:1.43->1.44 
#   F:pci/intel8x0.c:1.130->1.131 
#   F:pci/intel8x0m.c:1.1->1.2 
#   F:pci/maestro3.c:1.48->1.49 
#   F:pci/rme32.c:1.31->1.32 
#   F:pci/rme96.c:1.33->1.34 
#   F:pci/sonicvibes.c:1.33->1.34 
#   F:pci/via82xx.c:1.94->1.95 
#   F:pci/ac97/ac97_codec.c:1.127->1.128 
#   F:pci/ali5451/ali5451.c:1.43->1.44 
#   F:pci/au88x0/au88x0.c:1.6->1.7 
#   F:pci/cs46xx/cs46xx.c:1.24->1.25 
#   F:pci/emu10k1/emu10k1.c:1.22->1.23 
#   F:pci/ice1712/ice1712.c:1.47->1.48 
#   F:pci/ice1712/ice1724.c:1.27->1.28 
#   F:pci/korg1212/korg1212.c:1.36->1.37 
#   F:pci/mixart/mixart.c:1.6->1.7 
#   F:pci/nm256/nm256.c:1.33->1.34 
#   F:pci/rme9652/hdsp.c:1.54->1.55 
#   F:pci/rme9652/rme9652.c:1.42->1.43 
#   F:pci/trident/trident.c:1.21->1.22 
#   F:pci/vx222/vx222.c:1.3->1.4 
#   F:pci/ymfpci/ymfpci.c:1.33->1.34 
#   F:pcmcia/pdaudiocf/pdaudiocf.c:1.4->1.5 
#   F:pcmcia/vx/vxpocket.c:1.3->1.4 
#   F:ppc/powermac.c:1.15->1.16 
#   F:sparc/amd7930.c:1.8->1.9 
#   F:sparc/cs4231.c:1.12->1.13 
#   F:usb/usbaudio.c:1.96->1.97 
#   L:use the new module_param*() functions.
# 
# sound/pci/vx222/vx222.c
#   2004/04/07 12:48:21+02:00 perex@suse.cz +7 -27
#   ALSA CVS update
#   D:2004/04/07 18:48:10
#   C:Documentation,SA11xx UDA1341 driver,Memalloc module,PCM Midlevel
#   C:RawMidi Midlevel,RTC timer driver,ALSA Core,Timer Midlevel
#   C:ALSA<-OSS emulation,ALSA sequencer,ALSA<-OSS sequencer,Generic drivers
#   C:MPU401 UART,OPL3,OPL4,ALS100 driver,AZT2320 driver,CMI8330 driver
#   C:DT019x driver,ES18xx driver,OPL3SA2 driver,Sound Galaxy driver
#   C:Sound Scape driver,AD1816A driver,AD1848 driver,CS4231 driver
#   C:CS4236+ driver,PC98(CS423x) driver,ES1688 driver,GUS Classic driver
#   C:GUS Extreme driver,GUS MAX driver,AMD InterWave driver,Opti9xx drivers
#   C:EMU8000 driver,ES968 driver,SB16/AWE driver,SB8 driver
#   C:Wavefront drivers,PARISC Harmony driver,ALS4000 driver,ATIIXP driver
#   C:AZT3328 driver,BT87x driver,CMIPCI driver,CS4281 driver
#   C:ENS1370/1+ driver,ES1938 driver,ES1968 driver,FM801 driver
#   C:Intel8x0 driver,Intel8x0-modem driver,Maestro3 driver,RME32 driver
#   C:RME96 driver,SonicVibes driver,VIA82xx driver,AC97 Codec Core
#   C:ALI5451 driver,au88x0 driver,CS46xx driver,EMU10K1/EMU10K2 driver
#   C:ICE1712 driver,ICE1724 driver,KORG1212 driver,MIXART driver
#   C:NM256 driver,RME HDSP driver,RME9652 driver,Trident driver
#   C:Digigram VX222 driver,YMFPCI driver,Sound Core PDAudioCF driver
#   C:Digigram VX Pocket driver,PPC PowerMac driver,SPARC AMD7930 driver
#   C:SPARC cs4231 driver,USB generic driver
#   A:Takashi Iwai <tiwai@suse.de>
#   F:Documentation/DocBook/writing-an-alsa-driver.tmpl:1.24->1.25 
#   F:arm/sa11xx-uda1341.c:1.13->1.14 
#   F:core/memalloc.c:1.28->1.29 
#   F:core/pcm_memory.c:1.25->1.26 
#   F:core/rawmidi.c:1.41->1.42 
#   F:core/rtctimer.c:1.19->1.20 
#   F:core/sound.c:1.59->1.60 
#   F:core/timer.c:1.56->1.57 
#   F:core/oss/pcm_oss.c:1.66->1.67 
#   F:core/seq/seq.c:1.9->1.10 
#   F:core/seq/seq_dummy.c:1.10->1.11 
#   F:core/seq/seq_midi.c:1.18->1.19 
#   F:core/seq/oss/seq_oss.c:1.11->1.12 
#   F:core/seq/oss/seq_oss_init.c:1.11->1.12 
#   F:drivers/dummy.c:1.26->1.27 
#   F:drivers/mtpav.c:1.26->1.27 
#   F:drivers/serial-u16550.c:1.25->1.26 
#   F:drivers/virmidi.c:1.11->1.12 
#   F:drivers/mpu401/mpu401.c:1.16->1.17 
#   F:drivers/opl3/opl3_seq.c:1.12->1.13 
#   F:drivers/opl4/opl4_seq.c:1.2->1.3 
#   F:include/initval.h:1.19->1.20 
#   F:isa/als100.c:1.24->1.25 
#   F:isa/azt2320.c:1.24->1.25 
#   F:isa/cmi8330.c:1.28->1.29 
#   F:isa/dt019x.c:1.18->1.19 
#   F:isa/es18xx.c:1.44->1.45 
#   F:isa/opl3sa2.c:1.32->1.33 
#   F:isa/sgalaxy.c:1.19->1.20 
#   F:isa/sscape.c:1.11->1.12 
#   F:isa/ad1816a/ad1816a.c:1.18->1.19 
#   F:isa/ad1848/ad1848.c:1.10->1.11 
#   F:isa/cs423x/cs4231.c:1.12->1.13 
#   F:isa/cs423x/cs4236.c:1.41->1.42 
#   F:isa/cs423x/pc98.c:1.7->1.8 
#   F:isa/es1688/es1688.c:1.14->1.15 
#   F:isa/gus/gusclassic.c:1.13->1.14 
#   F:isa/gus/gusextreme.c:1.15->1.16 
#   F:isa/gus/gusmax.c:1.14->1.15 
#   F:isa/gus/interwave.c:1.32->1.33 
#   F:isa/opti9xx/opti92x-ad1848.c:1.42->1.43 
#   F:isa/sb/emu8000_patch.c:1.8->1.9 
#   F:isa/sb/es968.c:1.24->1.25 
#   F:isa/sb/sb16.c:1.45->1.46 
#   F:isa/sb/sb8.c:1.18->1.19 
#   F:isa/wavefront/wavefront.c:1.27->1.28 
#   F:isa/wavefront/wavefront_synth.c:1.14->1.15 
#   F:parisc/harmony.c:1.5->1.6 
#   F:pci/als4000.c:1.31->1.32 
#   F:pci/atiixp.c:1.2->1.3 
#   F:pci/azt3328.c:1.11->1.12 
#   F:pci/bt87x.c:1.3->1.4 
#   F:pci/cmipci.c:1.61->1.62 
#   F:pci/cs4281.c:1.50->1.51 
#   F:pci/ens1370.c:1.58->1.59 
#   F:pci/es1938.c:1.33->1.34 
#   F:pci/es1968.c:1.61->1.62 
#   F:pci/fm801.c:1.43->1.44 
#   F:pci/intel8x0.c:1.130->1.131 
#   F:pci/intel8x0m.c:1.1->1.2 
#   F:pci/maestro3.c:1.48->1.49 
#   F:pci/rme32.c:1.31->1.32 
#   F:pci/rme96.c:1.33->1.34 
#   F:pci/sonicvibes.c:1.33->1.34 
#   F:pci/via82xx.c:1.94->1.95 
#   F:pci/ac97/ac97_codec.c:1.127->1.128 
#   F:pci/ali5451/ali5451.c:1.43->1.44 
#   F:pci/au88x0/au88x0.c:1.6->1.7 
#   F:pci/cs46xx/cs46xx.c:1.24->1.25 
#   F:pci/emu10k1/emu10k1.c:1.22->1.23 
#   F:pci/ice1712/ice1712.c:1.47->1.48 
#   F:pci/ice1712/ice1724.c:1.27->1.28 
#   F:pci/korg1212/korg1212.c:1.36->1.37 
#   F:pci/mixart/mixart.c:1.6->1.7 
#   F:pci/nm256/nm256.c:1.33->1.34 
#   F:pci/rme9652/hdsp.c:1.54->1.55 
#   F:pci/rme9652/rme9652.c:1.42->1.43 
#   F:pci/trident/trident.c:1.21->1.22 
#   F:pci/vx222/vx222.c:1.3->1.4 
#   F:pci/ymfpci/ymfpci.c:1.33->1.34 
#   F:pcmcia/pdaudiocf/pdaudiocf.c:1.4->1.5 
#   F:pcmcia/vx/vxpocket.c:1.3->1.4 
#   F:ppc/powermac.c:1.15->1.16 
#   F:sparc/amd7930.c:1.8->1.9 
#   F:sparc/cs4231.c:1.12->1.13 
#   F:usb/usbaudio.c:1.96->1.97 
#   L:use the new module_param*() functions.
# 
# sound/pci/via82xx.c
#   2004/04/07 12:48:17+02:00 perex@suse.cz +10 -39
#   ALSA CVS update
#   D:2004/04/07 18:48:10
#   C:Documentation,SA11xx UDA1341 driver,Memalloc module,PCM Midlevel
#   C:RawMidi Midlevel,RTC timer driver,ALSA Core,Timer Midlevel
#   C:ALSA<-OSS emulation,ALSA sequencer,ALSA<-OSS sequencer,Generic drivers
#   C:MPU401 UART,OPL3,OPL4,ALS100 driver,AZT2320 driver,CMI8330 driver
#   C:DT019x driver,ES18xx driver,OPL3SA2 driver,Sound Galaxy driver
#   C:Sound Scape driver,AD1816A driver,AD1848 driver,CS4231 driver
#   C:CS4236+ driver,PC98(CS423x) driver,ES1688 driver,GUS Classic driver
#   C:GUS Extreme driver,GUS MAX driver,AMD InterWave driver,Opti9xx drivers
#   C:EMU8000 driver,ES968 driver,SB16/AWE driver,SB8 driver
#   C:Wavefront drivers,PARISC Harmony driver,ALS4000 driver,ATIIXP driver
#   C:AZT3328 driver,BT87x driver,CMIPCI driver,CS4281 driver
#   C:ENS1370/1+ driver,ES1938 driver,ES1968 driver,FM801 driver
#   C:Intel8x0 driver,Intel8x0-modem driver,Maestro3 driver,RME32 driver
#   C:RME96 driver,SonicVibes driver,VIA82xx driver,AC97 Codec Core
#   C:ALI5451 driver,au88x0 driver,CS46xx driver,EMU10K1/EMU10K2 driver
#   C:ICE1712 driver,ICE1724 driver,KORG1212 driver,MIXART driver
#   C:NM256 driver,RME HDSP driver,RME9652 driver,Trident driver
#   C:Digigram VX222 driver,YMFPCI driver,Sound Core PDAudioCF driver
#   C:Digigram VX Pocket driver,PPC PowerMac driver,SPARC AMD7930 driver
#   C:SPARC cs4231 driver,USB generic driver
#   A:Takashi Iwai <tiwai@suse.de>
#   F:Documentation/DocBook/writing-an-alsa-driver.tmpl:1.24->1.25 
#   F:arm/sa11xx-uda1341.c:1.13->1.14 
#   F:core/memalloc.c:1.28->1.29 
#   F:core/pcm_memory.c:1.25->1.26 
#   F:core/rawmidi.c:1.41->1.42 
#   F:core/rtctimer.c:1.19->1.20 
#   F:core/sound.c:1.59->1.60 
#   F:core/timer.c:1.56->1.57 
#   F:core/oss/pcm_oss.c:1.66->1.67 
#   F:core/seq/seq.c:1.9->1.10 
#   F:core/seq/seq_dummy.c:1.10->1.11 
#   F:core/seq/seq_midi.c:1.18->1.19 
#   F:core/seq/oss/seq_oss.c:1.11->1.12 
#   F:core/seq/oss/seq_oss_init.c:1.11->1.12 
#   F:drivers/dummy.c:1.26->1.27 
#   F:drivers/mtpav.c:1.26->1.27 
#   F:drivers/serial-u16550.c:1.25->1.26 
#   F:drivers/virmidi.c:1.11->1.12 
#   F:drivers/mpu401/mpu401.c:1.16->1.17 
#   F:drivers/opl3/opl3_seq.c:1.12->1.13 
#   F:drivers/opl4/opl4_seq.c:1.2->1.3 
#   F:include/initval.h:1.19->1.20 
#   F:isa/als100.c:1.24->1.25 
#   F:isa/azt2320.c:1.24->1.25 
#   F:isa/cmi8330.c:1.28->1.29 
#   F:isa/dt019x.c:1.18->1.19 
#   F:isa/es18xx.c:1.44->1.45 
#   F:isa/opl3sa2.c:1.32->1.33 
#   F:isa/sgalaxy.c:1.19->1.20 
#   F:isa/sscape.c:1.11->1.12 
#   F:isa/ad1816a/ad1816a.c:1.18->1.19 
#   F:isa/ad1848/ad1848.c:1.10->1.11 
#   F:isa/cs423x/cs4231.c:1.12->1.13 
#   F:isa/cs423x/cs4236.c:1.41->1.42 
#   F:isa/cs423x/pc98.c:1.7->1.8 
#   F:isa/es1688/es1688.c:1.14->1.15 
#   F:isa/gus/gusclassic.c:1.13->1.14 
#   F:isa/gus/gusextreme.c:1.15->1.16 
#   F:isa/gus/gusmax.c:1.14->1.15 
#   F:isa/gus/interwave.c:1.32->1.33 
#   F:isa/opti9xx/opti92x-ad1848.c:1.42->1.43 
#   F:isa/sb/emu8000_patch.c:1.8->1.9 
#   F:isa/sb/es968.c:1.24->1.25 
#   F:isa/sb/sb16.c:1.45->1.46 
#   F:isa/sb/sb8.c:1.18->1.19 
#   F:isa/wavefront/wavefront.c:1.27->1.28 
#   F:isa/wavefront/wavefront_synth.c:1.14->1.15 
#   F:parisc/harmony.c:1.5->1.6 
#   F:pci/als4000.c:1.31->1.32 
#   F:pci/atiixp.c:1.2->1.3 
#   F:pci/azt3328.c:1.11->1.12 
#   F:pci/bt87x.c:1.3->1.4 
#   F:pci/cmipci.c:1.61->1.62 
#   F:pci/cs4281.c:1.50->1.51 
#   F:pci/ens1370.c:1.58->1.59 
#   F:pci/es1938.c:1.33->1.34 
#   F:pci/es1968.c:1.61->1.62 
#   F:pci/fm801.c:1.43->1.44 
#   F:pci/intel8x0.c:1.130->1.131 
#   F:pci/intel8x0m.c:1.1->1.2 
#   F:pci/maestro3.c:1.48->1.49 
#   F:pci/rme32.c:1.31->1.32 
#   F:pci/rme96.c:1.33->1.34 
#   F:pci/sonicvibes.c:1.33->1.34 
#   F:pci/via82xx.c:1.94->1.95 
#   F:pci/ac97/ac97_codec.c:1.127->1.128 
#   F:pci/ali5451/ali5451.c:1.43->1.44 
#   F:pci/au88x0/au88x0.c:1.6->1.7 
#   F:pci/cs46xx/cs46xx.c:1.24->1.25 
#   F:pci/emu10k1/emu10k1.c:1.22->1.23 
#   F:pci/ice1712/ice1712.c:1.47->1.48 
#   F:pci/ice1712/ice1724.c:1.27->1.28 
#   F:pci/korg1212/korg1212.c:1.36->1.37 
#   F:pci/mixart/mixart.c:1.6->1.7 
#   F:pci/nm256/nm256.c:1.33->1.34 
#   F:pci/rme9652/hdsp.c:1.54->1.55 
#   F:pci/rme9652/rme9652.c:1.42->1.43 
#   F:pci/trident/trident.c:1.21->1.22 
#   F:pci/vx222/vx222.c:1.3->1.4 
#   F:pci/ymfpci/ymfpci.c:1.33->1.34 
#   F:pcmcia/pdaudiocf/pdaudiocf.c:1.4->1.5 
#   F:pcmcia/vx/vxpocket.c:1.3->1.4 
#   F:ppc/powermac.c:1.15->1.16 
#   F:sparc/amd7930.c:1.8->1.9 
#   F:sparc/cs4231.c:1.12->1.13 
#   F:usb/usbaudio.c:1.96->1.97 
#   L:use the new module_param*() functions.
# 
# sound/pci/trident/trident.c
#   2004/04/07 12:48:21+02:00 perex@suse.cz +7 -30
#   ALSA CVS update
#   D:2004/04/07 18:48:10
#   C:Documentation,SA11xx UDA1341 driver,Memalloc module,PCM Midlevel
#   C:RawMidi Midlevel,RTC timer driver,ALSA Core,Timer Midlevel
#   C:ALSA<-OSS emulation,ALSA sequencer,ALSA<-OSS sequencer,Generic drivers
#   C:MPU401 UART,OPL3,OPL4,ALS100 driver,AZT2320 driver,CMI8330 driver
#   C:DT019x driver,ES18xx driver,OPL3SA2 driver,Sound Galaxy driver
#   C:Sound Scape driver,AD1816A driver,AD1848 driver,CS4231 driver
#   C:CS4236+ driver,PC98(CS423x) driver,ES1688 driver,GUS Classic driver
#   C:GUS Extreme driver,GUS MAX driver,AMD InterWave driver,Opti9xx drivers
#   C:EMU8000 driver,ES968 driver,SB16/AWE driver,SB8 driver
#   C:Wavefront drivers,PARISC Harmony driver,ALS4000 driver,ATIIXP driver
#   C:AZT3328 driver,BT87x driver,CMIPCI driver,CS4281 driver
#   C:ENS1370/1+ driver,ES1938 driver,ES1968 driver,FM801 driver
#   C:Intel8x0 driver,Intel8x0-modem driver,Maestro3 driver,RME32 driver
#   C:RME96 driver,SonicVibes driver,VIA82xx driver,AC97 Codec Core
#   C:ALI5451 driver,au88x0 driver,CS46xx driver,EMU10K1/EMU10K2 driver
#   C:ICE1712 driver,ICE1724 driver,KORG1212 driver,MIXART driver
#   C:NM256 driver,RME HDSP driver,RME9652 driver,Trident driver
#   C:Digigram VX222 driver,YMFPCI driver,Sound Core PDAudioCF driver
#   C:Digigram VX Pocket driver,PPC PowerMac driver,SPARC AMD7930 driver
#   C:SPARC cs4231 driver,USB generic driver
#   A:Takashi Iwai <tiwai@suse.de>
#   F:Documentation/DocBook/writing-an-alsa-driver.tmpl:1.24->1.25 
#   F:arm/sa11xx-uda1341.c:1.13->1.14 
#   F:core/memalloc.c:1.28->1.29 
#   F:core/pcm_memory.c:1.25->1.26 
#   F:core/rawmidi.c:1.41->1.42 
#   F:core/rtctimer.c:1.19->1.20 
#   F:core/sound.c:1.59->1.60 
#   F:core/timer.c:1.56->1.57 
#   F:core/oss/pcm_oss.c:1.66->1.67 
#   F:core/seq/seq.c:1.9->1.10 
#   F:core/seq/seq_dummy.c:1.10->1.11 
#   F:core/seq/seq_midi.c:1.18->1.19 
#   F:core/seq/oss/seq_oss.c:1.11->1.12 
#   F:core/seq/oss/seq_oss_init.c:1.11->1.12 
#   F:drivers/dummy.c:1.26->1.27 
#   F:drivers/mtpav.c:1.26->1.27 
#   F:drivers/serial-u16550.c:1.25->1.26 
#   F:drivers/virmidi.c:1.11->1.12 
#   F:drivers/mpu401/mpu401.c:1.16->1.17 
#   F:drivers/opl3/opl3_seq.c:1.12->1.13 
#   F:drivers/opl4/opl4_seq.c:1.2->1.3 
#   F:include/initval.h:1.19->1.20 
#   F:isa/als100.c:1.24->1.25 
#   F:isa/azt2320.c:1.24->1.25 
#   F:isa/cmi8330.c:1.28->1.29 
#   F:isa/dt019x.c:1.18->1.19 
#   F:isa/es18xx.c:1.44->1.45 
#   F:isa/opl3sa2.c:1.32->1.33 
#   F:isa/sgalaxy.c:1.19->1.20 
#   F:isa/sscape.c:1.11->1.12 
#   F:isa/ad1816a/ad1816a.c:1.18->1.19 
#   F:isa/ad1848/ad1848.c:1.10->1.11 
#   F:isa/cs423x/cs4231.c:1.12->1.13 
#   F:isa/cs423x/cs4236.c:1.41->1.42 
#   F:isa/cs423x/pc98.c:1.7->1.8 
#   F:isa/es1688/es1688.c:1.14->1.15 
#   F:isa/gus/gusclassic.c:1.13->1.14 
#   F:isa/gus/gusextreme.c:1.15->1.16 
#   F:isa/gus/gusmax.c:1.14->1.15 
#   F:isa/gus/interwave.c:1.32->1.33 
#   F:isa/opti9xx/opti92x-ad1848.c:1.42->1.43 
#   F:isa/sb/emu8000_patch.c:1.8->1.9 
#   F:isa/sb/es968.c:1.24->1.25 
#   F:isa/sb/sb16.c:1.45->1.46 
#   F:isa/sb/sb8.c:1.18->1.19 
#   F:isa/wavefront/wavefront.c:1.27->1.28 
#   F:isa/wavefront/wavefront_synth.c:1.14->1.15 
#   F:parisc/harmony.c:1.5->1.6 
#   F:pci/als4000.c:1.31->1.32 
#   F:pci/atiixp.c:1.2->1.3 
#   F:pci/azt3328.c:1.11->1.12 
#   F:pci/bt87x.c:1.3->1.4 
#   F:pci/cmipci.c:1.61->1.62 
#   F:pci/cs4281.c:1.50->1.51 
#   F:pci/ens1370.c:1.58->1.59 
#   F:pci/es1938.c:1.33->1.34 
#   F:pci/es1968.c:1.61->1.62 
#   F:pci/fm801.c:1.43->1.44 
#   F:pci/intel8x0.c:1.130->1.131 
#   F:pci/intel8x0m.c:1.1->1.2 
#   F:pci/maestro3.c:1.48->1.49 
#   F:pci/rme32.c:1.31->1.32 
#   F:pci/rme96.c:1.33->1.34 
#   F:pci/sonicvibes.c:1.33->1.34 
#   F:pci/via82xx.c:1.94->1.95 
#   F:pci/ac97/ac97_codec.c:1.127->1.128 
#   F:pci/ali5451/ali5451.c:1.43->1.44 
#   F:pci/au88x0/au88x0.c:1.6->1.7 
#   F:pci/cs46xx/cs46xx.c:1.24->1.25 
#   F:pci/emu10k1/emu10k1.c:1.22->1.23 
#   F:pci/ice1712/ice1712.c:1.47->1.48 
#   F:pci/ice1712/ice1724.c:1.27->1.28 
#   F:pci/korg1212/korg1212.c:1.36->1.37 
#   F:pci/mixart/mixart.c:1.6->1.7 
#   F:pci/nm256/nm256.c:1.33->1.34 
#   F:pci/rme9652/hdsp.c:1.54->1.55 
#   F:pci/rme9652/rme9652.c:1.42->1.43 
#   F:pci/trident/trident.c:1.21->1.22 
#   F:pci/vx222/vx222.c:1.3->1.4 
#   F:pci/ymfpci/ymfpci.c:1.33->1.34 
#   F:pcmcia/pdaudiocf/pdaudiocf.c:1.4->1.5 
#   F:pcmcia/vx/vxpocket.c:1.3->1.4 
#   F:ppc/powermac.c:1.15->1.16 
#   F:sparc/amd7930.c:1.8->1.9 
#   F:sparc/cs4231.c:1.12->1.13 
#   F:usb/usbaudio.c:1.96->1.97 
#   L:use the new module_param*() functions.
# 
# sound/pci/sonicvibes.c
#   2004/04/07 12:48:17+02:00 perex@suse.cz +8 -32
#   ALSA CVS update
#   D:2004/04/07 18:48:10
#   C:Documentation,SA11xx UDA1341 driver,Memalloc module,PCM Midlevel
#   C:RawMidi Midlevel,RTC timer driver,ALSA Core,Timer Midlevel
#   C:ALSA<-OSS emulation,ALSA sequencer,ALSA<-OSS sequencer,Generic drivers
#   C:MPU401 UART,OPL3,OPL4,ALS100 driver,AZT2320 driver,CMI8330 driver
#   C:DT019x driver,ES18xx driver,OPL3SA2 driver,Sound Galaxy driver
#   C:Sound Scape driver,AD1816A driver,AD1848 driver,CS4231 driver
#   C:CS4236+ driver,PC98(CS423x) driver,ES1688 driver,GUS Classic driver
#   C:GUS Extreme driver,GUS MAX driver,AMD InterWave driver,Opti9xx drivers
#   C:EMU8000 driver,ES968 driver,SB16/AWE driver,SB8 driver
#   C:Wavefront drivers,PARISC Harmony driver,ALS4000 driver,ATIIXP driver
#   C:AZT3328 driver,BT87x driver,CMIPCI driver,CS4281 driver
#   C:ENS1370/1+ driver,ES1938 driver,ES1968 driver,FM801 driver
#   C:Intel8x0 driver,Intel8x0-modem driver,Maestro3 driver,RME32 driver
#   C:RME96 driver,SonicVibes driver,VIA82xx driver,AC97 Codec Core
#   C:ALI5451 driver,au88x0 driver,CS46xx driver,EMU10K1/EMU10K2 driver
#   C:ICE1712 driver,ICE1724 driver,KORG1212 driver,MIXART driver
#   C:NM256 driver,RME HDSP driver,RME9652 driver,Trident driver
#   C:Digigram VX222 driver,YMFPCI driver,Sound Core PDAudioCF driver
#   C:Digigram VX Pocket driver,PPC PowerMac driver,SPARC AMD7930 driver
#   C:SPARC cs4231 driver,USB generic driver
#   A:Takashi Iwai <tiwai@suse.de>
#   F:Documentation/DocBook/writing-an-alsa-driver.tmpl:1.24->1.25 
#   F:arm/sa11xx-uda1341.c:1.13->1.14 
#   F:core/memalloc.c:1.28->1.29 
#   F:core/pcm_memory.c:1.25->1.26 
#   F:core/rawmidi.c:1.41->1.42 
#   F:core/rtctimer.c:1.19->1.20 
#   F:core/sound.c:1.59->1.60 
#   F:core/timer.c:1.56->1.57 
#   F:core/oss/pcm_oss.c:1.66->1.67 
#   F:core/seq/seq.c:1.9->1.10 
#   F:core/seq/seq_dummy.c:1.10->1.11 
#   F:core/seq/seq_midi.c:1.18->1.19 
#   F:core/seq/oss/seq_oss.c:1.11->1.12 
#   F:core/seq/oss/seq_oss_init.c:1.11->1.12 
#   F:drivers/dummy.c:1.26->1.27 
#   F:drivers/mtpav.c:1.26->1.27 
#   F:drivers/serial-u16550.c:1.25->1.26 
#   F:drivers/virmidi.c:1.11->1.12 
#   F:drivers/mpu401/mpu401.c:1.16->1.17 
#   F:drivers/opl3/opl3_seq.c:1.12->1.13 
#   F:drivers/opl4/opl4_seq.c:1.2->1.3 
#   F:include/initval.h:1.19->1.20 
#   F:isa/als100.c:1.24->1.25 
#   F:isa/azt2320.c:1.24->1.25 
#   F:isa/cmi8330.c:1.28->1.29 
#   F:isa/dt019x.c:1.18->1.19 
#   F:isa/es18xx.c:1.44->1.45 
#   F:isa/opl3sa2.c:1.32->1.33 
#   F:isa/sgalaxy.c:1.19->1.20 
#   F:isa/sscape.c:1.11->1.12 
#   F:isa/ad1816a/ad1816a.c:1.18->1.19 
#   F:isa/ad1848/ad1848.c:1.10->1.11 
#   F:isa/cs423x/cs4231.c:1.12->1.13 
#   F:isa/cs423x/cs4236.c:1.41->1.42 
#   F:isa/cs423x/pc98.c:1.7->1.8 
#   F:isa/es1688/es1688.c:1.14->1.15 
#   F:isa/gus/gusclassic.c:1.13->1.14 
#   F:isa/gus/gusextreme.c:1.15->1.16 
#   F:isa/gus/gusmax.c:1.14->1.15 
#   F:isa/gus/interwave.c:1.32->1.33 
#   F:isa/opti9xx/opti92x-ad1848.c:1.42->1.43 
#   F:isa/sb/emu8000_patch.c:1.8->1.9 
#   F:isa/sb/es968.c:1.24->1.25 
#   F:isa/sb/sb16.c:1.45->1.46 
#   F:isa/sb/sb8.c:1.18->1.19 
#   F:isa/wavefront/wavefront.c:1.27->1.28 
#   F:isa/wavefront/wavefront_synth.c:1.14->1.15 
#   F:parisc/harmony.c:1.5->1.6 
#   F:pci/als4000.c:1.31->1.32 
#   F:pci/atiixp.c:1.2->1.3 
#   F:pci/azt3328.c:1.11->1.12 
#   F:pci/bt87x.c:1.3->1.4 
#   F:pci/cmipci.c:1.61->1.62 
#   F:pci/cs4281.c:1.50->1.51 
#   F:pci/ens1370.c:1.58->1.59 
#   F:pci/es1938.c:1.33->1.34 
#   F:pci/es1968.c:1.61->1.62 
#   F:pci/fm801.c:1.43->1.44 
#   F:pci/intel8x0.c:1.130->1.131 
#   F:pci/intel8x0m.c:1.1->1.2 
#   F:pci/maestro3.c:1.48->1.49 
#   F:pci/rme32.c:1.31->1.32 
#   F:pci/rme96.c:1.33->1.34 
#   F:pci/sonicvibes.c:1.33->1.34 
#   F:pci/via82xx.c:1.94->1.95 
#   F:pci/ac97/ac97_codec.c:1.127->1.128 
#   F:pci/ali5451/ali5451.c:1.43->1.44 
#   F:pci/au88x0/au88x0.c:1.6->1.7 
#   F:pci/cs46xx/cs46xx.c:1.24->1.25 
#   F:pci/emu10k1/emu10k1.c:1.22->1.23 
#   F:pci/ice1712/ice1712.c:1.47->1.48 
#   F:pci/ice1712/ice1724.c:1.27->1.28 
#   F:pci/korg1212/korg1212.c:1.36->1.37 
#   F:pci/mixart/mixart.c:1.6->1.7 
#   F:pci/nm256/nm256.c:1.33->1.34 
#   F:pci/rme9652/hdsp.c:1.54->1.55 
#   F:pci/rme9652/rme9652.c:1.42->1.43 
#   F:pci/trident/trident.c:1.21->1.22 
#   F:pci/vx222/vx222.c:1.3->1.4 
#   F:pci/ymfpci/ymfpci.c:1.33->1.34 
#   F:pcmcia/pdaudiocf/pdaudiocf.c:1.4->1.5 
#   F:pcmcia/vx/vxpocket.c:1.3->1.4 
#   F:ppc/powermac.c:1.15->1.16 
#   F:sparc/amd7930.c:1.8->1.9 
#   F:sparc/cs4231.c:1.12->1.13 
#   F:usb/usbaudio.c:1.96->1.97 
#   L:use the new module_param*() functions.
# 
# sound/pci/rme9652/rme9652.c
#   2004/04/07 12:48:21+02:00 perex@suse.cz +6 -26
#   ALSA CVS update
#   D:2004/04/07 18:48:10
#   C:Documentation,SA11xx UDA1341 driver,Memalloc module,PCM Midlevel
#   C:RawMidi Midlevel,RTC timer driver,ALSA Core,Timer Midlevel
#   C:ALSA<-OSS emulation,ALSA sequencer,ALSA<-OSS sequencer,Generic drivers
#   C:MPU401 UART,OPL3,OPL4,ALS100 driver,AZT2320 driver,CMI8330 driver
#   C:DT019x driver,ES18xx driver,OPL3SA2 driver,Sound Galaxy driver
#   C:Sound Scape driver,AD1816A driver,AD1848 driver,CS4231 driver
#   C:CS4236+ driver,PC98(CS423x) driver,ES1688 driver,GUS Classic driver
#   C:GUS Extreme driver,GUS MAX driver,AMD InterWave driver,Opti9xx drivers
#   C:EMU8000 driver,ES968 driver,SB16/AWE driver,SB8 driver
#   C:Wavefront drivers,PARISC Harmony driver,ALS4000 driver,ATIIXP driver
#   C:AZT3328 driver,BT87x driver,CMIPCI driver,CS4281 driver
#   C:ENS1370/1+ driver,ES1938 driver,ES1968 driver,FM801 driver
#   C:Intel8x0 driver,Intel8x0-modem driver,Maestro3 driver,RME32 driver
#   C:RME96 driver,SonicVibes driver,VIA82xx driver,AC97 Codec Core
#   C:ALI5451 driver,au88x0 driver,CS46xx driver,EMU10K1/EMU10K2 driver
#   C:ICE1712 driver,ICE1724 driver,KORG1212 driver,MIXART driver
#   C:NM256 driver,RME HDSP driver,RME9652 driver,Trident driver
#   C:Digigram VX222 driver,YMFPCI driver,Sound Core PDAudioCF driver
#   C:Digigram VX Pocket driver,PPC PowerMac driver,SPARC AMD7930 driver
#   C:SPARC cs4231 driver,USB generic driver
#   A:Takashi Iwai <tiwai@suse.de>
#   F:Documentation/DocBook/writing-an-alsa-driver.tmpl:1.24->1.25 
#   F:arm/sa11xx-uda1341.c:1.13->1.14 
#   F:core/memalloc.c:1.28->1.29 
#   F:core/pcm_memory.c:1.25->1.26 
#   F:core/rawmidi.c:1.41->1.42 
#   F:core/rtctimer.c:1.19->1.20 
#   F:core/sound.c:1.59->1.60 
#   F:core/timer.c:1.56->1.57 
#   F:core/oss/pcm_oss.c:1.66->1.67 
#   F:core/seq/seq.c:1.9->1.10 
#   F:core/seq/seq_dummy.c:1.10->1.11 
#   F:core/seq/seq_midi.c:1.18->1.19 
#   F:core/seq/oss/seq_oss.c:1.11->1.12 
#   F:core/seq/oss/seq_oss_init.c:1.11->1.12 
#   F:drivers/dummy.c:1.26->1.27 
#   F:drivers/mtpav.c:1.26->1.27 
#   F:drivers/serial-u16550.c:1.25->1.26 
#   F:drivers/virmidi.c:1.11->1.12 
#   F:drivers/mpu401/mpu401.c:1.16->1.17 
#   F:drivers/opl3/opl3_seq.c:1.12->1.13 
#   F:drivers/opl4/opl4_seq.c:1.2->1.3 
#   F:include/initval.h:1.19->1.20 
#   F:isa/als100.c:1.24->1.25 
#   F:isa/azt2320.c:1.24->1.25 
#   F:isa/cmi8330.c:1.28->1.29 
#   F:isa/dt019x.c:1.18->1.19 
#   F:isa/es18xx.c:1.44->1.45 
#   F:isa/opl3sa2.c:1.32->1.33 
#   F:isa/sgalaxy.c:1.19->1.20 
#   F:isa/sscape.c:1.11->1.12 
#   F:isa/ad1816a/ad1816a.c:1.18->1.19 
#   F:isa/ad1848/ad1848.c:1.10->1.11 
#   F:isa/cs423x/cs4231.c:1.12->1.13 
#   F:isa/cs423x/cs4236.c:1.41->1.42 
#   F:isa/cs423x/pc98.c:1.7->1.8 
#   F:isa/es1688/es1688.c:1.14->1.15 
#   F:isa/gus/gusclassic.c:1.13->1.14 
#   F:isa/gus/gusextreme.c:1.15->1.16 
#   F:isa/gus/gusmax.c:1.14->1.15 
#   F:isa/gus/interwave.c:1.32->1.33 
#   F:isa/opti9xx/opti92x-ad1848.c:1.42->1.43 
#   F:isa/sb/emu8000_patch.c:1.8->1.9 
#   F:isa/sb/es968.c:1.24->1.25 
#   F:isa/sb/sb16.c:1.45->1.46 
#   F:isa/sb/sb8.c:1.18->1.19 
#   F:isa/wavefront/wavefront.c:1.27->1.28 
#   F:isa/wavefront/wavefront_synth.c:1.14->1.15 
#   F:parisc/harmony.c:1.5->1.6 
#   F:pci/als4000.c:1.31->1.32 
#   F:pci/atiixp.c:1.2->1.3 
#   F:pci/azt3328.c:1.11->1.12 
#   F:pci/bt87x.c:1.3->1.4 
#   F:pci/cmipci.c:1.61->1.62 
#   F:pci/cs4281.c:1.50->1.51 
#   F:pci/ens1370.c:1.58->1.59 
#   F:pci/es1938.c:1.33->1.34 
#   F:pci/es1968.c:1.61->1.62 
#   F:pci/fm801.c:1.43->1.44 
#   F:pci/intel8x0.c:1.130->1.131 
#   F:pci/intel8x0m.c:1.1->1.2 
#   F:pci/maestro3.c:1.48->1.49 
#   F:pci/rme32.c:1.31->1.32 
#   F:pci/rme96.c:1.33->1.34 
#   F:pci/sonicvibes.c:1.33->1.34 
#   F:pci/via82xx.c:1.94->1.95 
#   F:pci/ac97/ac97_codec.c:1.127->1.128 
#   F:pci/ali5451/ali5451.c:1.43->1.44 
#   F:pci/au88x0/au88x0.c:1.6->1.7 
#   F:pci/cs46xx/cs46xx.c:1.24->1.25 
#   F:pci/emu10k1/emu10k1.c:1.22->1.23 
#   F:pci/ice1712/ice1712.c:1.47->1.48 
#   F:pci/ice1712/ice1724.c:1.27->1.28 
#   F:pci/korg1212/korg1212.c:1.36->1.37 
#   F:pci/mixart/mixart.c:1.6->1.7 
#   F:pci/nm256/nm256.c:1.33->1.34 
#   F:pci/rme9652/hdsp.c:1.54->1.55 
#   F:pci/rme9652/rme9652.c:1.42->1.43 
#   F:pci/trident/trident.c:1.21->1.22 
#   F:pci/vx222/vx222.c:1.3->1.4 
#   F:pci/ymfpci/ymfpci.c:1.33->1.34 
#   F:pcmcia/pdaudiocf/pdaudiocf.c:1.4->1.5 
#   F:pcmcia/vx/vxpocket.c:1.3->1.4 
#   F:ppc/powermac.c:1.15->1.16 
#   F:sparc/amd7930.c:1.8->1.9 
#   F:sparc/cs4231.c:1.12->1.13 
#   F:usb/usbaudio.c:1.96->1.97 
#   L:use the new module_param*() functions.
# 
# sound/pci/rme9652/hdsp.c
#   2004/04/07 12:48:20+02:00 perex@suse.cz +7 -27
#   ALSA CVS update
#   D:2004/04/07 18:48:10
#   C:Documentation,SA11xx UDA1341 driver,Memalloc module,PCM Midlevel
#   C:RawMidi Midlevel,RTC timer driver,ALSA Core,Timer Midlevel
#   C:ALSA<-OSS emulation,ALSA sequencer,ALSA<-OSS sequencer,Generic drivers
#   C:MPU401 UART,OPL3,OPL4,ALS100 driver,AZT2320 driver,CMI8330 driver
#   C:DT019x driver,ES18xx driver,OPL3SA2 driver,Sound Galaxy driver
#   C:Sound Scape driver,AD1816A driver,AD1848 driver,CS4231 driver
#   C:CS4236+ driver,PC98(CS423x) driver,ES1688 driver,GUS Classic driver
#   C:GUS Extreme driver,GUS MAX driver,AMD InterWave driver,Opti9xx drivers
#   C:EMU8000 driver,ES968 driver,SB16/AWE driver,SB8 driver
#   C:Wavefront drivers,PARISC Harmony driver,ALS4000 driver,ATIIXP driver
#   C:AZT3328 driver,BT87x driver,CMIPCI driver,CS4281 driver
#   C:ENS1370/1+ driver,ES1938 driver,ES1968 driver,FM801 driver
#   C:Intel8x0 driver,Intel8x0-modem driver,Maestro3 driver,RME32 driver
#   C:RME96 driver,SonicVibes driver,VIA82xx driver,AC97 Codec Core
#   C:ALI5451 driver,au88x0 driver,CS46xx driver,EMU10K1/EMU10K2 driver
#   C:ICE1712 driver,ICE1724 driver,KORG1212 driver,MIXART driver
#   C:NM256 driver,RME HDSP driver,RME9652 driver,Trident driver
#   C:Digigram VX222 driver,YMFPCI driver,Sound Core PDAudioCF driver
#   C:Digigram VX Pocket driver,PPC PowerMac driver,SPARC AMD7930 driver
#   C:SPARC cs4231 driver,USB generic driver
#   A:Takashi Iwai <tiwai@suse.de>
#   F:Documentation/DocBook/writing-an-alsa-driver.tmpl:1.24->1.25 
#   F:arm/sa11xx-uda1341.c:1.13->1.14 
#   F:core/memalloc.c:1.28->1.29 
#   F:core/pcm_memory.c:1.25->1.26 
#   F:core/rawmidi.c:1.41->1.42 
#   F:core/rtctimer.c:1.19->1.20 
#   F:core/sound.c:1.59->1.60 
#   F:core/timer.c:1.56->1.57 
#   F:core/oss/pcm_oss.c:1.66->1.67 
#   F:core/seq/seq.c:1.9->1.10 
#   F:core/seq/seq_dummy.c:1.10->1.11 
#   F:core/seq/seq_midi.c:1.18->1.19 
#   F:core/seq/oss/seq_oss.c:1.11->1.12 
#   F:core/seq/oss/seq_oss_init.c:1.11->1.12 
#   F:drivers/dummy.c:1.26->1.27 
#   F:drivers/mtpav.c:1.26->1.27 
#   F:drivers/serial-u16550.c:1.25->1.26 
#   F:drivers/virmidi.c:1.11->1.12 
#   F:drivers/mpu401/mpu401.c:1.16->1.17 
#   F:drivers/opl3/opl3_seq.c:1.12->1.13 
#   F:drivers/opl4/opl4_seq.c:1.2->1.3 
#   F:include/initval.h:1.19->1.20 
#   F:isa/als100.c:1.24->1.25 
#   F:isa/azt2320.c:1.24->1.25 
#   F:isa/cmi8330.c:1.28->1.29 
#   F:isa/dt019x.c:1.18->1.19 
#   F:isa/es18xx.c:1.44->1.45 
#   F:isa/opl3sa2.c:1.32->1.33 
#   F:isa/sgalaxy.c:1.19->1.20 
#   F:isa/sscape.c:1.11->1.12 
#   F:isa/ad1816a/ad1816a.c:1.18->1.19 
#   F:isa/ad1848/ad1848.c:1.10->1.11 
#   F:isa/cs423x/cs4231.c:1.12->1.13 
#   F:isa/cs423x/cs4236.c:1.41->1.42 
#   F:isa/cs423x/pc98.c:1.7->1.8 
#   F:isa/es1688/es1688.c:1.14->1.15 
#   F:isa/gus/gusclassic.c:1.13->1.14 
#   F:isa/gus/gusextreme.c:1.15->1.16 
#   F:isa/gus/gusmax.c:1.14->1.15 
#   F:isa/gus/interwave.c:1.32->1.33 
#   F:isa/opti9xx/opti92x-ad1848.c:1.42->1.43 
#   F:isa/sb/emu8000_patch.c:1.8->1.9 
#   F:isa/sb/es968.c:1.24->1.25 
#   F:isa/sb/sb16.c:1.45->1.46 
#   F:isa/sb/sb8.c:1.18->1.19 
#   F:isa/wavefront/wavefront.c:1.27->1.28 
#   F:isa/wavefront/wavefront_synth.c:1.14->1.15 
#   F:parisc/harmony.c:1.5->1.6 
#   F:pci/als4000.c:1.31->1.32 
#   F:pci/atiixp.c:1.2->1.3 
#   F:pci/azt3328.c:1.11->1.12 
#   F:pci/bt87x.c:1.3->1.4 
#   F:pci/cmipci.c:1.61->1.62 
#   F:pci/cs4281.c:1.50->1.51 
#   F:pci/ens1370.c:1.58->1.59 
#   F:pci/es1938.c:1.33->1.34 
#   F:pci/es1968.c:1.61->1.62 
#   F:pci/fm801.c:1.43->1.44 
#   F:pci/intel8x0.c:1.130->1.131 
#   F:pci/intel8x0m.c:1.1->1.2 
#   F:pci/maestro3.c:1.48->1.49 
#   F:pci/rme32.c:1.31->1.32 
#   F:pci/rme96.c:1.33->1.34 
#   F:pci/sonicvibes.c:1.33->1.34 
#   F:pci/via82xx.c:1.94->1.95 
#   F:pci/ac97/ac97_codec.c:1.127->1.128 
#   F:pci/ali5451/ali5451.c:1.43->1.44 
#   F:pci/au88x0/au88x0.c:1.6->1.7 
#   F:pci/cs46xx/cs46xx.c:1.24->1.25 
#   F:pci/emu10k1/emu10k1.c:1.22->1.23 
#   F:pci/ice1712/ice1712.c:1.47->1.48 
#   F:pci/ice1712/ice1724.c:1.27->1.28 
#   F:pci/korg1212/korg1212.c:1.36->1.37 
#   F:pci/mixart/mixart.c:1.6->1.7 
#   F:pci/nm256/nm256.c:1.33->1.34 
#   F:pci/rme9652/hdsp.c:1.54->1.55 
#   F:pci/rme9652/rme9652.c:1.42->1.43 
#   F:pci/trident/trident.c:1.21->1.22 
#   F:pci/vx222/vx222.c:1.3->1.4 
#   F:pci/ymfpci/ymfpci.c:1.33->1.34 
#   F:pcmcia/pdaudiocf/pdaudiocf.c:1.4->1.5 
#   F:pcmcia/vx/vxpocket.c:1.3->1.4 
#   F:ppc/powermac.c:1.15->1.16 
#   F:sparc/amd7930.c:1.8->1.9 
#   F:sparc/cs4231.c:1.12->1.13 
#   F:usb/usbaudio.c:1.96->1.97 
#   L:use the new module_param*() functions.
# 
# sound/pci/rme96.c
#   2004/04/07 12:48:17+02:00 perex@suse.cz +5 -25
#   ALSA CVS update
#   D:2004/04/07 18:48:10
#   C:Documentation,SA11xx UDA1341 driver,Memalloc module,PCM Midlevel
#   C:RawMidi Midlevel,RTC timer driver,ALSA Core,Timer Midlevel
#   C:ALSA<-OSS emulation,ALSA sequencer,ALSA<-OSS sequencer,Generic drivers
#   C:MPU401 UART,OPL3,OPL4,ALS100 driver,AZT2320 driver,CMI8330 driver
#   C:DT019x driver,ES18xx driver,OPL3SA2 driver,Sound Galaxy driver
#   C:Sound Scape driver,AD1816A driver,AD1848 driver,CS4231 driver
#   C:CS4236+ driver,PC98(CS423x) driver,ES1688 driver,GUS Classic driver
#   C:GUS Extreme driver,GUS MAX driver,AMD InterWave driver,Opti9xx drivers
#   C:EMU8000 driver,ES968 driver,SB16/AWE driver,SB8 driver
#   C:Wavefront drivers,PARISC Harmony driver,ALS4000 driver,ATIIXP driver
#   C:AZT3328 driver,BT87x driver,CMIPCI driver,CS4281 driver
#   C:ENS1370/1+ driver,ES1938 driver,ES1968 driver,FM801 driver
#   C:Intel8x0 driver,Intel8x0-modem driver,Maestro3 driver,RME32 driver
#   C:RME96 driver,SonicVibes driver,VIA82xx driver,AC97 Codec Core
#   C:ALI5451 driver,au88x0 driver,CS46xx driver,EMU10K1/EMU10K2 driver
#   C:ICE1712 driver,ICE1724 driver,KORG1212 driver,MIXART driver
#   C:NM256 driver,RME HDSP driver,RME9652 driver,Trident driver
#   C:Digigram VX222 driver,YMFPCI driver,Sound Core PDAudioCF driver
#   C:Digigram VX Pocket driver,PPC PowerMac driver,SPARC AMD7930 driver
#   C:SPARC cs4231 driver,USB generic driver
#   A:Takashi Iwai <tiwai@suse.de>
#   F:Documentation/DocBook/writing-an-alsa-driver.tmpl:1.24->1.25 
#   F:arm/sa11xx-uda1341.c:1.13->1.14 
#   F:core/memalloc.c:1.28->1.29 
#   F:core/pcm_memory.c:1.25->1.26 
#   F:core/rawmidi.c:1.41->1.42 
#   F:core/rtctimer.c:1.19->1.20 
#   F:core/sound.c:1.59->1.60 
#   F:core/timer.c:1.56->1.57 
#   F:core/oss/pcm_oss.c:1.66->1.67 
#   F:core/seq/seq.c:1.9->1.10 
#   F:core/seq/seq_dummy.c:1.10->1.11 
#   F:core/seq/seq_midi.c:1.18->1.19 
#   F:core/seq/oss/seq_oss.c:1.11->1.12 
#   F:core/seq/oss/seq_oss_init.c:1.11->1.12 
#   F:drivers/dummy.c:1.26->1.27 
#   F:drivers/mtpav.c:1.26->1.27 
#   F:drivers/serial-u16550.c:1.25->1.26 
#   F:drivers/virmidi.c:1.11->1.12 
#   F:drivers/mpu401/mpu401.c:1.16->1.17 
#   F:drivers/opl3/opl3_seq.c:1.12->1.13 
#   F:drivers/opl4/opl4_seq.c:1.2->1.3 
#   F:include/initval.h:1.19->1.20 
#   F:isa/als100.c:1.24->1.25 
#   F:isa/azt2320.c:1.24->1.25 
#   F:isa/cmi8330.c:1.28->1.29 
#   F:isa/dt019x.c:1.18->1.19 
#   F:isa/es18xx.c:1.44->1.45 
#   F:isa/opl3sa2.c:1.32->1.33 
#   F:isa/sgalaxy.c:1.19->1.20 
#   F:isa/sscape.c:1.11->1.12 
#   F:isa/ad1816a/ad1816a.c:1.18->1.19 
#   F:isa/ad1848/ad1848.c:1.10->1.11 
#   F:isa/cs423x/cs4231.c:1.12->1.13 
#   F:isa/cs423x/cs4236.c:1.41->1.42 
#   F:isa/cs423x/pc98.c:1.7->1.8 
#   F:isa/es1688/es1688.c:1.14->1.15 
#   F:isa/gus/gusclassic.c:1.13->1.14 
#   F:isa/gus/gusextreme.c:1.15->1.16 
#   F:isa/gus/gusmax.c:1.14->1.15 
#   F:isa/gus/interwave.c:1.32->1.33 
#   F:isa/opti9xx/opti92x-ad1848.c:1.42->1.43 
#   F:isa/sb/emu8000_patch.c:1.8->1.9 
#   F:isa/sb/es968.c:1.24->1.25 
#   F:isa/sb/sb16.c:1.45->1.46 
#   F:isa/sb/sb8.c:1.18->1.19 
#   F:isa/wavefront/wavefront.c:1.27->1.28 
#   F:isa/wavefront/wavefront_synth.c:1.14->1.15 
#   F:parisc/harmony.c:1.5->1.6 
#   F:pci/als4000.c:1.31->1.32 
#   F:pci/atiixp.c:1.2->1.3 
#   F:pci/azt3328.c:1.11->1.12 
#   F:pci/bt87x.c:1.3->1.4 
#   F:pci/cmipci.c:1.61->1.62 
#   F:pci/cs4281.c:1.50->1.51 
#   F:pci/ens1370.c:1.58->1.59 
#   F:pci/es1938.c:1.33->1.34 
#   F:pci/es1968.c:1.61->1.62 
#   F:pci/fm801.c:1.43->1.44 
#   F:pci/intel8x0.c:1.130->1.131 
#   F:pci/intel8x0m.c:1.1->1.2 
#   F:pci/maestro3.c:1.48->1.49 
#   F:pci/rme32.c:1.31->1.32 
#   F:pci/rme96.c:1.33->1.34 
#   F:pci/sonicvibes.c:1.33->1.34 
#   F:pci/via82xx.c:1.94->1.95 
#   F:pci/ac97/ac97_codec.c:1.127->1.128 
#   F:pci/ali5451/ali5451.c:1.43->1.44 
#   F:pci/au88x0/au88x0.c:1.6->1.7 
#   F:pci/cs46xx/cs46xx.c:1.24->1.25 
#   F:pci/emu10k1/emu10k1.c:1.22->1.23 
#   F:pci/ice1712/ice1712.c:1.47->1.48 
#   F:pci/ice1712/ice1724.c:1.27->1.28 
#   F:pci/korg1212/korg1212.c:1.36->1.37 
#   F:pci/mixart/mixart.c:1.6->1.7 
#   F:pci/nm256/nm256.c:1.33->1.34 
#   F:pci/rme9652/hdsp.c:1.54->1.55 
#   F:pci/rme9652/rme9652.c:1.42->1.43 
#   F:pci/trident/trident.c:1.21->1.22 
#   F:pci/vx222/vx222.c:1.3->1.4 
#   F:pci/ymfpci/ymfpci.c:1.33->1.34 
#   F:pcmcia/pdaudiocf/pdaudiocf.c:1.4->1.5 
#   F:pcmcia/vx/vxpocket.c:1.3->1.4 
#   F:ppc/powermac.c:1.15->1.16 
#   F:sparc/amd7930.c:1.8->1.9 
#   F:sparc/cs4231.c:1.12->1.13 
#   F:usb/usbaudio.c:1.96->1.97 
#   L:use the new module_param*() functions.
# 
# sound/pci/rme32.c
#   2004/04/07 12:48:17+02:00 perex@suse.cz +5 -23
#   ALSA CVS update
#   D:2004/04/07 18:48:10
#   C:Documentation,SA11xx UDA1341 driver,Memalloc module,PCM Midlevel
#   C:RawMidi Midlevel,RTC timer driver,ALSA Core,Timer Midlevel
#   C:ALSA<-OSS emulation,ALSA sequencer,ALSA<-OSS sequencer,Generic drivers
#   C:MPU401 UART,OPL3,OPL4,ALS100 driver,AZT2320 driver,CMI8330 driver
#   C:DT019x driver,ES18xx driver,OPL3SA2 driver,Sound Galaxy driver
#   C:Sound Scape driver,AD1816A driver,AD1848 driver,CS4231 driver
#   C:CS4236+ driver,PC98(CS423x) driver,ES1688 driver,GUS Classic driver
#   C:GUS Extreme driver,GUS MAX driver,AMD InterWave driver,Opti9xx drivers
#   C:EMU8000 driver,ES968 driver,SB16/AWE driver,SB8 driver
#   C:Wavefront drivers,PARISC Harmony driver,ALS4000 driver,ATIIXP driver
#   C:AZT3328 driver,BT87x driver,CMIPCI driver,CS4281 driver
#   C:ENS1370/1+ driver,ES1938 driver,ES1968 driver,FM801 driver
#   C:Intel8x0 driver,Intel8x0-modem driver,Maestro3 driver,RME32 driver
#   C:RME96 driver,SonicVibes driver,VIA82xx driver,AC97 Codec Core
#   C:ALI5451 driver,au88x0 driver,CS46xx driver,EMU10K1/EMU10K2 driver
#   C:ICE1712 driver,ICE1724 driver,KORG1212 driver,MIXART driver
#   C:NM256 driver,RME HDSP driver,RME9652 driver,Trident driver
#   C:Digigram VX222 driver,YMFPCI driver,Sound Core PDAudioCF driver
#   C:Digigram VX Pocket driver,PPC PowerMac driver,SPARC AMD7930 driver
#   C:SPARC cs4231 driver,USB generic driver
#   A:Takashi Iwai <tiwai@suse.de>
#   F:Documentation/DocBook/writing-an-alsa-driver.tmpl:1.24->1.25 
#   F:arm/sa11xx-uda1341.c:1.13->1.14 
#   F:core/memalloc.c:1.28->1.29 
#   F:core/pcm_memory.c:1.25->1.26 
#   F:core/rawmidi.c:1.41->1.42 
#   F:core/rtctimer.c:1.19->1.20 
#   F:core/sound.c:1.59->1.60 
#   F:core/timer.c:1.56->1.57 
#   F:core/oss/pcm_oss.c:1.66->1.67 
#   F:core/seq/seq.c:1.9->1.10 
#   F:core/seq/seq_dummy.c:1.10->1.11 
#   F:core/seq/seq_midi.c:1.18->1.19 
#   F:core/seq/oss/seq_oss.c:1.11->1.12 
#   F:core/seq/oss/seq_oss_init.c:1.11->1.12 
#   F:drivers/dummy.c:1.26->1.27 
#   F:drivers/mtpav.c:1.26->1.27 
#   F:drivers/serial-u16550.c:1.25->1.26 
#   F:drivers/virmidi.c:1.11->1.12 
#   F:drivers/mpu401/mpu401.c:1.16->1.17 
#   F:drivers/opl3/opl3_seq.c:1.12->1.13 
#   F:drivers/opl4/opl4_seq.c:1.2->1.3 
#   F:include/initval.h:1.19->1.20 
#   F:isa/als100.c:1.24->1.25 
#   F:isa/azt2320.c:1.24->1.25 
#   F:isa/cmi8330.c:1.28->1.29 
#   F:isa/dt019x.c:1.18->1.19 
#   F:isa/es18xx.c:1.44->1.45 
#   F:isa/opl3sa2.c:1.32->1.33 
#   F:isa/sgalaxy.c:1.19->1.20 
#   F:isa/sscape.c:1.11->1.12 
#   F:isa/ad1816a/ad1816a.c:1.18->1.19 
#   F:isa/ad1848/ad1848.c:1.10->1.11 
#   F:isa/cs423x/cs4231.c:1.12->1.13 
#   F:isa/cs423x/cs4236.c:1.41->1.42 
#   F:isa/cs423x/pc98.c:1.7->1.8 
#   F:isa/es1688/es1688.c:1.14->1.15 
#   F:isa/gus/gusclassic.c:1.13->1.14 
#   F:isa/gus/gusextreme.c:1.15->1.16 
#   F:isa/gus/gusmax.c:1.14->1.15 
#   F:isa/gus/interwave.c:1.32->1.33 
#   F:isa/opti9xx/opti92x-ad1848.c:1.42->1.43 
#   F:isa/sb/emu8000_patch.c:1.8->1.9 
#   F:isa/sb/es968.c:1.24->1.25 
#   F:isa/sb/sb16.c:1.45->1.46 
#   F:isa/sb/sb8.c:1.18->1.19 
#   F:isa/wavefront/wavefront.c:1.27->1.28 
#   F:isa/wavefront/wavefront_synth.c:1.14->1.15 
#   F:parisc/harmony.c:1.5->1.6 
#   F:pci/als4000.c:1.31->1.32 
#   F:pci/atiixp.c:1.2->1.3 
#   F:pci/azt3328.c:1.11->1.12 
#   F:pci/bt87x.c:1.3->1.4 
#   F:pci/cmipci.c:1.61->1.62 
#   F:pci/cs4281.c:1.50->1.51 
#   F:pci/ens1370.c:1.58->1.59 
#   F:pci/es1938.c:1.33->1.34 
#   F:pci/es1968.c:1.61->1.62 
#   F:pci/fm801.c:1.43->1.44 
#   F:pci/intel8x0.c:1.130->1.131 
#   F:pci/intel8x0m.c:1.1->1.2 
#   F:pci/maestro3.c:1.48->1.49 
#   F:pci/rme32.c:1.31->1.32 
#   F:pci/rme96.c:1.33->1.34 
#   F:pci/sonicvibes.c:1.33->1.34 
#   F:pci/via82xx.c:1.94->1.95 
#   F:pci/ac97/ac97_codec.c:1.127->1.128 
#   F:pci/ali5451/ali5451.c:1.43->1.44 
#   F:pci/au88x0/au88x0.c:1.6->1.7 
#   F:pci/cs46xx/cs46xx.c:1.24->1.25 
#   F:pci/emu10k1/emu10k1.c:1.22->1.23 
#   F:pci/ice1712/ice1712.c:1.47->1.48 
#   F:pci/ice1712/ice1724.c:1.27->1.28 
#   F:pci/korg1212/korg1212.c:1.36->1.37 
#   F:pci/mixart/mixart.c:1.6->1.7 
#   F:pci/nm256/nm256.c:1.33->1.34 
#   F:pci/rme9652/hdsp.c:1.54->1.55 
#   F:pci/rme9652/rme9652.c:1.42->1.43 
#   F:pci/trident/trident.c:1.21->1.22 
#   F:pci/vx222/vx222.c:1.3->1.4 
#   F:pci/ymfpci/ymfpci.c:1.33->1.34 
#   F:pcmcia/pdaudiocf/pdaudiocf.c:1.4->1.5 
#   F:pcmcia/vx/vxpocket.c:1.3->1.4 
#   F:ppc/powermac.c:1.15->1.16 
#   F:sparc/amd7930.c:1.8->1.9 
#   F:sparc/cs4231.c:1.12->1.13 
#   F:usb/usbaudio.c:1.96->1.97 
#   L:use the new module_param*() functions.
# 
# sound/pci/nm256/nm256.c
#   2004/04/07 12:48:20+02:00 perex@suse.cz +11 -38
#   ALSA CVS update
#   D:2004/04/07 18:48:10
#   C:Documentation,SA11xx UDA1341 driver,Memalloc module,PCM Midlevel
#   C:RawMidi Midlevel,RTC timer driver,ALSA Core,Timer Midlevel
#   C:ALSA<-OSS emulation,ALSA sequencer,ALSA<-OSS sequencer,Generic drivers
#   C:MPU401 UART,OPL3,OPL4,ALS100 driver,AZT2320 driver,CMI8330 driver
#   C:DT019x driver,ES18xx driver,OPL3SA2 driver,Sound Galaxy driver
#   C:Sound Scape driver,AD1816A driver,AD1848 driver,CS4231 driver
#   C:CS4236+ driver,PC98(CS423x) driver,ES1688 driver,GUS Classic driver
#   C:GUS Extreme driver,GUS MAX driver,AMD InterWave driver,Opti9xx drivers
#   C:EMU8000 driver,ES968 driver,SB16/AWE driver,SB8 driver
#   C:Wavefront drivers,PARISC Harmony driver,ALS4000 driver,ATIIXP driver
#   C:AZT3328 driver,BT87x driver,CMIPCI driver,CS4281 driver
#   C:ENS1370/1+ driver,ES1938 driver,ES1968 driver,FM801 driver
#   C:Intel8x0 driver,Intel8x0-modem driver,Maestro3 driver,RME32 driver
#   C:RME96 driver,SonicVibes driver,VIA82xx driver,AC97 Codec Core
#   C:ALI5451 driver,au88x0 driver,CS46xx driver,EMU10K1/EMU10K2 driver
#   C:ICE1712 driver,ICE1724 driver,KORG1212 driver,MIXART driver
#   C:NM256 driver,RME HDSP driver,RME9652 driver,Trident driver
#   C:Digigram VX222 driver,YMFPCI driver,Sound Core PDAudioCF driver
#   C:Digigram VX Pocket driver,PPC PowerMac driver,SPARC AMD7930 driver
#   C:SPARC cs4231 driver,USB generic driver
#   A:Takashi Iwai <tiwai@suse.de>
#   F:Documentation/DocBook/writing-an-alsa-driver.tmpl:1.24->1.25 
#   F:arm/sa11xx-uda1341.c:1.13->1.14 
#   F:core/memalloc.c:1.28->1.29 
#   F:core/pcm_memory.c:1.25->1.26 
#   F:core/rawmidi.c:1.41->1.42 
#   F:core/rtctimer.c:1.19->1.20 
#   F:core/sound.c:1.59->1.60 
#   F:core/timer.c:1.56->1.57 
#   F:core/oss/pcm_oss.c:1.66->1.67 
#   F:core/seq/seq.c:1.9->1.10 
#   F:core/seq/seq_dummy.c:1.10->1.11 
#   F:core/seq/seq_midi.c:1.18->1.19 
#   F:core/seq/oss/seq_oss.c:1.11->1.12 
#   F:core/seq/oss/seq_oss_init.c:1.11->1.12 
#   F:drivers/dummy.c:1.26->1.27 
#   F:drivers/mtpav.c:1.26->1.27 
#   F:drivers/serial-u16550.c:1.25->1.26 
#   F:drivers/virmidi.c:1.11->1.12 
#   F:drivers/mpu401/mpu401.c:1.16->1.17 
#   F:drivers/opl3/opl3_seq.c:1.12->1.13 
#   F:drivers/opl4/opl4_seq.c:1.2->1.3 
#   F:include/initval.h:1.19->1.20 
#   F:isa/als100.c:1.24->1.25 
#   F:isa/azt2320.c:1.24->1.25 
#   F:isa/cmi8330.c:1.28->1.29 
#   F:isa/dt019x.c:1.18->1.19 
#   F:isa/es18xx.c:1.44->1.45 
#   F:isa/opl3sa2.c:1.32->1.33 
#   F:isa/sgalaxy.c:1.19->1.20 
#   F:isa/sscape.c:1.11->1.12 
#   F:isa/ad1816a/ad1816a.c:1.18->1.19 
#   F:isa/ad1848/ad1848.c:1.10->1.11 
#   F:isa/cs423x/cs4231.c:1.12->1.13 
#   F:isa/cs423x/cs4236.c:1.41->1.42 
#   F:isa/cs423x/pc98.c:1.7->1.8 
#   F:isa/es1688/es1688.c:1.14->1.15 
#   F:isa/gus/gusclassic.c:1.13->1.14 
#   F:isa/gus/gusextreme.c:1.15->1.16 
#   F:isa/gus/gusmax.c:1.14->1.15 
#   F:isa/gus/interwave.c:1.32->1.33 
#   F:isa/opti9xx/opti92x-ad1848.c:1.42->1.43 
#   F:isa/sb/emu8000_patch.c:1.8->1.9 
#   F:isa/sb/es968.c:1.24->1.25 
#   F:isa/sb/sb16.c:1.45->1.46 
#   F:isa/sb/sb8.c:1.18->1.19 
#   F:isa/wavefront/wavefront.c:1.27->1.28 
#   F:isa/wavefront/wavefront_synth.c:1.14->1.15 
#   F:parisc/harmony.c:1.5->1.6 
#   F:pci/als4000.c:1.31->1.32 
#   F:pci/atiixp.c:1.2->1.3 
#   F:pci/azt3328.c:1.11->1.12 
#   F:pci/bt87x.c:1.3->1.4 
#   F:pci/cmipci.c:1.61->1.62 
#   F:pci/cs4281.c:1.50->1.51 
#   F:pci/ens1370.c:1.58->1.59 
#   F:pci/es1938.c:1.33->1.34 
#   F:pci/es1968.c:1.61->1.62 
#   F:pci/fm801.c:1.43->1.44 
#   F:pci/intel8x0.c:1.130->1.131 
#   F:pci/intel8x0m.c:1.1->1.2 
#   F:pci/maestro3.c:1.48->1.49 
#   F:pci/rme32.c:1.31->1.32 
#   F:pci/rme96.c:1.33->1.34 
#   F:pci/sonicvibes.c:1.33->1.34 
#   F:pci/via82xx.c:1.94->1.95 
#   F:pci/ac97/ac97_codec.c:1.127->1.128 
#   F:pci/ali5451/ali5451.c:1.43->1.44 
#   F:pci/au88x0/au88x0.c:1.6->1.7 
#   F:pci/cs46xx/cs46xx.c:1.24->1.25 
#   F:pci/emu10k1/emu10k1.c:1.22->1.23 
#   F:pci/ice1712/ice1712.c:1.47->1.48 
#   F:pci/ice1712/ice1724.c:1.27->1.28 
#   F:pci/korg1212/korg1212.c:1.36->1.37 
#   F:pci/mixart/mixart.c:1.6->1.7 
#   F:pci/nm256/nm256.c:1.33->1.34 
#   F:pci/rme9652/hdsp.c:1.54->1.55 
#   F:pci/rme9652/rme9652.c:1.42->1.43 
#   F:pci/trident/trident.c:1.21->1.22 
#   F:pci/vx222/vx222.c:1.3->1.4 
#   F:pci/ymfpci/ymfpci.c:1.33->1.34 
#   F:pcmcia/pdaudiocf/pdaudiocf.c:1.4->1.5 
#   F:pcmcia/vx/vxpocket.c:1.3->1.4 
#   F:ppc/powermac.c:1.15->1.16 
#   F:sparc/amd7930.c:1.8->1.9 
#   F:sparc/cs4231.c:1.12->1.13 
#   F:usb/usbaudio.c:1.96->1.97 
#   L:use the new module_param*() functions.
# 
# sound/pci/mixart/mixart.c
#   2004/04/07 12:48:20+02:00 perex@suse.cz +5 -25
#   ALSA CVS update
#   D:2004/04/07 18:48:10
#   C:Documentation,SA11xx UDA1341 driver,Memalloc module,PCM Midlevel
#   C:RawMidi Midlevel,RTC timer driver,ALSA Core,Timer Midlevel
#   C:ALSA<-OSS emulation,ALSA sequencer,ALSA<-OSS sequencer,Generic drivers
#   C:MPU401 UART,OPL3,OPL4,ALS100 driver,AZT2320 driver,CMI8330 driver
#   C:DT019x driver,ES18xx driver,OPL3SA2 driver,Sound Galaxy driver
#   C:Sound Scape driver,AD1816A driver,AD1848 driver,CS4231 driver
#   C:CS4236+ driver,PC98(CS423x) driver,ES1688 driver,GUS Classic driver
#   C:GUS Extreme driver,GUS MAX driver,AMD InterWave driver,Opti9xx drivers
#   C:EMU8000 driver,ES968 driver,SB16/AWE driver,SB8 driver
#   C:Wavefront drivers,PARISC Harmony driver,ALS4000 driver,ATIIXP driver
#   C:AZT3328 driver,BT87x driver,CMIPCI driver,CS4281 driver
#   C:ENS1370/1+ driver,ES1938 driver,ES1968 driver,FM801 driver
#   C:Intel8x0 driver,Intel8x0-modem driver,Maestro3 driver,RME32 driver
#   C:RME96 driver,SonicVibes driver,VIA82xx driver,AC97 Codec Core
#   C:ALI5451 driver,au88x0 driver,CS46xx driver,EMU10K1/EMU10K2 driver
#   C:ICE1712 driver,ICE1724 driver,KORG1212 driver,MIXART driver
#   C:NM256 driver,RME HDSP driver,RME9652 driver,Trident driver
#   C:Digigram VX222 driver,YMFPCI driver,Sound Core PDAudioCF driver
#   C:Digigram VX Pocket driver,PPC PowerMac driver,SPARC AMD7930 driver
#   C:SPARC cs4231 driver,USB generic driver
#   A:Takashi Iwai <tiwai@suse.de>
#   F:Documentation/DocBook/writing-an-alsa-driver.tmpl:1.24->1.25 
#   F:arm/sa11xx-uda1341.c:1.13->1.14 
#   F:core/memalloc.c:1.28->1.29 
#   F:core/pcm_memory.c:1.25->1.26 
#   F:core/rawmidi.c:1.41->1.42 
#   F:core/rtctimer.c:1.19->1.20 
#   F:core/sound.c:1.59->1.60 
#   F:core/timer.c:1.56->1.57 
#   F:core/oss/pcm_oss.c:1.66->1.67 
#   F:core/seq/seq.c:1.9->1.10 
#   F:core/seq/seq_dummy.c:1.10->1.11 
#   F:core/seq/seq_midi.c:1.18->1.19 
#   F:core/seq/oss/seq_oss.c:1.11->1.12 
#   F:core/seq/oss/seq_oss_init.c:1.11->1.12 
#   F:drivers/dummy.c:1.26->1.27 
#   F:drivers/mtpav.c:1.26->1.27 
#   F:drivers/serial-u16550.c:1.25->1.26 
#   F:drivers/virmidi.c:1.11->1.12 
#   F:drivers/mpu401/mpu401.c:1.16->1.17 
#   F:drivers/opl3/opl3_seq.c:1.12->1.13 
#   F:drivers/opl4/opl4_seq.c:1.2->1.3 
#   F:include/initval.h:1.19->1.20 
#   F:isa/als100.c:1.24->1.25 
#   F:isa/azt2320.c:1.24->1.25 
#   F:isa/cmi8330.c:1.28->1.29 
#   F:isa/dt019x.c:1.18->1.19 
#   F:isa/es18xx.c:1.44->1.45 
#   F:isa/opl3sa2.c:1.32->1.33 
#   F:isa/sgalaxy.c:1.19->1.20 
#   F:isa/sscape.c:1.11->1.12 
#   F:isa/ad1816a/ad1816a.c:1.18->1.19 
#   F:isa/ad1848/ad1848.c:1.10->1.11 
#   F:isa/cs423x/cs4231.c:1.12->1.13 
#   F:isa/cs423x/cs4236.c:1.41->1.42 
#   F:isa/cs423x/pc98.c:1.7->1.8 
#   F:isa/es1688/es1688.c:1.14->1.15 
#   F:isa/gus/gusclassic.c:1.13->1.14 
#   F:isa/gus/gusextreme.c:1.15->1.16 
#   F:isa/gus/gusmax.c:1.14->1.15 
#   F:isa/gus/interwave.c:1.32->1.33 
#   F:isa/opti9xx/opti92x-ad1848.c:1.42->1.43 
#   F:isa/sb/emu8000_patch.c:1.8->1.9 
#   F:isa/sb/es968.c:1.24->1.25 
#   F:isa/sb/sb16.c:1.45->1.46 
#   F:isa/sb/sb8.c:1.18->1.19 
#   F:isa/wavefront/wavefront.c:1.27->1.28 
#   F:isa/wavefront/wavefront_synth.c:1.14->1.15 
#   F:parisc/harmony.c:1.5->1.6 
#   F:pci/als4000.c:1.31->1.32 
#   F:pci/atiixp.c:1.2->1.3 
#   F:pci/azt3328.c:1.11->1.12 
#   F:pci/bt87x.c:1.3->1.4 
#   F:pci/cmipci.c:1.61->1.62 
#   F:pci/cs4281.c:1.50->1.51 
#   F:pci/ens1370.c:1.58->1.59 
#   F:pci/es1938.c:1.33->1.34 
#   F:pci/es1968.c:1.61->1.62 
#   F:pci/fm801.c:1.43->1.44 
#   F:pci/intel8x0.c:1.130->1.131 
#   F:pci/intel8x0m.c:1.1->1.2 
#   F:pci/maestro3.c:1.48->1.49 
#   F:pci/rme32.c:1.31->1.32 
#   F:pci/rme96.c:1.33->1.34 
#   F:pci/sonicvibes.c:1.33->1.34 
#   F:pci/via82xx.c:1.94->1.95 
#   F:pci/ac97/ac97_codec.c:1.127->1.128 
#   F:pci/ali5451/ali5451.c:1.43->1.44 
#   F:pci/au88x0/au88x0.c:1.6->1.7 
#   F:pci/cs46xx/cs46xx.c:1.24->1.25 
#   F:pci/emu10k1/emu10k1.c:1.22->1.23 
#   F:pci/ice1712/ice1712.c:1.47->1.48 
#   F:pci/ice1712/ice1724.c:1.27->1.28 
#   F:pci/korg1212/korg1212.c:1.36->1.37 
#   F:pci/mixart/mixart.c:1.6->1.7 
#   F:pci/nm256/nm256.c:1.33->1.34 
#   F:pci/rme9652/hdsp.c:1.54->1.55 
#   F:pci/rme9652/rme9652.c:1.42->1.43 
#   F:pci/trident/trident.c:1.21->1.22 
#   F:pci/vx222/vx222.c:1.3->1.4 
#   F:pci/ymfpci/ymfpci.c:1.33->1.34 
#   F:pcmcia/pdaudiocf/pdaudiocf.c:1.4->1.5 
#   F:pcmcia/vx/vxpocket.c:1.3->1.4 
#   F:ppc/powermac.c:1.15->1.16 
#   F:sparc/amd7930.c:1.8->1.9 
#   F:sparc/cs4231.c:1.12->1.13 
#   F:usb/usbaudio.c:1.96->1.97 
#   L:use the new module_param*() functions.
# 
# sound/pci/maestro3.c
#   2004/04/07 12:48:17+02:00 perex@suse.cz +7 -29
#   ALSA CVS update
#   D:2004/04/07 18:48:10
#   C:Documentation,SA11xx UDA1341 driver,Memalloc module,PCM Midlevel
#   C:RawMidi Midlevel,RTC timer driver,ALSA Core,Timer Midlevel
#   C:ALSA<-OSS emulation,ALSA sequencer,ALSA<-OSS sequencer,Generic drivers
#   C:MPU401 UART,OPL3,OPL4,ALS100 driver,AZT2320 driver,CMI8330 driver
#   C:DT019x driver,ES18xx driver,OPL3SA2 driver,Sound Galaxy driver
#   C:Sound Scape driver,AD1816A driver,AD1848 driver,CS4231 driver
#   C:CS4236+ driver,PC98(CS423x) driver,ES1688 driver,GUS Classic driver
#   C:GUS Extreme driver,GUS MAX driver,AMD InterWave driver,Opti9xx drivers
#   C:EMU8000 driver,ES968 driver,SB16/AWE driver,SB8 driver
#   C:Wavefront drivers,PARISC Harmony driver,ALS4000 driver,ATIIXP driver
#   C:AZT3328 driver,BT87x driver,CMIPCI driver,CS4281 driver
#   C:ENS1370/1+ driver,ES1938 driver,ES1968 driver,FM801 driver
#   C:Intel8x0 driver,Intel8x0-modem driver,Maestro3 driver,RME32 driver
#   C:RME96 driver,SonicVibes driver,VIA82xx driver,AC97 Codec Core
#   C:ALI5451 driver,au88x0 driver,CS46xx driver,EMU10K1/EMU10K2 driver
#   C:ICE1712 driver,ICE1724 driver,KORG1212 driver,MIXART driver
#   C:NM256 driver,RME HDSP driver,RME9652 driver,Trident driver
#   C:Digigram VX222 driver,YMFPCI driver,Sound Core PDAudioCF driver
#   C:Digigram VX Pocket driver,PPC PowerMac driver,SPARC AMD7930 driver
#   C:SPARC cs4231 driver,USB generic driver
#   A:Takashi Iwai <tiwai@suse.de>
#   F:Documentation/DocBook/writing-an-alsa-driver.tmpl:1.24->1.25 
#   F:arm/sa11xx-uda1341.c:1.13->1.14 
#   F:core/memalloc.c:1.28->1.29 
#   F:core/pcm_memory.c:1.25->1.26 
#   F:core/rawmidi.c:1.41->1.42 
#   F:core/rtctimer.c:1.19->1.20 
#   F:core/sound.c:1.59->1.60 
#   F:core/timer.c:1.56->1.57 
#   F:core/oss/pcm_oss.c:1.66->1.67 
#   F:core/seq/seq.c:1.9->1.10 
#   F:core/seq/seq_dummy.c:1.10->1.11 
#   F:core/seq/seq_midi.c:1.18->1.19 
#   F:core/seq/oss/seq_oss.c:1.11->1.12 
#   F:core/seq/oss/seq_oss_init.c:1.11->1.12 
#   F:drivers/dummy.c:1.26->1.27 
#   F:drivers/mtpav.c:1.26->1.27 
#   F:drivers/serial-u16550.c:1.25->1.26 
#   F:drivers/virmidi.c:1.11->1.12 
#   F:drivers/mpu401/mpu401.c:1.16->1.17 
#   F:drivers/opl3/opl3_seq.c:1.12->1.13 
#   F:drivers/opl4/opl4_seq.c:1.2->1.3 
#   F:include/initval.h:1.19->1.20 
#   F:isa/als100.c:1.24->1.25 
#   F:isa/azt2320.c:1.24->1.25 
#   F:isa/cmi8330.c:1.28->1.29 
#   F:isa/dt019x.c:1.18->1.19 
#   F:isa/es18xx.c:1.44->1.45 
#   F:isa/opl3sa2.c:1.32->1.33 
#   F:isa/sgalaxy.c:1.19->1.20 
#   F:isa/sscape.c:1.11->1.12 
#   F:isa/ad1816a/ad1816a.c:1.18->1.19 
#   F:isa/ad1848/ad1848.c:1.10->1.11 
#   F:isa/cs423x/cs4231.c:1.12->1.13 
#   F:isa/cs423x/cs4236.c:1.41->1.42 
#   F:isa/cs423x/pc98.c:1.7->1.8 
#   F:isa/es1688/es1688.c:1.14->1.15 
#   F:isa/gus/gusclassic.c:1.13->1.14 
#   F:isa/gus/gusextreme.c:1.15->1.16 
#   F:isa/gus/gusmax.c:1.14->1.15 
#   F:isa/gus/interwave.c:1.32->1.33 
#   F:isa/opti9xx/opti92x-ad1848.c:1.42->1.43 
#   F:isa/sb/emu8000_patch.c:1.8->1.9 
#   F:isa/sb/es968.c:1.24->1.25 
#   F:isa/sb/sb16.c:1.45->1.46 
#   F:isa/sb/sb8.c:1.18->1.19 
#   F:isa/wavefront/wavefront.c:1.27->1.28 
#   F:isa/wavefront/wavefront_synth.c:1.14->1.15 
#   F:parisc/harmony.c:1.5->1.6 
#   F:pci/als4000.c:1.31->1.32 
#   F:pci/atiixp.c:1.2->1.3 
#   F:pci/azt3328.c:1.11->1.12 
#   F:pci/bt87x.c:1.3->1.4 
#   F:pci/cmipci.c:1.61->1.62 
#   F:pci/cs4281.c:1.50->1.51 
#   F:pci/ens1370.c:1.58->1.59 
#   F:pci/es1938.c:1.33->1.34 
#   F:pci/es1968.c:1.61->1.62 
#   F:pci/fm801.c:1.43->1.44 
#   F:pci/intel8x0.c:1.130->1.131 
#   F:pci/intel8x0m.c:1.1->1.2 
#   F:pci/maestro3.c:1.48->1.49 
#   F:pci/rme32.c:1.31->1.32 
#   F:pci/rme96.c:1.33->1.34 
#   F:pci/sonicvibes.c:1.33->1.34 
#   F:pci/via82xx.c:1.94->1.95 
#   F:pci/ac97/ac97_codec.c:1.127->1.128 
#   F:pci/ali5451/ali5451.c:1.43->1.44 
#   F:pci/au88x0/au88x0.c:1.6->1.7 
#   F:pci/cs46xx/cs46xx.c:1.24->1.25 
#   F:pci/emu10k1/emu10k1.c:1.22->1.23 
#   F:pci/ice1712/ice1712.c:1.47->1.48 
#   F:pci/ice1712/ice1724.c:1.27->1.28 
#   F:pci/korg1212/korg1212.c:1.36->1.37 
#   F:pci/mixart/mixart.c:1.6->1.7 
#   F:pci/nm256/nm256.c:1.33->1.34 
#   F:pci/rme9652/hdsp.c:1.54->1.55 
#   F:pci/rme9652/rme9652.c:1.42->1.43 
#   F:pci/trident/trident.c:1.21->1.22 
#   F:pci/vx222/vx222.c:1.3->1.4 
#   F:pci/ymfpci/ymfpci.c:1.33->1.34 
#   F:pcmcia/pdaudiocf/pdaudiocf.c:1.4->1.5 
#   F:pcmcia/vx/vxpocket.c:1.3->1.4 
#   F:ppc/powermac.c:1.15->1.16 
#   F:sparc/amd7930.c:1.8->1.9 
#   F:sparc/cs4231.c:1.12->1.13 
#   F:usb/usbaudio.c:1.96->1.97 
#   L:use the new module_param*() functions.
# 
# sound/pci/korg1212/korg1212.c
#   2004/04/07 12:48:20+02:00 perex@suse.cz +5 -26
#   ALSA CVS update
#   D:2004/04/07 18:48:10
#   C:Documentation,SA11xx UDA1341 driver,Memalloc module,PCM Midlevel
#   C:RawMidi Midlevel,RTC timer driver,ALSA Core,Timer Midlevel
#   C:ALSA<-OSS emulation,ALSA sequencer,ALSA<-OSS sequencer,Generic drivers
#   C:MPU401 UART,OPL3,OPL4,ALS100 driver,AZT2320 driver,CMI8330 driver
#   C:DT019x driver,ES18xx driver,OPL3SA2 driver,Sound Galaxy driver
#   C:Sound Scape driver,AD1816A driver,AD1848 driver,CS4231 driver
#   C:CS4236+ driver,PC98(CS423x) driver,ES1688 driver,GUS Classic driver
#   C:GUS Extreme driver,GUS MAX driver,AMD InterWave driver,Opti9xx drivers
#   C:EMU8000 driver,ES968 driver,SB16/AWE driver,SB8 driver
#   C:Wavefront drivers,PARISC Harmony driver,ALS4000 driver,ATIIXP driver
#   C:AZT3328 driver,BT87x driver,CMIPCI driver,CS4281 driver
#   C:ENS1370/1+ driver,ES1938 driver,ES1968 driver,FM801 driver
#   C:Intel8x0 driver,Intel8x0-modem driver,Maestro3 driver,RME32 driver
#   C:RME96 driver,SonicVibes driver,VIA82xx driver,AC97 Codec Core
#   C:ALI5451 driver,au88x0 driver,CS46xx driver,EMU10K1/EMU10K2 driver
#   C:ICE1712 driver,ICE1724 driver,KORG1212 driver,MIXART driver
#   C:NM256 driver,RME HDSP driver,RME9652 driver,Trident driver
#   C:Digigram VX222 driver,YMFPCI driver,Sound Core PDAudioCF driver
#   C:Digigram VX Pocket driver,PPC PowerMac driver,SPARC AMD7930 driver
#   C:SPARC cs4231 driver,USB generic driver
#   A:Takashi Iwai <tiwai@suse.de>
#   F:Documentation/DocBook/writing-an-alsa-driver.tmpl:1.24->1.25 
#   F:arm/sa11xx-uda1341.c:1.13->1.14 
#   F:core/memalloc.c:1.28->1.29 
#   F:core/pcm_memory.c:1.25->1.26 
#   F:core/rawmidi.c:1.41->1.42 
#   F:core/rtctimer.c:1.19->1.20 
#   F:core/sound.c:1.59->1.60 
#   F:core/timer.c:1.56->1.57 
#   F:core/oss/pcm_oss.c:1.66->1.67 
#   F:core/seq/seq.c:1.9->1.10 
#   F:core/seq/seq_dummy.c:1.10->1.11 
#   F:core/seq/seq_midi.c:1.18->1.19 
#   F:core/seq/oss/seq_oss.c:1.11->1.12 
#   F:core/seq/oss/seq_oss_init.c:1.11->1.12 
#   F:drivers/dummy.c:1.26->1.27 
#   F:drivers/mtpav.c:1.26->1.27 
#   F:drivers/serial-u16550.c:1.25->1.26 
#   F:drivers/virmidi.c:1.11->1.12 
#   F:drivers/mpu401/mpu401.c:1.16->1.17 
#   F:drivers/opl3/opl3_seq.c:1.12->1.13 
#   F:drivers/opl4/opl4_seq.c:1.2->1.3 
#   F:include/initval.h:1.19->1.20 
#   F:isa/als100.c:1.24->1.25 
#   F:isa/azt2320.c:1.24->1.25 
#   F:isa/cmi8330.c:1.28->1.29 
#   F:isa/dt019x.c:1.18->1.19 
#   F:isa/es18xx.c:1.44->1.45 
#   F:isa/opl3sa2.c:1.32->1.33 
#   F:isa/sgalaxy.c:1.19->1.20 
#   F:isa/sscape.c:1.11->1.12 
#   F:isa/ad1816a/ad1816a.c:1.18->1.19 
#   F:isa/ad1848/ad1848.c:1.10->1.11 
#   F:isa/cs423x/cs4231.c:1.12->1.13 
#   F:isa/cs423x/cs4236.c:1.41->1.42 
#   F:isa/cs423x/pc98.c:1.7->1.8 
#   F:isa/es1688/es1688.c:1.14->1.15 
#   F:isa/gus/gusclassic.c:1.13->1.14 
#   F:isa/gus/gusextreme.c:1.15->1.16 
#   F:isa/gus/gusmax.c:1.14->1.15 
#   F:isa/gus/interwave.c:1.32->1.33 
#   F:isa/opti9xx/opti92x-ad1848.c:1.42->1.43 
#   F:isa/sb/emu8000_patch.c:1.8->1.9 
#   F:isa/sb/es968.c:1.24->1.25 
#   F:isa/sb/sb16.c:1.45->1.46 
#   F:isa/sb/sb8.c:1.18->1.19 
#   F:isa/wavefront/wavefront.c:1.27->1.28 
#   F:isa/wavefront/wavefront_synth.c:1.14->1.15 
#   F:parisc/harmony.c:1.5->1.6 
#   F:pci/als4000.c:1.31->1.32 
#   F:pci/atiixp.c:1.2->1.3 
#   F:pci/azt3328.c:1.11->1.12 
#   F:pci/bt87x.c:1.3->1.4 
#   F:pci/cmipci.c:1.61->1.62 
#   F:pci/cs4281.c:1.50->1.51 
#   F:pci/ens1370.c:1.58->1.59 
#   F:pci/es1938.c:1.33->1.34 
#   F:pci/es1968.c:1.61->1.62 
#   F:pci/fm801.c:1.43->1.44 
#   F:pci/intel8x0.c:1.130->1.131 
#   F:pci/intel8x0m.c:1.1->1.2 
#   F:pci/maestro3.c:1.48->1.49 
#   F:pci/rme32.c:1.31->1.32 
#   F:pci/rme96.c:1.33->1.34 
#   F:pci/sonicvibes.c:1.33->1.34 
#   F:pci/via82xx.c:1.94->1.95 
#   F:pci/ac97/ac97_codec.c:1.127->1.128 
#   F:pci/ali5451/ali5451.c:1.43->1.44 
#   F:pci/au88x0/au88x0.c:1.6->1.7 
#   F:pci/cs46xx/cs46xx.c:1.24->1.25 
#   F:pci/emu10k1/emu10k1.c:1.22->1.23 
#   F:pci/ice1712/ice1712.c:1.47->1.48 
#   F:pci/ice1712/ice1724.c:1.27->1.28 
#   F:pci/korg1212/korg1212.c:1.36->1.37 
#   F:pci/mixart/mixart.c:1.6->1.7 
#   F:pci/nm256/nm256.c:1.33->1.34 
#   F:pci/rme9652/hdsp.c:1.54->1.55 
#   F:pci/rme9652/rme9652.c:1.42->1.43 
#   F:pci/trident/trident.c:1.21->1.22 
#   F:pci/vx222/vx222.c:1.3->1.4 
#   F:pci/ymfpci/ymfpci.c:1.33->1.34 
#   F:pcmcia/pdaudiocf/pdaudiocf.c:1.4->1.5 
#   F:pcmcia/vx/vxpocket.c:1.3->1.4 
#   F:ppc/powermac.c:1.15->1.16 
#   F:sparc/amd7930.c:1.8->1.9 
#   F:sparc/cs4231.c:1.12->1.13 
#   F:usb/usbaudio.c:1.96->1.97 
#   L:use the new module_param*() functions.
# 
# sound/pci/intel8x0m.c
#   2004/04/07 12:48:17+02:00 perex@suse.cz +6 -28
#   ALSA CVS update
#   D:2004/04/07 18:48:10
#   C:Documentation,SA11xx UDA1341 driver,Memalloc module,PCM Midlevel
#   C:RawMidi Midlevel,RTC timer driver,ALSA Core,Timer Midlevel
#   C:ALSA<-OSS emulation,ALSA sequencer,ALSA<-OSS sequencer,Generic drivers
#   C:MPU401 UART,OPL3,OPL4,ALS100 driver,AZT2320 driver,CMI8330 driver
#   C:DT019x driver,ES18xx driver,OPL3SA2 driver,Sound Galaxy driver
#   C:Sound Scape driver,AD1816A driver,AD1848 driver,CS4231 driver
#   C:CS4236+ driver,PC98(CS423x) driver,ES1688 driver,GUS Classic driver
#   C:GUS Extreme driver,GUS MAX driver,AMD InterWave driver,Opti9xx drivers
#   C:EMU8000 driver,ES968 driver,SB16/AWE driver,SB8 driver
#   C:Wavefront drivers,PARISC Harmony driver,ALS4000 driver,ATIIXP driver
#   C:AZT3328 driver,BT87x driver,CMIPCI driver,CS4281 driver
#   C:ENS1370/1+ driver,ES1938 driver,ES1968 driver,FM801 driver
#   C:Intel8x0 driver,Intel8x0-modem driver,Maestro3 driver,RME32 driver
#   C:RME96 driver,SonicVibes driver,VIA82xx driver,AC97 Codec Core
#   C:ALI5451 driver,au88x0 driver,CS46xx driver,EMU10K1/EMU10K2 driver
#   C:ICE1712 driver,ICE1724 driver,KORG1212 driver,MIXART driver
#   C:NM256 driver,RME HDSP driver,RME9652 driver,Trident driver
#   C:Digigram VX222 driver,YMFPCI driver,Sound Core PDAudioCF driver
#   C:Digigram VX Pocket driver,PPC PowerMac driver,SPARC AMD7930 driver
#   C:SPARC cs4231 driver,USB generic driver
#   A:Takashi Iwai <tiwai@suse.de>
#   F:Documentation/DocBook/writing-an-alsa-driver.tmpl:1.24->1.25 
#   F:arm/sa11xx-uda1341.c:1.13->1.14 
#   F:core/memalloc.c:1.28->1.29 
#   F:core/pcm_memory.c:1.25->1.26 
#   F:core/rawmidi.c:1.41->1.42 
#   F:core/rtctimer.c:1.19->1.20 
#   F:core/sound.c:1.59->1.60 
#   F:core/timer.c:1.56->1.57 
#   F:core/oss/pcm_oss.c:1.66->1.67 
#   F:core/seq/seq.c:1.9->1.10 
#   F:core/seq/seq_dummy.c:1.10->1.11 
#   F:core/seq/seq_midi.c:1.18->1.19 
#   F:core/seq/oss/seq_oss.c:1.11->1.12 
#   F:core/seq/oss/seq_oss_init.c:1.11->1.12 
#   F:drivers/dummy.c:1.26->1.27 
#   F:drivers/mtpav.c:1.26->1.27 
#   F:drivers/serial-u16550.c:1.25->1.26 
#   F:drivers/virmidi.c:1.11->1.12 
#   F:drivers/mpu401/mpu401.c:1.16->1.17 
#   F:drivers/opl3/opl3_seq.c:1.12->1.13 
#   F:drivers/opl4/opl4_seq.c:1.2->1.3 
#   F:include/initval.h:1.19->1.20 
#   F:isa/als100.c:1.24->1.25 
#   F:isa/azt2320.c:1.24->1.25 
#   F:isa/cmi8330.c:1.28->1.29 
#   F:isa/dt019x.c:1.18->1.19 
#   F:isa/es18xx.c:1.44->1.45 
#   F:isa/opl3sa2.c:1.32->1.33 
#   F:isa/sgalaxy.c:1.19->1.20 
#   F:isa/sscape.c:1.11->1.12 
#   F:isa/ad1816a/ad1816a.c:1.18->1.19 
#   F:isa/ad1848/ad1848.c:1.10->1.11 
#   F:isa/cs423x/cs4231.c:1.12->1.13 
#   F:isa/cs423x/cs4236.c:1.41->1.42 
#   F:isa/cs423x/pc98.c:1.7->1.8 
#   F:isa/es1688/es1688.c:1.14->1.15 
#   F:isa/gus/gusclassic.c:1.13->1.14 
#   F:isa/gus/gusextreme.c:1.15->1.16 
#   F:isa/gus/gusmax.c:1.14->1.15 
#   F:isa/gus/interwave.c:1.32->1.33 
#   F:isa/opti9xx/opti92x-ad1848.c:1.42->1.43 
#   F:isa/sb/emu8000_patch.c:1.8->1.9 
#   F:isa/sb/es968.c:1.24->1.25 
#   F:isa/sb/sb16.c:1.45->1.46 
#   F:isa/sb/sb8.c:1.18->1.19 
#   F:isa/wavefront/wavefront.c:1.27->1.28 
#   F:isa/wavefront/wavefront_synth.c:1.14->1.15 
#   F:parisc/harmony.c:1.5->1.6 
#   F:pci/als4000.c:1.31->1.32 
#   F:pci/atiixp.c:1.2->1.3 
#   F:pci/azt3328.c:1.11->1.12 
#   F:pci/bt87x.c:1.3->1.4 
#   F:pci/cmipci.c:1.61->1.62 
#   F:pci/cs4281.c:1.50->1.51 
#   F:pci/ens1370.c:1.58->1.59 
#   F:pci/es1938.c:1.33->1.34 
#   F:pci/es1968.c:1.61->1.62 
#   F:pci/fm801.c:1.43->1.44 
#   F:pci/intel8x0.c:1.130->1.131 
#   F:pci/intel8x0m.c:1.1->1.2 
#   F:pci/maestro3.c:1.48->1.49 
#   F:pci/rme32.c:1.31->1.32 
#   F:pci/rme96.c:1.33->1.34 
#   F:pci/sonicvibes.c:1.33->1.34 
#   F:pci/via82xx.c:1.94->1.95 
#   F:pci/ac97/ac97_codec.c:1.127->1.128 
#   F:pci/ali5451/ali5451.c:1.43->1.44 
#   F:pci/au88x0/au88x0.c:1.6->1.7 
#   F:pci/cs46xx/cs46xx.c:1.24->1.25 
#   F:pci/emu10k1/emu10k1.c:1.22->1.23 
#   F:pci/ice1712/ice1712.c:1.47->1.48 
#   F:pci/ice1712/ice1724.c:1.27->1.28 
#   F:pci/korg1212/korg1212.c:1.36->1.37 
#   F:pci/mixart/mixart.c:1.6->1.7 
#   F:pci/nm256/nm256.c:1.33->1.34 
#   F:pci/rme9652/hdsp.c:1.54->1.55 
#   F:pci/rme9652/rme9652.c:1.42->1.43 
#   F:pci/trident/trident.c:1.21->1.22 
#   F:pci/vx222/vx222.c:1.3->1.4 
#   F:pci/ymfpci/ymfpci.c:1.33->1.34 
#   F:pcmcia/pdaudiocf/pdaudiocf.c:1.4->1.5 
#   F:pcmcia/vx/vxpocket.c:1.3->1.4 
#   F:ppc/powermac.c:1.15->1.16 
#   F:sparc/amd7930.c:1.8->1.9 
#   F:sparc/cs4231.c:1.12->1.13 
#   F:usb/usbaudio.c:1.96->1.97 
#   L:use the new module_param*() functions.
# 
# sound/pci/intel8x0.c
#   2004/04/07 12:48:16+02:00 perex@suse.cz +9 -38
#   ALSA CVS update
#   D:2004/04/07 18:48:10
#   C:Documentation,SA11xx UDA1341 driver,Memalloc module,PCM Midlevel
#   C:RawMidi Midlevel,RTC timer driver,ALSA Core,Timer Midlevel
#   C:ALSA<-OSS emulation,ALSA sequencer,ALSA<-OSS sequencer,Generic drivers
#   C:MPU401 UART,OPL3,OPL4,ALS100 driver,AZT2320 driver,CMI8330 driver
#   C:DT019x driver,ES18xx driver,OPL3SA2 driver,Sound Galaxy driver
#   C:Sound Scape driver,AD1816A driver,AD1848 driver,CS4231 driver
#   C:CS4236+ driver,PC98(CS423x) driver,ES1688 driver,GUS Classic driver
#   C:GUS Extreme driver,GUS MAX driver,AMD InterWave driver,Opti9xx drivers
#   C:EMU8000 driver,ES968 driver,SB16/AWE driver,SB8 driver
#   C:Wavefront drivers,PARISC Harmony driver,ALS4000 driver,ATIIXP driver
#   C:AZT3328 driver,BT87x driver,CMIPCI driver,CS4281 driver
#   C:ENS1370/1+ driver,ES1938 driver,ES1968 driver,FM801 driver
#   C:Intel8x0 driver,Intel8x0-modem driver,Maestro3 driver,RME32 driver
#   C:RME96 driver,SonicVibes driver,VIA82xx driver,AC97 Codec Core
#   C:ALI5451 driver,au88x0 driver,CS46xx driver,EMU10K1/EMU10K2 driver
#   C:ICE1712 driver,ICE1724 driver,KORG1212 driver,MIXART driver
#   C:NM256 driver,RME HDSP driver,RME9652 driver,Trident driver
#   C:Digigram VX222 driver,YMFPCI driver,Sound Core PDAudioCF driver
#   C:Digigram VX Pocket driver,PPC PowerMac driver,SPARC AMD7930 driver
#   C:SPARC cs4231 driver,USB generic driver
#   A:Takashi Iwai <tiwai@suse.de>
#   F:Documentation/DocBook/writing-an-alsa-driver.tmpl:1.24->1.25 
#   F:arm/sa11xx-uda1341.c:1.13->1.14 
#   F:core/memalloc.c:1.28->1.29 
#   F:core/pcm_memory.c:1.25->1.26 
#   F:core/rawmidi.c:1.41->1.42 
#   F:core/rtctimer.c:1.19->1.20 
#   F:core/sound.c:1.59->1.60 
#   F:core/timer.c:1.56->1.57 
#   F:core/oss/pcm_oss.c:1.66->1.67 
#   F:core/seq/seq.c:1.9->1.10 
#   F:core/seq/seq_dummy.c:1.10->1.11 
#   F:core/seq/seq_midi.c:1.18->1.19 
#   F:core/seq/oss/seq_oss.c:1.11->1.12 
#   F:core/seq/oss/seq_oss_init.c:1.11->1.12 
#   F:drivers/dummy.c:1.26->1.27 
#   F:drivers/mtpav.c:1.26->1.27 
#   F:drivers/serial-u16550.c:1.25->1.26 
#   F:drivers/virmidi.c:1.11->1.12 
#   F:drivers/mpu401/mpu401.c:1.16->1.17 
#   F:drivers/opl3/opl3_seq.c:1.12->1.13 
#   F:drivers/opl4/opl4_seq.c:1.2->1.3 
#   F:include/initval.h:1.19->1.20 
#   F:isa/als100.c:1.24->1.25 
#   F:isa/azt2320.c:1.24->1.25 
#   F:isa/cmi8330.c:1.28->1.29 
#   F:isa/dt019x.c:1.18->1.19 
#   F:isa/es18xx.c:1.44->1.45 
#   F:isa/opl3sa2.c:1.32->1.33 
#   F:isa/sgalaxy.c:1.19->1.20 
#   F:isa/sscape.c:1.11->1.12 
#   F:isa/ad1816a/ad1816a.c:1.18->1.19 
#   F:isa/ad1848/ad1848.c:1.10->1.11 
#   F:isa/cs423x/cs4231.c:1.12->1.13 
#   F:isa/cs423x/cs4236.c:1.41->1.42 
#   F:isa/cs423x/pc98.c:1.7->1.8 
#   F:isa/es1688/es1688.c:1.14->1.15 
#   F:isa/gus/gusclassic.c:1.13->1.14 
#   F:isa/gus/gusextreme.c:1.15->1.16 
#   F:isa/gus/gusmax.c:1.14->1.15 
#   F:isa/gus/interwave.c:1.32->1.33 
#   F:isa/opti9xx/opti92x-ad1848.c:1.42->1.43 
#   F:isa/sb/emu8000_patch.c:1.8->1.9 
#   F:isa/sb/es968.c:1.24->1.25 
#   F:isa/sb/sb16.c:1.45->1.46 
#   F:isa/sb/sb8.c:1.18->1.19 
#   F:isa/wavefront/wavefront.c:1.27->1.28 
#   F:isa/wavefront/wavefront_synth.c:1.14->1.15 
#   F:parisc/harmony.c:1.5->1.6 
#   F:pci/als4000.c:1.31->1.32 
#   F:pci/atiixp.c:1.2->1.3 
#   F:pci/azt3328.c:1.11->1.12 
#   F:pci/bt87x.c:1.3->1.4 
#   F:pci/cmipci.c:1.61->1.62 
#   F:pci/cs4281.c:1.50->1.51 
#   F:pci/ens1370.c:1.58->1.59 
#   F:pci/es1938.c:1.33->1.34 
#   F:pci/es1968.c:1.61->1.62 
#   F:pci/fm801.c:1.43->1.44 
#   F:pci/intel8x0.c:1.130->1.131 
#   F:pci/intel8x0m.c:1.1->1.2 
#   F:pci/maestro3.c:1.48->1.49 
#   F:pci/rme32.c:1.31->1.32 
#   F:pci/rme96.c:1.33->1.34 
#   F:pci/sonicvibes.c:1.33->1.34 
#   F:pci/via82xx.c:1.94->1.95 
#   F:pci/ac97/ac97_codec.c:1.127->1.128 
#   F:pci/ali5451/ali5451.c:1.43->1.44 
#   F:pci/au88x0/au88x0.c:1.6->1.7 
#   F:pci/cs46xx/cs46xx.c:1.24->1.25 
#   F:pci/emu10k1/emu10k1.c:1.22->1.23 
#   F:pci/ice1712/ice1712.c:1.47->1.48 
#   F:pci/ice1712/ice1724.c:1.27->1.28 
#   F:pci/korg1212/korg1212.c:1.36->1.37 
#   F:pci/mixart/mixart.c:1.6->1.7 
#   F:pci/nm256/nm256.c:1.33->1.34 
#   F:pci/rme9652/hdsp.c:1.54->1.55 
#   F:pci/rme9652/rme9652.c:1.42->1.43 
#   F:pci/trident/trident.c:1.21->1.22 
#   F:pci/vx222/vx222.c:1.3->1.4 
#   F:pci/ymfpci/ymfpci.c:1.33->1.34 
#   F:pcmcia/pdaudiocf/pdaudiocf.c:1.4->1.5 
#   F:pcmcia/vx/vxpocket.c:1.3->1.4 
#   F:ppc/powermac.c:1.15->1.16 
#   F:sparc/amd7930.c:1.8->1.9 
#   F:sparc/cs4231.c:1.12->1.13 
#   F:usb/usbaudio.c:1.96->1.97 
#   L:use the new module_param*() functions.
# 
# sound/pci/ice1712/ice1724.c
#   2004/04/07 12:48:20+02:00 perex@suse.cz +5 -25
#   ALSA CVS update
#   D:2004/04/07 18:48:10
#   C:Documentation,SA11xx UDA1341 driver,Memalloc module,PCM Midlevel
#   C:RawMidi Midlevel,RTC timer driver,ALSA Core,Timer Midlevel
#   C:ALSA<-OSS emulation,ALSA sequencer,ALSA<-OSS sequencer,Generic drivers
#   C:MPU401 UART,OPL3,OPL4,ALS100 driver,AZT2320 driver,CMI8330 driver
#   C:DT019x driver,ES18xx driver,OPL3SA2 driver,Sound Galaxy driver
#   C:Sound Scape driver,AD1816A driver,AD1848 driver,CS4231 driver
#   C:CS4236+ driver,PC98(CS423x) driver,ES1688 driver,GUS Classic driver
#   C:GUS Extreme driver,GUS MAX driver,AMD InterWave driver,Opti9xx drivers
#   C:EMU8000 driver,ES968 driver,SB16/AWE driver,SB8 driver
#   C:Wavefront drivers,PARISC Harmony driver,ALS4000 driver,ATIIXP driver
#   C:AZT3328 driver,BT87x driver,CMIPCI driver,CS4281 driver
#   C:ENS1370/1+ driver,ES1938 driver,ES1968 driver,FM801 driver
#   C:Intel8x0 driver,Intel8x0-modem driver,Maestro3 driver,RME32 driver
#   C:RME96 driver,SonicVibes driver,VIA82xx driver,AC97 Codec Core
#   C:ALI5451 driver,au88x0 driver,CS46xx driver,EMU10K1/EMU10K2 driver
#   C:ICE1712 driver,ICE1724 driver,KORG1212 driver,MIXART driver
#   C:NM256 driver,RME HDSP driver,RME9652 driver,Trident driver
#   C:Digigram VX222 driver,YMFPCI driver,Sound Core PDAudioCF driver
#   C:Digigram VX Pocket driver,PPC PowerMac driver,SPARC AMD7930 driver
#   C:SPARC cs4231 driver,USB generic driver
#   A:Takashi Iwai <tiwai@suse.de>
#   F:Documentation/DocBook/writing-an-alsa-driver.tmpl:1.24->1.25 
#   F:arm/sa11xx-uda1341.c:1.13->1.14 
#   F:core/memalloc.c:1.28->1.29 
#   F:core/pcm_memory.c:1.25->1.26 
#   F:core/rawmidi.c:1.41->1.42 
#   F:core/rtctimer.c:1.19->1.20 
#   F:core/sound.c:1.59->1.60 
#   F:core/timer.c:1.56->1.57 
#   F:core/oss/pcm_oss.c:1.66->1.67 
#   F:core/seq/seq.c:1.9->1.10 
#   F:core/seq/seq_dummy.c:1.10->1.11 
#   F:core/seq/seq_midi.c:1.18->1.19 
#   F:core/seq/oss/seq_oss.c:1.11->1.12 
#   F:core/seq/oss/seq_oss_init.c:1.11->1.12 
#   F:drivers/dummy.c:1.26->1.27 
#   F:drivers/mtpav.c:1.26->1.27 
#   F:drivers/serial-u16550.c:1.25->1.26 
#   F:drivers/virmidi.c:1.11->1.12 
#   F:drivers/mpu401/mpu401.c:1.16->1.17 
#   F:drivers/opl3/opl3_seq.c:1.12->1.13 
#   F:drivers/opl4/opl4_seq.c:1.2->1.3 
#   F:include/initval.h:1.19->1.20 
#   F:isa/als100.c:1.24->1.25 
#   F:isa/azt2320.c:1.24->1.25 
#   F:isa/cmi8330.c:1.28->1.29 
#   F:isa/dt019x.c:1.18->1.19 
#   F:isa/es18xx.c:1.44->1.45 
#   F:isa/opl3sa2.c:1.32->1.33 
#   F:isa/sgalaxy.c:1.19->1.20 
#   F:isa/sscape.c:1.11->1.12 
#   F:isa/ad1816a/ad1816a.c:1.18->1.19 
#   F:isa/ad1848/ad1848.c:1.10->1.11 
#   F:isa/cs423x/cs4231.c:1.12->1.13 
#   F:isa/cs423x/cs4236.c:1.41->1.42 
#   F:isa/cs423x/pc98.c:1.7->1.8 
#   F:isa/es1688/es1688.c:1.14->1.15 
#   F:isa/gus/gusclassic.c:1.13->1.14 
#   F:isa/gus/gusextreme.c:1.15->1.16 
#   F:isa/gus/gusmax.c:1.14->1.15 
#   F:isa/gus/interwave.c:1.32->1.33 
#   F:isa/opti9xx/opti92x-ad1848.c:1.42->1.43 
#   F:isa/sb/emu8000_patch.c:1.8->1.9 
#   F:isa/sb/es968.c:1.24->1.25 
#   F:isa/sb/sb16.c:1.45->1.46 
#   F:isa/sb/sb8.c:1.18->1.19 
#   F:isa/wavefront/wavefront.c:1.27->1.28 
#   F:isa/wavefront/wavefront_synth.c:1.14->1.15 
#   F:parisc/harmony.c:1.5->1.6 
#   F:pci/als4000.c:1.31->1.32 
#   F:pci/atiixp.c:1.2->1.3 
#   F:pci/azt3328.c:1.11->1.12 
#   F:pci/bt87x.c:1.3->1.4 
#   F:pci/cmipci.c:1.61->1.62 
#   F:pci/cs4281.c:1.50->1.51 
#   F:pci/ens1370.c:1.58->1.59 
#   F:pci/es1938.c:1.33->1.34 
#   F:pci/es1968.c:1.61->1.62 
#   F:pci/fm801.c:1.43->1.44 
#   F:pci/intel8x0.c:1.130->1.131 
#   F:pci/intel8x0m.c:1.1->1.2 
#   F:pci/maestro3.c:1.48->1.49 
#   F:pci/rme32.c:1.31->1.32 
#   F:pci/rme96.c:1.33->1.34 
#   F:pci/sonicvibes.c:1.33->1.34 
#   F:pci/via82xx.c:1.94->1.95 
#   F:pci/ac97/ac97_codec.c:1.127->1.128 
#   F:pci/ali5451/ali5451.c:1.43->1.44 
#   F:pci/au88x0/au88x0.c:1.6->1.7 
#   F:pci/cs46xx/cs46xx.c:1.24->1.25 
#   F:pci/emu10k1/emu10k1.c:1.22->1.23 
#   F:pci/ice1712/ice1712.c:1.47->1.48 
#   F:pci/ice1712/ice1724.c:1.27->1.28 
#   F:pci/korg1212/korg1212.c:1.36->1.37 
#   F:pci/mixart/mixart.c:1.6->1.7 
#   F:pci/nm256/nm256.c:1.33->1.34 
#   F:pci/rme9652/hdsp.c:1.54->1.55 
#   F:pci/rme9652/rme9652.c:1.42->1.43 
#   F:pci/trident/trident.c:1.21->1.22 
#   F:pci/vx222/vx222.c:1.3->1.4 
#   F:pci/ymfpci/ymfpci.c:1.33->1.34 
#   F:pcmcia/pdaudiocf/pdaudiocf.c:1.4->1.5 
#   F:pcmcia/vx/vxpocket.c:1.3->1.4 
#   F:ppc/powermac.c:1.15->1.16 
#   F:sparc/amd7930.c:1.8->1.9 
#   F:sparc/cs4231.c:1.12->1.13 
#   F:usb/usbaudio.c:1.96->1.97 
#   L:use the new module_param*() functions.
# 
# sound/pci/ice1712/ice1712.c
#   2004/04/07 12:48:20+02:00 perex@suse.cz +7 -27
#   ALSA CVS update
#   D:2004/04/07 18:48:10
#   C:Documentation,SA11xx UDA1341 driver,Memalloc module,PCM Midlevel
#   C:RawMidi Midlevel,RTC timer driver,ALSA Core,Timer Midlevel
#   C:ALSA<-OSS emulation,ALSA sequencer,ALSA<-OSS sequencer,Generic drivers
#   C:MPU401 UART,OPL3,OPL4,ALS100 driver,AZT2320 driver,CMI8330 driver
#   C:DT019x driver,ES18xx driver,OPL3SA2 driver,Sound Galaxy driver
#   C:Sound Scape driver,AD1816A driver,AD1848 driver,CS4231 driver
#   C:CS4236+ driver,PC98(CS423x) driver,ES1688 driver,GUS Classic driver
#   C:GUS Extreme driver,GUS MAX driver,AMD InterWave driver,Opti9xx drivers
#   C:EMU8000 driver,ES968 driver,SB16/AWE driver,SB8 driver
#   C:Wavefront drivers,PARISC Harmony driver,ALS4000 driver,ATIIXP driver
#   C:AZT3328 driver,BT87x driver,CMIPCI driver,CS4281 driver
#   C:ENS1370/1+ driver,ES1938 driver,ES1968 driver,FM801 driver
#   C:Intel8x0 driver,Intel8x0-modem driver,Maestro3 driver,RME32 driver
#   C:RME96 driver,SonicVibes driver,VIA82xx driver,AC97 Codec Core
#   C:ALI5451 driver,au88x0 driver,CS46xx driver,EMU10K1/EMU10K2 driver
#   C:ICE1712 driver,ICE1724 driver,KORG1212 driver,MIXART driver
#   C:NM256 driver,RME HDSP driver,RME9652 driver,Trident driver
#   C:Digigram VX222 driver,YMFPCI driver,Sound Core PDAudioCF driver
#   C:Digigram VX Pocket driver,PPC PowerMac driver,SPARC AMD7930 driver
#   C:SPARC cs4231 driver,USB generic driver
#   A:Takashi Iwai <tiwai@suse.de>
#   F:Documentation/DocBook/writing-an-alsa-driver.tmpl:1.24->1.25 
#   F:arm/sa11xx-uda1341.c:1.13->1.14 
#   F:core/memalloc.c:1.28->1.29 
#   F:core/pcm_memory.c:1.25->1.26 
#   F:core/rawmidi.c:1.41->1.42 
#   F:core/rtctimer.c:1.19->1.20 
#   F:core/sound.c:1.59->1.60 
#   F:core/timer.c:1.56->1.57 
#   F:core/oss/pcm_oss.c:1.66->1.67 
#   F:core/seq/seq.c:1.9->1.10 
#   F:core/seq/seq_dummy.c:1.10->1.11 
#   F:core/seq/seq_midi.c:1.18->1.19 
#   F:core/seq/oss/seq_oss.c:1.11->1.12 
#   F:core/seq/oss/seq_oss_init.c:1.11->1.12 
#   F:drivers/dummy.c:1.26->1.27 
#   F:drivers/mtpav.c:1.26->1.27 
#   F:drivers/serial-u16550.c:1.25->1.26 
#   F:drivers/virmidi.c:1.11->1.12 
#   F:drivers/mpu401/mpu401.c:1.16->1.17 
#   F:drivers/opl3/opl3_seq.c:1.12->1.13 
#   F:drivers/opl4/opl4_seq.c:1.2->1.3 
#   F:include/initval.h:1.19->1.20 
#   F:isa/als100.c:1.24->1.25 
#   F:isa/azt2320.c:1.24->1.25 
#   F:isa/cmi8330.c:1.28->1.29 
#   F:isa/dt019x.c:1.18->1.19 
#   F:isa/es18xx.c:1.44->1.45 
#   F:isa/opl3sa2.c:1.32->1.33 
#   F:isa/sgalaxy.c:1.19->1.20 
#   F:isa/sscape.c:1.11->1.12 
#   F:isa/ad1816a/ad1816a.c:1.18->1.19 
#   F:isa/ad1848/ad1848.c:1.10->1.11 
#   F:isa/cs423x/cs4231.c:1.12->1.13 
#   F:isa/cs423x/cs4236.c:1.41->1.42 
#   F:isa/cs423x/pc98.c:1.7->1.8 
#   F:isa/es1688/es1688.c:1.14->1.15 
#   F:isa/gus/gusclassic.c:1.13->1.14 
#   F:isa/gus/gusextreme.c:1.15->1.16 
#   F:isa/gus/gusmax.c:1.14->1.15 
#   F:isa/gus/interwave.c:1.32->1.33 
#   F:isa/opti9xx/opti92x-ad1848.c:1.42->1.43 
#   F:isa/sb/emu8000_patch.c:1.8->1.9 
#   F:isa/sb/es968.c:1.24->1.25 
#   F:isa/sb/sb16.c:1.45->1.46 
#   F:isa/sb/sb8.c:1.18->1.19 
#   F:isa/wavefront/wavefront.c:1.27->1.28 
#   F:isa/wavefront/wavefront_synth.c:1.14->1.15 
#   F:parisc/harmony.c:1.5->1.6 
#   F:pci/als4000.c:1.31->1.32 
#   F:pci/atiixp.c:1.2->1.3 
#   F:pci/azt3328.c:1.11->1.12 
#   F:pci/bt87x.c:1.3->1.4 
#   F:pci/cmipci.c:1.61->1.62 
#   F:pci/cs4281.c:1.50->1.51 
#   F:pci/ens1370.c:1.58->1.59 
#   F:pci/es1938.c:1.33->1.34 
#   F:pci/es1968.c:1.61->1.62 
#   F:pci/fm801.c:1.43->1.44 
#   F:pci/intel8x0.c:1.130->1.131 
#   F:pci/intel8x0m.c:1.1->1.2 
#   F:pci/maestro3.c:1.48->1.49 
#   F:pci/rme32.c:1.31->1.32 
#   F:pci/rme96.c:1.33->1.34 
#   F:pci/sonicvibes.c:1.33->1.34 
#   F:pci/via82xx.c:1.94->1.95 
#   F:pci/ac97/ac97_codec.c:1.127->1.128 
#   F:pci/ali5451/ali5451.c:1.43->1.44 
#   F:pci/au88x0/au88x0.c:1.6->1.7 
#   F:pci/cs46xx/cs46xx.c:1.24->1.25 
#   F:pci/emu10k1/emu10k1.c:1.22->1.23 
#   F:pci/ice1712/ice1712.c:1.47->1.48 
#   F:pci/ice1712/ice1724.c:1.27->1.28 
#   F:pci/korg1212/korg1212.c:1.36->1.37 
#   F:pci/mixart/mixart.c:1.6->1.7 
#   F:pci/nm256/nm256.c:1.33->1.34 
#   F:pci/rme9652/hdsp.c:1.54->1.55 
#   F:pci/rme9652/rme9652.c:1.42->1.43 
#   F:pci/trident/trident.c:1.21->1.22 
#   F:pci/vx222/vx222.c:1.3->1.4 
#   F:pci/ymfpci/ymfpci.c:1.33->1.34 
#   F:pcmcia/pdaudiocf/pdaudiocf.c:1.4->1.5 
#   F:pcmcia/vx/vxpocket.c:1.3->1.4 
#   F:ppc/powermac.c:1.15->1.16 
#   F:sparc/amd7930.c:1.8->1.9 
#   F:sparc/cs4231.c:1.12->1.13 
#   F:usb/usbaudio.c:1.96->1.97 
#   L:use the new module_param*() functions.
# 
# sound/pci/fm801.c
#   2004/04/07 12:48:16+02:00 perex@suse.cz +6 -27
#   ALSA CVS update
#   D:2004/04/07 18:48:10
#   C:Documentation,SA11xx UDA1341 driver,Memalloc module,PCM Midlevel
#   C:RawMidi Midlevel,RTC timer driver,ALSA Core,Timer Midlevel
#   C:ALSA<-OSS emulation,ALSA sequencer,ALSA<-OSS sequencer,Generic drivers
#   C:MPU401 UART,OPL3,OPL4,ALS100 driver,AZT2320 driver,CMI8330 driver
#   C:DT019x driver,ES18xx driver,OPL3SA2 driver,Sound Galaxy driver
#   C:Sound Scape driver,AD1816A driver,AD1848 driver,CS4231 driver
#   C:CS4236+ driver,PC98(CS423x) driver,ES1688 driver,GUS Classic driver
#   C:GUS Extreme driver,GUS MAX driver,AMD InterWave driver,Opti9xx drivers
#   C:EMU8000 driver,ES968 driver,SB16/AWE driver,SB8 driver
#   C:Wavefront drivers,PARISC Harmony driver,ALS4000 driver,ATIIXP driver
#   C:AZT3328 driver,BT87x driver,CMIPCI driver,CS4281 driver
#   C:ENS1370/1+ driver,ES1938 driver,ES1968 driver,FM801 driver
#   C:Intel8x0 driver,Intel8x0-modem driver,Maestro3 driver,RME32 driver
#   C:RME96 driver,SonicVibes driver,VIA82xx driver,AC97 Codec Core
#   C:ALI5451 driver,au88x0 driver,CS46xx driver,EMU10K1/EMU10K2 driver
#   C:ICE1712 driver,ICE1724 driver,KORG1212 driver,MIXART driver
#   C:NM256 driver,RME HDSP driver,RME9652 driver,Trident driver
#   C:Digigram VX222 driver,YMFPCI driver,Sound Core PDAudioCF driver
#   C:Digigram VX Pocket driver,PPC PowerMac driver,SPARC AMD7930 driver
#   C:SPARC cs4231 driver,USB generic driver
#   A:Takashi Iwai <tiwai@suse.de>
#   F:Documentation/DocBook/writing-an-alsa-driver.tmpl:1.24->1.25 
#   F:arm/sa11xx-uda1341.c:1.13->1.14 
#   F:core/memalloc.c:1.28->1.29 
#   F:core/pcm_memory.c:1.25->1.26 
#   F:core/rawmidi.c:1.41->1.42 
#   F:core/rtctimer.c:1.19->1.20 
#   F:core/sound.c:1.59->1.60 
#   F:core/timer.c:1.56->1.57 
#   F:core/oss/pcm_oss.c:1.66->1.67 
#   F:core/seq/seq.c:1.9->1.10 
#   F:core/seq/seq_dummy.c:1.10->1.11 
#   F:core/seq/seq_midi.c:1.18->1.19 
#   F:core/seq/oss/seq_oss.c:1.11->1.12 
#   F:core/seq/oss/seq_oss_init.c:1.11->1.12 
#   F:drivers/dummy.c:1.26->1.27 
#   F:drivers/mtpav.c:1.26->1.27 
#   F:drivers/serial-u16550.c:1.25->1.26 
#   F:drivers/virmidi.c:1.11->1.12 
#   F:drivers/mpu401/mpu401.c:1.16->1.17 
#   F:drivers/opl3/opl3_seq.c:1.12->1.13 
#   F:drivers/opl4/opl4_seq.c:1.2->1.3 
#   F:include/initval.h:1.19->1.20 
#   F:isa/als100.c:1.24->1.25 
#   F:isa/azt2320.c:1.24->1.25 
#   F:isa/cmi8330.c:1.28->1.29 
#   F:isa/dt019x.c:1.18->1.19 
#   F:isa/es18xx.c:1.44->1.45 
#   F:isa/opl3sa2.c:1.32->1.33 
#   F:isa/sgalaxy.c:1.19->1.20 
#   F:isa/sscape.c:1.11->1.12 
#   F:isa/ad1816a/ad1816a.c:1.18->1.19 
#   F:isa/ad1848/ad1848.c:1.10->1.11 
#   F:isa/cs423x/cs4231.c:1.12->1.13 
#   F:isa/cs423x/cs4236.c:1.41->1.42 
#   F:isa/cs423x/pc98.c:1.7->1.8 
#   F:isa/es1688/es1688.c:1.14->1.15 
#   F:isa/gus/gusclassic.c:1.13->1.14 
#   F:isa/gus/gusextreme.c:1.15->1.16 
#   F:isa/gus/gusmax.c:1.14->1.15 
#   F:isa/gus/interwave.c:1.32->1.33 
#   F:isa/opti9xx/opti92x-ad1848.c:1.42->1.43 
#   F:isa/sb/emu8000_patch.c:1.8->1.9 
#   F:isa/sb/es968.c:1.24->1.25 
#   F:isa/sb/sb16.c:1.45->1.46 
#   F:isa/sb/sb8.c:1.18->1.19 
#   F:isa/wavefront/wavefront.c:1.27->1.28 
#   F:isa/wavefront/wavefront_synth.c:1.14->1.15 
#   F:parisc/harmony.c:1.5->1.6 
#   F:pci/als4000.c:1.31->1.32 
#   F:pci/atiixp.c:1.2->1.3 
#   F:pci/azt3328.c:1.11->1.12 
#   F:pci/bt87x.c:1.3->1.4 
#   F:pci/cmipci.c:1.61->1.62 
#   F:pci/cs4281.c:1.50->1.51 
#   F:pci/ens1370.c:1.58->1.59 
#   F:pci/es1938.c:1.33->1.34 
#   F:pci/es1968.c:1.61->1.62 
#   F:pci/fm801.c:1.43->1.44 
#   F:pci/intel8x0.c:1.130->1.131 
#   F:pci/intel8x0m.c:1.1->1.2 
#   F:pci/maestro3.c:1.48->1.49 
#   F:pci/rme32.c:1.31->1.32 
#   F:pci/rme96.c:1.33->1.34 
#   F:pci/sonicvibes.c:1.33->1.34 
#   F:pci/via82xx.c:1.94->1.95 
#   F:pci/ac97/ac97_codec.c:1.127->1.128 
#   F:pci/ali5451/ali5451.c:1.43->1.44 
#   F:pci/au88x0/au88x0.c:1.6->1.7 
#   F:pci/cs46xx/cs46xx.c:1.24->1.25 
#   F:pci/emu10k1/emu10k1.c:1.22->1.23 
#   F:pci/ice1712/ice1712.c:1.47->1.48 
#   F:pci/ice1712/ice1724.c:1.27->1.28 
#   F:pci/korg1212/korg1212.c:1.36->1.37 
#   F:pci/mixart/mixart.c:1.6->1.7 
#   F:pci/nm256/nm256.c:1.33->1.34 
#   F:pci/rme9652/hdsp.c:1.54->1.55 
#   F:pci/rme9652/rme9652.c:1.42->1.43 
#   F:pci/trident/trident.c:1.21->1.22 
#   F:pci/vx222/vx222.c:1.3->1.4 
#   F:pci/ymfpci/ymfpci.c:1.33->1.34 
#   F:pcmcia/pdaudiocf/pdaudiocf.c:1.4->1.5 
#   F:pcmcia/vx/vxpocket.c:1.3->1.4 
#   F:ppc/powermac.c:1.15->1.16 
#   F:sparc/amd7930.c:1.8->1.9 
#   F:sparc/cs4231.c:1.12->1.13 
#   F:usb/usbaudio.c:1.96->1.97 
#   L:use the new module_param*() functions.
# 
# sound/pci/es1968.c
#   2004/04/07 12:48:16+02:00 perex@suse.cz +14 -52
#   ALSA CVS update
#   D:2004/04/07 18:48:10
#   C:Documentation,SA11xx UDA1341 driver,Memalloc module,PCM Midlevel
#   C:RawMidi Midlevel,RTC timer driver,ALSA Core,Timer Midlevel
#   C:ALSA<-OSS emulation,ALSA sequencer,ALSA<-OSS sequencer,Generic drivers
#   C:MPU401 UART,OPL3,OPL4,ALS100 driver,AZT2320 driver,CMI8330 driver
#   C:DT019x driver,ES18xx driver,OPL3SA2 driver,Sound Galaxy driver
#   C:Sound Scape driver,AD1816A driver,AD1848 driver,CS4231 driver
#   C:CS4236+ driver,PC98(CS423x) driver,ES1688 driver,GUS Classic driver
#   C:GUS Extreme driver,GUS MAX driver,AMD InterWave driver,Opti9xx drivers
#   C:EMU8000 driver,ES968 driver,SB16/AWE driver,SB8 driver
#   C:Wavefront drivers,PARISC Harmony driver,ALS4000 driver,ATIIXP driver
#   C:AZT3328 driver,BT87x driver,CMIPCI driver,CS4281 driver
#   C:ENS1370/1+ driver,ES1938 driver,ES1968 driver,FM801 driver
#   C:Intel8x0 driver,Intel8x0-modem driver,Maestro3 driver,RME32 driver
#   C:RME96 driver,SonicVibes driver,VIA82xx driver,AC97 Codec Core
#   C:ALI5451 driver,au88x0 driver,CS46xx driver,EMU10K1/EMU10K2 driver
#   C:ICE1712 driver,ICE1724 driver,KORG1212 driver,MIXART driver
#   C:NM256 driver,RME HDSP driver,RME9652 driver,Trident driver
#   C:Digigram VX222 driver,YMFPCI driver,Sound Core PDAudioCF driver
#   C:Digigram VX Pocket driver,PPC PowerMac driver,SPARC AMD7930 driver
#   C:SPARC cs4231 driver,USB generic driver
#   A:Takashi Iwai <tiwai@suse.de>
#   F:Documentation/DocBook/writing-an-alsa-driver.tmpl:1.24->1.25 
#   F:arm/sa11xx-uda1341.c:1.13->1.14 
#   F:core/memalloc.c:1.28->1.29 
#   F:core/pcm_memory.c:1.25->1.26 
#   F:core/rawmidi.c:1.41->1.42 
#   F:core/rtctimer.c:1.19->1.20 
#   F:core/sound.c:1.59->1.60 
#   F:core/timer.c:1.56->1.57 
#   F:core/oss/pcm_oss.c:1.66->1.67 
#   F:core/seq/seq.c:1.9->1.10 
#   F:core/seq/seq_dummy.c:1.10->1.11 
#   F:core/seq/seq_midi.c:1.18->1.19 
#   F:core/seq/oss/seq_oss.c:1.11->1.12 
#   F:core/seq/oss/seq_oss_init.c:1.11->1.12 
#   F:drivers/dummy.c:1.26->1.27 
#   F:drivers/mtpav.c:1.26->1.27 
#   F:drivers/serial-u16550.c:1.25->1.26 
#   F:drivers/virmidi.c:1.11->1.12 
#   F:drivers/mpu401/mpu401.c:1.16->1.17 
#   F:drivers/opl3/opl3_seq.c:1.12->1.13 
#   F:drivers/opl4/opl4_seq.c:1.2->1.3 
#   F:include/initval.h:1.19->1.20 
#   F:isa/als100.c:1.24->1.25 
#   F:isa/azt2320.c:1.24->1.25 
#   F:isa/cmi8330.c:1.28->1.29 
#   F:isa/dt019x.c:1.18->1.19 
#   F:isa/es18xx.c:1.44->1.45 
#   F:isa/opl3sa2.c:1.32->1.33 
#   F:isa/sgalaxy.c:1.19->1.20 
#   F:isa/sscape.c:1.11->1.12 
#   F:isa/ad1816a/ad1816a.c:1.18->1.19 
#   F:isa/ad1848/ad1848.c:1.10->1.11 
#   F:isa/cs423x/cs4231.c:1.12->1.13 
#   F:isa/cs423x/cs4236.c:1.41->1.42 
#   F:isa/cs423x/pc98.c:1.7->1.8 
#   F:isa/es1688/es1688.c:1.14->1.15 
#   F:isa/gus/gusclassic.c:1.13->1.14 
#   F:isa/gus/gusextreme.c:1.15->1.16 
#   F:isa/gus/gusmax.c:1.14->1.15 
#   F:isa/gus/interwave.c:1.32->1.33 
#   F:isa/opti9xx/opti92x-ad1848.c:1.42->1.43 
#   F:isa/sb/emu8000_patch.c:1.8->1.9 
#   F:isa/sb/es968.c:1.24->1.25 
#   F:isa/sb/sb16.c:1.45->1.46 
#   F:isa/sb/sb8.c:1.18->1.19 
#   F:isa/wavefront/wavefront.c:1.27->1.28 
#   F:isa/wavefront/wavefront_synth.c:1.14->1.15 
#   F:parisc/harmony.c:1.5->1.6 
#   F:pci/als4000.c:1.31->1.32 
#   F:pci/atiixp.c:1.2->1.3 
#   F:pci/azt3328.c:1.11->1.12 
#   F:pci/bt87x.c:1.3->1.4 
#   F:pci/cmipci.c:1.61->1.62 
#   F:pci/cs4281.c:1.50->1.51 
#   F:pci/ens1370.c:1.58->1.59 
#   F:pci/es1938.c:1.33->1.34 
#   F:pci/es1968.c:1.61->1.62 
#   F:pci/fm801.c:1.43->1.44 
#   F:pci/intel8x0.c:1.130->1.131 
#   F:pci/intel8x0m.c:1.1->1.2 
#   F:pci/maestro3.c:1.48->1.49 
#   F:pci/rme32.c:1.31->1.32 
#   F:pci/rme96.c:1.33->1.34 
#   F:pci/sonicvibes.c:1.33->1.34 
#   F:pci/via82xx.c:1.94->1.95 
#   F:pci/ac97/ac97_codec.c:1.127->1.128 
#   F:pci/ali5451/ali5451.c:1.43->1.44 
#   F:pci/au88x0/au88x0.c:1.6->1.7 
#   F:pci/cs46xx/cs46xx.c:1.24->1.25 
#   F:pci/emu10k1/emu10k1.c:1.22->1.23 
#   F:pci/ice1712/ice1712.c:1.47->1.48 
#   F:pci/ice1712/ice1724.c:1.27->1.28 
#   F:pci/korg1212/korg1212.c:1.36->1.37 
#   F:pci/mixart/mixart.c:1.6->1.7 
#   F:pci/nm256/nm256.c:1.33->1.34 
#   F:pci/rme9652/hdsp.c:1.54->1.55 
#   F:pci/rme9652/rme9652.c:1.42->1.43 
#   F:pci/trident/trident.c:1.21->1.22 
#   F:pci/vx222/vx222.c:1.3->1.4 
#   F:pci/ymfpci/ymfpci.c:1.33->1.34 
#   F:pcmcia/pdaudiocf/pdaudiocf.c:1.4->1.5 
#   F:pcmcia/vx/vxpocket.c:1.3->1.4 
#   F:ppc/powermac.c:1.15->1.16 
#   F:sparc/amd7930.c:1.8->1.9 
#   F:sparc/cs4231.c:1.12->1.13 
#   F:usb/usbaudio.c:1.96->1.97 
#   L:use the new module_param*() functions.
# 
# sound/pci/es1938.c
#   2004/04/07 12:48:16+02:00 perex@suse.cz +5 -25
#   ALSA CVS update
#   D:2004/04/07 18:48:10
#   C:Documentation,SA11xx UDA1341 driver,Memalloc module,PCM Midlevel
#   C:RawMidi Midlevel,RTC timer driver,ALSA Core,Timer Midlevel
#   C:ALSA<-OSS emulation,ALSA sequencer,ALSA<-OSS sequencer,Generic drivers
#   C:MPU401 UART,OPL3,OPL4,ALS100 driver,AZT2320 driver,CMI8330 driver
#   C:DT019x driver,ES18xx driver,OPL3SA2 driver,Sound Galaxy driver
#   C:Sound Scape driver,AD1816A driver,AD1848 driver,CS4231 driver
#   C:CS4236+ driver,PC98(CS423x) driver,ES1688 driver,GUS Classic driver
#   C:GUS Extreme driver,GUS MAX driver,AMD InterWave driver,Opti9xx drivers
#   C:EMU8000 driver,ES968 driver,SB16/AWE driver,SB8 driver
#   C:Wavefront drivers,PARISC Harmony driver,ALS4000 driver,ATIIXP driver
#   C:AZT3328 driver,BT87x driver,CMIPCI driver,CS4281 driver
#   C:ENS1370/1+ driver,ES1938 driver,ES1968 driver,FM801 driver
#   C:Intel8x0 driver,Intel8x0-modem driver,Maestro3 driver,RME32 driver
#   C:RME96 driver,SonicVibes driver,VIA82xx driver,AC97 Codec Core
#   C:ALI5451 driver,au88x0 driver,CS46xx driver,EMU10K1/EMU10K2 driver
#   C:ICE1712 driver,ICE1724 driver,KORG1212 driver,MIXART driver
#   C:NM256 driver,RME HDSP driver,RME9652 driver,Trident driver
#   C:Digigram VX222 driver,YMFPCI driver,Sound Core PDAudioCF driver
#   C:Digigram VX Pocket driver,PPC PowerMac driver,SPARC AMD7930 driver
#   C:SPARC cs4231 driver,USB generic driver
#   A:Takashi Iwai <tiwai@suse.de>
#   F:Documentation/DocBook/writing-an-alsa-driver.tmpl:1.24->1.25 
#   F:arm/sa11xx-uda1341.c:1.13->1.14 
#   F:core/memalloc.c:1.28->1.29 
#   F:core/pcm_memory.c:1.25->1.26 
#   F:core/rawmidi.c:1.41->1.42 
#   F:core/rtctimer.c:1.19->1.20 
#   F:core/sound.c:1.59->1.60 
#   F:core/timer.c:1.56->1.57 
#   F:core/oss/pcm_oss.c:1.66->1.67 
#   F:core/seq/seq.c:1.9->1.10 
#   F:core/seq/seq_dummy.c:1.10->1.11 
#   F:core/seq/seq_midi.c:1.18->1.19 
#   F:core/seq/oss/seq_oss.c:1.11->1.12 
#   F:core/seq/oss/seq_oss_init.c:1.11->1.12 
#   F:drivers/dummy.c:1.26->1.27 
#   F:drivers/mtpav.c:1.26->1.27 
#   F:drivers/serial-u16550.c:1.25->1.26 
#   F:drivers/virmidi.c:1.11->1.12 
#   F:drivers/mpu401/mpu401.c:1.16->1.17 
#   F:drivers/opl3/opl3_seq.c:1.12->1.13 
#   F:drivers/opl4/opl4_seq.c:1.2->1.3 
#   F:include/initval.h:1.19->1.20 
#   F:isa/als100.c:1.24->1.25 
#   F:isa/azt2320.c:1.24->1.25 
#   F:isa/cmi8330.c:1.28->1.29 
#   F:isa/dt019x.c:1.18->1.19 
#   F:isa/es18xx.c:1.44->1.45 
#   F:isa/opl3sa2.c:1.32->1.33 
#   F:isa/sgalaxy.c:1.19->1.20 
#   F:isa/sscape.c:1.11->1.12 
#   F:isa/ad1816a/ad1816a.c:1.18->1.19 
#   F:isa/ad1848/ad1848.c:1.10->1.11 
#   F:isa/cs423x/cs4231.c:1.12->1.13 
#   F:isa/cs423x/cs4236.c:1.41->1.42 
#   F:isa/cs423x/pc98.c:1.7->1.8 
#   F:isa/es1688/es1688.c:1.14->1.15 
#   F:isa/gus/gusclassic.c:1.13->1.14 
#   F:isa/gus/gusextreme.c:1.15->1.16 
#   F:isa/gus/gusmax.c:1.14->1.15 
#   F:isa/gus/interwave.c:1.32->1.33 
#   F:isa/opti9xx/opti92x-ad1848.c:1.42->1.43 
#   F:isa/sb/emu8000_patch.c:1.8->1.9 
#   F:isa/sb/es968.c:1.24->1.25 
#   F:isa/sb/sb16.c:1.45->1.46 
#   F:isa/sb/sb8.c:1.18->1.19 
#   F:isa/wavefront/wavefront.c:1.27->1.28 
#   F:isa/wavefront/wavefront_synth.c:1.14->1.15 
#   F:parisc/harmony.c:1.5->1.6 
#   F:pci/als4000.c:1.31->1.32 
#   F:pci/atiixp.c:1.2->1.3 
#   F:pci/azt3328.c:1.11->1.12 
#   F:pci/bt87x.c:1.3->1.4 
#   F:pci/cmipci.c:1.61->1.62 
#   F:pci/cs4281.c:1.50->1.51 
#   F:pci/ens1370.c:1.58->1.59 
#   F:pci/es1938.c:1.33->1.34 
#   F:pci/es1968.c:1.61->1.62 
#   F:pci/fm801.c:1.43->1.44 
#   F:pci/intel8x0.c:1.130->1.131 
#   F:pci/intel8x0m.c:1.1->1.2 
#   F:pci/maestro3.c:1.48->1.49 
#   F:pci/rme32.c:1.31->1.32 
#   F:pci/rme96.c:1.33->1.34 
#   F:pci/sonicvibes.c:1.33->1.34 
#   F:pci/via82xx.c:1.94->1.95 
#   F:pci/ac97/ac97_codec.c:1.127->1.128 
#   F:pci/ali5451/ali5451.c:1.43->1.44 
#   F:pci/au88x0/au88x0.c:1.6->1.7 
#   F:pci/cs46xx/cs46xx.c:1.24->1.25 
#   F:pci/emu10k1/emu10k1.c:1.22->1.23 
#   F:pci/ice1712/ice1712.c:1.47->1.48 
#   F:pci/ice1712/ice1724.c:1.27->1.28 
#   F:pci/korg1212/korg1212.c:1.36->1.37 
#   F:pci/mixart/mixart.c:1.6->1.7 
#   F:pci/nm256/nm256.c:1.33->1.34 
#   F:pci/rme9652/hdsp.c:1.54->1.55 
#   F:pci/rme9652/rme9652.c:1.42->1.43 
#   F:pci/trident/trident.c:1.21->1.22 
#   F:pci/vx222/vx222.c:1.3->1.4 
#   F:pci/ymfpci/ymfpci.c:1.33->1.34 
#   F:pcmcia/pdaudiocf/pdaudiocf.c:1.4->1.5 
#   F:pcmcia/vx/vxpocket.c:1.3->1.4 
#   F:ppc/powermac.c:1.15->1.16 
#   F:sparc/amd7930.c:1.8->1.9 
#   F:sparc/cs4231.c:1.12->1.13 
#   F:usb/usbaudio.c:1.96->1.97 
#   L:use the new module_param*() functions.
# 
# sound/pci/ens1370.c
#   2004/04/07 12:48:16+02:00 perex@suse.cz +7 -39
#   ALSA CVS update
#   D:2004/04/07 18:48:10
#   C:Documentation,SA11xx UDA1341 driver,Memalloc module,PCM Midlevel
#   C:RawMidi Midlevel,RTC timer driver,ALSA Core,Timer Midlevel
#   C:ALSA<-OSS emulation,ALSA sequencer,ALSA<-OSS sequencer,Generic drivers
#   C:MPU401 UART,OPL3,OPL4,ALS100 driver,AZT2320 driver,CMI8330 driver
#   C:DT019x driver,ES18xx driver,OPL3SA2 driver,Sound Galaxy driver
#   C:Sound Scape driver,AD1816A driver,AD1848 driver,CS4231 driver
#   C:CS4236+ driver,PC98(CS423x) driver,ES1688 driver,GUS Classic driver
#   C:GUS Extreme driver,GUS MAX driver,AMD InterWave driver,Opti9xx drivers
#   C:EMU8000 driver,ES968 driver,SB16/AWE driver,SB8 driver
#   C:Wavefront drivers,PARISC Harmony driver,ALS4000 driver,ATIIXP driver
#   C:AZT3328 driver,BT87x driver,CMIPCI driver,CS4281 driver
#   C:ENS1370/1+ driver,ES1938 driver,ES1968 driver,FM801 driver
#   C:Intel8x0 driver,Intel8x0-modem driver,Maestro3 driver,RME32 driver
#   C:RME96 driver,SonicVibes driver,VIA82xx driver,AC97 Codec Core
#   C:ALI5451 driver,au88x0 driver,CS46xx driver,EMU10K1/EMU10K2 driver
#   C:ICE1712 driver,ICE1724 driver,KORG1212 driver,MIXART driver
#   C:NM256 driver,RME HDSP driver,RME9652 driver,Trident driver
#   C:Digigram VX222 driver,YMFPCI driver,Sound Core PDAudioCF driver
#   C:Digigram VX Pocket driver,PPC PowerMac driver,SPARC AMD7930 driver
#   C:SPARC cs4231 driver,USB generic driver
#   A:Takashi Iwai <tiwai@suse.de>
#   F:Documentation/DocBook/writing-an-alsa-driver.tmpl:1.24->1.25 
#   F:arm/sa11xx-uda1341.c:1.13->1.14 
#   F:core/memalloc.c:1.28->1.29 
#   F:core/pcm_memory.c:1.25->1.26 
#   F:core/rawmidi.c:1.41->1.42 
#   F:core/rtctimer.c:1.19->1.20 
#   F:core/sound.c:1.59->1.60 
#   F:core/timer.c:1.56->1.57 
#   F:core/oss/pcm_oss.c:1.66->1.67 
#   F:core/seq/seq.c:1.9->1.10 
#   F:core/seq/seq_dummy.c:1.10->1.11 
#   F:core/seq/seq_midi.c:1.18->1.19 
#   F:core/seq/oss/seq_oss.c:1.11->1.12 
#   F:core/seq/oss/seq_oss_init.c:1.11->1.12 
#   F:drivers/dummy.c:1.26->1.27 
#   F:drivers/mtpav.c:1.26->1.27 
#   F:drivers/serial-u16550.c:1.25->1.26 
#   F:drivers/virmidi.c:1.11->1.12 
#   F:drivers/mpu401/mpu401.c:1.16->1.17 
#   F:drivers/opl3/opl3_seq.c:1.12->1.13 
#   F:drivers/opl4/opl4_seq.c:1.2->1.3 
#   F:include/initval.h:1.19->1.20 
#   F:isa/als100.c:1.24->1.25 
#   F:isa/azt2320.c:1.24->1.25 
#   F:isa/cmi8330.c:1.28->1.29 
#   F:isa/dt019x.c:1.18->1.19 
#   F:isa/es18xx.c:1.44->1.45 
#   F:isa/opl3sa2.c:1.32->1.33 
#   F:isa/sgalaxy.c:1.19->1.20 
#   F:isa/sscape.c:1.11->1.12 
#   F:isa/ad1816a/ad1816a.c:1.18->1.19 
#   F:isa/ad1848/ad1848.c:1.10->1.11 
#   F:isa/cs423x/cs4231.c:1.12->1.13 
#   F:isa/cs423x/cs4236.c:1.41->1.42 
#   F:isa/cs423x/pc98.c:1.7->1.8 
#   F:isa/es1688/es1688.c:1.14->1.15 
#   F:isa/gus/gusclassic.c:1.13->1.14 
#   F:isa/gus/gusextreme.c:1.15->1.16 
#   F:isa/gus/gusmax.c:1.14->1.15 
#   F:isa/gus/interwave.c:1.32->1.33 
#   F:isa/opti9xx/opti92x-ad1848.c:1.42->1.43 
#   F:isa/sb/emu8000_patch.c:1.8->1.9 
#   F:isa/sb/es968.c:1.24->1.25 
#   F:isa/sb/sb16.c:1.45->1.46 
#   F:isa/sb/sb8.c:1.18->1.19 
#   F:isa/wavefront/wavefront.c:1.27->1.28 
#   F:isa/wavefront/wavefront_synth.c:1.14->1.15 
#   F:parisc/harmony.c:1.5->1.6 
#   F:pci/als4000.c:1.31->1.32 
#   F:pci/atiixp.c:1.2->1.3 
#   F:pci/azt3328.c:1.11->1.12 
#   F:pci/bt87x.c:1.3->1.4 
#   F:pci/cmipci.c:1.61->1.62 
#   F:pci/cs4281.c:1.50->1.51 
#   F:pci/ens1370.c:1.58->1.59 
#   F:pci/es1938.c:1.33->1.34 
#   F:pci/es1968.c:1.61->1.62 
#   F:pci/fm801.c:1.43->1.44 
#   F:pci/intel8x0.c:1.130->1.131 
#   F:pci/intel8x0m.c:1.1->1.2 
#   F:pci/maestro3.c:1.48->1.49 
#   F:pci/rme32.c:1.31->1.32 
#   F:pci/rme96.c:1.33->1.34 
#   F:pci/sonicvibes.c:1.33->1.34 
#   F:pci/via82xx.c:1.94->1.95 
#   F:pci/ac97/ac97_codec.c:1.127->1.128 
#   F:pci/ali5451/ali5451.c:1.43->1.44 
#   F:pci/au88x0/au88x0.c:1.6->1.7 
#   F:pci/cs46xx/cs46xx.c:1.24->1.25 
#   F:pci/emu10k1/emu10k1.c:1.22->1.23 
#   F:pci/ice1712/ice1712.c:1.47->1.48 
#   F:pci/ice1712/ice1724.c:1.27->1.28 
#   F:pci/korg1212/korg1212.c:1.36->1.37 
#   F:pci/mixart/mixart.c:1.6->1.7 
#   F:pci/nm256/nm256.c:1.33->1.34 
#   F:pci/rme9652/hdsp.c:1.54->1.55 
#   F:pci/rme9652/rme9652.c:1.42->1.43 
#   F:pci/trident/trident.c:1.21->1.22 
#   F:pci/vx222/vx222.c:1.3->1.4 
#   F:pci/ymfpci/ymfpci.c:1.33->1.34 
#   F:pcmcia/pdaudiocf/pdaudiocf.c:1.4->1.5 
#   F:pcmcia/vx/vxpocket.c:1.3->1.4 
#   F:ppc/powermac.c:1.15->1.16 
#   F:sparc/amd7930.c:1.8->1.9 
#   F:sparc/cs4231.c:1.12->1.13 
#   F:usb/usbaudio.c:1.96->1.97 
#   L:use the new module_param*() functions.
# 
# sound/pci/emu10k1/emu10k1.c
#   2004/04/07 12:48:19+02:00 perex@suse.cz +11 -34
#   ALSA CVS update
#   D:2004/04/07 18:48:10
#   C:Documentation,SA11xx UDA1341 driver,Memalloc module,PCM Midlevel
#   C:RawMidi Midlevel,RTC timer driver,ALSA Core,Timer Midlevel
#   C:ALSA<-OSS emulation,ALSA sequencer,ALSA<-OSS sequencer,Generic drivers
#   C:MPU401 UART,OPL3,OPL4,ALS100 driver,AZT2320 driver,CMI8330 driver
#   C:DT019x driver,ES18xx driver,OPL3SA2 driver,Sound Galaxy driver
#   C:Sound Scape driver,AD1816A driver,AD1848 driver,CS4231 driver
#   C:CS4236+ driver,PC98(CS423x) driver,ES1688 driver,GUS Classic driver
#   C:GUS Extreme driver,GUS MAX driver,AMD InterWave driver,Opti9xx drivers
#   C:EMU8000 driver,ES968 driver,SB16/AWE driver,SB8 driver
#   C:Wavefront drivers,PARISC Harmony driver,ALS4000 driver,ATIIXP driver
#   C:AZT3328 driver,BT87x driver,CMIPCI driver,CS4281 driver
#   C:ENS1370/1+ driver,ES1938 driver,ES1968 driver,FM801 driver
#   C:Intel8x0 driver,Intel8x0-modem driver,Maestro3 driver,RME32 driver
#   C:RME96 driver,SonicVibes driver,VIA82xx driver,AC97 Codec Core
#   C:ALI5451 driver,au88x0 driver,CS46xx driver,EMU10K1/EMU10K2 driver
#   C:ICE1712 driver,ICE1724 driver,KORG1212 driver,MIXART driver
#   C:NM256 driver,RME HDSP driver,RME9652 driver,Trident driver
#   C:Digigram VX222 driver,YMFPCI driver,Sound Core PDAudioCF driver
#   C:Digigram VX Pocket driver,PPC PowerMac driver,SPARC AMD7930 driver
#   C:SPARC cs4231 driver,USB generic driver
#   A:Takashi Iwai <tiwai@suse.de>
#   F:Documentation/DocBook/writing-an-alsa-driver.tmpl:1.24->1.25 
#   F:arm/sa11xx-uda1341.c:1.13->1.14 
#   F:core/memalloc.c:1.28->1.29 
#   F:core/pcm_memory.c:1.25->1.26 
#   F:core/rawmidi.c:1.41->1.42 
#   F:core/rtctimer.c:1.19->1.20 
#   F:core/sound.c:1.59->1.60 
#   F:core/timer.c:1.56->1.57 
#   F:core/oss/pcm_oss.c:1.66->1.67 
#   F:core/seq/seq.c:1.9->1.10 
#   F:core/seq/seq_dummy.c:1.10->1.11 
#   F:core/seq/seq_midi.c:1.18->1.19 
#   F:core/seq/oss/seq_oss.c:1.11->1.12 
#   F:core/seq/oss/seq_oss_init.c:1.11->1.12 
#   F:drivers/dummy.c:1.26->1.27 
#   F:drivers/mtpav.c:1.26->1.27 
#   F:drivers/serial-u16550.c:1.25->1.26 
#   F:drivers/virmidi.c:1.11->1.12 
#   F:drivers/mpu401/mpu401.c:1.16->1.17 
#   F:drivers/opl3/opl3_seq.c:1.12->1.13 
#   F:drivers/opl4/opl4_seq.c:1.2->1.3 
#   F:include/initval.h:1.19->1.20 
#   F:isa/als100.c:1.24->1.25 
#   F:isa/azt2320.c:1.24->1.25 
#   F:isa/cmi8330.c:1.28->1.29 
#   F:isa/dt019x.c:1.18->1.19 
#   F:isa/es18xx.c:1.44->1.45 
#   F:isa/opl3sa2.c:1.32->1.33 
#   F:isa/sgalaxy.c:1.19->1.20 
#   F:isa/sscape.c:1.11->1.12 
#   F:isa/ad1816a/ad1816a.c:1.18->1.19 
#   F:isa/ad1848/ad1848.c:1.10->1.11 
#   F:isa/cs423x/cs4231.c:1.12->1.13 
#   F:isa/cs423x/cs4236.c:1.41->1.42 
#   F:isa/cs423x/pc98.c:1.7->1.8 
#   F:isa/es1688/es1688.c:1.14->1.15 
#   F:isa/gus/gusclassic.c:1.13->1.14 
#   F:isa/gus/gusextreme.c:1.15->1.16 
#   F:isa/gus/gusmax.c:1.14->1.15 
#   F:isa/gus/interwave.c:1.32->1.33 
#   F:isa/opti9xx/opti92x-ad1848.c:1.42->1.43 
#   F:isa/sb/emu8000_patch.c:1.8->1.9 
#   F:isa/sb/es968.c:1.24->1.25 
#   F:isa/sb/sb16.c:1.45->1.46 
#   F:isa/sb/sb8.c:1.18->1.19 
#   F:isa/wavefront/wavefront.c:1.27->1.28 
#   F:isa/wavefront/wavefront_synth.c:1.14->1.15 
#   F:parisc/harmony.c:1.5->1.6 
#   F:pci/als4000.c:1.31->1.32 
#   F:pci/atiixp.c:1.2->1.3 
#   F:pci/azt3328.c:1.11->1.12 
#   F:pci/bt87x.c:1.3->1.4 
#   F:pci/cmipci.c:1.61->1.62 
#   F:pci/cs4281.c:1.50->1.51 
#   F:pci/ens1370.c:1.58->1.59 
#   F:pci/es1938.c:1.33->1.34 
#   F:pci/es1968.c:1.61->1.62 
#   F:pci/fm801.c:1.43->1.44 
#   F:pci/intel8x0.c:1.130->1.131 
#   F:pci/intel8x0m.c:1.1->1.2 
#   F:pci/maestro3.c:1.48->1.49 
#   F:pci/rme32.c:1.31->1.32 
#   F:pci/rme96.c:1.33->1.34 
#   F:pci/sonicvibes.c:1.33->1.34 
#   F:pci/via82xx.c:1.94->1.95 
#   F:pci/ac97/ac97_codec.c:1.127->1.128 
#   F:pci/ali5451/ali5451.c:1.43->1.44 
#   F:pci/au88x0/au88x0.c:1.6->1.7 
#   F:pci/cs46xx/cs46xx.c:1.24->1.25 
#   F:pci/emu10k1/emu10k1.c:1.22->1.23 
#   F:pci/ice1712/ice1712.c:1.47->1.48 
#   F:pci/ice1712/ice1724.c:1.27->1.28 
#   F:pci/korg1212/korg1212.c:1.36->1.37 
#   F:pci/mixart/mixart.c:1.6->1.7 
#   F:pci/nm256/nm256.c:1.33->1.34 
#   F:pci/rme9652/hdsp.c:1.54->1.55 
#   F:pci/rme9652/rme9652.c:1.42->1.43 
#   F:pci/trident/trident.c:1.21->1.22 
#   F:pci/vx222/vx222.c:1.3->1.4 
#   F:pci/ymfpci/ymfpci.c:1.33->1.34 
#   F:pcmcia/pdaudiocf/pdaudiocf.c:1.4->1.5 
#   F:pcmcia/vx/vxpocket.c:1.3->1.4 
#   F:ppc/powermac.c:1.15->1.16 
#   F:sparc/amd7930.c:1.8->1.9 
#   F:sparc/cs4231.c:1.12->1.13 
#   F:usb/usbaudio.c:1.96->1.97 
#   L:use the new module_param*() functions.
# 
# sound/pci/cs46xx/cs46xx.c
#   2004/04/07 12:48:19+02:00 perex@suse.cz +8 -31
#   ALSA CVS update
#   D:2004/04/07 18:48:10
#   C:Documentation,SA11xx UDA1341 driver,Memalloc module,PCM Midlevel
#   C:RawMidi Midlevel,RTC timer driver,ALSA Core,Timer Midlevel
#   C:ALSA<-OSS emulation,ALSA sequencer,ALSA<-OSS sequencer,Generic drivers
#   C:MPU401 UART,OPL3,OPL4,ALS100 driver,AZT2320 driver,CMI8330 driver
#   C:DT019x driver,ES18xx driver,OPL3SA2 driver,Sound Galaxy driver
#   C:Sound Scape driver,AD1816A driver,AD1848 driver,CS4231 driver
#   C:CS4236+ driver,PC98(CS423x) driver,ES1688 driver,GUS Classic driver
#   C:GUS Extreme driver,GUS MAX driver,AMD InterWave driver,Opti9xx drivers
#   C:EMU8000 driver,ES968 driver,SB16/AWE driver,SB8 driver
#   C:Wavefront drivers,PARISC Harmony driver,ALS4000 driver,ATIIXP driver
#   C:AZT3328 driver,BT87x driver,CMIPCI driver,CS4281 driver
#   C:ENS1370/1+ driver,ES1938 driver,ES1968 driver,FM801 driver
#   C:Intel8x0 driver,Intel8x0-modem driver,Maestro3 driver,RME32 driver
#   C:RME96 driver,SonicVibes driver,VIA82xx driver,AC97 Codec Core
#   C:ALI5451 driver,au88x0 driver,CS46xx driver,EMU10K1/EMU10K2 driver
#   C:ICE1712 driver,ICE1724 driver,KORG1212 driver,MIXART driver
#   C:NM256 driver,RME HDSP driver,RME9652 driver,Trident driver
#   C:Digigram VX222 driver,YMFPCI driver,Sound Core PDAudioCF driver
#   C:Digigram VX Pocket driver,PPC PowerMac driver,SPARC AMD7930 driver
#   C:SPARC cs4231 driver,USB generic driver
#   A:Takashi Iwai <tiwai@suse.de>
#   F:Documentation/DocBook/writing-an-alsa-driver.tmpl:1.24->1.25 
#   F:arm/sa11xx-uda1341.c:1.13->1.14 
#   F:core/memalloc.c:1.28->1.29 
#   F:core/pcm_memory.c:1.25->1.26 
#   F:core/rawmidi.c:1.41->1.42 
#   F:core/rtctimer.c:1.19->1.20 
#   F:core/sound.c:1.59->1.60 
#   F:core/timer.c:1.56->1.57 
#   F:core/oss/pcm_oss.c:1.66->1.67 
#   F:core/seq/seq.c:1.9->1.10 
#   F:core/seq/seq_dummy.c:1.10->1.11 
#   F:core/seq/seq_midi.c:1.18->1.19 
#   F:core/seq/oss/seq_oss.c:1.11->1.12 
#   F:core/seq/oss/seq_oss_init.c:1.11->1.12 
#   F:drivers/dummy.c:1.26->1.27 
#   F:drivers/mtpav.c:1.26->1.27 
#   F:drivers/serial-u16550.c:1.25->1.26 
#   F:drivers/virmidi.c:1.11->1.12 
#   F:drivers/mpu401/mpu401.c:1.16->1.17 
#   F:drivers/opl3/opl3_seq.c:1.12->1.13 
#   F:drivers/opl4/opl4_seq.c:1.2->1.3 
#   F:include/initval.h:1.19->1.20 
#   F:isa/als100.c:1.24->1.25 
#   F:isa/azt2320.c:1.24->1.25 
#   F:isa/cmi8330.c:1.28->1.29 
#   F:isa/dt019x.c:1.18->1.19 
#   F:isa/es18xx.c:1.44->1.45 
#   F:isa/opl3sa2.c:1.32->1.33 
#   F:isa/sgalaxy.c:1.19->1.20 
#   F:isa/sscape.c:1.11->1.12 
#   F:isa/ad1816a/ad1816a.c:1.18->1.19 
#   F:isa/ad1848/ad1848.c:1.10->1.11 
#   F:isa/cs423x/cs4231.c:1.12->1.13 
#   F:isa/cs423x/cs4236.c:1.41->1.42 
#   F:isa/cs423x/pc98.c:1.7->1.8 
#   F:isa/es1688/es1688.c:1.14->1.15 
#   F:isa/gus/gusclassic.c:1.13->1.14 
#   F:isa/gus/gusextreme.c:1.15->1.16 
#   F:isa/gus/gusmax.c:1.14->1.15 
#   F:isa/gus/interwave.c:1.32->1.33 
#   F:isa/opti9xx/opti92x-ad1848.c:1.42->1.43 
#   F:isa/sb/emu8000_patch.c:1.8->1.9 
#   F:isa/sb/es968.c:1.24->1.25 
#   F:isa/sb/sb16.c:1.45->1.46 
#   F:isa/sb/sb8.c:1.18->1.19 
#   F:isa/wavefront/wavefront.c:1.27->1.28 
#   F:isa/wavefront/wavefront_synth.c:1.14->1.15 
#   F:parisc/harmony.c:1.5->1.6 
#   F:pci/als4000.c:1.31->1.32 
#   F:pci/atiixp.c:1.2->1.3 
#   F:pci/azt3328.c:1.11->1.12 
#   F:pci/bt87x.c:1.3->1.4 
#   F:pci/cmipci.c:1.61->1.62 
#   F:pci/cs4281.c:1.50->1.51 
#   F:pci/ens1370.c:1.58->1.59 
#   F:pci/es1938.c:1.33->1.34 
#   F:pci/es1968.c:1.61->1.62 
#   F:pci/fm801.c:1.43->1.44 
#   F:pci/intel8x0.c:1.130->1.131 
#   F:pci/intel8x0m.c:1.1->1.2 
#   F:pci/maestro3.c:1.48->1.49 
#   F:pci/rme32.c:1.31->1.32 
#   F:pci/rme96.c:1.33->1.34 
#   F:pci/sonicvibes.c:1.33->1.34 
#   F:pci/via82xx.c:1.94->1.95 
#   F:pci/ac97/ac97_codec.c:1.127->1.128 
#   F:pci/ali5451/ali5451.c:1.43->1.44 
#   F:pci/au88x0/au88x0.c:1.6->1.7 
#   F:pci/cs46xx/cs46xx.c:1.24->1.25 
#   F:pci/emu10k1/emu10k1.c:1.22->1.23 
#   F:pci/ice1712/ice1712.c:1.47->1.48 
#   F:pci/ice1712/ice1724.c:1.27->1.28 
#   F:pci/korg1212/korg1212.c:1.36->1.37 
#   F:pci/mixart/mixart.c:1.6->1.7 
#   F:pci/nm256/nm256.c:1.33->1.34 
#   F:pci/rme9652/hdsp.c:1.54->1.55 
#   F:pci/rme9652/rme9652.c:1.42->1.43 
#   F:pci/trident/trident.c:1.21->1.22 
#   F:pci/vx222/vx222.c:1.3->1.4 
#   F:pci/ymfpci/ymfpci.c:1.33->1.34 
#   F:pcmcia/pdaudiocf/pdaudiocf.c:1.4->1.5 
#   F:pcmcia/vx/vxpocket.c:1.3->1.4 
#   F:ppc/powermac.c:1.15->1.16 
#   F:sparc/amd7930.c:1.8->1.9 
#   F:sparc/cs4231.c:1.12->1.13 
#   F:usb/usbaudio.c:1.96->1.97 
#   L:use the new module_param*() functions.
# 
# sound/pci/cs4281.c
#   2004/04/07 12:48:16+02:00 perex@suse.cz +6 -26
#   ALSA CVS update
#   D:2004/04/07 18:48:10
#   C:Documentation,SA11xx UDA1341 driver,Memalloc module,PCM Midlevel
#   C:RawMidi Midlevel,RTC timer driver,ALSA Core,Timer Midlevel
#   C:ALSA<-OSS emulation,ALSA sequencer,ALSA<-OSS sequencer,Generic drivers
#   C:MPU401 UART,OPL3,OPL4,ALS100 driver,AZT2320 driver,CMI8330 driver
#   C:DT019x driver,ES18xx driver,OPL3SA2 driver,Sound Galaxy driver
#   C:Sound Scape driver,AD1816A driver,AD1848 driver,CS4231 driver
#   C:CS4236+ driver,PC98(CS423x) driver,ES1688 driver,GUS Classic driver
#   C:GUS Extreme driver,GUS MAX driver,AMD InterWave driver,Opti9xx drivers
#   C:EMU8000 driver,ES968 driver,SB16/AWE driver,SB8 driver
#   C:Wavefront drivers,PARISC Harmony driver,ALS4000 driver,ATIIXP driver
#   C:AZT3328 driver,BT87x driver,CMIPCI driver,CS4281 driver
#   C:ENS1370/1+ driver,ES1938 driver,ES1968 driver,FM801 driver
#   C:Intel8x0 driver,Intel8x0-modem driver,Maestro3 driver,RME32 driver
#   C:RME96 driver,SonicVibes driver,VIA82xx driver,AC97 Codec Core
#   C:ALI5451 driver,au88x0 driver,CS46xx driver,EMU10K1/EMU10K2 driver
#   C:ICE1712 driver,ICE1724 driver,KORG1212 driver,MIXART driver
#   C:NM256 driver,RME HDSP driver,RME9652 driver,Trident driver
#   C:Digigram VX222 driver,YMFPCI driver,Sound Core PDAudioCF driver
#   C:Digigram VX Pocket driver,PPC PowerMac driver,SPARC AMD7930 driver
#   C:SPARC cs4231 driver,USB generic driver
#   A:Takashi Iwai <tiwai@suse.de>
#   F:Documentation/DocBook/writing-an-alsa-driver.tmpl:1.24->1.25 
#   F:arm/sa11xx-uda1341.c:1.13->1.14 
#   F:core/memalloc.c:1.28->1.29 
#   F:core/pcm_memory.c:1.25->1.26 
#   F:core/rawmidi.c:1.41->1.42 
#   F:core/rtctimer.c:1.19->1.20 
#   F:core/sound.c:1.59->1.60 
#   F:core/timer.c:1.56->1.57 
#   F:core/oss/pcm_oss.c:1.66->1.67 
#   F:core/seq/seq.c:1.9->1.10 
#   F:core/seq/seq_dummy.c:1.10->1.11 
#   F:core/seq/seq_midi.c:1.18->1.19 
#   F:core/seq/oss/seq_oss.c:1.11->1.12 
#   F:core/seq/oss/seq_oss_init.c:1.11->1.12 
#   F:drivers/dummy.c:1.26->1.27 
#   F:drivers/mtpav.c:1.26->1.27 
#   F:drivers/serial-u16550.c:1.25->1.26 
#   F:drivers/virmidi.c:1.11->1.12 
#   F:drivers/mpu401/mpu401.c:1.16->1.17 
#   F:drivers/opl3/opl3_seq.c:1.12->1.13 
#   F:drivers/opl4/opl4_seq.c:1.2->1.3 
#   F:include/initval.h:1.19->1.20 
#   F:isa/als100.c:1.24->1.25 
#   F:isa/azt2320.c:1.24->1.25 
#   F:isa/cmi8330.c:1.28->1.29 
#   F:isa/dt019x.c:1.18->1.19 
#   F:isa/es18xx.c:1.44->1.45 
#   F:isa/opl3sa2.c:1.32->1.33 
#   F:isa/sgalaxy.c:1.19->1.20 
#   F:isa/sscape.c:1.11->1.12 
#   F:isa/ad1816a/ad1816a.c:1.18->1.19 
#   F:isa/ad1848/ad1848.c:1.10->1.11 
#   F:isa/cs423x/cs4231.c:1.12->1.13 
#   F:isa/cs423x/cs4236.c:1.41->1.42 
#   F:isa/cs423x/pc98.c:1.7->1.8 
#   F:isa/es1688/es1688.c:1.14->1.15 
#   F:isa/gus/gusclassic.c:1.13->1.14 
#   F:isa/gus/gusextreme.c:1.15->1.16 
#   F:isa/gus/gusmax.c:1.14->1.15 
#   F:isa/gus/interwave.c:1.32->1.33 
#   F:isa/opti9xx/opti92x-ad1848.c:1.42->1.43 
#   F:isa/sb/emu8000_patch.c:1.8->1.9 
#   F:isa/sb/es968.c:1.24->1.25 
#   F:isa/sb/sb16.c:1.45->1.46 
#   F:isa/sb/sb8.c:1.18->1.19 
#   F:isa/wavefront/wavefront.c:1.27->1.28 
#   F:isa/wavefront/wavefront_synth.c:1.14->1.15 
#   F:parisc/harmony.c:1.5->1.6 
#   F:pci/als4000.c:1.31->1.32 
#   F:pci/atiixp.c:1.2->1.3 
#   F:pci/azt3328.c:1.11->1.12 
#   F:pci/bt87x.c:1.3->1.4 
#   F:pci/cmipci.c:1.61->1.62 
#   F:pci/cs4281.c:1.50->1.51 
#   F:pci/ens1370.c:1.58->1.59 
#   F:pci/es1938.c:1.33->1.34 
#   F:pci/es1968.c:1.61->1.62 
#   F:pci/fm801.c:1.43->1.44 
#   F:pci/intel8x0.c:1.130->1.131 
#   F:pci/intel8x0m.c:1.1->1.2 
#   F:pci/maestro3.c:1.48->1.49 
#   F:pci/rme32.c:1.31->1.32 
#   F:pci/rme96.c:1.33->1.34 
#   F:pci/sonicvibes.c:1.33->1.34 
#   F:pci/via82xx.c:1.94->1.95 
#   F:pci/ac97/ac97_codec.c:1.127->1.128 
#   F:pci/ali5451/ali5451.c:1.43->1.44 
#   F:pci/au88x0/au88x0.c:1.6->1.7 
#   F:pci/cs46xx/cs46xx.c:1.24->1.25 
#   F:pci/emu10k1/emu10k1.c:1.22->1.23 
#   F:pci/ice1712/ice1712.c:1.47->1.48 
#   F:pci/ice1712/ice1724.c:1.27->1.28 
#   F:pci/korg1212/korg1212.c:1.36->1.37 
#   F:pci/mixart/mixart.c:1.6->1.7 
#   F:pci/nm256/nm256.c:1.33->1.34 
#   F:pci/rme9652/hdsp.c:1.54->1.55 
#   F:pci/rme9652/rme9652.c:1.42->1.43 
#   F:pci/trident/trident.c:1.21->1.22 
#   F:pci/vx222/vx222.c:1.3->1.4 
#   F:pci/ymfpci/ymfpci.c:1.33->1.34 
#   F:pcmcia/pdaudiocf/pdaudiocf.c:1.4->1.5 
#   F:pcmcia/vx/vxpocket.c:1.3->1.4 
#   F:ppc/powermac.c:1.15->1.16 
#   F:sparc/amd7930.c:1.8->1.9 
#   F:sparc/cs4231.c:1.12->1.13 
#   F:usb/usbaudio.c:1.96->1.97 
#   L:use the new module_param*() functions.
# 
# sound/pci/cmipci.c
#   2004/04/07 12:48:16+02:00 perex@suse.cz +9 -39
#   ALSA CVS update
#   D:2004/04/07 18:48:10
#   C:Documentation,SA11xx UDA1341 driver,Memalloc module,PCM Midlevel
#   C:RawMidi Midlevel,RTC timer driver,ALSA Core,Timer Midlevel
#   C:ALSA<-OSS emulation,ALSA sequencer,ALSA<-OSS sequencer,Generic drivers
#   C:MPU401 UART,OPL3,OPL4,ALS100 driver,AZT2320 driver,CMI8330 driver
#   C:DT019x driver,ES18xx driver,OPL3SA2 driver,Sound Galaxy driver
#   C:Sound Scape driver,AD1816A driver,AD1848 driver,CS4231 driver
#   C:CS4236+ driver,PC98(CS423x) driver,ES1688 driver,GUS Classic driver
#   C:GUS Extreme driver,GUS MAX driver,AMD InterWave driver,Opti9xx drivers
#   C:EMU8000 driver,ES968 driver,SB16/AWE driver,SB8 driver
#   C:Wavefront drivers,PARISC Harmony driver,ALS4000 driver,ATIIXP driver
#   C:AZT3328 driver,BT87x driver,CMIPCI driver,CS4281 driver
#   C:ENS1370/1+ driver,ES1938 driver,ES1968 driver,FM801 driver
#   C:Intel8x0 driver,Intel8x0-modem driver,Maestro3 driver,RME32 driver
#   C:RME96 driver,SonicVibes driver,VIA82xx driver,AC97 Codec Core
#   C:ALI5451 driver,au88x0 driver,CS46xx driver,EMU10K1/EMU10K2 driver
#   C:ICE1712 driver,ICE1724 driver,KORG1212 driver,MIXART driver
#   C:NM256 driver,RME HDSP driver,RME9652 driver,Trident driver
#   C:Digigram VX222 driver,YMFPCI driver,Sound Core PDAudioCF driver
#   C:Digigram VX Pocket driver,PPC PowerMac driver,SPARC AMD7930 driver
#   C:SPARC cs4231 driver,USB generic driver
#   A:Takashi Iwai <tiwai@suse.de>
#   F:Documentation/DocBook/writing-an-alsa-driver.tmpl:1.24->1.25 
#   F:arm/sa11xx-uda1341.c:1.13->1.14 
#   F:core/memalloc.c:1.28->1.29 
#   F:core/pcm_memory.c:1.25->1.26 
#   F:core/rawmidi.c:1.41->1.42 
#   F:core/rtctimer.c:1.19->1.20 
#   F:core/sound.c:1.59->1.60 
#   F:core/timer.c:1.56->1.57 
#   F:core/oss/pcm_oss.c:1.66->1.67 
#   F:core/seq/seq.c:1.9->1.10 
#   F:core/seq/seq_dummy.c:1.10->1.11 
#   F:core/seq/seq_midi.c:1.18->1.19 
#   F:core/seq/oss/seq_oss.c:1.11->1.12 
#   F:core/seq/oss/seq_oss_init.c:1.11->1.12 
#   F:drivers/dummy.c:1.26->1.27 
#   F:drivers/mtpav.c:1.26->1.27 
#   F:drivers/serial-u16550.c:1.25->1.26 
#   F:drivers/virmidi.c:1.11->1.12 
#   F:drivers/mpu401/mpu401.c:1.16->1.17 
#   F:drivers/opl3/opl3_seq.c:1.12->1.13 
#   F:drivers/opl4/opl4_seq.c:1.2->1.3 
#   F:include/initval.h:1.19->1.20 
#   F:isa/als100.c:1.24->1.25 
#   F:isa/azt2320.c:1.24->1.25 
#   F:isa/cmi8330.c:1.28->1.29 
#   F:isa/dt019x.c:1.18->1.19 
#   F:isa/es18xx.c:1.44->1.45 
#   F:isa/opl3sa2.c:1.32->1.33 
#   F:isa/sgalaxy.c:1.19->1.20 
#   F:isa/sscape.c:1.11->1.12 
#   F:isa/ad1816a/ad1816a.c:1.18->1.19 
#   F:isa/ad1848/ad1848.c:1.10->1.11 
#   F:isa/cs423x/cs4231.c:1.12->1.13 
#   F:isa/cs423x/cs4236.c:1.41->1.42 
#   F:isa/cs423x/pc98.c:1.7->1.8 
#   F:isa/es1688/es1688.c:1.14->1.15 
#   F:isa/gus/gusclassic.c:1.13->1.14 
#   F:isa/gus/gusextreme.c:1.15->1.16 
#   F:isa/gus/gusmax.c:1.14->1.15 
#   F:isa/gus/interwave.c:1.32->1.33 
#   F:isa/opti9xx/opti92x-ad1848.c:1.42->1.43 
#   F:isa/sb/emu8000_patch.c:1.8->1.9 
#   F:isa/sb/es968.c:1.24->1.25 
#   F:isa/sb/sb16.c:1.45->1.46 
#   F:isa/sb/sb8.c:1.18->1.19 
#   F:isa/wavefront/wavefront.c:1.27->1.28 
#   F:isa/wavefront/wavefront_synth.c:1.14->1.15 
#   F:parisc/harmony.c:1.5->1.6 
#   F:pci/als4000.c:1.31->1.32 
#   F:pci/atiixp.c:1.2->1.3 
#   F:pci/azt3328.c:1.11->1.12 
#   F:pci/bt87x.c:1.3->1.4 
#   F:pci/cmipci.c:1.61->1.62 
#   F:pci/cs4281.c:1.50->1.51 
#   F:pci/ens1370.c:1.58->1.59 
#   F:pci/es1938.c:1.33->1.34 
#   F:pci/es1968.c:1.61->1.62 
#   F:pci/fm801.c:1.43->1.44 
#   F:pci/intel8x0.c:1.130->1.131 
#   F:pci/intel8x0m.c:1.1->1.2 
#   F:pci/maestro3.c:1.48->1.49 
#   F:pci/rme32.c:1.31->1.32 
#   F:pci/rme96.c:1.33->1.34 
#   F:pci/sonicvibes.c:1.33->1.34 
#   F:pci/via82xx.c:1.94->1.95 
#   F:pci/ac97/ac97_codec.c:1.127->1.128 
#   F:pci/ali5451/ali5451.c:1.43->1.44 
#   F:pci/au88x0/au88x0.c:1.6->1.7 
#   F:pci/cs46xx/cs46xx.c:1.24->1.25 
#   F:pci/emu10k1/emu10k1.c:1.22->1.23 
#   F:pci/ice1712/ice1712.c:1.47->1.48 
#   F:pci/ice1712/ice1724.c:1.27->1.28 
#   F:pci/korg1212/korg1212.c:1.36->1.37 
#   F:pci/mixart/mixart.c:1.6->1.7 
#   F:pci/nm256/nm256.c:1.33->1.34 
#   F:pci/rme9652/hdsp.c:1.54->1.55 
#   F:pci/rme9652/rme9652.c:1.42->1.43 
#   F:pci/trident/trident.c:1.21->1.22 
#   F:pci/vx222/vx222.c:1.3->1.4 
#   F:pci/ymfpci/ymfpci.c:1.33->1.34 
#   F:pcmcia/pdaudiocf/pdaudiocf.c:1.4->1.5 
#   F:pcmcia/vx/vxpocket.c:1.3->1.4 
#   F:ppc/powermac.c:1.15->1.16 
#   F:sparc/amd7930.c:1.8->1.9 
#   F:sparc/cs4231.c:1.12->1.13 
#   F:usb/usbaudio.c:1.96->1.97 
#   L:use the new module_param*() functions.
# 
# sound/pci/bt87x.c
#   2004/04/07 12:48:16+02:00 perex@suse.cz +6 -26
#   ALSA CVS update
#   D:2004/04/07 18:48:10
#   C:Documentation,SA11xx UDA1341 driver,Memalloc module,PCM Midlevel
#   C:RawMidi Midlevel,RTC timer driver,ALSA Core,Timer Midlevel
#   C:ALSA<-OSS emulation,ALSA sequencer,ALSA<-OSS sequencer,Generic drivers
#   C:MPU401 UART,OPL3,OPL4,ALS100 driver,AZT2320 driver,CMI8330 driver
#   C:DT019x driver,ES18xx driver,OPL3SA2 driver,Sound Galaxy driver
#   C:Sound Scape driver,AD1816A driver,AD1848 driver,CS4231 driver
#   C:CS4236+ driver,PC98(CS423x) driver,ES1688 driver,GUS Classic driver
#   C:GUS Extreme driver,GUS MAX driver,AMD InterWave driver,Opti9xx drivers
#   C:EMU8000 driver,ES968 driver,SB16/AWE driver,SB8 driver
#   C:Wavefront drivers,PARISC Harmony driver,ALS4000 driver,ATIIXP driver
#   C:AZT3328 driver,BT87x driver,CMIPCI driver,CS4281 driver
#   C:ENS1370/1+ driver,ES1938 driver,ES1968 driver,FM801 driver
#   C:Intel8x0 driver,Intel8x0-modem driver,Maestro3 driver,RME32 driver
#   C:RME96 driver,SonicVibes driver,VIA82xx driver,AC97 Codec Core
#   C:ALI5451 driver,au88x0 driver,CS46xx driver,EMU10K1/EMU10K2 driver
#   C:ICE1712 driver,ICE1724 driver,KORG1212 driver,MIXART driver
#   C:NM256 driver,RME HDSP driver,RME9652 driver,Trident driver
#   C:Digigram VX222 driver,YMFPCI driver,Sound Core PDAudioCF driver
#   C:Digigram VX Pocket driver,PPC PowerMac driver,SPARC AMD7930 driver
#   C:SPARC cs4231 driver,USB generic driver
#   A:Takashi Iwai <tiwai@suse.de>
#   F:Documentation/DocBook/writing-an-alsa-driver.tmpl:1.24->1.25 
#   F:arm/sa11xx-uda1341.c:1.13->1.14 
#   F:core/memalloc.c:1.28->1.29 
#   F:core/pcm_memory.c:1.25->1.26 
#   F:core/rawmidi.c:1.41->1.42 
#   F:core/rtctimer.c:1.19->1.20 
#   F:core/sound.c:1.59->1.60 
#   F:core/timer.c:1.56->1.57 
#   F:core/oss/pcm_oss.c:1.66->1.67 
#   F:core/seq/seq.c:1.9->1.10 
#   F:core/seq/seq_dummy.c:1.10->1.11 
#   F:core/seq/seq_midi.c:1.18->1.19 
#   F:core/seq/oss/seq_oss.c:1.11->1.12 
#   F:core/seq/oss/seq_oss_init.c:1.11->1.12 
#   F:drivers/dummy.c:1.26->1.27 
#   F:drivers/mtpav.c:1.26->1.27 
#   F:drivers/serial-u16550.c:1.25->1.26 
#   F:drivers/virmidi.c:1.11->1.12 
#   F:drivers/mpu401/mpu401.c:1.16->1.17 
#   F:drivers/opl3/opl3_seq.c:1.12->1.13 
#   F:drivers/opl4/opl4_seq.c:1.2->1.3 
#   F:include/initval.h:1.19->1.20 
#   F:isa/als100.c:1.24->1.25 
#   F:isa/azt2320.c:1.24->1.25 
#   F:isa/cmi8330.c:1.28->1.29 
#   F:isa/dt019x.c:1.18->1.19 
#   F:isa/es18xx.c:1.44->1.45 
#   F:isa/opl3sa2.c:1.32->1.33 
#   F:isa/sgalaxy.c:1.19->1.20 
#   F:isa/sscape.c:1.11->1.12 
#   F:isa/ad1816a/ad1816a.c:1.18->1.19 
#   F:isa/ad1848/ad1848.c:1.10->1.11 
#   F:isa/cs423x/cs4231.c:1.12->1.13 
#   F:isa/cs423x/cs4236.c:1.41->1.42 
#   F:isa/cs423x/pc98.c:1.7->1.8 
#   F:isa/es1688/es1688.c:1.14->1.15 
#   F:isa/gus/gusclassic.c:1.13->1.14 
#   F:isa/gus/gusextreme.c:1.15->1.16 
#   F:isa/gus/gusmax.c:1.14->1.15 
#   F:isa/gus/interwave.c:1.32->1.33 
#   F:isa/opti9xx/opti92x-ad1848.c:1.42->1.43 
#   F:isa/sb/emu8000_patch.c:1.8->1.9 
#   F:isa/sb/es968.c:1.24->1.25 
#   F:isa/sb/sb16.c:1.45->1.46 
#   F:isa/sb/sb8.c:1.18->1.19 
#   F:isa/wavefront/wavefront.c:1.27->1.28 
#   F:isa/wavefront/wavefront_synth.c:1.14->1.15 
#   F:parisc/harmony.c:1.5->1.6 
#   F:pci/als4000.c:1.31->1.32 
#   F:pci/atiixp.c:1.2->1.3 
#   F:pci/azt3328.c:1.11->1.12 
#   F:pci/bt87x.c:1.3->1.4 
#   F:pci/cmipci.c:1.61->1.62 
#   F:pci/cs4281.c:1.50->1.51 
#   F:pci/ens1370.c:1.58->1.59 
#   F:pci/es1938.c:1.33->1.34 
#   F:pci/es1968.c:1.61->1.62 
#   F:pci/fm801.c:1.43->1.44 
#   F:pci/intel8x0.c:1.130->1.131 
#   F:pci/intel8x0m.c:1.1->1.2 
#   F:pci/maestro3.c:1.48->1.49 
#   F:pci/rme32.c:1.31->1.32 
#   F:pci/rme96.c:1.33->1.34 
#   F:pci/sonicvibes.c:1.33->1.34 
#   F:pci/via82xx.c:1.94->1.95 
#   F:pci/ac97/ac97_codec.c:1.127->1.128 
#   F:pci/ali5451/ali5451.c:1.43->1.44 
#   F:pci/au88x0/au88x0.c:1.6->1.7 
#   F:pci/cs46xx/cs46xx.c:1.24->1.25 
#   F:pci/emu10k1/emu10k1.c:1.22->1.23 
#   F:pci/ice1712/ice1712.c:1.47->1.48 
#   F:pci/ice1712/ice1724.c:1.27->1.28 
#   F:pci/korg1212/korg1212.c:1.36->1.37 
#   F:pci/mixart/mixart.c:1.6->1.7 
#   F:pci/nm256/nm256.c:1.33->1.34 
#   F:pci/rme9652/hdsp.c:1.54->1.55 
#   F:pci/rme9652/rme9652.c:1.42->1.43 
#   F:pci/trident/trident.c:1.21->1.22 
#   F:pci/vx222/vx222.c:1.3->1.4 
#   F:pci/ymfpci/ymfpci.c:1.33->1.34 
#   F:pcmcia/pdaudiocf/pdaudiocf.c:1.4->1.5 
#   F:pcmcia/vx/vxpocket.c:1.3->1.4 
#   F:ppc/powermac.c:1.15->1.16 
#   F:sparc/amd7930.c:1.8->1.9 
#   F:sparc/cs4231.c:1.12->1.13 
#   F:usb/usbaudio.c:1.96->1.97 
#   L:use the new module_param*() functions.
# 
# sound/pci/azt3328.c
#   2004/04/07 12:48:16+02:00 perex@suse.cz +6 -33
#   ALSA CVS update
#   D:2004/04/07 18:48:10
#   C:Documentation,SA11xx UDA1341 driver,Memalloc module,PCM Midlevel
#   C:RawMidi Midlevel,RTC timer driver,ALSA Core,Timer Midlevel
#   C:ALSA<-OSS emulation,ALSA sequencer,ALSA<-OSS sequencer,Generic drivers
#   C:MPU401 UART,OPL3,OPL4,ALS100 driver,AZT2320 driver,CMI8330 driver
#   C:DT019x driver,ES18xx driver,OPL3SA2 driver,Sound Galaxy driver
#   C:Sound Scape driver,AD1816A driver,AD1848 driver,CS4231 driver
#   C:CS4236+ driver,PC98(CS423x) driver,ES1688 driver,GUS Classic driver
#   C:GUS Extreme driver,GUS MAX driver,AMD InterWave driver,Opti9xx drivers
#   C:EMU8000 driver,ES968 driver,SB16/AWE driver,SB8 driver
#   C:Wavefront drivers,PARISC Harmony driver,ALS4000 driver,ATIIXP driver
#   C:AZT3328 driver,BT87x driver,CMIPCI driver,CS4281 driver
#   C:ENS1370/1+ driver,ES1938 driver,ES1968 driver,FM801 driver
#   C:Intel8x0 driver,Intel8x0-modem driver,Maestro3 driver,RME32 driver
#   C:RME96 driver,SonicVibes driver,VIA82xx driver,AC97 Codec Core
#   C:ALI5451 driver,au88x0 driver,CS46xx driver,EMU10K1/EMU10K2 driver
#   C:ICE1712 driver,ICE1724 driver,KORG1212 driver,MIXART driver
#   C:NM256 driver,RME HDSP driver,RME9652 driver,Trident driver
#   C:Digigram VX222 driver,YMFPCI driver,Sound Core PDAudioCF driver
#   C:Digigram VX Pocket driver,PPC PowerMac driver,SPARC AMD7930 driver
#   C:SPARC cs4231 driver,USB generic driver
#   A:Takashi Iwai <tiwai@suse.de>
#   F:Documentation/DocBook/writing-an-alsa-driver.tmpl:1.24->1.25 
#   F:arm/sa11xx-uda1341.c:1.13->1.14 
#   F:core/memalloc.c:1.28->1.29 
#   F:core/pcm_memory.c:1.25->1.26 
#   F:core/rawmidi.c:1.41->1.42 
#   F:core/rtctimer.c:1.19->1.20 
#   F:core/sound.c:1.59->1.60 
#   F:core/timer.c:1.56->1.57 
#   F:core/oss/pcm_oss.c:1.66->1.67 
#   F:core/seq/seq.c:1.9->1.10 
#   F:core/seq/seq_dummy.c:1.10->1.11 
#   F:core/seq/seq_midi.c:1.18->1.19 
#   F:core/seq/oss/seq_oss.c:1.11->1.12 
#   F:core/seq/oss/seq_oss_init.c:1.11->1.12 
#   F:drivers/dummy.c:1.26->1.27 
#   F:drivers/mtpav.c:1.26->1.27 
#   F:drivers/serial-u16550.c:1.25->1.26 
#   F:drivers/virmidi.c:1.11->1.12 
#   F:drivers/mpu401/mpu401.c:1.16->1.17 
#   F:drivers/opl3/opl3_seq.c:1.12->1.13 
#   F:drivers/opl4/opl4_seq.c:1.2->1.3 
#   F:include/initval.h:1.19->1.20 
#   F:isa/als100.c:1.24->1.25 
#   F:isa/azt2320.c:1.24->1.25 
#   F:isa/cmi8330.c:1.28->1.29 
#   F:isa/dt019x.c:1.18->1.19 
#   F:isa/es18xx.c:1.44->1.45 
#   F:isa/opl3sa2.c:1.32->1.33 
#   F:isa/sgalaxy.c:1.19->1.20 
#   F:isa/sscape.c:1.11->1.12 
#   F:isa/ad1816a/ad1816a.c:1.18->1.19 
#   F:isa/ad1848/ad1848.c:1.10->1.11 
#   F:isa/cs423x/cs4231.c:1.12->1.13 
#   F:isa/cs423x/cs4236.c:1.41->1.42 
#   F:isa/cs423x/pc98.c:1.7->1.8 
#   F:isa/es1688/es1688.c:1.14->1.15 
#   F:isa/gus/gusclassic.c:1.13->1.14 
#   F:isa/gus/gusextreme.c:1.15->1.16 
#   F:isa/gus/gusmax.c:1.14->1.15 
#   F:isa/gus/interwave.c:1.32->1.33 
#   F:isa/opti9xx/opti92x-ad1848.c:1.42->1.43 
#   F:isa/sb/emu8000_patch.c:1.8->1.9 
#   F:isa/sb/es968.c:1.24->1.25 
#   F:isa/sb/sb16.c:1.45->1.46 
#   F:isa/sb/sb8.c:1.18->1.19 
#   F:isa/wavefront/wavefront.c:1.27->1.28 
#   F:isa/wavefront/wavefront_synth.c:1.14->1.15 
#   F:parisc/harmony.c:1.5->1.6 
#   F:pci/als4000.c:1.31->1.32 
#   F:pci/atiixp.c:1.2->1.3 
#   F:pci/azt3328.c:1.11->1.12 
#   F:pci/bt87x.c:1.3->1.4 
#   F:pci/cmipci.c:1.61->1.62 
#   F:pci/cs4281.c:1.50->1.51 
#   F:pci/ens1370.c:1.58->1.59 
#   F:pci/es1938.c:1.33->1.34 
#   F:pci/es1968.c:1.61->1.62 
#   F:pci/fm801.c:1.43->1.44 
#   F:pci/intel8x0.c:1.130->1.131 
#   F:pci/intel8x0m.c:1.1->1.2 
#   F:pci/maestro3.c:1.48->1.49 
#   F:pci/rme32.c:1.31->1.32 
#   F:pci/rme96.c:1.33->1.34 
#   F:pci/sonicvibes.c:1.33->1.34 
#   F:pci/via82xx.c:1.94->1.95 
#   F:pci/ac97/ac97_codec.c:1.127->1.128 
#   F:pci/ali5451/ali5451.c:1.43->1.44 
#   F:pci/au88x0/au88x0.c:1.6->1.7 
#   F:pci/cs46xx/cs46xx.c:1.24->1.25 
#   F:pci/emu10k1/emu10k1.c:1.22->1.23 
#   F:pci/ice1712/ice1712.c:1.47->1.48 
#   F:pci/ice1712/ice1724.c:1.27->1.28 
#   F:pci/korg1212/korg1212.c:1.36->1.37 
#   F:pci/mixart/mixart.c:1.6->1.7 
#   F:pci/nm256/nm256.c:1.33->1.34 
#   F:pci/rme9652/hdsp.c:1.54->1.55 
#   F:pci/rme9652/rme9652.c:1.42->1.43 
#   F:pci/trident/trident.c:1.21->1.22 
#   F:pci/vx222/vx222.c:1.3->1.4 
#   F:pci/ymfpci/ymfpci.c:1.33->1.34 
#   F:pcmcia/pdaudiocf/pdaudiocf.c:1.4->1.5 
#   F:pcmcia/vx/vxpocket.c:1.3->1.4 
#   F:ppc/powermac.c:1.15->1.16 
#   F:sparc/amd7930.c:1.8->1.9 
#   F:sparc/cs4231.c:1.12->1.13 
#   F:usb/usbaudio.c:1.96->1.97 
#   L:use the new module_param*() functions.
# 
# sound/pci/au88x0/au88x0.c
#   2004/04/07 12:48:19+02:00 perex@suse.cz +6 -23
#   ALSA CVS update
#   D:2004/04/07 18:48:10
#   C:Documentation,SA11xx UDA1341 driver,Memalloc module,PCM Midlevel
#   C:RawMidi Midlevel,RTC timer driver,ALSA Core,Timer Midlevel
#   C:ALSA<-OSS emulation,ALSA sequencer,ALSA<-OSS sequencer,Generic drivers
#   C:MPU401 UART,OPL3,OPL4,ALS100 driver,AZT2320 driver,CMI8330 driver
#   C:DT019x driver,ES18xx driver,OPL3SA2 driver,Sound Galaxy driver
#   C:Sound Scape driver,AD1816A driver,AD1848 driver,CS4231 driver
#   C:CS4236+ driver,PC98(CS423x) driver,ES1688 driver,GUS Classic driver
#   C:GUS Extreme driver,GUS MAX driver,AMD InterWave driver,Opti9xx drivers
#   C:EMU8000 driver,ES968 driver,SB16/AWE driver,SB8 driver
#   C:Wavefront drivers,PARISC Harmony driver,ALS4000 driver,ATIIXP driver
#   C:AZT3328 driver,BT87x driver,CMIPCI driver,CS4281 driver
#   C:ENS1370/1+ driver,ES1938 driver,ES1968 driver,FM801 driver
#   C:Intel8x0 driver,Intel8x0-modem driver,Maestro3 driver,RME32 driver
#   C:RME96 driver,SonicVibes driver,VIA82xx driver,AC97 Codec Core
#   C:ALI5451 driver,au88x0 driver,CS46xx driver,EMU10K1/EMU10K2 driver
#   C:ICE1712 driver,ICE1724 driver,KORG1212 driver,MIXART driver
#   C:NM256 driver,RME HDSP driver,RME9652 driver,Trident driver
#   C:Digigram VX222 driver,YMFPCI driver,Sound Core PDAudioCF driver
#   C:Digigram VX Pocket driver,PPC PowerMac driver,SPARC AMD7930 driver
#   C:SPARC cs4231 driver,USB generic driver
#   A:Takashi Iwai <tiwai@suse.de>
#   F:Documentation/DocBook/writing-an-alsa-driver.tmpl:1.24->1.25 
#   F:arm/sa11xx-uda1341.c:1.13->1.14 
#   F:core/memalloc.c:1.28->1.29 
#   F:core/pcm_memory.c:1.25->1.26 
#   F:core/rawmidi.c:1.41->1.42 
#   F:core/rtctimer.c:1.19->1.20 
#   F:core/sound.c:1.59->1.60 
#   F:core/timer.c:1.56->1.57 
#   F:core/oss/pcm_oss.c:1.66->1.67 
#   F:core/seq/seq.c:1.9->1.10 
#   F:core/seq/seq_dummy.c:1.10->1.11 
#   F:core/seq/seq_midi.c:1.18->1.19 
#   F:core/seq/oss/seq_oss.c:1.11->1.12 
#   F:core/seq/oss/seq_oss_init.c:1.11->1.12 
#   F:drivers/dummy.c:1.26->1.27 
#   F:drivers/mtpav.c:1.26->1.27 
#   F:drivers/serial-u16550.c:1.25->1.26 
#   F:drivers/virmidi.c:1.11->1.12 
#   F:drivers/mpu401/mpu401.c:1.16->1.17 
#   F:drivers/opl3/opl3_seq.c:1.12->1.13 
#   F:drivers/opl4/opl4_seq.c:1.2->1.3 
#   F:include/initval.h:1.19->1.20 
#   F:isa/als100.c:1.24->1.25 
#   F:isa/azt2320.c:1.24->1.25 
#   F:isa/cmi8330.c:1.28->1.29 
#   F:isa/dt019x.c:1.18->1.19 
#   F:isa/es18xx.c:1.44->1.45 
#   F:isa/opl3sa2.c:1.32->1.33 
#   F:isa/sgalaxy.c:1.19->1.20 
#   F:isa/sscape.c:1.11->1.12 
#   F:isa/ad1816a/ad1816a.c:1.18->1.19 
#   F:isa/ad1848/ad1848.c:1.10->1.11 
#   F:isa/cs423x/cs4231.c:1.12->1.13 
#   F:isa/cs423x/cs4236.c:1.41->1.42 
#   F:isa/cs423x/pc98.c:1.7->1.8 
#   F:isa/es1688/es1688.c:1.14->1.15 
#   F:isa/gus/gusclassic.c:1.13->1.14 
#   F:isa/gus/gusextreme.c:1.15->1.16 
#   F:isa/gus/gusmax.c:1.14->1.15 
#   F:isa/gus/interwave.c:1.32->1.33 
#   F:isa/opti9xx/opti92x-ad1848.c:1.42->1.43 
#   F:isa/sb/emu8000_patch.c:1.8->1.9 
#   F:isa/sb/es968.c:1.24->1.25 
#   F:isa/sb/sb16.c:1.45->1.46 
#   F:isa/sb/sb8.c:1.18->1.19 
#   F:isa/wavefront/wavefront.c:1.27->1.28 
#   F:isa/wavefront/wavefront_synth.c:1.14->1.15 
#   F:parisc/harmony.c:1.5->1.6 
#   F:pci/als4000.c:1.31->1.32 
#   F:pci/atiixp.c:1.2->1.3 
#   F:pci/azt3328.c:1.11->1.12 
#   F:pci/bt87x.c:1.3->1.4 
#   F:pci/cmipci.c:1.61->1.62 
#   F:pci/cs4281.c:1.50->1.51 
#   F:pci/ens1370.c:1.58->1.59 
#   F:pci/es1938.c:1.33->1.34 
#   F:pci/es1968.c:1.61->1.62 
#   F:pci/fm801.c:1.43->1.44 
#   F:pci/intel8x0.c:1.130->1.131 
#   F:pci/intel8x0m.c:1.1->1.2 
#   F:pci/maestro3.c:1.48->1.49 
#   F:pci/rme32.c:1.31->1.32 
#   F:pci/rme96.c:1.33->1.34 
#   F:pci/sonicvibes.c:1.33->1.34 
#   F:pci/via82xx.c:1.94->1.95 
#   F:pci/ac97/ac97_codec.c:1.127->1.128 
#   F:pci/ali5451/ali5451.c:1.43->1.44 
#   F:pci/au88x0/au88x0.c:1.6->1.7 
#   F:pci/cs46xx/cs46xx.c:1.24->1.25 
#   F:pci/emu10k1/emu10k1.c:1.22->1.23 
#   F:pci/ice1712/ice1712.c:1.47->1.48 
#   F:pci/ice1712/ice1724.c:1.27->1.28 
#   F:pci/korg1212/korg1212.c:1.36->1.37 
#   F:pci/mixart/mixart.c:1.6->1.7 
#   F:pci/nm256/nm256.c:1.33->1.34 
#   F:pci/rme9652/hdsp.c:1.54->1.55 
#   F:pci/rme9652/rme9652.c:1.42->1.43 
#   F:pci/trident/trident.c:1.21->1.22 
#   F:pci/vx222/vx222.c:1.3->1.4 
#   F:pci/ymfpci/ymfpci.c:1.33->1.34 
#   F:pcmcia/pdaudiocf/pdaudiocf.c:1.4->1.5 
#   F:pcmcia/vx/vxpocket.c:1.3->1.4 
#   F:ppc/powermac.c:1.15->1.16 
#   F:sparc/amd7930.c:1.8->1.9 
#   F:sparc/cs4231.c:1.12->1.13 
#   F:usb/usbaudio.c:1.96->1.97 
#   L:use the new module_param*() functions.
# 
# sound/pci/atiixp.c
#   2004/04/07 12:48:16+02:00 perex@suse.cz +7 -30
#   ALSA CVS update
#   D:2004/04/07 18:48:10
#   C:Documentation,SA11xx UDA1341 driver,Memalloc module,PCM Midlevel
#   C:RawMidi Midlevel,RTC timer driver,ALSA Core,Timer Midlevel
#   C:ALSA<-OSS emulation,ALSA sequencer,ALSA<-OSS sequencer,Generic drivers
#   C:MPU401 UART,OPL3,OPL4,ALS100 driver,AZT2320 driver,CMI8330 driver
#   C:DT019x driver,ES18xx driver,OPL3SA2 driver,Sound Galaxy driver
#   C:Sound Scape driver,AD1816A driver,AD1848 driver,CS4231 driver
#   C:CS4236+ driver,PC98(CS423x) driver,ES1688 driver,GUS Classic driver
#   C:GUS Extreme driver,GUS MAX driver,AMD InterWave driver,Opti9xx drivers
#   C:EMU8000 driver,ES968 driver,SB16/AWE driver,SB8 driver
#   C:Wavefront drivers,PARISC Harmony driver,ALS4000 driver,ATIIXP driver
#   C:AZT3328 driver,BT87x driver,CMIPCI driver,CS4281 driver
#   C:ENS1370/1+ driver,ES1938 driver,ES1968 driver,FM801 driver
#   C:Intel8x0 driver,Intel8x0-modem driver,Maestro3 driver,RME32 driver
#   C:RME96 driver,SonicVibes driver,VIA82xx driver,AC97 Codec Core
#   C:ALI5451 driver,au88x0 driver,CS46xx driver,EMU10K1/EMU10K2 driver
#   C:ICE1712 driver,ICE1724 driver,KORG1212 driver,MIXART driver
#   C:NM256 driver,RME HDSP driver,RME9652 driver,Trident driver
#   C:Digigram VX222 driver,YMFPCI driver,Sound Core PDAudioCF driver
#   C:Digigram VX Pocket driver,PPC PowerMac driver,SPARC AMD7930 driver
#   C:SPARC cs4231 driver,USB generic driver
#   A:Takashi Iwai <tiwai@suse.de>
#   F:Documentation/DocBook/writing-an-alsa-driver.tmpl:1.24->1.25 
#   F:arm/sa11xx-uda1341.c:1.13->1.14 
#   F:core/memalloc.c:1.28->1.29 
#   F:core/pcm_memory.c:1.25->1.26 
#   F:core/rawmidi.c:1.41->1.42 
#   F:core/rtctimer.c:1.19->1.20 
#   F:core/sound.c:1.59->1.60 
#   F:core/timer.c:1.56->1.57 
#   F:core/oss/pcm_oss.c:1.66->1.67 
#   F:core/seq/seq.c:1.9->1.10 
#   F:core/seq/seq_dummy.c:1.10->1.11 
#   F:core/seq/seq_midi.c:1.18->1.19 
#   F:core/seq/oss/seq_oss.c:1.11->1.12 
#   F:core/seq/oss/seq_oss_init.c:1.11->1.12 
#   F:drivers/dummy.c:1.26->1.27 
#   F:drivers/mtpav.c:1.26->1.27 
#   F:drivers/serial-u16550.c:1.25->1.26 
#   F:drivers/virmidi.c:1.11->1.12 
#   F:drivers/mpu401/mpu401.c:1.16->1.17 
#   F:drivers/opl3/opl3_seq.c:1.12->1.13 
#   F:drivers/opl4/opl4_seq.c:1.2->1.3 
#   F:include/initval.h:1.19->1.20 
#   F:isa/als100.c:1.24->1.25 
#   F:isa/azt2320.c:1.24->1.25 
#   F:isa/cmi8330.c:1.28->1.29 
#   F:isa/dt019x.c:1.18->1.19 
#   F:isa/es18xx.c:1.44->1.45 
#   F:isa/opl3sa2.c:1.32->1.33 
#   F:isa/sgalaxy.c:1.19->1.20 
#   F:isa/sscape.c:1.11->1.12 
#   F:isa/ad1816a/ad1816a.c:1.18->1.19 
#   F:isa/ad1848/ad1848.c:1.10->1.11 
#   F:isa/cs423x/cs4231.c:1.12->1.13 
#   F:isa/cs423x/cs4236.c:1.41->1.42 
#   F:isa/cs423x/pc98.c:1.7->1.8 
#   F:isa/es1688/es1688.c:1.14->1.15 
#   F:isa/gus/gusclassic.c:1.13->1.14 
#   F:isa/gus/gusextreme.c:1.15->1.16 
#   F:isa/gus/gusmax.c:1.14->1.15 
#   F:isa/gus/interwave.c:1.32->1.33 
#   F:isa/opti9xx/opti92x-ad1848.c:1.42->1.43 
#   F:isa/sb/emu8000_patch.c:1.8->1.9 
#   F:isa/sb/es968.c:1.24->1.25 
#   F:isa/sb/sb16.c:1.45->1.46 
#   F:isa/sb/sb8.c:1.18->1.19 
#   F:isa/wavefront/wavefront.c:1.27->1.28 
#   F:isa/wavefront/wavefront_synth.c:1.14->1.15 
#   F:parisc/harmony.c:1.5->1.6 
#   F:pci/als4000.c:1.31->1.32 
#   F:pci/atiixp.c:1.2->1.3 
#   F:pci/azt3328.c:1.11->1.12 
#   F:pci/bt87x.c:1.3->1.4 
#   F:pci/cmipci.c:1.61->1.62 
#   F:pci/cs4281.c:1.50->1.51 
#   F:pci/ens1370.c:1.58->1.59 
#   F:pci/es1938.c:1.33->1.34 
#   F:pci/es1968.c:1.61->1.62 
#   F:pci/fm801.c:1.43->1.44 
#   F:pci/intel8x0.c:1.130->1.131 
#   F:pci/intel8x0m.c:1.1->1.2 
#   F:pci/maestro3.c:1.48->1.49 
#   F:pci/rme32.c:1.31->1.32 
#   F:pci/rme96.c:1.33->1.34 
#   F:pci/sonicvibes.c:1.33->1.34 
#   F:pci/via82xx.c:1.94->1.95 
#   F:pci/ac97/ac97_codec.c:1.127->1.128 
#   F:pci/ali5451/ali5451.c:1.43->1.44 
#   F:pci/au88x0/au88x0.c:1.6->1.7 
#   F:pci/cs46xx/cs46xx.c:1.24->1.25 
#   F:pci/emu10k1/emu10k1.c:1.22->1.23 
#   F:pci/ice1712/ice1712.c:1.47->1.48 
#   F:pci/ice1712/ice1724.c:1.27->1.28 
#   F:pci/korg1212/korg1212.c:1.36->1.37 
#   F:pci/mixart/mixart.c:1.6->1.7 
#   F:pci/nm256/nm256.c:1.33->1.34 
#   F:pci/rme9652/hdsp.c:1.54->1.55 
#   F:pci/rme9652/rme9652.c:1.42->1.43 
#   F:pci/trident/trident.c:1.21->1.22 
#   F:pci/vx222/vx222.c:1.3->1.4 
#   F:pci/ymfpci/ymfpci.c:1.33->1.34 
#   F:pcmcia/pdaudiocf/pdaudiocf.c:1.4->1.5 
#   F:pcmcia/vx/vxpocket.c:1.3->1.4 
#   F:ppc/powermac.c:1.15->1.16 
#   F:sparc/amd7930.c:1.8->1.9 
#   F:sparc/cs4231.c:1.12->1.13 
#   F:usb/usbaudio.c:1.96->1.97 
#   L:use the new module_param*() functions.
# 
# sound/pci/als4000.c
#   2004/04/07 12:48:16+02:00 perex@suse.cz +6 -30
#   ALSA CVS update
#   D:2004/04/07 18:48:10
#   C:Documentation,SA11xx UDA1341 driver,Memalloc module,PCM Midlevel
#   C:RawMidi Midlevel,RTC timer driver,ALSA Core,Timer Midlevel
#   C:ALSA<-OSS emulation,ALSA sequencer,ALSA<-OSS sequencer,Generic drivers
#   C:MPU401 UART,OPL3,OPL4,ALS100 driver,AZT2320 driver,CMI8330 driver
#   C:DT019x driver,ES18xx driver,OPL3SA2 driver,Sound Galaxy driver
#   C:Sound Scape driver,AD1816A driver,AD1848 driver,CS4231 driver
#   C:CS4236+ driver,PC98(CS423x) driver,ES1688 driver,GUS Classic driver
#   C:GUS Extreme driver,GUS MAX driver,AMD InterWave driver,Opti9xx drivers
#   C:EMU8000 driver,ES968 driver,SB16/AWE driver,SB8 driver
#   C:Wavefront drivers,PARISC Harmony driver,ALS4000 driver,ATIIXP driver
#   C:AZT3328 driver,BT87x driver,CMIPCI driver,CS4281 driver
#   C:ENS1370/1+ driver,ES1938 driver,ES1968 driver,FM801 driver
#   C:Intel8x0 driver,Intel8x0-modem driver,Maestro3 driver,RME32 driver
#   C:RME96 driver,SonicVibes driver,VIA82xx driver,AC97 Codec Core
#   C:ALI5451 driver,au88x0 driver,CS46xx driver,EMU10K1/EMU10K2 driver
#   C:ICE1712 driver,ICE1724 driver,KORG1212 driver,MIXART driver
#   C:NM256 driver,RME HDSP driver,RME9652 driver,Trident driver
#   C:Digigram VX222 driver,YMFPCI driver,Sound Core PDAudioCF driver
#   C:Digigram VX Pocket driver,PPC PowerMac driver,SPARC AMD7930 driver
#   C:SPARC cs4231 driver,USB generic driver
#   A:Takashi Iwai <tiwai@suse.de>
#   F:Documentation/DocBook/writing-an-alsa-driver.tmpl:1.24->1.25 
#   F:arm/sa11xx-uda1341.c:1.13->1.14 
#   F:core/memalloc.c:1.28->1.29 
#   F:core/pcm_memory.c:1.25->1.26 
#   F:core/rawmidi.c:1.41->1.42 
#   F:core/rtctimer.c:1.19->1.20 
#   F:core/sound.c:1.59->1.60 
#   F:core/timer.c:1.56->1.57 
#   F:core/oss/pcm_oss.c:1.66->1.67 
#   F:core/seq/seq.c:1.9->1.10 
#   F:core/seq/seq_dummy.c:1.10->1.11 
#   F:core/seq/seq_midi.c:1.18->1.19 
#   F:core/seq/oss/seq_oss.c:1.11->1.12 
#   F:core/seq/oss/seq_oss_init.c:1.11->1.12 
#   F:drivers/dummy.c:1.26->1.27 
#   F:drivers/mtpav.c:1.26->1.27 
#   F:drivers/serial-u16550.c:1.25->1.26 
#   F:drivers/virmidi.c:1.11->1.12 
#   F:drivers/mpu401/mpu401.c:1.16->1.17 
#   F:drivers/opl3/opl3_seq.c:1.12->1.13 
#   F:drivers/opl4/opl4_seq.c:1.2->1.3 
#   F:include/initval.h:1.19->1.20 
#   F:isa/als100.c:1.24->1.25 
#   F:isa/azt2320.c:1.24->1.25 
#   F:isa/cmi8330.c:1.28->1.29 
#   F:isa/dt019x.c:1.18->1.19 
#   F:isa/es18xx.c:1.44->1.45 
#   F:isa/opl3sa2.c:1.32->1.33 
#   F:isa/sgalaxy.c:1.19->1.20 
#   F:isa/sscape.c:1.11->1.12 
#   F:isa/ad1816a/ad1816a.c:1.18->1.19 
#   F:isa/ad1848/ad1848.c:1.10->1.11 
#   F:isa/cs423x/cs4231.c:1.12->1.13 
#   F:isa/cs423x/cs4236.c:1.41->1.42 
#   F:isa/cs423x/pc98.c:1.7->1.8 
#   F:isa/es1688/es1688.c:1.14->1.15 
#   F:isa/gus/gusclassic.c:1.13->1.14 
#   F:isa/gus/gusextreme.c:1.15->1.16 
#   F:isa/gus/gusmax.c:1.14->1.15 
#   F:isa/gus/interwave.c:1.32->1.33 
#   F:isa/opti9xx/opti92x-ad1848.c:1.42->1.43 
#   F:isa/sb/emu8000_patch.c:1.8->1.9 
#   F:isa/sb/es968.c:1.24->1.25 
#   F:isa/sb/sb16.c:1.45->1.46 
#   F:isa/sb/sb8.c:1.18->1.19 
#   F:isa/wavefront/wavefront.c:1.27->1.28 
#   F:isa/wavefront/wavefront_synth.c:1.14->1.15 
#   F:parisc/harmony.c:1.5->1.6 
#   F:pci/als4000.c:1.31->1.32 
#   F:pci/atiixp.c:1.2->1.3 
#   F:pci/azt3328.c:1.11->1.12 
#   F:pci/bt87x.c:1.3->1.4 
#   F:pci/cmipci.c:1.61->1.62 
#   F:pci/cs4281.c:1.50->1.51 
#   F:pci/ens1370.c:1.58->1.59 
#   F:pci/es1938.c:1.33->1.34 
#   F:pci/es1968.c:1.61->1.62 
#   F:pci/fm801.c:1.43->1.44 
#   F:pci/intel8x0.c:1.130->1.131 
#   F:pci/intel8x0m.c:1.1->1.2 
#   F:pci/maestro3.c:1.48->1.49 
#   F:pci/rme32.c:1.31->1.32 
#   F:pci/rme96.c:1.33->1.34 
#   F:pci/sonicvibes.c:1.33->1.34 
#   F:pci/via82xx.c:1.94->1.95 
#   F:pci/ac97/ac97_codec.c:1.127->1.128 
#   F:pci/ali5451/ali5451.c:1.43->1.44 
#   F:pci/au88x0/au88x0.c:1.6->1.7 
#   F:pci/cs46xx/cs46xx.c:1.24->1.25 
#   F:pci/emu10k1/emu10k1.c:1.22->1.23 
#   F:pci/ice1712/ice1712.c:1.47->1.48 
#   F:pci/ice1712/ice1724.c:1.27->1.28 
#   F:pci/korg1212/korg1212.c:1.36->1.37 
#   F:pci/mixart/mixart.c:1.6->1.7 
#   F:pci/nm256/nm256.c:1.33->1.34 
#   F:pci/rme9652/hdsp.c:1.54->1.55 
#   F:pci/rme9652/rme9652.c:1.42->1.43 
#   F:pci/trident/trident.c:1.21->1.22 
#   F:pci/vx222/vx222.c:1.3->1.4 
#   F:pci/ymfpci/ymfpci.c:1.33->1.34 
#   F:pcmcia/pdaudiocf/pdaudiocf.c:1.4->1.5 
#   F:pcmcia/vx/vxpocket.c:1.3->1.4 
#   F:ppc/powermac.c:1.15->1.16 
#   F:sparc/amd7930.c:1.8->1.9 
#   F:sparc/cs4231.c:1.12->1.13 
#   F:usb/usbaudio.c:1.96->1.97 
#   L:use the new module_param*() functions.
# 
# sound/pci/ali5451/ali5451.c
#   2004/04/07 12:48:19+02:00 perex@suse.cz +7 -30
#   ALSA CVS update
#   D:2004/04/07 18:48:10
#   C:Documentation,SA11xx UDA1341 driver,Memalloc module,PCM Midlevel
#   C:RawMidi Midlevel,RTC timer driver,ALSA Core,Timer Midlevel
#   C:ALSA<-OSS emulation,ALSA sequencer,ALSA<-OSS sequencer,Generic drivers
#   C:MPU401 UART,OPL3,OPL4,ALS100 driver,AZT2320 driver,CMI8330 driver
#   C:DT019x driver,ES18xx driver,OPL3SA2 driver,Sound Galaxy driver
#   C:Sound Scape driver,AD1816A driver,AD1848 driver,CS4231 driver
#   C:CS4236+ driver,PC98(CS423x) driver,ES1688 driver,GUS Classic driver
#   C:GUS Extreme driver,GUS MAX driver,AMD InterWave driver,Opti9xx drivers
#   C:EMU8000 driver,ES968 driver,SB16/AWE driver,SB8 driver
#   C:Wavefront drivers,PARISC Harmony driver,ALS4000 driver,ATIIXP driver
#   C:AZT3328 driver,BT87x driver,CMIPCI driver,CS4281 driver
#   C:ENS1370/1+ driver,ES1938 driver,ES1968 driver,FM801 driver
#   C:Intel8x0 driver,Intel8x0-modem driver,Maestro3 driver,RME32 driver
#   C:RME96 driver,SonicVibes driver,VIA82xx driver,AC97 Codec Core
#   C:ALI5451 driver,au88x0 driver,CS46xx driver,EMU10K1/EMU10K2 driver
#   C:ICE1712 driver,ICE1724 driver,KORG1212 driver,MIXART driver
#   C:NM256 driver,RME HDSP driver,RME9652 driver,Trident driver
#   C:Digigram VX222 driver,YMFPCI driver,Sound Core PDAudioCF driver
#   C:Digigram VX Pocket driver,PPC PowerMac driver,SPARC AMD7930 driver
#   C:SPARC cs4231 driver,USB generic driver
#   A:Takashi Iwai <tiwai@suse.de>
#   F:Documentation/DocBook/writing-an-alsa-driver.tmpl:1.24->1.25 
#   F:arm/sa11xx-uda1341.c:1.13->1.14 
#   F:core/memalloc.c:1.28->1.29 
#   F:core/pcm_memory.c:1.25->1.26 
#   F:core/rawmidi.c:1.41->1.42 
#   F:core/rtctimer.c:1.19->1.20 
#   F:core/sound.c:1.59->1.60 
#   F:core/timer.c:1.56->1.57 
#   F:core/oss/pcm_oss.c:1.66->1.67 
#   F:core/seq/seq.c:1.9->1.10 
#   F:core/seq/seq_dummy.c:1.10->1.11 
#   F:core/seq/seq_midi.c:1.18->1.19 
#   F:core/seq/oss/seq_oss.c:1.11->1.12 
#   F:core/seq/oss/seq_oss_init.c:1.11->1.12 
#   F:drivers/dummy.c:1.26->1.27 
#   F:drivers/mtpav.c:1.26->1.27 
#   F:drivers/serial-u16550.c:1.25->1.26 
#   F:drivers/virmidi.c:1.11->1.12 
#   F:drivers/mpu401/mpu401.c:1.16->1.17 
#   F:drivers/opl3/opl3_seq.c:1.12->1.13 
#   F:drivers/opl4/opl4_seq.c:1.2->1.3 
#   F:include/initval.h:1.19->1.20 
#   F:isa/als100.c:1.24->1.25 
#   F:isa/azt2320.c:1.24->1.25 
#   F:isa/cmi8330.c:1.28->1.29 
#   F:isa/dt019x.c:1.18->1.19 
#   F:isa/es18xx.c:1.44->1.45 
#   F:isa/opl3sa2.c:1.32->1.33 
#   F:isa/sgalaxy.c:1.19->1.20 
#   F:isa/sscape.c:1.11->1.12 
#   F:isa/ad1816a/ad1816a.c:1.18->1.19 
#   F:isa/ad1848/ad1848.c:1.10->1.11 
#   F:isa/cs423x/cs4231.c:1.12->1.13 
#   F:isa/cs423x/cs4236.c:1.41->1.42 
#   F:isa/cs423x/pc98.c:1.7->1.8 
#   F:isa/es1688/es1688.c:1.14->1.15 
#   F:isa/gus/gusclassic.c:1.13->1.14 
#   F:isa/gus/gusextreme.c:1.15->1.16 
#   F:isa/gus/gusmax.c:1.14->1.15 
#   F:isa/gus/interwave.c:1.32->1.33 
#   F:isa/opti9xx/opti92x-ad1848.c:1.42->1.43 
#   F:isa/sb/emu8000_patch.c:1.8->1.9 
#   F:isa/sb/es968.c:1.24->1.25 
#   F:isa/sb/sb16.c:1.45->1.46 
#   F:isa/sb/sb8.c:1.18->1.19 
#   F:isa/wavefront/wavefront.c:1.27->1.28 
#   F:isa/wavefront/wavefront_synth.c:1.14->1.15 
#   F:parisc/harmony.c:1.5->1.6 
#   F:pci/als4000.c:1.31->1.32 
#   F:pci/atiixp.c:1.2->1.3 
#   F:pci/azt3328.c:1.11->1.12 
#   F:pci/bt87x.c:1.3->1.4 
#   F:pci/cmipci.c:1.61->1.62 
#   F:pci/cs4281.c:1.50->1.51 
#   F:pci/ens1370.c:1.58->1.59 
#   F:pci/es1938.c:1.33->1.34 
#   F:pci/es1968.c:1.61->1.62 
#   F:pci/fm801.c:1.43->1.44 
#   F:pci/intel8x0.c:1.130->1.131 
#   F:pci/intel8x0m.c:1.1->1.2 
#   F:pci/maestro3.c:1.48->1.49 
#   F:pci/rme32.c:1.31->1.32 
#   F:pci/rme96.c:1.33->1.34 
#   F:pci/sonicvibes.c:1.33->1.34 
#   F:pci/via82xx.c:1.94->1.95 
#   F:pci/ac97/ac97_codec.c:1.127->1.128 
#   F:pci/ali5451/ali5451.c:1.43->1.44 
#   F:pci/au88x0/au88x0.c:1.6->1.7 
#   F:pci/cs46xx/cs46xx.c:1.24->1.25 
#   F:pci/emu10k1/emu10k1.c:1.22->1.23 
#   F:pci/ice1712/ice1712.c:1.47->1.48 
#   F:pci/ice1712/ice1724.c:1.27->1.28 
#   F:pci/korg1212/korg1212.c:1.36->1.37 
#   F:pci/mixart/mixart.c:1.6->1.7 
#   F:pci/nm256/nm256.c:1.33->1.34 
#   F:pci/rme9652/hdsp.c:1.54->1.55 
#   F:pci/rme9652/rme9652.c:1.42->1.43 
#   F:pci/trident/trident.c:1.21->1.22 
#   F:pci/vx222/vx222.c:1.3->1.4 
#   F:pci/ymfpci/ymfpci.c:1.33->1.34 
#   F:pcmcia/pdaudiocf/pdaudiocf.c:1.4->1.5 
#   F:pcmcia/vx/vxpocket.c:1.3->1.4 
#   F:ppc/powermac.c:1.15->1.16 
#   F:sparc/amd7930.c:1.8->1.9 
#   F:sparc/cs4231.c:1.12->1.13 
#   F:usb/usbaudio.c:1.96->1.97 
#   L:use the new module_param*() functions.
# 
# sound/pci/ac97/ac97_codec.c
#   2004/04/07 12:48:18+02:00 perex@suse.cz +2 -1
#   ALSA CVS update
#   D:2004/04/07 18:48:10
#   C:Documentation,SA11xx UDA1341 driver,Memalloc module,PCM Midlevel
#   C:RawMidi Midlevel,RTC timer driver,ALSA Core,Timer Midlevel
#   C:ALSA<-OSS emulation,ALSA sequencer,ALSA<-OSS sequencer,Generic drivers
#   C:MPU401 UART,OPL3,OPL4,ALS100 driver,AZT2320 driver,CMI8330 driver
#   C:DT019x driver,ES18xx driver,OPL3SA2 driver,Sound Galaxy driver
#   C:Sound Scape driver,AD1816A driver,AD1848 driver,CS4231 driver
#   C:CS4236+ driver,PC98(CS423x) driver,ES1688 driver,GUS Classic driver
#   C:GUS Extreme driver,GUS MAX driver,AMD InterWave driver,Opti9xx drivers
#   C:EMU8000 driver,ES968 driver,SB16/AWE driver,SB8 driver
#   C:Wavefront drivers,PARISC Harmony driver,ALS4000 driver,ATIIXP driver
#   C:AZT3328 driver,BT87x driver,CMIPCI driver,CS4281 driver
#   C:ENS1370/1+ driver,ES1938 driver,ES1968 driver,FM801 driver
#   C:Intel8x0 driver,Intel8x0-modem driver,Maestro3 driver,RME32 driver
#   C:RME96 driver,SonicVibes driver,VIA82xx driver,AC97 Codec Core
#   C:ALI5451 driver,au88x0 driver,CS46xx driver,EMU10K1/EMU10K2 driver
#   C:ICE1712 driver,ICE1724 driver,KORG1212 driver,MIXART driver
#   C:NM256 driver,RME HDSP driver,RME9652 driver,Trident driver
#   C:Digigram VX222 driver,YMFPCI driver,Sound Core PDAudioCF driver
#   C:Digigram VX Pocket driver,PPC PowerMac driver,SPARC AMD7930 driver
#   C:SPARC cs4231 driver,USB generic driver
#   A:Takashi Iwai <tiwai@suse.de>
#   F:Documentation/DocBook/writing-an-alsa-driver.tmpl:1.24->1.25 
#   F:arm/sa11xx-uda1341.c:1.13->1.14 
#   F:core/memalloc.c:1.28->1.29 
#   F:core/pcm_memory.c:1.25->1.26 
#   F:core/rawmidi.c:1.41->1.42 
#   F:core/rtctimer.c:1.19->1.20 
#   F:core/sound.c:1.59->1.60 
#   F:core/timer.c:1.56->1.57 
#   F:core/oss/pcm_oss.c:1.66->1.67 
#   F:core/seq/seq.c:1.9->1.10 
#   F:core/seq/seq_dummy.c:1.10->1.11 
#   F:core/seq/seq_midi.c:1.18->1.19 
#   F:core/seq/oss/seq_oss.c:1.11->1.12 
#   F:core/seq/oss/seq_oss_init.c:1.11->1.12 
#   F:drivers/dummy.c:1.26->1.27 
#   F:drivers/mtpav.c:1.26->1.27 
#   F:drivers/serial-u16550.c:1.25->1.26 
#   F:drivers/virmidi.c:1.11->1.12 
#   F:drivers/mpu401/mpu401.c:1.16->1.17 
#   F:drivers/opl3/opl3_seq.c:1.12->1.13 
#   F:drivers/opl4/opl4_seq.c:1.2->1.3 
#   F:include/initval.h:1.19->1.20 
#   F:isa/als100.c:1.24->1.25 
#   F:isa/azt2320.c:1.24->1.25 
#   F:isa/cmi8330.c:1.28->1.29 
#   F:isa/dt019x.c:1.18->1.19 
#   F:isa/es18xx.c:1.44->1.45 
#   F:isa/opl3sa2.c:1.32->1.33 
#   F:isa/sgalaxy.c:1.19->1.20 
#   F:isa/sscape.c:1.11->1.12 
#   F:isa/ad1816a/ad1816a.c:1.18->1.19 
#   F:isa/ad1848/ad1848.c:1.10->1.11 
#   F:isa/cs423x/cs4231.c:1.12->1.13 
#   F:isa/cs423x/cs4236.c:1.41->1.42 
#   F:isa/cs423x/pc98.c:1.7->1.8 
#   F:isa/es1688/es1688.c:1.14->1.15 
#   F:isa/gus/gusclassic.c:1.13->1.14 
#   F:isa/gus/gusextreme.c:1.15->1.16 
#   F:isa/gus/gusmax.c:1.14->1.15 
#   F:isa/gus/interwave.c:1.32->1.33 
#   F:isa/opti9xx/opti92x-ad1848.c:1.42->1.43 
#   F:isa/sb/emu8000_patch.c:1.8->1.9 
#   F:isa/sb/es968.c:1.24->1.25 
#   F:isa/sb/sb16.c:1.45->1.46 
#   F:isa/sb/sb8.c:1.18->1.19 
#   F:isa/wavefront/wavefront.c:1.27->1.28 
#   F:isa/wavefront/wavefront_synth.c:1.14->1.15 
#   F:parisc/harmony.c:1.5->1.6 
#   F:pci/als4000.c:1.31->1.32 
#   F:pci/atiixp.c:1.2->1.3 
#   F:pci/azt3328.c:1.11->1.12 
#   F:pci/bt87x.c:1.3->1.4 
#   F:pci/cmipci.c:1.61->1.62 
#   F:pci/cs4281.c:1.50->1.51 
#   F:pci/ens1370.c:1.58->1.59 
#   F:pci/es1938.c:1.33->1.34 
#   F:pci/es1968.c:1.61->1.62 
#   F:pci/fm801.c:1.43->1.44 
#   F:pci/intel8x0.c:1.130->1.131 
#   F:pci/intel8x0m.c:1.1->1.2 
#   F:pci/maestro3.c:1.48->1.49 
#   F:pci/rme32.c:1.31->1.32 
#   F:pci/rme96.c:1.33->1.34 
#   F:pci/sonicvibes.c:1.33->1.34 
#   F:pci/via82xx.c:1.94->1.95 
#   F:pci/ac97/ac97_codec.c:1.127->1.128 
#   F:pci/ali5451/ali5451.c:1.43->1.44 
#   F:pci/au88x0/au88x0.c:1.6->1.7 
#   F:pci/cs46xx/cs46xx.c:1.24->1.25 
#   F:pci/emu10k1/emu10k1.c:1.22->1.23 
#   F:pci/ice1712/ice1712.c:1.47->1.48 
#   F:pci/ice1712/ice1724.c:1.27->1.28 
#   F:pci/korg1212/korg1212.c:1.36->1.37 
#   F:pci/mixart/mixart.c:1.6->1.7 
#   F:pci/nm256/nm256.c:1.33->1.34 
#   F:pci/rme9652/hdsp.c:1.54->1.55 
#   F:pci/rme9652/rme9652.c:1.42->1.43 
#   F:pci/trident/trident.c:1.21->1.22 
#   F:pci/vx222/vx222.c:1.3->1.4 
#   F:pci/ymfpci/ymfpci.c:1.33->1.34 
#   F:pcmcia/pdaudiocf/pdaudiocf.c:1.4->1.5 
#   F:pcmcia/vx/vxpocket.c:1.3->1.4 
#   F:ppc/powermac.c:1.15->1.16 
#   F:sparc/amd7930.c:1.8->1.9 
#   F:sparc/cs4231.c:1.12->1.13 
#   F:usb/usbaudio.c:1.96->1.97 
#   L:use the new module_param*() functions.
# 
# sound/parisc/harmony.c
#   2004/04/07 12:48:15+02:00 perex@suse.cz +12 -1
#   ALSA CVS update
#   D:2004/04/07 18:48:10
#   C:Documentation,SA11xx UDA1341 driver,Memalloc module,PCM Midlevel
#   C:RawMidi Midlevel,RTC timer driver,ALSA Core,Timer Midlevel
#   C:ALSA<-OSS emulation,ALSA sequencer,ALSA<-OSS sequencer,Generic drivers
#   C:MPU401 UART,OPL3,OPL4,ALS100 driver,AZT2320 driver,CMI8330 driver
#   C:DT019x driver,ES18xx driver,OPL3SA2 driver,Sound Galaxy driver
#   C:Sound Scape driver,AD1816A driver,AD1848 driver,CS4231 driver
#   C:CS4236+ driver,PC98(CS423x) driver,ES1688 driver,GUS Classic driver
#   C:GUS Extreme driver,GUS MAX driver,AMD InterWave driver,Opti9xx drivers
#   C:EMU8000 driver,ES968 driver,SB16/AWE driver,SB8 driver
#   C:Wavefront drivers,PARISC Harmony driver,ALS4000 driver,ATIIXP driver
#   C:AZT3328 driver,BT87x driver,CMIPCI driver,CS4281 driver
#   C:ENS1370/1+ driver,ES1938 driver,ES1968 driver,FM801 driver
#   C:Intel8x0 driver,Intel8x0-modem driver,Maestro3 driver,RME32 driver
#   C:RME96 driver,SonicVibes driver,VIA82xx driver,AC97 Codec Core
#   C:ALI5451 driver,au88x0 driver,CS46xx driver,EMU10K1/EMU10K2 driver
#   C:ICE1712 driver,ICE1724 driver,KORG1212 driver,MIXART driver
#   C:NM256 driver,RME HDSP driver,RME9652 driver,Trident driver
#   C:Digigram VX222 driver,YMFPCI driver,Sound Core PDAudioCF driver
#   C:Digigram VX Pocket driver,PPC PowerMac driver,SPARC AMD7930 driver
#   C:SPARC cs4231 driver,USB generic driver
#   A:Takashi Iwai <tiwai@suse.de>
#   F:Documentation/DocBook/writing-an-alsa-driver.tmpl:1.24->1.25 
#   F:arm/sa11xx-uda1341.c:1.13->1.14 
#   F:core/memalloc.c:1.28->1.29 
#   F:core/pcm_memory.c:1.25->1.26 
#   F:core/rawmidi.c:1.41->1.42 
#   F:core/rtctimer.c:1.19->1.20 
#   F:core/sound.c:1.59->1.60 
#   F:core/timer.c:1.56->1.57 
#   F:core/oss/pcm_oss.c:1.66->1.67 
#   F:core/seq/seq.c:1.9->1.10 
#   F:core/seq/seq_dummy.c:1.10->1.11 
#   F:core/seq/seq_midi.c:1.18->1.19 
#   F:core/seq/oss/seq_oss.c:1.11->1.12 
#   F:core/seq/oss/seq_oss_init.c:1.11->1.12 
#   F:drivers/dummy.c:1.26->1.27 
#   F:drivers/mtpav.c:1.26->1.27 
#   F:drivers/serial-u16550.c:1.25->1.26 
#   F:drivers/virmidi.c:1.11->1.12 
#   F:drivers/mpu401/mpu401.c:1.16->1.17 
#   F:drivers/opl3/opl3_seq.c:1.12->1.13 
#   F:drivers/opl4/opl4_seq.c:1.2->1.3 
#   F:include/initval.h:1.19->1.20 
#   F:isa/als100.c:1.24->1.25 
#   F:isa/azt2320.c:1.24->1.25 
#   F:isa/cmi8330.c:1.28->1.29 
#   F:isa/dt019x.c:1.18->1.19 
#   F:isa/es18xx.c:1.44->1.45 
#   F:isa/opl3sa2.c:1.32->1.33 
#   F:isa/sgalaxy.c:1.19->1.20 
#   F:isa/sscape.c:1.11->1.12 
#   F:isa/ad1816a/ad1816a.c:1.18->1.19 
#   F:isa/ad1848/ad1848.c:1.10->1.11 
#   F:isa/cs423x/cs4231.c:1.12->1.13 
#   F:isa/cs423x/cs4236.c:1.41->1.42 
#   F:isa/cs423x/pc98.c:1.7->1.8 
#   F:isa/es1688/es1688.c:1.14->1.15 
#   F:isa/gus/gusclassic.c:1.13->1.14 
#   F:isa/gus/gusextreme.c:1.15->1.16 
#   F:isa/gus/gusmax.c:1.14->1.15 
#   F:isa/gus/interwave.c:1.32->1.33 
#   F:isa/opti9xx/opti92x-ad1848.c:1.42->1.43 
#   F:isa/sb/emu8000_patch.c:1.8->1.9 
#   F:isa/sb/es968.c:1.24->1.25 
#   F:isa/sb/sb16.c:1.45->1.46 
#   F:isa/sb/sb8.c:1.18->1.19 
#   F:isa/wavefront/wavefront.c:1.27->1.28 
#   F:isa/wavefront/wavefront_synth.c:1.14->1.15 
#   F:parisc/harmony.c:1.5->1.6 
#   F:pci/als4000.c:1.31->1.32 
#   F:pci/atiixp.c:1.2->1.3 
#   F:pci/azt3328.c:1.11->1.12 
#   F:pci/bt87x.c:1.3->1.4 
#   F:pci/cmipci.c:1.61->1.62 
#   F:pci/cs4281.c:1.50->1.51 
#   F:pci/ens1370.c:1.58->1.59 
#   F:pci/es1938.c:1.33->1.34 
#   F:pci/es1968.c:1.61->1.62 
#   F:pci/fm801.c:1.43->1.44 
#   F:pci/intel8x0.c:1.130->1.131 
#   F:pci/intel8x0m.c:1.1->1.2 
#   F:pci/maestro3.c:1.48->1.49 
#   F:pci/rme32.c:1.31->1.32 
#   F:pci/rme96.c:1.33->1.34 
#   F:pci/sonicvibes.c:1.33->1.34 
#   F:pci/via82xx.c:1.94->1.95 
#   F:pci/ac97/ac97_codec.c:1.127->1.128 
#   F:pci/ali5451/ali5451.c:1.43->1.44 
#   F:pci/au88x0/au88x0.c:1.6->1.7 
#   F:pci/cs46xx/cs46xx.c:1.24->1.25 
#   F:pci/emu10k1/emu10k1.c:1.22->1.23 
#   F:pci/ice1712/ice1712.c:1.47->1.48 
#   F:pci/ice1712/ice1724.c:1.27->1.28 
#   F:pci/korg1212/korg1212.c:1.36->1.37 
#   F:pci/mixart/mixart.c:1.6->1.7 
#   F:pci/nm256/nm256.c:1.33->1.34 
#   F:pci/rme9652/hdsp.c:1.54->1.55 
#   F:pci/rme9652/rme9652.c:1.42->1.43 
#   F:pci/trident/trident.c:1.21->1.22 
#   F:pci/vx222/vx222.c:1.3->1.4 
#   F:pci/ymfpci/ymfpci.c:1.33->1.34 
#   F:pcmcia/pdaudiocf/pdaudiocf.c:1.4->1.5 
#   F:pcmcia/vx/vxpocket.c:1.3->1.4 
#   F:ppc/powermac.c:1.15->1.16 
#   F:sparc/amd7930.c:1.8->1.9 
#   F:sparc/cs4231.c:1.12->1.13 
#   F:usb/usbaudio.c:1.96->1.97 
#   L:use the new module_param*() functions.
# 
# sound/isa/wavefront/wavefront_synth.c
#   2004/04/07 12:48:15+02:00 perex@suse.cz +11 -10
#   ALSA CVS update
#   D:2004/04/07 18:48:10
#   C:Documentation,SA11xx UDA1341 driver,Memalloc module,PCM Midlevel
#   C:RawMidi Midlevel,RTC timer driver,ALSA Core,Timer Midlevel
#   C:ALSA<-OSS emulation,ALSA sequencer,ALSA<-OSS sequencer,Generic drivers
#   C:MPU401 UART,OPL3,OPL4,ALS100 driver,AZT2320 driver,CMI8330 driver
#   C:DT019x driver,ES18xx driver,OPL3SA2 driver,Sound Galaxy driver
#   C:Sound Scape driver,AD1816A driver,AD1848 driver,CS4231 driver
#   C:CS4236+ driver,PC98(CS423x) driver,ES1688 driver,GUS Classic driver
#   C:GUS Extreme driver,GUS MAX driver,AMD InterWave driver,Opti9xx drivers
#   C:EMU8000 driver,ES968 driver,SB16/AWE driver,SB8 driver
#   C:Wavefront drivers,PARISC Harmony driver,ALS4000 driver,ATIIXP driver
#   C:AZT3328 driver,BT87x driver,CMIPCI driver,CS4281 driver
#   C:ENS1370/1+ driver,ES1938 driver,ES1968 driver,FM801 driver
#   C:Intel8x0 driver,Intel8x0-modem driver,Maestro3 driver,RME32 driver
#   C:RME96 driver,SonicVibes driver,VIA82xx driver,AC97 Codec Core
#   C:ALI5451 driver,au88x0 driver,CS46xx driver,EMU10K1/EMU10K2 driver
#   C:ICE1712 driver,ICE1724 driver,KORG1212 driver,MIXART driver
#   C:NM256 driver,RME HDSP driver,RME9652 driver,Trident driver
#   C:Digigram VX222 driver,YMFPCI driver,Sound Core PDAudioCF driver
#   C:Digigram VX Pocket driver,PPC PowerMac driver,SPARC AMD7930 driver
#   C:SPARC cs4231 driver,USB generic driver
#   A:Takashi Iwai <tiwai@suse.de>
#   F:Documentation/DocBook/writing-an-alsa-driver.tmpl:1.24->1.25 
#   F:arm/sa11xx-uda1341.c:1.13->1.14 
#   F:core/memalloc.c:1.28->1.29 
#   F:core/pcm_memory.c:1.25->1.26 
#   F:core/rawmidi.c:1.41->1.42 
#   F:core/rtctimer.c:1.19->1.20 
#   F:core/sound.c:1.59->1.60 
#   F:core/timer.c:1.56->1.57 
#   F:core/oss/pcm_oss.c:1.66->1.67 
#   F:core/seq/seq.c:1.9->1.10 
#   F:core/seq/seq_dummy.c:1.10->1.11 
#   F:core/seq/seq_midi.c:1.18->1.19 
#   F:core/seq/oss/seq_oss.c:1.11->1.12 
#   F:core/seq/oss/seq_oss_init.c:1.11->1.12 
#   F:drivers/dummy.c:1.26->1.27 
#   F:drivers/mtpav.c:1.26->1.27 
#   F:drivers/serial-u16550.c:1.25->1.26 
#   F:drivers/virmidi.c:1.11->1.12 
#   F:drivers/mpu401/mpu401.c:1.16->1.17 
#   F:drivers/opl3/opl3_seq.c:1.12->1.13 
#   F:drivers/opl4/opl4_seq.c:1.2->1.3 
#   F:include/initval.h:1.19->1.20 
#   F:isa/als100.c:1.24->1.25 
#   F:isa/azt2320.c:1.24->1.25 
#   F:isa/cmi8330.c:1.28->1.29 
#   F:isa/dt019x.c:1.18->1.19 
#   F:isa/es18xx.c:1.44->1.45 
#   F:isa/opl3sa2.c:1.32->1.33 
#   F:isa/sgalaxy.c:1.19->1.20 
#   F:isa/sscape.c:1.11->1.12 
#   F:isa/ad1816a/ad1816a.c:1.18->1.19 
#   F:isa/ad1848/ad1848.c:1.10->1.11 
#   F:isa/cs423x/cs4231.c:1.12->1.13 
#   F:isa/cs423x/cs4236.c:1.41->1.42 
#   F:isa/cs423x/pc98.c:1.7->1.8 
#   F:isa/es1688/es1688.c:1.14->1.15 
#   F:isa/gus/gusclassic.c:1.13->1.14 
#   F:isa/gus/gusextreme.c:1.15->1.16 
#   F:isa/gus/gusmax.c:1.14->1.15 
#   F:isa/gus/interwave.c:1.32->1.33 
#   F:isa/opti9xx/opti92x-ad1848.c:1.42->1.43 
#   F:isa/sb/emu8000_patch.c:1.8->1.9 
#   F:isa/sb/es968.c:1.24->1.25 
#   F:isa/sb/sb16.c:1.45->1.46 
#   F:isa/sb/sb8.c:1.18->1.19 
#   F:isa/wavefront/wavefront.c:1.27->1.28 
#   F:isa/wavefront/wavefront_synth.c:1.14->1.15 
#   F:parisc/harmony.c:1.5->1.6 
#   F:pci/als4000.c:1.31->1.32 
#   F:pci/atiixp.c:1.2->1.3 
#   F:pci/azt3328.c:1.11->1.12 
#   F:pci/bt87x.c:1.3->1.4 
#   F:pci/cmipci.c:1.61->1.62 
#   F:pci/cs4281.c:1.50->1.51 
#   F:pci/ens1370.c:1.58->1.59 
#   F:pci/es1938.c:1.33->1.34 
#   F:pci/es1968.c:1.61->1.62 
#   F:pci/fm801.c:1.43->1.44 
#   F:pci/intel8x0.c:1.130->1.131 
#   F:pci/intel8x0m.c:1.1->1.2 
#   F:pci/maestro3.c:1.48->1.49 
#   F:pci/rme32.c:1.31->1.32 
#   F:pci/rme96.c:1.33->1.34 
#   F:pci/sonicvibes.c:1.33->1.34 
#   F:pci/via82xx.c:1.94->1.95 
#   F:pci/ac97/ac97_codec.c:1.127->1.128 
#   F:pci/ali5451/ali5451.c:1.43->1.44 
#   F:pci/au88x0/au88x0.c:1.6->1.7 
#   F:pci/cs46xx/cs46xx.c:1.24->1.25 
#   F:pci/emu10k1/emu10k1.c:1.22->1.23 
#   F:pci/ice1712/ice1712.c:1.47->1.48 
#   F:pci/ice1712/ice1724.c:1.27->1.28 
#   F:pci/korg1212/korg1212.c:1.36->1.37 
#   F:pci/mixart/mixart.c:1.6->1.7 
#   F:pci/nm256/nm256.c:1.33->1.34 
#   F:pci/rme9652/hdsp.c:1.54->1.55 
#   F:pci/rme9652/rme9652.c:1.42->1.43 
#   F:pci/trident/trident.c:1.21->1.22 
#   F:pci/vx222/vx222.c:1.3->1.4 
#   F:pci/ymfpci/ymfpci.c:1.33->1.34 
#   F:pcmcia/pdaudiocf/pdaudiocf.c:1.4->1.5 
#   F:pcmcia/vx/vxpocket.c:1.3->1.4 
#   F:ppc/powermac.c:1.15->1.16 
#   F:sparc/amd7930.c:1.8->1.9 
#   F:sparc/cs4231.c:1.12->1.13 
#   F:usb/usbaudio.c:1.96->1.97 
#   L:use the new module_param*() functions.
# 
# sound/isa/wavefront/wavefront.c
#   2004/04/07 12:48:15+02:00 perex@suse.cz +16 -53
#   ALSA CVS update
#   D:2004/04/07 18:48:10
#   C:Documentation,SA11xx UDA1341 driver,Memalloc module,PCM Midlevel
#   C:RawMidi Midlevel,RTC timer driver,ALSA Core,Timer Midlevel
#   C:ALSA<-OSS emulation,ALSA sequencer,ALSA<-OSS sequencer,Generic drivers
#   C:MPU401 UART,OPL3,OPL4,ALS100 driver,AZT2320 driver,CMI8330 driver
#   C:DT019x driver,ES18xx driver,OPL3SA2 driver,Sound Galaxy driver
#   C:Sound Scape driver,AD1816A driver,AD1848 driver,CS4231 driver
#   C:CS4236+ driver,PC98(CS423x) driver,ES1688 driver,GUS Classic driver
#   C:GUS Extreme driver,GUS MAX driver,AMD InterWave driver,Opti9xx drivers
#   C:EMU8000 driver,ES968 driver,SB16/AWE driver,SB8 driver
#   C:Wavefront drivers,PARISC Harmony driver,ALS4000 driver,ATIIXP driver
#   C:AZT3328 driver,BT87x driver,CMIPCI driver,CS4281 driver
#   C:ENS1370/1+ driver,ES1938 driver,ES1968 driver,FM801 driver
#   C:Intel8x0 driver,Intel8x0-modem driver,Maestro3 driver,RME32 driver
#   C:RME96 driver,SonicVibes driver,VIA82xx driver,AC97 Codec Core
#   C:ALI5451 driver,au88x0 driver,CS46xx driver,EMU10K1/EMU10K2 driver
#   C:ICE1712 driver,ICE1724 driver,KORG1212 driver,MIXART driver
#   C:NM256 driver,RME HDSP driver,RME9652 driver,Trident driver
#   C:Digigram VX222 driver,YMFPCI driver,Sound Core PDAudioCF driver
#   C:Digigram VX Pocket driver,PPC PowerMac driver,SPARC AMD7930 driver
#   C:SPARC cs4231 driver,USB generic driver
#   A:Takashi Iwai <tiwai@suse.de>
#   F:Documentation/DocBook/writing-an-alsa-driver.tmpl:1.24->1.25 
#   F:arm/sa11xx-uda1341.c:1.13->1.14 
#   F:core/memalloc.c:1.28->1.29 
#   F:core/pcm_memory.c:1.25->1.26 
#   F:core/rawmidi.c:1.41->1.42 
#   F:core/rtctimer.c:1.19->1.20 
#   F:core/sound.c:1.59->1.60 
#   F:core/timer.c:1.56->1.57 
#   F:core/oss/pcm_oss.c:1.66->1.67 
#   F:core/seq/seq.c:1.9->1.10 
#   F:core/seq/seq_dummy.c:1.10->1.11 
#   F:core/seq/seq_midi.c:1.18->1.19 
#   F:core/seq/oss/seq_oss.c:1.11->1.12 
#   F:core/seq/oss/seq_oss_init.c:1.11->1.12 
#   F:drivers/dummy.c:1.26->1.27 
#   F:drivers/mtpav.c:1.26->1.27 
#   F:drivers/serial-u16550.c:1.25->1.26 
#   F:drivers/virmidi.c:1.11->1.12 
#   F:drivers/mpu401/mpu401.c:1.16->1.17 
#   F:drivers/opl3/opl3_seq.c:1.12->1.13 
#   F:drivers/opl4/opl4_seq.c:1.2->1.3 
#   F:include/initval.h:1.19->1.20 
#   F:isa/als100.c:1.24->1.25 
#   F:isa/azt2320.c:1.24->1.25 
#   F:isa/cmi8330.c:1.28->1.29 
#   F:isa/dt019x.c:1.18->1.19 
#   F:isa/es18xx.c:1.44->1.45 
#   F:isa/opl3sa2.c:1.32->1.33 
#   F:isa/sgalaxy.c:1.19->1.20 
#   F:isa/sscape.c:1.11->1.12 
#   F:isa/ad1816a/ad1816a.c:1.18->1.19 
#   F:isa/ad1848/ad1848.c:1.10->1.11 
#   F:isa/cs423x/cs4231.c:1.12->1.13 
#   F:isa/cs423x/cs4236.c:1.41->1.42 
#   F:isa/cs423x/pc98.c:1.7->1.8 
#   F:isa/es1688/es1688.c:1.14->1.15 
#   F:isa/gus/gusclassic.c:1.13->1.14 
#   F:isa/gus/gusextreme.c:1.15->1.16 
#   F:isa/gus/gusmax.c:1.14->1.15 
#   F:isa/gus/interwave.c:1.32->1.33 
#   F:isa/opti9xx/opti92x-ad1848.c:1.42->1.43 
#   F:isa/sb/emu8000_patch.c:1.8->1.9 
#   F:isa/sb/es968.c:1.24->1.25 
#   F:isa/sb/sb16.c:1.45->1.46 
#   F:isa/sb/sb8.c:1.18->1.19 
#   F:isa/wavefront/wavefront.c:1.27->1.28 
#   F:isa/wavefront/wavefront_synth.c:1.14->1.15 
#   F:parisc/harmony.c:1.5->1.6 
#   F:pci/als4000.c:1.31->1.32 
#   F:pci/atiixp.c:1.2->1.3 
#   F:pci/azt3328.c:1.11->1.12 
#   F:pci/bt87x.c:1.3->1.4 
#   F:pci/cmipci.c:1.61->1.62 
#   F:pci/cs4281.c:1.50->1.51 
#   F:pci/ens1370.c:1.58->1.59 
#   F:pci/es1938.c:1.33->1.34 
#   F:pci/es1968.c:1.61->1.62 
#   F:pci/fm801.c:1.43->1.44 
#   F:pci/intel8x0.c:1.130->1.131 
#   F:pci/intel8x0m.c:1.1->1.2 
#   F:pci/maestro3.c:1.48->1.49 
#   F:pci/rme32.c:1.31->1.32 
#   F:pci/rme96.c:1.33->1.34 
#   F:pci/sonicvibes.c:1.33->1.34 
#   F:pci/via82xx.c:1.94->1.95 
#   F:pci/ac97/ac97_codec.c:1.127->1.128 
#   F:pci/ali5451/ali5451.c:1.43->1.44 
#   F:pci/au88x0/au88x0.c:1.6->1.7 
#   F:pci/cs46xx/cs46xx.c:1.24->1.25 
#   F:pci/emu10k1/emu10k1.c:1.22->1.23 
#   F:pci/ice1712/ice1712.c:1.47->1.48 
#   F:pci/ice1712/ice1724.c:1.27->1.28 
#   F:pci/korg1212/korg1212.c:1.36->1.37 
#   F:pci/mixart/mixart.c:1.6->1.7 
#   F:pci/nm256/nm256.c:1.33->1.34 
#   F:pci/rme9652/hdsp.c:1.54->1.55 
#   F:pci/rme9652/rme9652.c:1.42->1.43 
#   F:pci/trident/trident.c:1.21->1.22 
#   F:pci/vx222/vx222.c:1.3->1.4 
#   F:pci/ymfpci/ymfpci.c:1.33->1.34 
#   F:pcmcia/pdaudiocf/pdaudiocf.c:1.4->1.5 
#   F:pcmcia/vx/vxpocket.c:1.3->1.4 
#   F:ppc/powermac.c:1.15->1.16 
#   F:sparc/amd7930.c:1.8->1.9 
#   F:sparc/cs4231.c:1.12->1.13 
#   F:usb/usbaudio.c:1.96->1.97 
#   L:use the new module_param*() functions.
# 
# sound/isa/sscape.c
#   2004/04/07 12:48:13+02:00 perex@suse.cz +8 -34
#   ALSA CVS update
#   D:2004/04/07 18:48:10
#   C:Documentation,SA11xx UDA1341 driver,Memalloc module,PCM Midlevel
#   C:RawMidi Midlevel,RTC timer driver,ALSA Core,Timer Midlevel
#   C:ALSA<-OSS emulation,ALSA sequencer,ALSA<-OSS sequencer,Generic drivers
#   C:MPU401 UART,OPL3,OPL4,ALS100 driver,AZT2320 driver,CMI8330 driver
#   C:DT019x driver,ES18xx driver,OPL3SA2 driver,Sound Galaxy driver
#   C:Sound Scape driver,AD1816A driver,AD1848 driver,CS4231 driver
#   C:CS4236+ driver,PC98(CS423x) driver,ES1688 driver,GUS Classic driver
#   C:GUS Extreme driver,GUS MAX driver,AMD InterWave driver,Opti9xx drivers
#   C:EMU8000 driver,ES968 driver,SB16/AWE driver,SB8 driver
#   C:Wavefront drivers,PARISC Harmony driver,ALS4000 driver,ATIIXP driver
#   C:AZT3328 driver,BT87x driver,CMIPCI driver,CS4281 driver
#   C:ENS1370/1+ driver,ES1938 driver,ES1968 driver,FM801 driver
#   C:Intel8x0 driver,Intel8x0-modem driver,Maestro3 driver,RME32 driver
#   C:RME96 driver,SonicVibes driver,VIA82xx driver,AC97 Codec Core
#   C:ALI5451 driver,au88x0 driver,CS46xx driver,EMU10K1/EMU10K2 driver
#   C:ICE1712 driver,ICE1724 driver,KORG1212 driver,MIXART driver
#   C:NM256 driver,RME HDSP driver,RME9652 driver,Trident driver
#   C:Digigram VX222 driver,YMFPCI driver,Sound Core PDAudioCF driver
#   C:Digigram VX Pocket driver,PPC PowerMac driver,SPARC AMD7930 driver
#   C:SPARC cs4231 driver,USB generic driver
#   A:Takashi Iwai <tiwai@suse.de>
#   F:Documentation/DocBook/writing-an-alsa-driver.tmpl:1.24->1.25 
#   F:arm/sa11xx-uda1341.c:1.13->1.14 
#   F:core/memalloc.c:1.28->1.29 
#   F:core/pcm_memory.c:1.25->1.26 
#   F:core/rawmidi.c:1.41->1.42 
#   F:core/rtctimer.c:1.19->1.20 
#   F:core/sound.c:1.59->1.60 
#   F:core/timer.c:1.56->1.57 
#   F:core/oss/pcm_oss.c:1.66->1.67 
#   F:core/seq/seq.c:1.9->1.10 
#   F:core/seq/seq_dummy.c:1.10->1.11 
#   F:core/seq/seq_midi.c:1.18->1.19 
#   F:core/seq/oss/seq_oss.c:1.11->1.12 
#   F:core/seq/oss/seq_oss_init.c:1.11->1.12 
#   F:drivers/dummy.c:1.26->1.27 
#   F:drivers/mtpav.c:1.26->1.27 
#   F:drivers/serial-u16550.c:1.25->1.26 
#   F:drivers/virmidi.c:1.11->1.12 
#   F:drivers/mpu401/mpu401.c:1.16->1.17 
#   F:drivers/opl3/opl3_seq.c:1.12->1.13 
#   F:drivers/opl4/opl4_seq.c:1.2->1.3 
#   F:include/initval.h:1.19->1.20 
#   F:isa/als100.c:1.24->1.25 
#   F:isa/azt2320.c:1.24->1.25 
#   F:isa/cmi8330.c:1.28->1.29 
#   F:isa/dt019x.c:1.18->1.19 
#   F:isa/es18xx.c:1.44->1.45 
#   F:isa/opl3sa2.c:1.32->1.33 
#   F:isa/sgalaxy.c:1.19->1.20 
#   F:isa/sscape.c:1.11->1.12 
#   F:isa/ad1816a/ad1816a.c:1.18->1.19 
#   F:isa/ad1848/ad1848.c:1.10->1.11 
#   F:isa/cs423x/cs4231.c:1.12->1.13 
#   F:isa/cs423x/cs4236.c:1.41->1.42 
#   F:isa/cs423x/pc98.c:1.7->1.8 
#   F:isa/es1688/es1688.c:1.14->1.15 
#   F:isa/gus/gusclassic.c:1.13->1.14 
#   F:isa/gus/gusextreme.c:1.15->1.16 
#   F:isa/gus/gusmax.c:1.14->1.15 
#   F:isa/gus/interwave.c:1.32->1.33 
#   F:isa/opti9xx/opti92x-ad1848.c:1.42->1.43 
#   F:isa/sb/emu8000_patch.c:1.8->1.9 
#   F:isa/sb/es968.c:1.24->1.25 
#   F:isa/sb/sb16.c:1.45->1.46 
#   F:isa/sb/sb8.c:1.18->1.19 
#   F:isa/wavefront/wavefront.c:1.27->1.28 
#   F:isa/wavefront/wavefront_synth.c:1.14->1.15 
#   F:parisc/harmony.c:1.5->1.6 
#   F:pci/als4000.c:1.31->1.32 
#   F:pci/atiixp.c:1.2->1.3 
#   F:pci/azt3328.c:1.11->1.12 
#   F:pci/bt87x.c:1.3->1.4 
#   F:pci/cmipci.c:1.61->1.62 
#   F:pci/cs4281.c:1.50->1.51 
#   F:pci/ens1370.c:1.58->1.59 
#   F:pci/es1938.c:1.33->1.34 
#   F:pci/es1968.c:1.61->1.62 
#   F:pci/fm801.c:1.43->1.44 
#   F:pci/intel8x0.c:1.130->1.131 
#   F:pci/intel8x0m.c:1.1->1.2 
#   F:pci/maestro3.c:1.48->1.49 
#   F:pci/rme32.c:1.31->1.32 
#   F:pci/rme96.c:1.33->1.34 
#   F:pci/sonicvibes.c:1.33->1.34 
#   F:pci/via82xx.c:1.94->1.95 
#   F:pci/ac97/ac97_codec.c:1.127->1.128 
#   F:pci/ali5451/ali5451.c:1.43->1.44 
#   F:pci/au88x0/au88x0.c:1.6->1.7 
#   F:pci/cs46xx/cs46xx.c:1.24->1.25 
#   F:pci/emu10k1/emu10k1.c:1.22->1.23 
#   F:pci/ice1712/ice1712.c:1.47->1.48 
#   F:pci/ice1712/ice1724.c:1.27->1.28 
#   F:pci/korg1212/korg1212.c:1.36->1.37 
#   F:pci/mixart/mixart.c:1.6->1.7 
#   F:pci/nm256/nm256.c:1.33->1.34 
#   F:pci/rme9652/hdsp.c:1.54->1.55 
#   F:pci/rme9652/rme9652.c:1.42->1.43 
#   F:pci/trident/trident.c:1.21->1.22 
#   F:pci/vx222/vx222.c:1.3->1.4 
#   F:pci/ymfpci/ymfpci.c:1.33->1.34 
#   F:pcmcia/pdaudiocf/pdaudiocf.c:1.4->1.5 
#   F:pcmcia/vx/vxpocket.c:1.3->1.4 
#   F:ppc/powermac.c:1.15->1.16 
#   F:sparc/amd7930.c:1.8->1.9 
#   F:sparc/cs4231.c:1.12->1.13 
#   F:usb/usbaudio.c:1.96->1.97 
#   L:use the new module_param*() functions.
# 
# sound/isa/sgalaxy.c
#   2004/04/07 12:48:13+02:00 perex@suse.cz +8 -34
#   ALSA CVS update
#   D:2004/04/07 18:48:10
#   C:Documentation,SA11xx UDA1341 driver,Memalloc module,PCM Midlevel
#   C:RawMidi Midlevel,RTC timer driver,ALSA Core,Timer Midlevel
#   C:ALSA<-OSS emulation,ALSA sequencer,ALSA<-OSS sequencer,Generic drivers
#   C:MPU401 UART,OPL3,OPL4,ALS100 driver,AZT2320 driver,CMI8330 driver
#   C:DT019x driver,ES18xx driver,OPL3SA2 driver,Sound Galaxy driver
#   C:Sound Scape driver,AD1816A driver,AD1848 driver,CS4231 driver
#   C:CS4236+ driver,PC98(CS423x) driver,ES1688 driver,GUS Classic driver
#   C:GUS Extreme driver,GUS MAX driver,AMD InterWave driver,Opti9xx drivers
#   C:EMU8000 driver,ES968 driver,SB16/AWE driver,SB8 driver
#   C:Wavefront drivers,PARISC Harmony driver,ALS4000 driver,ATIIXP driver
#   C:AZT3328 driver,BT87x driver,CMIPCI driver,CS4281 driver
#   C:ENS1370/1+ driver,ES1938 driver,ES1968 driver,FM801 driver
#   C:Intel8x0 driver,Intel8x0-modem driver,Maestro3 driver,RME32 driver
#   C:RME96 driver,SonicVibes driver,VIA82xx driver,AC97 Codec Core
#   C:ALI5451 driver,au88x0 driver,CS46xx driver,EMU10K1/EMU10K2 driver
#   C:ICE1712 driver,ICE1724 driver,KORG1212 driver,MIXART driver
#   C:NM256 driver,RME HDSP driver,RME9652 driver,Trident driver
#   C:Digigram VX222 driver,YMFPCI driver,Sound Core PDAudioCF driver
#   C:Digigram VX Pocket driver,PPC PowerMac driver,SPARC AMD7930 driver
#   C:SPARC cs4231 driver,USB generic driver
#   A:Takashi Iwai <tiwai@suse.de>
#   F:Documentation/DocBook/writing-an-alsa-driver.tmpl:1.24->1.25 
#   F:arm/sa11xx-uda1341.c:1.13->1.14 
#   F:core/memalloc.c:1.28->1.29 
#   F:core/pcm_memory.c:1.25->1.26 
#   F:core/rawmidi.c:1.41->1.42 
#   F:core/rtctimer.c:1.19->1.20 
#   F:core/sound.c:1.59->1.60 
#   F:core/timer.c:1.56->1.57 
#   F:core/oss/pcm_oss.c:1.66->1.67 
#   F:core/seq/seq.c:1.9->1.10 
#   F:core/seq/seq_dummy.c:1.10->1.11 
#   F:core/seq/seq_midi.c:1.18->1.19 
#   F:core/seq/oss/seq_oss.c:1.11->1.12 
#   F:core/seq/oss/seq_oss_init.c:1.11->1.12 
#   F:drivers/dummy.c:1.26->1.27 
#   F:drivers/mtpav.c:1.26->1.27 
#   F:drivers/serial-u16550.c:1.25->1.26 
#   F:drivers/virmidi.c:1.11->1.12 
#   F:drivers/mpu401/mpu401.c:1.16->1.17 
#   F:drivers/opl3/opl3_seq.c:1.12->1.13 
#   F:drivers/opl4/opl4_seq.c:1.2->1.3 
#   F:include/initval.h:1.19->1.20 
#   F:isa/als100.c:1.24->1.25 
#   F:isa/azt2320.c:1.24->1.25 
#   F:isa/cmi8330.c:1.28->1.29 
#   F:isa/dt019x.c:1.18->1.19 
#   F:isa/es18xx.c:1.44->1.45 
#   F:isa/opl3sa2.c:1.32->1.33 
#   F:isa/sgalaxy.c:1.19->1.20 
#   F:isa/sscape.c:1.11->1.12 
#   F:isa/ad1816a/ad1816a.c:1.18->1.19 
#   F:isa/ad1848/ad1848.c:1.10->1.11 
#   F:isa/cs423x/cs4231.c:1.12->1.13 
#   F:isa/cs423x/cs4236.c:1.41->1.42 
#   F:isa/cs423x/pc98.c:1.7->1.8 
#   F:isa/es1688/es1688.c:1.14->1.15 
#   F:isa/gus/gusclassic.c:1.13->1.14 
#   F:isa/gus/gusextreme.c:1.15->1.16 
#   F:isa/gus/gusmax.c:1.14->1.15 
#   F:isa/gus/interwave.c:1.32->1.33 
#   F:isa/opti9xx/opti92x-ad1848.c:1.42->1.43 
#   F:isa/sb/emu8000_patch.c:1.8->1.9 
#   F:isa/sb/es968.c:1.24->1.25 
#   F:isa/sb/sb16.c:1.45->1.46 
#   F:isa/sb/sb8.c:1.18->1.19 
#   F:isa/wavefront/wavefront.c:1.27->1.28 
#   F:isa/wavefront/wavefront_synth.c:1.14->1.15 
#   F:parisc/harmony.c:1.5->1.6 
#   F:pci/als4000.c:1.31->1.32 
#   F:pci/atiixp.c:1.2->1.3 
#   F:pci/azt3328.c:1.11->1.12 
#   F:pci/bt87x.c:1.3->1.4 
#   F:pci/cmipci.c:1.61->1.62 
#   F:pci/cs4281.c:1.50->1.51 
#   F:pci/ens1370.c:1.58->1.59 
#   F:pci/es1938.c:1.33->1.34 
#   F:pci/es1968.c:1.61->1.62 
#   F:pci/fm801.c:1.43->1.44 
#   F:pci/intel8x0.c:1.130->1.131 
#   F:pci/intel8x0m.c:1.1->1.2 
#   F:pci/maestro3.c:1.48->1.49 
#   F:pci/rme32.c:1.31->1.32 
#   F:pci/rme96.c:1.33->1.34 
#   F:pci/sonicvibes.c:1.33->1.34 
#   F:pci/via82xx.c:1.94->1.95 
#   F:pci/ac97/ac97_codec.c:1.127->1.128 
#   F:pci/ali5451/ali5451.c:1.43->1.44 
#   F:pci/au88x0/au88x0.c:1.6->1.7 
#   F:pci/cs46xx/cs46xx.c:1.24->1.25 
#   F:pci/emu10k1/emu10k1.c:1.22->1.23 
#   F:pci/ice1712/ice1712.c:1.47->1.48 
#   F:pci/ice1712/ice1724.c:1.27->1.28 
#   F:pci/korg1212/korg1212.c:1.36->1.37 
#   F:pci/mixart/mixart.c:1.6->1.7 
#   F:pci/nm256/nm256.c:1.33->1.34 
#   F:pci/rme9652/hdsp.c:1.54->1.55 
#   F:pci/rme9652/rme9652.c:1.42->1.43 
#   F:pci/trident/trident.c:1.21->1.22 
#   F:pci/vx222/vx222.c:1.3->1.4 
#   F:pci/ymfpci/ymfpci.c:1.33->1.34 
#   F:pcmcia/pdaudiocf/pdaudiocf.c:1.4->1.5 
#   F:pcmcia/vx/vxpocket.c:1.3->1.4 
#   F:ppc/powermac.c:1.15->1.16 
#   F:sparc/amd7930.c:1.8->1.9 
#   F:sparc/cs4231.c:1.12->1.13 
#   F:usb/usbaudio.c:1.96->1.97 
#   L:use the new module_param*() functions.
# 
# sound/isa/sb/sb8.c
#   2004/04/07 12:48:15+02:00 perex@suse.cz +8 -32
#   ALSA CVS update
#   D:2004/04/07 18:48:10
#   C:Documentation,SA11xx UDA1341 driver,Memalloc module,PCM Midlevel
#   C:RawMidi Midlevel,RTC timer driver,ALSA Core,Timer Midlevel
#   C:ALSA<-OSS emulation,ALSA sequencer,ALSA<-OSS sequencer,Generic drivers
#   C:MPU401 UART,OPL3,OPL4,ALS100 driver,AZT2320 driver,CMI8330 driver
#   C:DT019x driver,ES18xx driver,OPL3SA2 driver,Sound Galaxy driver
#   C:Sound Scape driver,AD1816A driver,AD1848 driver,CS4231 driver
#   C:CS4236+ driver,PC98(CS423x) driver,ES1688 driver,GUS Classic driver
#   C:GUS Extreme driver,GUS MAX driver,AMD InterWave driver,Opti9xx drivers
#   C:EMU8000 driver,ES968 driver,SB16/AWE driver,SB8 driver
#   C:Wavefront drivers,PARISC Harmony driver,ALS4000 driver,ATIIXP driver
#   C:AZT3328 driver,BT87x driver,CMIPCI driver,CS4281 driver
#   C:ENS1370/1+ driver,ES1938 driver,ES1968 driver,FM801 driver
#   C:Intel8x0 driver,Intel8x0-modem driver,Maestro3 driver,RME32 driver
#   C:RME96 driver,SonicVibes driver,VIA82xx driver,AC97 Codec Core
#   C:ALI5451 driver,au88x0 driver,CS46xx driver,EMU10K1/EMU10K2 driver
#   C:ICE1712 driver,ICE1724 driver,KORG1212 driver,MIXART driver
#   C:NM256 driver,RME HDSP driver,RME9652 driver,Trident driver
#   C:Digigram VX222 driver,YMFPCI driver,Sound Core PDAudioCF driver
#   C:Digigram VX Pocket driver,PPC PowerMac driver,SPARC AMD7930 driver
#   C:SPARC cs4231 driver,USB generic driver
#   A:Takashi Iwai <tiwai@suse.de>
#   F:Documentation/DocBook/writing-an-alsa-driver.tmpl:1.24->1.25 
#   F:arm/sa11xx-uda1341.c:1.13->1.14 
#   F:core/memalloc.c:1.28->1.29 
#   F:core/pcm_memory.c:1.25->1.26 
#   F:core/rawmidi.c:1.41->1.42 
#   F:core/rtctimer.c:1.19->1.20 
#   F:core/sound.c:1.59->1.60 
#   F:core/timer.c:1.56->1.57 
#   F:core/oss/pcm_oss.c:1.66->1.67 
#   F:core/seq/seq.c:1.9->1.10 
#   F:core/seq/seq_dummy.c:1.10->1.11 
#   F:core/seq/seq_midi.c:1.18->1.19 
#   F:core/seq/oss/seq_oss.c:1.11->1.12 
#   F:core/seq/oss/seq_oss_init.c:1.11->1.12 
#   F:drivers/dummy.c:1.26->1.27 
#   F:drivers/mtpav.c:1.26->1.27 
#   F:drivers/serial-u16550.c:1.25->1.26 
#   F:drivers/virmidi.c:1.11->1.12 
#   F:drivers/mpu401/mpu401.c:1.16->1.17 
#   F:drivers/opl3/opl3_seq.c:1.12->1.13 
#   F:drivers/opl4/opl4_seq.c:1.2->1.3 
#   F:include/initval.h:1.19->1.20 
#   F:isa/als100.c:1.24->1.25 
#   F:isa/azt2320.c:1.24->1.25 
#   F:isa/cmi8330.c:1.28->1.29 
#   F:isa/dt019x.c:1.18->1.19 
#   F:isa/es18xx.c:1.44->1.45 
#   F:isa/opl3sa2.c:1.32->1.33 
#   F:isa/sgalaxy.c:1.19->1.20 
#   F:isa/sscape.c:1.11->1.12 
#   F:isa/ad1816a/ad1816a.c:1.18->1.19 
#   F:isa/ad1848/ad1848.c:1.10->1.11 
#   F:isa/cs423x/cs4231.c:1.12->1.13 
#   F:isa/cs423x/cs4236.c:1.41->1.42 
#   F:isa/cs423x/pc98.c:1.7->1.8 
#   F:isa/es1688/es1688.c:1.14->1.15 
#   F:isa/gus/gusclassic.c:1.13->1.14 
#   F:isa/gus/gusextreme.c:1.15->1.16 
#   F:isa/gus/gusmax.c:1.14->1.15 
#   F:isa/gus/interwave.c:1.32->1.33 
#   F:isa/opti9xx/opti92x-ad1848.c:1.42->1.43 
#   F:isa/sb/emu8000_patch.c:1.8->1.9 
#   F:isa/sb/es968.c:1.24->1.25 
#   F:isa/sb/sb16.c:1.45->1.46 
#   F:isa/sb/sb8.c:1.18->1.19 
#   F:isa/wavefront/wavefront.c:1.27->1.28 
#   F:isa/wavefront/wavefront_synth.c:1.14->1.15 
#   F:parisc/harmony.c:1.5->1.6 
#   F:pci/als4000.c:1.31->1.32 
#   F:pci/atiixp.c:1.2->1.3 
#   F:pci/azt3328.c:1.11->1.12 
#   F:pci/bt87x.c:1.3->1.4 
#   F:pci/cmipci.c:1.61->1.62 
#   F:pci/cs4281.c:1.50->1.51 
#   F:pci/ens1370.c:1.58->1.59 
#   F:pci/es1938.c:1.33->1.34 
#   F:pci/es1968.c:1.61->1.62 
#   F:pci/fm801.c:1.43->1.44 
#   F:pci/intel8x0.c:1.130->1.131 
#   F:pci/intel8x0m.c:1.1->1.2 
#   F:pci/maestro3.c:1.48->1.49 
#   F:pci/rme32.c:1.31->1.32 
#   F:pci/rme96.c:1.33->1.34 
#   F:pci/sonicvibes.c:1.33->1.34 
#   F:pci/via82xx.c:1.94->1.95 
#   F:pci/ac97/ac97_codec.c:1.127->1.128 
#   F:pci/ali5451/ali5451.c:1.43->1.44 
#   F:pci/au88x0/au88x0.c:1.6->1.7 
#   F:pci/cs46xx/cs46xx.c:1.24->1.25 
#   F:pci/emu10k1/emu10k1.c:1.22->1.23 
#   F:pci/ice1712/ice1712.c:1.47->1.48 
#   F:pci/ice1712/ice1724.c:1.27->1.28 
#   F:pci/korg1212/korg1212.c:1.36->1.37 
#   F:pci/mixart/mixart.c:1.6->1.7 
#   F:pci/nm256/nm256.c:1.33->1.34 
#   F:pci/rme9652/hdsp.c:1.54->1.55 
#   F:pci/rme9652/rme9652.c:1.42->1.43 
#   F:pci/trident/trident.c:1.21->1.22 
#   F:pci/vx222/vx222.c:1.3->1.4 
#   F:pci/ymfpci/ymfpci.c:1.33->1.34 
#   F:pcmcia/pdaudiocf/pdaudiocf.c:1.4->1.5 
#   F:pcmcia/vx/vxpocket.c:1.3->1.4 
#   F:ppc/powermac.c:1.15->1.16 
#   F:sparc/amd7930.c:1.8->1.9 
#   F:sparc/cs4231.c:1.12->1.13 
#   F:usb/usbaudio.c:1.96->1.97 
#   L:use the new module_param*() functions.
# 
# sound/isa/sb/sb16.c
#   2004/04/07 12:48:15+02:00 perex@suse.cz +16 -72
#   ALSA CVS update
#   D:2004/04/07 18:48:10
#   C:Documentation,SA11xx UDA1341 driver,Memalloc module,PCM Midlevel
#   C:RawMidi Midlevel,RTC timer driver,ALSA Core,Timer Midlevel
#   C:ALSA<-OSS emulation,ALSA sequencer,ALSA<-OSS sequencer,Generic drivers
#   C:MPU401 UART,OPL3,OPL4,ALS100 driver,AZT2320 driver,CMI8330 driver
#   C:DT019x driver,ES18xx driver,OPL3SA2 driver,Sound Galaxy driver
#   C:Sound Scape driver,AD1816A driver,AD1848 driver,CS4231 driver
#   C:CS4236+ driver,PC98(CS423x) driver,ES1688 driver,GUS Classic driver
#   C:GUS Extreme driver,GUS MAX driver,AMD InterWave driver,Opti9xx drivers
#   C:EMU8000 driver,ES968 driver,SB16/AWE driver,SB8 driver
#   C:Wavefront drivers,PARISC Harmony driver,ALS4000 driver,ATIIXP driver
#   C:AZT3328 driver,BT87x driver,CMIPCI driver,CS4281 driver
#   C:ENS1370/1+ driver,ES1938 driver,ES1968 driver,FM801 driver
#   C:Intel8x0 driver,Intel8x0-modem driver,Maestro3 driver,RME32 driver
#   C:RME96 driver,SonicVibes driver,VIA82xx driver,AC97 Codec Core
#   C:ALI5451 driver,au88x0 driver,CS46xx driver,EMU10K1/EMU10K2 driver
#   C:ICE1712 driver,ICE1724 driver,KORG1212 driver,MIXART driver
#   C:NM256 driver,RME HDSP driver,RME9652 driver,Trident driver
#   C:Digigram VX222 driver,YMFPCI driver,Sound Core PDAudioCF driver
#   C:Digigram VX Pocket driver,PPC PowerMac driver,SPARC AMD7930 driver
#   C:SPARC cs4231 driver,USB generic driver
#   A:Takashi Iwai <tiwai@suse.de>
#   F:Documentation/DocBook/writing-an-alsa-driver.tmpl:1.24->1.25 
#   F:arm/sa11xx-uda1341.c:1.13->1.14 
#   F:core/memalloc.c:1.28->1.29 
#   F:core/pcm_memory.c:1.25->1.26 
#   F:core/rawmidi.c:1.41->1.42 
#   F:core/rtctimer.c:1.19->1.20 
#   F:core/sound.c:1.59->1.60 
#   F:core/timer.c:1.56->1.57 
#   F:core/oss/pcm_oss.c:1.66->1.67 
#   F:core/seq/seq.c:1.9->1.10 
#   F:core/seq/seq_dummy.c:1.10->1.11 
#   F:core/seq/seq_midi.c:1.18->1.19 
#   F:core/seq/oss/seq_oss.c:1.11->1.12 
#   F:core/seq/oss/seq_oss_init.c:1.11->1.12 
#   F:drivers/dummy.c:1.26->1.27 
#   F:drivers/mtpav.c:1.26->1.27 
#   F:drivers/serial-u16550.c:1.25->1.26 
#   F:drivers/virmidi.c:1.11->1.12 
#   F:drivers/mpu401/mpu401.c:1.16->1.17 
#   F:drivers/opl3/opl3_seq.c:1.12->1.13 
#   F:drivers/opl4/opl4_seq.c:1.2->1.3 
#   F:include/initval.h:1.19->1.20 
#   F:isa/als100.c:1.24->1.25 
#   F:isa/azt2320.c:1.24->1.25 
#   F:isa/cmi8330.c:1.28->1.29 
#   F:isa/dt019x.c:1.18->1.19 
#   F:isa/es18xx.c:1.44->1.45 
#   F:isa/opl3sa2.c:1.32->1.33 
#   F:isa/sgalaxy.c:1.19->1.20 
#   F:isa/sscape.c:1.11->1.12 
#   F:isa/ad1816a/ad1816a.c:1.18->1.19 
#   F:isa/ad1848/ad1848.c:1.10->1.11 
#   F:isa/cs423x/cs4231.c:1.12->1.13 
#   F:isa/cs423x/cs4236.c:1.41->1.42 
#   F:isa/cs423x/pc98.c:1.7->1.8 
#   F:isa/es1688/es1688.c:1.14->1.15 
#   F:isa/gus/gusclassic.c:1.13->1.14 
#   F:isa/gus/gusextreme.c:1.15->1.16 
#   F:isa/gus/gusmax.c:1.14->1.15 
#   F:isa/gus/interwave.c:1.32->1.33 
#   F:isa/opti9xx/opti92x-ad1848.c:1.42->1.43 
#   F:isa/sb/emu8000_patch.c:1.8->1.9 
#   F:isa/sb/es968.c:1.24->1.25 
#   F:isa/sb/sb16.c:1.45->1.46 
#   F:isa/sb/sb8.c:1.18->1.19 
#   F:isa/wavefront/wavefront.c:1.27->1.28 
#   F:isa/wavefront/wavefront_synth.c:1.14->1.15 
#   F:parisc/harmony.c:1.5->1.6 
#   F:pci/als4000.c:1.31->1.32 
#   F:pci/atiixp.c:1.2->1.3 
#   F:pci/azt3328.c:1.11->1.12 
#   F:pci/bt87x.c:1.3->1.4 
#   F:pci/cmipci.c:1.61->1.62 
#   F:pci/cs4281.c:1.50->1.51 
#   F:pci/ens1370.c:1.58->1.59 
#   F:pci/es1938.c:1.33->1.34 
#   F:pci/es1968.c:1.61->1.62 
#   F:pci/fm801.c:1.43->1.44 
#   F:pci/intel8x0.c:1.130->1.131 
#   F:pci/intel8x0m.c:1.1->1.2 
#   F:pci/maestro3.c:1.48->1.49 
#   F:pci/rme32.c:1.31->1.32 
#   F:pci/rme96.c:1.33->1.34 
#   F:pci/sonicvibes.c:1.33->1.34 
#   F:pci/via82xx.c:1.94->1.95 
#   F:pci/ac97/ac97_codec.c:1.127->1.128 
#   F:pci/ali5451/ali5451.c:1.43->1.44 
#   F:pci/au88x0/au88x0.c:1.6->1.7 
#   F:pci/cs46xx/cs46xx.c:1.24->1.25 
#   F:pci/emu10k1/emu10k1.c:1.22->1.23 
#   F:pci/ice1712/ice1712.c:1.47->1.48 
#   F:pci/ice1712/ice1724.c:1.27->1.28 
#   F:pci/korg1212/korg1212.c:1.36->1.37 
#   F:pci/mixart/mixart.c:1.6->1.7 
#   F:pci/nm256/nm256.c:1.33->1.34 
#   F:pci/rme9652/hdsp.c:1.54->1.55 
#   F:pci/rme9652/rme9652.c:1.42->1.43 
#   F:pci/trident/trident.c:1.21->1.22 
#   F:pci/vx222/vx222.c:1.3->1.4 
#   F:pci/ymfpci/ymfpci.c:1.33->1.34 
#   F:pcmcia/pdaudiocf/pdaudiocf.c:1.4->1.5 
#   F:pcmcia/vx/vxpocket.c:1.3->1.4 
#   F:ppc/powermac.c:1.15->1.16 
#   F:sparc/amd7930.c:1.8->1.9 
#   F:sparc/cs4231.c:1.12->1.13 
#   F:usb/usbaudio.c:1.96->1.97 
#   L:use the new module_param*() functions.
# 
# sound/isa/sb/es968.c
#   2004/04/07 12:48:15+02:00 perex@suse.cz +8 -32
#   ALSA CVS update
#   D:2004/04/07 18:48:10
#   C:Documentation,SA11xx UDA1341 driver,Memalloc module,PCM Midlevel
#   C:RawMidi Midlevel,RTC timer driver,ALSA Core,Timer Midlevel
#   C:ALSA<-OSS emulation,ALSA sequencer,ALSA<-OSS sequencer,Generic drivers
#   C:MPU401 UART,OPL3,OPL4,ALS100 driver,AZT2320 driver,CMI8330 driver
#   C:DT019x driver,ES18xx driver,OPL3SA2 driver,Sound Galaxy driver
#   C:Sound Scape driver,AD1816A driver,AD1848 driver,CS4231 driver
#   C:CS4236+ driver,PC98(CS423x) driver,ES1688 driver,GUS Classic driver
#   C:GUS Extreme driver,GUS MAX driver,AMD InterWave driver,Opti9xx drivers
#   C:EMU8000 driver,ES968 driver,SB16/AWE driver,SB8 driver
#   C:Wavefront drivers,PARISC Harmony driver,ALS4000 driver,ATIIXP driver
#   C:AZT3328 driver,BT87x driver,CMIPCI driver,CS4281 driver
#   C:ENS1370/1+ driver,ES1938 driver,ES1968 driver,FM801 driver
#   C:Intel8x0 driver,Intel8x0-modem driver,Maestro3 driver,RME32 driver
#   C:RME96 driver,SonicVibes driver,VIA82xx driver,AC97 Codec Core
#   C:ALI5451 driver,au88x0 driver,CS46xx driver,EMU10K1/EMU10K2 driver
#   C:ICE1712 driver,ICE1724 driver,KORG1212 driver,MIXART driver
#   C:NM256 driver,RME HDSP driver,RME9652 driver,Trident driver
#   C:Digigram VX222 driver,YMFPCI driver,Sound Core PDAudioCF driver
#   C:Digigram VX Pocket driver,PPC PowerMac driver,SPARC AMD7930 driver
#   C:SPARC cs4231 driver,USB generic driver
#   A:Takashi Iwai <tiwai@suse.de>
#   F:Documentation/DocBook/writing-an-alsa-driver.tmpl:1.24->1.25 
#   F:arm/sa11xx-uda1341.c:1.13->1.14 
#   F:core/memalloc.c:1.28->1.29 
#   F:core/pcm_memory.c:1.25->1.26 
#   F:core/rawmidi.c:1.41->1.42 
#   F:core/rtctimer.c:1.19->1.20 
#   F:core/sound.c:1.59->1.60 
#   F:core/timer.c:1.56->1.57 
#   F:core/oss/pcm_oss.c:1.66->1.67 
#   F:core/seq/seq.c:1.9->1.10 
#   F:core/seq/seq_dummy.c:1.10->1.11 
#   F:core/seq/seq_midi.c:1.18->1.19 
#   F:core/seq/oss/seq_oss.c:1.11->1.12 
#   F:core/seq/oss/seq_oss_init.c:1.11->1.12 
#   F:drivers/dummy.c:1.26->1.27 
#   F:drivers/mtpav.c:1.26->1.27 
#   F:drivers/serial-u16550.c:1.25->1.26 
#   F:drivers/virmidi.c:1.11->1.12 
#   F:drivers/mpu401/mpu401.c:1.16->1.17 
#   F:drivers/opl3/opl3_seq.c:1.12->1.13 
#   F:drivers/opl4/opl4_seq.c:1.2->1.3 
#   F:include/initval.h:1.19->1.20 
#   F:isa/als100.c:1.24->1.25 
#   F:isa/azt2320.c:1.24->1.25 
#   F:isa/cmi8330.c:1.28->1.29 
#   F:isa/dt019x.c:1.18->1.19 
#   F:isa/es18xx.c:1.44->1.45 
#   F:isa/opl3sa2.c:1.32->1.33 
#   F:isa/sgalaxy.c:1.19->1.20 
#   F:isa/sscape.c:1.11->1.12 
#   F:isa/ad1816a/ad1816a.c:1.18->1.19 
#   F:isa/ad1848/ad1848.c:1.10->1.11 
#   F:isa/cs423x/cs4231.c:1.12->1.13 
#   F:isa/cs423x/cs4236.c:1.41->1.42 
#   F:isa/cs423x/pc98.c:1.7->1.8 
#   F:isa/es1688/es1688.c:1.14->1.15 
#   F:isa/gus/gusclassic.c:1.13->1.14 
#   F:isa/gus/gusextreme.c:1.15->1.16 
#   F:isa/gus/gusmax.c:1.14->1.15 
#   F:isa/gus/interwave.c:1.32->1.33 
#   F:isa/opti9xx/opti92x-ad1848.c:1.42->1.43 
#   F:isa/sb/emu8000_patch.c:1.8->1.9 
#   F:isa/sb/es968.c:1.24->1.25 
#   F:isa/sb/sb16.c:1.45->1.46 
#   F:isa/sb/sb8.c:1.18->1.19 
#   F:isa/wavefront/wavefront.c:1.27->1.28 
#   F:isa/wavefront/wavefront_synth.c:1.14->1.15 
#   F:parisc/harmony.c:1.5->1.6 
#   F:pci/als4000.c:1.31->1.32 
#   F:pci/atiixp.c:1.2->1.3 
#   F:pci/azt3328.c:1.11->1.12 
#   F:pci/bt87x.c:1.3->1.4 
#   F:pci/cmipci.c:1.61->1.62 
#   F:pci/cs4281.c:1.50->1.51 
#   F:pci/ens1370.c:1.58->1.59 
#   F:pci/es1938.c:1.33->1.34 
#   F:pci/es1968.c:1.61->1.62 
#   F:pci/fm801.c:1.43->1.44 
#   F:pci/intel8x0.c:1.130->1.131 
#   F:pci/intel8x0m.c:1.1->1.2 
#   F:pci/maestro3.c:1.48->1.49 
#   F:pci/rme32.c:1.31->1.32 
#   F:pci/rme96.c:1.33->1.34 
#   F:pci/sonicvibes.c:1.33->1.34 
#   F:pci/via82xx.c:1.94->1.95 
#   F:pci/ac97/ac97_codec.c:1.127->1.128 
#   F:pci/ali5451/ali5451.c:1.43->1.44 
#   F:pci/au88x0/au88x0.c:1.6->1.7 
#   F:pci/cs46xx/cs46xx.c:1.24->1.25 
#   F:pci/emu10k1/emu10k1.c:1.22->1.23 
#   F:pci/ice1712/ice1712.c:1.47->1.48 
#   F:pci/ice1712/ice1724.c:1.27->1.28 
#   F:pci/korg1212/korg1212.c:1.36->1.37 
#   F:pci/mixart/mixart.c:1.6->1.7 
#   F:pci/nm256/nm256.c:1.33->1.34 
#   F:pci/rme9652/hdsp.c:1.54->1.55 
#   F:pci/rme9652/rme9652.c:1.42->1.43 
#   F:pci/trident/trident.c:1.21->1.22 
#   F:pci/vx222/vx222.c:1.3->1.4 
#   F:pci/ymfpci/ymfpci.c:1.33->1.34 
#   F:pcmcia/pdaudiocf/pdaudiocf.c:1.4->1.5 
#   F:pcmcia/vx/vxpocket.c:1.3->1.4 
#   F:ppc/powermac.c:1.15->1.16 
#   F:sparc/amd7930.c:1.8->1.9 
#   F:sparc/cs4231.c:1.12->1.13 
#   F:usb/usbaudio.c:1.96->1.97 
#   L:use the new module_param*() functions.
# 
# sound/isa/sb/emu8000_patch.c
#   2004/04/07 12:48:15+02:00 perex@suse.cz +3 -3
#   ALSA CVS update
#   D:2004/04/07 18:48:10
#   C:Documentation,SA11xx UDA1341 driver,Memalloc module,PCM Midlevel
#   C:RawMidi Midlevel,RTC timer driver,ALSA Core,Timer Midlevel
#   C:ALSA<-OSS emulation,ALSA sequencer,ALSA<-OSS sequencer,Generic drivers
#   C:MPU401 UART,OPL3,OPL4,ALS100 driver,AZT2320 driver,CMI8330 driver
#   C:DT019x driver,ES18xx driver,OPL3SA2 driver,Sound Galaxy driver
#   C:Sound Scape driver,AD1816A driver,AD1848 driver,CS4231 driver
#   C:CS4236+ driver,PC98(CS423x) driver,ES1688 driver,GUS Classic driver
#   C:GUS Extreme driver,GUS MAX driver,AMD InterWave driver,Opti9xx drivers
#   C:EMU8000 driver,ES968 driver,SB16/AWE driver,SB8 driver
#   C:Wavefront drivers,PARISC Harmony driver,ALS4000 driver,ATIIXP driver
#   C:AZT3328 driver,BT87x driver,CMIPCI driver,CS4281 driver
#   C:ENS1370/1+ driver,ES1938 driver,ES1968 driver,FM801 driver
#   C:Intel8x0 driver,Intel8x0-modem driver,Maestro3 driver,RME32 driver
#   C:RME96 driver,SonicVibes driver,VIA82xx driver,AC97 Codec Core
#   C:ALI5451 driver,au88x0 driver,CS46xx driver,EMU10K1/EMU10K2 driver
#   C:ICE1712 driver,ICE1724 driver,KORG1212 driver,MIXART driver
#   C:NM256 driver,RME HDSP driver,RME9652 driver,Trident driver
#   C:Digigram VX222 driver,YMFPCI driver,Sound Core PDAudioCF driver
#   C:Digigram VX Pocket driver,PPC PowerMac driver,SPARC AMD7930 driver
#   C:SPARC cs4231 driver,USB generic driver
#   A:Takashi Iwai <tiwai@suse.de>
#   F:Documentation/DocBook/writing-an-alsa-driver.tmpl:1.24->1.25 
#   F:arm/sa11xx-uda1341.c:1.13->1.14 
#   F:core/memalloc.c:1.28->1.29 
#   F:core/pcm_memory.c:1.25->1.26 
#   F:core/rawmidi.c:1.41->1.42 
#   F:core/rtctimer.c:1.19->1.20 
#   F:core/sound.c:1.59->1.60 
#   F:core/timer.c:1.56->1.57 
#   F:core/oss/pcm_oss.c:1.66->1.67 
#   F:core/seq/seq.c:1.9->1.10 
#   F:core/seq/seq_dummy.c:1.10->1.11 
#   F:core/seq/seq_midi.c:1.18->1.19 
#   F:core/seq/oss/seq_oss.c:1.11->1.12 
#   F:core/seq/oss/seq_oss_init.c:1.11->1.12 
#   F:drivers/dummy.c:1.26->1.27 
#   F:drivers/mtpav.c:1.26->1.27 
#   F:drivers/serial-u16550.c:1.25->1.26 
#   F:drivers/virmidi.c:1.11->1.12 
#   F:drivers/mpu401/mpu401.c:1.16->1.17 
#   F:drivers/opl3/opl3_seq.c:1.12->1.13 
#   F:drivers/opl4/opl4_seq.c:1.2->1.3 
#   F:include/initval.h:1.19->1.20 
#   F:isa/als100.c:1.24->1.25 
#   F:isa/azt2320.c:1.24->1.25 
#   F:isa/cmi8330.c:1.28->1.29 
#   F:isa/dt019x.c:1.18->1.19 
#   F:isa/es18xx.c:1.44->1.45 
#   F:isa/opl3sa2.c:1.32->1.33 
#   F:isa/sgalaxy.c:1.19->1.20 
#   F:isa/sscape.c:1.11->1.12 
#   F:isa/ad1816a/ad1816a.c:1.18->1.19 
#   F:isa/ad1848/ad1848.c:1.10->1.11 
#   F:isa/cs423x/cs4231.c:1.12->1.13 
#   F:isa/cs423x/cs4236.c:1.41->1.42 
#   F:isa/cs423x/pc98.c:1.7->1.8 
#   F:isa/es1688/es1688.c:1.14->1.15 
#   F:isa/gus/gusclassic.c:1.13->1.14 
#   F:isa/gus/gusextreme.c:1.15->1.16 
#   F:isa/gus/gusmax.c:1.14->1.15 
#   F:isa/gus/interwave.c:1.32->1.33 
#   F:isa/opti9xx/opti92x-ad1848.c:1.42->1.43 
#   F:isa/sb/emu8000_patch.c:1.8->1.9 
#   F:isa/sb/es968.c:1.24->1.25 
#   F:isa/sb/sb16.c:1.45->1.46 
#   F:isa/sb/sb8.c:1.18->1.19 
#   F:isa/wavefront/wavefront.c:1.27->1.28 
#   F:isa/wavefront/wavefront_synth.c:1.14->1.15 
#   F:parisc/harmony.c:1.5->1.6 
#   F:pci/als4000.c:1.31->1.32 
#   F:pci/atiixp.c:1.2->1.3 
#   F:pci/azt3328.c:1.11->1.12 
#   F:pci/bt87x.c:1.3->1.4 
#   F:pci/cmipci.c:1.61->1.62 
#   F:pci/cs4281.c:1.50->1.51 
#   F:pci/ens1370.c:1.58->1.59 
#   F:pci/es1938.c:1.33->1.34 
#   F:pci/es1968.c:1.61->1.62 
#   F:pci/fm801.c:1.43->1.44 
#   F:pci/intel8x0.c:1.130->1.131 
#   F:pci/intel8x0m.c:1.1->1.2 
#   F:pci/maestro3.c:1.48->1.49 
#   F:pci/rme32.c:1.31->1.32 
#   F:pci/rme96.c:1.33->1.34 
#   F:pci/sonicvibes.c:1.33->1.34 
#   F:pci/via82xx.c:1.94->1.95 
#   F:pci/ac97/ac97_codec.c:1.127->1.128 
#   F:pci/ali5451/ali5451.c:1.43->1.44 
#   F:pci/au88x0/au88x0.c:1.6->1.7 
#   F:pci/cs46xx/cs46xx.c:1.24->1.25 
#   F:pci/emu10k1/emu10k1.c:1.22->1.23 
#   F:pci/ice1712/ice1712.c:1.47->1.48 
#   F:pci/ice1712/ice1724.c:1.27->1.28 
#   F:pci/korg1212/korg1212.c:1.36->1.37 
#   F:pci/mixart/mixart.c:1.6->1.7 
#   F:pci/nm256/nm256.c:1.33->1.34 
#   F:pci/rme9652/hdsp.c:1.54->1.55 
#   F:pci/rme9652/rme9652.c:1.42->1.43 
#   F:pci/trident/trident.c:1.21->1.22 
#   F:pci/vx222/vx222.c:1.3->1.4 
#   F:pci/ymfpci/ymfpci.c:1.33->1.34 
#   F:pcmcia/pdaudiocf/pdaudiocf.c:1.4->1.5 
#   F:pcmcia/vx/vxpocket.c:1.3->1.4 
#   F:ppc/powermac.c:1.15->1.16 
#   F:sparc/amd7930.c:1.8->1.9 
#   F:sparc/cs4231.c:1.12->1.13 
#   F:usb/usbaudio.c:1.96->1.97 
#   L:use the new module_param*() functions.
# 
# sound/isa/opti9xx/opti92x-ad1848.c
#   2004/04/07 12:48:14+02:00 perex@suse.cz +12 -56
#   ALSA CVS update
#   D:2004/04/07 18:48:10
#   C:Documentation,SA11xx UDA1341 driver,Memalloc module,PCM Midlevel
#   C:RawMidi Midlevel,RTC timer driver,ALSA Core,Timer Midlevel
#   C:ALSA<-OSS emulation,ALSA sequencer,ALSA<-OSS sequencer,Generic drivers
#   C:MPU401 UART,OPL3,OPL4,ALS100 driver,AZT2320 driver,CMI8330 driver
#   C:DT019x driver,ES18xx driver,OPL3SA2 driver,Sound Galaxy driver
#   C:Sound Scape driver,AD1816A driver,AD1848 driver,CS4231 driver
#   C:CS4236+ driver,PC98(CS423x) driver,ES1688 driver,GUS Classic driver
#   C:GUS Extreme driver,GUS MAX driver,AMD InterWave driver,Opti9xx drivers
#   C:EMU8000 driver,ES968 driver,SB16/AWE driver,SB8 driver
#   C:Wavefront drivers,PARISC Harmony driver,ALS4000 driver,ATIIXP driver
#   C:AZT3328 driver,BT87x driver,CMIPCI driver,CS4281 driver
#   C:ENS1370/1+ driver,ES1938 driver,ES1968 driver,FM801 driver
#   C:Intel8x0 driver,Intel8x0-modem driver,Maestro3 driver,RME32 driver
#   C:RME96 driver,SonicVibes driver,VIA82xx driver,AC97 Codec Core
#   C:ALI5451 driver,au88x0 driver,CS46xx driver,EMU10K1/EMU10K2 driver
#   C:ICE1712 driver,ICE1724 driver,KORG1212 driver,MIXART driver
#   C:NM256 driver,RME HDSP driver,RME9652 driver,Trident driver
#   C:Digigram VX222 driver,YMFPCI driver,Sound Core PDAudioCF driver
#   C:Digigram VX Pocket driver,PPC PowerMac driver,SPARC AMD7930 driver
#   C:SPARC cs4231 driver,USB generic driver
#   A:Takashi Iwai <tiwai@suse.de>
#   F:Documentation/DocBook/writing-an-alsa-driver.tmpl:1.24->1.25 
#   F:arm/sa11xx-uda1341.c:1.13->1.14 
#   F:core/memalloc.c:1.28->1.29 
#   F:core/pcm_memory.c:1.25->1.26 
#   F:core/rawmidi.c:1.41->1.42 
#   F:core/rtctimer.c:1.19->1.20 
#   F:core/sound.c:1.59->1.60 
#   F:core/timer.c:1.56->1.57 
#   F:core/oss/pcm_oss.c:1.66->1.67 
#   F:core/seq/seq.c:1.9->1.10 
#   F:core/seq/seq_dummy.c:1.10->1.11 
#   F:core/seq/seq_midi.c:1.18->1.19 
#   F:core/seq/oss/seq_oss.c:1.11->1.12 
#   F:core/seq/oss/seq_oss_init.c:1.11->1.12 
#   F:drivers/dummy.c:1.26->1.27 
#   F:drivers/mtpav.c:1.26->1.27 
#   F:drivers/serial-u16550.c:1.25->1.26 
#   F:drivers/virmidi.c:1.11->1.12 
#   F:drivers/mpu401/mpu401.c:1.16->1.17 
#   F:drivers/opl3/opl3_seq.c:1.12->1.13 
#   F:drivers/opl4/opl4_seq.c:1.2->1.3 
#   F:include/initval.h:1.19->1.20 
#   F:isa/als100.c:1.24->1.25 
#   F:isa/azt2320.c:1.24->1.25 
#   F:isa/cmi8330.c:1.28->1.29 
#   F:isa/dt019x.c:1.18->1.19 
#   F:isa/es18xx.c:1.44->1.45 
#   F:isa/opl3sa2.c:1.32->1.33 
#   F:isa/sgalaxy.c:1.19->1.20 
#   F:isa/sscape.c:1.11->1.12 
#   F:isa/ad1816a/ad1816a.c:1.18->1.19 
#   F:isa/ad1848/ad1848.c:1.10->1.11 
#   F:isa/cs423x/cs4231.c:1.12->1.13 
#   F:isa/cs423x/cs4236.c:1.41->1.42 
#   F:isa/cs423x/pc98.c:1.7->1.8 
#   F:isa/es1688/es1688.c:1.14->1.15 
#   F:isa/gus/gusclassic.c:1.13->1.14 
#   F:isa/gus/gusextreme.c:1.15->1.16 
#   F:isa/gus/gusmax.c:1.14->1.15 
#   F:isa/gus/interwave.c:1.32->1.33 
#   F:isa/opti9xx/opti92x-ad1848.c:1.42->1.43 
#   F:isa/sb/emu8000_patch.c:1.8->1.9 
#   F:isa/sb/es968.c:1.24->1.25 
#   F:isa/sb/sb16.c:1.45->1.46 
#   F:isa/sb/sb8.c:1.18->1.19 
#   F:isa/wavefront/wavefront.c:1.27->1.28 
#   F:isa/wavefront/wavefront_synth.c:1.14->1.15 
#   F:parisc/harmony.c:1.5->1.6 
#   F:pci/als4000.c:1.31->1.32 
#   F:pci/atiixp.c:1.2->1.3 
#   F:pci/azt3328.c:1.11->1.12 
#   F:pci/bt87x.c:1.3->1.4 
#   F:pci/cmipci.c:1.61->1.62 
#   F:pci/cs4281.c:1.50->1.51 
#   F:pci/ens1370.c:1.58->1.59 
#   F:pci/es1938.c:1.33->1.34 
#   F:pci/es1968.c:1.61->1.62 
#   F:pci/fm801.c:1.43->1.44 
#   F:pci/intel8x0.c:1.130->1.131 
#   F:pci/intel8x0m.c:1.1->1.2 
#   F:pci/maestro3.c:1.48->1.49 
#   F:pci/rme32.c:1.31->1.32 
#   F:pci/rme96.c:1.33->1.34 
#   F:pci/sonicvibes.c:1.33->1.34 
#   F:pci/via82xx.c:1.94->1.95 
#   F:pci/ac97/ac97_codec.c:1.127->1.128 
#   F:pci/ali5451/ali5451.c:1.43->1.44 
#   F:pci/au88x0/au88x0.c:1.6->1.7 
#   F:pci/cs46xx/cs46xx.c:1.24->1.25 
#   F:pci/emu10k1/emu10k1.c:1.22->1.23 
#   F:pci/ice1712/ice1712.c:1.47->1.48 
#   F:pci/ice1712/ice1724.c:1.27->1.28 
#   F:pci/korg1212/korg1212.c:1.36->1.37 
#   F:pci/mixart/mixart.c:1.6->1.7 
#   F:pci/nm256/nm256.c:1.33->1.34 
#   F:pci/rme9652/hdsp.c:1.54->1.55 
#   F:pci/rme9652/rme9652.c:1.42->1.43 
#   F:pci/trident/trident.c:1.21->1.22 
#   F:pci/vx222/vx222.c:1.3->1.4 
#   F:pci/ymfpci/ymfpci.c:1.33->1.34 
#   F:pcmcia/pdaudiocf/pdaudiocf.c:1.4->1.5 
#   F:pcmcia/vx/vxpocket.c:1.3->1.4 
#   F:ppc/powermac.c:1.15->1.16 
#   F:sparc/amd7930.c:1.8->1.9 
#   F:sparc/cs4231.c:1.12->1.13 
#   F:usb/usbaudio.c:1.96->1.97 
#   L:use the new module_param*() functions.
# 
# sound/isa/opl3sa2.c
#   2004/04/07 12:48:13+02:00 perex@suse.cz +15 -53
#   ALSA CVS update
#   D:2004/04/07 18:48:10
#   C:Documentation,SA11xx UDA1341 driver,Memalloc module,PCM Midlevel
#   C:RawMidi Midlevel,RTC timer driver,ALSA Core,Timer Midlevel
#   C:ALSA<-OSS emulation,ALSA sequencer,ALSA<-OSS sequencer,Generic drivers
#   C:MPU401 UART,OPL3,OPL4,ALS100 driver,AZT2320 driver,CMI8330 driver
#   C:DT019x driver,ES18xx driver,OPL3SA2 driver,Sound Galaxy driver
#   C:Sound Scape driver,AD1816A driver,AD1848 driver,CS4231 driver
#   C:CS4236+ driver,PC98(CS423x) driver,ES1688 driver,GUS Classic driver
#   C:GUS Extreme driver,GUS MAX driver,AMD InterWave driver,Opti9xx drivers
#   C:EMU8000 driver,ES968 driver,SB16/AWE driver,SB8 driver
#   C:Wavefront drivers,PARISC Harmony driver,ALS4000 driver,ATIIXP driver
#   C:AZT3328 driver,BT87x driver,CMIPCI driver,CS4281 driver
#   C:ENS1370/1+ driver,ES1938 driver,ES1968 driver,FM801 driver
#   C:Intel8x0 driver,Intel8x0-modem driver,Maestro3 driver,RME32 driver
#   C:RME96 driver,SonicVibes driver,VIA82xx driver,AC97 Codec Core
#   C:ALI5451 driver,au88x0 driver,CS46xx driver,EMU10K1/EMU10K2 driver
#   C:ICE1712 driver,ICE1724 driver,KORG1212 driver,MIXART driver
#   C:NM256 driver,RME HDSP driver,RME9652 driver,Trident driver
#   C:Digigram VX222 driver,YMFPCI driver,Sound Core PDAudioCF driver
#   C:Digigram VX Pocket driver,PPC PowerMac driver,SPARC AMD7930 driver
#   C:SPARC cs4231 driver,USB generic driver
#   A:Takashi Iwai <tiwai@suse.de>
#   F:Documentation/DocBook/writing-an-alsa-driver.tmpl:1.24->1.25 
#   F:arm/sa11xx-uda1341.c:1.13->1.14 
#   F:core/memalloc.c:1.28->1.29 
#   F:core/pcm_memory.c:1.25->1.26 
#   F:core/rawmidi.c:1.41->1.42 
#   F:core/rtctimer.c:1.19->1.20 
#   F:core/sound.c:1.59->1.60 
#   F:core/timer.c:1.56->1.57 
#   F:core/oss/pcm_oss.c:1.66->1.67 
#   F:core/seq/seq.c:1.9->1.10 
#   F:core/seq/seq_dummy.c:1.10->1.11 
#   F:core/seq/seq_midi.c:1.18->1.19 
#   F:core/seq/oss/seq_oss.c:1.11->1.12 
#   F:core/seq/oss/seq_oss_init.c:1.11->1.12 
#   F:drivers/dummy.c:1.26->1.27 
#   F:drivers/mtpav.c:1.26->1.27 
#   F:drivers/serial-u16550.c:1.25->1.26 
#   F:drivers/virmidi.c:1.11->1.12 
#   F:drivers/mpu401/mpu401.c:1.16->1.17 
#   F:drivers/opl3/opl3_seq.c:1.12->1.13 
#   F:drivers/opl4/opl4_seq.c:1.2->1.3 
#   F:include/initval.h:1.19->1.20 
#   F:isa/als100.c:1.24->1.25 
#   F:isa/azt2320.c:1.24->1.25 
#   F:isa/cmi8330.c:1.28->1.29 
#   F:isa/dt019x.c:1.18->1.19 
#   F:isa/es18xx.c:1.44->1.45 
#   F:isa/opl3sa2.c:1.32->1.33 
#   F:isa/sgalaxy.c:1.19->1.20 
#   F:isa/sscape.c:1.11->1.12 
#   F:isa/ad1816a/ad1816a.c:1.18->1.19 
#   F:isa/ad1848/ad1848.c:1.10->1.11 
#   F:isa/cs423x/cs4231.c:1.12->1.13 
#   F:isa/cs423x/cs4236.c:1.41->1.42 
#   F:isa/cs423x/pc98.c:1.7->1.8 
#   F:isa/es1688/es1688.c:1.14->1.15 
#   F:isa/gus/gusclassic.c:1.13->1.14 
#   F:isa/gus/gusextreme.c:1.15->1.16 
#   F:isa/gus/gusmax.c:1.14->1.15 
#   F:isa/gus/interwave.c:1.32->1.33 
#   F:isa/opti9xx/opti92x-ad1848.c:1.42->1.43 
#   F:isa/sb/emu8000_patch.c:1.8->1.9 
#   F:isa/sb/es968.c:1.24->1.25 
#   F:isa/sb/sb16.c:1.45->1.46 
#   F:isa/sb/sb8.c:1.18->1.19 
#   F:isa/wavefront/wavefront.c:1.27->1.28 
#   F:isa/wavefront/wavefront_synth.c:1.14->1.15 
#   F:parisc/harmony.c:1.5->1.6 
#   F:pci/als4000.c:1.31->1.32 
#   F:pci/atiixp.c:1.2->1.3 
#   F:pci/azt3328.c:1.11->1.12 
#   F:pci/bt87x.c:1.3->1.4 
#   F:pci/cmipci.c:1.61->1.62 
#   F:pci/cs4281.c:1.50->1.51 
#   F:pci/ens1370.c:1.58->1.59 
#   F:pci/es1938.c:1.33->1.34 
#   F:pci/es1968.c:1.61->1.62 
#   F:pci/fm801.c:1.43->1.44 
#   F:pci/intel8x0.c:1.130->1.131 
#   F:pci/intel8x0m.c:1.1->1.2 
#   F:pci/maestro3.c:1.48->1.49 
#   F:pci/rme32.c:1.31->1.32 
#   F:pci/rme96.c:1.33->1.34 
#   F:pci/sonicvibes.c:1.33->1.34 
#   F:pci/via82xx.c:1.94->1.95 
#   F:pci/ac97/ac97_codec.c:1.127->1.128 
#   F:pci/ali5451/ali5451.c:1.43->1.44 
#   F:pci/au88x0/au88x0.c:1.6->1.7 
#   F:pci/cs46xx/cs46xx.c:1.24->1.25 
#   F:pci/emu10k1/emu10k1.c:1.22->1.23 
#   F:pci/ice1712/ice1712.c:1.47->1.48 
#   F:pci/ice1712/ice1724.c:1.27->1.28 
#   F:pci/korg1212/korg1212.c:1.36->1.37 
#   F:pci/mixart/mixart.c:1.6->1.7 
#   F:pci/nm256/nm256.c:1.33->1.34 
#   F:pci/rme9652/hdsp.c:1.54->1.55 
#   F:pci/rme9652/rme9652.c:1.42->1.43 
#   F:pci/trident/trident.c:1.21->1.22 
#   F:pci/vx222/vx222.c:1.3->1.4 
#   F:pci/ymfpci/ymfpci.c:1.33->1.34 
#   F:pcmcia/pdaudiocf/pdaudiocf.c:1.4->1.5 
#   F:pcmcia/vx/vxpocket.c:1.3->1.4 
#   F:ppc/powermac.c:1.15->1.16 
#   F:sparc/amd7930.c:1.8->1.9 
#   F:sparc/cs4231.c:1.12->1.13 
#   F:usb/usbaudio.c:1.96->1.97 
#   L:use the new module_param*() functions.
# 
# sound/isa/gus/interwave.c
#   2004/04/07 12:48:14+02:00 perex@suse.cz +15 -60
#   ALSA CVS update
#   D:2004/04/07 18:48:10
#   C:Documentation,SA11xx UDA1341 driver,Memalloc module,PCM Midlevel
#   C:RawMidi Midlevel,RTC timer driver,ALSA Core,Timer Midlevel
#   C:ALSA<-OSS emulation,ALSA sequencer,ALSA<-OSS sequencer,Generic drivers
#   C:MPU401 UART,OPL3,OPL4,ALS100 driver,AZT2320 driver,CMI8330 driver
#   C:DT019x driver,ES18xx driver,OPL3SA2 driver,Sound Galaxy driver
#   C:Sound Scape driver,AD1816A driver,AD1848 driver,CS4231 driver
#   C:CS4236+ driver,PC98(CS423x) driver,ES1688 driver,GUS Classic driver
#   C:GUS Extreme driver,GUS MAX driver,AMD InterWave driver,Opti9xx drivers
#   C:EMU8000 driver,ES968 driver,SB16/AWE driver,SB8 driver
#   C:Wavefront drivers,PARISC Harmony driver,ALS4000 driver,ATIIXP driver
#   C:AZT3328 driver,BT87x driver,CMIPCI driver,CS4281 driver
#   C:ENS1370/1+ driver,ES1938 driver,ES1968 driver,FM801 driver
#   C:Intel8x0 driver,Intel8x0-modem driver,Maestro3 driver,RME32 driver
#   C:RME96 driver,SonicVibes driver,VIA82xx driver,AC97 Codec Core
#   C:ALI5451 driver,au88x0 driver,CS46xx driver,EMU10K1/EMU10K2 driver
#   C:ICE1712 driver,ICE1724 driver,KORG1212 driver,MIXART driver
#   C:NM256 driver,RME HDSP driver,RME9652 driver,Trident driver
#   C:Digigram VX222 driver,YMFPCI driver,Sound Core PDAudioCF driver
#   C:Digigram VX Pocket driver,PPC PowerMac driver,SPARC AMD7930 driver
#   C:SPARC cs4231 driver,USB generic driver
#   A:Takashi Iwai <tiwai@suse.de>
#   F:Documentation/DocBook/writing-an-alsa-driver.tmpl:1.24->1.25 
#   F:arm/sa11xx-uda1341.c:1.13->1.14 
#   F:core/memalloc.c:1.28->1.29 
#   F:core/pcm_memory.c:1.25->1.26 
#   F:core/rawmidi.c:1.41->1.42 
#   F:core/rtctimer.c:1.19->1.20 
#   F:core/sound.c:1.59->1.60 
#   F:core/timer.c:1.56->1.57 
#   F:core/oss/pcm_oss.c:1.66->1.67 
#   F:core/seq/seq.c:1.9->1.10 
#   F:core/seq/seq_dummy.c:1.10->1.11 
#   F:core/seq/seq_midi.c:1.18->1.19 
#   F:core/seq/oss/seq_oss.c:1.11->1.12 
#   F:core/seq/oss/seq_oss_init.c:1.11->1.12 
#   F:drivers/dummy.c:1.26->1.27 
#   F:drivers/mtpav.c:1.26->1.27 
#   F:drivers/serial-u16550.c:1.25->1.26 
#   F:drivers/virmidi.c:1.11->1.12 
#   F:drivers/mpu401/mpu401.c:1.16->1.17 
#   F:drivers/opl3/opl3_seq.c:1.12->1.13 
#   F:drivers/opl4/opl4_seq.c:1.2->1.3 
#   F:include/initval.h:1.19->1.20 
#   F:isa/als100.c:1.24->1.25 
#   F:isa/azt2320.c:1.24->1.25 
#   F:isa/cmi8330.c:1.28->1.29 
#   F:isa/dt019x.c:1.18->1.19 
#   F:isa/es18xx.c:1.44->1.45 
#   F:isa/opl3sa2.c:1.32->1.33 
#   F:isa/sgalaxy.c:1.19->1.20 
#   F:isa/sscape.c:1.11->1.12 
#   F:isa/ad1816a/ad1816a.c:1.18->1.19 
#   F:isa/ad1848/ad1848.c:1.10->1.11 
#   F:isa/cs423x/cs4231.c:1.12->1.13 
#   F:isa/cs423x/cs4236.c:1.41->1.42 
#   F:isa/cs423x/pc98.c:1.7->1.8 
#   F:isa/es1688/es1688.c:1.14->1.15 
#   F:isa/gus/gusclassic.c:1.13->1.14 
#   F:isa/gus/gusextreme.c:1.15->1.16 
#   F:isa/gus/gusmax.c:1.14->1.15 
#   F:isa/gus/interwave.c:1.32->1.33 
#   F:isa/opti9xx/opti92x-ad1848.c:1.42->1.43 
#   F:isa/sb/emu8000_patch.c:1.8->1.9 
#   F:isa/sb/es968.c:1.24->1.25 
#   F:isa/sb/sb16.c:1.45->1.46 
#   F:isa/sb/sb8.c:1.18->1.19 
#   F:isa/wavefront/wavefront.c:1.27->1.28 
#   F:isa/wavefront/wavefront_synth.c:1.14->1.15 
#   F:parisc/harmony.c:1.5->1.6 
#   F:pci/als4000.c:1.31->1.32 
#   F:pci/atiixp.c:1.2->1.3 
#   F:pci/azt3328.c:1.11->1.12 
#   F:pci/bt87x.c:1.3->1.4 
#   F:pci/cmipci.c:1.61->1.62 
#   F:pci/cs4281.c:1.50->1.51 
#   F:pci/ens1370.c:1.58->1.59 
#   F:pci/es1938.c:1.33->1.34 
#   F:pci/es1968.c:1.61->1.62 
#   F:pci/fm801.c:1.43->1.44 
#   F:pci/intel8x0.c:1.130->1.131 
#   F:pci/intel8x0m.c:1.1->1.2 
#   F:pci/maestro3.c:1.48->1.49 
#   F:pci/rme32.c:1.31->1.32 
#   F:pci/rme96.c:1.33->1.34 
#   F:pci/sonicvibes.c:1.33->1.34 
#   F:pci/via82xx.c:1.94->1.95 
#   F:pci/ac97/ac97_codec.c:1.127->1.128 
#   F:pci/ali5451/ali5451.c:1.43->1.44 
#   F:pci/au88x0/au88x0.c:1.6->1.7 
#   F:pci/cs46xx/cs46xx.c:1.24->1.25 
#   F:pci/emu10k1/emu10k1.c:1.22->1.23 
#   F:pci/ice1712/ice1712.c:1.47->1.48 
#   F:pci/ice1712/ice1724.c:1.27->1.28 
#   F:pci/korg1212/korg1212.c:1.36->1.37 
#   F:pci/mixart/mixart.c:1.6->1.7 
#   F:pci/nm256/nm256.c:1.33->1.34 
#   F:pci/rme9652/hdsp.c:1.54->1.55 
#   F:pci/rme9652/rme9652.c:1.42->1.43 
#   F:pci/trident/trident.c:1.21->1.22 
#   F:pci/vx222/vx222.c:1.3->1.4 
#   F:pci/ymfpci/ymfpci.c:1.33->1.34 
#   F:pcmcia/pdaudiocf/pdaudiocf.c:1.4->1.5 
#   F:pcmcia/vx/vxpocket.c:1.3->1.4 
#   F:ppc/powermac.c:1.15->1.16 
#   F:sparc/amd7930.c:1.8->1.9 
#   F:sparc/cs4231.c:1.12->1.13 
#   F:usb/usbaudio.c:1.96->1.97 
#   L:use the new module_param*() functions.
# 
# sound/isa/gus/gusmax.c
#   2004/04/07 12:48:14+02:00 perex@suse.cz +12 -43
#   ALSA CVS update
#   D:2004/04/07 18:48:10
#   C:Documentation,SA11xx UDA1341 driver,Memalloc module,PCM Midlevel
#   C:RawMidi Midlevel,RTC timer driver,ALSA Core,Timer Midlevel
#   C:ALSA<-OSS emulation,ALSA sequencer,ALSA<-OSS sequencer,Generic drivers
#   C:MPU401 UART,OPL3,OPL4,ALS100 driver,AZT2320 driver,CMI8330 driver
#   C:DT019x driver,ES18xx driver,OPL3SA2 driver,Sound Galaxy driver
#   C:Sound Scape driver,AD1816A driver,AD1848 driver,CS4231 driver
#   C:CS4236+ driver,PC98(CS423x) driver,ES1688 driver,GUS Classic driver
#   C:GUS Extreme driver,GUS MAX driver,AMD InterWave driver,Opti9xx drivers
#   C:EMU8000 driver,ES968 driver,SB16/AWE driver,SB8 driver
#   C:Wavefront drivers,PARISC Harmony driver,ALS4000 driver,ATIIXP driver
#   C:AZT3328 driver,BT87x driver,CMIPCI driver,CS4281 driver
#   C:ENS1370/1+ driver,ES1938 driver,ES1968 driver,FM801 driver
#   C:Intel8x0 driver,Intel8x0-modem driver,Maestro3 driver,RME32 driver
#   C:RME96 driver,SonicVibes driver,VIA82xx driver,AC97 Codec Core
#   C:ALI5451 driver,au88x0 driver,CS46xx driver,EMU10K1/EMU10K2 driver
#   C:ICE1712 driver,ICE1724 driver,KORG1212 driver,MIXART driver
#   C:NM256 driver,RME HDSP driver,RME9652 driver,Trident driver
#   C:Digigram VX222 driver,YMFPCI driver,Sound Core PDAudioCF driver
#   C:Digigram VX Pocket driver,PPC PowerMac driver,SPARC AMD7930 driver
#   C:SPARC cs4231 driver,USB generic driver
#   A:Takashi Iwai <tiwai@suse.de>
#   F:Documentation/DocBook/writing-an-alsa-driver.tmpl:1.24->1.25 
#   F:arm/sa11xx-uda1341.c:1.13->1.14 
#   F:core/memalloc.c:1.28->1.29 
#   F:core/pcm_memory.c:1.25->1.26 
#   F:core/rawmidi.c:1.41->1.42 
#   F:core/rtctimer.c:1.19->1.20 
#   F:core/sound.c:1.59->1.60 
#   F:core/timer.c:1.56->1.57 
#   F:core/oss/pcm_oss.c:1.66->1.67 
#   F:core/seq/seq.c:1.9->1.10 
#   F:core/seq/seq_dummy.c:1.10->1.11 
#   F:core/seq/seq_midi.c:1.18->1.19 
#   F:core/seq/oss/seq_oss.c:1.11->1.12 
#   F:core/seq/oss/seq_oss_init.c:1.11->1.12 
#   F:drivers/dummy.c:1.26->1.27 
#   F:drivers/mtpav.c:1.26->1.27 
#   F:drivers/serial-u16550.c:1.25->1.26 
#   F:drivers/virmidi.c:1.11->1.12 
#   F:drivers/mpu401/mpu401.c:1.16->1.17 
#   F:drivers/opl3/opl3_seq.c:1.12->1.13 
#   F:drivers/opl4/opl4_seq.c:1.2->1.3 
#   F:include/initval.h:1.19->1.20 
#   F:isa/als100.c:1.24->1.25 
#   F:isa/azt2320.c:1.24->1.25 
#   F:isa/cmi8330.c:1.28->1.29 
#   F:isa/dt019x.c:1.18->1.19 
#   F:isa/es18xx.c:1.44->1.45 
#   F:isa/opl3sa2.c:1.32->1.33 
#   F:isa/sgalaxy.c:1.19->1.20 
#   F:isa/sscape.c:1.11->1.12 
#   F:isa/ad1816a/ad1816a.c:1.18->1.19 
#   F:isa/ad1848/ad1848.c:1.10->1.11 
#   F:isa/cs423x/cs4231.c:1.12->1.13 
#   F:isa/cs423x/cs4236.c:1.41->1.42 
#   F:isa/cs423x/pc98.c:1.7->1.8 
#   F:isa/es1688/es1688.c:1.14->1.15 
#   F:isa/gus/gusclassic.c:1.13->1.14 
#   F:isa/gus/gusextreme.c:1.15->1.16 
#   F:isa/gus/gusmax.c:1.14->1.15 
#   F:isa/gus/interwave.c:1.32->1.33 
#   F:isa/opti9xx/opti92x-ad1848.c:1.42->1.43 
#   F:isa/sb/emu8000_patch.c:1.8->1.9 
#   F:isa/sb/es968.c:1.24->1.25 
#   F:isa/sb/sb16.c:1.45->1.46 
#   F:isa/sb/sb8.c:1.18->1.19 
#   F:isa/wavefront/wavefront.c:1.27->1.28 
#   F:isa/wavefront/wavefront_synth.c:1.14->1.15 
#   F:parisc/harmony.c:1.5->1.6 
#   F:pci/als4000.c:1.31->1.32 
#   F:pci/atiixp.c:1.2->1.3 
#   F:pci/azt3328.c:1.11->1.12 
#   F:pci/bt87x.c:1.3->1.4 
#   F:pci/cmipci.c:1.61->1.62 
#   F:pci/cs4281.c:1.50->1.51 
#   F:pci/ens1370.c:1.58->1.59 
#   F:pci/es1938.c:1.33->1.34 
#   F:pci/es1968.c:1.61->1.62 
#   F:pci/fm801.c:1.43->1.44 
#   F:pci/intel8x0.c:1.130->1.131 
#   F:pci/intel8x0m.c:1.1->1.2 
#   F:pci/maestro3.c:1.48->1.49 
#   F:pci/rme32.c:1.31->1.32 
#   F:pci/rme96.c:1.33->1.34 
#   F:pci/sonicvibes.c:1.33->1.34 
#   F:pci/via82xx.c:1.94->1.95 
#   F:pci/ac97/ac97_codec.c:1.127->1.128 
#   F:pci/ali5451/ali5451.c:1.43->1.44 
#   F:pci/au88x0/au88x0.c:1.6->1.7 
#   F:pci/cs46xx/cs46xx.c:1.24->1.25 
#   F:pci/emu10k1/emu10k1.c:1.22->1.23 
#   F:pci/ice1712/ice1712.c:1.47->1.48 
#   F:pci/ice1712/ice1724.c:1.27->1.28 
#   F:pci/korg1212/korg1212.c:1.36->1.37 
#   F:pci/mixart/mixart.c:1.6->1.7 
#   F:pci/nm256/nm256.c:1.33->1.34 
#   F:pci/rme9652/hdsp.c:1.54->1.55 
#   F:pci/rme9652/rme9652.c:1.42->1.43 
#   F:pci/trident/trident.c:1.21->1.22 
#   F:pci/vx222/vx222.c:1.3->1.4 
#   F:pci/ymfpci/ymfpci.c:1.33->1.34 
#   F:pcmcia/pdaudiocf/pdaudiocf.c:1.4->1.5 
#   F:pcmcia/vx/vxpocket.c:1.3->1.4 
#   F:ppc/powermac.c:1.15->1.16 
#   F:sparc/amd7930.c:1.8->1.9 
#   F:sparc/cs4231.c:1.12->1.13 
#   F:usb/usbaudio.c:1.96->1.97 
#   L:use the new module_param*() functions.
# 
# sound/isa/gus/gusextreme.c
#   2004/04/07 12:48:14+02:00 perex@suse.cz +16 -49
#   ALSA CVS update
#   D:2004/04/07 18:48:10
#   C:Documentation,SA11xx UDA1341 driver,Memalloc module,PCM Midlevel
#   C:RawMidi Midlevel,RTC timer driver,ALSA Core,Timer Midlevel
#   C:ALSA<-OSS emulation,ALSA sequencer,ALSA<-OSS sequencer,Generic drivers
#   C:MPU401 UART,OPL3,OPL4,ALS100 driver,AZT2320 driver,CMI8330 driver
#   C:DT019x driver,ES18xx driver,OPL3SA2 driver,Sound Galaxy driver
#   C:Sound Scape driver,AD1816A driver,AD1848 driver,CS4231 driver
#   C:CS4236+ driver,PC98(CS423x) driver,ES1688 driver,GUS Classic driver
#   C:GUS Extreme driver,GUS MAX driver,AMD InterWave driver,Opti9xx drivers
#   C:EMU8000 driver,ES968 driver,SB16/AWE driver,SB8 driver
#   C:Wavefront drivers,PARISC Harmony driver,ALS4000 driver,ATIIXP driver
#   C:AZT3328 driver,BT87x driver,CMIPCI driver,CS4281 driver
#   C:ENS1370/1+ driver,ES1938 driver,ES1968 driver,FM801 driver
#   C:Intel8x0 driver,Intel8x0-modem driver,Maestro3 driver,RME32 driver
#   C:RME96 driver,SonicVibes driver,VIA82xx driver,AC97 Codec Core
#   C:ALI5451 driver,au88x0 driver,CS46xx driver,EMU10K1/EMU10K2 driver
#   C:ICE1712 driver,ICE1724 driver,KORG1212 driver,MIXART driver
#   C:NM256 driver,RME HDSP driver,RME9652 driver,Trident driver
#   C:Digigram VX222 driver,YMFPCI driver,Sound Core PDAudioCF driver
#   C:Digigram VX Pocket driver,PPC PowerMac driver,SPARC AMD7930 driver
#   C:SPARC cs4231 driver,USB generic driver
#   A:Takashi Iwai <tiwai@suse.de>
#   F:Documentation/DocBook/writing-an-alsa-driver.tmpl:1.24->1.25 
#   F:arm/sa11xx-uda1341.c:1.13->1.14 
#   F:core/memalloc.c:1.28->1.29 
#   F:core/pcm_memory.c:1.25->1.26 
#   F:core/rawmidi.c:1.41->1.42 
#   F:core/rtctimer.c:1.19->1.20 
#   F:core/sound.c:1.59->1.60 
#   F:core/timer.c:1.56->1.57 
#   F:core/oss/pcm_oss.c:1.66->1.67 
#   F:core/seq/seq.c:1.9->1.10 
#   F:core/seq/seq_dummy.c:1.10->1.11 
#   F:core/seq/seq_midi.c:1.18->1.19 
#   F:core/seq/oss/seq_oss.c:1.11->1.12 
#   F:core/seq/oss/seq_oss_init.c:1.11->1.12 
#   F:drivers/dummy.c:1.26->1.27 
#   F:drivers/mtpav.c:1.26->1.27 
#   F:drivers/serial-u16550.c:1.25->1.26 
#   F:drivers/virmidi.c:1.11->1.12 
#   F:drivers/mpu401/mpu401.c:1.16->1.17 
#   F:drivers/opl3/opl3_seq.c:1.12->1.13 
#   F:drivers/opl4/opl4_seq.c:1.2->1.3 
#   F:include/initval.h:1.19->1.20 
#   F:isa/als100.c:1.24->1.25 
#   F:isa/azt2320.c:1.24->1.25 
#   F:isa/cmi8330.c:1.28->1.29 
#   F:isa/dt019x.c:1.18->1.19 
#   F:isa/es18xx.c:1.44->1.45 
#   F:isa/opl3sa2.c:1.32->1.33 
#   F:isa/sgalaxy.c:1.19->1.20 
#   F:isa/sscape.c:1.11->1.12 
#   F:isa/ad1816a/ad1816a.c:1.18->1.19 
#   F:isa/ad1848/ad1848.c:1.10->1.11 
#   F:isa/cs423x/cs4231.c:1.12->1.13 
#   F:isa/cs423x/cs4236.c:1.41->1.42 
#   F:isa/cs423x/pc98.c:1.7->1.8 
#   F:isa/es1688/es1688.c:1.14->1.15 
#   F:isa/gus/gusclassic.c:1.13->1.14 
#   F:isa/gus/gusextreme.c:1.15->1.16 
#   F:isa/gus/gusmax.c:1.14->1.15 
#   F:isa/gus/interwave.c:1.32->1.33 
#   F:isa/opti9xx/opti92x-ad1848.c:1.42->1.43 
#   F:isa/sb/emu8000_patch.c:1.8->1.9 
#   F:isa/sb/es968.c:1.24->1.25 
#   F:isa/sb/sb16.c:1.45->1.46 
#   F:isa/sb/sb8.c:1.18->1.19 
#   F:isa/wavefront/wavefront.c:1.27->1.28 
#   F:isa/wavefront/wavefront_synth.c:1.14->1.15 
#   F:parisc/harmony.c:1.5->1.6 
#   F:pci/als4000.c:1.31->1.32 
#   F:pci/atiixp.c:1.2->1.3 
#   F:pci/azt3328.c:1.11->1.12 
#   F:pci/bt87x.c:1.3->1.4 
#   F:pci/cmipci.c:1.61->1.62 
#   F:pci/cs4281.c:1.50->1.51 
#   F:pci/ens1370.c:1.58->1.59 
#   F:pci/es1938.c:1.33->1.34 
#   F:pci/es1968.c:1.61->1.62 
#   F:pci/fm801.c:1.43->1.44 
#   F:pci/intel8x0.c:1.130->1.131 
#   F:pci/intel8x0m.c:1.1->1.2 
#   F:pci/maestro3.c:1.48->1.49 
#   F:pci/rme32.c:1.31->1.32 
#   F:pci/rme96.c:1.33->1.34 
#   F:pci/sonicvibes.c:1.33->1.34 
#   F:pci/via82xx.c:1.94->1.95 
#   F:pci/ac97/ac97_codec.c:1.127->1.128 
#   F:pci/ali5451/ali5451.c:1.43->1.44 
#   F:pci/au88x0/au88x0.c:1.6->1.7 
#   F:pci/cs46xx/cs46xx.c:1.24->1.25 
#   F:pci/emu10k1/emu10k1.c:1.22->1.23 
#   F:pci/ice1712/ice1712.c:1.47->1.48 
#   F:pci/ice1712/ice1724.c:1.27->1.28 
#   F:pci/korg1212/korg1212.c:1.36->1.37 
#   F:pci/mixart/mixart.c:1.6->1.7 
#   F:pci/nm256/nm256.c:1.33->1.34 
#   F:pci/rme9652/hdsp.c:1.54->1.55 
#   F:pci/rme9652/rme9652.c:1.42->1.43 
#   F:pci/trident/trident.c:1.21->1.22 
#   F:pci/vx222/vx222.c:1.3->1.4 
#   F:pci/ymfpci/ymfpci.c:1.33->1.34 
#   F:pcmcia/pdaudiocf/pdaudiocf.c:1.4->1.5 
#   F:pcmcia/vx/vxpocket.c:1.3->1.4 
#   F:ppc/powermac.c:1.15->1.16 
#   F:sparc/amd7930.c:1.8->1.9 
#   F:sparc/cs4231.c:1.12->1.13 
#   F:usb/usbaudio.c:1.96->1.97 
#   L:use the new module_param*() functions.
# 
# sound/isa/gus/gusclassic.c
#   2004/04/07 12:48:14+02:00 perex@suse.cz +12 -43
#   ALSA CVS update
#   D:2004/04/07 18:48:10
#   C:Documentation,SA11xx UDA1341 driver,Memalloc module,PCM Midlevel
#   C:RawMidi Midlevel,RTC timer driver,ALSA Core,Timer Midlevel
#   C:ALSA<-OSS emulation,ALSA sequencer,ALSA<-OSS sequencer,Generic drivers
#   C:MPU401 UART,OPL3,OPL4,ALS100 driver,AZT2320 driver,CMI8330 driver
#   C:DT019x driver,ES18xx driver,OPL3SA2 driver,Sound Galaxy driver
#   C:Sound Scape driver,AD1816A driver,AD1848 driver,CS4231 driver
#   C:CS4236+ driver,PC98(CS423x) driver,ES1688 driver,GUS Classic driver
#   C:GUS Extreme driver,GUS MAX driver,AMD InterWave driver,Opti9xx drivers
#   C:EMU8000 driver,ES968 driver,SB16/AWE driver,SB8 driver
#   C:Wavefront drivers,PARISC Harmony driver,ALS4000 driver,ATIIXP driver
#   C:AZT3328 driver,BT87x driver,CMIPCI driver,CS4281 driver
#   C:ENS1370/1+ driver,ES1938 driver,ES1968 driver,FM801 driver
#   C:Intel8x0 driver,Intel8x0-modem driver,Maestro3 driver,RME32 driver
#   C:RME96 driver,SonicVibes driver,VIA82xx driver,AC97 Codec Core
#   C:ALI5451 driver,au88x0 driver,CS46xx driver,EMU10K1/EMU10K2 driver
#   C:ICE1712 driver,ICE1724 driver,KORG1212 driver,MIXART driver
#   C:NM256 driver,RME HDSP driver,RME9652 driver,Trident driver
#   C:Digigram VX222 driver,YMFPCI driver,Sound Core PDAudioCF driver
#   C:Digigram VX Pocket driver,PPC PowerMac driver,SPARC AMD7930 driver
#   C:SPARC cs4231 driver,USB generic driver
#   A:Takashi Iwai <tiwai@suse.de>
#   F:Documentation/DocBook/writing-an-alsa-driver.tmpl:1.24->1.25 
#   F:arm/sa11xx-uda1341.c:1.13->1.14 
#   F:core/memalloc.c:1.28->1.29 
#   F:core/pcm_memory.c:1.25->1.26 
#   F:core/rawmidi.c:1.41->1.42 
#   F:core/rtctimer.c:1.19->1.20 
#   F:core/sound.c:1.59->1.60 
#   F:core/timer.c:1.56->1.57 
#   F:core/oss/pcm_oss.c:1.66->1.67 
#   F:core/seq/seq.c:1.9->1.10 
#   F:core/seq/seq_dummy.c:1.10->1.11 
#   F:core/seq/seq_midi.c:1.18->1.19 
#   F:core/seq/oss/seq_oss.c:1.11->1.12 
#   F:core/seq/oss/seq_oss_init.c:1.11->1.12 
#   F:drivers/dummy.c:1.26->1.27 
#   F:drivers/mtpav.c:1.26->1.27 
#   F:drivers/serial-u16550.c:1.25->1.26 
#   F:drivers/virmidi.c:1.11->1.12 
#   F:drivers/mpu401/mpu401.c:1.16->1.17 
#   F:drivers/opl3/opl3_seq.c:1.12->1.13 
#   F:drivers/opl4/opl4_seq.c:1.2->1.3 
#   F:include/initval.h:1.19->1.20 
#   F:isa/als100.c:1.24->1.25 
#   F:isa/azt2320.c:1.24->1.25 
#   F:isa/cmi8330.c:1.28->1.29 
#   F:isa/dt019x.c:1.18->1.19 
#   F:isa/es18xx.c:1.44->1.45 
#   F:isa/opl3sa2.c:1.32->1.33 
#   F:isa/sgalaxy.c:1.19->1.20 
#   F:isa/sscape.c:1.11->1.12 
#   F:isa/ad1816a/ad1816a.c:1.18->1.19 
#   F:isa/ad1848/ad1848.c:1.10->1.11 
#   F:isa/cs423x/cs4231.c:1.12->1.13 
#   F:isa/cs423x/cs4236.c:1.41->1.42 
#   F:isa/cs423x/pc98.c:1.7->1.8 
#   F:isa/es1688/es1688.c:1.14->1.15 
#   F:isa/gus/gusclassic.c:1.13->1.14 
#   F:isa/gus/gusextreme.c:1.15->1.16 
#   F:isa/gus/gusmax.c:1.14->1.15 
#   F:isa/gus/interwave.c:1.32->1.33 
#   F:isa/opti9xx/opti92x-ad1848.c:1.42->1.43 
#   F:isa/sb/emu8000_patch.c:1.8->1.9 
#   F:isa/sb/es968.c:1.24->1.25 
#   F:isa/sb/sb16.c:1.45->1.46 
#   F:isa/sb/sb8.c:1.18->1.19 
#   F:isa/wavefront/wavefront.c:1.27->1.28 
#   F:isa/wavefront/wavefront_synth.c:1.14->1.15 
#   F:parisc/harmony.c:1.5->1.6 
#   F:pci/als4000.c:1.31->1.32 
#   F:pci/atiixp.c:1.2->1.3 
#   F:pci/azt3328.c:1.11->1.12 
#   F:pci/bt87x.c:1.3->1.4 
#   F:pci/cmipci.c:1.61->1.62 
#   F:pci/cs4281.c:1.50->1.51 
#   F:pci/ens1370.c:1.58->1.59 
#   F:pci/es1938.c:1.33->1.34 
#   F:pci/es1968.c:1.61->1.62 
#   F:pci/fm801.c:1.43->1.44 
#   F:pci/intel8x0.c:1.130->1.131 
#   F:pci/intel8x0m.c:1.1->1.2 
#   F:pci/maestro3.c:1.48->1.49 
#   F:pci/rme32.c:1.31->1.32 
#   F:pci/rme96.c:1.33->1.34 
#   F:pci/sonicvibes.c:1.33->1.34 
#   F:pci/via82xx.c:1.94->1.95 
#   F:pci/ac97/ac97_codec.c:1.127->1.128 
#   F:pci/ali5451/ali5451.c:1.43->1.44 
#   F:pci/au88x0/au88x0.c:1.6->1.7 
#   F:pci/cs46xx/cs46xx.c:1.24->1.25 
#   F:pci/emu10k1/emu10k1.c:1.22->1.23 
#   F:pci/ice1712/ice1712.c:1.47->1.48 
#   F:pci/ice1712/ice1724.c:1.27->1.28 
#   F:pci/korg1212/korg1212.c:1.36->1.37 
#   F:pci/mixart/mixart.c:1.6->1.7 
#   F:pci/nm256/nm256.c:1.33->1.34 
#   F:pci/rme9652/hdsp.c:1.54->1.55 
#   F:pci/rme9652/rme9652.c:1.42->1.43 
#   F:pci/trident/trident.c:1.21->1.22 
#   F:pci/vx222/vx222.c:1.3->1.4 
#   F:pci/ymfpci/ymfpci.c:1.33->1.34 
#   F:pcmcia/pdaudiocf/pdaudiocf.c:1.4->1.5 
#   F:pcmcia/vx/vxpocket.c:1.3->1.4 
#   F:ppc/powermac.c:1.15->1.16 
#   F:sparc/amd7930.c:1.8->1.9 
#   F:sparc/cs4231.c:1.12->1.13 
#   F:usb/usbaudio.c:1.96->1.97 
#   L:use the new module_param*() functions.
# 
# sound/isa/es18xx.c
#   2004/04/07 12:48:13+02:00 perex@suse.cz +12 -47
#   ALSA CVS update
#   D:2004/04/07 18:48:10
#   C:Documentation,SA11xx UDA1341 driver,Memalloc module,PCM Midlevel
#   C:RawMidi Midlevel,RTC timer driver,ALSA Core,Timer Midlevel
#   C:ALSA<-OSS emulation,ALSA sequencer,ALSA<-OSS sequencer,Generic drivers
#   C:MPU401 UART,OPL3,OPL4,ALS100 driver,AZT2320 driver,CMI8330 driver
#   C:DT019x driver,ES18xx driver,OPL3SA2 driver,Sound Galaxy driver
#   C:Sound Scape driver,AD1816A driver,AD1848 driver,CS4231 driver
#   C:CS4236+ driver,PC98(CS423x) driver,ES1688 driver,GUS Classic driver
#   C:GUS Extreme driver,GUS MAX driver,AMD InterWave driver,Opti9xx drivers
#   C:EMU8000 driver,ES968 driver,SB16/AWE driver,SB8 driver
#   C:Wavefront drivers,PARISC Harmony driver,ALS4000 driver,ATIIXP driver
#   C:AZT3328 driver,BT87x driver,CMIPCI driver,CS4281 driver
#   C:ENS1370/1+ driver,ES1938 driver,ES1968 driver,FM801 driver
#   C:Intel8x0 driver,Intel8x0-modem driver,Maestro3 driver,RME32 driver
#   C:RME96 driver,SonicVibes driver,VIA82xx driver,AC97 Codec Core
#   C:ALI5451 driver,au88x0 driver,CS46xx driver,EMU10K1/EMU10K2 driver
#   C:ICE1712 driver,ICE1724 driver,KORG1212 driver,MIXART driver
#   C:NM256 driver,RME HDSP driver,RME9652 driver,Trident driver
#   C:Digigram VX222 driver,YMFPCI driver,Sound Core PDAudioCF driver
#   C:Digigram VX Pocket driver,PPC PowerMac driver,SPARC AMD7930 driver
#   C:SPARC cs4231 driver,USB generic driver
#   A:Takashi Iwai <tiwai@suse.de>
#   F:Documentation/DocBook/writing-an-alsa-driver.tmpl:1.24->1.25 
#   F:arm/sa11xx-uda1341.c:1.13->1.14 
#   F:core/memalloc.c:1.28->1.29 
#   F:core/pcm_memory.c:1.25->1.26 
#   F:core/rawmidi.c:1.41->1.42 
#   F:core/rtctimer.c:1.19->1.20 
#   F:core/sound.c:1.59->1.60 
#   F:core/timer.c:1.56->1.57 
#   F:core/oss/pcm_oss.c:1.66->1.67 
#   F:core/seq/seq.c:1.9->1.10 
#   F:core/seq/seq_dummy.c:1.10->1.11 
#   F:core/seq/seq_midi.c:1.18->1.19 
#   F:core/seq/oss/seq_oss.c:1.11->1.12 
#   F:core/seq/oss/seq_oss_init.c:1.11->1.12 
#   F:drivers/dummy.c:1.26->1.27 
#   F:drivers/mtpav.c:1.26->1.27 
#   F:drivers/serial-u16550.c:1.25->1.26 
#   F:drivers/virmidi.c:1.11->1.12 
#   F:drivers/mpu401/mpu401.c:1.16->1.17 
#   F:drivers/opl3/opl3_seq.c:1.12->1.13 
#   F:drivers/opl4/opl4_seq.c:1.2->1.3 
#   F:include/initval.h:1.19->1.20 
#   F:isa/als100.c:1.24->1.25 
#   F:isa/azt2320.c:1.24->1.25 
#   F:isa/cmi8330.c:1.28->1.29 
#   F:isa/dt019x.c:1.18->1.19 
#   F:isa/es18xx.c:1.44->1.45 
#   F:isa/opl3sa2.c:1.32->1.33 
#   F:isa/sgalaxy.c:1.19->1.20 
#   F:isa/sscape.c:1.11->1.12 
#   F:isa/ad1816a/ad1816a.c:1.18->1.19 
#   F:isa/ad1848/ad1848.c:1.10->1.11 
#   F:isa/cs423x/cs4231.c:1.12->1.13 
#   F:isa/cs423x/cs4236.c:1.41->1.42 
#   F:isa/cs423x/pc98.c:1.7->1.8 
#   F:isa/es1688/es1688.c:1.14->1.15 
#   F:isa/gus/gusclassic.c:1.13->1.14 
#   F:isa/gus/gusextreme.c:1.15->1.16 
#   F:isa/gus/gusmax.c:1.14->1.15 
#   F:isa/gus/interwave.c:1.32->1.33 
#   F:isa/opti9xx/opti92x-ad1848.c:1.42->1.43 
#   F:isa/sb/emu8000_patch.c:1.8->1.9 
#   F:isa/sb/es968.c:1.24->1.25 
#   F:isa/sb/sb16.c:1.45->1.46 
#   F:isa/sb/sb8.c:1.18->1.19 
#   F:isa/wavefront/wavefront.c:1.27->1.28 
#   F:isa/wavefront/wavefront_synth.c:1.14->1.15 
#   F:parisc/harmony.c:1.5->1.6 
#   F:pci/als4000.c:1.31->1.32 
#   F:pci/atiixp.c:1.2->1.3 
#   F:pci/azt3328.c:1.11->1.12 
#   F:pci/bt87x.c:1.3->1.4 
#   F:pci/cmipci.c:1.61->1.62 
#   F:pci/cs4281.c:1.50->1.51 
#   F:pci/ens1370.c:1.58->1.59 
#   F:pci/es1938.c:1.33->1.34 
#   F:pci/es1968.c:1.61->1.62 
#   F:pci/fm801.c:1.43->1.44 
#   F:pci/intel8x0.c:1.130->1.131 
#   F:pci/intel8x0m.c:1.1->1.2 
#   F:pci/maestro3.c:1.48->1.49 
#   F:pci/rme32.c:1.31->1.32 
#   F:pci/rme96.c:1.33->1.34 
#   F:pci/sonicvibes.c:1.33->1.34 
#   F:pci/via82xx.c:1.94->1.95 
#   F:pci/ac97/ac97_codec.c:1.127->1.128 
#   F:pci/ali5451/ali5451.c:1.43->1.44 
#   F:pci/au88x0/au88x0.c:1.6->1.7 
#   F:pci/cs46xx/cs46xx.c:1.24->1.25 
#   F:pci/emu10k1/emu10k1.c:1.22->1.23 
#   F:pci/ice1712/ice1712.c:1.47->1.48 
#   F:pci/ice1712/ice1724.c:1.27->1.28 
#   F:pci/korg1212/korg1212.c:1.36->1.37 
#   F:pci/mixart/mixart.c:1.6->1.7 
#   F:pci/nm256/nm256.c:1.33->1.34 
#   F:pci/rme9652/hdsp.c:1.54->1.55 
#   F:pci/rme9652/rme9652.c:1.42->1.43 
#   F:pci/trident/trident.c:1.21->1.22 
#   F:pci/vx222/vx222.c:1.3->1.4 
#   F:pci/ymfpci/ymfpci.c:1.33->1.34 
#   F:pcmcia/pdaudiocf/pdaudiocf.c:1.4->1.5 
#   F:pcmcia/vx/vxpocket.c:1.3->1.4 
#   F:ppc/powermac.c:1.15->1.16 
#   F:sparc/amd7930.c:1.8->1.9 
#   F:sparc/cs4231.c:1.12->1.13 
#   F:usb/usbaudio.c:1.96->1.97 
#   L:use the new module_param*() functions.
# 
# sound/isa/es1688/es1688.c
#   2004/04/07 12:48:14+02:00 perex@suse.cz +10 -38
#   ALSA CVS update
#   D:2004/04/07 18:48:10
#   C:Documentation,SA11xx UDA1341 driver,Memalloc module,PCM Midlevel
#   C:RawMidi Midlevel,RTC timer driver,ALSA Core,Timer Midlevel
#   C:ALSA<-OSS emulation,ALSA sequencer,ALSA<-OSS sequencer,Generic drivers
#   C:MPU401 UART,OPL3,OPL4,ALS100 driver,AZT2320 driver,CMI8330 driver
#   C:DT019x driver,ES18xx driver,OPL3SA2 driver,Sound Galaxy driver
#   C:Sound Scape driver,AD1816A driver,AD1848 driver,CS4231 driver
#   C:CS4236+ driver,PC98(CS423x) driver,ES1688 driver,GUS Classic driver
#   C:GUS Extreme driver,GUS MAX driver,AMD InterWave driver,Opti9xx drivers
#   C:EMU8000 driver,ES968 driver,SB16/AWE driver,SB8 driver
#   C:Wavefront drivers,PARISC Harmony driver,ALS4000 driver,ATIIXP driver
#   C:AZT3328 driver,BT87x driver,CMIPCI driver,CS4281 driver
#   C:ENS1370/1+ driver,ES1938 driver,ES1968 driver,FM801 driver
#   C:Intel8x0 driver,Intel8x0-modem driver,Maestro3 driver,RME32 driver
#   C:RME96 driver,SonicVibes driver,VIA82xx driver,AC97 Codec Core
#   C:ALI5451 driver,au88x0 driver,CS46xx driver,EMU10K1/EMU10K2 driver
#   C:ICE1712 driver,ICE1724 driver,KORG1212 driver,MIXART driver
#   C:NM256 driver,RME HDSP driver,RME9652 driver,Trident driver
#   C:Digigram VX222 driver,YMFPCI driver,Sound Core PDAudioCF driver
#   C:Digigram VX Pocket driver,PPC PowerMac driver,SPARC AMD7930 driver
#   C:SPARC cs4231 driver,USB generic driver
#   A:Takashi Iwai <tiwai@suse.de>
#   F:Documentation/DocBook/writing-an-alsa-driver.tmpl:1.24->1.25 
#   F:arm/sa11xx-uda1341.c:1.13->1.14 
#   F:core/memalloc.c:1.28->1.29 
#   F:core/pcm_memory.c:1.25->1.26 
#   F:core/rawmidi.c:1.41->1.42 
#   F:core/rtctimer.c:1.19->1.20 
#   F:core/sound.c:1.59->1.60 
#   F:core/timer.c:1.56->1.57 
#   F:core/oss/pcm_oss.c:1.66->1.67 
#   F:core/seq/seq.c:1.9->1.10 
#   F:core/seq/seq_dummy.c:1.10->1.11 
#   F:core/seq/seq_midi.c:1.18->1.19 
#   F:core/seq/oss/seq_oss.c:1.11->1.12 
#   F:core/seq/oss/seq_oss_init.c:1.11->1.12 
#   F:drivers/dummy.c:1.26->1.27 
#   F:drivers/mtpav.c:1.26->1.27 
#   F:drivers/serial-u16550.c:1.25->1.26 
#   F:drivers/virmidi.c:1.11->1.12 
#   F:drivers/mpu401/mpu401.c:1.16->1.17 
#   F:drivers/opl3/opl3_seq.c:1.12->1.13 
#   F:drivers/opl4/opl4_seq.c:1.2->1.3 
#   F:include/initval.h:1.19->1.20 
#   F:isa/als100.c:1.24->1.25 
#   F:isa/azt2320.c:1.24->1.25 
#   F:isa/cmi8330.c:1.28->1.29 
#   F:isa/dt019x.c:1.18->1.19 
#   F:isa/es18xx.c:1.44->1.45 
#   F:isa/opl3sa2.c:1.32->1.33 
#   F:isa/sgalaxy.c:1.19->1.20 
#   F:isa/sscape.c:1.11->1.12 
#   F:isa/ad1816a/ad1816a.c:1.18->1.19 
#   F:isa/ad1848/ad1848.c:1.10->1.11 
#   F:isa/cs423x/cs4231.c:1.12->1.13 
#   F:isa/cs423x/cs4236.c:1.41->1.42 
#   F:isa/cs423x/pc98.c:1.7->1.8 
#   F:isa/es1688/es1688.c:1.14->1.15 
#   F:isa/gus/gusclassic.c:1.13->1.14 
#   F:isa/gus/gusextreme.c:1.15->1.16 
#   F:isa/gus/gusmax.c:1.14->1.15 
#   F:isa/gus/interwave.c:1.32->1.33 
#   F:isa/opti9xx/opti92x-ad1848.c:1.42->1.43 
#   F:isa/sb/emu8000_patch.c:1.8->1.9 
#   F:isa/sb/es968.c:1.24->1.25 
#   F:isa/sb/sb16.c:1.45->1.46 
#   F:isa/sb/sb8.c:1.18->1.19 
#   F:isa/wavefront/wavefront.c:1.27->1.28 
#   F:isa/wavefront/wavefront_synth.c:1.14->1.15 
#   F:parisc/harmony.c:1.5->1.6 
#   F:pci/als4000.c:1.31->1.32 
#   F:pci/atiixp.c:1.2->1.3 
#   F:pci/azt3328.c:1.11->1.12 
#   F:pci/bt87x.c:1.3->1.4 
#   F:pci/cmipci.c:1.61->1.62 
#   F:pci/cs4281.c:1.50->1.51 
#   F:pci/ens1370.c:1.58->1.59 
#   F:pci/es1938.c:1.33->1.34 
#   F:pci/es1968.c:1.61->1.62 
#   F:pci/fm801.c:1.43->1.44 
#   F:pci/intel8x0.c:1.130->1.131 
#   F:pci/intel8x0m.c:1.1->1.2 
#   F:pci/maestro3.c:1.48->1.49 
#   F:pci/rme32.c:1.31->1.32 
#   F:pci/rme96.c:1.33->1.34 
#   F:pci/sonicvibes.c:1.33->1.34 
#   F:pci/via82xx.c:1.94->1.95 
#   F:pci/ac97/ac97_codec.c:1.127->1.128 
#   F:pci/ali5451/ali5451.c:1.43->1.44 
#   F:pci/au88x0/au88x0.c:1.6->1.7 
#   F:pci/cs46xx/cs46xx.c:1.24->1.25 
#   F:pci/emu10k1/emu10k1.c:1.22->1.23 
#   F:pci/ice1712/ice1712.c:1.47->1.48 
#   F:pci/ice1712/ice1724.c:1.27->1.28 
#   F:pci/korg1212/korg1212.c:1.36->1.37 
#   F:pci/mixart/mixart.c:1.6->1.7 
#   F:pci/nm256/nm256.c:1.33->1.34 
#   F:pci/rme9652/hdsp.c:1.54->1.55 
#   F:pci/rme9652/rme9652.c:1.42->1.43 
#   F:pci/trident/trident.c:1.21->1.22 
#   F:pci/vx222/vx222.c:1.3->1.4 
#   F:pci/ymfpci/ymfpci.c:1.33->1.34 
#   F:pcmcia/pdaudiocf/pdaudiocf.c:1.4->1.5 
#   F:pcmcia/vx/vxpocket.c:1.3->1.4 
#   F:ppc/powermac.c:1.15->1.16 
#   F:sparc/amd7930.c:1.8->1.9 
#   F:sparc/cs4231.c:1.12->1.13 
#   F:usb/usbaudio.c:1.96->1.97 
#   L:use the new module_param*() functions.
# 
# sound/isa/dt019x.c
#   2004/04/07 12:48:13+02:00 perex@suse.cz +11 -39
#   ALSA CVS update
#   D:2004/04/07 18:48:10
#   C:Documentation,SA11xx UDA1341 driver,Memalloc module,PCM Midlevel
#   C:RawMidi Midlevel,RTC timer driver,ALSA Core,Timer Midlevel
#   C:ALSA<-OSS emulation,ALSA sequencer,ALSA<-OSS sequencer,Generic drivers
#   C:MPU401 UART,OPL3,OPL4,ALS100 driver,AZT2320 driver,CMI8330 driver
#   C:DT019x driver,ES18xx driver,OPL3SA2 driver,Sound Galaxy driver
#   C:Sound Scape driver,AD1816A driver,AD1848 driver,CS4231 driver
#   C:CS4236+ driver,PC98(CS423x) driver,ES1688 driver,GUS Classic driver
#   C:GUS Extreme driver,GUS MAX driver,AMD InterWave driver,Opti9xx drivers
#   C:EMU8000 driver,ES968 driver,SB16/AWE driver,SB8 driver
#   C:Wavefront drivers,PARISC Harmony driver,ALS4000 driver,ATIIXP driver
#   C:AZT3328 driver,BT87x driver,CMIPCI driver,CS4281 driver
#   C:ENS1370/1+ driver,ES1938 driver,ES1968 driver,FM801 driver
#   C:Intel8x0 driver,Intel8x0-modem driver,Maestro3 driver,RME32 driver
#   C:RME96 driver,SonicVibes driver,VIA82xx driver,AC97 Codec Core
#   C:ALI5451 driver,au88x0 driver,CS46xx driver,EMU10K1/EMU10K2 driver
#   C:ICE1712 driver,ICE1724 driver,KORG1212 driver,MIXART driver
#   C:NM256 driver,RME HDSP driver,RME9652 driver,Trident driver
#   C:Digigram VX222 driver,YMFPCI driver,Sound Core PDAudioCF driver
#   C:Digigram VX Pocket driver,PPC PowerMac driver,SPARC AMD7930 driver
#   C:SPARC cs4231 driver,USB generic driver
#   A:Takashi Iwai <tiwai@suse.de>
#   F:Documentation/DocBook/writing-an-alsa-driver.tmpl:1.24->1.25 
#   F:arm/sa11xx-uda1341.c:1.13->1.14 
#   F:core/memalloc.c:1.28->1.29 
#   F:core/pcm_memory.c:1.25->1.26 
#   F:core/rawmidi.c:1.41->1.42 
#   F:core/rtctimer.c:1.19->1.20 
#   F:core/sound.c:1.59->1.60 
#   F:core/timer.c:1.56->1.57 
#   F:core/oss/pcm_oss.c:1.66->1.67 
#   F:core/seq/seq.c:1.9->1.10 
#   F:core/seq/seq_dummy.c:1.10->1.11 
#   F:core/seq/seq_midi.c:1.18->1.19 
#   F:core/seq/oss/seq_oss.c:1.11->1.12 
#   F:core/seq/oss/seq_oss_init.c:1.11->1.12 
#   F:drivers/dummy.c:1.26->1.27 
#   F:drivers/mtpav.c:1.26->1.27 
#   F:drivers/serial-u16550.c:1.25->1.26 
#   F:drivers/virmidi.c:1.11->1.12 
#   F:drivers/mpu401/mpu401.c:1.16->1.17 
#   F:drivers/opl3/opl3_seq.c:1.12->1.13 
#   F:drivers/opl4/opl4_seq.c:1.2->1.3 
#   F:include/initval.h:1.19->1.20 
#   F:isa/als100.c:1.24->1.25 
#   F:isa/azt2320.c:1.24->1.25 
#   F:isa/cmi8330.c:1.28->1.29 
#   F:isa/dt019x.c:1.18->1.19 
#   F:isa/es18xx.c:1.44->1.45 
#   F:isa/opl3sa2.c:1.32->1.33 
#   F:isa/sgalaxy.c:1.19->1.20 
#   F:isa/sscape.c:1.11->1.12 
#   F:isa/ad1816a/ad1816a.c:1.18->1.19 
#   F:isa/ad1848/ad1848.c:1.10->1.11 
#   F:isa/cs423x/cs4231.c:1.12->1.13 
#   F:isa/cs423x/cs4236.c:1.41->1.42 
#   F:isa/cs423x/pc98.c:1.7->1.8 
#   F:isa/es1688/es1688.c:1.14->1.15 
#   F:isa/gus/gusclassic.c:1.13->1.14 
#   F:isa/gus/gusextreme.c:1.15->1.16 
#   F:isa/gus/gusmax.c:1.14->1.15 
#   F:isa/gus/interwave.c:1.32->1.33 
#   F:isa/opti9xx/opti92x-ad1848.c:1.42->1.43 
#   F:isa/sb/emu8000_patch.c:1.8->1.9 
#   F:isa/sb/es968.c:1.24->1.25 
#   F:isa/sb/sb16.c:1.45->1.46 
#   F:isa/sb/sb8.c:1.18->1.19 
#   F:isa/wavefront/wavefront.c:1.27->1.28 
#   F:isa/wavefront/wavefront_synth.c:1.14->1.15 
#   F:parisc/harmony.c:1.5->1.6 
#   F:pci/als4000.c:1.31->1.32 
#   F:pci/atiixp.c:1.2->1.3 
#   F:pci/azt3328.c:1.11->1.12 
#   F:pci/bt87x.c:1.3->1.4 
#   F:pci/cmipci.c:1.61->1.62 
#   F:pci/cs4281.c:1.50->1.51 
#   F:pci/ens1370.c:1.58->1.59 
#   F:pci/es1938.c:1.33->1.34 
#   F:pci/es1968.c:1.61->1.62 
#   F:pci/fm801.c:1.43->1.44 
#   F:pci/intel8x0.c:1.130->1.131 
#   F:pci/intel8x0m.c:1.1->1.2 
#   F:pci/maestro3.c:1.48->1.49 
#   F:pci/rme32.c:1.31->1.32 
#   F:pci/rme96.c:1.33->1.34 
#   F:pci/sonicvibes.c:1.33->1.34 
#   F:pci/via82xx.c:1.94->1.95 
#   F:pci/ac97/ac97_codec.c:1.127->1.128 
#   F:pci/ali5451/ali5451.c:1.43->1.44 
#   F:pci/au88x0/au88x0.c:1.6->1.7 
#   F:pci/cs46xx/cs46xx.c:1.24->1.25 
#   F:pci/emu10k1/emu10k1.c:1.22->1.23 
#   F:pci/ice1712/ice1712.c:1.47->1.48 
#   F:pci/ice1712/ice1724.c:1.27->1.28 
#   F:pci/korg1212/korg1212.c:1.36->1.37 
#   F:pci/mixart/mixart.c:1.6->1.7 
#   F:pci/nm256/nm256.c:1.33->1.34 
#   F:pci/rme9652/hdsp.c:1.54->1.55 
#   F:pci/rme9652/rme9652.c:1.42->1.43 
#   F:pci/trident/trident.c:1.21->1.22 
#   F:pci/vx222/vx222.c:1.3->1.4 
#   F:pci/ymfpci/ymfpci.c:1.33->1.34 
#   F:pcmcia/pdaudiocf/pdaudiocf.c:1.4->1.5 
#   F:pcmcia/vx/vxpocket.c:1.3->1.4 
#   F:ppc/powermac.c:1.15->1.16 
#   F:sparc/amd7930.c:1.8->1.9 
#   F:sparc/cs4231.c:1.12->1.13 
#   F:usb/usbaudio.c:1.96->1.97 
#   L:use the new module_param*() functions.
# 
# sound/isa/cs423x/pc98.c
#   2004/04/07 12:48:14+02:00 perex@suse.cz +14 -44
#   ALSA CVS update
#   D:2004/04/07 18:48:10
#   C:Documentation,SA11xx UDA1341 driver,Memalloc module,PCM Midlevel
#   C:RawMidi Midlevel,RTC timer driver,ALSA Core,Timer Midlevel
#   C:ALSA<-OSS emulation,ALSA sequencer,ALSA<-OSS sequencer,Generic drivers
#   C:MPU401 UART,OPL3,OPL4,ALS100 driver,AZT2320 driver,CMI8330 driver
#   C:DT019x driver,ES18xx driver,OPL3SA2 driver,Sound Galaxy driver
#   C:Sound Scape driver,AD1816A driver,AD1848 driver,CS4231 driver
#   C:CS4236+ driver,PC98(CS423x) driver,ES1688 driver,GUS Classic driver
#   C:GUS Extreme driver,GUS MAX driver,AMD InterWave driver,Opti9xx drivers
#   C:EMU8000 driver,ES968 driver,SB16/AWE driver,SB8 driver
#   C:Wavefront drivers,PARISC Harmony driver,ALS4000 driver,ATIIXP driver
#   C:AZT3328 driver,BT87x driver,CMIPCI driver,CS4281 driver
#   C:ENS1370/1+ driver,ES1938 driver,ES1968 driver,FM801 driver
#   C:Intel8x0 driver,Intel8x0-modem driver,Maestro3 driver,RME32 driver
#   C:RME96 driver,SonicVibes driver,VIA82xx driver,AC97 Codec Core
#   C:ALI5451 driver,au88x0 driver,CS46xx driver,EMU10K1/EMU10K2 driver
#   C:ICE1712 driver,ICE1724 driver,KORG1212 driver,MIXART driver
#   C:NM256 driver,RME HDSP driver,RME9652 driver,Trident driver
#   C:Digigram VX222 driver,YMFPCI driver,Sound Core PDAudioCF driver
#   C:Digigram VX Pocket driver,PPC PowerMac driver,SPARC AMD7930 driver
#   C:SPARC cs4231 driver,USB generic driver
#   A:Takashi Iwai <tiwai@suse.de>
#   F:Documentation/DocBook/writing-an-alsa-driver.tmpl:1.24->1.25 
#   F:arm/sa11xx-uda1341.c:1.13->1.14 
#   F:core/memalloc.c:1.28->1.29 
#   F:core/pcm_memory.c:1.25->1.26 
#   F:core/rawmidi.c:1.41->1.42 
#   F:core/rtctimer.c:1.19->1.20 
#   F:core/sound.c:1.59->1.60 
#   F:core/timer.c:1.56->1.57 
#   F:core/oss/pcm_oss.c:1.66->1.67 
#   F:core/seq/seq.c:1.9->1.10 
#   F:core/seq/seq_dummy.c:1.10->1.11 
#   F:core/seq/seq_midi.c:1.18->1.19 
#   F:core/seq/oss/seq_oss.c:1.11->1.12 
#   F:core/seq/oss/seq_oss_init.c:1.11->1.12 
#   F:drivers/dummy.c:1.26->1.27 
#   F:drivers/mtpav.c:1.26->1.27 
#   F:drivers/serial-u16550.c:1.25->1.26 
#   F:drivers/virmidi.c:1.11->1.12 
#   F:drivers/mpu401/mpu401.c:1.16->1.17 
#   F:drivers/opl3/opl3_seq.c:1.12->1.13 
#   F:drivers/opl4/opl4_seq.c:1.2->1.3 
#   F:include/initval.h:1.19->1.20 
#   F:isa/als100.c:1.24->1.25 
#   F:isa/azt2320.c:1.24->1.25 
#   F:isa/cmi8330.c:1.28->1.29 
#   F:isa/dt019x.c:1.18->1.19 
#   F:isa/es18xx.c:1.44->1.45 
#   F:isa/opl3sa2.c:1.32->1.33 
#   F:isa/sgalaxy.c:1.19->1.20 
#   F:isa/sscape.c:1.11->1.12 
#   F:isa/ad1816a/ad1816a.c:1.18->1.19 
#   F:isa/ad1848/ad1848.c:1.10->1.11 
#   F:isa/cs423x/cs4231.c:1.12->1.13 
#   F:isa/cs423x/cs4236.c:1.41->1.42 
#   F:isa/cs423x/pc98.c:1.7->1.8 
#   F:isa/es1688/es1688.c:1.14->1.15 
#   F:isa/gus/gusclassic.c:1.13->1.14 
#   F:isa/gus/gusextreme.c:1.15->1.16 
#   F:isa/gus/gusmax.c:1.14->1.15 
#   F:isa/gus/interwave.c:1.32->1.33 
#   F:isa/opti9xx/opti92x-ad1848.c:1.42->1.43 
#   F:isa/sb/emu8000_patch.c:1.8->1.9 
#   F:isa/sb/es968.c:1.24->1.25 
#   F:isa/sb/sb16.c:1.45->1.46 
#   F:isa/sb/sb8.c:1.18->1.19 
#   F:isa/wavefront/wavefront.c:1.27->1.28 
#   F:isa/wavefront/wavefront_synth.c:1.14->1.15 
#   F:parisc/harmony.c:1.5->1.6 
#   F:pci/als4000.c:1.31->1.32 
#   F:pci/atiixp.c:1.2->1.3 
#   F:pci/azt3328.c:1.11->1.12 
#   F:pci/bt87x.c:1.3->1.4 
#   F:pci/cmipci.c:1.61->1.62 
#   F:pci/cs4281.c:1.50->1.51 
#   F:pci/ens1370.c:1.58->1.59 
#   F:pci/es1938.c:1.33->1.34 
#   F:pci/es1968.c:1.61->1.62 
#   F:pci/fm801.c:1.43->1.44 
#   F:pci/intel8x0.c:1.130->1.131 
#   F:pci/intel8x0m.c:1.1->1.2 
#   F:pci/maestro3.c:1.48->1.49 
#   F:pci/rme32.c:1.31->1.32 
#   F:pci/rme96.c:1.33->1.34 
#   F:pci/sonicvibes.c:1.33->1.34 
#   F:pci/via82xx.c:1.94->1.95 
#   F:pci/ac97/ac97_codec.c:1.127->1.128 
#   F:pci/ali5451/ali5451.c:1.43->1.44 
#   F:pci/au88x0/au88x0.c:1.6->1.7 
#   F:pci/cs46xx/cs46xx.c:1.24->1.25 
#   F:pci/emu10k1/emu10k1.c:1.22->1.23 
#   F:pci/ice1712/ice1712.c:1.47->1.48 
#   F:pci/ice1712/ice1724.c:1.27->1.28 
#   F:pci/korg1212/korg1212.c:1.36->1.37 
#   F:pci/mixart/mixart.c:1.6->1.7 
#   F:pci/nm256/nm256.c:1.33->1.34 
#   F:pci/rme9652/hdsp.c:1.54->1.55 
#   F:pci/rme9652/rme9652.c:1.42->1.43 
#   F:pci/trident/trident.c:1.21->1.22 
#   F:pci/vx222/vx222.c:1.3->1.4 
#   F:pci/ymfpci/ymfpci.c:1.33->1.34 
#   F:pcmcia/pdaudiocf/pdaudiocf.c:1.4->1.5 
#   F:pcmcia/vx/vxpocket.c:1.3->1.4 
#   F:ppc/powermac.c:1.15->1.16 
#   F:sparc/amd7930.c:1.8->1.9 
#   F:sparc/cs4231.c:1.12->1.13 
#   F:usb/usbaudio.c:1.96->1.97 
#   L:use the new module_param*() functions.
# 
# sound/isa/cs423x/cs4236.c
#   2004/04/07 12:48:14+02:00 perex@suse.cz +15 -59
#   ALSA CVS update
#   D:2004/04/07 18:48:10
#   C:Documentation,SA11xx UDA1341 driver,Memalloc module,PCM Midlevel
#   C:RawMidi Midlevel,RTC timer driver,ALSA Core,Timer Midlevel
#   C:ALSA<-OSS emulation,ALSA sequencer,ALSA<-OSS sequencer,Generic drivers
#   C:MPU401 UART,OPL3,OPL4,ALS100 driver,AZT2320 driver,CMI8330 driver
#   C:DT019x driver,ES18xx driver,OPL3SA2 driver,Sound Galaxy driver
#   C:Sound Scape driver,AD1816A driver,AD1848 driver,CS4231 driver
#   C:CS4236+ driver,PC98(CS423x) driver,ES1688 driver,GUS Classic driver
#   C:GUS Extreme driver,GUS MAX driver,AMD InterWave driver,Opti9xx drivers
#   C:EMU8000 driver,ES968 driver,SB16/AWE driver,SB8 driver
#   C:Wavefront drivers,PARISC Harmony driver,ALS4000 driver,ATIIXP driver
#   C:AZT3328 driver,BT87x driver,CMIPCI driver,CS4281 driver
#   C:ENS1370/1+ driver,ES1938 driver,ES1968 driver,FM801 driver
#   C:Intel8x0 driver,Intel8x0-modem driver,Maestro3 driver,RME32 driver
#   C:RME96 driver,SonicVibes driver,VIA82xx driver,AC97 Codec Core
#   C:ALI5451 driver,au88x0 driver,CS46xx driver,EMU10K1/EMU10K2 driver
#   C:ICE1712 driver,ICE1724 driver,KORG1212 driver,MIXART driver
#   C:NM256 driver,RME HDSP driver,RME9652 driver,Trident driver
#   C:Digigram VX222 driver,YMFPCI driver,Sound Core PDAudioCF driver
#   C:Digigram VX Pocket driver,PPC PowerMac driver,SPARC AMD7930 driver
#   C:SPARC cs4231 driver,USB generic driver
#   A:Takashi Iwai <tiwai@suse.de>
#   F:Documentation/DocBook/writing-an-alsa-driver.tmpl:1.24->1.25 
#   F:arm/sa11xx-uda1341.c:1.13->1.14 
#   F:core/memalloc.c:1.28->1.29 
#   F:core/pcm_memory.c:1.25->1.26 
#   F:core/rawmidi.c:1.41->1.42 
#   F:core/rtctimer.c:1.19->1.20 
#   F:core/sound.c:1.59->1.60 
#   F:core/timer.c:1.56->1.57 
#   F:core/oss/pcm_oss.c:1.66->1.67 
#   F:core/seq/seq.c:1.9->1.10 
#   F:core/seq/seq_dummy.c:1.10->1.11 
#   F:core/seq/seq_midi.c:1.18->1.19 
#   F:core/seq/oss/seq_oss.c:1.11->1.12 
#   F:core/seq/oss/seq_oss_init.c:1.11->1.12 
#   F:drivers/dummy.c:1.26->1.27 
#   F:drivers/mtpav.c:1.26->1.27 
#   F:drivers/serial-u16550.c:1.25->1.26 
#   F:drivers/virmidi.c:1.11->1.12 
#   F:drivers/mpu401/mpu401.c:1.16->1.17 
#   F:drivers/opl3/opl3_seq.c:1.12->1.13 
#   F:drivers/opl4/opl4_seq.c:1.2->1.3 
#   F:include/initval.h:1.19->1.20 
#   F:isa/als100.c:1.24->1.25 
#   F:isa/azt2320.c:1.24->1.25 
#   F:isa/cmi8330.c:1.28->1.29 
#   F:isa/dt019x.c:1.18->1.19 
#   F:isa/es18xx.c:1.44->1.45 
#   F:isa/opl3sa2.c:1.32->1.33 
#   F:isa/sgalaxy.c:1.19->1.20 
#   F:isa/sscape.c:1.11->1.12 
#   F:isa/ad1816a/ad1816a.c:1.18->1.19 
#   F:isa/ad1848/ad1848.c:1.10->1.11 
#   F:isa/cs423x/cs4231.c:1.12->1.13 
#   F:isa/cs423x/cs4236.c:1.41->1.42 
#   F:isa/cs423x/pc98.c:1.7->1.8 
#   F:isa/es1688/es1688.c:1.14->1.15 
#   F:isa/gus/gusclassic.c:1.13->1.14 
#   F:isa/gus/gusextreme.c:1.15->1.16 
#   F:isa/gus/gusmax.c:1.14->1.15 
#   F:isa/gus/interwave.c:1.32->1.33 
#   F:isa/opti9xx/opti92x-ad1848.c:1.42->1.43 
#   F:isa/sb/emu8000_patch.c:1.8->1.9 
#   F:isa/sb/es968.c:1.24->1.25 
#   F:isa/sb/sb16.c:1.45->1.46 
#   F:isa/sb/sb8.c:1.18->1.19 
#   F:isa/wavefront/wavefront.c:1.27->1.28 
#   F:isa/wavefront/wavefront_synth.c:1.14->1.15 
#   F:parisc/harmony.c:1.5->1.6 
#   F:pci/als4000.c:1.31->1.32 
#   F:pci/atiixp.c:1.2->1.3 
#   F:pci/azt3328.c:1.11->1.12 
#   F:pci/bt87x.c:1.3->1.4 
#   F:pci/cmipci.c:1.61->1.62 
#   F:pci/cs4281.c:1.50->1.51 
#   F:pci/ens1370.c:1.58->1.59 
#   F:pci/es1938.c:1.33->1.34 
#   F:pci/es1968.c:1.61->1.62 
#   F:pci/fm801.c:1.43->1.44 
#   F:pci/intel8x0.c:1.130->1.131 
#   F:pci/intel8x0m.c:1.1->1.2 
#   F:pci/maestro3.c:1.48->1.49 
#   F:pci/rme32.c:1.31->1.32 
#   F:pci/rme96.c:1.33->1.34 
#   F:pci/sonicvibes.c:1.33->1.34 
#   F:pci/via82xx.c:1.94->1.95 
#   F:pci/ac97/ac97_codec.c:1.127->1.128 
#   F:pci/ali5451/ali5451.c:1.43->1.44 
#   F:pci/au88x0/au88x0.c:1.6->1.7 
#   F:pci/cs46xx/cs46xx.c:1.24->1.25 
#   F:pci/emu10k1/emu10k1.c:1.22->1.23 
#   F:pci/ice1712/ice1712.c:1.47->1.48 
#   F:pci/ice1712/ice1724.c:1.27->1.28 
#   F:pci/korg1212/korg1212.c:1.36->1.37 
#   F:pci/mixart/mixart.c:1.6->1.7 
#   F:pci/nm256/nm256.c:1.33->1.34 
#   F:pci/rme9652/hdsp.c:1.54->1.55 
#   F:pci/rme9652/rme9652.c:1.42->1.43 
#   F:pci/trident/trident.c:1.21->1.22 
#   F:pci/vx222/vx222.c:1.3->1.4 
#   F:pci/ymfpci/ymfpci.c:1.33->1.34 
#   F:pcmcia/pdaudiocf/pdaudiocf.c:1.4->1.5 
#   F:pcmcia/vx/vxpocket.c:1.3->1.4 
#   F:ppc/powermac.c:1.15->1.16 
#   F:sparc/amd7930.c:1.8->1.9 
#   F:sparc/cs4231.c:1.12->1.13 
#   F:usb/usbaudio.c:1.96->1.97 
#   L:use the new module_param*() functions.
# 
# sound/isa/cs423x/cs4231.c
#   2004/04/07 12:48:14+02:00 perex@suse.cz +11 -41
#   ALSA CVS update
#   D:2004/04/07 18:48:10
#   C:Documentation,SA11xx UDA1341 driver,Memalloc module,PCM Midlevel
#   C:RawMidi Midlevel,RTC timer driver,ALSA Core,Timer Midlevel
#   C:ALSA<-OSS emulation,ALSA sequencer,ALSA<-OSS sequencer,Generic drivers
#   C:MPU401 UART,OPL3,OPL4,ALS100 driver,AZT2320 driver,CMI8330 driver
#   C:DT019x driver,ES18xx driver,OPL3SA2 driver,Sound Galaxy driver
#   C:Sound Scape driver,AD1816A driver,AD1848 driver,CS4231 driver
#   C:CS4236+ driver,PC98(CS423x) driver,ES1688 driver,GUS Classic driver
#   C:GUS Extreme driver,GUS MAX driver,AMD InterWave driver,Opti9xx drivers
#   C:EMU8000 driver,ES968 driver,SB16/AWE driver,SB8 driver
#   C:Wavefront drivers,PARISC Harmony driver,ALS4000 driver,ATIIXP driver
#   C:AZT3328 driver,BT87x driver,CMIPCI driver,CS4281 driver
#   C:ENS1370/1+ driver,ES1938 driver,ES1968 driver,FM801 driver
#   C:Intel8x0 driver,Intel8x0-modem driver,Maestro3 driver,RME32 driver
#   C:RME96 driver,SonicVibes driver,VIA82xx driver,AC97 Codec Core
#   C:ALI5451 driver,au88x0 driver,CS46xx driver,EMU10K1/EMU10K2 driver
#   C:ICE1712 driver,ICE1724 driver,KORG1212 driver,MIXART driver
#   C:NM256 driver,RME HDSP driver,RME9652 driver,Trident driver
#   C:Digigram VX222 driver,YMFPCI driver,Sound Core PDAudioCF driver
#   C:Digigram VX Pocket driver,PPC PowerMac driver,SPARC AMD7930 driver
#   C:SPARC cs4231 driver,USB generic driver
#   A:Takashi Iwai <tiwai@suse.de>
#   F:Documentation/DocBook/writing-an-alsa-driver.tmpl:1.24->1.25 
#   F:arm/sa11xx-uda1341.c:1.13->1.14 
#   F:core/memalloc.c:1.28->1.29 
#   F:core/pcm_memory.c:1.25->1.26 
#   F:core/rawmidi.c:1.41->1.42 
#   F:core/rtctimer.c:1.19->1.20 
#   F:core/sound.c:1.59->1.60 
#   F:core/timer.c:1.56->1.57 
#   F:core/oss/pcm_oss.c:1.66->1.67 
#   F:core/seq/seq.c:1.9->1.10 
#   F:core/seq/seq_dummy.c:1.10->1.11 
#   F:core/seq/seq_midi.c:1.18->1.19 
#   F:core/seq/oss/seq_oss.c:1.11->1.12 
#   F:core/seq/oss/seq_oss_init.c:1.11->1.12 
#   F:drivers/dummy.c:1.26->1.27 
#   F:drivers/mtpav.c:1.26->1.27 
#   F:drivers/serial-u16550.c:1.25->1.26 
#   F:drivers/virmidi.c:1.11->1.12 
#   F:drivers/mpu401/mpu401.c:1.16->1.17 
#   F:drivers/opl3/opl3_seq.c:1.12->1.13 
#   F:drivers/opl4/opl4_seq.c:1.2->1.3 
#   F:include/initval.h:1.19->1.20 
#   F:isa/als100.c:1.24->1.25 
#   F:isa/azt2320.c:1.24->1.25 
#   F:isa/cmi8330.c:1.28->1.29 
#   F:isa/dt019x.c:1.18->1.19 
#   F:isa/es18xx.c:1.44->1.45 
#   F:isa/opl3sa2.c:1.32->1.33 
#   F:isa/sgalaxy.c:1.19->1.20 
#   F:isa/sscape.c:1.11->1.12 
#   F:isa/ad1816a/ad1816a.c:1.18->1.19 
#   F:isa/ad1848/ad1848.c:1.10->1.11 
#   F:isa/cs423x/cs4231.c:1.12->1.13 
#   F:isa/cs423x/cs4236.c:1.41->1.42 
#   F:isa/cs423x/pc98.c:1.7->1.8 
#   F:isa/es1688/es1688.c:1.14->1.15 
#   F:isa/gus/gusclassic.c:1.13->1.14 
#   F:isa/gus/gusextreme.c:1.15->1.16 
#   F:isa/gus/gusmax.c:1.14->1.15 
#   F:isa/gus/interwave.c:1.32->1.33 
#   F:isa/opti9xx/opti92x-ad1848.c:1.42->1.43 
#   F:isa/sb/emu8000_patch.c:1.8->1.9 
#   F:isa/sb/es968.c:1.24->1.25 
#   F:isa/sb/sb16.c:1.45->1.46 
#   F:isa/sb/sb8.c:1.18->1.19 
#   F:isa/wavefront/wavefront.c:1.27->1.28 
#   F:isa/wavefront/wavefront_synth.c:1.14->1.15 
#   F:parisc/harmony.c:1.5->1.6 
#   F:pci/als4000.c:1.31->1.32 
#   F:pci/atiixp.c:1.2->1.3 
#   F:pci/azt3328.c:1.11->1.12 
#   F:pci/bt87x.c:1.3->1.4 
#   F:pci/cmipci.c:1.61->1.62 
#   F:pci/cs4281.c:1.50->1.51 
#   F:pci/ens1370.c:1.58->1.59 
#   F:pci/es1938.c:1.33->1.34 
#   F:pci/es1968.c:1.61->1.62 
#   F:pci/fm801.c:1.43->1.44 
#   F:pci/intel8x0.c:1.130->1.131 
#   F:pci/intel8x0m.c:1.1->1.2 
#   F:pci/maestro3.c:1.48->1.49 
#   F:pci/rme32.c:1.31->1.32 
#   F:pci/rme96.c:1.33->1.34 
#   F:pci/sonicvibes.c:1.33->1.34 
#   F:pci/via82xx.c:1.94->1.95 
#   F:pci/ac97/ac97_codec.c:1.127->1.128 
#   F:pci/ali5451/ali5451.c:1.43->1.44 
#   F:pci/au88x0/au88x0.c:1.6->1.7 
#   F:pci/cs46xx/cs46xx.c:1.24->1.25 
#   F:pci/emu10k1/emu10k1.c:1.22->1.23 
#   F:pci/ice1712/ice1712.c:1.47->1.48 
#   F:pci/ice1712/ice1724.c:1.27->1.28 
#   F:pci/korg1212/korg1212.c:1.36->1.37 
#   F:pci/mixart/mixart.c:1.6->1.7 
#   F:pci/nm256/nm256.c:1.33->1.34 
#   F:pci/rme9652/hdsp.c:1.54->1.55 
#   F:pci/rme9652/rme9652.c:1.42->1.43 
#   F:pci/trident/trident.c:1.21->1.22 
#   F:pci/vx222/vx222.c:1.3->1.4 
#   F:pci/ymfpci/ymfpci.c:1.33->1.34 
#   F:pcmcia/pdaudiocf/pdaudiocf.c:1.4->1.5 
#   F:pcmcia/vx/vxpocket.c:1.3->1.4 
#   F:ppc/powermac.c:1.15->1.16 
#   F:sparc/amd7930.c:1.8->1.9 
#   F:sparc/cs4231.c:1.12->1.13 
#   F:usb/usbaudio.c:1.96->1.97 
#   L:use the new module_param*() functions.
# 
# sound/isa/cmi8330.c
#   2004/04/07 12:48:13+02:00 perex@suse.cz +13 -50
#   ALSA CVS update
#   D:2004/04/07 18:48:10
#   C:Documentation,SA11xx UDA1341 driver,Memalloc module,PCM Midlevel
#   C:RawMidi Midlevel,RTC timer driver,ALSA Core,Timer Midlevel
#   C:ALSA<-OSS emulation,ALSA sequencer,ALSA<-OSS sequencer,Generic drivers
#   C:MPU401 UART,OPL3,OPL4,ALS100 driver,AZT2320 driver,CMI8330 driver
#   C:DT019x driver,ES18xx driver,OPL3SA2 driver,Sound Galaxy driver
#   C:Sound Scape driver,AD1816A driver,AD1848 driver,CS4231 driver
#   C:CS4236+ driver,PC98(CS423x) driver,ES1688 driver,GUS Classic driver
#   C:GUS Extreme driver,GUS MAX driver,AMD InterWave driver,Opti9xx drivers
#   C:EMU8000 driver,ES968 driver,SB16/AWE driver,SB8 driver
#   C:Wavefront drivers,PARISC Harmony driver,ALS4000 driver,ATIIXP driver
#   C:AZT3328 driver,BT87x driver,CMIPCI driver,CS4281 driver
#   C:ENS1370/1+ driver,ES1938 driver,ES1968 driver,FM801 driver
#   C:Intel8x0 driver,Intel8x0-modem driver,Maestro3 driver,RME32 driver
#   C:RME96 driver,SonicVibes driver,VIA82xx driver,AC97 Codec Core
#   C:ALI5451 driver,au88x0 driver,CS46xx driver,EMU10K1/EMU10K2 driver
#   C:ICE1712 driver,ICE1724 driver,KORG1212 driver,MIXART driver
#   C:NM256 driver,RME HDSP driver,RME9652 driver,Trident driver
#   C:Digigram VX222 driver,YMFPCI driver,Sound Core PDAudioCF driver
#   C:Digigram VX Pocket driver,PPC PowerMac driver,SPARC AMD7930 driver
#   C:SPARC cs4231 driver,USB generic driver
#   A:Takashi Iwai <tiwai@suse.de>
#   F:Documentation/DocBook/writing-an-alsa-driver.tmpl:1.24->1.25 
#   F:arm/sa11xx-uda1341.c:1.13->1.14 
#   F:core/memalloc.c:1.28->1.29 
#   F:core/pcm_memory.c:1.25->1.26 
#   F:core/rawmidi.c:1.41->1.42 
#   F:core/rtctimer.c:1.19->1.20 
#   F:core/sound.c:1.59->1.60 
#   F:core/timer.c:1.56->1.57 
#   F:core/oss/pcm_oss.c:1.66->1.67 
#   F:core/seq/seq.c:1.9->1.10 
#   F:core/seq/seq_dummy.c:1.10->1.11 
#   F:core/seq/seq_midi.c:1.18->1.19 
#   F:core/seq/oss/seq_oss.c:1.11->1.12 
#   F:core/seq/oss/seq_oss_init.c:1.11->1.12 
#   F:drivers/dummy.c:1.26->1.27 
#   F:drivers/mtpav.c:1.26->1.27 
#   F:drivers/serial-u16550.c:1.25->1.26 
#   F:drivers/virmidi.c:1.11->1.12 
#   F:drivers/mpu401/mpu401.c:1.16->1.17 
#   F:drivers/opl3/opl3_seq.c:1.12->1.13 
#   F:drivers/opl4/opl4_seq.c:1.2->1.3 
#   F:include/initval.h:1.19->1.20 
#   F:isa/als100.c:1.24->1.25 
#   F:isa/azt2320.c:1.24->1.25 
#   F:isa/cmi8330.c:1.28->1.29 
#   F:isa/dt019x.c:1.18->1.19 
#   F:isa/es18xx.c:1.44->1.45 
#   F:isa/opl3sa2.c:1.32->1.33 
#   F:isa/sgalaxy.c:1.19->1.20 
#   F:isa/sscape.c:1.11->1.12 
#   F:isa/ad1816a/ad1816a.c:1.18->1.19 
#   F:isa/ad1848/ad1848.c:1.10->1.11 
#   F:isa/cs423x/cs4231.c:1.12->1.13 
#   F:isa/cs423x/cs4236.c:1.41->1.42 
#   F:isa/cs423x/pc98.c:1.7->1.8 
#   F:isa/es1688/es1688.c:1.14->1.15 
#   F:isa/gus/gusclassic.c:1.13->1.14 
#   F:isa/gus/gusextreme.c:1.15->1.16 
#   F:isa/gus/gusmax.c:1.14->1.15 
#   F:isa/gus/interwave.c:1.32->1.33 
#   F:isa/opti9xx/opti92x-ad1848.c:1.42->1.43 
#   F:isa/sb/emu8000_patch.c:1.8->1.9 
#   F:isa/sb/es968.c:1.24->1.25 
#   F:isa/sb/sb16.c:1.45->1.46 
#   F:isa/sb/sb8.c:1.18->1.19 
#   F:isa/wavefront/wavefront.c:1.27->1.28 
#   F:isa/wavefront/wavefront_synth.c:1.14->1.15 
#   F:parisc/harmony.c:1.5->1.6 
#   F:pci/als4000.c:1.31->1.32 
#   F:pci/atiixp.c:1.2->1.3 
#   F:pci/azt3328.c:1.11->1.12 
#   F:pci/bt87x.c:1.3->1.4 
#   F:pci/cmipci.c:1.61->1.62 
#   F:pci/cs4281.c:1.50->1.51 
#   F:pci/ens1370.c:1.58->1.59 
#   F:pci/es1938.c:1.33->1.34 
#   F:pci/es1968.c:1.61->1.62 
#   F:pci/fm801.c:1.43->1.44 
#   F:pci/intel8x0.c:1.130->1.131 
#   F:pci/intel8x0m.c:1.1->1.2 
#   F:pci/maestro3.c:1.48->1.49 
#   F:pci/rme32.c:1.31->1.32 
#   F:pci/rme96.c:1.33->1.34 
#   F:pci/sonicvibes.c:1.33->1.34 
#   F:pci/via82xx.c:1.94->1.95 
#   F:pci/ac97/ac97_codec.c:1.127->1.128 
#   F:pci/ali5451/ali5451.c:1.43->1.44 
#   F:pci/au88x0/au88x0.c:1.6->1.7 
#   F:pci/cs46xx/cs46xx.c:1.24->1.25 
#   F:pci/emu10k1/emu10k1.c:1.22->1.23 
#   F:pci/ice1712/ice1712.c:1.47->1.48 
#   F:pci/ice1712/ice1724.c:1.27->1.28 
#   F:pci/korg1212/korg1212.c:1.36->1.37 
#   F:pci/mixart/mixart.c:1.6->1.7 
#   F:pci/nm256/nm256.c:1.33->1.34 
#   F:pci/rme9652/hdsp.c:1.54->1.55 
#   F:pci/rme9652/rme9652.c:1.42->1.43 
#   F:pci/trident/trident.c:1.21->1.22 
#   F:pci/vx222/vx222.c:1.3->1.4 
#   F:pci/ymfpci/ymfpci.c:1.33->1.34 
#   F:pcmcia/pdaudiocf/pdaudiocf.c:1.4->1.5 
#   F:pcmcia/vx/vxpocket.c:1.3->1.4 
#   F:ppc/powermac.c:1.15->1.16 
#   F:sparc/amd7930.c:1.8->1.9 
#   F:sparc/cs4231.c:1.12->1.13 
#   F:usb/usbaudio.c:1.96->1.97 
#   L:use the new module_param*() functions.
# 
# sound/isa/azt2320.c
#   2004/04/07 12:48:13+02:00 perex@suse.cz +13 -42
#   ALSA CVS update
#   D:2004/04/07 18:48:10
#   C:Documentation,SA11xx UDA1341 driver,Memalloc module,PCM Midlevel
#   C:RawMidi Midlevel,RTC timer driver,ALSA Core,Timer Midlevel
#   C:ALSA<-OSS emulation,ALSA sequencer,ALSA<-OSS sequencer,Generic drivers
#   C:MPU401 UART,OPL3,OPL4,ALS100 driver,AZT2320 driver,CMI8330 driver
#   C:DT019x driver,ES18xx driver,OPL3SA2 driver,Sound Galaxy driver
#   C:Sound Scape driver,AD1816A driver,AD1848 driver,CS4231 driver
#   C:CS4236+ driver,PC98(CS423x) driver,ES1688 driver,GUS Classic driver
#   C:GUS Extreme driver,GUS MAX driver,AMD InterWave driver,Opti9xx drivers
#   C:EMU8000 driver,ES968 driver,SB16/AWE driver,SB8 driver
#   C:Wavefront drivers,PARISC Harmony driver,ALS4000 driver,ATIIXP driver
#   C:AZT3328 driver,BT87x driver,CMIPCI driver,CS4281 driver
#   C:ENS1370/1+ driver,ES1938 driver,ES1968 driver,FM801 driver
#   C:Intel8x0 driver,Intel8x0-modem driver,Maestro3 driver,RME32 driver
#   C:RME96 driver,SonicVibes driver,VIA82xx driver,AC97 Codec Core
#   C:ALI5451 driver,au88x0 driver,CS46xx driver,EMU10K1/EMU10K2 driver
#   C:ICE1712 driver,ICE1724 driver,KORG1212 driver,MIXART driver
#   C:NM256 driver,RME HDSP driver,RME9652 driver,Trident driver
#   C:Digigram VX222 driver,YMFPCI driver,Sound Core PDAudioCF driver
#   C:Digigram VX Pocket driver,PPC PowerMac driver,SPARC AMD7930 driver
#   C:SPARC cs4231 driver,USB generic driver
#   A:Takashi Iwai <tiwai@suse.de>
#   F:Documentation/DocBook/writing-an-alsa-driver.tmpl:1.24->1.25 
#   F:arm/sa11xx-uda1341.c:1.13->1.14 
#   F:core/memalloc.c:1.28->1.29 
#   F:core/pcm_memory.c:1.25->1.26 
#   F:core/rawmidi.c:1.41->1.42 
#   F:core/rtctimer.c:1.19->1.20 
#   F:core/sound.c:1.59->1.60 
#   F:core/timer.c:1.56->1.57 
#   F:core/oss/pcm_oss.c:1.66->1.67 
#   F:core/seq/seq.c:1.9->1.10 
#   F:core/seq/seq_dummy.c:1.10->1.11 
#   F:core/seq/seq_midi.c:1.18->1.19 
#   F:core/seq/oss/seq_oss.c:1.11->1.12 
#   F:core/seq/oss/seq_oss_init.c:1.11->1.12 
#   F:drivers/dummy.c:1.26->1.27 
#   F:drivers/mtpav.c:1.26->1.27 
#   F:drivers/serial-u16550.c:1.25->1.26 
#   F:drivers/virmidi.c:1.11->1.12 
#   F:drivers/mpu401/mpu401.c:1.16->1.17 
#   F:drivers/opl3/opl3_seq.c:1.12->1.13 
#   F:drivers/opl4/opl4_seq.c:1.2->1.3 
#   F:include/initval.h:1.19->1.20 
#   F:isa/als100.c:1.24->1.25 
#   F:isa/azt2320.c:1.24->1.25 
#   F:isa/cmi8330.c:1.28->1.29 
#   F:isa/dt019x.c:1.18->1.19 
#   F:isa/es18xx.c:1.44->1.45 
#   F:isa/opl3sa2.c:1.32->1.33 
#   F:isa/sgalaxy.c:1.19->1.20 
#   F:isa/sscape.c:1.11->1.12 
#   F:isa/ad1816a/ad1816a.c:1.18->1.19 
#   F:isa/ad1848/ad1848.c:1.10->1.11 
#   F:isa/cs423x/cs4231.c:1.12->1.13 
#   F:isa/cs423x/cs4236.c:1.41->1.42 
#   F:isa/cs423x/pc98.c:1.7->1.8 
#   F:isa/es1688/es1688.c:1.14->1.15 
#   F:isa/gus/gusclassic.c:1.13->1.14 
#   F:isa/gus/gusextreme.c:1.15->1.16 
#   F:isa/gus/gusmax.c:1.14->1.15 
#   F:isa/gus/interwave.c:1.32->1.33 
#   F:isa/opti9xx/opti92x-ad1848.c:1.42->1.43 
#   F:isa/sb/emu8000_patch.c:1.8->1.9 
#   F:isa/sb/es968.c:1.24->1.25 
#   F:isa/sb/sb16.c:1.45->1.46 
#   F:isa/sb/sb8.c:1.18->1.19 
#   F:isa/wavefront/wavefront.c:1.27->1.28 
#   F:isa/wavefront/wavefront_synth.c:1.14->1.15 
#   F:parisc/harmony.c:1.5->1.6 
#   F:pci/als4000.c:1.31->1.32 
#   F:pci/atiixp.c:1.2->1.3 
#   F:pci/azt3328.c:1.11->1.12 
#   F:pci/bt87x.c:1.3->1.4 
#   F:pci/cmipci.c:1.61->1.62 
#   F:pci/cs4281.c:1.50->1.51 
#   F:pci/ens1370.c:1.58->1.59 
#   F:pci/es1938.c:1.33->1.34 
#   F:pci/es1968.c:1.61->1.62 
#   F:pci/fm801.c:1.43->1.44 
#   F:pci/intel8x0.c:1.130->1.131 
#   F:pci/intel8x0m.c:1.1->1.2 
#   F:pci/maestro3.c:1.48->1.49 
#   F:pci/rme32.c:1.31->1.32 
#   F:pci/rme96.c:1.33->1.34 
#   F:pci/sonicvibes.c:1.33->1.34 
#   F:pci/via82xx.c:1.94->1.95 
#   F:pci/ac97/ac97_codec.c:1.127->1.128 
#   F:pci/ali5451/ali5451.c:1.43->1.44 
#   F:pci/au88x0/au88x0.c:1.6->1.7 
#   F:pci/cs46xx/cs46xx.c:1.24->1.25 
#   F:pci/emu10k1/emu10k1.c:1.22->1.23 
#   F:pci/ice1712/ice1712.c:1.47->1.48 
#   F:pci/ice1712/ice1724.c:1.27->1.28 
#   F:pci/korg1212/korg1212.c:1.36->1.37 
#   F:pci/mixart/mixart.c:1.6->1.7 
#   F:pci/nm256/nm256.c:1.33->1.34 
#   F:pci/rme9652/hdsp.c:1.54->1.55 
#   F:pci/rme9652/rme9652.c:1.42->1.43 
#   F:pci/trident/trident.c:1.21->1.22 
#   F:pci/vx222/vx222.c:1.3->1.4 
#   F:pci/ymfpci/ymfpci.c:1.33->1.34 
#   F:pcmcia/pdaudiocf/pdaudiocf.c:1.4->1.5 
#   F:pcmcia/vx/vxpocket.c:1.3->1.4 
#   F:ppc/powermac.c:1.15->1.16 
#   F:sparc/amd7930.c:1.8->1.9 
#   F:sparc/cs4231.c:1.12->1.13 
#   F:usb/usbaudio.c:1.96->1.97 
#   L:use the new module_param*() functions.
# 
# sound/isa/als100.c
#   2004/04/07 12:48:13+02:00 perex@suse.cz +12 -41
#   ALSA CVS update
#   D:2004/04/07 18:48:10
#   C:Documentation,SA11xx UDA1341 driver,Memalloc module,PCM Midlevel
#   C:RawMidi Midlevel,RTC timer driver,ALSA Core,Timer Midlevel
#   C:ALSA<-OSS emulation,ALSA sequencer,ALSA<-OSS sequencer,Generic drivers
#   C:MPU401 UART,OPL3,OPL4,ALS100 driver,AZT2320 driver,CMI8330 driver
#   C:DT019x driver,ES18xx driver,OPL3SA2 driver,Sound Galaxy driver
#   C:Sound Scape driver,AD1816A driver,AD1848 driver,CS4231 driver
#   C:CS4236+ driver,PC98(CS423x) driver,ES1688 driver,GUS Classic driver
#   C:GUS Extreme driver,GUS MAX driver,AMD InterWave driver,Opti9xx drivers
#   C:EMU8000 driver,ES968 driver,SB16/AWE driver,SB8 driver
#   C:Wavefront drivers,PARISC Harmony driver,ALS4000 driver,ATIIXP driver
#   C:AZT3328 driver,BT87x driver,CMIPCI driver,CS4281 driver
#   C:ENS1370/1+ driver,ES1938 driver,ES1968 driver,FM801 driver
#   C:Intel8x0 driver,Intel8x0-modem driver,Maestro3 driver,RME32 driver
#   C:RME96 driver,SonicVibes driver,VIA82xx driver,AC97 Codec Core
#   C:ALI5451 driver,au88x0 driver,CS46xx driver,EMU10K1/EMU10K2 driver
#   C:ICE1712 driver,ICE1724 driver,KORG1212 driver,MIXART driver
#   C:NM256 driver,RME HDSP driver,RME9652 driver,Trident driver
#   C:Digigram VX222 driver,YMFPCI driver,Sound Core PDAudioCF driver
#   C:Digigram VX Pocket driver,PPC PowerMac driver,SPARC AMD7930 driver
#   C:SPARC cs4231 driver,USB generic driver
#   A:Takashi Iwai <tiwai@suse.de>
#   F:Documentation/DocBook/writing-an-alsa-driver.tmpl:1.24->1.25 
#   F:arm/sa11xx-uda1341.c:1.13->1.14 
#   F:core/memalloc.c:1.28->1.29 
#   F:core/pcm_memory.c:1.25->1.26 
#   F:core/rawmidi.c:1.41->1.42 
#   F:core/rtctimer.c:1.19->1.20 
#   F:core/sound.c:1.59->1.60 
#   F:core/timer.c:1.56->1.57 
#   F:core/oss/pcm_oss.c:1.66->1.67 
#   F:core/seq/seq.c:1.9->1.10 
#   F:core/seq/seq_dummy.c:1.10->1.11 
#   F:core/seq/seq_midi.c:1.18->1.19 
#   F:core/seq/oss/seq_oss.c:1.11->1.12 
#   F:core/seq/oss/seq_oss_init.c:1.11->1.12 
#   F:drivers/dummy.c:1.26->1.27 
#   F:drivers/mtpav.c:1.26->1.27 
#   F:drivers/serial-u16550.c:1.25->1.26 
#   F:drivers/virmidi.c:1.11->1.12 
#   F:drivers/mpu401/mpu401.c:1.16->1.17 
#   F:drivers/opl3/opl3_seq.c:1.12->1.13 
#   F:drivers/opl4/opl4_seq.c:1.2->1.3 
#   F:include/initval.h:1.19->1.20 
#   F:isa/als100.c:1.24->1.25 
#   F:isa/azt2320.c:1.24->1.25 
#   F:isa/cmi8330.c:1.28->1.29 
#   F:isa/dt019x.c:1.18->1.19 
#   F:isa/es18xx.c:1.44->1.45 
#   F:isa/opl3sa2.c:1.32->1.33 
#   F:isa/sgalaxy.c:1.19->1.20 
#   F:isa/sscape.c:1.11->1.12 
#   F:isa/ad1816a/ad1816a.c:1.18->1.19 
#   F:isa/ad1848/ad1848.c:1.10->1.11 
#   F:isa/cs423x/cs4231.c:1.12->1.13 
#   F:isa/cs423x/cs4236.c:1.41->1.42 
#   F:isa/cs423x/pc98.c:1.7->1.8 
#   F:isa/es1688/es1688.c:1.14->1.15 
#   F:isa/gus/gusclassic.c:1.13->1.14 
#   F:isa/gus/gusextreme.c:1.15->1.16 
#   F:isa/gus/gusmax.c:1.14->1.15 
#   F:isa/gus/interwave.c:1.32->1.33 
#   F:isa/opti9xx/opti92x-ad1848.c:1.42->1.43 
#   F:isa/sb/emu8000_patch.c:1.8->1.9 
#   F:isa/sb/es968.c:1.24->1.25 
#   F:isa/sb/sb16.c:1.45->1.46 
#   F:isa/sb/sb8.c:1.18->1.19 
#   F:isa/wavefront/wavefront.c:1.27->1.28 
#   F:isa/wavefront/wavefront_synth.c:1.14->1.15 
#   F:parisc/harmony.c:1.5->1.6 
#   F:pci/als4000.c:1.31->1.32 
#   F:pci/atiixp.c:1.2->1.3 
#   F:pci/azt3328.c:1.11->1.12 
#   F:pci/bt87x.c:1.3->1.4 
#   F:pci/cmipci.c:1.61->1.62 
#   F:pci/cs4281.c:1.50->1.51 
#   F:pci/ens1370.c:1.58->1.59 
#   F:pci/es1938.c:1.33->1.34 
#   F:pci/es1968.c:1.61->1.62 
#   F:pci/fm801.c:1.43->1.44 
#   F:pci/intel8x0.c:1.130->1.131 
#   F:pci/intel8x0m.c:1.1->1.2 
#   F:pci/maestro3.c:1.48->1.49 
#   F:pci/rme32.c:1.31->1.32 
#   F:pci/rme96.c:1.33->1.34 
#   F:pci/sonicvibes.c:1.33->1.34 
#   F:pci/via82xx.c:1.94->1.95 
#   F:pci/ac97/ac97_codec.c:1.127->1.128 
#   F:pci/ali5451/ali5451.c:1.43->1.44 
#   F:pci/au88x0/au88x0.c:1.6->1.7 
#   F:pci/cs46xx/cs46xx.c:1.24->1.25 
#   F:pci/emu10k1/emu10k1.c:1.22->1.23 
#   F:pci/ice1712/ice1712.c:1.47->1.48 
#   F:pci/ice1712/ice1724.c:1.27->1.28 
#   F:pci/korg1212/korg1212.c:1.36->1.37 
#   F:pci/mixart/mixart.c:1.6->1.7 
#   F:pci/nm256/nm256.c:1.33->1.34 
#   F:pci/rme9652/hdsp.c:1.54->1.55 
#   F:pci/rme9652/rme9652.c:1.42->1.43 
#   F:pci/trident/trident.c:1.21->1.22 
#   F:pci/vx222/vx222.c:1.3->1.4 
#   F:pci/ymfpci/ymfpci.c:1.33->1.34 
#   F:pcmcia/pdaudiocf/pdaudiocf.c:1.4->1.5 
#   F:pcmcia/vx/vxpocket.c:1.3->1.4 
#   F:ppc/powermac.c:1.15->1.16 
#   F:sparc/amd7930.c:1.8->1.9 
#   F:sparc/cs4231.c:1.12->1.13 
#   F:usb/usbaudio.c:1.96->1.97 
#   L:use the new module_param*() functions.
# 
# sound/isa/ad1848/ad1848.c
#   2004/04/07 12:48:14+02:00 perex@suse.cz +9 -34
#   ALSA CVS update
#   D:2004/04/07 18:48:10
#   C:Documentation,SA11xx UDA1341 driver,Memalloc module,PCM Midlevel
#   C:RawMidi Midlevel,RTC timer driver,ALSA Core,Timer Midlevel
#   C:ALSA<-OSS emulation,ALSA sequencer,ALSA<-OSS sequencer,Generic drivers
#   C:MPU401 UART,OPL3,OPL4,ALS100 driver,AZT2320 driver,CMI8330 driver
#   C:DT019x driver,ES18xx driver,OPL3SA2 driver,Sound Galaxy driver
#   C:Sound Scape driver,AD1816A driver,AD1848 driver,CS4231 driver
#   C:CS4236+ driver,PC98(CS423x) driver,ES1688 driver,GUS Classic driver
#   C:GUS Extreme driver,GUS MAX driver,AMD InterWave driver,Opti9xx drivers
#   C:EMU8000 driver,ES968 driver,SB16/AWE driver,SB8 driver
#   C:Wavefront drivers,PARISC Harmony driver,ALS4000 driver,ATIIXP driver
#   C:AZT3328 driver,BT87x driver,CMIPCI driver,CS4281 driver
#   C:ENS1370/1+ driver,ES1938 driver,ES1968 driver,FM801 driver
#   C:Intel8x0 driver,Intel8x0-modem driver,Maestro3 driver,RME32 driver
#   C:RME96 driver,SonicVibes driver,VIA82xx driver,AC97 Codec Core
#   C:ALI5451 driver,au88x0 driver,CS46xx driver,EMU10K1/EMU10K2 driver
#   C:ICE1712 driver,ICE1724 driver,KORG1212 driver,MIXART driver
#   C:NM256 driver,RME HDSP driver,RME9652 driver,Trident driver
#   C:Digigram VX222 driver,YMFPCI driver,Sound Core PDAudioCF driver
#   C:Digigram VX Pocket driver,PPC PowerMac driver,SPARC AMD7930 driver
#   C:SPARC cs4231 driver,USB generic driver
#   A:Takashi Iwai <tiwai@suse.de>
#   F:Documentation/DocBook/writing-an-alsa-driver.tmpl:1.24->1.25 
#   F:arm/sa11xx-uda1341.c:1.13->1.14 
#   F:core/memalloc.c:1.28->1.29 
#   F:core/pcm_memory.c:1.25->1.26 
#   F:core/rawmidi.c:1.41->1.42 
#   F:core/rtctimer.c:1.19->1.20 
#   F:core/sound.c:1.59->1.60 
#   F:core/timer.c:1.56->1.57 
#   F:core/oss/pcm_oss.c:1.66->1.67 
#   F:core/seq/seq.c:1.9->1.10 
#   F:core/seq/seq_dummy.c:1.10->1.11 
#   F:core/seq/seq_midi.c:1.18->1.19 
#   F:core/seq/oss/seq_oss.c:1.11->1.12 
#   F:core/seq/oss/seq_oss_init.c:1.11->1.12 
#   F:drivers/dummy.c:1.26->1.27 
#   F:drivers/mtpav.c:1.26->1.27 
#   F:drivers/serial-u16550.c:1.25->1.26 
#   F:drivers/virmidi.c:1.11->1.12 
#   F:drivers/mpu401/mpu401.c:1.16->1.17 
#   F:drivers/opl3/opl3_seq.c:1.12->1.13 
#   F:drivers/opl4/opl4_seq.c:1.2->1.3 
#   F:include/initval.h:1.19->1.20 
#   F:isa/als100.c:1.24->1.25 
#   F:isa/azt2320.c:1.24->1.25 
#   F:isa/cmi8330.c:1.28->1.29 
#   F:isa/dt019x.c:1.18->1.19 
#   F:isa/es18xx.c:1.44->1.45 
#   F:isa/opl3sa2.c:1.32->1.33 
#   F:isa/sgalaxy.c:1.19->1.20 
#   F:isa/sscape.c:1.11->1.12 
#   F:isa/ad1816a/ad1816a.c:1.18->1.19 
#   F:isa/ad1848/ad1848.c:1.10->1.11 
#   F:isa/cs423x/cs4231.c:1.12->1.13 
#   F:isa/cs423x/cs4236.c:1.41->1.42 
#   F:isa/cs423x/pc98.c:1.7->1.8 
#   F:isa/es1688/es1688.c:1.14->1.15 
#   F:isa/gus/gusclassic.c:1.13->1.14 
#   F:isa/gus/gusextreme.c:1.15->1.16 
#   F:isa/gus/gusmax.c:1.14->1.15 
#   F:isa/gus/interwave.c:1.32->1.33 
#   F:isa/opti9xx/opti92x-ad1848.c:1.42->1.43 
#   F:isa/sb/emu8000_patch.c:1.8->1.9 
#   F:isa/sb/es968.c:1.24->1.25 
#   F:isa/sb/sb16.c:1.45->1.46 
#   F:isa/sb/sb8.c:1.18->1.19 
#   F:isa/wavefront/wavefront.c:1.27->1.28 
#   F:isa/wavefront/wavefront_synth.c:1.14->1.15 
#   F:parisc/harmony.c:1.5->1.6 
#   F:pci/als4000.c:1.31->1.32 
#   F:pci/atiixp.c:1.2->1.3 
#   F:pci/azt3328.c:1.11->1.12 
#   F:pci/bt87x.c:1.3->1.4 
#   F:pci/cmipci.c:1.61->1.62 
#   F:pci/cs4281.c:1.50->1.51 
#   F:pci/ens1370.c:1.58->1.59 
#   F:pci/es1938.c:1.33->1.34 
#   F:pci/es1968.c:1.61->1.62 
#   F:pci/fm801.c:1.43->1.44 
#   F:pci/intel8x0.c:1.130->1.131 
#   F:pci/intel8x0m.c:1.1->1.2 
#   F:pci/maestro3.c:1.48->1.49 
#   F:pci/rme32.c:1.31->1.32 
#   F:pci/rme96.c:1.33->1.34 
#   F:pci/sonicvibes.c:1.33->1.34 
#   F:pci/via82xx.c:1.94->1.95 
#   F:pci/ac97/ac97_codec.c:1.127->1.128 
#   F:pci/ali5451/ali5451.c:1.43->1.44 
#   F:pci/au88x0/au88x0.c:1.6->1.7 
#   F:pci/cs46xx/cs46xx.c:1.24->1.25 
#   F:pci/emu10k1/emu10k1.c:1.22->1.23 
#   F:pci/ice1712/ice1712.c:1.47->1.48 
#   F:pci/ice1712/ice1724.c:1.27->1.28 
#   F:pci/korg1212/korg1212.c:1.36->1.37 
#   F:pci/mixart/mixart.c:1.6->1.7 
#   F:pci/nm256/nm256.c:1.33->1.34 
#   F:pci/rme9652/hdsp.c:1.54->1.55 
#   F:pci/rme9652/rme9652.c:1.42->1.43 
#   F:pci/trident/trident.c:1.21->1.22 
#   F:pci/vx222/vx222.c:1.3->1.4 
#   F:pci/ymfpci/ymfpci.c:1.33->1.34 
#   F:pcmcia/pdaudiocf/pdaudiocf.c:1.4->1.5 
#   F:pcmcia/vx/vxpocket.c:1.3->1.4 
#   F:ppc/powermac.c:1.15->1.16 
#   F:sparc/amd7930.c:1.8->1.9 
#   F:sparc/cs4231.c:1.12->1.13 
#   F:usb/usbaudio.c:1.96->1.97 
#   L:use the new module_param*() functions.
# 
# sound/isa/ad1816a/ad1816a.c
#   2004/04/07 12:48:13+02:00 perex@suse.cz +12 -41
#   ALSA CVS update
#   D:2004/04/07 18:48:10
#   C:Documentation,SA11xx UDA1341 driver,Memalloc module,PCM Midlevel
#   C:RawMidi Midlevel,RTC timer driver,ALSA Core,Timer Midlevel
#   C:ALSA<-OSS emulation,ALSA sequencer,ALSA<-OSS sequencer,Generic drivers
#   C:MPU401 UART,OPL3,OPL4,ALS100 driver,AZT2320 driver,CMI8330 driver
#   C:DT019x driver,ES18xx driver,OPL3SA2 driver,Sound Galaxy driver
#   C:Sound Scape driver,AD1816A driver,AD1848 driver,CS4231 driver
#   C:CS4236+ driver,PC98(CS423x) driver,ES1688 driver,GUS Classic driver
#   C:GUS Extreme driver,GUS MAX driver,AMD InterWave driver,Opti9xx drivers
#   C:EMU8000 driver,ES968 driver,SB16/AWE driver,SB8 driver
#   C:Wavefront drivers,PARISC Harmony driver,ALS4000 driver,ATIIXP driver
#   C:AZT3328 driver,BT87x driver,CMIPCI driver,CS4281 driver
#   C:ENS1370/1+ driver,ES1938 driver,ES1968 driver,FM801 driver
#   C:Intel8x0 driver,Intel8x0-modem driver,Maestro3 driver,RME32 driver
#   C:RME96 driver,SonicVibes driver,VIA82xx driver,AC97 Codec Core
#   C:ALI5451 driver,au88x0 driver,CS46xx driver,EMU10K1/EMU10K2 driver
#   C:ICE1712 driver,ICE1724 driver,KORG1212 driver,MIXART driver
#   C:NM256 driver,RME HDSP driver,RME9652 driver,Trident driver
#   C:Digigram VX222 driver,YMFPCI driver,Sound Core PDAudioCF driver
#   C:Digigram VX Pocket driver,PPC PowerMac driver,SPARC AMD7930 driver
#   C:SPARC cs4231 driver,USB generic driver
#   A:Takashi Iwai <tiwai@suse.de>
#   F:Documentation/DocBook/writing-an-alsa-driver.tmpl:1.24->1.25 
#   F:arm/sa11xx-uda1341.c:1.13->1.14 
#   F:core/memalloc.c:1.28->1.29 
#   F:core/pcm_memory.c:1.25->1.26 
#   F:core/rawmidi.c:1.41->1.42 
#   F:core/rtctimer.c:1.19->1.20 
#   F:core/sound.c:1.59->1.60 
#   F:core/timer.c:1.56->1.57 
#   F:core/oss/pcm_oss.c:1.66->1.67 
#   F:core/seq/seq.c:1.9->1.10 
#   F:core/seq/seq_dummy.c:1.10->1.11 
#   F:core/seq/seq_midi.c:1.18->1.19 
#   F:core/seq/oss/seq_oss.c:1.11->1.12 
#   F:core/seq/oss/seq_oss_init.c:1.11->1.12 
#   F:drivers/dummy.c:1.26->1.27 
#   F:drivers/mtpav.c:1.26->1.27 
#   F:drivers/serial-u16550.c:1.25->1.26 
#   F:drivers/virmidi.c:1.11->1.12 
#   F:drivers/mpu401/mpu401.c:1.16->1.17 
#   F:drivers/opl3/opl3_seq.c:1.12->1.13 
#   F:drivers/opl4/opl4_seq.c:1.2->1.3 
#   F:include/initval.h:1.19->1.20 
#   F:isa/als100.c:1.24->1.25 
#   F:isa/azt2320.c:1.24->1.25 
#   F:isa/cmi8330.c:1.28->1.29 
#   F:isa/dt019x.c:1.18->1.19 
#   F:isa/es18xx.c:1.44->1.45 
#   F:isa/opl3sa2.c:1.32->1.33 
#   F:isa/sgalaxy.c:1.19->1.20 
#   F:isa/sscape.c:1.11->1.12 
#   F:isa/ad1816a/ad1816a.c:1.18->1.19 
#   F:isa/ad1848/ad1848.c:1.10->1.11 
#   F:isa/cs423x/cs4231.c:1.12->1.13 
#   F:isa/cs423x/cs4236.c:1.41->1.42 
#   F:isa/cs423x/pc98.c:1.7->1.8 
#   F:isa/es1688/es1688.c:1.14->1.15 
#   F:isa/gus/gusclassic.c:1.13->1.14 
#   F:isa/gus/gusextreme.c:1.15->1.16 
#   F:isa/gus/gusmax.c:1.14->1.15 
#   F:isa/gus/interwave.c:1.32->1.33 
#   F:isa/opti9xx/opti92x-ad1848.c:1.42->1.43 
#   F:isa/sb/emu8000_patch.c:1.8->1.9 
#   F:isa/sb/es968.c:1.24->1.25 
#   F:isa/sb/sb16.c:1.45->1.46 
#   F:isa/sb/sb8.c:1.18->1.19 
#   F:isa/wavefront/wavefront.c:1.27->1.28 
#   F:isa/wavefront/wavefront_synth.c:1.14->1.15 
#   F:parisc/harmony.c:1.5->1.6 
#   F:pci/als4000.c:1.31->1.32 
#   F:pci/atiixp.c:1.2->1.3 
#   F:pci/azt3328.c:1.11->1.12 
#   F:pci/bt87x.c:1.3->1.4 
#   F:pci/cmipci.c:1.61->1.62 
#   F:pci/cs4281.c:1.50->1.51 
#   F:pci/ens1370.c:1.58->1.59 
#   F:pci/es1938.c:1.33->1.34 
#   F:pci/es1968.c:1.61->1.62 
#   F:pci/fm801.c:1.43->1.44 
#   F:pci/intel8x0.c:1.130->1.131 
#   F:pci/intel8x0m.c:1.1->1.2 
#   F:pci/maestro3.c:1.48->1.49 
#   F:pci/rme32.c:1.31->1.32 
#   F:pci/rme96.c:1.33->1.34 
#   F:pci/sonicvibes.c:1.33->1.34 
#   F:pci/via82xx.c:1.94->1.95 
#   F:pci/ac97/ac97_codec.c:1.127->1.128 
#   F:pci/ali5451/ali5451.c:1.43->1.44 
#   F:pci/au88x0/au88x0.c:1.6->1.7 
#   F:pci/cs46xx/cs46xx.c:1.24->1.25 
#   F:pci/emu10k1/emu10k1.c:1.22->1.23 
#   F:pci/ice1712/ice1712.c:1.47->1.48 
#   F:pci/ice1712/ice1724.c:1.27->1.28 
#   F:pci/korg1212/korg1212.c:1.36->1.37 
#   F:pci/mixart/mixart.c:1.6->1.7 
#   F:pci/nm256/nm256.c:1.33->1.34 
#   F:pci/rme9652/hdsp.c:1.54->1.55 
#   F:pci/rme9652/rme9652.c:1.42->1.43 
#   F:pci/trident/trident.c:1.21->1.22 
#   F:pci/vx222/vx222.c:1.3->1.4 
#   F:pci/ymfpci/ymfpci.c:1.33->1.34 
#   F:pcmcia/pdaudiocf/pdaudiocf.c:1.4->1.5 
#   F:pcmcia/vx/vxpocket.c:1.3->1.4 
#   F:ppc/powermac.c:1.15->1.16 
#   F:sparc/amd7930.c:1.8->1.9 
#   F:sparc/cs4231.c:1.12->1.13 
#   F:usb/usbaudio.c:1.96->1.97 
#   L:use the new module_param*() functions.
# 
# sound/drivers/virmidi.c
#   2004/04/07 12:48:12+02:00 perex@suse.cz +6 -27
#   ALSA CVS update
#   D:2004/04/07 18:48:10
#   C:Documentation,SA11xx UDA1341 driver,Memalloc module,PCM Midlevel
#   C:RawMidi Midlevel,RTC timer driver,ALSA Core,Timer Midlevel
#   C:ALSA<-OSS emulation,ALSA sequencer,ALSA<-OSS sequencer,Generic drivers
#   C:MPU401 UART,OPL3,OPL4,ALS100 driver,AZT2320 driver,CMI8330 driver
#   C:DT019x driver,ES18xx driver,OPL3SA2 driver,Sound Galaxy driver
#   C:Sound Scape driver,AD1816A driver,AD1848 driver,CS4231 driver
#   C:CS4236+ driver,PC98(CS423x) driver,ES1688 driver,GUS Classic driver
#   C:GUS Extreme driver,GUS MAX driver,AMD InterWave driver,Opti9xx drivers
#   C:EMU8000 driver,ES968 driver,SB16/AWE driver,SB8 driver
#   C:Wavefront drivers,PARISC Harmony driver,ALS4000 driver,ATIIXP driver
#   C:AZT3328 driver,BT87x driver,CMIPCI driver,CS4281 driver
#   C:ENS1370/1+ driver,ES1938 driver,ES1968 driver,FM801 driver
#   C:Intel8x0 driver,Intel8x0-modem driver,Maestro3 driver,RME32 driver
#   C:RME96 driver,SonicVibes driver,VIA82xx driver,AC97 Codec Core
#   C:ALI5451 driver,au88x0 driver,CS46xx driver,EMU10K1/EMU10K2 driver
#   C:ICE1712 driver,ICE1724 driver,KORG1212 driver,MIXART driver
#   C:NM256 driver,RME HDSP driver,RME9652 driver,Trident driver
#   C:Digigram VX222 driver,YMFPCI driver,Sound Core PDAudioCF driver
#   C:Digigram VX Pocket driver,PPC PowerMac driver,SPARC AMD7930 driver
#   C:SPARC cs4231 driver,USB generic driver
#   A:Takashi Iwai <tiwai@suse.de>
#   F:Documentation/DocBook/writing-an-alsa-driver.tmpl:1.24->1.25 
#   F:arm/sa11xx-uda1341.c:1.13->1.14 
#   F:core/memalloc.c:1.28->1.29 
#   F:core/pcm_memory.c:1.25->1.26 
#   F:core/rawmidi.c:1.41->1.42 
#   F:core/rtctimer.c:1.19->1.20 
#   F:core/sound.c:1.59->1.60 
#   F:core/timer.c:1.56->1.57 
#   F:core/oss/pcm_oss.c:1.66->1.67 
#   F:core/seq/seq.c:1.9->1.10 
#   F:core/seq/seq_dummy.c:1.10->1.11 
#   F:core/seq/seq_midi.c:1.18->1.19 
#   F:core/seq/oss/seq_oss.c:1.11->1.12 
#   F:core/seq/oss/seq_oss_init.c:1.11->1.12 
#   F:drivers/dummy.c:1.26->1.27 
#   F:drivers/mtpav.c:1.26->1.27 
#   F:drivers/serial-u16550.c:1.25->1.26 
#   F:drivers/virmidi.c:1.11->1.12 
#   F:drivers/mpu401/mpu401.c:1.16->1.17 
#   F:drivers/opl3/opl3_seq.c:1.12->1.13 
#   F:drivers/opl4/opl4_seq.c:1.2->1.3 
#   F:include/initval.h:1.19->1.20 
#   F:isa/als100.c:1.24->1.25 
#   F:isa/azt2320.c:1.24->1.25 
#   F:isa/cmi8330.c:1.28->1.29 
#   F:isa/dt019x.c:1.18->1.19 
#   F:isa/es18xx.c:1.44->1.45 
#   F:isa/opl3sa2.c:1.32->1.33 
#   F:isa/sgalaxy.c:1.19->1.20 
#   F:isa/sscape.c:1.11->1.12 
#   F:isa/ad1816a/ad1816a.c:1.18->1.19 
#   F:isa/ad1848/ad1848.c:1.10->1.11 
#   F:isa/cs423x/cs4231.c:1.12->1.13 
#   F:isa/cs423x/cs4236.c:1.41->1.42 
#   F:isa/cs423x/pc98.c:1.7->1.8 
#   F:isa/es1688/es1688.c:1.14->1.15 
#   F:isa/gus/gusclassic.c:1.13->1.14 
#   F:isa/gus/gusextreme.c:1.15->1.16 
#   F:isa/gus/gusmax.c:1.14->1.15 
#   F:isa/gus/interwave.c:1.32->1.33 
#   F:isa/opti9xx/opti92x-ad1848.c:1.42->1.43 
#   F:isa/sb/emu8000_patch.c:1.8->1.9 
#   F:isa/sb/es968.c:1.24->1.25 
#   F:isa/sb/sb16.c:1.45->1.46 
#   F:isa/sb/sb8.c:1.18->1.19 
#   F:isa/wavefront/wavefront.c:1.27->1.28 
#   F:isa/wavefront/wavefront_synth.c:1.14->1.15 
#   F:parisc/harmony.c:1.5->1.6 
#   F:pci/als4000.c:1.31->1.32 
#   F:pci/atiixp.c:1.2->1.3 
#   F:pci/azt3328.c:1.11->1.12 
#   F:pci/bt87x.c:1.3->1.4 
#   F:pci/cmipci.c:1.61->1.62 
#   F:pci/cs4281.c:1.50->1.51 
#   F:pci/ens1370.c:1.58->1.59 
#   F:pci/es1938.c:1.33->1.34 
#   F:pci/es1968.c:1.61->1.62 
#   F:pci/fm801.c:1.43->1.44 
#   F:pci/intel8x0.c:1.130->1.131 
#   F:pci/intel8x0m.c:1.1->1.2 
#   F:pci/maestro3.c:1.48->1.49 
#   F:pci/rme32.c:1.31->1.32 
#   F:pci/rme96.c:1.33->1.34 
#   F:pci/sonicvibes.c:1.33->1.34 
#   F:pci/via82xx.c:1.94->1.95 
#   F:pci/ac97/ac97_codec.c:1.127->1.128 
#   F:pci/ali5451/ali5451.c:1.43->1.44 
#   F:pci/au88x0/au88x0.c:1.6->1.7 
#   F:pci/cs46xx/cs46xx.c:1.24->1.25 
#   F:pci/emu10k1/emu10k1.c:1.22->1.23 
#   F:pci/ice1712/ice1712.c:1.47->1.48 
#   F:pci/ice1712/ice1724.c:1.27->1.28 
#   F:pci/korg1212/korg1212.c:1.36->1.37 
#   F:pci/mixart/mixart.c:1.6->1.7 
#   F:pci/nm256/nm256.c:1.33->1.34 
#   F:pci/rme9652/hdsp.c:1.54->1.55 
#   F:pci/rme9652/rme9652.c:1.42->1.43 
#   F:pci/trident/trident.c:1.21->1.22 
#   F:pci/vx222/vx222.c:1.3->1.4 
#   F:pci/ymfpci/ymfpci.c:1.33->1.34 
#   F:pcmcia/pdaudiocf/pdaudiocf.c:1.4->1.5 
#   F:pcmcia/vx/vxpocket.c:1.3->1.4 
#   F:ppc/powermac.c:1.15->1.16 
#   F:sparc/amd7930.c:1.8->1.9 
#   F:sparc/cs4231.c:1.12->1.13 
#   F:usb/usbaudio.c:1.96->1.97 
#   L:use the new module_param*() functions.
# 
# sound/drivers/serial-u16550.c
#   2004/04/07 12:48:12+02:00 perex@suse.cz +13 -43
#   ALSA CVS update
#   D:2004/04/07 18:48:10
#   C:Documentation,SA11xx UDA1341 driver,Memalloc module,PCM Midlevel
#   C:RawMidi Midlevel,RTC timer driver,ALSA Core,Timer Midlevel
#   C:ALSA<-OSS emulation,ALSA sequencer,ALSA<-OSS sequencer,Generic drivers
#   C:MPU401 UART,OPL3,OPL4,ALS100 driver,AZT2320 driver,CMI8330 driver
#   C:DT019x driver,ES18xx driver,OPL3SA2 driver,Sound Galaxy driver
#   C:Sound Scape driver,AD1816A driver,AD1848 driver,CS4231 driver
#   C:CS4236+ driver,PC98(CS423x) driver,ES1688 driver,GUS Classic driver
#   C:GUS Extreme driver,GUS MAX driver,AMD InterWave driver,Opti9xx drivers
#   C:EMU8000 driver,ES968 driver,SB16/AWE driver,SB8 driver
#   C:Wavefront drivers,PARISC Harmony driver,ALS4000 driver,ATIIXP driver
#   C:AZT3328 driver,BT87x driver,CMIPCI driver,CS4281 driver
#   C:ENS1370/1+ driver,ES1938 driver,ES1968 driver,FM801 driver
#   C:Intel8x0 driver,Intel8x0-modem driver,Maestro3 driver,RME32 driver
#   C:RME96 driver,SonicVibes driver,VIA82xx driver,AC97 Codec Core
#   C:ALI5451 driver,au88x0 driver,CS46xx driver,EMU10K1/EMU10K2 driver
#   C:ICE1712 driver,ICE1724 driver,KORG1212 driver,MIXART driver
#   C:NM256 driver,RME HDSP driver,RME9652 driver,Trident driver
#   C:Digigram VX222 driver,YMFPCI driver,Sound Core PDAudioCF driver
#   C:Digigram VX Pocket driver,PPC PowerMac driver,SPARC AMD7930 driver
#   C:SPARC cs4231 driver,USB generic driver
#   A:Takashi Iwai <tiwai@suse.de>
#   F:Documentation/DocBook/writing-an-alsa-driver.tmpl:1.24->1.25 
#   F:arm/sa11xx-uda1341.c:1.13->1.14 
#   F:core/memalloc.c:1.28->1.29 
#   F:core/pcm_memory.c:1.25->1.26 
#   F:core/rawmidi.c:1.41->1.42 
#   F:core/rtctimer.c:1.19->1.20 
#   F:core/sound.c:1.59->1.60 
#   F:core/timer.c:1.56->1.57 
#   F:core/oss/pcm_oss.c:1.66->1.67 
#   F:core/seq/seq.c:1.9->1.10 
#   F:core/seq/seq_dummy.c:1.10->1.11 
#   F:core/seq/seq_midi.c:1.18->1.19 
#   F:core/seq/oss/seq_oss.c:1.11->1.12 
#   F:core/seq/oss/seq_oss_init.c:1.11->1.12 
#   F:drivers/dummy.c:1.26->1.27 
#   F:drivers/mtpav.c:1.26->1.27 
#   F:drivers/serial-u16550.c:1.25->1.26 
#   F:drivers/virmidi.c:1.11->1.12 
#   F:drivers/mpu401/mpu401.c:1.16->1.17 
#   F:drivers/opl3/opl3_seq.c:1.12->1.13 
#   F:drivers/opl4/opl4_seq.c:1.2->1.3 
#   F:include/initval.h:1.19->1.20 
#   F:isa/als100.c:1.24->1.25 
#   F:isa/azt2320.c:1.24->1.25 
#   F:isa/cmi8330.c:1.28->1.29 
#   F:isa/dt019x.c:1.18->1.19 
#   F:isa/es18xx.c:1.44->1.45 
#   F:isa/opl3sa2.c:1.32->1.33 
#   F:isa/sgalaxy.c:1.19->1.20 
#   F:isa/sscape.c:1.11->1.12 
#   F:isa/ad1816a/ad1816a.c:1.18->1.19 
#   F:isa/ad1848/ad1848.c:1.10->1.11 
#   F:isa/cs423x/cs4231.c:1.12->1.13 
#   F:isa/cs423x/cs4236.c:1.41->1.42 
#   F:isa/cs423x/pc98.c:1.7->1.8 
#   F:isa/es1688/es1688.c:1.14->1.15 
#   F:isa/gus/gusclassic.c:1.13->1.14 
#   F:isa/gus/gusextreme.c:1.15->1.16 
#   F:isa/gus/gusmax.c:1.14->1.15 
#   F:isa/gus/interwave.c:1.32->1.33 
#   F:isa/opti9xx/opti92x-ad1848.c:1.42->1.43 
#   F:isa/sb/emu8000_patch.c:1.8->1.9 
#   F:isa/sb/es968.c:1.24->1.25 
#   F:isa/sb/sb16.c:1.45->1.46 
#   F:isa/sb/sb8.c:1.18->1.19 
#   F:isa/wavefront/wavefront.c:1.27->1.28 
#   F:isa/wavefront/wavefront_synth.c:1.14->1.15 
#   F:parisc/harmony.c:1.5->1.6 
#   F:pci/als4000.c:1.31->1.32 
#   F:pci/atiixp.c:1.2->1.3 
#   F:pci/azt3328.c:1.11->1.12 
#   F:pci/bt87x.c:1.3->1.4 
#   F:pci/cmipci.c:1.61->1.62 
#   F:pci/cs4281.c:1.50->1.51 
#   F:pci/ens1370.c:1.58->1.59 
#   F:pci/es1938.c:1.33->1.34 
#   F:pci/es1968.c:1.61->1.62 
#   F:pci/fm801.c:1.43->1.44 
#   F:pci/intel8x0.c:1.130->1.131 
#   F:pci/intel8x0m.c:1.1->1.2 
#   F:pci/maestro3.c:1.48->1.49 
#   F:pci/rme32.c:1.31->1.32 
#   F:pci/rme96.c:1.33->1.34 
#   F:pci/sonicvibes.c:1.33->1.34 
#   F:pci/via82xx.c:1.94->1.95 
#   F:pci/ac97/ac97_codec.c:1.127->1.128 
#   F:pci/ali5451/ali5451.c:1.43->1.44 
#   F:pci/au88x0/au88x0.c:1.6->1.7 
#   F:pci/cs46xx/cs46xx.c:1.24->1.25 
#   F:pci/emu10k1/emu10k1.c:1.22->1.23 
#   F:pci/ice1712/ice1712.c:1.47->1.48 
#   F:pci/ice1712/ice1724.c:1.27->1.28 
#   F:pci/korg1212/korg1212.c:1.36->1.37 
#   F:pci/mixart/mixart.c:1.6->1.7 
#   F:pci/nm256/nm256.c:1.33->1.34 
#   F:pci/rme9652/hdsp.c:1.54->1.55 
#   F:pci/rme9652/rme9652.c:1.42->1.43 
#   F:pci/trident/trident.c:1.21->1.22 
#   F:pci/vx222/vx222.c:1.3->1.4 
#   F:pci/ymfpci/ymfpci.c:1.33->1.34 
#   F:pcmcia/pdaudiocf/pdaudiocf.c:1.4->1.5 
#   F:pcmcia/vx/vxpocket.c:1.3->1.4 
#   F:ppc/powermac.c:1.15->1.16 
#   F:sparc/amd7930.c:1.8->1.9 
#   F:sparc/cs4231.c:1.12->1.13 
#   F:usb/usbaudio.c:1.96->1.97 
#   L:use the new module_param*() functions.
# 
# sound/drivers/opl4/opl4_seq.c
#   2004/04/07 12:48:13+02:00 perex@suse.cz +2 -1
#   ALSA CVS update
#   D:2004/04/07 18:48:10
#   C:Documentation,SA11xx UDA1341 driver,Memalloc module,PCM Midlevel
#   C:RawMidi Midlevel,RTC timer driver,ALSA Core,Timer Midlevel
#   C:ALSA<-OSS emulation,ALSA sequencer,ALSA<-OSS sequencer,Generic drivers
#   C:MPU401 UART,OPL3,OPL4,ALS100 driver,AZT2320 driver,CMI8330 driver
#   C:DT019x driver,ES18xx driver,OPL3SA2 driver,Sound Galaxy driver
#   C:Sound Scape driver,AD1816A driver,AD1848 driver,CS4231 driver
#   C:CS4236+ driver,PC98(CS423x) driver,ES1688 driver,GUS Classic driver
#   C:GUS Extreme driver,GUS MAX driver,AMD InterWave driver,Opti9xx drivers
#   C:EMU8000 driver,ES968 driver,SB16/AWE driver,SB8 driver
#   C:Wavefront drivers,PARISC Harmony driver,ALS4000 driver,ATIIXP driver
#   C:AZT3328 driver,BT87x driver,CMIPCI driver,CS4281 driver
#   C:ENS1370/1+ driver,ES1938 driver,ES1968 driver,FM801 driver
#   C:Intel8x0 driver,Intel8x0-modem driver,Maestro3 driver,RME32 driver
#   C:RME96 driver,SonicVibes driver,VIA82xx driver,AC97 Codec Core
#   C:ALI5451 driver,au88x0 driver,CS46xx driver,EMU10K1/EMU10K2 driver
#   C:ICE1712 driver,ICE1724 driver,KORG1212 driver,MIXART driver
#   C:NM256 driver,RME HDSP driver,RME9652 driver,Trident driver
#   C:Digigram VX222 driver,YMFPCI driver,Sound Core PDAudioCF driver
#   C:Digigram VX Pocket driver,PPC PowerMac driver,SPARC AMD7930 driver
#   C:SPARC cs4231 driver,USB generic driver
#   A:Takashi Iwai <tiwai@suse.de>
#   F:Documentation/DocBook/writing-an-alsa-driver.tmpl:1.24->1.25 
#   F:arm/sa11xx-uda1341.c:1.13->1.14 
#   F:core/memalloc.c:1.28->1.29 
#   F:core/pcm_memory.c:1.25->1.26 
#   F:core/rawmidi.c:1.41->1.42 
#   F:core/rtctimer.c:1.19->1.20 
#   F:core/sound.c:1.59->1.60 
#   F:core/timer.c:1.56->1.57 
#   F:core/oss/pcm_oss.c:1.66->1.67 
#   F:core/seq/seq.c:1.9->1.10 
#   F:core/seq/seq_dummy.c:1.10->1.11 
#   F:core/seq/seq_midi.c:1.18->1.19 
#   F:core/seq/oss/seq_oss.c:1.11->1.12 
#   F:core/seq/oss/seq_oss_init.c:1.11->1.12 
#   F:drivers/dummy.c:1.26->1.27 
#   F:drivers/mtpav.c:1.26->1.27 
#   F:drivers/serial-u16550.c:1.25->1.26 
#   F:drivers/virmidi.c:1.11->1.12 
#   F:drivers/mpu401/mpu401.c:1.16->1.17 
#   F:drivers/opl3/opl3_seq.c:1.12->1.13 
#   F:drivers/opl4/opl4_seq.c:1.2->1.3 
#   F:include/initval.h:1.19->1.20 
#   F:isa/als100.c:1.24->1.25 
#   F:isa/azt2320.c:1.24->1.25 
#   F:isa/cmi8330.c:1.28->1.29 
#   F:isa/dt019x.c:1.18->1.19 
#   F:isa/es18xx.c:1.44->1.45 
#   F:isa/opl3sa2.c:1.32->1.33 
#   F:isa/sgalaxy.c:1.19->1.20 
#   F:isa/sscape.c:1.11->1.12 
#   F:isa/ad1816a/ad1816a.c:1.18->1.19 
#   F:isa/ad1848/ad1848.c:1.10->1.11 
#   F:isa/cs423x/cs4231.c:1.12->1.13 
#   F:isa/cs423x/cs4236.c:1.41->1.42 
#   F:isa/cs423x/pc98.c:1.7->1.8 
#   F:isa/es1688/es1688.c:1.14->1.15 
#   F:isa/gus/gusclassic.c:1.13->1.14 
#   F:isa/gus/gusextreme.c:1.15->1.16 
#   F:isa/gus/gusmax.c:1.14->1.15 
#   F:isa/gus/interwave.c:1.32->1.33 
#   F:isa/opti9xx/opti92x-ad1848.c:1.42->1.43 
#   F:isa/sb/emu8000_patch.c:1.8->1.9 
#   F:isa/sb/es968.c:1.24->1.25 
#   F:isa/sb/sb16.c:1.45->1.46 
#   F:isa/sb/sb8.c:1.18->1.19 
#   F:isa/wavefront/wavefront.c:1.27->1.28 
#   F:isa/wavefront/wavefront_synth.c:1.14->1.15 
#   F:parisc/harmony.c:1.5->1.6 
#   F:pci/als4000.c:1.31->1.32 
#   F:pci/atiixp.c:1.2->1.3 
#   F:pci/azt3328.c:1.11->1.12 
#   F:pci/bt87x.c:1.3->1.4 
#   F:pci/cmipci.c:1.61->1.62 
#   F:pci/cs4281.c:1.50->1.51 
#   F:pci/ens1370.c:1.58->1.59 
#   F:pci/es1938.c:1.33->1.34 
#   F:pci/es1968.c:1.61->1.62 
#   F:pci/fm801.c:1.43->1.44 
#   F:pci/intel8x0.c:1.130->1.131 
#   F:pci/intel8x0m.c:1.1->1.2 
#   F:pci/maestro3.c:1.48->1.49 
#   F:pci/rme32.c:1.31->1.32 
#   F:pci/rme96.c:1.33->1.34 
#   F:pci/sonicvibes.c:1.33->1.34 
#   F:pci/via82xx.c:1.94->1.95 
#   F:pci/ac97/ac97_codec.c:1.127->1.128 
#   F:pci/ali5451/ali5451.c:1.43->1.44 
#   F:pci/au88x0/au88x0.c:1.6->1.7 
#   F:pci/cs46xx/cs46xx.c:1.24->1.25 
#   F:pci/emu10k1/emu10k1.c:1.22->1.23 
#   F:pci/ice1712/ice1712.c:1.47->1.48 
#   F:pci/ice1712/ice1724.c:1.27->1.28 
#   F:pci/korg1212/korg1212.c:1.36->1.37 
#   F:pci/mixart/mixart.c:1.6->1.7 
#   F:pci/nm256/nm256.c:1.33->1.34 
#   F:pci/rme9652/hdsp.c:1.54->1.55 
#   F:pci/rme9652/rme9652.c:1.42->1.43 
#   F:pci/trident/trident.c:1.21->1.22 
#   F:pci/vx222/vx222.c:1.3->1.4 
#   F:pci/ymfpci/ymfpci.c:1.33->1.34 
#   F:pcmcia/pdaudiocf/pdaudiocf.c:1.4->1.5 
#   F:pcmcia/vx/vxpocket.c:1.3->1.4 
#   F:ppc/powermac.c:1.15->1.16 
#   F:sparc/amd7930.c:1.8->1.9 
#   F:sparc/cs4231.c:1.12->1.13 
#   F:usb/usbaudio.c:1.96->1.97 
#   L:use the new module_param*() functions.
# 
# sound/drivers/opl3/opl3_seq.c
#   2004/04/07 12:48:13+02:00 perex@suse.cz +2 -1
#   ALSA CVS update
#   D:2004/04/07 18:48:10
#   C:Documentation,SA11xx UDA1341 driver,Memalloc module,PCM Midlevel
#   C:RawMidi Midlevel,RTC timer driver,ALSA Core,Timer Midlevel
#   C:ALSA<-OSS emulation,ALSA sequencer,ALSA<-OSS sequencer,Generic drivers
#   C:MPU401 UART,OPL3,OPL4,ALS100 driver,AZT2320 driver,CMI8330 driver
#   C:DT019x driver,ES18xx driver,OPL3SA2 driver,Sound Galaxy driver
#   C:Sound Scape driver,AD1816A driver,AD1848 driver,CS4231 driver
#   C:CS4236+ driver,PC98(CS423x) driver,ES1688 driver,GUS Classic driver
#   C:GUS Extreme driver,GUS MAX driver,AMD InterWave driver,Opti9xx drivers
#   C:EMU8000 driver,ES968 driver,SB16/AWE driver,SB8 driver
#   C:Wavefront drivers,PARISC Harmony driver,ALS4000 driver,ATIIXP driver
#   C:AZT3328 driver,BT87x driver,CMIPCI driver,CS4281 driver
#   C:ENS1370/1+ driver,ES1938 driver,ES1968 driver,FM801 driver
#   C:Intel8x0 driver,Intel8x0-modem driver,Maestro3 driver,RME32 driver
#   C:RME96 driver,SonicVibes driver,VIA82xx driver,AC97 Codec Core
#   C:ALI5451 driver,au88x0 driver,CS46xx driver,EMU10K1/EMU10K2 driver
#   C:ICE1712 driver,ICE1724 driver,KORG1212 driver,MIXART driver
#   C:NM256 driver,RME HDSP driver,RME9652 driver,Trident driver
#   C:Digigram VX222 driver,YMFPCI driver,Sound Core PDAudioCF driver
#   C:Digigram VX Pocket driver,PPC PowerMac driver,SPARC AMD7930 driver
#   C:SPARC cs4231 driver,USB generic driver
#   A:Takashi Iwai <tiwai@suse.de>
#   F:Documentation/DocBook/writing-an-alsa-driver.tmpl:1.24->1.25 
#   F:arm/sa11xx-uda1341.c:1.13->1.14 
#   F:core/memalloc.c:1.28->1.29 
#   F:core/pcm_memory.c:1.25->1.26 
#   F:core/rawmidi.c:1.41->1.42 
#   F:core/rtctimer.c:1.19->1.20 
#   F:core/sound.c:1.59->1.60 
#   F:core/timer.c:1.56->1.57 
#   F:core/oss/pcm_oss.c:1.66->1.67 
#   F:core/seq/seq.c:1.9->1.10 
#   F:core/seq/seq_dummy.c:1.10->1.11 
#   F:core/seq/seq_midi.c:1.18->1.19 
#   F:core/seq/oss/seq_oss.c:1.11->1.12 
#   F:core/seq/oss/seq_oss_init.c:1.11->1.12 
#   F:drivers/dummy.c:1.26->1.27 
#   F:drivers/mtpav.c:1.26->1.27 
#   F:drivers/serial-u16550.c:1.25->1.26 
#   F:drivers/virmidi.c:1.11->1.12 
#   F:drivers/mpu401/mpu401.c:1.16->1.17 
#   F:drivers/opl3/opl3_seq.c:1.12->1.13 
#   F:drivers/opl4/opl4_seq.c:1.2->1.3 
#   F:include/initval.h:1.19->1.20 
#   F:isa/als100.c:1.24->1.25 
#   F:isa/azt2320.c:1.24->1.25 
#   F:isa/cmi8330.c:1.28->1.29 
#   F:isa/dt019x.c:1.18->1.19 
#   F:isa/es18xx.c:1.44->1.45 
#   F:isa/opl3sa2.c:1.32->1.33 
#   F:isa/sgalaxy.c:1.19->1.20 
#   F:isa/sscape.c:1.11->1.12 
#   F:isa/ad1816a/ad1816a.c:1.18->1.19 
#   F:isa/ad1848/ad1848.c:1.10->1.11 
#   F:isa/cs423x/cs4231.c:1.12->1.13 
#   F:isa/cs423x/cs4236.c:1.41->1.42 
#   F:isa/cs423x/pc98.c:1.7->1.8 
#   F:isa/es1688/es1688.c:1.14->1.15 
#   F:isa/gus/gusclassic.c:1.13->1.14 
#   F:isa/gus/gusextreme.c:1.15->1.16 
#   F:isa/gus/gusmax.c:1.14->1.15 
#   F:isa/gus/interwave.c:1.32->1.33 
#   F:isa/opti9xx/opti92x-ad1848.c:1.42->1.43 
#   F:isa/sb/emu8000_patch.c:1.8->1.9 
#   F:isa/sb/es968.c:1.24->1.25 
#   F:isa/sb/sb16.c:1.45->1.46 
#   F:isa/sb/sb8.c:1.18->1.19 
#   F:isa/wavefront/wavefront.c:1.27->1.28 
#   F:isa/wavefront/wavefront_synth.c:1.14->1.15 
#   F:parisc/harmony.c:1.5->1.6 
#   F:pci/als4000.c:1.31->1.32 
#   F:pci/atiixp.c:1.2->1.3 
#   F:pci/azt3328.c:1.11->1.12 
#   F:pci/bt87x.c:1.3->1.4 
#   F:pci/cmipci.c:1.61->1.62 
#   F:pci/cs4281.c:1.50->1.51 
#   F:pci/ens1370.c:1.58->1.59 
#   F:pci/es1938.c:1.33->1.34 
#   F:pci/es1968.c:1.61->1.62 
#   F:pci/fm801.c:1.43->1.44 
#   F:pci/intel8x0.c:1.130->1.131 
#   F:pci/intel8x0m.c:1.1->1.2 
#   F:pci/maestro3.c:1.48->1.49 
#   F:pci/rme32.c:1.31->1.32 
#   F:pci/rme96.c:1.33->1.34 
#   F:pci/sonicvibes.c:1.33->1.34 
#   F:pci/via82xx.c:1.94->1.95 
#   F:pci/ac97/ac97_codec.c:1.127->1.128 
#   F:pci/ali5451/ali5451.c:1.43->1.44 
#   F:pci/au88x0/au88x0.c:1.6->1.7 
#   F:pci/cs46xx/cs46xx.c:1.24->1.25 
#   F:pci/emu10k1/emu10k1.c:1.22->1.23 
#   F:pci/ice1712/ice1712.c:1.47->1.48 
#   F:pci/ice1712/ice1724.c:1.27->1.28 
#   F:pci/korg1212/korg1212.c:1.36->1.37 
#   F:pci/mixart/mixart.c:1.6->1.7 
#   F:pci/nm256/nm256.c:1.33->1.34 
#   F:pci/rme9652/hdsp.c:1.54->1.55 
#   F:pci/rme9652/rme9652.c:1.42->1.43 
#   F:pci/trident/trident.c:1.21->1.22 
#   F:pci/vx222/vx222.c:1.3->1.4 
#   F:pci/ymfpci/ymfpci.c:1.33->1.34 
#   F:pcmcia/pdaudiocf/pdaudiocf.c:1.4->1.5 
#   F:pcmcia/vx/vxpocket.c:1.3->1.4 
#   F:ppc/powermac.c:1.15->1.16 
#   F:sparc/amd7930.c:1.8->1.9 
#   F:sparc/cs4231.c:1.12->1.13 
#   F:usb/usbaudio.c:1.96->1.97 
#   L:use the new module_param*() functions.
# 
# sound/drivers/mtpav.c
#   2004/04/07 12:48:12+02:00 perex@suse.cz +6 -28
#   ALSA CVS update
#   D:2004/04/07 18:48:10
#   C:Documentation,SA11xx UDA1341 driver,Memalloc module,PCM Midlevel
#   C:RawMidi Midlevel,RTC timer driver,ALSA Core,Timer Midlevel
#   C:ALSA<-OSS emulation,ALSA sequencer,ALSA<-OSS sequencer,Generic drivers
#   C:MPU401 UART,OPL3,OPL4,ALS100 driver,AZT2320 driver,CMI8330 driver
#   C:DT019x driver,ES18xx driver,OPL3SA2 driver,Sound Galaxy driver
#   C:Sound Scape driver,AD1816A driver,AD1848 driver,CS4231 driver
#   C:CS4236+ driver,PC98(CS423x) driver,ES1688 driver,GUS Classic driver
#   C:GUS Extreme driver,GUS MAX driver,AMD InterWave driver,Opti9xx drivers
#   C:EMU8000 driver,ES968 driver,SB16/AWE driver,SB8 driver
#   C:Wavefront drivers,PARISC Harmony driver,ALS4000 driver,ATIIXP driver
#   C:AZT3328 driver,BT87x driver,CMIPCI driver,CS4281 driver
#   C:ENS1370/1+ driver,ES1938 driver,ES1968 driver,FM801 driver
#   C:Intel8x0 driver,Intel8x0-modem driver,Maestro3 driver,RME32 driver
#   C:RME96 driver,SonicVibes driver,VIA82xx driver,AC97 Codec Core
#   C:ALI5451 driver,au88x0 driver,CS46xx driver,EMU10K1/EMU10K2 driver
#   C:ICE1712 driver,ICE1724 driver,KORG1212 driver,MIXART driver
#   C:NM256 driver,RME HDSP driver,RME9652 driver,Trident driver
#   C:Digigram VX222 driver,YMFPCI driver,Sound Core PDAudioCF driver
#   C:Digigram VX Pocket driver,PPC PowerMac driver,SPARC AMD7930 driver
#   C:SPARC cs4231 driver,USB generic driver
#   A:Takashi Iwai <tiwai@suse.de>
#   F:Documentation/DocBook/writing-an-alsa-driver.tmpl:1.24->1.25 
#   F:arm/sa11xx-uda1341.c:1.13->1.14 
#   F:core/memalloc.c:1.28->1.29 
#   F:core/pcm_memory.c:1.25->1.26 
#   F:core/rawmidi.c:1.41->1.42 
#   F:core/rtctimer.c:1.19->1.20 
#   F:core/sound.c:1.59->1.60 
#   F:core/timer.c:1.56->1.57 
#   F:core/oss/pcm_oss.c:1.66->1.67 
#   F:core/seq/seq.c:1.9->1.10 
#   F:core/seq/seq_dummy.c:1.10->1.11 
#   F:core/seq/seq_midi.c:1.18->1.19 
#   F:core/seq/oss/seq_oss.c:1.11->1.12 
#   F:core/seq/oss/seq_oss_init.c:1.11->1.12 
#   F:drivers/dummy.c:1.26->1.27 
#   F:drivers/mtpav.c:1.26->1.27 
#   F:drivers/serial-u16550.c:1.25->1.26 
#   F:drivers/virmidi.c:1.11->1.12 
#   F:drivers/mpu401/mpu401.c:1.16->1.17 
#   F:drivers/opl3/opl3_seq.c:1.12->1.13 
#   F:drivers/opl4/opl4_seq.c:1.2->1.3 
#   F:include/initval.h:1.19->1.20 
#   F:isa/als100.c:1.24->1.25 
#   F:isa/azt2320.c:1.24->1.25 
#   F:isa/cmi8330.c:1.28->1.29 
#   F:isa/dt019x.c:1.18->1.19 
#   F:isa/es18xx.c:1.44->1.45 
#   F:isa/opl3sa2.c:1.32->1.33 
#   F:isa/sgalaxy.c:1.19->1.20 
#   F:isa/sscape.c:1.11->1.12 
#   F:isa/ad1816a/ad1816a.c:1.18->1.19 
#   F:isa/ad1848/ad1848.c:1.10->1.11 
#   F:isa/cs423x/cs4231.c:1.12->1.13 
#   F:isa/cs423x/cs4236.c:1.41->1.42 
#   F:isa/cs423x/pc98.c:1.7->1.8 
#   F:isa/es1688/es1688.c:1.14->1.15 
#   F:isa/gus/gusclassic.c:1.13->1.14 
#   F:isa/gus/gusextreme.c:1.15->1.16 
#   F:isa/gus/gusmax.c:1.14->1.15 
#   F:isa/gus/interwave.c:1.32->1.33 
#   F:isa/opti9xx/opti92x-ad1848.c:1.42->1.43 
#   F:isa/sb/emu8000_patch.c:1.8->1.9 
#   F:isa/sb/es968.c:1.24->1.25 
#   F:isa/sb/sb16.c:1.45->1.46 
#   F:isa/sb/sb8.c:1.18->1.19 
#   F:isa/wavefront/wavefront.c:1.27->1.28 
#   F:isa/wavefront/wavefront_synth.c:1.14->1.15 
#   F:parisc/harmony.c:1.5->1.6 
#   F:pci/als4000.c:1.31->1.32 
#   F:pci/atiixp.c:1.2->1.3 
#   F:pci/azt3328.c:1.11->1.12 
#   F:pci/bt87x.c:1.3->1.4 
#   F:pci/cmipci.c:1.61->1.62 
#   F:pci/cs4281.c:1.50->1.51 
#   F:pci/ens1370.c:1.58->1.59 
#   F:pci/es1938.c:1.33->1.34 
#   F:pci/es1968.c:1.61->1.62 
#   F:pci/fm801.c:1.43->1.44 
#   F:pci/intel8x0.c:1.130->1.131 
#   F:pci/intel8x0m.c:1.1->1.2 
#   F:pci/maestro3.c:1.48->1.49 
#   F:pci/rme32.c:1.31->1.32 
#   F:pci/rme96.c:1.33->1.34 
#   F:pci/sonicvibes.c:1.33->1.34 
#   F:pci/via82xx.c:1.94->1.95 
#   F:pci/ac97/ac97_codec.c:1.127->1.128 
#   F:pci/ali5451/ali5451.c:1.43->1.44 
#   F:pci/au88x0/au88x0.c:1.6->1.7 
#   F:pci/cs46xx/cs46xx.c:1.24->1.25 
#   F:pci/emu10k1/emu10k1.c:1.22->1.23 
#   F:pci/ice1712/ice1712.c:1.47->1.48 
#   F:pci/ice1712/ice1724.c:1.27->1.28 
#   F:pci/korg1212/korg1212.c:1.36->1.37 
#   F:pci/mixart/mixart.c:1.6->1.7 
#   F:pci/nm256/nm256.c:1.33->1.34 
#   F:pci/rme9652/hdsp.c:1.54->1.55 
#   F:pci/rme9652/rme9652.c:1.42->1.43 
#   F:pci/trident/trident.c:1.21->1.22 
#   F:pci/vx222/vx222.c:1.3->1.4 
#   F:pci/ymfpci/ymfpci.c:1.33->1.34 
#   F:pcmcia/pdaudiocf/pdaudiocf.c:1.4->1.5 
#   F:pcmcia/vx/vxpocket.c:1.3->1.4 
#   F:ppc/powermac.c:1.15->1.16 
#   F:sparc/amd7930.c:1.8->1.9 
#   F:sparc/cs4231.c:1.12->1.13 
#   F:usb/usbaudio.c:1.96->1.97 
#   L:use the new module_param*() functions.
# 
# sound/drivers/mpu401/mpu401.c
#   2004/04/07 12:48:12+02:00 perex@suse.cz +9 -40
#   ALSA CVS update
#   D:2004/04/07 18:48:10
#   C:Documentation,SA11xx UDA1341 driver,Memalloc module,PCM Midlevel
#   C:RawMidi Midlevel,RTC timer driver,ALSA Core,Timer Midlevel
#   C:ALSA<-OSS emulation,ALSA sequencer,ALSA<-OSS sequencer,Generic drivers
#   C:MPU401 UART,OPL3,OPL4,ALS100 driver,AZT2320 driver,CMI8330 driver
#   C:DT019x driver,ES18xx driver,OPL3SA2 driver,Sound Galaxy driver
#   C:Sound Scape driver,AD1816A driver,AD1848 driver,CS4231 driver
#   C:CS4236+ driver,PC98(CS423x) driver,ES1688 driver,GUS Classic driver
#   C:GUS Extreme driver,GUS MAX driver,AMD InterWave driver,Opti9xx drivers
#   C:EMU8000 driver,ES968 driver,SB16/AWE driver,SB8 driver
#   C:Wavefront drivers,PARISC Harmony driver,ALS4000 driver,ATIIXP driver
#   C:AZT3328 driver,BT87x driver,CMIPCI driver,CS4281 driver
#   C:ENS1370/1+ driver,ES1938 driver,ES1968 driver,FM801 driver
#   C:Intel8x0 driver,Intel8x0-modem driver,Maestro3 driver,RME32 driver
#   C:RME96 driver,SonicVibes driver,VIA82xx driver,AC97 Codec Core
#   C:ALI5451 driver,au88x0 driver,CS46xx driver,EMU10K1/EMU10K2 driver
#   C:ICE1712 driver,ICE1724 driver,KORG1212 driver,MIXART driver
#   C:NM256 driver,RME HDSP driver,RME9652 driver,Trident driver
#   C:Digigram VX222 driver,YMFPCI driver,Sound Core PDAudioCF driver
#   C:Digigram VX Pocket driver,PPC PowerMac driver,SPARC AMD7930 driver
#   C:SPARC cs4231 driver,USB generic driver
#   A:Takashi Iwai <tiwai@suse.de>
#   F:Documentation/DocBook/writing-an-alsa-driver.tmpl:1.24->1.25 
#   F:arm/sa11xx-uda1341.c:1.13->1.14 
#   F:core/memalloc.c:1.28->1.29 
#   F:core/pcm_memory.c:1.25->1.26 
#   F:core/rawmidi.c:1.41->1.42 
#   F:core/rtctimer.c:1.19->1.20 
#   F:core/sound.c:1.59->1.60 
#   F:core/timer.c:1.56->1.57 
#   F:core/oss/pcm_oss.c:1.66->1.67 
#   F:core/seq/seq.c:1.9->1.10 
#   F:core/seq/seq_dummy.c:1.10->1.11 
#   F:core/seq/seq_midi.c:1.18->1.19 
#   F:core/seq/oss/seq_oss.c:1.11->1.12 
#   F:core/seq/oss/seq_oss_init.c:1.11->1.12 
#   F:drivers/dummy.c:1.26->1.27 
#   F:drivers/mtpav.c:1.26->1.27 
#   F:drivers/serial-u16550.c:1.25->1.26 
#   F:drivers/virmidi.c:1.11->1.12 
#   F:drivers/mpu401/mpu401.c:1.16->1.17 
#   F:drivers/opl3/opl3_seq.c:1.12->1.13 
#   F:drivers/opl4/opl4_seq.c:1.2->1.3 
#   F:include/initval.h:1.19->1.20 
#   F:isa/als100.c:1.24->1.25 
#   F:isa/azt2320.c:1.24->1.25 
#   F:isa/cmi8330.c:1.28->1.29 
#   F:isa/dt019x.c:1.18->1.19 
#   F:isa/es18xx.c:1.44->1.45 
#   F:isa/opl3sa2.c:1.32->1.33 
#   F:isa/sgalaxy.c:1.19->1.20 
#   F:isa/sscape.c:1.11->1.12 
#   F:isa/ad1816a/ad1816a.c:1.18->1.19 
#   F:isa/ad1848/ad1848.c:1.10->1.11 
#   F:isa/cs423x/cs4231.c:1.12->1.13 
#   F:isa/cs423x/cs4236.c:1.41->1.42 
#   F:isa/cs423x/pc98.c:1.7->1.8 
#   F:isa/es1688/es1688.c:1.14->1.15 
#   F:isa/gus/gusclassic.c:1.13->1.14 
#   F:isa/gus/gusextreme.c:1.15->1.16 
#   F:isa/gus/gusmax.c:1.14->1.15 
#   F:isa/gus/interwave.c:1.32->1.33 
#   F:isa/opti9xx/opti92x-ad1848.c:1.42->1.43 
#   F:isa/sb/emu8000_patch.c:1.8->1.9 
#   F:isa/sb/es968.c:1.24->1.25 
#   F:isa/sb/sb16.c:1.45->1.46 
#   F:isa/sb/sb8.c:1.18->1.19 
#   F:isa/wavefront/wavefront.c:1.27->1.28 
#   F:isa/wavefront/wavefront_synth.c:1.14->1.15 
#   F:parisc/harmony.c:1.5->1.6 
#   F:pci/als4000.c:1.31->1.32 
#   F:pci/atiixp.c:1.2->1.3 
#   F:pci/azt3328.c:1.11->1.12 
#   F:pci/bt87x.c:1.3->1.4 
#   F:pci/cmipci.c:1.61->1.62 
#   F:pci/cs4281.c:1.50->1.51 
#   F:pci/ens1370.c:1.58->1.59 
#   F:pci/es1938.c:1.33->1.34 
#   F:pci/es1968.c:1.61->1.62 
#   F:pci/fm801.c:1.43->1.44 
#   F:pci/intel8x0.c:1.130->1.131 
#   F:pci/intel8x0m.c:1.1->1.2 
#   F:pci/maestro3.c:1.48->1.49 
#   F:pci/rme32.c:1.31->1.32 
#   F:pci/rme96.c:1.33->1.34 
#   F:pci/sonicvibes.c:1.33->1.34 
#   F:pci/via82xx.c:1.94->1.95 
#   F:pci/ac97/ac97_codec.c:1.127->1.128 
#   F:pci/ali5451/ali5451.c:1.43->1.44 
#   F:pci/au88x0/au88x0.c:1.6->1.7 
#   F:pci/cs46xx/cs46xx.c:1.24->1.25 
#   F:pci/emu10k1/emu10k1.c:1.22->1.23 
#   F:pci/ice1712/ice1712.c:1.47->1.48 
#   F:pci/ice1712/ice1724.c:1.27->1.28 
#   F:pci/korg1212/korg1212.c:1.36->1.37 
#   F:pci/mixart/mixart.c:1.6->1.7 
#   F:pci/nm256/nm256.c:1.33->1.34 
#   F:pci/rme9652/hdsp.c:1.54->1.55 
#   F:pci/rme9652/rme9652.c:1.42->1.43 
#   F:pci/trident/trident.c:1.21->1.22 
#   F:pci/vx222/vx222.c:1.3->1.4 
#   F:pci/ymfpci/ymfpci.c:1.33->1.34 
#   F:pcmcia/pdaudiocf/pdaudiocf.c:1.4->1.5 
#   F:pcmcia/vx/vxpocket.c:1.3->1.4 
#   F:ppc/powermac.c:1.15->1.16 
#   F:sparc/amd7930.c:1.8->1.9 
#   F:sparc/cs4231.c:1.12->1.13 
#   F:usb/usbaudio.c:1.96->1.97 
#   L:use the new module_param*() functions.
# 
# sound/drivers/dummy.c
#   2004/04/07 12:48:12+02:00 perex@suse.cz +8 -31
#   ALSA CVS update
#   D:2004/04/07 18:48:10
#   C:Documentation,SA11xx UDA1341 driver,Memalloc module,PCM Midlevel
#   C:RawMidi Midlevel,RTC timer driver,ALSA Core,Timer Midlevel
#   C:ALSA<-OSS emulation,ALSA sequencer,ALSA<-OSS sequencer,Generic drivers
#   C:MPU401 UART,OPL3,OPL4,ALS100 driver,AZT2320 driver,CMI8330 driver
#   C:DT019x driver,ES18xx driver,OPL3SA2 driver,Sound Galaxy driver
#   C:Sound Scape driver,AD1816A driver,AD1848 driver,CS4231 driver
#   C:CS4236+ driver,PC98(CS423x) driver,ES1688 driver,GUS Classic driver
#   C:GUS Extreme driver,GUS MAX driver,AMD InterWave driver,Opti9xx drivers
#   C:EMU8000 driver,ES968 driver,SB16/AWE driver,SB8 driver
#   C:Wavefront drivers,PARISC Harmony driver,ALS4000 driver,ATIIXP driver
#   C:AZT3328 driver,BT87x driver,CMIPCI driver,CS4281 driver
#   C:ENS1370/1+ driver,ES1938 driver,ES1968 driver,FM801 driver
#   C:Intel8x0 driver,Intel8x0-modem driver,Maestro3 driver,RME32 driver
#   C:RME96 driver,SonicVibes driver,VIA82xx driver,AC97 Codec Core
#   C:ALI5451 driver,au88x0 driver,CS46xx driver,EMU10K1/EMU10K2 driver
#   C:ICE1712 driver,ICE1724 driver,KORG1212 driver,MIXART driver
#   C:NM256 driver,RME HDSP driver,RME9652 driver,Trident driver
#   C:Digigram VX222 driver,YMFPCI driver,Sound Core PDAudioCF driver
#   C:Digigram VX Pocket driver,PPC PowerMac driver,SPARC AMD7930 driver
#   C:SPARC cs4231 driver,USB generic driver
#   A:Takashi Iwai <tiwai@suse.de>
#   F:Documentation/DocBook/writing-an-alsa-driver.tmpl:1.24->1.25 
#   F:arm/sa11xx-uda1341.c:1.13->1.14 
#   F:core/memalloc.c:1.28->1.29 
#   F:core/pcm_memory.c:1.25->1.26 
#   F:core/rawmidi.c:1.41->1.42 
#   F:core/rtctimer.c:1.19->1.20 
#   F:core/sound.c:1.59->1.60 
#   F:core/timer.c:1.56->1.57 
#   F:core/oss/pcm_oss.c:1.66->1.67 
#   F:core/seq/seq.c:1.9->1.10 
#   F:core/seq/seq_dummy.c:1.10->1.11 
#   F:core/seq/seq_midi.c:1.18->1.19 
#   F:core/seq/oss/seq_oss.c:1.11->1.12 
#   F:core/seq/oss/seq_oss_init.c:1.11->1.12 
#   F:drivers/dummy.c:1.26->1.27 
#   F:drivers/mtpav.c:1.26->1.27 
#   F:drivers/serial-u16550.c:1.25->1.26 
#   F:drivers/virmidi.c:1.11->1.12 
#   F:drivers/mpu401/mpu401.c:1.16->1.17 
#   F:drivers/opl3/opl3_seq.c:1.12->1.13 
#   F:drivers/opl4/opl4_seq.c:1.2->1.3 
#   F:include/initval.h:1.19->1.20 
#   F:isa/als100.c:1.24->1.25 
#   F:isa/azt2320.c:1.24->1.25 
#   F:isa/cmi8330.c:1.28->1.29 
#   F:isa/dt019x.c:1.18->1.19 
#   F:isa/es18xx.c:1.44->1.45 
#   F:isa/opl3sa2.c:1.32->1.33 
#   F:isa/sgalaxy.c:1.19->1.20 
#   F:isa/sscape.c:1.11->1.12 
#   F:isa/ad1816a/ad1816a.c:1.18->1.19 
#   F:isa/ad1848/ad1848.c:1.10->1.11 
#   F:isa/cs423x/cs4231.c:1.12->1.13 
#   F:isa/cs423x/cs4236.c:1.41->1.42 
#   F:isa/cs423x/pc98.c:1.7->1.8 
#   F:isa/es1688/es1688.c:1.14->1.15 
#   F:isa/gus/gusclassic.c:1.13->1.14 
#   F:isa/gus/gusextreme.c:1.15->1.16 
#   F:isa/gus/gusmax.c:1.14->1.15 
#   F:isa/gus/interwave.c:1.32->1.33 
#   F:isa/opti9xx/opti92x-ad1848.c:1.42->1.43 
#   F:isa/sb/emu8000_patch.c:1.8->1.9 
#   F:isa/sb/es968.c:1.24->1.25 
#   F:isa/sb/sb16.c:1.45->1.46 
#   F:isa/sb/sb8.c:1.18->1.19 
#   F:isa/wavefront/wavefront.c:1.27->1.28 
#   F:isa/wavefront/wavefront_synth.c:1.14->1.15 
#   F:parisc/harmony.c:1.5->1.6 
#   F:pci/als4000.c:1.31->1.32 
#   F:pci/atiixp.c:1.2->1.3 
#   F:pci/azt3328.c:1.11->1.12 
#   F:pci/bt87x.c:1.3->1.4 
#   F:pci/cmipci.c:1.61->1.62 
#   F:pci/cs4281.c:1.50->1.51 
#   F:pci/ens1370.c:1.58->1.59 
#   F:pci/es1938.c:1.33->1.34 
#   F:pci/es1968.c:1.61->1.62 
#   F:pci/fm801.c:1.43->1.44 
#   F:pci/intel8x0.c:1.130->1.131 
#   F:pci/intel8x0m.c:1.1->1.2 
#   F:pci/maestro3.c:1.48->1.49 
#   F:pci/rme32.c:1.31->1.32 
#   F:pci/rme96.c:1.33->1.34 
#   F:pci/sonicvibes.c:1.33->1.34 
#   F:pci/via82xx.c:1.94->1.95 
#   F:pci/ac97/ac97_codec.c:1.127->1.128 
#   F:pci/ali5451/ali5451.c:1.43->1.44 
#   F:pci/au88x0/au88x0.c:1.6->1.7 
#   F:pci/cs46xx/cs46xx.c:1.24->1.25 
#   F:pci/emu10k1/emu10k1.c:1.22->1.23 
#   F:pci/ice1712/ice1712.c:1.47->1.48 
#   F:pci/ice1712/ice1724.c:1.27->1.28 
#   F:pci/korg1212/korg1212.c:1.36->1.37 
#   F:pci/mixart/mixart.c:1.6->1.7 
#   F:pci/nm256/nm256.c:1.33->1.34 
#   F:pci/rme9652/hdsp.c:1.54->1.55 
#   F:pci/rme9652/rme9652.c:1.42->1.43 
#   F:pci/trident/trident.c:1.21->1.22 
#   F:pci/vx222/vx222.c:1.3->1.4 
#   F:pci/ymfpci/ymfpci.c:1.33->1.34 
#   F:pcmcia/pdaudiocf/pdaudiocf.c:1.4->1.5 
#   F:pcmcia/vx/vxpocket.c:1.3->1.4 
#   F:ppc/powermac.c:1.15->1.16 
#   F:sparc/amd7930.c:1.8->1.9 
#   F:sparc/cs4231.c:1.12->1.13 
#   F:usb/usbaudio.c:1.96->1.97 
#   L:use the new module_param*() functions.
# 
# sound/core/timer.c
#   2004/04/07 12:48:11+02:00 perex@suse.cz +2 -13
#   ALSA CVS update
#   D:2004/04/07 18:48:10
#   C:Documentation,SA11xx UDA1341 driver,Memalloc module,PCM Midlevel
#   C:RawMidi Midlevel,RTC timer driver,ALSA Core,Timer Midlevel
#   C:ALSA<-OSS emulation,ALSA sequencer,ALSA<-OSS sequencer,Generic drivers
#   C:MPU401 UART,OPL3,OPL4,ALS100 driver,AZT2320 driver,CMI8330 driver
#   C:DT019x driver,ES18xx driver,OPL3SA2 driver,Sound Galaxy driver
#   C:Sound Scape driver,AD1816A driver,AD1848 driver,CS4231 driver
#   C:CS4236+ driver,PC98(CS423x) driver,ES1688 driver,GUS Classic driver
#   C:GUS Extreme driver,GUS MAX driver,AMD InterWave driver,Opti9xx drivers
#   C:EMU8000 driver,ES968 driver,SB16/AWE driver,SB8 driver
#   C:Wavefront drivers,PARISC Harmony driver,ALS4000 driver,ATIIXP driver
#   C:AZT3328 driver,BT87x driver,CMIPCI driver,CS4281 driver
#   C:ENS1370/1+ driver,ES1938 driver,ES1968 driver,FM801 driver
#   C:Intel8x0 driver,Intel8x0-modem driver,Maestro3 driver,RME32 driver
#   C:RME96 driver,SonicVibes driver,VIA82xx driver,AC97 Codec Core
#   C:ALI5451 driver,au88x0 driver,CS46xx driver,EMU10K1/EMU10K2 driver
#   C:ICE1712 driver,ICE1724 driver,KORG1212 driver,MIXART driver
#   C:NM256 driver,RME HDSP driver,RME9652 driver,Trident driver
#   C:Digigram VX222 driver,YMFPCI driver,Sound Core PDAudioCF driver
#   C:Digigram VX Pocket driver,PPC PowerMac driver,SPARC AMD7930 driver
#   C:SPARC cs4231 driver,USB generic driver
#   A:Takashi Iwai <tiwai@suse.de>
#   F:Documentation/DocBook/writing-an-alsa-driver.tmpl:1.24->1.25 
#   F:arm/sa11xx-uda1341.c:1.13->1.14 
#   F:core/memalloc.c:1.28->1.29 
#   F:core/pcm_memory.c:1.25->1.26 
#   F:core/rawmidi.c:1.41->1.42 
#   F:core/rtctimer.c:1.19->1.20 
#   F:core/sound.c:1.59->1.60 
#   F:core/timer.c:1.56->1.57 
#   F:core/oss/pcm_oss.c:1.66->1.67 
#   F:core/seq/seq.c:1.9->1.10 
#   F:core/seq/seq_dummy.c:1.10->1.11 
#   F:core/seq/seq_midi.c:1.18->1.19 
#   F:core/seq/oss/seq_oss.c:1.11->1.12 
#   F:core/seq/oss/seq_oss_init.c:1.11->1.12 
#   F:drivers/dummy.c:1.26->1.27 
#   F:drivers/mtpav.c:1.26->1.27 
#   F:drivers/serial-u16550.c:1.25->1.26 
#   F:drivers/virmidi.c:1.11->1.12 
#   F:drivers/mpu401/mpu401.c:1.16->1.17 
#   F:drivers/opl3/opl3_seq.c:1.12->1.13 
#   F:drivers/opl4/opl4_seq.c:1.2->1.3 
#   F:include/initval.h:1.19->1.20 
#   F:isa/als100.c:1.24->1.25 
#   F:isa/azt2320.c:1.24->1.25 
#   F:isa/cmi8330.c:1.28->1.29 
#   F:isa/dt019x.c:1.18->1.19 
#   F:isa/es18xx.c:1.44->1.45 
#   F:isa/opl3sa2.c:1.32->1.33 
#   F:isa/sgalaxy.c:1.19->1.20 
#   F:isa/sscape.c:1.11->1.12 
#   F:isa/ad1816a/ad1816a.c:1.18->1.19 
#   F:isa/ad1848/ad1848.c:1.10->1.11 
#   F:isa/cs423x/cs4231.c:1.12->1.13 
#   F:isa/cs423x/cs4236.c:1.41->1.42 
#   F:isa/cs423x/pc98.c:1.7->1.8 
#   F:isa/es1688/es1688.c:1.14->1.15 
#   F:isa/gus/gusclassic.c:1.13->1.14 
#   F:isa/gus/gusextreme.c:1.15->1.16 
#   F:isa/gus/gusmax.c:1.14->1.15 
#   F:isa/gus/interwave.c:1.32->1.33 
#   F:isa/opti9xx/opti92x-ad1848.c:1.42->1.43 
#   F:isa/sb/emu8000_patch.c:1.8->1.9 
#   F:isa/sb/es968.c:1.24->1.25 
#   F:isa/sb/sb16.c:1.45->1.46 
#   F:isa/sb/sb8.c:1.18->1.19 
#   F:isa/wavefront/wavefront.c:1.27->1.28 
#   F:isa/wavefront/wavefront_synth.c:1.14->1.15 
#   F:parisc/harmony.c:1.5->1.6 
#   F:pci/als4000.c:1.31->1.32 
#   F:pci/atiixp.c:1.2->1.3 
#   F:pci/azt3328.c:1.11->1.12 
#   F:pci/bt87x.c:1.3->1.4 
#   F:pci/cmipci.c:1.61->1.62 
#   F:pci/cs4281.c:1.50->1.51 
#   F:pci/ens1370.c:1.58->1.59 
#   F:pci/es1938.c:1.33->1.34 
#   F:pci/es1968.c:1.61->1.62 
#   F:pci/fm801.c:1.43->1.44 
#   F:pci/intel8x0.c:1.130->1.131 
#   F:pci/intel8x0m.c:1.1->1.2 
#   F:pci/maestro3.c:1.48->1.49 
#   F:pci/rme32.c:1.31->1.32 
#   F:pci/rme96.c:1.33->1.34 
#   F:pci/sonicvibes.c:1.33->1.34 
#   F:pci/via82xx.c:1.94->1.95 
#   F:pci/ac97/ac97_codec.c:1.127->1.128 
#   F:pci/ali5451/ali5451.c:1.43->1.44 
#   F:pci/au88x0/au88x0.c:1.6->1.7 
#   F:pci/cs46xx/cs46xx.c:1.24->1.25 
#   F:pci/emu10k1/emu10k1.c:1.22->1.23 
#   F:pci/ice1712/ice1712.c:1.47->1.48 
#   F:pci/ice1712/ice1724.c:1.27->1.28 
#   F:pci/korg1212/korg1212.c:1.36->1.37 
#   F:pci/mixart/mixart.c:1.6->1.7 
#   F:pci/nm256/nm256.c:1.33->1.34 
#   F:pci/rme9652/hdsp.c:1.54->1.55 
#   F:pci/rme9652/rme9652.c:1.42->1.43 
#   F:pci/trident/trident.c:1.21->1.22 
#   F:pci/vx222/vx222.c:1.3->1.4 
#   F:pci/ymfpci/ymfpci.c:1.33->1.34 
#   F:pcmcia/pdaudiocf/pdaudiocf.c:1.4->1.5 
#   F:pcmcia/vx/vxpocket.c:1.3->1.4 
#   F:ppc/powermac.c:1.15->1.16 
#   F:sparc/amd7930.c:1.8->1.9 
#   F:sparc/cs4231.c:1.12->1.13 
#   F:usb/usbaudio.c:1.96->1.97 
#   L:use the new module_param*() functions.
# 
# sound/core/sound.c
#   2004/04/07 12:48:11+02:00 perex@suse.cz +4 -3
#   ALSA CVS update
#   D:2004/04/07 18:48:10
#   C:Documentation,SA11xx UDA1341 driver,Memalloc module,PCM Midlevel
#   C:RawMidi Midlevel,RTC timer driver,ALSA Core,Timer Midlevel
#   C:ALSA<-OSS emulation,ALSA sequencer,ALSA<-OSS sequencer,Generic drivers
#   C:MPU401 UART,OPL3,OPL4,ALS100 driver,AZT2320 driver,CMI8330 driver
#   C:DT019x driver,ES18xx driver,OPL3SA2 driver,Sound Galaxy driver
#   C:Sound Scape driver,AD1816A driver,AD1848 driver,CS4231 driver
#   C:CS4236+ driver,PC98(CS423x) driver,ES1688 driver,GUS Classic driver
#   C:GUS Extreme driver,GUS MAX driver,AMD InterWave driver,Opti9xx drivers
#   C:EMU8000 driver,ES968 driver,SB16/AWE driver,SB8 driver
#   C:Wavefront drivers,PARISC Harmony driver,ALS4000 driver,ATIIXP driver
#   C:AZT3328 driver,BT87x driver,CMIPCI driver,CS4281 driver
#   C:ENS1370/1+ driver,ES1938 driver,ES1968 driver,FM801 driver
#   C:Intel8x0 driver,Intel8x0-modem driver,Maestro3 driver,RME32 driver
#   C:RME96 driver,SonicVibes driver,VIA82xx driver,AC97 Codec Core
#   C:ALI5451 driver,au88x0 driver,CS46xx driver,EMU10K1/EMU10K2 driver
#   C:ICE1712 driver,ICE1724 driver,KORG1212 driver,MIXART driver
#   C:NM256 driver,RME HDSP driver,RME9652 driver,Trident driver
#   C:Digigram VX222 driver,YMFPCI driver,Sound Core PDAudioCF driver
#   C:Digigram VX Pocket driver,PPC PowerMac driver,SPARC AMD7930 driver
#   C:SPARC cs4231 driver,USB generic driver
#   A:Takashi Iwai <tiwai@suse.de>
#   F:Documentation/DocBook/writing-an-alsa-driver.tmpl:1.24->1.25 
#   F:arm/sa11xx-uda1341.c:1.13->1.14 
#   F:core/memalloc.c:1.28->1.29 
#   F:core/pcm_memory.c:1.25->1.26 
#   F:core/rawmidi.c:1.41->1.42 
#   F:core/rtctimer.c:1.19->1.20 
#   F:core/sound.c:1.59->1.60 
#   F:core/timer.c:1.56->1.57 
#   F:core/oss/pcm_oss.c:1.66->1.67 
#   F:core/seq/seq.c:1.9->1.10 
#   F:core/seq/seq_dummy.c:1.10->1.11 
#   F:core/seq/seq_midi.c:1.18->1.19 
#   F:core/seq/oss/seq_oss.c:1.11->1.12 
#   F:core/seq/oss/seq_oss_init.c:1.11->1.12 
#   F:drivers/dummy.c:1.26->1.27 
#   F:drivers/mtpav.c:1.26->1.27 
#   F:drivers/serial-u16550.c:1.25->1.26 
#   F:drivers/virmidi.c:1.11->1.12 
#   F:drivers/mpu401/mpu401.c:1.16->1.17 
#   F:drivers/opl3/opl3_seq.c:1.12->1.13 
#   F:drivers/opl4/opl4_seq.c:1.2->1.3 
#   F:include/initval.h:1.19->1.20 
#   F:isa/als100.c:1.24->1.25 
#   F:isa/azt2320.c:1.24->1.25 
#   F:isa/cmi8330.c:1.28->1.29 
#   F:isa/dt019x.c:1.18->1.19 
#   F:isa/es18xx.c:1.44->1.45 
#   F:isa/opl3sa2.c:1.32->1.33 
#   F:isa/sgalaxy.c:1.19->1.20 
#   F:isa/sscape.c:1.11->1.12 
#   F:isa/ad1816a/ad1816a.c:1.18->1.19 
#   F:isa/ad1848/ad1848.c:1.10->1.11 
#   F:isa/cs423x/cs4231.c:1.12->1.13 
#   F:isa/cs423x/cs4236.c:1.41->1.42 
#   F:isa/cs423x/pc98.c:1.7->1.8 
#   F:isa/es1688/es1688.c:1.14->1.15 
#   F:isa/gus/gusclassic.c:1.13->1.14 
#   F:isa/gus/gusextreme.c:1.15->1.16 
#   F:isa/gus/gusmax.c:1.14->1.15 
#   F:isa/gus/interwave.c:1.32->1.33 
#   F:isa/opti9xx/opti92x-ad1848.c:1.42->1.43 
#   F:isa/sb/emu8000_patch.c:1.8->1.9 
#   F:isa/sb/es968.c:1.24->1.25 
#   F:isa/sb/sb16.c:1.45->1.46 
#   F:isa/sb/sb8.c:1.18->1.19 
#   F:isa/wavefront/wavefront.c:1.27->1.28 
#   F:isa/wavefront/wavefront_synth.c:1.14->1.15 
#   F:parisc/harmony.c:1.5->1.6 
#   F:pci/als4000.c:1.31->1.32 
#   F:pci/atiixp.c:1.2->1.3 
#   F:pci/azt3328.c:1.11->1.12 
#   F:pci/bt87x.c:1.3->1.4 
#   F:pci/cmipci.c:1.61->1.62 
#   F:pci/cs4281.c:1.50->1.51 
#   F:pci/ens1370.c:1.58->1.59 
#   F:pci/es1938.c:1.33->1.34 
#   F:pci/es1968.c:1.61->1.62 
#   F:pci/fm801.c:1.43->1.44 
#   F:pci/intel8x0.c:1.130->1.131 
#   F:pci/intel8x0m.c:1.1->1.2 
#   F:pci/maestro3.c:1.48->1.49 
#   F:pci/rme32.c:1.31->1.32 
#   F:pci/rme96.c:1.33->1.34 
#   F:pci/sonicvibes.c:1.33->1.34 
#   F:pci/via82xx.c:1.94->1.95 
#   F:pci/ac97/ac97_codec.c:1.127->1.128 
#   F:pci/ali5451/ali5451.c:1.43->1.44 
#   F:pci/au88x0/au88x0.c:1.6->1.7 
#   F:pci/cs46xx/cs46xx.c:1.24->1.25 
#   F:pci/emu10k1/emu10k1.c:1.22->1.23 
#   F:pci/ice1712/ice1712.c:1.47->1.48 
#   F:pci/ice1712/ice1724.c:1.27->1.28 
#   F:pci/korg1212/korg1212.c:1.36->1.37 
#   F:pci/mixart/mixart.c:1.6->1.7 
#   F:pci/nm256/nm256.c:1.33->1.34 
#   F:pci/rme9652/hdsp.c:1.54->1.55 
#   F:pci/rme9652/rme9652.c:1.42->1.43 
#   F:pci/trident/trident.c:1.21->1.22 
#   F:pci/vx222/vx222.c:1.3->1.4 
#   F:pci/ymfpci/ymfpci.c:1.33->1.34 
#   F:pcmcia/pdaudiocf/pdaudiocf.c:1.4->1.5 
#   F:pcmcia/vx/vxpocket.c:1.3->1.4 
#   F:ppc/powermac.c:1.15->1.16 
#   F:sparc/amd7930.c:1.8->1.9 
#   F:sparc/cs4231.c:1.12->1.13 
#   F:usb/usbaudio.c:1.96->1.97 
#   L:use the new module_param*() functions.
# 
# sound/core/seq/seq_midi.c
#   2004/04/07 12:48:12+02:00 perex@suse.cz +3 -2
#   ALSA CVS update
#   D:2004/04/07 18:48:10
#   C:Documentation,SA11xx UDA1341 driver,Memalloc module,PCM Midlevel
#   C:RawMidi Midlevel,RTC timer driver,ALSA Core,Timer Midlevel
#   C:ALSA<-OSS emulation,ALSA sequencer,ALSA<-OSS sequencer,Generic drivers
#   C:MPU401 UART,OPL3,OPL4,ALS100 driver,AZT2320 driver,CMI8330 driver
#   C:DT019x driver,ES18xx driver,OPL3SA2 driver,Sound Galaxy driver
#   C:Sound Scape driver,AD1816A driver,AD1848 driver,CS4231 driver
#   C:CS4236+ driver,PC98(CS423x) driver,ES1688 driver,GUS Classic driver
#   C:GUS Extreme driver,GUS MAX driver,AMD InterWave driver,Opti9xx drivers
#   C:EMU8000 driver,ES968 driver,SB16/AWE driver,SB8 driver
#   C:Wavefront drivers,PARISC Harmony driver,ALS4000 driver,ATIIXP driver
#   C:AZT3328 driver,BT87x driver,CMIPCI driver,CS4281 driver
#   C:ENS1370/1+ driver,ES1938 driver,ES1968 driver,FM801 driver
#   C:Intel8x0 driver,Intel8x0-modem driver,Maestro3 driver,RME32 driver
#   C:RME96 driver,SonicVibes driver,VIA82xx driver,AC97 Codec Core
#   C:ALI5451 driver,au88x0 driver,CS46xx driver,EMU10K1/EMU10K2 driver
#   C:ICE1712 driver,ICE1724 driver,KORG1212 driver,MIXART driver
#   C:NM256 driver,RME HDSP driver,RME9652 driver,Trident driver
#   C:Digigram VX222 driver,YMFPCI driver,Sound Core PDAudioCF driver
#   C:Digigram VX Pocket driver,PPC PowerMac driver,SPARC AMD7930 driver
#   C:SPARC cs4231 driver,USB generic driver
#   A:Takashi Iwai <tiwai@suse.de>
#   F:Documentation/DocBook/writing-an-alsa-driver.tmpl:1.24->1.25 
#   F:arm/sa11xx-uda1341.c:1.13->1.14 
#   F:core/memalloc.c:1.28->1.29 
#   F:core/pcm_memory.c:1.25->1.26 
#   F:core/rawmidi.c:1.41->1.42 
#   F:core/rtctimer.c:1.19->1.20 
#   F:core/sound.c:1.59->1.60 
#   F:core/timer.c:1.56->1.57 
#   F:core/oss/pcm_oss.c:1.66->1.67 
#   F:core/seq/seq.c:1.9->1.10 
#   F:core/seq/seq_dummy.c:1.10->1.11 
#   F:core/seq/seq_midi.c:1.18->1.19 
#   F:core/seq/oss/seq_oss.c:1.11->1.12 
#   F:core/seq/oss/seq_oss_init.c:1.11->1.12 
#   F:drivers/dummy.c:1.26->1.27 
#   F:drivers/mtpav.c:1.26->1.27 
#   F:drivers/serial-u16550.c:1.25->1.26 
#   F:drivers/virmidi.c:1.11->1.12 
#   F:drivers/mpu401/mpu401.c:1.16->1.17 
#   F:drivers/opl3/opl3_seq.c:1.12->1.13 
#   F:drivers/opl4/opl4_seq.c:1.2->1.3 
#   F:include/initval.h:1.19->1.20 
#   F:isa/als100.c:1.24->1.25 
#   F:isa/azt2320.c:1.24->1.25 
#   F:isa/cmi8330.c:1.28->1.29 
#   F:isa/dt019x.c:1.18->1.19 
#   F:isa/es18xx.c:1.44->1.45 
#   F:isa/opl3sa2.c:1.32->1.33 
#   F:isa/sgalaxy.c:1.19->1.20 
#   F:isa/sscape.c:1.11->1.12 
#   F:isa/ad1816a/ad1816a.c:1.18->1.19 
#   F:isa/ad1848/ad1848.c:1.10->1.11 
#   F:isa/cs423x/cs4231.c:1.12->1.13 
#   F:isa/cs423x/cs4236.c:1.41->1.42 
#   F:isa/cs423x/pc98.c:1.7->1.8 
#   F:isa/es1688/es1688.c:1.14->1.15 
#   F:isa/gus/gusclassic.c:1.13->1.14 
#   F:isa/gus/gusextreme.c:1.15->1.16 
#   F:isa/gus/gusmax.c:1.14->1.15 
#   F:isa/gus/interwave.c:1.32->1.33 
#   F:isa/opti9xx/opti92x-ad1848.c:1.42->1.43 
#   F:isa/sb/emu8000_patch.c:1.8->1.9 
#   F:isa/sb/es968.c:1.24->1.25 
#   F:isa/sb/sb16.c:1.45->1.46 
#   F:isa/sb/sb8.c:1.18->1.19 
#   F:isa/wavefront/wavefront.c:1.27->1.28 
#   F:isa/wavefront/wavefront_synth.c:1.14->1.15 
#   F:parisc/harmony.c:1.5->1.6 
#   F:pci/als4000.c:1.31->1.32 
#   F:pci/atiixp.c:1.2->1.3 
#   F:pci/azt3328.c:1.11->1.12 
#   F:pci/bt87x.c:1.3->1.4 
#   F:pci/cmipci.c:1.61->1.62 
#   F:pci/cs4281.c:1.50->1.51 
#   F:pci/ens1370.c:1.58->1.59 
#   F:pci/es1938.c:1.33->1.34 
#   F:pci/es1968.c:1.61->1.62 
#   F:pci/fm801.c:1.43->1.44 
#   F:pci/intel8x0.c:1.130->1.131 
#   F:pci/intel8x0m.c:1.1->1.2 
#   F:pci/maestro3.c:1.48->1.49 
#   F:pci/rme32.c:1.31->1.32 
#   F:pci/rme96.c:1.33->1.34 
#   F:pci/sonicvibes.c:1.33->1.34 
#   F:pci/via82xx.c:1.94->1.95 
#   F:pci/ac97/ac97_codec.c:1.127->1.128 
#   F:pci/ali5451/ali5451.c:1.43->1.44 
#   F:pci/au88x0/au88x0.c:1.6->1.7 
#   F:pci/cs46xx/cs46xx.c:1.24->1.25 
#   F:pci/emu10k1/emu10k1.c:1.22->1.23 
#   F:pci/ice1712/ice1712.c:1.47->1.48 
#   F:pci/ice1712/ice1724.c:1.27->1.28 
#   F:pci/korg1212/korg1212.c:1.36->1.37 
#   F:pci/mixart/mixart.c:1.6->1.7 
#   F:pci/nm256/nm256.c:1.33->1.34 
#   F:pci/rme9652/hdsp.c:1.54->1.55 
#   F:pci/rme9652/rme9652.c:1.42->1.43 
#   F:pci/trident/trident.c:1.21->1.22 
#   F:pci/vx222/vx222.c:1.3->1.4 
#   F:pci/ymfpci/ymfpci.c:1.33->1.34 
#   F:pcmcia/pdaudiocf/pdaudiocf.c:1.4->1.5 
#   F:pcmcia/vx/vxpocket.c:1.3->1.4 
#   F:ppc/powermac.c:1.15->1.16 
#   F:sparc/amd7930.c:1.8->1.9 
#   F:sparc/cs4231.c:1.12->1.13 
#   F:usb/usbaudio.c:1.96->1.97 
#   L:use the new module_param*() functions.
# 
# sound/core/seq/seq_dummy.c
#   2004/04/07 12:48:12+02:00 perex@suse.cz +7 -4
#   ALSA CVS update
#   D:2004/04/07 18:48:10
#   C:Documentation,SA11xx UDA1341 driver,Memalloc module,PCM Midlevel
#   C:RawMidi Midlevel,RTC timer driver,ALSA Core,Timer Midlevel
#   C:ALSA<-OSS emulation,ALSA sequencer,ALSA<-OSS sequencer,Generic drivers
#   C:MPU401 UART,OPL3,OPL4,ALS100 driver,AZT2320 driver,CMI8330 driver
#   C:DT019x driver,ES18xx driver,OPL3SA2 driver,Sound Galaxy driver
#   C:Sound Scape driver,AD1816A driver,AD1848 driver,CS4231 driver
#   C:CS4236+ driver,PC98(CS423x) driver,ES1688 driver,GUS Classic driver
#   C:GUS Extreme driver,GUS MAX driver,AMD InterWave driver,Opti9xx drivers
#   C:EMU8000 driver,ES968 driver,SB16/AWE driver,SB8 driver
#   C:Wavefront drivers,PARISC Harmony driver,ALS4000 driver,ATIIXP driver
#   C:AZT3328 driver,BT87x driver,CMIPCI driver,CS4281 driver
#   C:ENS1370/1+ driver,ES1938 driver,ES1968 driver,FM801 driver
#   C:Intel8x0 driver,Intel8x0-modem driver,Maestro3 driver,RME32 driver
#   C:RME96 driver,SonicVibes driver,VIA82xx driver,AC97 Codec Core
#   C:ALI5451 driver,au88x0 driver,CS46xx driver,EMU10K1/EMU10K2 driver
#   C:ICE1712 driver,ICE1724 driver,KORG1212 driver,MIXART driver
#   C:NM256 driver,RME HDSP driver,RME9652 driver,Trident driver
#   C:Digigram VX222 driver,YMFPCI driver,Sound Core PDAudioCF driver
#   C:Digigram VX Pocket driver,PPC PowerMac driver,SPARC AMD7930 driver
#   C:SPARC cs4231 driver,USB generic driver
#   A:Takashi Iwai <tiwai@suse.de>
#   F:Documentation/DocBook/writing-an-alsa-driver.tmpl:1.24->1.25 
#   F:arm/sa11xx-uda1341.c:1.13->1.14 
#   F:core/memalloc.c:1.28->1.29 
#   F:core/pcm_memory.c:1.25->1.26 
#   F:core/rawmidi.c:1.41->1.42 
#   F:core/rtctimer.c:1.19->1.20 
#   F:core/sound.c:1.59->1.60 
#   F:core/timer.c:1.56->1.57 
#   F:core/oss/pcm_oss.c:1.66->1.67 
#   F:core/seq/seq.c:1.9->1.10 
#   F:core/seq/seq_dummy.c:1.10->1.11 
#   F:core/seq/seq_midi.c:1.18->1.19 
#   F:core/seq/oss/seq_oss.c:1.11->1.12 
#   F:core/seq/oss/seq_oss_init.c:1.11->1.12 
#   F:drivers/dummy.c:1.26->1.27 
#   F:drivers/mtpav.c:1.26->1.27 
#   F:drivers/serial-u16550.c:1.25->1.26 
#   F:drivers/virmidi.c:1.11->1.12 
#   F:drivers/mpu401/mpu401.c:1.16->1.17 
#   F:drivers/opl3/opl3_seq.c:1.12->1.13 
#   F:drivers/opl4/opl4_seq.c:1.2->1.3 
#   F:include/initval.h:1.19->1.20 
#   F:isa/als100.c:1.24->1.25 
#   F:isa/azt2320.c:1.24->1.25 
#   F:isa/cmi8330.c:1.28->1.29 
#   F:isa/dt019x.c:1.18->1.19 
#   F:isa/es18xx.c:1.44->1.45 
#   F:isa/opl3sa2.c:1.32->1.33 
#   F:isa/sgalaxy.c:1.19->1.20 
#   F:isa/sscape.c:1.11->1.12 
#   F:isa/ad1816a/ad1816a.c:1.18->1.19 
#   F:isa/ad1848/ad1848.c:1.10->1.11 
#   F:isa/cs423x/cs4231.c:1.12->1.13 
#   F:isa/cs423x/cs4236.c:1.41->1.42 
#   F:isa/cs423x/pc98.c:1.7->1.8 
#   F:isa/es1688/es1688.c:1.14->1.15 
#   F:isa/gus/gusclassic.c:1.13->1.14 
#   F:isa/gus/gusextreme.c:1.15->1.16 
#   F:isa/gus/gusmax.c:1.14->1.15 
#   F:isa/gus/interwave.c:1.32->1.33 
#   F:isa/opti9xx/opti92x-ad1848.c:1.42->1.43 
#   F:isa/sb/emu8000_patch.c:1.8->1.9 
#   F:isa/sb/es968.c:1.24->1.25 
#   F:isa/sb/sb16.c:1.45->1.46 
#   F:isa/sb/sb8.c:1.18->1.19 
#   F:isa/wavefront/wavefront.c:1.27->1.28 
#   F:isa/wavefront/wavefront_synth.c:1.14->1.15 
#   F:parisc/harmony.c:1.5->1.6 
#   F:pci/als4000.c:1.31->1.32 
#   F:pci/atiixp.c:1.2->1.3 
#   F:pci/azt3328.c:1.11->1.12 
#   F:pci/bt87x.c:1.3->1.4 
#   F:pci/cmipci.c:1.61->1.62 
#   F:pci/cs4281.c:1.50->1.51 
#   F:pci/ens1370.c:1.58->1.59 
#   F:pci/es1938.c:1.33->1.34 
#   F:pci/es1968.c:1.61->1.62 
#   F:pci/fm801.c:1.43->1.44 
#   F:pci/intel8x0.c:1.130->1.131 
#   F:pci/intel8x0m.c:1.1->1.2 
#   F:pci/maestro3.c:1.48->1.49 
#   F:pci/rme32.c:1.31->1.32 
#   F:pci/rme96.c:1.33->1.34 
#   F:pci/sonicvibes.c:1.33->1.34 
#   F:pci/via82xx.c:1.94->1.95 
#   F:pci/ac97/ac97_codec.c:1.127->1.128 
#   F:pci/ali5451/ali5451.c:1.43->1.44 
#   F:pci/au88x0/au88x0.c:1.6->1.7 
#   F:pci/cs46xx/cs46xx.c:1.24->1.25 
#   F:pci/emu10k1/emu10k1.c:1.22->1.23 
#   F:pci/ice1712/ice1712.c:1.47->1.48 
#   F:pci/ice1712/ice1724.c:1.27->1.28 
#   F:pci/korg1212/korg1212.c:1.36->1.37 
#   F:pci/mixart/mixart.c:1.6->1.7 
#   F:pci/nm256/nm256.c:1.33->1.34 
#   F:pci/rme9652/hdsp.c:1.54->1.55 
#   F:pci/rme9652/rme9652.c:1.42->1.43 
#   F:pci/trident/trident.c:1.21->1.22 
#   F:pci/vx222/vx222.c:1.3->1.4 
#   F:pci/ymfpci/ymfpci.c:1.33->1.34 
#   F:pcmcia/pdaudiocf/pdaudiocf.c:1.4->1.5 
#   F:pcmcia/vx/vxpocket.c:1.3->1.4 
#   F:ppc/powermac.c:1.15->1.16 
#   F:sparc/amd7930.c:1.8->1.9 
#   F:sparc/cs4231.c:1.12->1.13 
#   F:usb/usbaudio.c:1.96->1.97 
#   L:use the new module_param*() functions.
# 
# sound/core/seq/seq.c
#   2004/04/07 12:48:12+02:00 perex@suse.cz +9 -7
#   ALSA CVS update
#   D:2004/04/07 18:48:10
#   C:Documentation,SA11xx UDA1341 driver,Memalloc module,PCM Midlevel
#   C:RawMidi Midlevel,RTC timer driver,ALSA Core,Timer Midlevel
#   C:ALSA<-OSS emulation,ALSA sequencer,ALSA<-OSS sequencer,Generic drivers
#   C:MPU401 UART,OPL3,OPL4,ALS100 driver,AZT2320 driver,CMI8330 driver
#   C:DT019x driver,ES18xx driver,OPL3SA2 driver,Sound Galaxy driver
#   C:Sound Scape driver,AD1816A driver,AD1848 driver,CS4231 driver
#   C:CS4236+ driver,PC98(CS423x) driver,ES1688 driver,GUS Classic driver
#   C:GUS Extreme driver,GUS MAX driver,AMD InterWave driver,Opti9xx drivers
#   C:EMU8000 driver,ES968 driver,SB16/AWE driver,SB8 driver
#   C:Wavefront drivers,PARISC Harmony driver,ALS4000 driver,ATIIXP driver
#   C:AZT3328 driver,BT87x driver,CMIPCI driver,CS4281 driver
#   C:ENS1370/1+ driver,ES1938 driver,ES1968 driver,FM801 driver
#   C:Intel8x0 driver,Intel8x0-modem driver,Maestro3 driver,RME32 driver
#   C:RME96 driver,SonicVibes driver,VIA82xx driver,AC97 Codec Core
#   C:ALI5451 driver,au88x0 driver,CS46xx driver,EMU10K1/EMU10K2 driver
#   C:ICE1712 driver,ICE1724 driver,KORG1212 driver,MIXART driver
#   C:NM256 driver,RME HDSP driver,RME9652 driver,Trident driver
#   C:Digigram VX222 driver,YMFPCI driver,Sound Core PDAudioCF driver
#   C:Digigram VX Pocket driver,PPC PowerMac driver,SPARC AMD7930 driver
#   C:SPARC cs4231 driver,USB generic driver
#   A:Takashi Iwai <tiwai@suse.de>
#   F:Documentation/DocBook/writing-an-alsa-driver.tmpl:1.24->1.25 
#   F:arm/sa11xx-uda1341.c:1.13->1.14 
#   F:core/memalloc.c:1.28->1.29 
#   F:core/pcm_memory.c:1.25->1.26 
#   F:core/rawmidi.c:1.41->1.42 
#   F:core/rtctimer.c:1.19->1.20 
#   F:core/sound.c:1.59->1.60 
#   F:core/timer.c:1.56->1.57 
#   F:core/oss/pcm_oss.c:1.66->1.67 
#   F:core/seq/seq.c:1.9->1.10 
#   F:core/seq/seq_dummy.c:1.10->1.11 
#   F:core/seq/seq_midi.c:1.18->1.19 
#   F:core/seq/oss/seq_oss.c:1.11->1.12 
#   F:core/seq/oss/seq_oss_init.c:1.11->1.12 
#   F:drivers/dummy.c:1.26->1.27 
#   F:drivers/mtpav.c:1.26->1.27 
#   F:drivers/serial-u16550.c:1.25->1.26 
#   F:drivers/virmidi.c:1.11->1.12 
#   F:drivers/mpu401/mpu401.c:1.16->1.17 
#   F:drivers/opl3/opl3_seq.c:1.12->1.13 
#   F:drivers/opl4/opl4_seq.c:1.2->1.3 
#   F:include/initval.h:1.19->1.20 
#   F:isa/als100.c:1.24->1.25 
#   F:isa/azt2320.c:1.24->1.25 
#   F:isa/cmi8330.c:1.28->1.29 
#   F:isa/dt019x.c:1.18->1.19 
#   F:isa/es18xx.c:1.44->1.45 
#   F:isa/opl3sa2.c:1.32->1.33 
#   F:isa/sgalaxy.c:1.19->1.20 
#   F:isa/sscape.c:1.11->1.12 
#   F:isa/ad1816a/ad1816a.c:1.18->1.19 
#   F:isa/ad1848/ad1848.c:1.10->1.11 
#   F:isa/cs423x/cs4231.c:1.12->1.13 
#   F:isa/cs423x/cs4236.c:1.41->1.42 
#   F:isa/cs423x/pc98.c:1.7->1.8 
#   F:isa/es1688/es1688.c:1.14->1.15 
#   F:isa/gus/gusclassic.c:1.13->1.14 
#   F:isa/gus/gusextreme.c:1.15->1.16 
#   F:isa/gus/gusmax.c:1.14->1.15 
#   F:isa/gus/interwave.c:1.32->1.33 
#   F:isa/opti9xx/opti92x-ad1848.c:1.42->1.43 
#   F:isa/sb/emu8000_patch.c:1.8->1.9 
#   F:isa/sb/es968.c:1.24->1.25 
#   F:isa/sb/sb16.c:1.45->1.46 
#   F:isa/sb/sb8.c:1.18->1.19 
#   F:isa/wavefront/wavefront.c:1.27->1.28 
#   F:isa/wavefront/wavefront_synth.c:1.14->1.15 
#   F:parisc/harmony.c:1.5->1.6 
#   F:pci/als4000.c:1.31->1.32 
#   F:pci/atiixp.c:1.2->1.3 
#   F:pci/azt3328.c:1.11->1.12 
#   F:pci/bt87x.c:1.3->1.4 
#   F:pci/cmipci.c:1.61->1.62 
#   F:pci/cs4281.c:1.50->1.51 
#   F:pci/ens1370.c:1.58->1.59 
#   F:pci/es1938.c:1.33->1.34 
#   F:pci/es1968.c:1.61->1.62 
#   F:pci/fm801.c:1.43->1.44 
#   F:pci/intel8x0.c:1.130->1.131 
#   F:pci/intel8x0m.c:1.1->1.2 
#   F:pci/maestro3.c:1.48->1.49 
#   F:pci/rme32.c:1.31->1.32 
#   F:pci/rme96.c:1.33->1.34 
#   F:pci/sonicvibes.c:1.33->1.34 
#   F:pci/via82xx.c:1.94->1.95 
#   F:pci/ac97/ac97_codec.c:1.127->1.128 
#   F:pci/ali5451/ali5451.c:1.43->1.44 
#   F:pci/au88x0/au88x0.c:1.6->1.7 
#   F:pci/cs46xx/cs46xx.c:1.24->1.25 
#   F:pci/emu10k1/emu10k1.c:1.22->1.23 
#   F:pci/ice1712/ice1712.c:1.47->1.48 
#   F:pci/ice1712/ice1724.c:1.27->1.28 
#   F:pci/korg1212/korg1212.c:1.36->1.37 
#   F:pci/mixart/mixart.c:1.6->1.7 
#   F:pci/nm256/nm256.c:1.33->1.34 
#   F:pci/rme9652/hdsp.c:1.54->1.55 
#   F:pci/rme9652/rme9652.c:1.42->1.43 
#   F:pci/trident/trident.c:1.21->1.22 
#   F:pci/vx222/vx222.c:1.3->1.4 
#   F:pci/ymfpci/ymfpci.c:1.33->1.34 
#   F:pcmcia/pdaudiocf/pdaudiocf.c:1.4->1.5 
#   F:pcmcia/vx/vxpocket.c:1.3->1.4 
#   F:ppc/powermac.c:1.15->1.16 
#   F:sparc/amd7930.c:1.8->1.9 
#   F:sparc/cs4231.c:1.12->1.13 
#   F:usb/usbaudio.c:1.96->1.97 
#   L:use the new module_param*() functions.
# 
# sound/core/seq/oss/seq_oss_init.c
#   2004/04/07 12:48:12+02:00 perex@suse.cz +3 -2
#   ALSA CVS update
#   D:2004/04/07 18:48:10
#   C:Documentation,SA11xx UDA1341 driver,Memalloc module,PCM Midlevel
#   C:RawMidi Midlevel,RTC timer driver,ALSA Core,Timer Midlevel
#   C:ALSA<-OSS emulation,ALSA sequencer,ALSA<-OSS sequencer,Generic drivers
#   C:MPU401 UART,OPL3,OPL4,ALS100 driver,AZT2320 driver,CMI8330 driver
#   C:DT019x driver,ES18xx driver,OPL3SA2 driver,Sound Galaxy driver
#   C:Sound Scape driver,AD1816A driver,AD1848 driver,CS4231 driver
#   C:CS4236+ driver,PC98(CS423x) driver,ES1688 driver,GUS Classic driver
#   C:GUS Extreme driver,GUS MAX driver,AMD InterWave driver,Opti9xx drivers
#   C:EMU8000 driver,ES968 driver,SB16/AWE driver,SB8 driver
#   C:Wavefront drivers,PARISC Harmony driver,ALS4000 driver,ATIIXP driver
#   C:AZT3328 driver,BT87x driver,CMIPCI driver,CS4281 driver
#   C:ENS1370/1+ driver,ES1938 driver,ES1968 driver,FM801 driver
#   C:Intel8x0 driver,Intel8x0-modem driver,Maestro3 driver,RME32 driver
#   C:RME96 driver,SonicVibes driver,VIA82xx driver,AC97 Codec Core
#   C:ALI5451 driver,au88x0 driver,CS46xx driver,EMU10K1/EMU10K2 driver
#   C:ICE1712 driver,ICE1724 driver,KORG1212 driver,MIXART driver
#   C:NM256 driver,RME HDSP driver,RME9652 driver,Trident driver
#   C:Digigram VX222 driver,YMFPCI driver,Sound Core PDAudioCF driver
#   C:Digigram VX Pocket driver,PPC PowerMac driver,SPARC AMD7930 driver
#   C:SPARC cs4231 driver,USB generic driver
#   A:Takashi Iwai <tiwai@suse.de>
#   F:Documentation/DocBook/writing-an-alsa-driver.tmpl:1.24->1.25 
#   F:arm/sa11xx-uda1341.c:1.13->1.14 
#   F:core/memalloc.c:1.28->1.29 
#   F:core/pcm_memory.c:1.25->1.26 
#   F:core/rawmidi.c:1.41->1.42 
#   F:core/rtctimer.c:1.19->1.20 
#   F:core/sound.c:1.59->1.60 
#   F:core/timer.c:1.56->1.57 
#   F:core/oss/pcm_oss.c:1.66->1.67 
#   F:core/seq/seq.c:1.9->1.10 
#   F:core/seq/seq_dummy.c:1.10->1.11 
#   F:core/seq/seq_midi.c:1.18->1.19 
#   F:core/seq/oss/seq_oss.c:1.11->1.12 
#   F:core/seq/oss/seq_oss_init.c:1.11->1.12 
#   F:drivers/dummy.c:1.26->1.27 
#   F:drivers/mtpav.c:1.26->1.27 
#   F:drivers/serial-u16550.c:1.25->1.26 
#   F:drivers/virmidi.c:1.11->1.12 
#   F:drivers/mpu401/mpu401.c:1.16->1.17 
#   F:drivers/opl3/opl3_seq.c:1.12->1.13 
#   F:drivers/opl4/opl4_seq.c:1.2->1.3 
#   F:include/initval.h:1.19->1.20 
#   F:isa/als100.c:1.24->1.25 
#   F:isa/azt2320.c:1.24->1.25 
#   F:isa/cmi8330.c:1.28->1.29 
#   F:isa/dt019x.c:1.18->1.19 
#   F:isa/es18xx.c:1.44->1.45 
#   F:isa/opl3sa2.c:1.32->1.33 
#   F:isa/sgalaxy.c:1.19->1.20 
#   F:isa/sscape.c:1.11->1.12 
#   F:isa/ad1816a/ad1816a.c:1.18->1.19 
#   F:isa/ad1848/ad1848.c:1.10->1.11 
#   F:isa/cs423x/cs4231.c:1.12->1.13 
#   F:isa/cs423x/cs4236.c:1.41->1.42 
#   F:isa/cs423x/pc98.c:1.7->1.8 
#   F:isa/es1688/es1688.c:1.14->1.15 
#   F:isa/gus/gusclassic.c:1.13->1.14 
#   F:isa/gus/gusextreme.c:1.15->1.16 
#   F:isa/gus/gusmax.c:1.14->1.15 
#   F:isa/gus/interwave.c:1.32->1.33 
#   F:isa/opti9xx/opti92x-ad1848.c:1.42->1.43 
#   F:isa/sb/emu8000_patch.c:1.8->1.9 
#   F:isa/sb/es968.c:1.24->1.25 
#   F:isa/sb/sb16.c:1.45->1.46 
#   F:isa/sb/sb8.c:1.18->1.19 
#   F:isa/wavefront/wavefront.c:1.27->1.28 
#   F:isa/wavefront/wavefront_synth.c:1.14->1.15 
#   F:parisc/harmony.c:1.5->1.6 
#   F:pci/als4000.c:1.31->1.32 
#   F:pci/atiixp.c:1.2->1.3 
#   F:pci/azt3328.c:1.11->1.12 
#   F:pci/bt87x.c:1.3->1.4 
#   F:pci/cmipci.c:1.61->1.62 
#   F:pci/cs4281.c:1.50->1.51 
#   F:pci/ens1370.c:1.58->1.59 
#   F:pci/es1938.c:1.33->1.34 
#   F:pci/es1968.c:1.61->1.62 
#   F:pci/fm801.c:1.43->1.44 
#   F:pci/intel8x0.c:1.130->1.131 
#   F:pci/intel8x0m.c:1.1->1.2 
#   F:pci/maestro3.c:1.48->1.49 
#   F:pci/rme32.c:1.31->1.32 
#   F:pci/rme96.c:1.33->1.34 
#   F:pci/sonicvibes.c:1.33->1.34 
#   F:pci/via82xx.c:1.94->1.95 
#   F:pci/ac97/ac97_codec.c:1.127->1.128 
#   F:pci/ali5451/ali5451.c:1.43->1.44 
#   F:pci/au88x0/au88x0.c:1.6->1.7 
#   F:pci/cs46xx/cs46xx.c:1.24->1.25 
#   F:pci/emu10k1/emu10k1.c:1.22->1.23 
#   F:pci/ice1712/ice1712.c:1.47->1.48 
#   F:pci/ice1712/ice1724.c:1.27->1.28 
#   F:pci/korg1212/korg1212.c:1.36->1.37 
#   F:pci/mixart/mixart.c:1.6->1.7 
#   F:pci/nm256/nm256.c:1.33->1.34 
#   F:pci/rme9652/hdsp.c:1.54->1.55 
#   F:pci/rme9652/rme9652.c:1.42->1.43 
#   F:pci/trident/trident.c:1.21->1.22 
#   F:pci/vx222/vx222.c:1.3->1.4 
#   F:pci/ymfpci/ymfpci.c:1.33->1.34 
#   F:pcmcia/pdaudiocf/pdaudiocf.c:1.4->1.5 
#   F:pcmcia/vx/vxpocket.c:1.3->1.4 
#   F:ppc/powermac.c:1.15->1.16 
#   F:sparc/amd7930.c:1.8->1.9 
#   F:sparc/cs4231.c:1.12->1.13 
#   F:usb/usbaudio.c:1.96->1.97 
#   L:use the new module_param*() functions.
# 
# sound/core/seq/oss/seq_oss.c
#   2004/04/07 12:48:12+02:00 perex@suse.cz +2 -1
#   ALSA CVS update
#   D:2004/04/07 18:48:10
#   C:Documentation,SA11xx UDA1341 driver,Memalloc module,PCM Midlevel
#   C:RawMidi Midlevel,RTC timer driver,ALSA Core,Timer Midlevel
#   C:ALSA<-OSS emulation,ALSA sequencer,ALSA<-OSS sequencer,Generic drivers
#   C:MPU401 UART,OPL3,OPL4,ALS100 driver,AZT2320 driver,CMI8330 driver
#   C:DT019x driver,ES18xx driver,OPL3SA2 driver,Sound Galaxy driver
#   C:Sound Scape driver,AD1816A driver,AD1848 driver,CS4231 driver
#   C:CS4236+ driver,PC98(CS423x) driver,ES1688 driver,GUS Classic driver
#   C:GUS Extreme driver,GUS MAX driver,AMD InterWave driver,Opti9xx drivers
#   C:EMU8000 driver,ES968 driver,SB16/AWE driver,SB8 driver
#   C:Wavefront drivers,PARISC Harmony driver,ALS4000 driver,ATIIXP driver
#   C:AZT3328 driver,BT87x driver,CMIPCI driver,CS4281 driver
#   C:ENS1370/1+ driver,ES1938 driver,ES1968 driver,FM801 driver
#   C:Intel8x0 driver,Intel8x0-modem driver,Maestro3 driver,RME32 driver
#   C:RME96 driver,SonicVibes driver,VIA82xx driver,AC97 Codec Core
#   C:ALI5451 driver,au88x0 driver,CS46xx driver,EMU10K1/EMU10K2 driver
#   C:ICE1712 driver,ICE1724 driver,KORG1212 driver,MIXART driver
#   C:NM256 driver,RME HDSP driver,RME9652 driver,Trident driver
#   C:Digigram VX222 driver,YMFPCI driver,Sound Core PDAudioCF driver
#   C:Digigram VX Pocket driver,PPC PowerMac driver,SPARC AMD7930 driver
#   C:SPARC cs4231 driver,USB generic driver
#   A:Takashi Iwai <tiwai@suse.de>
#   F:Documentation/DocBook/writing-an-alsa-driver.tmpl:1.24->1.25 
#   F:arm/sa11xx-uda1341.c:1.13->1.14 
#   F:core/memalloc.c:1.28->1.29 
#   F:core/pcm_memory.c:1.25->1.26 
#   F:core/rawmidi.c:1.41->1.42 
#   F:core/rtctimer.c:1.19->1.20 
#   F:core/sound.c:1.59->1.60 
#   F:core/timer.c:1.56->1.57 
#   F:core/oss/pcm_oss.c:1.66->1.67 
#   F:core/seq/seq.c:1.9->1.10 
#   F:core/seq/seq_dummy.c:1.10->1.11 
#   F:core/seq/seq_midi.c:1.18->1.19 
#   F:core/seq/oss/seq_oss.c:1.11->1.12 
#   F:core/seq/oss/seq_oss_init.c:1.11->1.12 
#   F:drivers/dummy.c:1.26->1.27 
#   F:drivers/mtpav.c:1.26->1.27 
#   F:drivers/serial-u16550.c:1.25->1.26 
#   F:drivers/virmidi.c:1.11->1.12 
#   F:drivers/mpu401/mpu401.c:1.16->1.17 
#   F:drivers/opl3/opl3_seq.c:1.12->1.13 
#   F:drivers/opl4/opl4_seq.c:1.2->1.3 
#   F:include/initval.h:1.19->1.20 
#   F:isa/als100.c:1.24->1.25 
#   F:isa/azt2320.c:1.24->1.25 
#   F:isa/cmi8330.c:1.28->1.29 
#   F:isa/dt019x.c:1.18->1.19 
#   F:isa/es18xx.c:1.44->1.45 
#   F:isa/opl3sa2.c:1.32->1.33 
#   F:isa/sgalaxy.c:1.19->1.20 
#   F:isa/sscape.c:1.11->1.12 
#   F:isa/ad1816a/ad1816a.c:1.18->1.19 
#   F:isa/ad1848/ad1848.c:1.10->1.11 
#   F:isa/cs423x/cs4231.c:1.12->1.13 
#   F:isa/cs423x/cs4236.c:1.41->1.42 
#   F:isa/cs423x/pc98.c:1.7->1.8 
#   F:isa/es1688/es1688.c:1.14->1.15 
#   F:isa/gus/gusclassic.c:1.13->1.14 
#   F:isa/gus/gusextreme.c:1.15->1.16 
#   F:isa/gus/gusmax.c:1.14->1.15 
#   F:isa/gus/interwave.c:1.32->1.33 
#   F:isa/opti9xx/opti92x-ad1848.c:1.42->1.43 
#   F:isa/sb/emu8000_patch.c:1.8->1.9 
#   F:isa/sb/es968.c:1.24->1.25 
#   F:isa/sb/sb16.c:1.45->1.46 
#   F:isa/sb/sb8.c:1.18->1.19 
#   F:isa/wavefront/wavefront.c:1.27->1.28 
#   F:isa/wavefront/wavefront_synth.c:1.14->1.15 
#   F:parisc/harmony.c:1.5->1.6 
#   F:pci/als4000.c:1.31->1.32 
#   F:pci/atiixp.c:1.2->1.3 
#   F:pci/azt3328.c:1.11->1.12 
#   F:pci/bt87x.c:1.3->1.4 
#   F:pci/cmipci.c:1.61->1.62 
#   F:pci/cs4281.c:1.50->1.51 
#   F:pci/ens1370.c:1.58->1.59 
#   F:pci/es1938.c:1.33->1.34 
#   F:pci/es1968.c:1.61->1.62 
#   F:pci/fm801.c:1.43->1.44 
#   F:pci/intel8x0.c:1.130->1.131 
#   F:pci/intel8x0m.c:1.1->1.2 
#   F:pci/maestro3.c:1.48->1.49 
#   F:pci/rme32.c:1.31->1.32 
#   F:pci/rme96.c:1.33->1.34 
#   F:pci/sonicvibes.c:1.33->1.34 
#   F:pci/via82xx.c:1.94->1.95 
#   F:pci/ac97/ac97_codec.c:1.127->1.128 
#   F:pci/ali5451/ali5451.c:1.43->1.44 
#   F:pci/au88x0/au88x0.c:1.6->1.7 
#   F:pci/cs46xx/cs46xx.c:1.24->1.25 
#   F:pci/emu10k1/emu10k1.c:1.22->1.23 
#   F:pci/ice1712/ice1712.c:1.47->1.48 
#   F:pci/ice1712/ice1724.c:1.27->1.28 
#   F:pci/korg1212/korg1212.c:1.36->1.37 
#   F:pci/mixart/mixart.c:1.6->1.7 
#   F:pci/nm256/nm256.c:1.33->1.34 
#   F:pci/rme9652/hdsp.c:1.54->1.55 
#   F:pci/rme9652/rme9652.c:1.42->1.43 
#   F:pci/trident/trident.c:1.21->1.22 
#   F:pci/vx222/vx222.c:1.3->1.4 
#   F:pci/ymfpci/ymfpci.c:1.33->1.34 
#   F:pcmcia/pdaudiocf/pdaudiocf.c:1.4->1.5 
#   F:pcmcia/vx/vxpocket.c:1.3->1.4 
#   F:ppc/powermac.c:1.15->1.16 
#   F:sparc/amd7930.c:1.8->1.9 
#   F:sparc/cs4231.c:1.12->1.13 
#   F:usb/usbaudio.c:1.96->1.97 
#   L:use the new module_param*() functions.
# 
# sound/core/rtctimer.c
#   2004/04/07 12:48:11+02:00 perex@suse.cz +2 -13
#   ALSA CVS update
#   D:2004/04/07 18:48:10
#   C:Documentation,SA11xx UDA1341 driver,Memalloc module,PCM Midlevel
#   C:RawMidi Midlevel,RTC timer driver,ALSA Core,Timer Midlevel
#   C:ALSA<-OSS emulation,ALSA sequencer,ALSA<-OSS sequencer,Generic drivers
#   C:MPU401 UART,OPL3,OPL4,ALS100 driver,AZT2320 driver,CMI8330 driver
#   C:DT019x driver,ES18xx driver,OPL3SA2 driver,Sound Galaxy driver
#   C:Sound Scape driver,AD1816A driver,AD1848 driver,CS4231 driver
#   C:CS4236+ driver,PC98(CS423x) driver,ES1688 driver,GUS Classic driver
#   C:GUS Extreme driver,GUS MAX driver,AMD InterWave driver,Opti9xx drivers
#   C:EMU8000 driver,ES968 driver,SB16/AWE driver,SB8 driver
#   C:Wavefront drivers,PARISC Harmony driver,ALS4000 driver,ATIIXP driver
#   C:AZT3328 driver,BT87x driver,CMIPCI driver,CS4281 driver
#   C:ENS1370/1+ driver,ES1938 driver,ES1968 driver,FM801 driver
#   C:Intel8x0 driver,Intel8x0-modem driver,Maestro3 driver,RME32 driver
#   C:RME96 driver,SonicVibes driver,VIA82xx driver,AC97 Codec Core
#   C:ALI5451 driver,au88x0 driver,CS46xx driver,EMU10K1/EMU10K2 driver
#   C:ICE1712 driver,ICE1724 driver,KORG1212 driver,MIXART driver
#   C:NM256 driver,RME HDSP driver,RME9652 driver,Trident driver
#   C:Digigram VX222 driver,YMFPCI driver,Sound Core PDAudioCF driver
#   C:Digigram VX Pocket driver,PPC PowerMac driver,SPARC AMD7930 driver
#   C:SPARC cs4231 driver,USB generic driver
#   A:Takashi Iwai <tiwai@suse.de>
#   F:Documentation/DocBook/writing-an-alsa-driver.tmpl:1.24->1.25 
#   F:arm/sa11xx-uda1341.c:1.13->1.14 
#   F:core/memalloc.c:1.28->1.29 
#   F:core/pcm_memory.c:1.25->1.26 
#   F:core/rawmidi.c:1.41->1.42 
#   F:core/rtctimer.c:1.19->1.20 
#   F:core/sound.c:1.59->1.60 
#   F:core/timer.c:1.56->1.57 
#   F:core/oss/pcm_oss.c:1.66->1.67 
#   F:core/seq/seq.c:1.9->1.10 
#   F:core/seq/seq_dummy.c:1.10->1.11 
#   F:core/seq/seq_midi.c:1.18->1.19 
#   F:core/seq/oss/seq_oss.c:1.11->1.12 
#   F:core/seq/oss/seq_oss_init.c:1.11->1.12 
#   F:drivers/dummy.c:1.26->1.27 
#   F:drivers/mtpav.c:1.26->1.27 
#   F:drivers/serial-u16550.c:1.25->1.26 
#   F:drivers/virmidi.c:1.11->1.12 
#   F:drivers/mpu401/mpu401.c:1.16->1.17 
#   F:drivers/opl3/opl3_seq.c:1.12->1.13 
#   F:drivers/opl4/opl4_seq.c:1.2->1.3 
#   F:include/initval.h:1.19->1.20 
#   F:isa/als100.c:1.24->1.25 
#   F:isa/azt2320.c:1.24->1.25 
#   F:isa/cmi8330.c:1.28->1.29 
#   F:isa/dt019x.c:1.18->1.19 
#   F:isa/es18xx.c:1.44->1.45 
#   F:isa/opl3sa2.c:1.32->1.33 
#   F:isa/sgalaxy.c:1.19->1.20 
#   F:isa/sscape.c:1.11->1.12 
#   F:isa/ad1816a/ad1816a.c:1.18->1.19 
#   F:isa/ad1848/ad1848.c:1.10->1.11 
#   F:isa/cs423x/cs4231.c:1.12->1.13 
#   F:isa/cs423x/cs4236.c:1.41->1.42 
#   F:isa/cs423x/pc98.c:1.7->1.8 
#   F:isa/es1688/es1688.c:1.14->1.15 
#   F:isa/gus/gusclassic.c:1.13->1.14 
#   F:isa/gus/gusextreme.c:1.15->1.16 
#   F:isa/gus/gusmax.c:1.14->1.15 
#   F:isa/gus/interwave.c:1.32->1.33 
#   F:isa/opti9xx/opti92x-ad1848.c:1.42->1.43 
#   F:isa/sb/emu8000_patch.c:1.8->1.9 
#   F:isa/sb/es968.c:1.24->1.25 
#   F:isa/sb/sb16.c:1.45->1.46 
#   F:isa/sb/sb8.c:1.18->1.19 
#   F:isa/wavefront/wavefront.c:1.27->1.28 
#   F:isa/wavefront/wavefront_synth.c:1.14->1.15 
#   F:parisc/harmony.c:1.5->1.6 
#   F:pci/als4000.c:1.31->1.32 
#   F:pci/atiixp.c:1.2->1.3 
#   F:pci/azt3328.c:1.11->1.12 
#   F:pci/bt87x.c:1.3->1.4 
#   F:pci/cmipci.c:1.61->1.62 
#   F:pci/cs4281.c:1.50->1.51 
#   F:pci/ens1370.c:1.58->1.59 
#   F:pci/es1938.c:1.33->1.34 
#   F:pci/es1968.c:1.61->1.62 
#   F:pci/fm801.c:1.43->1.44 
#   F:pci/intel8x0.c:1.130->1.131 
#   F:pci/intel8x0m.c:1.1->1.2 
#   F:pci/maestro3.c:1.48->1.49 
#   F:pci/rme32.c:1.31->1.32 
#   F:pci/rme96.c:1.33->1.34 
#   F:pci/sonicvibes.c:1.33->1.34 
#   F:pci/via82xx.c:1.94->1.95 
#   F:pci/ac97/ac97_codec.c:1.127->1.128 
#   F:pci/ali5451/ali5451.c:1.43->1.44 
#   F:pci/au88x0/au88x0.c:1.6->1.7 
#   F:pci/cs46xx/cs46xx.c:1.24->1.25 
#   F:pci/emu10k1/emu10k1.c:1.22->1.23 
#   F:pci/ice1712/ice1712.c:1.47->1.48 
#   F:pci/ice1712/ice1724.c:1.27->1.28 
#   F:pci/korg1212/korg1212.c:1.36->1.37 
#   F:pci/mixart/mixart.c:1.6->1.7 
#   F:pci/nm256/nm256.c:1.33->1.34 
#   F:pci/rme9652/hdsp.c:1.54->1.55 
#   F:pci/rme9652/rme9652.c:1.42->1.43 
#   F:pci/trident/trident.c:1.21->1.22 
#   F:pci/vx222/vx222.c:1.3->1.4 
#   F:pci/ymfpci/ymfpci.c:1.33->1.34 
#   F:pcmcia/pdaudiocf/pdaudiocf.c:1.4->1.5 
#   F:pcmcia/vx/vxpocket.c:1.3->1.4 
#   F:ppc/powermac.c:1.15->1.16 
#   F:sparc/amd7930.c:1.8->1.9 
#   F:sparc/cs4231.c:1.12->1.13 
#   F:usb/usbaudio.c:1.96->1.97 
#   L:use the new module_param*() functions.
# 
# sound/core/rawmidi.c
#   2004/04/07 12:48:11+02:00 perex@suse.cz +4 -22
#   ALSA CVS update
#   D:2004/04/07 18:48:10
#   C:Documentation,SA11xx UDA1341 driver,Memalloc module,PCM Midlevel
#   C:RawMidi Midlevel,RTC timer driver,ALSA Core,Timer Midlevel
#   C:ALSA<-OSS emulation,ALSA sequencer,ALSA<-OSS sequencer,Generic drivers
#   C:MPU401 UART,OPL3,OPL4,ALS100 driver,AZT2320 driver,CMI8330 driver
#   C:DT019x driver,ES18xx driver,OPL3SA2 driver,Sound Galaxy driver
#   C:Sound Scape driver,AD1816A driver,AD1848 driver,CS4231 driver
#   C:CS4236+ driver,PC98(CS423x) driver,ES1688 driver,GUS Classic driver
#   C:GUS Extreme driver,GUS MAX driver,AMD InterWave driver,Opti9xx drivers
#   C:EMU8000 driver,ES968 driver,SB16/AWE driver,SB8 driver
#   C:Wavefront drivers,PARISC Harmony driver,ALS4000 driver,ATIIXP driver
#   C:AZT3328 driver,BT87x driver,CMIPCI driver,CS4281 driver
#   C:ENS1370/1+ driver,ES1938 driver,ES1968 driver,FM801 driver
#   C:Intel8x0 driver,Intel8x0-modem driver,Maestro3 driver,RME32 driver
#   C:RME96 driver,SonicVibes driver,VIA82xx driver,AC97 Codec Core
#   C:ALI5451 driver,au88x0 driver,CS46xx driver,EMU10K1/EMU10K2 driver
#   C:ICE1712 driver,ICE1724 driver,KORG1212 driver,MIXART driver
#   C:NM256 driver,RME HDSP driver,RME9652 driver,Trident driver
#   C:Digigram VX222 driver,YMFPCI driver,Sound Core PDAudioCF driver
#   C:Digigram VX Pocket driver,PPC PowerMac driver,SPARC AMD7930 driver
#   C:SPARC cs4231 driver,USB generic driver
#   A:Takashi Iwai <tiwai@suse.de>
#   F:Documentation/DocBook/writing-an-alsa-driver.tmpl:1.24->1.25 
#   F:arm/sa11xx-uda1341.c:1.13->1.14 
#   F:core/memalloc.c:1.28->1.29 
#   F:core/pcm_memory.c:1.25->1.26 
#   F:core/rawmidi.c:1.41->1.42 
#   F:core/rtctimer.c:1.19->1.20 
#   F:core/sound.c:1.59->1.60 
#   F:core/timer.c:1.56->1.57 
#   F:core/oss/pcm_oss.c:1.66->1.67 
#   F:core/seq/seq.c:1.9->1.10 
#   F:core/seq/seq_dummy.c:1.10->1.11 
#   F:core/seq/seq_midi.c:1.18->1.19 
#   F:core/seq/oss/seq_oss.c:1.11->1.12 
#   F:core/seq/oss/seq_oss_init.c:1.11->1.12 
#   F:drivers/dummy.c:1.26->1.27 
#   F:drivers/mtpav.c:1.26->1.27 
#   F:drivers/serial-u16550.c:1.25->1.26 
#   F:drivers/virmidi.c:1.11->1.12 
#   F:drivers/mpu401/mpu401.c:1.16->1.17 
#   F:drivers/opl3/opl3_seq.c:1.12->1.13 
#   F:drivers/opl4/opl4_seq.c:1.2->1.3 
#   F:include/initval.h:1.19->1.20 
#   F:isa/als100.c:1.24->1.25 
#   F:isa/azt2320.c:1.24->1.25 
#   F:isa/cmi8330.c:1.28->1.29 
#   F:isa/dt019x.c:1.18->1.19 
#   F:isa/es18xx.c:1.44->1.45 
#   F:isa/opl3sa2.c:1.32->1.33 
#   F:isa/sgalaxy.c:1.19->1.20 
#   F:isa/sscape.c:1.11->1.12 
#   F:isa/ad1816a/ad1816a.c:1.18->1.19 
#   F:isa/ad1848/ad1848.c:1.10->1.11 
#   F:isa/cs423x/cs4231.c:1.12->1.13 
#   F:isa/cs423x/cs4236.c:1.41->1.42 
#   F:isa/cs423x/pc98.c:1.7->1.8 
#   F:isa/es1688/es1688.c:1.14->1.15 
#   F:isa/gus/gusclassic.c:1.13->1.14 
#   F:isa/gus/gusextreme.c:1.15->1.16 
#   F:isa/gus/gusmax.c:1.14->1.15 
#   F:isa/gus/interwave.c:1.32->1.33 
#   F:isa/opti9xx/opti92x-ad1848.c:1.42->1.43 
#   F:isa/sb/emu8000_patch.c:1.8->1.9 
#   F:isa/sb/es968.c:1.24->1.25 
#   F:isa/sb/sb16.c:1.45->1.46 
#   F:isa/sb/sb8.c:1.18->1.19 
#   F:isa/wavefront/wavefront.c:1.27->1.28 
#   F:isa/wavefront/wavefront_synth.c:1.14->1.15 
#   F:parisc/harmony.c:1.5->1.6 
#   F:pci/als4000.c:1.31->1.32 
#   F:pci/atiixp.c:1.2->1.3 
#   F:pci/azt3328.c:1.11->1.12 
#   F:pci/bt87x.c:1.3->1.4 
#   F:pci/cmipci.c:1.61->1.62 
#   F:pci/cs4281.c:1.50->1.51 
#   F:pci/ens1370.c:1.58->1.59 
#   F:pci/es1938.c:1.33->1.34 
#   F:pci/es1968.c:1.61->1.62 
#   F:pci/fm801.c:1.43->1.44 
#   F:pci/intel8x0.c:1.130->1.131 
#   F:pci/intel8x0m.c:1.1->1.2 
#   F:pci/maestro3.c:1.48->1.49 
#   F:pci/rme32.c:1.31->1.32 
#   F:pci/rme96.c:1.33->1.34 
#   F:pci/sonicvibes.c:1.33->1.34 
#   F:pci/via82xx.c:1.94->1.95 
#   F:pci/ac97/ac97_codec.c:1.127->1.128 
#   F:pci/ali5451/ali5451.c:1.43->1.44 
#   F:pci/au88x0/au88x0.c:1.6->1.7 
#   F:pci/cs46xx/cs46xx.c:1.24->1.25 
#   F:pci/emu10k1/emu10k1.c:1.22->1.23 
#   F:pci/ice1712/ice1712.c:1.47->1.48 
#   F:pci/ice1712/ice1724.c:1.27->1.28 
#   F:pci/korg1212/korg1212.c:1.36->1.37 
#   F:pci/mixart/mixart.c:1.6->1.7 
#   F:pci/nm256/nm256.c:1.33->1.34 
#   F:pci/rme9652/hdsp.c:1.54->1.55 
#   F:pci/rme9652/rme9652.c:1.42->1.43 
#   F:pci/trident/trident.c:1.21->1.22 
#   F:pci/vx222/vx222.c:1.3->1.4 
#   F:pci/ymfpci/ymfpci.c:1.33->1.34 
#   F:pcmcia/pdaudiocf/pdaudiocf.c:1.4->1.5 
#   F:pcmcia/vx/vxpocket.c:1.3->1.4 
#   F:ppc/powermac.c:1.15->1.16 
#   F:sparc/amd7930.c:1.8->1.9 
#   F:sparc/cs4231.c:1.12->1.13 
#   F:usb/usbaudio.c:1.96->1.97 
#   L:use the new module_param*() functions.
# 
# sound/core/pcm_memory.c
#   2004/04/07 12:48:11+02:00 perex@suse.cz +3 -2
#   ALSA CVS update
#   D:2004/04/07 18:48:10
#   C:Documentation,SA11xx UDA1341 driver,Memalloc module,PCM Midlevel
#   C:RawMidi Midlevel,RTC timer driver,ALSA Core,Timer Midlevel
#   C:ALSA<-OSS emulation,ALSA sequencer,ALSA<-OSS sequencer,Generic drivers
#   C:MPU401 UART,OPL3,OPL4,ALS100 driver,AZT2320 driver,CMI8330 driver
#   C:DT019x driver,ES18xx driver,OPL3SA2 driver,Sound Galaxy driver
#   C:Sound Scape driver,AD1816A driver,AD1848 driver,CS4231 driver
#   C:CS4236+ driver,PC98(CS423x) driver,ES1688 driver,GUS Classic driver
#   C:GUS Extreme driver,GUS MAX driver,AMD InterWave driver,Opti9xx drivers
#   C:EMU8000 driver,ES968 driver,SB16/AWE driver,SB8 driver
#   C:Wavefront drivers,PARISC Harmony driver,ALS4000 driver,ATIIXP driver
#   C:AZT3328 driver,BT87x driver,CMIPCI driver,CS4281 driver
#   C:ENS1370/1+ driver,ES1938 driver,ES1968 driver,FM801 driver
#   C:Intel8x0 driver,Intel8x0-modem driver,Maestro3 driver,RME32 driver
#   C:RME96 driver,SonicVibes driver,VIA82xx driver,AC97 Codec Core
#   C:ALI5451 driver,au88x0 driver,CS46xx driver,EMU10K1/EMU10K2 driver
#   C:ICE1712 driver,ICE1724 driver,KORG1212 driver,MIXART driver
#   C:NM256 driver,RME HDSP driver,RME9652 driver,Trident driver
#   C:Digigram VX222 driver,YMFPCI driver,Sound Core PDAudioCF driver
#   C:Digigram VX Pocket driver,PPC PowerMac driver,SPARC AMD7930 driver
#   C:SPARC cs4231 driver,USB generic driver
#   A:Takashi Iwai <tiwai@suse.de>
#   F:Documentation/DocBook/writing-an-alsa-driver.tmpl:1.24->1.25 
#   F:arm/sa11xx-uda1341.c:1.13->1.14 
#   F:core/memalloc.c:1.28->1.29 
#   F:core/pcm_memory.c:1.25->1.26 
#   F:core/rawmidi.c:1.41->1.42 
#   F:core/rtctimer.c:1.19->1.20 
#   F:core/sound.c:1.59->1.60 
#   F:core/timer.c:1.56->1.57 
#   F:core/oss/pcm_oss.c:1.66->1.67 
#   F:core/seq/seq.c:1.9->1.10 
#   F:core/seq/seq_dummy.c:1.10->1.11 
#   F:core/seq/seq_midi.c:1.18->1.19 
#   F:core/seq/oss/seq_oss.c:1.11->1.12 
#   F:core/seq/oss/seq_oss_init.c:1.11->1.12 
#   F:drivers/dummy.c:1.26->1.27 
#   F:drivers/mtpav.c:1.26->1.27 
#   F:drivers/serial-u16550.c:1.25->1.26 
#   F:drivers/virmidi.c:1.11->1.12 
#   F:drivers/mpu401/mpu401.c:1.16->1.17 
#   F:drivers/opl3/opl3_seq.c:1.12->1.13 
#   F:drivers/opl4/opl4_seq.c:1.2->1.3 
#   F:include/initval.h:1.19->1.20 
#   F:isa/als100.c:1.24->1.25 
#   F:isa/azt2320.c:1.24->1.25 
#   F:isa/cmi8330.c:1.28->1.29 
#   F:isa/dt019x.c:1.18->1.19 
#   F:isa/es18xx.c:1.44->1.45 
#   F:isa/opl3sa2.c:1.32->1.33 
#   F:isa/sgalaxy.c:1.19->1.20 
#   F:isa/sscape.c:1.11->1.12 
#   F:isa/ad1816a/ad1816a.c:1.18->1.19 
#   F:isa/ad1848/ad1848.c:1.10->1.11 
#   F:isa/cs423x/cs4231.c:1.12->1.13 
#   F:isa/cs423x/cs4236.c:1.41->1.42 
#   F:isa/cs423x/pc98.c:1.7->1.8 
#   F:isa/es1688/es1688.c:1.14->1.15 
#   F:isa/gus/gusclassic.c:1.13->1.14 
#   F:isa/gus/gusextreme.c:1.15->1.16 
#   F:isa/gus/gusmax.c:1.14->1.15 
#   F:isa/gus/interwave.c:1.32->1.33 
#   F:isa/opti9xx/opti92x-ad1848.c:1.42->1.43 
#   F:isa/sb/emu8000_patch.c:1.8->1.9 
#   F:isa/sb/es968.c:1.24->1.25 
#   F:isa/sb/sb16.c:1.45->1.46 
#   F:isa/sb/sb8.c:1.18->1.19 
#   F:isa/wavefront/wavefront.c:1.27->1.28 
#   F:isa/wavefront/wavefront_synth.c:1.14->1.15 
#   F:parisc/harmony.c:1.5->1.6 
#   F:pci/als4000.c:1.31->1.32 
#   F:pci/atiixp.c:1.2->1.3 
#   F:pci/azt3328.c:1.11->1.12 
#   F:pci/bt87x.c:1.3->1.4 
#   F:pci/cmipci.c:1.61->1.62 
#   F:pci/cs4281.c:1.50->1.51 
#   F:pci/ens1370.c:1.58->1.59 
#   F:pci/es1938.c:1.33->1.34 
#   F:pci/es1968.c:1.61->1.62 
#   F:pci/fm801.c:1.43->1.44 
#   F:pci/intel8x0.c:1.130->1.131 
#   F:pci/intel8x0m.c:1.1->1.2 
#   F:pci/maestro3.c:1.48->1.49 
#   F:pci/rme32.c:1.31->1.32 
#   F:pci/rme96.c:1.33->1.34 
#   F:pci/sonicvibes.c:1.33->1.34 
#   F:pci/via82xx.c:1.94->1.95 
#   F:pci/ac97/ac97_codec.c:1.127->1.128 
#   F:pci/ali5451/ali5451.c:1.43->1.44 
#   F:pci/au88x0/au88x0.c:1.6->1.7 
#   F:pci/cs46xx/cs46xx.c:1.24->1.25 
#   F:pci/emu10k1/emu10k1.c:1.22->1.23 
#   F:pci/ice1712/ice1712.c:1.47->1.48 
#   F:pci/ice1712/ice1724.c:1.27->1.28 
#   F:pci/korg1212/korg1212.c:1.36->1.37 
#   F:pci/mixart/mixart.c:1.6->1.7 
#   F:pci/nm256/nm256.c:1.33->1.34 
#   F:pci/rme9652/hdsp.c:1.54->1.55 
#   F:pci/rme9652/rme9652.c:1.42->1.43 
#   F:pci/trident/trident.c:1.21->1.22 
#   F:pci/vx222/vx222.c:1.3->1.4 
#   F:pci/ymfpci/ymfpci.c:1.33->1.34 
#   F:pcmcia/pdaudiocf/pdaudiocf.c:1.4->1.5 
#   F:pcmcia/vx/vxpocket.c:1.3->1.4 
#   F:ppc/powermac.c:1.15->1.16 
#   F:sparc/amd7930.c:1.8->1.9 
#   F:sparc/cs4231.c:1.12->1.13 
#   F:usb/usbaudio.c:1.96->1.97 
#   L:use the new module_param*() functions.
# 
# sound/core/oss/pcm_oss.c
#   2004/04/07 12:48:12+02:00 perex@suse.cz +5 -24
#   ALSA CVS update
#   D:2004/04/07 18:48:10
#   C:Documentation,SA11xx UDA1341 driver,Memalloc module,PCM Midlevel
#   C:RawMidi Midlevel,RTC timer driver,ALSA Core,Timer Midlevel
#   C:ALSA<-OSS emulation,ALSA sequencer,ALSA<-OSS sequencer,Generic drivers
#   C:MPU401 UART,OPL3,OPL4,ALS100 driver,AZT2320 driver,CMI8330 driver
#   C:DT019x driver,ES18xx driver,OPL3SA2 driver,Sound Galaxy driver
#   C:Sound Scape driver,AD1816A driver,AD1848 driver,CS4231 driver
#   C:CS4236+ driver,PC98(CS423x) driver,ES1688 driver,GUS Classic driver
#   C:GUS Extreme driver,GUS MAX driver,AMD InterWave driver,Opti9xx drivers
#   C:EMU8000 driver,ES968 driver,SB16/AWE driver,SB8 driver
#   C:Wavefront drivers,PARISC Harmony driver,ALS4000 driver,ATIIXP driver
#   C:AZT3328 driver,BT87x driver,CMIPCI driver,CS4281 driver
#   C:ENS1370/1+ driver,ES1938 driver,ES1968 driver,FM801 driver
#   C:Intel8x0 driver,Intel8x0-modem driver,Maestro3 driver,RME32 driver
#   C:RME96 driver,SonicVibes driver,VIA82xx driver,AC97 Codec Core
#   C:ALI5451 driver,au88x0 driver,CS46xx driver,EMU10K1/EMU10K2 driver
#   C:ICE1712 driver,ICE1724 driver,KORG1212 driver,MIXART driver
#   C:NM256 driver,RME HDSP driver,RME9652 driver,Trident driver
#   C:Digigram VX222 driver,YMFPCI driver,Sound Core PDAudioCF driver
#   C:Digigram VX Pocket driver,PPC PowerMac driver,SPARC AMD7930 driver
#   C:SPARC cs4231 driver,USB generic driver
#   A:Takashi Iwai <tiwai@suse.de>
#   F:Documentation/DocBook/writing-an-alsa-driver.tmpl:1.24->1.25 
#   F:arm/sa11xx-uda1341.c:1.13->1.14 
#   F:core/memalloc.c:1.28->1.29 
#   F:core/pcm_memory.c:1.25->1.26 
#   F:core/rawmidi.c:1.41->1.42 
#   F:core/rtctimer.c:1.19->1.20 
#   F:core/sound.c:1.59->1.60 
#   F:core/timer.c:1.56->1.57 
#   F:core/oss/pcm_oss.c:1.66->1.67 
#   F:core/seq/seq.c:1.9->1.10 
#   F:core/seq/seq_dummy.c:1.10->1.11 
#   F:core/seq/seq_midi.c:1.18->1.19 
#   F:core/seq/oss/seq_oss.c:1.11->1.12 
#   F:core/seq/oss/seq_oss_init.c:1.11->1.12 
#   F:drivers/dummy.c:1.26->1.27 
#   F:drivers/mtpav.c:1.26->1.27 
#   F:drivers/serial-u16550.c:1.25->1.26 
#   F:drivers/virmidi.c:1.11->1.12 
#   F:drivers/mpu401/mpu401.c:1.16->1.17 
#   F:drivers/opl3/opl3_seq.c:1.12->1.13 
#   F:drivers/opl4/opl4_seq.c:1.2->1.3 
#   F:include/initval.h:1.19->1.20 
#   F:isa/als100.c:1.24->1.25 
#   F:isa/azt2320.c:1.24->1.25 
#   F:isa/cmi8330.c:1.28->1.29 
#   F:isa/dt019x.c:1.18->1.19 
#   F:isa/es18xx.c:1.44->1.45 
#   F:isa/opl3sa2.c:1.32->1.33 
#   F:isa/sgalaxy.c:1.19->1.20 
#   F:isa/sscape.c:1.11->1.12 
#   F:isa/ad1816a/ad1816a.c:1.18->1.19 
#   F:isa/ad1848/ad1848.c:1.10->1.11 
#   F:isa/cs423x/cs4231.c:1.12->1.13 
#   F:isa/cs423x/cs4236.c:1.41->1.42 
#   F:isa/cs423x/pc98.c:1.7->1.8 
#   F:isa/es1688/es1688.c:1.14->1.15 
#   F:isa/gus/gusclassic.c:1.13->1.14 
#   F:isa/gus/gusextreme.c:1.15->1.16 
#   F:isa/gus/gusmax.c:1.14->1.15 
#   F:isa/gus/interwave.c:1.32->1.33 
#   F:isa/opti9xx/opti92x-ad1848.c:1.42->1.43 
#   F:isa/sb/emu8000_patch.c:1.8->1.9 
#   F:isa/sb/es968.c:1.24->1.25 
#   F:isa/sb/sb16.c:1.45->1.46 
#   F:isa/sb/sb8.c:1.18->1.19 
#   F:isa/wavefront/wavefront.c:1.27->1.28 
#   F:isa/wavefront/wavefront_synth.c:1.14->1.15 
#   F:parisc/harmony.c:1.5->1.6 
#   F:pci/als4000.c:1.31->1.32 
#   F:pci/atiixp.c:1.2->1.3 
#   F:pci/azt3328.c:1.11->1.12 
#   F:pci/bt87x.c:1.3->1.4 
#   F:pci/cmipci.c:1.61->1.62 
#   F:pci/cs4281.c:1.50->1.51 
#   F:pci/ens1370.c:1.58->1.59 
#   F:pci/es1938.c:1.33->1.34 
#   F:pci/es1968.c:1.61->1.62 
#   F:pci/fm801.c:1.43->1.44 
#   F:pci/intel8x0.c:1.130->1.131 
#   F:pci/intel8x0m.c:1.1->1.2 
#   F:pci/maestro3.c:1.48->1.49 
#   F:pci/rme32.c:1.31->1.32 
#   F:pci/rme96.c:1.33->1.34 
#   F:pci/sonicvibes.c:1.33->1.34 
#   F:pci/via82xx.c:1.94->1.95 
#   F:pci/ac97/ac97_codec.c:1.127->1.128 
#   F:pci/ali5451/ali5451.c:1.43->1.44 
#   F:pci/au88x0/au88x0.c:1.6->1.7 
#   F:pci/cs46xx/cs46xx.c:1.24->1.25 
#   F:pci/emu10k1/emu10k1.c:1.22->1.23 
#   F:pci/ice1712/ice1712.c:1.47->1.48 
#   F:pci/ice1712/ice1724.c:1.27->1.28 
#   F:pci/korg1212/korg1212.c:1.36->1.37 
#   F:pci/mixart/mixart.c:1.6->1.7 
#   F:pci/nm256/nm256.c:1.33->1.34 
#   F:pci/rme9652/hdsp.c:1.54->1.55 
#   F:pci/rme9652/rme9652.c:1.42->1.43 
#   F:pci/trident/trident.c:1.21->1.22 
#   F:pci/vx222/vx222.c:1.3->1.4 
#   F:pci/ymfpci/ymfpci.c:1.33->1.34 
#   F:pcmcia/pdaudiocf/pdaudiocf.c:1.4->1.5 
#   F:pcmcia/vx/vxpocket.c:1.3->1.4 
#   F:ppc/powermac.c:1.15->1.16 
#   F:sparc/amd7930.c:1.8->1.9 
#   F:sparc/cs4231.c:1.12->1.13 
#   F:usb/usbaudio.c:1.96->1.97 
#   L:use the new module_param*() functions.
# 
# sound/core/memalloc.c
#   2004/04/07 12:48:11+02:00 perex@suse.cz +3 -20
#   ALSA CVS update
#   D:2004/04/07 18:48:10
#   C:Documentation,SA11xx UDA1341 driver,Memalloc module,PCM Midlevel
#   C:RawMidi Midlevel,RTC timer driver,ALSA Core,Timer Midlevel
#   C:ALSA<-OSS emulation,ALSA sequencer,ALSA<-OSS sequencer,Generic drivers
#   C:MPU401 UART,OPL3,OPL4,ALS100 driver,AZT2320 driver,CMI8330 driver
#   C:DT019x driver,ES18xx driver,OPL3SA2 driver,Sound Galaxy driver
#   C:Sound Scape driver,AD1816A driver,AD1848 driver,CS4231 driver
#   C:CS4236+ driver,PC98(CS423x) driver,ES1688 driver,GUS Classic driver
#   C:GUS Extreme driver,GUS MAX driver,AMD InterWave driver,Opti9xx drivers
#   C:EMU8000 driver,ES968 driver,SB16/AWE driver,SB8 driver
#   C:Wavefront drivers,PARISC Harmony driver,ALS4000 driver,ATIIXP driver
#   C:AZT3328 driver,BT87x driver,CMIPCI driver,CS4281 driver
#   C:ENS1370/1+ driver,ES1938 driver,ES1968 driver,FM801 driver
#   C:Intel8x0 driver,Intel8x0-modem driver,Maestro3 driver,RME32 driver
#   C:RME96 driver,SonicVibes driver,VIA82xx driver,AC97 Codec Core
#   C:ALI5451 driver,au88x0 driver,CS46xx driver,EMU10K1/EMU10K2 driver
#   C:ICE1712 driver,ICE1724 driver,KORG1212 driver,MIXART driver
#   C:NM256 driver,RME HDSP driver,RME9652 driver,Trident driver
#   C:Digigram VX222 driver,YMFPCI driver,Sound Core PDAudioCF driver
#   C:Digigram VX Pocket driver,PPC PowerMac driver,SPARC AMD7930 driver
#   C:SPARC cs4231 driver,USB generic driver
#   A:Takashi Iwai <tiwai@suse.de>
#   F:Documentation/DocBook/writing-an-alsa-driver.tmpl:1.24->1.25 
#   F:arm/sa11xx-uda1341.c:1.13->1.14 
#   F:core/memalloc.c:1.28->1.29 
#   F:core/pcm_memory.c:1.25->1.26 
#   F:core/rawmidi.c:1.41->1.42 
#   F:core/rtctimer.c:1.19->1.20 
#   F:core/sound.c:1.59->1.60 
#   F:core/timer.c:1.56->1.57 
#   F:core/oss/pcm_oss.c:1.66->1.67 
#   F:core/seq/seq.c:1.9->1.10 
#   F:core/seq/seq_dummy.c:1.10->1.11 
#   F:core/seq/seq_midi.c:1.18->1.19 
#   F:core/seq/oss/seq_oss.c:1.11->1.12 
#   F:core/seq/oss/seq_oss_init.c:1.11->1.12 
#   F:drivers/dummy.c:1.26->1.27 
#   F:drivers/mtpav.c:1.26->1.27 
#   F:drivers/serial-u16550.c:1.25->1.26 
#   F:drivers/virmidi.c:1.11->1.12 
#   F:drivers/mpu401/mpu401.c:1.16->1.17 
#   F:drivers/opl3/opl3_seq.c:1.12->1.13 
#   F:drivers/opl4/opl4_seq.c:1.2->1.3 
#   F:include/initval.h:1.19->1.20 
#   F:isa/als100.c:1.24->1.25 
#   F:isa/azt2320.c:1.24->1.25 
#   F:isa/cmi8330.c:1.28->1.29 
#   F:isa/dt019x.c:1.18->1.19 
#   F:isa/es18xx.c:1.44->1.45 
#   F:isa/opl3sa2.c:1.32->1.33 
#   F:isa/sgalaxy.c:1.19->1.20 
#   F:isa/sscape.c:1.11->1.12 
#   F:isa/ad1816a/ad1816a.c:1.18->1.19 
#   F:isa/ad1848/ad1848.c:1.10->1.11 
#   F:isa/cs423x/cs4231.c:1.12->1.13 
#   F:isa/cs423x/cs4236.c:1.41->1.42 
#   F:isa/cs423x/pc98.c:1.7->1.8 
#   F:isa/es1688/es1688.c:1.14->1.15 
#   F:isa/gus/gusclassic.c:1.13->1.14 
#   F:isa/gus/gusextreme.c:1.15->1.16 
#   F:isa/gus/gusmax.c:1.14->1.15 
#   F:isa/gus/interwave.c:1.32->1.33 
#   F:isa/opti9xx/opti92x-ad1848.c:1.42->1.43 
#   F:isa/sb/emu8000_patch.c:1.8->1.9 
#   F:isa/sb/es968.c:1.24->1.25 
#   F:isa/sb/sb16.c:1.45->1.46 
#   F:isa/sb/sb8.c:1.18->1.19 
#   F:isa/wavefront/wavefront.c:1.27->1.28 
#   F:isa/wavefront/wavefront_synth.c:1.14->1.15 
#   F:parisc/harmony.c:1.5->1.6 
#   F:pci/als4000.c:1.31->1.32 
#   F:pci/atiixp.c:1.2->1.3 
#   F:pci/azt3328.c:1.11->1.12 
#   F:pci/bt87x.c:1.3->1.4 
#   F:pci/cmipci.c:1.61->1.62 
#   F:pci/cs4281.c:1.50->1.51 
#   F:pci/ens1370.c:1.58->1.59 
#   F:pci/es1938.c:1.33->1.34 
#   F:pci/es1968.c:1.61->1.62 
#   F:pci/fm801.c:1.43->1.44 
#   F:pci/intel8x0.c:1.130->1.131 
#   F:pci/intel8x0m.c:1.1->1.2 
#   F:pci/maestro3.c:1.48->1.49 
#   F:pci/rme32.c:1.31->1.32 
#   F:pci/rme96.c:1.33->1.34 
#   F:pci/sonicvibes.c:1.33->1.34 
#   F:pci/via82xx.c:1.94->1.95 
#   F:pci/ac97/ac97_codec.c:1.127->1.128 
#   F:pci/ali5451/ali5451.c:1.43->1.44 
#   F:pci/au88x0/au88x0.c:1.6->1.7 
#   F:pci/cs46xx/cs46xx.c:1.24->1.25 
#   F:pci/emu10k1/emu10k1.c:1.22->1.23 
#   F:pci/ice1712/ice1712.c:1.47->1.48 
#   F:pci/ice1712/ice1724.c:1.27->1.28 
#   F:pci/korg1212/korg1212.c:1.36->1.37 
#   F:pci/mixart/mixart.c:1.6->1.7 
#   F:pci/nm256/nm256.c:1.33->1.34 
#   F:pci/rme9652/hdsp.c:1.54->1.55 
#   F:pci/rme9652/rme9652.c:1.42->1.43 
#   F:pci/trident/trident.c:1.21->1.22 
#   F:pci/vx222/vx222.c:1.3->1.4 
#   F:pci/ymfpci/ymfpci.c:1.33->1.34 
#   F:pcmcia/pdaudiocf/pdaudiocf.c:1.4->1.5 
#   F:pcmcia/vx/vxpocket.c:1.3->1.4 
#   F:ppc/powermac.c:1.15->1.16 
#   F:sparc/amd7930.c:1.8->1.9 
#   F:sparc/cs4231.c:1.12->1.13 
#   F:usb/usbaudio.c:1.96->1.97 
#   L:use the new module_param*() functions.
# 
# sound/arm/sa11xx-uda1341.c
#   2004/04/07 12:48:10+02:00 perex@suse.cz +3 -2
#   ALSA CVS update
#   D:2004/04/07 18:48:10
#   C:Documentation,SA11xx UDA1341 driver,Memalloc module,PCM Midlevel
#   C:RawMidi Midlevel,RTC timer driver,ALSA Core,Timer Midlevel
#   C:ALSA<-OSS emulation,ALSA sequencer,ALSA<-OSS sequencer,Generic drivers
#   C:MPU401 UART,OPL3,OPL4,ALS100 driver,AZT2320 driver,CMI8330 driver
#   C:DT019x driver,ES18xx driver,OPL3SA2 driver,Sound Galaxy driver
#   C:Sound Scape driver,AD1816A driver,AD1848 driver,CS4231 driver
#   C:CS4236+ driver,PC98(CS423x) driver,ES1688 driver,GUS Classic driver
#   C:GUS Extreme driver,GUS MAX driver,AMD InterWave driver,Opti9xx drivers
#   C:EMU8000 driver,ES968 driver,SB16/AWE driver,SB8 driver
#   C:Wavefront drivers,PARISC Harmony driver,ALS4000 driver,ATIIXP driver
#   C:AZT3328 driver,BT87x driver,CMIPCI driver,CS4281 driver
#   C:ENS1370/1+ driver,ES1938 driver,ES1968 driver,FM801 driver
#   C:Intel8x0 driver,Intel8x0-modem driver,Maestro3 driver,RME32 driver
#   C:RME96 driver,SonicVibes driver,VIA82xx driver,AC97 Codec Core
#   C:ALI5451 driver,au88x0 driver,CS46xx driver,EMU10K1/EMU10K2 driver
#   C:ICE1712 driver,ICE1724 driver,KORG1212 driver,MIXART driver
#   C:NM256 driver,RME HDSP driver,RME9652 driver,Trident driver
#   C:Digigram VX222 driver,YMFPCI driver,Sound Core PDAudioCF driver
#   C:Digigram VX Pocket driver,PPC PowerMac driver,SPARC AMD7930 driver
#   C:SPARC cs4231 driver,USB generic driver
#   A:Takashi Iwai <tiwai@suse.de>
#   F:Documentation/DocBook/writing-an-alsa-driver.tmpl:1.24->1.25 
#   F:arm/sa11xx-uda1341.c:1.13->1.14 
#   F:core/memalloc.c:1.28->1.29 
#   F:core/pcm_memory.c:1.25->1.26 
#   F:core/rawmidi.c:1.41->1.42 
#   F:core/rtctimer.c:1.19->1.20 
#   F:core/sound.c:1.59->1.60 
#   F:core/timer.c:1.56->1.57 
#   F:core/oss/pcm_oss.c:1.66->1.67 
#   F:core/seq/seq.c:1.9->1.10 
#   F:core/seq/seq_dummy.c:1.10->1.11 
#   F:core/seq/seq_midi.c:1.18->1.19 
#   F:core/seq/oss/seq_oss.c:1.11->1.12 
#   F:core/seq/oss/seq_oss_init.c:1.11->1.12 
#   F:drivers/dummy.c:1.26->1.27 
#   F:drivers/mtpav.c:1.26->1.27 
#   F:drivers/serial-u16550.c:1.25->1.26 
#   F:drivers/virmidi.c:1.11->1.12 
#   F:drivers/mpu401/mpu401.c:1.16->1.17 
#   F:drivers/opl3/opl3_seq.c:1.12->1.13 
#   F:drivers/opl4/opl4_seq.c:1.2->1.3 
#   F:include/initval.h:1.19->1.20 
#   F:isa/als100.c:1.24->1.25 
#   F:isa/azt2320.c:1.24->1.25 
#   F:isa/cmi8330.c:1.28->1.29 
#   F:isa/dt019x.c:1.18->1.19 
#   F:isa/es18xx.c:1.44->1.45 
#   F:isa/opl3sa2.c:1.32->1.33 
#   F:isa/sgalaxy.c:1.19->1.20 
#   F:isa/sscape.c:1.11->1.12 
#   F:isa/ad1816a/ad1816a.c:1.18->1.19 
#   F:isa/ad1848/ad1848.c:1.10->1.11 
#   F:isa/cs423x/cs4231.c:1.12->1.13 
#   F:isa/cs423x/cs4236.c:1.41->1.42 
#   F:isa/cs423x/pc98.c:1.7->1.8 
#   F:isa/es1688/es1688.c:1.14->1.15 
#   F:isa/gus/gusclassic.c:1.13->1.14 
#   F:isa/gus/gusextreme.c:1.15->1.16 
#   F:isa/gus/gusmax.c:1.14->1.15 
#   F:isa/gus/interwave.c:1.32->1.33 
#   F:isa/opti9xx/opti92x-ad1848.c:1.42->1.43 
#   F:isa/sb/emu8000_patch.c:1.8->1.9 
#   F:isa/sb/es968.c:1.24->1.25 
#   F:isa/sb/sb16.c:1.45->1.46 
#   F:isa/sb/sb8.c:1.18->1.19 
#   F:isa/wavefront/wavefront.c:1.27->1.28 
#   F:isa/wavefront/wavefront_synth.c:1.14->1.15 
#   F:parisc/harmony.c:1.5->1.6 
#   F:pci/als4000.c:1.31->1.32 
#   F:pci/atiixp.c:1.2->1.3 
#   F:pci/azt3328.c:1.11->1.12 
#   F:pci/bt87x.c:1.3->1.4 
#   F:pci/cmipci.c:1.61->1.62 
#   F:pci/cs4281.c:1.50->1.51 
#   F:pci/ens1370.c:1.58->1.59 
#   F:pci/es1938.c:1.33->1.34 
#   F:pci/es1968.c:1.61->1.62 
#   F:pci/fm801.c:1.43->1.44 
#   F:pci/intel8x0.c:1.130->1.131 
#   F:pci/intel8x0m.c:1.1->1.2 
#   F:pci/maestro3.c:1.48->1.49 
#   F:pci/rme32.c:1.31->1.32 
#   F:pci/rme96.c:1.33->1.34 
#   F:pci/sonicvibes.c:1.33->1.34 
#   F:pci/via82xx.c:1.94->1.95 
#   F:pci/ac97/ac97_codec.c:1.127->1.128 
#   F:pci/ali5451/ali5451.c:1.43->1.44 
#   F:pci/au88x0/au88x0.c:1.6->1.7 
#   F:pci/cs46xx/cs46xx.c:1.24->1.25 
#   F:pci/emu10k1/emu10k1.c:1.22->1.23 
#   F:pci/ice1712/ice1712.c:1.47->1.48 
#   F:pci/ice1712/ice1724.c:1.27->1.28 
#   F:pci/korg1212/korg1212.c:1.36->1.37 
#   F:pci/mixart/mixart.c:1.6->1.7 
#   F:pci/nm256/nm256.c:1.33->1.34 
#   F:pci/rme9652/hdsp.c:1.54->1.55 
#   F:pci/rme9652/rme9652.c:1.42->1.43 
#   F:pci/trident/trident.c:1.21->1.22 
#   F:pci/vx222/vx222.c:1.3->1.4 
#   F:pci/ymfpci/ymfpci.c:1.33->1.34 
#   F:pcmcia/pdaudiocf/pdaudiocf.c:1.4->1.5 
#   F:pcmcia/vx/vxpocket.c:1.3->1.4 
#   F:ppc/powermac.c:1.15->1.16 
#   F:sparc/amd7930.c:1.8->1.9 
#   F:sparc/cs4231.c:1.12->1.13 
#   F:usb/usbaudio.c:1.96->1.97 
#   L:use the new module_param*() functions.
# 
# include/sound/initval.h
#   2004/04/07 12:48:13+02:00 perex@suse.cz +0 -40
#   ALSA CVS update
#   D:2004/04/07 18:48:10
#   C:Documentation,SA11xx UDA1341 driver,Memalloc module,PCM Midlevel
#   C:RawMidi Midlevel,RTC timer driver,ALSA Core,Timer Midlevel
#   C:ALSA<-OSS emulation,ALSA sequencer,ALSA<-OSS sequencer,Generic drivers
#   C:MPU401 UART,OPL3,OPL4,ALS100 driver,AZT2320 driver,CMI8330 driver
#   C:DT019x driver,ES18xx driver,OPL3SA2 driver,Sound Galaxy driver
#   C:Sound Scape driver,AD1816A driver,AD1848 driver,CS4231 driver
#   C:CS4236+ driver,PC98(CS423x) driver,ES1688 driver,GUS Classic driver
#   C:GUS Extreme driver,GUS MAX driver,AMD InterWave driver,Opti9xx drivers
#   C:EMU8000 driver,ES968 driver,SB16/AWE driver,SB8 driver
#   C:Wavefront drivers,PARISC Harmony driver,ALS4000 driver,ATIIXP driver
#   C:AZT3328 driver,BT87x driver,CMIPCI driver,CS4281 driver
#   C:ENS1370/1+ driver,ES1938 driver,ES1968 driver,FM801 driver
#   C:Intel8x0 driver,Intel8x0-modem driver,Maestro3 driver,RME32 driver
#   C:RME96 driver,SonicVibes driver,VIA82xx driver,AC97 Codec Core
#   C:ALI5451 driver,au88x0 driver,CS46xx driver,EMU10K1/EMU10K2 driver
#   C:ICE1712 driver,ICE1724 driver,KORG1212 driver,MIXART driver
#   C:NM256 driver,RME HDSP driver,RME9652 driver,Trident driver
#   C:Digigram VX222 driver,YMFPCI driver,Sound Core PDAudioCF driver
#   C:Digigram VX Pocket driver,PPC PowerMac driver,SPARC AMD7930 driver
#   C:SPARC cs4231 driver,USB generic driver
#   A:Takashi Iwai <tiwai@suse.de>
#   F:Documentation/DocBook/writing-an-alsa-driver.tmpl:1.24->1.25 
#   F:arm/sa11xx-uda1341.c:1.13->1.14 
#   F:core/memalloc.c:1.28->1.29 
#   F:core/pcm_memory.c:1.25->1.26 
#   F:core/rawmidi.c:1.41->1.42 
#   F:core/rtctimer.c:1.19->1.20 
#   F:core/sound.c:1.59->1.60 
#   F:core/timer.c:1.56->1.57 
#   F:core/oss/pcm_oss.c:1.66->1.67 
#   F:core/seq/seq.c:1.9->1.10 
#   F:core/seq/seq_dummy.c:1.10->1.11 
#   F:core/seq/seq_midi.c:1.18->1.19 
#   F:core/seq/oss/seq_oss.c:1.11->1.12 
#   F:core/seq/oss/seq_oss_init.c:1.11->1.12 
#   F:drivers/dummy.c:1.26->1.27 
#   F:drivers/mtpav.c:1.26->1.27 
#   F:drivers/serial-u16550.c:1.25->1.26 
#   F:drivers/virmidi.c:1.11->1.12 
#   F:drivers/mpu401/mpu401.c:1.16->1.17 
#   F:drivers/opl3/opl3_seq.c:1.12->1.13 
#   F:drivers/opl4/opl4_seq.c:1.2->1.3 
#   F:include/initval.h:1.19->1.20 
#   F:isa/als100.c:1.24->1.25 
#   F:isa/azt2320.c:1.24->1.25 
#   F:isa/cmi8330.c:1.28->1.29 
#   F:isa/dt019x.c:1.18->1.19 
#   F:isa/es18xx.c:1.44->1.45 
#   F:isa/opl3sa2.c:1.32->1.33 
#   F:isa/sgalaxy.c:1.19->1.20 
#   F:isa/sscape.c:1.11->1.12 
#   F:isa/ad1816a/ad1816a.c:1.18->1.19 
#   F:isa/ad1848/ad1848.c:1.10->1.11 
#   F:isa/cs423x/cs4231.c:1.12->1.13 
#   F:isa/cs423x/cs4236.c:1.41->1.42 
#   F:isa/cs423x/pc98.c:1.7->1.8 
#   F:isa/es1688/es1688.c:1.14->1.15 
#   F:isa/gus/gusclassic.c:1.13->1.14 
#   F:isa/gus/gusextreme.c:1.15->1.16 
#   F:isa/gus/gusmax.c:1.14->1.15 
#   F:isa/gus/interwave.c:1.32->1.33 
#   F:isa/opti9xx/opti92x-ad1848.c:1.42->1.43 
#   F:isa/sb/emu8000_patch.c:1.8->1.9 
#   F:isa/sb/es968.c:1.24->1.25 
#   F:isa/sb/sb16.c:1.45->1.46 
#   F:isa/sb/sb8.c:1.18->1.19 
#   F:isa/wavefront/wavefront.c:1.27->1.28 
#   F:isa/wavefront/wavefront_synth.c:1.14->1.15 
#   F:parisc/harmony.c:1.5->1.6 
#   F:pci/als4000.c:1.31->1.32 
#   F:pci/atiixp.c:1.2->1.3 
#   F:pci/azt3328.c:1.11->1.12 
#   F:pci/bt87x.c:1.3->1.4 
#   F:pci/cmipci.c:1.61->1.62 
#   F:pci/cs4281.c:1.50->1.51 
#   F:pci/ens1370.c:1.58->1.59 
#   F:pci/es1938.c:1.33->1.34 
#   F:pci/es1968.c:1.61->1.62 
#   F:pci/fm801.c:1.43->1.44 
#   F:pci/intel8x0.c:1.130->1.131 
#   F:pci/intel8x0m.c:1.1->1.2 
#   F:pci/maestro3.c:1.48->1.49 
#   F:pci/rme32.c:1.31->1.32 
#   F:pci/rme96.c:1.33->1.34 
#   F:pci/sonicvibes.c:1.33->1.34 
#   F:pci/via82xx.c:1.94->1.95 
#   F:pci/ac97/ac97_codec.c:1.127->1.128 
#   F:pci/ali5451/ali5451.c:1.43->1.44 
#   F:pci/au88x0/au88x0.c:1.6->1.7 
#   F:pci/cs46xx/cs46xx.c:1.24->1.25 
#   F:pci/emu10k1/emu10k1.c:1.22->1.23 
#   F:pci/ice1712/ice1712.c:1.47->1.48 
#   F:pci/ice1712/ice1724.c:1.27->1.28 
#   F:pci/korg1212/korg1212.c:1.36->1.37 
#   F:pci/mixart/mixart.c:1.6->1.7 
#   F:pci/nm256/nm256.c:1.33->1.34 
#   F:pci/rme9652/hdsp.c:1.54->1.55 
#   F:pci/rme9652/rme9652.c:1.42->1.43 
#   F:pci/trident/trident.c:1.21->1.22 
#   F:pci/vx222/vx222.c:1.3->1.4 
#   F:pci/ymfpci/ymfpci.c:1.33->1.34 
#   F:pcmcia/pdaudiocf/pdaudiocf.c:1.4->1.5 
#   F:pcmcia/vx/vxpocket.c:1.3->1.4 
#   F:ppc/powermac.c:1.15->1.16 
#   F:sparc/amd7930.c:1.8->1.9 
#   F:sparc/cs4231.c:1.12->1.13 
#   F:usb/usbaudio.c:1.96->1.97 
#   L:use the new module_param*() functions.
# 
# Documentation/sound/alsa/DocBook/writing-an-alsa-driver.tmpl
#   2004/04/07 12:48:10+02:00 perex@suse.cz +9 -37
#   ALSA CVS update
#   D:2004/04/07 18:48:10
#   C:Documentation,SA11xx UDA1341 driver,Memalloc module,PCM Midlevel
#   C:RawMidi Midlevel,RTC timer driver,ALSA Core,Timer Midlevel
#   C:ALSA<-OSS emulation,ALSA sequencer,ALSA<-OSS sequencer,Generic drivers
#   C:MPU401 UART,OPL3,OPL4,ALS100 driver,AZT2320 driver,CMI8330 driver
#   C:DT019x driver,ES18xx driver,OPL3SA2 driver,Sound Galaxy driver
#   C:Sound Scape driver,AD1816A driver,AD1848 driver,CS4231 driver
#   C:CS4236+ driver,PC98(CS423x) driver,ES1688 driver,GUS Classic driver
#   C:GUS Extreme driver,GUS MAX driver,AMD InterWave driver,Opti9xx drivers
#   C:EMU8000 driver,ES968 driver,SB16/AWE driver,SB8 driver
#   C:Wavefront drivers,PARISC Harmony driver,ALS4000 driver,ATIIXP driver
#   C:AZT3328 driver,BT87x driver,CMIPCI driver,CS4281 driver
#   C:ENS1370/1+ driver,ES1938 driver,ES1968 driver,FM801 driver
#   C:Intel8x0 driver,Intel8x0-modem driver,Maestro3 driver,RME32 driver
#   C:RME96 driver,SonicVibes driver,VIA82xx driver,AC97 Codec Core
#   C:ALI5451 driver,au88x0 driver,CS46xx driver,EMU10K1/EMU10K2 driver
#   C:ICE1712 driver,ICE1724 driver,KORG1212 driver,MIXART driver
#   C:NM256 driver,RME HDSP driver,RME9652 driver,Trident driver
#   C:Digigram VX222 driver,YMFPCI driver,Sound Core PDAudioCF driver
#   C:Digigram VX Pocket driver,PPC PowerMac driver,SPARC AMD7930 driver
#   C:SPARC cs4231 driver,USB generic driver
#   A:Takashi Iwai <tiwai@suse.de>
#   F:Documentation/DocBook/writing-an-alsa-driver.tmpl:1.24->1.25 
#   F:arm/sa11xx-uda1341.c:1.13->1.14 
#   F:core/memalloc.c:1.28->1.29 
#   F:core/pcm_memory.c:1.25->1.26 
#   F:core/rawmidi.c:1.41->1.42 
#   F:core/rtctimer.c:1.19->1.20 
#   F:core/sound.c:1.59->1.60 
#   F:core/timer.c:1.56->1.57 
#   F:core/oss/pcm_oss.c:1.66->1.67 
#   F:core/seq/seq.c:1.9->1.10 
#   F:core/seq/seq_dummy.c:1.10->1.11 
#   F:core/seq/seq_midi.c:1.18->1.19 
#   F:core/seq/oss/seq_oss.c:1.11->1.12 
#   F:core/seq/oss/seq_oss_init.c:1.11->1.12 
#   F:drivers/dummy.c:1.26->1.27 
#   F:drivers/mtpav.c:1.26->1.27 
#   F:drivers/serial-u16550.c:1.25->1.26 
#   F:drivers/virmidi.c:1.11->1.12 
#   F:drivers/mpu401/mpu401.c:1.16->1.17 
#   F:drivers/opl3/opl3_seq.c:1.12->1.13 
#   F:drivers/opl4/opl4_seq.c:1.2->1.3 
#   F:include/initval.h:1.19->1.20 
#   F:isa/als100.c:1.24->1.25 
#   F:isa/azt2320.c:1.24->1.25 
#   F:isa/cmi8330.c:1.28->1.29 
#   F:isa/dt019x.c:1.18->1.19 
#   F:isa/es18xx.c:1.44->1.45 
#   F:isa/opl3sa2.c:1.32->1.33 
#   F:isa/sgalaxy.c:1.19->1.20 
#   F:isa/sscape.c:1.11->1.12 
#   F:isa/ad1816a/ad1816a.c:1.18->1.19 
#   F:isa/ad1848/ad1848.c:1.10->1.11 
#   F:isa/cs423x/cs4231.c:1.12->1.13 
#   F:isa/cs423x/cs4236.c:1.41->1.42 
#   F:isa/cs423x/pc98.c:1.7->1.8 
#   F:isa/es1688/es1688.c:1.14->1.15 
#   F:isa/gus/gusclassic.c:1.13->1.14 
#   F:isa/gus/gusextreme.c:1.15->1.16 
#   F:isa/gus/gusmax.c:1.14->1.15 
#   F:isa/gus/interwave.c:1.32->1.33 
#   F:isa/opti9xx/opti92x-ad1848.c:1.42->1.43 
#   F:isa/sb/emu8000_patch.c:1.8->1.9 
#   F:isa/sb/es968.c:1.24->1.25 
#   F:isa/sb/sb16.c:1.45->1.46 
#   F:isa/sb/sb8.c:1.18->1.19 
#   F:isa/wavefront/wavefront.c:1.27->1.28 
#   F:isa/wavefront/wavefront_synth.c:1.14->1.15 
#   F:parisc/harmony.c:1.5->1.6 
#   F:pci/als4000.c:1.31->1.32 
#   F:pci/atiixp.c:1.2->1.3 
#   F:pci/azt3328.c:1.11->1.12 
#   F:pci/bt87x.c:1.3->1.4 
#   F:pci/cmipci.c:1.61->1.62 
#   F:pci/cs4281.c:1.50->1.51 
#   F:pci/ens1370.c:1.58->1.59 
#   F:pci/es1938.c:1.33->1.34 
#   F:pci/es1968.c:1.61->1.62 
#   F:pci/fm801.c:1.43->1.44 
#   F:pci/intel8x0.c:1.130->1.131 
#   F:pci/intel8x0m.c:1.1->1.2 
#   F:pci/maestro3.c:1.48->1.49 
#   F:pci/rme32.c:1.31->1.32 
#   F:pci/rme96.c:1.33->1.34 
#   F:pci/sonicvibes.c:1.33->1.34 
#   F:pci/via82xx.c:1.94->1.95 
#   F:pci/ac97/ac97_codec.c:1.127->1.128 
#   F:pci/ali5451/ali5451.c:1.43->1.44 
#   F:pci/au88x0/au88x0.c:1.6->1.7 
#   F:pci/cs46xx/cs46xx.c:1.24->1.25 
#   F:pci/emu10k1/emu10k1.c:1.22->1.23 
#   F:pci/ice1712/ice1712.c:1.47->1.48 
#   F:pci/ice1712/ice1724.c:1.27->1.28 
#   F:pci/korg1212/korg1212.c:1.36->1.37 
#   F:pci/mixart/mixart.c:1.6->1.7 
#   F:pci/nm256/nm256.c:1.33->1.34 
#   F:pci/rme9652/hdsp.c:1.54->1.55 
#   F:pci/rme9652/rme9652.c:1.42->1.43 
#   F:pci/trident/trident.c:1.21->1.22 
#   F:pci/vx222/vx222.c:1.3->1.4 
#   F:pci/ymfpci/ymfpci.c:1.33->1.34 
#   F:pcmcia/pdaudiocf/pdaudiocf.c:1.4->1.5 
#   F:pcmcia/vx/vxpocket.c:1.3->1.4 
#   F:ppc/powermac.c:1.15->1.16 
#   F:sparc/amd7930.c:1.8->1.9 
#   F:sparc/cs4231.c:1.12->1.13 
#   F:usb/usbaudio.c:1.96->1.97 
#   L:use the new module_param*() functions.
# 
# ChangeSet
#   2004/04/24 15:47:52+02:00 perex@suse.cz 
#   ALSA CVS update - Clemens Ladisch <clemens@ladisch.de>
#   AC97 Codec Core
#   fix AC'97 revision bits on AD1985
# 
# sound/pci/ac97/ac97_patch.c
#   2004/04/07 02:25:06+02:00 perex@suse.cz +2 -0
#   ALSA CVS update
#   D:2004/04/07 08:25:06
#   C:AC97 Codec Core
#   A:Clemens Ladisch <clemens@ladisch.de>
#   F:pci/ac97/ac97_patch.c:1.42->1.43 
#   L:fix AC'97 revision bits on AD1985
# 
# ChangeSet
#   2004/04/24 15:47:33+02:00 perex@suse.cz 
#   ALSA CVS update - Clemens Ladisch <clemens@ladisch.de>
#   AC97 Codec Core
#   show AC'97 2.3 information in proc file
# 
# sound/pci/ac97/ac97_proc.c
#   2004/04/07 02:21:34+02:00 perex@suse.cz +57 -0
#   ALSA CVS update
#   D:2004/04/07 08:21:33
#   C:AC97 Codec Core
#   A:Clemens Ladisch <clemens@ladisch.de>
#   F:include/ac97_codec.h:1.43->1.44 
#   F:pci/ac97/ac97_proc.c:1.5->1.6 
#   L:show AC'97 2.3 information in proc file
# 
# include/sound/ac97_codec.h
#   2004/04/07 02:21:33+02:00 perex@suse.cz +19 -1
#   ALSA CVS update
#   D:2004/04/07 08:21:33
#   C:AC97 Codec Core
#   A:Clemens Ladisch <clemens@ladisch.de>
#   F:include/ac97_codec.h:1.43->1.44 
#   F:pci/ac97/ac97_proc.c:1.5->1.6 
#   L:show AC'97 2.3 information in proc file
# 
# ChangeSet
#   2004/04/24 15:47:10+02:00 perex@suse.cz 
#   ALSA CVS update - Jaroslav Kysela <perex@suse.cz>
#   Timer Midlevel,ALSA Core
#   Added early event flag and code to the timer interface.
# 
# sound/core/timer.c
#   2004/04/06 12:23:46+02:00 perex@suse.cz +29 -14
#   ALSA CVS update
#   D:2004/04/06 18:23:46
#   C:Timer Midlevel,ALSA Core
#   A:Jaroslav Kysela <perex@suse.cz>
#   F:core/timer.c:1.55->1.56 
#   F:include/asound.h:1.37->1.38 
#   F:include/timer.h:1.16->1.17 
#   L:Added early event flag and code to the timer interface.
# 
# include/sound/timer.h
#   2004/04/06 12:23:47+02:00 perex@suse.cz +1 -0
#   ALSA CVS update
#   D:2004/04/06 18:23:46
#   C:Timer Midlevel,ALSA Core
#   A:Jaroslav Kysela <perex@suse.cz>
#   F:core/timer.c:1.55->1.56 
#   F:include/asound.h:1.37->1.38 
#   F:include/timer.h:1.16->1.17 
#   L:Added early event flag and code to the timer interface.
# 
# include/sound/asound.h
#   2004/04/06 12:23:47+02:00 perex@suse.cz +3 -1
#   ALSA CVS update
#   D:2004/04/06 18:23:46
#   C:Timer Midlevel,ALSA Core
#   A:Jaroslav Kysela <perex@suse.cz>
#   F:core/timer.c:1.55->1.56 
#   F:include/asound.h:1.37->1.38 
#   F:include/timer.h:1.16->1.17 
#   L:Added early event flag and code to the timer interface.
# 
# ChangeSet
#   2004/04/24 15:46:51+02:00 perex@suse.cz 
#   ALSA CVS update - Clemens Ladisch <clemens@ladisch.de>
#   USB generic driver
#   allow specification of rate_table in AUDIO_FIXED_ENDPOINT quirks
# 
# sound/usb/usbaudio.c
#   2004/04/06 09:20:21+02:00 perex@suse.cz +15 -0
#   ALSA CVS update
#   D:2004/04/06 15:20:21
#   C:USB generic driver
#   A:Clemens Ladisch <clemens@ladisch.de>
#   F:usb/usbaudio.c:1.95->1.96 
#   L:allow specification of rate_table in AUDIO_FIXED_ENDPOINT quirks
# 
# ChangeSet
#   2004/04/24 15:46:27+02:00 perex@suse.cz 
#   ALSA CVS update - Clemens Ladisch <clemens@ladisch.de>
#   USB generic driver
#   remove superfluous address operator from literal arrays
# 
# sound/usb/usbquirks.h
#   2004/04/06 09:19:00+02:00 perex@suse.cz +5 -5
#   ALSA CVS update
#   D:2004/04/06 15:19:00
#   C:USB generic driver
#   A:Clemens Ladisch <clemens@ladisch.de>
#   F:usb/usbquirks.h:1.29->1.30 
#   L:remove superfluous address operator from literal arrays
# 
# ChangeSet
#   2004/04/24 15:46:08+02:00 perex@suse.cz 
#   ALSA CVS update - Clemens Ladisch <clemens@ladisch.de>
#   Intel8x0 driver
#   20-bit sample format support
# 
# sound/pci/intel8x0.c
#   2004/04/05 05:29:05+02:00 perex@suse.cz +26 -11
#   ALSA CVS update
#   D:2004/04/05 11:29:05
#   C:Intel8x0 driver
#   A:Clemens Ladisch <clemens@ladisch.de>
#   F:pci/intel8x0.c:1.129->1.130 
#   L:20-bit sample format support
# 
# ChangeSet
#   2004/04/24 15:45:45+02:00 perex@suse.cz 
#   ALSA CVS update - Clemens Ladisch <clemens@ladisch.de>
#   AC97 Codec Core
#   fix access to wrong register when clearing powerdown bits
# 
# sound/pci/ac97/ac97_codec.c
#   2004/04/05 05:23:34+02:00 perex@suse.cz +2 -2
#   ALSA CVS update
#   D:2004/04/05 11:23:34
#   C:AC97 Codec Core
#   A:Clemens Ladisch <clemens@ladisch.de>
#   F:pci/ac97/ac97_codec.c:1.126->1.127 
#   L:fix access to wrong register when clearing powerdown bits
# 
# ChangeSet
#   2004/04/24 15:45:26+02:00 perex@suse.cz 
#   ALSA CVS update - Takashi Iwai <tiwai@suse.de>
#   AC97 Codec Core
#   - fixed the possibl ac97 register cache mismatch.
#   - added the detection of spdif sample rates.
# 
# sound/pci/ac97/ac97_pcm.c
#   2004/04/04 11:03:59+02:00 perex@suse.cz +1 -1
#   ALSA CVS update
#   D:2004/04/04 17:03:58
#   C:AC97 Codec Core
#   A:Takashi Iwai <tiwai@suse.de>
#   F:pci/ac97/ac97_codec.c:1.125->1.126 
#   F:pci/ac97/ac97_pcm.c:1.12->1.13 
#   L:- fixed the possibl ac97 register cache mismatch.
#   L:- added the detection of spdif sample rates.
# 
# sound/pci/ac97/ac97_codec.c
#   2004/04/04 11:03:58+02:00 perex@suse.cz +44 -15
#   ALSA CVS update
#   D:2004/04/04 17:03:58
#   C:AC97 Codec Core
#   A:Takashi Iwai <tiwai@suse.de>
#   F:pci/ac97/ac97_codec.c:1.125->1.126 
#   F:pci/ac97/ac97_pcm.c:1.12->1.13 
#   L:- fixed the possibl ac97 register cache mismatch.
#   L:- added the detection of spdif sample rates.
# 
# ChangeSet
#   2004/04/24 15:45:05+02:00 perex@suse.cz 
#   ALSA CVS update - Takashi Iwai <tiwai@suse.de>
#   ATIIXP driver
#   - fixed SPDIF support.
#     restricted only 48k sample rate.
#   - fixed the address assignment for bigendian (not existing, though)
# 
# sound/pci/atiixp.c
#   2004/04/04 11:02:43+02:00 perex@suse.cz +82 -43
#   ALSA CVS update
#   D:2004/04/04 17:02:43
#   C:ATIIXP driver
#   A:Takashi Iwai <tiwai@suse.de>
#   F:pci/atiixp.c:1.1->1.2 
#   L:- fixed SPDIF support.
#   L:  restricted only 48k sample rate.
#   L:- fixed the address assignment for bigendian (not existing, though)
# 
# ChangeSet
#   2004/04/24 15:44:47+02:00 perex@suse.cz 
#   ALSA CVS update - Takashi Iwai <tiwai@suse.de>
#   VIA82xx driver
#   added dxs_support and ac97_quirk entries for Amira notebook.
# 
# sound/pci/via82xx.c
#   2004/04/04 11:01:15+02:00 perex@suse.cz +7 -0
#   ALSA CVS update
#   D:2004/04/04 17:01:15
#   C:VIA82xx driver
#   A:Takashi Iwai <tiwai@suse.de>
#   F:pci/via82xx.c:1.93->1.94 
#   L:added dxs_support and ac97_quirk entries for Amira notebook.
# 
# ChangeSet
#   2004/04/24 15:44:24+02:00 perex@suse.cz 
#   ALSA CVS update - Jaroslav Kysela <perex@suse.cz>
#   ALSA Version
#   release: 1.0.4
# 
# include/sound/version.h
#   2004/04/03 03:40:57+02:00 perex@suse.cz +1 -1
#   ALSA CVS update
#   D:2004/04/03 10:40:57
#   C:ALSA Version
#   A:Jaroslav Kysela <perex@suse.cz>
#   F:include/version.h:1.40->1.41 
#   L:release: 1.0.4
# 
# ChangeSet
#   2004/04/24 15:44:04+02:00 perex@suse.cz 
#   ALSA CVS update - Jaroslav Kysela <perex@suse.cz>
#   PCMCIA Kconfig
#   SND_PDAUDIOCF depends on SND_PCM
# 
# sound/pcmcia/Kconfig
#   2004/04/03 02:33:33+02:00 perex@suse.cz +1 -0
#   ALSA CVS update
#   D:2004/04/03 09:33:33
#   C:PCMCIA Kconfig
#   A:Jaroslav Kysela <perex@suse.cz>
#   F:pcmcia/Kconfig:1.6->1.7 
#   L:SND_PDAUDIOCF depends on SND_PCM
# 
# ChangeSet
#   2004/04/24 15:43:44+02:00 perex@suse.cz 
#   ALSA CVS update - Jaroslav Kysela <perex@suse.cz>
#   CS4281 driver
#   Added retry_count
# 
# sound/pci/cs4281.c
#   2004/04/03 02:32:56+02:00 perex@suse.cz +4 -0
#   ALSA CVS update
#   D:2004/04/03 09:32:56
#   C:CS4281 driver
#   A:Jaroslav Kysela <perex@suse.cz>
#   F:pci/cs4281.c:1.49->1.50 
#   L:Added retry_count
# 
# ChangeSet
#   2004/04/24 14:33:02+02:00 perex@suse.cz 
#   Cleanups for Aureal PCI IDs.
# 
# include/linux/pci_ids.h
#   2004/04/24 14:32:50+02:00 perex@suse.cz +2 -3
#   Cleanups for Aureal PCI IDs.
# 
# ChangeSet
#   2004/04/01 11:34:39+02:00 perex@suse.cz 
#   Fixed ALSA aureal driver compilation - wrong and missing PCI IDs
# 
# sound/pci/au88x0/au88x0.h
#   2004/04/01 11:34:27+02:00 perex@suse.cz +2 -2
#   sync with pci_ids.h
# 
# sound/pci/au88x0/au8830.c
#   2004/04/01 11:34:27+02:00 perex@suse.cz +1 -1
#   Sync with pci_ids.h
# 
# sound/pci/au88x0/au8820.c
#   2004/04/01 11:34:27+02:00 perex@suse.cz +1 -1
#   Sync with pci_ids.h
# 
# include/linux/pci_ids.h
#   2004/04/01 11:34:26+02:00 perex@suse.cz +1 -0
#   Added PCI_DEVICE_ID_AUREAL_ADVANTAGE
# 
diff -Nru a/Documentation/BK-usage/bk-kernel-howto.txt b/Documentation/BK-usage/bk-kernel-howto.txt
--- a/Documentation/BK-usage/bk-kernel-howto.txt	2004-05-26 15:01:36 -07:00
+++ b/Documentation/BK-usage/bk-kernel-howto.txt	2004-05-26 15:01:36 -07:00
@@ -279,5 +279,5 @@
    for my long-lived kernel branch?
 A. Yes.  This requires BK 3.x, though.
 
-	bk export -tpatch -r`bk repogca http://linux.bkbits.net/linux-2.5`,+
+	bk export -tpatch -r`bk repogca bk://linux.bkbits.net/linux-2.5`,+
 
diff -Nru a/Documentation/BK-usage/gcapatch b/Documentation/BK-usage/gcapatch
--- a/Documentation/BK-usage/gcapatch	2004-05-26 15:01:36 -07:00
+++ b/Documentation/BK-usage/gcapatch	2004-05-26 15:01:36 -07:00
@@ -5,4 +5,4 @@
 # Usage: gcapatch > foo.patch
 #
 
-bk export -tpatch -hdu -r`bk repogca http://linux.bkbits.net/linux-2.5`,+
+bk export -tpatch -hdu -r`bk repogca bk://linux.bkbits.net/linux-2.5`,+
diff -Nru a/Documentation/laptop-mode.txt b/Documentation/laptop-mode.txt
--- a/Documentation/laptop-mode.txt	2004-05-26 15:01:36 -07:00
+++ b/Documentation/laptop-mode.txt	2004-05-26 15:01:36 -07:00
@@ -279,7 +279,13 @@
 	fi
 }
 
-KLEVEL="$(uname -r | cut -c1-3)"
+KLEVEL=$(
+           uname -r |
+             (
+	       IFS="." read a b c
+	       echo $a.$b
+	     )
+	 )
 case "$KLEVEL" in
 	"2.4"|"2.6")
 		true
@@ -496,7 +502,7 @@
 
 case $status in
         "on-line")
-                echo "Setting HD spindown to 2 hours"
+                echo "Setting HD spindown for AC mode."
                 /sbin/laptop_mode stop
                 /sbin/hdparm -S $ACAD_HD /dev/hda > /dev/null 2>&1
                 /sbin/hdparm -B 255 /dev/hda > /dev/null 2>&1
@@ -504,7 +510,7 @@
                 exit 0
         ;;
         "off-line")
-                echo "Setting HD spindown to 20 seconds"
+                echo "Setting HD spindown for battery mode."
                 /sbin/laptop_mode start
                 /sbin/hdparm -S $BATT_HD /dev/hda > /dev/null 2>&1
                 /sbin/hdparm -B 1 /dev/hda > /dev/null 2>&1
diff -Nru a/Documentation/networking/bridge.txt b/Documentation/networking/bridge.txt
--- a/Documentation/networking/bridge.txt	2004-05-26 15:01:36 -07:00
+++ b/Documentation/networking/bridge.txt	2004-05-26 15:01:36 -07:00
@@ -1,11 +1,8 @@
-In order to use the ethernet bridging functionality you'll need the
-userspace tools available at http://www.math.leidenuniv.nl/~buytenh/bridge.
-The tarball available there contains extensive documentation, but if you
-still have questions, don't hesitate to post to the mailing list (more info
-at http://www.math.leidenuniv.nl/mailman/listinfo/bridge). You can also
-mail me at buytenh@gnu.org.
+In order to use the Ethernet bridging functionality, you'll need the
+userspace tools. These programs and documentation are available
+at http://bridge.sourceforge.net.  The download page is
+http://prdownloads.sourceforge.net/bridge.
 
+If you still have questions, don't hesitate to post to the mailing list 
+(more info http://lists.osdl.org/mailman/listinfo/bridge).
 
-
-Lennert Buytenhek
-<buytenh@gnu.org>
diff -Nru a/Documentation/sound/alsa/ALSA-Configuration.txt b/Documentation/sound/alsa/ALSA-Configuration.txt
--- a/Documentation/sound/alsa/ALSA-Configuration.txt	2004-05-26 15:01:35 -07:00
+++ b/Documentation/sound/alsa/ALSA-Configuration.txt	2004-05-26 15:01:35 -07:00
@@ -416,7 +416,8 @@
 	* Creative Card w/Digital out + Digital I/O 2	[0x0fc3/0x1f0f]
 	* Creative Card w/Digital CD in + Digital I/O 2	[0x0fcf/0x1f0f]
         * Creative Card 5.1/w Digital out + LiveDrive	[0x3fc3/0x1fff]
-        * Creative Card all ins and outs		[0x3fff/0x1fff]
+	* Creative Card 5.1 (c) 2003			[0x3fc3/0x7cff]
+        * Creative Card all ins and outs		[0x3fff/0x7fff]
     
   Module snd-ens1370
   ------------------
@@ -609,6 +610,10 @@
                         * Hoontech SoundTrack DSP 24 Media 7.1
                         * Digigram VX442
 
+    model       - Use the given board model, one of the following:
+		  delta1010, dio2496, delta66, delta44, audiophile, delta410,
+		  delta1010lt, vx442, ewx2496, ews88mt, ews88mt_new, ews88d,
+		  dmx6fire, dsp24, dsp24_71, ez8
     omni	- Omni I/O support for MidiMan M-Audio Delta44/66
     cs8427_timeout - reset timeout for the CS8427 chip (S/PDIF transciever)
                      in msec resolution, default value is 500 (0.5 sec)
@@ -625,6 +630,9 @@
 			* AMP Ltd AUDIO2000
 			* TerraTec Aureon Sky-5.1, Space-7.1
 
+    model       - Use the given board model, one of the following:
+		  revo71, amp2000, prodigy71, aureon51, aureon71
+
     Module supports up to 8 cards and autoprobe.
 
   Module snd-intel8x0
@@ -787,6 +795,8 @@
 
     Module supports autoprobe and multiple chips (max 8).
 
+    The power-management is supported.
+
     Note: on some notebooks the buffer address cannot be detected
     automatically, or causes hang-up during initialization.
     In such a case, specify the buffer top address explicity via
@@ -796,9 +806,24 @@
       Sony F270: buffer_top=0x272800
     The driver supports only ac97 codec.  It's possible to force
     to initialize/use ac97 although it's not detected.  In such a
-    case, use force_ac97=1 option.
+    case, use force_ac97=1 option - but *NO* guarantee whether it
+    works!
 
-    The power-management is supported.
+    Note: The NM256 chip can be linked internally with non-AC97
+    codecs.  This driver supports only the AC97 codec, and won't work
+    with machines with other (most likely CS423x or OPL3SAx) chips,
+    even though the device is detected in lspci.  In such a case, try
+    other drivers, e.g. snd-cs4232 or snd-opl3sa2.  Some has ISA-PnP
+    but some doesn't have ISA PnP.  You'll need to speicfy isapnp=0
+    and proper hardware parameters in the case without ISA PnP.
+
+    Note: This driver is really crappy.  It's a porting from the
+    OSS driver, which is a result of black-magic reverse engineering.
+    The detection of codec will fail if the driver is loaded *after*
+    X-server as described above.  You might be able to force to load
+    the module, but it may result in hang-up.   Hence, make sure that
+    you load this module *before* X if you encounter this kind of
+    problem.
 
   Module snd-opl3sa2
   ------------------
diff -Nru a/Documentation/sound/alsa/Audigy-mixer.txt b/Documentation/sound/alsa/Audigy-mixer.txt
--- /dev/null	Wed Dec 31 16:00:00 196900
+++ b/Documentation/sound/alsa/Audigy-mixer.txt	2004-05-26 15:01:36 -07:00
@@ -0,0 +1,345 @@
+
+		Sound Blaster Audigy mixer / default DSP code
+		===========================================
+
+This is based on SB-Live-mixer.txt.
+
+The EMU10K2 chips have a DSP part which can be programmed to support 
+various ways of sample processing, which is described here.
+(This acticle does not deal with the overall functionality of the 
+EMU10K2 chips. See the manuals section for further details.)
+
+The ALSA driver programs this portion of chip by default code
+(can be altered later) which offers the following functionality:
+
+
+1) Digital mixer controls
+-------------------------
+
+These controls are built using the DSP instructions. They offer extended
+functionality. Only the default build-in code in the ALSA driver is described
+here. Note that the controls work as attenuators: the maximum value is the 
+neutral position leaving the signal unchanged. Note that if the  same destination 
+is mentioned in multiple controls, the signal is accumulated and can be wrapped 
+(set to maximal or minimal value without checking of overflow).
+
+
+Explanation of used abbreviations:
+
+DAC    - digital to analog converter
+ADC    - analog to digital converter
+I2S    - one-way three wire serial bus for digital sound by Philips Semiconductors
+         (this standard is used for connecting standalone DAC and ADC converters)
+LFE    - low frequency effects (subwoofer signal)
+AC97   - a chip containing an analog mixer, DAC and ADC converters
+IEC958 - S/PDIF
+FX-bus - the EMU10K2 chip has an effect bus containing 64 accumulators.
+         Each of the synthesizer voices can feed its output to these accumulators
+         and the DSP microcontroller can operate with the resulting sum.
+
+name='PCM Front Playback Volume',index=0
+
+This control is used to attenuate samples for left and right front PCM FX-bus
+accumulators. ALSA uses accumulators 8 and 9 for left and right front PCM 
+samples for 5.1 playback. The result samples are forwarded to the front DAC PCM 
+slots of the Philips DAC.
+
+name='PCM Surround Playback Volume',index=0
+
+This control is used to attenuate samples for left and right surround PCM FX-bus
+accumulators. ALSA uses accumulators 2 and 3 for left and right surround PCM 
+samples for 5.1 playback. The result samples are forwarded to the surround DAC PCM 
+slots of the Philips DAC.
+
+name='PCM Center Playback Volume',index=0
+
+This control is used to attenuate samples for center PCM FX-bus accumulator.
+ALSA uses accumulator 6 for center PCM sample for 5.1 playback. The result sample
+is forwarded to the center DAC PCM slot of the Philips DAC.
+
+name='PCM LFE Playback Volume',index=0
+
+This control is used to attenuate sample for LFE PCM FX-bus accumulator. 
+ALSA uses accumulator 7 for LFE PCM sample for 5.1 playback. The result sample 
+is forwarded to the LFE DAC PCM slot of the Philips DAC.
+
+name='PCM Playback Volume',index=0
+
+This control is used to attenuate samples for left and right PCM FX-bus
+accumulators. ALSA uses accumulators 0 and 1 for left and right PCM samples for
+stereo playback. The result samples are forwarded to the front DAC PCM slots 
+of the Philips DAC.
+
+name='PCM Capture Volume',index=0
+
+This control is used to attenuate samples for left and right PCM FX-bus
+accumulator. ALSA uses accumulators 0 and 1 for left and right PCM.
+The result is forwarded to the ADC capture FIFO (thus to the standard capture
+PCM device).
+
+name='Music Playback Volume',index=0
+
+This control is used to attenuate samples for left and right MIDI FX-bus
+accumulators. ALSA uses accumulators 4 and 5 for left and right MIDI samples.
+The result samples are forwarded to the front DAC PCM slots of the AC97 codec.
+
+name='Music Capture Volume',index=0
+
+These controls are used to attenuate samples for left and right MIDI FX-bus
+accumulator. ALSA uses accumulators 4 and 5 for left and right PCM.
+The result is forwarded to the ADC capture FIFO (thus to the standard capture
+PCM device).
+
+name='Mic Playback Volume',index=0
+
+This control is used to attenuate samples for left and right Mic input.
+For Mic input is used AC97 codec. The result samples are forwarded to 
+the front DAC PCM slots of the Philips DAC. Samples are forwarded to Mic
+capture FIFO (device 1 - 16bit/8KHz mono) too without volume control.
+
+name='Mic Capture Volume',index=0
+
+This control is used to attenuate samples for left and right Mic input.
+The result is forwarded to the ADC capture FIFO (thus to the standard capture
+PCM device).
+
+name='Audigy CD Playback Volume',index=0
+
+This control is used to attenuate samples from left and right IEC958 TTL
+digital inputs (usually used by a CDROM drive). The result samples are
+forwarded to the front DAC PCM slots of the Philips DAC.
+
+name='Audigy CD Capture Volume',index=0
+
+This control is used to attenuate samples from left and right IEC958 TTL
+digital inputs (usually used by a CDROM drive). The result samples are
+forwarded to the ADC capture FIFO (thus to the standard capture PCM device).
+
+name='IEC958 Optical Playback Volume',index=0
+
+This control is used to attenuate samples from left and right IEC958 optical
+digital input. The result samples are forwarded to the front DAC PCM slots
+of the Philips DAC.
+
+name='IEC958 Optical Capture Volume',index=0
+
+This control is used to attenuate samples from left and right IEC958 optical
+digital inputs. The result samples are forwarded to the ADC capture FIFO
+(thus to the standard capture PCM device).
+
+name='Line2 Playback Volume',index=0
+
+This control is used to attenuate samples from left and right I2S ADC
+inputs (on the AudigyDrive). The result samples are forwarded to the front
+DAC PCM slots of the Philips DAC.
+
+name='Line2 Capture Volume',index=1
+
+This control is used to attenuate samples from left and right I2S ADC
+inputs (on the AudigyDrive). The result samples are forwarded to the ADC
+capture FIFO (thus to the standard capture PCM device).
+
+name='Analog Mix Playback Volume',index=0
+
+This control is used to attenuate samples from left and right I2S ADC
+inputs from Philips ADC. The result samples are forwarded to the front
+DAC PCM slots of the Philips DAC. This contains mix from analog sources
+like CD, Line In, Aux, ....
+
+name='Analog Mix Capture Volume',index=1
+
+This control is used to attenuate samples from left and right I2S ADC
+inputs Philips ADC. The result samples are forwarded to the ADC
+capture FIFO (thus to the standard capture PCM device).
+
+name='Aux2 Playback Volume',index=0
+
+This control is used to attenuate samples from left and right I2S ADC
+inputs (on the AudigyDrive). The result samples are forwarded to the front
+DAC PCM slots of the Philips DAC.
+
+name='Aux2 Capture Volume',index=1
+
+This control is used to attenuate samples from left and right I2S ADC
+inputs (on the AudigyDrive). The result samples are forwarded to the ADC
+capture FIFO (thus to the standard capture PCM device).
+
+name='Front Playback Volume',index=0
+
+All stereo signals are mixed together and mirrored to surround, center and LFE.
+This control is used to attenuate samples for left and right front speakers of
+this mix.
+
+name='Surround Playback Volume',index=0
+
+All stereo signals are mixed together and mirrored to surround, center and LFE.
+This control is used to attenuate samples for left and right surround speakers of
+this mix.
+
+name='Center Playback Volume',index=0
+
+All stereo signals are mixed together and mirrored to surround, center and LFE.
+This control is used to attenuate sample for center speaker of this mix.
+
+name='LFE Playback Volume',index=0
+
+All stereo signals are mixed together and mirrored to surround, center and LFE.
+This control is used to attenuate sample for LFE speaker of this mix.
+
+name='Tone Control - Switch',index=0
+
+This control turns the tone control on or off. The samples for front, rear
+and center / LFE outputs are affected.
+
+name='Tone Control - Bass',index=0
+
+This control sets the bass intensity. There is no neutral value!!
+When the tone control code is activated, the samples are always modified.
+The closest value to pure signal is 20.
+
+name='Tone Control - Treble',index=0
+
+This control sets the treble intensity. There is no neutral value!!
+When the tone control code is activated, the samples are always modified.
+The closest value to pure signal is 20.
+
+name='Master Playback Volume',index=0
+
+This control is used to attenuate samples for front, surround, center and 
+LFE outputs.
+
+name='IEC958 Optical Raw Playback Switch',index=0
+
+If this switch is on, then the samples for the IEC958 (S/PDIF) digital
+output are taken only from the raw FX8010 PCM, otherwise standard front
+PCM samples are taken.
+
+
+2) PCM stream related controls
+------------------------------
+
+name='EMU10K1 PCM Volume',index 0-31
+
+Channel volume attenuation in range 0-0xffff. The maximum value (no
+attenuation) is default. The channel mapping for three values is
+as follows:
+
+	0 - mono, default 0xffff (no attenuation)
+	1 - left, default 0xffff (no attenuation)
+	2 - right, default 0xffff (no attenuation)
+
+name='EMU10K1 PCM Send Routing',index 0-31
+
+This control specifies the destination - FX-bus accumulators. There 24
+values with this mapping:
+
+	 0 -  mono, A destination (FX-bus 0-63), default 0
+	 1 -  mono, B destination (FX-bus 0-63), default 1
+	 2 -  mono, C destination (FX-bus 0-63), default 2
+	 3 -  mono, D destination (FX-bus 0-63), default 3
+	 4 -  mono, E destination (FX-bus 0-63), default 0
+	 5 -  mono, F destination (FX-bus 0-63), default 0
+	 6 -  mono, G destination (FX-bus 0-63), default 0
+	 7 -  mono, H destination (FX-bus 0-63), default 0
+	 8 -  left, A destination (FX-bus 0-63), default 0
+	 9 -  left, B destination (FX-bus 0-63), default 1
+	10 -  left, C destination (FX-bus 0-63), default 2
+	11 -  left, D destination (FX-bus 0-63), default 3
+	12 -  left, E destination (FX-bus 0-63), default 0
+	13 -  left, F destination (FX-bus 0-63), default 0
+	14 -  left, G destination (FX-bus 0-63), default 0
+	15 -  left, H destination (FX-bus 0-63), default 0
+	16 - right, A destination (FX-bus 0-63), default 0
+	17 - right, B destination (FX-bus 0-63), default 1
+	18 - right, C destination (FX-bus 0-63), default 2
+	19 - right, D destination (FX-bus 0-63), default 3
+	20 - right, E destination (FX-bus 0-63), default 0
+	21 - right, F destination (FX-bus 0-63), default 0
+	22 - right, G destination (FX-bus 0-63), default 0
+	23 - right, H destination (FX-bus 0-63), default 0
+
+Don't forget that it's illegal to assign a channel to the same FX-bus accumulator 
+more than once (it means 0=0 && 1=0 is an invalid combination).
+ 
+name='EMU10K1 PCM Send Volume',index 0-31
+
+It specifies the attenuation (amount) for given destination in range 0-255.
+The channel mapping is following:
+
+	 0 -  mono, A destination attn, default 255 (no attenuation)
+	 1 -  mono, B destination attn, default 255 (no attenuation)
+	 2 -  mono, C destination attn, default 0 (mute)
+	 3 -  mono, D destination attn, default 0 (mute)
+	 4 -  mono, E destination attn, default 0 (mute)
+	 5 -  mono, F destination attn, default 0 (mute)
+	 6 -  mono, G destination attn, default 0 (mute)
+	 7 -  mono, H destination attn, default 0 (mute)
+	 8 -  left, A destination attn, default 255 (no attenuation)
+	 9 -  left, B destination attn, default 0 (mute)
+	10 -  left, C destination attn, default 0 (mute)
+	11 -  left, D destination attn, default 0 (mute)
+	12 -  left, E destination attn, default 0 (mute)
+	13 -  left, F destination attn, default 0 (mute)
+	14 -  left, G destination attn, default 0 (mute)
+	15 -  left, H destination attn, default 0 (mute)
+	16 - right, A destination attn, default 0 (mute)
+	17 - right, B destination attn, default 255 (no attenuation)
+	18 - right, C destination attn, default 0 (mute)
+	19 - right, D destination attn, default 0 (mute)
+	20 - right, E destination attn, default 0 (mute)
+	21 - right, F destination attn, default 0 (mute)
+	22 - right, G destination attn, default 0 (mute)
+	23 - right, H destination attn, default 0 (mute)
+
+
+
+4) MANUALS/PATENTS:
+-------------------
+
+ftp://opensource.creative.com/pub/doc
+-------------------------------------
+
+        Files:
+        LM4545.pdf      AC97 Codec
+
+        m2049.pdf       The EMU10K1 Digital Audio Processor
+
+        hog63.ps        FX8010 - A DSP Chip Architecture for Audio Effects
+
+
+WIPO Patents
+------------
+        Patent numbers:
+        WO 9901813 (A1) Audio Effects Processor with multiple asynchronous (Jan. 14, 1999)
+                        streams
+
+        WO 9901814 (A1) Processor with Instruction Set for Audio Effects (Jan. 14, 1999)
+
+        WO 9901953 (A1) Audio Effects Processor having Decoupled Instruction
+                        Execution and Audio Data Sequencing (Jan. 14, 1999)
+
+
+US Patents (http://www.uspto.gov/)
+----------------------------------
+
+        US 5925841      Digital Sampling Instrument employing cache memory (Jul. 20, 1999)
+
+        US 5928342      Audio Effects Processor integrated on a single chip (Jul. 27, 1999)
+                        with a multiport memory onto which multiple asynchronous
+                        digital sound samples can be concurrently loaded
+
+        US 5930158      Processor with Instruction Set for Audio Effects (Jul. 27, 1999)
+
+        US 6032235      Memory initialization circuit (Tram) (Feb. 29, 2000)
+
+        US 6138207      Interpolation looping of audio samples in cache connected to    (Oct. 24, 2000)
+                        system bus with prioritization and modification of bus transfers
+                        in accordance with loop ends and minimum block sizes
+
+        US 6151670      Method for conserving memory storage using a (Nov. 21, 2000)
+                        pool of  short term memory registers
+
+        US 6195715      Interrupt control for multiple programs communicating with      (Feb. 27, 2001)
+                        a common interrupt by associating programs to GP registers,
+                        defining interrupt register, polling GP registers, and invoking
+                        callback routine associated with defined interrupt register
diff -Nru a/Documentation/sound/alsa/CMIPCI.txt b/Documentation/sound/alsa/CMIPCI.txt
--- a/Documentation/sound/alsa/CMIPCI.txt	2004-05-26 15:01:35 -07:00
+++ b/Documentation/sound/alsa/CMIPCI.txt	2004-05-26 15:01:35 -07:00
@@ -180,8 +180,8 @@
 device automatically to the previous state.
 
 On the model 033, AC3 is implemented by the software conversion in
-the driver.  This prevents the mmap support.  If you need mmap
-support, pass the "soft_ac3=0" module option.  This doesn't matter
+the alsa-lib.  If you need to bypass the software conversion of IEC958
+subframes, pass the "soft_ac3=0" module option.  This doesn't matter
 on the newer models.
 
 
diff -Nru a/Documentation/sound/alsa/DocBook/writing-an-alsa-driver.tmpl b/Documentation/sound/alsa/DocBook/writing-an-alsa-driver.tmpl
--- a/Documentation/sound/alsa/DocBook/writing-an-alsa-driver.tmpl	2004-05-26 15:01:35 -07:00
+++ b/Documentation/sound/alsa/DocBook/writing-an-alsa-driver.tmpl	2004-05-26 15:01:35 -07:00
@@ -511,7 +511,7 @@
           }
 
           // (7)
-          pci_set_drvdata(pci, chip);
+          pci_set_drvdata(pci, card);
           dev++;
           return 0;
   }
@@ -519,10 +519,7 @@
   // destructor -- see "Destructor" sub-section
   static void __devexit snd_mychip_remove(struct pci_dev *pci)
   {
-          mychip_t *chip = snd_magic_cast(mychip_t,
-                                     pci_get_drvdata(pci), return);
-          if (chip)
-                  snd_card_free(chip->card);
+          snd_card_free(pci_get_drvdata(pci));
           pci_set_drvdata(pci, NULL);
   }
 ]]>
@@ -691,21 +688,16 @@
           <informalexample>
             <programlisting>
 <![CDATA[
-        pci_set_drvdata(pci, chip);
+        pci_set_drvdata(pci, card);
         dev++;
         return 0;
 ]]>
             </programlisting>
           </informalexample>
 
-          In the above, the chip record is stored. This pointer is
+          In the above, the card record is stored. This pointer is
         referred in the remove callback and power-management
         callbacks, too. 
-	If the card doesn't support the suspend/resume, you can store
-        the card pointer instead of the chip pointer, so that
-        <function>snd_card_free</function> can be called directly
-        without cast in the remove callback.  But anyway, be sure
-        which pointer is used.
         </para>
       </section>
     </section>
@@ -726,21 +718,15 @@
 <![CDATA[
   static void __devexit snd_mychip_remove(struct pci_dev *pci)
   {
-          mychip_t *chip = snd_magic_cast(mychip_t,
-                                    pci_get_drvdata(pci), return);
-          if (chip)
-                  snd_card_free(chip->card);
+          snd_card_free(pci_get_drvdata(pci));
           pci_set_drvdata(pci, NULL);
   }
 ]]>
           </programlisting>
         </informalexample>
 
-        The above code assumes that the chip is allocated
-	with snd_magic stuff and
-      has the field to hold the card pointer (see <link
-      linkend="card-management"><citetitle>the next
-      section</citetitle></link>). 
+        The above code assumes that the card pointer is set to the PCI
+	driver data.
       </para>
     </section>
 
@@ -1355,16 +1341,7 @@
   // initialization of the module
   static int __init alsa_card_mychip_init(void)
   {
-          int err;
-
-          if ((err = pci_module_init(&driver)) < 0) {
-  #ifdef MODULE
-                  printk(KERN_ERR "My chip soundcard not found "
-                                  "or device busy\n");
-  #endif
-                  return err;
-          }
-          return 0;
+          return pci_module_init(&driver);
   }
 
   // clean up the module
@@ -1781,16 +1758,7 @@
 <![CDATA[
   static int __init alsa_card_mychip_init(void)
   {
-          int err;
-
-          if ((err = pci_module_init(&driver)) < 0) {
-  #ifdef MODULE
-                  printk(KERN_ERR "My chip soundcard not found"
-                                  " or device busy\n");
-  #endif
-                  return err;
-          }
-          return 0;
+          return pci_module_init(&driver);
   }
 
   static void __exit alsa_card_mychip_exit(void)
@@ -5254,47 +5222,23 @@
     </para>
 
     <para>
-      Basic jobs of suspend/resume are done in
-      <structfield>suspend</structfield> and
-      <structfield>resume</structfield> callbacks of
-      <structname>pci_driver</structname> struct. Unfortunately, the
-      API of these callbacks was changed at the middle time of Linux
-      2.4.x, if you want to keep the support for older kernels, you
-      have to write two different callbacks. The example below is the
-      skeleton callbacks which just call the real suspend and resume
-      functions. 
+      ALSA provides the common power-management layer. Each card driver
+      needs to have only low-level suspend and resume callbacks.
 
       <informalexample>
         <programlisting>
 <![CDATA[
-  #ifndef PCI_OLD_SUSPEND
-  static int snd_my_suspend(struct pci_dev *dev, u32 state)
+  #ifdef CONFIG_PM
+  static int snd_my_suspend(snd_card_t *card, unsigned int state)
   {
-          mychip_t *chip = snd_magic_cast(mychip_t,
-                             pci_get_drvdata(dev), return -ENXIO);
-          mychip_suspend(chip);
+          .... // do things for suspsend
           return 0;
   }
-  static int snd_my_resume(struct pci_dev *dev)
+  static int snd_my_resume(snd_card_t *card, unsigned int state)
   {
-          mychip_t *chip = snd_magic_cast(mychip_t,
-                             pci_get_drvdata(dev), return -ENXIO);
-          mychip_resume(chip);
+          .... // do things for suspsend
           return 0;
   }
-  #else
-  static void snd_my_suspend(struct pci_dev *dev)
-  {
-          mychip_t *chip = snd_magic_cast(mychip_t,
-                             pci_get_drvdata(dev), return);
-          mychip_suspend(chip);
-  }
-  static void snd_mychip_resume(struct pci_dev *dev)
-  {
-          mychip_t *chip = snd_magic_cast(mychip_t,
-                             pci_get_drvdata(dev), return);
-          mychip_resume(chip);
-  }
   #endif
 ]]>
         </programlisting>
@@ -5302,17 +5246,10 @@
     </para>
 
     <para>
-      For keeping the readability of 2.6 source code, it's recommended to
-      separate the above ifdef condition as the patch file in alsa-driver
-      directory.
-      See <filename>alsa-driver/pci/ali5451.c</filename> for example.
-   </para>
-
-    <para>
       The scheme of the real suspend job is as following.
 
       <orderedlist>
-        <listitem><para>Check whether the power-state is already D3hot. If yes, skip the job.</para></listitem>
+        <listitem><para>Retrieve the chip data from pm_private_data field.</para></listitem>
         <listitem><para>Call <function>snd_pcm_suspend_all()</function> to suspend the running PCM streams.</para></listitem>
         <listitem><para>Save the register values if necessary.</para></listitem>
         <listitem><para>Stop the hardware if necessary.</para></listitem>
@@ -5326,12 +5263,11 @@
       <informalexample>
         <programlisting>
 <![CDATA[
-  static void mychip_suspend(mychip_t *chip)
+  static int mychip_suspend(snd_card_t *card, unsigned int state)
   {
-          snd_card_t *card = chip->card;
           // (1)
-          if (card->power_state == SNDRV_CTL_POWER_D3hot)
-                  return;
+          mychip_t *chip = snd_magic_cast(mychip_t, card->pm_private_data,
+                                          return -ENXIO);
           // (2)
           snd_pcm_suspend_all(chip->pcm);
           // (3)
@@ -5340,6 +5276,7 @@
           snd_mychip_stop_hardware(chip);
           // (5)
           snd_power_change_state(card, SNDRV_CTL_POWER_D3hot);
+          return 0;
   }
 ]]>
         </programlisting>
@@ -5350,8 +5287,7 @@
     The scheme of the real resume job is as following.
 
     <orderedlist>
-    <listitem><para>Check whether the power-state is already D0.
-    If yes, skip the job.</para></listitem>
+    <listitem><para>Retrieve the chip data from pm_private_data field.</para></listitem>
     <listitem><para>Enable the pci device again by calling
     <function>pci_enable_device()</function>.</para></listitem>
     <listitem><para>Re-initialize the chip.</para></listitem>
@@ -5372,10 +5308,9 @@
 <![CDATA[
   static void mychip_resume(mychip_t *chip)
   {
-          snd_card_t *card = chip->card;
           // (1)
-          if (card->power_state == SNDRV_CTL_POWER_D0)
-                  return;
+          mychip_t *chip = snd_magic_cast(mychip_t, card->pm_private_data,
+                                          return -ENXIO);
           // (2)
           pci_enable_device(chip->pci);
           // (3)
@@ -5388,38 +5323,6 @@
           snd_mychip_restart_chip(chip);
           // (7)
           snd_power_change_state(card, SNDRV_CTL_POWER_D0);
-  }
-]]>
-        </programlisting>
-      </informalexample>
-    </para>
-
-    <para>
-      In addition to the callbacks above, you should define a callback
-      for the changes via the ALSA control interface. It's defined
-      like below: 
-
-      <informalexample>
-        <programlisting>
-<![CDATA[
-  static int snd_mychip_set_power_state(snd_card_t *card,
-                                        unsigned int power_state)
-  {
-          mychip_t *chip = snd_magic_cast(mychip_t,
-                   card->power_state_private_data, return -ENXIO);
-          switch (power_state) {
-          case SNDRV_CTL_POWER_D0:
-          case SNDRV_CTL_POWER_D1:
-          case SNDRV_CTL_POWER_D2:
-                  mychip_resume(chip);
-                  break;
-          case SNDRV_CTL_POWER_D3hot:
-          case SNDRV_CTL_POWER_D3cold:
-                  mychip_suspend(chip);
-                  break;
-          default:
-                  return -EINVAL;
-          }
           return 0;
   }
 ]]>
@@ -5439,41 +5342,42 @@
   {
           ....
           snd_card_t *card;
+          mychip_t *chip;
           ....
-  #ifdef CONFIG_PM
-          card->set_power_state = snd_mychip_set_power_state;
-          card->power_state_private_data = chip;
-  #endif
+          snd_card_set_pm_callback(card, snd_my_suspend, snd_my_resume, chip);
           ....
   }
 ]]>
         </programlisting>
       </informalexample>
+
+    Here you don't have to put ifdef CONFIG_PM around, since it's already
+    checked in the header and expanded to empty if not needed.
     </para>
 
     <para>
       If you need a space for saving the registers, you'll need to
-    allocate the buffer for it here, too, since you cannot call
-    <function>kmalloc()</function> with
-    <constant>GFP_KERNEL</constant> flag or
-    <function>vmalloc()</function> in the suspend callback.
+    allocate the buffer for it here, too, since it would be fatal
+    if you cannot allocate a memory in the suspend phase.
     The allocated buffer should be released in the corresponding
     destructor.
     </para>
 
     <para>
       And next, set suspend/resume callbacks to the pci_driver,
+      This can be done by passing a macro SND_PCI_PM_CALLBACKS
+      in the pci_driver struct.  This macro is expanded to the correct
+      (global) callbacks if CONFIG_PM is set.
 
       <informalexample>
         <programlisting>
 <![CDATA[
   static struct pci_driver driver = {
           .name = "My Chip",
-          ....
-  #ifdef CONFIG_PM
-          .suspend = snd_mychip_suspend,
-          .resume = snd_mychip_resume,
-  #endif
+          .id_table = snd_my_ids,
+          .probe = snd_my_probe,
+          .remove = __devexit_p(snd_my_remove),
+          SND_PCI_PM_CALLBACKS
   };
 ]]>
         </programlisting>
@@ -5521,7 +5425,8 @@
 
     <para>
       The module parameters must be declared with the standard
-    <function>MODULE_PARM()</function> and
+    <function>module_param()()</function>,
+    <function>module_param_array()()</function> and
     <function>MODULE_PARM_DESC()</function> macros. The ALSA provides
     an additional macro, <function>MODULE_PARM_SYNTAX()</function>,
     for describing its syntax. The strings will be written to
@@ -5545,18 +5450,22 @@
 <![CDATA[
   #define CARD_NAME "My Chip"
 
-  MODULE_PARM(index, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+  static int boot_devs;
+  module_param_array(index, int, boot_devs, 0444);
   MODULE_PARM_DESC(index, "Index value for " CARD_NAME " soundcard.");
   MODULE_PARM_SYNTAX(index, SNDRV_INDEX_DESC);
-  MODULE_PARM(id, "1-" __MODULE_STRING(SNDRV_CARDS) "s");
+  module_param_array(id, charp, boot_devs, 0444);
   MODULE_PARM_DESC(id, "ID string for " CARD_NAME " soundcard.");
   MODULE_PARM_SYNTAX(id, SNDRV_ID_DESC);
-  MODULE_PARM(enable, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+  module_param_array(enable, bool, boot_devs, 0444);
   MODULE_PARM_DESC(enable, "Enable " CARD_NAME " soundcard.");
   MODULE_PARM_SYNTAX(enable, SNDRV_ENABLE_DESC);
 ]]>
         </programlisting>
       </informalexample>
+
+    Here boot_devs is passed but simply ignored since we don't care
+    the number of parsed parameters.
     </para>
 
     <para>
@@ -5577,39 +5486,6 @@
       </informalexample>
     </para>
 
-    <para>
-      For building the driver into kernel, you should define the
-      <function>setup()</function> function in addition, too. 
-      ALSA provides <function>get_id()</function> function to retrieve
-      a string argument from the kernel boot parameters.
-
-      <informalexample>
-        <programlisting>
-<![CDATA[
-  #ifndef MODULE
-
-  /* format is: snd-mychip=enable,index,id */
-
-  static int __init alsa_card_mychip_setup(char *str)
-  {
-          static unsigned __initdata nr_dev = 0;
-
-          if (nr_dev >= SNDRV_CARDS)
-                  return 0;
-          (void)(get_option(&str,&enable[nr_dev]) == 2 &&
-                 get_option(&str,&index[nr_dev]) == 2 &&
-                 get_id(&str,&id[nr_dev]) == 2);
-          nr_dev++;
-          return 1;
-  }
-
-  __setup("snd-mychip=", alsa_card_mychip_setup);
-
-  #endif /* ifndef MODULE */
-]]>
-        </programlisting>
-      </informalexample>
-    </para>
   </chapter>
 
 
@@ -5631,10 +5507,14 @@
 	Suppose that you'll create a new PCI driver for the card
 	<quote>xyz</quote>.  The card module name would be
 	snd-xyz.  The new driver is usually put into alsa-driver
-	tree.  Then the driver is evaluated, audited and tested
+	tree, <filename>alsa-driver/pci</filename> directory in
+	the case of PCI cards.
+	Then the driver is evaluated, audited and tested
 	by developers and users.  After a certain time, the driver
-	will go to alsa-kernel tree and eventually integrated into
-	Linux 2.6 tree.
+	will go to alsa-kernel tree (to the corresponding directory,
+	such as <filename>alsa-kernel/pci</filename>) and eventually
+	integrated into Linux 2.6 tree (the directory would be
+	<filename>linux/sound/pci</filename>).
 	</para>
 
 	<para>
@@ -5661,7 +5541,7 @@
         <programlisting>
 <![CDATA[
   snd-xyz-objs := xyz.o
-  extra-obj-$(CONFIG_SND_XYZ) += snd-xyz.o
+  obj-$(CONFIG_SND_XYZ) += snd-xyz.o
 ]]>
         </programlisting>
       </informalexample>
@@ -5678,8 +5558,8 @@
       <informalexample>
         <programlisting>
 <![CDATA[
-  config SND_BT87X
-          tristate "Foobar XYX"
+  config SND_XYZ
+          tristate "Foobar XYZ"
           depends on SND
           select SND_PCM
           help
@@ -5730,7 +5610,8 @@
 	<orderedlist>
 	<listitem>
 	<para>
-	Add a new directory (xyz) to extra-subdir-y list in alsa-driver/pci/Makefile
+	Add a new directory (<filename>xyz</filename>) in
+	<filename>alsa-driver/pci/Makefile</filename> like below
 
       <informalexample>
         <programlisting>
@@ -5744,7 +5625,7 @@
 
 	<listitem>
 	<para>
-	Under the directory xyz, create a Makefile
+	Under the directory <filename>xyz</filename>, create a Makefile
 
       <example>
 	<title>Sample Makefile for a driver xyz</title>
diff -Nru a/Documentation/sound/alsa/Procfile.txt b/Documentation/sound/alsa/Procfile.txt
--- a/Documentation/sound/alsa/Procfile.txt	2004-05-26 15:01:36 -07:00
+++ b/Documentation/sound/alsa/Procfile.txt	2004-05-26 15:01:36 -07:00
@@ -131,6 +131,12 @@
 card*/codec97#0/ac97#?-?+regs
 	Shows the AC97 register dump.  Useful for debugging.
 
+	When CONFIG_SND_DEBUG is enabled, you can write to this file for
+	changing an AC97 register directly.  Pass two hex numbers.
+	For example,
+
+	# echo 02 9f1f > /proc/asound/card0/codec97#0/ac97#0-0+regs
+
 
 Sequencer Information
 ---------------------
diff -Nru a/MAINTAINERS b/MAINTAINERS
--- a/MAINTAINERS	2004-05-26 15:01:36 -07:00
+++ b/MAINTAINERS	2004-05-26 15:01:36 -07:00
@@ -538,11 +538,6 @@
 W:     http://sourceforge.net/projects/cramfs/
 S:     Orphan
 
-CREDITS FILE
-P:	John A. Martin
-M:	jam@acm.org
-S:	Maintained
-
 CRIS PORT
 P:	Bjorn Wesen
 M:	bjornw@axis.com
diff -Nru a/Makefile b/Makefile
--- a/Makefile	2004-05-26 15:01:36 -07:00
+++ b/Makefile	2004-05-26 15:01:36 -07:00
@@ -680,7 +680,7 @@
 uts_len := 64
 
 define filechk_version.h
-	if ((`echo -n "$(KERNELRELEASE)" | wc -c ` > $(uts_len))); then \
+	if [ `echo -n "$(KERNELRELEASE)" | wc -c ` -gt $(uts_len) ]; then \
 	  echo '"$(KERNELRELEASE)" exceeds $(uts_len) characters' >&2; \
 	  exit 1; \
 	fi; \
diff -Nru a/arch/arm/Kconfig b/arch/arm/Kconfig
--- a/arch/arm/Kconfig	2004-05-26 15:01:36 -07:00
+++ b/arch/arm/Kconfig	2004-05-26 15:01:36 -07:00
@@ -84,9 +84,6 @@
 config ARCH_CO285
 	bool "Co-EBSA285"
 
-config ARCH_PXA
-	bool "PXA2xx-based"
-
 config ARCH_EBSA110
 	bool "EBSA-110"
 	help
@@ -126,6 +123,9 @@
 	  If you have any questions or comments about the Linux kernel port
 	  to this board, send e-mail to sjhill@cotw.com.
 
+config ARCH_PXA
+	bool "PXA2xx-based"
+
 config ARCH_RPC
 	bool "RiscPC"
 	help
@@ -135,9 +135,6 @@
 config ARCH_SA1100
 	bool "SA1100-based"
 
-config ARCH_SHARK
-	bool "Shark"
-
 config ARCH_S3C2410
 	bool "Samsung S3C2410"
 	help
@@ -145,8 +142,8 @@
 	  BAST (http://www.simtec.co.uk/products/EB110ITX/), the IPAQ 1940 or
 	  the Samsung SMDK2410 development board (and derviatives).
 
-config ARCH_OMAP
-	bool "TI OMAP"
+config ARCH_SHARK
+	bool "Shark"
 
 config ARCH_LH7A40X
 	bool "Sharp LH7A40X"
@@ -155,6 +152,9 @@
 	  System on a Chip processors.  These CPUs include an ARM922T
 	  core with a wide array of integrated devices for
 	  hand-held and low-power applications.
+
+config ARCH_OMAP
+	bool "TI OMAP"
 
 config ARCH_VERSATILE_PB
 	bool "Versatile PB"
diff -Nru a/arch/arm/common/dmabounce.c b/arch/arm/common/dmabounce.c
--- a/arch/arm/common/dmabounce.c	2004-05-26 15:01:35 -07:00
+++ b/arch/arm/common/dmabounce.c	2004-05-26 15:01:35 -07:00
@@ -100,6 +100,7 @@
 		if (d->dev == dev)
 			return d;
 	}
+	return NULL;
 }
 
 
diff -Nru a/arch/arm/kernel/arch.c b/arch/arm/kernel/arch.c
--- a/arch/arm/kernel/arch.c	2004-05-26 15:01:35 -07:00
+++ b/arch/arm/kernel/arch.c	2004-05-26 15:01:35 -07:00
@@ -10,7 +10,6 @@
 #include <asm/elf.h>
 #include <asm/page.h>
 #include <asm/setup.h>
-#include <asm/mach-types.h>
 #include <asm/mach/arch.h>
 
 unsigned int vram_size;
diff -Nru a/arch/arm/mach-adifcc/irq.c b/arch/arm/mach-adifcc/irq.c
--- a/arch/arm/mach-adifcc/irq.c	2004-05-26 15:01:35 -07:00
+++ b/arch/arm/mach-adifcc/irq.c	2004-05-26 15:01:35 -07:00
@@ -19,8 +19,6 @@
 #include <asm/irq.h>
 #include <asm/hardware.h>
 
-#include <asm/mach-types.h>
-
 static void xs80200_irq_mask (unsigned int irq)
 {
 	long INTCTL;
diff -Nru a/arch/arm/mach-iop3xx/iop310-irq.c b/arch/arm/mach-iop3xx/iop310-irq.c
--- a/arch/arm/mach-iop3xx/iop310-irq.c	2004-05-26 15:01:36 -07:00
+++ b/arch/arm/mach-iop3xx/iop310-irq.c	2004-05-26 15:01:36 -07:00
@@ -21,8 +21,6 @@
 #include <asm/irq.h>
 #include <asm/hardware.h>
 
-#include <asm/mach-types.h>
-
 extern void xs80200_irq_mask(unsigned int);
 extern void xs80200_irq_unmask(unsigned int);
 extern void xs80200_init_irq(void);
diff -Nru a/arch/arm/mach-iop3xx/iop321-time.c b/arch/arm/mach-iop3xx/iop321-time.c
--- a/arch/arm/mach-iop3xx/iop321-time.c	2004-05-26 15:01:36 -07:00
+++ b/arch/arm/mach-iop3xx/iop321-time.c	2004-05-26 15:01:36 -07:00
@@ -23,7 +23,6 @@
 #include <asm/io.h>
 #include <asm/irq.h>
 #include <asm/uaccess.h>
-#include <asm/mach-types.h>
 #include <asm/mach/irq.h>
 
 static unsigned long iop321_gettimeoffset(void)
diff -Nru a/arch/arm/mach-iop3xx/iq80310-irq.c b/arch/arm/mach-iop3xx/iq80310-irq.c
--- a/arch/arm/mach-iop3xx/iq80310-irq.c	2004-05-26 15:01:35 -07:00
+++ b/arch/arm/mach-iop3xx/iq80310-irq.c	2004-05-26 15:01:35 -07:00
@@ -22,8 +22,6 @@
 #include <asm/hardware.h>
 #include <asm/system.h>
 
-#include <asm/mach-types.h>
-
 extern void iop310_init_irq(void);
 extern void iop310_irq_demux(unsigned int, struct irqdesc *, struct pt_regs *);
 
diff -Nru a/arch/arm/mach-iop3xx/iq80310-time.c b/arch/arm/mach-iop3xx/iq80310-time.c
--- a/arch/arm/mach-iop3xx/iq80310-time.c	2004-05-26 15:01:36 -07:00
+++ b/arch/arm/mach-iop3xx/iq80310-time.c	2004-05-26 15:01:36 -07:00
@@ -21,7 +21,6 @@
 #include <asm/io.h>
 #include <asm/irq.h>
 #include <asm/uaccess.h>
-#include <asm/mach-types.h>
 #include <asm/mach/irq.h>
 
 static void iq80310_write_timer (u_long val)
diff -Nru a/arch/arm/mach-iop3xx/mm-321.c b/arch/arm/mach-iop3xx/mm-321.c
--- a/arch/arm/mach-iop3xx/mm-321.c	2004-05-26 15:01:36 -07:00
+++ b/arch/arm/mach-iop3xx/mm-321.c	2004-05-26 15:01:36 -07:00
@@ -21,7 +21,6 @@
 #include <asm/page.h>
 
 #include <asm/mach/map.h>
-#include <asm/mach-types.h>
 
 
 /*
diff -Nru a/arch/arm/mach-iop3xx/mm.c b/arch/arm/mach-iop3xx/mm.c
--- a/arch/arm/mach-iop3xx/mm.c	2004-05-26 15:01:35 -07:00
+++ b/arch/arm/mach-iop3xx/mm.c	2004-05-26 15:01:35 -07:00
@@ -23,7 +23,6 @@
 #include <asm/page.h>
 
 #include <asm/mach/map.h>
-#include <asm/mach-types.h>
 
 #ifdef CONFIG_IOP310_MU
 #include "message.h"
diff -Nru a/arch/arm/mach-iop3xx/xs80200-irq.c b/arch/arm/mach-iop3xx/xs80200-irq.c
--- a/arch/arm/mach-iop3xx/xs80200-irq.c	2004-05-26 15:01:36 -07:00
+++ b/arch/arm/mach-iop3xx/xs80200-irq.c	2004-05-26 15:01:36 -07:00
@@ -17,8 +17,6 @@
 #include <asm/irq.h>
 #include <asm/hardware.h>
 
-#include <asm/mach-types.h>
-
 static void xs80200_irq_mask (unsigned int irq)
 {
 	unsigned long intctl;
diff -Nru a/arch/arm/mach-ixp4xx/common.c b/arch/arm/mach-ixp4xx/common.c
--- a/arch/arm/mach-ixp4xx/common.c	2004-05-26 15:01:36 -07:00
+++ b/arch/arm/mach-ixp4xx/common.c	2004-05-26 15:01:36 -07:00
@@ -30,7 +30,6 @@
 #include <asm/hardware.h>
 #include <asm/uaccess.h>
 #include <asm/io.h>
-#include <asm/mach-types.h>
 #include <asm/pgtable.h>
 #include <asm/page.h>
 #include <asm/irq.h>
diff -Nru a/arch/arm/mach-omap/bus.c b/arch/arm/mach-omap/bus.c
--- a/arch/arm/mach-omap/bus.c	2004-05-26 15:01:36 -07:00
+++ b/arch/arm/mach-omap/bus.c	2004-05-26 15:01:36 -07:00
@@ -39,7 +39,6 @@
 #include <linux/spinlock.h>
 
 #include <asm/hardware.h>
-#include <asm/mach-types.h>
 #include <asm/io.h>
 #include <asm/irq.h>
 #include <asm/mach/irq.h>
diff -Nru a/arch/arm/mach-pxa/generic.c b/arch/arm/mach-pxa/generic.c
--- a/arch/arm/mach-pxa/generic.c	2004-05-26 15:01:35 -07:00
+++ b/arch/arm/mach-pxa/generic.c	2004-05-26 15:01:35 -07:00
@@ -104,6 +104,7 @@
 	.id		= 0,
 	.dev		= {
 		.dma_mask = &pxamci_dmamask,
+		.coherent_dma_mask = 0xffffffff,
 	},
 	.num_resources	= ARRAY_SIZE(pxamci_resources),
 	.resource	= pxamci_resources,
diff -Nru a/arch/arm/mach-pxa/lubbock.c b/arch/arm/mach-pxa/lubbock.c
--- a/arch/arm/mach-pxa/lubbock.c	2004-05-26 15:01:35 -07:00
+++ b/arch/arm/mach-pxa/lubbock.c	2004-05-26 15:01:35 -07:00
@@ -11,11 +11,12 @@
  *  it under the terms of the GNU General Public License version 2 as
  *  published by the Free Software Foundation.
  */
+#include <linux/module.h>
 #include <linux/kernel.h>
 #include <linux/init.h>
 #include <linux/device.h>
 #include <linux/major.h>
-#include <linux/fs.h>
+#include <linux/fb.h>
 #include <linux/interrupt.h>
 
 #include <asm/setup.h>
@@ -29,11 +30,22 @@
 #include <asm/mach/irq.h>
 
 #include <asm/arch/udc.h>
+#include <asm/arch/pxafb.h>
 #include <asm/hardware/sa1111.h>
 
 #include "generic.h"
 
 
+void lubbock_set_misc_wr(unsigned int mask, unsigned int set)
+{
+	unsigned long flags;
+
+	local_irq_save(flags);
+	LUB_MISC_WR = (LUB_MISC_WR & ~mask) | (set & mask);
+	local_irq_restore(flags);
+}
+EXPORT_SYMBOL(lubbock_set_misc_wr);
+
 static unsigned long lubbock_irq_enabled;
 
 static void lubbock_mask_irq(unsigned int irq)
@@ -148,9 +160,29 @@
 	&smc91x_device,
 };
 
+static struct pxafb_mach_info sharp_lm8v31 __initdata = {
+	.pixclock	= 270000,
+	.xres		= 640,
+	.yres		= 480,
+	.bpp		= 16,
+	.hsync_len	= 1,
+	.left_margin	= 3,
+	.right_margin	= 3,
+	.vsync_len	= 1,
+	.upper_margin	= 0,
+	.lower_margin	= 0,
+	.sync		= FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,
+	.cmap_greyscale	= 0,
+	.cmap_inverse	= 0,
+	.cmap_static	= 0,
+	.lccr0		= LCCR0_SDS,
+	.lccr3		= LCCR3_PCP | LCCR3_Acb(255),
+};
+
 static void __init lubbock_init(void)
 {
 	pxa_set_udc_info(&udc_info);
+	set_pxa_fb_info(&sharp_lm8v31);
 	(void) platform_add_devices(devices, ARRAY_SIZE(devices));
 }
 
diff -Nru a/arch/arm/mach-s3c2410/s3c2410.c b/arch/arm/mach-s3c2410/s3c2410.c
--- a/arch/arm/mach-s3c2410/s3c2410.c	2004-05-26 15:01:36 -07:00
+++ b/arch/arm/mach-s3c2410/s3c2410.c	2004-05-26 15:01:36 -07:00
@@ -31,7 +31,6 @@
 #include <asm/hardware.h>
 #include <asm/io.h>
 #include <asm/irq.h>
-#include <asm/mach-types.h>
 
 #include <asm/arch/regs-clock.h>
 #include <asm/arch/regs-serial.h>
diff -Nru a/arch/h8300/kernel/h8300_ksyms.c b/arch/h8300/kernel/h8300_ksyms.c
--- a/arch/h8300/kernel/h8300_ksyms.c	2004-05-26 15:01:36 -07:00
+++ b/arch/h8300/kernel/h8300_ksyms.c	2004-05-26 15:01:36 -07:00
@@ -40,6 +40,8 @@
 EXPORT_SYMBOL(ip_fast_csum);
 
 EXPORT_SYMBOL(kernel_thread);
+EXPORT_SYMBOL(enable_irq);
+EXPORT_SYMBOL(disable_irq);
 
 /* Networking helper routines. */
 EXPORT_SYMBOL(csum_partial_copy);
diff -Nru a/arch/h8300/kernel/module.c b/arch/h8300/kernel/module.c
--- a/arch/h8300/kernel/module.c	2004-05-26 15:01:36 -07:00
+++ b/arch/h8300/kernel/module.c	2004-05-26 15:01:36 -07:00
@@ -67,7 +67,6 @@
 		Elf32_Sym *sym = (Elf32_Sym *)sechdrs[symindex].sh_addr
 			+ ELF32_R_SYM(rela[i].r_info);
 		uint32_t v = sym->st_value + rela[i].r_addend;
-		uint32_t dot = sechdrs[symindex].sh_addr + rela[i].r_offset;
 
 		switch (ELF32_R_TYPE(rela[i].r_info)) {
 		case R_H8_DIR24R8:
@@ -75,14 +74,15 @@
 			*loc = (*loc & 0xff000000) | ((*loc & 0xffffff) + v);
 			break;
 		case R_H8_DIR24A8:
-			*loc += v;
+			if (ELF32_R_SYM(rela[i].r_info))
+				*loc += v;
 			break;
 		case R_H8_DIR32:
 		case R_H8_DIR32A16:
 			*loc += v;
 			break;
 		case R_H8_PCREL16:
-			v -= dot + 2;
+			v -= (unsigned long)loc + 2;
 			if ((Elf32_Sword)v > 0x7fff || 
 			    (Elf32_Sword)v < -(Elf32_Sword)0x8000)
 				goto overflow;
@@ -90,7 +90,7 @@
 				*(unsigned short *)loc = v;
 			break;
 		case R_H8_PCREL8:
-			v -= dot + 1;
+			v -= (unsigned long)loc + 1;
 			if ((Elf32_Sword)v > 0x7f || 
 			    (Elf32_Sword)v < -(Elf32_Sword)0x80)
 				goto overflow;
@@ -105,7 +105,7 @@
 	}
 	return 0;
  overflow:
-	printk(KERN_ERR "module %s: relocation offset overflow: %p\n",
+	printk(KERN_ERR "module %s: relocation offset overflow: %08x\n",
 	       me->name, rela[i].r_offset);
 	return -ENOEXEC;
 }
diff -Nru a/arch/i386/kernel/cpu/common.c b/arch/i386/kernel/cpu/common.c
--- a/arch/i386/kernel/cpu/common.c	2004-05-26 15:01:35 -07:00
+++ b/arch/i386/kernel/cpu/common.c	2004-05-26 15:01:35 -07:00
@@ -201,6 +201,8 @@
 {
 	struct cpuinfo_x86 *c = &boot_cpu_data;
 
+	c->x86_cache_alignment = 32;
+
 	if (!have_cpuid_p())
 		return;
 
@@ -213,8 +215,6 @@
 	get_cpu_vendor(c, 1);
 
 	c->x86 = 4;
-	c->x86_cache_alignment = 32;
-
 	if (c->cpuid_level >= 0x00000001) {
 		u32 junk, tfms, cap0, misc;
 		cpuid(0x00000001, &tfms, &misc, &junk, &cap0);
diff -Nru a/arch/i386/kernel/io_apic.c b/arch/i386/kernel/io_apic.c
--- a/arch/i386/kernel/io_apic.c	2004-05-26 15:01:35 -07:00
+++ b/arch/i386/kernel/io_apic.c	2004-05-26 15:01:35 -07:00
@@ -853,7 +853,7 @@
  * we need to reprogram the ioredtbls to cater for the cpus which have come online
  * so mask in all cases should simply be TARGET_CPUS
  */
-void __init setup_ioapic_dest(cpumask_t mask)
+void __init setup_ioapic_dest(void)
 {
 	int pin, ioapic, irq, irq_entry;
 
@@ -866,7 +866,7 @@
 			if (irq_entry == -1)
 				continue;
 			irq = pin_2_irq(irq_entry, ioapic, pin);
-			set_ioapic_affinity_irq(irq, mask);
+			set_ioapic_affinity_irq(irq, TARGET_CPUS);
 		}
 
 	}
diff -Nru a/arch/i386/kernel/process.c b/arch/i386/kernel/process.c
--- a/arch/i386/kernel/process.c	2004-05-26 15:01:35 -07:00
+++ b/arch/i386/kernel/process.c	2004-05-26 15:01:35 -07:00
@@ -202,6 +202,10 @@
 	if (!strncmp(str, "poll", 4)) {
 		printk("using polling idle threads.\n");
 		pm_idle = poll_idle;
+#ifdef CONFIG_SMP
+		if (smp_num_siblings > 1)
+			printk("WARNING: polling idle and HT enabled, performance may degrade.\n");
+#endif
 	} else if (!strncmp(str, "halt", 4)) {
 		printk("using halt in idle threads.\n");
 		pm_idle = default_idle;
diff -Nru a/arch/i386/kernel/smpboot.c b/arch/i386/kernel/smpboot.c
--- a/arch/i386/kernel/smpboot.c	2004-05-26 15:01:36 -07:00
+++ b/arch/i386/kernel/smpboot.c	2004-05-26 15:01:36 -07:00
@@ -1369,8 +1369,7 @@
 void __init smp_cpus_done(unsigned int max_cpus)
 {
 #ifdef CONFIG_X86_IO_APIC
-	cpumask_t targets = CPU_MASK_ALL;
-	setup_ioapic_dest(targets);
+	setup_ioapic_dest();
 #endif
 	zap_low_mappings();
 }
diff -Nru a/arch/i386/mm/init.c b/arch/i386/mm/init.c
--- a/arch/i386/mm/init.c	2004-05-26 15:01:36 -07:00
+++ b/arch/i386/mm/init.c	2004-05-26 15:01:36 -07:00
@@ -328,9 +328,30 @@
 #endif
 }
 
+#if defined(CONFIG_PM_DISK) || defined(CONFIG_SOFTWARE_SUSPEND)
+/*
+ * Swap suspend & friends need this for resume because things like the intel-agp
+ * driver might have split up a kernel 4MB mapping.
+ */
+char __nosavedata swsusp_pg_dir[PAGE_SIZE]
+	__attribute__ ((aligned (PAGE_SIZE)));
+
+static inline void save_pg_dir(void)
+{
+	memcpy(swsusp_pg_dir, swapper_pg_dir, PAGE_SIZE);
+}
+#else
+static inline void save_pg_dir(void)
+{
+}
+#endif
+
 void zap_low_mappings (void)
 {
 	int i;
+
+	save_pg_dir();
+
 	/*
 	 * Zap initial low-memory mappings.
 	 *
diff -Nru a/arch/i386/power/pmdisk.S b/arch/i386/power/pmdisk.S
--- a/arch/i386/power/pmdisk.S	2004-05-26 15:01:36 -07:00
+++ b/arch/i386/power/pmdisk.S	2004-05-26 15:01:36 -07:00
@@ -21,7 +21,7 @@
 	jmp .L1449
 	.p2align 4,,7
 .L1450:
-	movl $swapper_pg_dir-__PAGE_OFFSET,%ecx
+	movl $swsusp_pg_dir-__PAGE_OFFSET,%ecx
 	movl %ecx,%cr3
 
 	movl	pm_pagedir_nosave,%ebx
diff -Nru a/arch/i386/power/swsusp.S b/arch/i386/power/swsusp.S
--- a/arch/i386/power/swsusp.S	2004-05-26 15:01:35 -07:00
+++ b/arch/i386/power/swsusp.S	2004-05-26 15:01:35 -07:00
@@ -36,7 +36,7 @@
 	jmp .L1449
 	.p2align 4,,7
 .L1450:
-	movl $swapper_pg_dir-__PAGE_OFFSET,%ecx
+	movl $swsusp_pg_dir-__PAGE_OFFSET,%ecx
 	movl %ecx,%cr3
 
 	call do_magic_resume_1
diff -Nru a/arch/ppc64/Kconfig b/arch/ppc64/Kconfig
--- a/arch/ppc64/Kconfig	2004-05-26 15:01:36 -07:00
+++ b/arch/ppc64/Kconfig	2004-05-26 15:01:36 -07:00
@@ -417,6 +417,13 @@
 	  debugging info resulting in a larger kernel image.
 	  Say Y here only if you plan to use gdb to debug the kernel.
 	  If you don't debug the kernel, you can say N.
+
+config IRQSTACKS
+	bool "Use separate kernel stacks when processing interrupts"
+	help
+	  If you say Y here the kernel will use separate kernel stacks
+	  for handling hard and soft interrupts.  This can help avoid
+	  overflowing the process kernel stacks.
 	  
 endmenu
 
diff -Nru a/arch/ppc64/kernel/head.S b/arch/ppc64/kernel/head.S
--- a/arch/ppc64/kernel/head.S	2004-05-26 15:01:36 -07:00
+++ b/arch/ppc64/kernel/head.S	2004-05-26 15:01:36 -07:00
@@ -1281,6 +1281,10 @@
 	SAVE_4GPRS(16, r1)
 	SAVE_8GPRS(24, r1)
 
+	/* Set the marker value "regshere" just before the reg values */
+	SET_REG_TO_CONST(r22, 0x7265677368657265)
+	std	r22,STACK_FRAME_OVERHEAD-16(r1)
+
 	/*
 	 * Clear the RESULT field
 	 */
diff -Nru a/arch/ppc64/kernel/ioctl32.c b/arch/ppc64/kernel/ioctl32.c
--- a/arch/ppc64/kernel/ioctl32.c	2004-05-26 15:01:36 -07:00
+++ b/arch/ppc64/kernel/ioctl32.c	2004-05-26 15:01:36 -07:00
@@ -29,307 +29,6 @@
 #define CODE
 #include "compat_ioctl.c"
 
-struct ncp_ioctl_request_32 {
-	unsigned int function;
-	unsigned int size;
-	compat_caddr_t data;
-};
-
-struct ncp_fs_info_v2_32 {
-	int version;
-	unsigned int mounted_uid;
-	unsigned int connection;
-	unsigned int buffer_size;
-
-	unsigned int volume_number;
-	__u32 directory_id;
-
-	__u32 dummy1;
-	__u32 dummy2;
-	__u32 dummy3;
-};
-
-struct ncp_objectname_ioctl_32
-{
-	int		auth_type;
-	unsigned int	object_name_len;
-	compat_caddr_t	object_name;	/* an userspace data, in most cases user name */
-};
-
-struct ncp_privatedata_ioctl_32
-{
-	unsigned int	len;
-	compat_caddr_t	data;		/* ~1000 for NDS */
-};
-
-#define	NCP_IOC_NCPREQUEST_32		_IOR('n', 1, struct ncp_ioctl_request_32)
-
-#define NCP_IOC_GETMOUNTUID2_32		_IOW('n', 2, unsigned int)
-
-#define NCP_IOC_GET_FS_INFO_V2_32	_IOWR('n', 4, struct ncp_fs_info_v2_32)
-
-#define NCP_IOC_GETOBJECTNAME_32	_IOWR('n', 9, struct ncp_objectname_ioctl_32)
-#define NCP_IOC_SETOBJECTNAME_32	_IOR('n', 9, struct ncp_objectname_ioctl_32)
-#define NCP_IOC_GETPRIVATEDATA_32	_IOWR('n', 10, struct ncp_privatedata_ioctl_32)
-#define NCP_IOC_SETPRIVATEDATA_32	_IOR('n', 10, struct ncp_privatedata_ioctl_32)
-
-static int do_ncp_ncprequest(unsigned int fd, unsigned int cmd, unsigned long arg)
-{
-	struct ncp_ioctl_request_32 n32;
-	struct ncp_ioctl_request n;
-	mm_segment_t old_fs;
-	int err;
-
-	if (copy_from_user(&n32, (struct ncp_ioctl_request_32*)arg,
-	    sizeof(n32)))
-		return -EFAULT;
-
-	n.function = n32.function;
-	n.size = n32.size;
-	if (n.size > 65536)
-		return -EINVAL;
-	n.data = vmalloc(65536);	/* 65536 must be same as NCP_PACKET_SIZE_INTERNAL in ncpfs */
-	if (!n.data)
-		return -ENOMEM;
-	err = -EFAULT;
-	if (copy_from_user(n.data, (void *)A(n32.data), n.size))
-		goto out;
-
-	old_fs = get_fs(); set_fs (KERNEL_DS);
-	err = sys_ioctl (fd, NCP_IOC_NCPREQUEST, (unsigned long)&n);
-	set_fs (old_fs);
-        if(err <= 0)
-		goto out;
-	if (err > 65536) {
-		err = -EINVAL;
-		goto out;
-	}
-	if (copy_to_user((void *)A(n32.data), n.data, err)) {
-		err = -EFAULT;
-		goto out;
-	}
- out:
-	vfree(n.data);
-	return err;
-}
-
-static int do_ncp_getmountuid2(unsigned int fd, unsigned int cmd, unsigned long arg)
-{
-	mm_segment_t old_fs = get_fs();
-	__kernel_uid_t kuid;
-	int err;
-
-	cmd = NCP_IOC_GETMOUNTUID2;
-
-	set_fs(KERNEL_DS);
-	err = sys_ioctl(fd, cmd, (unsigned long)&kuid);
-	set_fs(old_fs);
-
-	if (!err)
-		err = put_user(kuid, (unsigned int*)arg);
-
-	return err;
-}
-
-static int do_ncp_getfsinfo2(unsigned int fd, unsigned int cmd, unsigned long arg)
-{
-	mm_segment_t old_fs = get_fs();
-	struct ncp_fs_info_v2_32 n32;
-	struct ncp_fs_info_v2 n;
-	int err;
-
-	if (copy_from_user(&n32, (struct ncp_fs_info_v2_32*)arg, sizeof(n32)))
-		return -EFAULT;
-	if (n32.version != NCP_GET_FS_INFO_VERSION_V2)
-		return -EINVAL;
-	n.version = NCP_GET_FS_INFO_VERSION_V2;
-
-	set_fs(KERNEL_DS);
-	err = sys_ioctl(fd, NCP_IOC_GET_FS_INFO_V2, (unsigned long)&n);
-	set_fs(old_fs);
-
-	if (!err) {
-		n32.version = n.version;
-		n32.mounted_uid = n.mounted_uid;
-		n32.connection = n.connection;
-		n32.buffer_size = n.buffer_size;
-		n32.volume_number = n.volume_number;
-		n32.directory_id = n.directory_id;
-		n32.dummy1 = n.dummy1;
-		n32.dummy2 = n.dummy2;
-		n32.dummy3 = n.dummy3;
-		err = copy_to_user((struct ncp_fs_info_v2_32*)arg, &n32, sizeof(n32)) ? -EFAULT : 0;
-	}
-	return err;
-}
-
-static int do_ncp_getobjectname(unsigned int fd, unsigned int cmd, unsigned long arg)
-{
-	struct ncp_objectname_ioctl_32 n32;
-	struct ncp_objectname_ioctl n;
-	mm_segment_t old_fs;
-	int err;
-	size_t tl;
-
-	if (copy_from_user(&n32, (struct ncp_objectname_ioctl_32*)arg,
-	    sizeof(n32)))
-		return -EFAULT;
-
-	n.object_name_len = tl = n32.object_name_len;
-	if (tl) {
-		n.object_name = kmalloc(tl, GFP_KERNEL);
-		if (!n.object_name)
-			return -ENOMEM;
-	} else {
-		n.object_name = NULL;
-	}
-
-	old_fs = get_fs(); set_fs (KERNEL_DS);
-	err = sys_ioctl (fd, NCP_IOC_GETOBJECTNAME, (unsigned long)&n);
-	set_fs (old_fs);
-        if(err)
-		goto out;
-		
-	if (tl > n.object_name_len)
-		tl = n.object_name_len;
-
-	err = -EFAULT;
-	if (tl && copy_to_user((void *)A(n32.object_name), n.object_name, tl))
-		goto out;
-
-	n32.auth_type = n.auth_type;
-	n32.object_name_len = n.object_name_len;
-	
-	if (copy_to_user((struct ncp_objectname_ioctl_32*)arg, &n32, sizeof(n32)))
-		goto out;
-	
-	err = 0;
- out:
- 	if (n.object_name)
-		kfree(n.object_name);
-
-	return err;
-}
-
-static int do_ncp_setobjectname(unsigned int fd, unsigned int cmd, unsigned long arg)
-{
-	struct ncp_objectname_ioctl_32 n32;
-	struct ncp_objectname_ioctl n;
-	mm_segment_t old_fs;
-	int err;
-	size_t tl;
-
-	if (copy_from_user(&n32, (struct ncp_objectname_ioctl_32*)arg,
-	    sizeof(n32)))
-		return -EFAULT;
-
-	n.auth_type = n32.auth_type;
-	n.object_name_len = tl = n32.object_name_len;
-	if (tl) {
-		n.object_name = kmalloc(tl, GFP_KERNEL);
-		if (!n.object_name)
-			return -ENOMEM;
-		err = -EFAULT;
-		if (copy_from_user(n.object_name, (void *)A(n32.object_name), tl))
-			goto out;
-	} else {
-		n.object_name = NULL;
-	}
-	
-	old_fs = get_fs(); set_fs (KERNEL_DS);
-	err = sys_ioctl (fd, NCP_IOC_SETOBJECTNAME, (unsigned long)&n);
-	set_fs (old_fs);
-		
- out:
-	if (n.object_name)
-		kfree(n.object_name);
-
-	return err;
-}
-
-static int do_ncp_getprivatedata(unsigned int fd, unsigned int cmd, unsigned long arg)
-{
-	struct ncp_privatedata_ioctl_32 n32;
-	struct ncp_privatedata_ioctl n;
-	mm_segment_t old_fs;
-	int err;
-	size_t tl;
-
-	if (copy_from_user(&n32, (struct ncp_privatedata_ioctl_32*)arg,
-	    sizeof(n32)))
-		return -EFAULT;
-
-	n.len = tl = n32.len;
-	if (tl) {
-		n.data = kmalloc(tl, GFP_KERNEL);
-		if (!n.data)
-			return -ENOMEM;
-	} else {
-		n.data = NULL;
-	}
-
-	old_fs = get_fs(); set_fs (KERNEL_DS);
-	err = sys_ioctl (fd, NCP_IOC_GETPRIVATEDATA, (unsigned long)&n);
-	set_fs (old_fs);
-        if(err)
-		goto out;
-		
-	if (tl > n.len)
-		tl = n.len;
-
-	err = -EFAULT;
-	if (tl && copy_to_user((void *)A(n32.data), n.data, tl))
-		goto out;
-
-	n32.len = n.len;
-	
-	if (copy_to_user((struct ncp_privatedata_ioctl_32*)arg, &n32, sizeof(n32)))
-		goto out;
-	
-	err = 0;
- out:
- 	if (n.data)
-		kfree(n.data);
-
-	return err;
-}
-
-static int do_ncp_setprivatedata(unsigned int fd, unsigned int cmd, unsigned long arg)
-{
-	struct ncp_privatedata_ioctl_32 n32;
-	struct ncp_privatedata_ioctl n;
-	mm_segment_t old_fs;
-	int err;
-	size_t tl;
-
-	if (copy_from_user(&n32, (struct ncp_privatedata_ioctl_32*)arg,
-	    sizeof(n32)))
-		return -EFAULT;
-
-	n.len = tl = n32.len;
-	if (tl) {
-		n.data = kmalloc(tl, GFP_KERNEL);
-		if (!n.data)
-			return -ENOMEM;
-		err = -EFAULT;
-		if (copy_from_user(n.data, (void *)A(n32.data), tl))
-			goto out;
-	} else {
-		n.data = NULL;
-	}
-	
-	old_fs = get_fs(); set_fs (KERNEL_DS);
-	err = sys_ioctl (fd, NCP_IOC_SETPRIVATEDATA, (unsigned long)&n);
-	set_fs (old_fs);
-		
- out:
-	if (n.data)
-		kfree(n.data);
-
-	return err;
-}
-
-
 #define HANDLE_IOCTL(cmd,handler) { cmd, (ioctl_trans_handler_t)handler, 0 },
 #define COMPATIBLE_IOCTL(cmd) HANDLE_IOCTL(cmd,sys_ioctl)
 
@@ -349,17 +48,6 @@
 /* Little p (/dev/rtc, /dev/envctrl, etc.) */
 COMPATIBLE_IOCTL(_IOR('p', 20, int[7])) /* RTCGET */
 COMPATIBLE_IOCTL(_IOW('p', 21, int[7])) /* RTCSET */
-
-/* And these ioctls need translation */
-
-/* NCPFS */
-HANDLE_IOCTL(NCP_IOC_NCPREQUEST_32, do_ncp_ncprequest)
-HANDLE_IOCTL(NCP_IOC_GETMOUNTUID2_32, do_ncp_getmountuid2)
-HANDLE_IOCTL(NCP_IOC_GET_FS_INFO_V2_32, do_ncp_getfsinfo2)
-HANDLE_IOCTL(NCP_IOC_GETOBJECTNAME_32, do_ncp_getobjectname)
-HANDLE_IOCTL(NCP_IOC_SETOBJECTNAME_32, do_ncp_setobjectname)
-HANDLE_IOCTL(NCP_IOC_GETPRIVATEDATA_32, do_ncp_getprivatedata)
-HANDLE_IOCTL(NCP_IOC_SETPRIVATEDATA_32, do_ncp_setprivatedata)
 
 IOCTL_TABLE_END
 
diff -Nru a/arch/ppc64/kernel/irq.c b/arch/ppc64/kernel/irq.c
--- a/arch/ppc64/kernel/irq.c	2004-05-26 15:01:35 -07:00
+++ b/arch/ppc64/kernel/irq.c	2004-05-26 15:01:35 -07:00
@@ -370,8 +370,7 @@
 	return 0;
 }
 
-static inline int handle_irq_event(int irq, struct pt_regs *regs,
-				   struct irqaction *action)
+int handle_irq_event(int irq, struct pt_regs *regs, struct irqaction *action)
 {
 	int status = 0;
 	int retval = 0;
@@ -482,6 +481,9 @@
 	int cpu = smp_processor_id();
 	irq_desc_t *desc = get_irq_desc(irq);
 	irqreturn_t action_ret;
+#ifdef CONFIG_IRQSTACKS
+	struct thread_info *curtp, *irqtp;
+#endif
 
 	kstat_cpu(cpu).irqs[irq]++;
 
@@ -548,7 +550,22 @@
 	 */
 	for (;;) {
 		spin_unlock(&desc->lock);
-		action_ret = handle_irq_event(irq, regs, action);
+
+#ifdef CONFIG_IRQSTACKS
+		/* Switch to the irq stack to handle this */
+		curtp = current_thread_info();
+		irqtp = hardirq_ctx[smp_processor_id()];
+		if (curtp != irqtp) {
+			irqtp->task = curtp->task;
+			irqtp->flags = 0;
+			action_ret = call_handle_irq_event(irq, regs, action, irqtp);
+			irqtp->task = NULL;
+			if (irqtp->flags)
+				set_bits(irqtp->flags, &curtp->flags);
+		} else
+#endif
+			action_ret = handle_irq_event(irq, regs, action);
+
 		spin_lock(&desc->lock);
 		if (!noirqdebug)
 			note_interrupt(irq, desc, action_ret);
@@ -690,6 +707,7 @@
 	once++;
 
 	ppc_md.init_IRQ();
+	irq_ctx_init();
 }
 
 static struct proc_dir_entry * root_irq_dir;
@@ -973,4 +991,51 @@
 
 }
 
-#endif
+#endif /* CONFIG_PPC_ISERIES */
+
+#ifdef CONFIG_IRQSTACKS
+struct thread_info *softirq_ctx[NR_CPUS];
+struct thread_info *hardirq_ctx[NR_CPUS];
+
+void irq_ctx_init(void)
+{
+	struct thread_info *tp;
+	int i;
+
+	for (i = 0; i < NR_CPUS; i++) {
+		memset((void *)softirq_ctx[i], 0, THREAD_SIZE);
+		tp = softirq_ctx[i];
+		tp->cpu = i;
+		tp->preempt_count = SOFTIRQ_OFFSET;
+
+		memset((void *)hardirq_ctx[i], 0, THREAD_SIZE);
+		tp = hardirq_ctx[i];
+		tp->cpu = i;
+		tp->preempt_count = HARDIRQ_OFFSET;
+	}
+}
+
+void do_softirq(void)
+{
+	unsigned long flags;
+	struct thread_info *curtp, *irqtp;
+
+	if (in_interrupt())
+		return;
+
+	local_irq_save(flags);
+
+	if (local_softirq_pending()) {
+		curtp = current_thread_info();
+		irqtp = softirq_ctx[smp_processor_id()];
+		irqtp->task = curtp->task;
+		call_do_softirq(irqtp);
+		irqtp->task = NULL;
+	}
+
+	local_irq_restore(flags);
+}
+EXPORT_SYMBOL(do_softirq);
+
+#endif /* CONFIG_IRQSTACKS */
+
diff -Nru a/arch/ppc64/kernel/misc.S b/arch/ppc64/kernel/misc.S
--- a/arch/ppc64/kernel/misc.S	2004-05-26 15:01:36 -07:00
+++ b/arch/ppc64/kernel/misc.S	2004-05-26 15:01:36 -07:00
@@ -102,6 +102,30 @@
 	blr
 #endif /* CONFIG_PPC_ISERIES */
 
+#ifdef CONFIG_IRQSTACKS
+_GLOBAL(call_do_softirq)
+	mflr	r0
+	std	r0,16(r1)
+	stdu	r1,THREAD_SIZE-112(r3)
+	mr	r1,r3
+	bl	.__do_softirq
+	ld	r1,0(r1)
+	ld	r0,16(r1)
+	mtlr	r0
+	blr
+
+_GLOBAL(call_handle_irq_event)
+	mflr	r0
+	std	r0,16(r1)
+	stdu	r1,THREAD_SIZE-112(r6)
+	mr	r1,r6
+	bl	.handle_irq_event
+	ld	r1,0(r1)
+	ld	r0,16(r1)
+	mtlr	r0
+	blr
+#endif /* CONFIG_IRQSTACKS */
+
 /*
  * Flush instruction cache.
  */
diff -Nru a/arch/ppc64/kernel/process.c b/arch/ppc64/kernel/process.c
--- a/arch/ppc64/kernel/process.c	2004-05-26 15:01:36 -07:00
+++ b/arch/ppc64/kernel/process.c	2004-05-26 15:01:36 -07:00
@@ -457,16 +457,28 @@
 
 static int kstack_depth_to_print = 64;
 
-static inline int validate_sp(unsigned long sp, struct task_struct *p)
+static int validate_sp(unsigned long sp, struct task_struct *p,
+		       unsigned long nbytes)
 {
 	unsigned long stack_page = (unsigned long)p->thread_info;
 
-	if (sp < stack_page + sizeof(struct thread_struct))
-		return 0;
-	if (sp >= stack_page + THREAD_SIZE)
-		return 0;
+	if (sp >= stack_page + sizeof(struct thread_struct)
+	    && sp <= stack_page + THREAD_SIZE - nbytes)
+		return 1;
+
+#ifdef CONFIG_IRQSTACKS
+	stack_page = (unsigned long) hardirq_ctx[task_cpu(p)];
+	if (sp >= stack_page + sizeof(struct thread_struct)
+	    && sp <= stack_page + THREAD_SIZE - nbytes)
+		return 1;
+
+	stack_page = (unsigned long) softirq_ctx[task_cpu(p)];
+	if (sp >= stack_page + sizeof(struct thread_struct)
+	    && sp <= stack_page + THREAD_SIZE - nbytes)
+		return 1;
+#endif
 
-	return 1;
+	return 0;
 }
 
 unsigned long get_wchan(struct task_struct *p)
@@ -478,12 +490,12 @@
 		return 0;
 
 	sp = p->thread.ksp;
-	if (!validate_sp(sp, p))
+	if (!validate_sp(sp, p, 112))
 		return 0;
 
 	do {
 		sp = *(unsigned long *)sp;
-		if (!validate_sp(sp, p))
+		if (!validate_sp(sp, p, 112))
 			return 0;
 		if (count > 0) {
 			ip = *(unsigned long *)(sp + 16);
@@ -496,9 +508,10 @@
 
 void show_stack(struct task_struct *p, unsigned long *_sp)
 {
-	unsigned long ip;
+	unsigned long ip, newsp, lr;
 	int count = 0;
 	unsigned long sp = (unsigned long)_sp;
+	int firstframe = 1;
 
 	if (sp == 0) {
 		if (p) {
@@ -509,17 +522,40 @@
 		}
 	}
 
-	if (!validate_sp(sp, p))
-		return;
-
+	lr = 0;
 	printk("Call Trace:\n");
 	do {
-		sp = *(unsigned long *)sp;
-		if (!validate_sp(sp, p))
+		if (!validate_sp(sp, p, 112))
 			return;
-		ip = *(unsigned long *)(sp + 16);
-		printk("[%016lx] ", ip);
-		print_symbol("%s\n", ip);
+
+		_sp = (unsigned long *) sp;
+		newsp = _sp[0];
+		ip = _sp[2];
+		if (!firstframe || ip != lr) {
+			printk("[%016lx] [%016lx] ", sp, ip);
+			print_symbol("%s", ip);
+			if (firstframe)
+				printk(" (unreliable)");
+			printk("\n");
+		}
+		firstframe = 0;
+
+		/*
+		 * See if this is an exception frame.
+		 * We look for the "regshere" marker in the current frame.
+		 */
+		if (validate_sp(sp, p, sizeof(struct pt_regs) + 400)
+		    && _sp[12] == 0x7265677368657265) {
+			struct pt_regs *regs = (struct pt_regs *)
+				(sp + STACK_FRAME_OVERHEAD);
+			printk("--- Exception: %lx", regs->trap);
+			print_symbol(" at %s\n", regs->nip);
+			lr = regs->link;
+			print_symbol("    LR = %s\n", lr);
+			firstframe = 1;
+		}
+
+		sp = newsp;
 	} while (count++ < kstack_depth_to_print);
 }
 
diff -Nru a/arch/ppc64/kernel/prom.c b/arch/ppc64/kernel/prom.c
--- a/arch/ppc64/kernel/prom.c	2004-05-26 15:01:36 -07:00
+++ b/arch/ppc64/kernel/prom.c	2004-05-26 15:01:36 -07:00
@@ -2189,11 +2189,13 @@
 		ints = imap - nintrc;
 		reg = ints - naddrc;
 	}
+	if (p == NULL) {
 #ifdef DEBUG_IRQ
-	if (p == NULL)
 		printk("hmmm, int tree for %s doesn't have ctrler\n",
 		       np->full_name);
 #endif
+		return 0;
+	}
 	*irq = ints;
 	*ictrler = p;
 	return nintrc;
@@ -2204,7 +2206,7 @@
 		       int measure_only)
 {
 	unsigned int *ints;
-	int intlen, intrcells;
+	int intlen, intrcells, intrcount;
 	int i, j, n;
 	unsigned int *irq, virq;
 	struct device_node *ic;
@@ -2214,34 +2216,40 @@
 		return mem_start;
 	intrcells = prom_n_intr_cells(np);
 	intlen /= intrcells * sizeof(unsigned int);
-	np->n_intrs = intlen;
 	np->intrs = (struct interrupt_info *) mem_start;
 	mem_start += intlen * sizeof(struct interrupt_info);
 
 	if (measure_only)
 		return mem_start;
 
-	for (i = 0; i < intlen; ++i) {
-		np->intrs[i].line = 0;
-		np->intrs[i].sense = 1;
+	intrcount = 0;
+	for (i = 0; i < intlen; ++i, ints += intrcells) {
 		n = map_interrupt(&irq, &ic, np, ints, intrcells);
 		if (n <= 0)
 			continue;
-		virq = virt_irq_create_mapping(irq[0]);
-		if (virq == NO_IRQ) {
-			printk(KERN_CRIT "Could not allocate interrupt "
-			       "number for %s\n", np->full_name);
-		} else
-			np->intrs[i].line = irq_offset_up(virq);
+
+		/* don't map IRQ numbers under a cascaded 8259 controller */
+		if (ic && device_is_compatible(ic, "chrp,iic")) {
+			np->intrs[intrcount].line = irq[0];
+		} else {
+			virq = virt_irq_create_mapping(irq[0]);
+			if (virq == NO_IRQ) {
+				printk(KERN_CRIT "Could not allocate interrupt"
+				       " number for %s\n", np->full_name);
+				continue;
+			}
+			np->intrs[intrcount].line = irq_offset_up(virq);
+		}
 
 		/* We offset irq numbers for the u3 MPIC by 128 in PowerMac */
 		if (systemcfg->platform == PLATFORM_POWERMAC && ic && ic->parent) {
 			char *name = get_property(ic->parent, "name", NULL);
 			if (name && !strcmp(name, "u3"))
-				np->intrs[i].line += 128;
+				np->intrs[intrcount].line += 128;
 		}
+		np->intrs[intrcount].sense = 1;
 		if (n > 1)
-			np->intrs[i].sense = irq[1];
+			np->intrs[intrcount].sense = irq[1];
 		if (n > 2) {
 			printk("hmmm, got %d intr cells for %s:", n,
 			       np->full_name);
@@ -2249,8 +2257,9 @@
 				printk(" %d", irq[j]);
 			printk("\n");
 		}
-		ints += intrcells;
+		++intrcount;
 	}
+	np->n_intrs = intrcount;
 
 	return mem_start;
 }
diff -Nru a/arch/ppc64/kernel/setup.c b/arch/ppc64/kernel/setup.c
--- a/arch/ppc64/kernel/setup.c	2004-05-26 15:01:36 -07:00
+++ b/arch/ppc64/kernel/setup.c	2004-05-26 15:01:36 -07:00
@@ -572,6 +572,23 @@
 
 extern void (*calibrate_delay)(void);
 
+#ifdef CONFIG_IRQSTACKS
+static void __init irqstack_early_init(void)
+{
+	int i;
+
+	/* interrupt stacks must be under 256MB, we cannot afford to take SLB misses on them */
+	for (i = 0; i < NR_CPUS; i++) {
+		softirq_ctx[i] = (struct thread_info *)__va(lmb_alloc_base(THREAD_SIZE,
+					THREAD_SIZE, 0x10000000));
+		hardirq_ctx[i] = (struct thread_info *)__va(lmb_alloc_base(THREAD_SIZE,
+					THREAD_SIZE, 0x10000000));
+	}
+}
+#else
+#define irqstack_early_init()
+#endif
+
 /*
  * Called into from start_kernel, after lock_kernel has been called.
  * Initializes bootmem, which is unsed to manage page allocation until
@@ -616,6 +633,8 @@
 	/* Save unparsed command line copy for /proc/cmdline */
 	strlcpy(saved_command_line, cmd_line, sizeof(saved_command_line));
 	*cmdline_p = cmd_line;
+
+	irqstack_early_init();
 
 	/* set up the bootmem stuff with available memory */
 	do_init_bootmem();
diff -Nru a/arch/ppc64/kernel/viopath.c b/arch/ppc64/kernel/viopath.c
--- a/arch/ppc64/kernel/viopath.c	2004-05-26 15:01:35 -07:00
+++ b/arch/ppc64/kernel/viopath.c	2004-05-26 15:01:35 -07:00
@@ -190,6 +190,8 @@
 static int proc_viopath_show(struct seq_file *m, void *v)
 {
 	char *buf;
+	u16 vlanMap;
+	int vlanIndex;
 	dma_addr_t handle;
 	HvLpEvent_Rc hvrc;
 	DECLARE_MUTEX_LOCKED(Semaphore);
@@ -216,12 +218,18 @@
 
 	down(&Semaphore);
 
-	dma_unmap_single(iSeries_vio_dev, handle, PAGE_SIZE, DMA_FROM_DEVICE);
-	kfree(buf);
+	vlanMap = HvLpConfig_getVirtualLanIndexMap();
+	vlanIndex = 0;
+	while (vlanMap != 0){
+		if (vlanMap & 0x8000)
+			vlanIndex++;;
+		vlanMap = vlanMap << 1;
+	}
 
-	buf[PAGE_SIZE] = '\0';
+	buf[PAGE_SIZE-1] = '\0';
 	seq_printf(m, "%s", buf);
 
+	seq_printf(m, "AVAILABLE_VETH=%d\n", vlanIndex );
 	seq_printf(m, "SRLNBR=%c%c%c%c%c%c%c\n",
 		   e2a(xItExtVpdPanel.mfgID[2]),
 		   e2a(xItExtVpdPanel.mfgID[3]),
@@ -230,6 +238,9 @@
 		   e2a(xItExtVpdPanel.systemSerial[3]),
 		   e2a(xItExtVpdPanel.systemSerial[4]),
 		   e2a(xItExtVpdPanel.systemSerial[5]));
+
+	dma_unmap_single(iSeries_vio_dev, handle, PAGE_SIZE, DMA_FROM_DEVICE);
+	kfree(buf);
 
 	return 0;
 }
diff -Nru a/arch/ppc64/mm/numa.c b/arch/ppc64/mm/numa.c
--- a/arch/ppc64/mm/numa.c	2004-05-26 15:01:36 -07:00
+++ b/arch/ppc64/mm/numa.c	2004-05-26 15:01:36 -07:00
@@ -19,7 +19,7 @@
 #include <asm/abs_addr.h>
 
 #if 1
-#define dbg(args...) udbg_printf(args)
+#define dbg(args...) printk(KERN_INFO args)
 #else
 #define dbg(args...)
 #endif
@@ -56,16 +56,136 @@
 	}
 }
 
+static struct device_node * __init find_cpu_node(unsigned int cpu)
+{
+	unsigned int hw_cpuid = get_hard_smp_processor_id(cpu);
+	struct device_node *cpu_node = NULL;
+	unsigned int *interrupt_server, *reg;
+	int len;
+
+	while ((cpu_node = of_find_node_by_type(cpu_node, "cpu")) != NULL) {
+		/* Try interrupt server first */
+		interrupt_server = (unsigned int *)get_property(cpu_node,
+					"ibm,ppc-interrupt-server#s", &len);
+
+		if (interrupt_server && (len > 0)) {
+			while (len--) {
+				if (interrupt_server[len-1] == hw_cpuid)
+					return cpu_node;
+			}
+		} else {
+			reg = (unsigned int *)get_property(cpu_node,
+							   "reg", &len);
+			if (reg && (len > 0) && (reg[0] == hw_cpuid))
+				return cpu_node;
+		}
+	}
+
+	return NULL;
+}
+
+/* must hold reference to node during call */
+static int *of_get_associativity(struct device_node *dev)
+ {
+	unsigned int *result;
+	int len;
+
+	result = (unsigned int *)get_property(dev, "ibm,associativity", &len);
+
+	if (len <= 0)
+		return NULL;
+
+	return result;
+}
+
+static int of_node_numa_domain(struct device_node *device, int depth)
+{
+	int numa_domain;
+	unsigned int *tmp;
+
+	tmp = of_get_associativity(device);
+	if (tmp && (tmp[0] >= depth)) {
+		numa_domain = tmp[depth];
+	} else {
+		printk(KERN_ERR "WARNING: no NUMA information for "
+		       "%s\n", device->full_name);
+		numa_domain = 0;
+	}
+	return numa_domain;
+}
+
+/*
+ * In theory, the "ibm,associativity" property may contain multiple
+ * associativity lists because a resource may be multiply connected
+ * into the machine.  This resource then has different associativity
+ * characteristics relative to its multiple connections.  We ignore
+ * this for now.  We also assume that all cpu and memory sets have
+ * their distances represented at a common level.  This won't be
+ * true for heirarchical NUMA.
+ *
+ * In any case the ibm,associativity-reference-points should give
+ * the correct depth for a normal NUMA system.
+ *
+ * - Dave Hansen <haveblue@us.ibm.com>
+ */
+static int find_min_common_depth(void)
+{
+	int depth;
+	unsigned int *ref_points;
+	struct device_node *rtas_root;
+	unsigned int len;
+
+	rtas_root = of_find_node_by_path("/rtas");
+
+	if (!rtas_root) {
+		printk(KERN_ERR "WARNING: %s() could not find rtas root\n",
+				__FUNCTION__);
+		return -1;
+	}
+
+	/*
+	 * this property is 2 32-bit integers, each representing a level of
+	 * depth in the associativity nodes.  The first is for an SMP
+	 * configuration (should be all 0's) and the second is for a normal
+	 * NUMA configuration.
+	 */
+	ref_points = (unsigned int *)get_property(rtas_root,
+			"ibm,associativity-reference-points", &len);
+
+	if ((len >= 1) && ref_points) {
+		depth = ref_points[1];
+	} else {
+		printk(KERN_ERR "WARNING: could not find NUMA "
+				"associativity reference point\n");
+		depth = -1;
+	}
+	of_node_put(rtas_root);
+
+	return depth;
+}
+
+static unsigned long read_cell_ul(struct device_node *device, unsigned int **buf)
+{
+	int i;
+	unsigned long result = 0;
+
+	i = prom_n_size_cells(device);
+	/* bug on i>2 ?? */
+	while (i--) {
+		result = (result << 32) | **buf;
+		(*buf)++;
+	}
+	return result;
+}
+
 static int __init parse_numa_properties(void)
 {
 	struct device_node *cpu = NULL;
 	struct device_node *memory = NULL;
-	int *cpu_associativity;
-	int *memory_associativity;
 	int depth;
 	int max_domain = 0;
 	long entries = lmb_end_of_DRAM() >> MEMORY_INCREMENT_SHIFT;
-	long i;
+	unsigned long i;
 
 	if (strstr(saved_command_line, "numa=off")) {
 		printk(KERN_WARNING "NUMA disabled by user\n");
@@ -78,112 +198,78 @@
 	for (i = 0; i < entries ; i++)
 		numa_memory_lookup_table[i] = ARRAY_INITIALISER;
 
-	cpu = of_find_node_by_type(NULL, "cpu");
-	if (!cpu)
-		goto err;
-
-	memory = of_find_node_by_type(NULL, "memory");
-	if (!memory)
-		goto err;
-
-	cpu_associativity = (int *)get_property(cpu, "ibm,associativity", NULL);
-	if (!cpu_associativity)
-		goto err;
-
-	memory_associativity = (int *)get_property(memory, "ibm,associativity",
-						   NULL);
-	if (!memory_associativity)
-		goto err;
-
-	/* find common depth */
-	if (cpu_associativity[0] < memory_associativity[0])
-		depth = cpu_associativity[0];
-	else
-		depth = memory_associativity[0];
-
-	for (; cpu; cpu = of_find_node_by_type(cpu, "cpu")) {
-		int *tmp;
-		int cpu_nr, numa_domain;
+	depth = find_min_common_depth();
 
-		tmp = (int *)get_property(cpu, "reg", NULL);
-		if (!tmp)
-			continue;
-		cpu_nr = *tmp;
+	printk(KERN_INFO "NUMA associativity depth for CPU/Memory: %d\n", depth);
+	if (depth < 0)
+		return depth;
 
-		tmp = (int *)get_property(cpu, "ibm,associativity",
-					  NULL);
-		if (!tmp)
-			continue;
-		numa_domain = tmp[depth];
+	for_each_cpu(i) {
+		int numa_domain;
+
+		cpu = find_cpu_node(i);
 
-		/* FIXME */
-		if (numa_domain == 0xffff) {
-			dbg("cpu %d has no numa doman\n", cpu_nr);
+		if (cpu) {
+			numa_domain = of_node_numa_domain(cpu, depth);
+			of_node_put(cpu);
+
+			if (numa_domain >= MAX_NUMNODES) {
+				/*
+			 	 * POWER4 LPAR uses 0xffff as invalid node,
+				 * dont warn in this case.
+			 	 */
+				if (numa_domain != 0xffff)
+					printk(KERN_ERR "WARNING: cpu %ld "
+					       "maps to invalid NUMA node %d\n",
+					       i, numa_domain);
+				numa_domain = 0;
+			}
+		} else {
+			printk(KERN_ERR "WARNING: no NUMA information for "
+			       "cpu %ld\n", i);
 			numa_domain = 0;
 		}
 
-		if (numa_domain >= MAX_NUMNODES)
-			BUG();
-
 		node_set_online(numa_domain);
 
 		if (max_domain < numa_domain)
 			max_domain = numa_domain;
 
-		map_cpu_to_node(cpu_nr, numa_domain);
-		/* register the second thread on an SMT machine */
-		if (cur_cpu_spec->cpu_features & CPU_FTR_SMT)
-			map_cpu_to_node(cpu_nr ^ 0x1, numa_domain);
+		map_cpu_to_node(i, numa_domain);
 	}
 
-	for (; memory; memory = of_find_node_by_type(memory, "memory")) {
-		unsigned int *tmp1, *tmp2;
-		unsigned long i;
-		unsigned long start = 0;
-		unsigned long size = 0;
+	memory = NULL;
+	while ((memory = of_find_node_by_type(memory, "memory")) != NULL) {
+		unsigned long start;
+		unsigned long size;
 		int numa_domain;
 		int ranges;
+		unsigned int *memcell_buf;
+		unsigned int len;
 
-		tmp1 = (int *)get_property(memory, "reg", NULL);
-		if (!tmp1)
+		memcell_buf = (unsigned int *)get_property(memory, "reg", &len);
+		if (!memcell_buf || len <= 0)
 			continue;
 
 		ranges = memory->n_addrs;
 new_range:
-
-		i = prom_n_size_cells(memory);
-		while (i--) {
-			start = (start << 32) | *tmp1;
-			tmp1++;
-		}
-
-		i = prom_n_size_cells(memory);
-		while (i--) {
-			size = (size << 32) | *tmp1;
-			tmp1++;
-		}
+		/* these are order-sensitive, and modify the buffer pointer */
+		start = read_cell_ul(memory, &memcell_buf);
+		size = read_cell_ul(memory, &memcell_buf);
 
 		start = _ALIGN_DOWN(start, MEMORY_INCREMENT);
 		size = _ALIGN_UP(size, MEMORY_INCREMENT);
 
-		if ((start + size) > MAX_MEMORY)
-			BUG();
+		numa_domain = of_node_numa_domain(memory, depth);
 
-		tmp2 = (int *)get_property(memory, "ibm,associativity",
-					   NULL);
-		if (!tmp2)
-			continue;
-		numa_domain = tmp2[depth];
-
-		/* FIXME */
-		if (numa_domain == 0xffff) {
-			dbg("memory has no numa doman\n");
+		if (numa_domain >= MAX_NUMNODES) {
+			if (numa_domain != 0xffff)
+				printk(KERN_ERR "WARNING: memory at %lx maps "
+				       "to invalid NUMA node %d\n", start,
+				       numa_domain);
 			numa_domain = 0;
 		}
 
-		if (numa_domain >= MAX_NUMNODES)
-			BUG();
-
 		node_set_online(numa_domain);
 
 		if (max_domain < numa_domain)
@@ -205,11 +291,13 @@
 						start, size);
 				continue;
 			}
-			node_data[numa_domain].node_spanned_pages += size / PAGE_SIZE;
+			node_data[numa_domain].node_spanned_pages +=
+				size / PAGE_SIZE;
 		} else {
 			node_data[numa_domain].node_start_pfn =
 				start / PAGE_SIZE;
-			node_data[numa_domain].node_spanned_pages = size / PAGE_SIZE;
+			node_data[numa_domain].node_spanned_pages =
+				size / PAGE_SIZE;
 		}
 
 		for (i = start ; i < (start+size); i += MEMORY_INCREMENT)
@@ -227,10 +315,6 @@
 	numnodes = max_domain + 1;
 
 	return 0;
-err:
-	of_node_put(cpu);
-	of_node_put(memory);
-	return -1;
 }
 
 static void __init setup_nonnuma(void)
diff -Nru a/arch/ppc64/xmon/xmon.c b/arch/ppc64/xmon/xmon.c
--- a/arch/ppc64/xmon/xmon.c	2004-05-26 15:01:36 -07:00
+++ b/arch/ppc64/xmon/xmon.c	2004-05-26 15:01:36 -07:00
@@ -273,7 +273,7 @@
 		args.args[0] = SURVEILLANCE_TOKEN;
 		args.args[1] = 0;
 		args.args[2] = 0;
-		enter_rtas((void *) __pa(&args));
+		enter_rtas(__pa(&args));
 	}
 #endif
 }
@@ -1399,8 +1399,7 @@
 
 		/* Look for "regshere" marker to see if this is
 		   an exception frame. */
-		if (newsp - sp == sizeof(struct pt_regs) + 400
-		    && mread(sp + 0x60, &marker, sizeof(unsigned long))
+		if (mread(sp + 0x60, &marker, sizeof(unsigned long))
 		    && marker == 0x7265677368657265) {
 			if (mread(sp + 0x70, &regs, sizeof(regs))
 			    != sizeof(regs)) {
@@ -1417,12 +1416,6 @@
 
 		if (newsp == 0)
 			break;
-		if (newsp < sp) {
-			printf("Stack chain goes %s: %.16lx\n",
-			       (newsp < KERNELBASE? "into userspace":
-				"backwards"), newsp);
-			break;
-		}
 
 		sp = newsp;
 	} while (count++ < xmon_depth_to_print);
diff -Nru a/arch/sparc64/kernel/ioctl32.c b/arch/sparc64/kernel/ioctl32.c
--- a/arch/sparc64/kernel/ioctl32.c	2004-05-26 15:01:36 -07:00
+++ b/arch/sparc64/kernel/ioctl32.c	2004-05-26 15:01:36 -07:00
@@ -148,306 +148,6 @@
 	return ret;
 }
 
-struct ncp_ioctl_request_32 {
-	unsigned int function;
-	unsigned int size;
-	compat_caddr_t data;
-};
-
-struct ncp_fs_info_v2_32 {
-	int version;
-	unsigned int mounted_uid;
-	unsigned int connection;
-	unsigned int buffer_size;
-
-	unsigned int volume_number;
-	__u32 directory_id;
-
-	__u32 dummy1;
-	__u32 dummy2;
-	__u32 dummy3;
-};
-
-struct ncp_objectname_ioctl_32
-{
-	int		auth_type;
-	unsigned int	object_name_len;
-	compat_caddr_t	object_name;	/* an userspace data, in most cases user name */
-};
-
-struct ncp_privatedata_ioctl_32
-{
-	unsigned int	len;
-	compat_caddr_t	data;		/* ~1000 for NDS */
-};
-
-#define	NCP_IOC_NCPREQUEST_32		_IOR('n', 1, struct ncp_ioctl_request_32)
-
-#define NCP_IOC_GETMOUNTUID2_32		_IOW('n', 2, unsigned int)
-
-#define NCP_IOC_GET_FS_INFO_V2_32	_IOWR('n', 4, struct ncp_fs_info_v2_32)
-
-#define NCP_IOC_GETOBJECTNAME_32	_IOWR('n', 9, struct ncp_objectname_ioctl_32)
-#define NCP_IOC_SETOBJECTNAME_32	_IOR('n', 9, struct ncp_objectname_ioctl_32)
-#define NCP_IOC_GETPRIVATEDATA_32	_IOWR('n', 10, struct ncp_privatedata_ioctl_32)
-#define NCP_IOC_SETPRIVATEDATA_32	_IOR('n', 10, struct ncp_privatedata_ioctl_32)
-
-static int do_ncp_ncprequest(unsigned int fd, unsigned int cmd, unsigned long arg)
-{
-	struct ncp_ioctl_request_32 n32;
-	struct ncp_ioctl_request n;
-	mm_segment_t old_fs;
-	int err;
-
-	if (copy_from_user(&n32, (struct ncp_ioctl_request_32*)arg,
-	    sizeof(n32)))
-		return -EFAULT;
-
-	n.function = n32.function;
-	n.size = n32.size;
-	if (n.size > 65536)
-		return -EINVAL;
-	n.data = vmalloc(65536);	/* 65536 must be same as NCP_PACKET_SIZE_INTERNAL in ncpfs */
-	if (!n.data)
-		return -ENOMEM;
-	err = -EFAULT;
-	if (copy_from_user(n.data, A(n32.data), n.size))
-		goto out;
-
-	old_fs = get_fs(); set_fs (KERNEL_DS);
-	err = sys_ioctl (fd, NCP_IOC_NCPREQUEST, (unsigned long)&n);
-	set_fs (old_fs);
-        if(err <= 0)
-		goto out;
-	if (err > 65536) {
-		err = -EINVAL;
-		goto out;
-	}
-	if (copy_to_user(A(n32.data), n.data, err)) {
-		err = -EFAULT;
-		goto out;
-	}
- out:
-	vfree(n.data);
-	return err;
-}
-
-static int do_ncp_getmountuid2(unsigned int fd, unsigned int cmd, unsigned long arg)
-{
-	mm_segment_t old_fs = get_fs();
-	__kernel_uid_t kuid;
-	int err;
-
-	cmd = NCP_IOC_GETMOUNTUID2;
-
-	set_fs(KERNEL_DS);
-	err = sys_ioctl(fd, cmd, (unsigned long)&kuid);
-	set_fs(old_fs);
-
-	if (!err)
-		err = put_user(kuid, (unsigned int*)arg);
-
-	return err;
-}
-
-static int do_ncp_getfsinfo2(unsigned int fd, unsigned int cmd, unsigned long arg)
-{
-	mm_segment_t old_fs = get_fs();
-	struct ncp_fs_info_v2_32 n32;
-	struct ncp_fs_info_v2 n;
-	int err;
-
-	if (copy_from_user(&n32, (struct ncp_fs_info_v2_32*)arg, sizeof(n32)))
-		return -EFAULT;
-	if (n32.version != NCP_GET_FS_INFO_VERSION_V2)
-		return -EINVAL;
-	n.version = NCP_GET_FS_INFO_VERSION_V2;
-
-	set_fs(KERNEL_DS);
-	err = sys_ioctl(fd, NCP_IOC_GET_FS_INFO_V2, (unsigned long)&n);
-	set_fs(old_fs);
-
-	if (!err) {
-		n32.version = n.version;
-		n32.mounted_uid = n.mounted_uid;
-		n32.connection = n.connection;
-		n32.buffer_size = n.buffer_size;
-		n32.volume_number = n.volume_number;
-		n32.directory_id = n.directory_id;
-		n32.dummy1 = n.dummy1;
-		n32.dummy2 = n.dummy2;
-		n32.dummy3 = n.dummy3;
-		err = copy_to_user((struct ncp_fs_info_v2_32*)arg, &n32, sizeof(n32)) ? -EFAULT : 0;
-	}
-	return err;
-}
-
-static int do_ncp_getobjectname(unsigned int fd, unsigned int cmd, unsigned long arg)
-{
-	struct ncp_objectname_ioctl_32 n32;
-	struct ncp_objectname_ioctl n;
-	mm_segment_t old_fs;
-	int err;
-	size_t tl;
-
-	if (copy_from_user(&n32, (struct ncp_objectname_ioctl_32*)arg,
-	    sizeof(n32)))
-		return -EFAULT;
-
-	n.object_name_len = tl = n32.object_name_len;
-	if (tl) {
-		n.object_name = kmalloc(tl, GFP_KERNEL);
-		if (!n.object_name)
-			return -ENOMEM;
-	} else {
-		n.object_name = NULL;
-	}
-
-	old_fs = get_fs(); set_fs (KERNEL_DS);
-	err = sys_ioctl (fd, NCP_IOC_GETOBJECTNAME, (unsigned long)&n);
-	set_fs (old_fs);
-        if(err)
-		goto out;
-		
-	if (tl > n.object_name_len)
-		tl = n.object_name_len;
-
-	err = -EFAULT;
-	if (tl && copy_to_user(A(n32.object_name), n.object_name, tl))
-		goto out;
-
-	n32.auth_type = n.auth_type;
-	n32.object_name_len = n.object_name_len;
-	
-	if (copy_to_user((struct ncp_objectname_ioctl_32*)arg, &n32, sizeof(n32)))
-		goto out;
-	
-	err = 0;
- out:
- 	if (n.object_name)
-		kfree(n.object_name);
-
-	return err;
-}
-
-static int do_ncp_setobjectname(unsigned int fd, unsigned int cmd, unsigned long arg)
-{
-	struct ncp_objectname_ioctl_32 n32;
-	struct ncp_objectname_ioctl n;
-	mm_segment_t old_fs;
-	int err;
-	size_t tl;
-
-	if (copy_from_user(&n32, (struct ncp_objectname_ioctl_32*)arg,
-	    sizeof(n32)))
-		return -EFAULT;
-
-	n.auth_type = n32.auth_type;
-	n.object_name_len = tl = n32.object_name_len;
-	if (tl) {
-		n.object_name = kmalloc(tl, GFP_KERNEL);
-		if (!n.object_name)
-			return -ENOMEM;
-		err = -EFAULT;
-		if (copy_from_user(n.object_name, A(n32.object_name), tl))
-			goto out;
-	} else {
-		n.object_name = NULL;
-	}
-	
-	old_fs = get_fs(); set_fs (KERNEL_DS);
-	err = sys_ioctl (fd, NCP_IOC_SETOBJECTNAME, (unsigned long)&n);
-	set_fs (old_fs);
-		
- out:
-	if (n.object_name)
-		kfree(n.object_name);
-
-	return err;
-}
-
-static int do_ncp_getprivatedata(unsigned int fd, unsigned int cmd, unsigned long arg)
-{
-	struct ncp_privatedata_ioctl_32 n32;
-	struct ncp_privatedata_ioctl n;
-	mm_segment_t old_fs;
-	int err;
-	size_t tl;
-
-	if (copy_from_user(&n32, (struct ncp_privatedata_ioctl_32*)arg,
-	    sizeof(n32)))
-		return -EFAULT;
-
-	n.len = tl = n32.len;
-	if (tl) {
-		n.data = kmalloc(tl, GFP_KERNEL);
-		if (!n.data)
-			return -ENOMEM;
-	} else {
-		n.data = NULL;
-	}
-
-	old_fs = get_fs(); set_fs (KERNEL_DS);
-	err = sys_ioctl (fd, NCP_IOC_GETPRIVATEDATA, (unsigned long)&n);
-	set_fs (old_fs);
-        if(err)
-		goto out;
-		
-	if (tl > n.len)
-		tl = n.len;
-
-	err = -EFAULT;
-	if (tl && copy_to_user(A(n32.data), n.data, tl))
-		goto out;
-
-	n32.len = n.len;
-	
-	if (copy_to_user((struct ncp_privatedata_ioctl_32*)arg, &n32, sizeof(n32)))
-		goto out;
-	
-	err = 0;
- out:
- 	if (n.data)
-		kfree(n.data);
-
-	return err;
-}
-
-static int do_ncp_setprivatedata(unsigned int fd, unsigned int cmd, unsigned long arg)
-{
-	struct ncp_privatedata_ioctl_32 n32;
-	struct ncp_privatedata_ioctl n;
-	mm_segment_t old_fs;
-	int err;
-	size_t tl;
-
-	if (copy_from_user(&n32, (struct ncp_privatedata_ioctl_32*)arg,
-	    sizeof(n32)))
-		return -EFAULT;
-
-	n.len = tl = n32.len;
-	if (tl) {
-		n.data = kmalloc(tl, GFP_KERNEL);
-		if (!n.data)
-			return -ENOMEM;
-		err = -EFAULT;
-		if (copy_from_user(n.data, A(n32.data), tl))
-			goto out;
-	} else {
-		n.data = NULL;
-	}
-	
-	old_fs = get_fs(); set_fs (KERNEL_DS);
-	err = sys_ioctl (fd, NCP_IOC_SETPRIVATEDATA, (unsigned long)&n);
-	set_fs (old_fs);
-		
- out:
-	if (n.data)
-		kfree(n.data);
-
-	return err;
-}
-
 #if defined(CONFIG_DRM) || defined(CONFIG_DRM_MODULE)
 /* This really belongs in include/linux/drm.h -DaveM */
 #include "../../../drivers/char/drm/drm.h"
@@ -1070,18 +770,6 @@
 COMPATIBLE_IOCTL(AUDIO_GETDEV_SUNOS)
 COMPATIBLE_IOCTL(AUDIO_FLUSH)
 COMPATIBLE_IOCTL(AUTOFS_IOC_EXPIRE_MULTI)
-/* NCP ioctls which do not need any translations */
-COMPATIBLE_IOCTL(NCP_IOC_CONN_LOGGED_IN)
-COMPATIBLE_IOCTL(NCP_IOC_SIGN_INIT)
-COMPATIBLE_IOCTL(NCP_IOC_SIGN_WANTED)
-COMPATIBLE_IOCTL(NCP_IOC_SET_SIGN_WANTED)
-COMPATIBLE_IOCTL(NCP_IOC_LOCKUNLOCK)
-COMPATIBLE_IOCTL(NCP_IOC_GETROOT)
-COMPATIBLE_IOCTL(NCP_IOC_SETROOT)
-COMPATIBLE_IOCTL(NCP_IOC_GETCHARSETS)
-COMPATIBLE_IOCTL(NCP_IOC_SETCHARSETS)
-COMPATIBLE_IOCTL(NCP_IOC_GETDENTRYTTL)
-COMPATIBLE_IOCTL(NCP_IOC_SETDENTRYTTL)
 #if defined(CONFIG_DRM) || defined(CONFIG_DRM_MODULE)
 COMPATIBLE_IOCTL(DRM_IOCTL_GET_MAGIC)
 COMPATIBLE_IOCTL(DRM_IOCTL_IRQ_BUSID)
@@ -1107,14 +795,6 @@
 COMPATIBLE_IOCTL(WIOCSTOP)
 COMPATIBLE_IOCTL(WIOCGSTAT)
 /* And these ioctls need translation */
-/* NCPFS */
-HANDLE_IOCTL(NCP_IOC_NCPREQUEST_32, do_ncp_ncprequest)
-HANDLE_IOCTL(NCP_IOC_GETMOUNTUID2_32, do_ncp_getmountuid2)
-HANDLE_IOCTL(NCP_IOC_GET_FS_INFO_V2_32, do_ncp_getfsinfo2)
-HANDLE_IOCTL(NCP_IOC_GETOBJECTNAME_32, do_ncp_getobjectname)
-HANDLE_IOCTL(NCP_IOC_SETOBJECTNAME_32, do_ncp_setobjectname)
-HANDLE_IOCTL(NCP_IOC_GETPRIVATEDATA_32, do_ncp_getprivatedata)
-HANDLE_IOCTL(NCP_IOC_SETPRIVATEDATA_32, do_ncp_setprivatedata)
 /* Note SIOCRTMSG is no longer, so this is safe and * the user would have seen just an -EINVAL anyways. */
 HANDLE_IOCTL(FBIOPUTCMAP32, fbiogetputcmap)
 HANDLE_IOCTL(FBIOGETCMAP32, fbiogetputcmap)
diff -Nru a/drivers/block/ll_rw_blk.c b/drivers/block/ll_rw_blk.c
--- a/drivers/block/ll_rw_blk.c	2004-05-26 15:01:35 -07:00
+++ b/drivers/block/ll_rw_blk.c	2004-05-26 15:01:35 -07:00
@@ -2824,19 +2824,13 @@
 		panic("Failed to create kblockd\n");
 
 	request_cachep = kmem_cache_create("blkdev_requests",
-			sizeof(struct request), 0, 0, NULL, NULL);
-	if (!request_cachep)
-		panic("Can't create request pool slab cache\n");
+			sizeof(struct request), 0, SLAB_PANIC, NULL, NULL);
 
 	requestq_cachep = kmem_cache_create("blkdev_queue",
-			sizeof(request_queue_t), 0, 0, NULL, NULL);
-	if (!requestq_cachep)
-		panic("Can't create request queue slab cache\n");
+			sizeof(request_queue_t), 0, SLAB_PANIC, NULL, NULL);
 
 	iocontext_cachep = kmem_cache_create("blkdev_ioc",
-			sizeof(struct io_context), 0, 0, NULL, NULL);
-	if (!iocontext_cachep)
-		panic("Can't create io context slab cache\n");
+			sizeof(struct io_context), 0, SLAB_PANIC, NULL, NULL);
 
 	blk_max_low_pfn = max_low_pfn;
 	blk_max_pfn = max_pfn;
diff -Nru a/drivers/block/viodasd.c b/drivers/block/viodasd.c
--- a/drivers/block/viodasd.c	2004-05-26 15:01:35 -07:00
+++ b/drivers/block/viodasd.c	2004-05-26 15:01:35 -07:00
@@ -40,8 +40,11 @@
 #include <linux/string.h>
 #include <linux/dma-mapping.h>
 #include <linux/completion.h>
+#include <linux/device.h>
+#include <linux/kernel.h>
 
 #include <asm/uaccess.h>
+#include <asm/vio.h>
 #include <asm/iSeries/HvTypes.h>
 #include <asm/iSeries/HvLpEvent.h>
 #include <asm/iSeries/HvLpConfig.h>
@@ -519,13 +522,6 @@
 		       "bad rc sending event to OS/400 %d\n", (int)hvrc);
 		return;
 	}
-	printk(VIOD_KERN_INFO "disk %d: %lu sectors (%lu MB) "
-			"CHS=%d/%d/%d sector size %d%s\n",
-			dev_no, (unsigned long)(d->size >> 9),
-			(unsigned long)(d->size >> 20),
-			(int)d->cylinders, (int)d->tracks,
-			(int)d->sectors, (int)d->bytes_per_sector,
-			d->read_only ? " (RO)" : "");
 	/* create the request queue for the disk */
 	spin_lock_init(&d->q_lock);
 	q = blk_init_queue(do_viodasd_request, &d->q_lock);
@@ -563,6 +559,14 @@
 	g->private_data = d;
 	set_capacity(g, d->size >> 9);
 
+	printk(VIOD_KERN_INFO "disk %d: %lu sectors (%lu MB) "
+			"CHS=%d/%d/%d sector size %d%s\n",
+			dev_no, (unsigned long)(d->size >> 9),
+			(unsigned long)(d->size >> 20),
+			(int)d->cylinders, (int)d->tracks,
+			(int)d->sectors, (int)d->bytes_per_sector,
+			d->read_only ? " (RO)" : "");
+
 	/* register us in the global list */
 	add_disk(g);
 }
@@ -725,6 +729,26 @@
 }
 
 /*
+ * Get the driver to reprobe for more disks.
+ */
+static ssize_t probe_disks(struct device_driver *drv, const char *buf,
+		size_t count)
+{
+	struct viodasd_device *d;
+
+	for (d = viodasd_devices; d < &viodasd_devices[MAX_DISKNO]; d++) {
+		if (d->disk == NULL)
+			probe_disk(d);
+	}
+	return count;
+}
+static DRIVER_ATTR(probe, S_IWUSR, NULL, probe_disks)
+
+static struct vio_driver viodasd_driver = {
+	.name = "viodasd"
+};
+
+/*
  * Initialize the whole device driver.  Handle module and non-module
  * versions
  */
@@ -767,6 +791,9 @@
 	for (i = 0; i < MAX_DISKNO; i++)
 		probe_disk(&viodasd_devices[i]);
 
+	vio_register_driver(&viodasd_driver);	/* FIX ME - error checking */
+	driver_create_file(&viodasd_driver.driver, &driver_attr_probe);
+
 	return 0;
 }
 module_init(viodasd_init);
@@ -775,6 +802,9 @@
 {
 	int i;
 	struct viodasd_device *d;
+
+	driver_remove_file(&viodasd_driver.driver, &driver_attr_probe);
+	vio_unregister_driver(&viodasd_driver);
 
         for (i = 0; i < MAX_DISKNO; i++) {
 		d = &viodasd_devices[i];
diff -Nru a/drivers/bluetooth/bt3c_cs.c b/drivers/bluetooth/bt3c_cs.c
--- a/drivers/bluetooth/bt3c_cs.c	2004-05-26 15:01:36 -07:00
+++ b/drivers/bluetooth/bt3c_cs.c	2004-05-26 15:01:36 -07:00
@@ -491,6 +491,9 @@
 
 static struct device bt3c_device = {
 	.bus_id = "pcmcia",
+	.kobj = {
+		.k_name = "bt3c"
+	}
 };
 
 
diff -Nru a/drivers/bluetooth/hci_bcsp.c b/drivers/bluetooth/hci_bcsp.c
--- a/drivers/bluetooth/hci_bcsp.c	2004-05-26 15:01:36 -07:00
+++ b/drivers/bluetooth/hci_bcsp.c	2004-05-26 15:01:36 -07:00
@@ -33,7 +33,6 @@
 #include <linux/config.h>
 #include <linux/module.h>
 
-#include <linux/config.h>
 #include <linux/kernel.h>
 #include <linux/init.h>
 #include <linux/sched.h>
diff -Nru a/drivers/input/serio/sa1111ps2.c b/drivers/input/serio/sa1111ps2.c
--- a/drivers/input/serio/sa1111ps2.c	2004-05-26 15:01:36 -07:00
+++ b/drivers/input/serio/sa1111ps2.c	2004-05-26 15:01:36 -07:00
@@ -45,7 +45,6 @@
 {
 	struct ps2if *ps2if = dev_id;
 	unsigned int scancode, flag, status;
-	int handled = IRQ_NONE;
 
 	status = sa1111_readl(ps2if->base + SA1111_PS2STAT);
 	while (status & PS2STAT_RXF) {
@@ -63,11 +62,9 @@
 		serio_interrupt(&ps2if->io, scancode, flag, regs);
 
 		status = sa1111_readl(ps2if->base + SA1111_PS2STAT);
-
-		handled = IRQ_HANDLED;
         }
 
-        return handled;
+        return IRQ_HANDLED;
 }
 
 /*
diff -Nru a/drivers/media/video/ir-kbd-gpio.c b/drivers/media/video/ir-kbd-gpio.c
--- a/drivers/media/video/ir-kbd-gpio.c	2004-05-26 15:01:36 -07:00
+++ b/drivers/media/video/ir-kbd-gpio.c	2004-05-26 15:01:36 -07:00
@@ -64,7 +64,7 @@
 	[ 13 ] = KEY_STOP,        // freeze 
 	[ 29 ] = KEY_RECORD,      // capture 
 	[  3 ] = KEY_PLAY,        // unmarked
-	[ 24 ] = KEY_RED,         // unmarked
+	[ 23 ] = KEY_RED,         // unmarked
 	[  7 ] = KEY_GREEN,       // unmarked
 
 #if 0
diff -Nru a/drivers/media/video/mxb.c b/drivers/media/video/mxb.c
--- a/drivers/media/video/mxb.c	2004-05-26 15:01:35 -07:00
+++ b/drivers/media/video/mxb.c	2004-05-26 15:01:35 -07:00
@@ -24,42 +24,15 @@
 #define DEBUG_VARIABLE debug
 
 #include <media/saa7146_vv.h>
-#include <linux/video_decoder.h>	/* for saa7111a */
+#include <media/tuner.h>
+#include <linux/video_decoder.h>
 
 #include "mxb.h"
 #include "tea6415c.h"
 #include "tea6420.h"
 #include "tda9840.h"
-#include <media/tuner.h>
 
-#define I2C_SAA7111A            0x24
-
-/* All unused bytes are reserverd. */
-#define SAA711X_CHIP_VERSION            0x00
-#define SAA711X_ANALOG_INPUT_CONTROL_1  0x02
-#define SAA711X_ANALOG_INPUT_CONTROL_2  0x03
-#define SAA711X_ANALOG_INPUT_CONTROL_3  0x04
-#define SAA711X_ANALOG_INPUT_CONTROL_4  0x05
-#define SAA711X_HORIZONTAL_SYNC_START   0x06
-#define SAA711X_HORIZONTAL_SYNC_STOP    0x07
-#define SAA711X_SYNC_CONTROL            0x08
-#define SAA711X_LUMINANCE_CONTROL       0x09
-#define SAA711X_LUMINANCE_BRIGHTNESS    0x0A
-#define SAA711X_LUMINANCE_CONTRAST      0x0B
-#define SAA711X_CHROMA_SATURATION       0x0C
-#define SAA711X_CHROMA_HUE_CONTROL      0x0D
-#define SAA711X_CHROMA_CONTROL          0x0E
-#define SAA711X_FORMAT_DELAY_CONTROL    0x10
-#define SAA711X_OUTPUT_CONTROL_1        0x11
-#define SAA711X_OUTPUT_CONTROL_2        0x12
-#define SAA711X_OUTPUT_CONTROL_3        0x13
-#define SAA711X_V_GATE_1_START          0x15
-#define SAA711X_V_GATE_1_STOP           0x16
-#define SAA711X_V_GATE_1_MSB            0x17
-#define SAA711X_TEXT_SLICER_STATUS      0x1A
-#define SAA711X_DECODED_BYTES_OF_TS_1   0x1B
-#define SAA711X_DECODED_BYTES_OF_TS_2   0x1C
-#define SAA711X_STATUS_BYTE             0x1F
+#define I2C_SAA7111 0x24
 
 #define MXB_BOARD_CAN_DO_VBI(dev)   (dev->revision != 0) 
 
@@ -175,42 +148,33 @@
 
 static struct saa7146_extension extension;
 
-static int mxb_vbi_bypass(struct saa7146_dev* dev)
-{
-	struct mxb* mxb = (struct mxb*)dev->ext_priv;
-	s32 byte = 0x0;
-	int result = 0;
-
-	DEB_EE(("dev:%p\n",dev));
-
-	/* switch bypass in saa7111a, this should be done in the
-	   saa7111a driver of course... */
-	if ( -1 == (result = i2c_smbus_read_byte_data(mxb->saa7111a, SAA711X_OUTPUT_CONTROL_3))) {
-		DEB_D(("could not read from saa7111a.\n"));
-		return -EFAULT;
-	}
-	byte = result;
-	byte &= 0xf0;
-	byte |= 0x0a;
-
-	if ( 0 != (result = i2c_smbus_write_byte_data(mxb->saa7111a, SAA711X_OUTPUT_CONTROL_3, byte))) {
-		DEB_D(("could not write to saa7111a.\n"));
-		return -EFAULT;
-	}
-	return 0;
-}
-
 static int mxb_probe(struct saa7146_dev* dev)
 {
 	struct mxb* mxb = 0;
 	struct i2c_client *client;
 	struct list_head *item;
+	int result;
 
-	request_module("tuner");
-	request_module("tea6420");
-	request_module("tea6415c");
-	request_module("tda9840");
-	request_module("saa7111");
+	if ((result = request_module("saa7111")) < 0) {
+		printk("mxb: saa7111 i2c module not available.\n");
+		return -ENODEV;
+	}
+	if ((result = request_module("tuner")) < 0) {
+		printk("mxb: tuner i2c module not available.\n");
+		return -ENODEV;
+	}
+	if ((result = request_module("tea6420")) < 0) {
+		printk("mxb: tea6420 i2c module not available.\n");
+		return -ENODEV;
+	}
+	if ((result = request_module("tea6415c")) < 0) {
+		printk("mxb: tea6415c i2c module not available.\n");
+		return -ENODEV;
+	}
+	if ((result = request_module("tda9840")) < 0) {
+		printk("mxb: tda9840 i2c module not available.\n");
+		return -ENODEV;
+	}
 
 	mxb = (struct mxb*)kmalloc(sizeof(struct mxb), GFP_KERNEL);
 	if( NULL == mxb ) {
@@ -219,10 +183,6 @@
 	}
 	memset(mxb, 0x0, sizeof(struct mxb));	
 
-	/* FIXME: enable i2c-port pins, video-port-pins
-	   video port pins should be enabled here ?! */
-	saa7146_write(dev, MC1, (MASK_08 | MASK_24 | MASK_10 | MASK_26));
-
 	saa7146_i2c_adapter_prepare(dev, &mxb->i2c_adapter, I2C_CLASS_TV_ANALOG, SAA7146_I2C_BUS_BIT_RATE_480);
 	if(i2c_add_adapter(&mxb->i2c_adapter) < 0) {
 		DEB_S(("cannot register i2c-device. skipping.\n"));
@@ -241,7 +201,7 @@
 			mxb->tea6415c = client;
 		if( I2C_TDA9840 == client->addr ) 
 			mxb->tda9840 = client;
-		if( I2C_SAA7111A == client->addr ) 
+		if( I2C_SAA7111 == client->addr )
 			mxb->saa7111a = client;
 		if( 0x60 == client->addr ) 
 			mxb->tuner = client;
@@ -251,8 +211,7 @@
 	if(    0 == mxb->tea6420_1	|| 0 == mxb->tea6420_2	|| 0 == mxb->tea6415c
 	    || 0 == mxb->tda9840	|| 0 == mxb->saa7111a	|| 0 == mxb->tuner ) {
 
-		printk("mxb: did not find all i2c devices. are you sure you\n");
-		printk("mxb: insmod'ed tea6420, tea6415c, saa7111, tea6415c and tuner?\n");
+		printk("mxb: did not find all i2c devices. aborting\n");
 		i2c_del_adapter(&mxb->i2c_adapter);
 		kfree(mxb);
 		return -ENODEV;
@@ -322,37 +281,35 @@
 	{-1, { 0} }
 };
 
-static unsigned char mxb_saa7111_init[25] = {
-	0x00,
-	
-	0x00,	  /* 00 - ID byte */
-	0x00,	  /* 01 - reserved */
+static const unsigned char mxb_saa7111_init[] = {
+	0x00, 0x00,	  /* 00 - ID byte */
+	0x01, 0x00,	  /* 01 - reserved */
 
 	/*front end */
-	0xd8,	  /* 02 - FUSE=x, GUDL=x, MODE=x */
-	0x23,	  /* 03 - HLNRS=0, VBSL=1, WPOFF=0, HOLDG=0, GAFIX=0, GAI1=256, GAI2=256 */
-	0x00,	  /* 04 - GAI1=256 */
-	0x00,	  /* 05 - GAI2=256 */
+	0x02, 0xd8,	  /* 02 - FUSE=x, GUDL=x, MODE=x */
+	0x03, 0x23,	  /* 03 - HLNRS=0, VBSL=1, WPOFF=0, HOLDG=0, GAFIX=0, GAI1=256, GAI2=256 */
+	0x04, 0x00,	  /* 04 - GAI1=256 */
+	0x05, 0x00,	  /* 05 - GAI2=256 */
 
 	/* decoder */
-	0xf0,	  /* 06 - HSB at  xx(50Hz) /  xx(60Hz) pixels after end of last line */
-	0x30,	  /* 07 - HSS at  xx(50Hz) /  xx(60Hz) pixels after end of last line */
-	0xa8,	  /* 08 - AUFD=x, FSEL=x, EXFIL=x, VTRC=x, HPLL=x, VNOI=x */
-	0x02,	  /* 09 - BYPS=x, PREF=x, BPSS=x, VBLB=x, UPTCV=x, APER=x */
-	0x80,	  /* 0a - BRIG=128 */
-	0x47,	  /* 0b - CONT=1.109 */
-	0x40,	  /* 0c - SATN=1.0 */
-	0x00,	  /* 0d - HUE=0 */
-	0x01,	  /* 0e - CDTO=0, CSTD=0, DCCF=0, FCTC=0, CHBW=1 */
-	0x00,	  /* 0f - reserved */
-	0xd0,	  /* 10 - OFTS=x, HDEL=x, VRLN=x, YDEL=x */
-	0x8c,	  /* 11 - GPSW=x, CM99=x, FECO=x, COMPO=x, OEYC=1, OEHV=1, VIPB=0, COLO=0 */
-	0x80,	  /* 12 - xx output control 2 */
-	0x30,	  /* 13 - xx output control 3 */
-	0x00,	  /* 14 - reserved */
-	0x15,	  /* 15 - VBI */
-	0x04,	  /* 16 - VBI */
-	0x00,	  /* 17 - VBI */
+	0x06, 0xf0,	  /* 06 - HSB at  xx(50Hz) /  xx(60Hz) pixels after end of last line */
+	0x07, 0x30,	  /* 07 - HSS at  xx(50Hz) /  xx(60Hz) pixels after end of last line */
+	0x08, 0xa8,	  /* 08 - AUFD=x, FSEL=x, EXFIL=x, VTRC=x, HPLL=x, VNOI=x */
+	0x09, 0x02,	  /* 09 - BYPS=x, PREF=x, BPSS=x, VBLB=x, UPTCV=x, APER=x */
+	0x0a, 0x80,	  /* 0a - BRIG=128 */
+	0x0b, 0x47,	  /* 0b - CONT=1.109 */
+	0x0c, 0x40,	  /* 0c - SATN=1.0 */
+	0x0d, 0x00,	  /* 0d - HUE=0 */
+	0x0e, 0x01,	  /* 0e - CDTO=0, CSTD=0, DCCF=0, FCTC=0, CHBW=1 */
+	0x0f, 0x00,	  /* 0f - reserved */
+	0x10, 0xd0,	  /* 10 - OFTS=x, HDEL=x, VRLN=x, YDEL=x */
+	0x11, 0x8c,	  /* 11 - GPSW=x, CM99=x, FECO=x, COMPO=x, OEYC=1, OEHV=1, VIPB=0, COLO=0 */
+	0x12, 0x80,	  /* 12 - xx output control 2 */
+	0x13, 0x30,	  /* 13 - xx output control 3 */
+	0x14, 0x00,	  /* 14 - reserved */
+	0x15, 0x15,	  /* 15 - VBI */
+	0x16, 0x04,	  /* 16 - VBI */
+	0x17, 0x00,	  /* 17 - VBI */
 };
 
 /* bring hardware to a sane state. this has to be done, just in case someone
@@ -362,25 +319,29 @@
 static int mxb_init_done(struct saa7146_dev* dev)
 {
 	struct mxb* mxb = (struct mxb*)dev->ext_priv;
-	
+	struct video_decoder_init init;
 	struct i2c_msg msg;
 
 	int i = 0, err = 0;
 	struct	tea6415c_multiplex vm;	
 
+	/* select video mode in saa7111a */
+	i = VIDEO_MODE_PAL;
+	/* fixme: currently pointless: gets overwritten by configuration below */
+	mxb->saa7111a->driver->command(mxb->saa7111a,DECODER_SET_NORM, &i);
+
 	/* write configuration to saa7111a */
-	i = i2c_master_send(mxb->saa7111a, mxb_saa7111_init, sizeof(mxb_saa7111_init));
-	if (i < 0) {
-		printk("failed to initialize saa7111a. this should never happen.\n");
-	}
+	init.data = mxb_saa7111_init;
+	init.len = sizeof(mxb_saa7111_init);
+	mxb->saa7111a->driver->command(mxb->saa7111a,DECODER_INIT, &init);
 
 	/* select tuner-output on saa7111a */
 	i = 0;
 	mxb->saa7111a->driver->command(mxb->saa7111a,DECODER_SET_INPUT, &i);
-//	i = VIDEO_MODE_PAL;
-//	mxb->saa7111a->driver->command(mxb->saa7111a,DECODER_SET_NORM, &i);
 
-	mxb_vbi_bypass(dev);
+	/* enable vbi bypass */
+	i = 1;
+	mxb->saa7111a->driver->command(mxb->saa7111a,DECODER_SET_VBI_BYPASS, &i);
 
 	/* select a tuner type */
 	i = 5; 
@@ -538,36 +499,6 @@
 	return 0;
 }
 
-/* hack: this should go into saa711x */
-static int saa7111_set_gpio(struct saa7146_dev *dev, int bl)
-{
-	struct mxb* mxb = (struct mxb*)dev->ext_priv;
-	s32 byte = 0x0;
-	int result = 0;
-	
-	DEB_EE(("dev:%p\n",dev));
-
-	/* get the old register contents */
-	if ( -1 == (byte = i2c_smbus_read_byte_data(mxb->saa7111a, SAA711X_OUTPUT_CONTROL_1))) {
-		DEB_D(("could not read from saa711x\n"));
-		return -EFAULT;
-	}
-	
-	if( 0 == bl ) {
-		byte &= 0x7f;
-	} else {
-		byte |= 0x80;
-	}
-
-	/* write register contents back */
-	if ( 0 != (result = i2c_smbus_write_byte_data(mxb->saa7111a, SAA711X_OUTPUT_CONTROL_1, byte))) {
-		DEB_D(("could not write to saa711x\n"));
-		return -EFAULT;
-	}
-
-	return 0;
-}
-
 static int mxb_ioctl(struct saa7146_fh *fh, unsigned int cmd, void *arg) 
 {
 	struct saa7146_dev *dev = fh->dev;
@@ -988,18 +919,22 @@
 
 static int std_callback(struct saa7146_dev* dev, struct saa7146_standard *std)
 {
+	struct mxb* mxb = (struct mxb*)dev->ext_priv;
+	int zero = 0;
+	int one = 1;
+
 	if(V4L2_STD_PAL_I == std->id ) {
 		DEB_D(("VIDIOC_S_STD: setting mxb for PAL_I.\n"));
 		/* set the 7146 gpio register -- I don't know what this does exactly */
       		saa7146_write(dev, GPIO_CTRL, 0x00404050);
 		/* unset the 7111 gpio register -- I don't know what this does exactly */
-		saa7111_set_gpio(dev,0);
+		mxb->saa7111a->driver->command(mxb->saa7111a,DECODER_SET_GPIO, &zero);
 	} else {
 		DEB_D(("VIDIOC_S_STD: setting mxb for PAL/NTSC/SECAM.\n"));
 		/* set the 7146 gpio register -- I don't know what this does exactly */
       		saa7146_write(dev, GPIO_CTRL, 0x00404050);
 		/* set the 7111 gpio register -- I don't know what this does exactly */
-		saa7111_set_gpio(dev,1);
+		mxb->saa7111a->driver->command(mxb->saa7111a,DECODER_SET_GPIO, &one);
 	}
 	return 0;
 }
diff -Nru a/drivers/mtd/chips/sharp.c b/drivers/mtd/chips/sharp.c
--- a/drivers/mtd/chips/sharp.c	2004-05-26 15:01:36 -07:00
+++ b/drivers/mtd/chips/sharp.c	2004-05-26 15:01:36 -07:00
@@ -30,6 +30,7 @@
 #include <linux/mtd/mtd.h>
 #include <linux/mtd/cfi.h>
 #include <linux/delay.h>
+#include <linux/init.h>
 
 #define CMD_RESET		0xffffffff
 #define CMD_READ_ID		0x90909090
diff -Nru a/drivers/mtd/maps/uclinux.c b/drivers/mtd/maps/uclinux.c
--- a/drivers/mtd/maps/uclinux.c	2004-05-26 15:01:36 -07:00
+++ b/drivers/mtd/maps/uclinux.c	2004-05-26 15:01:36 -07:00
@@ -17,6 +17,7 @@
 #include <linux/kernel.h>
 #include <linux/fs.h>
 #include <linux/major.h>
+#include <linux/root_dev.h>
 #include <linux/mtd/mtd.h>
 #include <linux/mtd/map.h>
 #include <linux/mtd/partitions.h>
diff -Nru a/drivers/net/8390.h b/drivers/net/8390.h
--- a/drivers/net/8390.h	2004-05-26 15:01:36 -07:00
+++ b/drivers/net/8390.h	2004-05-26 15:01:36 -07:00
@@ -143,7 +143,7 @@
 #define inb_p(_p)	inb(_p)
 #define outb_p(_v,_p)	outb(_v,_p)
 
-#elif defined(CONFIG_NET_CBUS) || defined(CONFIG_NE_H8300)
+#elif defined(CONFIG_NET_CBUS) || defined(CONFIG_NE_H8300) || defined(CONFIG_NE_H8300_MODULE)
 #define EI_SHIFT(x)	(ei_local->reg_offset[x])
 #else
 #define EI_SHIFT(x)	(x)
diff -Nru a/drivers/net/Kconfig b/drivers/net/Kconfig
--- a/drivers/net/Kconfig	2004-05-26 15:01:36 -07:00
+++ b/drivers/net/Kconfig	2004-05-26 15:01:36 -07:00
@@ -1829,7 +1829,7 @@
 	  controller on the Motorola ColdFire 5272 processor.
 
 config NE_H8300
-	bool "NE2000 compatible support for H8/300"
+	tristate "NE2000 compatible support for H8/300"
 	depends on H8300 && NET_ETHERNET
 	help
 	  Say Y here if you want to use the NE2000 compatible
diff -Nru a/drivers/net/ne-h8300.c b/drivers/net/ne-h8300.c
--- a/drivers/net/ne-h8300.c	2004-05-26 15:01:35 -07:00
+++ b/drivers/net/ne-h8300.c	2004-05-26 15:01:35 -07:00
@@ -260,8 +260,8 @@
 	bus_width &= 1 << ((ioaddr >> 21) & 7);
 	ei_status.word16 = (bus_width == 0); /* temporary setting */
 	for(i = 0; i < 16 /*sizeof(SA_prom)*/; i++) {
-		SA_prom[i] = inb(ioaddr + NE_DATAPORT);
-		inb(ioaddr + NE_DATAPORT); /* dummy read */
+		SA_prom[i] = inb_p(ioaddr + NE_DATAPORT);
+		inb_p(ioaddr + NE_DATAPORT); /* dummy read */
 	}
 
 	start_page = NESM_START_PG;
@@ -590,7 +590,7 @@
 
 
 #ifdef MODULE
-#define MAX_NE_CARDS	4	/* Max number of NE cards per module */
+#define MAX_NE_CARDS	1	/* Max number of NE cards per module */
 static struct net_device *dev_ne[MAX_NE_CARDS];
 static int io[MAX_NE_CARDS];
 static int irq[MAX_NE_CARDS];
@@ -599,7 +599,7 @@
 MODULE_PARM(io, "1-" __MODULE_STRING(MAX_NE_CARDS) "i");
 MODULE_PARM(irq, "1-" __MODULE_STRING(MAX_NE_CARDS) "i");
 MODULE_PARM(bad, "1-" __MODULE_STRING(MAX_NE_CARDS) "i");
-MODULE_PARM_DESC(io, "I/O base address(es),required");
+MODULE_PARM_DESC(io, "I/O base address(es)");
 MODULE_PARM_DESC(irq, "IRQ number(s)");
 MODULE_DESCRIPTION("H8/300 NE2000 Ethernet driver");
 MODULE_LICENSE("GPL");
@@ -612,26 +612,35 @@
 int init_module(void)
 {
 	int this_dev, found = 0;
+	int err;
 
 	for (this_dev = 0; this_dev < MAX_NE_CARDS; this_dev++) {
 		struct net_device *dev = alloc_ei_netdev();
 		if (!dev)
 			break;
-		dev->irq = irq[this_dev];
-		dev->mem_end = bad[this_dev];
-		dev->base_addr = io[this_dev];
-		if (do_ne_probe(dev) == 0) {
-			if (register_netdev(dev) == 0) {
-				dev_ne[found++] = dev;
-				continue;
+		if (io[this_dev]) {
+			dev->irq = irq[this_dev];
+			dev->mem_end = bad[this_dev];
+			dev->base_addr = io[this_dev];
+		} else {
+			dev->base_addr = h8300_ne_base[this_dev];
+			dev->irq = h8300_ne_irq[this_dev];
+		}
+		err = init_reg_offset(dev, dev->base_addr);
+		if (!err) {
+			if (do_ne_probe(dev) == 0) {
+				if (register_netdev(dev) == 0) {
+					dev_ne[found++] = dev;
+					continue;
+				}
+				cleanup_card(dev);
 			}
-			cleanup_card(dev);
 		}
 		free_netdev(dev);
 		if (found)
 			break;
 		if (io[this_dev] != 0)
-			printk(KERN_WARNING "ne.c: No NE*000 card found at i/o = %#x\n", io[this_dev]);
+			printk(KERN_WARNING "ne.c: No NE*000 card found at i/o = %#x\n", dev->base_addr);
 		else
 			printk(KERN_NOTICE "ne.c: You must supply \"io=0xNNN\" value(s) for ISA cards.\n");
 		return -ENXIO;
diff -Nru a/drivers/net/tg3.c b/drivers/net/tg3.c
--- a/drivers/net/tg3.c	2004-05-26 15:01:36 -07:00
+++ b/drivers/net/tg3.c	2004-05-26 15:01:36 -07:00
@@ -56,8 +56,8 @@
 
 #define DRV_MODULE_NAME		"tg3"
 #define PFX DRV_MODULE_NAME	": "
-#define DRV_MODULE_VERSION	"3.4"
-#define DRV_MODULE_RELDATE	"May 14, 2004"
+#define DRV_MODULE_VERSION	"3.5"
+#define DRV_MODULE_RELDATE	"May 25, 2004"
 
 #define TG3_DEF_MAC_MODE	0
 #define TG3_DEF_RX_MODE		0
@@ -128,7 +128,8 @@
 /* minimum number of free TX descriptors required to wake up TX process */
 #define TG3_TX_WAKEUP_THRESH		(TG3_TX_RING_SIZE / 4)
 
-#define TG3_NUM_STATS		25	/* number of ETHTOOL_GSTATS u64's */
+/* number of ETHTOOL_GSTATS u64's */
+#define TG3_NUM_STATS		(sizeof(struct tg3_ethtool_stats)/sizeof(u64))
 
 static char version[] __devinitdata =
 	DRV_MODULE_NAME ".c:v" DRV_MODULE_VERSION " (" DRV_MODULE_RELDATE ")\n";
@@ -216,10 +217,13 @@
 struct {
 	char string[ETH_GSTRING_LEN];
 } ethtool_stats_keys[TG3_NUM_STATS] = {
+	{ "rx_octets" },
 	{ "rx_fragments" },
 	{ "rx_ucast_packets" },
+	{ "rx_mcast_packets" },
 	{ "rx_bcast_packets" },
 	{ "rx_fcs_errors" },
+	{ "rx_align_errors" },
 	{ "rx_xon_pause_rcvd" },
 	{ "rx_xoff_pause_rcvd" },
 	{ "rx_mac_ctrl_rcvd" },
@@ -229,6 +233,19 @@
 	{ "rx_undersize_packets" },
 	{ "rx_in_length_errors" },
 	{ "rx_out_length_errors" },
+	{ "rx_64_or_less_octet_packets" },
+	{ "rx_65_to_127_octet_packets" },
+	{ "rx_128_to_255_octet_packets" },
+	{ "rx_256_to_511_octet_packets" },
+	{ "rx_512_to_1023_octet_packets" },
+	{ "rx_1024_to_1522_octet_packets" },
+	{ "rx_1523_to_2047_octet_packets" },
+	{ "rx_2048_to_4095_octet_packets" },
+	{ "rx_4096_to_8191_octet_packets" },
+	{ "rx_8192_to_9022_octet_packets" },
+
+	{ "tx_octets" },
+	{ "tx_collisions" },
 
 	{ "tx_xon_sent" },
 	{ "tx_xoff_sent" },
@@ -239,9 +256,43 @@
 	{ "tx_deferred" },
 	{ "tx_excessive_collisions" },
 	{ "tx_late_collisions" },
+	{ "tx_collide_2times" },
+	{ "tx_collide_3times" },
+	{ "tx_collide_4times" },
+	{ "tx_collide_5times" },
+	{ "tx_collide_6times" },
+	{ "tx_collide_7times" },
+	{ "tx_collide_8times" },
+	{ "tx_collide_9times" },
+	{ "tx_collide_10times" },
+	{ "tx_collide_11times" },
+	{ "tx_collide_12times" },
+	{ "tx_collide_13times" },
+	{ "tx_collide_14times" },
+	{ "tx_collide_15times" },
 	{ "tx_ucast_packets" },
 	{ "tx_mcast_packets" },
-	{ "tx_bcast_packets" }
+	{ "tx_bcast_packets" },
+	{ "tx_carrier_sense_errors" },
+	{ "tx_discards" },
+	{ "tx_errors" },
+
+	{ "dma_writeq_full" },
+	{ "dma_write_prioq_full" },
+	{ "rxbds_empty" },
+	{ "rx_discards" },
+	{ "rx_errors" },
+	{ "rx_threshold_hit" },
+
+	{ "dma_readq_full" },
+	{ "dma_read_prioq_full" },
+	{ "tx_comp_queue_full" },
+
+	{ "ring_set_send_prod_index" },
+	{ "ring_status_update" },
+	{ "nic_irqs" },
+	{ "nic_avoided_irqs" },
+	{ "nic_tx_threshold_hit" }
 };
 
 static void tg3_write_indirect_reg32(struct tg3 *tp, u32 off, u32 val)
@@ -1053,6 +1104,8 @@
 static void tg3_setup_flow_control(struct tg3 *tp, u32 local_adv, u32 remote_adv)
 {
 	u32 new_tg3_flags = 0;
+	u32 old_rx_mode = tp->rx_mode;
+	u32 old_tx_mode = tp->tx_mode;
 
 	if (local_adv & ADVERTISE_PAUSE_CAP) {
 		if (local_adv & ADVERTISE_PAUSE_ASYM) {
@@ -1083,10 +1136,18 @@
 	else
 		tp->rx_mode &= ~RX_MODE_FLOW_CTRL_ENABLE;
 
+	if (old_rx_mode != tp->rx_mode) {
+		tw32_f(MAC_RX_MODE, tp->rx_mode);
+	}
+	
 	if (new_tg3_flags & TG3_FLAG_TX_PAUSE)
 		tp->tx_mode |= TX_MODE_FLOW_CTRL_ENABLE;
 	else
 		tp->tx_mode &= ~TX_MODE_FLOW_CTRL_ENABLE;
+
+	if (old_tx_mode != tp->tx_mode) {
+		tw32_f(MAC_TX_MODE, tp->tx_mode);
+	}
 }
 
 static void tg3_aux_stat_to_speed_duplex(struct tg3 *tp, u32 val, u16 *speed, u8 *duplex)
@@ -2472,7 +2533,7 @@
 
 static int tg3_poll(struct net_device *netdev, int *budget)
 {
-	struct tg3 *tp = netdev->priv;
+	struct tg3 *tp = netdev_priv(netdev);
 	struct tg3_hw_status *sblk = tp->hw_status;
 	unsigned long flags;
 	int done;
@@ -2554,7 +2615,7 @@
 static irqreturn_t tg3_interrupt(int irq, void *dev_id, struct pt_regs *regs)
 {
 	struct net_device *dev = dev_id;
-	struct tg3 *tp = dev->priv;
+	struct tg3 *tp = netdev_priv(dev);
 	struct tg3_hw_status *sblk = tp->hw_status;
 	unsigned long flags;
 	unsigned int handled = 1;
@@ -2634,7 +2695,7 @@
 
 static void tg3_tx_timeout(struct net_device *dev)
 {
-	struct tg3 *tp = dev->priv;
+	struct tg3 *tp = netdev_priv(dev);
 
 	printk(KERN_ERR PFX "%s: transmit timed out, resetting\n",
 	       dev->name);
@@ -2750,7 +2811,7 @@
 
 static int tg3_start_xmit_4gbug(struct sk_buff *skb, struct net_device *dev)
 {
-	struct tg3 *tp = dev->priv;
+	struct tg3 *tp = netdev_priv(dev);
 	dma_addr_t mapping;
 	unsigned int i;
 	u32 len, entry, base_flags, mss;
@@ -2954,7 +3015,7 @@
 
 static int tg3_start_xmit(struct sk_buff *skb, struct net_device *dev)
 {
-	struct tg3 *tp = dev->priv;
+	struct tg3 *tp = netdev_priv(dev);
 	dma_addr_t mapping;
 	u32 len, entry, base_flags, mss;
 	unsigned long flags;
@@ -3124,7 +3185,7 @@
 
 static int tg3_change_mtu(struct net_device *dev, int new_mtu)
 {
-	struct tg3 *tp = dev->priv;
+	struct tg3 *tp = netdev_priv(dev);
 
 	if (new_mtu < TG3_MIN_MTU || new_mtu > TG3_MAX_MTU(tp))
 		return -EINVAL;
@@ -4741,7 +4802,7 @@
 
 static int tg3_set_mac_addr(struct net_device *dev, void *p)
 {
-	struct tg3 *tp = dev->priv;
+	struct tg3 *tp = netdev_priv(dev);
 	struct sockaddr *addr = p;
 
 	memcpy(dev->dev_addr, addr->sa_data, dev->addr_len);
@@ -5533,7 +5594,7 @@
 
 static int tg3_open(struct net_device *dev)
 {
-	struct tg3 *tp = dev->priv;
+	struct tg3 *tp = netdev_priv(dev);
 	int err;
 
 	spin_lock_irq(&tp->lock);
@@ -5836,7 +5897,7 @@
 
 static int tg3_close(struct net_device *dev)
 {
-	struct tg3 *tp = dev->priv;
+	struct tg3 *tp = netdev_priv(dev);
 
 	netif_stop_queue(dev);
 
@@ -5921,10 +5982,13 @@
 	if (!hw_stats)
 		return old_estats;
 
+	ESTAT_ADD(rx_octets);
 	ESTAT_ADD(rx_fragments);
 	ESTAT_ADD(rx_ucast_packets);
+	ESTAT_ADD(rx_mcast_packets);
 	ESTAT_ADD(rx_bcast_packets);
 	ESTAT_ADD(rx_fcs_errors);
+	ESTAT_ADD(rx_align_errors);
 	ESTAT_ADD(rx_xon_pause_rcvd);
 	ESTAT_ADD(rx_xoff_pause_rcvd);
 	ESTAT_ADD(rx_mac_ctrl_rcvd);
@@ -5934,7 +5998,19 @@
 	ESTAT_ADD(rx_undersize_packets);
 	ESTAT_ADD(rx_in_length_errors);
 	ESTAT_ADD(rx_out_length_errors);
+	ESTAT_ADD(rx_64_or_less_octet_packets);
+	ESTAT_ADD(rx_65_to_127_octet_packets);
+	ESTAT_ADD(rx_128_to_255_octet_packets);
+	ESTAT_ADD(rx_256_to_511_octet_packets);
+	ESTAT_ADD(rx_512_to_1023_octet_packets);
+	ESTAT_ADD(rx_1024_to_1522_octet_packets);
+	ESTAT_ADD(rx_1523_to_2047_octet_packets);
+	ESTAT_ADD(rx_2048_to_4095_octet_packets);
+	ESTAT_ADD(rx_4096_to_8191_octet_packets);
+	ESTAT_ADD(rx_8192_to_9022_octet_packets);
 
+	ESTAT_ADD(tx_octets);
+	ESTAT_ADD(tx_collisions);
 	ESTAT_ADD(tx_xon_sent);
 	ESTAT_ADD(tx_xoff_sent);
 	ESTAT_ADD(tx_flow_control);
@@ -5944,16 +6020,50 @@
 	ESTAT_ADD(tx_deferred);
 	ESTAT_ADD(tx_excessive_collisions);
 	ESTAT_ADD(tx_late_collisions);
+	ESTAT_ADD(tx_collide_2times);
+	ESTAT_ADD(tx_collide_3times);
+	ESTAT_ADD(tx_collide_4times);
+	ESTAT_ADD(tx_collide_5times);
+	ESTAT_ADD(tx_collide_6times);
+	ESTAT_ADD(tx_collide_7times);
+	ESTAT_ADD(tx_collide_8times);
+	ESTAT_ADD(tx_collide_9times);
+	ESTAT_ADD(tx_collide_10times);
+	ESTAT_ADD(tx_collide_11times);
+	ESTAT_ADD(tx_collide_12times);
+	ESTAT_ADD(tx_collide_13times);
+	ESTAT_ADD(tx_collide_14times);
+	ESTAT_ADD(tx_collide_15times);
 	ESTAT_ADD(tx_ucast_packets);
 	ESTAT_ADD(tx_mcast_packets);
 	ESTAT_ADD(tx_bcast_packets);
+	ESTAT_ADD(tx_carrier_sense_errors);
+	ESTAT_ADD(tx_discards);
+	ESTAT_ADD(tx_errors);
+
+	ESTAT_ADD(dma_writeq_full);
+	ESTAT_ADD(dma_write_prioq_full);
+	ESTAT_ADD(rxbds_empty);
+	ESTAT_ADD(rx_discards);
+	ESTAT_ADD(rx_errors);
+	ESTAT_ADD(rx_threshold_hit);
+
+	ESTAT_ADD(dma_readq_full);
+	ESTAT_ADD(dma_read_prioq_full);
+	ESTAT_ADD(tx_comp_queue_full);
+
+	ESTAT_ADD(ring_set_send_prod_index);
+	ESTAT_ADD(ring_status_update);
+	ESTAT_ADD(nic_irqs);
+	ESTAT_ADD(nic_avoided_irqs);
+	ESTAT_ADD(nic_tx_threshold_hit);
 
 	return estats;
 }
 
 static struct net_device_stats *tg3_get_stats(struct net_device *dev)
 {
-	struct tg3 *tp = dev->priv;
+	struct tg3 *tp = netdev_priv(dev);
 	struct net_device_stats *stats = &tp->net_stats;
 	struct net_device_stats *old_stats = &tp->net_stats_prev;
 	struct tg3_hw_stats *hw_stats = tp->hw_stats;
@@ -5977,7 +6087,8 @@
 		get_stat64(&hw_stats->tx_octets);
 
 	stats->rx_errors = old_stats->rx_errors +
-		get_stat64(&hw_stats->rx_errors);
+		get_stat64(&hw_stats->rx_errors) +
+		get_stat64(&hw_stats->rx_discards);
 	stats->tx_errors = old_stats->tx_errors +
 		get_stat64(&hw_stats->tx_errors) +
 		get_stat64(&hw_stats->tx_mac_errors) +
@@ -6044,7 +6155,7 @@
 
 static void __tg3_set_rx_mode(struct net_device *dev)
 {
-	struct tg3 *tp = dev->priv;
+	struct tg3 *tp = netdev_priv(dev);
 	u32 rx_mode;
 
 	rx_mode = tp->rx_mode & ~(RX_MODE_PROMISC |
@@ -6108,7 +6219,7 @@
 
 static void tg3_set_rx_mode(struct net_device *dev)
 {
-	struct tg3 *tp = dev->priv;
+	struct tg3 *tp = netdev_priv(dev);
 
 	spin_lock_irq(&tp->lock);
 	__tg3_set_rx_mode(dev);
@@ -6126,7 +6237,7 @@
 		struct ethtool_regs *regs, void *_p)
 {
 	u32 *p = _p;
-	struct tg3 *tp = dev->priv;
+	struct tg3 *tp = netdev_priv(dev);
 	u8 *orig_p = _p;
 	int i;
 
@@ -6257,7 +6368,7 @@
 
 static int tg3_get_settings(struct net_device *dev, struct ethtool_cmd *cmd)
 {
-  	struct tg3 *tp = dev->priv;
+  	struct tg3 *tp = netdev_priv(dev);
   
 	if (!(tp->tg3_flags & TG3_FLAG_INIT_COMPLETE) ||
 					tp->link_config.phy_is_low_power)
@@ -6292,7 +6403,7 @@
   
 static int tg3_set_settings(struct net_device *dev, struct ethtool_cmd *cmd)
 {
-	struct tg3 *tp = dev->priv;
+	struct tg3 *tp = netdev_priv(dev);
   
 	if (!(tp->tg3_flags & TG3_FLAG_INIT_COMPLETE) ||
 	    tp->link_config.phy_is_low_power)
@@ -6331,7 +6442,7 @@
   
 static void tg3_get_drvinfo(struct net_device *dev, struct ethtool_drvinfo *info)
 {
-	struct tg3 *tp = dev->priv;
+	struct tg3 *tp = netdev_priv(dev);
   
 	strcpy(info->driver, DRV_MODULE_NAME);
 	strcpy(info->version, DRV_MODULE_VERSION);
@@ -6340,7 +6451,7 @@
   
 static void tg3_get_wol(struct net_device *dev, struct ethtool_wolinfo *wol)
 {
-	struct tg3 *tp = dev->priv;
+	struct tg3 *tp = netdev_priv(dev);
   
 	wol->supported = WAKE_MAGIC;
 	wol->wolopts = 0;
@@ -6351,7 +6462,7 @@
   
 static int tg3_set_wol(struct net_device *dev, struct ethtool_wolinfo *wol)
 {
-	struct tg3 *tp = dev->priv;
+	struct tg3 *tp = netdev_priv(dev);
   
 	if (wol->wolopts & ~WAKE_MAGIC)
 		return -EINVAL;
@@ -6372,20 +6483,20 @@
   
 static u32 tg3_get_msglevel(struct net_device *dev)
 {
-	struct tg3 *tp = dev->priv;
+	struct tg3 *tp = netdev_priv(dev);
 	return tp->msg_enable;
 }
   
 static void tg3_set_msglevel(struct net_device *dev, u32 value)
 {
-	struct tg3 *tp = dev->priv;
+	struct tg3 *tp = netdev_priv(dev);
 	tp->msg_enable = value;
 }
   
 #if TG3_TSO_SUPPORT != 0
 static int tg3_set_tso(struct net_device *dev, u32 value)
 {
-	struct tg3 *tp = dev->priv;
+	struct tg3 *tp = netdev_priv(dev);
 
 	if (!(tp->tg3_flags2 & TG3_FLG2_TSO_CAPABLE)) {
 		if (value)
@@ -6398,7 +6509,7 @@
   
 static int tg3_nway_reset(struct net_device *dev)
 {
-	struct tg3 *tp = dev->priv;
+	struct tg3 *tp = netdev_priv(dev);
 	u32 bmcr;
 	int r;
   
@@ -6417,7 +6528,7 @@
   
 static void tg3_get_ringparam(struct net_device *dev, struct ethtool_ringparam *ering)
 {
-	struct tg3 *tp = dev->priv;
+	struct tg3 *tp = netdev_priv(dev);
   
 	ering->rx_max_pending = TG3_RX_RING_SIZE - 1;
 	ering->rx_mini_max_pending = 0;
@@ -6431,7 +6542,7 @@
   
 static int tg3_set_ringparam(struct net_device *dev, struct ethtool_ringparam *ering)
 {
-	struct tg3 *tp = dev->priv;
+	struct tg3 *tp = netdev_priv(dev);
   
 	if ((ering->rx_pending > TG3_RX_RING_SIZE - 1) ||
 	    (ering->rx_jumbo_pending > TG3_RX_JUMBO_RING_SIZE - 1) ||
@@ -6462,7 +6573,7 @@
   
 static void tg3_get_pauseparam(struct net_device *dev, struct ethtool_pauseparam *epause)
 {
-	struct tg3 *tp = dev->priv;
+	struct tg3 *tp = netdev_priv(dev);
   
 	epause->autoneg = (tp->tg3_flags & TG3_FLAG_PAUSE_AUTONEG) != 0;
 	epause->rx_pause = (tp->tg3_flags & TG3_FLAG_PAUSE_RX) != 0;
@@ -6471,7 +6582,7 @@
   
 static int tg3_set_pauseparam(struct net_device *dev, struct ethtool_pauseparam *epause)
 {
-	struct tg3 *tp = dev->priv;
+	struct tg3 *tp = netdev_priv(dev);
   
 	tg3_netif_stop(tp);
 	spin_lock_irq(&tp->lock);
@@ -6499,13 +6610,13 @@
   
 static u32 tg3_get_rx_csum(struct net_device *dev)
 {
-	struct tg3 *tp = dev->priv;
+	struct tg3 *tp = netdev_priv(dev);
 	return (tp->tg3_flags & TG3_FLAG_RX_CHECKSUMS) != 0;
 }
   
 static int tg3_set_rx_csum(struct net_device *dev, u32 data)
 {
-	struct tg3 *tp = dev->priv;
+	struct tg3 *tp = netdev_priv(dev);
   
 	if (tp->tg3_flags & TG3_FLAG_BROKEN_CHECKSUMS) {
 		if (data != 0)
@@ -6525,7 +6636,7 @@
   
 static int tg3_set_tx_csum(struct net_device *dev, u32 data)
 {
-	struct tg3 *tp = dev->priv;
+	struct tg3 *tp = netdev_priv(dev);
   
 	if (tp->tg3_flags & TG3_FLAG_BROKEN_CHECKSUMS) {
 		if (data != 0)
@@ -6562,13 +6673,13 @@
 				   struct ethtool_stats *estats, u64 *tmp_stats)
 {
 	struct tg3 *tp = dev->priv;
-	memcpy(tmp_stats, &tp->estats, sizeof(tp->estats));
+	memcpy(tmp_stats, tg3_get_estats(tp), sizeof(tp->estats));
 }
 
 static int tg3_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
 {
 	struct mii_ioctl_data *data = (struct mii_ioctl_data *)&ifr->ifr_data;
-	struct tg3 *tp = dev->priv;
+	struct tg3 *tp = netdev_priv(dev);
 	int err;
 
 	switch(cmd) {
@@ -6608,7 +6719,7 @@
 #if TG3_VLAN_TAG_USED
 static void tg3_vlan_rx_register(struct net_device *dev, struct vlan_group *grp)
 {
-	struct tg3 *tp = dev->priv;
+	struct tg3 *tp = netdev_priv(dev);
 
 	spin_lock_irq(&tp->lock);
 	spin_lock(&tp->tx_lock);
@@ -6624,7 +6735,7 @@
 
 static void tg3_vlan_rx_kill_vid(struct net_device *dev, unsigned short vid)
 {
-	struct tg3 *tp = dev->priv;
+	struct tg3 *tp = netdev_priv(dev);
 
 	spin_lock_irq(&tp->lock);
 	spin_lock(&tp->tx_lock);
@@ -8047,7 +8158,7 @@
 	dev->vlan_rx_kill_vid = tg3_vlan_rx_kill_vid;
 #endif
 
-	tp = dev->priv;
+	tp = netdev_priv(dev);
 	tp->pdev = pdev;
 	tp->dev = dev;
 	tp->pm_cap = pm_cap;
@@ -8268,8 +8379,10 @@
 	struct net_device *dev = pci_get_drvdata(pdev);
 
 	if (dev) {
+		struct tg3 *tp = netdev_priv(dev);
+
 		unregister_netdev(dev);
-		iounmap((void *) ((struct tg3 *)(dev->priv))->regs);
+		iounmap((void *)tp->regs);
 		free_netdev(dev);
 		pci_release_regions(pdev);
 		pci_disable_device(pdev);
@@ -8280,7 +8393,7 @@
 static int tg3_suspend(struct pci_dev *pdev, u32 state)
 {
 	struct net_device *dev = pci_get_drvdata(pdev);
-	struct tg3 *tp = dev->priv;
+	struct tg3 *tp = netdev_priv(dev);
 	int err;
 
 	if (!netif_running(dev))
@@ -8327,7 +8440,7 @@
 static int tg3_resume(struct pci_dev *pdev)
 {
 	struct net_device *dev = pci_get_drvdata(pdev);
-	struct tg3 *tp = dev->priv;
+	struct tg3 *tp = netdev_priv(dev);
 	int err;
 
 	if (!netif_running(dev))
diff -Nru a/drivers/net/tg3.h b/drivers/net/tg3.h
--- a/drivers/net/tg3.h	2004-05-26 15:01:35 -07:00
+++ b/drivers/net/tg3.h	2004-05-26 15:01:35 -07:00
@@ -1845,10 +1845,13 @@
 
 struct tg3_ethtool_stats {
 	/* Statistics maintained by Receive MAC. */
+	u64 	    	rx_octets;
 	u64		rx_fragments;
 	u64		rx_ucast_packets;
+	u64		rx_mcast_packets;
 	u64		rx_bcast_packets;
 	u64		rx_fcs_errors;
+	u64		rx_align_errors;
 	u64		rx_xon_pause_rcvd;
 	u64		rx_xoff_pause_rcvd;
 	u64		rx_mac_ctrl_rcvd;
@@ -1858,8 +1861,20 @@
 	u64		rx_undersize_packets;
 	u64		rx_in_length_errors;
 	u64		rx_out_length_errors;
+	u64		rx_64_or_less_octet_packets;
+	u64		rx_65_to_127_octet_packets;
+	u64		rx_128_to_255_octet_packets;
+	u64		rx_256_to_511_octet_packets;
+	u64		rx_512_to_1023_octet_packets;
+	u64		rx_1024_to_1522_octet_packets;
+	u64		rx_1523_to_2047_octet_packets;
+	u64		rx_2048_to_4095_octet_packets;
+	u64		rx_4096_to_8191_octet_packets;
+	u64		rx_8192_to_9022_octet_packets;
 
 	/* Statistics maintained by Transmit MAC. */
+	u64		tx_octets;
+	u64		tx_collisions;
 	u64		tx_xon_sent;
 	u64		tx_xoff_sent;
 	u64		tx_flow_control;
@@ -1869,9 +1884,46 @@
 	u64		tx_deferred;
 	u64		tx_excessive_collisions;
 	u64		tx_late_collisions;
+	u64		tx_collide_2times;
+	u64		tx_collide_3times;
+	u64		tx_collide_4times;
+	u64		tx_collide_5times;
+	u64		tx_collide_6times;
+	u64		tx_collide_7times;
+	u64		tx_collide_8times;
+	u64		tx_collide_9times;
+	u64		tx_collide_10times;
+	u64		tx_collide_11times;
+	u64		tx_collide_12times;
+	u64		tx_collide_13times;
+	u64		tx_collide_14times;
+	u64		tx_collide_15times;
 	u64		tx_ucast_packets;
 	u64		tx_mcast_packets;
 	u64		tx_bcast_packets;
+	u64		tx_carrier_sense_errors;
+	u64		tx_discards;
+	u64		tx_errors;
+
+	/* Statistics maintained by Receive List Placement. */
+	u64		dma_writeq_full;
+	u64		dma_write_prioq_full;
+	u64		rxbds_empty;
+	u64		rx_discards;
+	u64		rx_errors;
+	u64		rx_threshold_hit;
+
+	/* Statistics maintained by Send Data Initiator. */
+	u64		dma_readq_full;
+	u64		dma_read_prioq_full;
+	u64		tx_comp_queue_full;
+
+	/* Statistics maintained by Host Coalescing. */
+	u64		ring_set_send_prod_index;
+	u64		ring_status_update;
+	u64		nic_irqs;
+	u64		nic_avoided_irqs;
+	u64		nic_tx_threshold_hit;
 };
 
 struct tg3 {
diff -Nru a/drivers/net/tokenring/olympic.c b/drivers/net/tokenring/olympic.c
--- a/drivers/net/tokenring/olympic.c	2004-05-26 15:01:36 -07:00
+++ b/drivers/net/tokenring/olympic.c	2004-05-26 15:01:36 -07:00
@@ -1806,7 +1806,7 @@
 
 static void __exit olympic_pci_cleanup(void)
 {
-	return pci_unregister_driver(&olympic_driver) ; 
+	pci_unregister_driver(&olympic_driver) ; 
 }	
 
 
diff -Nru a/drivers/pcmcia/cs.c b/drivers/pcmcia/cs.c
--- a/drivers/pcmcia/cs.c	2004-05-26 15:01:35 -07:00
+++ b/drivers/pcmcia/cs.c	2004-05-26 15:01:35 -07:00
@@ -789,9 +789,10 @@
 	    return 1;
     for (i = 0; i < MAX_IO_WIN; i++) {
 	if (s->io[i].NumPorts == 0) {
-	    if (find_io_region(base, num, align, name, s) == 0) {
+	    s->io[i].res = find_io_region(*base, num, align, name, s);
+	    if (s->io[i].res) {
 		s->io[i].Attributes = attr;
-		s->io[i].BasePort = *base;
+		s->io[i].BasePort = *base = s->io[i].res->start;
 		s->io[i].NumPorts = s->io[i].InUse = num;
 		break;
 	    } else
@@ -801,7 +802,8 @@
 	/* Try to extend top of window */
 	try = s->io[i].BasePort + s->io[i].NumPorts;
 	if ((*base == 0) || (*base == try))
-	    if (find_io_region(&try, num, 0, name, s) == 0) {
+	    if (adjust_io_region(s->io[i].res, s->io[i].res->start,
+				 s->io[i].res->end + num, s) == 0) {
 		*base = try;
 		s->io[i].NumPorts += num;
 		s->io[i].InUse += num;
@@ -810,7 +812,8 @@
 	/* Try to extend bottom of window */
 	try = s->io[i].BasePort - num;
 	if ((*base == 0) || (*base == try))
-	    if (find_io_region(&try, num, 0, name, s) == 0) {
+	    if (adjust_io_region(s->io[i].res, s->io[i].res->start - num,
+				 s->io[i].res->end, s) == 0) {
 		s->io[i].BasePort = *base = try;
 		s->io[i].NumPorts += num;
 		s->io[i].InUse += num;
@@ -824,15 +827,18 @@
 			     ioaddr_t num)
 {
     int i;
-    if(!(s->features & SS_CAP_STATIC_MAP))
-	release_region(base, num);
+
     for (i = 0; i < MAX_IO_WIN; i++) {
 	if ((s->io[i].BasePort <= base) &&
 	    (s->io[i].BasePort+s->io[i].NumPorts >= base+num)) {
 	    s->io[i].InUse -= num;
 	    /* Free the window if no one else is using it */
-	    if (s->io[i].InUse == 0)
+	    if (s->io[i].InUse == 0) {
 		s->io[i].NumPorts = 0;
+		release_resource(s->io[i].res);
+		kfree(s->io[i].res);
+		s->io[i].res = NULL;
+	    }
 	}
     }
 }
diff -Nru a/drivers/pcmcia/cs_internal.h b/drivers/pcmcia/cs_internal.h
--- a/drivers/pcmcia/cs_internal.h	2004-05-26 15:01:36 -07:00
+++ b/drivers/pcmcia/cs_internal.h	2004-05-26 15:01:36 -07:00
@@ -181,8 +181,10 @@
 
 /* In rsrc_mgr */
 void validate_mem(struct pcmcia_socket *s);
-int find_io_region(ioaddr_t *base, ioaddr_t num, unsigned long align,
+struct resource *find_io_region(unsigned long base, int num, unsigned long align,
 		   char *name, struct pcmcia_socket *s);
+int adjust_io_region(struct resource *res, unsigned long r_start,
+		     unsigned long r_end, struct pcmcia_socket *s);
 int find_mem_region(u_long *base, u_long num, u_long align,
 		    int low, char *name, struct pcmcia_socket *s);
 int try_irq(u_int Attributes, int irq, int specific);
diff -Nru a/drivers/pcmcia/pxa2xx_lubbock.c b/drivers/pcmcia/pxa2xx_lubbock.c
--- a/drivers/pcmcia/pxa2xx_lubbock.c	2004-05-26 15:01:36 -07:00
+++ b/drivers/pcmcia/pxa2xx_lubbock.c	2004-05-26 15:01:36 -07:00
@@ -20,9 +20,11 @@
 #include <linux/device.h>
 #include <linux/errno.h>
 #include <linux/init.h>
+#include <linux/delay.h>
 
 #include <asm/hardware.h>
 #include <asm/hardware/sa1111.h>
+#include <asm/mach-types.h>
 
 #include "sa1111_generic.h"
 
@@ -30,156 +32,170 @@
 lubbock_pcmcia_configure_socket(struct soc_pcmcia_socket *skt,
 				const socket_state_t *state)
 {
-  unsigned long flags, gpio, misc_wr;
-  int ret = 1;
-  struct pcmcia_state new_state;
-
-  local_irq_save(flags);
-
-  gpio = PA_DWR;
-  misc_wr = LUB_MISC_WR;
-
-  /* Lubbock uses the Maxim MAX1602, with the following connections:
-   *
-   * Socket 0 (PCMCIA):
-   *	MAX1602	Lubbock		Register
-   *	Pin	Signal
-   *	-----	-------		----------------------
-   *	A0VPP	S0_PWR0		SA-1111 GPIO A<0>
-   *	A1VPP	S0_PWR1		SA-1111 GPIO A<1>
-   *	A0VCC	S0_PWR2		SA-1111 GPIO A<2>
-   *	A1VCC	S0_PWR3		SA-1111 GPIO A<3>
-   *	VX	VCC
-   *	VY	+3.3V
-   *	12IN	+12V
-   *	CODE	+3.3V		Cirrus  Code, CODE = High (VY)
-   *
-   * Socket 1 (CF):
-   *	MAX1602	Lubbock		Register
-   *	Pin	Signal
-   *	-----	-------		----------------------
-   *	A0VPP	GND		VPP is not connected
-   *	A1VPP	GND		VPP is not connected
-   *	A0VCC	S1_PWR0		MISC_WR<14>
-   *	A1VCC	S1_PWR0		MISC_WR<15>
-   *	VX	VCC
-   *	VY	+3.3V
-   *	12IN	GND		VPP is not connected
-   *	CODE	+3.3V		Cirrus  Code, CODE = High (VY)
-   *
-   */
-
-again:
-  switch(skt->nr){
-  case 0:
-
-    switch(state->Vcc){
-    case 0:
-      gpio &= ~(GPIO_bit(2) | GPIO_bit(3));
-      break;
-
-    case 33:
-      gpio = (gpio & ~(GPIO_bit(2) | GPIO_bit(3))) | GPIO_bit(3);
-      break;
-
-    case 50:
-      gpio = (gpio & ~(GPIO_bit(2) | GPIO_bit(3))) | GPIO_bit(2);
-      break;
-
-    default:
-      printk(KERN_ERR "%s(): unrecognized Vcc %u\n", __FUNCTION__, state->Vcc);
-      ret = -1;
-    }
-
-    switch(state->Vpp){
-    case 0:
-      gpio &= ~(GPIO_bit(0) | GPIO_bit(1));
-      break;
-
-    case 120:
-      gpio = (gpio & ~(GPIO_bit(0) | GPIO_bit(1))) | GPIO_bit(1);
-      break;
-
-    default:
-      /* REVISIT: I'm not sure about this? Is this correct?
-         Is it always safe or do we have potential problems
-         with bogus combinations of Vcc and Vpp settings? */
-      if(state->Vpp == state->Vcc)
-        gpio = (gpio & ~(GPIO_bit(0) | GPIO_bit(1))) | GPIO_bit(0);
-      else {
-	printk(KERN_ERR "%s(): unrecognized Vpp %u\n", __FUNCTION__, state->Vpp);
-	ret = -1;
-	break;
-      }
-    }
-
-    break;
-
-  case 1:
-    switch(state->Vcc){
-    case 0:
-      misc_wr &= ~((1 << 15) | (1 << 14));
-      break;
-
-    case 33:
-      misc_wr = (misc_wr & ~(1 << 15)) | (1 << 14);
-      gpio = (gpio & ~(GPIO_bit(2) | GPIO_bit(3))) | GPIO_bit(2);
-      break;
-
-    case 50:
-      misc_wr = (misc_wr & ~(1 << 15)) | (1 << 14);
-      break;
-
-    default:
-      printk(KERN_ERR "%s(): unrecognized Vcc %u\n", __FUNCTION__, state->Vcc);
-      ret = -1;
-      break;
-    }
-
-    if(state->Vpp!=state->Vcc && state->Vpp!=0){
-      printk(KERN_ERR "%s(): CF slot cannot support Vpp %u\n", __FUNCTION__, state->Vpp);
-      ret = -1;
-      break;
-    }
-
-    break;
-
-  default:
-    ret = -1;
-  }
-
-  if (ret >= 0) {
-    sa1111_pcmcia_configure_socket(skt, state);
-    LUB_MISC_WR = misc_wr;
-    PA_DWR = gpio;
-  }
+	unsigned int pa_dwr_mask, pa_dwr_set, misc_mask, misc_set;
+	int ret = 0;
+
+	pa_dwr_mask = pa_dwr_set = misc_mask = misc_set = 0;
+
+	/* Lubbock uses the Maxim MAX1602, with the following connections:
+	 *
+	 * Socket 0 (PCMCIA):
+	 *	MAX1602	Lubbock		Register
+	 *	Pin	Signal
+	 *	-----	-------		----------------------
+	 *	A0VPP	S0_PWR0		SA-1111 GPIO A<0>
+	 *	A1VPP	S0_PWR1		SA-1111 GPIO A<1>
+	 *	A0VCC	S0_PWR2		SA-1111 GPIO A<2>
+	 *	A1VCC	S0_PWR3		SA-1111 GPIO A<3>
+	 *	VX	VCC
+	 *	VY	+3.3V
+	 *	12IN	+12V
+	 *	CODE	+3.3V		Cirrus  Code, CODE = High (VY)
+	 *
+	 * Socket 1 (CF):
+	 *	MAX1602	Lubbock		Register
+	 *	Pin	Signal
+	 *	-----	-------		----------------------
+	 *	A0VPP	GND		VPP is not connected
+	 *	A1VPP	GND		VPP is not connected
+	 *	A0VCC	S1_PWR0		MISC_WR<14>
+	 *	A1VCC	S1_PWR1		MISC_WR<15>
+	 *	VX	VCC
+	 *	VY	+3.3V
+	 *	12IN	GND		VPP is not connected
+	 *	CODE	+3.3V		Cirrus  Code, CODE = High (VY)
+	 *
+	 */
+
+ again:
+	switch (skt->nr) {
+	case 0:
+		pa_dwr_mask = GPIO_A0 | GPIO_A1 | GPIO_A2 | GPIO_A3;
+
+		switch (state->Vcc) {
+		case 0: /* Hi-Z */
+			break;
+
+		case 33: /* VY */
+			pa_dwr_set |= GPIO_A3;
+			break;
+
+		case 50: /* VX */
+			pa_dwr_set |= GPIO_A2;
+			break;
+
+		default:
+			printk(KERN_ERR "%s(): unrecognized Vcc %u\n",
+			       __FUNCTION__, state->Vcc);
+			ret = -1;
+		}
+
+		switch (state->Vpp) {
+		case 0: /* Hi-Z */
+			break;
+
+		case 120: /* 12IN */
+			pa_dwr_set |= GPIO_A1;
+			break;
+
+		default: /* VCC */
+			if (state->Vpp == state->Vcc)
+				pa_dwr_set |= GPIO_A0;
+			else {
+				printk(KERN_ERR "%s(): unrecognized Vpp %u\n",
+				       __FUNCTION__, state->Vpp);
+				ret = -1;
+				break;
+			}
+		}
+		break;
+
+	case 1:
+		misc_mask = (1 << 15) | (1 << 14);
+
+		switch (state->Vcc) {
+		case 0: /* Hi-Z */
+			break;
+
+		case 33: /* VY */
+			misc_set |= 1 << 15;
+			break;
+
+		case 50: /* VX */
+			misc_set |= 1 << 14;
+			break;
+
+		default:
+			printk(KERN_ERR "%s(): unrecognized Vcc %u\n",
+			       __FUNCTION__, state->Vcc);
+			ret = -1;
+			break;
+		}
+
+		if (state->Vpp != state->Vcc && state->Vpp != 0) {
+			printk(KERN_ERR "%s(): CF slot cannot support Vpp %u\n",
+			       __FUNCTION__, state->Vpp);
+			ret = -1;
+			break;
+		}
+		break;
+
+	default:
+		ret = -1;
+	}
+
+	if (ret == 0)
+		ret = sa1111_pcmcia_configure_socket(skt, state);
+
+	if (ret == 0) {
+		lubbock_set_misc_wr(misc_mask, misc_set);
+		sa1111_set_io(SA1111_DEV(skt->dev), pa_dwr_mask, pa_dwr_set);
+	}
 
-  if (ret > 0) {
-    ret = 0;
 #if 1
-    /*
-     * HACK ALERT:
-     * We can't sense the voltage properly on Lubbock before actually
-     * applying some power to the socket (catch 22).
-     * Resense the socket Voltage Sense pins after applying socket power.
-     */
-    sa1111_pcmcia_socket_state(skt, &new_state);
-    if (state->Vcc == 33 && !new_state.vs_3v && !new_state.vs_Xv) {
-      /* Switch to 5V,  Configure socket with 5V voltage */
-      PA_DWR &= ~(GPIO_bit(0) | GPIO_bit(1) | GPIO_bit(2) | GPIO_bit(3));
-      PA_DDR &= ~(GPIO_bit(0) | GPIO_bit(1) | GPIO_bit(2) | GPIO_bit(3));
-      /* We need to hack around the const qualifier as well to keep this
-         ugly workaround localized and not force it to the rest of the code.
-         Barf bags avaliable in the seat pocket in front of you! */
-      ((socket_state_t *)state)->Vcc = 50;
-      ((socket_state_t *)state)->Vpp = 50;
-      goto again;
-    }
+	if (ret == 0 && state->Vcc == 33) {
+		struct pcmcia_state new_state;
+
+		/*
+		 * HACK ALERT:
+		 * We can't sense the voltage properly on Lubbock before
+		 * actually applying some power to the socket (catch 22).
+		 * Resense the socket Voltage Sense pins after applying
+		 * socket power.
+		 *
+		 * Note: It takes about 2.5ms for the MAX1602 VCC output
+		 * to rise.
+		 */
+		mdelay(3);
+
+		sa1111_pcmcia_socket_state(skt, &new_state);
+
+		if (!new_state.vs_3v && !new_state.vs_Xv) {
+			/*
+			 * Switch to 5V,  Configure socket with 5V voltage
+			 */
+			lubbock_set_misc_wr(misc_mask, 0);
+			sa1111_set_io(SA1111_DEV(skt->dev), pa_dwr_mask, 0);
+
+			/*
+			 * It takes about 100ms to turn off Vcc.
+			 */
+			mdelay(100);
+
+			/*
+			 * We need to hack around the const qualifier as
+			 * well to keep this ugly workaround localized and
+			 * not force it to the rest of the code. Barf bags
+			 * avaliable in the seat pocket in front of you!
+			 */
+			((socket_state_t *)state)->Vcc = 50;
+			((socket_state_t *)state)->Vpp = 50;
+			goto again;
+		}
+	}
 #endif
-  }
 
-  local_irq_restore(flags);
-  return ret;
+	return ret;
 }
 
 static struct pcmcia_low_level lubbock_pcmcia_ops = {
@@ -196,7 +212,7 @@
 
 #include "pxa2xx_base.h"
 
-int __init pcmcia_lubbock_init(struct device *dev)
+int __init pcmcia_lubbock_init(struct sa1111_dev *sadev)
 {
 	int ret = -ENODEV;
 
@@ -205,16 +221,15 @@
 		 * Set GPIO_A<3:0> to be outputs for the MAX1600,
 		 * and switch to standby mode.
 		 */
-		PA_DWR = 0;
-		PA_DDR = 0;
-		PA_SDR = 0;
-		PA_SSR = 0;
+		sa1111_set_io_dir(sadev, GPIO_A0|GPIO_A1|GPIO_A2|GPIO_A3, 0, 0);
+		sa1111_set_io(sadev, GPIO_A0|GPIO_A1|GPIO_A2|GPIO_A3, 0);
+		sa1111_set_sleep_io(sadev, GPIO_A0|GPIO_A1|GPIO_A2|GPIO_A3, 0);
 
 		/* Set CF Socket 1 power to standby mode. */
-		LUB_MISC_WR &= ~(GPIO_bit(15) | GPIO_bit(14));
+		lubbock_set_misc_wr((1 << 15) | (1 << 14), 0);
 
-		dev->platform_data = &lubbock_pcmcia_ops;
-		ret = pxa2xx_drv_pcmcia_probe(dev);
+		sadev->dev.platform_data = &lubbock_pcmcia_ops;
+		ret = pxa2xx_drv_pcmcia_probe(&sadev->dev);
 	}
 
 	return ret;
diff -Nru a/drivers/pcmcia/rsrc_mgr.c b/drivers/pcmcia/rsrc_mgr.c
--- a/drivers/pcmcia/rsrc_mgr.c	2004-05-26 15:01:36 -07:00
+++ b/drivers/pcmcia/rsrc_mgr.c	2004-05-26 15:01:36 -07:00
@@ -550,7 +550,7 @@
 
 	for (m = data->map->next; m != data->map; m = m->next) {
 		unsigned long start = m->base;
-		unsigned long end = m->base + m->num;
+		unsigned long end = m->base + m->num - 1;
 
 		/*
 		 * If the lower resources are not available, try aligning
@@ -569,7 +569,7 @@
 		if (res->start >= res->end)
 			break;
 
-		if ((res->start + size) <= end)
+		if ((res->start + size - 1) <= end)
 			break;
 	}
 
@@ -580,6 +580,32 @@
 		res->start = res->end;
 }
 
+/*
+ * Adjust an existing IO region allocation, but making sure that we don't
+ * encroach outside the resources which the user supplied.
+ */
+int adjust_io_region(struct resource *res, unsigned long r_start,
+		     unsigned long r_end, struct pcmcia_socket *s)
+{
+	resource_map_t *m;
+	int ret = -ENOMEM;
+
+	down(&rsrc_sem);
+	for (m = io_db.next; m != &io_db; m = m->next) {
+		unsigned long start = m->base;
+		unsigned long end = m->base + m->num - 1;
+
+		if (start > r_start || r_end > end)
+			continue;
+
+		ret = adjust_resource(res, r_start, r_end - r_start + 1);
+		break;
+	}
+	up(&rsrc_sem);
+
+	return ret;
+}
+
 /*======================================================================
 
     These find ranges of I/O ports or memory addresses that are not
@@ -593,40 +619,37 @@
     
 ======================================================================*/
 
-int find_io_region(ioaddr_t *base, ioaddr_t num, unsigned long align,
-		   char *name, struct pcmcia_socket *s)
+struct resource *find_io_region(unsigned long base, int num,
+		   unsigned long align, char *name, struct pcmcia_socket *s)
 {
 	struct resource *res = make_resource(0, num, IORESOURCE_IO, name);
 	struct pcmcia_align_data data;
-	unsigned long min = *base;
+	unsigned long min = base;
 	int ret;
 
 	if (align == 0)
 		align = 0x10000;
 
 	data.mask = align - 1;
-	data.offset = *base & data.mask;
+	data.offset = base & data.mask;
 	data.map = &io_db;
 
+	down(&rsrc_sem);
 #ifdef CONFIG_PCI
 	if (s->cb_dev) {
 		ret = pci_bus_alloc_resource(s->cb_dev->bus, res, num, 1,
 					     min, 0, pcmcia_align, &data);
 	} else
 #endif
-	{
-		down(&rsrc_sem);
 		ret = allocate_resource(&ioport_resource, res, num, min, ~0UL, 0,
 					pcmcia_align, &data);
-		up(&rsrc_sem);
-	}
+	up(&rsrc_sem);
 
 	if (ret != 0) {
 		kfree(res);
-	} else {
-		*base = res->start;
+		res = NULL;
 	}
-	return ret;
+	return res;
 }
 
 int find_mem_region(u_long *base, u_long num, u_long align,
@@ -652,6 +675,7 @@
 			min = 0x100000UL + *base;
 		}
 
+		down(&rsrc_sem);
 #ifdef CONFIG_PCI
 		if (s->cb_dev) {
 			ret = pci_bus_alloc_resource(s->cb_dev->bus, res, num,
@@ -659,12 +683,9 @@
 						     pcmcia_align, &data);
 		} else
 #endif
-		{
-			down(&rsrc_sem);
 			ret = allocate_resource(&iomem_resource, res, num, min,
 						max, 0, pcmcia_align, &data);
-			up(&rsrc_sem);
-		}
+		up(&rsrc_sem);
 		if (ret == 0 || low)
 			break;
 		low = 1;
diff -Nru a/drivers/pcmcia/sa1111_generic.c b/drivers/pcmcia/sa1111_generic.c
--- a/drivers/pcmcia/sa1111_generic.c	2004-05-26 15:01:35 -07:00
+++ b/drivers/pcmcia/sa1111_generic.c	2004-05-26 15:01:35 -07:00
@@ -149,7 +149,7 @@
 	pcmcia_jornada720_init(&dev->dev);
 #endif
 #ifdef CONFIG_ARCH_LUBBOCK
-	pcmcia_lubbock_init(&dev->dev);
+	pcmcia_lubbock_init(dev);
 #endif
 #ifdef CONFIG_ASSABET_NEPONSET
 	pcmcia_neponset_init(dev);
diff -Nru a/drivers/pcmcia/sa1111_generic.h b/drivers/pcmcia/sa1111_generic.h
--- a/drivers/pcmcia/sa1111_generic.h	2004-05-26 15:01:36 -07:00
+++ b/drivers/pcmcia/sa1111_generic.h	2004-05-26 15:01:36 -07:00
@@ -10,6 +10,6 @@
 
 extern int pcmcia_badge4_init(struct device *);
 extern int pcmcia_jornada720_init(struct device *);
-extern int pcmcia_lubbock_init(struct device *);
+extern int pcmcia_lubbock_init(struct sa1111_dev *);
 extern int pcmcia_neponset_init(struct sa1111_dev *);
 
diff -Nru a/drivers/scsi/Kconfig b/drivers/scsi/Kconfig
--- a/drivers/scsi/Kconfig	2004-05-26 15:01:36 -07:00
+++ b/drivers/scsi/Kconfig	2004-05-26 15:01:36 -07:00
@@ -149,19 +149,8 @@
 	  can say Y here to force the SCSI driver to probe for multiple LUNs.
 	  A SCSI device with multiple LUNs acts logically like multiple SCSI
 	  devices. The vast majority of SCSI devices have only one LUN, and
-	  so most people can say N here and should in fact do so, because it
-	  is safer.
-
-config SCSI_REPORT_LUNS
-	bool "Build with SCSI REPORT LUNS support"
-	depends on SCSI
-	default y
-	help
-	  If you want support for SCSI REPORT LUNS, say Y here.
-	  The REPORT LUNS command is useful for devices (such as disk arrays)
-	  with large numbers of LUNs where the LUN values are not contiguous
-	  (sparse LUN).  REPORT LUNS scanning is done only for SCSI-3 devices.
-	  Most users can safely answer N here.
+	  so most people can say N here. The max_luns boot/module parameter 
+	  allows to override this setting.
 
 config SCSI_CONSTANTS
 	bool "Verbose SCSI error reporting (kernel size +=12K)"
@@ -363,7 +352,7 @@
 # All the I2O code and drivers do not seem to be 64bit safe.
 config SCSI_DPT_I2O
 	tristate "Adaptec I2O RAID support "
-	depends on !64BIT && SCSI && BROKEN
+	depends on !64BIT && SCSI
 	help
 	  This driver supports all of Adaptec's I2O based RAID controllers as 
 	  well as the DPT SmartRaid V cards.  This is an Adaptec maintained
diff -Nru a/drivers/scsi/NCR53c406a.c b/drivers/scsi/NCR53c406a.c
--- a/drivers/scsi/NCR53c406a.c	2004-05-26 15:01:36 -07:00
+++ b/drivers/scsi/NCR53c406a.c	2004-05-26 15:01:36 -07:00
@@ -170,7 +170,6 @@
 /* Static function prototypes */
 static void NCR53c406a_intr(int, void *, struct pt_regs *);
 static irqreturn_t do_NCR53c406a_intr(int, void *, struct pt_regs *);
-static void wait_intr(void);
 static void chip_init(void);
 static void calc_port_addr(void);
 #ifndef IRQ_LEV
@@ -665,6 +664,7 @@
 	return (info_msg);
 }
 
+#if 0
 static void wait_intr(void)
 {
 	unsigned long i = jiffies + WATCHDOG;
@@ -684,6 +684,7 @@
 
 	NCR53c406a_intr(0, NULL, NULL);
 }
+#endif
 
 static int NCR53c406a_queue(Scsi_Cmnd * SCpnt, void (*done) (Scsi_Cmnd *))
 {
diff -Nru a/drivers/scsi/aacraid/README b/drivers/scsi/aacraid/README
--- a/drivers/scsi/aacraid/README	2004-05-26 15:01:35 -07:00
+++ b/drivers/scsi/aacraid/README	2004-05-26 15:01:35 -07:00
@@ -38,15 +38,19 @@
 					(fixed 64bit and 64G memory model, changed confusing naming convention
 					 where fibs that go to the hardware are consistently called hw_fibs and
 					 not just fibs like the name of the driver tracking structure)
+Mark Salyzyn <Mark_Salyzyn@adaptec.com> Fixed panic issues and added some new product ids for upcoming hbas.
+
 Original Driver
 -------------------------
 Adaptec Unix OEM Product Group
 
 Mailing List
 -------------------------
-None currently. Also note this is very different to Brian's original driver
+linux-aacraid-devel@dell.com (Interested parties troll here)
+http://mbserver.adaptec.com/ (Currently more Community Support than Devel Support)
+Also note this is very different to Brian's original driver
 so don't expect him to support it.
-Adaptec does support this driver.  Contact either tech support or deanna bonds.
+Adaptec does support this driver.  Contact either tech support or Mark Salyzyn.
 
 Original by Brian Boerner February 2001
 Rewritten by Alan Cox, November 2001
diff -Nru a/drivers/scsi/aacraid/aacraid.h b/drivers/scsi/aacraid/aacraid.h
--- a/drivers/scsi/aacraid/aacraid.h	2004-05-26 15:01:35 -07:00
+++ b/drivers/scsi/aacraid/aacraid.h	2004-05-26 15:01:35 -07:00
@@ -1,18 +1,20 @@
-//#define dprintk(x) printk x
-#define dprintk(x)
+#if (!defined(dprintk))
+# define dprintk(x)
+#endif
 
 /*------------------------------------------------------------------------------
  *              D E F I N E S
  *----------------------------------------------------------------------------*/
+
 #define MAXIMUM_NUM_CONTAINERS	31
 #define MAXIMUM_NUM_ADAPTERS	8
 
-#define AAC_NUM_FIB	578
+#define AAC_NUM_FIB		578
 //#define AAC_NUM_IO_FIB	512
-#define AAC_NUM_IO_FIB	100
+#define AAC_NUM_IO_FIB		100
 
-#define AAC_MAX_TARGET (MAXIMUM_NUM_CONTAINERS+1)
-#define AAC_MAX_LUN	(8)
+#define AAC_MAX_TARGET 		(MAXIMUM_NUM_CONTAINERS+1)
+#define AAC_MAX_LUN		(8)
 
 #define AAC_MAX_HOSTPHYSMEMPAGES (0xfffff)
 
@@ -241,92 +243,6 @@
 };
 
 /*
- * Implement our own version of these so we have 64 bit compatability
- * The adapter uses these and can only handle 32 bit addresses
- */
-
-struct aac_list_head {
-	u32 next;
-	u32 prev;
-};
-
-#define AAC_INIT_LIST_HEAD(ptr) do { \
-	(ptr)->next = (u32)(ulong)(ptr); \
-	(ptr)->prev = (u32)(ulong)(ptr); \
-} while (0)
-/**
- * aac_list_empty - tests whether a list is empty
- * @head: the list to test.
- */
-static __inline__ int aac_list_empty(struct aac_list_head *head)
-{
-	return head->next == ((u32)(ulong)head);
-}
-
-/*
- * Insert a new entry between two known consecutive entries. 
- *
- * This is only for internal list manipulation where we know
- * the prev/next entries already!
- */
-static __inline__ void aac_list_add(struct aac_list_head * n,
-	struct aac_list_head * prev,
-	struct aac_list_head * next)
-{
-	next->prev = (u32)(ulong)n;
-	n->next = (u32)(ulong)next;
-	n->prev = (u32)(ulong)prev;
-	prev->next = (u32)(ulong)n;
-}
-
-/**
- * list_add_tail - add a new entry
- * @new: new entry to be added
- * @head: list head to add it before
- *
- * Insert a new entry before the specified head.
- * This is useful for implementing queues.
- */
-static __inline__ void aac_list_add_tail(struct aac_list_head *n, struct aac_list_head *head)
-{
-	aac_list_add(n, (struct aac_list_head*)(ulong)(head->prev), head);
-}
-
-/*
- * Delete a list entry by making the prev/next entries
- * point to each other.
- *
- * This is only for internal list manipulation where we know
- * the prev/next entries already!
- */
-static __inline__ void __aac_list_del(struct aac_list_head * p,
-				  struct aac_list_head * n)
-{
-	n->prev = (u32)(ulong)p;
-	p->next = (u32)(ulong)n;
-}
-
-/**
- * aac_list_del - deletes entry from list.
- * @entry: the element to delete from the list.
- * Note: list_empty on entry does not return true after this, the entry is in an undefined state.
- */
-static __inline__ void aac_list_del(struct aac_list_head *entry)
-{
-	__aac_list_del((struct aac_list_head*)(ulong)entry->prev,(struct aac_list_head*)(ulong) entry->next);
-	entry->next = entry->prev = 0;
-}
-
-/**
- * aac_list_entry - get the struct for this entry
- * @ptr:	the &struct list_head pointer.
- * @type:	the type of the struct this is embedded in.
- * @member:	the name of the list_struct within the struct.
- */
-#define aac_list_entry(ptr, type, member) \
-	((type *)((char *)(ptr)-(ulong)(&((type *)0)->member)))
-
-/*
  *	Assign type values to the FSA communication data structures
  */
 
@@ -339,11 +255,11 @@
 #define		FsaNormal	1
 #define		FsaHigh		2
 
-
 /*
  * Define the FIB. The FIB is the where all the requested data and
  * command information are put to the application on the FSA adapter.
  */
+
 struct aac_fibhdr {
 	u32 XferState;			// Current transfer state for this CCB
 	u16 Command;			// Routing information for the destination
@@ -359,13 +275,9 @@
 		    u32 _ReceiverTimeStart; 	// Timestamp for receipt of fib
 		    u32 _ReceiverTimeDone;	// Timestamp for completion of fib
 		} _s;
-		struct aac_list_head _FibLinks;	// Used to link Adapter Initiated Fibs on the host
-//		struct list_head _FibLinks;	// Used to link Adapter Initiated Fibs on the host
 	} _u;
 };
 
-#define FibLinks			_u._FibLinks
-
 #define FIB_DATA_SIZE_IN_BYTES (512 - sizeof(struct aac_fibhdr))
 
 
@@ -558,12 +470,11 @@
 	spinlock_t		lockdata;	/* Actual lock (used only on one side of the lock) */
 	unsigned long		SavedIrql;     	/* Previous IRQL when the spin lock is taken */
 	u32			padding;	/* Padding - FIXME - can remove I believe */
-	struct aac_list_head 	cmdq;	   	/* A queue of FIBs which need to be prcessed by the FS thread. This is */
-//	struct list_head 	cmdq;	   	/* A queue of FIBs which need to be prcessed by the FS thread. This is */
-                                		        /* only valid for command queues which receive entries from the adapter. */
-	struct list_head	pendingq;		/* A queue of outstanding fib's to the adapter. */
-	u32			numpending;		/* Number of entries on outstanding queue. */
-	struct aac_dev *	dev;			/* Back pointer to adapter structure */
+	struct list_head 	cmdq;	   	/* A queue of FIBs which need to be prcessed by the FS thread. This is */
+                                		/* only valid for command queues which receive entries from the adapter. */
+	struct list_head	pendingq;	/* A queue of outstanding fib's to the adapter. */
+	u32			numpending;	/* Number of entries on outstanding queue. */
+	struct aac_dev *	dev;		/* Back pointer to adapter structure */
 };
 
 /*
@@ -744,7 +655,7 @@
 	struct semaphore 	wait_sem;	// this is used to wait for the next fib to arrive.
 	int			wait;		// Set to true when thread is in WaitForSingleObject
 	unsigned long		count;		// total number of FIBs on FibList
-	struct aac_list_head	hw_fib_list;	// this holds hw_fibs which should be 32 bit addresses
+	struct list_head	fib_list;	// this holds fibs and their attachd hw_fibs
 };
 
 struct fsa_scsi_hba {
@@ -781,7 +692,11 @@
 	 *	Outstanding I/O queue.
 	 */
 	struct list_head	queue;
-
+	/*
+	 *	And for the internal issue/reply queues (we may be able
+	 *	to merge these two)
+	 */
+	struct list_head	fiblink;
 	void 			*data;
 	struct hw_fib		*hw_fib;		/* Actual shared object */
 	dma_addr_t		hw_fib_pa;		/* physical address of hw_fib*/
@@ -836,19 +751,19 @@
 /*
  * Supported Options
  */
-#define AAC_OPT_SNAPSHOT	cpu_to_le32(1)
-#define AAC_OPT_CLUSTERS	cpu_to_le32(1<<1)
-#define AAC_OPT_WRITE_CACHE	cpu_to_le32(1<<2)
-#define AAC_OPT_64BIT_DATA	cpu_to_le32(1<<3)
-#define AAC_OPT_HOST_TIME_FIB	cpu_to_le32(1<<4)
-#define AAC_OPT_RAID50		cpu_to_le32(1<<5)
-#define AAC_OPT_4GB_WINDOW	cpu_to_le32(1<<6)
-#define AAC_OPT_SCSI_UPGRADEABLE cpu_to_le32(1<<7)
-#define AAC_OPT_SOFT_ERR_REPORT	cpu_to_le32(1<<8)
-#define AAC_OPT_SUPPORTED_RECONDITION cpu_to_le32(1<<9)
-#define AAC_OPT_SGMAP_HOST64	cpu_to_le32(1<<10)
-#define AAC_OPT_ALARM		cpu_to_le32(1<<11)
-#define AAC_OPT_NONDASD		cpu_to_le32(1<<12)
+#define AAC_OPT_SNAPSHOT		cpu_to_le32(1)
+#define AAC_OPT_CLUSTERS		cpu_to_le32(1<<1)
+#define AAC_OPT_WRITE_CACHE		cpu_to_le32(1<<2)
+#define AAC_OPT_64BIT_DATA		cpu_to_le32(1<<3)
+#define AAC_OPT_HOST_TIME_FIB		cpu_to_le32(1<<4)
+#define AAC_OPT_RAID50			cpu_to_le32(1<<5)
+#define AAC_OPT_4GB_WINDOW		cpu_to_le32(1<<6)
+#define AAC_OPT_SCSI_UPGRADEABLE 	cpu_to_le32(1<<7)
+#define AAC_OPT_SOFT_ERR_REPORT		cpu_to_le32(1<<8)
+#define AAC_OPT_SUPPORTED_RECONDITION 	cpu_to_le32(1<<9)
+#define AAC_OPT_SGMAP_HOST64		cpu_to_le32(1<<10)
+#define AAC_OPT_ALARM			cpu_to_le32(1<<11)
+#define AAC_OPT_NONDASD			cpu_to_le32(1<<12)
 
 struct aac_dev
 {
@@ -862,11 +777,10 @@
 	 */	
 	dma_addr_t		hw_fib_pa;
 	struct hw_fib		*hw_fib_va;
-	ulong			fib_base_va;
+	struct hw_fib		*aif_base_va;
 	/*
 	 *	Fib Headers
 	 */
-// dmb	struct fib              fibs[AAC_NUM_FIB]; /* Doing it here takes up too much from the scsi pool*/
 	struct fib              *fibs;
 
 	struct fib		*free_fib;
@@ -887,7 +801,6 @@
 	unsigned long		fsrev;		/* Main driver's revision number */
 	
 	struct aac_init		*init;		/* Holds initialization info to communicate with adapter */
-//	void *			init_pa; 	/* Holds physical address of the init struct */
 	dma_addr_t		init_pa; 	/* Holds physical address of the init struct */
 	
 	struct pci_dev		*pdev;		/* Our PCI interface */
@@ -898,7 +811,7 @@
 
 	struct Scsi_Host	*scsi_host_ptr;
 	struct fsa_scsi_hba	fsa_dev;
-	int			thread_pid;
+	pid_t			thread_pid;
 	int			cardtype;
 	
 	/*
diff -Nru a/drivers/scsi/aacraid/commctrl.c b/drivers/scsi/aacraid/commctrl.c
--- a/drivers/scsi/aacraid/commctrl.c	2004-05-26 15:01:35 -07:00
+++ b/drivers/scsi/aacraid/commctrl.c	2004-05-26 15:01:35 -07:00
@@ -148,7 +148,7 @@
 		 *	the list to 0.
 		 */
 		fibctx->count = 0;
-		AAC_INIT_LIST_HEAD(&fibctx->hw_fib_list);
+		INIT_LIST_HEAD(&fibctx->fib_list);
 		fibctx->jiffies = jiffies/HZ;
 		/*
 		 *	Now add this context onto the adapter's 
@@ -179,7 +179,7 @@
 {
 	struct fib_ioctl f;
 	struct aac_fib_context *fibctx, *aifcp;
-	struct hw_fib * hw_fib;
+	struct fib *fib;
 	int status;
 	struct list_head * entry;
 	int found;
@@ -222,25 +222,27 @@
 	 *	-EAGAIN
 	 */
 return_fib:
-	if (!aac_list_empty(&fibctx->hw_fib_list)) {
-		struct aac_list_head * entry;
+	if (!list_empty(&fibctx->fib_list)) {
+		struct list_head * entry;
 		/*
 		 *	Pull the next fib from the fibs
 		 */
-		entry = (struct aac_list_head*)(ulong)fibctx->hw_fib_list.next;
-		aac_list_del(entry);
+		entry = fibctx->fib_list.next;
+		list_del(entry);
 		
-		hw_fib = aac_list_entry(entry, struct hw_fib, header.FibLinks);
+		fib = list_entry(entry, struct fib, fiblink);
 		fibctx->count--;
 		spin_unlock_irqrestore(&dev->fib_lock, flags);
-		if (copy_to_user(f.fib, hw_fib, sizeof(struct hw_fib))) {
-			kfree(hw_fib);
+		if (copy_to_user(f.fib, fib->hw_fib, sizeof(struct hw_fib))) {
+			kfree(fib->hw_fib);
+			kfree(fib);
 			return -EFAULT;
 		}	
 		/*
 		 *	Free the space occupied by this copy of the fib.
 		 */
-		kfree(hw_fib);
+		kfree(fib->hw_fib);
+		kfree(fib);
 		status = 0;
 		fibctx->jiffies = jiffies/HZ;
 	} else {
@@ -262,24 +264,25 @@
 
 int aac_close_fib_context(struct aac_dev * dev, struct aac_fib_context * fibctx)
 {
-	struct hw_fib *hw_fib;
+	struct fib *fib;
 
 	/*
 	 *	First free any FIBs that have not been consumed.
 	 */
-	while (!aac_list_empty(&fibctx->hw_fib_list)) {
-		struct aac_list_head * entry;
+	while (!list_empty(&fibctx->fib_list)) {
+		struct list_head * entry;
 		/*
 		 *	Pull the next fib from the fibs
 		 */
-		entry = (struct aac_list_head*)(ulong)(fibctx->hw_fib_list.next);
-		aac_list_del(entry);
-		hw_fib = aac_list_entry(entry, struct hw_fib, header.FibLinks);
+		entry = fibctx->fib_list.next;
+		list_del(entry);
+		fib = list_entry(entry, struct fib, fiblink);
 		fibctx->count--;
 		/*
 		 *	Free the space occupied by this copy of the fib.
 		 */
-		kfree(hw_fib);
+		kfree(fib->hw_fib);
+		kfree(fib);
 	}
 	/*
 	 *	Remove the Context from the AdapterFibContext List
diff -Nru a/drivers/scsi/aacraid/comminit.c b/drivers/scsi/aacraid/comminit.c
--- a/drivers/scsi/aacraid/comminit.c	2004-05-26 15:01:35 -07:00
+++ b/drivers/scsi/aacraid/comminit.c	2004-05-26 15:01:35 -07:00
@@ -81,9 +81,9 @@
 	 *	Adapter Fibs are the first thing allocated so that they
 	 *	start page aligned
 	 */
-	dev->fib_base_va = (ulong)base;
+	dev->aif_base_va = (struct hw_fib *)base;
 	
-	init->AdapterFibsVirtualAddress = cpu_to_le32((u32)(ulong)phys);
+	init->AdapterFibsVirtualAddress = cpu_to_le32(0);
 	init->AdapterFibsPhysicalAddress = cpu_to_le32((u32)phys);
 	init->AdapterFibsSize = cpu_to_le32(fibsize);
 	init->AdapterFibAlign = cpu_to_le32(sizeof(struct hw_fib));
@@ -94,6 +94,9 @@
 	 * mapping system, but older Firmware did, and had *troubles* dealing
 	 * with the math overloading past 32 bits, thus we must limit this
 	 * field.
+	 *
+	 * FIXME: this assumes the memory is mapped zero->n, which isnt
+	 * always true on real computers.
 	 */
 	if ((num_physpages << (PAGE_SHIFT - 12)) <= AAC_MAX_HOSTPHYSMEMPAGES) {
 		init->HostPhysMemPages = 
@@ -140,7 +143,7 @@
 	q->dev = dev;
 	INIT_LIST_HEAD(&q->pendingq);
 	init_waitqueue_head(&q->cmdready);
-	AAC_INIT_LIST_HEAD(&q->cmdq);
+	INIT_LIST_HEAD(&q->cmdq);
 	init_waitqueue_head(&q->qfull);
 	spin_lock_init(&q->lockdata);
 	q->lock = &q->lockdata;
diff -Nru a/drivers/scsi/aacraid/commsup.c b/drivers/scsi/aacraid/commsup.c
--- a/drivers/scsi/aacraid/commsup.c	2004-05-26 15:01:36 -07:00
+++ b/drivers/scsi/aacraid/commsup.c	2004-05-26 15:01:36 -07:00
@@ -133,13 +133,10 @@
 	unsigned long flags;
 	spin_lock_irqsave(&dev->fib_lock, flags);
 	fibptr = dev->free_fib;	
-	while(!fibptr){
-		spin_unlock_irqrestore(&dev->fib_lock, flags);
-		set_current_state(TASK_UNINTERRUPTIBLE);
-		schedule_timeout(1);
-		spin_lock_irqsave(&dev->fib_lock, flags);
-		fibptr = dev->free_fib;	
-	}
+	/* Cannot sleep here or you get hangs. Instead we did the
+	   maths at compile time. */
+	if(!fibptr)
+		BUG();
 	dev->free_fib = fibptr->next;
 	spin_unlock_irqrestore(&dev->fib_lock, flags);
 	/*
@@ -290,7 +287,7 @@
 	}
 }   
 
-/*Command thread: *
+/**
  *	aac_queue_get		-	get the next free QE
  *	@dev: Adapter
  *	@index: Returned index
@@ -450,8 +447,7 @@
 	 *	Map the fib into 32bits by using the fib number
 	 */
 
-//	hw_fib->header.SenderFibAddress = ((u32)(fibptr-dev->fibs)) << 1;
-	hw_fib->header.SenderFibAddress = cpu_to_le32((u32)(ulong)fibptr->hw_fib_pa);
+	hw_fib->header.SenderFibAddress = cpu_to_le32(((u32)(fibptr-dev->fibs)) << 1);
 	hw_fib->header.SenderData = (u32)(fibptr - dev->fibs);
 	/*
 	 *	Set FIB state to indicate where it came from and if we want a
@@ -492,7 +488,7 @@
 	dprintk((KERN_DEBUG "  Command =               %d.\n", hw_fib->header.Command));
 	dprintk((KERN_DEBUG "  XferState  =            %x.\n", hw_fib->header.XferState));
 	dprintk((KERN_DEBUG "  hw_fib va being sent=%p\n",fibptr->hw_fib));
-	dprintk((KERN_DEBUG "  hw_fib pa being sent=%xl\n",(ulong)fibptr->hw_fib_pa));
+	dprintk((KERN_DEBUG "  hw_fib pa being sent=%lx\n",(ulong)fibptr->hw_fib_pa));
 	dprintk((KERN_DEBUG "  fib being sent=%p\n",fibptr));
 	/*
 	 *	Fill in the Callback and CallbackContext if we are not
@@ -806,8 +802,8 @@
  
 int aac_command_thread(struct aac_dev * dev)
 {
-	struct hw_fib *hw_fib, *newfib;
-	struct fib fibptr; /* for error logging */
+	struct hw_fib *hw_fib, *hw_newfib;
+	struct fib *fib, *newfib;
 	struct aac_queue_block *queues = dev->queues;
 	struct aac_fib_context *fibctx;
 	unsigned long flags;
@@ -828,42 +824,44 @@
 	 *	Let the DPC know it has a place to send the AIF's to.
 	 */
 	dev->aif_thread = 1;
-	memset(&fibptr, 0, sizeof(struct fib));
 	add_wait_queue(&queues->queue[HostNormCmdQueue].cmdready, &wait);
 	set_current_state(TASK_INTERRUPTIBLE);
 	while(1) 
 	{
 		spin_lock_irqsave(queues->queue[HostNormCmdQueue].lock, flags);
-		while(!aac_list_empty(&(queues->queue[HostNormCmdQueue].cmdq))) {
-			struct aac_list_head *entry;
+		while(!list_empty(&(queues->queue[HostNormCmdQueue].cmdq))) {
+			struct list_head *entry;
 			struct aac_aifcmd * aifcmd;
 
 			set_current_state(TASK_RUNNING);
 		
-			entry = (struct aac_list_head*)(ulong)(queues->queue[HostNormCmdQueue].cmdq.next);
-			dprintk(("aacraid: Command thread: removing fib from cmdq (%p)\n",entry));
-			aac_list_del(entry);
+			entry = queues->queue[HostNormCmdQueue].cmdq.next;
+			list_del(entry);
 			
 			spin_unlock_irqrestore(queues->queue[HostNormCmdQueue].lock, flags);
-			hw_fib = aac_list_entry(entry, struct hw_fib, header.FibLinks);
+			fib = list_entry(entry, struct fib, fiblink);
 			/*
 			 *	We will process the FIB here or pass it to a 
 			 *	worker thread that is TBD. We Really can't 
 			 *	do anything at this point since we don't have
 			 *	anything defined for this thread to do.
 			 */
-			memset(&fibptr, 0, sizeof(struct fib));
-			fibptr.type = FSAFS_NTC_FIB_CONTEXT;
-			fibptr.size = sizeof( struct fib );
-			fibptr.hw_fib = hw_fib;
-			fibptr.data = hw_fib->data;
-			fibptr.dev = dev;
+			hw_fib = fib->hw_fib;
+			memset(fib, 0, sizeof(struct fib));
+			fib->type = FSAFS_NTC_FIB_CONTEXT;
+			fib->size = sizeof( struct fib );
+			fib->hw_fib = hw_fib;
+			fib->data = hw_fib->data;
+			fib->dev = dev;
 			/*
 			 *	We only handle AifRequest fibs from the adapter.
 			 */
 			aifcmd = (struct aac_aifcmd *) hw_fib->data;
-			if (aifcmd->command == le16_to_cpu(AifCmdDriverNotify)) {
-				aac_handle_aif(dev, &fibptr);
+			if (aifcmd->command == cpu_to_le32(AifCmdDriverNotify)) {
+				/* Handle Driver Notify Events */
+				aac_handle_aif(dev, fib);
+				*(u32 *)hw_fib->data = cpu_to_le32(ST_OK);
+				fib_adapter_complete(fib, sizeof(u32));
 			} else {
 				struct list_head *entry;
 				/* The u32 here is important and intended. We are using
@@ -872,6 +870,10 @@
 				u32 time_now, time_last;
 				unsigned long flagv;
 				
+				/* Sniff events */
+				if (aifcmd->command == cpu_to_le32(AifCmdEventNotify))
+					aac_handle_aif(dev, fib);
+				
 				time_now = jiffies/HZ;
 
 				spin_lock_irqsave(&dev->fib_lock, flagv);
@@ -893,6 +895,11 @@
 					 */
 					if (fibctx->count > 20)
 					{
+						/*
+						 * It's *not* jiffies folks,
+						 * but jiffies / HZ so do not
+						 * panic ...
+						 */
 						time_last = fibctx->jiffies;
 						/*
 						 * Has it been > 2 minutes 
@@ -909,17 +916,20 @@
 					 * Warning: no sleep allowed while
 					 * holding spinlock
 					 */
-					newfib = kmalloc(sizeof(struct hw_fib), GFP_ATOMIC);
-					if (newfib) {
+					hw_newfib = kmalloc(sizeof(struct hw_fib), GFP_ATOMIC);
+					newfib = kmalloc(sizeof(struct fib), GFP_ATOMIC);
+					if (newfib && hw_newfib) {
 						/*
 						 * Make the copy of the FIB
 						 */
-						memcpy(newfib, hw_fib, sizeof(struct hw_fib));
+						memcpy(hw_newfib, hw_fib, sizeof(struct hw_fib));
+						memcpy(newfib, fib, sizeof(struct fib));
+						newfib->hw_fib = hw_newfib;
 						/*
 						 * Put the FIB onto the
 						 * fibctx's fibs
 						 */
-						aac_list_add_tail(&newfib->header.FibLinks, &fibctx->hw_fib_list);
+						list_add_tail(&newfib->fiblink, &fibctx->fib_list);
 						fibctx->count++;
 						/* 
 						 * Set the event to wake up the
@@ -928,6 +938,10 @@
 						up(&fibctx->wait_sem);
 					} else {
 						printk(KERN_WARNING "aifd: didn't allocate NewFib.\n");
+						if(newfib)
+							kfree(newfib);
+						if(hw_newfib)
+							kfree(hw_newfib);
 					}
 					entry = entry->next;
 				}
@@ -935,10 +949,11 @@
 				 *	Set the status of this FIB
 				 */
 				*(u32 *)hw_fib->data = cpu_to_le32(ST_OK);
-				fib_adapter_complete(&fibptr, sizeof(u32));
+				fib_adapter_complete(fib, sizeof(u32));
 				spin_unlock_irqrestore(&dev->fib_lock, flagv);
 			}
 			spin_lock_irqsave(queues->queue[HostNormCmdQueue].lock, flags);
+			kfree(fib);
 		}
 		/*
 		 *	There are no more AIF's
diff -Nru a/drivers/scsi/aacraid/dpcsup.c b/drivers/scsi/aacraid/dpcsup.c
--- a/drivers/scsi/aacraid/dpcsup.c	2004-05-26 15:01:36 -07:00
+++ b/drivers/scsi/aacraid/dpcsup.c	2004-05-26 15:01:36 -07:00
@@ -70,12 +70,12 @@
 	 */
 	while(aac_consumer_get(dev, q, &entry))
 	{
-		u32 fast ;
-		fast = (entry->addr & cpu_to_le32(0x01));
-		hwfib = (struct hw_fib *)((char *)dev->hw_fib_va + 
-				((entry->addr & ~0x01) - dev->hw_fib_pa));
-		fib = &dev->fibs[hwfib->header.SenderData];
-
+		int fast;
+		u32 index = le32_to_cpu(entry->addr);
+		fast = index & 0x01;
+		fib = &dev->fibs[index >> 1];
+		hwfib = fib->hw_fib;
+		
 		aac_consumer_free(dev, q, HostNormRespQueue);
 		/*
 		 *	Remove this fib from the Outstanding I/O queue.
@@ -169,29 +169,44 @@
 	 */
 	while(aac_consumer_get(dev, q, &entry))
 	{
+		struct fib fibctx;
 		struct hw_fib * hw_fib;
-		hw_fib = (struct hw_fib *)((char *)dev->hw_fib_va + 
-				((entry->addr & ~0x01) - dev->hw_fib_pa));
-
-		if (dev->aif_thread) {
-		        aac_list_add_tail(&hw_fib->header.FibLinks, &q->cmdq);
+		u32 index;
+		struct fib *fib = &fibctx;
+		
+		index = le32_to_cpu(entry->addr) / sizeof(struct hw_fib);
+		hw_fib = &dev->aif_base_va[index];
+		
+		/*
+		 *	Allocate a FIB at all costs. For non queued stuff
+		 *	we can just use the stack so we are happy. We need
+		 *	a fib object in order to manage the linked lists
+		 */
+		if (dev->aif_thread)
+			if((fib = kmalloc(sizeof(struct fib), GFP_ATOMIC)) == NULL)
+				fib = &fibctx;
+		
+		memset(fib, 0, sizeof(struct fib));
+		INIT_LIST_HEAD(&fib->fiblink);
+		fib->type = FSAFS_NTC_FIB_CONTEXT;
+		fib->size = sizeof(struct fib);
+		fib->hw_fib = hw_fib;
+		fib->data = hw_fib->data;
+		fib->dev = dev;
+		
+				
+		if (dev->aif_thread && fib != &fibctx) {
+		        list_add_tail(&fib->fiblink, &q->cmdq);
 	 	        aac_consumer_free(dev, q, HostNormCmdQueue);
 		        wake_up_interruptible(&q->cmdready);
 		} else {
-			struct fib fibctx;
 	 	        aac_consumer_free(dev, q, HostNormCmdQueue);
 			spin_unlock_irqrestore(q->lock, flags);
-			memset(&fibctx, 0, sizeof(struct fib));
-			fibctx.type = FSAFS_NTC_FIB_CONTEXT;
-			fibctx.size = sizeof(struct fib);
-			fibctx.hw_fib = hw_fib;
-			fibctx.data = hw_fib->data;
-			fibctx.dev = dev;
 			/*
 			 *	Set the status of this FIB
 			 */
 			*(u32 *)hw_fib->data = cpu_to_le32(ST_OK);
-			fib_adapter_complete(&fibctx, sizeof(u32));
+			fib_adapter_complete(fib, sizeof(u32));
 			spin_lock_irqsave(q->lock, flags);
 		}		
 	}
diff -Nru a/drivers/scsi/aacraid/sa.c b/drivers/scsi/aacraid/sa.c
--- a/drivers/scsi/aacraid/sa.c	2004-05-26 15:01:36 -07:00
+++ b/drivers/scsi/aacraid/sa.c	2004-05-26 15:01:36 -07:00
@@ -419,6 +419,11 @@
 	 *	Start any kernel threads needed
 	 */
 	dev->thread_pid = kernel_thread((int (*)(void *))aac_command_thread, dev, 0);
+	if (dev->thread_pid < 0) {
+		printk(KERN_ERR "aacraid: Unable to create command thread.\n");
+		return -1;
+	}
+
 	/*
 	 *	Tell the adapter that all is configure, and it can start 
 	 *	accepting requests
diff -Nru a/drivers/scsi/atp870u.c b/drivers/scsi/atp870u.c
--- a/drivers/scsi/atp870u.c	2004-05-26 15:01:35 -07:00
+++ b/drivers/scsi/atp870u.c	2004-05-26 15:01:35 -07:00
@@ -4,6 +4,7 @@
  *  Copyright (C) 1997	Wu Ching Chen
  *  2.1.x update (C) 1998  Krzysztof G. Baranowski
  *  2.5.x update (C) 2002  Red Hat <alan@redhat.com>
+ *  2.6.x update (C) 2004  Red Hat <alan@redhat.com>
  *
  * Marcelo Tosatti <marcelo@conectiva.com.br> : SMP fixes
  *
@@ -126,9 +127,11 @@
 			/*
 			 *      Issue more commands
 			 */
+			spin_lock_irqsave(dev->host->host_lock, flags);
 			if (((dev->quhdu != dev->quendu) || (dev->last_cmd != 0xff)) && (dev->in_snd == 0)) {
 				send_s870(host);
 			}
+			spin_unlock_irqrestore(dev->host->host_lock, flags);
 			/*
 			 *      Done
 			 */
@@ -371,9 +374,11 @@
 			/*
 			 *      If there is stuff to send and nothing going then send it
 			 */
+			spin_lock_irqsave(dev->host->host_lock, flags);
 			if (((dev->last_cmd != 0xff) || (dev->quhdu != dev->quendu)) && (dev->in_snd == 0)) {
 				send_s870(host);
 			}
+			spin_unlock_irqrestore(dev->host->host_lock, flags);
 			dev->in_int = 0;
 			goto out;
 		}
@@ -443,9 +448,16 @@
 	return IRQ_HANDLED;
 }
 
+/**
+ *	atp870u_queuecommand	-	Queue SCSI command
+ *	@req_p: request block
+ *	@done: completion function
+ *
+ *	Queue a command to the ATP queue. Called with the host lock held.
+ */
+ 
 static int atp870u_queuecommand(Scsi_Cmnd * req_p, void (*done) (Scsi_Cmnd *))
 {
-	unsigned long flags;
 	unsigned short int m;
 	unsigned int tmport;
 	struct Scsi_Host *host;
@@ -484,7 +496,6 @@
 	 *      Count new command
 	 */
 
-	spin_lock_irqsave(host->host_lock, flags);
 	dev->quendu++;
 	if (dev->quendu >= qcnt) {
 		dev->quendu = 0;
@@ -498,24 +509,31 @@
 		}
 		dev->quendu--;
 		req_p->result = 0x00020000;
-		spin_unlock_irqrestore(host->host_lock, flags);
 		done(req_p);
 		return 0;
 	}
 	dev->querequ[dev->quendu] = req_p;
 	tmport = dev->ioport + 0x1c;
-	spin_unlock_irqrestore(host->host_lock, flags);
 	if ((inb(tmport) == 0) && (dev->in_int == 0) && (dev->in_snd == 0)) {
 		send_s870(host);
 	}
 	return 0;
 }
 
+/**
+ *	send_s870	-	send a command to the controller
+ *	@host: host
+ *
+ *	On entry there is work queued to be done. We move some of that work to the
+ *	controller itself. 
+ *
+ *	Caller holds the host lock.
+ */
+ 
 static void send_s870(struct Scsi_Host *host)
 {
 	unsigned int tmport;
 	Scsi_Cmnd *workrequ;
-	unsigned long flags;
 	unsigned int i;
 	unsigned char j, target_id;
 	unsigned char *prd;
@@ -527,10 +545,7 @@
 	struct atp_unit *dev = (struct atp_unit *)&host->hostdata;
 	int sg_count;
 
-	spin_lock_irqsave(host->host_lock, flags);
-	
 	if (dev->in_snd != 0) {
-		spin_unlock_irqrestore(host->host_lock, flags);
 		return;
 	}
 	dev->in_snd = 1;
@@ -543,13 +558,11 @@
 		dev->last_cmd = 0xff;
 		if (dev->quhdu == dev->quendu) {
 			dev->in_snd = 0;
-			spin_unlock_irqrestore(dev->host->host_lock, flags);
 			return;
 		}
 	}
 	if ((dev->last_cmd != 0xff) && (dev->working != 0)) {
 		dev->in_snd = 0;
-		spin_unlock_irqrestore(dev->host->host_lock, flags);
 		return;
 	}
 	dev->working++;
@@ -567,7 +580,6 @@
 	dev->quhdu = j;
 	dev->working--;
 	dev->in_snd = 0;
-	spin_unlock_irqrestore(host->host_lock, flags);
 	return;
 cmd_subp:
 	workportu = dev->ioport;
@@ -582,7 +594,6 @@
 abortsnd:
 	dev->last_cmd |= 0x40;
 	dev->in_snd = 0;
-	spin_unlock_irqrestore(dev->host->host_lock, flags);
 	return;
 oktosend:
 	memcpy(&dev->ata_cdbu[0], &workrequ->cmnd[0], workrequ->cmd_len);
@@ -684,7 +695,6 @@
 			dev->last_cmd |= 0x40;
 		}
 		dev->in_snd = 0;
-		spin_unlock_irqrestore(host->host_lock, flags);
 		return;
 	}
 	tmpcip = dev->pciport;
@@ -770,7 +780,6 @@
 			dev->last_cmd |= 0x40;
 		}
 		dev->in_snd = 0;
-		spin_unlock_irqrestore(host->host_lock, flags);
 		return;
 	}
 	if (inb(tmport) == 0) {
@@ -781,9 +790,6 @@
 		dev->last_cmd |= 0x40;
 	}
 	dev->in_snd = 0;
-	spin_unlock_irqrestore(host->host_lock, flags);
-	return;
-
 }
 
 static unsigned char fun_scam(struct atp_unit *dev, unsigned short int *val)
diff -Nru a/drivers/scsi/dc390.h b/drivers/scsi/dc390.h
--- a/drivers/scsi/dc390.h	2004-05-26 15:01:35 -07:00
+++ b/drivers/scsi/dc390.h	2004-05-26 15:01:35 -07:00
@@ -19,7 +19,7 @@
 #endif
 
 #define DC390_BANNER "Tekram DC390/AM53C974"
-#define DC390_VERSION "2.0f 2000-12-20"
+#define DC390_VERSION "2.1b 2004-04-13"
 
 /* We don't have eh_abort_handler, eh_device_reset_handler, 
  * eh_bus_reset_handler, eh_host_reset_handler yet! 
@@ -33,11 +33,11 @@
 # define USE_NEW_EH
 #endif
 
-extern int DC390_detect(Scsi_Host_Template *psht);
-extern int DC390_queue_command(Scsi_Cmnd *cmd, void (*done)(Scsi_Cmnd *));
-extern int DC390_abort(Scsi_Cmnd *cmd);
-extern int DC390_reset(Scsi_Cmnd *cmd);
-extern int DC390_bios_param(struct scsi_device *sdev, struct block_device *dev,
+static int DC390_detect(Scsi_Host_Template *psht);
+static int DC390_queue_command(Scsi_Cmnd *cmd, void (*done)(Scsi_Cmnd *));
+static int DC390_abort(Scsi_Cmnd *cmd);
+static int DC390_reset(Scsi_Cmnd *cmd);
+static int DC390_bios_param(struct scsi_device *sdev, struct block_device *dev,
 		sector_t capacity, int geom[]);
 
 static int DC390_release(struct Scsi_Host *);
diff -Nru a/drivers/scsi/dpt_i2o.c b/drivers/scsi/dpt_i2o.c
--- a/drivers/scsi/dpt_i2o.c	2004-05-26 15:01:36 -07:00
+++ b/drivers/scsi/dpt_i2o.c	2004-05-26 15:01:36 -07:00
@@ -20,17 +20,21 @@
  *   (at your option) any later version.                                   *
  *                                                                         *
  ***************************************************************************/
+/***************************************************************************
+ * Sat Dec 20 2003 Go Taniguchi <go@turbolinux.co.jp>
+ - Support 2.6 kernel and DMA-mapping
+ - ioctl fix for raid tools
+ - use schedule_timeout in long long loop
+ **************************************************************************/
 
-//#define DEBUG 1
-//#define UARTDELAY 1
+/*#define DEBUG 1 */
+/*#define UARTDELAY 1 */
 
-// On the real kernel ADDR32 should always be zero for 2.4. GFP_HIGH allocates
-// high pages. Keep the macro around because of the broken unmerged ia64 tree
+/* On the real kernel ADDR32 should always be zero for 2.4. GFP_HIGH allocates
+   high pages. Keep the macro around because of the broken unmerged ia64 tree */
 
 #define ADDR32 (0)
 
-#error Please convert me to Documentation/DMA-mapping.txt
-
 #include <linux/version.h>
 #include <linux/module.h>
 
@@ -53,6 +57,7 @@
 #include <linux/kernel.h>	/* for printk */
 #include <linux/sched.h>
 #include <linux/reboot.h>
+#include <linux/spinlock.h>
 #include <linux/smp_lock.h>
 
 #include <linux/timer.h>
@@ -85,7 +90,7 @@
 #elif defined(__alpha__)
 	PROC_ALPHA ,
 #else
-	(-1),(-1)
+	(-1),(-1),
 #endif
 	 FT_HBADRVR, 0, OEM_DPT, OS_LINUX, CAP_OVERLAP, DEV_ALL,
 	ADF_ALL_SC5, 0, 0, DPT_VERSION, DPT_REVISION, DPT_SUBREVISION,
@@ -226,7 +231,7 @@
 	/* Active IOPs now in OPERATIONAL state */
 	PDEBUG("HBA's in OPERATIONAL state\n");
 
-	printk(KERN_INFO"dpti: If you have a lot of devices this could take a few minutes.\n");
+	printk("dpti: If you have a lot of devices this could take a few minutes.\n");
 	for (pHba = hba_chain; pHba; pHba = pHba->next) {
 		printk(KERN_INFO"%s: Reading the hardware resource table.\n", pHba->name);
 		if (adpt_i2o_lct_get(pHba) < 0){
@@ -269,6 +274,7 @@
 	adpt_hba* pHba = (adpt_hba*) host->hostdata[0];
 //	adpt_i2o_quiesce_hba(pHba);
 	adpt_i2o_delete_hba(pHba);
+	scsi_unregister(host);
 	return 0;
 }
 
@@ -339,6 +345,8 @@
 	if (rcode != 0) {
 		sprintf(pHba->detail, "Adaptec I2O RAID");
 		printk(KERN_INFO "%s: Inquiry Error (%d)\n",pHba->name,rcode);
+		if (rcode != -ETIME && rcode != -EINTR)
+			kfree(buf);
 	} else {
 		memset(pHba->detail, 0, sizeof(pHba->detail));
 		memcpy(&(pHba->detail), "Vendor: Adaptec ", 16);
@@ -347,8 +355,8 @@
 		memcpy(&(pHba->detail[40]), " FW: ", 4);
 		memcpy(&(pHba->detail[44]), (u8*) &buf[32], 4);
 		pHba->detail[48] = '\0';	/* precautionary */
+		kfree(buf);
 	}
-	kfree(buf);
 	adpt_i2o_status_get(pHba);
 	return ;
 }
@@ -478,7 +486,7 @@
 		heads = 255;
 		sectors = 63;
 	}
-	cylinders = capacity / (heads * sectors);
+	cylinders = sector_div(capacity, heads * sectors);
 
 	// Special case if CDROM
 	if(sdev->type == 5) {  // CDROM
@@ -871,6 +879,9 @@
 		return -EINVAL;
 	}
 	pci_set_master(pDev);
+	if (pci_set_dma_mask(pDev, 0xffffffffffffffffULL) &&
+	    pci_set_dma_mask(pDev, 0xffffffffULL))
+		return -EINVAL;
 
 	base_addr0_phys = pci_resource_start(pDev,0);
 	hba_map0_area_size = pci_resource_len(pDev,0);
@@ -963,6 +974,7 @@
 
 	// Initializing the spinlocks
 	spin_lock_init(&pHba->state_lock);
+	spin_lock_init(&adpt_post_wait_lock);
 
 	if(raptorFlag == 0){
 		printk(KERN_INFO"Adaptec I2O RAID controller %d at %lx size=%x irq=%d\n", 
@@ -1064,7 +1076,7 @@
 {
 	int i;
 
-	printk(KERN_INFO"Loading Adaptec I2O RAID: Version " DPT_I2O_VERSION "\n");
+	printk("Loading Adaptec I2O RAID: Version " DPT_I2O_VERSION "\n");
 	for (i = 0; i < DPTI_MAX_HBA; i++) {
 		hbas[i] = NULL;
 	}
@@ -1152,12 +1164,22 @@
 	timeout *= HZ;
 	if((status = adpt_i2o_post_this(pHba, msg, len)) == 0){
 		set_current_state(TASK_INTERRUPTIBLE);
-		spin_unlock_irq(pHba->host->host_lock);
+		if(pHba->host)
+			spin_unlock_irq(pHba->host->host_lock);
 		if (!timeout)
 			schedule();
-		else
+		else{
+			timeout = schedule_timeout(timeout);
+			if (timeout == 0) {
+				// I/O issued, but cannot get result in
+				// specified time. Freeing resorces is
+				// dangerous.
+				status = -ETIME;
+			}
 			schedule_timeout(timeout*HZ);
-		spin_lock_irq(pHba->host->host_lock);
+		}
+		if(pHba->host)
+			spin_lock_irq(pHba->host->host_lock);
 	}
 	spin_lock_irq(&adpt_wq_i2o_post.lock);
 	__remove_wait_queue(&adpt_wq_i2o_post, &wait);
@@ -1209,6 +1231,8 @@
 			printk(KERN_WARNING"dpti%d: Timeout waiting for message frame!\n", pHba->unit);
 			return -ETIMEDOUT;
 		}
+		set_current_state(TASK_UNINTERRUPTIBLE);
+		schedule_timeout(1);
 	} while(m == EMPTY_QUEUE);
 		
 	msg = (u32*) (pHba->msg_addr_virt + m);
@@ -1283,6 +1307,8 @@
 			printk(KERN_WARNING"Timeout waiting for message!\n");
 			return -ETIMEDOUT;
 		}
+		set_current_state(TASK_UNINTERRUPTIBLE);
+		schedule_timeout(1);
 	} while (m == EMPTY_QUEUE);
 
 	status = (u8*)kmalloc(4, GFP_KERNEL|ADDR32);
@@ -1314,6 +1340,8 @@
 			return -ETIMEDOUT;
 		}
 		rmb();
+		set_current_state(TASK_UNINTERRUPTIBLE);
+		schedule_timeout(1);
 	}
 
 	if(*status == 0x01 /*I2O_EXEC_IOP_RESET_IN_PROGRESS*/) {
@@ -1330,6 +1358,8 @@
 				printk(KERN_ERR "%s:Timeout waiting for IOP Reset.\n",pHba->name);
 				return -ETIMEDOUT;
 			}
+			set_current_state(TASK_UNINTERRUPTIBLE);
+			schedule_timeout(1);
 		} while (m == EMPTY_QUEUE);
 		// Flush the offset
 		adpt_send_nop(pHba, m);
@@ -1695,15 +1725,20 @@
 	}
 
 	do {
-		spin_lock_irqsave(pHba->host->host_lock, flags);
+		if(pHba->host)
+			spin_lock_irqsave(pHba->host->host_lock, flags);
 		// This state stops any new commands from enterring the
 		// controller while processing the ioctl
 //		pHba->state |= DPTI_STATE_IOCTL;
 //		We can't set this now - The scsi subsystem sets host_blocked and
 //		the queue empties and stops.  We need a way to restart the queue
 		rcode = adpt_i2o_post_wait(pHba, msg, size, FOREVER);
+		if (rcode != 0)
+			printk("adpt_i2o_passthru: post wait failed %d %p\n",
+					rcode, reply);
 //		pHba->state &= ~DPTI_STATE_IOCTL;
-		spin_unlock_irqrestore(pHba->host->host_lock, flags);
+		if(pHba->host)
+			spin_unlock_irqrestore(pHba->host->host_lock, flags);
 	} while(rcode == -ETIMEDOUT);  
 
 	if(rcode){
@@ -1764,10 +1799,12 @@
 
 
 cleanup:
-	kfree (reply);
+	if (rcode != -ETIME && rcode != -EINTR)
+		kfree (reply);
 	while(sg_index) {
 		if(sg_list[--sg_index]) {
-			kfree((void*)(sg_list[sg_index]));
+			if (rcode != -ETIME && rcode != -EINTR)
+				kfree((void*)(sg_list[sg_index]));
 		}
 	}
 	return rcode;
@@ -1875,7 +1912,7 @@
 	int minor;
 	int error = 0;
 	adpt_hba* pHba;
-	ulong flags;
+	ulong flags = 0;
 
 	minor = iminor(inode);
 	if (minor >= DPTI_MAX_HBA){
@@ -1941,9 +1978,11 @@
 		break;
 		}
 	case I2ORESETCMD:
-		spin_lock_irqsave(pHba->host->host_lock, flags);
+		if(pHba->host)
+			spin_lock_irqsave(pHba->host->host_lock, flags);
 		adpt_hba_reset(pHba);
-		spin_unlock_irqrestore(pHba->host->host_lock, flags);
+		if(pHba->host)
+			spin_unlock_irqrestore(pHba->host->host_lock, flags);
 		break;
 	case I2ORESCANCMD:
 		adpt_rescan(pHba);
@@ -1956,7 +1995,7 @@
 }
 
 
-static void adpt_isr(int irq, void *dev_id, struct pt_regs *regs)
+static irqreturn_t adpt_isr(int irq, void *dev_id, struct pt_regs *regs)
 {
 	Scsi_Cmnd* cmd;
 	adpt_hba* pHba = dev_id;
@@ -1965,12 +2004,15 @@
 	u32 status=0;
 	u32 context;
 	ulong flags = 0;
+	int handled = 0;
 
-	if (pHba == NULL ){
+	if (pHba == NULL){
 		printk(KERN_WARNING"adpt_isr: NULL dev_id\n");
-		return;
+		return IRQ_NONE;
 	}
-	spin_lock_irqsave(pHba->host->host_lock, flags);
+	if(pHba->host)
+		spin_lock_irqsave(pHba->host->host_lock, flags);
+
 	while( readl(pHba->irq_mask) & I2O_INTERRUPT_PENDING_B) {
 		m = readl(pHba->reply_port);
 		if(m == EMPTY_QUEUE){
@@ -2035,7 +2077,10 @@
 		wmb();
 		rmb();
 	}
-out:	spin_unlock_irqrestore(pHba->host->host_lock, flags);
+	handled = 1;
+out:	if(pHba->host)
+		spin_unlock_irqrestore(pHba->host->host_lock, flags);
+	return IRQ_RETVAL(handled);
 }
 
 static s32 adpt_scsi_to_i2o(adpt_hba* pHba, Scsi_Cmnd* cmd, struct adpt_device* d)
@@ -2110,15 +2155,19 @@
 	/* Now fill in the SGList and command */
 	if(cmd->use_sg) {
 		struct scatterlist *sg = (struct scatterlist *)cmd->request_buffer;
+		int sg_count = pci_map_sg(pHba->pDev, sg, cmd->use_sg,
+                        scsi_to_pci_dma_dir(cmd->sc_data_direction));
+
+
 		len = 0;
-		for(i = 0 ; i < cmd->use_sg; i++) {
-			*mptr++ = direction|0x10000000|sg->length;
-			len+=sg->length;
-			*mptr++ = virt_to_bus(sg->address);
+		for(i = 0 ; i < sg_count; i++) {
+			*mptr++ = direction|0x10000000|sg_dma_len(sg);
+			len+=sg_dma_len(sg);
+			*mptr++ = sg_dma_address(sg);
 			sg++;
 		}
 		/* Make this an end of list */
-		mptr[-2] = direction|0xD0000000|(sg-1)->length;
+		mptr[-2] = direction|0xD0000000|sg_dma_len(sg-1);
 		reqlen = mptr - msg;
 		*lenptr = len;
 		
@@ -2132,7 +2181,10 @@
 			reqlen = 12;
 		} else {
 			*mptr++ = 0xD0000000|direction|cmd->request_bufflen;
-			*mptr++ = virt_to_bus(cmd->request_buffer);
+			*mptr++ = pci_map_single(pHba->pDev,
+				cmd->request_buffer,
+				cmd->request_bufflen,
+				scsi_to_pci_dma_dir(cmd->sc_data_direction));
 		}
 	}
 	
@@ -2305,15 +2357,17 @@
 static s32 adpt_rescan(adpt_hba* pHba)
 {
 	s32 rcode;
-	ulong flags;
+	ulong flags = 0;
 
-	spin_lock_irqsave(pHba->host->host_lock, flags);
+	if(pHba->host)
+		spin_lock_irqsave(pHba->host->host_lock, flags);
 	if ((rcode=adpt_i2o_lct_get(pHba)) < 0)
 		goto out;
 	if ((rcode=adpt_i2o_reparse_lct(pHba)) < 0)
 		goto out;
 	rcode = 0;
-out:	spin_unlock_irqrestore(pHba->host->host_lock, flags);
+out:	if(pHba->host)
+		spin_unlock_irqrestore(pHba->host->host_lock, flags);
 	return rcode;
 }
 
@@ -2595,6 +2649,8 @@
 			printk(KERN_ERR "%s: Timeout waiting for message frame!\n",pHba->name);
 			return 2;
 		}
+		set_current_state(TASK_UNINTERRUPTIBLE);
+		schedule_timeout(1);
 	}
 	msg = (u32*)(pHba->msg_addr_virt + m);
 	writel( THREE_WORD_MSG_SIZE | SGL_OFFSET_0,&msg[0]);
@@ -2628,6 +2684,8 @@
 			printk(KERN_WARNING"%s: Timeout waiting for message frame\n",pHba->name);
 			return -ETIMEDOUT;
 		}
+		set_current_state(TASK_UNINTERRUPTIBLE);
+		schedule_timeout(1);
 	} while(m == EMPTY_QUEUE);
 
 	msg=(u32 *)(pHba->msg_addr_virt+m);
@@ -2663,9 +2721,10 @@
 		rmb();
 		if(time_after(jiffies,timeout)){
 			printk(KERN_WARNING"%s: Timeout Initializing\n",pHba->name);
-			kfree((void*)status);
 			return -ETIMEDOUT;
 		}
+		set_current_state(TASK_UNINTERRUPTIBLE);
+		schedule_timeout(1);
 	} while (1);
 
 	// If the command was successful, fill the fifo with our reply
@@ -2743,6 +2802,8 @@
 					pHba->name);
 			return -ETIMEDOUT;
 		}
+		set_current_state(TASK_UNINTERRUPTIBLE);
+		schedule_timeout(1);
 	} while(m==EMPTY_QUEUE);
 
 	
@@ -2769,6 +2830,8 @@
 			return -ETIMEDOUT;
 		}
 		rmb();
+		set_current_state(TASK_UNINTERRUPTIBLE);
+		schedule_timeout(1);
 	}
 
 	// Set up our number of outbound and inbound messages
@@ -3094,17 +3157,33 @@
 			int group, int field, void *buf, int buflen)
 {
 	u16 opblk[] = { 1, 0, I2O_PARAMS_FIELD_GET, group, 1, field };
-	u8  resblk[8+buflen]; /* 8 bytes for header */
+	u8 *resblk;
+
 	int size;
 
+	/* 8 bytes for header */
+	resblk = kmalloc(sizeof(u8) * (8+buflen), GFP_KERNEL|ADDR32);
+	if (resblk == NULL) {
+		printk(KERN_CRIT "%s: query scalar failed; Out of memory.\n", pHba->name);
+		return -ENOMEM;
+	}
+
 	if (field == -1)  		/* whole group */
 			opblk[4] = -1;
 
 	size = adpt_i2o_issue_params(I2O_CMD_UTIL_PARAMS_GET, pHba, tid, 
-		opblk, sizeof(opblk), resblk, sizeof(resblk));
+		opblk, sizeof(opblk), resblk, sizeof(u8)*(8+buflen));
+	if (size == -ETIME) {
+		printk(KERN_WARNING "%s: issue params failed; Timed out.\n", pHba->name);
+		return -ETIME;
+	} else if (size == -EINTR) {
+		printk(KERN_WARNING "%s: issue params failed; Interrupted.\n", pHba->name);
+		return -EINTR;
+	}
 			
 	memcpy(buf, resblk+8, buflen);  /* cut off header */
 
+	kfree(resblk);
 	if (size < 0)
 		return size;	
 
@@ -3138,6 +3217,7 @@
 	msg[8] = virt_to_bus(resblk);
 
 	if ((wait_status = adpt_i2o_post_wait(pHba, msg, sizeof(msg), 20))) {
+		printk("adpt_i2o_issue_params: post_wait failed (%p)\n", resblk);
    		return wait_status; 	/* -DetailedStatus */
 	}
 
diff -Nru a/drivers/scsi/dpti.h b/drivers/scsi/dpti.h
--- a/drivers/scsi/dpti.h	2004-05-26 15:01:35 -07:00
+++ b/drivers/scsi/dpti.h	2004-05-26 15:01:35 -07:00
@@ -65,7 +65,7 @@
 #include "dpt/dpti_i2o.h"
 #include "dpt/dpti_ioctl.h"
 
-#define DPT_I2O_VERSION "2.4 Build 5"
+#define DPT_I2O_VERSION "2.4 Build 5go"
 #define DPT_VERSION     2
 #define DPT_REVISION    '4'
 #define DPT_SUBREVISION '5'
@@ -272,7 +272,7 @@
 static void adpt_i2o_sys_shutdown(void);
 static int adpt_init(void);
 static int adpt_i2o_build_sys_table(void);
-static void adpt_isr(int irq, void *dev_id, struct pt_regs *regs);
+static irqreturn_t adpt_isr(int irq, void *dev_id, struct pt_regs *regs);
 #ifdef REBOOT_NOTIFIER
 static int adpt_reboot_event(struct notifier_block *n, ulong code, void *p);
 #endif
diff -Nru a/drivers/scsi/gdth.c b/drivers/scsi/gdth.c
--- a/drivers/scsi/gdth.c	2004-05-26 15:01:36 -07:00
+++ b/drivers/scsi/gdth.c	2004-05-26 15:01:36 -07:00
@@ -4,9 +4,9 @@
  * Intel Corporation:  Storage RAID Controllers                         *
  *                                                                      *
  * gdth.c                                                               *
- * Copyright (C) 1995-03 ICP vortex GmbH, Achim Leubner                 *
- * Copyright (C) 2002-03 Intel Corporation                              *
- * Copyright (C) 2003    Adaptec Inc.                                   *
+ * Copyright (C) 1995-04 ICP vortex GmbH, Achim Leubner                 *
+ * Copyright (C) 2002-04 Intel Corporation                              *
+ * Copyright (C) 2003-04 Adaptec Inc.                                   *
  * <achim_leubner@adaptec.com>                                          *
  *                                                                      *
  * Additions/Fixes:                                                     *
@@ -27,9 +27,42 @@
  * along with this kernel; if not, write to the Free Software           *
  * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.            *
  *                                                                      *
- * Tested with Linux 1.2.13, ..., 2.2.20, ..., 2.4.22                   *
+ * Linux kernel 2.2.x, 2.4.x, 2.6.x supported                           *
  *                                                                      *
  * $Log: gdth.c,v $
+ * Revision 1.73  2004/03/31 13:33:03  achim
+ * Special command 0xfd implemented to detect 64-bit DMA support
+ *
+ * Revision 1.72  2004/03/17 08:56:04  achim
+ * 64-bit DMA only enabled if FW >= x.43
+ *
+ * Revision 1.71  2004/03/05 15:51:29  achim
+ * Screen service: separate message buffer, bugfixes
+ *
+ * Revision 1.70  2004/02/27 12:19:07  achim
+ * Bugfix: Reset bit in config (0xfe) call removed
+ *
+ * Revision 1.69  2004/02/20 09:50:24  achim
+ * Compatibility changes for kernels < 2.4.20
+ * Bugfix screen service command size
+ * pci_set_dma_mask() error handling added
+ *
+ * Revision 1.68  2004/02/19 15:46:54  achim
+ * 64-bit DMA bugfixes
+ * Drive size bugfix for drives > 1TB
+ *
+ * Revision 1.67  2004/01/14 13:11:57  achim
+ * Tool access over /proc no longer supported
+ * Bugfixes IOCTLs
+ *
+ * Revision 1.66  2003/12/19 15:04:06  achim
+ * Bugfixes support for drives > 2TB
+ *
+ * Revision 1.65  2003/12/15 11:21:56  achim
+ * 64-bit DMA support added
+ * Support for drives > 2 TB implemented
+ * Kernels 2.2.x, 2.4.x, 2.6.x supported
+ *
  * Revision 1.64  2003/09/17 08:30:26  achim
  * EISA/ISA controller scan disabled
  * Command line switch probe_eisa_isa added
@@ -299,10 +332,12 @@
  * shared_access:N              enable driver reserve/release protocol
  * probe_eisa_isa:Y             scan for EISA/ISA controllers
  * probe_eisa_isa:N             do not scan for EISA/ISA controllers
+ * force_dma32:Y                use only 32 bit DMA mode
+ * force_dma32:N                use 64 bit DMA mode, if supported
  *
  * The default values are: "gdth=disable:N,reserve_mode:1,reverse_scan:N,
  *                          max_ids:127,rescan:N,virt_ctr:N,hdr_channel:0,
- *                          shared_access:Y,probe_eisa_isa:N".
+ *                          shared_access:Y,probe_eisa_isa:N,force_dma32:N".
  * Here is another example: "gdth=reserve_list:0,1,2,0,0,1,3,0,rescan:Y".
  * 
  * When loading the gdth driver as a module, the same options are available. 
@@ -313,7 +348,7 @@
  * 
  * Default: "modprobe gdth disable=0 reserve_mode=1 reverse_scan=0
  *           max_ids=127 rescan=0 virt_ctr=0 hdr_channel=0 shared_access=0 
- *           probe_eisa_isa=0"
+ *           probe_eisa_isa=0 force_dma32=0"
  * The other example: "modprobe gdth reserve_list=0,1,2,0,0,1,3,0 rescan=1".
  */
 
@@ -330,9 +365,12 @@
  * phase:                   Service/parameter/return code special command
  */
 
-/* default: activate /proc and character device IOCTL interface */
-#define GDTH_IOCTL_PROC
-#define GDTH_IOCTL_CHRDEV
+
+/* interrupt coalescing */
+/* #define INT_COAL */
+
+/* statistics */
+#define GDTH_STATISTICS
 
 #include <linux/module.h>
 
@@ -353,35 +391,35 @@
 #ifdef GDTH_RTC
 #include <linux/mc146818rtc.h>
 #endif
-#if LINUX_VERSION_CODE >= 0x020100
 #include <linux/reboot.h>
-#else
-#include <linux/bios32.h>
-#endif
 
 #include <asm/dma.h>
 #include <asm/system.h>
 #include <asm/io.h>
 #include <asm/uaccess.h>
-#if LINUX_VERSION_CODE >= 0x020322
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0)
 #include <linux/spinlock.h>
-#elif LINUX_VERSION_CODE >= 0x02015F
+#else
 #include <asm/spinlock.h>
 #endif
-
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
 #include <linux/blkdev.h>
-
-#include "scsi.h"
-#include "hosts.h"
-#if LINUX_VERSION_CODE < 0x020503
+#else
+#include <linux/blk.h>
 #include "sd.h"
 #endif
 
+#include "scsi.h"
+#include "hosts.h"
 #include "gdth.h"
 
 static void gdth_delay(int milliseconds);
-static void gdth_eval_mapping(ulong32 size, int *cyls, int *heads, int *secs);
+static void gdth_eval_mapping(ulong32 size, ulong32 *cyls, int *heads, int *secs);
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
 static irqreturn_t gdth_interrupt(int irq, void *dev_id, struct pt_regs *regs);
+#else
+static void gdth_interrupt(int irq, void *dev_id, struct pt_regs *regs);
+#endif
 static int gdth_sync_event(int hanum,int service,unchar index,Scsi_Cmnd *scp);
 static int gdth_async_event(int hanum);
 static void gdth_log_event(gdth_evt_data *dvr, char *buffer);
@@ -419,31 +457,19 @@
 static void gdth_release_event(int hanum);
 static int gdth_wait(int hanum,int index,ulong32 time);
 static int gdth_internal_cmd(int hanum,unchar service,ushort opcode,ulong32 p1,
-                             ulong32 p2,ulong32 p3);
+                             ulong64 p2,ulong64 p3);
 static int gdth_search_drives(int hanum);
 static int gdth_analyse_hdrive(int hanum, ushort hdrive);
 
-static void *gdth_mmap(ulong paddr, ulong size);
-static void gdth_munmap(void *addr);
-
 static const char *gdth_ctr_name(int hanum);
 
-#ifdef GDTH_IOCTL_CHRDEV
 static int gdth_open(struct inode *inode, struct file *filep);
 static int gdth_close(struct inode *inode, struct file *filep);
 static int gdth_ioctl(struct inode *inode, struct file *filep,
                       unsigned int cmd, unsigned long arg);
-#endif
 
-#if LINUX_VERSION_CODE >= 0x010300
 static void gdth_flush(int hanum);
-#if LINUX_VERSION_CODE >= 0x020100
 static int gdth_halt(struct notifier_block *nb, ulong event, void *buf);
-#else
-static int halt_called = FALSE;
-void gdth_halt(void);
-#endif
-#endif
 
 #ifdef DEBUG_GDTH
 static unchar   DebugState = DEBUG_GDTH;
@@ -528,6 +554,9 @@
 
 #ifdef GDTH_STATISTICS
 static ulong32 max_rq=0, max_index=0, max_sg=0;
+#ifdef INT_COAL
+static ulong32 max_int_coal=0;
+#endif
 static ulong32 act_ints=0, act_ios=0, act_stats=0, act_rq=0;
 static struct timer_list gdth_timer;
 #endif
@@ -542,80 +571,12 @@
 
 #define BUS_L2P(a,b)    ((b)>(a)->virt_bus ? (b-1):(b))
 
-#if LINUX_VERSION_CODE < 0x010300
-static void *gdth_mmap(ulong paddr, ulong size) 
-{
-    if (paddr >= high_memory)
-        return NULL; 
-    else
-        return (void *)paddr;
-}
-static void gdth_munmap(void *addr) 
-{
-}
-inline ulong32 virt_to_phys(volatile void *addr)
-{
-    return (ulong32)addr;
-}
-inline void *phys_to_virt(ulong32 addr)
-{
-    return (void *)addr;
-}
-#define virt_to_bus             virt_to_phys
-#define bus_to_virt             phys_to_virt
-#define gdth_readb(addr)        (*(volatile unchar *)(addr))
-#define gdth_readw(addr)        (*(volatile ushort *)(addr))
-#define gdth_readl(addr)        (*(volatile ulong32 *)(addr))
-#define gdth_writeb(b,addr)     (*(volatile unchar *)(addr) = (b))
-#define gdth_writew(b,addr)     (*(volatile ushort *)(addr) = (b))
-#define gdth_writel(b,addr)     (*(volatile ulong32 *)(addr) = (b))
-#define memset_io(a,b,c)        memset((void *)(a),(b),(c))
-#define memcpy_fromio(a,b,c)    memcpy((a),(void *)(b),(c))
-#define memcpy_toio(a,b,c)      memcpy((void *)(a),(b),(c))
-
-#define PCI_SLOT(devfn)         ((devfn >> 3) & 0x1f)
-
-#elif LINUX_VERSION_CODE < 0x020100
-static int remapped = FALSE;
-static void *gdth_mmap(ulong paddr, ulong size) 
-{
-    if ( paddr >= high_memory) {
-        remapped = TRUE;
-        return vremap(paddr, size);
-    } else {
-        return (void *)paddr; 
-    }
-}
-static void gdth_munmap(void *addr) 
-{
-    if (remapped)
-        vfree(addr);
-    remapped = FALSE;
-}
-#define gdth_readb(addr)        readb((ulong)(addr))
-#define gdth_readw(addr)        readw((ulong)(addr))
-#define gdth_readl(addr)        (ulong32)readl((ulong)(addr))
-#define gdth_writeb(b,addr)     writeb((b),(ulong)(addr))
-#define gdth_writew(b,addr)     writew((b),(ulong)(addr))
-#define gdth_writel(b,addr)     writel((ulong32)(b),(ulong)(addr))
-
-#else
-static void *gdth_mmap(ulong paddr, ulong size) 
-{ 
-    return ioremap(paddr, size); 
-}
-static void gdth_munmap(void *addr) 
-{
-    return iounmap(addr);
-}
 #define gdth_readb(addr)        readb((ulong)(addr))
 #define gdth_readw(addr)        readw((ulong)(addr))
 #define gdth_readl(addr)        (ulong32)readl((ulong)(addr))
 #define gdth_writeb(b,addr)     writeb((b),(ulong)(addr))
 #define gdth_writew(b,addr)     writew((b),(ulong)(addr))
 #define gdth_writel(b,addr)     writel((ulong32)(b),(ulong)(addr))
-#endif
-
 
 static unchar   gdth_drq_tab[4] = {5,6,7,7};            /* DRQ table */
 static unchar   gdth_irq_tab[6] = {0,10,11,12,14,0};    /* IRQ table */
@@ -631,9 +592,7 @@
 static gdth_evt_str ebuffer[MAX_EVENTS];                /* event buffer */
 static int elastidx;
 static int eoldidx;
-#ifdef GDTH_IOCTL_CHRDEV
 static int major;
-#endif
 
 #define DIN     1                               /* IN data direction */
 #define DOU     2                               /* OUT data direction */
@@ -648,8 +607,8 @@
     DUN,DUN,DUN,DUN,DUN,DOU,DUN,DUN,DUN,DUN,DIN,DUN,DUN,DUN,DUN,DUN,
     DUN,DUN,DUN,DUN,DUN,DUN,DUN,DUN,DUN,DUN,DUN,DUN,DUN,DUN,DUN,DUN,
     DUN,DUN,DUN,DUN,DUN,DUN,DUN,DUN,DUN,DUN,DUN,DUN,DUN,DUN,DUN,DUN,
-    DUN,DUN,DUN,DUN,DUN,DUN,DUN,DUN,DUN,DUN,DUN,DUN,DUN,DUN,DUN,DUN,
-    DUN,DUN,DUN,DUN,DUN,DUN,DUN,DUN,DUN,DUN,DUN,DUN,DUN,DUN,DUN,DUN,
+    DUN,DUN,DUN,DUN,DUN,DUN,DUN,DUN,DIN,DUN,DOU,DUN,DUN,DUN,DUN,DUN,
+    DUN,DUN,DUN,DUN,DUN,DUN,DUN,DUN,DUN,DUN,DUN,DUN,DUN,DUN,DIN,DUN,
     DUN,DUN,DUN,DUN,DUN,DNO,DNO,DUN,DIN,DNO,DOU,DUN,DNO,DUN,DOU,DOU,
     DOU,DOU,DOU,DNO,DUN,DIN,DOU,DIN,DIN,DUN,DUN,DUN,DUN,DUN,DUN,DUN,
     DUN,DUN,DOU,DUN,DUN,DUN,DUN,DUN,DUN,DUN,DUN,DUN,DUN,DUN,DUN,DUN,
@@ -659,47 +618,32 @@
 };
 
 /* __initfunc, __initdata macros */
-#if LINUX_VERSION_CODE >= 0x020322
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
+#define __devinitdata
+#endif
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0)
 #define GDTH_INITFUNC(type, func)       type __init func 
 #include <linux/init.h>
-#elif LINUX_VERSION_CODE >= 0x020126
+#else
 #define GDTH_INITFUNC(type, func)       __initfunc(type func)
 #include <linux/init.h>
-#else
-#define GDTH_INITFUNC(type, func)       type func
-#define __initdata
-#define __init
 #endif
 
-#if LINUX_VERSION_CODE >= 0x020503
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
 #define GDTH_INIT_LOCK_HA(ha)           spin_lock_init(&(ha)->smp_lock)
 #define GDTH_LOCK_HA(ha,flags)          spin_lock_irqsave(&(ha)->smp_lock,flags)
 #define GDTH_UNLOCK_HA(ha,flags)        spin_unlock_irqrestore(&(ha)->smp_lock,flags)
 
 #define GDTH_LOCK_SCSI_DONE(dev, flags) spin_lock_irqsave(dev->host_lock,flags)
 #define GDTH_UNLOCK_SCSI_DONE(dev, flags) spin_unlock_irqrestore(dev->host_lock,flags)
-#define GDTH_LOCK_SCSI_DOCMD(dev)       spin_lock_irq(dev->host_lock)
-#define GDTH_UNLOCK_SCSI_DOCMD(dev)     spin_unlock_irq(dev->host_lock)
 
-#elif LINUX_VERSION_CODE >= 0x02015F
+#else
 #define GDTH_INIT_LOCK_HA(ha)           spin_lock_init(&(ha)->smp_lock)
 #define GDTH_LOCK_HA(ha,flags)          spin_lock_irqsave(&(ha)->smp_lock,flags)
 #define GDTH_UNLOCK_HA(ha,flags)        spin_unlock_irqrestore(&(ha)->smp_lock,flags)
 
 #define GDTH_LOCK_SCSI_DONE(flags)      spin_lock_irqsave(&io_request_lock,flags)
 #define GDTH_UNLOCK_SCSI_DONE(flags)    spin_unlock_irqrestore(&io_request_lock,flags)
-#define GDTH_LOCK_SCSI_DOCMD()          spin_lock_irq(&io_request_lock)
-#define GDTH_UNLOCK_SCSI_DOCMD()        spin_unlock_irq(&io_request_lock)
-
-#else
-#define GDTH_INIT_LOCK_HA(ha)           do {} while (0)
-#define GDTH_LOCK_HA(ha,flags)          do {save_flags(flags); cli();} while (0)
-#define GDTH_UNLOCK_HA(ha,flags)        do {restore_flags(flags);} while (0)
-
-#define GDTH_LOCK_SCSI_DONE(flags)      do {} while (0)
-#define GDTH_UNLOCK_SCSI_DONE(flags)    do {} while (0)
-#define GDTH_LOCK_SCSI_DOCMD()          do {} while (0)
-#define GDTH_UNLOCK_SCSI_DOCMD()        do {} while (0)
 #endif
 
 /* LILO and modprobe/insmod parameters */
@@ -730,9 +674,10 @@
 static int shared_access = 1;
 /* enable support for EISA and ISA controllers */
 static int probe_eisa_isa = 0;
+/* 64 bit DMA mode, support for drives > 2 TB, if force_dma32 = 0 */
+static int force_dma32 = 0;
 
 #ifdef MODULE
-#if LINUX_VERSION_CODE >= 0x02011A
 /* parameters for modprobe/insmod */
 MODULE_PARM(irq, "i");
 MODULE_PARM(disable, "i");
@@ -745,41 +690,42 @@
 MODULE_PARM(virt_ctr, "i");
 MODULE_PARM(shared_access, "i");
 MODULE_PARM(probe_eisa_isa, "i");
+MODULE_PARM(force_dma32, "i");
 MODULE_AUTHOR("Achim Leubner");
-#endif
-#if LINUX_VERSION_CODE >= 0x02040B
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,11)
 MODULE_LICENSE("GPL");
 #endif
 #endif
 
-#ifdef GDTH_IOCTL_CHRDEV
 /* ioctl interface */
 static struct file_operations gdth_fops = {
-	.ioctl		= gdth_ioctl,
-	.open		= gdth_open,
-	.release	= gdth_close,
-};
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
+    .ioctl   = gdth_ioctl,
+    .open    = gdth_open,
+    .release = gdth_close,
+#else
+    ioctl:gdth_ioctl,
+    open:gdth_open,
+    release:gdth_close,
 #endif
+};
 
 /* /proc support */
-#if LINUX_VERSION_CODE >= 0x010300
 #include <linux/stat.h> 
-#if LINUX_VERSION_CODE < 0x020322
+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,4,0)
 struct proc_dir_entry proc_scsi_gdth = {
     PROC_SCSI_GDTH, 4, "gdth",
     S_IFDIR | S_IRUGO | S_IXUGO, 2
 };
 #endif
+
 #include "gdth_proc.h"
 #include "gdth_proc.c"
-#endif
 
-#if LINUX_VERSION_CODE >= 0x020100
 /* notifier block to get a notify on system shutdown/halt/reboot */
 static struct notifier_block gdth_notifier = {
     gdth_halt, NULL, 0
 };
-#endif
 
 
 static void gdth_delay(int milliseconds)
@@ -787,17 +733,11 @@
     if (milliseconds == 0) {
         udelay(1);
     } else {
-#if LINUX_VERSION_CODE >= 0x020168
         mdelay(milliseconds);
-#else
-        int i;
-        for (i = 0; i < milliseconds; ++i) 
-            udelay(1000);
-#endif
     }
 }
 
-static void gdth_eval_mapping(ulong32 size, int *cyls, int *heads, int *secs)
+static void gdth_eval_mapping(ulong32 size, ulong32 *cyls, int *heads, int *secs)
 {
     *cyls = size /HEADS/SECS;
     if (*cyls <= MAXCYLS) {
@@ -842,9 +782,9 @@
     ulong32 id;
 
     TRACE(("gdth_search_isa() bios adr. %x\n",bios_adr));
-    if ((addr = gdth_mmap(bios_adr+BIOS_ID_OFFS, sizeof(ulong32))) != NULL) {
+    if ((addr = ioremap(bios_adr+BIOS_ID_OFFS, sizeof(ulong32))) != NULL) {
         id = gdth_readl(addr);
-        gdth_munmap(addr);
+        iounmap(addr);
         if (id == GDT2_ID)                          /* GDT2000 */
             return 1;
     }
@@ -866,6 +806,8 @@
         gdth_search_dev(pcistr, &cnt, PCI_VENDOR_ID_VORTEX, device);
     gdth_search_dev(pcistr, &cnt, PCI_VENDOR_ID_VORTEX, 
                     PCI_DEVICE_ID_VORTEX_GDTNEWRX);
+    gdth_search_dev(pcistr, &cnt, PCI_VENDOR_ID_VORTEX, 
+                    PCI_DEVICE_ID_VORTEX_GDTNEWRX2);
     gdth_search_dev(pcistr, &cnt, PCI_VENDOR_ID_INTEL,
                     PCI_DEVICE_ID_INTEL_SRC);
     gdth_search_dev(pcistr, &cnt, PCI_VENDOR_ID_INTEL,
@@ -873,11 +815,11 @@
     return cnt;
 }
 
-#if LINUX_VERSION_CODE >= 0x20363
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0)
 /* Vortex only makes RAID controllers.
  * We do not really want to specify all 550 ids here, so wildcard match.
  */
-static struct pci_device_id gdthtable[] = {
+static struct pci_device_id gdthtable[] __devinitdata = {
     {PCI_VENDOR_ID_VORTEX,PCI_ANY_ID,PCI_ANY_ID, PCI_ANY_ID},
     {PCI_VENDOR_ID_INTEL,PCI_DEVICE_ID_INTEL_SRC,PCI_ANY_ID,PCI_ANY_ID}, 
     {PCI_VENDOR_ID_INTEL,PCI_DEVICE_ID_INTEL_SRC_XSCALE,PCI_ANY_ID,PCI_ANY_ID}, 
@@ -890,17 +832,12 @@
                                            ushort vendor, ushort device))
 {
     ulong base0, base1, base2;
-#if LINUX_VERSION_CODE >= 0x2015C
     struct pci_dev *pdev;
-#else
-    int error;
-    ushort idx;
-#endif
     
     TRACE(("gdth_search_dev() cnt %d vendor %x device %x\n",
           *cnt, vendor, device));
 
-#if LINUX_VERSION_CODE >= 0x20363
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0)
     pdev = NULL;
     while ((pdev = pci_find_device(vendor, device, pdev)) 
            != NULL) {
@@ -938,7 +875,7 @@
                 pcistr[*cnt].irq, pcistr[*cnt].dpmem));
         (*cnt)++;
     }       
-#elif LINUX_VERSION_CODE >= 0x2015C
+#else
     pdev = NULL;
     while ((pdev = pci_find_device(vendor, device, pdev)) 
            != NULL) {
@@ -979,66 +916,6 @@
                 pcistr[*cnt].irq, pcistr[*cnt].dpmem));
         (*cnt)++;
     }       
-#else   
-    idx = 0;
-    while (!pcibios_find_device(vendor, device, idx++,
-                                &pcistr[*cnt].bus,&pcistr[*cnt].device_fn)) {
-        if (*cnt >= MAXHA)
-            return;
-        /* GDT PCI ctr. found, now read resources from config space */
-#if LINUX_VERSION_CODE >= 0x010300
-#define GDTH_BASEP      (int *)
-#else
-#define GDTH_BASEP
-#endif
-        if ((error = pcibios_read_config_dword(pcistr[*cnt].bus,
-                                               pcistr[*cnt].device_fn,
-                                               PCI_BASE_ADDRESS_0,
-                                               GDTH_BASEP&base0)) ||
-            (error = pcibios_read_config_dword(pcistr[*cnt].bus,
-                                               pcistr[*cnt].device_fn,
-                                               PCI_BASE_ADDRESS_1,
-                                               GDTH_BASEP&base1)) ||
-            (error = pcibios_read_config_dword(pcistr[*cnt].bus,
-                                               pcistr[*cnt].device_fn,
-                                               PCI_BASE_ADDRESS_2,
-                                               GDTH_BASEP&base2)) ||
-            (error = pcibios_read_config_word(pcistr[*cnt].bus,
-                                              pcistr[*cnt].device_fn,
-                                              PCI_SUBSYSTEM_ID,
-                                              &pcistr[*cnt].subdevice_id)) ||
-            (error = pcibios_read_config_byte(pcistr[*cnt].bus,
-                                              pcistr[*cnt].device_fn,
-                                              PCI_INTERRUPT_LINE,
-                                              &pcistr[*cnt].irq))) {
-            printk("GDT-PCI: error %d reading configuration space", error);
-            continue;
-        }
-        pcistr[*cnt].vendor_id = vendor;
-        pcistr[*cnt].device_id = device;
-        if (device <= PCI_DEVICE_ID_VORTEX_GDT6000B ||   /* GDT6000/B */
-            device >= PCI_DEVICE_ID_VORTEX_GDT6x17RP) {  /* MPR */
-            if ((base0 & PCI_BASE_ADDRESS_SPACE) !=
-                PCI_BASE_ADDRESS_SPACE_MEMORY)
-                continue;
-            pcistr[*cnt].dpmem = base0 & PCI_BASE_ADDRESS_MEM_MASK;
-        } else {                                    /* GDT6110, GDT6120, .. */
-            if ((base0 & PCI_BASE_ADDRESS_SPACE) !=
-                PCI_BASE_ADDRESS_SPACE_MEMORY ||
-                (base2 & PCI_BASE_ADDRESS_SPACE) !=
-                PCI_BASE_ADDRESS_SPACE_MEMORY ||
-                (base1 & PCI_BASE_ADDRESS_SPACE) !=
-                PCI_BASE_ADDRESS_SPACE_IO)
-                continue;
-            pcistr[*cnt].dpmem = base2 & PCI_BASE_ADDRESS_MEM_MASK;
-            pcistr[*cnt].io_mm = base0 & PCI_BASE_ADDRESS_MEM_MASK;
-            pcistr[*cnt].io    = base1 & PCI_BASE_ADDRESS_IO_MASK;
-        }
-        TRACE2(("Controller found at %d/%d, irq %d, dpmem 0x%lx\n",
-                pcistr[*cnt].bus, PCI_SLOT(pcistr[*cnt].device_fn), 
-                pcistr[*cnt].irq, pcistr[*cnt].dpmem));
-        (*cnt)++;
-    }
 #endif
 }   
 
@@ -1168,6 +1045,8 @@
         ha->type = GDT_EISA;
         ha->stype = id;
     }
+
+    ha->dma64_support = 0;
     return 1;
 }
 
@@ -1181,7 +1060,7 @@
 
     TRACE(("gdth_init_isa() bios adr. %x\n",bios_adr));
 
-    ha->brd = gdth_mmap(bios_adr, sizeof(gdt2_dpram_str));
+    ha->brd = ioremap(bios_adr, sizeof(gdt2_dpram_str));
     if (ha->brd == NULL) {
         printk("GDT-ISA: Initialization error (DPMEM remap error)\n");
         return 0;
@@ -1191,8 +1070,8 @@
     /* reset interface area */
     memset_io((char *)&dp2_ptr->u,0,sizeof(dp2_ptr->u));
     if (gdth_readl(&dp2_ptr->u) != 0) {
-        printk("GDT-PCI: Initialization error (DPMEM write error)\n");
-        gdth_munmap(ha->brd);
+        printk("GDT-ISA: Initialization error (DPMEM write error)\n");
+        iounmap(ha->brd);
         return 0;
     }
 
@@ -1227,7 +1106,7 @@
     while (gdth_readb(&dp2_ptr->u.ic.S_Status) != 0xff) {
         if (--retries == 0) {
             printk("GDT-ISA: Initialization error (DEINIT failed)\n");
-            gdth_munmap(ha->brd);
+            iounmap(ha->brd);
             return 0;
         }
         gdth_delay(1);
@@ -1237,7 +1116,7 @@
     gdth_writeb(0xff, &dp2_ptr->io.irqdel);
     if (prot_ver != PROTOCOL_VERSION) {
         printk("GDT-ISA: Illegal protocol version\n");
-        gdth_munmap(ha->brd);
+        iounmap(ha->brd);
         return 0;
     }
 
@@ -1259,13 +1138,15 @@
     while (gdth_readb(&dp2_ptr->u.ic.S_Status) != 0xfe) {
         if (--retries == 0) {
             printk("GDT-ISA: Initialization error\n");
-            gdth_munmap(ha->brd);
+            iounmap(ha->brd);
             return 0;
         }
         gdth_delay(1);
     }
     gdth_writeb(0, &dp2_ptr->u.ic.Status);
     gdth_writeb(0xff, &dp2_ptr->io.irqdel);
+
+    ha->dma64_support = 0;
     return 1;
 }
 
@@ -1279,9 +1160,6 @@
     unchar prot_ver;
     ushort command;
     int i, found = FALSE;
-#if LINUX_VERSION_CODE < 0x2015C
-    int rom_addr;
-#endif
 
     TRACE(("gdth_init_pci()\n"));
 
@@ -1293,13 +1171,13 @@
     ha->stype = (ulong32)pcistr->device_id;
     ha->subdevice_id = pcistr->subdevice_id;
     ha->irq = pcistr->irq;
-#if LINUX_VERSION_CODE >= 0x20400
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0)
     ha->pdev = pcistr->pdev;
 #endif
     
     if (ha->stype <= PCI_DEVICE_ID_VORTEX_GDT6000B) {  /* GDT6000/B */
         TRACE2(("init_pci() dpmem %lx irq %d\n",pcistr->dpmem,ha->irq));
-        ha->brd = gdth_mmap(pcistr->dpmem, sizeof(gdt6_dpram_str));
+        ha->brd = ioremap(pcistr->dpmem, sizeof(gdt6_dpram_str));
         if (ha->brd == NULL) {
             printk("GDT-PCI: Initialization error (DPMEM remap error)\n");
             return 0;
@@ -1312,8 +1190,8 @@
                    pcistr->dpmem);
             found = FALSE;
             for (i = 0xC8000; i < 0xE8000; i += 0x4000) {
-                gdth_munmap(ha->brd);
-                ha->brd = gdth_mmap(i, sizeof(ushort)); 
+                iounmap(ha->brd);
+                ha->brd = ioremap(i, sizeof(ushort)); 
                 if (ha->brd == NULL) {
                     printk("GDT-PCI: Initialization error (DPMEM remap error)\n");
                     return 0;
@@ -1322,15 +1200,10 @@
                     TRACE2(("init_pci_old() address 0x%x busy\n", i));
                     continue;
                 }
-                gdth_munmap(ha->brd);
-#if LINUX_VERSION_CODE >= 0x2015C
+                iounmap(ha->brd);
                 pci_write_config_dword(pcistr->pdev, 
                                        PCI_BASE_ADDRESS_0, i);
-#else
-                pcibios_write_config_dword(pcistr->bus, pcistr->device_fn,
-                                           PCI_BASE_ADDRESS_0, i);
-#endif
-                ha->brd = gdth_mmap(i, sizeof(gdt6_dpram_str)); 
+                ha->brd = ioremap(i, sizeof(gdt6_dpram_str)); 
                 if (ha->brd == NULL) {
                     printk("GDT-PCI: Initialization error (DPMEM remap error)\n");
                     return 0;
@@ -1345,14 +1218,14 @@
             }   
             if (!found) {
                 printk("GDT-PCI: No free address found!\n");
-                gdth_munmap(ha->brd);
+                iounmap(ha->brd);
                 return 0;
             }
         }
         memset_io((char *)&dp6_ptr->u,0,sizeof(dp6_ptr->u));
         if (gdth_readl(&dp6_ptr->u) != 0) {
             printk("GDT-PCI: Initialization error (DPMEM write error)\n");
-            gdth_munmap(ha->brd);
+            iounmap(ha->brd);
             return 0;
         }
         
@@ -1370,7 +1243,7 @@
         while (gdth_readb(&dp6_ptr->u.ic.S_Status) != 0xff) {
             if (--retries == 0) {
                 printk("GDT-PCI: Initialization error (DEINIT failed)\n");
-                gdth_munmap(ha->brd);
+                iounmap(ha->brd);
                 return 0;
             }
             gdth_delay(1);
@@ -1380,7 +1253,7 @@
         gdth_writeb(0xff, &dp6_ptr->io.irqdel);
         if (prot_ver != PROTOCOL_VERSION) {
             printk("GDT-PCI: Illegal protocol version\n");
-            gdth_munmap(ha->brd);
+            iounmap(ha->brd);
             return 0;
         }
 
@@ -1390,7 +1263,7 @@
         /* special command to controller BIOS */
         gdth_writel(0x00, &dp6_ptr->u.ic.S_Info[0]);
         gdth_writel(0x00, &dp6_ptr->u.ic.S_Info[1]);
-        gdth_writel(0x01, &dp6_ptr->u.ic.S_Info[2]);
+        gdth_writel(0x00, &dp6_ptr->u.ic.S_Info[2]);
         gdth_writel(0x00, &dp6_ptr->u.ic.S_Info[3]);
         gdth_writeb(0xfe, &dp6_ptr->u.ic.S_Cmd_Indx);
         gdth_writeb(0, &dp6_ptr->io.event);
@@ -1399,7 +1272,7 @@
         while (gdth_readb(&dp6_ptr->u.ic.S_Status) != 0xfe) {
             if (--retries == 0) {
                 printk("GDT-PCI: Initialization error\n");
-                gdth_munmap(ha->brd);
+                iounmap(ha->brd);
                 return 0;
             }
             gdth_delay(1);
@@ -1407,14 +1280,16 @@
         gdth_writeb(0, &dp6_ptr->u.ic.S_Status);
         gdth_writeb(0xff, &dp6_ptr->io.irqdel);
 
+        ha->dma64_support = 0;
+
     } else if (ha->stype <= PCI_DEVICE_ID_VORTEX_GDT6555) { /* GDT6110, ... */
         ha->plx = (gdt6c_plx_regs *)pcistr->io;
         TRACE2(("init_pci_new() dpmem %lx irq %d\n",
             pcistr->dpmem,ha->irq));
-        ha->brd = gdth_mmap(pcistr->dpmem, sizeof(gdt6c_dpram_str));
+        ha->brd = ioremap(pcistr->dpmem, sizeof(gdt6c_dpram_str));
         if (ha->brd == NULL) {
             printk("GDT-PCI: Initialization error (DPMEM remap error)\n");
-            gdth_munmap(ha->brd);
+            iounmap(ha->brd);
             return 0;
         }
         /* check and reset interface area */
@@ -1425,8 +1300,8 @@
                    pcistr->dpmem);
             found = FALSE;
             for (i = 0xC8000; i < 0xE8000; i += 0x4000) {
-                gdth_munmap(ha->brd);
-                ha->brd = gdth_mmap(i, sizeof(ushort)); 
+                iounmap(ha->brd);
+                ha->brd = ioremap(i, sizeof(ushort)); 
                 if (ha->brd == NULL) {
                     printk("GDT-PCI: Initialization error (DPMEM remap error)\n");
                     return 0;
@@ -1435,15 +1310,10 @@
                     TRACE2(("init_pci_plx() address 0x%x busy\n", i));
                     continue;
                 }
-                gdth_munmap(ha->brd);
-#if LINUX_VERSION_CODE >= 0x2015C
+                iounmap(ha->brd);
                 pci_write_config_dword(pcistr->pdev, 
                                        PCI_BASE_ADDRESS_2, i);
-#else
-                pcibios_write_config_dword(pcistr->bus, pcistr->device_fn,
-                                           PCI_BASE_ADDRESS_2, i);
-#endif
-                ha->brd = gdth_mmap(i, sizeof(gdt6c_dpram_str)); 
+                ha->brd = ioremap(i, sizeof(gdt6c_dpram_str)); 
                 if (ha->brd == NULL) {
                     printk("GDT-PCI: Initialization error (DPMEM remap error)\n");
                     return 0;
@@ -1458,14 +1328,14 @@
             }   
             if (!found) {
                 printk("GDT-PCI: No free address found!\n");
-                gdth_munmap(ha->brd);
+                iounmap(ha->brd);
                 return 0;
             }
         }
         memset_io((char *)&dp6c_ptr->u,0,sizeof(dp6c_ptr->u));
         if (gdth_readl(&dp6c_ptr->u) != 0) {
             printk("GDT-PCI: Initialization error (DPMEM write error)\n");
-            gdth_munmap(ha->brd);
+            iounmap(ha->brd);
             return 0;
         }
         
@@ -1486,7 +1356,7 @@
         while (gdth_readb(&dp6c_ptr->u.ic.S_Status) != 0xff) {
             if (--retries == 0) {
                 printk("GDT-PCI: Initialization error (DEINIT failed)\n");
-                gdth_munmap(ha->brd);
+                iounmap(ha->brd);
                 return 0;
             }
             gdth_delay(1);
@@ -1495,7 +1365,7 @@
         gdth_writeb(0, &dp6c_ptr->u.ic.Status);
         if (prot_ver != PROTOCOL_VERSION) {
             printk("GDT-PCI: Illegal protocol version\n");
-            gdth_munmap(ha->brd);
+            iounmap(ha->brd);
             return 0;
         }
 
@@ -1505,7 +1375,7 @@
         /* special command to controller BIOS */
         gdth_writel(0x00, &dp6c_ptr->u.ic.S_Info[0]);
         gdth_writel(0x00, &dp6c_ptr->u.ic.S_Info[1]);
-        gdth_writel(0x01, &dp6c_ptr->u.ic.S_Info[2]);
+        gdth_writel(0x00, &dp6c_ptr->u.ic.S_Info[2]);
         gdth_writel(0x00, &dp6c_ptr->u.ic.S_Info[3]);
         gdth_writeb(0xfe, &dp6c_ptr->u.ic.S_Cmd_Indx);
         
@@ -1516,23 +1386,25 @@
         while (gdth_readb(&dp6c_ptr->u.ic.S_Status) != 0xfe) {
             if (--retries == 0) {
                 printk("GDT-PCI: Initialization error\n");
-                gdth_munmap(ha->brd);
+                iounmap(ha->brd);
                 return 0;
             }
             gdth_delay(1);
         }
         gdth_writeb(0, &dp6c_ptr->u.ic.S_Status);
 
+        ha->dma64_support = 0;
+
     } else {                                            /* MPR */
         TRACE2(("init_pci_mpr() dpmem %lx irq %d\n",pcistr->dpmem,ha->irq));
-        ha->brd = gdth_mmap(pcistr->dpmem, sizeof(gdt6m_dpram_str));
+        ha->brd = ioremap(pcistr->dpmem, sizeof(gdt6m_dpram_str));
         if (ha->brd == NULL) {
             printk("GDT-PCI: Initialization error (DPMEM remap error)\n");
             return 0;
         }
 
         /* manipulate config. space to enable DPMEM, start RP controller */
-#if LINUX_VERSION_CODE >= 0x20363
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0)
         pci_read_config_word(pcistr->pdev, PCI_COMMAND, &command);
         command |= 6;
         pci_write_config_word(pcistr->pdev, PCI_COMMAND, command);
@@ -1543,7 +1415,7 @@
         gdth_delay(1);
         pci_write_config_dword(pcistr->pdev, PCI_ROM_ADDRESS,
                                pci_resource_start(pcistr->pdev, 8));
-#elif LINUX_VERSION_CODE >= 0x2015C
+#else
         pci_read_config_word(pcistr->pdev, PCI_COMMAND, &command);
         command |= 6;
         pci_write_config_word(pcistr->pdev, PCI_COMMAND, command);
@@ -1554,22 +1426,6 @@
         gdth_delay(1);
         pci_write_config_dword(pcistr->pdev, PCI_ROM_ADDRESS,
                                pcistr->pdev->rom_address);
-#else
-        pcibios_read_config_word(pcistr->bus, pcistr->device_fn,
-                                 PCI_COMMAND, &command);
-        command |= 6;
-        pcibios_write_config_word(pcistr->bus, pcistr->device_fn, 
-                                  PCI_COMMAND, command);
-        pcibios_read_config_dword(pcistr->bus, pcistr->device_fn,
-                                  PCI_ROM_ADDRESS, &rom_addr);
-        if (rom_addr == 1UL)
-            rom_addr = 0UL;
-        i = 0xFEFF0001UL;
-        pcibios_write_config_dword(pcistr->bus, pcistr->device_fn,
-                                   PCI_ROM_ADDRESS, i);
-        gdth_delay(1);
-        pcibios_write_config_dword(pcistr->bus, pcistr->device_fn,
-                                   PCI_ROM_ADDRESS, rom_addr);
 #endif
         
         /* Ensure that it is safe to access the non HW portions of DPMEM.
@@ -1585,8 +1441,8 @@
                    pcistr->dpmem);
             found = FALSE;
             for (i = 0xC8000; i < 0xE8000; i += 0x4000) {
-                gdth_munmap(ha->brd);
-                ha->brd = gdth_mmap(i, sizeof(ushort)); 
+                iounmap(ha->brd);
+                ha->brd = ioremap(i, sizeof(ushort)); 
                 if (ha->brd == NULL) {
                     printk("GDT-PCI: Initialization error (DPMEM remap error)\n");
                     return 0;
@@ -1595,15 +1451,10 @@
                     TRACE2(("init_pci_mpr() address 0x%x busy\n", i));
                     continue;
                 }
-                gdth_munmap(ha->brd);
-#if LINUX_VERSION_CODE >= 0x2015C
+                iounmap(ha->brd);
                 pci_write_config_dword(pcistr->pdev, 
                                        PCI_BASE_ADDRESS_0, i);
-#else
-                pcibios_write_config_dword(pcistr->bus, pcistr->device_fn,
-                                           PCI_BASE_ADDRESS_0, i);
-#endif
-                ha->brd = gdth_mmap(i, sizeof(gdt6m_dpram_str)); 
+                ha->brd = ioremap(i, sizeof(gdt6m_dpram_str)); 
                 if (ha->brd == NULL) {
                     printk("GDT-PCI: Initialization error (DPMEM remap error)\n");
                     return 0;
@@ -1618,7 +1469,7 @@
             }   
             if (!found) {
                 printk("GDT-PCI: No free address found!\n");
-                gdth_munmap(ha->brd);
+                iounmap(ha->brd);
                 return 0;
             }
         }
@@ -1639,7 +1490,7 @@
         while (gdth_readb(&dp6m_ptr->u.ic.S_Status) != 0xff) {
             if (--retries == 0) {
                 printk("GDT-PCI: Initialization error (DEINIT failed)\n");
-                gdth_munmap(ha->brd);
+                iounmap(ha->brd);
                 return 0;
             }
             gdth_delay(1);
@@ -1648,7 +1499,7 @@
         gdth_writeb(0, &dp6m_ptr->u.ic.S_Status);
         if (prot_ver != PROTOCOL_VERSION) {
             printk("GDT-PCI: Illegal protocol version\n");
-            gdth_munmap(ha->brd);
+            iounmap(ha->brd);
             return 0;
         }
 
@@ -1658,7 +1509,7 @@
         /* special command to controller BIOS */
         gdth_writel(0x00, &dp6m_ptr->u.ic.S_Info[0]);
         gdth_writel(0x00, &dp6m_ptr->u.ic.S_Info[1]);
-        gdth_writel(0x01, &dp6m_ptr->u.ic.S_Info[2]);
+        gdth_writel(0x00, &dp6m_ptr->u.ic.S_Info[2]);
         gdth_writel(0x00, &dp6m_ptr->u.ic.S_Info[3]);
         gdth_writeb(0xfe, &dp6m_ptr->u.ic.S_Cmd_Indx);
         gdth_writeb(1, &dp6m_ptr->i960r.ldoor_reg);
@@ -1667,12 +1518,32 @@
         while (gdth_readb(&dp6m_ptr->u.ic.S_Status) != 0xfe) {
             if (--retries == 0) {
                 printk("GDT-PCI: Initialization error\n");
-                gdth_munmap(ha->brd);
+                iounmap(ha->brd);
                 return 0;
             }
             gdth_delay(1);
         }
         gdth_writeb(0, &dp6m_ptr->u.ic.S_Status);
+
+        /* read FW version to detect 64-bit DMA support */
+        gdth_writeb(0xfd, &dp6m_ptr->u.ic.S_Cmd_Indx);
+        gdth_writeb(1, &dp6m_ptr->i960r.ldoor_reg);
+        retries = INIT_RETRIES;
+        gdth_delay(20);
+        while (gdth_readb(&dp6m_ptr->u.ic.S_Status) != 0xfd) {
+            if (--retries == 0) {
+                printk("GDT-PCI: Initialization error (DEINIT failed)\n");
+                iounmap(ha->brd);
+                return 0;
+            }
+            gdth_delay(1);
+        }
+        prot_ver = (unchar)(gdth_readl(&dp6m_ptr->u.ic.S_Info[0]) >> 16);
+        gdth_writeb(0, &dp6m_ptr->u.ic.S_Status);
+        if (prot_ver < 0x2b)      /* FW < x.43: no 64-bit DMA support */
+            ha->dma64_support = 0;
+        else 
+            ha->dma64_support = 1;
     }
 
     return 1;
@@ -1950,7 +1821,7 @@
 
 
 static int gdth_internal_cmd(int hanum,unchar service,ushort opcode,ulong32 p1,
-                             ulong32 p2,ulong32 p3)
+                             ulong64 p2,ulong64 p3)
 {
     register gdth_ha_str *ha;
     register gdth_cmd_str *cmd_ptr;
@@ -1976,23 +1847,35 @@
         if (service == CACHESERVICE) {
             if (opcode == GDT_IOCTL) {
                 cmd_ptr->u.ioctl.subfunc = p1;
-                cmd_ptr->u.ioctl.channel = p2;
+                cmd_ptr->u.ioctl.channel = (ulong32)p2;
                 cmd_ptr->u.ioctl.param_size = (ushort)p3;
                 cmd_ptr->u.ioctl.p_param = ha->scratch_phys;
             } else {
-                cmd_ptr->u.cache.DeviceNo = (ushort)p1;
-                cmd_ptr->u.cache.BlockNo  = p2;
+                if (ha->cache_feat & GDT_64BIT) {
+                    cmd_ptr->u.cache64.DeviceNo = (ushort)p1;
+                    cmd_ptr->u.cache64.BlockNo  = p2;
+                } else {
+                    cmd_ptr->u.cache.DeviceNo = (ushort)p1;
+                    cmd_ptr->u.cache.BlockNo  = (ulong32)p2;
+                }
             }
         } else if (service == SCSIRAWSERVICE) {
-            cmd_ptr->u.raw.direction  = p1;
-            cmd_ptr->u.raw.bus        = (unchar)p2;
-            cmd_ptr->u.raw.target     = (unchar)p3;
-            cmd_ptr->u.raw.lun        = (unchar)(p3 >> 8);
+            if (ha->raw_feat & GDT_64BIT) {
+                cmd_ptr->u.raw64.direction  = p1;
+                cmd_ptr->u.raw64.bus        = (unchar)p2;
+                cmd_ptr->u.raw64.target     = (unchar)p3;
+                cmd_ptr->u.raw64.lun        = (unchar)(p3 >> 8);
+            } else {
+                cmd_ptr->u.raw.direction  = p1;
+                cmd_ptr->u.raw.bus        = (unchar)p2;
+                cmd_ptr->u.raw.target     = (unchar)p3;
+                cmd_ptr->u.raw.lun        = (unchar)(p3 >> 8);
+            }
         } else if (service == SCREENSERVICE) {
             if (opcode == GDT_REALTIME) {
                 *(ulong32 *)&cmd_ptr->u.screen.su.data[0] = p1;
-                *(ulong32 *)&cmd_ptr->u.screen.su.data[4] = p2;
-                *(ulong32 *)&cmd_ptr->u.screen.su.data[8] = p3;
+                *(ulong32 *)&cmd_ptr->u.screen.su.data[4] = (ulong32)p2;
+                *(ulong32 *)&cmd_ptr->u.screen.su.data[8] = (ulong32)p3;
             }
         }
         ha->cmd_len          = sizeof(gdth_cmd_str);
@@ -2020,6 +1903,7 @@
 {
     register gdth_ha_str *ha;
     ushort cdev_cnt, i;
+    int ok;
     ulong32 bus_no, drv_cnt, drv_no, j;
     gdth_getch_str *chn;
     gdth_drlist_str *drl;
@@ -2028,6 +1912,9 @@
     gdth_arcdl_str *alst;
     gdth_alist_str *alst2;
     gdth_oem_str_ioctl *oemstr;
+#ifdef INT_COAL
+    gdth_perf_modes *pmod;
+#endif
 
 #ifdef GDTH_RTC
     unchar rtc[12];
@@ -2036,11 +1923,20 @@
    
     TRACE(("gdth_search_drives() hanum %d\n",hanum));
     ha = HADATA(gdth_ctr_tab[hanum]);
+    ok = 0;
 
     /* initialize controller services, at first: screen service */
-    if (!gdth_internal_cmd(hanum,SCREENSERVICE,GDT_INIT,0,0,0)) {
-        printk("GDT: Initialization error screen service (code %d)\n",
-               ha->status);
+    ha->screen_feat = 0;
+    if (!force_dma32) {
+        ok = gdth_internal_cmd(hanum,SCREENSERVICE,GDT_X_INIT_SCR,0,0,0);
+        if (ok)
+            ha->screen_feat = GDT_64BIT;
+    }
+    if (force_dma32 || (!ok && ha->status == (ushort)S_NOFUNC))
+        ok = gdth_internal_cmd(hanum,SCREENSERVICE,GDT_INIT,0,0,0);
+    if (!ok) {
+        printk("GDT-HA %d: Initialization error screen service (code %d)\n",
+               hanum, ha->status);
         return 0;
     }
     TRACE2(("gdth_search_drives(): SCREENSERVICE initialized\n"));
@@ -2060,7 +1956,7 @@
         for (j = 0; j < 12; ++j) 
             rtc[j] = CMOS_READ(j);
     } while (rtc[0] != CMOS_READ(0));
-    spin_unlock_irqrestore(&rtc_lock, flags);
+    spin_lock_irqrestore(&rtc_lock, flags);
     TRACE2(("gdth_search_drives(): RTC: %x/%x/%x\n",*(ulong32 *)&rtc[0],
             *(ulong32 *)&rtc[4], *(ulong32 *)&rtc[8]));
     /* 3. send to controller firmware */
@@ -2072,15 +1968,52 @@
     gdth_internal_cmd(hanum,CACHESERVICE,GDT_UNFREEZE_IO,0,0,0);
  
     /* initialize cache service */
-    if (!gdth_internal_cmd(hanum,CACHESERVICE,GDT_INIT,LINUX_OS,0,0)) {
-        printk("GDT: Initialization error cache service (code %d)\n",
-               ha->status);
+    ha->cache_feat = 0;
+    if (!force_dma32) {
+        ok = gdth_internal_cmd(hanum,CACHESERVICE,GDT_X_INIT_HOST,LINUX_OS,0,0);
+        if (ok)
+            ha->cache_feat = GDT_64BIT;
+    }
+    if (force_dma32 || (!ok && ha->status == (ushort)S_NOFUNC))
+        ok = gdth_internal_cmd(hanum,CACHESERVICE,GDT_INIT,LINUX_OS,0,0);
+    if (!ok) {
+        printk("GDT-HA %d: Initialization error cache service (code %d)\n",
+               hanum, ha->status);
         return 0;
     }
     TRACE2(("gdth_search_drives(): CACHESERVICE initialized\n"));
     cdev_cnt = (ushort)ha->info;
     ha->fw_vers = ha->service;
 
+#ifdef INT_COAL
+    if (ha->type == GDT_PCIMPR) {
+        /* set perf. modes */
+        pmod = (gdth_perf_modes *)ha->pscratch;
+        pmod->version          = 1;
+        pmod->st_mode          = 1;    /* enable one status buffer */
+        *((ulong64 *)&pmod->st_buff_addr1) = ha->coal_stat_phys;
+        pmod->st_buff_indx1    = COALINDEX;
+        pmod->st_buff_addr2    = 0;
+        pmod->st_buff_u_addr2  = 0;
+        pmod->st_buff_indx2    = 0;
+        pmod->st_buff_size     = sizeof(gdth_coal_status) * MAXOFFSETS;
+        pmod->cmd_mode         = 0;    // disable all cmd buffers
+        pmod->cmd_buff_addr1   = 0;
+        pmod->cmd_buff_u_addr1 = 0;
+        pmod->cmd_buff_indx1   = 0;
+        pmod->cmd_buff_addr2   = 0;
+        pmod->cmd_buff_u_addr2 = 0;
+        pmod->cmd_buff_indx2   = 0;
+        pmod->cmd_buff_size    = 0;
+        pmod->reserved1        = 0;            
+        pmod->reserved2        = 0;            
+        if (gdth_internal_cmd(hanum,CACHESERVICE,GDT_IOCTL,SET_PERF_MODES,
+                              INVALID_CHANNEL,sizeof(gdth_perf_modes))) {
+            printk("GDT-HA %d: Interrupt coalescing activated\n", hanum);
+        }
+    }
+#endif
+
     /* detect number of buses - try new IOCTL */
     iocr = (gdth_raw_iochan_str *)ha->pscratch;
     iocr->hdr.version        = 0xffffffff;
@@ -2108,8 +2041,8 @@
                                    IO_CHANNEL | INVALID_CHANNEL,
                                    sizeof(gdth_getch_str))) {
                 if (bus_no == 0) {
-                    printk("GDT: Error detecting channel count (0x%x)\n",
-                           ha->status);
+                    printk("GDT-HA %d: Error detecting channel count (0x%x)\n",
+                           hanum, ha->status);
                     return 0;
                 }
                 break;
@@ -2126,8 +2059,8 @@
     /* read cache configuration */
     if (!gdth_internal_cmd(hanum,CACHESERVICE,GDT_IOCTL,CACHE_INFO,
                            INVALID_CHANNEL,sizeof(gdth_cinfo_str))) {
-        printk("GDT: Initialization error cache service (code %d)\n",
-               ha->status);
+        printk("GDT-HA %d: Initialization error cache service (code %d)\n",
+               hanum, ha->status);
         return 0;
     }
     ha->cpar = ((gdth_cinfo_str *)ha->pscratch)->cpar;
@@ -2246,9 +2179,17 @@
     }       
                                   
     /* initialize raw service */
-    if (!gdth_internal_cmd(hanum,SCSIRAWSERVICE,GDT_INIT,0,0,0)) {
-        printk("GDT: Initialization error raw service (code %d)\n",
-               ha->status);
+    ha->raw_feat = 0;
+    if (!force_dma32) {
+        ok = gdth_internal_cmd(hanum,SCSIRAWSERVICE,GDT_X_INIT_RAW,0,0,0);
+        if (ok)
+            ha->raw_feat = GDT_64BIT;
+    }
+    if (force_dma32 || (!ok && ha->status == (ushort)S_NOFUNC))
+        ok = gdth_internal_cmd(hanum,SCSIRAWSERVICE,GDT_INIT,0,0,0);
+    if (!ok) {
+        printk("GDT-HA %d: Initialization error raw service (code %d)\n",
+               hanum, ha->status);
         return 0;
     }
     TRACE2(("gdth_search_drives(): RAWSERVICE initialized\n"));
@@ -2260,7 +2201,7 @@
         if (gdth_internal_cmd(hanum,SCSIRAWSERVICE,GDT_GET_FEAT,0,0,0)) {
             TRACE2(("gdth_search_dr(): get feat RAWSERVICE %d\n",
                     ha->info));
-            ha->raw_feat = (ushort)ha->info;
+            ha->raw_feat |= (ushort)ha->info;
         }
     } 
 
@@ -2271,7 +2212,7 @@
         if (gdth_internal_cmd(hanum,CACHESERVICE,GDT_GET_FEAT,0,0,0)) {
             TRACE2(("gdth_search_dr(): get feat CACHESERV. %d\n",
                     ha->info));
-            ha->cache_feat = (ushort)ha->info;
+            ha->cache_feat |= (ushort)ha->info;
         }
     }
 
@@ -2291,8 +2232,8 @@
             if (!gdth_internal_cmd(hanum,SCSIRAWSERVICE,GDT_RESERVE,0,
                                    reserve_list[i+1], reserve_list[i+2] | 
                                    (reserve_list[i+3] << 8))) {
-                printk("GDT: Error raw service (RESERVE, code %d)\n",
-                       ha->status);
+                printk("GDT-HA %d: Error raw service (RESERVE, code %d)\n",
+                       hanum, ha->status);
              }
         }
     }
@@ -2305,17 +2246,32 @@
                           CACHE_READ_OEM_STRING_RECORD,INVALID_CHANNEL,
                           sizeof(gdth_oem_str_ioctl))) {
         TRACE2(("gdth_search_drives(): CACHE_READ_OEM_STRING_RECORD OK\n"));
-        printk("GDT CTR%d Vendor: %s\n",hanum,oemstr->text.oem_company_name);
+        printk("GDT-HA %d: Vendor: %s Name: %s\n",
+               hanum,oemstr->text.oem_company_name,ha->binfo.type_string);
         /* Save the Host Drive inquiry data */
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
         strlcpy(ha->oem_name,oemstr->text.scsi_host_drive_inquiry_vendor_id,
-		sizeof(ha->oem_name));
+                sizeof(ha->oem_name));
+#else
+        strncpy(ha->oem_name,oemstr->text.scsi_host_drive_inquiry_vendor_id,7);
+        ha->oem_name[7] = '\0';
+#endif
     } else {
         /* Old method, based on PCI ID */
         TRACE2(("gdth_search_drives(): CACHE_READ_OEM_STRING_RECORD failed\n"));
+        printk("GDT-HA %d: Name: %s\n",
+               hanum,ha->binfo.type_string);
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
         if (ha->oem_id == OEM_ID_INTEL)
             strlcpy(ha->oem_name,"Intel  ", sizeof(ha->oem_name));
         else
             strlcpy(ha->oem_name,"ICP    ", sizeof(ha->oem_name));
+#else 
+        if (ha->oem_id == OEM_ID_INTEL)
+            strcpy(ha->oem_name,"Intel  ");
+        else
+            strcpy(ha->oem_name,"ICP    ");
+#endif
     }
 
     /* scanning for host drives */
@@ -2329,7 +2285,8 @@
 static int gdth_analyse_hdrive(int hanum,ushort hdrive)
 {
     register gdth_ha_str *ha;
-    int drv_cyls, drv_hds, drv_secs;
+    ulong32 drv_cyls;
+    int drv_hds, drv_secs;
 
     TRACE(("gdth_analyse_hdrive() hanum %d drive %d\n",hanum,hdrive));
     if (hdrive >= MAX_HDRIVES)
@@ -2340,7 +2297,7 @@
         return 0;
     ha->hdr[hdrive].present = TRUE;
     ha->hdr[hdrive].size = ha->info;
-
+   
     /* evaluate mapping (sectors per head, heads per cylinder) */
     ha->hdr[hdrive].size &= ~SECS32;
     if (ha->info2 == 0) {
@@ -2348,15 +2305,22 @@
     } else {
         drv_hds = ha->info2 & 0xff;
         drv_secs = (ha->info2 >> 8) & 0xff;
-        drv_cyls = ha->hdr[hdrive].size /drv_hds/drv_secs;
+        drv_cyls = (ulong32)ha->hdr[hdrive].size / drv_hds / drv_secs;
     }
     ha->hdr[hdrive].heads = (unchar)drv_hds;
     ha->hdr[hdrive].secs  = (unchar)drv_secs;
     /* round size */
     ha->hdr[hdrive].size  = drv_cyls * drv_hds * drv_secs;
+    
+    if (ha->cache_feat & GDT_64BIT) {
+        if (gdth_internal_cmd(hanum,CACHESERVICE,GDT_X_INFO,hdrive,0,0)
+            && ha->info2 != 0) {
+            ha->hdr[hdrive].size = ((ulong64)ha->info2 << 32) | ha->info;
+        }
+    }
     TRACE2(("gdth_search_dr() cdr. %d size %d hds %d scs %d\n",
             hdrive,ha->hdr[hdrive].size,drv_hds,drv_secs));
-            
+
     /* get informations about device */
     if (gdth_internal_cmd(hanum,CACHESERVICE,GDT_DEVTYPE,hdrive,0,0)) {
         TRACE2(("gdth_search_dr() cache drive %d devtype %d\n",
@@ -2398,14 +2362,13 @@
     GDTH_LOCK_HA(ha, flags);
 
     scp->SCp.this_residual = (int)priority;
-#if LINUX_VERSION_CODE >= 0x02053C
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
     b = virt_ctr ? NUMDATA(scp->device->host)->busnum : scp->device->channel;
     t = scp->device->id;
 #else
     b = virt_ctr ? NUMDATA(scp->host)->busnum : scp->channel;
     t = scp->target;
 #endif
-#if LINUX_VERSION_CODE >= 0x010300
     if (priority >= DEFAULT_PRI) {
         if ((b != ha->virt_bus && ha->raw[BUS_L2P(ha,b)].lock) ||
             (b == ha->virt_bus && t < MAX_HDRIVES && ha->hdr[t].lock)) {
@@ -2413,7 +2376,6 @@
             scp->SCp.buffers_residual = gdth_update_timeout(hanum, scp, 0);
         }
     }
-#endif
 
     if (ha->req_first==NULL) {
         ha->req_first = scp;                    /* queue was empty */
@@ -2465,7 +2427,7 @@
     for (nscp = pscp = ha->req_first; nscp; nscp = (Scsi_Cmnd *)nscp->SCp.ptr) {
         if (nscp != pscp && nscp != (Scsi_Cmnd *)pscp->SCp.ptr)
             pscp = (Scsi_Cmnd *)pscp->SCp.ptr;
-#if LINUX_VERSION_CODE >= 0x02053C
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
         b = virt_ctr ? NUMDATA(nscp->device->host)->busnum : nscp->device->channel;
         t = nscp->device->id;
         l = nscp->device->lun;
@@ -2493,10 +2455,7 @@
             firsttime = FALSE;
         }
 
-#if LINUX_VERSION_CODE >= 0x010300
-        if (nscp->done != gdth_scsi_done || nscp->cmnd[0] != 0xff) 
-#endif
-        {
+        if (nscp->done != gdth_scsi_done || nscp->cmnd[0] != 0xff) {        
         if (nscp->SCp.phase == -1) {
             nscp->SCp.phase = CACHESERVICE;           /* default: cache svc. */ 
             if (nscp->cmnd[0] == TEST_UNIT_READY) {
@@ -2565,16 +2524,11 @@
                         GDTH_LOCK_HA(ha,flags);
                 }
             }
-        } else
-
-#if LINUX_VERSION_CODE >= 0x010300
-        if (nscp->done == gdth_scsi_done && nscp->cmnd[0] == 0xff) {
+        } else if (nscp->done == gdth_scsi_done && nscp->cmnd[0] == 0xff) {
             if (!(cmd_index=gdth_special_cmd(hanum,nscp)))
                 this_cmd = FALSE;
             next_cmd = FALSE;
-        } else
-#endif
-        if (b != ha->virt_bus) {
+        } else if (b != ha->virt_bus) {
             if (ha->raw[BUS_L2P(ha,b)].io_cnt[t] >= GDTH_MAX_RAW ||
                 !(cmd_index=gdth_fill_raw_cmd(hanum,nscp,BUS_L2P(ha,b)))) 
                 this_cmd = FALSE;
@@ -2603,6 +2557,9 @@
               case VERIFY:
               case START_STOP:
               case MODE_SENSE:
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
+              case SERVICE_ACTION_IN:
+#endif
                 TRACE(("cache cmd %x/%x/%x/%x/%x/%x\n",nscp->cmnd[0],
                        nscp->cmnd[1],nscp->cmnd[2],nscp->cmnd[3],
                        nscp->cmnd[4],nscp->cmnd[5]));
@@ -2674,6 +2631,10 @@
               case WRITE_6:
               case READ_10:
               case WRITE_10:
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
+              case READ_16:
+              case WRITE_16:
+#endif
                 if (ha->hdr[t].media_changed) {
                     /* return UNIT_ATTENTION */
                     TRACE2(("cmd 0x%x target %d: UNIT_ATTENTION\n",
@@ -2701,8 +2662,8 @@
                 TRACE2(("cache cmd %x/%x/%x/%x/%x/%x unknown\n",nscp->cmnd[0],
                         nscp->cmnd[1],nscp->cmnd[2],nscp->cmnd[3],
                         nscp->cmnd[4],nscp->cmnd[5]));
-                printk("GDT: Unknown SCSI command 0x%x to cache service !\n",
-                       nscp->cmnd[0]);
+                printk("GDT-HA %d: Unknown SCSI command 0x%x to cache service !\n",
+                       hanum, nscp->cmnd[0]);
                 nscp->result = DID_ABORT << 16;
                 if (!nscp->SCp.have_data_in)
                     nscp->SCp.have_data_in++;
@@ -2737,11 +2698,11 @@
 
     if (gdth_polling && ha->cmd_cnt > 0) {
         if (!gdth_wait(hanum,cmd_index,POLL_TIMEOUT))
-            printk("GDT: Controller %d: Command %d timed out !\n",
+            printk("GDT-HA %d: Command %d timed out !\n",
                    hanum,cmd_index);
     }
 }
-    
+   
 static void gdth_copy_internal_data(int hanum,Scsi_Cmnd *scp,
                                     char *buffer,ushort count)
 {
@@ -2757,7 +2718,7 @@
 
     if (scp->use_sg) {
         sl = (struct scatterlist *)scp->request_buffer;
-#if LINUX_VERSION_CODE >= 0x020400
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,13)
         sgcnt = pci_map_sg(ha->pdev,sl,scp->use_sg,PCI_DMA_FROMDEVICE);
         for (i=0,cpsum=0; i<sgcnt; ++i,++sl) {
             cpnow = (ushort)sg_dma_len(sl);
@@ -2766,7 +2727,12 @@
             if (cpsum+cpnow > cpcount) 
                 cpnow = cpcount - cpsum;
             cpsum += cpnow;
-            address = (char *)phys_to_virt(sg_dma_address(sl));
+            if (!sl->page) {
+                printk("GDT-HA %d: invalid sc/gt element in gdth_copy_internal_data()\n",
+                       hanum);
+                return;
+            }
+            address = (char *)(page_address(sl->page) + sl->offset);
             memcpy(address,buffer,cpnow);
             if (cpsum == cpcount)
                 break;
@@ -2806,7 +2772,7 @@
     gdth_modep_data mpd;
 
     ha = HADATA(gdth_ctr_tab[hanum]);
-#if LINUX_VERSION_CODE >= 0x02053C
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
     t  = scp->device->id;
 #else
     t  = scp->target;
@@ -2814,6 +2780,9 @@
     TRACE(("gdth_internal_cache_cmd() cmd 0x%x hdrive %d\n",
            scp->cmnd[0],t));
 
+    scp->result = DID_OK << 16;
+    scp->sense_buffer[0] = 0;
+
     switch (scp->cmnd[0]) {
       case TEST_UNIT_READY:
       case VERIFY:
@@ -2864,19 +2833,35 @@
 
       case READ_CAPACITY:
         TRACE2(("Read capacity hdrive %d\n",t));
-        rdc.last_block_no = ntohl(ha->hdr[t].size-1);
-        rdc.block_length  = ntohl(SECTOR_SIZE);
+        if (ha->hdr[t].size > (ulong64)0xffffffff)
+            rdc.last_block_no = 0xffffffff;
+        else
+            rdc.last_block_no = cpu_to_be32(ha->hdr[t].size-1);
+        rdc.block_length  = cpu_to_be32(SECTOR_SIZE);
         gdth_copy_internal_data(hanum,scp,(char*)&rdc,sizeof(gdth_rdcap_data));
         break;
 
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
+      case SERVICE_ACTION_IN:
+        if ((scp->cmnd[1] & 0x1f) == SAI_READ_CAPACITY_16 &&
+            (ha->cache_feat & GDT_64BIT)) {
+            gdth_rdcap16_data rdc16;
+
+            TRACE2(("Read capacity (16) hdrive %d\n",t));
+            rdc16.last_block_no = cpu_to_be64(ha->hdr[t].size-1);
+            rdc16.block_length  = cpu_to_be32(SECTOR_SIZE);
+            gdth_copy_internal_data(hanum,scp,(char*)&rdc16,sizeof(gdth_rdcap16_data));
+        } else { 
+            scp->result = DID_ABORT << 16;
+        }
+        break;
+#endif
+
       default:
         TRACE2(("Internal cache cmd 0x%x unknown\n",scp->cmnd[0]));
         break;
     }
 
-    scp->result = DID_OK << 16;
-    scp->sense_buffer[0] = 0;
-
     if (!scp->SCp.have_data_in)
         scp->SCp.have_data_in++;
     else 
@@ -2890,9 +2875,14 @@
     register gdth_ha_str *ha;
     register gdth_cmd_str *cmdp;
     struct scatterlist *sl;
-    ushort i, cnt;
-    ulong32 no, phys_addr;
-    int cmd_index, read_write, sgcnt;
+    ulong32 cnt, blockcnt;
+    ulong64 no, blockno;
+    dma_addr_t phys_addr;
+    int i, cmd_index, read_write, sgcnt, mode64;
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,13)
+    struct page *page;
+    ulong offset;
+#endif
 
     ha = HADATA(gdth_ctr_tab[hanum]);
     cmdp = ha->pccb;
@@ -2902,6 +2892,11 @@
     if (ha->type==GDT_EISA && ha->cmd_cnt>0) 
         return 0;
 
+    mode64 = (ha->cache_feat & GDT_64BIT) ? TRUE : FALSE;
+    /* test for READ_16, WRITE_16 if !mode64 ? ---
+       not required, should not occur due to error return on 
+       READ_CAPACITY_16 */
+
     cmdp->Service = CACHESERVICE;
     cmdp->RequestBuffer = scp;
     /* search free command index */
@@ -2929,7 +2924,11 @@
         else
             cmdp->OpCode = GDT_FLUSH;
     } else if (scp->cmnd[0] == WRITE_6 || scp->cmnd[0] == WRITE_10 ||
-               scp->cmnd[0] == WRITE_12) {
+               scp->cmnd[0] == WRITE_12 
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
+               || scp->cmnd[0] == WRITE_16
+#endif
+    ) {
         read_write = 1;
         if (gdth_write_through || ((ha->hdr[hdrive].rw_attribs & 1) && 
                                    (ha->cache_feat & GDT_WR_THROUGH)))
@@ -2940,86 +2939,157 @@
         read_write = 2;
         cmdp->OpCode = GDT_READ;
     }
-    
-    cmdp->BoardNode        = LOCALBOARD;
-    cmdp->u.cache.DeviceNo = hdrive;
-    cmdp->u.cache.BlockNo  = 1;
-    cmdp->u.cache.sg_canz  = 0;
+
+    cmdp->BoardNode = LOCALBOARD;
+    if (mode64) {
+        cmdp->u.cache64.DeviceNo = hdrive;
+        cmdp->u.cache64.BlockNo  = 1;
+        cmdp->u.cache64.sg_canz  = 0;
+    } else {
+        cmdp->u.cache.DeviceNo = hdrive;
+        cmdp->u.cache.BlockNo  = 1;
+        cmdp->u.cache.sg_canz  = 0;
+    }
 
     if (read_write) {
-        if (scp->cmd_len != 6) {
+        if (scp->cmd_len == 16) {
+            memcpy(&no, &scp->cmnd[2], sizeof(ulong64));
+            blockno = be64_to_cpu(no);
+            memcpy(&cnt, &scp->cmnd[10], sizeof(ulong32));
+            blockcnt = be32_to_cpu(cnt);
+        } else if (scp->cmd_len == 10) {
             memcpy(&no, &scp->cmnd[2], sizeof(ulong32));
-            cmdp->u.cache.BlockNo = ntohl(no);
+            blockno = be32_to_cpu(no);
             memcpy(&cnt, &scp->cmnd[7], sizeof(ushort));
-            cmdp->u.cache.BlockCnt = (ulong32)ntohs(cnt);
+            blockcnt = be16_to_cpu(cnt);
         } else {
             memcpy(&no, &scp->cmnd[0], sizeof(ulong32));
-            cmdp->u.cache.BlockNo = ntohl(no) & 0x001fffffUL;
-            cmdp->u.cache.BlockCnt= scp->cmnd[4]==0 ? 0x100 : scp->cmnd[4];
+            blockno = be32_to_cpu(no) & 0x001fffffUL;
+            blockcnt= scp->cmnd[4]==0 ? 0x100 : scp->cmnd[4];
+        }
+        if (mode64) {
+            cmdp->u.cache64.BlockNo = blockno;
+            cmdp->u.cache64.BlockCnt = blockcnt;
+        } else {
+            cmdp->u.cache.BlockNo = (ulong32)blockno;
+            cmdp->u.cache.BlockCnt = blockcnt;
         }
 
         if (scp->use_sg) {
-            cmdp->u.cache.DestAddr= 0xffffffff;
             sl = (struct scatterlist *)scp->request_buffer;
             sgcnt = scp->use_sg;
-#if LINUX_VERSION_CODE >= 0x020400
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,13)
             scp->SCp.Status = GDTH_MAP_SG;
             scp->SCp.Message = (read_write == 1 ? 
                 PCI_DMA_TODEVICE : PCI_DMA_FROMDEVICE);   
             sgcnt = pci_map_sg(ha->pdev,sl,scp->use_sg,scp->SCp.Message);
-            for (i=0; i<sgcnt; ++i,++sl) {
-                cmdp->u.cache.sg_lst[i].sg_ptr = sg_dma_address(sl);
-                cmdp->u.cache.sg_lst[i].sg_len = sg_dma_len(sl);
+            if (mode64) {
+                cmdp->u.cache64.DestAddr= (ulong64)-1;
+                cmdp->u.cache64.sg_canz = sgcnt;
+                for (i=0; i<sgcnt; ++i,++sl) {
+                    cmdp->u.cache64.sg_lst[i].sg_ptr = sg_dma_address(sl);
+#ifdef GDTH_DMA_STATISTICS
+                    if (cmdp->u.cache64.sg_lst[i].sg_ptr > (ulong64)0xffffffff)
+                        ha->dma64_cnt++;
+                    else
+                        ha->dma32_cnt++;
+#endif
+                    cmdp->u.cache64.sg_lst[i].sg_len = sg_dma_len(sl);
+                }
+            } else {
+                cmdp->u.cache.DestAddr= 0xffffffff;
+                cmdp->u.cache.sg_canz = sgcnt;
+                for (i=0; i<sgcnt; ++i,++sl) {
+                    cmdp->u.cache.sg_lst[i].sg_ptr = sg_dma_address(sl);
+#ifdef GDTH_DMA_STATISTICS
+                    ha->dma32_cnt++;
+#endif
+                    cmdp->u.cache.sg_lst[i].sg_len = sg_dma_len(sl);
+                }
             }
 #else
-            for (i=0; i<sgcnt; ++i,++sl) {
-                cmdp->u.cache.sg_lst[i].sg_ptr = virt_to_bus(sl->address);
-                cmdp->u.cache.sg_lst[i].sg_len = (ulong32)sl->length;
+            if (mode64) {
+                cmdp->u.cache64.DestAddr= (ulong64)-1;
+                cmdp->u.cache64.sg_canz = sgcnt;
+                for (i=0; i<sgcnt; ++i,++sl) {
+                    cmdp->u.cache64.sg_lst[i].sg_ptr = virt_to_bus(sl->address);
+                    cmdp->u.cache64.sg_lst[i].sg_len = (ulong32)sl->length;
+                }
+            } else {
+                cmdp->u.cache.DestAddr= 0xffffffff;
+                cmdp->u.cache.sg_canz = sgcnt;
+                for (i=0; i<sgcnt; ++i,++sl) {
+                    cmdp->u.cache.sg_lst[i].sg_ptr = virt_to_bus(sl->address);
+                    cmdp->u.cache.sg_lst[i].sg_len = (ulong32)sl->length;
+                }
             }
 #endif
-            cmdp->u.cache.sg_canz = (ulong32)i;
 
 #ifdef GDTH_STATISTICS
-            if (max_sg < (ulong32)i) {
-                max_sg = (ulong32)i;
-                TRACE3(("GDT: max_sg = %d\n",i));
+            if (max_sg < (ulong32)sgcnt) {
+                max_sg = (ulong32)sgcnt;
+                TRACE3(("GDT: max_sg = %d\n",max_sg));
             }
 #endif
-            if (i<GDTH_MAXSG)
-                cmdp->u.cache.sg_lst[i].sg_len = 0;
+
         } else {
-#if LINUX_VERSION_CODE >= 0x020400
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,13)
             scp->SCp.Status = GDTH_MAP_SINGLE;
             scp->SCp.Message = (read_write == 1 ? 
-                PCI_DMA_TODEVICE : PCI_DMA_FROMDEVICE);   
-            phys_addr = pci_map_single(ha->pdev,scp->request_buffer,
-                                       scp->request_bufflen,scp->SCp.Message);
+                PCI_DMA_TODEVICE : PCI_DMA_FROMDEVICE);
+            page = virt_to_page(scp->request_buffer);
+            offset = (ulong)scp->request_buffer & ~PAGE_MASK;
+            phys_addr = pci_map_page(ha->pdev,page,offset,
+                                     scp->request_bufflen,scp->SCp.Message);
             scp->SCp.dma_handle = phys_addr;
 #else
             phys_addr = virt_to_bus(scp->request_buffer);
 #endif
-            if (ha->cache_feat & SCATTER_GATHER) {
-                cmdp->u.cache.DestAddr = 0xffffffff;
-                cmdp->u.cache.sg_canz = 1;
-                cmdp->u.cache.sg_lst[0].sg_ptr = phys_addr;
-                cmdp->u.cache.sg_lst[0].sg_len = scp->request_bufflen;
-                cmdp->u.cache.sg_lst[1].sg_len = 0;
+            if (mode64) {
+                if (ha->cache_feat & SCATTER_GATHER) {
+                    cmdp->u.cache64.DestAddr = (ulong64)-1;
+                    cmdp->u.cache64.sg_canz = 1;
+                    cmdp->u.cache64.sg_lst[0].sg_ptr = phys_addr;
+                    cmdp->u.cache64.sg_lst[0].sg_len = scp->request_bufflen;
+                    cmdp->u.cache64.sg_lst[1].sg_len = 0;
+                } else {
+                    cmdp->u.cache64.DestAddr  = phys_addr;
+                    cmdp->u.cache64.sg_canz= 0;
+                }
             } else {
-                cmdp->u.cache.DestAddr  = phys_addr;
-                cmdp->u.cache.sg_canz= 0;
+                if (ha->cache_feat & SCATTER_GATHER) {
+                    cmdp->u.cache.DestAddr = 0xffffffff;
+                    cmdp->u.cache.sg_canz = 1;
+                    cmdp->u.cache.sg_lst[0].sg_ptr = phys_addr;
+                    cmdp->u.cache.sg_lst[0].sg_len = scp->request_bufflen;
+                    cmdp->u.cache.sg_lst[1].sg_len = 0;
+                } else {
+                    cmdp->u.cache.DestAddr  = phys_addr;
+                    cmdp->u.cache.sg_canz= 0;
+                }
             }
         }
     }
-    TRACE(("cache cmd: addr. %x sganz %x sgptr0 %x sglen0 %x\n",
-           cmdp->u.cache.DestAddr,cmdp->u.cache.sg_canz,
-           cmdp->u.cache.sg_lst[0].sg_ptr,
-           cmdp->u.cache.sg_lst[0].sg_len));
-    TRACE(("cache cmd: cmd %d blockno. %d, blockcnt %d\n",
-           cmdp->OpCode,cmdp->u.cache.BlockNo,cmdp->u.cache.BlockCnt));
-
     /* evaluate command size, check space */
-    ha->cmd_len = GDTOFFSOF(gdth_cmd_str,u.cache.sg_lst) +
-        (ushort)cmdp->u.cache.sg_canz * sizeof(gdth_sg_str);
+    if (mode64) {
+        TRACE(("cache cmd: addr. %x sganz %x sgptr0 %x sglen0 %x\n",
+               cmdp->u.cache64.DestAddr,cmdp->u.cache64.sg_canz,
+               cmdp->u.cache64.sg_lst[0].sg_ptr,
+               cmdp->u.cache64.sg_lst[0].sg_len));
+        TRACE(("cache cmd: cmd %d blockno. %d, blockcnt %d\n",
+               cmdp->OpCode,cmdp->u.cache64.BlockNo,cmdp->u.cache64.BlockCnt));
+        ha->cmd_len = GDTOFFSOF(gdth_cmd_str,u.cache64.sg_lst) +
+            (ushort)cmdp->u.cache64.sg_canz * sizeof(gdth_sg64_str);
+    } else {
+        TRACE(("cache cmd: addr. %x sganz %x sgptr0 %x sglen0 %x\n",
+               cmdp->u.cache.DestAddr,cmdp->u.cache.sg_canz,
+               cmdp->u.cache.sg_lst[0].sg_ptr,
+               cmdp->u.cache.sg_lst[0].sg_len));
+        TRACE(("cache cmd: cmd %d blockno. %d, blockcnt %d\n",
+               cmdp->OpCode,cmdp->u.cache.BlockNo,cmdp->u.cache.BlockCnt));
+        ha->cmd_len = GDTOFFSOF(gdth_cmd_str,u.cache.sg_lst) +
+            (ushort)cmdp->u.cache.sg_canz * sizeof(gdth_sg_str);
+    }
     if (ha->cmd_len & 3)
         ha->cmd_len += (4 - (ha->cmd_len & 3));
 
@@ -3043,12 +3113,16 @@
     register gdth_cmd_str *cmdp;
     struct scatterlist *sl;
     ushort i;
-    ulong32 phys_addr, sense_paddr;
-    int cmd_index, sgcnt;
+    dma_addr_t phys_addr, sense_paddr;
+    int cmd_index, sgcnt, mode64;
     unchar t,l;
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,13)
+    struct page *page;
+    ulong offset;
+#endif
 
     ha = HADATA(gdth_ctr_tab[hanum]);
-#if LINUX_VERSION_CODE >= 0x02053C
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
     t = scp->device->id;
     l = scp->device->lun;
 #else
@@ -3062,6 +3136,8 @@
     if (ha->type==GDT_EISA && ha->cmd_cnt>0) 
         return 0;
 
+    mode64 = (ha->raw_feat & GDT_64BIT) ? TRUE : FALSE;
+
     cmdp->Service = SCSIRAWSERVICE;
     cmdp->RequestBuffer = scp;
     /* search free command index */
@@ -3077,95 +3153,176 @@
     if (scp->SCp.sent_command != -1) {
         cmdp->OpCode           = scp->SCp.sent_command; /* special raw cmd. */
         cmdp->BoardNode        = LOCALBOARD;
-        cmdp->u.raw.direction  = (scp->SCp.phase >> 8);
-        TRACE2(("special raw cmd 0x%x param 0x%x\n", 
-                cmdp->OpCode, cmdp->u.raw.direction));
+        if (mode64) {
+            cmdp->u.raw64.direction = (scp->SCp.phase >> 8);
+            TRACE2(("special raw cmd 0x%x param 0x%x\n", 
+                    cmdp->OpCode, cmdp->u.raw64.direction));
+            /* evaluate command size */
+            ha->cmd_len = GDTOFFSOF(gdth_cmd_str,u.raw64.sg_lst);
+        } else {
+            cmdp->u.raw.direction  = (scp->SCp.phase >> 8);
+            TRACE2(("special raw cmd 0x%x param 0x%x\n", 
+                    cmdp->OpCode, cmdp->u.raw.direction));
+            /* evaluate command size */
+            ha->cmd_len = GDTOFFSOF(gdth_cmd_str,u.raw.sg_lst);
+        }
 
-        /* evaluate command size */
-        ha->cmd_len = GDTOFFSOF(gdth_cmd_str,u.raw.sg_lst);
     } else {
-#if LINUX_VERSION_CODE >= 0x020400
-        sense_paddr = pci_map_single(ha->pdev,scp->sense_buffer,
-                                     16,PCI_DMA_FROMDEVICE);
-        scp->SCp.buffer = (struct scatterlist *)sense_paddr;
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,13)
+        page = virt_to_page(scp->sense_buffer);
+        offset = (ulong)scp->sense_buffer & ~PAGE_MASK;
+        sense_paddr = pci_map_page(ha->pdev,page,offset,
+                                   16,PCI_DMA_FROMDEVICE);
+        scp->SCp.buffer = (struct scatterlist *)((ulong32)sense_paddr);
+        /* high part, if 64bit */
+        scp->host_scribble = (char *)(ulong32)((ulong64)sense_paddr >> 32);
 #else
         sense_paddr = virt_to_bus(scp->sense_buffer);
 #endif
         cmdp->OpCode           = GDT_WRITE;             /* always */
         cmdp->BoardNode        = LOCALBOARD;
-        cmdp->u.raw.reserved   = 0;
-        cmdp->u.raw.mdisc_time = 0;
-        cmdp->u.raw.mcon_time  = 0;
-        cmdp->u.raw.clen       = scp->cmd_len;
-        cmdp->u.raw.target     = t;
-        cmdp->u.raw.lun        = l;
-        cmdp->u.raw.bus        = b;
-        cmdp->u.raw.priority   = 0;
-        cmdp->u.raw.link_p     = 0;
-        cmdp->u.raw.sdlen      = scp->request_bufflen;
-        cmdp->u.raw.sense_len  = 16;
-        cmdp->u.raw.sense_data = sense_paddr;
-        cmdp->u.raw.direction  = 
-            gdth_direction_tab[scp->cmnd[0]]==DOU ? GDTH_DATA_OUT:GDTH_DATA_IN;
-        memcpy(cmdp->u.raw.cmd,scp->cmnd,12);
+        if (mode64) { 
+            cmdp->u.raw64.reserved   = 0;
+            cmdp->u.raw64.mdisc_time = 0;
+            cmdp->u.raw64.mcon_time  = 0;
+            cmdp->u.raw64.clen       = scp->cmd_len;
+            cmdp->u.raw64.target     = t;
+            cmdp->u.raw64.lun        = l;
+            cmdp->u.raw64.bus        = b;
+            cmdp->u.raw64.priority   = 0;
+            cmdp->u.raw64.sdlen      = scp->request_bufflen;
+            cmdp->u.raw64.sense_len  = 16;
+            cmdp->u.raw64.sense_data = sense_paddr;
+            cmdp->u.raw64.direction  = 
+                gdth_direction_tab[scp->cmnd[0]]==DOU ? GDTH_DATA_OUT:GDTH_DATA_IN;
+            memcpy(cmdp->u.raw64.cmd,scp->cmnd,16);
+        } else {
+            cmdp->u.raw.reserved   = 0;
+            cmdp->u.raw.mdisc_time = 0;
+            cmdp->u.raw.mcon_time  = 0;
+            cmdp->u.raw.clen       = scp->cmd_len;
+            cmdp->u.raw.target     = t;
+            cmdp->u.raw.lun        = l;
+            cmdp->u.raw.bus        = b;
+            cmdp->u.raw.priority   = 0;
+            cmdp->u.raw.link_p     = 0;
+            cmdp->u.raw.sdlen      = scp->request_bufflen;
+            cmdp->u.raw.sense_len  = 16;
+            cmdp->u.raw.sense_data = sense_paddr;
+            cmdp->u.raw.direction  = 
+                gdth_direction_tab[scp->cmnd[0]]==DOU ? GDTH_DATA_OUT:GDTH_DATA_IN;
+            memcpy(cmdp->u.raw.cmd,scp->cmnd,12);
+        }
 
         if (scp->use_sg) {
-            cmdp->u.raw.sdata  = 0xffffffff;
             sl = (struct scatterlist *)scp->request_buffer;
             sgcnt = scp->use_sg;
-#if LINUX_VERSION_CODE >= 0x020400
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,13)
             scp->SCp.Status = GDTH_MAP_SG;
             scp->SCp.Message = PCI_DMA_BIDIRECTIONAL; 
             sgcnt = pci_map_sg(ha->pdev,sl,scp->use_sg,scp->SCp.Message);
-            for (i=0; i<sgcnt; ++i,++sl) {
-                cmdp->u.raw.sg_lst[i].sg_ptr = sg_dma_address(sl);
-                cmdp->u.raw.sg_lst[i].sg_len = sg_dma_len(sl);
+            if (mode64) {
+                cmdp->u.raw64.sdata = (ulong64)-1;
+                cmdp->u.raw64.sg_ranz = sgcnt;
+                for (i=0; i<sgcnt; ++i,++sl) {
+                    cmdp->u.raw64.sg_lst[i].sg_ptr = sg_dma_address(sl);
+#ifdef GDTH_DMA_STATISTICS
+                    if (cmdp->u.raw64.sg_lst[i].sg_ptr > (ulong64)0xffffffff)
+                        ha->dma64_cnt++;
+                    else
+                        ha->dma32_cnt++;
+#endif
+                    cmdp->u.raw64.sg_lst[i].sg_len = sg_dma_len(sl);
+                }
+            } else {
+                cmdp->u.raw.sdata = 0xffffffff;
+                cmdp->u.raw.sg_ranz = sgcnt;
+                for (i=0; i<sgcnt; ++i,++sl) {
+                    cmdp->u.raw.sg_lst[i].sg_ptr = sg_dma_address(sl);
+#ifdef GDTH_DMA_STATISTICS
+                    ha->dma32_cnt++;
+#endif
+                    cmdp->u.raw.sg_lst[i].sg_len = sg_dma_len(sl);
+                }
             }
 #else
-            for (i=0; i<sgcnt; ++i,++sl) {
-                cmdp->u.raw.sg_lst[i].sg_ptr = virt_to_bus(sl->address);
-                cmdp->u.raw.sg_lst[i].sg_len = (ulong32)sl->length;
+            if (mode64) {
+                cmdp->u.raw64.sdata = (ulong64)-1;
+                cmdp->u.raw64.sg_ranz = sgcnt;
+                for (i=0; i<sgcnt; ++i,++sl) {
+                    cmdp->u.raw64.sg_lst[i].sg_ptr = virt_to_bus(sl->address);
+                    cmdp->u.raw64.sg_lst[i].sg_len = (ulong32)sl->length;
+                }
+            } else {
+                cmdp->u.raw.sdata = 0xffffffff;
+                cmdp->u.raw.sg_ranz = sgcnt;
+                for (i=0; i<sgcnt; ++i,++sl) {
+                    cmdp->u.raw.sg_lst[i].sg_ptr = virt_to_bus(sl->address);
+                    cmdp->u.raw.sg_lst[i].sg_len = (ulong32)sl->length;
+                }
             }
 #endif
-            cmdp->u.raw.sg_ranz = (ulong32)i;
 
 #ifdef GDTH_STATISTICS
-            if (max_sg < (ulong32)i) {
-                max_sg = (ulong32)i;
-                TRACE3(("GDT: max_sg = %d\n",i));
+            if (max_sg < sgcnt) {
+                max_sg = sgcnt;
+                TRACE3(("GDT: max_sg = %d\n",sgcnt));
             }
 #endif
-            if (i<GDTH_MAXSG)
-                cmdp->u.raw.sg_lst[i].sg_len = 0;
+
         } else {
-#if LINUX_VERSION_CODE >= 0x020400
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,13)
             scp->SCp.Status = GDTH_MAP_SINGLE;
             scp->SCp.Message = PCI_DMA_BIDIRECTIONAL; 
-            phys_addr = pci_map_single(ha->pdev,scp->request_buffer,
-                                       scp->request_bufflen,scp->SCp.Message);
+            page = virt_to_page(scp->request_buffer);
+            offset = (ulong)scp->request_buffer & ~PAGE_MASK;
+            phys_addr = pci_map_page(ha->pdev,page,offset,
+                                     scp->request_bufflen,scp->SCp.Message);
             scp->SCp.dma_handle = phys_addr;
 #else
             phys_addr = virt_to_bus(scp->request_buffer);
 #endif
-            if (ha->raw_feat & SCATTER_GATHER) {
-                cmdp->u.raw.sdata  = 0xffffffff;
-                cmdp->u.raw.sg_ranz= 1;
-                cmdp->u.raw.sg_lst[0].sg_ptr = phys_addr;
-                cmdp->u.raw.sg_lst[0].sg_len = scp->request_bufflen;
-                cmdp->u.raw.sg_lst[1].sg_len = 0;
+            if (mode64) {
+                if (ha->raw_feat & SCATTER_GATHER) {
+                    cmdp->u.raw64.sdata  = (ulong64)-1;
+                    cmdp->u.raw64.sg_ranz= 1;
+                    cmdp->u.raw64.sg_lst[0].sg_ptr = phys_addr;
+                    cmdp->u.raw64.sg_lst[0].sg_len = scp->request_bufflen;
+                    cmdp->u.raw64.sg_lst[1].sg_len = 0;
+                } else {
+                    cmdp->u.raw64.sdata  = phys_addr;
+                    cmdp->u.raw64.sg_ranz= 0;
+                }
             } else {
-                cmdp->u.raw.sdata  = phys_addr;
-                cmdp->u.raw.sg_ranz= 0;
+                if (ha->raw_feat & SCATTER_GATHER) {
+                    cmdp->u.raw.sdata  = 0xffffffff;
+                    cmdp->u.raw.sg_ranz= 1;
+                    cmdp->u.raw.sg_lst[0].sg_ptr = phys_addr;
+                    cmdp->u.raw.sg_lst[0].sg_len = scp->request_bufflen;
+                    cmdp->u.raw.sg_lst[1].sg_len = 0;
+                } else {
+                    cmdp->u.raw.sdata  = phys_addr;
+                    cmdp->u.raw.sg_ranz= 0;
+                }
             }
         }
-        TRACE(("raw cmd: addr. %x sganz %x sgptr0 %x sglen0 %x\n",
-               cmdp->u.raw.sdata,cmdp->u.raw.sg_ranz,
-               cmdp->u.raw.sg_lst[0].sg_ptr,
-               cmdp->u.raw.sg_lst[0].sg_len));
-
-        /* evaluate command size */
-        ha->cmd_len = GDTOFFSOF(gdth_cmd_str,u.raw.sg_lst) +
-            (ushort)cmdp->u.raw.sg_ranz * sizeof(gdth_sg_str);
+        if (mode64) {
+            TRACE(("raw cmd: addr. %x sganz %x sgptr0 %x sglen0 %x\n",
+                   cmdp->u.raw64.sdata,cmdp->u.raw64.sg_ranz,
+                   cmdp->u.raw64.sg_lst[0].sg_ptr,
+                   cmdp->u.raw64.sg_lst[0].sg_len));
+            /* evaluate command size */
+            ha->cmd_len = GDTOFFSOF(gdth_cmd_str,u.raw64.sg_lst) +
+                (ushort)cmdp->u.raw64.sg_ranz * sizeof(gdth_sg64_str);
+        } else {
+            TRACE(("raw cmd: addr. %x sganz %x sgptr0 %x sglen0 %x\n",
+                   cmdp->u.raw.sdata,cmdp->u.raw.sg_ranz,
+                   cmdp->u.raw.sg_lst[0].sg_ptr,
+                   cmdp->u.raw.sg_lst[0].sg_len));
+            /* evaluate command size */
+            ha->cmd_len = GDTOFFSOF(gdth_cmd_str,u.raw.sg_lst) +
+                (ushort)cmdp->u.raw.sg_ranz * sizeof(gdth_sg_str);
+        }
     }
     /* check space */
     if (ha->cmd_len & 3)
@@ -3215,15 +3372,23 @@
     if (cmdp->OpCode == GDT_IOCTL) {
         TRACE2(("IOCTL\n"));
         ha->cmd_len = 
-            GDTOFFSOF(gdth_cmd_str,u.ioctl.p_param) + sizeof(ulong32);
+            GDTOFFSOF(gdth_cmd_str,u.ioctl.p_param) + sizeof(ulong64);
     } else if (cmdp->Service == CACHESERVICE) {
         TRACE2(("cache command %d\n",cmdp->OpCode));
-        ha->cmd_len = 
-            GDTOFFSOF(gdth_cmd_str,u.cache.sg_lst) + sizeof(gdth_sg_str);
+        if (ha->cache_feat & GDT_64BIT)
+            ha->cmd_len = 
+                GDTOFFSOF(gdth_cmd_str,u.cache64.sg_lst) + sizeof(gdth_sg64_str);
+        else
+            ha->cmd_len = 
+                GDTOFFSOF(gdth_cmd_str,u.cache.sg_lst) + sizeof(gdth_sg_str);
     } else if (cmdp->Service == SCSIRAWSERVICE) {
-        TRACE2(("raw command %d/%d\n",cmdp->OpCode,cmdp->u.raw.cmd[0]));
-        ha->cmd_len = 
-            GDTOFFSOF(gdth_cmd_str,u.raw.sg_lst) + sizeof(gdth_sg_str);
+        TRACE2(("raw command %d\n",cmdp->OpCode));
+        if (ha->raw_feat & GDT_64BIT)
+            ha->cmd_len = 
+                GDTOFFSOF(gdth_cmd_str,u.raw64.sg_lst) + sizeof(gdth_sg64_str);
+        else
+            ha->cmd_len = 
+                GDTOFFSOF(gdth_cmd_str,u.raw.sg_lst) + sizeof(gdth_sg_str);
     }
 
     if (ha->cmd_len & 3)
@@ -3366,10 +3531,14 @@
 
 /* SCSI interface functions */
 
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
 static irqreturn_t gdth_interrupt(int irq,void *dev_id,struct pt_regs *regs)
+#else
+static void gdth_interrupt(int irq,void *dev_id,struct pt_regs *regs)
+#endif
 {
     register gdth_ha_str *ha;
-    gdt6m_dpram_str *dp6m_ptr;
+    gdt6m_dpram_str *dp6m_ptr = NULL;
     gdt6_dpram_str *dp6_ptr;
     gdt2_dpram_str *dp2_ptr;
     Scsi_Cmnd *scp;
@@ -3377,13 +3546,23 @@
     unchar IStatus;
     ushort Service;
     ulong flags = 0;
+#ifdef INT_COAL
+    int coalesced = FALSE;
+    int next = FALSE;
+    gdth_coal_status *pcs = NULL;
+    int act_int_coal = 0;       
+#endif
 
     TRACE(("gdth_interrupt() IRQ %d\n",irq));
 
     /* if polling and not from gdth_wait() -> return */
     if (gdth_polling) {
         if (!gdth_from_wait) {
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
             return IRQ_HANDLED;
+#else
+            return;             
+#endif
         }
     }
 
@@ -3396,174 +3575,261 @@
         /* spurious interrupt */
         if (!gdth_polling)
             GDTH_UNLOCK_HA((gdth_ha_str *)dev_id,flags);
-        return IRQ_HANDLED;
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
+            return IRQ_HANDLED;
+#else
+            return;             
+#endif
     }
+    ha = HADATA(gdth_ctr_tab[hanum]);
 
 #ifdef GDTH_STATISTICS
     ++act_ints;
 #endif
-    
-    ha = HADATA(gdth_ctr_tab[hanum]);
-    if (ha->type == GDT_EISA) {
-        if (IStatus & 0x80) {                       /* error flag */
-            IStatus &= ~0x80;
-            ha->status = inw(ha->bmic + MAILBOXREG+8);
-            TRACE2(("gdth_interrupt() error %d/%d\n",IStatus,ha->status));
-        } else                                      /* no error */
-            ha->status = S_OK;
-        ha->info = inl(ha->bmic + MAILBOXREG+12);
-        ha->service = inw(ha->bmic + MAILBOXREG+10);
-        ha->info2 = inl(ha->bmic + MAILBOXREG+4);
 
-        outb(0xff, ha->bmic + EDOORREG);            /* acknowledge interrupt */
-        outb(0x00, ha->bmic + SEMA1REG);            /* reset status semaphore */
-    } else if (ha->type == GDT_ISA) {
-        dp2_ptr = (gdt2_dpram_str *)ha->brd;
-        if (IStatus & 0x80) {                       /* error flag */
-            IStatus &= ~0x80;
-            ha->status = gdth_readw(&dp2_ptr->u.ic.Status);
-            TRACE2(("gdth_interrupt() error %d/%d\n",IStatus,ha->status));
-        } else                                      /* no error */
-            ha->status = S_OK;
-        ha->info = gdth_readl(&dp2_ptr->u.ic.Info[0]);
-        ha->service = gdth_readw(&dp2_ptr->u.ic.Service);
-        ha->info2 = gdth_readl(&dp2_ptr->u.ic.Info[1]);
-
-        gdth_writeb(0xff, &dp2_ptr->io.irqdel);     /* acknowledge interrupt */
-        gdth_writeb(0, &dp2_ptr->u.ic.Cmd_Index);   /* reset command index */
-        gdth_writeb(0, &dp2_ptr->io.Sema1);         /* reset status semaphore */
-    } else if (ha->type == GDT_PCI) {
-        dp6_ptr = (gdt6_dpram_str *)ha->brd;
-        if (IStatus & 0x80) {                       /* error flag */
-            IStatus &= ~0x80;
-            ha->status = gdth_readw(&dp6_ptr->u.ic.Status);
-            TRACE2(("gdth_interrupt() error %d/%d\n",IStatus,ha->status));
-        } else                                      /* no error */
-            ha->status = S_OK;
-        ha->info = gdth_readl(&dp6_ptr->u.ic.Info[0]);
-        ha->service = gdth_readw(&dp6_ptr->u.ic.Service);
-        ha->info2 = gdth_readl(&dp6_ptr->u.ic.Info[1]);
-
-        gdth_writeb(0xff, &dp6_ptr->io.irqdel);     /* acknowledge interrupt */
-        gdth_writeb(0, &dp6_ptr->u.ic.Cmd_Index);   /* reset command index */
-        gdth_writeb(0, &dp6_ptr->io.Sema1);         /* reset status semaphore */
-    } else if (ha->type == GDT_PCINEW) {
-        if (IStatus & 0x80) {                       /* error flag */
-            IStatus &= ~0x80;
-            ha->status = inw(PTR2USHORT(&ha->plx->status));
-            TRACE2(("gdth_interrupt() error %d/%d\n",IStatus,ha->status));
-        } else
-            ha->status = S_OK;
-        ha->info = inl(PTR2USHORT(&ha->plx->info[0]));
-        ha->service = inw(PTR2USHORT(&ha->plx->service));
-        ha->info2 = inl(PTR2USHORT(&ha->plx->info[1]));
-
-        outb(0xff, PTR2USHORT(&ha->plx->edoor_reg)); 
-        outb(0x00, PTR2USHORT(&ha->plx->sema1_reg)); 
-    } else if (ha->type == GDT_PCIMPR) {
-        dp6m_ptr = (gdt6m_dpram_str *)ha->brd;
-        if (IStatus & 0x80) {                       /* error flag */
-            IStatus &= ~0x80;
-            ha->status = gdth_readw(&dp6m_ptr->i960r.status);
-            TRACE2(("gdth_interrupt() error %d/%d\n",IStatus,ha->status));
-        } else                                      /* no error */
-            ha->status = S_OK;
-        ha->info = gdth_readl(&dp6m_ptr->i960r.info[0]);
-        ha->service = gdth_readw(&dp6m_ptr->i960r.service);
-        ha->info2 = gdth_readl(&dp6m_ptr->i960r.info[1]);
+#ifdef INT_COAL
+    /* See if the fw is returning coalesced status */
+    if (IStatus == COALINDEX) {
+        /* Coalesced status.  Setup the initial status 
+           buffer pointer and flags */
+        pcs = ha->coal_stat;
+        coalesced = TRUE;        
+        next = TRUE;
+    }
 
-        /* event string */
-        if (IStatus == ASYNCINDEX) {
-            if (ha->service != SCREENSERVICE &&
-                (ha->fw_vers & 0xff) >= 0x1a) {
-                ha->dvr.severity =   
-                    gdth_readb(&((gdt6m_dpram_str *)ha->brd)->i960r.severity);
-                for (i = 0; i < 256; ++i) {
-                    ha->dvr.event_string[i] = gdth_readb
-                        (&((gdt6m_dpram_str *)ha->brd)->i960r.evt_str[i]);
-                    if (ha->dvr.event_string[i] == 0)
-                        break;
+    do {
+        if (coalesced) {
+            /* For coalesced requests all status
+               information is found in the status buffer */
+            IStatus = (unchar)(pcs->status & 0xff);
+        }
+#endif
+    
+        if (ha->type == GDT_EISA) {
+            if (IStatus & 0x80) {                       /* error flag */
+                IStatus &= ~0x80;
+                ha->status = inw(ha->bmic + MAILBOXREG+8);
+                TRACE2(("gdth_interrupt() error %d/%d\n",IStatus,ha->status));
+            } else                                      /* no error */
+                ha->status = S_OK;
+            ha->info = inl(ha->bmic + MAILBOXREG+12);
+            ha->service = inw(ha->bmic + MAILBOXREG+10);
+            ha->info2 = inl(ha->bmic + MAILBOXREG+4);
+
+            outb(0xff, ha->bmic + EDOORREG);    /* acknowledge interrupt */
+            outb(0x00, ha->bmic + SEMA1REG);    /* reset status semaphore */
+        } else if (ha->type == GDT_ISA) {
+            dp2_ptr = (gdt2_dpram_str *)ha->brd;
+            if (IStatus & 0x80) {                       /* error flag */
+                IStatus &= ~0x80;
+                ha->status = gdth_readw(&dp2_ptr->u.ic.Status);
+                TRACE2(("gdth_interrupt() error %d/%d\n",IStatus,ha->status));
+            } else                                      /* no error */
+                ha->status = S_OK;
+            ha->info = gdth_readl(&dp2_ptr->u.ic.Info[0]);
+            ha->service = gdth_readw(&dp2_ptr->u.ic.Service);
+            ha->info2 = gdth_readl(&dp2_ptr->u.ic.Info[1]);
+
+            gdth_writeb(0xff, &dp2_ptr->io.irqdel); /* acknowledge interrupt */
+            gdth_writeb(0, &dp2_ptr->u.ic.Cmd_Index);/* reset command index */
+            gdth_writeb(0, &dp2_ptr->io.Sema1);     /* reset status semaphore */
+        } else if (ha->type == GDT_PCI) {
+            dp6_ptr = (gdt6_dpram_str *)ha->brd;
+            if (IStatus & 0x80) {                       /* error flag */
+                IStatus &= ~0x80;
+                ha->status = gdth_readw(&dp6_ptr->u.ic.Status);
+                TRACE2(("gdth_interrupt() error %d/%d\n",IStatus,ha->status));
+            } else                                      /* no error */
+                ha->status = S_OK;
+            ha->info = gdth_readl(&dp6_ptr->u.ic.Info[0]);
+            ha->service = gdth_readw(&dp6_ptr->u.ic.Service);
+            ha->info2 = gdth_readl(&dp6_ptr->u.ic.Info[1]);
+
+            gdth_writeb(0xff, &dp6_ptr->io.irqdel); /* acknowledge interrupt */
+            gdth_writeb(0, &dp6_ptr->u.ic.Cmd_Index);/* reset command index */
+            gdth_writeb(0, &dp6_ptr->io.Sema1);     /* reset status semaphore */
+        } else if (ha->type == GDT_PCINEW) {
+            if (IStatus & 0x80) {                       /* error flag */
+                IStatus &= ~0x80;
+                ha->status = inw(PTR2USHORT(&ha->plx->status));
+                TRACE2(("gdth_interrupt() error %d/%d\n",IStatus,ha->status));
+            } else
+                ha->status = S_OK;
+            ha->info = inl(PTR2USHORT(&ha->plx->info[0]));
+            ha->service = inw(PTR2USHORT(&ha->plx->service));
+            ha->info2 = inl(PTR2USHORT(&ha->plx->info[1]));
+
+            outb(0xff, PTR2USHORT(&ha->plx->edoor_reg)); 
+            outb(0x00, PTR2USHORT(&ha->plx->sema1_reg)); 
+        } else if (ha->type == GDT_PCIMPR) {
+            dp6m_ptr = (gdt6m_dpram_str *)ha->brd;
+            if (IStatus & 0x80) {                       /* error flag */
+                IStatus &= ~0x80;
+#ifdef INT_COAL
+                if (coalesced)
+                    ha->status = pcs->ext_status && 0xffff;
+                else 
+#endif
+                    ha->status = gdth_readw(&dp6m_ptr->i960r.status);
+                TRACE2(("gdth_interrupt() error %d/%d\n",IStatus,ha->status));
+            } else                                      /* no error */
+                ha->status = S_OK;
+#ifdef INT_COAL
+            /* get information */
+            if (coalesced) {    
+                ha->info = pcs->info0;
+                ha->info2 = pcs->info1;
+                ha->service = (pcs->ext_status >> 16) && 0xffff;
+            } else
+#endif
+            {
+                ha->info = gdth_readl(&dp6m_ptr->i960r.info[0]);
+                ha->service = gdth_readw(&dp6m_ptr->i960r.service);
+                ha->info2 = gdth_readl(&dp6m_ptr->i960r.info[1]);
+            }
+            /* event string */
+            if (IStatus == ASYNCINDEX) {
+                if (ha->service != SCREENSERVICE &&
+                    (ha->fw_vers & 0xff) >= 0x1a) {
+                    ha->dvr.severity = gdth_readb
+                        (&((gdt6m_dpram_str *)ha->brd)->i960r.severity);
+                    for (i = 0; i < 256; ++i) {
+                        ha->dvr.event_string[i] = gdth_readb
+                            (&((gdt6m_dpram_str *)ha->brd)->i960r.evt_str[i]);
+                        if (ha->dvr.event_string[i] == 0)
+                            break;
+                    }
                 }
             }
+#ifdef INT_COAL
+            /* Make sure that non coalesced interrupts get cleared
+               before being handled by gdth_async_event/gdth_sync_event */
+            if (!coalesced)
+#endif                          
+            {
+                gdth_writeb(0xff, &dp6m_ptr->i960r.edoor_reg);
+                gdth_writeb(0, &dp6m_ptr->i960r.sema1_reg);
+            }
+        } else {
+            TRACE2(("gdth_interrupt() unknown controller type\n"));
+            if (!gdth_polling)
+                GDTH_UNLOCK_HA((gdth_ha_str *)dev_id,flags);
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
+            return IRQ_HANDLED;
+#else
+            return;             
+#endif
         }
-        gdth_writeb(0xff, &dp6m_ptr->i960r.edoor_reg);
-        gdth_writeb(0, &dp6m_ptr->i960r.sema1_reg);
-    } else {
-        TRACE2(("gdth_interrupt() unknown controller type\n"));
-        if (!gdth_polling)
-            GDTH_UNLOCK_HA((gdth_ha_str *)dev_id,flags);
-        return IRQ_HANDLED;
-    }
 
-    TRACE(("gdth_interrupt() index %d stat %d info %d\n",
-           IStatus,ha->status,ha->info));
+        TRACE(("gdth_interrupt() index %d stat %d info %d\n",
+               IStatus,ha->status,ha->info));
 
-    if (gdth_from_wait) {
-        wait_hanum = hanum;
-        wait_index = (int)IStatus;
-    }
+        if (gdth_from_wait) {
+            wait_hanum = hanum;
+            wait_index = (int)IStatus;
+        }
 
-    if (IStatus == ASYNCINDEX) {
-        TRACE2(("gdth_interrupt() async. event\n"));
-        gdth_async_event(hanum);
-        if (!gdth_polling)
-            GDTH_UNLOCK_HA((gdth_ha_str *)dev_id,flags);
-        gdth_next(hanum);
-        return IRQ_HANDLED;
-    } 
+        if (IStatus == ASYNCINDEX) {
+            TRACE2(("gdth_interrupt() async. event\n"));
+            gdth_async_event(hanum);
+            if (!gdth_polling)
+                GDTH_UNLOCK_HA((gdth_ha_str *)dev_id,flags);
+            gdth_next(hanum);
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
+            return IRQ_HANDLED;
+#else
+            return;             
+#endif
+        } 
 
-    if (IStatus == SPEZINDEX) {
-        TRACE2(("Service unknown or not initialized !\n"));
-        ha->dvr.size = sizeof(ha->dvr.eu.driver);
-        ha->dvr.eu.driver.ionode = hanum;
-        gdth_store_event(ha, ES_DRIVER, 4, &ha->dvr);
-        if (!gdth_polling)
-            GDTH_UNLOCK_HA((gdth_ha_str *)dev_id,flags);
-        return IRQ_HANDLED;
-    }
-    scp     = ha->cmd_tab[IStatus-2].cmnd;
-    Service = ha->cmd_tab[IStatus-2].service;
-    ha->cmd_tab[IStatus-2].cmnd = UNUSED_CMND;
-    if (scp == UNUSED_CMND) {
-        TRACE2(("gdth_interrupt() index to unused command (%d)\n",IStatus));
-        ha->dvr.size = sizeof(ha->dvr.eu.driver);
-        ha->dvr.eu.driver.ionode = hanum;
-        ha->dvr.eu.driver.index = IStatus;
-        gdth_store_event(ha, ES_DRIVER, 1, &ha->dvr);
-        if (!gdth_polling)
-            GDTH_UNLOCK_HA((gdth_ha_str *)dev_id,flags);
-        return IRQ_HANDLED;
-    }
-    if (scp == INTERNAL_CMND) {
-        TRACE(("gdth_interrupt() answer to internal command\n"));
+        if (IStatus == SPEZINDEX) {
+            TRACE2(("Service unknown or not initialized !\n"));
+            ha->dvr.size = sizeof(ha->dvr.eu.driver);
+            ha->dvr.eu.driver.ionode = hanum;
+            gdth_store_event(ha, ES_DRIVER, 4, &ha->dvr);
+            if (!gdth_polling)
+                GDTH_UNLOCK_HA((gdth_ha_str *)dev_id,flags);
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
+            return IRQ_HANDLED;
+#else
+            return;             
+#endif
+        }
+        scp     = ha->cmd_tab[IStatus-2].cmnd;
+        Service = ha->cmd_tab[IStatus-2].service;
+        ha->cmd_tab[IStatus-2].cmnd = UNUSED_CMND;
+        if (scp == UNUSED_CMND) {
+            TRACE2(("gdth_interrupt() index to unused command (%d)\n",IStatus));
+            ha->dvr.size = sizeof(ha->dvr.eu.driver);
+            ha->dvr.eu.driver.ionode = hanum;
+            ha->dvr.eu.driver.index = IStatus;
+            gdth_store_event(ha, ES_DRIVER, 1, &ha->dvr);
+            if (!gdth_polling)
+                GDTH_UNLOCK_HA((gdth_ha_str *)dev_id,flags);
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
+            return IRQ_HANDLED;
+#else
+            return;             
+#endif
+        }
+        if (scp == INTERNAL_CMND) {
+            TRACE(("gdth_interrupt() answer to internal command\n"));
+            if (!gdth_polling)
+                GDTH_UNLOCK_HA((gdth_ha_str *)dev_id,flags);
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
+            return IRQ_HANDLED;
+#else
+            return;             
+#endif
+        }
+
+        TRACE(("gdth_interrupt() sync. status\n"));
+        rval = gdth_sync_event(hanum,Service,IStatus,scp);
         if (!gdth_polling)
             GDTH_UNLOCK_HA((gdth_ha_str *)dev_id,flags);
-        return IRQ_HANDLED;
-    }
-
-    TRACE(("gdth_interrupt() sync. status\n"));
-    rval = gdth_sync_event(hanum,Service,IStatus,scp);
-    if (!gdth_polling)
-        GDTH_UNLOCK_HA((gdth_ha_str *)dev_id,flags);
-    if (rval == 2) {
-        gdth_putq(hanum,scp,scp->SCp.this_residual);
-    } else if (rval == 1) {
-#if LINUX_VERSION_CODE >= 0x02053C
-        GDTH_LOCK_SCSI_DONE(scp->device->host, flags);
-        scp->scsi_done(scp);
-        GDTH_UNLOCK_SCSI_DONE(scp->device->host, flags);
-#elif LINUX_VERSION_CODE >= 0x020503
-        GDTH_LOCK_SCSI_DONE(scp->host, flags);
-        scp->scsi_done(scp);
-        GDTH_UNLOCK_SCSI_DONE(scp->host, flags);
-#else
-        GDTH_LOCK_SCSI_DONE(flags);
-        scp->scsi_done(scp);
-        GDTH_UNLOCK_SCSI_DONE(flags);
+        if (rval == 2) {
+            gdth_putq(hanum,scp,scp->SCp.this_residual);
+        } else if (rval == 1) {
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
+            GDTH_LOCK_SCSI_DONE(scp->device->host, flags);
+            scp->scsi_done(scp);
+            GDTH_UNLOCK_SCSI_DONE(scp->device->host, flags);
+#else
+            GDTH_LOCK_SCSI_DONE(flags);
+            scp->scsi_done(scp);
+            GDTH_UNLOCK_SCSI_DONE(flags);
 #endif
+        }
+
+#ifdef INT_COAL
+        if (coalesced) {
+            /* go to the next status in the status buffer */
+            ++pcs;
+#ifdef GDTH_STATISTICS
+            ++act_int_coal;
+            if (act_int_coal > max_int_coal) {
+                max_int_coal = act_int_coal;
+                printk("GDT: max_int_coal = %d\n",(ushort)max_int_coal);
+            }
+#endif      
+            /* see if there is another status */
+            if (pcs->status == 0)    
+                /* Stop the coalesce loop */
+                next = FALSE;
+        }
+    } while (next);
+
+    /* coalescing only for new GDT_PCIMPR controllers available */      
+    if (ha->type == GDT_PCIMPR && coalesced) {
+        gdth_writeb(0xff, &dp6m_ptr->i960r.edoor_reg);
+        gdth_writeb(0, &dp6m_ptr->i960r.sema1_reg);
     }
+#endif
+
     gdth_next(hanum);
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
     return IRQ_HANDLED;
+#endif
 }
 
 static int gdth_sync_event(int hanum,int service,unchar index,Scsi_Cmnd *scp)
@@ -3579,10 +3845,11 @@
            service,ha->status));
 
     if (service == SCREENSERVICE) {
-        msg  = (gdth_msg_str *)ha->pscratch;
-        ha->scratch_busy = FALSE;
+        msg  = ha->pmsg;
         TRACE(("len: %d, answer: %d, ext: %d, alen: %d\n",
                msg->msg_len,msg->msg_answer,msg->msg_ext,msg->msg_alen));
+        if (msg->msg_len > MSGLEN+1)
+            msg->msg_len = MSGLEN+1;
         if (msg->msg_len)
             if (!(msg->msg_answer && msg->msg_ext)) {
                 msg->msg_text[msg->msg_len] = '\0';
@@ -3600,11 +3867,10 @@
             cmdp->BoardNode     = LOCALBOARD;
             cmdp->u.screen.reserved  = 0;
             cmdp->u.screen.su.msg.msg_handle= msg->msg_handle;
-            cmdp->u.screen.su.msg.msg_addr  = ha->scratch_phys;
-            ha->scratch_busy = TRUE;
+            cmdp->u.screen.su.msg.msg_addr  = ha->msg_phys;
             ha->cmd_offs_dpmem = 0;
             ha->cmd_len = GDTOFFSOF(gdth_cmd_str,u.screen.su.msg.msg_addr) 
-                + sizeof(ulong32);
+                + sizeof(ulong64);
             ha->cmd_cnt = 0;
             gdth_copy_command(hanum);
             gdth_release_event(hanum);
@@ -3635,11 +3901,10 @@
             cmdp->BoardNode     = LOCALBOARD;
             cmdp->u.screen.reserved  = 0;
             cmdp->u.screen.su.msg.msg_handle= msg->msg_handle;
-            cmdp->u.screen.su.msg.msg_addr  = ha->scratch_phys;
-            ha->scratch_busy = TRUE;
+            cmdp->u.screen.su.msg.msg_addr  = ha->msg_phys;
             ha->cmd_offs_dpmem = 0;
             ha->cmd_len = GDTOFFSOF(gdth_cmd_str,u.screen.su.msg.msg_addr) 
-                + sizeof(ulong32);
+                + sizeof(ulong64);
             ha->cmd_cnt = 0;
             gdth_copy_command(hanum);
             gdth_release_event(hanum);
@@ -3648,7 +3913,7 @@
         printk("\n");
 
     } else {
-#if LINUX_VERSION_CODE >= 0x02053C
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
         b = virt_ctr ? NUMDATA(scp->device->host)->busnum : scp->device->channel;
         t = scp->device->id;
 #else
@@ -3666,16 +3931,20 @@
             /* retry */
             return 2;
         }
-#if LINUX_VERSION_CODE >= 0x020400
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,13)
         if (scp->SCp.Status == GDTH_MAP_SG) 
             pci_unmap_sg(ha->pdev,scp->request_buffer,
                          scp->use_sg,scp->SCp.Message);
         else if (scp->SCp.Status == GDTH_MAP_SINGLE) 
-            pci_unmap_single(ha->pdev,scp->SCp.dma_handle,
-                         scp->request_bufflen,scp->SCp.Message);
-        if (scp->SCp.buffer) 
-            pci_unmap_single(ha->pdev,(dma_addr_t)scp->SCp.buffer,
-						16,PCI_DMA_FROMDEVICE);
+            pci_unmap_page(ha->pdev,scp->SCp.dma_handle,
+                           scp->request_bufflen,scp->SCp.Message);
+        if (scp->SCp.buffer) {
+            dma_addr_t addr;
+            addr = (dma_addr_t)(ulong32)scp->SCp.buffer;
+            if (scp->host_scribble)
+                addr += (dma_addr_t)((ulong64)(ulong32)scp->host_scribble << 32);               
+            pci_unmap_page(ha->pdev,addr,16,PCI_DMA_FROMDEVICE);
+        }
 #endif
         if (ha->status == S_OK) {
             scp->SCp.Status = S_OK;
@@ -3754,10 +4023,7 @@
                     scp->sense_buffer[2] = NOT_READY;
                     scp->result = (DID_OK << 16) | (CHECK_CONDITION << 1);
                 }
-#if LINUX_VERSION_CODE >= 0x010300
-                if (scp->done != gdth_scsi_done)
-#endif  
-                {
+                if (scp->done != gdth_scsi_done) {
                     ha->dvr.size = sizeof(ha->dvr.eu.sync);
                     ha->dvr.eu.sync.ionode  = hanum;
                     ha->dvr.eu.sync.service = service;
@@ -3946,13 +4212,11 @@
 static int gdth_async_event(int hanum)
 {
     gdth_ha_str *ha;
-    gdth_msg_str *msg;
     gdth_cmd_str *cmdp;
     int cmd_index;
 
     ha  = HADATA(gdth_ctr_tab[hanum]);
     cmdp= ha->pccb;
-    msg = (gdth_msg_str *)ha->pscratch;
     TRACE2(("gdth_async_event() ha %d serv %d\n",
             hanum,ha->service));
 
@@ -3968,11 +4232,10 @@
             cmdp->BoardNode     = LOCALBOARD;
             cmdp->u.screen.reserved  = 0;
             cmdp->u.screen.su.msg.msg_handle= MSG_INV_HANDLE;
-            cmdp->u.screen.su.msg.msg_addr  = ha->scratch_phys;
-            ha->scratch_busy = TRUE;
+            cmdp->u.screen.su.msg.msg_addr  = ha->msg_phys;
             ha->cmd_offs_dpmem = 0;
             ha->cmd_len = GDTOFFSOF(gdth_cmd_str,u.screen.su.msg.msg_addr) 
-                + sizeof(ulong32);
+                + sizeof(ulong64);
             ha->cmd_cnt = 0;
             gdth_copy_command(hanum);
             if (ha->type == GDT_EISA)
@@ -4192,10 +4455,11 @@
 GDTH_INITFUNC(int, gdth_detect(Scsi_Host_Template *shtp))
 {
     struct Scsi_Host *shp;
+    gdth_pci_str pcistr[MAXHA];
     gdth_ha_str *ha;
     ulong32 isa_bios;
     ushort eisa_slot;
-    int i,hanum,cnt,ctr;
+    int i,hanum,cnt,ctr,err;
     unchar b;
     
  
@@ -4218,11 +4482,11 @@
     TRACE(("gdth_detect()\n"));
 
     if (disable) {
-        printk("GDT: Controller driver disabled from command line !\n");
+        printk("GDT-HA: Controller driver disabled from command line !\n");
         return 0;
     }
 
-    printk("GDT: Storage RAID Controller Driver. Version: %s \n",GDTH_VERSION_STR);
+    printk("GDT-HA: Storage RAID Controller Driver. Version: %s \n",GDTH_VERSION_STR);
     /* initializations */
     gdth_polling = TRUE; b = 0;
     gdth_clear_events();
@@ -4232,6 +4496,7 @@
         /* scanning for controllers, at first: ISA controller */
         for (isa_bios=0xc8000UL; isa_bios<=0xd8000UL; isa_bios+=0x8000UL) {
             dma_addr_t scratch_dma_handle;
+            scratch_dma_handle = 0;
 
             if (gdth_ctr_count >= MAXHA) 
                 break;
@@ -4252,23 +4517,14 @@
                 printk("Configuring GDT-ISA HA at BIOS 0x%05X IRQ %u DRQ %u\n",
                        isa_bios,ha->irq,ha->drq);
 
-#if LINUX_VERSION_CODE >= 0x010346 
-                if (request_irq(ha->irq,gdth_interrupt,SA_INTERRUPT,"gdth",ha))
-#else
-                if (request_irq(ha->irq,gdth_interrupt,SA_INTERRUPT,"gdth")) 
-#endif
-                {
+                if (request_irq(ha->irq,gdth_interrupt,SA_INTERRUPT,"gdth",ha)) {
                     printk("GDT-ISA: Unable to allocate IRQ\n");
                     scsi_unregister(shp);
                     continue;
                 }
                 if (request_dma(ha->drq,"gdth")) {
                     printk("GDT-ISA: Unable to allocate DMA channel\n");
-#if LINUX_VERSION_CODE >= 0x010346 
                     free_irq(ha->irq,ha);
-#else
-                    free_irq(ha->irq);
-#endif
                     scsi_unregister(shp);
                     continue;
                 }
@@ -4286,15 +4542,34 @@
 
                 ha->pccb = CMDDATA(shp);
                 ha->ccb_phys = 0L;
-#if LINUX_VERSION_CODE >= 0x020400
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0)
                 ha->pdev = NULL;
                 ha->pscratch = pci_alloc_consistent(ha->pdev, GDTH_SCRATCH, 
                                                     &scratch_dma_handle);
-                ha->scratch_phys = (ulong32)scratch_dma_handle;
+                ha->scratch_phys = scratch_dma_handle;
+                ha->pmsg = pci_alloc_consistent(ha->pdev, sizeof(gdth_msg_str), 
+                                                &scratch_dma_handle);
+                ha->msg_phys = scratch_dma_handle;
+#ifdef INT_COAL
+                ha->coal_stat = (gdth_coal_status *)
+                    pci_alloc_consistent(ha->pdev, sizeof(gdth_coal_status) *
+                        MAXOFFSETS, &scratch_dma_handle);
+                ha->coal_stat_phys = scratch_dma_handle;
+#endif
 #else
                 ha->pscratch = scsi_init_malloc(GDTH_SCRATCH, GFP_ATOMIC | GFP_DMA);
                 if (ha->pscratch)
                     ha->scratch_phys = virt_to_bus(ha->pscratch);
+                ha->pmsg = scsi_init_malloc(sizeof(gdth_msg_str), GFP_ATOMIC | GFP_DMA);
+                if (ha->pmsg)
+                    ha->msg_phys = virt_to_bus(ha->pmsg);
+#ifdef INT_COAL
+                ha->coal_stat = 
+                    scsi_init_malloc(sizeof(gdth_coal_status) * MAXOFFSETS, 
+                                     GFP_ATOMIC | GFP_DMA);
+                if (ha->coal_stat)
+                    ha->coal_stat_phys = virt_to_bus(ha->coal_stat);
+#endif
 #endif
                 ha->scratch_busy = FALSE;
                 ha->req_first = NULL;
@@ -4305,23 +4580,36 @@
                     ha->cmd_tab[i].cmnd = UNUSED_CMND;
                 ha->scan_mode = rescan ? 0x10 : 0;
 
-                if (ha->pscratch == NULL || !gdth_search_drives(hanum)) {
+                if (ha->pscratch == NULL || ha->pmsg == NULL || 
+                    !gdth_search_drives(hanum)) {
                     printk("GDT-ISA: Error during device scan\n");
                     --gdth_ctr_count;
                     --gdth_ctr_vcount;
-                    if (ha->pscratch != NULL) {
-#if LINUX_VERSION_CODE >= 0x020400
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0)
+#ifdef INT_COAL
+                    if (ha->coal_stat)
+                        pci_free_consistent(ha->pdev, sizeof(gdth_coal_status) *
+                                            MAXOFFSETS, ha->coal_stat,
+                                            ha->coal_stat_phys);
+#endif
+                    if (ha->pscratch)
                         pci_free_consistent(ha->pdev, GDTH_SCRATCH, 
                                             ha->pscratch, ha->scratch_phys);
-#else
+                    if (ha->pmsg)
+                        pci_free_consistent(ha->pdev, sizeof(gdth_msg_str), 
+                                            ha->pmsg, ha->msg_phys);
+#else
+#ifdef INT_COAL
+                    if (ha->coal_stat)
+                        scsi_init_free((void *)ha->coal_stat, 
+                                       sizeof(gdth_coal_status) * MAXOFFSETS);
+#endif
+                    if (ha->pscratch)
                         scsi_init_free((void *)ha->pscratch, GDTH_SCRATCH);
+                    if (ha->pmsg)
+                        scsi_init_free((void *)ha->pmsg, sizeof(gdth_msg_str));
 #endif
-                    }
-#if LINUX_VERSION_CODE >= 0x010346 
                     free_irq(ha->irq,ha);
-#else
-                    free_irq(ha->irq);
-#endif
                     scsi_unregister(shp);
                     continue;
                 }
@@ -4329,13 +4617,18 @@
                     hdr_channel = ha->bus_cnt;
                 ha->virt_bus = hdr_channel;
 
-#if LINUX_VERSION_CODE >= 0x020000
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0)
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,20) && \
+    LINUX_VERSION_CODE < KERNEL_VERSION(2,6,0)
+                shp->highmem_io  = 0;
+#endif
+                if (ha->cache_feat & ha->raw_feat & ha->screen_feat & GDT_64BIT) 
+                    shp->max_cmd_len = 16;
+#endif
                 shp->max_id      = ha->tid_cnt;
                 shp->max_lun     = MAXLUN;
                 shp->max_channel = virt_ctr ? 0 : ha->bus_cnt;
-                if (virt_ctr)  
-#endif
-                {
+                if (virt_ctr) {
                     virt_ctr = 1;
                     /* register addit. SCSI channels as virtual controllers */
                     for (b = 1; b < ha->bus_cnt + 1; ++b) {
@@ -4358,6 +4651,7 @@
         /* scanning for EISA controllers */
         for (eisa_slot=0x1000; eisa_slot<=0x8000; eisa_slot+=0x1000) {
             dma_addr_t scratch_dma_handle;
+            scratch_dma_handle = 0;
 
             if (gdth_ctr_count >= MAXHA) 
                 break;
@@ -4373,14 +4667,9 @@
                 }
                 /* controller found and initialized */
                 printk("Configuring GDT-EISA HA at Slot %d IRQ %u\n",
-                        eisa_slot>>12,ha->irq);
+                       eisa_slot>>12,ha->irq);
 
-#if LINUX_VERSION_CODE >= 0x010346 
-                if (request_irq(ha->irq,gdth_interrupt,SA_INTERRUPT,"gdth",ha))
-#else
-                if (request_irq(ha->irq,gdth_interrupt,SA_INTERRUPT,"gdth")) 
-#endif
-                {
+                if (request_irq(ha->irq,gdth_interrupt,SA_INTERRUPT,"gdth",ha)) {
                     printk("GDT-EISA: Unable to allocate IRQ\n");
                     scsi_unregister(shp);
                     continue;
@@ -4399,11 +4688,20 @@
 
                 ha->pccb = CMDDATA(shp);
                 ha->ccb_phys = 0L; 
-#if LINUX_VERSION_CODE >= 0x020400
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0)
                 ha->pdev = NULL;
                 ha->pscratch = pci_alloc_consistent(ha->pdev, GDTH_SCRATCH, 
                                                     &scratch_dma_handle);
-                ha->scratch_phys = (ulong32) scratch_dma_handle;
+                ha->scratch_phys = scratch_dma_handle;
+                ha->pmsg = pci_alloc_consistent(ha->pdev, sizeof(gdth_msg_str), 
+                                                &scratch_dma_handle);
+                ha->msg_phys = scratch_dma_handle;
+#ifdef INT_COAL
+                ha->coal_stat = (gdth_coal_status *)
+                    pci_alloc_consistent(ha->pdev, sizeof(gdth_coal_status) *
+                                         MAXOFFSETS, &scratch_dma_handle);
+                ha->coal_stat_phys = scratch_dma_handle;
+#endif
                 ha->ccb_phys = 
                     pci_map_single(ha->pdev,ha->pccb,
                                    sizeof(gdth_cmd_str),PCI_DMA_BIDIRECTIONAL);
@@ -4411,6 +4709,16 @@
                 ha->pscratch = scsi_init_malloc(GDTH_SCRATCH, GFP_ATOMIC | GFP_DMA);
                 if (ha->pscratch)
                     ha->scratch_phys = virt_to_bus(ha->pscratch);
+                ha->pmsg = scsi_init_malloc(sizeof(gdth_msg_str), GFP_ATOMIC | GFP_DMA);
+                if (ha->pmsg)
+                    ha->msg_phys = virt_to_bus(ha->pmsg);
+#ifdef INT_COAL
+                ha->coal_stat = 
+                    scsi_init_malloc(sizeof(gdth_coal_status) * MAXOFFSETS, 
+                                     GFP_ATOMIC | GFP_DMA);
+                if (ha->coal_stat)
+                    ha->coal_stat_phys = virt_to_bus(ha->coal_stat);
+#endif
                 ha->ccb_phys = virt_to_bus(ha->pccb);
 #endif
                 ha->scratch_busy = FALSE;
@@ -4419,28 +4727,42 @@
                 if (max_ids > 0 && max_ids < ha->tid_cnt)
                     ha->tid_cnt = max_ids;
                 for (i=0; i<GDTH_MAXCMDS; ++i)
-                     ha->cmd_tab[i].cmnd = UNUSED_CMND;
+                    ha->cmd_tab[i].cmnd = UNUSED_CMND;
                 ha->scan_mode = rescan ? 0x10 : 0;
 
-                if (ha->pscratch == NULL || !gdth_search_drives(hanum)) {
+                if (ha->pscratch == NULL || ha->pmsg == NULL || 
+                    !gdth_search_drives(hanum)) {
                     printk("GDT-EISA: Error during device scan\n");
                     --gdth_ctr_count;
                     --gdth_ctr_vcount;
-                    if (ha->pscratch != NULL) {
-#if LINUX_VERSION_CODE >= 0x020400
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0)
+#ifdef INT_COAL
+                    if (ha->coal_stat)
+                        pci_free_consistent(ha->pdev, sizeof(gdth_coal_status) *
+                                            MAXOFFSETS, ha->coal_stat,
+                                            ha->coal_stat_phys);
+#endif
+                    if (ha->pscratch)
                         pci_free_consistent(ha->pdev, GDTH_SCRATCH, 
                                             ha->pscratch, ha->scratch_phys);
+                    if (ha->pmsg)
+                        pci_free_consistent(ha->pdev, sizeof(gdth_msg_str), 
+                                            ha->pmsg, ha->msg_phys);
+                    if (ha->ccb_phys)
                         pci_unmap_single(ha->pdev,ha->ccb_phys,
-                                         sizeof(gdth_cmd_str),PCI_DMA_BIDIRECTIONAL);
+                                        sizeof(gdth_cmd_str),PCI_DMA_BIDIRECTIONAL);
 #else
+#ifdef INT_COAL
+                    if (ha->coal_stat)
+                        scsi_init_free((void *)ha->coal_stat, 
+                                       sizeof(gdth_coal_status) * MAXOFFSETS);
+#endif
+                    if (ha->pscratch)
                         scsi_init_free((void *)ha->pscratch, GDTH_SCRATCH);
+                    if (ha->pmsg)
+                        scsi_init_free((void *)ha->pmsg, sizeof(gdth_msg_str));
 #endif
-                    }
-#if LINUX_VERSION_CODE >= 0x010346 
                     free_irq(ha->irq,ha);
-#else
-                    free_irq(ha->irq);
-#endif
                     scsi_unregister(shp);
                     continue;
                 }
@@ -4448,13 +4770,18 @@
                     hdr_channel = ha->bus_cnt;
                 ha->virt_bus = hdr_channel;
 
-#if LINUX_VERSION_CODE >= 0x020000
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0)
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,20) && \
+    LINUX_VERSION_CODE < KERNEL_VERSION(2,6,0)
+                shp->highmem_io  = 0;
+#endif
+                if (ha->cache_feat & ha->raw_feat & ha->screen_feat & GDT_64BIT) 
+                    shp->max_cmd_len = 16;
+#endif
                 shp->max_id      = ha->tid_cnt;
                 shp->max_lun     = MAXLUN;
                 shp->max_channel = virt_ctr ? 0 : ha->bus_cnt;
-                if (virt_ctr)  
-#endif
-                {
+                if (virt_ctr) {
                     virt_ctr = 1;
                     /* register addit. SCSI channels as virtual controllers */
                     for (b = 1; b < ha->bus_cnt + 1; ++b) {
@@ -4475,124 +4802,173 @@
     }
 
     /* scanning for PCI controllers */
-#if LINUX_VERSION_CODE < 0x2015C
-    if (pcibios_present())
-#endif
-    {
-        gdth_pci_str pcistr[MAXHA];
+    cnt = gdth_search_pci(pcistr);
+    printk("GDT-HA: Found %d PCI Storage RAID Controllers\n",cnt);
+    gdth_sort_pci(pcistr,cnt);
+    for (ctr = 0; ctr < cnt; ++ctr) {
+        dma_addr_t scratch_dma_handle;
+        scratch_dma_handle = 0;
 
-        cnt = gdth_search_pci(pcistr);
-        printk("GDT: Found %d PCI Storage RAID Controllers\n",cnt);
-        gdth_sort_pci(pcistr,cnt);
-        for (ctr = 0; ctr < cnt; ++ctr) {
-            dma_addr_t scratch_dma_handle;
+        if (gdth_ctr_count >= MAXHA)
+            break;
+        shp = scsi_register(shtp,sizeof(gdth_ext_str));
+        if (shp == NULL)
+            continue;  
+
+        ha = HADATA(shp);
+        if (!gdth_init_pci(&pcistr[ctr],ha)) {
+            scsi_unregister(shp);
+            continue;
+        }
+        /* controller found and initialized */
+        printk("Configuring GDT-PCI HA at %d/%d IRQ %u\n",
+               pcistr[ctr].bus,PCI_SLOT(pcistr[ctr].device_fn),ha->irq);
 
-            if (gdth_ctr_count >= MAXHA)
-                break;
-            shp = scsi_register(shtp,sizeof(gdth_ext_str));
-            if (shp == NULL)
-                continue;  
-
-            ha = HADATA(shp);
-            if (!gdth_init_pci(&pcistr[ctr],ha)) {
-                scsi_unregister(shp);
-                continue;
-            }
-            /* controller found and initialized */
-            printk("GDT CTR%d: Configuring GDT-PCI HA at %d/%d IRQ %u\n",
-                   ctr,pcistr[ctr].bus,PCI_SLOT(pcistr[ctr].device_fn),ha->irq);
-
-#if LINUX_VERSION_CODE >= 0x010346 
-            if (request_irq(ha->irq, gdth_interrupt,
-                            SA_INTERRUPT|SA_SHIRQ, "gdth", ha))
-#else
-            if (request_irq(ha->irq, gdth_interrupt,
-                            SA_INTERRUPT|SA_SHIRQ, "gdth")) 
-#endif
-            {
-                printk("GDT-PCI: Unable to allocate IRQ\n");
-                scsi_unregister(shp);
-                continue;
-            }
-            shp->unchecked_isa_dma = 0;
-            shp->irq = ha->irq;
-            shp->dma_channel = 0xff;
-            hanum = gdth_ctr_count;
-            gdth_ctr_tab[gdth_ctr_count++] = shp;
-            gdth_ctr_vtab[gdth_ctr_vcount++] = shp;
-
-            NUMDATA(shp)->hanum = (ushort)hanum;
-            NUMDATA(shp)->busnum= 0;
-
-            ha->pccb = CMDDATA(shp);
-            ha->ccb_phys = 0L;
-#if LINUX_VERSION_CODE >= 0x020400
-            ha->pscratch = pci_alloc_consistent(ha->pdev, GDTH_SCRATCH, 
-                                                &scratch_dma_handle);
-            ha->scratch_phys = (ulong32)scratch_dma_handle;
-#else
-            ha->pscratch = scsi_init_malloc(GDTH_SCRATCH, GFP_ATOMIC | GFP_DMA);
-            if (ha->pscratch)
-                ha->scratch_phys = virt_to_bus(ha->pscratch);
-#endif
-            ha->scratch_busy = FALSE;
-            ha->req_first = NULL;
-            ha->tid_cnt = pcistr[ctr].device_id >= 0x200 ? MAXID : MAX_HDRIVES;
-            if (max_ids > 0 && max_ids < ha->tid_cnt)
-                ha->tid_cnt = max_ids;
-            for (i=0; i<GDTH_MAXCMDS; ++i)
-                ha->cmd_tab[i].cmnd = UNUSED_CMND;
-            ha->scan_mode = rescan ? 0x10 : 0;
-
-            if (ha->pscratch == NULL || !gdth_search_drives(hanum)) {
-                printk("GDT-PCI: Error during device scan\n");
-                --gdth_ctr_count;
-                --gdth_ctr_vcount;
-                if (ha->pscratch != NULL) {
-#if LINUX_VERSION_CODE >= 0x020400
-                    pci_free_consistent(ha->pdev, GDTH_SCRATCH, 
-                                        ha->pscratch, ha->scratch_phys);
-#else
-                    scsi_init_free((void *)ha->pscratch, GDTH_SCRATCH);
+        if (request_irq(ha->irq, gdth_interrupt,
+                        SA_INTERRUPT|SA_SHIRQ, "gdth", ha))
+        {
+            printk("GDT-PCI: Unable to allocate IRQ\n");
+            scsi_unregister(shp);
+            continue;
+        }
+        shp->unchecked_isa_dma = 0;
+        shp->irq = ha->irq;
+        shp->dma_channel = 0xff;
+        hanum = gdth_ctr_count;
+        gdth_ctr_tab[gdth_ctr_count++] = shp;
+        gdth_ctr_vtab[gdth_ctr_vcount++] = shp;
+
+        NUMDATA(shp)->hanum = (ushort)hanum;
+        NUMDATA(shp)->busnum= 0;
+
+        ha->pccb = CMDDATA(shp);
+        ha->ccb_phys = 0L;
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0)
+        ha->pscratch = pci_alloc_consistent(ha->pdev, GDTH_SCRATCH, 
+                                            &scratch_dma_handle);
+        ha->scratch_phys = scratch_dma_handle;
+        ha->pmsg = pci_alloc_consistent(ha->pdev, sizeof(gdth_msg_str), 
+                                        &scratch_dma_handle);
+        ha->msg_phys = scratch_dma_handle;
+#ifdef INT_COAL
+        ha->coal_stat = (gdth_coal_status *)
+            pci_alloc_consistent(ha->pdev, sizeof(gdth_coal_status) *
+                                 MAXOFFSETS, &scratch_dma_handle);
+        ha->coal_stat_phys = scratch_dma_handle;
+#endif
+#else
+        ha->pscratch = scsi_init_malloc(GDTH_SCRATCH, GFP_ATOMIC | GFP_DMA);
+        if (ha->pscratch)
+            ha->scratch_phys = virt_to_bus(ha->pscratch);
+        ha->pmsg = scsi_init_malloc(sizeof(gdth_msg_str), GFP_ATOMIC | GFP_DMA);
+        if (ha->pmsg)
+            ha->msg_phys = virt_to_bus(ha->pmsg);
+#ifdef INT_COAL
+        ha->coal_stat = 
+            scsi_init_malloc(sizeof(gdth_coal_status) * MAXOFFSETS, 
+                             GFP_ATOMIC | GFP_DMA);
+        if (ha->coal_stat)
+            ha->coal_stat_phys = virt_to_bus(ha->coal_stat);
 #endif
-                }
-#if LINUX_VERSION_CODE >= 0x010346 
-                free_irq(ha->irq,ha);
-#else
-                free_irq(ha->irq);
 #endif
-                scsi_unregister(shp);
-                continue;
-            }
+        ha->scratch_busy = FALSE;
+        ha->req_first = NULL;
+        ha->tid_cnt = pcistr[ctr].device_id >= 0x200 ? MAXID : MAX_HDRIVES;
+        if (max_ids > 0 && max_ids < ha->tid_cnt)
+            ha->tid_cnt = max_ids;
+        for (i=0; i<GDTH_MAXCMDS; ++i)
+            ha->cmd_tab[i].cmnd = UNUSED_CMND;
+        ha->scan_mode = rescan ? 0x10 : 0;
+
+        err = FALSE;
+        if (ha->pscratch == NULL || ha->pmsg == NULL || 
+            !gdth_search_drives(hanum)) {
+            err = TRUE;
+        } else {
             if (hdr_channel < 0 || hdr_channel > ha->bus_cnt)
                 hdr_channel = ha->bus_cnt;
             ha->virt_bus = hdr_channel;
 
-#if LINUX_VERSION_CODE >= 0x020000
-            shp->max_id      = ha->tid_cnt;
-            shp->max_lun     = MAXLUN;
-            shp->max_channel = virt_ctr ? 0 : ha->bus_cnt;
-            if (virt_ctr)  
-#endif
-            {
-                virt_ctr = 1;
-                /* register addit. SCSI channels as virtual controllers */
-                for (b = 1; b < ha->bus_cnt + 1; ++b) {
-                    shp = scsi_register(shtp,sizeof(gdth_num_str));
-                    shp->unchecked_isa_dma = 0;
-                    shp->irq = ha->irq;
-                    shp->dma_channel = 0xff;
-                    gdth_ctr_vtab[gdth_ctr_vcount++] = shp;
-                    NUMDATA(shp)->hanum = (ushort)hanum;
-                    NUMDATA(shp)->busnum = b;
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0)
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
+            scsi_set_device(shp, &pcistr[ctr].pdev->dev);
+#else
+            scsi_set_pci_device(shp, pcistr[ctr].pdev);
+#endif
+            if (!(ha->cache_feat & ha->raw_feat & ha->screen_feat &GDT_64BIT)||
+                /* 64-bit DMA only supported from FW >= x.43 */
+                (!ha->dma64_support)) {
+                if (pci_set_dma_mask(pcistr[ctr].pdev, 0xffffffff)) {
+                    printk(KERN_WARNING "GDT-PCI %d: Unable to set 32-bit DMA\n", hanum);
+                    err = TRUE;
+                }
+            } else {
+                shp->max_cmd_len = 16;
+                if (!pci_set_dma_mask(pcistr[ctr].pdev, 0xffffffffffffffffULL)) {
+                    printk("GDT-PCI %d: 64-bit DMA enabled\n", hanum);
+                } else if (pci_set_dma_mask(pcistr[ctr].pdev, 0xffffffff)) {
+                    printk(KERN_WARNING "GDT-PCI %d: Unable to set 64/32-bit DMA\n", hanum);
+                    err = TRUE;
                 }
-            }  
+            }
+#endif
+        }
 
-            GDTH_INIT_LOCK_HA(ha);
-            gdth_enable_int(hanum);
+        if (err) {
+            printk("GDT-PCI %d: Error during device scan\n", hanum);
+            --gdth_ctr_count;
+            --gdth_ctr_vcount;
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0)
+#ifdef INT_COAL
+            if (ha->coal_stat)
+                pci_free_consistent(ha->pdev, sizeof(gdth_coal_status) *
+                                    MAXOFFSETS, ha->coal_stat,
+                                    ha->coal_stat_phys);
+#endif
+            if (ha->pscratch)
+                pci_free_consistent(ha->pdev, GDTH_SCRATCH, 
+                                    ha->pscratch, ha->scratch_phys);
+            if (ha->pmsg)
+                pci_free_consistent(ha->pdev, sizeof(gdth_msg_str), 
+                                    ha->pmsg, ha->msg_phys);
+#else
+#ifdef INT_COAL
+            if (ha->coal_stat)
+                scsi_init_free((void *)ha->coal_stat, 
+                               sizeof(gdth_coal_status) * MAXOFFSETS);
+#endif
+            if (ha->pscratch)
+                scsi_init_free((void *)ha->pscratch, GDTH_SCRATCH);
+            if (ha->pmsg)
+                scsi_init_free((void *)ha->pmsg, sizeof(gdth_msg_str));
+#endif
+            free_irq(ha->irq,ha);
+            scsi_unregister(shp);
+            continue;
         }
-    }
 
+        shp->max_id      = ha->tid_cnt;
+        shp->max_lun     = MAXLUN;
+        shp->max_channel = virt_ctr ? 0 : ha->bus_cnt;
+        if (virt_ctr) {
+            virt_ctr = 1;
+            /* register addit. SCSI channels as virtual controllers */
+            for (b = 1; b < ha->bus_cnt + 1; ++b) {
+                shp = scsi_register(shtp,sizeof(gdth_num_str));
+                shp->unchecked_isa_dma = 0;
+                shp->irq = ha->irq;
+                shp->dma_channel = 0xff;
+                gdth_ctr_vtab[gdth_ctr_vcount++] = shp;
+                NUMDATA(shp)->hanum = (ushort)hanum;
+                NUMDATA(shp)->busnum = b;
+            }
+        }  
+
+
+        GDTH_INIT_LOCK_HA(ha);
+        gdth_enable_int(hanum);
+    }
+    
     TRACE2(("gdth_detect() %d controller detected\n",gdth_ctr_count));
     if (gdth_ctr_count > 0) {
 #ifdef GDTH_STATISTICS
@@ -4603,12 +4979,8 @@
         gdth_timer.function = gdth_timeout;
         add_timer(&gdth_timer);
 #endif
-#ifdef GDTH_IOCTL_CHRDEV
         major = register_chrdev(0,"gdth",&gdth_fops);
-#endif
-#if LINUX_VERSION_CODE >= 0x020100
         register_reboot_notifier(&gdth_notifier);
-#endif
     }
     gdth_polling = FALSE;
     return gdth_ctr_vcount;
@@ -4624,30 +4996,47 @@
     if (NUMDATA(shp)->busnum == 0) {
         hanum = NUMDATA(shp)->hanum;
         ha    = HADATA(gdth_ctr_tab[hanum]);
-#if LINUX_VERSION_CODE >= 0x010300
-        gdth_flush(hanum);
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0)
+        if (ha->sdev) {
+            scsi_free_host_dev(ha->sdev);
+            ha->sdev = NULL;
+        }
 #endif
+        gdth_flush(hanum);
 
         if (shp->irq) {
-#if LINUX_VERSION_CODE >= 0x010346
             free_irq(shp->irq,ha);
-#else
-            free_irq(shp->irq);
-#endif
         }
 #ifndef __ia64__
         if (shp->dma_channel != 0xff) {
             free_dma(shp->dma_channel);
         }
 #endif
-#if LINUX_VERSION_CODE >= 0x020400
-        pci_free_consistent(ha->pdev, GDTH_SCRATCH, 
-            ha->pscratch, ha->scratch_phys);
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0)
+#ifdef INT_COAL
+        if (ha->coal_stat)
+            pci_free_consistent(ha->pdev, sizeof(gdth_coal_status) *
+                                MAXOFFSETS, ha->coal_stat, ha->coal_stat_phys);
+#endif
+        if (ha->pscratch)
+            pci_free_consistent(ha->pdev, GDTH_SCRATCH, 
+                                ha->pscratch, ha->scratch_phys);
+        if (ha->pmsg)
+            pci_free_consistent(ha->pdev, sizeof(gdth_msg_str), 
+                                ha->pmsg, ha->msg_phys);
         if (ha->ccb_phys)
             pci_unmap_single(ha->pdev,ha->ccb_phys,
                              sizeof(gdth_cmd_str),PCI_DMA_BIDIRECTIONAL);
 #else
-        scsi_init_free((void *)ha->pscratch, GDTH_SCRATCH);
+#ifdef INT_COAL
+        if (ha->coal_stat)
+            scsi_init_free((void *)ha->coal_stat, 
+                           sizeof(gdth_coal_status) * MAXOFFSETS);
+#endif
+        if (ha->pscratch)
+            scsi_init_free((void *)ha->pscratch, GDTH_SCRATCH);
+        if (ha->pmsg)
+            scsi_init_free((void *)ha->pmsg, sizeof(gdth_msg_str));
 #endif
         gdth_ctr_released++;
         TRACE2(("gdth_release(): HA %d of %d\n", 
@@ -4657,12 +5046,8 @@
 #ifdef GDTH_STATISTICS
             del_timer(&gdth_timer);
 #endif
-#ifdef GDTH_IOCTL_CHRDEV
             unregister_chrdev(major,"gdth");
-#endif
-#if LINUX_VERSION_CODE >= 0x020100
             unregister_reboot_notifier(&gdth_notifier);
-#endif
         }
     }
 
@@ -4715,6 +5100,7 @@
     return ((const char *)ha->binfo.type_string);
 }
 
+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,4,0)
 /* old error handling */
 int gdth_abort(Scsi_Cmnd *scp)
 {
@@ -4722,17 +5108,13 @@
     return SCSI_ABORT_SNOOZE;
 }
 
-#if LINUX_VERSION_CODE >= 0x010346
 int gdth_reset(Scsi_Cmnd *scp, unsigned int reset_flags)
-#else
-int gdth_reset(Scsi_Cmnd *scp)
-#endif
 {
     TRACE2(("gdth_reset()\n"));
     return SCSI_RESET_PUNT;
 }
+#endif
 
-#if LINUX_VERSION_CODE >= 0x02015F
 /* new error handling */
 int gdth_eh_abort(Scsi_Cmnd *scp)
 {
@@ -4755,7 +5137,7 @@
     unchar b;
 
     TRACE2(("gdth_eh_bus_reset()\n"));
-#if LINUX_VERSION_CODE >= 0x02053C
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
     hanum = NUMDATA(scp->device->host)->hanum;
     b = virt_ctr ? NUMDATA(scp->device->host)->busnum : scp->device->channel;
 #else
@@ -4768,7 +5150,7 @@
     GDTH_LOCK_HA(ha, flags);
     for (i = 0; i < GDTH_MAXCMDS; ++i) {
         cmnd = ha->cmd_tab[i].cmnd;
-#if LINUX_VERSION_CODE >= 0x02053C
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
         if (!SPECIAL_SCP(cmnd) && cmnd->device->channel == b)
 #else
         if (!SPECIAL_SCP(cmnd) && cmnd->channel == b)
@@ -4813,15 +5195,12 @@
     TRACE2(("gdth_eh_host_reset()\n"));
     return FAILED;
 }
-#endif
 
 
-#if LINUX_VERSION_CODE >= 0x020503
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
 int gdth_bios_param(struct scsi_device *sdev,struct block_device *bdev,sector_t cap,int *ip)
-#elif LINUX_VERSION_CODE >= 0x010300
-int gdth_bios_param(Disk *disk,kdev_t dev,int *ip)
 #else
-int gdth_bios_param(Disk *disk,int dev,int *ip)
+int gdth_bios_param(Disk *disk,kdev_t dev,int *ip)
 #endif
 {
     unchar b, t;
@@ -4830,7 +5209,7 @@
     struct scsi_device *sd;
     unsigned capacity;
 
-#if LINUX_VERSION_CODE >= 0x020503
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
     sd = sdev;
     capacity = cap;
 #else
@@ -4872,7 +5251,7 @@
     scp->SCp.sent_command = -1;
     scp->SCp.Status = GDTH_MAP_NONE;
     scp->SCp.buffer = (struct scatterlist *)NULL;
-#if LINUX_VERSION_CODE >= 0x02053C
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
     hanum = NUMDATA(scp->device->host)->hanum;
 #else
     hanum = NUMDATA(scp->host)->hanum;
@@ -4882,19 +5261,28 @@
 #endif
 
     priority = DEFAULT_PRI;
-#if LINUX_VERSION_CODE >= 0x010300
     if (scp->done == gdth_scsi_done)
         priority = scp->SCp.this_residual;
-#endif
     gdth_update_timeout(hanum, scp, scp->timeout_per_command * 6);
     gdth_putq( hanum, scp, priority );
     gdth_next( hanum );
     return 0;
 }
 
-#ifdef GDTH_IOCTL_CHRDEV
+
 static int gdth_open(struct inode *inode, struct file *filep)
 {
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0)
+    gdth_ha_str *ha;
+    int i;
+
+    for (i = 0; i < gdth_ctr_count; i++) {
+        ha = HADATA(gdth_ctr_tab[i]);
+        if (!ha->sdev)
+            ha->sdev = scsi_get_host_dev(gdth_ctr_tab[i]);
+    }
+#endif
+
     TRACE(("gdth_open()\n"));
     return 0;
 }
@@ -4907,537 +5295,578 @@
 
 static int ioc_event(unsigned long arg)
 {
-        gdth_ioctl_event evt;
-        gdth_ha_str *ha;
-        ulong flags;
-
-        if (copy_from_user(&evt, (char *)arg, sizeof(gdth_ioctl_event)) ||
-            evt.ionode >= gdth_ctr_count)
-            return -EFAULT;
-        ha = HADATA(gdth_ctr_tab[evt.ionode]);
+    gdth_ioctl_event evt;
+    gdth_ha_str *ha;
+    ulong flags;
 
-        if (evt.erase == 0xff) {
-            if (evt.event.event_source == ES_TEST)
-                evt.event.event_data.size=sizeof(evt.event.event_data.eu.test); 
-            else if (evt.event.event_source == ES_DRIVER)
-                evt.event.event_data.size=sizeof(evt.event.event_data.eu.driver); 
-            else if (evt.event.event_source == ES_SYNC)
-                evt.event.event_data.size=sizeof(evt.event.event_data.eu.sync); 
-            else
-                evt.event.event_data.size=sizeof(evt.event.event_data.eu.async);
-            GDTH_LOCK_HA(ha, flags);
-            gdth_store_event(ha, evt.event.event_source, evt.event.event_idx,
-                             &evt.event.event_data);
-            GDTH_UNLOCK_HA(ha, flags);
-        } else if (evt.erase == 0xfe) {
-            gdth_clear_events();
-        } else if (evt.erase == 0) {
-            evt.handle = gdth_read_event(ha, evt.handle, &evt.event);
-        } else {
-            gdth_readapp_event(ha, evt.erase, &evt.event);
-        }     
-        if (copy_to_user((char *)arg, &evt, sizeof(gdth_ioctl_event)))
-            return -EFAULT;
-        return 0;
+    if (copy_from_user(&evt, (char *)arg, sizeof(gdth_ioctl_event)) ||
+        evt.ionode >= gdth_ctr_count)
+        return -EFAULT;
+    ha = HADATA(gdth_ctr_tab[evt.ionode]);
+
+    if (evt.erase == 0xff) {
+        if (evt.event.event_source == ES_TEST)
+            evt.event.event_data.size=sizeof(evt.event.event_data.eu.test); 
+        else if (evt.event.event_source == ES_DRIVER)
+            evt.event.event_data.size=sizeof(evt.event.event_data.eu.driver); 
+        else if (evt.event.event_source == ES_SYNC)
+            evt.event.event_data.size=sizeof(evt.event.event_data.eu.sync); 
+        else
+            evt.event.event_data.size=sizeof(evt.event.event_data.eu.async);
+        GDTH_LOCK_HA(ha, flags);
+        gdth_store_event(ha, evt.event.event_source, evt.event.event_idx,
+                         &evt.event.event_data);
+        GDTH_UNLOCK_HA(ha, flags);
+    } else if (evt.erase == 0xfe) {
+        gdth_clear_events();
+    } else if (evt.erase == 0) {
+        evt.handle = gdth_read_event(ha, evt.handle, &evt.event);
+    } else {
+        gdth_readapp_event(ha, evt.erase, &evt.event);
+    }     
+    if (copy_to_user((char *)arg, &evt, sizeof(gdth_ioctl_event)))
+        return -EFAULT;
+    return 0;
 }
 
 static int ioc_lockdrv(unsigned long arg)
 {
-        gdth_ioctl_lockdrv ldrv;
-        unchar i, j;
-        ulong flags;
-        gdth_ha_str *ha;
+    gdth_ioctl_lockdrv ldrv;
+    unchar i, j;
+    ulong flags;
+    gdth_ha_str *ha;
 
-        if (copy_from_user(&ldrv, (char *)arg, sizeof(gdth_ioctl_lockdrv)) ||
-            ldrv.ionode >= gdth_ctr_count)
-            return -EFAULT;
-        ha = HADATA(gdth_ctr_tab[ldrv.ionode]);
+    if (copy_from_user(&ldrv, (char *)arg, sizeof(gdth_ioctl_lockdrv)) ||
+        ldrv.ionode >= gdth_ctr_count)
+        return -EFAULT;
+    ha = HADATA(gdth_ctr_tab[ldrv.ionode]);
  
-        for (i = 0; i < ldrv.drive_cnt && i < MAX_HDRIVES; ++i) {
-            j = ldrv.drives[i];
-            if (j >= MAX_HDRIVES || !ha->hdr[j].present)
-                continue;
-            if (ldrv.lock) {
-                GDTH_LOCK_HA(ha, flags);
-                ha->hdr[j].lock = 1;
-                GDTH_UNLOCK_HA(ha, flags);
-                gdth_wait_completion(ldrv.ionode, ha->bus_cnt, j); 
-                gdth_stop_timeout(ldrv.ionode, ha->bus_cnt, j); 
-            } else {
-                GDTH_LOCK_HA(ha, flags);
-                ha->hdr[j].lock = 0;
-                GDTH_UNLOCK_HA(ha, flags);
-                gdth_start_timeout(ldrv.ionode, ha->bus_cnt, j); 
-                gdth_next(ldrv.ionode); 
-            }
-        } 
-        return 0;
+    for (i = 0; i < ldrv.drive_cnt && i < MAX_HDRIVES; ++i) {
+        j = ldrv.drives[i];
+        if (j >= MAX_HDRIVES || !ha->hdr[j].present)
+            continue;
+        if (ldrv.lock) {
+            GDTH_LOCK_HA(ha, flags);
+            ha->hdr[j].lock = 1;
+            GDTH_UNLOCK_HA(ha, flags);
+            gdth_wait_completion(ldrv.ionode, ha->bus_cnt, j); 
+            gdth_stop_timeout(ldrv.ionode, ha->bus_cnt, j); 
+        } else {
+            GDTH_LOCK_HA(ha, flags);
+            ha->hdr[j].lock = 0;
+            GDTH_UNLOCK_HA(ha, flags);
+            gdth_start_timeout(ldrv.ionode, ha->bus_cnt, j); 
+            gdth_next(ldrv.ionode); 
+        }
+    } 
+    return 0;
 }
 
 static int ioc_resetdrv(unsigned long arg, char *cmnd)
 {
-        gdth_ioctl_reset res;
-        gdth_cmd_str cmd;
-        int hanum;
-        gdth_ha_str *ha;
-#if LINUX_VERSION_CODE >= 0x020503
-	Scsi_Request *srp;
-	Scsi_Device *sdev;
-#elif LINUX_VERSION_CODE >= 0x020322
-	Scsi_Cmnd *scp;
-	Scsi_Device *sdev;
-#else
-	Scsi_Cmnd scp;
-	Scsi_Device sdev;
+    gdth_ioctl_reset res;
+    gdth_cmd_str cmd;
+    int hanum;
+    gdth_ha_str *ha;
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
+        Scsi_Request *srp;
+#elif LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0)
+        Scsi_Cmnd *scp;
+#else
+        Scsi_Cmnd scp;
 #endif
 
-        if (copy_from_user(&res, (char *)arg, sizeof(gdth_ioctl_reset)) ||
-            res.ionode >= gdth_ctr_count || res.number >= MAX_HDRIVES)
-            return -EFAULT;
-        hanum = res.ionode;
-        ha = HADATA(gdth_ctr_tab[hanum]);
+    if (copy_from_user(&res, (char *)arg, sizeof(gdth_ioctl_reset)) ||
+        res.ionode >= gdth_ctr_count || res.number >= MAX_HDRIVES)
+        return -EFAULT;
+    hanum = res.ionode;
+    ha = HADATA(gdth_ctr_tab[hanum]);
  
-        if (!ha->hdr[res.number].present)
-            return 0;
-        cmd.Service = CACHESERVICE;
-        cmd.OpCode = GDT_CLUST_RESET;
+    if (!ha->hdr[res.number].present)
+        return 0;
+    memset(&cmd, 0, sizeof(gdth_cmd_str));
+    cmd.Service = CACHESERVICE;
+    cmd.OpCode = GDT_CLUST_RESET;
+    if (ha->cache_feat & GDT_64BIT)
+        cmd.u.cache64.DeviceNo = res.number;
+    else
         cmd.u.cache.DeviceNo = res.number;
-#if LINUX_VERSION_CODE >= 0x020503
-        sdev = scsi_get_host_dev(gdth_ctr_tab[hanum]);
-        srp  = scsi_allocate_request(sdev, GFP_KERNEL);
-        if (!srp)
-            return -ENOMEM;
-        srp->sr_cmd_len = 12;
-        srp->sr_use_sg = 0;
-        gdth_do_req(srp, &cmd, cmnd, 30);
-        res.status = (ushort)srp->sr_command->SCp.Status;
-        scsi_release_request(srp);
-        scsi_free_host_dev(sdev);
-#elif LINUX_VERSION_CODE >= 0x020322
-        sdev = scsi_get_host_dev(gdth_ctr_tab[hanum]);
-        scp  = scsi_allocate_device(sdev, 1, FALSE);
-        if (!scp)
-            return -ENOMEM;
-        scp->cmd_len = 12;
-        scp->use_sg = 0;
-        gdth_do_cmd(scp, &cmd, cmnd, 30);
-        res.status = (ushort)scp->SCp.Status;
-        scsi_release_command(scp);
-        scsi_free_host_dev(sdev);
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
+    srp  = scsi_allocate_request(ha->sdev, GFP_KERNEL);
+    if (!srp)
+        return -ENOMEM;
+    srp->sr_cmd_len = 12;
+    srp->sr_use_sg = 0;
+    gdth_do_req(srp, &cmd, cmnd, 30);
+    res.status = (ushort)srp->sr_command->SCp.Status;
+    scsi_release_request(srp);
+#elif LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0)
+    scp  = scsi_allocate_device(ha->sdev, 1, FALSE);
+    if (!scp)
+        return -ENOMEM;
+    scp->cmd_len = 12;
+    scp->use_sg = 0;
+    gdth_do_cmd(scp, &cmd, cmnd, 30);
+    res.status = (ushort)scp->SCp.Status;
+    scsi_release_command(scp);
 #else
-        memset(&sdev,0,sizeof(Scsi_Device));
-        memset(&scp, 0,sizeof(Scsi_Cmnd));
-        sdev.host = scp.host = gdth_ctr_tab[hanum];
-        sdev.id = scp.target = sdev.host->this_id;
-        scp.device = &sdev;
-        gdth_do_cmd(&scp, &cmd, cmnd, 30);
-        res.status = (ushort)scp.SCp.Status;
+    memset(&ha->sdev,0,sizeof(Scsi_Device));
+    memset(&scp, 0,sizeof(Scsi_Cmnd));
+    ha->sdev.host = scp.host = gdth_ctr_tab[hanum];
+    ha->sdev.id = scp.target = ha->sdev.host->this_id;
+    scp.device = &ha->sdev;
+    gdth_do_cmd(&scp, &cmd, cmnd, 30);
+    res.status = (ushort)scp.SCp.Status;
 #endif
-        if (copy_to_user((char *)arg, &res, sizeof(gdth_ioctl_reset)))
-            return -EFAULT;
-        return 0;
+    if (copy_to_user((char *)arg, &res, sizeof(gdth_ioctl_reset)))
+        return -EFAULT;
+    return 0;
 }
 
 static int ioc_general(unsigned long arg, char *cmnd)
 {
-        gdth_ioctl_general gen;
-        char *buf = NULL;
-        ulong32 paddr; 
-        int hanum;
-	gdth_ha_str *ha; 
-#if LINUX_VERSION_CODE >= 0x020503
-	Scsi_Request *srp;
-	Scsi_Device *sdev;
-#elif LINUX_VERSION_CODE >= 0x020322
-	Scsi_Cmnd *scp;
-	Scsi_Device *sdev;
+    gdth_ioctl_general gen;
+    char *buf = NULL;
+    ulong64 paddr; 
+    int hanum;
+        gdth_ha_str *ha; 
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
+        Scsi_Request *srp;
+#elif LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0)
+        Scsi_Cmnd *scp;
 #else
-	Scsi_Cmnd scp;
-	Scsi_Device sdev;
+        Scsi_Cmnd scp;
 #endif
         
-        if (copy_from_user(&gen, (char *)arg, sizeof(gdth_ioctl_general)) ||
-            gen.ionode >= gdth_ctr_count)
+    if (copy_from_user(&gen, (char *)arg, sizeof(gdth_ioctl_general)) ||
+        gen.ionode >= gdth_ctr_count)
+        return -EFAULT;
+    hanum = gen.ionode; 
+    ha = HADATA(gdth_ctr_tab[hanum]);
+    if (gen.data_len + gen.sense_len != 0) {
+        if (!(buf = gdth_ioctl_alloc(hanum, gen.data_len + gen.sense_len, 
+                                     FALSE, &paddr)))
             return -EFAULT;
-        hanum = gen.ionode; 
-        ha = HADATA(gdth_ctr_tab[hanum]);
-        if (gen.data_len + gen.sense_len != 0) {
-            if (!(buf = gdth_ioctl_alloc(hanum, gen.data_len + gen.sense_len, 
-                                         FALSE, &paddr)))
-                return -EFAULT;
-            if (copy_from_user(buf, (char *)arg + sizeof(gdth_ioctl_general),  
-                               gen.data_len + gen.sense_len)) {
-                gdth_ioctl_free(hanum, gen.data_len+gen.sense_len, buf, paddr);
-                return -EFAULT;
-            }
+        if (copy_from_user(buf, (char *)arg + sizeof(gdth_ioctl_general),  
+                           gen.data_len + gen.sense_len)) {
+            gdth_ioctl_free(hanum, gen.data_len+gen.sense_len, buf, paddr);
+            return -EFAULT;
+        }
 
-            if (gen.command.OpCode == GDT_IOCTL) {
-                gen.command.u.ioctl.p_param = paddr;
-            } else if (gen.command.Service == CACHESERVICE) {
+        if (gen.command.OpCode == GDT_IOCTL) {
+            gen.command.u.ioctl.p_param = paddr;
+        } else if (gen.command.Service == CACHESERVICE) {
+            if (ha->cache_feat & GDT_64BIT) {
+                /* copy elements from 32-bit IOCTL structure */
+                gen.command.u.cache64.BlockCnt = gen.command.u.cache.BlockCnt;
+                gen.command.u.cache64.BlockNo = gen.command.u.cache.BlockNo;
+                gen.command.u.cache64.DeviceNo = gen.command.u.cache.DeviceNo;
+                /* addresses */
+                if (ha->cache_feat & SCATTER_GATHER) {
+                    gen.command.u.cache64.DestAddr = (ulong64)-1;
+                    gen.command.u.cache64.sg_canz = 1;
+                    gen.command.u.cache64.sg_lst[0].sg_ptr = paddr;
+                    gen.command.u.cache64.sg_lst[0].sg_len = gen.data_len;
+                    gen.command.u.cache64.sg_lst[1].sg_len = 0;
+                } else {
+                    gen.command.u.cache64.DestAddr = paddr;
+                    gen.command.u.cache64.sg_canz = 0;
+                }
+            } else {
                 if (ha->cache_feat & SCATTER_GATHER) {
                     gen.command.u.cache.DestAddr = 0xffffffff;
                     gen.command.u.cache.sg_canz = 1;
-                    gen.command.u.cache.sg_lst[0].sg_ptr = paddr;
+                    gen.command.u.cache.sg_lst[0].sg_ptr = (ulong32)paddr;
                     gen.command.u.cache.sg_lst[0].sg_len = gen.data_len;
                     gen.command.u.cache.sg_lst[1].sg_len = 0;
                 } else {
                     gen.command.u.cache.DestAddr = paddr;
                     gen.command.u.cache.sg_canz = 0;
                 }
-            } else if (gen.command.Service == SCSIRAWSERVICE) {
+            }
+        } else if (gen.command.Service == SCSIRAWSERVICE) {
+            if (ha->raw_feat & GDT_64BIT) {
+                /* copy elements from 32-bit IOCTL structure */
+                char cmd[16];
+                gen.command.u.raw64.sense_len = gen.command.u.raw.sense_len;
+                gen.command.u.raw64.bus = gen.command.u.raw.bus;
+                gen.command.u.raw64.lun = gen.command.u.raw.lun;
+                gen.command.u.raw64.target = gen.command.u.raw.target;
+                memcpy(cmd, gen.command.u.raw.cmd, 16);
+                memcpy(gen.command.u.raw64.cmd, cmd, 16);
+                gen.command.u.raw64.clen = gen.command.u.raw.clen;
+                gen.command.u.raw64.sdlen = gen.command.u.raw.sdlen;
+                gen.command.u.raw64.direction = gen.command.u.raw.direction;
+                /* addresses */
+                if (ha->raw_feat & SCATTER_GATHER) {
+                    gen.command.u.raw64.sdata = (ulong64)-1;
+                    gen.command.u.raw64.sg_ranz = 1;
+                    gen.command.u.raw64.sg_lst[0].sg_ptr = paddr;
+                    gen.command.u.raw64.sg_lst[0].sg_len = gen.data_len;
+                    gen.command.u.raw64.sg_lst[1].sg_len = 0;
+                } else {
+                    gen.command.u.raw64.sdata = paddr;
+                    gen.command.u.raw64.sg_ranz = 0;
+                }
+                gen.command.u.raw64.sense_data = paddr + gen.data_len;
+            } else {
                 if (ha->raw_feat & SCATTER_GATHER) {
                     gen.command.u.raw.sdata = 0xffffffff;
                     gen.command.u.raw.sg_ranz = 1;
-                    gen.command.u.raw.sg_lst[0].sg_ptr = paddr;
+                    gen.command.u.raw.sg_lst[0].sg_ptr = (ulong32)paddr;
                     gen.command.u.raw.sg_lst[0].sg_len = gen.data_len;
                     gen.command.u.raw.sg_lst[1].sg_len = 0;
                 } else {
                     gen.command.u.raw.sdata = paddr;
                     gen.command.u.raw.sg_ranz = 0;
                 }
-                gen.command.u.raw.sense_data = paddr + gen.data_len;
-
-            } else {
-                gdth_ioctl_free(hanum, gen.data_len+gen.sense_len, buf, paddr);
-                return -EFAULT;
+                gen.command.u.raw.sense_data = (ulong32)paddr + gen.data_len;
             }
+        } else {
+            gdth_ioctl_free(hanum, gen.data_len+gen.sense_len, buf, paddr);
+            return -EFAULT;
         }
+    }
 
-#if LINUX_VERSION_CODE >= 0x020503
-        sdev = scsi_get_host_dev(gdth_ctr_tab[hanum]);
-        srp  = scsi_allocate_request(sdev, GFP_KERNEL);
-        if (!srp)
-            return -ENOMEM;
-        srp->sr_cmd_len = 12;
-        srp->sr_use_sg = 0;
-        gdth_do_req(srp, &gen.command, cmnd, gen.timeout);
-        gen.status = srp->sr_command->SCp.Status;
-        gen.info = srp->sr_command->SCp.Message;
-        scsi_release_request(srp);
-        scsi_free_host_dev(sdev);
-#elif LINUX_VERSION_CODE >= 0x020322
-        sdev = scsi_get_host_dev(gdth_ctr_tab[hanum]);
-        scp  = scsi_allocate_device(sdev, 1, FALSE);
-        if (!scp)
-            return -ENOMEM;
-        scp->cmd_len = 12;
-        scp->use_sg = 0;
-        gdth_do_cmd(scp, &gen.command, cmnd, gen.timeout);
-        gen.status = scp->SCp.Status;
-        gen.info = scp->SCp.Message;
-        scsi_release_command(scp);
-        scsi_free_host_dev(sdev);
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
+    srp  = scsi_allocate_request(ha->sdev, GFP_KERNEL);
+    if (!srp)
+        return -ENOMEM;
+    srp->sr_cmd_len = 12;
+    srp->sr_use_sg = 0;
+    gdth_do_req(srp, &gen.command, cmnd, gen.timeout);
+    gen.status = srp->sr_command->SCp.Status;
+    gen.info = srp->sr_command->SCp.Message;
+    scsi_release_request(srp);
+#elif LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0)
+    scp  = scsi_allocate_device(ha->sdev, 1, FALSE);
+    if (!scp)
+        return -ENOMEM;
+    scp->cmd_len = 12;
+    scp->use_sg = 0;
+    gdth_do_cmd(scp, &gen.command, cmnd, gen.timeout);
+    gen.status = scp->SCp.Status;
+    gen.info = scp->SCp.Message;
+    scsi_release_command(scp);
 #else
-        memset(&sdev,0,sizeof(Scsi_Device));
-        memset(&scp, 0,sizeof(Scsi_Cmnd));
-        sdev.host = scp.host = gdth_ctr_tab[hanum];
-        sdev.id = scp.target = sdev.host->this_id;
-        scp.device = &sdev;
-        gdth_do_cmd(&scp, &gen.command, cmnd, gen.timeout);
-        gen.status = scp.SCp.Status;
-        gen.info = scp.SCp.Message;
+    memset(&ha->sdev,0,sizeof(Scsi_Device));
+    memset(&scp, 0,sizeof(Scsi_Cmnd));
+    ha->sdev.host = scp.host = gdth_ctr_tab[hanum];
+    ha->sdev.id = scp.target = ha->sdev.host->this_id;
+    scp.device = &ha->sdev;
+    gdth_do_cmd(&scp, &gen.command, cmnd, gen.timeout);
+    gen.status = scp.SCp.Status;
+    gen.info = scp.SCp.Message;
 #endif
 
-        if (copy_to_user((char *)arg + sizeof(gdth_ioctl_general), buf, 
-                         gen.data_len + gen.sense_len)) {
-            gdth_ioctl_free(hanum, gen.data_len+gen.sense_len, buf, paddr);
-            return -EFAULT; 
-        } 
-        if (copy_to_user((char *)arg, &gen, 
-            sizeof(gdth_ioctl_general) - sizeof(gdth_cmd_str))) {
-            gdth_ioctl_free(hanum, gen.data_len+gen.sense_len, buf, paddr);
-            return -EFAULT;
-        }
+    if (copy_to_user((char *)arg + sizeof(gdth_ioctl_general), buf, 
+                     gen.data_len + gen.sense_len)) {
         gdth_ioctl_free(hanum, gen.data_len+gen.sense_len, buf, paddr);
-        return 0;
+        return -EFAULT; 
+    } 
+    if (copy_to_user((char *)arg, &gen, 
+        sizeof(gdth_ioctl_general) - sizeof(gdth_cmd_str))) {
+        gdth_ioctl_free(hanum, gen.data_len+gen.sense_len, buf, paddr);
+        return -EFAULT;
+    }
+    gdth_ioctl_free(hanum, gen.data_len+gen.sense_len, buf, paddr);
+    return 0;
 }
  
 static int ioc_hdrlist(unsigned long arg, char *cmnd)
 {
-        gdth_ioctl_rescan rsc;
-        gdth_cmd_str cmd;
-        gdth_ha_str *ha;
-        unchar i;
-        int hanum;
-#if LINUX_VERSION_CODE >= 0x020503
-	Scsi_Request *srp;
-	Scsi_Device *sdev;
-#elif LINUX_VERSION_CODE >= 0x020322
-	Scsi_Cmnd *scp;
-	Scsi_Device *sdev;
+    gdth_ioctl_rescan rsc;
+    gdth_cmd_str cmd;
+    gdth_ha_str *ha;
+    unchar i;
+    int hanum;
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
+    Scsi_Request *srp;
+#elif LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0)
+    Scsi_Cmnd *scp;
 #else
-	Scsi_Cmnd scp;
-	Scsi_Device sdev;
+    Scsi_Cmnd scp;
 #endif
         
-        if (copy_from_user(&rsc, (char *)arg, sizeof(gdth_ioctl_rescan)) ||
-            rsc.ionode >= gdth_ctr_count)
-            return -EFAULT;
-        hanum = rsc.ionode;
-        ha = HADATA(gdth_ctr_tab[hanum]);
+    if (copy_from_user(&rsc, (char *)arg, sizeof(gdth_ioctl_rescan)) ||
+        rsc.ionode >= gdth_ctr_count)
+        return -EFAULT;
+    hanum = rsc.ionode;
+    ha = HADATA(gdth_ctr_tab[hanum]);
+    memset(&cmd, 0, sizeof(gdth_cmd_str));
    
-#if LINUX_VERSION_CODE >= 0x020503
-        sdev = scsi_get_host_dev(gdth_ctr_tab[hanum]);
-        srp  = scsi_allocate_request(sdev, GFP_KERNEL);
-        if (!srp)
-            return -ENOMEM;
-        srp->sr_cmd_len = 12;
-        srp->sr_use_sg = 0;
-#elif LINUX_VERSION_CODE >= 0x020322
-        sdev = scsi_get_host_dev(gdth_ctr_tab[hanum]);
-        scp  = scsi_allocate_device(sdev, 1, FALSE);
-        if (!scp)
-            return -ENOMEM;
-        scp->cmd_len = 12;
-        scp->use_sg = 0;
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
+    srp  = scsi_allocate_request(ha->sdev, GFP_KERNEL);
+    if (!srp)
+        return -ENOMEM;
+    srp->sr_cmd_len = 12;
+    srp->sr_use_sg = 0;
+#elif LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0)
+    scp  = scsi_allocate_device(ha->sdev, 1, FALSE);
+    if (!scp)
+        return -ENOMEM;
+    scp->cmd_len = 12;
+    scp->use_sg = 0;
 #else
-        memset(&sdev,0,sizeof(Scsi_Device));
-        memset(&scp, 0,sizeof(Scsi_Cmnd));
-        sdev.host = scp.host = gdth_ctr_tab[hanum];
-        sdev.id = scp.target = sdev.host->this_id;
-        scp.device = &sdev;
+    memset(&ha->sdev,0,sizeof(Scsi_Device));
+    memset(&scp, 0,sizeof(Scsi_Cmnd));
+    ha->sdev.host = scp.host = gdth_ctr_tab[hanum];
+    ha->sdev.id = scp.target = ha->sdev.host->this_id;
+    scp.device = &ha->sdev;
 #endif
 
-        for (i = 0; i < MAX_HDRIVES; ++i) { 
-            if (!ha->hdr[i].present) {
-                rsc.hdr_list[i].bus = 0xff; 
-                continue;
-            } 
-            rsc.hdr_list[i].bus = ha->virt_bus;
-            rsc.hdr_list[i].target = i;
-            rsc.hdr_list[i].lun = 0;
-            rsc.hdr_list[i].cluster_type = ha->hdr[i].cluster_type;
-            if (ha->hdr[i].cluster_type & CLUSTER_DRIVE) { 
-                cmd.Service = CACHESERVICE;
-                cmd.OpCode = GDT_CLUST_INFO;
+    for (i = 0; i < MAX_HDRIVES; ++i) { 
+        if (!ha->hdr[i].present) {
+            rsc.hdr_list[i].bus = 0xff; 
+            continue;
+        } 
+        rsc.hdr_list[i].bus = ha->virt_bus;
+        rsc.hdr_list[i].target = i;
+        rsc.hdr_list[i].lun = 0;
+        rsc.hdr_list[i].cluster_type = ha->hdr[i].cluster_type;
+        if (ha->hdr[i].cluster_type & CLUSTER_DRIVE) { 
+            cmd.Service = CACHESERVICE;
+            cmd.OpCode = GDT_CLUST_INFO;
+            if (ha->cache_feat & GDT_64BIT)
+                cmd.u.cache64.DeviceNo = i;
+            else
                 cmd.u.cache.DeviceNo = i;
-#if LINUX_VERSION_CODE >= 0x020503
-                gdth_do_req(srp, &cmd, cmnd, 30);
-                if (srp->sr_command->SCp.Status == S_OK)
-                    rsc.hdr_list[i].cluster_type = srp->sr_command->SCp.Message;
-#elif LINUX_VERSION_CODE >= 0x020322
-                gdth_do_cmd(scp, &cmd, cmnd, 30);
-                if (scp->SCp.Status == S_OK)
-                    rsc.hdr_list[i].cluster_type = scp->SCp.Message;
-#else
-                gdth_do_cmd(&scp, &cmd, cmnd, 30);
-                if (scp.SCp.Status == S_OK)
-                    rsc.hdr_list[i].cluster_type = scp.SCp.Message;
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
+            gdth_do_req(srp, &cmd, cmnd, 30);
+            if (srp->sr_command->SCp.Status == S_OK)
+                rsc.hdr_list[i].cluster_type = srp->sr_command->SCp.Message;
+#elif LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0)
+            gdth_do_cmd(scp, &cmd, cmnd, 30);
+            if (scp->SCp.Status == S_OK)
+                rsc.hdr_list[i].cluster_type = scp->SCp.Message;
+#else
+            gdth_do_cmd(&scp, &cmd, cmnd, 30);
+            if (scp.SCp.Status == S_OK)
+                rsc.hdr_list[i].cluster_type = scp.SCp.Message;
 #endif
-            }
-        } 
-#if LINUX_VERSION_CODE >= 0x020503
-        scsi_release_request(srp);
-        scsi_free_host_dev(sdev);
-#elif LINUX_VERSION_CODE >= 0x020322
-        scsi_release_command(scp);
-        scsi_free_host_dev(sdev);
+        }
+    } 
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
+    scsi_release_request(srp);
+#elif LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0)
+    scsi_release_command(scp);
 #endif       
  
-        if (copy_to_user((char *)arg, &rsc, sizeof(gdth_ioctl_rescan)))
-            return -EFAULT;
-        return 0;
+    if (copy_to_user((char *)arg, &rsc, sizeof(gdth_ioctl_rescan)))
+        return -EFAULT;
+    return 0;
 }
 
 static int ioc_rescan(unsigned long arg, char *cmnd)
 {
-        gdth_ioctl_rescan rsc;
-        gdth_cmd_str cmd;
-        ushort i, status, hdr_cnt;
-        ulong32 info;
-        int hanum, cyls, hds, secs;
-	ulong flags;
-	gdth_ha_str *ha; 
-#if LINUX_VERSION_CODE >= 0x020503
-	Scsi_Request *srp;
-	Scsi_Device *sdev;
-#elif LINUX_VERSION_CODE >= 0x020322
-	Scsi_Cmnd *scp;
-	Scsi_Device *sdev;
+    gdth_ioctl_rescan rsc;
+    gdth_cmd_str cmd;
+    ushort i, status, hdr_cnt;
+    ulong32 info;
+    int hanum, cyls, hds, secs;
+    ulong flags;
+    gdth_ha_str *ha; 
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
+    Scsi_Request *srp;
+#elif LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0)
+    Scsi_Cmnd *scp;
 #else
-	Scsi_Cmnd scp;
-	Scsi_Device sdev;
+    Scsi_Cmnd scp;
 #endif
         
-        if (copy_from_user(&rsc, (char *)arg, sizeof(gdth_ioctl_rescan)) ||
-            rsc.ionode >= gdth_ctr_count)
-            return -EFAULT;
-        hanum = rsc.ionode;
-        ha = HADATA(gdth_ctr_tab[hanum]);
+    if (copy_from_user(&rsc, (char *)arg, sizeof(gdth_ioctl_rescan)) ||
+        rsc.ionode >= gdth_ctr_count)
+        return -EFAULT;
+    hanum = rsc.ionode;
+    ha = HADATA(gdth_ctr_tab[hanum]);
+    memset(&cmd, 0, sizeof(gdth_cmd_str));
 
-#if LINUX_VERSION_CODE >= 0x020503
-        sdev = scsi_get_host_dev(gdth_ctr_tab[hanum]);
-        srp  = scsi_allocate_request(sdev, GFP_KERNEL);
-        if (!srp)
-            return -ENOMEM;
-        srp->sr_cmd_len = 12;
-        srp->sr_use_sg = 0;
-#elif LINUX_VERSION_CODE >= 0x020322
-        sdev = scsi_get_host_dev(gdth_ctr_tab[hanum]);
-        scp  = scsi_allocate_device(sdev, 1, FALSE);
-        if (!scp)
-            return -ENOMEM;
-        scp->cmd_len = 12;
-        scp->use_sg = 0;
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
+    srp  = scsi_allocate_request(ha->sdev, GFP_KERNEL);
+    if (!srp)
+        return -ENOMEM;
+    srp->sr_cmd_len = 12;
+    srp->sr_use_sg = 0;
+#elif LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0)
+    scp  = scsi_allocate_device(ha->sdev, 1, FALSE);
+    if (!scp)
+        return -ENOMEM;
+    scp->cmd_len = 12;
+    scp->use_sg = 0;
 #else
-        memset(&sdev,0,sizeof(Scsi_Device));
-        memset(&scp, 0,sizeof(Scsi_Cmnd));
-        sdev.host = scp.host = gdth_ctr_tab[hanum];
-        sdev.id = scp.target = sdev.host->this_id;
-        scp.device = &sdev;
+    memset(&ha->sdev,0,sizeof(Scsi_Device));
+    memset(&scp, 0,sizeof(Scsi_Cmnd));
+    ha->sdev.host = scp.host = gdth_ctr_tab[hanum];
+    ha->sdev.id = scp.target = ha->sdev.host->this_id;
+    scp.device = &ha->sdev;
 #endif
      
-        if (rsc.flag == 0) {
-            /* old method: re-init. cache service */
-            cmd.Service = CACHESERVICE;
+    if (rsc.flag == 0) {
+        /* old method: re-init. cache service */
+        cmd.Service = CACHESERVICE;
+        if (ha->cache_feat & GDT_64BIT) {
+            cmd.OpCode = GDT_X_INIT_HOST;
+            cmd.u.cache64.DeviceNo = LINUX_OS;
+        } else {
             cmd.OpCode = GDT_INIT;
             cmd.u.cache.DeviceNo = LINUX_OS;
-#if LINUX_VERSION_CODE >= 0x020503
-            gdth_do_req(srp, &cmd, cmnd, 30);
-            status = (ushort)srp->sr_command->SCp.Status;
-            info = (ulong32)srp->sr_command->SCp.Message;
-#elif LINUX_VERSION_CODE >= 0x020322
-            gdth_do_cmd(scp, &cmd, cmnd, 30);
-            status = (ushort)scp->SCp.Status;
-            info = (ulong32)scp->SCp.Message;
+        }
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
+        gdth_do_req(srp, &cmd, cmnd, 30);
+        status = (ushort)srp->sr_command->SCp.Status;
+        info = (ulong32)srp->sr_command->SCp.Message;
+#elif LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0)
+        gdth_do_cmd(scp, &cmd, cmnd, 30);
+        status = (ushort)scp->SCp.Status;
+        info = (ulong32)scp->SCp.Message;
 #else
-            gdth_do_cmd(&scp, &cmd, cmnd, 30);
-            status = (ushort)scp.SCp.Status;
-            info = (ulong32)scp.SCp.Message;
+        gdth_do_cmd(&scp, &cmd, cmnd, 30);
+        status = (ushort)scp.SCp.Status;
+        info = (ulong32)scp.SCp.Message;
 #endif
-            i = 0;
-            hdr_cnt = (status == S_OK ? (ushort)info : 0);
-        } else {
-            i = rsc.hdr_no;
-            hdr_cnt = i + 1;
-        }
-        for (; i < hdr_cnt && i < MAX_HDRIVES; ++i) {
-            cmd.Service = CACHESERVICE;
-            cmd.OpCode = GDT_INFO;
+        i = 0;
+        hdr_cnt = (status == S_OK ? (ushort)info : 0);
+    } else {
+        i = rsc.hdr_no;
+        hdr_cnt = i + 1;
+    }
+    for (; i < hdr_cnt && i < MAX_HDRIVES; ++i) {
+        cmd.Service = CACHESERVICE;
+        cmd.OpCode = GDT_INFO;
+        if (ha->cache_feat & GDT_64BIT) 
+            cmd.u.cache64.DeviceNo = i;
+        else 
             cmd.u.cache.DeviceNo = i;
-#if LINUX_VERSION_CODE >= 0x020503
-            gdth_do_req(srp, &cmd, cmnd, 30);
-            status = (ushort)srp->sr_command->SCp.Status;
-            info = (ulong32)srp->sr_command->SCp.Message;
-#elif LINUX_VERSION_CODE >= 0x020322
-            gdth_do_cmd(scp, &cmd, cmnd, 30);
-            status = (ushort)scp->SCp.Status;
-            info = (ulong32)scp->SCp.Message;
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
+        gdth_do_req(srp, &cmd, cmnd, 30);
+        status = (ushort)srp->sr_command->SCp.Status;
+        info = (ulong32)srp->sr_command->SCp.Message;
+#elif LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0)
+        gdth_do_cmd(scp, &cmd, cmnd, 30);
+        status = (ushort)scp->SCp.Status;
+        info = (ulong32)scp->SCp.Message;
 #else
-            gdth_do_cmd(&scp, &cmd, cmnd, 30);
-            status = (ushort)scp.SCp.Status;
-            info = (ulong32)scp.SCp.Message;
+        gdth_do_cmd(&scp, &cmd, cmnd, 30);
+        status = (ushort)scp.SCp.Status;
+        info = (ulong32)scp.SCp.Message;
 #endif
-            GDTH_LOCK_HA(ha, flags);
-            rsc.hdr_list[i].bus = ha->virt_bus;
-            rsc.hdr_list[i].target = i;
-            rsc.hdr_list[i].lun = 0;
-            if (status != S_OK) {
-                ha->hdr[i].present = FALSE;
-            } else {
-                ha->hdr[i].present = TRUE;
-                ha->hdr[i].size = info;
-                /* evaluate mapping */
-                ha->hdr[i].size &= ~SECS32;
-                gdth_eval_mapping(ha->hdr[i].size,&cyls,&hds,&secs); 
-                ha->hdr[i].heads = hds;
-                ha->hdr[i].secs = secs;
-                /* round size */
-                ha->hdr[i].size = cyls * hds * secs;
-            }
-            GDTH_UNLOCK_HA(ha, flags);
-            if (status != S_OK)
-                continue; 
+        GDTH_LOCK_HA(ha, flags);
+        rsc.hdr_list[i].bus = ha->virt_bus;
+        rsc.hdr_list[i].target = i;
+        rsc.hdr_list[i].lun = 0;
+        if (status != S_OK) {
+            ha->hdr[i].present = FALSE;
+        } else {
+            ha->hdr[i].present = TRUE;
+            ha->hdr[i].size = info;
+            /* evaluate mapping */
+            ha->hdr[i].size &= ~SECS32;
+            gdth_eval_mapping(ha->hdr[i].size,&cyls,&hds,&secs); 
+            ha->hdr[i].heads = hds;
+            ha->hdr[i].secs = secs;
+            /* round size */
+            ha->hdr[i].size = cyls * hds * secs;
+        }
+        GDTH_UNLOCK_HA(ha, flags);
+        if (status != S_OK)
+            continue; 
+        
+        /* extended info, if GDT_64BIT, for drives > 2 TB */
+        /* but we need ha->info2, not yet stored in scp->SCp */
 
-            /* devtype, cluster info, R/W attribs */
-            cmd.Service = CACHESERVICE;
-            cmd.OpCode = GDT_DEVTYPE;
+        /* devtype, cluster info, R/W attribs */
+        cmd.Service = CACHESERVICE;
+        cmd.OpCode = GDT_DEVTYPE;
+        if (ha->cache_feat & GDT_64BIT) 
+            cmd.u.cache64.DeviceNo = i;
+        else
             cmd.u.cache.DeviceNo = i;
-#if LINUX_VERSION_CODE >= 0x020503
-            gdth_do_req(srp, &cmd, cmnd, 30);
-            status = (ushort)srp->sr_command->SCp.Status;
-            info = (ulong32)srp->sr_command->SCp.Message;
-#elif LINUX_VERSION_CODE >= 0x020322
-            gdth_do_cmd(scp, &cmd, cmnd, 30);
-            status = (ushort)scp->SCp.Status;
-            info = (ulong32)scp->SCp.Message;
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
+        gdth_do_req(srp, &cmd, cmnd, 30);
+        status = (ushort)srp->sr_command->SCp.Status;
+        info = (ulong32)srp->sr_command->SCp.Message;
+#elif LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0)
+        gdth_do_cmd(scp, &cmd, cmnd, 30);
+        status = (ushort)scp->SCp.Status;
+        info = (ulong32)scp->SCp.Message;
 #else
-            gdth_do_cmd(&scp, &cmd, cmnd, 30);
-            status = (ushort)scp.SCp.Status;
-            info = (ulong32)scp.SCp.Message;
+        gdth_do_cmd(&scp, &cmd, cmnd, 30);
+        status = (ushort)scp.SCp.Status;
+        info = (ulong32)scp.SCp.Message;
 #endif
-            GDTH_LOCK_HA(ha, flags);
-            ha->hdr[i].devtype = (status == S_OK ? (ushort)info : 0);
-            GDTH_UNLOCK_HA(ha, flags);
+        GDTH_LOCK_HA(ha, flags);
+        ha->hdr[i].devtype = (status == S_OK ? (ushort)info : 0);
+        GDTH_UNLOCK_HA(ha, flags);
 
-            cmd.Service = CACHESERVICE;
-            cmd.OpCode = GDT_CLUST_INFO;
+        cmd.Service = CACHESERVICE;
+        cmd.OpCode = GDT_CLUST_INFO;
+        if (ha->cache_feat & GDT_64BIT) 
+            cmd.u.cache64.DeviceNo = i;
+        else
             cmd.u.cache.DeviceNo = i;
-#if LINUX_VERSION_CODE >= 0x020503
-            gdth_do_req(srp, &cmd, cmnd, 30);
-            status = (ushort)srp->sr_command->SCp.Status;
-            info = (ulong32)srp->sr_command->SCp.Message;
-#elif LINUX_VERSION_CODE >= 0x020322
-            gdth_do_cmd(scp, &cmd, cmnd, 30);
-            status = (ushort)scp->SCp.Status;
-            info = (ulong32)scp->SCp.Message;
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
+        gdth_do_req(srp, &cmd, cmnd, 30);
+        status = (ushort)srp->sr_command->SCp.Status;
+        info = (ulong32)srp->sr_command->SCp.Message;
+#elif LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0)
+        gdth_do_cmd(scp, &cmd, cmnd, 30);
+        status = (ushort)scp->SCp.Status;
+        info = (ulong32)scp->SCp.Message;
 #else
-            gdth_do_cmd(&scp, &cmd, cmnd, 30);
-            status = (ushort)scp.SCp.Status;
-            info = (ulong32)scp.SCp.Message;
+        gdth_do_cmd(&scp, &cmd, cmnd, 30);
+        status = (ushort)scp.SCp.Status;
+        info = (ulong32)scp.SCp.Message;
 #endif
-            GDTH_LOCK_HA(ha, flags);
-            ha->hdr[i].cluster_type = 
-                ((status == S_OK && !shared_access) ? (ushort)info : 0);
-            GDTH_UNLOCK_HA(ha, flags);
-            rsc.hdr_list[i].cluster_type = ha->hdr[i].cluster_type;
+        GDTH_LOCK_HA(ha, flags);
+        ha->hdr[i].cluster_type = 
+            ((status == S_OK && !shared_access) ? (ushort)info : 0);
+        GDTH_UNLOCK_HA(ha, flags);
+        rsc.hdr_list[i].cluster_type = ha->hdr[i].cluster_type;
 
-            cmd.Service = CACHESERVICE;
-            cmd.OpCode = GDT_RW_ATTRIBS;
+        cmd.Service = CACHESERVICE;
+        cmd.OpCode = GDT_RW_ATTRIBS;
+        if (ha->cache_feat & GDT_64BIT) 
+            cmd.u.cache64.DeviceNo = i;
+        else
             cmd.u.cache.DeviceNo = i;
-#if LINUX_VERSION_CODE >= 0x020503
-            gdth_do_req(srp, &cmd, cmnd, 30);
-            status = (ushort)srp->sr_command->SCp.Status;
-            info = (ulong32)srp->sr_command->SCp.Message;
-#elif LINUX_VERSION_CODE >= 0x020322
-            gdth_do_cmd(scp, &cmd, cmnd, 30);
-            status = (ushort)scp->SCp.Status;
-            info = (ulong32)scp->SCp.Message;
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
+        gdth_do_req(srp, &cmd, cmnd, 30);
+        status = (ushort)srp->sr_command->SCp.Status;
+        info = (ulong32)srp->sr_command->SCp.Message;
+#elif LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0)
+        gdth_do_cmd(scp, &cmd, cmnd, 30);
+        status = (ushort)scp->SCp.Status;
+        info = (ulong32)scp->SCp.Message;
 #else
-            gdth_do_cmd(&scp, &cmd, cmnd, 30);
-            status = (ushort)scp.SCp.Status;
-            info = (ulong32)scp.SCp.Message;
+        gdth_do_cmd(&scp, &cmd, cmnd, 30);
+        status = (ushort)scp.SCp.Status;
+        info = (ulong32)scp.SCp.Message;
 #endif
-            GDTH_LOCK_HA(ha, flags);
-            ha->hdr[i].rw_attribs = (status == S_OK ? (ushort)info : 0);
-            GDTH_UNLOCK_HA(ha, flags);
-        }
-#if LINUX_VERSION_CODE >= 0x020503
-        scsi_release_request(srp);
-        scsi_free_host_dev(sdev);
-#elif LINUX_VERSION_CODE >= 0x020322
-        scsi_release_command(scp);
-        scsi_free_host_dev(sdev);
+        GDTH_LOCK_HA(ha, flags);
+        ha->hdr[i].rw_attribs = (status == S_OK ? (ushort)info : 0);
+        GDTH_UNLOCK_HA(ha, flags);
+    }
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
+    scsi_release_request(srp);
+#elif LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0)
+    scsi_release_command(scp);
 #endif       
  
-        if (copy_to_user((char *)arg, &rsc, sizeof(gdth_ioctl_rescan)))
-            return -EFAULT;
-        return 0;
+    if (copy_to_user((char *)arg, &rsc, sizeof(gdth_ioctl_rescan)))
+        return -EFAULT;
+    return 0;
 }
   
 static int gdth_ioctl(struct inode *inode, struct file *filep,
                       unsigned int cmd, unsigned long arg)
 {
     gdth_ha_str *ha; 
-#if LINUX_VERSION_CODE >= 0x020503
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
     Scsi_Cmnd *scp;
-    Scsi_Device *sdev;
-#elif LINUX_VERSION_CODE >= 0x020322
+#elif LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0)
     Scsi_Cmnd *scp;
-    Scsi_Device *sdev;
 #else
     Scsi_Cmnd scp;
-    Scsi_Device sdev;
 #endif
     ulong flags;
     char cmnd[MAX_COMMAND_SIZE];   
@@ -5451,7 +5880,7 @@
       { 
         int cnt = gdth_ctr_count;
         if (put_user(cnt, (int *)arg))
-		return -EFAULT;
+                return -EFAULT;
         break;
       }
 
@@ -5459,7 +5888,7 @@
       { 
         int ver = (GDTH_VERSION<<8) | GDTH_SUBVERSION;
         if (put_user(ver, (int *)arg))
-		return -EFAULT;
+                return -EFAULT;
         break;
       }
       
@@ -5471,7 +5900,7 @@
         osv.subversion = (unchar)(LINUX_VERSION_CODE >> 8);
         osv.revision = (ushort)(LINUX_VERSION_CODE & 0xff);
         if (copy_to_user((char *)arg, &osv, sizeof(gdth_ioctl_osvers)))
-		return -EFAULT;
+                return -EFAULT;
         break;
       }
 
@@ -5507,13 +5936,13 @@
       }
         
       case GDTIOCTL_GENERAL:
-	return ioc_general(arg, cmnd);
+        return ioc_general(arg, cmnd);
 
       case GDTIOCTL_EVENT:
-	return ioc_event(arg);
+        return ioc_event(arg);
 
       case GDTIOCTL_LOCKDRV:
-	return ioc_lockdrv(arg);
+        return ioc_lockdrv(arg);
 
       case GDTIOCTL_LOCKCHN:
       {
@@ -5549,10 +5978,10 @@
       }
 
       case GDTIOCTL_RESCAN:
-	return ioc_rescan(arg, cmnd);
+        return ioc_rescan(arg, cmnd);
 
       case GDTIOCTL_HDRLIST:
-	return ioc_hdrlist(arg, cmnd);
+        return ioc_hdrlist(arg, cmnd);
 
       case GDTIOCTL_RESET_BUS:
       {
@@ -5563,11 +5992,11 @@
             res.ionode >= gdth_ctr_count)
             return -EFAULT;
         hanum = res.ionode; 
+        ha = HADATA(gdth_ctr_tab[hanum]);
 
-        /* Because we need a Scsi_Cmnd struct., we make a scsi_allocate device also for kernels >=2.5.x */        
-#if LINUX_VERSION_CODE >= 0x02053C
-        sdev = scsi_get_host_dev(gdth_ctr_tab[hanum]);
-        scp  = scsi_get_command(sdev, GFP_KERNEL);
+        /* Because we need a Scsi_Cmnd struct., we make a scsi_allocate device also for kernels >=2.6.x */        
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
+        scp  = scsi_get_command(ha->sdev, GFP_KERNEL);
         if (!scp)
             return -ENOMEM;
         scp->cmd_len = 12;
@@ -5576,14 +6005,8 @@
         rval = gdth_eh_bus_reset(scp);
         res.status = (rval == SUCCESS ? S_OK : S_GENERR);
         scsi_put_command(scp);
-        scsi_free_host_dev(sdev);
-#elif LINUX_VERSION_CODE >= 0x020322
-        sdev = scsi_get_host_dev(gdth_ctr_tab[hanum]);
-#if LINUX_VERSION_CODE >= 0x020503
-        scp  = scsi_allocate_device(sdev, 1);
-#else
-        scp  = scsi_allocate_device(sdev, 1, FALSE);
-#endif
+#elif LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0)
+        scp  = scsi_allocate_device(ha->sdev, 1, FALSE);
         if (!scp)
             return -ENOMEM;
         scp->cmd_len = 12;
@@ -5592,18 +6015,15 @@
         rval = gdth_eh_bus_reset(scp);
         res.status = (rval == SUCCESS ? S_OK : S_GENERR);
         scsi_release_command(scp);
-        scsi_free_host_dev(sdev);
-#elif LINUX_VERSION_CODE >= 0x02015F
-        memset(&sdev,0,sizeof(Scsi_Device));
+#else 
+        memset(&ha->sdev,0,sizeof(Scsi_Device));
         memset(&scp, 0,sizeof(Scsi_Cmnd));
-        sdev.host = scp.host = gdth_ctr_tab[hanum];
-        sdev.id = scp.target = sdev.host->this_id;
-        scp.device = &sdev;
+        ha->sdev.host = scp.host = gdth_ctr_tab[hanum];
+        ha->sdev.id = scp.target = ha->sdev.host->this_id;
+        scp.device = &ha->sdev;
         scp.channel = virt_ctr ? 0 : res.number;
         rval = gdth_eh_bus_reset(&scp);
         res.status = (rval == SUCCESS ? S_OK : S_GENERR);
-#else
-        res.status = S_OK;
 #endif
         if (copy_to_user((char *)arg, &res, sizeof(gdth_ioctl_reset)))
             return -EFAULT;
@@ -5611,26 +6031,25 @@
       }
 
       case GDTIOCTL_RESET_DRV:
-	return ioc_resetdrv(arg, cmnd);
+        return ioc_resetdrv(arg, cmnd);
 
       default:
         break; 
     }
     return 0;
 }
-#endif
 
-#if LINUX_VERSION_CODE >= 0x010300
+
 /* flush routine */
 static void gdth_flush(int hanum)
 {
     int             i;
     gdth_ha_str     *ha;
     gdth_cmd_str    gdtcmd;
-#if LINUX_VERSION_CODE >= 0x020503
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
     Scsi_Request    *srp;
     Scsi_Device     *sdev;
-#elif LINUX_VERSION_CODE >= 0x020322
+#elif LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0)
     Scsi_Cmnd       *scp;
     Scsi_Device     *sdev;
 #else
@@ -5643,14 +6062,14 @@
     TRACE2(("gdth_flush() hanum %d\n",hanum));
     ha = HADATA(gdth_ctr_tab[hanum]);
 
-#if LINUX_VERSION_CODE >= 0x020503
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
     sdev = scsi_get_host_dev(gdth_ctr_tab[hanum]);
     srp  = scsi_allocate_request(sdev, GFP_KERNEL);
     if (!srp)
         return;
     srp->sr_cmd_len = 12;
     srp->sr_use_sg = 0;
-#elif LINUX_VERSION_CODE >= 0x020322
+#elif LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0)
     sdev = scsi_get_host_dev(gdth_ctr_tab[hanum]);
     scp  = scsi_allocate_device(sdev, 1, FALSE);
     if (!scp)
@@ -5670,42 +6089,44 @@
             gdtcmd.BoardNode = LOCALBOARD;
             gdtcmd.Service = CACHESERVICE;
             gdtcmd.OpCode = GDT_FLUSH;
-            gdtcmd.u.cache.DeviceNo = i;
-            gdtcmd.u.cache.BlockNo = 1;
-            gdtcmd.u.cache.sg_canz = 0;
+            if (ha->cache_feat & GDT_64BIT) { 
+                gdtcmd.u.cache64.DeviceNo = i;
+                gdtcmd.u.cache64.BlockNo = 1;
+                gdtcmd.u.cache64.sg_canz = 0;
+            } else {
+                gdtcmd.u.cache.DeviceNo = i;
+                gdtcmd.u.cache.BlockNo = 1;
+                gdtcmd.u.cache.sg_canz = 0;
+            }
             TRACE2(("gdth_flush(): flush ha %d drive %d\n", hanum, i));
-#if LINUX_VERSION_CODE >= 0x020503
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
             gdth_do_req(srp, &gdtcmd, cmnd, 30);
-#elif LINUX_VERSION_CODE >= 0x020322
+#elif LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0)
             gdth_do_cmd(scp, &gdtcmd, cmnd, 30);
 #else
             gdth_do_cmd(&scp, &gdtcmd, cmnd, 30);
 #endif
         }
     }
-#if LINUX_VERSION_CODE >= 0x020503
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
     scsi_release_request(srp);
     scsi_free_host_dev(sdev);
-#elif LINUX_VERSION_CODE >= 0x020322
+#elif LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0)
     scsi_release_command(scp);
     scsi_free_host_dev(sdev);
 #endif
 }
 
 /* shutdown routine */
-#if LINUX_VERSION_CODE >= 0x020100
 static int gdth_halt(struct notifier_block *nb, ulong event, void *buf)
-#else
-void gdth_halt(void)
-#endif
 {
     int             hanum;
 #ifndef __alpha__
     gdth_cmd_str    gdtcmd;
-#if LINUX_VERSION_CODE >= 0x020503
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
     Scsi_Request    *srp;
     Scsi_Device     *sdev;
-#elif LINUX_VERSION_CODE >= 0x020322
+#elif LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0)
     Scsi_Cmnd       *scp;
     Scsi_Device     *sdev;
 #else
@@ -5715,20 +6136,11 @@
     char            cmnd[MAX_COMMAND_SIZE];   
 #endif
 
-#if LINUX_VERSION_CODE >= 0x020100
     TRACE2(("gdth_halt() event %d\n",(int)event));
     if (event != SYS_RESTART && event != SYS_HALT && event != SYS_POWER_OFF)
         return NOTIFY_DONE;
-#else
-    TRACE2(("gdth_halt()\n"));
-    if (halt_called) {
-        TRACE2(("already called\n"));
-        return;
-    }
-    halt_called = TRUE;
-#endif
 
-    printk("GDT: Flushing all host drives .. ");
+    printk("GDT-HA: Flushing all host drives .. ");
     for (hanum = 0; hanum < gdth_ctr_count; ++hanum) {
         gdth_flush(hanum);
 
@@ -5739,32 +6151,24 @@
         gdtcmd.Service = CACHESERVICE;
         gdtcmd.OpCode = GDT_RESET;
         TRACE2(("gdth_halt(): reset controller %d\n", hanum));
-#if LINUX_VERSION_CODE >= 0x020503
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
         sdev = scsi_get_host_dev(gdth_ctr_tab[hanum]);
         srp  = scsi_allocate_request(sdev, GFP_KERNEL);
         if (!srp) {
-#if LINUX_VERSION_CODE >= 0x020100
             unregister_reboot_notifier(&gdth_notifier);
             return NOTIFY_OK;
-#else
-            return;
-#endif
         }
         srp->sr_cmd_len = 12;
         srp->sr_use_sg = 0;
         gdth_do_req(srp, &gdtcmd, cmnd, 10);
         scsi_release_request(srp);
         scsi_free_host_dev(sdev);
-#elif LINUX_VERSION_CODE >= 0x020322
+#elif LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0)
         sdev = scsi_get_host_dev(gdth_ctr_tab[hanum]);
         scp  = scsi_allocate_device(sdev, 1, FALSE);
         if (!scp) {
-#if LINUX_VERSION_CODE >= 0x020100
             unregister_reboot_notifier(&gdth_notifier);
             return NOTIFY_OK;
-#else
-            return;
-#endif
         }
         scp->cmd_len = 12;
         scp->use_sg = 0;
@@ -5786,15 +6190,12 @@
 #ifdef GDTH_STATISTICS
     del_timer(&gdth_timer);
 #endif
-#if LINUX_VERSION_CODE >= 0x020100
     unregister_reboot_notifier(&gdth_notifier);
     return NOTIFY_OK;
-#endif
 }
-#endif
 
 
-#if LINUX_VERSION_CODE < 0x020400 && !defined(MODULE)
+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,4,0) && !defined(MODULE)
 
 GDTH_INITFUNC(void, gdth_setup(char *str,int *ints)) 
 {    
@@ -5805,33 +6206,36 @@
 
 #else
 
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0)
 static Scsi_Host_Template driver_template = {
-#if LINUX_VERSION_CODE >= 0x02015F
-	.proc_name		= "gdth", 
-#else
-	.proc_dir		= &proc_scsi_gdth,
+        .proc_name              = "gdth", 
+        .proc_info              = gdth_proc_info,
+        .name                   = "GDT SCSI Disk Array Controller",
+        .detect                 = gdth_detect, 
+        .release                = gdth_release,
+        .info                   = gdth_info, 
+        .queuecommand           = gdth_queuecommand,
+        .eh_abort_handler       = gdth_eh_abort, 
+        .eh_device_reset_handler = gdth_eh_device_reset,
+        .eh_bus_reset_handler   = gdth_eh_bus_reset,
+        .eh_host_reset_handler  = gdth_eh_host_reset,
+        .bios_param             = gdth_bios_param,
+        .can_queue              = GDTH_MAXCMDS,
+        .this_id                = -1,
+        .sg_tablesize           = GDTH_MAXSG,
+        .cmd_per_lun            = GDTH_MAXC_P_L,
+        .unchecked_isa_dma      = 1,
+        .use_clustering         = ENABLE_CLUSTERING,
+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,0)
+        .use_new_eh_code        = 1,
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,20)
+        .highmem_io             = 1,
 #endif
-	.proc_info		= gdth_proc_info,
-	.name			= "GDT SCSI Disk Array Controller",
-	.detect			= gdth_detect, 
-	.release		= gdth_release,
-	.info			= gdth_info, 
-	.queuecommand		= gdth_queuecommand,
-	.eh_abort_handler	= gdth_eh_abort, 
-	.eh_device_reset_handler = gdth_eh_device_reset,
-	.eh_bus_reset_handler	= gdth_eh_bus_reset,
-	.eh_host_reset_handler	= gdth_eh_host_reset,
-	.bios_param		= gdth_bios_param,
-	.can_queue		= GDTH_MAXCMDS,
-	.this_id		= -1,
-	.sg_tablesize		= GDTH_MAXSG,
-	.cmd_per_lun		= GDTH_MAXC_P_L,
-	.unchecked_isa_dma	= 1,
-	.use_clustering		= ENABLE_CLUSTERING,
-#if LINUX_VERSION_CODE < 0x020501
-	.use_new_eh_code	= 1,
 #endif
 };
+#else
+static Scsi_Host_Template driver_template = GDTH;
+#endif
 
 #include "scsi_module.c"
 #ifndef MODULE
diff -Nru a/drivers/scsi/gdth.h b/drivers/scsi/gdth.h
--- a/drivers/scsi/gdth.h	2004-05-26 15:01:35 -07:00
+++ b/drivers/scsi/gdth.h	2004-05-26 15:01:35 -07:00
@@ -10,7 +10,7 @@
  *
  * <achim_leubner@adaptec.com>
  *
- * $Id: gdth.h,v 1.50 2003/09/17 08:29:58 achim Exp $
+ * $Id: gdth.h,v 1.57 2004/03/31 11:52:09 achim Exp $
  */
 
 #include <linux/version.h>
@@ -26,9 +26,9 @@
 /* defines, macros */
 
 /* driver version */
-#define GDTH_VERSION_STR        "2.08"
-#define GDTH_VERSION            2
-#define GDTH_SUBVERSION         8
+#define GDTH_VERSION_STR        "3.04"
+#define GDTH_VERSION            3
+#define GDTH_SUBVERSION         4
 
 /* protocol version */
 #define PROTOCOL_VERSION        1
@@ -133,7 +133,12 @@
 /* new GDT Rx Controller */
 #define PCI_DEVICE_ID_VORTEX_GDTNEWRX   0x300
 #endif
-        
+
+#ifndef PCI_DEVICE_ID_VORTEX_GDTNEWRX2
+/* new(2) GDT Rx Controller */
+#define PCI_DEVICE_ID_VORTEX_GDTNEWRX2  0x301
+#endif        
+
 #ifndef PCI_DEVICE_ID_INTEL_SRC
 /* Intel Storage RAID Controller */
 #define PCI_DEVICE_ID_INTEL_SRC         0x600
@@ -146,8 +151,7 @@
 
 /* limits */
 #define GDTH_SCRATCH    PAGE_SIZE               /* 4KB scratch buffer */
-#define GDTH_SCRATCH_ORD 0                      /* order 0 means 1 page */
-#define GDTH_MAXCMDS    124
+#define GDTH_MAXCMDS    120
 #define GDTH_MAXC_P_L   16                      /* max. cmds per lun */
 #define GDTH_MAX_RAW    2                       /* max. cmds per raw device */
 #define MAXOFFSETS      128
@@ -221,6 +225,8 @@
 #define GDT_CLUST_RESET 24                      /* releases the cluster drives*/
 #define GDT_FREEZE_IO   25                      /* freezes all IOs */
 #define GDT_UNFREEZE_IO 26                      /* unfreezes all IOs */
+#define GDT_X_INIT_HOST 29                      /* ext. init: 64 bit support */
+#define GDT_X_INFO      30                      /* ext. info for drives>2TB */
 
 /* raw service commands */
 #define GDT_RESERVE     14                      /* reserve dev. to raw serv. */
@@ -230,9 +236,11 @@
 #define GDT_RESET_BUS   18                      /* reset bus */
 #define GDT_SCAN_START  19                      /* start device scan */
 #define GDT_SCAN_END    20                      /* stop device scan */  
+#define GDT_X_INIT_RAW  21                      /* ext. init: 64 bit support */
 
 /* screen service commands */
 #define GDT_REALTIME    3                       /* realtime clock to screens. */
+#define GDT_X_INIT_SCR  4                       /* ext. init: 64 bit support */
 
 /* IOCTL command defines */
 #define SCSI_DR_INFO    0x00                    /* SCSI drive info */                   
@@ -254,6 +262,8 @@
 #define CACHE_DRV_INFO  0x07                    /* cache drive info */
 #define BOARD_FEATURES  0x15                    /* controller features */
 #define BOARD_INFO      0x28                    /* controller info */
+#define SET_PERF_MODES  0x82                    /* set mode (coalescing,..) */
+#define GET_PERF_MODES  0x83                    /* get mode */
 #define CACHE_READ_OEM_STRING_RECORD 0x84       /* read OEM string record */ 
 #define HOST_GET        0x10001L                /* get host drive list */
 #define IO_CHANNEL      0x00020000L             /* default IO channel */
@@ -266,6 +276,7 @@
 #define S_CACHE_UNKNOWN 12                      /* cache serv.: drive unknown */
 #define S_RAW_SCSI      12                      /* raw serv.: target error */
 #define S_RAW_ILL       0xff                    /* raw serv.: illegal */
+#define S_NOFUNC        -2                      /* unknown function */
 #define S_CACHE_RESERV  -24                     /* cache: reserv. conflict */   
 
 /* timeout values */
@@ -307,7 +318,12 @@
 #define LOCALBOARD      0                       /* board node always 0 */
 #define ASYNCINDEX      0                       /* cmd index async. event */
 #define SPEZINDEX       1                       /* cmd index unknown service */
+#define COALINDEX       (GDTH_MAXCMDS + 2)
+
+/* features */
+#define SCATTER_GATHER  1                       /* s/g feature */
 #define GDT_WR_THROUGH  0x100                   /* WRITE_THROUGH supported */
+#define GDT_64BIT       0x200                   /* 64bit / drv>2TB support */
 
 #include "gdth_ioctl.h"
 
@@ -322,7 +338,40 @@
     char        msg_text[MSGLEN+2];             /* the message text */
 } PACKED gdth_msg_str;
 
+
 /* IOCTL data structures */
+
+/* Status coalescing buffer for returning multiple requests per interrupt */
+typedef struct {
+    ulong32     status;
+    ulong32     ext_status;
+    ulong32     info0;
+    ulong32     info1;
+} PACKED gdth_coal_status;
+
+/* performance mode data structure */
+typedef struct {
+    ulong32     version;            /* The version of this IOCTL structure. */
+    ulong32     st_mode;            /* 0=dis., 1=st_buf_addr1 valid, 2=both  */
+    ulong32     st_buff_addr1;      /* physical address of status buffer 1 */
+    ulong32     st_buff_u_addr1;    /* reserved for 64 bit addressing */
+    ulong32     st_buff_indx1;      /* reserved command idx. for this buffer */
+    ulong32     st_buff_addr2;      /* physical address of status buffer 1 */
+    ulong32     st_buff_u_addr2;    /* reserved for 64 bit addressing */
+    ulong32     st_buff_indx2;      /* reserved command idx. for this buffer */
+    ulong32     st_buff_size;       /* size of each buffer in bytes */
+    ulong32     cmd_mode;           /* 0 = mode disabled, 1 = cmd_buff_addr1 */ 
+    ulong32     cmd_buff_addr1;     /* physical address of cmd buffer 1 */   
+    ulong32     cmd_buff_u_addr1;   /* reserved for 64 bit addressing */
+    ulong32     cmd_buff_indx1;     /* cmd buf addr1 unique identifier */
+    ulong32     cmd_buff_addr2;     /* physical address of cmd buffer 1 */   
+    ulong32     cmd_buff_u_addr2;   /* reserved for 64 bit addressing */
+    ulong32     cmd_buff_indx2;     /* cmd buf addr1 unique identifier */
+    ulong32     cmd_buff_size;      /* size of each cmd bufer in bytes */
+    ulong32     reserved1;
+    ulong32     reserved2;
+} PACKED gdth_perf_modes;
+
 /* SCSI drive info */
 typedef struct {
     unchar      vendor[8];                      /* vendor string */
@@ -795,9 +844,7 @@
 
 /* PCI resources */
 typedef struct {
-#if LINUX_VERSION_CODE >= 0x02015C
     struct pci_dev      *pdev;
-#endif
     ushort              vendor_id;              /* vendor (ICP, Intel, ..) */
     ushort              device_id;              /* device ID (0,..,9) */
     ushort              subdevice_id;           /* sub device ID */
@@ -814,20 +861,28 @@
 typedef struct {
     ushort              oem_id;                 /* OEM */
     ushort              type;                   /* controller class */
-    ushort              raw_feat;               /* feat. raw service (s/g,..) */
     ulong32             stype;                  /* subtype (PCI: device ID) */
     ushort              subdevice_id;           /* sub device ID (PCI) */
     ushort              fw_vers;                /* firmware version */
-    ushort              cache_feat;             /* feat. cache serv. (s/g,..) */
+    ushort              cache_feat;             /* feat. cache serv. (s/g,..)*/
+    ushort              raw_feat;               /* feat. raw service (s/g,..)*/
+    ushort              screen_feat;            /* feat. raw service (s/g,..)*/
     ushort              bmic;                   /* BMIC address (EISA) */
     void                *brd;                   /* DPRAM address */
     ulong32             brd_phys;               /* slot number/BIOS address */
     gdt6c_plx_regs      *plx;                   /* PLX regs (new PCI contr.) */
     gdth_cmd_str        *pccb;                  /* address command structure */
     ulong32             ccb_phys;               /* phys. address */
+#ifdef INT_COAL
+    gdth_coal_status    *coal_stat;             /* buffer for coalescing int.*/
+    ulong64             coal_stat_phys;         /* phys. address */
+#endif
     char                *pscratch;              /* scratch (DMA) buffer */
-    ulong32             scratch_phys;           /* phys. address */
+    ulong64             scratch_phys;           /* phys. address */
     unchar              scratch_busy;           /* in use? */
+    unchar              dma64_support;          /* 64-bit DMA supported? */
+    gdth_msg_str        *pmsg;                  /* message buffer */
+    ulong64             msg_phys;               /* phys. address */
     unchar              scan_mode;              /* current scan mode */
     unchar              irq;                    /* IRQ */
     unchar              drq;                    /* DRQ (ISA controllers) */
@@ -848,11 +903,11 @@
         unchar          heads;                  /* mapping */
         unchar          secs;
         ushort          devtype;                /* further information */
-        ulong32         size;                   /* capacity */
+        ulong64         size;                   /* capacity */
         unchar          ldr_no;                 /* log. drive no. */
         unchar          rw_attribs;             /* r/w attributes */
         unchar          cluster_type;           /* cluster properties */
-        unchar          media_changed;          /* Flag:MOUNT/UNMOUNT occurred*/
+        unchar          media_changed;          /* Flag:MOUNT/UNMOUNT occured */
         ulong32         start_sec;              /* start sector */
     } hdr[MAX_LDRIVES];                         /* host drives */
     struct {
@@ -880,13 +935,19 @@
     gdth_bfeat_str      bfeat;                  /* controller features */
     gdth_binfo_str      binfo;                  /* controller info */
     gdth_evt_data       dvr;                    /* event structure */
-#if LINUX_VERSION_CODE >= 0x02015F
     spinlock_t          smp_lock;
-#endif
-#if LINUX_VERSION_CODE >= 0x020400
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0)
     struct pci_dev      *pdev;
 #endif
     char                oem_name[8];
+#ifdef GDTH_DMA_STATISTICS
+    ulong               dma32_cnt, dma64_cnt;   /* statistics: DMA buffer */
+#endif
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0)
+    Scsi_Device         *sdev;
+#else
+    Scsi_Device         sdev;
+#endif
 } gdth_ha_str;
 
 /* structure for scsi_register(), SCSI bus != 0 */
@@ -924,6 +985,12 @@
     ulong32     block_length;
 } PACKED gdth_rdcap_data;
 
+/* READ_CAPACITY (16) data format */
+typedef struct {
+    ulong64     last_block_no;
+    ulong32     block_length;
+} PACKED gdth_rdcap16_data;
+
 /* REQUEST_SENSE data format */
 typedef struct {
     unchar      errorcode;
@@ -965,42 +1032,48 @@
 int gdth_detect(Scsi_Host_Template *);
 int gdth_release(struct Scsi_Host *);
 int gdth_queuecommand(Scsi_Cmnd *,void (*done)(Scsi_Cmnd *));
-int gdth_abort(Scsi_Cmnd *);
-#if LINUX_VERSION_CODE >= 0x010346
-int gdth_reset(Scsi_Cmnd *, unsigned int reset_flags);
-#else
-int gdth_reset(Scsi_Cmnd *);
-#endif
 const char *gdth_info(struct Scsi_Host *);
 
-#if LINUX_VERSION_CODE >= 0x020501
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
 int gdth_bios_param(struct scsi_device *,struct block_device *,sector_t,int *);
 int gdth_proc_info(struct Scsi_Host *, char *,char **,off_t,int,int);
-int gdth_eh_abort(Scsi_Cmnd *scp);
-int gdth_eh_device_reset(Scsi_Cmnd *scp);
-int gdth_eh_bus_reset(Scsi_Cmnd *scp);
-int gdth_eh_host_reset(Scsi_Cmnd *scp);
-#elif LINUX_VERSION_CODE >= 0x020322
+#elif LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0)
 int gdth_bios_param(Disk *,kdev_t,int *);
 int gdth_proc_info(char *,char **,off_t,int,int,int);
-int gdth_eh_abort(Scsi_Cmnd *scp);
-int gdth_eh_device_reset(Scsi_Cmnd *scp);
-int gdth_eh_bus_reset(Scsi_Cmnd *scp);
-int gdth_eh_host_reset(Scsi_Cmnd *scp);
-#elif LINUX_VERSION_CODE >= 0x02015F
+#else
 int gdth_bios_param(Disk *,kdev_t,int *);
 extern struct proc_dir_entry proc_scsi_gdth;
 int gdth_proc_info(char *,char **,off_t,int,int,int);
+int gdth_abort(Scsi_Cmnd *);
+int gdth_reset(Scsi_Cmnd *,unsigned int); 
+#define GDTH { proc_dir:        &proc_scsi_gdth,                 \
+               proc_info:       gdth_proc_info,                  \
+               name:            "GDT SCSI Disk Array Controller",\
+               detect:          gdth_detect,                     \
+               release:         gdth_release,                    \
+               info:            gdth_info,                       \
+               command:         NULL,                            \
+               queuecommand:    gdth_queuecommand,               \
+               eh_abort_handler: gdth_eh_abort,                  \
+               eh_device_reset_handler: gdth_eh_device_reset,    \
+               eh_bus_reset_handler: gdth_eh_bus_reset,          \
+               eh_host_reset_handler: gdth_eh_host_reset,        \
+               abort:           gdth_abort,                      \
+               reset:           gdth_reset,                      \
+               bios_param:      gdth_bios_param,                 \
+               can_queue:       GDTH_MAXCMDS,                    \
+               this_id:         -1,                              \
+               sg_tablesize:    GDTH_MAXSG,                      \
+               cmd_per_lun:     GDTH_MAXC_P_L,                   \
+               present:         0,                               \
+               unchecked_isa_dma: 1,                             \
+               use_clustering:  ENABLE_CLUSTERING,               \
+               use_new_eh_code: 1       /* use new error code */ }    
+#endif
+
 int gdth_eh_abort(Scsi_Cmnd *scp);
 int gdth_eh_device_reset(Scsi_Cmnd *scp);
 int gdth_eh_bus_reset(Scsi_Cmnd *scp);
 int gdth_eh_host_reset(Scsi_Cmnd *scp);
-#elif LINUX_VERSION_CODE >= 0x010300
-int gdth_bios_param(Disk *,kdev_t,int *);
-extern struct proc_dir_entry proc_scsi_gdth;
-int gdth_proc_info(char *,char **,off_t,int,int,int);
-#else
-int gdth_bios_param(Disk *,int,int *);
-#endif
-#endif
 
+#endif
diff -Nru a/drivers/scsi/gdth_ioctl.h b/drivers/scsi/gdth_ioctl.h
--- a/drivers/scsi/gdth_ioctl.h	2004-05-26 15:01:36 -07:00
+++ b/drivers/scsi/gdth_ioctl.h	2004-05-26 15:01:36 -07:00
@@ -2,7 +2,7 @@
 #define _GDTH_IOCTL_H
 
 /* gdth_ioctl.h
- * $Id: gdth_ioctl.h,v 1.11 2003/02/27 14:59:03 achim Exp $
+ * $Id: gdth_ioctl.h,v 1.14 2004/02/19 15:43:15 achim Exp $
  */
 
 /* IOCTLs */
@@ -21,8 +21,8 @@
 #define GDTIOCTL_RESCAN     (GDTIOCTL_MASK |11) /* rescan host drives */
 #define GDTIOCTL_RESET_DRV  (GDTIOCTL_MASK |12) /* reset (remote) drv. res. */
 
-#define GDTIOCTL_MAGIC      0xaffe0004
-#define EVENT_SIZE          294 
+#define GDTIOCTL_MAGIC  0xaffe0004
+#define EVENT_SIZE      294 
 #define GDTH_MAXSG      32                      /* max. s/g elements */
 
 #define MAX_LDRIVES     255                     /* max. log. drive count */
@@ -35,7 +35,9 @@
 /* typedefs */
 #ifdef __KERNEL__
 typedef u32     ulong32;
+typedef u64     ulong64;
 #endif
+
 #define PACKED  __attribute__((packed))
 
 /* scatter/gather element */
@@ -44,6 +46,12 @@
     ulong32     sg_len;                         /* length */
 } PACKED gdth_sg_str;
 
+/* scatter/gather element - 64bit addresses */
+typedef struct {
+    ulong64     sg_ptr;                         /* address */
+    ulong32     sg_len;                         /* length */
+} PACKED gdth_sg64_str;
+
 /* command structure */
 typedef struct {
     ulong32     BoardNode;                      /* board node (always 0) */
@@ -59,17 +67,25 @@
             gdth_sg_str sg_lst[GDTH_MAXSG];     /* s/g list */
         } PACKED cache;                         /* cache service cmd. str. */
         struct {
+            ushort      DeviceNo;               /* number of cache drive */
+            ulong64     BlockNo;                /* block number */
+            ulong32     BlockCnt;               /* block count */
+            ulong64     DestAddr;               /* dest. addr. (if s/g: -1) */
+            ulong32     sg_canz;                /* s/g element count */
+            gdth_sg64_str sg_lst[GDTH_MAXSG];   /* s/g list */
+        } PACKED cache64;                       /* cache service cmd. str. */
+        struct {
             ushort      param_size;             /* size of p_param buffer */
             ulong32     subfunc;                /* IOCTL function */
             ulong32     channel;                /* device */
-            ulong32     p_param;                /* buffer */
+            ulong64     p_param;                /* buffer */
         } PACKED ioctl;                         /* IOCTL command structure */
         struct {
             ushort      reserved;
             union {
                 struct {
                     ulong32  msg_handle;        /* message handle */
-                    ulong32  msg_addr;          /* message buffer address */
+                    ulong64  msg_addr;          /* message buffer address */
                 } PACKED msg;
                 unchar       data[12];          /* buffer for rtc data, ... */
             } su;
@@ -93,6 +109,24 @@
             ulong32     sg_ranz;                /* s/g element count */
             gdth_sg_str sg_lst[GDTH_MAXSG];     /* s/g list */
         } PACKED raw;                           /* raw service cmd. struct. */
+        struct {
+            ushort      reserved;
+            ulong32     direction;              /* data direction */
+            ulong32     mdisc_time;             /* disc. time (0: no timeout)*/
+            ulong32     mcon_time;              /* connect time(0: no to.) */
+            ulong64     sdata;                  /* dest. addr. (if s/g: -1) */
+            ulong32     sdlen;                  /* data length (bytes) */
+            ulong32     clen;                   /* SCSI cmd. length(6,..,16) */
+            unchar      cmd[16];                /* SCSI command */
+            unchar      target;                 /* target ID */
+            unchar      lun;                    /* LUN */
+            unchar      bus;                    /* SCSI bus number */
+            unchar      priority;               /* only 0 used */
+            ulong32     sense_len;              /* sense data length */
+            ulong64     sense_data;             /* sense data addr. */
+            ulong32     sg_ranz;                /* s/g element count */
+            gdth_sg64_str sg_lst[GDTH_MAXSG];   /* s/g list */
+        } PACKED raw64;                         /* raw service cmd. struct. */
     } u;
     /* additional variables */
     unchar      Service;                        /* controller service */
@@ -236,7 +270,6 @@
 } gdth_iord_str;
 #endif
 
-#ifdef GDTH_IOCTL_CHRDEV
 /* GDTIOCTL_GENERAL */
 typedef struct {
     ushort ionode;                              /* controller number */
@@ -244,8 +277,8 @@
     ulong32 info;                               /* error info */ 
     ushort status;                              /* status */
     ulong data_len;                             /* data buffer size */
-    ulong sense_len;	                        /* sense buffer size */
-    gdth_cmd_str command;                       /* command */			
+    ulong sense_len;                            /* sense buffer size */
+    gdth_cmd_str command;                       /* command */                   
 } gdth_ioctl_general;
 
 /* GDTIOCTL_LOCKDRV */
@@ -310,6 +343,5 @@
     ushort number;                              /* bus/host drive number */
     ushort status;                              /* status */
 } gdth_ioctl_reset;
-#endif
 
 #endif
diff -Nru a/drivers/scsi/gdth_proc.c b/drivers/scsi/gdth_proc.c
--- a/drivers/scsi/gdth_proc.c	2004-05-26 15:01:36 -07:00
+++ b/drivers/scsi/gdth_proc.c	2004-05-26 15:01:36 -07:00
@@ -1,56 +1,80 @@
 /* gdth_proc.c 
- * $Id: gdth_proc.c,v 1.37 2003/09/17 08:31:53 achim Exp $
+ * $Id: gdth_proc.c,v 1.42 2004/03/05 15:50:20 achim Exp $
  */
 
-#if LINUX_VERSION_CODE >= 0x020407
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,7)
 #include <linux/completion.h>
 #endif
 
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
 int gdth_proc_info(struct Scsi_Host *host, char *buffer,char **start,off_t offset,int length,   
                    int inout)
 {
     int hanum,busnum;
 
-    TRACE2(("gdth_proc_info() length %d ha %d offs %d inout %d\n",
-            length,hostno,(int)offset,inout));
+    TRACE2(("gdth_proc_info() length %d offs %d inout %d\n",
+            length,(int)offset,inout));
 
     hanum = NUMDATA(host)->hanum;
     busnum= NUMDATA(host)->busnum;
 
     if (inout)
-        return(gdth_set_info(buffer,length,hanum,busnum));
+        return(gdth_set_info(buffer,length,host,hanum,busnum));
     else
-        return(gdth_get_info(buffer,start,offset,length,hanum,busnum));
+        return(gdth_get_info(buffer,start,offset,length,host,hanum,busnum));
 }
+#else
+int gdth_proc_info(char *buffer,char **start,off_t offset,int length,int hostno,   
+                   int inout)
+{
+    int hanum,busnum,i;
+
+    TRACE2(("gdth_proc_info() length %d offs %d inout %d\n",
+            length,(int)offset,inout));
+
+    for (i = 0; i < gdth_ctr_vcount; ++i) {
+        if (gdth_ctr_vtab[i]->host_no == hostno)
+            break;
+    }
+    if (i == gdth_ctr_vcount)
+        return(-EINVAL);
+
+    hanum = NUMDATA(gdth_ctr_vtab[i])->hanum;
+    busnum= NUMDATA(gdth_ctr_vtab[i])->busnum;
+
+    if (inout)
+        return(gdth_set_info(buffer,length,gdth_ctr_vtab[i],hanum,busnum));
+    else
+        return(gdth_get_info(buffer,start,offset,length,
+                             gdth_ctr_vtab[i],hanum,busnum));
+}
+#endif
 
-static int gdth_set_info(char *buffer,int length,int hanum,int busnum)
+static int gdth_set_info(char *buffer,int length,struct Scsi_Host *host,
+                         int hanum,int busnum)
 {
     int             ret_val = -EINVAL;
-#if LINUX_VERSION_CODE >= 0x020503
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
     Scsi_Request    *scp;
     Scsi_Device     *sdev;
-#elif LINUX_VERSION_CODE >= 0x020322
+#elif LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0)
     Scsi_Cmnd       *scp;
     Scsi_Device     *sdev;
 #else
     Scsi_Cmnd       scp;
     Scsi_Device     sdev;
 #endif
-#ifdef GDTH_IOCTL_PROC
-    gdth_iowr_str   *piowr;
-    piowr = (gdth_iowr_str *)buffer;
-#endif
     TRACE2(("gdth_set_info() ha %d bus %d\n",hanum,busnum));
 
-#if LINUX_VERSION_CODE >= 0x020503
-    sdev = scsi_get_host_dev(gdth_ctr_tab[hanum]);
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
+    sdev = scsi_get_host_dev(host);
     scp  = scsi_allocate_request(sdev, GFP_KERNEL);
     if (!scp)
         return -ENOMEM;
     scp->sr_cmd_len = 12;
     scp->sr_use_sg = 0;
-#elif LINUX_VERSION_CODE >= 0x020322
-    sdev = scsi_get_host_dev(gdth_ctr_tab[hanum]);
+#elif LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0)
+    sdev = scsi_get_host_dev(host);
     scp  = scsi_allocate_device(sdev, 1, FALSE);
     if (!scp)
         return -ENOMEM;
@@ -59,7 +83,7 @@
 #else
     memset(&sdev,0,sizeof(Scsi_Device));
     memset(&scp, 0,sizeof(Scsi_Cmnd));
-    sdev.host = scp.host = gdth_ctr_tab[hanum];
+    sdev.host = scp.host = host;
     sdev.id = scp.target = sdev.host->this_id;
     scp.device = &sdev;
 #endif
@@ -69,32 +93,21 @@
             buffer += 5;
             length -= 5;
             ret_val = gdth_set_asc_info( buffer, length, hanum, scp );
-#ifdef GDTH_IOCTL_PROC
-        } else if (piowr->magic == GDTIOCTL_MAGIC) {
-            ret_val = gdth_set_bin_info( buffer, length, hanum, scp );
-        } else {
-            printk("GDT: Wrong signature %x (%x required)!\n",
-                   piowr->magic, GDTIOCTL_MAGIC);
-            if (piowr->magic > GDTIOCTL_MAGIC)
-                printk("GDT: Please update your driver.\n");
-            else
-                printk("GDT: Please update your tool.\n");
-#endif
         }
     }
-#if LINUX_VERSION_CODE >= 0x020503
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
     scsi_release_request(scp);
     scsi_free_host_dev(sdev);
-#elif LINUX_VERSION_CODE >= 0x020322
+#elif LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0)
     scsi_release_command(scp);
     scsi_free_host_dev(sdev);
 #endif
     return ret_val;
 }
          
-#if LINUX_VERSION_CODE >= 0x020503
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
 static int gdth_set_asc_info(char *buffer,int length,int hanum,Scsi_Request *scp)
-#elif LINUX_VERSION_CODE >= 0x020322
+#elif LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0)
 static int gdth_set_asc_info(char *buffer,int length,int hanum,Scsi_Cmnd *scp)
 #else
 static int gdth_set_asc_info(char *buffer,int length,int hanum,Scsi_Cmnd scp)
@@ -105,7 +118,7 @@
     gdth_ha_str     *ha;
     gdth_cmd_str    gdtcmd;
     gdth_cpar_str   *pcpar;
-    ulong32         paddr;
+    ulong64         paddr;
 
     char            cmnd[MAX_COMMAND_SIZE];
     memset(cmnd, 0xff, 12);
@@ -139,11 +152,16 @@
                 found = TRUE;
                 gdtcmd.Service = CACHESERVICE;
                 gdtcmd.OpCode = GDT_FLUSH;
-                gdtcmd.u.cache.DeviceNo = i;
-                gdtcmd.u.cache.BlockNo = 1;
-#if LINUX_VERSION_CODE >= 0x020503
+                if (ha->cache_feat & GDT_64BIT) {
+                    gdtcmd.u.cache64.DeviceNo = i;
+                    gdtcmd.u.cache64.BlockNo = 1;
+                } else {
+                    gdtcmd.u.cache.DeviceNo = i;
+                    gdtcmd.u.cache.BlockNo = 1;
+                }
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
                 gdth_do_req(scp, &gdtcmd, cmnd, 30);
-#elif LINUX_VERSION_CODE >= 0x020322
+#elif LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0)
                 gdth_do_cmd(scp, &gdtcmd, cmnd, 30);
 #else
                 gdth_do_cmd(&scp, &gdtcmd, cmnd, 30);
@@ -199,9 +217,9 @@
         gdtcmd.u.ioctl.subfunc = CACHE_CONFIG;
         gdtcmd.u.ioctl.channel = INVALID_CHANNEL;
         pcpar->write_back = wb_mode==1 ? 0:1;
-#if LINUX_VERSION_CODE >= 0x020503
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
         gdth_do_req(scp, &gdtcmd, cmnd, 30);
-#elif LINUX_VERSION_CODE >= 0x020322
+#elif LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0)
         gdth_do_cmd(scp, &gdtcmd, cmnd, 30);
 #else
         gdth_do_cmd(&scp, &gdtcmd, cmnd, 30);
@@ -215,562 +233,23 @@
     return(-EINVAL);
 }
 
-#ifdef GDTH_IOCTL_PROC
-#if LINUX_VERSION_CODE >= 0x020503
-static int gdth_set_bin_info(char *buffer,int length,int hanum,Scsi_Request *scp)
-#elif LINUX_VERSION_CODE >= 0x020322
-static int gdth_set_bin_info(char *buffer,int length,int hanum,Scsi_Cmnd *scp)
-#else
-static int gdth_set_bin_info(char *buffer,int length,int hanum,Scsi_Cmnd scp)
-#endif
-{
-    unchar          i, j;
-    ushort          k, hdr_cnt, status;
-    gdth_ha_str     *ha;
-    gdth_iowr_str   *piowr;
-    gdth_iord_str   *piord;
-    gdth_cmd_str    *pcmd;
-    gdth_evt_str    *pevt;
-    ulong32         *ppadd, add_size, *ppadd2, add_size2, info, paddr;
-    ulong           flags;
-    gdth_cmd_str    gdtcmd;
-    int             drv_cyls, drv_hds, drv_secs;
- 
-    char            cmnd[MAX_COMMAND_SIZE];   
-    memset(cmnd, 0xff, 12);
-    memset(&gdtcmd, 0, sizeof(gdth_cmd_str));
-
-    TRACE2(("gdth_set_bin_info() ha %d\n",hanum));
-    ha = HADATA(gdth_ctr_tab[hanum]);
-    piowr = (gdth_iowr_str *)buffer;
-    piord = NULL;
-    pcmd = NULL;
-    ppadd = ppadd2 = NULL;
-    add_size = add_size2 = 0;
-
-    if (length < GDTOFFSOF(gdth_iowr_str,iu))
-        return(-EINVAL);
-
-    switch (piowr->ioctl) {
-      case GDTIOCTL_GENERAL:
-        if (length < GDTOFFSOF(gdth_iowr_str,iu.general.data[0]))
-            return(-EINVAL);
-        pcmd = (gdth_cmd_str *)piowr->iu.general.command;
-        pcmd->Service = piowr->service;
-        if (pcmd->OpCode == GDT_IOCTL) {
-            ppadd = &pcmd->u.ioctl.p_param;
-            add_size = pcmd->u.ioctl.param_size;
-        } else if (piowr->service == CACHESERVICE) {
-            add_size = pcmd->u.cache.BlockCnt * SECTOR_SIZE;
-            if (ha->cache_feat & SCATTER_GATHER) {
-                ppadd = &pcmd->u.cache.sg_lst[0].sg_ptr;
-                pcmd->u.cache.DestAddr = 0xffffffff;
-                pcmd->u.cache.sg_lst[0].sg_len = add_size;
-                pcmd->u.cache.sg_canz = 1;
-            } else {
-                ppadd = &pcmd->u.cache.DestAddr;
-                pcmd->u.cache.sg_canz = 0;
-            }
-        } else if (piowr->service == SCSIRAWSERVICE) {
-            add_size = pcmd->u.raw.sdlen;
-            add_size2 = pcmd->u.raw.sense_len;
-            if (ha->raw_feat & SCATTER_GATHER) {
-                ppadd = &pcmd->u.raw.sg_lst[0].sg_ptr;
-                pcmd->u.raw.sdata = 0xffffffff;
-                pcmd->u.raw.sg_lst[0].sg_len = add_size;
-                pcmd->u.raw.sg_ranz = 1;
-            } else {
-                ppadd = &pcmd->u.raw.sdata;
-                pcmd->u.raw.sg_ranz = 0;
-            }
-            ppadd2 = &pcmd->u.raw.sense_data;
-        } else {
-            return(-EINVAL);
-        }
-        if (!gdth_ioctl_alloc( hanum, sizeof(gdth_iord_str)+add_size+add_size2,
-                               TRUE, &paddr ))
-            return(-EBUSY);
-        piord = (gdth_iord_str *)ha->pscratch;
-        piord->size = sizeof(gdth_iord_str) + add_size + add_size2;
-        if (add_size > 0) {
-            memcpy(piord->iu.general.data, piowr->iu.general.data, add_size);
-            *ppadd = paddr + GDTOFFSOF(gdth_iord_str, iu.general.data[0]);
-        }
-        if (add_size2 > 0) {
-            memcpy(piord->iu.general.data+add_size, piowr->iu.general.data, add_size2);
-            *ppadd2 = paddr + GDTOFFSOF(gdth_iord_str, iu.general.data[0]) + add_size2;
-        }
-        
-        /* do IOCTL */
-#if LINUX_VERSION_CODE >= 0x020503
-        gdth_do_req(scp, pcmd, cmnd, piowr->timeout);
-        piord->status = (scp->sr_command->SCp.Message << 16) |
-            scp->sr_command->SCp.Status;
-#elif LINUX_VERSION_CODE >= 0x020322
-        gdth_do_cmd(scp, pcmd, cmnd, piowr->timeout);
-        piord->status = (scp->SCp.Message<<16)|scp->SCp.Status;
-#else
-        gdth_do_cmd(&scp, pcmd, cmnd, piowr->timeout);
-        piord->status = (scp.SCp.Message<<16)|scp.SCp.Status;
-#endif
-        break;
-
-      case GDTIOCTL_DRVERS:
-        if (!gdth_ioctl_alloc( hanum, sizeof(gdth_iord_str), TRUE, &paddr ))
-            return(-EBUSY);
-        piord = (gdth_iord_str *)ha->pscratch;
-        piord->size = sizeof(gdth_iord_str);
-        piord->status = S_OK;
-        piord->iu.drvers.version = (GDTH_VERSION<<8) | GDTH_SUBVERSION;
-        break;
-
-      case GDTIOCTL_CTRTYPE:
-        if (!gdth_ioctl_alloc( hanum, sizeof(gdth_iord_str), TRUE, &paddr ))
-            return(-EBUSY);
-        piord = (gdth_iord_str *)ha->pscratch;
-        piord->size = sizeof(gdth_iord_str);
-        piord->status = S_OK;
-        if (ha->type == GDT_ISA || ha->type == GDT_EISA) {
-            piord->iu.ctrtype.type = (unchar)((ha->stype>>20) - 0x10);
-        } else {
-            if (ha->type != GDT_PCIMPR) {
-                piord->iu.ctrtype.type = (unchar)((ha->stype<<4) + 6);
-            } else {
-                piord->iu.ctrtype.type = 
-                    (ha->oem_id == OEM_ID_INTEL ? 0xfd : 0xfe);
-                if (ha->stype >= 0x300)
-                    piord->iu.ctrtype.ext_type = 0x6000 | ha->subdevice_id;
-                else 
-                    piord->iu.ctrtype.ext_type = 0x6000 | ha->stype;
-            }
-            piord->iu.ctrtype.device_id = ha->stype;
-            piord->iu.ctrtype.sub_device_id = ha->subdevice_id;
-        }
-        piord->iu.ctrtype.info = ha->brd_phys;
-        piord->iu.ctrtype.oem_id = ha->oem_id;
-        break;
-
-      case GDTIOCTL_CTRCNT:
-        if (!gdth_ioctl_alloc( hanum, sizeof(gdth_iord_str), TRUE, &paddr ))
-            return(-EBUSY);
-        piord = (gdth_iord_str *)ha->pscratch;
-        piord->size = sizeof(gdth_iord_str);
-        piord->status = S_OK;
-        piord->iu.ctrcnt.count = (ushort)gdth_ctr_count;
-        break;
-
-      case GDTIOCTL_OSVERS:
-        if (!gdth_ioctl_alloc( hanum, sizeof(gdth_iord_str), TRUE, &paddr ))
-            return(-EBUSY);
-        piord = (gdth_iord_str *)ha->pscratch;
-        piord->size = sizeof(gdth_iord_str);
-        piord->status = S_OK;
-        piord->iu.osvers.version = (unchar)(LINUX_VERSION_CODE >> 16);
-        piord->iu.osvers.subversion = (unchar)(LINUX_VERSION_CODE >> 8);
-        piord->iu.osvers.revision = (ushort)(LINUX_VERSION_CODE & 0xff);
-        break;
-
-      case GDTIOCTL_LOCKDRV:
-        if (!gdth_ioctl_alloc( hanum, sizeof(gdth_iord_str), TRUE, &paddr ))
-            return(-EBUSY);
-        piord = (gdth_iord_str *)ha->pscratch;
-        for (i = 0; i < piowr->iu.lockdrv.drive_cnt; ++i) {
-            j = piowr->iu.lockdrv.drives[i];
-            if (j >= MAX_HDRIVES || !ha->hdr[j].present) 
-                continue;
-            if (piowr->iu.lockdrv.lock) {
-                GDTH_LOCK_HA(ha, flags);
-                ha->hdr[j].lock = 1;
-                GDTH_UNLOCK_HA(ha, flags);
-                gdth_wait_completion( hanum, ha->bus_cnt, j );
-                gdth_stop_timeout( hanum, ha->bus_cnt, j );
-            } else {
-                GDTH_LOCK_HA(ha, flags);
-                ha->hdr[j].lock = 0;
-                GDTH_UNLOCK_HA(ha, flags);
-                gdth_start_timeout( hanum, ha->bus_cnt, j );
-                gdth_next( hanum );
-            }
-        }
-        piord->size = sizeof(gdth_iord_str);
-        piord->status = S_OK;
-        break;
-
-      case GDTIOCTL_LOCKCHN:
-        if (!gdth_ioctl_alloc( hanum, sizeof(gdth_iord_str), TRUE, &paddr ))
-            return(-EBUSY);
-        i = piowr->iu.lockchn.channel;
-        if (i < ha->bus_cnt) {
-            if (piowr->iu.lockchn.lock) {
-                GDTH_LOCK_HA(ha, flags);
-                ha->raw[i].lock = 1;
-                GDTH_UNLOCK_HA(ha, flags);
-                for (j = 0; j < ha->tid_cnt; ++j) {
-                    gdth_wait_completion( hanum, i, j );
-                    gdth_stop_timeout( hanum, i, j );
-                }
-            } else {
-                GDTH_LOCK_HA(ha, flags);
-                ha->raw[i].lock = 0;
-                GDTH_UNLOCK_HA(ha, flags);
-                for (j = 0; j < ha->tid_cnt; ++j) {
-                    gdth_start_timeout( hanum, i, j );
-                    gdth_next( hanum );
-                }
-            }
-        }
-        piord = (gdth_iord_str *)ha->pscratch;
-        piord->size = sizeof(gdth_iord_str);
-        piord->status = S_OK;
-        break;
-
-      case GDTIOCTL_EVENT:
-        if (!gdth_ioctl_alloc( hanum, sizeof(gdth_iord_str), TRUE, &paddr ))
-            return(-EBUSY);
-        piord = (gdth_iord_str *)ha->pscratch;
-        if (piowr->iu.event.erase == 0xff) {
-            pevt = (gdth_evt_str *)piowr->iu.event.evt;
-            if (pevt->event_source == ES_TEST) 
-                pevt->event_data.size = sizeof(pevt->event_data.eu.test);
-            else if (pevt->event_source == ES_DRIVER) 
-                pevt->event_data.size = sizeof(pevt->event_data.eu.driver);
-            else if (pevt->event_source == ES_SYNC) 
-                pevt->event_data.size = sizeof(pevt->event_data.eu.sync);
-            else {
-                pevt->event_data.size = sizeof(pevt->event_data.eu.async);
-                gdth_log_event(&pevt->event_data, NULL);
-            }
-            GDTH_LOCK_HA(ha, flags);
-            gdth_store_event(ha, pevt->event_source, pevt->event_idx,
-                             &pevt->event_data);
-            GDTH_UNLOCK_HA(ha, flags);
-        } else if (piowr->iu.event.erase == 0xfe) {
-            gdth_clear_events();
-        } else if (piowr->iu.event.erase == 0) {
-            piord->iu.event.handle = 
-                gdth_read_event(ha,piowr->iu.event.handle,
-                                (gdth_evt_str *)piord->iu.event.evt);
-        } else {
-            piord->iu.event.handle = piowr->iu.event.handle;
-            gdth_readapp_event(ha, (unchar)piowr->iu.event.erase,
-                               (gdth_evt_str *)piord->iu.event.evt);
-        }
-        piord->size = sizeof(gdth_iord_str);
-        piord->status = S_OK;
-        break;
-      
-      case GDTIOCTL_SCSI:
-#if LINUX_VERSION_CODE >= 0x020503
-        return(-EINVAL);
-#else
-        if (!gdth_ioctl_alloc( hanum, sizeof(gdth_iord_str), TRUE, &paddr ))
-            return(-EBUSY);
-        piord = (gdth_iord_str *)ha->pscratch;
-        piord->size = sizeof(gdth_iord_str);
-        memcpy(cmnd, piowr->iu.scsi.cmd, 12);
-#if LINUX_VERSION_CODE >= 0x020322
-        scp->target = piowr->iu.scsi.target;
-        scp->channel = virt_ctr ? 0 : piowr->iu.scsi.bus;
-        scp->cmd_len = piowr->iu.scsi.cmd_len;
-        gdth_do_cmd(scp, pcmd, cmnd, piowr->timeout);
-        piord->status = (scp->SCp.Message<<16)|scp->SCp.Status;
-#else
-        scp.target = piowr->iu.scsi.target;
-        scp.channel = virt_ctr ? 0 : piowr->iu.scsi.bus;
-        scp.cmd_len = piowr->iu.scsi.cmd_len;
-        gdth_do_cmd(&scp, pcmd, cmnd, piowr->timeout);
-        piord->status = (scp.SCp.Message<<16)|scp.SCp.Status;
-#endif
-#endif
-        break;
-
-      case GDTIOCTL_RESET_BUS:
-        if (!gdth_ioctl_alloc( hanum, sizeof(gdth_iord_str), TRUE, &paddr ))
-            return(-EBUSY);
-        piord = (gdth_iord_str *)ha->pscratch;
-        piord->size = sizeof(gdth_iord_str);
-#if LINUX_VERSION_CODE >= 0x02053C
-        {
-            Scsi_Device     *sdev;
-            Scsi_Cmnd       *scmnd;
-
-            sdev = scsi_get_host_dev(gdth_ctr_tab[hanum]);
-            scmnd= scsi_get_command(sdev, GFP_KERNEL);
-            if (!scmnd)
-                return(-ENOMEM);
-            scmnd->device->host = scp->sr_host; 
-            scmnd->device->channel = virt_ctr ? 0 : piowr->iu.scsi.bus;
-            piord->status = (ulong32)gdth_eh_bus_reset( scmnd );
-            if (piord->status == SUCCESS)
-                piord->status = S_OK;
-            else
-                piord->status = S_GENERR;
-            scsi_put_command(scmnd);
-            scsi_free_host_dev(sdev);
-        }
-#elif LINUX_VERSION_CODE >= 0x020503
-        {
-            Scsi_Cmnd scmnd;
-             
-            scmnd.host = scp->sr_host; 
-            scmnd.channel = virt_ctr ? 0 : piowr->iu.scsi.bus;
-            piord->status = (ulong32)gdth_eh_bus_reset( &scmnd );
-            if (piord->status == SUCCESS)
-                piord->status = S_OK;
-            else
-                piord->status = S_GENERR;
-        }
-#elif LINUX_VERSION_CODE >= 0x020322
-        scp->channel = virt_ctr ? 0 : piowr->iu.scsi.bus;
-        piord->status = (ulong32)gdth_eh_bus_reset( scp );
-        if (piord->status == SUCCESS)
-            piord->status = S_OK;
-        else
-            piord->status = S_GENERR;
-#elif LINUX_VERSION_CODE >= 0x02015F
-        scp.channel = virt_ctr ? 0 : piowr->iu.scsi.bus;
-        piord->status = (ulong32)gdth_eh_bus_reset( &scp );
-        if (piord->status == SUCCESS)
-            piord->status = S_OK;
-        else
-            piord->status = S_GENERR;
-#else
-        piord->status = S_OK;
-#endif
-        break;
-
-      case GDTIOCTL_HDRLIST:
-        if (!gdth_ioctl_alloc( hanum, sizeof(gdth_iord_str), TRUE, &paddr ))
-            return(-EBUSY);
-        piord = (gdth_iord_str *)ha->pscratch;
-        piord->size = sizeof(gdth_iord_str);
-        piord->status = S_OK;
-        for (i = 0; i < MAX_HDRIVES; ++i) {
-            if (ha->hdr[i].present) {
-                piord->iu.hdr_list[i].bus = ha->virt_bus;
-                piord->iu.hdr_list[i].target = i;
-                piord->iu.hdr_list[i].lun = 0;
-                piord->iu.hdr_list[i].cluster_type = ha->hdr[i].cluster_type;
-                if (ha->hdr[i].cluster_type & CLUSTER_DRIVE) {  
-                    gdtcmd.Service = CACHESERVICE;
-                    gdtcmd.OpCode = GDT_CLUST_INFO;
-                    gdtcmd.u.cache.DeviceNo = i;
-#if LINUX_VERSION_CODE >= 0x020503
-                    gdth_do_req(scp, &gdtcmd, cmnd, 30);
-                    if (scp->sr_command->SCp.Status == S_OK)
-                        piord->iu.hdr_list[i].cluster_type = 
-                            (unchar)scp->sr_command->SCp.Message;
-#elif LINUX_VERSION_CODE >= 0x020322
-                    gdth_do_cmd(scp, &gdtcmd, cmnd, 30);
-                    if (scp->SCp.Status == S_OK)
-                        piord->iu.hdr_list[i].cluster_type = 
-                            (unchar)scp->SCp.Message;
-#else
-                    gdth_do_cmd(&scp, &gdtcmd, cmnd, 30);
-                    if (scp.SCp.Status == S_OK)
-                        piord->iu.hdr_list[i].cluster_type = 
-                            (unchar)scp.SCp.Message;
-#endif
-                }
-            } else {
-                piord->iu.hdr_list[i].bus = 0xff;
-            }
-        }
-        break;
-
-      case GDTIOCTL_RESCAN:
-        if (!gdth_ioctl_alloc( hanum, sizeof(gdth_iord_str), TRUE, &paddr ))
-            return(-EBUSY);
-        piord = (gdth_iord_str *)ha->pscratch;
-        piord->size = sizeof(gdth_iord_str);
-        piord->status = S_OK;
-        if (piowr->iu.rescan.flag == 0) {
-            /* old method: scan all host drives 
-               re-initialize cache service to get host drive count
-            */
-            gdtcmd.Service = CACHESERVICE;
-            gdtcmd.OpCode = GDT_INIT;
-            gdtcmd.u.cache.DeviceNo = LINUX_OS;
-#if LINUX_VERSION_CODE >= 0x020503
-            gdth_do_req(scp, &gdtcmd, cmnd, 30);
-            status = (ushort)scp->sr_command->SCp.Status; 
-            info = (ulong32)scp->sr_command->SCp.Message;
-#elif LINUX_VERSION_CODE >= 0x020322
-            gdth_do_cmd(scp, &gdtcmd, cmnd, 30);
-            status = (ushort)scp->SCp.Status; 
-            info = (ulong32)scp->SCp.Message;
-#else
-            gdth_do_cmd(&scp, &gdtcmd, cmnd, 30);
-            status = (ushort)scp.SCp.Status;
-            info = (ulong32)scp.SCp.Message;
-#endif
-            if (status != S_OK)
-                break;
-            k = 0;
-            hdr_cnt = (ushort)info;
-        } else {
-            k = piowr->iu.rescan.hdr_no;
-            hdr_cnt = k + 1;
-        }
-        if (hdr_cnt > MAX_HDRIVES)
-            hdr_cnt = MAX_HDRIVES;
-        /* scanning for host drives */
-        for (; k < hdr_cnt; ++k) {
-            /* info about host drive */
-            gdtcmd.Service = CACHESERVICE;
-            gdtcmd.OpCode = GDT_INFO;
-            gdtcmd.u.cache.DeviceNo = k;
-#if LINUX_VERSION_CODE >= 0x020503
-            gdth_do_req(scp, &gdtcmd, cmnd, 30);
-            status = (ushort)scp->sr_command->SCp.Status; 
-            info = (ulong32)scp->sr_command->SCp.Message;
-#elif LINUX_VERSION_CODE >= 0x020322
-            gdth_do_cmd(scp, &gdtcmd, cmnd, 30);
-            status = (ushort)scp->SCp.Status; 
-            info = (ulong32)scp->SCp.Message;
-#else
-            gdth_do_cmd(&scp, &gdtcmd, cmnd, 30);
-            status = (ushort)scp.SCp.Status;
-            info = (ulong32)scp.SCp.Message;
-#endif
-            GDTH_LOCK_HA(ha, flags);
-            piord->iu.hdr_list[k].bus = ha->virt_bus;
-            piord->iu.hdr_list[k].target = k;
-            piord->iu.hdr_list[k].lun = 0;
-            if (status != S_OK) {
-                ha->hdr[k].present = FALSE;
-            } else {
-                ha->hdr[k].present = TRUE;
-                ha->hdr[k].size = info;
-                /* evaluate mapping (sectors per head, heads per cylinder) */
-                ha->hdr[k].size &= ~SECS32;
-                gdth_eval_mapping(ha->hdr[k].size,&drv_cyls,&drv_hds,&drv_secs);
-                ha->hdr[k].heads = (unchar)drv_hds;
-                ha->hdr[k].secs = (unchar)drv_secs;
-                /* round size */
-                ha->hdr[k].size = drv_cyls * drv_hds * drv_secs;
-            }
-            GDTH_UNLOCK_HA(ha, flags);
-            if (status != S_OK)
-                continue;       /* next host drive */
-
-            /* devtype, cluster info, R/W attributes */
-            gdtcmd.Service = CACHESERVICE;
-            gdtcmd.OpCode = GDT_DEVTYPE;
-            gdtcmd.u.cache.DeviceNo = k;
-#if LINUX_VERSION_CODE >= 0x020503
-            gdth_do_req(scp, &gdtcmd, cmnd, 30);
-            status = (ushort)scp->sr_command->SCp.Status; 
-            info = (ulong32)scp->sr_command->SCp.Message;
-#elif LINUX_VERSION_CODE >= 0x020322
-            gdth_do_cmd(scp, &gdtcmd, cmnd, 30);
-            status = (ushort)scp->SCp.Status; 
-            info = (ulong32)scp->SCp.Message;
-#else
-            gdth_do_cmd(&scp, &gdtcmd, cmnd, 30);
-            status = (ushort)scp.SCp.Status;
-            info = (ulong32)scp.SCp.Message;
-#endif
-            GDTH_LOCK_HA(ha, flags);
-            ha->hdr[k].devtype = 0;
-            if (status == S_OK)
-                ha->hdr[k].devtype = (ushort)info;
-            GDTH_UNLOCK_HA(ha, flags);
-
-            gdtcmd.Service = CACHESERVICE;
-            gdtcmd.OpCode = GDT_CLUST_INFO;
-            gdtcmd.u.cache.DeviceNo = k;
-#if LINUX_VERSION_CODE >= 0x020503
-            gdth_do_req(scp, &gdtcmd, cmnd, 30);
-            status = (ushort)scp->sr_command->SCp.Status; 
-            info = (ulong32)scp->sr_command->SCp.Message;
-#elif LINUX_VERSION_CODE >= 0x020322
-            gdth_do_cmd(scp, &gdtcmd, cmnd, 30);
-            status = (ushort)scp->SCp.Status; 
-            info = (ulong32)scp->SCp.Message;
-#else
-            gdth_do_cmd(&scp, &gdtcmd, cmnd, 30);
-            status = (ushort)scp.SCp.Status;
-            info = (ulong32)scp.SCp.Message;
-#endif
-            GDTH_LOCK_HA(ha, flags);
-            ha->hdr[k].cluster_type = 0;
-            if (status == S_OK && !shared_access)
-                ha->hdr[k].cluster_type = (ushort)info;
-            GDTH_UNLOCK_HA(ha, flags);
-            piord->iu.hdr_list[k].cluster_type = ha->hdr[k].cluster_type;
-
-            gdtcmd.Service = CACHESERVICE;
-            gdtcmd.OpCode = GDT_RW_ATTRIBS;
-            gdtcmd.u.cache.DeviceNo = k;
-#if LINUX_VERSION_CODE >= 0x020503
-            gdth_do_req(scp, &gdtcmd, cmnd, 30);
-            status = (ushort)scp->sr_command->SCp.Status; 
-            info = (ulong32)scp->sr_command->SCp.Message;
-#elif LINUX_VERSION_CODE >= 0x020322
-            gdth_do_cmd(scp, &gdtcmd, cmnd, 30);
-            status = (ushort)scp->SCp.Status; 
-            info = (ulong32)scp->SCp.Message;
-#else
-            gdth_do_cmd(&scp, &gdtcmd, cmnd, 30);
-            status = (ushort)scp.SCp.Status;
-            info = (ulong32)scp.SCp.Message;
-#endif
-            GDTH_LOCK_HA(ha, flags);
-            ha->hdr[k].rw_attribs = 0;
-            if (status == S_OK)
-                ha->hdr[k].rw_attribs = (ushort)info;
-            GDTH_UNLOCK_HA(ha, flags);
-        }
-        break;
-
-      case GDTIOCTL_RESET_DRV:
-        if (!gdth_ioctl_alloc( hanum, sizeof(gdth_iord_str), TRUE, &paddr ))
-            return(-EBUSY);
-        piord = (gdth_iord_str *)ha->pscratch;
-        piord->size = sizeof(gdth_iord_str);
-        piord->status = S_OK;
-        i = piowr->iu.scsi.target;
-        if (ha->hdr[i].present) {
-            gdtcmd.Service = CACHESERVICE;
-            gdtcmd.OpCode = GDT_CLUST_RESET;
-            gdtcmd.u.cache.DeviceNo = i;
-#if LINUX_VERSION_CODE >= 0x020503
-            gdth_do_req(scp, &gdtcmd, cmnd, 30);
-            piord->status = (ushort)scp->sr_command->SCp.Status; 
-#elif LINUX_VERSION_CODE >= 0x020322
-            gdth_do_cmd(scp, &gdtcmd, cmnd, 30);
-            piord->status = (scp->SCp.Message<<16)|scp->SCp.Status;
-#else
-            gdth_do_cmd(&scp, &gdtcmd, cmnd, 30);
-            piord->status = (scp.SCp.Message<<16)|scp.SCp.Status;
-#endif
-        }
-        break;
-
-      default:
-        return(-EINVAL);
-    }
-    return length;
-}
-#endif
-
-static int gdth_get_info(char *buffer,char **start,off_t offset,
-                         int length,int hanum,int busnum)
+static int gdth_get_info(char *buffer,char **start,off_t offset,int length,
+                         struct Scsi_Host *host,int hanum,int busnum)
 {
     int size = 0,len = 0;
     off_t begin = 0,pos = 0;
     gdth_ha_str *ha;
     int id, i, j, k, sec, flag;
     int no_mdrv = 0, drv_no, is_mirr;
-    ulong32 cnt, paddr;
+    ulong32 cnt;
+    ulong64 paddr;
 
     gdth_cmd_str gdtcmd;
     gdth_evt_str estr;
-#if LINUX_VERSION_CODE >= 0x020503
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
     Scsi_Request *scp;
     Scsi_Device *sdev; 
-#elif LINUX_VERSION_CODE >= 0x020322
+#elif LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0)
     Scsi_Cmnd *scp;
     Scsi_Device *sdev;
 #else
@@ -795,15 +274,15 @@
     TRACE2(("gdth_get_info() ha %d bus %d\n",hanum,busnum));
     ha = HADATA(gdth_ctr_tab[hanum]);
 
-#if LINUX_VERSION_CODE >= 0x020503
-    sdev = scsi_get_host_dev(gdth_ctr_tab[hanum]);
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
+    sdev = scsi_get_host_dev(host);
     scp  = scsi_allocate_request(sdev, GFP_KERNEL);
     if (!scp)
         return -ENOMEM;
     scp->sr_cmd_len = 12;
     scp->sr_use_sg = 0;
-#elif LINUX_VERSION_CODE >= 0x020322
-    sdev = scsi_get_host_dev(gdth_ctr_tab[hanum]);
+#elif LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0)
+    sdev = scsi_get_host_dev(host);
     scp  = scsi_allocate_device(sdev, 1, FALSE);
     if (!scp)
         return -ENOMEM;
@@ -812,485 +291,415 @@
 #else
     memset(&sdev,0,sizeof(Scsi_Device));
     memset(&scp, 0,sizeof(Scsi_Cmnd));
-    sdev.host = scp.host = gdth_ctr_tab[hanum];
+    sdev.host = scp.host = host;
     sdev.id = scp.target = sdev.host->this_id;
     scp.device = &sdev;
 #endif
-
-#ifdef GDTH_IOCTL_PROC
-    /* ioctl from tool? */
-    if (!gdth_ioctl_check_bin(hanum, (ushort)length)) {
-#endif
-        /* request is i.e. "cat /proc/scsi/gdth/0" */ 
-        /* format: %-15s\t%-10s\t%-15s\t%s */
-        /* driver parameters */
-        size = sprintf(buffer+len,"Driver Parameters:\n");
-        len += size;  pos = begin + len;
-        if (reserve_list[0] == 0xff)
-            strcpy(hrec, "--");
-        else {
-            sprintf(hrec, "%d", reserve_list[0]);
-            for (i = 1;  i < MAX_RES_ARGS; i++) {
-                if (reserve_list[i] == 0xff) 
-                    break;
-                sprintf(hrec,"%s,%d", hrec, reserve_list[i]);
-            }
+    
+    
+    /* request is i.e. "cat /proc/scsi/gdth/0" */ 
+    /* format: %-15s\t%-10s\t%-15s\t%s */
+    /* driver parameters */
+    size = sprintf(buffer+len,"Driver Parameters:\n");
+    len += size;  pos = begin + len;
+    if (reserve_list[0] == 0xff)
+        strcpy(hrec, "--");
+    else {
+        sprintf(hrec, "%d", reserve_list[0]);
+        for (i = 1;  i < MAX_RES_ARGS; i++) {
+            if (reserve_list[i] == 0xff) 
+                break;
+            sprintf(hrec,"%s,%d", hrec, reserve_list[i]);
         }
-        size = sprintf(buffer+len,
-                       " reserve_mode: \t%d         \treserve_list:  \t%s\n",
-                       reserve_mode, hrec);
-        len += size;  pos = begin + len;
-        size = sprintf(buffer+len,
-                       " max_ids:      \t%-3d       \thdr_channel:   \t%d\n",
-                       max_ids, hdr_channel);
-        len += size;  pos = begin + len;
+    }
+    size = sprintf(buffer+len,
+                   " reserve_mode: \t%d         \treserve_list:  \t%s\n",
+                   reserve_mode, hrec);
+    len += size;  pos = begin + len;
+    size = sprintf(buffer+len,
+                   " max_ids:      \t%-3d       \thdr_channel:   \t%d\n",
+                   max_ids, hdr_channel);
+    len += size;  pos = begin + len;
+
+    /* controller information */
+    size = sprintf(buffer+len,"\nDisk Array Controller Information:\n");
+    len += size;  pos = begin + len;
+    if (virt_ctr)
+        sprintf(hrec, "%s (Bus %d)", ha->binfo.type_string, busnum);
+    else
+        strcpy(hrec, ha->binfo.type_string);
+    size = sprintf(buffer+len,
+                   " Number:       \t%d         \tName:          \t%s\n",
+                   hanum, hrec);
+    len += size;  pos = begin + len;
+
+    if (ha->more_proc)
+        sprintf(hrec, "%d.%02d.%02d-%c%03X", 
+                (unchar)(ha->binfo.upd_fw_ver>>24),
+                (unchar)(ha->binfo.upd_fw_ver>>16),
+                (unchar)(ha->binfo.upd_fw_ver),
+                ha->bfeat.raid ? 'R':'N',
+                ha->binfo.upd_revision);
+    else
+        sprintf(hrec, "%d.%02d", (unchar)(ha->cpar.version>>8),
+                (unchar)(ha->cpar.version));
 
-        /* controller information */
-        size = sprintf(buffer+len,"\nDisk Array Controller Information:\n");
-        len += size;  pos = begin + len;
-        if (virt_ctr)
-            sprintf(hrec, "%s (Bus %d)", ha->binfo.type_string, busnum);
-        else
-            strcpy(hrec, ha->binfo.type_string);
+    size = sprintf(buffer+len,
+                   " Driver Ver.:  \t%-10s\tFirmware Ver.: \t%s\n",
+                   GDTH_VERSION_STR, hrec);
+    len += size;  pos = begin + len;
+ 
+    if (ha->more_proc) {
+        /* more information: 1. about controller */
         size = sprintf(buffer+len,
-                       " Number:       \t%d         \tName:          \t%s\n",
-                       hanum, hrec);
+                       " Serial No.:   \t0x%8X\tCache RAM size:\t%d KB\n",
+                       ha->binfo.ser_no, ha->binfo.memsize / 1024);
         len += size;  pos = begin + len;
+    }
 
-        if (ha->more_proc)
-            sprintf(hrec, "%d.%02d.%02d-%c%03X", 
-                    (unchar)(ha->binfo.upd_fw_ver>>24),
-                    (unchar)(ha->binfo.upd_fw_ver>>16),
-                    (unchar)(ha->binfo.upd_fw_ver),
-                    ha->bfeat.raid ? 'R':'N',
-                    ha->binfo.upd_revision);
-        else
-            sprintf(hrec, "%d.%02d", (unchar)(ha->cpar.version>>8),
-                    (unchar)(ha->cpar.version));
+#ifdef GDTH_DMA_STATISTICS
+    /* controller statistics */
+    size = sprintf(buffer+len,"\nController Statistics:\n");
+    len += size;  pos = begin + len;
+    size = sprintf(buffer+len,
+                   " 32-bit DMA buffer:\t%lu\t64-bit DMA buffer:\t%lu\n",
+                   ha->dma32_cnt, ha->dma64_cnt);
+    len += size;  pos = begin + len;
+#endif
 
-        size = sprintf(buffer+len,
-                       " Driver Ver.:  \t%-10s\tFirmware Ver.: \t%s\n",
-                       GDTH_VERSION_STR, hrec);
+    if (pos < offset) {
+        len = 0;
+        begin = pos;
+    }
+    if (pos > offset + length)
+        goto stop_output;
+
+    if (ha->more_proc) {
+        /* more information: 2. about physical devices */
+        size = sprintf(buffer+len,"\nPhysical Devices:");
         len += size;  pos = begin + len;
- 
-        if (pos < offset) {
-            len = 0;
-            begin = pos;
-        }
-        if (pos > offset + length)
+        flag = FALSE;
+            
+        buf = gdth_ioctl_alloc(hanum, GDTH_SCRATCH, FALSE, &paddr);
+        if (!buf) 
             goto stop_output;
+        for (i = 0; i < ha->bus_cnt; ++i) {
+            /* 2.a statistics (and retries/reassigns) */
+            TRACE2(("pdr_statistics() chn %d\n",i));                
+            pds = (gdth_dskstat_str *)(buf + GDTH_SCRATCH/4);
+            gdtcmd.Service = CACHESERVICE;
+            gdtcmd.OpCode = GDT_IOCTL;
+            gdtcmd.u.ioctl.p_param = paddr + GDTH_SCRATCH/4;
+            gdtcmd.u.ioctl.param_size = 3*GDTH_SCRATCH/4;
+            gdtcmd.u.ioctl.subfunc = DSK_STATISTICS | L_CTRL_PATTERN;
+            gdtcmd.u.ioctl.channel = ha->raw[i].address | INVALID_CHANNEL;
+            pds->bid = ha->raw[i].local_no;
+            pds->first = 0;
+            pds->entries = ha->raw[i].pdev_cnt;
+            cnt = (3*GDTH_SCRATCH/4 - 5 * sizeof(ulong32)) /
+                sizeof(pds->list[0]);
+            if (pds->entries > cnt)
+                pds->entries = cnt;
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
+            gdth_do_req(scp, &gdtcmd, cmnd, 30);
+            if (scp->sr_command->SCp.Status != S_OK) 
+#elif LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0)
+            gdth_do_cmd(scp, &gdtcmd, cmnd, 30);
+            if (scp->SCp.Status != S_OK) 
+#else
+            gdth_do_cmd(&scp, &gdtcmd, cmnd, 30);
+            if (scp.SCp.Status != S_OK) 
+#endif
+            { 
+                pds->count = 0;
+            }
 
-        if (ha->more_proc) {
-            /* more information: 1. about controller */
-            size = sprintf(buffer+len,
-                           " Serial No.:   \t0x%8X\tCache RAM size:\t%d KB\n",
-                           ha->binfo.ser_no, ha->binfo.memsize / 1024);
-            len += size;  pos = begin + len;
-
-            /* 2. about physical devices */
-            size = sprintf(buffer+len,"\nPhysical Devices:");
-            len += size;  pos = begin + len;
-            flag = FALSE;
-            
-            buf = gdth_ioctl_alloc(hanum, GDTH_SCRATCH, FALSE, &paddr);
-            if (!buf) 
-                goto stop_output;
-            for (i = 0; i < ha->bus_cnt; ++i) {
-                /* 2.a statistics (and retries/reassigns) */
-                TRACE2(("pdr_statistics() chn %d\n",i));                
-                pds = (gdth_dskstat_str *)(buf + GDTH_SCRATCH/4);
+            /* other IOCTLs must fit into area GDTH_SCRATCH/4 */
+            for (j = 0; j < ha->raw[i].pdev_cnt; ++j) {
+                /* 2.b drive info */
+                TRACE2(("scsi_drv_info() chn %d dev %d\n",
+                    i, ha->raw[i].id_list[j]));             
+                pdi = (gdth_diskinfo_str *)buf;
                 gdtcmd.Service = CACHESERVICE;
                 gdtcmd.OpCode = GDT_IOCTL;
-                gdtcmd.u.ioctl.p_param = paddr + GDTH_SCRATCH/4;
-                gdtcmd.u.ioctl.param_size = 3*GDTH_SCRATCH/4;
-                gdtcmd.u.ioctl.subfunc = DSK_STATISTICS | L_CTRL_PATTERN;
-                gdtcmd.u.ioctl.channel = ha->raw[i].address | INVALID_CHANNEL;
-                pds->bid = ha->raw[i].local_no;
-                pds->first = 0;
-                pds->entries = ha->raw[i].pdev_cnt;
-                cnt = (3*GDTH_SCRATCH/4 - 5 * sizeof(ulong32)) /
-                    sizeof(pds->list[0]);
-                if (pds->entries > cnt)
-                    pds->entries = cnt;
-#if LINUX_VERSION_CODE >= 0x020503
+                gdtcmd.u.ioctl.p_param = paddr;
+                gdtcmd.u.ioctl.param_size = sizeof(gdth_diskinfo_str);
+                gdtcmd.u.ioctl.subfunc = SCSI_DR_INFO | L_CTRL_PATTERN;
+                gdtcmd.u.ioctl.channel = 
+                    ha->raw[i].address | ha->raw[i].id_list[j];
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
                 gdth_do_req(scp, &gdtcmd, cmnd, 30);
-                if (scp->sr_command->SCp.Status != S_OK) 
-#elif LINUX_VERSION_CODE >= 0x020322
+                if (scp->sr_command->SCp.Status == S_OK) 
+#elif LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0)
                 gdth_do_cmd(scp, &gdtcmd, cmnd, 30);
-                if (scp->SCp.Status != S_OK) 
+                if (scp->SCp.Status == S_OK) 
 #else
                 gdth_do_cmd(&scp, &gdtcmd, cmnd, 30);
-                if (scp.SCp.Status != S_OK) 
+                if (scp.SCp.Status == S_OK) 
 #endif
-                { 
-                    pds->count = 0;
+                {
+                    strncpy(hrec,pdi->vendor,8);
+                    strncpy(hrec+8,pdi->product,16);
+                    strncpy(hrec+24,pdi->revision,4);
+                    hrec[28] = 0;
+                    size = sprintf(buffer+len,
+                                   "\n Chn/ID/LUN:   \t%c/%02d/%d    \tName:          \t%s\n",
+                                   'A'+i,pdi->target_id,pdi->lun,hrec);
+                    len += size;  pos = begin + len;
+                    flag = TRUE;
+                    pdi->no_ldrive &= 0xffff;
+                    if (pdi->no_ldrive == 0xffff)
+                        strcpy(hrec,"--");
+                    else
+                        sprintf(hrec,"%d",pdi->no_ldrive);
+                    size = sprintf(buffer+len,
+                                   " Capacity [MB]:\t%-6d    \tTo Log. Drive: \t%s\n",
+                                   pdi->blkcnt/(1024*1024/pdi->blksize),
+                                   hrec);
+                    len += size;  pos = begin + len;
+                } else {
+                    pdi->devtype = 0xff;
                 }
-
-                /* other IOCTLs must fit into area GDTH_SCRATCH/4 */
-                for (j = 0; j < ha->raw[i].pdev_cnt; ++j) {
-                    /* 2.b drive info */
-                    TRACE2(("scsi_drv_info() chn %d dev %d\n",
-                        i, ha->raw[i].id_list[j]));             
-                    pdi = (gdth_diskinfo_str *)buf;
-                    gdtcmd.Service = CACHESERVICE;
-                    gdtcmd.OpCode = GDT_IOCTL;
-                    gdtcmd.u.ioctl.p_param = paddr;
-                    gdtcmd.u.ioctl.param_size = sizeof(gdth_diskinfo_str);
-                    gdtcmd.u.ioctl.subfunc = SCSI_DR_INFO | L_CTRL_PATTERN;
-                    gdtcmd.u.ioctl.channel = 
-                        ha->raw[i].address | ha->raw[i].id_list[j];
-#if LINUX_VERSION_CODE >= 0x020503
-                    gdth_do_req(scp, &gdtcmd, cmnd, 30);
-                    if (scp->sr_command->SCp.Status == S_OK) 
-#elif LINUX_VERSION_CODE >= 0x020322
-                    gdth_do_cmd(scp, &gdtcmd, cmnd, 30);
-                    if (scp->SCp.Status == S_OK) 
-#else
-                    gdth_do_cmd(&scp, &gdtcmd, cmnd, 30);
-                    if (scp.SCp.Status == S_OK) 
-#endif
-                    {
-                        strncpy(hrec,pdi->vendor,8);
-                        strncpy(hrec+8,pdi->product,16);
-                        strncpy(hrec+24,pdi->revision,4);
-                        hrec[28] = 0;
-                        size = sprintf(buffer+len,
-                                       "\n Chn/ID/LUN:   \t%c/%02d/%d    \tName:          \t%s\n",
-                                       'A'+i,pdi->target_id,pdi->lun,hrec);
-                        len += size;  pos = begin + len;
-                        flag = TRUE;
-                        pdi->no_ldrive &= 0xffff;
-                        if (pdi->no_ldrive == 0xffff)
-                            strcpy(hrec,"--");
-                        else
-                            sprintf(hrec,"%d",pdi->no_ldrive);
-                        size = sprintf(buffer+len,
-                                       " Capacity [MB]:\t%-6d    \tTo Log. Drive: \t%s\n",
-                                       pdi->blkcnt/(1024*1024/pdi->blksize),
-                                       hrec);
-                        len += size;  pos = begin + len;
-                    } else {
-                        pdi->devtype = 0xff;
-                    }
                     
-                    if (pdi->devtype == 0) {
-                        /* search retries/reassigns */
-                        for (k = 0; k < pds->count; ++k) {
-                            if (pds->list[k].tid == pdi->target_id &&
-                                pds->list[k].lun == pdi->lun) {
-                                size = sprintf(buffer+len,
-                                               " Retries:      \t%-6d    \tReassigns:     \t%d\n",
-                                               pds->list[k].retries,
-                                               pds->list[k].reassigns);
-                                len += size;  pos = begin + len;
-                                break;
-                            }
-                        }
-                        /* 2.c grown defects */
-                        TRACE2(("scsi_drv_defcnt() chn %d dev %d\n",
-                                i, ha->raw[i].id_list[j]));             
-                        pdef = (gdth_defcnt_str *)buf;
-                        gdtcmd.Service = CACHESERVICE;
-                        gdtcmd.OpCode = GDT_IOCTL;
-                        gdtcmd.u.ioctl.p_param = paddr;
-                        gdtcmd.u.ioctl.param_size = sizeof(gdth_defcnt_str);
-                        gdtcmd.u.ioctl.subfunc = SCSI_DEF_CNT | L_CTRL_PATTERN;
-                        gdtcmd.u.ioctl.channel = 
-                            ha->raw[i].address | ha->raw[i].id_list[j];
-                        pdef->sddc_type = 0x08;
-#if LINUX_VERSION_CODE >= 0x020503
-                        gdth_do_req(scp, &gdtcmd, cmnd, 30);
-                        if (scp->sr_command->SCp.Status == S_OK) 
-#elif LINUX_VERSION_CODE >= 0x020322
-                        gdth_do_cmd(scp, &gdtcmd, cmnd, 30);
-                        if (scp->SCp.Status == S_OK) 
-#else
-                        gdth_do_cmd(&scp, &gdtcmd, cmnd, 30);
-                        if (scp.SCp.Status == S_OK) 
-#endif
-                        {
+                if (pdi->devtype == 0) {
+                    /* search retries/reassigns */
+                    for (k = 0; k < pds->count; ++k) {
+                        if (pds->list[k].tid == pdi->target_id &&
+                            pds->list[k].lun == pdi->lun) {
                             size = sprintf(buffer+len,
-                                           " Grown Defects:\t%d\n",
-                                           pdef->sddc_cnt);
+                                           " Retries:      \t%-6d    \tReassigns:     \t%d\n",
+                                           pds->list[k].retries,
+                                           pds->list[k].reassigns);
                             len += size;  pos = begin + len;
+                            break;
                         }
                     }
-                    if (pos < offset) {
-                        len = 0;
-                        begin = pos;
-                    }
-                    if (pos > offset + length)
-                        goto stop_output;
-                }
-            }
-            gdth_ioctl_free(hanum, GDTH_SCRATCH, buf, paddr);
-
-            if (!flag) {
-                size = sprintf(buffer+len, "\n --\n");
-                len += size;  pos = begin + len;
-            }
-
-            /* 3. about logical drives */
-            size = sprintf(buffer+len,"\nLogical Drives:");
-            len += size;  pos = begin + len;
-            flag = FALSE;
-
-            buf = gdth_ioctl_alloc(hanum, GDTH_SCRATCH, FALSE, &paddr);
-            if (!buf) 
-                goto stop_output;
-            for (i = 0; i < MAX_LDRIVES; ++i) {
-                if (!ha->hdr[i].is_logdrv)
-                    continue;
-                drv_no = i;
-                j = k = 0;
-                is_mirr = FALSE;
-                do {
-                    /* 3.a log. drive info */
-                    TRACE2(("cache_drv_info() drive no %d\n",drv_no));
-                    pcdi = (gdth_cdrinfo_str *)buf;
+                    /* 2.c grown defects */
+                    TRACE2(("scsi_drv_defcnt() chn %d dev %d\n",
+                            i, ha->raw[i].id_list[j]));             
+                    pdef = (gdth_defcnt_str *)buf;
                     gdtcmd.Service = CACHESERVICE;
                     gdtcmd.OpCode = GDT_IOCTL;
                     gdtcmd.u.ioctl.p_param = paddr;
-                    gdtcmd.u.ioctl.param_size = sizeof(gdth_cdrinfo_str);
-                    gdtcmd.u.ioctl.subfunc = CACHE_DRV_INFO;
-                    gdtcmd.u.ioctl.channel = drv_no;
-#if LINUX_VERSION_CODE >= 0x020503
+                    gdtcmd.u.ioctl.param_size = sizeof(gdth_defcnt_str);
+                    gdtcmd.u.ioctl.subfunc = SCSI_DEF_CNT | L_CTRL_PATTERN;
+                    gdtcmd.u.ioctl.channel = 
+                        ha->raw[i].address | ha->raw[i].id_list[j];
+                    pdef->sddc_type = 0x08;
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
                     gdth_do_req(scp, &gdtcmd, cmnd, 30);
-                    if (scp->sr_command->SCp.Status != S_OK) 
-#elif LINUX_VERSION_CODE >= 0x020322
+                    if (scp->sr_command->SCp.Status == S_OK) 
+#elif LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0)
                     gdth_do_cmd(scp, &gdtcmd, cmnd, 30);
-                    if (scp->SCp.Status != S_OK)
+                    if (scp->SCp.Status == S_OK) 
 #else
                     gdth_do_cmd(&scp, &gdtcmd, cmnd, 30);
-                    if (scp.SCp.Status != S_OK)
+                    if (scp.SCp.Status == S_OK) 
 #endif
                     {
-                        break;
-                    }
-                    pcdi->ld_dtype >>= 16;
-                    j++;
-                    if (pcdi->ld_dtype > 2) {
-                        strcpy(hrec, "missing");
-                    } else if (pcdi->ld_error & 1) {
-                        strcpy(hrec, "fault");
-                    } else if (pcdi->ld_error & 2) {
-                        strcpy(hrec, "invalid");
-                        k++; j--;
-                    } else {
-                        strcpy(hrec, "ok");
-                    }
-                    
-                    if (drv_no == i) {
-                        size = sprintf(buffer+len,
-                                       "\n Number:       \t%-2d        \tStatus:        \t%s\n",
-                                       drv_no, hrec);
-                        len += size;  pos = begin + len;
-                        flag = TRUE;
-                        no_mdrv = pcdi->cd_ldcnt;
-                        if (no_mdrv > 1 || pcdi->ld_slave != -1) {
-                            is_mirr = TRUE;
-                            strcpy(hrec, "RAID-1");
-                        } else if (pcdi->ld_dtype == 0) {
-                            strcpy(hrec, "Disk");
-                        } else if (pcdi->ld_dtype == 1) {
-                            strcpy(hrec, "RAID-0");
-                        } else if (pcdi->ld_dtype == 2) {
-                            strcpy(hrec, "Chain");
-                        } else {
-                            strcpy(hrec, "???");
-                        }
-                        size = sprintf(buffer+len,
-                                       " Capacity [MB]:\t%-6d    \tType:          \t%s\n",
-                                       pcdi->ld_blkcnt/(1024*1024/pcdi->ld_blksize),
-                                       hrec);
-                        len += size;  pos = begin + len;
-                    } else {
                         size = sprintf(buffer+len,
-                                       " Slave Number: \t%-2d        \tStatus:        \t%s\n",
-                                       drv_no & 0x7fff, hrec);
+                                       " Grown Defects:\t%d\n",
+                                       pdef->sddc_cnt);
                         len += size;  pos = begin + len;
                     }
-                    drv_no = pcdi->ld_slave;
-                    if (pos < offset) {
-                        len = 0;
-                        begin = pos;
-                    }
-                    if (pos > offset + length)
-                        goto stop_output;
-                } while (drv_no != -1);
-                
-                if (is_mirr) {
-                    size = sprintf(buffer+len,
-                                   " Missing Drv.: \t%-2d        \tInvalid Drv.:  \t%d\n",
-                                   no_mdrv - j - k, k);
-                    len += size;  pos = begin + len;
                 }
-                
-                if (!ha->hdr[i].is_arraydrv)
-                    strcpy(hrec, "--");
-                else
-                    sprintf(hrec, "%d", ha->hdr[i].master_no);
-                size = sprintf(buffer+len,
-                               " To Array Drv.:\t%s\n", hrec);
-                len += size;  pos = begin + len;
                 if (pos < offset) {
                     len = 0;
                     begin = pos;
                 }
                 if (pos > offset + length)
                     goto stop_output;
-            }       
-            gdth_ioctl_free(hanum, GDTH_SCRATCH, buf, paddr);
-        
-            if (!flag) {
-                size = sprintf(buffer+len, "\n --\n");
-                len += size;  pos = begin + len;
-            }   
+            }
+        }
+        gdth_ioctl_free(hanum, GDTH_SCRATCH, buf, paddr);
 
-            /* 4. about array drives */
-            size = sprintf(buffer+len,"\nArray Drives:");
+        if (!flag) {
+            size = sprintf(buffer+len, "\n --\n");
             len += size;  pos = begin + len;
-            flag = FALSE;
+        }
 
-            buf = gdth_ioctl_alloc(hanum, GDTH_SCRATCH, FALSE, &paddr);
-            if (!buf) 
-                goto stop_output;
-            for (i = 0; i < MAX_LDRIVES; ++i) {
-                if (!(ha->hdr[i].is_arraydrv && ha->hdr[i].is_master))
-                    continue;
-                /* 4.a array drive info */
-                TRACE2(("array_info() drive no %d\n",i));
-                pai = (gdth_arrayinf_str *)buf;
+        /* 3. about logical drives */
+        size = sprintf(buffer+len,"\nLogical Drives:");
+        len += size;  pos = begin + len;
+        flag = FALSE;
+
+        buf = gdth_ioctl_alloc(hanum, GDTH_SCRATCH, FALSE, &paddr);
+        if (!buf) 
+            goto stop_output;
+        for (i = 0; i < MAX_LDRIVES; ++i) {
+            if (!ha->hdr[i].is_logdrv)
+                continue;
+            drv_no = i;
+            j = k = 0;
+            is_mirr = FALSE;
+            do {
+                /* 3.a log. drive info */
+                TRACE2(("cache_drv_info() drive no %d\n",drv_no));
+                pcdi = (gdth_cdrinfo_str *)buf;
                 gdtcmd.Service = CACHESERVICE;
                 gdtcmd.OpCode = GDT_IOCTL;
                 gdtcmd.u.ioctl.p_param = paddr;
-                gdtcmd.u.ioctl.param_size = sizeof(gdth_arrayinf_str);
-                gdtcmd.u.ioctl.subfunc = ARRAY_INFO | LA_CTRL_PATTERN;
-                gdtcmd.u.ioctl.channel = i;
-#if LINUX_VERSION_CODE >= 0x020503
+                gdtcmd.u.ioctl.param_size = sizeof(gdth_cdrinfo_str);
+                gdtcmd.u.ioctl.subfunc = CACHE_DRV_INFO;
+                gdtcmd.u.ioctl.channel = drv_no;
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
                 gdth_do_req(scp, &gdtcmd, cmnd, 30);
-                if (scp->sr_command->SCp.Status == S_OK) 
-#elif LINUX_VERSION_CODE >= 0x020322
+                if (scp->sr_command->SCp.Status != S_OK) 
+#elif LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0)
                 gdth_do_cmd(scp, &gdtcmd, cmnd, 30);
-                if (scp->SCp.Status == S_OK) 
+                if (scp->SCp.Status != S_OK)
 #else
                 gdth_do_cmd(&scp, &gdtcmd, cmnd, 30);
-                if (scp.SCp.Status == S_OK) 
+                if (scp.SCp.Status != S_OK)
 #endif
                 {
-                    if (pai->ai_state == 0)
-                        strcpy(hrec, "idle");
-                    else if (pai->ai_state == 2)
-                        strcpy(hrec, "build");
-                    else if (pai->ai_state == 4)
-                        strcpy(hrec, "ready");
-                    else if (pai->ai_state == 6)
-                        strcpy(hrec, "fail");
-                    else if (pai->ai_state == 8 || pai->ai_state == 10)
-                        strcpy(hrec, "rebuild");
-                    else
-                        strcpy(hrec, "error");
-                    if (pai->ai_ext_state & 0x10)
-                        strcat(hrec, "/expand");
-                    else if (pai->ai_ext_state & 0x1)
-                        strcat(hrec, "/patch");
+                    break;
+                }
+                pcdi->ld_dtype >>= 16;
+                j++;
+                if (pcdi->ld_dtype > 2) {
+                    strcpy(hrec, "missing");
+                } else if (pcdi->ld_error & 1) {
+                    strcpy(hrec, "fault");
+                } else if (pcdi->ld_error & 2) {
+                    strcpy(hrec, "invalid");
+                    k++; j--;
+                } else {
+                    strcpy(hrec, "ok");
+                }
+                    
+                if (drv_no == i) {
                     size = sprintf(buffer+len,
                                    "\n Number:       \t%-2d        \tStatus:        \t%s\n",
-                                   i,hrec);
+                                   drv_no, hrec);
                     len += size;  pos = begin + len;
                     flag = TRUE;
-
-                    if (pai->ai_type == 0)
+                    no_mdrv = pcdi->cd_ldcnt;
+                    if (no_mdrv > 1 || pcdi->ld_slave != -1) {
+                        is_mirr = TRUE;
+                        strcpy(hrec, "RAID-1");
+                    } else if (pcdi->ld_dtype == 0) {
+                        strcpy(hrec, "Disk");
+                    } else if (pcdi->ld_dtype == 1) {
                         strcpy(hrec, "RAID-0");
-                    else if (pai->ai_type == 4)
-                        strcpy(hrec, "RAID-4");
-                    else if (pai->ai_type == 5)
-                        strcpy(hrec, "RAID-5");
-                    else 
-                        strcpy(hrec, "RAID-10");
+                    } else if (pcdi->ld_dtype == 2) {
+                        strcpy(hrec, "Chain");
+                    } else {
+                        strcpy(hrec, "???");
+                    }
                     size = sprintf(buffer+len,
                                    " Capacity [MB]:\t%-6d    \tType:          \t%s\n",
-                                   pai->ai_size/(1024*1024/pai->ai_secsize),
+                                   pcdi->ld_blkcnt/(1024*1024/pcdi->ld_blksize),
                                    hrec);
                     len += size;  pos = begin + len;
-                    if (pos < offset) {
-                        len = 0;
-                        begin = pos;
-                    }
-                    if (pos > offset + length)
-                        goto stop_output;
+                } else {
+                    size = sprintf(buffer+len,
+                                   " Slave Number: \t%-2d        \tStatus:        \t%s\n",
+                                   drv_no & 0x7fff, hrec);
+                    len += size;  pos = begin + len;
                 }
-            }
-            gdth_ioctl_free(hanum, GDTH_SCRATCH, buf, paddr);
-        
-            if (!flag) {
-                size = sprintf(buffer+len, "\n --\n");
+                drv_no = pcdi->ld_slave;
+                if (pos < offset) {
+                    len = 0;
+                    begin = pos;
+                }
+                if (pos > offset + length)
+                    goto stop_output;
+            } while (drv_no != -1);
+             
+            if (is_mirr) {
+                size = sprintf(buffer+len,
+                               " Missing Drv.: \t%-2d        \tInvalid Drv.:  \t%d\n",
+                               no_mdrv - j - k, k);
                 len += size;  pos = begin + len;
             }
-
-            /* 5. about host drives */
-            size = sprintf(buffer+len,"\nHost Drives:");
+              
+            if (!ha->hdr[i].is_arraydrv)
+                strcpy(hrec, "--");
+            else
+                sprintf(hrec, "%d", ha->hdr[i].master_no);
+            size = sprintf(buffer+len,
+                           " To Array Drv.:\t%s\n", hrec);
             len += size;  pos = begin + len;
-            flag = FALSE;
-
-            buf = gdth_ioctl_alloc(hanum, sizeof(gdth_hget_str), FALSE, &paddr);
-            if (!buf) 
+            if (pos < offset) {
+                len = 0;
+                begin = pos;
+            }
+            if (pos > offset + length)
                 goto stop_output;
-            for (i = 0; i < MAX_LDRIVES; ++i) {
-                if (!ha->hdr[i].is_logdrv || 
-                    (ha->hdr[i].is_arraydrv && !ha->hdr[i].is_master))
-                    continue;
-                /* 5.a get host drive list */
-                TRACE2(("host_get() drv_no %d\n",i));           
-                phg = (gdth_hget_str *)buf;
-                gdtcmd.Service = CACHESERVICE;
-                gdtcmd.OpCode = GDT_IOCTL;
-                gdtcmd.u.ioctl.p_param = paddr;
-                gdtcmd.u.ioctl.param_size = sizeof(gdth_hget_str);
-                gdtcmd.u.ioctl.subfunc = HOST_GET | LA_CTRL_PATTERN;
-                gdtcmd.u.ioctl.channel = i;
-                phg->entries = MAX_HDRIVES;
-                phg->offset = GDTOFFSOF(gdth_hget_str, entry[0]); 
-#if LINUX_VERSION_CODE >= 0x020503
-                gdth_do_req(scp, &gdtcmd, cmnd, 30);
-                if (scp->sr_command->SCp.Status != S_OK) 
-#elif LINUX_VERSION_CODE >= 0x020322
-                gdth_do_cmd(scp, &gdtcmd, cmnd, 30);
-                if (scp->SCp.Status != S_OK) 
+        }       
+        gdth_ioctl_free(hanum, GDTH_SCRATCH, buf, paddr);
+        
+        if (!flag) {
+            size = sprintf(buffer+len, "\n --\n");
+            len += size;  pos = begin + len;
+        }   
+
+        /* 4. about array drives */
+        size = sprintf(buffer+len,"\nArray Drives:");
+        len += size;  pos = begin + len;
+        flag = FALSE;
+
+        buf = gdth_ioctl_alloc(hanum, GDTH_SCRATCH, FALSE, &paddr);
+        if (!buf) 
+            goto stop_output;
+        for (i = 0; i < MAX_LDRIVES; ++i) {
+            if (!(ha->hdr[i].is_arraydrv && ha->hdr[i].is_master))
+                continue;
+            /* 4.a array drive info */
+            TRACE2(("array_info() drive no %d\n",i));
+            pai = (gdth_arrayinf_str *)buf;
+            gdtcmd.Service = CACHESERVICE;
+            gdtcmd.OpCode = GDT_IOCTL;
+            gdtcmd.u.ioctl.p_param = paddr;
+            gdtcmd.u.ioctl.param_size = sizeof(gdth_arrayinf_str);
+            gdtcmd.u.ioctl.subfunc = ARRAY_INFO | LA_CTRL_PATTERN;
+            gdtcmd.u.ioctl.channel = i;
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
+            gdth_do_req(scp, &gdtcmd, cmnd, 30);
+            if (scp->sr_command->SCp.Status == S_OK) 
+#elif LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0)
+            gdth_do_cmd(scp, &gdtcmd, cmnd, 30);
+            if (scp->SCp.Status == S_OK) 
 #else
-                gdth_do_cmd(&scp, &gdtcmd, cmnd, 30);
-                if (scp.SCp.Status != S_OK) 
+            gdth_do_cmd(&scp, &gdtcmd, cmnd, 30);
+            if (scp.SCp.Status == S_OK) 
 #endif
-                {
-                    ha->hdr[i].ldr_no = i;
-                    ha->hdr[i].rw_attribs = 0;
-                    ha->hdr[i].start_sec = 0;
-                } else {
-                    for (j = 0; j < phg->entries; ++j) {
-                        k = phg->entry[j].host_drive;
-                        if (k >= MAX_LDRIVES)
-                            continue;
-                        ha->hdr[k].ldr_no = phg->entry[j].log_drive;
-                        ha->hdr[k].rw_attribs = phg->entry[j].rw_attribs;
-                        ha->hdr[k].start_sec = phg->entry[j].start_sec;
-                    }
-                }
-            }
-            gdth_ioctl_free(hanum, sizeof(gdth_hget_str), buf, paddr);
-
-            for (i = 0; i < MAX_HDRIVES; ++i) {
-                if (!(ha->hdr[i].present))
-                    continue;
-                
+            {
+                if (pai->ai_state == 0)
+                    strcpy(hrec, "idle");
+                else if (pai->ai_state == 2)
+                    strcpy(hrec, "build");
+                else if (pai->ai_state == 4)
+                    strcpy(hrec, "ready");
+                else if (pai->ai_state == 6)
+                    strcpy(hrec, "fail");
+                else if (pai->ai_state == 8 || pai->ai_state == 10)
+                    strcpy(hrec, "rebuild");
+                else
+                    strcpy(hrec, "error");
+                if (pai->ai_ext_state & 0x10)
+                    strcat(hrec, "/expand");
+                else if (pai->ai_ext_state & 0x1)
+                    strcat(hrec, "/patch");
                 size = sprintf(buffer+len,
-                               "\n Number:       \t%-2d        \tArr/Log. Drive:\t%d\n",
-                               i, ha->hdr[i].ldr_no);
+                               "\n Number:       \t%-2d        \tStatus:        \t%s\n",
+                               i,hrec);
                 len += size;  pos = begin + len;
                 flag = TRUE;
 
+                if (pai->ai_type == 0)
+                    strcpy(hrec, "RAID-0");
+                else if (pai->ai_type == 4)
+                    strcpy(hrec, "RAID-4");
+                else if (pai->ai_type == 5)
+                    strcpy(hrec, "RAID-5");
+                else 
+                    strcpy(hrec, "RAID-10");
                 size = sprintf(buffer+len,
-                               " Capacity [MB]:\t%-6d    \tStart Sector:  \t%d\n",
-                               ha->hdr[i].size/2048, ha->hdr[i].start_sec);
+                               " Capacity [MB]:\t%-6d    \tType:          \t%s\n",
+                               pai->ai_size/(1024*1024/pai->ai_secsize),
+                               hrec);
                 len += size;  pos = begin + len;
                 if (pos < offset) {
                     len = 0;
@@ -1299,60 +708,125 @@
                 if (pos > offset + length)
                     goto stop_output;
             }
+        }
+        gdth_ioctl_free(hanum, GDTH_SCRATCH, buf, paddr);
         
-            if (!flag) {
-                size = sprintf(buffer+len, "\n --\n");
-                len += size;  pos = begin + len;
-            }
+        if (!flag) {
+            size = sprintf(buffer+len, "\n --\n");
+            len += size;  pos = begin + len;
         }
 
-        /* controller events */
-        size = sprintf(buffer+len,"\nController Events:\n");
+        /* 5. about host drives */
+        size = sprintf(buffer+len,"\nHost Drives:");
         len += size;  pos = begin + len;
+        flag = FALSE;
 
-        for (id = -1;;) {
-            id = gdth_read_event(ha, id, &estr);
-            if (estr.event_source == 0)
-                break;
-            if (estr.event_data.eu.driver.ionode == hanum &&
-                estr.event_source == ES_ASYNC) { 
-                gdth_log_event(&estr.event_data, hrec);
-                do_gettimeofday(&tv);
-                sec = (int)(tv.tv_sec - estr.first_stamp);
-                if (sec < 0) sec = 0;
-                size = sprintf(buffer+len," date- %02d:%02d:%02d\t%s\n",
-                               sec/3600, sec%3600/60, sec%60, hrec);
-                len += size;  pos = begin + len;
-                if (pos < offset) {
-                    len = 0;
-                    begin = pos;
+        buf = gdth_ioctl_alloc(hanum, sizeof(gdth_hget_str), FALSE, &paddr);
+        if (!buf) 
+            goto stop_output;
+        for (i = 0; i < MAX_LDRIVES; ++i) {
+            if (!ha->hdr[i].is_logdrv || 
+                (ha->hdr[i].is_arraydrv && !ha->hdr[i].is_master))
+                continue;
+            /* 5.a get host drive list */
+            TRACE2(("host_get() drv_no %d\n",i));           
+            phg = (gdth_hget_str *)buf;
+            gdtcmd.Service = CACHESERVICE;
+            gdtcmd.OpCode = GDT_IOCTL;
+            gdtcmd.u.ioctl.p_param = paddr;
+            gdtcmd.u.ioctl.param_size = sizeof(gdth_hget_str);
+            gdtcmd.u.ioctl.subfunc = HOST_GET | LA_CTRL_PATTERN;
+            gdtcmd.u.ioctl.channel = i;
+            phg->entries = MAX_HDRIVES;
+            phg->offset = GDTOFFSOF(gdth_hget_str, entry[0]); 
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
+            gdth_do_req(scp, &gdtcmd, cmnd, 30);
+            if (scp->sr_command->SCp.Status != S_OK) 
+#elif LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0)
+            gdth_do_cmd(scp, &gdtcmd, cmnd, 30);
+            if (scp->SCp.Status != S_OK) 
+#else
+            gdth_do_cmd(&scp, &gdtcmd, cmnd, 30);
+            if (scp.SCp.Status != S_OK) 
+#endif
+            {
+                ha->hdr[i].ldr_no = i;
+                ha->hdr[i].rw_attribs = 0;
+                ha->hdr[i].start_sec = 0;
+            } else {
+                for (j = 0; j < phg->entries; ++j) {
+                    k = phg->entry[j].host_drive;
+                    if (k >= MAX_LDRIVES)
+                        continue;
+                    ha->hdr[k].ldr_no = phg->entry[j].log_drive;
+                    ha->hdr[k].rw_attribs = phg->entry[j].rw_attribs;
+                    ha->hdr[k].start_sec = phg->entry[j].start_sec;
                 }
-                if (pos > offset + length)
-                    goto stop_output;
             }
-            if (id == -1)
-                break;
         }
-#ifdef GDTH_IOCTL_PROC
-    } else {
-        gdth_iord_str *piord;
+        gdth_ioctl_free(hanum, sizeof(gdth_hget_str), buf, paddr);
 
-        /* request from tool (GDTMON,..) */
-        piord = (gdth_iord_str *)ha->pscratch;
-        if (piord == NULL)
-            goto stop_output;
-        length = piord->size;
-        memcpy(buffer+len, (char *)piord, length);
-        gdth_ioctl_free(hanum, GDTH_SCRATCH, ha->pscratch, paddr);
-        len = length; 
+        for (i = 0; i < MAX_HDRIVES; ++i) {
+            if (!(ha->hdr[i].present))
+                continue;
+              
+            size = sprintf(buffer+len,
+                           "\n Number:       \t%-2d        \tArr/Log. Drive:\t%d\n",
+                           i, ha->hdr[i].ldr_no);
+            len += size;  pos = begin + len;
+            flag = TRUE;
+
+            size = sprintf(buffer+len,
+                           " Capacity [MB]:\t%-6d    \tStart Sector:  \t%d\n",
+                           (ulong32)(ha->hdr[i].size/2048), ha->hdr[i].start_sec);
+            len += size;  pos = begin + len;
+            if (pos < offset) {
+                len = 0;
+                begin = pos;
+            }
+            if (pos > offset + length)
+                goto stop_output;
+        }
+        
+        if (!flag) {
+            size = sprintf(buffer+len, "\n --\n");
+            len += size;  pos = begin + len;
+        }
+    }
+
+    /* controller events */
+    size = sprintf(buffer+len,"\nController Events:\n");
+    len += size;  pos = begin + len;
+
+    for (id = -1;;) {
+        id = gdth_read_event(ha, id, &estr);
+        if (estr.event_source == 0)
+            break;
+        if (estr.event_data.eu.driver.ionode == hanum &&
+            estr.event_source == ES_ASYNC) { 
+            gdth_log_event(&estr.event_data, hrec);
+            do_gettimeofday(&tv);
+            sec = (int)(tv.tv_sec - estr.first_stamp);
+            if (sec < 0) sec = 0;
+            size = sprintf(buffer+len," date- %02d:%02d:%02d\t%s\n",
+                           sec/3600, sec%3600/60, sec%60, hrec);
+            len += size;  pos = begin + len;
+            if (pos < offset) {
+                len = 0;
+                begin = pos;
+            }
+            if (pos > offset + length)
+                goto stop_output;
+        }
+        if (id == -1)
+            break;
     }
-#endif
 
 stop_output:
-#if LINUX_VERSION_CODE >= 0x020503
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
     scsi_release_request(scp);
     scsi_free_host_dev(sdev);
-#elif LINUX_VERSION_CODE >= 0x020322
+#elif LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0)
     scsi_release_command(scp);
     scsi_free_host_dev(sdev);
 #endif
@@ -1365,7 +839,8 @@
     return(len);
 }
 
-#if LINUX_VERSION_CODE >= 0x020503
+
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
 static void gdth_do_req(Scsi_Request *scp, gdth_cmd_str *gdtcmd, 
                         char *cmnd, int timeout)
 {
@@ -1389,9 +864,9 @@
                         char *cmnd, int timeout)
 {
     unsigned bufflen;
-#if LINUX_VERSION_CODE >= 0x020407
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,7)
     DECLARE_COMPLETION(wait);
-#elif LINUX_VERSION_CODE >= 0x020322
+#elif LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0)
     DECLARE_MUTEX_LOCKED(sem);
 #else
     struct semaphore sem = MUTEX_LOCKED;
@@ -1405,19 +880,19 @@
         scp->SCp.this_residual = DEFAULT_PRI;
         bufflen = 0;
     }
-#if LINUX_VERSION_CODE >= 0x020407
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,7)
     scp->request.rq_status = RQ_SCSI_BUSY;
     scp->request.waiting = &wait;
     scsi_do_cmd(scp, cmnd, gdtcmd, bufflen, gdth_scsi_done, timeout*HZ, 1);
     wait_for_completion(&wait);
 #else
     scp->request.sem = &sem;
-#if LINUX_VERSION_CODE >= 0x020322
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0)
     scsi_do_cmd(scp, cmnd, gdtcmd, bufflen, gdth_scsi_done, timeout*HZ, 1);
 #else
-    GDTH_LOCK_SCSI_DOCMD();
+    spin_lock_irq(&io_request_lock);
     scsi_do_cmd(scp, cmnd, gdtcmd, bufflen, gdth_scsi_done, timeout*HZ, 1);
-    GDTH_UNLOCK_SCSI_DOCMD();
+    spin_unlock_irq(&io_request_lock);
 #endif
     down(&sem);
 #endif
@@ -1428,11 +903,11 @@
 {
     TRACE2(("gdth_scsi_done()\n"));
 
-#if LINUX_VERSION_CODE >= 0x020503
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
     scp->request->rq_status = RQ_SCSI_DONE;
     if (scp->request->waiting != NULL)
         complete(scp->request->waiting);
-#elif LINUX_VERSION_CODE >= 0x020407
+#elif LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,7)
     scp->request.rq_status = RQ_SCSI_DONE;
     if (scp->request.waiting != NULL)
         complete(scp->request.waiting);
@@ -1444,7 +919,7 @@
 }
 
 static char *gdth_ioctl_alloc(int hanum, int size, int scratch, 
-                              ulong32 *paddr)
+                              ulong64 *paddr)
 {
     gdth_ha_str *ha;
     ulong flags;
@@ -1463,11 +938,11 @@
     } else if (scratch) {
         ret_val = NULL;
     } else {
-#if LINUX_VERSION_CODE >= 0x020400
-	dma_addr_t dma_addr;
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0)
+        dma_addr_t dma_addr;
 
         ret_val = pci_alloc_consistent(ha->pdev, size, &dma_addr);
-	*paddr = (ulong32)dma_addr;
+        *paddr = dma_addr;
 #else
         ret_val = scsi_init_malloc(size, GFP_ATOMIC | GFP_DMA);
         if (ret_val)
@@ -1479,7 +954,7 @@
     return ret_val;
 }
 
-static void gdth_ioctl_free(int hanum, int size, char *buf, ulong32 paddr)
+static void gdth_ioctl_free(int hanum, int size, char *buf, ulong64 paddr)
 {
     gdth_ha_str *ha;
     ulong flags;
@@ -1490,7 +965,7 @@
     if (buf == ha->pscratch) {
         ha->scratch_busy = FALSE;
     } else {
-#if LINUX_VERSION_CODE >= 0x020400
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0)
         pci_free_consistent(ha->pdev, size, buf, paddr);
 #else
         scsi_init_free((void *)buf, size);
@@ -1533,7 +1008,7 @@
 
     for (i = 0; i < GDTH_MAXCMDS; ++i) {
         scp = ha->cmd_tab[i].cmnd;
-#if LINUX_VERSION_CODE >= 0x02053C
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
         b = virt_ctr ? NUMDATA(scp->device->host)->busnum : scp->device->channel;
         t = scp->device->id;
 #else
@@ -1546,14 +1021,10 @@
             GDTH_UNLOCK_HA(ha, flags);
             while (!scp->SCp.have_data_in)
                 barrier();
-#if LINUX_VERSION_CODE >= 0x02053C
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
             GDTH_LOCK_SCSI_DONE(scp->device->host, flags);
             scp->scsi_done(scp);
             GDTH_UNLOCK_SCSI_DONE(scp->device->host, flags);
-#elif LINUX_VERSION_CODE >= 0x020503
-            GDTH_LOCK_SCSI_DONE(scp->host, flags);
-            scp->scsi_done(scp);
-            GDTH_UNLOCK_SCSI_DONE(scp->host, flags);
 #else
             GDTH_LOCK_SCSI_DONE(flags);
             scp->scsi_done(scp);
@@ -1576,7 +1047,7 @@
     GDTH_LOCK_HA(ha, flags);
 
     for (scp = ha->req_first; scp; scp = (Scsi_Cmnd *)scp->SCp.ptr) {
-#if LINUX_VERSION_CODE >= 0x02053C
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
         b = virt_ctr ? NUMDATA(scp->device->host)->busnum : scp->device->channel;
         t = scp->device->id;
 #else
@@ -1602,7 +1073,7 @@
     GDTH_LOCK_HA(ha, flags);
 
     for (scp = ha->req_first; scp; scp = (Scsi_Cmnd *)scp->SCp.ptr) {
-#if LINUX_VERSION_CODE >= 0x02053C
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
         b = virt_ctr ? NUMDATA(scp->device->host)->busnum : scp->device->channel;
         t = scp->device->id;
 #else
@@ -1624,7 +1095,6 @@
     oldto = scp->timeout_per_command;
     scp->timeout_per_command = timeout;
 
-#if LINUX_VERSION_CODE >= 0x02014B
     if (timeout == 0) {
         del_timer(&scp->eh_timeout);
         scp->eh_timeout.data = (unsigned long) NULL;
@@ -1636,17 +1106,6 @@
         scp->eh_timeout.expires = jiffies + timeout;
         add_timer(&scp->eh_timeout);
     }
-#else
-    if (timeout > 0) {
-        if (timer_table[SCSI_TIMER].expires == 0) {
-            timer_table[SCSI_TIMER].expires = jiffies + timeout;
-            timer_active |= 1 << SCSI_TIMER;
-        } else {
-            if (jiffies + timeout < timer_table[SCSI_TIMER].expires)
-                timer_table[SCSI_TIMER].expires = jiffies + timeout;
-        }
-    }
-#endif
 
     return oldto;
 }
diff -Nru a/drivers/scsi/gdth_proc.h b/drivers/scsi/gdth_proc.h
--- a/drivers/scsi/gdth_proc.h	2004-05-26 15:01:36 -07:00
+++ b/drivers/scsi/gdth_proc.h	2004-05-26 15:01:36 -07:00
@@ -2,42 +2,31 @@
 #define _GDTH_PROC_H
 
 /* gdth_proc.h 
- * $Id: gdth_proc.h,v 1.14 2003/08/27 11:37:35 achim Exp $
+ * $Id: gdth_proc.h,v 1.16 2004/01/14 13:09:01 achim Exp $
  */
 
-static int gdth_set_info(char *buffer,int length,int hanum,int busnum);
-static int gdth_get_info(char *buffer,char **start,off_t offset,
-                         int length,int hanum,int busnum);
+static int gdth_set_info(char *buffer,int length,struct Scsi_Host *host,
+                         int hanum,int busnum);
+static int gdth_get_info(char *buffer,char **start,off_t offset,int length,
+                         struct Scsi_Host *host,int hanum,int busnum);
 
-#if LINUX_VERSION_CODE >= 0x020503
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
 static void gdth_do_req(Scsi_Request *srp, gdth_cmd_str *cmd, 
                         char *cmnd, int timeout);
 static int gdth_set_asc_info(char *buffer,int length,int hanum,Scsi_Request *scp);
-#ifdef GDTH_IOCTL_PROC
-static int gdth_set_bin_info(char *buffer,int length,int hanum,Scsi_Request *scp);
-#endif
-#elif LINUX_VERSION_CODE >= 0x020322
+#elif LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0)
 static void gdth_do_cmd(Scsi_Cmnd *scp, gdth_cmd_str *cmd, 
                         char *cmnd, int timeout);
 static int gdth_set_asc_info(char *buffer,int length,int hanum,Scsi_Cmnd *scp);
-#ifdef GDTH_IOCTL_PROC
-static int gdth_set_bin_info(char *buffer,int length,int hanum,Scsi_Cmnd *scp);
-#endif
 #else 
 static void gdth_do_cmd(Scsi_Cmnd *scp, gdth_cmd_str *cmd, 
                         char *cmnd, int timeout);
 static int gdth_set_asc_info(char *buffer,int length,int hanum,Scsi_Cmnd scp);
-#ifdef GDTH_IOCTL_PROC
-static int gdth_set_bin_info(char *buffer,int length,int hanum,Scsi_Cmnd scp);
-#endif
 #endif
 
 static char *gdth_ioctl_alloc(int hanum, int size, int scratch,
-                              ulong32 *paddr);  
-static void gdth_ioctl_free(int hanum, int size, char *buf, ulong32 paddr);
-#ifdef GDTH_IOCTL_PROC
-static int gdth_ioctl_check_bin(int hanum, ushort size);
-#endif
+                              ulong64 *paddr);  
+static void gdth_ioctl_free(int hanum, int size, char *buf, ulong64 paddr);
 static void gdth_wait_completion(int hanum, int busnum, int id);
 static void gdth_stop_timeout(int hanum, int busnum, int id);
 static void gdth_start_timeout(int hanum, int busnum, int id);
diff -Nru a/drivers/scsi/ipr.c b/drivers/scsi/ipr.c
--- a/drivers/scsi/ipr.c	2004-05-26 15:01:36 -07:00
+++ b/drivers/scsi/ipr.c	2004-05-26 15:01:36 -07:00
@@ -406,7 +406,7 @@
 	trace_entry->type = type;
 	trace_entry->cmd_index = ipr_cmd->cmd_index;
 	trace_entry->res_handle = ipr_cmd->ioarcb.res_handle;
-	trace_entry->add_data = add_data;
+	trace_entry->u.add_data = add_data;
 }
 #else
 #define ipr_trc_hook(ipr_cmd, type, add_data) do { } while(0)
@@ -447,7 +447,7 @@
 static void ipr_init_ipr_cmnd(struct ipr_cmnd *ipr_cmd)
 {
 	ipr_reinit_ipr_cmnd(ipr_cmd);
-	ipr_cmd->scratch = 0;
+	ipr_cmd->u.scratch = 0;
 	init_timer(&ipr_cmd->timer);
 }
 
@@ -676,8 +676,8 @@
  **/
 static void ipr_internal_cmd_done(struct ipr_cmnd *ipr_cmd)
 {
-	if (ipr_cmd->sibling)
-		ipr_cmd->sibling = NULL;
+	if (ipr_cmd->u.sibling)
+		ipr_cmd->u.sibling = NULL;
 	else
 		complete(&ipr_cmd->completion);
 }
@@ -729,20 +729,20 @@
 		list_add_tail(&ipr_cmd->queue, &ioa_cfg->pending_q);
 		list_add_tail(&hostrcb->queue, &ioa_cfg->hostrcb_pending_q);
 
-		ipr_cmd->hostrcb = hostrcb;
+		ipr_cmd->u.hostrcb = hostrcb;
 		ioarcb = &ipr_cmd->ioarcb;
 
 		ioarcb->res_handle = cpu_to_be32(IPR_IOA_RES_HANDLE);
 		ioarcb->cmd_pkt.request_type = IPR_RQTYPE_HCAM;
 		ioarcb->cmd_pkt.cdb[0] = IPR_HOST_CONTROLLED_ASYNC;
 		ioarcb->cmd_pkt.cdb[1] = type;
-		ioarcb->cmd_pkt.cdb[7] = (IPR_HOSTRCB_SZ >> 8) & 0xff;
-		ioarcb->cmd_pkt.cdb[8] = IPR_HOSTRCB_SZ & 0xff;
+		ioarcb->cmd_pkt.cdb[7] = (sizeof(hostrcb->hcam) >> 8) & 0xff;
+		ioarcb->cmd_pkt.cdb[8] = sizeof(hostrcb->hcam) & 0xff;
 
-		ioarcb->read_data_transfer_length = cpu_to_be32(IPR_HOSTRCB_SZ);
+		ioarcb->read_data_transfer_length = cpu_to_be32(sizeof(hostrcb->hcam));
 		ioarcb->read_ioadl_len = cpu_to_be32(sizeof(struct ipr_ioadl_desc));
 		ipr_cmd->ioadl[0].flags_and_data_len =
-			cpu_to_be32(IPR_IOADL_FLAGS_READ_LAST | IPR_HOSTRCB_SZ);
+			cpu_to_be32(IPR_IOADL_FLAGS_READ_LAST | sizeof(hostrcb->hcam));
 		ipr_cmd->ioadl[0].address = cpu_to_be32(hostrcb->hostrcb_dma);
 
 		if (type == IPR_HCAM_CDB_OP_CODE_CONFIG_CHANGE)
@@ -794,7 +794,7 @@
 	struct ipr_config_table_entry *cfgte;
 	u32 is_ndn = 1;
 
-	cfgte = &hostrcb->ccn.cfgte;
+	cfgte = &hostrcb->hcam.u.ccn.cfgte;
 
 	list_for_each_entry(res, &ioa_cfg->used_res_q, queue) {
 		if (!memcmp(&res->cfgte.res_addr, &cfgte->res_addr,
@@ -822,7 +822,7 @@
 
 	memcpy(&res->cfgte, cfgte, sizeof(struct ipr_config_table_entry));
 
-	if (hostrcb->notify_type == IPR_HOST_RCB_NOTIF_TYPE_REM_ENTRY) {
+	if (hostrcb->hcam.notify_type == IPR_HOST_RCB_NOTIF_TYPE_REM_ENTRY) {
 		if (res->sdev) {
 			res->sdev->hostdata = NULL;
 			res->del_from_ml = 1;
@@ -852,7 +852,7 @@
 static void ipr_process_ccn(struct ipr_cmnd *ipr_cmd)
 {
 	struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg;
-	struct ipr_hostrcb *hostrcb = ipr_cmd->hostrcb;
+	struct ipr_hostrcb *hostrcb = ipr_cmd->u.hostrcb;
 	u32 ioasc = be32_to_cpu(ipr_cmd->ioasa.ioasc);
 
 	list_del(&hostrcb->queue);
@@ -902,7 +902,8 @@
 static void ipr_log_cache_error(struct ipr_ioa_cfg *ioa_cfg,
 				struct ipr_hostrcb *hostrcb)
 {
-	struct ipr_hostrcb_type_02_error *error = &hostrcb->error.type_02_error;
+	struct ipr_hostrcb_type_02_error *error =
+		&hostrcb->hcam.u.error.u.type_02_error;
 
 	ipr_err("-----Current Configuration-----\n");
 	ipr_err("Cache Directory Card Information:\n");
@@ -937,14 +938,15 @@
 {
 	int errors_logged, i;
 	struct ipr_hostrcb_device_data_entry *dev_entry;
+	struct ipr_hostrcb_type_03_error *error;
 
-	errors_logged = be32_to_cpu(hostrcb->error.type_03_error.errors_logged);
+	error = &hostrcb->hcam.u.error.u.type_03_error;
+	errors_logged = be32_to_cpu(error->errors_logged);
 
 	ipr_err("Device Errors Detected/Logged: %d/%d\n",
-		be32_to_cpu(hostrcb->error.type_03_error.errors_detected),
-		errors_logged);
+		be32_to_cpu(error->errors_detected), errors_logged);
 
-	dev_entry = hostrcb->error.type_03_error.dev_entry;
+	dev_entry = error->dev_entry;
 
 	for (i = 0; i < errors_logged; i++, dev_entry++) {
 		ipr_err_separator;
@@ -996,7 +998,7 @@
 
 	memset(zero_sn, '0', IPR_SERIAL_NUM_LEN);
 
-	error = &hostrcb->error.type_04_error;
+	error = &hostrcb->hcam.u.error.u.type_04_error;
 
 	ipr_err_separator;
 
@@ -1064,7 +1066,7 @@
 				  struct ipr_hostrcb *hostrcb)
 {
 	int i;
-	int ioa_data_len = be32_to_cpu(hostrcb->length);
+	int ioa_data_len = be32_to_cpu(hostrcb->hcam.length);
 
 	if (ioa_data_len == 0)
 		return;
@@ -1074,10 +1076,10 @@
 
 	for (i = 0; i < ioa_data_len / 4; i += 4) {
 		ipr_err("%08X: %08X %08X %08X %08X\n", i*4,
-			be32_to_cpu(hostrcb->raw.data[i]),
-			be32_to_cpu(hostrcb->raw.data[i+1]),
-			be32_to_cpu(hostrcb->raw.data[i+2]),
-			be32_to_cpu(hostrcb->raw.data[i+3]));
+			be32_to_cpu(hostrcb->hcam.u.raw.data[i]),
+			be32_to_cpu(hostrcb->hcam.u.raw.data[i+1]),
+			be32_to_cpu(hostrcb->hcam.u.raw.data[i+2]),
+			be32_to_cpu(hostrcb->hcam.u.raw.data[i+3]));
 	}
 }
 
@@ -1119,19 +1121,19 @@
 	u32 ioasc;
 	int error_index;
 
-	if (hostrcb->notify_type != IPR_HOST_RCB_NOTIF_TYPE_ERROR_LOG_ENTRY)
+	if (hostrcb->hcam.notify_type != IPR_HOST_RCB_NOTIF_TYPE_ERROR_LOG_ENTRY)
 		return;
 
-	if (hostrcb->notifications_lost == IPR_HOST_RCB_NOTIFICATIONS_LOST)
+	if (hostrcb->hcam.notifications_lost == IPR_HOST_RCB_NOTIFICATIONS_LOST)
 		dev_err(&ioa_cfg->pdev->dev, "Error notifications lost\n");
 
-	ioasc = be32_to_cpu(hostrcb->error.failing_dev_ioasc);
+	ioasc = be32_to_cpu(hostrcb->hcam.u.error.failing_dev_ioasc);
 
 	if (ioasc == IPR_IOASC_BUS_WAS_RESET ||
 	    ioasc == IPR_IOASC_BUS_WAS_RESET_BY_OTHER) {
 		/* Tell the midlayer we had a bus reset so it will handle the UA properly */
 		scsi_report_bus_reset(ioa_cfg->host,
-				      hostrcb->error.failing_dev_res_addr.bus);
+				      hostrcb->hcam.u.error.failing_dev_res_addr.bus);
 	}
 
 	error_index = ipr_get_error(ioasc);
@@ -1139,8 +1141,8 @@
 	if (!ipr_error_table[error_index].log_hcam)
 		return;
 
-	if (ipr_is_device(&hostrcb->error.failing_dev_res_addr)) {
-		ipr_res_err(ioa_cfg, hostrcb->error.failing_dev_res_addr,
+	if (ipr_is_device(&hostrcb->hcam.u.error.failing_dev_res_addr)) {
+		ipr_res_err(ioa_cfg, hostrcb->hcam.u.error.failing_dev_res_addr,
 			    "%s\n", ipr_error_table[error_index].error);
 	} else {
 		dev_err(&ioa_cfg->pdev->dev, "%s\n",
@@ -1153,7 +1155,7 @@
 	if (ioa_cfg->log_level < IPR_DEFAULT_LOG_LEVEL)
 		return;
 
-	switch (hostrcb->overlay_id) {
+	switch (hostrcb->hcam.overlay_id) {
 	case IPR_HOST_RCB_OVERLAY_ID_1:
 		ipr_log_generic_error(ioa_cfg, hostrcb);
 		break;
@@ -1173,7 +1175,7 @@
 	default:
 		dev_err(&ioa_cfg->pdev->dev,
 			"Unknown error received. Overlay ID: %d\n",
-			hostrcb->overlay_id);
+			hostrcb->hcam.overlay_id);
 		break;
 	}
 }
@@ -1192,7 +1194,7 @@
 static void ipr_process_error(struct ipr_cmnd *ipr_cmd)
 {
 	struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg;
-	struct ipr_hostrcb *hostrcb = ipr_cmd->hostrcb;
+	struct ipr_hostrcb *hostrcb = ipr_cmd->u.hostrcb;
 	u32 ioasc = be32_to_cpu(ipr_cmd->ioasa.ioasc);
 
 	list_del(&hostrcb->queue);
@@ -2972,6 +2974,7 @@
 	cmd_pkt->request_type = IPR_RQTYPE_IOACMD;
 	cmd_pkt->cdb[0] = IPR_RESET_DEVICE;
 
+	ipr_sdev_err(scsi_cmd->device, "Resetting device\n");
 	ipr_send_blocking_cmd(ipr_cmd, ipr_timeout, IPR_DEVICE_RESET_TIMEOUT);
 
 	ioasc = be32_to_cpu(ipr_cmd->ioasa.ioasc);
@@ -3011,10 +3014,10 @@
 	 * If abort has not completed, indicate the reset has, else call the
 	 * abort's done function to wake the sleeping eh thread
 	 */
-	if (ipr_cmd->sibling->sibling)
-		ipr_cmd->sibling->sibling = NULL;
+	if (ipr_cmd->u.sibling->u.sibling)
+		ipr_cmd->u.sibling->u.sibling = NULL;
 	else
-		ipr_cmd->sibling->done(ipr_cmd->sibling);
+		ipr_cmd->u.sibling->done(ipr_cmd->u.sibling);
 
 	list_add_tail(&ipr_cmd->queue, &ioa_cfg->free_q);
 	LEAVE;
@@ -3045,9 +3048,10 @@
 		return;
 	}
 
+	ipr_sdev_err(ipr_cmd->u.sdev, "Abort timed out. Resetting bus\n");
 	reset_cmd = ipr_get_free_ipr_cmnd(ioa_cfg);
-	ipr_cmd->sibling = reset_cmd;
-	reset_cmd->sibling = ipr_cmd;
+	ipr_cmd->u.sibling = reset_cmd;
+	reset_cmd->u.sibling = ipr_cmd;
 	reset_cmd->ioarcb.res_handle = ipr_cmd->ioarcb.res_handle;
 	cmd_pkt = &reset_cmd->ioarcb.cmd_pkt;
 	cmd_pkt->request_type = IPR_RQTYPE_IOACMD;
@@ -3106,7 +3110,9 @@
 	cmd_pkt->cdb[3] = (ioarcb_addr >> 16) & 0xff;
 	cmd_pkt->cdb[4] = (ioarcb_addr >> 8) & 0xff;
 	cmd_pkt->cdb[5] = ioarcb_addr & 0xff;
+	ipr_cmd->u.sdev = scsi_cmd->device;
 
+	ipr_sdev_err(scsi_cmd->device, "Aborting command: %02X\n", scsi_cmd->cmnd[0]);
 	ipr_send_blocking_cmd(ipr_cmd, ipr_abort_timeout, IPR_ABORT_TASK_TIMEOUT);
 	ioasc = be32_to_cpu(ipr_cmd->ioasa.ioasc);
 
@@ -3175,6 +3181,7 @@
 		writel(IPR_PCII_IOA_TRANS_TO_OPER, ioa_cfg->regs.clr_interrupt_reg);
 		int_reg = readl(ioa_cfg->regs.sense_interrupt_reg);
 
+		list_del(&ioa_cfg->reset_cmd->queue);
 		del_timer(&ioa_cfg->reset_cmd->timer);
 		ipr_reset_ioa_job(ioa_cfg->reset_cmd);
 	} else {
@@ -3570,12 +3577,12 @@
 	ipr_sdev_err(ipr_cmd->scsi_cmd->device, "%s\n",
 		     ipr_error_table[error_index].error);
 
-	if ((ioasa->gpdd.device_end_state <= ARRAY_SIZE(ipr_gpdd_dev_end_states)) &&
-	    (ioasa->gpdd.device_bus_phase <= ARRAY_SIZE(ipr_gpdd_dev_bus_phases))) {
+	if ((ioasa->u.gpdd.end_state <= ARRAY_SIZE(ipr_gpdd_dev_end_states)) &&
+	    (ioasa->u.gpdd.bus_phase <=  ARRAY_SIZE(ipr_gpdd_dev_bus_phases))) {
 		ipr_sdev_err(ipr_cmd->scsi_cmd->device,
 			     "Device End state: %s Phase: %s\n",
-			     ipr_gpdd_dev_end_states[ioasa->gpdd.device_end_state],
-			     ipr_gpdd_dev_bus_phases[ioasa->gpdd.device_bus_phase]);
+			     ipr_gpdd_dev_end_states[ioasa->u.gpdd.end_state],
+			     ipr_gpdd_dev_bus_phases[ioasa->u.gpdd.bus_phase]);
 	}
 
 	if (sizeof(struct ipr_ioasa) < be16_to_cpu(ioasa->ret_stat_len))
@@ -3619,7 +3626,7 @@
 
 	if (ipr_is_vset_device(res) &&
 	    ioasc == IPR_IOASC_MED_DO_NOT_REALLOC &&
-	    ioasa->vset.failing_lba_hi != 0) {
+	    ioasa->u.vset.failing_lba_hi != 0) {
 		sense_buf[0] = 0x72;
 		sense_buf[1] = IPR_IOASC_SENSE_KEY(ioasc);
 		sense_buf[2] = IPR_IOASC_SENSE_CODE(ioasc);
@@ -3630,14 +3637,14 @@
 		sense_buf[9] = 0x0A;
 		sense_buf[10] = 0x80;
 
-		failing_lba = be32_to_cpu(ioasa->vset.failing_lba_hi);
+		failing_lba = be32_to_cpu(ioasa->u.vset.failing_lba_hi);
 
 		sense_buf[12] = (failing_lba & 0xff000000) >> 24;
 		sense_buf[13] = (failing_lba & 0x00ff0000) >> 16;
 		sense_buf[14] = (failing_lba & 0x0000ff00) >> 8;
 		sense_buf[15] = failing_lba & 0x000000ff;
 
-		failing_lba = be32_to_cpu(ioasa->vset.failing_lba_lo);
+		failing_lba = be32_to_cpu(ioasa->u.vset.failing_lba_lo);
 
 		sense_buf[16] = (failing_lba & 0xff000000) >> 24;
 		sense_buf[17] = (failing_lba & 0x00ff0000) >> 16;
@@ -3669,9 +3676,9 @@
 		} else {
 			if (ioasc == IPR_IOASC_MED_DO_NOT_REALLOC) {
 				if (ipr_is_vset_device(res))
-					failing_lba = be32_to_cpu(ioasa->vset.failing_lba_lo);
+					failing_lba = be32_to_cpu(ioasa->u.vset.failing_lba_lo);
 				else
-					failing_lba = be32_to_cpu(ioasa->dasd.failing_lba);
+					failing_lba = be32_to_cpu(ioasa->u.dasd.failing_lba);
 
 				sense_buf[0] |= 0x80;	/* Or in the Valid bit */
 				sense_buf[3] = (failing_lba & 0xff000000) >> 24;
@@ -4118,7 +4125,7 @@
 	struct ipr_supported_device *supp_dev = &ioa_cfg->vpd_cbs->supp_dev;
 	struct ipr_ioadl_desc *ioadl = ipr_cmd->ioadl;
 	struct ipr_ioarcb *ioarcb = &ipr_cmd->ioarcb;
-	struct ipr_resource_entry *res = ipr_cmd->res;
+	struct ipr_resource_entry *res = ipr_cmd->u.res;
 
 	ipr_cmd->job_step = ipr_ioa_reset_done;
 
@@ -4126,7 +4133,7 @@
 		if (!ipr_is_af_dasd_device(res))
 			continue;
 
-		ipr_cmd->res = res;
+		ipr_cmd->u.res = res;
 		ipr_set_sup_dev_dflt(supp_dev, &res->cfgte.std_inq_data.vpids);
 
 		ioarcb->res_handle = cpu_to_be32(IPR_IOA_RES_HANDLE);
@@ -4367,8 +4374,8 @@
 			      length);
 
 	ipr_cmd->job_step = ipr_set_supported_devs;
-	ipr_cmd->res = list_entry(ioa_cfg->used_res_q.next,
-				  struct ipr_resource_entry, queue);
+	ipr_cmd->u.res = list_entry(ioa_cfg->used_res_q.next,
+				    struct ipr_resource_entry, queue);
 
 	ipr_do_req(ipr_cmd, ipr_reset_ioa_job, ipr_timeout, IPR_INTERNAL_TIMEOUT);
 
@@ -4802,6 +4809,7 @@
 	ipr_cmd->timer.expires = jiffies + IPR_OPERATIONAL_TIMEOUT;
 	ipr_cmd->timer.function = (void (*)(unsigned long))ipr_timeout;
 	add_timer(&ipr_cmd->timer);
+	list_add_tail(&ipr_cmd->queue, &ioa_cfg->pending_q);
 
 	LEAVE;
 	return IPR_RC_JOB_RETURN;
@@ -4886,12 +4894,12 @@
 	hostrcb = list_entry(ioa_cfg->hostrcb_free_q.next,
 			     struct ipr_hostrcb, queue);
 	list_del(&hostrcb->queue);
-	memset(hostrcb, 0, IPR_HOSTRCB_SZ);
+	memset(&hostrcb->hcam, 0, sizeof(hostrcb->hcam));
 
 	rc = ipr_get_ldump_data_section(ioa_cfg,
 					be32_to_cpu(sdt.entry[0].bar_str_offset),
-					(u32 *)hostrcb,
-					min(length, (int)IPR_HOSTRCB_SZ) / sizeof(u32));
+					(u32 *)&hostrcb->hcam,
+					min(length, (int)sizeof(hostrcb->hcam)) / sizeof(u32));
 
 	if (!rc)
 		ipr_handle_log_data(ioa_cfg, hostrcb);
@@ -5022,8 +5030,8 @@
 	struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg;
 	int rc = IPR_RC_JOB_RETURN;
 
-	if (!ipr_reset_allowed(ioa_cfg) && ipr_cmd->time_left) {
-		ipr_cmd->time_left -= IPR_CHECK_FOR_RESET_TIMEOUT;
+	if (!ipr_reset_allowed(ioa_cfg) && ipr_cmd->u.time_left) {
+		ipr_cmd->u.time_left -= IPR_CHECK_FOR_RESET_TIMEOUT;
 		ipr_reset_start_timer(ipr_cmd, IPR_CHECK_FOR_RESET_TIMEOUT);
 	} else {
 		ipr_cmd->job_step = ipr_reset_start_bist;
@@ -5062,7 +5070,7 @@
 		ipr_cmd->job_step = ipr_reset_start_bist;
 	}
 
-	ipr_cmd->time_left = IPR_WAIT_FOR_RESET_TIMEOUT;
+	ipr_cmd->u.time_left = IPR_WAIT_FOR_RESET_TIMEOUT;
 	ipr_reset_start_timer(ipr_cmd, IPR_CHECK_FOR_RESET_TIMEOUT);
 
 	LEAVE;
@@ -5148,7 +5156,7 @@
 static int ipr_reset_shutdown_ioa(struct ipr_cmnd *ipr_cmd)
 {
 	struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg;
-	enum ipr_shutdown_type shutdown_type = ipr_cmd->shutdown_type;
+	enum ipr_shutdown_type shutdown_type = ipr_cmd->u.shutdown_type;
 	unsigned long timeout;
 	int rc = IPR_RC_JOB_CONTINUE;
 
@@ -5189,7 +5197,7 @@
 static void ipr_reset_ioa_job(struct ipr_cmnd *ipr_cmd)
 {
 	u32 rc, ioasc;
-	unsigned long scratch = ipr_cmd->scratch;
+	unsigned long scratch = ipr_cmd->u.scratch;
 	struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg;
 
 	do {
@@ -5215,7 +5223,7 @@
 		}
 
 		ipr_reinit_ipr_cmnd(ipr_cmd);
-		ipr_cmd->scratch = scratch;
+		ipr_cmd->u.scratch = scratch;
 		rc = ipr_cmd->job_step(ipr_cmd);
 	} while(rc == IPR_RC_JOB_CONTINUE);
 }
@@ -5247,7 +5255,7 @@
 	ipr_cmd = ipr_get_free_ipr_cmnd(ioa_cfg);
 	ioa_cfg->reset_cmd = ipr_cmd;
 	ipr_cmd->job_step = job_step;
-	ipr_cmd->shutdown_type = shutdown_type;
+	ipr_cmd->u.shutdown_type = shutdown_type;
 
 	ipr_reset_ioa_job(ipr_cmd);
 }
@@ -5531,7 +5539,8 @@
 			goto cleanup;
 
 		memset(ioa_cfg->hostrcb[i], 0, sizeof(struct ipr_hostrcb));
-		ioa_cfg->hostrcb[i]->hostrcb_dma = ioa_cfg->hostrcb_dma[i];
+		ioa_cfg->hostrcb[i]->hostrcb_dma =
+			ioa_cfg->hostrcb_dma[i] + offsetof(struct ipr_hostrcb, hcam);
 		list_add_tail(&ioa_cfg->hostrcb[i]->queue, &ioa_cfg->hostrcb_free_q);
 	}
 
diff -Nru a/drivers/scsi/ipr.h b/drivers/scsi/ipr.h
--- a/drivers/scsi/ipr.h	2004-05-26 15:01:35 -07:00
+++ b/drivers/scsi/ipr.h	2004-05-26 15:01:35 -07:00
@@ -36,8 +36,8 @@
 /*
  * Literals
  */
-#define IPR_DRIVER_VERSION "2.0.6"
-#define IPR_DRIVER_DATE "(May 3, 2004)"
+#define IPR_DRIVER_VERSION "2.0.7"
+#define IPR_DRIVER_DATE "(May 21, 2004)"
 
 /*
  * IPR_DBG_TRACE: Setting this to 1 will turn on some general function tracing
@@ -413,8 +413,8 @@
 }__attribute__((packed, aligned (4)));
 
 struct ipr_ioasa_gpdd {
-	u8 device_end_state;
-	u8 device_bus_phase;
+	u8 end_state;
+	u8 bus_phase;
 	u16 reserved;
 	u32 ioa_data[23];
 }__attribute__((packed, aligned (4)));
@@ -457,7 +457,7 @@
 		struct ipr_ioasa_af_dasd dasd;
 		struct ipr_ioasa_gpdd gpdd;
 		struct ipr_ioasa_raw raw;
-	};
+	} u;
 }__attribute__((packed, aligned (4)));
 
 struct ipr_mode_parm_hdr {
@@ -617,14 +617,14 @@
 		struct ipr_hostrcb_type_02_error type_02_error;
 		struct ipr_hostrcb_type_03_error type_03_error;
 		struct ipr_hostrcb_type_04_error type_04_error;
-	};
+	} u;
 }__attribute__((packed, aligned (4)));
 
 struct ipr_hostrcb_raw {
 	u32 data[sizeof(struct ipr_hostrcb_error)/sizeof(u32)];
 }__attribute__((packed, aligned (4)));
 
-struct ipr_hostrcb {
+struct ipr_hcam {
 	u8 op_code;
 #define IPR_HOST_RCB_OP_CODE_CONFIG_CHANGE			0xE1
 #define IPR_HOST_RCB_OP_CODE_LOG_DATA				0xE2
@@ -662,14 +662,14 @@
 		struct ipr_hostrcb_error error;
 		struct ipr_hostrcb_cfg_ch_not ccn;
 		struct ipr_hostrcb_raw raw;
-	};
+	} u;
+}__attribute__((packed, aligned (4)));
 
-	/* Driver added data */
+struct ipr_hostrcb {
+	struct ipr_hcam hcam;
 	u32 hostrcb_dma;
 	struct list_head queue;
-}__attribute__((packed, aligned (4)));
-
-#define IPR_HOSTRCB_SZ offsetof(struct ipr_hostrcb, hostrcb_dma)
+};
 
 /* IPR smart dump table structures */
 struct ipr_sdt_entry {
@@ -785,7 +785,7 @@
 		u32 ioasc;
 		u32 add_data;
 		u32 res_addr;
-	};
+	} u;
 };
 
 struct ipr_sglist {
@@ -939,7 +939,8 @@
 		unsigned long scratch;
 		struct ipr_resource_entry *res;
 		struct ipr_cmnd *sibling;
-	};
+		struct scsi_device *sdev;
+	} u;
 
 	struct ipr_ioa_cfg *ioa_cfg;
 };
diff -Nru a/drivers/scsi/nsp32.c b/drivers/scsi/nsp32.c
--- a/drivers/scsi/nsp32.c	2004-05-26 15:01:35 -07:00
+++ b/drivers/scsi/nsp32.c	2004-05-26 15:01:35 -07:00
@@ -38,7 +38,6 @@
 #include <linux/pci.h>
 #include <linux/delay.h>
 #include <linux/ctype.h>
-#include <linux/interrupt.h>
 
 #include <asm/dma.h>
 #include <asm/system.h>
diff -Nru a/drivers/scsi/qlogicfas408.c b/drivers/scsi/qlogicfas408.c
--- a/drivers/scsi/qlogicfas408.c	2004-05-26 15:01:35 -07:00
+++ b/drivers/scsi/qlogicfas408.c	2004-05-26 15:01:35 -07:00
@@ -538,7 +538,7 @@
  *	Return info string
  */
 
-char *qlogicfas408_info(struct Scsi_Host *host)
+const char *qlogicfas408_info(struct Scsi_Host *host)
 {
 	struct qlogicfas408_priv *priv = get_priv_by_host(host);
 	return priv->qinfo;
diff -Nru a/drivers/scsi/qlogicfas408.h b/drivers/scsi/qlogicfas408.h
--- a/drivers/scsi/qlogicfas408.h	2004-05-26 15:01:35 -07:00
+++ b/drivers/scsi/qlogicfas408.h	2004-05-26 15:01:35 -07:00
@@ -111,7 +111,7 @@
 int qlogicfas408_bus_reset(Scsi_Cmnd * cmd);
 int qlogicfas408_host_reset(Scsi_Cmnd * cmd);
 int qlogicfas408_device_reset(Scsi_Cmnd * cmd);
-char *qlogicfas408_info(struct Scsi_Host *host);
+const char *qlogicfas408_info(struct Scsi_Host *host);
 int qlogicfas408_get_chip_type(int qbase, int int_type);
 void qlogicfas408_setup(int qbase, int id, int int_type);
 int qlogicfas408_detect(int qbase, int int_type);
diff -Nru a/drivers/scsi/scsi_lib.c b/drivers/scsi/scsi_lib.c
--- a/drivers/scsi/scsi_lib.c	2004-05-26 15:01:36 -07:00
+++ b/drivers/scsi/scsi_lib.c	2004-05-26 15:01:36 -07:00
@@ -1610,7 +1610,9 @@
 
 	case SDEV_CANCEL:
 		switch (oldstate) {
+		case SDEV_CREATED:
 		case SDEV_RUNNING:
+		case SDEV_OFFLINE:
 			break;
 		default:
 			goto illegal;
@@ -1619,9 +1621,7 @@
 
 	case SDEV_DEL:
 		switch (oldstate) {
-		case SDEV_CREATED:
 		case SDEV_CANCEL:
-		case SDEV_OFFLINE:
 			break;
 		default:
 			goto illegal;
diff -Nru a/drivers/scsi/scsi_logging.h b/drivers/scsi/scsi_logging.h
--- a/drivers/scsi/scsi_logging.h	2004-05-26 15:01:35 -07:00
+++ b/drivers/scsi/scsi_logging.h	2004-05-26 15:01:35 -07:00
@@ -46,7 +46,7 @@
 
 #define SCSI_CHECK_LOGGING(SHIFT, BITS, LEVEL, CMD)		\
 {								\
-        if ((SCSI_LOG_LEVEL(SHIFT, BITS)) > (LEVEL))		\
+        if (unlikely((SCSI_LOG_LEVEL(SHIFT, BITS)) > (LEVEL)))	\
 		(CMD);						\
 }
 #else
diff -Nru a/drivers/scsi/scsi_scan.c b/drivers/scsi/scsi_scan.c
--- a/drivers/scsi/scsi_scan.c	2004-05-26 15:01:36 -07:00
+++ b/drivers/scsi/scsi_scan.c	2004-05-26 15:01:36 -07:00
@@ -80,7 +80,6 @@
 MODULE_PARM_DESC(max_luns,
 		 "last scsi LUN (should be between 1 and 2^32-1)");
 
-#ifdef CONFIG_SCSI_REPORT_LUNS
 /*
  * max_scsi_report_luns: the maximum number of LUNS that will be
  * returned from the REPORT LUNS command. 8 times this value must
@@ -88,13 +87,19 @@
  * in practice, the maximum number of LUNs suppored by any device
  * is about 16k.
  */
-static unsigned int max_scsi_report_luns = 128;
+static unsigned int max_scsi_report_luns = 511;
 
 module_param_named(max_report_luns, max_scsi_report_luns, int, S_IRUGO|S_IWUSR);
 MODULE_PARM_DESC(max_report_luns,
 		 "REPORT LUNS maximum number of LUNS received (should be"
 		 " between 1 and 16384)");
-#endif
+
+static unsigned int scsi_inq_timeout = SCSI_TIMEOUT/HZ+3;
+
+module_param_named(inq_timeout, scsi_inq_timeout, int, S_IRUGO|S_IWUSR);
+MODULE_PARM_DESC(inq_timeout, 
+		 "Timeout (in seconds) waiting for devices to answer INQUIRY."
+		 " Default is 5. Some non-compliant devices need more.");
 
 /**
  * scsi_unlock_floptical - unlock device via a special MODE SENSE command
@@ -212,6 +217,11 @@
 	INIT_LIST_HEAD(&sdev->starved_entry);
 	spin_lock_init(&sdev->list_lock);
 
+
+	/* if the device needs this changing, it may do so in the
+	 * slave_configure function */
+	sdev->max_device_blocked = SCSI_DEFAULT_DEVICE_BLOCKED;
+
 	/*
 	 * Some low level driver could use device->type
 	 */
@@ -346,7 +356,7 @@
 
 	memset(inq_result, 0, 36);
 	scsi_wait_req(sreq, (void *) scsi_cmd, (void *) inq_result, 36,
-		      SCSI_TIMEOUT + 4 * HZ, 3);
+		      HZ/2 + HZ*scsi_inq_timeout, 3);
 
 	SCSI_LOG_SCAN_BUS(3, printk(KERN_INFO "scsi scan: 1st INQUIRY %s with"
 			" code 0x%x\n", sreq->sr_result ?
@@ -400,7 +410,7 @@
 		memset(inq_result, 0, possible_inq_resp_len);
 		scsi_wait_req(sreq, (void *) scsi_cmd,
 			      (void *) inq_result,
-			      possible_inq_resp_len, SCSI_TIMEOUT + 4 * HZ, 3);
+			      possible_inq_resp_len, (1+scsi_inq_timeout)*(HZ/2), 3);
 		SCSI_LOG_SCAN_BUS(3, printk(KERN_INFO "scsi scan: 2nd INQUIRY"
 				" %s with code 0x%x\n", sreq->sr_result ?
 				"failed" : "successful", sreq->sr_result));
@@ -628,10 +638,6 @@
 		spin_unlock_irqrestore(sdev->host->host_lock, flags);
 	}
 
-	/* if the device needs this changing, it may do so in the detect
-	 * function */
-	sdev->max_device_blocked = SCSI_DEFAULT_DEVICE_BLOCKED;
-
 	sdev->use_10_for_rw = 1;
 
 	if (*bflags & BLIST_MS_SKIP_PAGE_08)
@@ -863,7 +869,6 @@
 			return;
 }
 
-#ifdef CONFIG_SCSI_REPORT_LUNS
 /**
  * scsilun_to_int: convert a scsi_lun to an int
  * @scsilun:	struct scsi_lun to be converted.
@@ -924,9 +929,14 @@
 	u8 *data;
 
 	/*
-	 * Only support SCSI-3 and up devices.
-	 */
-	if (sdev->scsi_level < SCSI_3)
+	 * Only support SCSI-3 and up devices if BLIST_NOREPORTLUN is not set.
+	 * Also allow SCSI-2 if BLIST_REPORTLUN2 is set and host adapter does
+	 * support more than 8 LUNs.
+	 */
+	if ((bflags & BLIST_NOREPORTLUN) || 
+	     sdev->scsi_level < SCSI_2 ||
+	    (sdev->scsi_level < SCSI_3 && 
+	     (!(bflags & BLIST_REPORTLUN2) || sdev->host->max_lun <= 8)) )
 		return 1;
 	if (bflags & BLIST_NOLUN)
 		return 0;
@@ -1090,9 +1100,6 @@
 	printk(ALLOC_FAILURE_MSG, __FUNCTION__);
 	return 0;
 }
-#else
-# define scsi_report_lun_scan(sdev, blags, rescan)	(1)
-#endif	/* CONFIG_SCSI_REPORT_LUNS */
 
 struct scsi_device *scsi_add_device(struct Scsi_Host *shost,
 				    uint channel, uint id, uint lun)
diff -Nru a/drivers/scsi/scsiiom.c b/drivers/scsi/scsiiom.c
--- a/drivers/scsi/scsiiom.c	2004-05-26 15:01:35 -07:00
+++ b/drivers/scsi/scsiiom.c	2004-05-26 15:01:35 -07:00
@@ -15,7 +15,7 @@
 };
 
 
-UCHAR
+static UCHAR
 dc390_StartSCSI( PACB pACB, PDCB pDCB, PSRB pSRB )
 {
     UCHAR cmd; UCHAR  disc_allowed, try_sync_nego;
@@ -227,7 +227,7 @@
 #if DMA_INT
     UCHAR  dstatus;
 #endif
-    DC390_AFLAGS DC390_IFLAGS; //DC390_DFLAGS
+    DC390_IFLAGS;
 
     pACB = (PACB)dev_id;
     for (pACB2 = dc390_pACB_start; (pACB2 && pACB2 != pACB); pACB2 = pACB2->pNextACB);
@@ -237,26 +237,21 @@
 	return IRQ_NONE;
     }
     
-    //DC390_LOCK_DRV;
-
     sstatus = DC390_read8 (Scsi_Status);
     if( !(sstatus & INTERRUPT) )
-	{ /*DC390_UNLOCK_DRV;*/ return IRQ_NONE; };
+	return IRQ_NONE;
 
     DEBUG1(printk (KERN_DEBUG "sstatus=%02x,", sstatus));
 
 #if DMA_INT
     DC390_LOCK_IO(pACB->pScsiHost);
-    DC390_LOCK_ACB;
     dstatus = dc390_dma_intr (pACB);
-    DC390_UNLOCK_ACB;
     DC390_UNLOCK_IO(pACB->pScsiHost);
 
     DEBUG1(printk (KERN_DEBUG "dstatus=%02x,", dstatus));
     if (! (dstatus & SCSI_INTERRUPT))
       {
 	DEBUG0(printk (KERN_WARNING "DC390 Int w/o SCSI actions (only DMA?)\n"));
-	//DC390_UNLOCK_DRV;
 	return IRQ_NONE;
       };
 #else
@@ -266,8 +261,6 @@
 #endif
 
     DC390_LOCK_IO(pACB->pScsiHost);
-    DC390_LOCK_ACB;
-    //DC390_UNLOCK_DRV_NI; /* Allow _other_ CPUs to process IRQ (useful for shared IRQs) */
 
     istate = DC390_read8 (Intern_State);
     istatus = DC390_read8 (INT_Status); /* This clears Scsi_Status, Intern_State and INT_Status ! */
@@ -339,14 +332,11 @@
     }
 
  unlock:
-    //DC390_LOCK_DRV_NI;
-    DC390_UNLOCK_ACB;
     DC390_UNLOCK_IO(pACB->pScsiHost);
-    //DC390_UNLOCK_DRV; /* Restore initial flags */
     return IRQ_HANDLED;
 }
 
-irqreturn_t do_DC390_Interrupt( int irq, void *dev_id, struct pt_regs *regs)
+static irqreturn_t do_DC390_Interrupt( int irq, void *dev_id, struct pt_regs *regs)
 {
     irqreturn_t ret;
     DEBUG1(printk (KERN_INFO "DC390: Irq (%i) caught: ", irq));
@@ -356,7 +346,7 @@
     return ret;
 }
 
-void
+static void
 dc390_DataOut_0( PACB pACB, PSRB pSRB, PUCHAR psstatus)
 {
     UCHAR   sstatus;
@@ -410,7 +400,7 @@
     }	    
 }
 
-void
+static void
 dc390_DataIn_0( PACB pACB, PSRB pSRB, PUCHAR psstatus)
 {
     UCHAR   sstatus, residual, bval;
@@ -521,7 +511,7 @@
     {
 	    DC390_write8 (ScsiCmd, CLEAR_FIFO_CMD);
 	    DC390_write8 (DMA_Cmd, READ_DIRECTION+DMA_IDLE_CMD); /* | DMA_INT */
-    }	    
+    }
 }
 
 static void
@@ -740,9 +730,9 @@
 	psgl = pSRB->pSegmentList;
 	//dc390_pci_sync(pSRB);
 
-	while (pSRB->TotalXferredLen + (ULONG) psgl->length < pSRB->Saved_Ptr)
+	while (pSRB->TotalXferredLen + (ULONG) sg_dma_len(psgl) < pSRB->Saved_Ptr)
 	{
-	    pSRB->TotalXferredLen += (ULONG) psgl->length;
+	    pSRB->TotalXferredLen += (ULONG) sg_dma_len(psgl);
 	    pSRB->SGIndex++;
 	    if( pSRB->SGIndex < pSRB->SGcount )
 	    {
@@ -762,7 +752,7 @@
     } else if(pcmd->request_buffer) {
 	//dc390_pci_sync(pSRB);
 
-	pSRB->Segmentx.length = pcmd->request_bufflen - pSRB->Saved_Ptr;
+	sg_dma_len(&pSRB->Segmentx) = pcmd->request_bufflen - pSRB->Saved_Ptr;
 	pSRB->SGcount = 1;
 	pSRB->pSegmentList = (PSGL) &pSRB->Segmentx;
     } else {
@@ -873,7 +863,7 @@
 }
 
 
-void
+static void
 dc390_DataIO_Comm( PACB pACB, PSRB pSRB, UCHAR ioDir)
 {
     PSGL   psgl;
@@ -885,6 +875,8 @@
 	if (pDCB) printk (KERN_ERR "DC390: pSRB == pTmpSRB! (TagQ Error?) (%02i-%i)\n",
 			  pDCB->TargetID, pDCB->TargetLUN);
 	else printk (KERN_ERR "DC390: pSRB == pTmpSRB! (TagQ Error?) (DCB 0!)\n");
+
+	pSRB->pSRBDCB = pDCB;
 	dc390_EnableMsgOut_Abort (pACB, pSRB);
 	if (pDCB) pDCB->DCBFlag |= ABORT_DEV;
 	return;
@@ -1150,7 +1142,6 @@
 	    pSRB = psrb;
 	}
 	pDCB->pGoingSRB = 0;
-	dc390_Query_to_Waiting (pACB);
 	dc390_Waiting_process (pACB);
     }
     else
@@ -1466,7 +1457,7 @@
 		ptr2 = pSRB->pSegmentList;
 		for( i=pSRB->SGIndex; i < bval; i++)
 		{
-		    swlval += ptr2->length;
+		    swlval += sg_dma_len(ptr2);
 		    ptr2++;
 		}
 		REMOVABLEDEBUG(printk(KERN_INFO "XferredLen=%08x,NotXferLen=%08x\n",\
@@ -1619,20 +1610,15 @@
 	  pACB->scan_devices = 0;
      };
 
-#if LINUX_VERSION_CODE > KERNEL_VERSION(2,3,30)
     pcmd->resid = pcmd->request_bufflen - pSRB->TotalXferredLen;
-#endif
 
     if (!DCB_removed) dc390_Going_remove (pDCB, pSRB);
     /* Add to free list */
     dc390_Free_insert (pACB, pSRB);
 
     DEBUG0(printk (KERN_DEBUG "DC390: SRBdone: done pid %li\n", pcmd->pid));
-    DC390_UNLOCK_ACB_NI;
     pcmd->scsi_done (pcmd);
-    DC390_LOCK_ACB_NI;
 
-    dc390_Query_to_Waiting (pACB);
     dc390_Waiting_process (pACB);
     return;
 }
@@ -1668,9 +1654,7 @@
 /*	    ReleaseSRB( pDCB, pSRB ); */
 
 	    DEBUG0(printk (KERN_DEBUG "DC390: DoingSRB_Done: done pid %li\n", pcmd->pid));
-	    DC390_UNLOCK_ACB_NI;
 	    pcmd->scsi_done( pcmd );
-	    DC390_LOCK_ACB_NI;
 #endif	
 	    psrb  = psrb2;
 	}
@@ -1679,7 +1663,6 @@
 	pdcb->TagMask = 0;
 	pdcb = pdcb->pNextDCB;
     } while( pdcb != pDCB );
-    dc390_Query_to_Waiting (pACB);
 }
 
 
diff -Nru a/drivers/scsi/sg.c b/drivers/scsi/sg.c
--- a/drivers/scsi/sg.c	2004-05-26 15:01:36 -07:00
+++ b/drivers/scsi/sg.c	2004-05-26 15:01:36 -07:00
@@ -7,7 +7,7 @@
  * Original driver (sg.c):
  *        Copyright (C) 1992 Lawrence Foard
  * Version 2 and 3 extensions to driver:
- *        Copyright (C) 1998 - 2002 Douglas Gilbert
+ *        Copyright (C) 1998 - 2004 Douglas Gilbert
  *
  *  Modified  19-JAN-1998  Richard Gooch <rgooch@atnf.csiro.au>  Devfs support
  *
@@ -17,27 +17,18 @@
  * any later version.
  *
  */
-#include <linux/config.h>
-static int sg_version_num = 30530;	/* 2 digits for each component */
+
+static int sg_version_num = 30531;	/* 2 digits for each component */
+#define SG_VERSION_STR "3.5.31"
+
 /*
  *  D. P. Gilbert (dgilbert@interlog.com, dougg@triode.net.au), notes:
  *      - scsi logging is available via SCSI_LOG_TIMEOUT macros. First
  *        the kernel/module needs to be built with CONFIG_SCSI_LOGGING
  *        (otherwise the macros compile to empty statements).
- *        Then before running the program to be debugged enter:
- *          # echo "scsi log timeout 7" > /proc/scsi/scsi
- *        This will send copious output to the console and the log which
- *        is usually /var/log/messages. To turn off debugging enter:
- *          # echo "scsi log timeout 0" > /proc/scsi/scsi
- *        The 'timeout' token was chosen because it is relatively unused.
- *        The token 'hlcomplete' should be used but that triggers too
- *        much output from the sd device driver. To dump the current
- *        state of the SCSI mid level data structures enter:
- *          # echo "scsi dump 1" > /proc/scsi/scsi
- *        To dump the state of sg's data structures use:
- *          # cat /proc/scsi/sg/debug
  *
  */
+#include <linux/config.h>
 #include <linux/module.h>
 
 #include <linux/fs.h>
@@ -69,7 +60,7 @@
 
 #ifdef CONFIG_SCSI_PROC_FS
 #include <linux/proc_fs.h>
-static char *sg_version_str = "3.5.30 [20040124]";
+static char *sg_version_date = "20040513";
 
 static int sg_proc_init(void);
 static void sg_proc_cleanup(void);
@@ -110,7 +101,7 @@
 #define SG_SECTOR_SZ 512
 #define SG_SECTOR_MSK (SG_SECTOR_SZ - 1)
 
-#define SG_DEV_ARR_LUMP 6	/* amount to over allocate sg_dev_arr by */
+#define SG_DEV_ARR_LUMP 32	/* amount to over allocate sg_dev_arr by */
 
 static int sg_add(struct class_device *);
 static void sg_remove(struct class_device *);
@@ -1333,85 +1324,44 @@
 
 static int sg_sysfs_valid = 0;
 
-static int
-sg_add(struct class_device *cl_dev)
+static int sg_alloc(struct gendisk *disk, struct scsi_device *scsidp)
 {
-	struct scsi_device *scsidp = to_scsi_device(cl_dev->dev);
-	struct gendisk *disk;
-	Sg_device *sdp = NULL;
+	Sg_device *sdp;
 	unsigned long iflags;
-	struct cdev * cdev = NULL;
+	void *old_sg_dev_arr = NULL;
 	int k, error;
 
-	disk = alloc_disk(1);
-	if (!disk)
+	sdp = vmalloc(sizeof(Sg_device));
+	if (!sdp)
 		return -ENOMEM;
 
-	cdev = cdev_alloc();
-	if (! cdev)
-		return -ENOMEM;
 	write_lock_irqsave(&sg_dev_arr_lock, iflags);
-	if (sg_nr_dev >= sg_dev_max) {	/* try to resize */
+	if (unlikely(sg_nr_dev >= sg_dev_max)) {	/* try to resize */
 		Sg_device **tmp_da;
 		int tmp_dev_max = sg_nr_dev + SG_DEV_ARR_LUMP;
-
 		write_unlock_irqrestore(&sg_dev_arr_lock, iflags);
-		tmp_da = (Sg_device **)vmalloc(
-				tmp_dev_max * sizeof(Sg_device *));
-		if (NULL == tmp_da) {
-			printk(KERN_ERR
-			       "sg_add: device array cannot be resized\n");
-			error = -ENOMEM;
-			goto out;
-		}
+
+		tmp_da = vmalloc(tmp_dev_max * sizeof(Sg_device *));
+		if (unlikely(!tmp_da))
+			goto expand_failed;
+
 		write_lock_irqsave(&sg_dev_arr_lock, iflags);
-		memset(tmp_da, 0, tmp_dev_max * sizeof (Sg_device *));
-		memcpy(tmp_da, sg_dev_arr,
-		       sg_dev_max * sizeof (Sg_device *));
-		vfree((char *) sg_dev_arr);
+		memset(tmp_da, 0, tmp_dev_max * sizeof(Sg_device *));
+		memcpy(tmp_da, sg_dev_arr, sg_dev_max * sizeof(Sg_device *));
+		old_sg_dev_arr = sg_dev_arr;
 		sg_dev_arr = tmp_da;
 		sg_dev_max = tmp_dev_max;
 	}
 
-find_empty_slot:
 	for (k = 0; k < sg_dev_max; k++)
 		if (!sg_dev_arr[k])
 			break;
-	if (k >= SG_MAX_DEVS) {
-		write_unlock_irqrestore(&sg_dev_arr_lock, iflags);
-		printk(KERN_WARNING
-		       "Unable to attach sg device <%d, %d, %d, %d>"
-		       " type=%d, minor number exceeds %d\n",
-		       scsidp->host->host_no, scsidp->channel, scsidp->id,
-		       scsidp->lun, scsidp->type, SG_MAX_DEVS - 1);
-		if (NULL != sdp)
-			vfree((char *) sdp);
-		error = -ENODEV;
-		goto out;
-	}
-	if (k < sg_dev_max) {
-		if (NULL == sdp) {
-			write_unlock_irqrestore(&sg_dev_arr_lock, iflags);
-			sdp = (Sg_device *)vmalloc(sizeof(Sg_device));
-			write_lock_irqsave(&sg_dev_arr_lock, iflags);
-			if (!sg_dev_arr[k])
-				goto find_empty_slot;
-		}
-	} else
-		sdp = NULL;
-	if (NULL == sdp) {
-		write_unlock_irqrestore(&sg_dev_arr_lock, iflags);
-		printk(KERN_ERR "sg_add: Sg_device cannot be allocated\n");
-		error = -ENOMEM;
-		goto out;
-	}
+	if (unlikely(k >= SG_MAX_DEVS))
+		goto overflow;
 
-	SCSI_LOG_TIMEOUT(3, printk("sg_add: dev=%d \n", k));
 	memset(sdp, 0, sizeof(*sdp));
+	SCSI_LOG_TIMEOUT(3, printk("sg_alloc: dev=%d \n", k));
 	sprintf(disk->disk_name, "sg%d", k);
-	cdev->owner = THIS_MODULE;
-	cdev->ops = &sg_fops;
-	disk->major = SCSI_GENERIC_MAJOR;
 	disk->first_minor = k;
 	sdp->disk = disk;
 	sdp->device = scsidp;
@@ -1421,6 +1371,55 @@
 	sg_nr_dev++;
 	sg_dev_arr[k] = sdp;
 	write_unlock_irqrestore(&sg_dev_arr_lock, iflags);
+	error = k;
+
+ out:
+	if (error < 0)
+		vfree(sdp);
+	vfree(old_sg_dev_arr);
+	return error;
+
+ expand_failed:
+	printk(KERN_ERR "sg_alloc: device array cannot be resized\n");
+	error = -ENOMEM;
+	goto out;
+
+ overflow:
+	write_unlock_irqrestore(&sg_dev_arr_lock, iflags);
+	printk(KERN_WARNING
+	       "Unable to attach sg device <%d, %d, %d, %d> type=%d, minor "
+	       "number exceeds %d\n", scsidp->host->host_no, scsidp->channel,
+	       scsidp->id, scsidp->lun, scsidp->type, SG_MAX_DEVS - 1);
+	error = -ENODEV;
+	goto out;
+}
+
+static int
+sg_add(struct class_device *cl_dev)
+{
+	struct scsi_device *scsidp = to_scsi_device(cl_dev->dev);
+	struct gendisk *disk;
+	Sg_device *sdp = NULL;
+	struct cdev * cdev = NULL;
+	int error, k;
+
+	disk = alloc_disk(1);
+	if (!disk)
+		return -ENOMEM;
+	disk->major = SCSI_GENERIC_MAJOR;
+
+	error = -ENOMEM;
+	cdev = cdev_alloc();
+	if (!cdev)
+		goto out;
+	cdev->owner = THIS_MODULE;
+	cdev->ops = &sg_fops;
+
+	error = sg_alloc(disk, scsidp);
+	if (error < 0)
+		goto out;
+	k = error;
+	sdp = sg_dev_arr[k];
 
 	devfs_mk_cdev(MKDEV(SCSI_GENERIC_MAJOR, k),
 			S_IFCHR | S_IRUSR | S_IWUSR | S_IRGRP,
@@ -1543,6 +1542,7 @@
 MODULE_AUTHOR("Douglas Gilbert");
 MODULE_DESCRIPTION("SCSI generic (sg) driver");
 MODULE_LICENSE("GPL");
+MODULE_VERSION(SG_VERSION_STR);
 
 MODULE_PARM_DESC(def_reserved_size, "size of buffer reserved for each fd");
 MODULE_PARM_DESC(allow_dio, "allow direct I/O (default: 0 (disallow))");
@@ -2844,7 +2844,8 @@
 
 static int sg_proc_seq_show_version(struct seq_file *s, void *v)
 {
-	seq_printf(s, "%d\t%s\n", sg_version_num, sg_version_str);
+	seq_printf(s, "%d\t%s [%s]\n", sg_version_num, SG_VERSION_STR,
+		   sg_version_date);
 	return 0;
 }
 
diff -Nru a/drivers/scsi/st.c b/drivers/scsi/st.c
--- a/drivers/scsi/st.c	2004-05-26 15:01:36 -07:00
+++ b/drivers/scsi/st.c	2004-05-26 15:01:36 -07:00
@@ -486,7 +486,7 @@
 		   tape_name(STp), forward ? "forward" : "backward"));
 
 	SRpnt = st_do_scsi(NULL, STp, cmd, 0, SCSI_DATA_NONE,
-			   STp->timeout, MAX_RETRIES, TRUE);
+			   STp->device->timeout, MAX_RETRIES, TRUE);
 	if (!SRpnt)
 		return (STp->buffer)->syscall_result;
 
@@ -544,7 +544,7 @@
 		cmd[4] = blks;
 
 		SRpnt = st_do_scsi(NULL, STp, cmd, transfer, SCSI_DATA_WRITE,
-				   STp->timeout, MAX_WRITE_RETRIES, TRUE);
+				   STp->device->timeout, MAX_WRITE_RETRIES, TRUE);
 		if (!SRpnt)
 			return (STp->buffer)->syscall_result;
 
@@ -867,7 +867,7 @@
 		memset((void *) &cmd[0], 0, MAX_COMMAND_SIZE);
 		cmd[0] = READ_BLOCK_LIMITS;
 
-		SRpnt = st_do_scsi(SRpnt, STp, cmd, 6, SCSI_DATA_READ, STp->timeout,
+		SRpnt = st_do_scsi(SRpnt, STp, cmd, 6, SCSI_DATA_READ, STp->device->timeout,
 				   MAX_READY_RETRIES, TRUE);
 		if (!SRpnt) {
 			retval = (STp->buffer)->syscall_result;
@@ -894,7 +894,7 @@
 	cmd[0] = MODE_SENSE;
 	cmd[4] = 12;
 
-	SRpnt = st_do_scsi(SRpnt, STp, cmd, 12, SCSI_DATA_READ, STp->timeout,
+	SRpnt = st_do_scsi(SRpnt, STp, cmd, 12, SCSI_DATA_READ, STp->device->timeout,
 			   MAX_READY_RETRIES, TRUE);
 	if (!SRpnt) {
 		retval = (STp->buffer)->syscall_result;
@@ -1116,7 +1116,7 @@
 		cmd[4] = 1 + STp->two_fm;
 
 		SRpnt = st_do_scsi(NULL, STp, cmd, 0, SCSI_DATA_NONE,
-				   STp->timeout, MAX_WRITE_RETRIES, TRUE);
+				   STp->device->timeout, MAX_WRITE_RETRIES, TRUE);
 		if (!SRpnt) {
 			result = (STp->buffer)->syscall_result;
 			goto out;
@@ -1509,7 +1509,7 @@
 		cmd[4] = blks;
 
 		SRpnt = st_do_scsi(SRpnt, STp, cmd, transfer, SCSI_DATA_WRITE,
-				   STp->timeout, MAX_WRITE_RETRIES, !async_write);
+				   STp->device->timeout, MAX_WRITE_RETRIES, !async_write);
 		if (!SRpnt) {
 			retval = STbp->syscall_result;
 			goto out;
@@ -1679,7 +1679,7 @@
 
 	SRpnt = *aSRpnt;
 	SRpnt = st_do_scsi(SRpnt, STp, cmd, bytes, SCSI_DATA_READ,
-			   STp->timeout, MAX_RETRIES, TRUE);
+			   STp->device->timeout, MAX_RETRIES, TRUE);
 	release_buffering(STp);
 	*aSRpnt = SRpnt;
 	if (!SRpnt)
@@ -2081,7 +2081,7 @@
 			DEBC( printk(KERN_INFO "%s: Long timeout set to %d seconds.\n", name,
 			       (value & ~MT_ST_SET_LONG_TIMEOUT)));
 		} else {
-			STp->timeout = value * HZ;
+			STp->device->timeout = value * HZ;
 			DEBC( printk(KERN_INFO "%s: Normal timeout set to %d seconds.\n",
 				name, value) );
 		}
@@ -2189,7 +2189,7 @@
 	cmd[4] = 255;
 
 	SRpnt = st_do_scsi(SRpnt, STp, cmd, cmd[4], SCSI_DATA_READ,
-			   STp->timeout, 0, TRUE);
+			   STp->device->timeout, 0, TRUE);
 	if (SRpnt == NULL)
 		return (STp->buffer)->syscall_result;
 
@@ -2220,7 +2220,7 @@
 	(STp->buffer)->b_data[pgo + MP_OFF_PAGE_NBR] &= MP_MSK_PAGE_NBR;
 
 	SRpnt = st_do_scsi(SRpnt, STp, cmd, cmd[4], SCSI_DATA_WRITE,
-			   (slow ? STp->long_timeout : STp->timeout), 0, TRUE);
+			   (slow ? STp->long_timeout : STp->device->timeout), 0, TRUE);
 	if (SRpnt == NULL)
 		return (STp->buffer)->syscall_result;
 
@@ -2332,7 +2332,7 @@
 	}
 	if (STp->immediate) {
 		cmd[1] = 1;	/* Don't wait for completion */
-		timeout = STp->timeout;
+		timeout = STp->device->timeout;
 	}
 	else
 		timeout = STp->long_timeout;
@@ -2512,7 +2512,7 @@
 		cmd[2] = (arg >> 16);
 		cmd[3] = (arg >> 8);
 		cmd[4] = arg;
-		timeout = STp->timeout;
+		timeout = STp->device->timeout;
                 DEBC(
                      if (cmd_in == MTWEOF)
                                printk(ST_DEB_MSG "%s: Writing %d filemarks.\n", name,
@@ -2530,7 +2530,7 @@
 		cmd[0] = REZERO_UNIT;
 		if (STp->immediate) {
 			cmd[1] = 1;	/* Don't wait for completion */
-			timeout = STp->timeout;
+			timeout = STp->device->timeout;
 		}
                 DEBC(printk(ST_DEB_MSG "%s: Rewinding tape.\n", name));
 		fileno = blkno = at_sm = 0;
@@ -2543,7 +2543,7 @@
 		cmd[0] = START_STOP;
 		if (STp->immediate) {
 			cmd[1] = 1;	/* Don't wait for completion */
-			timeout = STp->timeout;
+			timeout = STp->device->timeout;
 		}
 		cmd[4] = 3;
                 DEBC(printk(ST_DEB_MSG "%s: Retensioning tape.\n", name));
@@ -2576,7 +2576,7 @@
 		cmd[1] = (arg ? 1 : 0);	/* Long erase with non-zero argument */
 		if (STp->immediate) {
 			cmd[1] |= 2;	/* Don't wait for completion */
-			timeout = STp->timeout;
+			timeout = STp->device->timeout;
 		}
 		else
 			timeout = STp->long_timeout * 8;
@@ -2628,7 +2628,7 @@
 		(STp->buffer)->b_data[9] = (ltmp >> 16);
 		(STp->buffer)->b_data[10] = (ltmp >> 8);
 		(STp->buffer)->b_data[11] = ltmp;
-		timeout = STp->timeout;
+		timeout = STp->device->timeout;
                 DEBC(
 			if (cmd_in == MTSETBLK || cmd_in == SET_DENS_AND_BLK)
 				printk(ST_DEB_MSG
@@ -2809,7 +2809,7 @@
 		if (!logical && !STp->scsi2_logical)
 			scmd[1] = 1;
 	}
-	SRpnt = st_do_scsi(NULL, STp, scmd, 20, SCSI_DATA_READ, STp->timeout,
+	SRpnt = st_do_scsi(NULL, STp, scmd, 20, SCSI_DATA_READ, STp->device->timeout,
 			   MAX_READY_RETRIES, TRUE);
 	if (!SRpnt)
 		return (STp->buffer)->syscall_result;
@@ -2911,7 +2911,7 @@
 	}
 	if (STp->immediate) {
 		scmd[1] |= 1;		/* Don't wait for completion */
-		timeout = STp->timeout;
+		timeout = STp->device->timeout;
 	}
 
 	SRpnt = st_do_scsi(NULL, STp, scmd, 0, SCSI_DATA_NONE,
@@ -3408,11 +3408,17 @@
 		goto out;
 	}
 	up(&STp->lock);
-	i = scsi_cmd_ioctl(STp->disk, cmd_in, arg);
-	if (i != -ENOTTY)
-		return i;
-	else
-		return scsi_ioctl(STp->device, cmd_in, (void *) arg);
+	switch (cmd_in) {
+		case SCSI_IOCTL_GET_IDLUN:
+		case SCSI_IOCTL_GET_BUS_NUMBER:
+			break;
+		default:
+			i = scsi_cmd_ioctl(STp->disk, cmd_in, arg);
+			if (i != -ENOTTY)
+				return i;
+			break;
+	}
+	return scsi_ioctl(STp->device, cmd_in, (void *) arg);
 
  out:
 	up(&STp->lock);
@@ -3832,7 +3838,7 @@
 	tpnt->partition = 0;
 	tpnt->new_partition = 0;
 	tpnt->nbr_partitions = 0;
-	tpnt->timeout = ST_TIMEOUT;
+	tpnt->device->timeout = ST_TIMEOUT;
 	tpnt->long_timeout = ST_LONG_TIMEOUT;
 	tpnt->try_dio = try_direct_io && !SDp->host->unchecked_isa_dma;
 
diff -Nru a/drivers/scsi/st.h b/drivers/scsi/st.h
--- a/drivers/scsi/st.h	2004-05-26 15:01:36 -07:00
+++ b/drivers/scsi/st.h	2004-05-26 15:01:36 -07:00
@@ -100,7 +100,6 @@
 	unsigned char c_algo;			/* compression algorithm */
 	unsigned char pos_unknown;			/* after reset position unknown */
 	int tape_type;
-	int timeout;		/* timeout for normal commands */
 	int long_timeout;	/* timeout for commands known to take long time */
 
 	unsigned long max_pfn;	/* the maximum page number reachable by the HBA */
diff -Nru a/drivers/scsi/tmscsim.c b/drivers/scsi/tmscsim.c
--- a/drivers/scsi/tmscsim.c	2004-05-26 15:01:36 -07:00
+++ b/drivers/scsi/tmscsim.c	2004-05-26 15:01:36 -07:00
@@ -168,6 +168,10 @@
  *	2.1a  03/11/29  GL, KG	Initial fixing for 2.6. Convert to	*
  *				use the current PCI-mapping API, update	*
  *				command-queuing.			*
+ *	2.1b  04/04/13  GL	Fix for 64-bit platforms		*
+ *	2.1b1 04/01/31	GL	(applied 05.04) Remove internal		*
+ *				command-queuing.			*
+ *	2.1b2 04/02/01	CH	(applied 05.04) Fix error-handling	*
  ***********************************************************************/
 
 /* Uncomment SA_INTERRUPT, if the driver refuses to share its IRQ with other devices */
@@ -260,16 +264,10 @@
  * undef  : traditional save_flags; cli; restore_flags;
  */
 
-#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,1,30)
-# include <linux/init.h>
-#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,3,30)
-# include <linux/spinlock.h>
-#else
-# include <asm/spinlock.h>
-#endif
-#endif
+#include <linux/init.h>
+#include <linux/spinlock.h>
 
-#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,3,99) && defined(MODULE)
+#if defined(MODULE)
 static struct pci_device_id tmscsim_pci_tbl[] = {
 	{
 		.vendor		= PCI_VENDOR_ID_AMD,
@@ -283,23 +281,10 @@
 #endif
 	
 #define USE_SPINLOCKS 1
-#define NEW_PCI 1
 
-#define DC390_AFLAGS 
 #define DC390_IFLAGS unsigned long iflags
-#define DC390_DFLAGS unsigned long dflags
-spinlock_t dc390_drvlock = SPIN_LOCK_UNLOCKED;
 #define DC390_LOCK_IO(dev) spin_lock_irqsave (((struct Scsi_Host *)dev)->host_lock, iflags)
 #define DC390_UNLOCK_IO(dev) spin_unlock_irqrestore (((struct Scsi_Host *)dev)->host_lock, iflags)
-#define DC390_LOCK_DRV spin_lock_irqsave (&dc390_drvlock, dflags)
-#define DC390_UNLOCK_DRV spin_unlock_irqrestore (&dc390_drvlock, dflags)
-#define DC390_LOCK_DRV_NI spin_lock (&dc390_drvlock)
-#define DC390_UNLOCK_DRV_NI spin_unlock (&dc390_drvlock)
-#define DC390_LOCK_ACB /* DC390_LOCK_IO */
-#define DC390_UNLOCK_ACB /* DC390_UNLOCK_IO */
-#define DC390_LOCK_ACB_NI /* spin_lock (&(pACB->lock)) */
-#define DC390_UNLOCK_ACB_NI /* spin_unlock (&(pACB->lock)) */
-#define DC390_LOCKA_INIT /* DC390_LOCKA_INIT */
 
 /* These macros are used for uniform access to 2.0.x and 2.1.x PCI config space*/
 
@@ -313,10 +298,7 @@
 #define PCI_READ_CONFIG_BYTE(pd, rv, bv) pci_read_config_byte (pd, rv, bv)
 #define PCI_WRITE_CONFIG_WORD(pd, rv, bv) pci_write_config_word (pd, rv, bv)
 #define PCI_READ_CONFIG_WORD(pd, rv, bv) pci_read_config_word (pd, rv, bv)
-#define PCI_BUS_DEV pdev->bus->number, pdev->devfn
 #define PCI_PRESENT (1)
-#define PCI_SET_MASTER pci_set_master (pdev)
-#define PCI_FIND_DEVICE(vend, id) (pdev = pci_find_device (vend, id, pdev))
 #define PCI_GET_IO_AND_IRQ do{io_port = pci_resource_start (pdev, 0); irq = pdev->irq;} while(0)
 
 #include "tmscsim.h"
@@ -325,46 +307,42 @@
 # define __init
 #endif
 
-UCHAR dc390_StartSCSI( PACB pACB, PDCB pDCB, PSRB pSRB );
-void dc390_DataOut_0( PACB pACB, PSRB pSRB, PUCHAR psstatus);
-void dc390_DataIn_0( PACB pACB, PSRB pSRB, PUCHAR psstatus);
+static UCHAR dc390_StartSCSI( PACB pACB, PDCB pDCB, PSRB pSRB );
+static void dc390_DataOut_0( PACB pACB, PSRB pSRB, PUCHAR psstatus);
+static void dc390_DataIn_0( PACB pACB, PSRB pSRB, PUCHAR psstatus);
 static void dc390_Command_0( PACB pACB, PSRB pSRB, PUCHAR psstatus);
 static void dc390_Status_0( PACB pACB, PSRB pSRB, PUCHAR psstatus);
 static void dc390_MsgOut_0( PACB pACB, PSRB pSRB, PUCHAR psstatus);
-void dc390_MsgIn_0( PACB pACB, PSRB pSRB, PUCHAR psstatus);
+static void dc390_MsgIn_0( PACB pACB, PSRB pSRB, PUCHAR psstatus);
 static void dc390_DataOutPhase( PACB pACB, PSRB pSRB, PUCHAR psstatus);
 static void dc390_DataInPhase( PACB pACB, PSRB pSRB, PUCHAR psstatus);
-void dc390_CommandPhase( PACB pACB, PSRB pSRB, PUCHAR psstatus);
+static void dc390_CommandPhase( PACB pACB, PSRB pSRB, PUCHAR psstatus);
 static void dc390_StatusPhase( PACB pACB, PSRB pSRB, PUCHAR psstatus);
-void dc390_MsgOutPhase( PACB pACB, PSRB pSRB, PUCHAR psstatus);
+static void dc390_MsgOutPhase( PACB pACB, PSRB pSRB, PUCHAR psstatus);
 static void dc390_MsgInPhase( PACB pACB, PSRB pSRB, PUCHAR psstatus);
 static void dc390_Nop_0( PACB pACB, PSRB pSRB, PUCHAR psstatus);
 static void dc390_Nop_1( PACB pACB, PSRB pSRB, PUCHAR psstatus);
 
 static void dc390_SetXferRate( PACB pACB, PDCB pDCB );
-void dc390_Disconnect( PACB pACB );
-void dc390_Reselect( PACB pACB );
-void dc390_SRBdone( PACB pACB, PDCB pDCB, PSRB pSRB );
-void dc390_DoingSRB_Done( PACB pACB, PSCSICMD cmd );
+static void dc390_Disconnect( PACB pACB );
+static void dc390_Reselect( PACB pACB );
+static void dc390_SRBdone( PACB pACB, PDCB pDCB, PSRB pSRB );
+static void dc390_DoingSRB_Done( PACB pACB, PSCSICMD cmd );
 static void dc390_ScsiRstDetect( PACB pACB );
 static void dc390_ResetSCSIBus( PACB pACB );
 static void __inline__ dc390_RequestSense( PACB pACB, PDCB pDCB, PSRB pSRB );
 static void __inline__ dc390_InvalidCmd( PACB pACB );
 static void __inline__ dc390_EnableMsgOut_Abort (PACB, PSRB);
 static void dc390_remove_dev (PACB pACB, PDCB pDCB);
-irqreturn_t do_DC390_Interrupt( int, void *, struct pt_regs *);
+static irqreturn_t do_DC390_Interrupt( int, void *, struct pt_regs *);
 
-int    dc390_initAdapter( PSH psh, ULONG io_port, UCHAR Irq, UCHAR index );
-void   dc390_initDCB( PACB pACB, PDCB *ppDCB, UCHAR id, UCHAR lun);
-void   dc390_updateDCB (PACB pACB, PDCB pDCB);
+static int    dc390_initAdapter( PSH psh, ULONG io_port, UCHAR Irq, UCHAR index );
+static void   dc390_initDCB( PACB pACB, PDCB *ppDCB, UCHAR id, UCHAR lun);
+static void   dc390_updateDCB (PACB pACB, PDCB pDCB);
 
 static int DC390_release(struct Scsi_Host *host);
 static int dc390_shutdown (struct Scsi_Host *host);
 
-
-//static PSHT	dc390_pSHT_start = NULL;
-//static PSH	dc390_pSH_start = NULL;
-//static PSH	dc390_pSH_current = NULL;
 static PACB	dc390_pACB_start= NULL;
 static PACB	dc390_pACB_current = NULL;
 static ULONG	dc390_lastabortedpid = 0;
@@ -372,14 +350,11 @@
 static UCHAR	dc390_adapterCnt = 0;
 
 /* Startup values, to be overriden on the commandline */
-int tmscsim[] = {-2, -2, -2, -2, -2, -2};
+static int tmscsim[] = {-2, -2, -2, -2, -2, -2};
 
-# if defined(MODULE) && LINUX_VERSION_CODE >= KERNEL_VERSION(2,1,30)
+#if defined(MODULE)
 MODULE_PARM(tmscsim, "1-6i");
 MODULE_PARM_DESC(tmscsim, "Host SCSI ID, Speed (0=10MHz), Device Flags, Adapter Flags, Max Tags (log2(tags)-1), DelayReset (s)");
-# endif
-
-#if defined(MODULE) && LINUX_VERSION_CODE >= KERNEL_VERSION(2,1,30)
 MODULE_AUTHOR("C.L. Huang / Kurt Garloff");
 MODULE_DESCRIPTION("SCSI host adapter driver for Tekram DC390 and other AMD53C974A based PCI SCSI adapters");
 MODULE_LICENSE("GPL");
@@ -438,22 +413,15 @@
 #endif   
 
 /* Devices erroneously pretending to be able to do TagQ */
-UCHAR  dc390_baddevname1[2][28] ={
+static UCHAR  dc390_baddevname1[2][28] ={
        "SEAGATE ST3390N         9546",
        "HP      C3323-300       4269"};
 #define BADDEVCNT	2
 
 static char*  dc390_adapname = "DC390";
-UCHAR  dc390_eepromBuf[MAX_ADAPTER_NUM][EE_LEN];
-UCHAR  dc390_clock_period1[] = {4, 5, 6, 7, 8, 10, 13, 20};
-UCHAR  dc390_clock_speed[] = {100,80,67,57,50, 40, 31, 20};
-
-#if LINUX_VERSION_CODE < KERNEL_VERSION(2,3,30)
-struct proc_dir_entry	DC390_proc_scsi_tmscsim ={
-       PROC_SCSI_DC390T, 7 ,"tmscsim",
-       S_IFDIR | S_IRUGO | S_IXUGO, 2
-       };
-#endif
+static UCHAR  dc390_eepromBuf[MAX_ADAPTER_NUM][EE_LEN];
+static UCHAR  dc390_clock_period1[] = {4, 5, 6, 7, 8, 10, 13, 20};
+static UCHAR  dc390_clock_speed[] = {100,80,67,57,50, 40, 31, 20};
 
 /***********************************************************************
  * Functions for access to DC390 EEPROM
@@ -518,7 +486,7 @@
 }
 
 
-int __initdata tmscsim_def[] = {7, 0 /* 10MHz */,
+static int __initdata tmscsim_def[] = {7, 0 /* 10MHz */,
 		PARITY_CHK_ | SEND_START_ | EN_DISCONNECT_
 		| SYNC_NEGO_ | TAG_QUEUEING_,
 		MORE2_DRV | GREATER_1G | RST_SCSI_BUS | ACTIVE_NEGATION
@@ -549,8 +517,7 @@
 /* Override defaults on cmdline:
  * tmscsim: AdaptID, MaxSpeed (Index), DevMode (Bitmapped), AdaptMode (Bitmapped)
  */
-#if LINUX_VERSION_CODE > KERNEL_VERSION(2,3,13)
-int __init dc390_setup (char *str)
+static int __init dc390_setup (char *str)
 {	
 	int ints[8];
 	int i, im;
@@ -570,24 +537,6 @@
 __setup("tmscsim=", dc390_setup);
 #endif
 
-#else
-void __init dc390_setup (char *str, int *ints)
-{
-	int i, im;
-	im = ints[0];
-	if (im > 6)
-	{
-		printk (KERN_NOTICE "DC390: ignore extra params!\n");
-		im = 6;
-	}
-	for (i = 0; i < im; i++)
-		tmscsim[i] = ints[i+1];
-	/* dc390_checkparams (); */
-}
-#endif
-
-
-
 static void __init dc390_EEpromOutDI( PDEVDECL, PUCHAR regval, UCHAR Carry )
 {
     UCHAR bval;
@@ -751,37 +700,6 @@
     return q;
 }
 #endif
-    
-
-/* Append to Query List */
-static void dc390_Query_append( PSCSICMD cmd, PACB pACB )
-{
-	dc390_cmd_scp_t *cmdq = (dc390_cmd_scp_t *)&cmd->SCp;
-
-	DEBUG0(printk ("DC390: Append cmd %li to Query\n", cmd->pid));
-
-	list_add_tail(&cmdq->list, &pACB->cmdq);
-	pACB->QueryCnt++;
-	pACB->CmdOutOfSRB++;
-}
-
-
-/* Return next cmd from Query list */
-static PSCSICMD dc390_Query_get ( PACB pACB )
-{
-	PSCSICMD  pcmd;
-	dc390_cmd_scp_t *cmdq;
-	if (list_empty(&pACB->cmdq))
-		return NULL;
-
-	pcmd = (PSCSICMD) list_entry(pACB->cmdq.next, struct scsi_cmnd_list, scp.list);
-	DEBUG0(printk ("DC390: Get cmd %li from Query\n", pcmd->pid));
-	cmdq = (dc390_cmd_scp_t *)&pcmd->SCp;
-	list_del(&cmdq->list);
-	pACB->QueryCnt--;
-	return pcmd;
-}
-
 
 /* Return next free SRB */
 static __inline__ PSRB dc390_Free_get ( PACB pACB )
@@ -891,17 +809,7 @@
 	dc390_Going_append (pDCB, pSRB);
 }
 
-/* 2.0 timer compatibility */
-#if LINUX_VERSION_CODE < KERNEL_VERSION(2,1,30)
- static inline int timer_pending(struct timer_list * timer)
- {
-	return timer->prev != NULL;
- }
- #define time_after(a,b)         ((long)(b) - (long)(a) < 0)
- #define time_before(a,b)        time_after(b,a)
-#endif
-
-void DC390_waiting_timed_out (unsigned long ptr);
+static void DC390_waiting_timed_out (unsigned long ptr);
 /* Sets the timer to wake us up */
 static void dc390_waiting_timer (PACB pACB, unsigned long to)
 {
@@ -954,16 +862,13 @@
 }
 
 /* Wake up waiting queue */
-void DC390_waiting_timed_out (unsigned long ptr)
+static void DC390_waiting_timed_out (unsigned long ptr)
 {
 	PACB pACB = (PACB)ptr;
 	DC390_IFLAGS;
-	DC390_AFLAGS;
 	DEBUG0(printk ("DC390: Debug: Waiting queue woken up by timer!\n"));
 	DC390_LOCK_IO(pACB->pScsiHost);
-	DC390_LOCK_ACB;
 	dc390_Waiting_process (pACB);
-	DC390_UNLOCK_ACB;
 	DC390_UNLOCK_IO(pACB->pScsiHost);
 }
 
@@ -1022,7 +927,7 @@
 			pci_map_page(pdev, virt_to_page(pcmd->sense_buffer),
 				     (unsigned long)pcmd->sense_buffer & ~PAGE_MASK, sizeof(pcmd->sense_buffer),
 				     DMA_FROM_DEVICE);
-		pSRB->Segmentx.length = sizeof(pcmd->sense_buffer);
+		sg_dma_len(&pSRB->Segmentx) = sizeof(pcmd->sense_buffer);
 		pSRB->SGcount = 1;
 		pSRB->pSegmentList = (PSGL) &pSRB->Segmentx;
 		DEBUG1(printk("%s(): Mapped sense buffer %p at %x\n", __FUNCTION__, pcmd->sense_buffer, cmdp->saved_dma_handle));
@@ -1043,7 +948,7 @@
 				     (unsigned long)pcmd->request_buffer & ~PAGE_MASK,
 				     pcmd->request_bufflen, scsi_to_pci_dma_dir(pcmd->sc_data_direction));
 		/* TODO: error handling */
-		pSRB->Segmentx.length = pcmd->request_bufflen;
+		sg_dma_len(&pSRB->Segmentx) = pcmd->request_bufflen;
 		pSRB->SGcount = 1;
 		pSRB->pSegmentList = (PSGL) &pSRB->Segmentx;
 		DEBUG1(printk("%s(): Mapped request buffer %p at %x\n", __FUNCTION__, pcmd->request_buffer, cmdp->saved_dma_handle));
@@ -1113,37 +1018,6 @@
     /* KG: deferred PCI mapping to dc390_StartSCSI */
 }
 
-/* Put cmnd from Query to Waiting list and send next Waiting cmnd */
-static void dc390_Query_to_Waiting (PACB pACB)
-{
-    Scsi_Cmnd *pcmd;
-    PSRB   pSRB;
-    PDCB   pDCB;
-
-    if( pACB->ACBFlag & (RESET_DETECT+RESET_DONE+RESET_DEV) )
-	return;
-
-    while (pACB->QueryCnt)
-    {
-	pSRB = dc390_Free_get ( pACB );
-	if (!pSRB) return;
-	pcmd = dc390_Query_get ( pACB );
-	if (!pcmd) { dc390_Free_insert (pACB, pSRB); return; } /* should not happen */
-	pDCB = dc390_findDCB (pACB, pcmd->device->id, pcmd->device->lun);
-	if (!pDCB) 
-	{ 
-		dc390_Free_insert (pACB, pSRB);
-		printk (KERN_ERR "DC390: Command in queue to non-existing device!\n");
-		pcmd->result = MK_RES(DRIVER_ERROR,DID_ERROR,0,0);
-		DC390_UNLOCK_ACB_NI;
-		pcmd->done (pcmd);
-		DC390_LOCK_ACB_NI;
-	}
-	dc390_BuildSRB (pcmd, pDCB, pSRB);
-	dc390_Waiting_append ( pDCB, pSRB );
-    }
-}
-
 /***********************************************************************
  * Function : static int DC390_queue_command (Scsi_Cmnd *cmd,
  *					       void (*done)(Scsi_Cmnd *))
@@ -1163,24 +1037,17 @@
  *
  ***********************************************************************/
 
-int DC390_queue_command (Scsi_Cmnd *cmd, void (* done)(Scsi_Cmnd *))
+static int DC390_queue_command (Scsi_Cmnd *cmd, void (* done)(Scsi_Cmnd *))
 {
     PDCB   pDCB;
     PSRB   pSRB;
     PACB   pACB = (PACB) cmd->device->host->hostdata;
-    DC390_AFLAGS;
-
 
     DEBUG0(/*  if(pACB->scan_devices) */	\
 	printk(KERN_INFO "DC390: Queue Cmd=%02x,Tgt=%d,LUN=%d (pid=%li), buffer=%p\n",\
 	       cmd->cmnd[0],cmd->device->id,cmd->device->lun,cmd->pid, cmd->buffer));
 
-    DC390_LOCK_ACB;
-    
-    /* Assume BAD_TARGET; will be cleared later */
-    cmd->result = DID_BAD_TARGET << 16;
-   
-    /* TODO: Change the policy: Alway accept TEST_UNIT_READY or INQUIRY 
+    /* TODO: Change the policy: Always accept TEST_UNIT_READY or INQUIRY 
      * commands and alloc a DCB for the device if not yet there. DCB will
      * be removed in dc390_SRBdone if SEL_TIMEOUT */
 
@@ -1190,17 +1057,6 @@
     else if( (pACB->scan_devices) && (cmd->cmnd[0] == READ_6) )
 	pACB->scan_devices = 0;
 
-    if ( ( cmd->device->id >= pACB->pScsiHost->max_id ) || 
-	 (cmd->device->lun >= pACB->pScsiHost->max_lun) )
-    {
-/*	printk ("DC390: Ignore target %d lun %d\n",
-		cmd->device->id, cmd->device->lun); */
-	DC390_UNLOCK_ACB;
-	//return (1);
-	done (cmd);
-	return (0);
-    }
-
     if( (pACB->scan_devices || cmd->cmnd[0] == TEST_UNIT_READY || cmd->cmnd[0] == INQUIRY) && 
        !(pACB->DCBmap[cmd->device->id] & (1 << cmd->device->lun)) )
     {
@@ -1211,14 +1067,7 @@
 	  {
 	    printk (KERN_ERR "DC390: kmalloc for DCB failed, target %02x lun %02x\n", 
 		    cmd->device->id, cmd->device->lun);
-	    DC390_UNLOCK_ACB;
-	    printk ("DC390: No DCB in queue_command!\n");
-#ifdef USE_NEW_EH
-	    return (1);
-#else
-	    done (cmd);
-	    return (0);
-#endif
+	    goto fail;
 	  }
             
     }
@@ -1226,10 +1075,7 @@
     {
 	printk(KERN_INFO "DC390: Ignore target %02x lun %02x\n",
 		cmd->device->id, cmd->device->lun); 
-	DC390_UNLOCK_ACB;
-	//return (1);
-	done (cmd);
-	return (0);
+	goto fail;
     }
     else
     {
@@ -1238,60 +1084,34 @@
 	 {  /* should never happen */
 	    printk (KERN_ERR "DC390: no DCB failed, target %02x lun %02x\n", 
 		    cmd->device->id, cmd->device->lun);
-	    DC390_UNLOCK_ACB;
-	    printk ("DC390: No DCB in queuecommand (2)!\n");
-#ifdef USE_NEW_EH
-	    return (1);
-#else
-	    done (cmd);
-	    return (0);
-#endif
+	    goto fail;
 	 }
     }
 
     pACB->Cmds++;
     cmd->scsi_done = done;
     cmd->result = 0;
-	
-    dc390_Query_to_Waiting (pACB);
 
-    if( pACB->QueryCnt ) /* Unsent commands ? */
-    {
-	DEBUG0(printk ("DC390: QueryCnt != 0\n"));
-	dc390_Query_append ( cmd, pACB );
-	dc390_Waiting_process (pACB);
-    }
-    else if (pDCB->pWaitingSRB)
-    {
- 	pSRB = dc390_Free_get ( pACB );
-	DEBUG0(if (!pSRB) printk ("DC390: No free SRB but Waiting\n"); else printk ("DC390: Free SRB w/ Waiting\n"));
-	if (!pSRB) dc390_Query_append (cmd, pACB);
-	else 
-	  {
-	    dc390_BuildSRB (cmd, pDCB, pSRB);
-	    dc390_Waiting_append (pDCB, pSRB);
-	  }
-	dc390_Waiting_process (pACB);
-    }
-    else
-    {
- 	pSRB = dc390_Free_get ( pACB );
-	DEBUG0(if (!pSRB) printk ("DC390: No free SRB w/o Waiting\n"); else printk ("DC390: Free SRB w/o Waiting\n"));
-	if (!pSRB)
-	{
-	    dc390_Query_append (cmd, pACB);
-	    dc390_Waiting_process (pACB);
-	}
-	else 
-	{
-	    dc390_BuildSRB (cmd, pDCB, pSRB);
-	    dc390_SendSRB (pACB, pSRB);
-	}
-    }
+    pSRB = dc390_Free_get(pACB);
+    if (!pSRB)
+	    goto requeue;
+
+    dc390_BuildSRB(cmd, pDCB, pSRB);
+    if (pDCB->pWaitingSRB) {
+	    dc390_Waiting_append(pDCB, pSRB);
+	    dc390_Waiting_process(pACB);
+    } else
+	    dc390_SendSRB(pACB, pSRB);
 
-    DC390_UNLOCK_ACB;
     DEBUG1(printk (KERN_DEBUG " ... command (pid %li) queued successfully.\n", cmd->pid));
     return(0);
+
+ requeue:
+    return 1;
+ fail:
+    cmd->result = DID_BAD_TARGET << 16;
+    done(cmd);
+    return 0;
 }
 
 /* We ignore mapping problems, as we expect everybody to respect 
@@ -1384,8 +1204,8 @@
  * Note:
  *   In contrary to other externally callable funcs (DC390_), we don't lock
  ***********************************************************************/
-int DC390_bios_param (struct scsi_device *sdev, struct block_device *bdev,
-		sector_t capacity, int geom[])
+static int DC390_bios_param (struct scsi_device *sdev, struct block_device *bdev,
+			     sector_t capacity, int geom[])
 {
     int heads, sectors, cylinders;
     PACB pACB = (PACB) sdev->host->hostdata;
@@ -1421,15 +1241,14 @@
     return (0);
 }
 #else
-int DC390_bios_param (struct scsi_device *sdev, struct block_device *bdev,
-		sector_t capacity, int geom[])
+static int DC390_bios_param (struct scsi_device *sdev, struct block_device *bdev,
+			     sector_t capacity, int geom[])
 {
     return scsicam_bios_param (bdev, capacity, geom);
 }
 #endif
 
-
-void dc390_dumpinfo (PACB pACB, PDCB pDCB, PSRB pSRB)
+static void dc390_dumpinfo (PACB pACB, PDCB pDCB, PSRB pSRB)
 {
     USHORT pstat; PDEVDECL1;
     if (!pDCB) pDCB = pACB->pActiveDCB;
@@ -1483,7 +1302,7 @@
  * Status: Buggy !
  ***********************************************************************/
 
-int DC390_abort (Scsi_Cmnd *cmd)
+static int DC390_abort (Scsi_Cmnd *cmd)
 {
     PDCB  pDCB;
     PSRB  pSRB, psrb;
@@ -1491,28 +1310,10 @@
     int   status;
     //ULONG sbac;
     PACB  pACB = (PACB) cmd->device->host->hostdata;
-    DC390_AFLAGS;
-
-    DC390_LOCK_ACB;
 
     printk ("DC390: Abort command (pid %li, Device %02i-%02i)\n",
 	    cmd->pid, cmd->device->id, cmd->device->lun);
 
-    /* First scan Query list */
-    if( pACB->QueryCnt )
-    {
-	struct scsi_cmnd_list *t, *pcmd_l;
-	list_for_each_entry_safe(pcmd_l, t, &pACB->cmdq, scp.list)
-		if( (struct scsi_cmnd*)pcmd_l == cmd )
-		{
-			/* Found: Dequeue */
-			list_del(&pcmd_l->scp.list);
-			pACB->QueryCnt--;
-			status = SCSI_ABORT_SUCCESS;
-			goto  ABO_X;
-		}
-    }
-	
     pDCB = dc390_findDCB (pACB, cmd->device->id, cmd->device->lun);
     if( !pDCB ) goto  NOT_RUN;
 
@@ -1625,7 +1426,6 @@
     }
 #endif
     dc390_lastabortedpid = cmd->pid;
-    DC390_UNLOCK_ACB;
     //do_DC390_Interrupt (pACB->IRQLevel, 0, 0);
 #ifndef USE_NEW_EH	
     if (status == SCSI_ABORT_SUCCESS) cmd->scsi_done(cmd);
@@ -1708,15 +1508,13 @@
  * Returns : 0 on success.
  ***********************************************************************/
 
-int DC390_reset (Scsi_Cmnd *cmd)
+static int DC390_reset (Scsi_Cmnd *cmd)
 {
     UCHAR   bval;
     PACB    pACB = (PACB) cmd->device->host->hostdata;
-    DC390_AFLAGS;
 
     printk(KERN_INFO "DC390: RESET ... ");
 
-    DC390_LOCK_ACB;
     if (timer_pending (&pACB->Waiting_Timer)) del_timer (&pACB->Waiting_Timer);
     bval = DC390_read8 (CtrlReg1);
     bval |= DIS_INT_ON_SCSI_RST;
@@ -1745,7 +1543,6 @@
     dc390_Waiting_process( pACB );
 
     printk("done\n");
-    DC390_UNLOCK_ACB;
     return( SCSI_RESET_SUCCESS );
 }
 
@@ -1760,14 +1557,14 @@
  * Inputs : SCSI id and lun
  ***********************************************************************/
 
-void dc390_initDCB( PACB pACB, PDCB *ppDCB, UCHAR id, UCHAR lun )
+static void dc390_initDCB( PACB pACB, PDCB *ppDCB, UCHAR id, UCHAR lun )
 {
     PEEprom	prom;
     UCHAR	index;
     PDCB pDCB, pDCB2;
 
     pDCB = kmalloc (sizeof(DC390_DCB), GFP_ATOMIC);
-    DCBDEBUG(printk (KERN_INFO "DC390: alloc mem for DCB (ID %i, LUN %i): %p\n"	\
+    DCBDEBUG(printk (KERN_INFO "DC390: alloc mem for DCB (ID %i, LUN %i): %p\n",	\
 		     id, lun, pDCB));
  
     *ppDCB = pDCB;
@@ -1845,7 +1642,7 @@
  * Purpose :  Set the configuration dependent DCB parameters
  ***********************************************************************/
 
-void dc390_updateDCB (PACB pACB, PDCB pDCB)
+static void dc390_updateDCB (PACB pACB, PDCB pDCB)
 {
   pDCB->SyncMode &= EN_TAG_QUEUEING | SYNC_NEGO_DONE /*| EN_ATN_STOP*/;
   if (pDCB->DevMode & TAG_QUEUEING_) {
@@ -1869,25 +1666,6 @@
 	pDCB->CtrlR1 |= PARITY_ERR_REPO;
 }  
 
-
-/***********************************************************************
- * Function : static void dc390_updateDCBs ()
- *
- * Purpose :  Set the configuration dependent DCB params for all DCBs
- ***********************************************************************/
-
-static void dc390_updateDCBs (PACB pACB)
-{
-  int i;
-  PDCB pDCB = pACB->pLinkDCB;
-  for (i = 0; i < pACB->DCBCnt; i++)
-    {
-      dc390_updateDCB (pACB, pDCB);
-      pDCB = pDCB->pNextDCB;
-    }
-}
-  
-
 /***********************************************************************
  * Function : static void dc390_initSRB()
  *
@@ -1902,7 +1680,7 @@
 }
 
 
-void dc390_linkSRB( PACB pACB )
+static void dc390_linkSRB( PACB pACB )
 {
     UINT   count, i;
 
@@ -1927,11 +1705,10 @@
  *	    io_port, Irq, index: Resources and adapter index
  ***********************************************************************/
 
-void __init dc390_initACB (PSH psh, ULONG io_port, UCHAR Irq, UCHAR index)
+static void __init dc390_initACB (PSH psh, ULONG io_port, UCHAR Irq, UCHAR index)
 {
     PACB    pACB;
     UCHAR   i;
-    DC390_AFLAGS;
 
     psh->can_queue = MAX_CMD_QUEUE;
     psh->cmd_per_lun = MAX_CMD_PER_LUN;
@@ -1939,11 +1716,7 @@
     psh->io_port = io_port;
     psh->n_io_port = 0x80;
     psh->irq = Irq;
-#if LINUX_VERSION_CODE > KERNEL_VERSION(2,3,50)
     psh->base = io_port;
-#else
-    psh->base = (char*)io_port;
-#endif	
     psh->unique_id = io_port;
     psh->dma_channel = -1;
     psh->last_reset = jiffies;
@@ -1970,8 +1743,6 @@
     pACB->pActiveDCB = NULL;
     pACB->pFreeSRB = pACB->SRB_array;
     pACB->SRBCount = MAX_SRB_CNT;
-    pACB->QueryCnt = 0;
-    INIT_LIST_HEAD(&pACB->cmdq);
     pACB->AdapterIndex = index;
     pACB->status = 0;
     psh->this_id = dc390_eepromBuf[index][EE_ADAPT_SCSI_ID];
@@ -2007,7 +1778,7 @@
  * Outputs: 0 on success, -1 on error
  ***********************************************************************/
 
-int __init dc390_initAdapter (PSH psh, ULONG io_port, UCHAR Irq, UCHAR index)
+static int __init dc390_initAdapter (PSH psh, ULONG io_port, UCHAR Irq, UCHAR index)
 {
     PACB   pACB, pACB2;
     UCHAR  dstate;
@@ -2086,7 +1857,7 @@
  * Inputs : host - pointer to this host adapter's structure
  *	    io_port - IO ports mapped to this adapter
  *	    Irq - IRQ assigned to this adpater
- *	    PDEVDECL - PCI access handle
+ *	    struct pci_dev - PCI access handle
  *	    index - Adapter index
  *
  * Outputs: 0 on success, -1 on error
@@ -2095,12 +1866,11 @@
  *	not in DC390_detect, called from outside 
  ***********************************************************************/
 
-static int __init DC390_init (PSHT psht, ULONG io_port, UCHAR Irq, PDEVDECL, UCHAR index)
+static int __init DC390_init (PSHT psht, ULONG io_port, UCHAR Irq, struct pci_dev *pdev, UCHAR index)
 {
     PSH   psh;
     PACB  pACB;
-    DC390_AFLAGS;
-    
+
     if (dc390_CheckEEpromCheckSum (PDEV, index))
     {
 	int speed;
@@ -2126,21 +1896,6 @@
 	
     scsi_set_device(psh, &pdev->dev);
     pACB = (PACB) psh->hostdata;
-    DC390_LOCKA_INIT;
-    DC390_LOCK_ACB;
-
-#if 0
-    if( !dc390_pSH_start )
-    {
-        dc390_pSH_start = psh;
-        dc390_pSH_current = psh;
-    }
-    else
-    {
-        dc390_pSH_current->next = psh;
-        dc390_pSH_current = psh;
-    }
-#endif
 
     DEBUG0(printk(KERN_INFO "DC390: pSH = %8x, Index %02i\n", (UINT) psh, index));
 
@@ -2154,59 +1909,15 @@
 		      (UINT) pACB, (UINT) pACB->DCBmap, (UINT) pACB->SRB_array));
 	DEBUG0(printk("DC390: ACB size= %4x, DCB size= %4x, SRB size= %4x\n",\
 		      sizeof(DC390_ACB), sizeof(DC390_DCB), sizeof(DC390_SRB) ));
-
-	DC390_UNLOCK_ACB;
         return (0);
     }
     else
     {
-	//dc390_pSH_start = NULL;
 	scsi_unregister( psh );
-	DC390_UNLOCK_ACB;
 	return( -1 );
     }
 }
 
-
-/***********************************************************************
- * Function : int DC390_detect(Scsi_Host_Template *psht)
- *
- * Purpose : detects and initializes AMD53C974 SCSI chips
- *	     that were autoprobed, overridden on the LILO command line,
- *	     or specified at compile time.
- *
- * Inputs : psht - template for this SCSI adapter
- *
- * Returns : number of host adapters detected
- *
- ***********************************************************************/
-
-#ifndef NEW_PCI
-/* Acc. to PCI 2.1 spec it's up to the driver to enable Bus mastering:
- * We use pci_set_master () for 2.1.x and this func for 2.0.x:	*/
-static void __init dc390_set_master (PDEVDECL)
-{
-	USHORT cmd;
-	UCHAR lat;
-	
-	PCI_READ_CONFIG_WORD (PDEV, PCI_COMMAND, &cmd);
-	
-        if (! (cmd & PCI_COMMAND_MASTER)) {	
-		printk("PCI: Enabling bus mastering for device %02x:%02x\n",
-		       PCI_BUS_DEV);
-		cmd |= PCI_COMMAND_MASTER;
-		PCI_WRITE_CONFIG_WORD(PDEV, PCI_COMMAND, cmd);
-	}
-	PCI_READ_CONFIG_BYTE (PDEV, PCI_LATENCY_TIMER, &lat);
-	if (lat < 16 /* || lat == 255 */) {
-		printk("PCI: Setting latency timer of device %02x:%02x from %i to 64\n",
-		       PCI_BUS_DEV, lat);
-		PCI_WRITE_CONFIG_BYTE(PDEV, PCI_LATENCY_TIMER, 64);
-	}
-	
-}
-#endif /* ! NEW_PCI */
-
 static void __init dc390_set_pci_cfg (PDEVDECL)
 {
 	USHORT cmd;
@@ -2215,30 +1926,31 @@
 	PCI_WRITE_CONFIG_WORD (PDEV, PCI_COMMAND, cmd);
 	PCI_WRITE_CONFIG_WORD (PDEV, PCI_STATUS, (PCI_STATUS_SIG_SYSTEM_ERROR | PCI_STATUS_DETECTED_PARITY));
 }
-	
 
 int __init DC390_detect (Scsi_Host_Template *psht)
 {
-    PDEVDECL0;
+    struct pci_dev *pdev = NULL;
     UCHAR   irq;
     ULONG   io_port;
 
-    //dc390_pSHT_start = psht;
     dc390_pACB_start = NULL;
 
     if ( PCI_PRESENT )
-	while (PCI_FIND_DEVICE (PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD53C974))
+	    while ((pdev = pci_find_device(PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD53C974, pdev)))
 	{
-#if LINUX_VERSION_CODE > KERNEL_VERSION(2,3,30)
 	    if (pci_enable_device (pdev))
 		continue;
-#endif
+
+	    if (pci_set_dma_mask(pdev, 0xffffffff)) {
+		    printk(KERN_ERR "DC390(%i): No suitable DMA available.\n", dc390_adapterCnt);
+		    continue;
+	    }
 	    PCI_GET_IO_AND_IRQ;
 	    DEBUG0(printk(KERN_INFO "DC390(%i): IO_PORT=%04x,IRQ=%x\n", dc390_adapterCnt, (UINT) io_port, irq));
 
 	    if( !DC390_init(psht, io_port, irq, PDEV, dc390_adapterCnt))
 	    {
-		PCI_SET_MASTER;
+		pci_set_master(pdev);
 		dc390_set_pci_cfg (PDEV);
 		dc390_adapterCnt++;
 	    }
@@ -2247,495 +1959,12 @@
 	printk (KERN_ERR "DC390: No PCI BIOS found!\n");
    
     if (dc390_adapterCnt)
-#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,3,30)
 	psht->proc_name = "tmscsim";
-#else
-	psht->proc_dir = &DC390_proc_scsi_tmscsim;
-#endif
+
     printk(KERN_INFO "DC390: %i adapters found\n", dc390_adapterCnt);
     return( dc390_adapterCnt );
 }
 
-
-/***********************************************************************
- * Functions: dc390_inquiry(), dc390_inquiry_done()
- *
- * Purpose: When changing speed etc., we have to issue an INQUIRY
- *	    command to make sure, we agree upon the nego parameters
- *	    with the device
- ***********************************************************************/
-
-static void dc390_inquiry_done (Scsi_Cmnd* cmd)
-{
-   printk (KERN_INFO "DC390: INQUIRY (ID %02x LUN %02x) returned %08x\n",
-	   cmd->device->id, cmd->device->lun, cmd->result);
-   if (cmd->result)
-   {
-	PACB pACB = (PACB)cmd->device->host->hostdata;
-	PDCB pDCB = dc390_findDCB (pACB, cmd->device->id, cmd->device->lun);
-	printk ("DC390: Unsetting DsCn, Sync and TagQ!\n");
-	if (pDCB)
-	{
-		pDCB->DevMode &= ~(SYNC_NEGO_ | TAG_QUEUEING_ | EN_DISCONNECT_ );
-		dc390_updateDCB (pACB, pDCB);
-	}
-   }
-   kfree (cmd);
-}
-
-void dc390_inquiry (PACB pACB, PDCB pDCB)
-{
-   char* buffer;
-   Scsi_Cmnd* cmd;
-   cmd = kmalloc (sizeof(Scsi_Cmnd) + 256, GFP_ATOMIC);
-   if (!cmd) { printk ("DC390: kmalloc failed in inquiry!\n"); return; }
-   buffer = (char*)cmd + sizeof(Scsi_Cmnd);
-
-   memset (cmd, 0, sizeof(Scsi_Cmnd) + 256);
-   cmd->cmnd[0] = INQUIRY;
-   cmd->cmnd[1] = (pDCB->TargetLUN << 5) & 0xe0;
-   cmd->cmnd[4] = 0xff;
-   
-   cmd->cmd_len = 6; cmd->old_cmd_len = 6;
-/* TODO FIXME */
-/*    cmd->host = pACB->pScsiHost; */
-   cmd->device->id = pDCB->TargetID;
-   cmd->device->lun = pDCB->TargetLUN; 
-   cmd->serial_number = 1;
-   cmd->pid = 390;
-   cmd->bufflen = 128;
-   cmd->buffer = buffer;
-   cmd->request_bufflen = 128;
-   cmd->request_buffer = &buffer[128];
-   cmd->done = dc390_inquiry_done;
-   cmd->scsi_done = dc390_inquiry_done;
-   cmd->timeout_per_command = HZ;
-
-   cmd->request->rq_status = RQ_SCSI_BUSY;
-
-   pDCB->SyncMode &= ~SYNC_NEGO_DONE;
-   printk (KERN_INFO "DC390: Queue INQUIRY command to dev ID %02x LUN %02x\n",
-	   pDCB->TargetID, pDCB->TargetLUN);
-   DC390_queue_command (cmd, dc390_inquiry_done);
-}
-
-/***********************************************************************
- * Functions: dc390_sendstart(), dc390_sendstart_done()
- *
- * Purpose: When changing speed etc., we have to issue an INQUIRY
- *	    command to make sure, we agree upon the nego parameters
- *	    with the device
- ***********************************************************************/
-
-static void dc390_sendstart_done (Scsi_Cmnd* cmd)
-{
-   printk (KERN_INFO "DC390: SENDSTART (ID %02x LUN %02x) returned %08x\n",
-	   cmd->device->id, cmd->device->lun, cmd->result);
-   kfree (cmd);
-}
-
-void dc390_sendstart (PACB pACB, PDCB pDCB)
-{
-   char* buffer;
-   Scsi_Cmnd* cmd;
-   cmd = kmalloc (sizeof(Scsi_Cmnd) + 256, GFP_ATOMIC);
-   if (!cmd) { printk ("DC390: kmalloc failed in sendstart!\n"); return; }
-   buffer = (char*)cmd + sizeof(Scsi_Cmnd);
-
-   memset (cmd, 0, sizeof(Scsi_Cmnd) + 256);
-   cmd->cmnd[0] = 0x1b; /* START_STOP_UNIT */
-   cmd->cmnd[1] = (pDCB->TargetLUN << 5) & 0xe0;
-   cmd->cmnd[4] = 0x01; /* START */
-   
-   cmd->cmd_len = 6; cmd->old_cmd_len = 6;
-/* TODO FIXME */
-/*    cmd->host = pACB->pScsiHost; */
-   cmd->device->id = pDCB->TargetID;
-   cmd->device->lun = pDCB->TargetLUN; 
-   cmd->serial_number = 1;
-   cmd->pid = 310;
-   cmd->bufflen = 128;
-   cmd->buffer = buffer;
-   cmd->request_bufflen = 128;
-   cmd->request_buffer = &buffer[128];
-   cmd->done = dc390_sendstart_done;
-   cmd->scsi_done = dc390_sendstart_done;
-   cmd->timeout_per_command = 5*HZ;
-
-   cmd->request->rq_status = RQ_SCSI_BUSY;
-
-   pDCB->SyncMode &= ~SYNC_NEGO_DONE;
-   printk (KERN_INFO "DC390: Queue SEND_START command to dev ID %02x LUN %02x\n",
-	   pDCB->TargetID, pDCB->TargetLUN);
-   DC390_queue_command (cmd, dc390_sendstart_done);
-}
-
-/********************************************************************
- * Function: dc390_set_info()
- *
- * Purpose: Change adapter config
- *
- * Strings are parsed similar to the output of tmscsim_proc_info ()
- * '-' means no change
- *******************************************************************/
-
-static int dc390_scanf (char** buffer, char** pos, char** p0, int* var)
-{
-   *p0 = *pos;
-   *var = simple_strtoul (*p0, pos, 10);
-   if (*p0 == *pos) return -1;
-   *pos = strsep (buffer, " \t\n:=,;.");
-   return 0;
-}
-
-#define SCANF(buffer, pos, p0, var, min, max)		\
-if (dc390_scanf (&buffer, &pos, &p0, &var)) goto einv;	\
-else if (var<min || var>max) goto einv2
-
-static int dc390_yesno (char** buffer, char** pos, char* var, char bmask)
-{
-   switch (**pos)
-     {
-      case 'Y': *var |= bmask; break;
-      case 'N': *var &= ~bmask; break;
-      case '-': break;
-      default: return -1;
-     }
-   *pos = strsep (buffer, " \t\n:=,;");
-   return 0;
-}
-
-#define YESNO(buffer, pos, var, bmask)					\
-	if (dc390_yesno (&buffer, &pos, &var, bmask)) goto einv;	\
-	else dc390_updateDCB (pACB, pDCB);				\
-	if (!pos) goto ok
-
-static int dc390_search (char** buffer, char** pos, char** p0, char* var, char* txt, int max, int scale, char* ign)
-{
-   int dum;
-   if (! memcmp (*pos, txt, strlen(txt)))
-     {
-	*p0 = strsep (buffer, " \t\n:=,;");
-	if (!*p0) return -1;
-	dum = simple_strtoul (*p0, pos, 10);
-	if (*p0 == *pos) return -1;
-	if (dum >= 0 && dum <= max) 
-	  { *var = (dum * 100) / scale; }
-	else return -2;
-	*pos = strsep (buffer, " \t\n:=,;");
-	if (*ign && *pos && strlen(*pos) >= strlen(ign) && 
-	    !(memcmp (*pos, ign, strlen(ign)))) 
-		*pos = strsep (buffer, " \t\n:=,;");
-
-     }
-   return 0;
-}
-
-#define SEARCH(buffer, pos, p0, var, txt, max)						\
-if (dc390_search (&buffer, &pos, &p0, (PUCHAR)(&var), txt, max, 100, "")) goto einv2;	\
-else if (!p1) goto ok2
-
-#define SEARCH2(buffer, pos, p0, var, txt, max, scale)					\
-if (dc390_search (&buffer, &pos, &p0, &var, txt, max, scale, "")) goto einv2; 		\
-else if (!p1) goto ok2
-
-#define SEARCH3(buffer, pos, p0, var, txt, max, scale, ign)				\
-if (dc390_search (&buffer, &pos, &p0, &var, txt, max, scale, ign)) goto einv2;		\
-else if (!p1) goto ok2
-
-
-#ifdef DC390_PARSEDEBUG
-static char _prstr[256];
-char* prstr (char* p, char* e)
-{
-   char* c = _prstr;
-   while (p < e)
-     if (*p == 0) { *c++ = ':'; p++; }
-     else if (*p == 10) { *c++ = '\\'; *c++ = 'n'; p++; }
-     else *c++ = *p++;
-   *c = 0;
-   return _prstr;
-}
-#endif
-
-int dc390_set_info (char *buffer, int length, PACB pACB)
-{
-  char *pos = buffer, *p0 = buffer;
-  char needs_inquiry = 0; 
-  int dum = 0;
-  char dev;
-  PDCB pDCB = pACB->pLinkDCB;
-  DC390_IFLAGS;
-  DC390_AFLAGS;
-  pos[length] = 0;
-
-  DC390_LOCK_IO(pACB->pScsiHost);
-  DC390_LOCK_ACB;
-  /* UPPERCASE */ 
-  /* Don't use kernel toupper, because of 2.0.x bug: ctmp unexported */
-  while (*pos) 
-    { if (*pos >='a' && *pos <= 'z') *pos = *pos + 'A' - 'a'; pos++; }
-  
-  /* Remove WS */
-  pos = strsep (&buffer, " \t:\n=,;");
-  if (!*pos) goto ok;
-   
- next:
-  if (!memcmp (pos, "RESET", 5)) goto reset;
-  else if (!memcmp (pos, "INQUIRY", 7)) goto inquiry;
-  else if (!memcmp (pos, "REMOVE", 6)) goto remove;
-  else if (!memcmp (pos, "ADD", 3)) goto add;
-  else if (!memcmp (pos, "START", 5)) goto start;
-  else if (!memcmp (pos, "DUMP", 4)) goto dump;
-  
-  if (isdigit (*pos))
-    {
-      /* Device config line */
-      int dev, id, lun; char* pdec;
-      char olddevmode;
-      
-      SCANF (buffer, pos, p0, dev, 0, pACB->DCBCnt-1);
-      if (*pos) { SCANF (buffer, pos, p0, id, 0, 7); } else goto einv;
-      if (*pos) { SCANF (buffer, pos, p0, lun, 0, 7); } else goto einv;
-      if (!*pos) goto einv;
-      
-      PARSEDEBUG(printk (KERN_INFO "DC390: config line %i %i %i:\"%s\"\n", dev, id, lun, prstr (pos, &buffer[length])));
-      pDCB = pACB->pLinkDCB;
-      for (dum = 0; dum < dev; dum++) pDCB = pDCB->pNextDCB;
-      /* Sanity Check */
-      if (pDCB->TargetID != id || pDCB->TargetLUN != lun) 
-	 {
-	    printk (KERN_ERR "DC390: no such device: Idx=%02i ID=%02i LUN=%02i\n",
-		    dev, id, lun);
-	    goto einv2;
-	 }
-
-      if (pDCB->pWaitingSRB || pDCB->pGoingSRB)
-      {
-	  printk ("DC390: Cannot change dev (%i-%i) cfg: Pending requests\n",
-		  pDCB->TargetID, pDCB->TargetLUN);
-	  goto einv;
-      }
-	  
-      olddevmode = pDCB->DevMode;
-      YESNO (buffer, pos, pDCB->DevMode, PARITY_CHK_);
-      needs_inquiry++;
-      YESNO (buffer, pos, pDCB->DevMode, SYNC_NEGO_);
-      if ((olddevmode & SYNC_NEGO_) == (pDCB->DevMode & SYNC_NEGO_)) needs_inquiry--;
-      needs_inquiry++;
-      YESNO (buffer, pos, pDCB->DevMode, EN_DISCONNECT_);
-      if ((olddevmode & EN_DISCONNECT_) == (pDCB->DevMode & EN_DISCONNECT_)) needs_inquiry--;
-      YESNO (buffer, pos, pDCB->DevMode, SEND_START_);
-      needs_inquiry++;
-      YESNO (buffer, pos, pDCB->DevMode, TAG_QUEUEING_);
-      if ((olddevmode & TAG_QUEUEING_) == (pDCB->DevMode & TAG_QUEUEING_)) needs_inquiry--;
-
-      dc390_updateDCB (pACB, pDCB);
-      if (!*pos) goto ok;
-       
-      olddevmode = pDCB->NegoPeriod;
-      /* Look for decimal point (Speed) */
-      pdec = pos; 
-      while (pdec++ < &buffer[length]) if (*pdec == '.') break;
-      /* NegoPeriod */
-      if (*pos != '-')
-	{
-	  SCANF (buffer, pos, p0, dum, 72, 800); 
-	  pDCB->NegoPeriod = dum >> 2;
-	  if (pDCB->NegoPeriod != olddevmode) needs_inquiry++;
-	  if (!pos) goto ok;
-	  if (memcmp (pos, "NS", 2) == 0) pos = strsep (&pos, " \t\n:=,;.");
-	}
-      else pos = strsep (&pos, " \t\n:=,;.");
-      if (!*pos) goto ok;
-      
-      /* Sync Speed in MHz */
-      if (*pos != '-')
-	{
-	  SCANF (buffer, pos, p0, dum, 1, 13); 
-	  pDCB->NegoPeriod = (1000/dum) >> 2;
-	  if (pDCB->NegoPeriod != olddevmode && !pos) needs_inquiry++;
-	  if (!*pos) goto ok;
-	  /* decimal */
-	  if (pos-1 == pdec)
-	     {
-		int dumold = dum;
-		dum = simple_strtoul (pos, &p0, 10) * 10;
-		for (; p0-pos > 1; p0--) dum /= 10;
-		pDCB->NegoPeriod = (100000/(100*dumold + dum)) >> 2;
-		if (pDCB->NegoPeriod < 19) pDCB->NegoPeriod = 19;
-		pos = strsep (&pos, " \t\n:=,;");
-		if (!*pos) goto ok;
-	     }
-	  if (*pos == 'M') pos = strsep (&pos, " \t\n:=,;");
-	  if (pDCB->NegoPeriod != olddevmode) needs_inquiry++;
-	}
-      else pos = strsep (&pos, " \t\n:=,;");
-      /* dc390_updateDCB (pACB, pDCB); */
-      if (!*pos) goto ok;
-
-      olddevmode = pDCB->SyncOffset;
-      /* SyncOffs */
-      if (*pos != '-')
-	{
-	  SCANF (buffer, pos, p0, dum, 0, 0x0f); 
-	  pDCB->SyncOffset = dum;
-	  if (pDCB->SyncOffset > olddevmode) needs_inquiry++;
-	}
-      else pos = strsep (&pos, " \t\n:=,;");
-      if (!*pos) goto ok;
-      dc390_updateDCB (pACB, pDCB);
-
-      //olddevmode = pDCB->MaxCommand;
-      /* MaxCommand (Tags) */
-      if (*pos != '-')
-	{
-	  SCANF (buffer, pos, p0, dum, 1, 32 /*pACB->TagMaxNum*/);
-	  if (pDCB->SyncMode & EN_TAG_QUEUEING)
-		pDCB->MaxCommand = dum;
-	  else printk (KERN_INFO "DC390: Can't set MaxCmd larger than one without Tag Queueing!\n");
-	}
-      else pos = strsep (&pos, " \t\n:=,;");
-
-    }
-  else
-    {
-      char* p1 = pos; UCHAR dum, newadaptid;
-      PARSEDEBUG(printk (KERN_INFO "DC390: chg adapt cfg \"%s\"\n", prstr (pos, &buffer[length])));
-      dum = GLITCH_TO_NS (pACB->glitch_cfg);
-      /* Adapter setting */
-      SEARCH (buffer, pos, p0, pACB->pScsiHost->max_id, "MAXID", 8); 
-      SEARCH (buffer, pos, p0, pACB->pScsiHost->max_lun, "MAXLUN", 8); 
-      SEARCH (buffer, pos, p0, newadaptid, "ADAPTERID", 7);
-      SEARCH (buffer, pos, p0, pACB->TagMaxNum, "TAGMAXNUM", 32);
-      SEARCH (buffer, pos, p0, pACB->ACBFlag, "ACBFLAG", 255);
-      SEARCH3 (buffer, pos, p0, dum, "GLITCHEATER", 40, 1000, "NS");
-      SEARCH3 (buffer, pos, p0, pACB->sel_timeout, "SELTIMEOUT", 400, 163, "MS");
-      SEARCH3 (buffer, pos, p0, dc390_eepromBuf[pACB->AdapterIndex][EE_DELAY], "DELAYRESET", 180, 100, "S");
-    ok2:
-      pACB->glitch_cfg = NS_TO_GLITCH (dum);
-      if (pACB->sel_timeout < 60) pACB->sel_timeout = 60;
-      DC390_write8 (Scsi_TimeOut, pACB->sel_timeout);
-      if (newadaptid != pACB->pScsiHost->this_id)
-      {
-	pACB->pScsiHost->this_id = newadaptid;
-	dc390_ResetDevParam (pACB);
-      }	    
-      //dum = 0; while (1 << dum <= pACB->TagMaxNum) dum ++;
-      //pACB->TagMaxNum &= (1 << --dum);
-      dc390_updateDCBs (pACB);
-      // All devs should be INQUIRED now
-      if (pos == p1) goto einv;
-    }
-  if (*pos) goto next;
-      
- ok:
-  DC390_UNLOCK_ACB;
-  if (needs_inquiry) 
-     { dc390_updateDCB (pACB, pDCB); dc390_inquiry (pACB, pDCB); }
-  DC390_UNLOCK_IO(pACB->pScsiHost);
-  return (length);
-
- einv2:
-  pos = p0;
- einv:
-  DC390_UNLOCK_ACB;
-  DC390_UNLOCK_IO(pACB->pScsiHost);
-  printk (KERN_WARNING "DC390: parse error near \"%s\"\n", (pos? pos: "NULL"));
-  return (-EINVAL);
-   
- reset:
-     {
-	Scsi_Cmnd cmd;
-	/* TODO FIXME */
-	/* cmd.host = pACB->pScsiHost; */
-	printk (KERN_WARNING "DC390: Driver reset requested!\n");
-	DC390_UNLOCK_ACB;
-	DC390_reset (&cmd);
-	DC390_UNLOCK_IO(pACB->pScsiHost);
-     }
-  return (length);
-
- dump:
-     {
-	dc390_dumpinfo (pACB, 0, 0);
-	DC390_UNLOCK_ACB;
-	DC390_UNLOCK_IO(pACB->pScsiHost);       
-     }
-  return (length);
-	
- inquiry:
-     {
-	pos = strsep (&pos, " \t\n.:;="); if (!*pos) goto einv;
-	dev = simple_strtoul (pos, &p0, 10);
-	if (dev >= pACB->DCBCnt) goto einv_dev;
-	for (dum = 0; dum < dev; dum++) pDCB = pDCB->pNextDCB;
-	printk (KERN_NOTICE " DC390: Issue INQUIRY command to Dev(Idx) %i SCSI ID %i LUN %i\n",
-		dev, pDCB->TargetID, pDCB->TargetLUN);
-	DC390_UNLOCK_ACB;
-	dc390_inquiry (pACB, pDCB);
-	DC390_UNLOCK_IO(pACB->pScsiHost);
-     }
-   return (length);
-
- remove:
-     {
-	pos = strsep (&pos, " \t\n.:;="); if (!*pos) goto einv;
-	dev = simple_strtoul (pos, &p0, 10);
-	if (dev >= pACB->DCBCnt) goto einv_dev;
-	for (dum = 0; dum < dev; dum++) pDCB = pDCB->pNextDCB;
-	printk (KERN_NOTICE " DC390: Remove DCB for Dev(Idx) %i SCSI ID %i LUN %i\n",
-		dev, pDCB->TargetID, pDCB->TargetLUN);
-	/* TO DO: We should make sure no pending commands are left */
-	dc390_remove_dev (pACB, pDCB);
-	DC390_UNLOCK_ACB;
-	DC390_UNLOCK_IO(pACB->pScsiHost);
-     }
-   return (length);
-
- add:
-     {
-	int id, lun;
-	pos = strsep (&pos, " \t\n.:;=");
-	if (*pos) { SCANF (buffer, pos, p0, id, 0, 7); } else goto einv;
-	if (*pos) { SCANF (buffer, pos, p0, lun, 0, 7); } else goto einv;
-	pDCB = dc390_findDCB (pACB, id, lun);
-	if (pDCB) { printk ("DC390: ADD: Device already existing\n"); goto einv; }
-	dc390_initDCB (pACB, &pDCB, id, lun);
-	DC390_UNLOCK_ACB;
-	dc390_inquiry (pACB, pDCB);
-	DC390_UNLOCK_IO(pACB->pScsiHost);
-     }
-   return (length);
-
- start:
-     {
-	int id, lun;
-	pos = strsep (&pos, " \t\n.:;=");
-	if (*pos) { SCANF (buffer, pos, p0, id, 0, 7); } else goto einv;
-	if (*pos) { SCANF (buffer, pos, p0, lun, 0, 7); } else goto einv;
-	pDCB = dc390_findDCB (pACB, id, lun);
-	if (pDCB) printk ("DC390: SendStart: Device already existing ...\n");
-	else dc390_initDCB (pACB, &pDCB, id, lun);
-	DC390_UNLOCK_ACB;
-	dc390_sendstart (pACB, pDCB);
-	dc390_inquiry (pACB, pDCB);
-	DC390_UNLOCK_IO(pACB->pScsiHost);
-     }
-   return (length);
-
- einv_dev:
-   printk (KERN_WARNING "DC390: Ignore cmnd to invalid Dev(Idx) %i. Valid range: 0 - %i.\n", 
-	   dev, pACB->DCBCnt - 1);
-   DC390_UNLOCK_ACB;
-   DC390_UNLOCK_IO(pACB->pScsiHost);
-   return (-EINVAL);
-}
-
-#undef SEARCH
-#undef YESNO
-#undef SCANF
-
 /********************************************************************
  * Function: DC390_proc_info(char* buffer, char **start,
  *			     off_t offset, int length, int hostno, int inout)
@@ -2763,15 +1992,13 @@
  else SPRINTF(" No  ")
 
 
-int DC390_proc_info (struct Scsi_Host *shpnt, char *buffer, char **start,
-		     off_t offset, int length, int inout)
+static int DC390_proc_info (struct Scsi_Host *shpnt, char *buffer, char **start,
+			    off_t offset, int length, int inout)
 {
   int dev, spd, spd1;
   char *pos = buffer;
-  struct scsi_cmnd_list *cl;
   PACB pACB;
   PDCB pDCB;
-  DC390_AFLAGS;
 
   pACB = dc390_pACB_start;
 
@@ -2785,13 +2012,11 @@
   if (pACB == (PACB)-1) return(-ESRCH);
 
   if(inout) /* Has data been written to the file ? */
-      return dc390_set_info(buffer, length, pACB);
+      return -ENOSYS;
    
   SPRINTF("Tekram DC390/AM53C974 PCI SCSI Host Adapter, ");
   SPRINTF("Driver Version %s\n", DC390_VERSION);
 
-  DC390_LOCK_ACB;
-
   SPRINTF("SCSI Host Nr %i, ", shpnt->host_no);
   SPRINTF("%s Adapter Nr %i\n", dc390_adapname, pACB->AdapterIndex);
   SPRINTF("IOPortBase 0x%04x, ", pACB->IOPortBase);
@@ -2839,9 +2064,6 @@
       SPRINTF ("      %02i\n", pDCB->MaxCommand);
       pDCB = pDCB->pNextDCB;
      }
-    SPRINTF ("Commands in Queues: Query: %li:", pACB->QueryCnt);
-    list_for_each_entry(cl, &pACB->cmdq, scp.list)
-	SPRINTF (" %li", ((struct scsi_cmnd*)cl)->pid);
     if (timer_pending(&pACB->Waiting_Timer)) SPRINTF ("Waiting queue timer running\n");
     else SPRINTF ("\n");
     pDCB = pACB->pLinkDCB;
@@ -2876,8 +2098,6 @@
     SPRINTF("\n");
 #endif
   
-
-  DC390_UNLOCK_ACB;
   *start = buffer + offset;
 
   if (pos - buffer < offset)
@@ -2919,7 +2139,7 @@
     return( 0 );
 }
 
-void dc390_freeDCBs (struct Scsi_Host *host)
+static void dc390_freeDCBs (struct Scsi_Host *host)
 {
     PDCB pDCB, nDCB;
     PACB pACB = (PACB)(host->hostdata);
@@ -2938,13 +2158,12 @@
 
 }
 
-int DC390_release (struct Scsi_Host *host)
+static int DC390_release (struct Scsi_Host *host)
 {
-    DC390_AFLAGS DC390_IFLAGS;
+    DC390_IFLAGS;
     PACB pACB = (PACB)(host->hostdata);
 
     DC390_LOCK_IO(host);
-    DC390_LOCK_ACB;
 
     /* TO DO: We should check for outstanding commands first. */
     dc390_shutdown (host);
@@ -2957,7 +2176,6 @@
 
     release_region(host->io_port,host->n_io_port);
     dc390_freeDCBs (host);
-    DC390_UNLOCK_ACB;
     DC390_UNLOCK_IO(host);
     scsi_unregister(host);
     return( 1 );
diff -Nru a/drivers/scsi/tmscsim.h b/drivers/scsi/tmscsim.h
--- a/drivers/scsi/tmscsim.h	2004-05-26 15:01:36 -07:00
+++ b/drivers/scsi/tmscsim.h	2004-05-26 15:01:36 -07:00
@@ -214,16 +214,12 @@
 PSRB		pTmpSRB;
 
 /* 0x2c: */
-ULONG		QueryCnt;
-struct list_head	cmdq;
-
-/* 0x38: */
 UCHAR		msgin123[4];
 UCHAR		DCBmap[MAX_SCSI_ID];
 UCHAR		Connected;
 UCHAR		pad;
 
-/* 0x3c: */
+/* 0x30: */
 #if defined(USE_SPINLOCKS) && USE_SPINLOCKS > 1 && (defined(CONFIG_SMP) || DEBUG_SPINLOCKS > 0)
 spinlock_t	lock;
 #endif
@@ -234,20 +230,20 @@
 UCHAR		Ignore_IRQ;	/* Not used */
 
 PDEVDECL1;			/* Pointer to PCI cfg. space */
-/* 0x4c/0x48: */
+/* 0x40/0x3c: */
 ULONG		Cmds;
 UINT		SelLost;
 UINT		SelConn;
 UINT		CmdInQ;
 UINT		CmdOutOfSRB;
 	
-/* 0x60/0x5c: */
+/* 0x54/0x50: */
 struct timer_list	Waiting_Timer;
-/* 0x74/0x70: */
+/* 0x68/0x64: */
 DC390_SRB	TmpSRB;
-/* 0xd8/0xd4: */
+/* 0xcc/0xc8: */
 DC390_SRB	SRB_array[MAX_SRB_CNT]; 	/* 50 SRBs */
-/* 0xfb0/0xfac: */
+/* 0xfa4/0xfa0: */
 };
 
 typedef  struct  _ACB	 DC390_ACB, *PACB;
@@ -406,15 +402,8 @@
  *	SISC query queue
  */
 typedef struct {
-	struct list_head	list;
 	dma_addr_t		saved_dma_handle;
 } dc390_cmd_scp_t;
-
-struct scsi_cmnd_list
-{
-	char dummy[offsetof(struct scsi_cmnd, SCp)];
-	dc390_cmd_scp_t scp;
-};
 
 /*
 **  Inquiry Data format
diff -Nru a/drivers/scsi/wd7000.c b/drivers/scsi/wd7000.c
--- a/drivers/scsi/wd7000.c	2004-05-26 15:01:36 -07:00
+++ b/drivers/scsi/wd7000.c	2004-05-26 15:01:36 -07:00
@@ -165,6 +165,7 @@
  * Removed now obsolete wd7000.h
  */
 
+#include <linux/delay.h>
 #include <linux/module.h>
 #include <linux/interrupt.h>
 #include <linux/kernel.h>
@@ -846,7 +847,7 @@
 static inline Scb *alloc_scbs(struct Scsi_Host *host, int needed)
 {
 	register Scb *scb, *p = NULL;
-	register unsigned long flags;
+	unsigned long flags;
 	register unsigned long timeout = jiffies + WAITnexttimeout;
 	register unsigned long now;
 	int i;
@@ -898,7 +899,7 @@
 
 static inline void free_scb(Scb * scb)
 {
-	register unsigned long flags;
+	unsigned long flags;
 
 	spin_lock_irqsave(&scbpool_lock, flags);
 
@@ -936,7 +937,7 @@
  */
 {
 	register int i, ogmb;
-	register unsigned long flags;
+	unsigned long flags;
 	unchar start_ogmb;
 	Mailbox *ogmbs = host->mb.ogmb;
 	int *next_ogmb = &(host->next_ogmb);
diff -Nru a/drivers/serial/pxa.c b/drivers/serial/pxa.c
--- a/drivers/serial/pxa.c	2004-05-26 15:01:36 -07:00
+++ b/drivers/serial/pxa.c	2004-05-26 15:01:36 -07:00
@@ -33,7 +33,6 @@
 #include <linux/sysrq.h>
 #include <linux/serial_reg.h>
 #include <linux/circ_buf.h>
-#include <linux/serial.h>
 #include <linux/delay.h>
 #include <linux/interrupt.h>
 
@@ -386,9 +385,6 @@
 	if (retval)
 		return retval;
 
-	CKEN |= up->cken;
-	udelay(1);
-
 	/*
 	 * Clear the FIFO buffers and disable them.
 	 * (they will be reenabled in set_termios())
@@ -461,8 +457,6 @@
 				  UART_FCR_CLEAR_RCVR |
 				  UART_FCR_CLEAR_XMIT);
 	serial_out(up, UART_FCR, 0);
-
-	CKEN &= ~up->cken;
 }
 
 static void
@@ -576,10 +570,14 @@
 serial_pxa_pm(struct uart_port *port, unsigned int state,
 	      unsigned int oldstate)
 {
+	struct uart_pxa_port *up = (struct uart_pxa_port *)port;
 	if (state) {
 		/* sleep */
+		CKEN &= ~up->cken;
 	} else {
 		/* wake */
+		CKEN |= up->cken;
+		udelay(1);
 	}
 }
 
@@ -760,13 +758,12 @@
 	.cken	= CKEN6_FFUART,
 	.port	= {
 		.type		= PORT_PXA,
-		.iotype		= SERIAL_IO_MEM,
+		.iotype		= UPIO_MEM,
 		.membase	= (void *)&FFUART,
 		.mapbase	= __PREG(FFUART),
 		.irq		= IRQ_FFUART,
 		.uartclk	= 921600 * 16,
 		.fifosize	= 64,
-		.flags		= ASYNC_SKIP_TEST,
 		.ops		= &serial_pxa_pops,
 		.line		= 0,
 	},
@@ -775,13 +772,12 @@
 	.cken	= CKEN7_BTUART,
 	.port	= {
 		.type		= PORT_PXA,
-		.iotype		= SERIAL_IO_MEM,
+		.iotype		= UPIO_MEM,
 		.membase	= (void *)&BTUART,
 		.mapbase	= __PREG(BTUART),
 		.irq		= IRQ_BTUART,
 		.uartclk	= 921600 * 16,
 		.fifosize	= 64,
-		.flags		= ASYNC_SKIP_TEST,
 		.ops		= &serial_pxa_pops,
 		.line		= 1,
 	},
@@ -790,13 +786,12 @@
 	.cken	= CKEN5_STUART,
 	.port	= {
 		.type		= PORT_PXA,
-		.iotype		= SERIAL_IO_MEM,
+		.iotype		= UPIO_MEM,
 		.membase	= (void *)&STUART,
 		.mapbase	= __PREG(STUART),
 		.irq		= IRQ_STUART,
 		.uartclk	= 921600 * 16,
 		.fifosize	= 64,
-		.flags		= ASYNC_SKIP_TEST,
 		.ops		= &serial_pxa_pops,
 		.line		= 2,
 	},
@@ -830,6 +825,10 @@
 
 static void __exit serial_pxa_exit(void)
 {
+	int i;
+
+	for (i = 0; i < ARRAY_SIZE(serial_pxa_ports); i++)
+		uart_remove_one_port(&serial_pxa_reg, &serial_pxa_ports[i].port);
 	uart_unregister_driver(&serial_pxa_reg);
 }
 
diff -Nru a/drivers/usb/gadget/pxa2xx_udc.c b/drivers/usb/gadget/pxa2xx_udc.c
--- a/drivers/usb/gadget/pxa2xx_udc.c	2004-05-26 15:01:36 -07:00
+++ b/drivers/usb/gadget/pxa2xx_udc.c	2004-05-26 15:01:36 -07:00
@@ -51,6 +51,7 @@
 #include <asm/io.h>
 #include <asm/irq.h>
 #include <asm/system.h>
+#include <asm/mach-types.h>
 #include <asm/unaligned.h>
 #include <asm/hardware.h>
 
diff -Nru a/drivers/usb/input/hiddev.c b/drivers/usb/input/hiddev.c
--- a/drivers/usb/input/hiddev.c	2004-05-26 15:01:35 -07:00
+++ b/drivers/usb/input/hiddev.c	2004-05-26 15:01:35 -07:00
@@ -612,7 +612,7 @@
 		uref = &uref_multi->uref;
 		if (cmd == HIDIOCGUSAGES || cmd == HIDIOCSUSAGES) {
 			if (copy_from_user(uref_multi, (void *) arg, 
-					   sizeof(uref_multi)))
+					   sizeof(*uref_multi)))
 				goto fault;
 		} else {
 			if (copy_from_user(uref, (void *) arg, sizeof(*uref)))
diff -Nru a/drivers/usb/misc/emi26.c b/drivers/usb/misc/emi26.c
--- a/drivers/usb/misc/emi26.c	2004-05-26 15:01:35 -07:00
+++ b/drivers/usb/misc/emi26.c	2004-05-26 15:01:35 -07:00
@@ -194,7 +194,7 @@
 
 	/* return 1 to fail the driver inialization
 	 * and give real driver change to load */
-	return 1;
+	err = 1;
 
 wraperr:
 	kfree(buf);
diff -Nru a/drivers/usb/misc/emi62.c b/drivers/usb/misc/emi62.c
--- a/drivers/usb/misc/emi62.c	2004-05-26 15:01:36 -07:00
+++ b/drivers/usb/misc/emi62.c	2004-05-26 15:01:36 -07:00
@@ -229,6 +229,8 @@
 		goto wraperr;
 	}
 
+	kfree(buf);
+
 	/* return 1 to fail the driver inialization
 	 * and give real driver change to load */
 	return 1;
diff -Nru a/drivers/video/aty/atyfb_base.c b/drivers/video/aty/atyfb_base.c
--- a/drivers/video/aty/atyfb_base.c	2004-05-26 15:01:36 -07:00
+++ b/drivers/video/aty/atyfb_base.c	2004-05-26 15:01:36 -07:00
@@ -1938,6 +1938,19 @@
 			if (i < 0)
 				continue;
 
+			rp = &pdev->resource[0];
+			if (rp->flags & IORESOURCE_IO)
+				rp = &pdev->resource[1];
+			addr = rp->start;
+			if (!addr)
+				continue;
+
+			res_start = rp->start;
+			res_size = rp->end - rp->start + 1;
+			if (!request_mem_region
+			    (res_start, res_size, "atyfb"))
+				continue;
+
 			info =
 			    kmalloc(sizeof(struct fb_info), GFP_ATOMIC);
 			if (!info) {
@@ -1960,19 +1973,6 @@
 			info->fix = atyfb_fix;
 			info->par = default_par;
 
-			rp = &pdev->resource[0];
-			if (rp->flags & IORESOURCE_IO)
-				rp = &pdev->resource[1];
-			addr = rp->start;
-			if (!addr)
-				continue;
-
-			res_start = rp->start;
-			res_size = rp->end - rp->start + 1;
-			if (!request_mem_region
-			    (res_start, res_size, "atyfb"))
-				continue;
-
 #ifdef __sparc__
 			/*
 			 * Map memory-mapped registers.
@@ -2000,6 +2000,7 @@
 			if (!default_par->mmap_map) {
 				printk
 				    ("atyfb_init: can't alloc mmap_map\n");
+				kfree(default_par);
 				kfree(info);
 				release_mem_region(res_start, res_size);
 				return -ENXIO;
@@ -2217,6 +2218,9 @@
 			    ioremap(info->fix.mmio_start, 0x1000);
 
 			if (!default_par->ati_regbase) {
+#ifdef __sparc__
+				kfree(default_par->mmap_map);
+#endif
 				kfree(default_par);
 				kfree(info);
 				release_mem_region(res_start, res_size);
@@ -2247,6 +2251,10 @@
 			    (char *) ioremap(addr, 0x800000);
 
 			if (!info->screen_base) {
+#ifdef __sparc__
+				kfree(default_par->mmap_map);
+#endif
+				kfree(default_par);
 				kfree(info);
 				release_mem_region(res_start, res_size);
 				return -ENXIO;
@@ -2258,6 +2266,7 @@
 				if (default_par->mmap_map)
 					kfree(default_par->mmap_map);
 #endif
+				kfree(default_par);
 				kfree(info);
 				release_mem_region(res_start, res_size);
 				return -ENXIO;
@@ -2326,6 +2335,7 @@
 		memset(default_par, 0, sizeof(struct atyfb_par));
 
 		info->fix = atyfb_fix;
+		info->par = default_par;
 
 		/*
 		 *  Map the video memory (physical address given) to somewhere in the
@@ -2357,6 +2367,7 @@
 		}
 
 		if (!aty_init(info, "ISA bus")) {
+			kfree(default_par);
 			kfree(info);
 			/* This is insufficient! kernel_map has added two large chunks!! */
 			return -ENXIO;
diff -Nru a/drivers/video/matrox/matroxfb_DAC1064.c b/drivers/video/matrox/matroxfb_DAC1064.c
--- a/drivers/video/matrox/matroxfb_DAC1064.c	2004-05-26 15:01:35 -07:00
+++ b/drivers/video/matrox/matroxfb_DAC1064.c	2004-05-26 15:01:35 -07:00
@@ -660,7 +660,7 @@
 	ACCESS_FBINFO(features.accel.has_cacheflush) = 1;
 
 	ACCESS_FBINFO(outputs[0]).output = &m1064;
-	ACCESS_FBINFO(outputs[0]).src = MATROXFB_SRC_CRTC1;
+	ACCESS_FBINFO(outputs[0]).src = ACCESS_FBINFO(outputs[0]).default_src;
 	ACCESS_FBINFO(outputs[0]).data = MINFO;
 	ACCESS_FBINFO(outputs[0]).mode = MATROXFB_OUTPUT_MODE_MONITOR;
 
@@ -859,7 +859,7 @@
 	{
 		ACCESS_FBINFO(outputs[0]).output = &m1064;
 	}
-	ACCESS_FBINFO(outputs[0]).src = MATROXFB_SRC_CRTC1;
+	ACCESS_FBINFO(outputs[0]).src = ACCESS_FBINFO(outputs[0]).default_src;
 	ACCESS_FBINFO(outputs[0]).data = MINFO;
 	ACCESS_FBINFO(outputs[0]).mode = MATROXFB_OUTPUT_MODE_MONITOR;
 
diff -Nru a/drivers/video/matrox/matroxfb_Ti3026.c b/drivers/video/matrox/matroxfb_Ti3026.c
--- a/drivers/video/matrox/matroxfb_Ti3026.c	2004-05-26 15:01:35 -07:00
+++ b/drivers/video/matrox/matroxfb_Ti3026.c	2004-05-26 15:01:35 -07:00
@@ -692,7 +692,7 @@
 
 	ACCESS_FBINFO(outputs[0]).data = MINFO;
 	ACCESS_FBINFO(outputs[0]).output = &ti3026_output;
-	ACCESS_FBINFO(outputs[0]).src = MATROXFB_SRC_CRTC1;
+	ACCESS_FBINFO(outputs[0]).src = ACCESS_FBINFO(outputs[0]).default_src;
 	ACCESS_FBINFO(outputs[0]).mode = MATROXFB_OUTPUT_MODE_MONITOR;
 
 	if (ACCESS_FBINFO(devflags.noinit))
diff -Nru a/drivers/video/matrox/matroxfb_base.c b/drivers/video/matrox/matroxfb_base.c
--- a/drivers/video/matrox/matroxfb_base.c	2004-05-26 15:01:36 -07:00
+++ b/drivers/video/matrox/matroxfb_base.c	2004-05-26 15:01:36 -07:00
@@ -1272,6 +1272,7 @@
 static int dfp;				/* "matrox:dfp */
 static int dfp_type = -1;		/* "matrox:dfp:xxx */
 static int memtype = -1;		/* "matrox:memtype:xxx" */
+static char outputs[8];			/* "matrox:outputs:xxx" */
 
 #ifndef MODULE
 static char videomode[64];		/* "matrox:mode:xxxxx" or "matrox:xxxxx" */
@@ -1537,6 +1538,39 @@
 
 static int hotplug = 0;
 
+static void setDefaultOutputs(WPMINFO2) {
+	unsigned int i;
+	const char* ptr;
+
+	ACCESS_FBINFO(outputs[0]).default_src = MATROXFB_SRC_CRTC1;
+	if (ACCESS_FBINFO(devflags.g450dac)) {
+		ACCESS_FBINFO(outputs[1]).default_src = MATROXFB_SRC_CRTC1;
+		ACCESS_FBINFO(outputs[2]).default_src = MATROXFB_SRC_CRTC1;
+	} else if (dfp) {
+		ACCESS_FBINFO(outputs[2]).default_src = MATROXFB_SRC_CRTC1;
+	}
+	ptr = outputs;
+	for (i = 0; i < MATROXFB_MAX_OUTPUTS; i++) {
+		char c = *ptr++;
+
+		if (c == 0) {
+			break;
+		}
+		if (c == '0') {
+			ACCESS_FBINFO(outputs[i]).default_src = MATROXFB_SRC_NONE;
+		} else if (c == '1') {
+			ACCESS_FBINFO(outputs[i]).default_src = MATROXFB_SRC_CRTC1;
+		} else if (c == '2' && ACCESS_FBINFO(devflags.crtc2)) {
+			ACCESS_FBINFO(outputs[i]).default_src = MATROXFB_SRC_CRTC2;
+		} else {
+			printk(KERN_ERR "matroxfb: Unknown outputs setting\n");
+			break;
+		}
+	}
+	/* Nullify this option for subsequent adapters */
+	outputs[0] = 0;
+}
+
 static int initMatrox2(WPMINFO struct board* b){
 	unsigned long ctrlptr_phys = 0;
 	unsigned long video_base_phys = 0;
@@ -1577,20 +1611,18 @@
 	ACCESS_FBINFO(devflags.crtc2) = (b->flags & DEVF_CRTC2) != 0;
 	ACCESS_FBINFO(devflags.maven_capable) = (b->flags & DEVF_MAVEN_CAPABLE) != 0;
 	ACCESS_FBINFO(devflags.dualhead) = (b->flags & DEVF_DUALHEAD) != 0;
+	ACCESS_FBINFO(devflags.dfp_type) = dfp_type;
+	ACCESS_FBINFO(devflags.g450dac) = (b->flags & DEVF_G450DAC) != 0;
+	ACCESS_FBINFO(devflags.textstep) = ACCESS_FBINFO(devflags.vgastep) * ACCESS_FBINFO(devflags.textmode);
+	ACCESS_FBINFO(devflags.textvram) = 65536 / ACCESS_FBINFO(devflags.textmode);
+	setDefaultOutputs(PMINFO2);
 	if (b->flags & DEVF_PANELLINK_CAPABLE) {
 		ACCESS_FBINFO(outputs[2]).data = MINFO;
 		ACCESS_FBINFO(outputs[2]).output = &panellink_output;
-		if (dfp)
-			ACCESS_FBINFO(outputs[2]).src = MATROXFB_SRC_CRTC1;
-		else
-			ACCESS_FBINFO(outputs[2]).src = MATROXFB_SRC_NONE;
+		ACCESS_FBINFO(outputs[2]).src = ACCESS_FBINFO(outputs[2]).default_src;
 		ACCESS_FBINFO(outputs[2]).mode = MATROXFB_OUTPUT_MODE_MONITOR;
 		ACCESS_FBINFO(devflags.panellink) = 1;
 	}
-	ACCESS_FBINFO(devflags.dfp_type) = dfp_type;
-	ACCESS_FBINFO(devflags.g450dac) = (b->flags & DEVF_G450DAC) != 0;
-	ACCESS_FBINFO(devflags.textstep) = ACCESS_FBINFO(devflags.vgastep) * ACCESS_FBINFO(devflags.textmode);
-	ACCESS_FBINFO(devflags.textvram) = 65536 / ACCESS_FBINFO(devflags.textmode);
 
 	if (ACCESS_FBINFO(capable.cross4MB) < 0)
 		ACCESS_FBINFO(capable.cross4MB) = b->flags & DEVF_CROSS4MB;
@@ -1813,6 +1845,13 @@
 							to yres_virtual * xres_virtual < 2^32 */
 	}
 	matroxfb_init_fix(PMINFO2);
+	/* Normalize values (namely yres_virtual) */
+	matroxfb_check_var(&vesafb_defined, &ACCESS_FBINFO(fbcon));
+	/* And put it into "current" var. Do NOT program hardware yet, or we'll not take over
+	 * vgacon correctly. fbcon_startup will call fb_set_par for us, WITHOUT check_var,
+	 * and unfortunately it will do it BEFORE vgacon contents is saved, so it won't work
+	 * anyway. But we at least tried... */
+	ACCESS_FBINFO(fbcon.var) = vesafb_defined;
 	err = -EINVAL;
 
 	printk(KERN_INFO "matroxfb: %dx%dx%dbpp (virtual: %dx%d)\n",
@@ -1834,6 +1873,9 @@
 		 * until someone tells me what is proper thing to do */
 		printk(KERN_INFO "fb%d: initializing hardware\n",
 			ACCESS_FBINFO(fbcon.node));
+		/* We have to use FB_ACTIVATE_FORCE, as we had to put vesafb_defined to the fbcon.var
+		 * already before, so register_framebuffer works correctly. */
+		vesafb_defined.activate |= FB_ACTIVATE_FORCE;
 		fb_set_var(&ACCESS_FBINFO(fbcon), &vesafb_defined);
 	}
 	return 0;
@@ -2288,6 +2330,8 @@
 			mem = simple_strtoul(this_opt+4, NULL, 0);
 		else if (!strncmp(this_opt, "mode:", 5))
 			strlcpy(videomode, this_opt+5, sizeof(videomode));
+		else if (!strncmp(this_opt, "outputs:", 8))
+			strlcpy(outputs, this_opt+8, sizeof(outputs));
 		else if (!strncmp(this_opt, "dfp:", 4)) {
 			dfp_type = simple_strtoul(this_opt+4, NULL, 0);
 			dfp = 1;
@@ -2463,6 +2507,8 @@
 MODULE_PARM_DESC(dfp, "Specifies whether to use digital flat panel interface of G200/G400 (0 or 1) (default=0)");
 MODULE_PARM(dfp_type, "i");
 MODULE_PARM_DESC(dfp_type, "Specifies DFP interface type (0 to 255) (default=read from hardware)");
+MODULE_PARM(outputs, "c8");
+MODULE_PARM_DESC(outputs, "Specifies which CRTC is mapped to which output (string of up to three letters, consisting of 0 (disabled), 1 (CRTC1), 2 (CRTC2)) (default=111 for Gx50, 101 for G200/G400 with DFP, and 100 for all other devices)");
 #ifdef CONFIG_PPC_PMAC
 MODULE_PARM(vmode, "i");
 MODULE_PARM_DESC(vmode, "Specify the vmode mode number that should be used (640x480 default)");
diff -Nru a/drivers/video/matrox/matroxfb_base.h b/drivers/video/matrox/matroxfb_base.h
--- a/drivers/video/matrox/matroxfb_base.h	2004-05-26 15:01:36 -07:00
+++ b/drivers/video/matrox/matroxfb_base.h	2004-05-26 15:01:36 -07:00
@@ -479,6 +479,7 @@
 	struct matrox_altout*	output;
 	void*			data;
 	unsigned int		mode;
+	unsigned int		default_src;
 			      } outputs[MATROXFB_MAX_OUTPUTS];
 
 #define MATROXFB_MAX_FB_DRIVERS		5
diff -Nru a/drivers/video/matrox/matroxfb_crtc2.c b/drivers/video/matrox/matroxfb_crtc2.c
--- a/drivers/video/matrox/matroxfb_crtc2.c	2004-05-26 15:01:36 -07:00
+++ b/drivers/video/matrox/matroxfb_crtc2.c	2004-05-26 15:01:36 -07:00
@@ -628,15 +628,6 @@
 	m2info->mmio.vbase = ACCESS_FBINFO(mmio.vbase);
 	m2info->mmio.len = ACCESS_FBINFO(mmio.len);
 
-	/*
-	 *  If we have unused output, connect CRTC2 to it...
-	 */
-	if (ACCESS_FBINFO(outputs[1]).output &&
-	    ACCESS_FBINFO(outputs[1]).src == MATROXFB_SRC_NONE &&
-	    ACCESS_FBINFO(outputs[2]).src == MATROXFB_SRC_NONE) {
-		ACCESS_FBINFO(outputs[1]).src = MATROXFB_SRC_CRTC2;
-	}
-
 	matroxfb_dh_init_fix(m2info);
 	if (register_framebuffer(&m2info->fbcon)) {
 		return -ENXIO;
diff -Nru a/drivers/video/matrox/matroxfb_g450.c b/drivers/video/matrox/matroxfb_g450.c
--- a/drivers/video/matrox/matroxfb_g450.c	2004-05-26 15:01:36 -07:00
+++ b/drivers/video/matrox/matroxfb_g450.c	2004-05-26 15:01:36 -07:00
@@ -591,11 +591,11 @@
 	if (ACCESS_FBINFO(devflags.g450dac)) {
 		down_write(&ACCESS_FBINFO(altout.lock));
 		tvo_fill_defaults(PMINFO2);
-		ACCESS_FBINFO(outputs[1]).src = MATROXFB_SRC_CRTC1;
+		ACCESS_FBINFO(outputs[1]).src = ACCESS_FBINFO(outputs[1]).default_src;
 		ACCESS_FBINFO(outputs[1]).data = MINFO;
 		ACCESS_FBINFO(outputs[1]).output = &matroxfb_g450_altout;
 		ACCESS_FBINFO(outputs[1]).mode = MATROXFB_OUTPUT_MODE_MONITOR;
-		ACCESS_FBINFO(outputs[2]).src = MATROXFB_SRC_CRTC1;
+		ACCESS_FBINFO(outputs[2]).src = ACCESS_FBINFO(outputs[2]).default_src;
 		ACCESS_FBINFO(outputs[2]).data = MINFO;
 		ACCESS_FBINFO(outputs[2]).output = &matroxfb_g450_dvi;
 		ACCESS_FBINFO(outputs[2]).mode = MATROXFB_OUTPUT_MODE_MONITOR;
diff -Nru a/drivers/video/matrox/matroxfb_maven.c b/drivers/video/matrox/matroxfb_maven.c
--- a/drivers/video/matrox/matroxfb_maven.c	2004-05-26 15:01:35 -07:00
+++ b/drivers/video/matrox/matroxfb_maven.c	2004-05-26 15:01:35 -07:00
@@ -1188,7 +1188,7 @@
 	md->client = clnt;
 	down_write(&ACCESS_FBINFO(altout.lock));
 	ACCESS_FBINFO(outputs[1]).output = &maven_altout;
-	ACCESS_FBINFO(outputs[1]).src = MATROXFB_SRC_NONE;
+	ACCESS_FBINFO(outputs[1]).src = ACCESS_FBINFO(outputs[1]).default_src;
 	ACCESS_FBINFO(outputs[1]).data = md;
 	ACCESS_FBINFO(outputs[1]).mode = MATROXFB_OUTPUT_MODE_MONITOR;
 	up_write(&ACCESS_FBINFO(altout.lock));
@@ -1249,6 +1249,7 @@
 		err = -ENOMEM;
 		goto ERROR0;
 	}
+	memset(new_client, 0, sizeof(*new_client) + sizeof(*data));
 	data = (struct maven_data*)(new_client + 1);
 	i2c_set_clientdata(new_client, data);
 	new_client->addr = address;
diff -Nru a/drivers/video/pxafb.c b/drivers/video/pxafb.c
--- a/drivers/video/pxafb.c	2004-05-26 15:01:35 -07:00
+++ b/drivers/video/pxafb.c	2004-05-26 15:01:35 -07:00
@@ -153,7 +153,7 @@
 		 * 12 or 16-bit True Colour.  We encode the RGB value
 		 * according to the RGB bitfield information.
 		 */
-		if (regno <= 16) {
+		if (regno < 16) {
 			u32 *pal = fbi->fb.pseudo_palette;
 
 			val  = chan_to_field(red, &fbi->fb.var.red);
@@ -448,7 +448,7 @@
 {
 	struct pxafb_lcd_reg new_regs;
 	u_long flags;
-	u_int pcd = get_pcd(var->pixclock);
+	u_int lines_per_panel, pcd = get_pcd(var->pixclock);
 
 	DPRINTK("Configuring PXA LCD\n");
 
@@ -509,8 +509,16 @@
 		LCCR1_BegLnDel(var->left_margin) +
 		LCCR1_EndLnDel(var->right_margin);
 
+	/*
+	 * If we have a dual scan LCD, we need to halve
+	 * the YRES parameter.
+	 */
+	lines_per_panel = var->yres;
+	if (fbi->lccr0 & LCCR0_SDS)
+		lines_per_panel /= 2;
+
 	new_regs.lccr2 =
-		LCCR2_DisHght(var->yres) +
+		LCCR2_DisHght(lines_per_panel) +
 		LCCR2_VrtSnchWdth(var->vsync_len) +
 		LCCR2_BegFrmDel(var->upper_margin) +
 		LCCR2_EndFrmDel(var->lower_margin);
@@ -540,9 +548,7 @@
 	fbi->dmadesc_fbhigh_dma = fbi->palette_dma - 2*16;
 	fbi->dmadesc_palette_dma = fbi->palette_dma - 1*16;
 
-	#define BYTES_PER_PANEL ((fbi->lccr0 & LCCR0_SDS) == LCCR0_Dual ? \
-                                (var->xres * var->yres * var->bits_per_pixel / 8 / 2) : \
-                                (var->xres * var->yres * var->bits_per_pixel / 8))
+#define BYTES_PER_PANEL (lines_per_panel * fbi->fb.fix.line_length)
 
 	/* populate descriptors */
 	fbi->dmadesc_fblow_cpu->fdadr = fbi->dmadesc_fblow_dma;
@@ -733,8 +739,7 @@
 
 	LCSR = 0xffffffff;	/* Clear LCD Status Register */
 	LCCR0 &= ~LCCR0_LDM;	/* Enable LCD Disable Done Interrupt */
-	//TODO?enable_irq(IRQ_LCD);  /* Enable LCD IRQ */
-	LCCR0 &= ~LCCR0_ENB;	/* Disable LCD Controller */
+	LCCR0 |= LCCR0_DIS;	/* Disable LCD Controller */
 
 	schedule_timeout(20 * HZ / 1000);
 	remove_wait_queue(&fbi->ctrlr_wait, &wait);
@@ -1137,25 +1142,25 @@
 				}
                 } else if (!strncmp(this_opt, "pixclock:", 9)) {
                         inf->pixclock = simple_strtoul(this_opt+9, NULL, 0);
-			dev_info(dev, "override pixclock: %uld\n", inf->pixclock);
+			dev_info(dev, "override pixclock: %u\n", inf->pixclock);
                 } else if (!strncmp(this_opt, "left:", 5)) {
                         inf->left_margin = simple_strtoul(this_opt+5, NULL, 0);
-			dev_info(dev, "override left: %d\n", inf->left_margin);
+			dev_info(dev, "override left: %u\n", inf->left_margin);
                 } else if (!strncmp(this_opt, "right:", 6)) {
                         inf->right_margin = simple_strtoul(this_opt+6, NULL, 0);
-			dev_info(dev, "override right: %d\n", inf->right_margin);
+			dev_info(dev, "override right: %u\n", inf->right_margin);
                 } else if (!strncmp(this_opt, "upper:", 6)) {
                         inf->upper_margin = simple_strtoul(this_opt+6, NULL, 0);
-			dev_info(dev, "override upper: %d\n", inf->upper_margin);
+			dev_info(dev, "override upper: %u\n", inf->upper_margin);
                 } else if (!strncmp(this_opt, "lower:", 6)) {
                         inf->lower_margin = simple_strtoul(this_opt+6, NULL, 0);
-			dev_info(dev, "override lower: %d\n", inf->lower_margin);
+			dev_info(dev, "override lower: %u\n", inf->lower_margin);
                 } else if (!strncmp(this_opt, "hsynclen:", 9)) {
                         inf->hsync_len = simple_strtoul(this_opt+9, NULL, 0);
-			dev_info(dev, "override hsynclen: %d\n", inf->hsync_len);
+			dev_info(dev, "override hsynclen: %u\n", inf->hsync_len);
                 } else if (!strncmp(this_opt, "vsynclen:", 9)) {
                         inf->vsync_len = simple_strtoul(this_opt+9, NULL, 0);
-			dev_info(dev, "override vsynclen: %d\n", inf->vsync_len);
+			dev_info(dev, "override vsynclen: %u\n", inf->vsync_len);
                 } else if (!strncmp(this_opt, "hsync:", 6)) {
                         if ( simple_strtoul(this_opt+6, NULL, 0) == 0 ) {
 				dev_info(dev, "override hsync: Active Low\n");
diff -Nru a/drivers/video/tgafb.c b/drivers/video/tgafb.c
--- a/drivers/video/tgafb.c	2004-05-26 15:01:36 -07:00
+++ b/drivers/video/tgafb.c	2004-05-26 15:01:36 -07:00
@@ -23,6 +23,7 @@
 #include <linux/init.h>
 #include <linux/fb.h>
 #include <linux/pci.h>
+#include <linux/selection.h>
 #include <asm/io.h>
 #include <video/tgafb.h>
 #include <linux/selection.h>
diff -Nru a/fs/befs/linuxvfs.c b/fs/befs/linuxvfs.c
--- a/fs/befs/linuxvfs.c	2004-05-26 15:01:35 -07:00
+++ b/fs/befs/linuxvfs.c	2004-05-26 15:01:35 -07:00
@@ -571,7 +571,7 @@
 		}
 
 		/* convert from Unicode to nls */
-		unilen = nls->uni2char(uni, &result[o], 1);
+		unilen = nls->uni2char(uni, &result[o], in_len - o);
 		if (unilen < 0) {
 			goto conv_err;
 		}
@@ -584,7 +584,7 @@
 	return o;
 
       conv_err:
-	befs_error(sb, "Name using charecter set %s contains a charecter that "
+	befs_error(sb, "Name using character set %s contains a character that "
 		   "cannot be converted to unicode.", nls->charset);
 	befs_debug(sb, "<--- utf2nls()");
 	kfree(result);
diff -Nru a/fs/compat_ioctl.c b/fs/compat_ioctl.c
--- a/fs/compat_ioctl.c	2004-05-26 15:01:36 -07:00
+++ b/fs/compat_ioctl.c	2004-05-26 15:01:36 -07:00
@@ -3088,6 +3088,189 @@
 	return -EINVAL;
 }
 
+#if defined(CONFIG_NCP_FS) || defined(CONFIG_NCP_FS_MODULE)
+struct ncp_ioctl_request_32 {
+	u32 function;
+	u32 size;
+	compat_caddr_t data;
+};
+
+struct ncp_fs_info_v2_32 {
+	s32 version;
+	u32 mounted_uid;
+	u32 connection;
+	u32 buffer_size;
+
+	u32 volume_number;
+	u32 directory_id;
+
+	u32 dummy1;
+	u32 dummy2;
+	u32 dummy3;
+};
+
+struct ncp_objectname_ioctl_32
+{
+	s32		auth_type;
+	u32		object_name_len;
+	compat_caddr_t	object_name;	/* an userspace data, in most cases user name */
+};
+
+struct ncp_privatedata_ioctl_32
+{
+	u32		len;
+	compat_caddr_t	data;		/* ~1000 for NDS */
+};
+
+#define	NCP_IOC_NCPREQUEST_32		_IOR('n', 1, struct ncp_ioctl_request_32)
+#define NCP_IOC_GETMOUNTUID2_32		_IOW('n', 2, u32)
+#define NCP_IOC_GET_FS_INFO_V2_32	_IOWR('n', 4, struct ncp_fs_info_v2_32)
+#define NCP_IOC_GETOBJECTNAME_32	_IOWR('n', 9, struct ncp_objectname_ioctl_32)
+#define NCP_IOC_SETOBJECTNAME_32	_IOR('n', 9, struct ncp_objectname_ioctl_32)
+#define NCP_IOC_GETPRIVATEDATA_32	_IOWR('n', 10, struct ncp_privatedata_ioctl_32)
+#define NCP_IOC_SETPRIVATEDATA_32	_IOR('n', 10, struct ncp_privatedata_ioctl_32)
+
+static int do_ncp_ncprequest(unsigned int fd, unsigned int cmd, unsigned long arg)
+{
+	struct ncp_ioctl_request_32 n32;
+	struct ncp_ioctl_request *p = compat_alloc_user_space(sizeof(*p));
+
+	if (copy_from_user(&n32, compat_ptr(arg), sizeof(n32)) ||
+	    put_user(n32.function, &p->function) ||
+	    put_user(n32.size, &p->size) ||
+	    put_user(compat_ptr(n32.data), &p->data))
+		return -EFAULT;
+
+	return sys_ioctl(fd, NCP_IOC_NCPREQUEST, (unsigned long)p);
+}
+
+static int do_ncp_getmountuid2(unsigned int fd, unsigned int cmd, unsigned long arg)
+{
+	mm_segment_t old_fs = get_fs();
+	__kernel_uid_t kuid;
+	int err;
+
+	cmd = NCP_IOC_GETMOUNTUID2;
+
+	set_fs(KERNEL_DS);
+	err = sys_ioctl(fd, cmd, (unsigned long)&kuid);
+	set_fs(old_fs);
+
+	if (!err)
+		err = put_user(kuid, (unsigned int *)compat_ptr(arg));
+
+	return err;
+}
+
+static int do_ncp_getfsinfo2(unsigned int fd, unsigned int cmd, unsigned long arg)
+{
+	mm_segment_t old_fs = get_fs();
+	struct ncp_fs_info_v2_32 n32;
+	struct ncp_fs_info_v2 n;
+	int err;
+
+	if (copy_from_user(&n32, compat_ptr(arg), sizeof(n32)))
+		return -EFAULT;
+	if (n32.version != NCP_GET_FS_INFO_VERSION_V2)
+		return -EINVAL;
+	n.version = NCP_GET_FS_INFO_VERSION_V2;
+
+	set_fs(KERNEL_DS);
+	err = sys_ioctl(fd, NCP_IOC_GET_FS_INFO_V2, (unsigned long)&n);
+	set_fs(old_fs);
+
+	if (!err) {
+		n32.version = n.version;
+		n32.mounted_uid = n.mounted_uid;
+		n32.connection = n.connection;
+		n32.buffer_size = n.buffer_size;
+		n32.volume_number = n.volume_number;
+		n32.directory_id = n.directory_id;
+		n32.dummy1 = n.dummy1;
+		n32.dummy2 = n.dummy2;
+		n32.dummy3 = n.dummy3;
+		err = copy_to_user(compat_ptr(arg), &n32, sizeof(n32)) ? -EFAULT : 0;
+	}
+	return err;
+}
+
+static int do_ncp_getobjectname(unsigned int fd, unsigned int cmd, unsigned long arg)
+{
+	struct ncp_objectname_ioctl_32 n32, *p32 = compat_ptr(arg);
+	struct ncp_objectname_ioctl *p = compat_alloc_user_space(sizeof(*p));
+	s32 auth_type;
+	u32 name_len;
+	int err;
+
+	if (copy_from_user(&n32, p32, sizeof(n32)) ||
+	    put_user(n32.object_name_len, &p->object_name_len) ||
+	    put_user(compat_ptr(n32.object_name), &p->object_name))
+		return -EFAULT;
+
+	err = sys_ioctl(fd, NCP_IOC_GETOBJECTNAME, (unsigned long)p);
+        if (err)
+		return err;
+
+	if (get_user(auth_type, &p->auth_type) ||
+	    put_user(auth_type, &p32->auth_type) ||
+	    get_user(name_len, &p->object_name_len) ||
+	    put_user(name_len, &p32->object_name_len))
+		return -EFAULT;
+
+	return 0;
+}
+
+static int do_ncp_setobjectname(unsigned int fd, unsigned int cmd, unsigned long arg)
+{
+	struct ncp_objectname_ioctl_32 n32, *p32 = compat_ptr(arg);
+	struct ncp_objectname_ioctl *p = compat_alloc_user_space(sizeof(*p));
+
+	if (copy_from_user(&n32, p32, sizeof(n32)) ||
+	    put_user(n32.auth_type, &p->auth_type) ||
+	    put_user(n32.object_name_len, &p->object_name_len) ||
+	    put_user(compat_ptr(n32.object_name), &p->object_name))
+		return -EFAULT;
+
+	return sys_ioctl(fd, NCP_IOC_SETOBJECTNAME, (unsigned long)p);
+}
+
+static int do_ncp_getprivatedata(unsigned int fd, unsigned int cmd, unsigned long arg)
+{
+	struct ncp_privatedata_ioctl_32 n32, *p32 = compat_ptr(arg);
+	struct ncp_privatedata_ioctl *p = compat_alloc_user_space(sizeof(*p));
+	u32 len;
+	int err;
+
+	if (copy_from_user(&n32, p32, sizeof(n32)) ||
+	    put_user(n32.len, &p->len) ||
+	    put_user(compat_ptr(n32.data), &p->data))
+		return -EFAULT;
+
+	err = sys_ioctl(fd, NCP_IOC_GETPRIVATEDATA, (unsigned long)p);
+        if (err)
+		return err;
+
+	if (get_user(len, &p->len) ||
+	    put_user(len, &p32->len))
+		return -EFAULT;
+
+	return 0;
+}
+
+static int do_ncp_setprivatedata(unsigned int fd, unsigned int cmd, unsigned long arg)
+{
+	struct ncp_privatedata_ioctl_32 n32, *p32 = compat_ptr(arg);
+	struct ncp_privatedata_ioctl *p = compat_alloc_user_space(sizeof(*p));
+
+	if (copy_from_user(&n32, p32, sizeof(n32)) ||
+	    put_user(n32.len, &p->len) ||
+	    put_user(compat_ptr(n32.data), &p->data))
+		return -EFAULT;
+
+	return sys_ioctl(fd, NCP_IOC_SETPRIVATEDATA, (unsigned long)p);
+}
+#endif
+
 #undef CODE
 #endif
 
@@ -3269,6 +3452,16 @@
 HANDLE_IOCTL(SIOCGIWENCODE, do_wireless_ioctl)
 HANDLE_IOCTL(SIOCSIFBR, old_bridge_ioctl)
 HANDLE_IOCTL(SIOCGIFBR, old_bridge_ioctl)
+
+#if defined(CONFIG_NCP_FS) || defined(CONFIG_NCP_FS_MODULE)
+HANDLE_IOCTL(NCP_IOC_NCPREQUEST_32, do_ncp_ncprequest)
+HANDLE_IOCTL(NCP_IOC_GETMOUNTUID2_32, do_ncp_getmountuid2)
+HANDLE_IOCTL(NCP_IOC_GET_FS_INFO_V2_32, do_ncp_getfsinfo2)
+HANDLE_IOCTL(NCP_IOC_GETOBJECTNAME_32, do_ncp_getobjectname)
+HANDLE_IOCTL(NCP_IOC_SETOBJECTNAME_32, do_ncp_setobjectname)
+HANDLE_IOCTL(NCP_IOC_GETPRIVATEDATA_32, do_ncp_getprivatedata)
+HANDLE_IOCTL(NCP_IOC_SETPRIVATEDATA_32, do_ncp_setprivatedata)
+#endif
 
 #undef DECLARES
 #endif
diff -Nru a/fs/eventpoll.c b/fs/eventpoll.c
--- a/fs/eventpoll.c	2004-05-26 15:01:35 -07:00
+++ b/fs/eventpoll.c	2004-05-26 15:01:35 -07:00
@@ -148,14 +148,6 @@
 #define EP_ITEM_FROM_EPQUEUE(p) (container_of(p, struct ep_pqueue, pt)->epi)
 
 /*
- * This is used to optimize the event transfer to userspace. Since this
- * is kept on stack, it should be pretty small.
- */
-#define EP_MAX_BUF_EVENTS 32
-
-
-
-/*
  * Node that is linked into the "wake_task_list" member of the "struct poll_safewake".
  * It is used to keep track on all tasks that are currently inside the wake_up() code
  * to 1) short-circuit the one coming from the same task and same wait queue head
@@ -1430,11 +1422,10 @@
 static int ep_send_events(struct eventpoll *ep, struct list_head *txlist,
 			  struct epoll_event __user *events)
 {
-	int eventcnt = 0, eventbuf = 0;
+	int eventcnt = 0;
 	unsigned int revents;
 	struct list_head *lnk;
 	struct epitem *epi;
-	struct epoll_event event[EP_MAX_BUF_EVENTS];
 
 	/*
 	 * We can loop without lock because this is a task private list.
@@ -1460,28 +1451,17 @@
 		epi->revents = revents & epi->event.events;
 
 		if (epi->revents) {
-			event[eventbuf] = epi->event;
-			event[eventbuf].events &= revents;
-			eventbuf++;
-			if (eventbuf == EP_MAX_BUF_EVENTS) {
-				if (__copy_to_user(&events[eventcnt], event,
-						   eventbuf * sizeof(struct epoll_event)))
-					return -EFAULT;
-				eventcnt += eventbuf;
-				eventbuf = 0;
-			}
+			if (__put_user(epi->event.events,
+					&events[eventcnt].events))
+				return -EFAULT;
+			if (__put_user(epi->event.data,
+					&events[eventcnt].data))
+				return -EFAULT;
 			if (epi->event.events & EPOLLONESHOT)
 				epi->event.events &= EP_PRIVATE_BITS;
+			eventcnt++;
 		}
 	}
-
-	if (eventbuf) {
-		if (__copy_to_user(&events[eventcnt], event,
-				   eventbuf * sizeof(struct epoll_event)))
-			return -EFAULT;
-		eventcnt += eventbuf;
-	}
-
 	return eventcnt;
 }
 
diff -Nru a/fs/ext2/ialloc.c b/fs/ext2/ialloc.c
--- a/fs/ext2/ialloc.c	2004-05-26 15:01:36 -07:00
+++ b/fs/ext2/ialloc.c	2004-05-26 15:01:36 -07:00
@@ -663,7 +663,7 @@
 	}
 	brelse(bitmap_bh);
 	printk("ext2_count_free_inodes: stored = %lu, computed = %lu, %lu\n",
-		percpu_counter_read(EXT2_SB(sb)->s_freeinodes_counter),
+		percpu_counter_read(&EXT2_SB(sb)->s_freeinodes_counter),
 		desc_count, bitmap_count);
 	unlock_super(sb);
 	return desc_count;
@@ -724,7 +724,7 @@
 		bitmap_count += x;
 	}
 	brelse(bitmap_bh);
-	if (percpu_counter_read(EXT2_SB(sb)->s_freeinodes_counter) !=
+	if (percpu_counter_read(&EXT2_SB(sb)->s_freeinodes_counter) !=
 				bitmap_count)
 		ext2_error(sb, "ext2_check_inodes_bitmap",
 			    "Wrong free inodes count in super block, "
diff -Nru a/fs/ext3/inode.c b/fs/ext3/inode.c
--- a/fs/ext3/inode.c	2004-05-26 15:01:36 -07:00
+++ b/fs/ext3/inode.c	2004-05-26 15:01:36 -07:00
@@ -205,8 +205,6 @@
 		 * need to make sure that the in-core orphan linked list
 		 * is properly cleaned up. */
 		ext3_orphan_del(NULL, inode);
-
-		ext3_std_error(inode->i_sb, PTR_ERR(handle));
 		goto no_delete;
 	}
 
diff -Nru a/fs/fat/file.c b/fs/fat/file.c
--- a/fs/fat/file.c	2004-05-26 15:01:35 -07:00
+++ b/fs/fat/file.c	2004-05-26 15:01:35 -07:00
@@ -47,7 +47,8 @@
 	if (!create)
 		return 0;
 	if (iblock != MSDOS_I(inode)->mmu_private >> sb->s_blocksize_bits) {
-		BUG();
+		fat_fs_panic(sb, "corrupted file size (i_pos %lld, %lld)",
+			     MSDOS_I(inode)->i_pos, MSDOS_I(inode)->mmu_private);
 		return -EIO;
 	}
 	if (!((unsigned long)iblock & (MSDOS_SB(sb)->sec_per_clus - 1))) {
diff -Nru a/fs/fat/inode.c b/fs/fat/inode.c
--- a/fs/fat/inode.c	2004-05-26 15:01:35 -07:00
+++ b/fs/fat/inode.c	2004-05-26 15:01:35 -07:00
@@ -1245,7 +1245,7 @@
 	lock_kernel();
 	if (!(bh = sb_bread(sb, i_pos >> MSDOS_SB(sb)->dir_per_block_bits))) {
 		printk(KERN_ERR "FAT: unable to read inode block "
-		       "for updating (i_pos %lld)", i_pos);
+		       "for updating (i_pos %lld)\n", i_pos);
 		unlock_kernel();
 		return /* -EIO */;
 	}
diff -Nru a/fs/hfs/catalog.c b/fs/hfs/catalog.c
--- a/fs/hfs/catalog.c	2004-05-26 15:01:36 -07:00
+++ b/fs/hfs/catalog.c	2004-05-26 15:01:36 -07:00
@@ -101,11 +101,11 @@
 	if (err != -ENOENT) {
 		if (!err)
 			err = -EEXIST;
-		goto out;
+		goto err2;
 	}
 	err = hfs_brec_insert(&fd, &entry, entry_size);
 	if (err)
-		goto out;
+		goto err2;
 
 	hfs_cat_build_key(fd.search_key, dir->i_ino, str);
 	entry_size = hfs_cat_build_record(&entry, cnid, inode);
@@ -114,16 +114,24 @@
 		/* panic? */
 		if (!err)
 			err = -EEXIST;
-		goto out;
+		goto err1;
 	}
 	err = hfs_brec_insert(&fd, &entry, entry_size);
-	if (!err) {
-		dir->i_size++;
-		mark_inode_dirty(dir);
-	}
-out:
+	if (err)
+		goto err1;
+
+	dir->i_size++;
+	dir->i_mtime = dir->i_ctime = CURRENT_TIME;
+	mark_inode_dirty(dir);
 	hfs_find_exit(&fd);
+	return 0;
 
+err1:
+	hfs_cat_build_key(fd.search_key, cnid, NULL);
+	if (!hfs_brec_find(&fd))
+		hfs_brec_remove(&fd);
+err2:
+	hfs_find_exit(&fd);
 	return err;
 }
 
@@ -240,6 +248,7 @@
 	}
 
 	dir->i_size--;
+	dir->i_mtime = dir->i_ctime = CURRENT_TIME;
 	mark_inode_dirty(dir);
 	res = 0;
 out:
@@ -292,6 +301,7 @@
 	if (err)
 		goto out;
 	dst_dir->i_size++;
+	dst_dir->i_mtime = dst_dir->i_ctime = CURRENT_TIME;
 	mark_inode_dirty(dst_dir);
 
 	/* finally remove the old entry */
@@ -303,6 +313,7 @@
 	if (err)
 		goto out;
 	src_dir->i_size--;
+	src_dir->i_mtime = src_dir->i_ctime = CURRENT_TIME;
 	mark_inode_dirty(src_dir);
 
 	type = entry.type;
diff -Nru a/fs/hfs/inode.c b/fs/hfs/inode.c
--- a/fs/hfs/inode.c	2004-05-26 15:01:36 -07:00
+++ b/fs/hfs/inode.c	2004-05-26 15:01:36 -07:00
@@ -96,7 +96,7 @@
 			}
 			hfs_bnode_unhash(node);
 			hfs_bnode_free(node);
-		} while (--i);
+		} while (--i && nidx < tree->node_count);
 		spin_unlock(&tree->hash_lock);
 	}
 	//printk("releasepage: %lu,%x = %d\n", page->index, mask, res);
diff -Nru a/fs/hfsplus/brec.c b/fs/hfsplus/brec.c
--- a/fs/hfsplus/brec.c	2004-05-26 15:01:36 -07:00
+++ b/fs/hfsplus/brec.c	2004-05-26 15:01:36 -07:00
@@ -33,7 +33,7 @@
 
 	if ((node->type == HFS_NODE_INDEX) &&
 	   !(node->tree->attributes & HFS_TREE_VARIDXKEYS)) {
-		retval = node->tree->max_key_len;
+		retval = node->tree->max_key_len + 2;
 	} else {
 		recoff = hfs_bnode_read_u16(node, node->tree->node_size - (rec + 1) * 2);
 		if (!recoff)
@@ -144,7 +144,7 @@
 		if (tree->attributes & HFS_TREE_VARIDXKEYS)
 			key_len = be16_to_cpu(fd->search_key->key_len) + 2;
 		else {
-			fd->search_key->key_len = tree->max_key_len;
+			fd->search_key->key_len = cpu_to_be16(tree->max_key_len);
 			key_len = tree->max_key_len + 2;
 		}
 		goto again;
diff -Nru a/fs/hfsplus/catalog.c b/fs/hfsplus/catalog.c
--- a/fs/hfsplus/catalog.c	2004-05-26 15:01:36 -07:00
+++ b/fs/hfsplus/catalog.c	2004-05-26 15:01:36 -07:00
@@ -165,11 +165,11 @@
 	if (err != -ENOENT) {
 		if (!err)
 			err = -EEXIST;
-		goto out;
+		goto err2;
 	}
 	err = hfs_brec_insert(&fd, &entry, entry_size);
 	if (err)
-		goto out;
+		goto err2;
 
 	hfsplus_cat_build_key(fd.search_key, dir->i_ino, str);
 	entry_size = hfsplus_cat_build_record(&entry, cnid, inode);
@@ -178,16 +178,24 @@
 		/* panic? */
 		if (!err)
 			err = -EEXIST;
-		goto out;
+		goto err1;
 	}
 	err = hfs_brec_insert(&fd, &entry, entry_size);
-	if (!err) {
-		dir->i_size++;
-		mark_inode_dirty(dir);
-	}
-out:
+	if (err)
+		goto err1;
+
+	dir->i_size++;
+	dir->i_mtime = dir->i_ctime = CURRENT_TIME;
+	mark_inode_dirty(dir);
 	hfs_find_exit(&fd);
+	return 0;
 
+err1:
+	hfsplus_cat_build_key(fd.search_key, cnid, NULL);
+	if (!hfs_brec_find(&fd))
+		hfs_brec_remove(&fd);
+err2:
+	hfs_find_exit(&fd);
 	return err;
 }
 
@@ -259,6 +267,7 @@
 		goto out;
 
 	dir->i_size--;
+	dir->i_mtime = dir->i_ctime = CURRENT_TIME;
 	mark_inode_dirty(dir);
 out:
 	hfs_find_exit(&fd);
@@ -304,6 +313,7 @@
 	if (err)
 		goto out;
 	dst_dir->i_size++;
+	dst_dir->i_mtime = dst_dir->i_ctime = CURRENT_TIME;
 	mark_inode_dirty(dst_dir);
 
 	/* finally remove the old entry */
@@ -315,6 +325,7 @@
 	if (err)
 		goto out;
 	src_dir->i_size--;
+	src_dir->i_mtime = src_dir->i_ctime = CURRENT_TIME;
 	mark_inode_dirty(src_dir);
 
 	/* remove old thread entry */
diff -Nru a/fs/hfsplus/dir.c b/fs/hfsplus/dir.c
--- a/fs/hfsplus/dir.c	2004-05-26 15:01:35 -07:00
+++ b/fs/hfsplus/dir.c	2004-05-26 15:01:35 -07:00
@@ -18,6 +18,13 @@
 #include "hfsplus_fs.h"
 #include "hfsplus_raw.h"
 
+static inline void hfsplus_instantiate(struct dentry *dentry,
+				       struct inode *inode, u32 cnid)
+{
+	dentry->d_fsdata = (void *)(unsigned long)cnid;
+	d_instantiate(dentry, inode);
+}
+
 /* Find the entry inside dir named dentry->d_name */
 static struct dentry *hfsplus_lookup(struct inode *dir, struct dentry *dentry,
 				     struct nameidata *nd)
@@ -52,6 +59,7 @@
 			goto fail;
 		}
 		cnid = be32_to_cpu(entry.folder.id);
+		dentry->d_fsdata = (void *)(unsigned long)cnid;
 	} else if (type == HFSPLUS_FILE) {
 		if (fd.entrylength < sizeof(struct hfsplus_cat_file)) {
 			err = -EIO;
@@ -233,11 +241,11 @@
 	res = hfsplus_create_cat(inode->i_ino, dir, &dentry->d_name, inode);
 	if (res) {
 		inode->i_nlink = 0;
+		hfsplus_delete_inode(inode);
 		iput(inode);
 		return res;
 	}
-	dentry->d_fsdata = (void *)inode->i_ino;
-	d_instantiate(dentry, inode);
+	hfsplus_instantiate(dentry, inode, inode->i_ino);
 	mark_inode_dirty(inode);
 	return 0;
 }
@@ -284,8 +292,7 @@
 		return res;
 
 	inode->i_nlink++;
-	dst_dentry->d_fsdata = (void *)(unsigned long)cnid;
-	d_instantiate(dst_dentry, inode);
+	hfsplus_instantiate(dst_dentry, inode, cnid);
 	atomic_inc(&inode->i_count);
 	inode->i_ctime = CURRENT_TIME;
 	mark_inode_dirty(inode);
@@ -351,10 +358,11 @@
 	res = hfsplus_create_cat(inode->i_ino, dir, &dentry->d_name, inode);
 	if (res) {
 		inode->i_nlink = 0;
+		hfsplus_delete_inode(inode);
 		iput(inode);
 		return res;
 	}
-	d_instantiate(dentry, inode);
+	hfsplus_instantiate(dentry, inode, inode->i_ino);
 	mark_inode_dirty(inode);
 	return 0;
 }
@@ -391,7 +399,8 @@
 	res = page_symlink(inode, symname, strlen(symname) + 1);
 	if (res) {
 		inode->i_nlink = 0;
-		iput (inode);
+		hfsplus_delete_inode(inode);
+		iput(inode);
 		return res;
 	}
 
@@ -399,8 +408,7 @@
 	res = hfsplus_create_cat(inode->i_ino, dir, &dentry->d_name, inode);
 
 	if (!res) {
-		dentry->d_fsdata = (void *)inode->i_ino;
-		d_instantiate(dentry, inode);
+		hfsplus_instantiate(dentry, inode, inode->i_ino);
 		mark_inode_dirty(inode);
 	}
 
@@ -421,12 +429,12 @@
 	res = hfsplus_create_cat(inode->i_ino, dir, &dentry->d_name, inode);
 	if (res) {
 		inode->i_nlink = 0;
+		hfsplus_delete_inode(inode);
 		iput(inode);
 		return res;
 	}
 	init_special_inode(inode, mode, rdev);
-	dentry->d_fsdata = (void *)inode->i_ino;
-	d_instantiate(dentry, inode);
+	hfsplus_instantiate(dentry, inode, inode->i_ino);
 	mark_inode_dirty(inode);
 
 	return 0;
diff -Nru a/fs/hfsplus/inode.c b/fs/hfsplus/inode.c
--- a/fs/hfsplus/inode.c	2004-05-26 15:01:35 -07:00
+++ b/fs/hfsplus/inode.c	2004-05-26 15:01:35 -07:00
@@ -96,7 +96,7 @@
 			}
 			hfs_bnode_unhash(node);
 			hfs_bnode_free(node);
-		} while (--i);
+		} while (--i && nidx < tree->node_count);
 		spin_unlock(&tree->hash_lock);
 	}
 	//printk("releasepage: %lu,%x = %d\n", page->index, mask, res);
diff -Nru a/fs/isofs/inode.c b/fs/isofs/inode.c
--- a/fs/isofs/inode.c	2004-05-26 15:01:36 -07:00
+++ b/fs/isofs/inode.c	2004-05-26 15:01:36 -07:00
@@ -1207,7 +1207,7 @@
 	struct iso_directory_record * tmpde = NULL;
 	unsigned int de_len;
 	unsigned long offset;
-	int volume_seq_no, i;
+	int i;
 	struct iso_inode_info *ei = ISOFS_I(inode);
 
 	bh = sb_bread(inode->i_sb, block);
@@ -1347,9 +1347,6 @@
 		test_and_set_uid(&inode->i_uid, sbi->s_uid);
 		test_and_set_gid(&inode->i_gid, sbi->s_gid);
 	}
-
-	/* get the volume sequence number */
-	volume_seq_no = isonum_723 (de->volume_sequence_number) ;
 
 	/* Install the inode operations vector */
 	if (S_ISREG(inode->i_mode)) {
diff -Nru a/fs/nfsd/nfs4idmap.c b/fs/nfsd/nfs4idmap.c
--- a/fs/nfsd/nfs4idmap.c	2004-05-26 15:01:36 -07:00
+++ b/fs/nfsd/nfs4idmap.c	2004-05-26 15:01:36 -07:00
@@ -175,6 +175,14 @@
 	return 0;
 }
 
+static void
+warn_no_idmapd(struct cache_detail *detail)
+{
+	printk("nfsd: nfsv4 idmapping failing: has idmapd %s?\n",
+			detail->last_close? "died" : "not been started");
+}
+
+
 static int         idtoname_parse(struct cache_detail *, char *, int);
 static struct ent *idtoname_lookup(struct ent *, int);
 
@@ -186,6 +194,7 @@
 	.cache_request	= idtoname_request,
 	.cache_parse	= idtoname_parse,
 	.cache_show	= idtoname_show,
+	.warn_no_listener = warn_no_idmapd,
 };
 
 int
@@ -318,6 +327,7 @@
 	.cache_request	= nametoid_request,
 	.cache_parse	= nametoid_parse,
 	.cache_show	= nametoid_show,
+	.warn_no_listener = warn_no_idmapd,
 };
 
 int
diff -Nru a/fs/proc/array.c b/fs/proc/array.c
--- a/fs/proc/array.c	2004-05-26 15:01:36 -07:00
+++ b/fs/proc/array.c	2004-05-26 15:01:36 -07:00
@@ -149,6 +149,7 @@
 
 static inline char * task_state(struct task_struct *p, char *buffer)
 {
+	struct group_info *group_info;
 	int g;
 
 	read_lock(&tasklist_lock);
@@ -174,12 +175,14 @@
 		"FDSize:\t%d\n"
 		"Groups:\t",
 		p->files ? p->files->max_fds : 0);
+
+	group_info = p->group_info;
+	get_group_info(group_info);
 	task_unlock(p);
 
-	get_group_info(p->group_info);
-	for (g = 0; g < min(p->group_info->ngroups,NGROUPS_SMALL); g++)
-		buffer += sprintf(buffer, "%d ", GROUP_AT(p->group_info,g));
-	put_group_info(p->group_info);
+	for (g = 0; g < min(group_info->ngroups,NGROUPS_SMALL); g++)
+		buffer += sprintf(buffer, "%d ", GROUP_AT(group_info,g));
+	put_group_info(group_info);
 
 	buffer += sprintf(buffer, "\n");
 	return buffer;
diff -Nru a/fs/reiserfs/xattr.c b/fs/reiserfs/xattr.c
--- a/fs/reiserfs/xattr.c	2004-05-26 15:01:36 -07:00
+++ b/fs/reiserfs/xattr.c	2004-05-26 15:01:36 -07:00
@@ -1370,13 +1370,15 @@
 		if (!(mode & S_IRWXG))
 			goto check_groups;
 
-                reiserfs_read_lock_xattr_i (inode);
-                if (need_lock)
+                if (need_lock) {
+		    reiserfs_read_lock_xattr_i (inode);
                     reiserfs_read_lock_xattrs (inode->i_sb);
+		}
                 acl = reiserfs_get_acl (inode, ACL_TYPE_ACCESS);
-                if (need_lock)
+                if (need_lock) {
                     reiserfs_read_unlock_xattrs (inode->i_sb);
-                reiserfs_read_unlock_xattr_i (inode);
+		    reiserfs_read_unlock_xattr_i (inode);
+		}
                 if (IS_ERR (acl)) {
                     if (PTR_ERR (acl) == -ENODATA)
                         goto check_groups;
diff -Nru a/fs/udf/namei.c b/fs/udf/namei.c
--- a/fs/udf/namei.c	2004-05-26 15:01:36 -07:00
+++ b/fs/udf/namei.c	2004-05-26 15:01:36 -07:00
@@ -154,8 +154,8 @@
 {
 	struct fileIdentDesc *fi=NULL;
 	loff_t f_pos;
-	int block, namelen;
-	char name[UDF_NAME_LEN], fname[UDF_NAME_LEN];
+	int block, flen;
+	char fname[UDF_NAME_LEN];
 	char *nameptr;
 	uint8_t lfi;
 	uint16_t liu;
@@ -167,9 +167,6 @@
 	if (!dir)
 		return NULL;
 
-	if ( !(namelen = udf_put_filename(dir->i_sb, dentry->d_name.name, name, dentry->d_name.len)))
-		return NULL;
-
 	f_pos = (udf_ext0_offset(dir) >> 2);
 
 	fibh->soffset = fibh->eoffset = (f_pos & ((dir->i_sb->s_blocksize - 1) >> 2)) << 2;
@@ -253,10 +250,13 @@
 		if (!lfi)
 			continue;
 
-		if (udf_match(namelen, name, lfi, nameptr))
+		if ((flen = udf_get_filename(dir->i_sb, nameptr, fname, lfi)))
 		{
-			udf_release_data(bh);
-			return fi;
+			if (udf_match(flen, fname, dentry->d_name.len, dentry->d_name.name))
+			{
+				udf_release_data(bh);
+				return fi;
+			}
 		}
 	}
 	if (fibh->sbh != fibh->ebh)
@@ -353,6 +353,7 @@
 	char name[UDF_NAME_LEN], fname[UDF_NAME_LEN];
 	int namelen;
 	loff_t f_pos;
+	int flen;
 	char *nameptr;
 	loff_t size = (udf_ext0_offset(dir) + dir->i_size) >> 2;
 	int nfidlen;
@@ -480,7 +481,8 @@
 		if (!lfi || !dentry)
 			continue;
 
-		if (udf_match(namelen, name, lfi, nameptr))
+		if ((flen = udf_get_filename(dir->i_sb, nameptr, fname, lfi)) &&
+			udf_match(flen, fname, dentry->d_name.len, dentry->d_name.name))
 		{
 			if (fibh->sbh != fibh->ebh)
 				udf_release_data(fibh->ebh);
diff -Nru a/include/asm-arm/arch-ixp4xx/uncompress.h b/include/asm-arm/arch-ixp4xx/uncompress.h
--- a/include/asm-arm/arch-ixp4xx/uncompress.h	2004-05-26 15:01:35 -07:00
+++ b/include/asm-arm/arch-ixp4xx/uncompress.h	2004-05-26 15:01:35 -07:00
@@ -48,7 +48,7 @@
 	/*
 	 * Coyote only has UART2 connected
 	 */
-	if (__machine_arch_type == MACH_TYPE_ADI_COYOTE)
+	if (machine_is_adi_coyote())
 		uart_base = (volatile u32*) IXP4XX_UART2_BASE_PHYS;
 	else
 		uart_base = (volatile u32*) IXP4XX_UART1_BASE_PHYS;
diff -Nru a/include/asm-arm/arch-lh7a40x/hardware.h b/include/asm-arm/arch-lh7a40x/hardware.h
--- a/include/asm-arm/arch-lh7a40x/hardware.h	2004-05-26 15:01:35 -07:00
+++ b/include/asm-arm/arch-lh7a40x/hardware.h	2004-05-26 15:01:35 -07:00
@@ -13,8 +13,6 @@
 #ifndef __ASM_ARCH_HARDWARE_H
 #define __ASM_ARCH_HARDWARE_H
 
-#include <asm/mach-types.h>
-
 #define io_p2v(x) (0xf0000000 | (((x) & 0xfff00000) >> 4) | ((x) & 0x0000ffff))
 #define io_v2p(x) (             (((x) & 0x0fff0000) << 4) | ((x) & 0x0000ffff))
 
diff -Nru a/include/asm-arm/arch-omap/hardware.h b/include/asm-arm/arch-omap/hardware.h
--- a/include/asm-arm/arch-omap/hardware.h	2004-05-26 15:01:35 -07:00
+++ b/include/asm-arm/arch-omap/hardware.h	2004-05-26 15:01:35 -07:00
@@ -40,7 +40,6 @@
 #ifndef __ASSEMBLER__
 #include <asm/types.h>
 #endif
-#include <asm/mach-types.h>
 
 /*
  * ----------------------------------------------------------------------------
diff -Nru a/include/asm-arm/arch-omap/uncompress.h b/include/asm-arm/arch-omap/uncompress.h
--- a/include/asm-arm/arch-omap/uncompress.h	2004-05-26 15:01:36 -07:00
+++ b/include/asm-arm/arch-omap/uncompress.h	2004-05-26 15:01:36 -07:00
@@ -20,7 +20,6 @@
 #include <linux/config.h>
 #include <linux/types.h>
 #include <linux/serial_reg.h>
-#include <asm/mach-types.h>
 #include <asm/hardware.h>
 #include <asm/arch/serial.h>
 
diff -Nru a/include/asm-arm/arch-pxa/hardware.h b/include/asm-arm/arch-pxa/hardware.h
--- a/include/asm-arm/arch-pxa/hardware.h	2004-05-26 15:01:35 -07:00
+++ b/include/asm-arm/arch-pxa/hardware.h	2004-05-26 15:01:35 -07:00
@@ -13,9 +13,6 @@
 #ifndef __ASM_ARCH_HARDWARE_H
 #define __ASM_ARCH_HARDWARE_H
 
-#include <asm/mach-types.h>
-
-
 /*
  * We requires absolute addresses.
  */
diff -Nru a/include/asm-arm/arch-pxa/lubbock.h b/include/asm-arm/arch-pxa/lubbock.h
--- a/include/asm-arm/arch-pxa/lubbock.h	2004-05-26 15:01:35 -07:00
+++ b/include/asm-arm/arch-pxa/lubbock.h	2004-05-26 15:01:35 -07:00
@@ -35,3 +35,6 @@
 #define LUB_IRQ_SET_CLR		__LUB_REG(LUBBOCK_FPGA_PHYS + 0x0d0)
 #define LUB_GP			__LUB_REG(LUBBOCK_FPGA_PHYS + 0x100)
 
+#ifndef __ASSEMBLY__
+extern void lubbock_set_misc_wr(unsigned int mask, unsigned int set);
+#endif
diff -Nru a/include/asm-arm/hardware/sa1111.h b/include/asm-arm/hardware/sa1111.h
--- a/include/asm-arm/hardware/sa1111.h	2004-05-26 15:01:36 -07:00
+++ b/include/asm-arm/hardware/sa1111.h	2004-05-26 15:01:36 -07:00
@@ -405,22 +405,6 @@
 #define GPIO_C6		(1 << 22)
 #define GPIO_C7		(1 << 23)
 
-#define PA_DDR		__CCREG(0x1000)
-#define PA_DRR		__CCREG(0x1004)
-#define PA_DWR		__CCREG(0x1004)
-#define PA_SDR		__CCREG(0x1008)
-#define PA_SSR		__CCREG(0x100c)
-#define PB_DDR		__CCREG(0x1010)
-#define PB_DRR		__CCREG(0x1014)
-#define PB_DWR		__CCREG(0x1014)
-#define PB_SDR		__CCREG(0x1018)
-#define PB_SSR		__CCREG(0x101c)
-#define PC_DDR		__CCREG(0x1020)
-#define PC_DRR		__CCREG(0x1024)
-#define PC_DWR		__CCREG(0x1024)
-#define PC_SDR		__CCREG(0x1028)
-#define PC_SSR		__CCREG(0x102c)
-
 /*
  * Interrupt Controller
  *
diff -Nru a/include/asm-arm/system.h b/include/asm-arm/system.h
--- a/include/asm-arm/system.h	2004-05-26 15:01:35 -07:00
+++ b/include/asm-arm/system.h	2004-05-26 15:01:35 -07:00
@@ -137,22 +137,48 @@
 #define set_wmb(var, value) do { var = value; wmb(); } while (0)
 #define nop() __asm__ __volatile__("mov\tr0,r0\t@ nop\n\t");
 
-#define prepare_to_switch()    do { } while(0)
+#ifdef CONFIG_SMP
+/*
+ * Define our own context switch locking.  This allows us to enable
+ * interrupts over the context switch, otherwise we end up with high
+ * interrupt latency.  The real problem area is switch_mm() which may
+ * do a full cache flush.
+ */
+#define prepare_arch_switch(rq,next)					\
+do {									\
+	spin_lock(&(next)->switch_lock);				\
+	spin_unlock_irq(&(rq)->lock);					\
+} while (0)
+
+#define finish_arch_switch(rq,prev)					\
+	spin_unlock(&(prev)->switch_lock)
+
+#define task_running(rq,p)						\
+	((rq)->curr == (p) || spin_is_locked(&(p)->switch_lock))
+#else
+/*
+ * Our UP-case is more simple, but we assume knowledge of how
+ * spin_unlock_irq() and friends are implemented.  This avoids
+ * us needlessly decrementing and incrementing the preempt count.
+ */
+#define prepare_arch_switch(rq,next)	local_irq_enable()
+#define finish_arch_switch(rq,prev)	spin_unlock(&(rq)->lock)
+#define task_running(rq,p)		((rq)->curr == (p))
+#endif
 
 /*
  * switch_to(prev, next) should switch from task `prev' to `next'
- * `prev' will never be the same as `next'.
- * The `mb' is to tell GCC not to cache `current' across this call.
+ * `prev' will never be the same as `next'.  schedule() itself
+ * contains the memory barrier to tell GCC not to cache `current'.
  */
 struct thread_info;
 struct task_struct;
 extern struct task_struct *__switch_to(struct task_struct *, struct thread_info *, struct thread_info *);
 
-#define switch_to(prev,next,last)						\
-	do {									\
-		last = __switch_to(prev,prev->thread_info,next->thread_info);	\
-		mb();								\
-	} while (0)
+#define switch_to(prev,next,last)					\
+do {									\
+	last = __switch_to(prev,prev->thread_info,next->thread_info);	\
+} while (0)
 
 /*
  * CPU interrupt mask handling.
diff -Nru a/include/asm-arm/unistd.h b/include/asm-arm/unistd.h
--- a/include/asm-arm/unistd.h	2004-05-26 15:01:36 -07:00
+++ b/include/asm-arm/unistd.h	2004-05-26 15:01:36 -07:00
@@ -454,6 +454,7 @@
 #define __ARCH_WANT_STAT64
 #define __ARCH_WANT_SYS_ALARM
 #define __ARCH_WANT_SYS_GETHOSTNAME
+#define __ARCH_WANT_SYS_PAUSE
 #define __ARCH_WANT_SYS_TIME
 #define __ARCH_WANT_SYS_UTIME
 #define __ARCH_WANT_SYS_SOCKETCALL
diff -Nru a/include/asm-generic/pgtable.h b/include/asm-generic/pgtable.h
--- a/include/asm-generic/pgtable.h	2004-05-26 15:01:35 -07:00
+++ b/include/asm-generic/pgtable.h	2004-05-26 15:01:35 -07:00
@@ -2,6 +2,11 @@
 #define _ASM_GENERIC_PGTABLE_H
 
 #ifndef __HAVE_ARCH_PTEP_ESTABLISH
+
+#ifndef ptep_update_dirty_accessed
+#define ptep_update_dirty_accessed(__ptep, __entry, __dirty) set_pte(__ptep, __entry)
+#endif
+
 /*
  * Establish a new mapping:
  *  - flush the old one
@@ -10,9 +15,9 @@
  *
  * We hold the mm semaphore for reading and vma->vm_mm->page_table_lock
  */
-#define ptep_establish(__vma, __address, __ptep, __entry)		\
+#define ptep_establish(__vma, __address, __ptep, __entry, __dirty)	\
 do {									\
-	set_pte(__ptep, __entry);					\
+	ptep_update_dirty_accessed(__ptep, __entry, __dirty);		\
 	flush_tlb_page(__vma, __address);				\
 } while (0)
 #endif
diff -Nru a/include/asm-h8300/module.h b/include/asm-h8300/module.h
--- a/include/asm-h8300/module.h	2004-05-26 15:01:35 -07:00
+++ b/include/asm-h8300/module.h	2004-05-26 15:01:35 -07:00
@@ -8,4 +8,6 @@
 #define Elf_Sym Elf32_Sym
 #define Elf_Ehdr Elf32_Ehdr
 
+#define MODULE_SYMBOL_PREFIX "_"
+
 #endif /* _ASM_H8/300_MODULE_H */
diff -Nru a/include/asm-i386/dma-mapping.h b/include/asm-i386/dma-mapping.h
--- a/include/asm-i386/dma-mapping.h	2004-05-26 15:01:36 -07:00
+++ b/include/asm-i386/dma-mapping.h	2004-05-26 15:01:36 -07:00
@@ -2,6 +2,8 @@
 #define _ASM_I386_DMA_MAPPING_H
 
 #include <asm/cache.h>
+#include <asm/io.h>
+#include <asm/scatterlist.h>
 
 #define dma_alloc_noncoherent(d, s, h, f) dma_alloc_coherent(d, s, h, f)
 #define dma_free_noncoherent(d, s, v, h) dma_free_coherent(d, s, v, h)
diff -Nru a/include/asm-i386/hw_irq.h b/include/asm-i386/hw_irq.h
--- a/include/asm-i386/hw_irq.h	2004-05-26 15:01:36 -07:00
+++ b/include/asm-i386/hw_irq.h	2004-05-26 15:01:36 -07:00
@@ -59,7 +59,7 @@
 void print_IO_APIC(void);
 int IO_APIC_get_PCI_irq_vector(int bus, int slot, int fn);
 void send_IPI(int dest, int vector);
-void setup_ioapic_dest(cpumask_t mask);
+void setup_ioapic_dest(void);
 
 extern unsigned long io_apic_irqs;
 
diff -Nru a/include/asm-i386/mach-bigsmp/mach_apic.h b/include/asm-i386/mach-bigsmp/mach_apic.h
--- a/include/asm-i386/mach-bigsmp/mach_apic.h	2004-05-26 15:01:36 -07:00
+++ b/include/asm-i386/mach-bigsmp/mach_apic.h	2004-05-26 15:01:36 -07:00
@@ -22,13 +22,21 @@
 }
 
 #define APIC_DFR_VALUE	(APIC_DFR_CLUSTER)
+/* Round robin the irqs amoung the online cpus */
 static inline cpumask_t target_cpus(void)
 { 
-	return cpu_online_map;
+	static unsigned long cpu = NR_CPUS;
+	do {
+		if (cpu >= NR_CPUS)
+			cpu = first_cpu_const(cpu_online_map);
+		else
+			cpu = next_cpu_const(cpu, cpu_online_map);
+	} while (cpu >= NR_CPUS);
+	return mk_cpumask_const(cpumask_of_cpu(cpu));
 }
 #define TARGET_CPUS	(target_cpus())
 
-#define INT_DELIVERY_MODE dest_LowestPrio
+#define INT_DELIVERY_MODE dest_Fixed
 #define INT_DEST_MODE 1     /* logical delivery broadcast to all procs */
 
 #define APIC_BROADCAST_ID     (0xff)
@@ -141,36 +149,14 @@
 	return (1);
 }
 
+/* As we are using single CPU as destination, pick only one CPU here */
 static inline unsigned int cpu_mask_to_apicid(cpumask_const_t cpumask)
 {
-	int num_bits_set;
-	int cpus_found = 0;
 	int cpu;
 	int apicid;	
 
-	num_bits_set = cpus_weight_const(cpumask);
-	/* Return id to all */
-	if (num_bits_set == NR_CPUS)
-		return (int) 0xFF;
-	/* 
-	 * The cpus in the mask must all be on the apic cluster.  If are not 
-	 * on the same apicid cluster return default value of TARGET_CPUS. 
-	 */
 	cpu = first_cpu_const(cpumask);
 	apicid = cpu_to_logical_apicid(cpu);
-	while (cpus_found < num_bits_set) {
-		if (cpu_isset_const(cpu, cpumask)) {
-			int new_apicid = cpu_to_logical_apicid(cpu);
-			if (apicid_cluster(apicid) != 
-					apicid_cluster(new_apicid)){
-				printk ("%s: Not a valid mask!\n",__FUNCTION__);
-				return 0xFF;
-			}
-			apicid = apicid | new_apicid;
-			cpus_found++;
-		}
-		cpu++;
-	}
 	return apicid;
 }
 
diff -Nru a/include/asm-i386/pgtable.h b/include/asm-i386/pgtable.h
--- a/include/asm-i386/pgtable.h	2004-05-26 15:01:36 -07:00
+++ b/include/asm-i386/pgtable.h	2004-05-26 15:01:36 -07:00
@@ -317,8 +317,18 @@
 /*
  * The i386 doesn't have any external MMU info: the kernel page
  * tables contain all the necessary information.
+ *
+ * Also, we only update the dirty/accessed state if we set
+ * the dirty bit by hand in the kernel, since the hardware
+ * will do the accessed bit for us, and we don't want to
+ * race with other CPU's that might be updating the dirty
+ * bit at the same time.
  */
 #define update_mmu_cache(vma,address,pte) do { } while (0)
+#define ptep_update_dirty_accessed(__ptep, __entry, __dirty)	\
+	do {							\
+		if (__dirty) set_pte(__ptep, __entry);		\
+	} while (0)
 
 /* Encode and de-code a swap entry */
 #define __swp_type(x)			(((x).val >> 1) & 0x1f)
diff -Nru a/include/asm-ppc64/bitops.h b/include/asm-ppc64/bitops.h
--- a/include/asm-ppc64/bitops.h	2004-05-26 15:01:36 -07:00
+++ b/include/asm-ppc64/bitops.h	2004-05-26 15:01:36 -07:00
@@ -154,6 +154,20 @@
 	return (old & mask) != 0;
 }
 
+static __inline__ void set_bits(unsigned long mask, unsigned long *addr)
+{
+	unsigned long old;
+
+	__asm__ __volatile__(
+"1:	ldarx	%0,0,%3		# set_bit\n\
+	or	%0,%0,%2\n\
+	stdcx.	%0,0,%3\n\
+	bne-	1b"
+	: "=&r" (old), "=m" (*addr)
+	: "r" (mask), "r" (addr), "m" (*addr)
+	: "cc");
+}
+
 /*
  * non-atomic versions
  */
diff -Nru a/include/asm-ppc64/eeh.h b/include/asm-ppc64/eeh.h
--- a/include/asm-ppc64/eeh.h	2004-05-26 15:01:36 -07:00
+++ b/include/asm-ppc64/eeh.h	2004-05-26 15:01:36 -07:00
@@ -215,7 +215,7 @@
 
 static inline void eeh_outb(u8 val, unsigned long port) {
 	if (_IO_IS_VALID(port))
-		return out_8((u8 *)(port+pci_io_base), val);
+		out_8((u8 *)(port+pci_io_base), val);
 }
 
 static inline u16 eeh_inw(unsigned long port) {
@@ -230,7 +230,7 @@
 
 static inline void eeh_outw(u16 val, unsigned long port) {
 	if (_IO_IS_VALID(port))
-		return out_le16((u16 *)(port+pci_io_base), val);
+		out_le16((u16 *)(port+pci_io_base), val);
 }
 
 static inline u32 eeh_inl(unsigned long port) {
@@ -245,7 +245,7 @@
 
 static inline void eeh_outl(u32 val, unsigned long port) {
 	if (_IO_IS_VALID(port))
-		return out_le32((u32 *)(port+pci_io_base), val);
+		out_le32((u32 *)(port+pci_io_base), val);
 }
 
 /* in-string eeh macros */
diff -Nru a/include/asm-ppc64/iommu.h b/include/asm-ppc64/iommu.h
--- a/include/asm-ppc64/iommu.h	2004-05-26 15:01:36 -07:00
+++ b/include/asm-ppc64/iommu.h	2004-05-26 15:01:36 -07:00
@@ -29,10 +29,10 @@
 
 /*
  * IOMAP_MAX_ORDER defines the largest contiguous block
- * of dma (tce) space we can get.  IOMAP_MAX_ORDER = 10 
- * allows up to 2**9 pages (512 * 4096) = 2 MB
+ * of dma (tce) space we can get.  IOMAP_MAX_ORDER = 13
+ * allows up to 2**12 pages (4096 * 4096) = 16 MB
  */
-#define IOMAP_MAX_ORDER 10
+#define IOMAP_MAX_ORDER 13
 
 /*
  * Tces come in two formats, one for the virtual bus and a different
diff -Nru a/include/asm-ppc64/irq.h b/include/asm-ppc64/irq.h
--- a/include/asm-ppc64/irq.h	2004-05-26 15:01:36 -07:00
+++ b/include/asm-ppc64/irq.h	2004-05-26 15:01:36 -07:00
@@ -9,6 +9,7 @@
  * 2 of the License, or (at your option) any later version.
  */
 
+#include <linux/threads.h>
 #include <asm/atomic.h>
 
 /*
@@ -77,7 +78,26 @@
 
 struct irqaction;
 struct pt_regs;
-int handle_IRQ_event(unsigned int, struct pt_regs *, struct irqaction *);
+int handle_irq_event(int, struct pt_regs *, struct irqaction *);
+
+#ifdef CONFIG_IRQSTACKS
+/*
+ * Per-cpu stacks for handling hard and soft interrupts.
+ */
+extern struct thread_info *hardirq_ctx[NR_CPUS];
+extern struct thread_info *softirq_ctx[NR_CPUS];
+
+extern void irq_ctx_init(void);
+extern void call_do_softirq(struct thread_info *tp);
+extern int call_handle_irq_event(int irq, struct pt_regs *regs,
+			struct irqaction *action, struct thread_info *tp);
+
+#define __ARCH_HAS_DO_SOFTIRQ
+
+#else
+#define irq_ctx_init()
+
+#endif /* CONFIG_IRQSTACKS */
 
 #endif /* _ASM_IRQ_H */
 #endif /* __KERNEL__ */
diff -Nru a/include/asm-ppc64/mmu.h b/include/asm-ppc64/mmu.h
--- a/include/asm-ppc64/mmu.h	2004-05-26 15:01:36 -07:00
+++ b/include/asm-ppc64/mmu.h	2004-05-26 15:01:36 -07:00
@@ -204,7 +204,7 @@
 		page = vpn & 0xffff;
 	}
 
-	return (vsid & 0x7fffffffff) ^ page;
+	return (vsid & 0x7fffffffffUL) ^ page;
 }
 
 static inline void __tlbie(unsigned long va, int large)
diff -Nru a/include/asm-ppc64/mmu_context.h b/include/asm-ppc64/mmu_context.h
--- a/include/asm-ppc64/mmu_context.h	2004-05-26 15:01:35 -07:00
+++ b/include/asm-ppc64/mmu_context.h	2004-05-26 15:01:35 -07:00
@@ -175,8 +175,8 @@
 #define activate_mm(active_mm, mm) \
 	switch_mm(active_mm, mm, current);
 
-#define VSID_RANDOMIZER 42470972311
-#define VSID_MASK	0xfffffffff
+#define VSID_RANDOMIZER 42470972311UL
+#define VSID_MASK	0xfffffffffUL
 
 
 /* This is only valid for kernel (including vmalloc, imalloc and bolted) EA's
diff -Nru a/include/asm-ppc64/mmzone.h b/include/asm-ppc64/mmzone.h
--- a/include/asm-ppc64/mmzone.h	2004-05-26 15:01:36 -07:00
+++ b/include/asm-ppc64/mmzone.h	2004-05-26 15:01:36 -07:00
@@ -23,7 +23,6 @@
 extern cpumask_t numa_cpumask_lookup_table[];
 extern int nr_cpus_in_node[];
 
-#define MAX_MEMORY (1UL << 41)
 /* 16MB regions */
 #define MEMORY_INCREMENT_SHIFT 24
 #define MEMORY_INCREMENT (1UL << MEMORY_INCREMENT_SHIFT)
diff -Nru a/include/asm-ppc64/page.h b/include/asm-ppc64/page.h
--- a/include/asm-ppc64/page.h	2004-05-26 15:01:35 -07:00
+++ b/include/asm-ppc64/page.h	2004-05-26 15:01:35 -07:00
@@ -12,18 +12,20 @@
 
 #include <linux/config.h>
 
-/* PAGE_SHIFT determines the page size */
-#define PAGE_SHIFT	12
-#ifndef __ASSEMBLY__
-# define PAGE_SIZE	(1UL << PAGE_SHIFT)
+#ifdef __ASSEMBLY__
+  #define ASM_CONST(x) x
 #else
-# define PAGE_SIZE	(1 << PAGE_SHIFT)
+  #define ASM_CONST(x) x##UL
 #endif
+
+/* PAGE_SHIFT determines the page size */
+#define PAGE_SHIFT	12
+#define PAGE_SIZE	(ASM_CONST(1) << PAGE_SHIFT)
 #define PAGE_MASK	(~(PAGE_SIZE-1))
 #define PAGE_OFFSET_MASK (PAGE_SIZE-1)
 
 #define SID_SHIFT       28
-#define SID_MASK        0xfffffffff
+#define SID_MASK        0xfffffffffUL
 #define GET_ESID(x)     (((x) >> SID_SHIFT) & SID_MASK)
 
 #ifdef CONFIG_HUGETLB_PAGE
@@ -196,11 +198,11 @@
 /*       KERNELBASE is defined for performance reasons. */
 /*       When KERNELBASE moves, those macros may have   */
 /*             to change!                               */
-#define PAGE_OFFSET     0xC000000000000000
+#define PAGE_OFFSET     ASM_CONST(0xC000000000000000)
 #define KERNELBASE      PAGE_OFFSET
-#define VMALLOCBASE     0xD000000000000000
-#define IOREGIONBASE    0xE000000000000000
-#define EEHREGIONBASE   0xA000000000000000
+#define VMALLOCBASE     0xD000000000000000UL
+#define IOREGIONBASE    0xE000000000000000UL
+#define EEHREGIONBASE   0xA000000000000000UL
 
 #define IO_REGION_ID       (IOREGIONBASE>>REGION_SHIFT)
 #define EEH_REGION_ID      (EEHREGIONBASE>>REGION_SHIFT)
diff -Nru a/include/asm-ppc64/spinlock.h b/include/asm-ppc64/spinlock.h
--- a/include/asm-ppc64/spinlock.h	2004-05-26 15:01:35 -07:00
+++ b/include/asm-ppc64/spinlock.h	2004-05-26 15:01:35 -07:00
@@ -103,7 +103,7 @@
 	unsigned long tmp2;
 
 	__asm__ __volatile__(
-	"b		2f		# spin_lock\n\
+	"b		3f		# spin_lock\n\
 1:	mfmsr		%1\n\
 	mtmsrd		%3,1\n\
 2:"	HMT_LOW
diff -Nru a/include/asm-ppc64/thread_info.h b/include/asm-ppc64/thread_info.h
--- a/include/asm-ppc64/thread_info.h	2004-05-26 15:01:35 -07:00
+++ b/include/asm-ppc64/thread_info.h	2004-05-26 15:01:35 -07:00
@@ -69,10 +69,6 @@
 #define get_thread_info(ti)	get_task_struct((ti)->task)
 #define put_thread_info(ti)	put_task_struct((ti)->task)
 
-#if THREAD_SIZE != (4*PAGE_SIZE)
-#error update vmlinux.lds and current_thread_info to match
-#endif
-
 /* how to get the thread information struct from C */
 static inline struct thread_info *current_thread_info(void)
 {
diff -Nru a/include/asm-s390/pgtable.h b/include/asm-s390/pgtable.h
--- a/include/asm-s390/pgtable.h	2004-05-26 15:01:36 -07:00
+++ b/include/asm-s390/pgtable.h	2004-05-26 15:01:36 -07:00
@@ -580,7 +580,8 @@
 
 static inline void
 ptep_establish(struct vm_area_struct *vma, 
-	       unsigned long address, pte_t *ptep, pte_t entry)
+	       unsigned long address, pte_t *ptep,
+	       pte_t entry, int dirty)
 {
 	ptep_clear_flush(vma, address, ptep);
 	set_pte(ptep, entry);
diff -Nru a/include/asm-x86_64/processor.h b/include/asm-x86_64/processor.h
--- a/include/asm-x86_64/processor.h	2004-05-26 15:01:36 -07:00
+++ b/include/asm-x86_64/processor.h	2004-05-26 15:01:36 -07:00
@@ -345,17 +345,7 @@
 /* '6' because it used to be for P6 only (but now covers Pentium 4 as well) */
 #define MICROCODE_IOCFREE	_IO('6',0)
 
-/* generic versions from gas */
-#define GENERIC_NOP1	".byte 0x90\n"
-#define GENERIC_NOP2    	".byte 0x89,0xf6\n"
-#define GENERIC_NOP3        ".byte 0x8d,0x76,0x00\n"
-#define GENERIC_NOP4        ".byte 0x8d,0x74,0x26,0x00\n"
-#define GENERIC_NOP5        GENERIC_NOP1 GENERIC_NOP4
-#define GENERIC_NOP6	".byte 0x8d,0xb6,0x00,0x00,0x00,0x00\n"
-#define GENERIC_NOP7	".byte 0x8d,0xb4,0x26,0x00,0x00,0x00,0x00\n"
-#define GENERIC_NOP8	GENERIC_NOP1 GENERIC_NOP7
 
-#ifdef CONFIG_MK8
 #define ASM_NOP1 K8_NOP1
 #define ASM_NOP2 K8_NOP2
 #define ASM_NOP3 K8_NOP3
@@ -364,16 +354,6 @@
 #define ASM_NOP6 K8_NOP6
 #define ASM_NOP7 K8_NOP7
 #define ASM_NOP8 K8_NOP8
-#else
-#define ASM_NOP1 GENERIC_NOP1
-#define ASM_NOP2 GENERIC_NOP2
-#define ASM_NOP3 GENERIC_NOP3
-#define ASM_NOP4 GENERIC_NOP4
-#define ASM_NOP5 GENERIC_NOP5
-#define ASM_NOP6 GENERIC_NOP6
-#define ASM_NOP7 GENERIC_NOP7
-#define ASM_NOP8 GENERIC_NOP8
-#endif
 
 /* Opteron nops */
 #define K8_NOP1 ".byte 0x90\n"
diff -Nru a/include/asm-x86_64/unistd.h b/include/asm-x86_64/unistd.h
--- a/include/asm-x86_64/unistd.h	2004-05-26 15:01:36 -07:00
+++ b/include/asm-x86_64/unistd.h	2004-05-26 15:01:36 -07:00
@@ -535,11 +535,11 @@
 #define __NR_vserver		236
 __SYSCALL(__NR_vserver, sys_ni_syscall)
 #define __NR_mbind 		237
-__SYSCALL(__NR_mbind, sys_ni_syscall)
+__SYSCALL(__NR_mbind, sys_mbind)
 #define __NR_set_mempolicy 	238
-__SYSCALL(__NR_set_mempolicy, sys_ni_syscall)
+__SYSCALL(__NR_set_mempolicy, sys_set_mempolicy)
 #define __NR_get_mempolicy 	239
-__SYSCALL(__NR_get_mempolicy, sys_ni_syscall)
+__SYSCALL(__NR_get_mempolicy, sys_get_mempolicy)
 #define __NR_mq_open 		240
 __SYSCALL(__NR_mq_open, sys_mq_open)
 #define __NR_mq_unlink 		241
diff -Nru a/include/linux/compat_ioctl.h b/include/linux/compat_ioctl.h
--- a/include/linux/compat_ioctl.h	2004-05-26 15:01:36 -07:00
+++ b/include/linux/compat_ioctl.h	2004-05-26 15:01:36 -07:00
@@ -138,6 +138,7 @@
 COMPATIBLE_IOCTL(DM_TABLE_STATUS_32)
 COMPATIBLE_IOCTL(DM_LIST_VERSIONS_32)
 COMPATIBLE_IOCTL(DM_VERSION)
+COMPATIBLE_IOCTL(DM_REMOVE_ALL)
 COMPATIBLE_IOCTL(DM_LIST_DEVICES)
 COMPATIBLE_IOCTL(DM_DEV_CREATE)
 COMPATIBLE_IOCTL(DM_DEV_REMOVE)
diff -Nru a/include/linux/fs.h b/include/linux/fs.h
--- a/include/linux/fs.h	2004-05-26 15:01:35 -07:00
+++ b/include/linux/fs.h	2004-05-26 15:01:35 -07:00
@@ -13,15 +13,12 @@
 #include <linux/types.h>
 #include <linux/kdev_t.h>
 #include <linux/ioctl.h>
-#include <linux/list.h>
 #include <linux/dcache.h>
 #include <linux/stat.h>
 #include <linux/cache.h>
-#include <linux/radix-tree.h>
 #include <linux/prio_tree.h>
 #include <linux/kobject.h>
 #include <asm/atomic.h>
-#include <linux/audit.h>
 
 struct iovec;
 struct nameidata;
@@ -214,6 +211,9 @@
 
 #ifdef __KERNEL__
 
+#include <linux/list.h>
+#include <linux/radix-tree.h>
+#include <linux/audit.h>
 #include <asm/semaphore.h>
 #include <asm/byteorder.h>
 
@@ -532,8 +532,8 @@
 	rwlock_t lock;          /* protects pid, uid, euid fields */
 	int pid;		/* pid or -pgrp where SIGIO should be sent */
 	uid_t uid, euid;	/* uid/euid of process setting the owner */
-	int signum;		/* posix.1b rt signal to be delivered on IO */
 	void *security;
+	int signum;		/* posix.1b rt signal to be delivered on IO */
 };
 
 /*
@@ -561,10 +561,10 @@
 	atomic_t		f_count;
 	unsigned int 		f_flags;
 	mode_t			f_mode;
+	int			f_error;
 	loff_t			f_pos;
 	struct fown_struct	f_owner;
 	unsigned int		f_uid, f_gid;
-	int			f_error;
 	struct file_ra_state	f_ra;
 
 	unsigned long		f_version;
diff -Nru a/include/linux/idr.h b/include/linux/idr.h
--- a/include/linux/idr.h	2004-05-26 15:01:35 -07:00
+++ b/include/linux/idr.h	2004-05-26 15:01:35 -07:00
@@ -15,10 +15,10 @@
 
 #if BITS_PER_LONG == 32
 # define IDR_BITS 5
-# define IDR_FULL 0xffffffff
+# define IDR_FULL 0xfffffffful
 #elif BITS_PER_LONG == 64
 # define IDR_BITS 6
-# define IDR_FULL 0xffffffffffffffff
+# define IDR_FULL 0xfffffffffffffffful
 #else
 # error "BITS_PER_LONG is not 32 or 64"
 #endif
diff -Nru a/include/linux/mm.h b/include/linux/mm.h
--- a/include/linux/mm.h	2004-05-26 15:01:35 -07:00
+++ b/include/linux/mm.h	2004-05-26 15:01:35 -07:00
@@ -189,13 +189,6 @@
  * it to keep track of whatever it is we are using the page for at the
  * moment. Note that we have no way to track which tasks are using
  * a page.
- *
- * Try to keep the most commonly accessed fields in single cache lines
- * here (16 bytes or greater).  This ordering should be particularly
- * beneficial on 32-bit processors.
- *
- * The first line is data used in page cache lookup, the second line
- * is used for linear searches (eg. clock algorithm scans). 
  */
 struct page {
 	page_flags_t flags;		/* Atomic flags, some possibly
diff -Nru a/include/linux/pci_ids.h b/include/linux/pci_ids.h
--- a/include/linux/pci_ids.h	2004-05-26 15:01:35 -07:00
+++ b/include/linux/pci_ids.h	2004-05-26 15:01:35 -07:00
@@ -1648,8 +1648,8 @@
 #define PCI_SUBDEVICE_ID_CHASE_PCIRAS8		0xF010
 
 #define PCI_VENDOR_ID_AUREAL		0x12eb
-#define PCI_DEVICE_ID_AUREAL_VORTEX	0x0001
-#define PCI_DEVICE_ID_AUREAL_VORTEX2	0x0002
+#define PCI_DEVICE_ID_AUREAL_VORTEX_1	0x0001
+#define PCI_DEVICE_ID_AUREAL_VORTEX_2	0x0002
 #define PCI_DEVICE_ID_AUREAL_ADVANTAGE	0x0003
 
 #define PCI_VENDOR_ID_ELECTRONICDESIGNGMBH 0x12f8
diff -Nru a/include/linux/sched.h b/include/linux/sched.h
--- a/include/linux/sched.h	2004-05-26 15:01:35 -07:00
+++ b/include/linux/sched.h	2004-05-26 15:01:35 -07:00
@@ -293,7 +293,7 @@
  * in the range MAX_RT_PRIO..MAX_PRIO-1. Priority values
  * are inverted: lower p->prio value means higher priority.
  *
- * The MAX_RT_USER_PRIO value allows the actual maximum
+ * The MAX_USER_RT_PRIO value allows the actual maximum
  * RT priority to be separate from the value exported to
  * user-space.  This allows kernel threads to set their
  * priority to a value higher than any user task. Note:
diff -Nru a/include/linux/sunrpc/cache.h b/include/linux/sunrpc/cache.h
--- a/include/linux/sunrpc/cache.h	2004-05-26 15:01:36 -07:00
+++ b/include/linux/sunrpc/cache.h	2004-05-26 15:01:36 -07:00
@@ -99,6 +99,7 @@
 	atomic_t		readers;		/* how many time is /chennel open */
 	time_t			last_close;		/* if no readers, when did last close */
 	time_t			last_warn;		/* when we last warned about no readers */
+	void			(*warn_no_listener)(struct cache_detail *cd);
 };
 
 
diff -Nru a/include/linux/syscalls.h b/include/linux/syscalls.h
--- a/include/linux/syscalls.h	2004-05-26 15:01:36 -07:00
+++ b/include/linux/syscalls.h	2004-05-26 15:01:36 -07:00
@@ -256,7 +256,7 @@
 asmlinkage unsigned long sys_mremap(unsigned long addr,
 				unsigned long old_len, unsigned long new_len,
 				unsigned long flags, unsigned long new_addr);
-long sys_remap_file_pages(unsigned long start, unsigned long size,
+asmlinkage long sys_remap_file_pages(unsigned long start, unsigned long size,
 			unsigned long prot, unsigned long pgoff,
 			unsigned long flags);
 asmlinkage long sys_msync(unsigned long start, size_t len, int flags);
diff -Nru a/include/pcmcia/ss.h b/include/pcmcia/ss.h
--- a/include/pcmcia/ss.h	2004-05-26 15:01:36 -07:00
+++ b/include/pcmcia/ss.h	2004-05-26 15:01:36 -07:00
@@ -145,6 +145,7 @@
 	u_int			Attributes;
 	ioaddr_t		BasePort, NumPorts;
 	ioaddr_t		InUse, Config;
+	struct resource		*res;
 } io_window_t;
 
 #define WINDOW_MAGIC	0xB35C
diff -Nru a/include/scsi/scsi_devinfo.h b/include/scsi/scsi_devinfo.h
--- a/include/scsi/scsi_devinfo.h	2004-05-26 15:01:35 -07:00
+++ b/include/scsi/scsi_devinfo.h	2004-05-26 15:01:35 -07:00
@@ -4,7 +4,8 @@
  * Flags for SCSI devices that need special treatment
  */
 #define BLIST_NOLUN     	0x001	/* Only scan LUN 0 */
-#define BLIST_FORCELUN  	0x002	/* Known to have LUNs, force scanning */
+#define BLIST_FORCELUN  	0x002	/* Known to have LUNs, force scanning,
+					   deprecated: Use max_luns=N */
 #define BLIST_BORKEN    	0x004	/* Flag for broken handshaking */
 #define BLIST_KEY       	0x008	/* unlock by special command */
 #define BLIST_SINGLELUN 	0x010	/* Do not use LUNs in parallel */
@@ -20,4 +21,7 @@
 #define BLIST_MS_SKIP_PAGE_3F	0x4000	/* do not send ms page 0x3f */
 #define BLIST_USE_10_BYTE_MS	0x8000	/* use 10 byte ms before 6 byte ms */
 #define BLIST_MS_192_BYTES_FOR_3F	0x10000	/*  192 byte ms page 0x3f request */
+#define BLIST_REPORTLUN2	0x20000	/* try REPORT_LUNS even for SCSI-2 devs
+ 					   (if HBA supports more than 8 LUNs) */
+#define BLIST_NOREPORTLUN	0x40000	/* don't try REPORT_LUNS scan (SCSI-3 devs) */
 #endif
diff -Nru a/include/sound/ac97_codec.h b/include/sound/ac97_codec.h
--- a/include/sound/ac97_codec.h	2004-05-26 15:01:36 -07:00
+++ b/include/sound/ac97_codec.h	2004-05-26 15:01:36 -07:00
@@ -51,7 +51,7 @@
 #define AC97_REC_GAIN_MIC	0x1e	/* Record Gain MIC (optional) */
 #define AC97_GENERAL_PURPOSE	0x20	/* General Purpose (optional) */
 #define AC97_3D_CONTROL		0x22	/* 3D Control (optional) */
-#define AC97_RESERVED		0x24	/* Reserved */
+#define AC97_INT_PAGING		0x24	/* Audio Interrupt & Paging (AC'97 2.3) */
 #define AC97_POWERDOWN		0x26	/* Powerdown control / status */
 /* range 0x28-0x3a - AUDIO AC'97 2.0 extensions */
 #define AC97_EXTENDED_ID	0x28	/* Extended Audio ID */
@@ -82,6 +82,13 @@
 /* range 0x5a-0x7b - Vendor Specific */
 #define AC97_VENDOR_ID1		0x7c	/* Vendor ID1 */
 #define AC97_VENDOR_ID2		0x7e	/* Vendor ID2 / revision */
+/* range 0x60-0x6f (page 1) - extended codec registers */
+#define AC97_CODEC_CLASS_REV	0x60	/* Codec Class/Revision */
+#define AC97_PCI_SVID		0x62	/* PCI Subsystem Vendor ID */
+#define AC97_PCI_SID		0x64	/* PCI Subsystem ID */
+#define AC97_FUNC_SELECT	0x66	/* Function Select */
+#define AC97_FUNC_INFO		0x68	/* Function Information */
+#define AC97_SENSE_INFO		0x6a	/* Sense Details */
 
 /* slot allocation */
 #define AC97_SLOT_TAG		0
@@ -139,6 +146,7 @@
 #define AC97_EI_AMAP		0x0200	/* indicates optional slot/DAC mapping based on codec ID */
 #define AC97_EI_REV_MASK	0x0c00	/* AC'97 revision mask */
 #define AC97_EI_REV_22		0x0400	/* AC'97 revision 2.2 */
+#define AC97_EI_REV_23		0x0800	/* AC'97 revision 2.3 */
 #define AC97_EI_REV_SHIFT	10
 #define AC97_EI_ADDR_MASK	0xc000	/* physical codec ID (address) */
 #define AC97_EI_ADDR_SHIFT	14
@@ -179,6 +187,16 @@
 #define AC97_SC_SPSR_32K	0x3000	/* Use 32kHz Sample rate */
 #define AC97_SC_DRS		0x4000	/* Double Rate S/PDIF */
 #define AC97_SC_V		0x8000	/* Validity status */
+
+/* Interrupt and Paging bit defines (AC'97 2.3) */
+#define AC97_PAGE_MASK		0x000f	/* Page Selector */
+#define AC97_PAGE_VENDOR	0	/* Vendor-specific registers */
+#define AC97_PAGE_1		1	/* Extended Codec Registers page 1 */
+#define AC97_INT_ENABLE		0x0800	/* Interrupt Enable */
+#define AC97_INT_SENSE		0x1000	/* Sense Cycle */
+#define AC97_INT_CAUSE_SENSE	0x2000	/* Sense Cycle Completed (RO) */
+#define AC97_INT_CAUSE_GPIO	0x4000	/* GPIO bits changed (RO) */
+#define AC97_INT_STATUS		0x8000	/* Interrupt Status */
 
 /* extended modem ID bit defines */
 #define AC97_MEI_LINE1		0x0001	/* Line1 present */
diff -Nru a/include/sound/ad1848.h b/include/sound/ad1848.h
--- a/include/sound/ad1848.h	2004-05-26 15:01:35 -07:00
+++ b/include/sound/ad1848.h	2004-05-26 15:01:35 -07:00
@@ -147,9 +147,6 @@
 	int calibrate_mute;
 	int dma_size;
 	int thinkpad_flag;		/* Thinkpad CS4248 needs some extra help */
-#ifdef CONFIG_PM
-	struct pm_dev *thinkpad_pmstate;
-#endif
 
 	spinlock_t reg_lock;
 	struct semaphore open_mutex;
diff -Nru a/include/sound/asound.h b/include/sound/asound.h
--- a/include/sound/asound.h	2004-05-26 15:01:36 -07:00
+++ b/include/sound/asound.h	2004-05-26 15:01:36 -07:00
@@ -153,7 +153,7 @@
  *                                                                           *
  *****************************************************************************/
 
-#define SNDRV_PCM_VERSION		SNDRV_PROTOCOL_VERSION(2, 0, 6)
+#define SNDRV_PCM_VERSION		SNDRV_PROTOCOL_VERSION(2, 0, 7)
 
 typedef unsigned long sndrv_pcm_uframes_t;
 typedef long sndrv_pcm_sframes_t;
@@ -428,6 +428,22 @@
 	sndrv_pcm_uframes_t avail_min;	/* RW: min available frames for wakeup */
 };
 
+#define SNDRV_PCM_SYNC_PTR_HWSYNC	(1<<0)	/* execute hwsync */
+#define SNDRV_PCM_SYNC_PTR_APPL		(1<<1)	/* get appl_ptr from driver (r/w op) */
+#define SNDRV_PCM_SYNC_PTR_AVAIL_MIN	(1<<2)	/* get avail_min from driver */
+
+struct sndrv_pcm_sync_ptr {
+	unsigned int flags;
+	union {
+		struct sndrv_pcm_mmap_status status;
+		unsigned char reserved[64];
+	} s;
+	union {
+		struct sndrv_pcm_mmap_control control;
+		unsigned char reserved[64];
+	} c;
+};
+
 struct sndrv_xferi {
 	sndrv_pcm_sframes_t result;
 	void *buf;
@@ -451,6 +467,7 @@
 	SNDRV_PCM_IOCTL_STATUS = _IOR('A', 0x20, struct sndrv_pcm_status),
 	SNDRV_PCM_IOCTL_DELAY = _IOR('A', 0x21, sndrv_pcm_sframes_t),
 	SNDRV_PCM_IOCTL_HWSYNC = _IO('A', 0x22),
+	SNDRV_PCM_IOCTL_SYNC_PTR = _IOWR('A', 0x23, struct sndrv_pcm_sync_ptr),
 	SNDRV_PCM_IOCTL_CHANNEL_INFO = _IOR('A', 0x32, struct sndrv_pcm_channel_info),
 	SNDRV_PCM_IOCTL_PREPARE = _IO('A', 0x40),
 	SNDRV_PCM_IOCTL_RESET = _IO('A', 0x41),
@@ -538,7 +555,7 @@
  *  Timer section - /dev/snd/timer
  */
 
-#define SNDRV_TIMER_VERSION		SNDRV_PROTOCOL_VERSION(2, 0, 1)
+#define SNDRV_TIMER_VERSION		SNDRV_PROTOCOL_VERSION(2, 0, 2)
 
 enum sndrv_timer_class {
 	SNDRV_TIMER_CLASS_NONE = -1,
@@ -619,6 +636,7 @@
 
 #define SNDRV_TIMER_PSFLG_AUTO		(1<<0)	/* auto start, otherwise one-shot */
 #define SNDRV_TIMER_PSFLG_EXCLUSIVE	(1<<1)	/* exclusive use, precise start/stop/pause/continue */
+#define SNDRV_TIMER_PSFLG_EARLY_EVENT	(1<<2)	/* write early event to the poll queue */
 
 struct sndrv_timer_params {
 	unsigned int flags;		/* flags - SNDRV_MIXER_PSFLG_* */
@@ -667,6 +685,7 @@
 	SNDRV_TIMER_EVENT_STOP,			/* val = 0 */
 	SNDRV_TIMER_EVENT_CONTINUE,		/* val = resolution in ns */
 	SNDRV_TIMER_EVENT_PAUSE,		/* val = 0 */
+	SNDRV_TIMER_EVENT_EARLY,		/* val = 0, early event */
 	/* master timer events for slave timer instances */
 	SNDRV_TIMER_EVENT_MSTART = SNDRV_TIMER_EVENT_START + 10,
 	SNDRV_TIMER_EVENT_MSTOP = SNDRV_TIMER_EVENT_STOP + 10,
diff -Nru a/include/sound/core.h b/include/sound/core.h
--- a/include/sound/core.h	2004-05-26 15:01:36 -07:00
+++ b/include/sound/core.h	2004-05-26 15:01:36 -07:00
@@ -163,8 +163,10 @@
 	struct device *dev;
 
 #ifdef CONFIG_PM
-	int (*set_power_state) (snd_card_t *card, unsigned int state);
-	void *power_state_private_data;
+	int (*pm_suspend)(snd_card_t *card, unsigned int state);
+	int (*pm_resume)(snd_card_t *card, unsigned int state);
+	struct pm_dev *pm_dev;		/* for ISA */
+	void *pm_private_data;
 	unsigned int power_state;	/* power state */
 	struct semaphore power_lock;	/* power lock */
 	wait_queue_head_t power_sleep;
@@ -199,12 +201,32 @@
 	card->power_state = state;
 	wake_up(&card->power_sleep);
 }
+int snd_card_set_pm_callback(snd_card_t *card,
+			     int (*suspend)(snd_card_t *, unsigned int),
+			     int (*resume)(snd_card_t *, unsigned int),
+			     void *private_data);
+int snd_card_set_dev_pm_callback(snd_card_t *card, int type,
+				 int (*suspend)(snd_card_t *, unsigned int),
+				 int (*resume)(snd_card_t *, unsigned int),
+				 void *private_data);
+#define snd_card_set_isa_pm_callback(card,suspend,resume,data) \
+	snd_card_set_dev_pm_callback(card, PM_ISA_DEV, suspend, resume, data)
+#ifndef SND_PCI_PM_CALLBACKS
+int snd_card_pci_suspend(struct pci_dev *dev, u32 state);
+int snd_card_pci_resume(struct pci_dev *dev);
+#define SND_PCI_PM_CALLBACKS \
+	.suspend = snd_card_pci_suspend,  .resume = snd_card_pci_resume
+#endif
 #else
 #define snd_power_lock(card)		do { (void)(card); } while (0)
 #define snd_power_unlock(card)		do { (void)(card); } while (0)
 static inline int snd_power_wait(snd_card_t *card, unsigned int state, struct file *file) { return 0; }
 #define snd_power_get_state(card)	SNDRV_CTL_POWER_D0
 #define snd_power_change_state(card, state)	do { (void)(card); } while (0)
+#define snd_card_set_pm_callback(card,suspend,resume,data) -EINVAL
+#define snd_card_set_dev_pm_callback(card,suspend,resume,data) -EINVAL
+#define snd_card_set_isa_pm_callback(card,suspend,resume,data) -EINVAL
+#define SND_PCI_PM_CALLBACKS
 #endif
 
 /* device.c */
diff -Nru a/include/sound/cs4231.h b/include/sound/cs4231.h
--- a/include/sound/cs4231.h	2004-05-26 15:01:36 -07:00
+++ b/include/sound/cs4231.h	2004-05-26 15:01:36 -07:00
@@ -295,7 +295,6 @@
 	void (*set_capture_format) (cs4231_t *chip, snd_pcm_hw_params_t *hw_params, unsigned char cdfr);
 	void (*trigger) (cs4231_t *chip, unsigned int what, int start);
 #ifdef CONFIG_PM
-	struct pm_dev *pm_dev;
 	void (*suspend) (cs4231_t *chip);
 	void (*resume) (cs4231_t *chip);
 #endif
diff -Nru a/include/sound/cs46xx.h b/include/sound/cs46xx.h
--- a/include/sound/cs46xx.h	2004-05-26 15:01:35 -07:00
+++ b/include/sound/cs46xx.h	2004-05-26 15:01:35 -07:00
@@ -1737,9 +1737,6 @@
 
 	struct snd_cs46xx_gameport *gameport;
 
-#ifdef CONFIG_PM
-	struct pm_dev *pm_dev;
-#endif
 #ifdef CONFIG_SND_CS46XX_DEBUG_GPIO
 	int current_gpio;
 #endif
@@ -1770,10 +1767,5 @@
 int snd_cs46xx_midi(cs46xx_t *chip, int device, snd_rawmidi_t **rmidi);
 int snd_cs46xx_start_dsp(cs46xx_t *chip);
 void snd_cs46xx_gameport(cs46xx_t *chip);
-
-#ifdef CONFIG_PM
-void snd_cs46xx_suspend(cs46xx_t *chip);
-void snd_cs46xx_resume(cs46xx_t *chip);
-#endif
 
 #endif /* __SOUND_CS46XX_H */
diff -Nru a/include/sound/emu10k1.h b/include/sound/emu10k1.h
--- a/include/sound/emu10k1.h	2004-05-26 15:01:35 -07:00
+++ b/include/sound/emu10k1.h	2004-05-26 15:01:35 -07:00
@@ -650,7 +650,8 @@
 #define SPBYPASS_FORMAT		0x00000f00      /* If 1, SPDIF XX uses 24 bit, if 0 - 20 bit	*/
 
 #define AC97SLOT		0x5f            /* additional AC97 slots enable bits		*/
-#define AC97SLOT_10K2		0x03
+#define AC97SLOT_REAR_RIGHT	0x01		/* Rear left */
+#define AC97SLOT_REAR_LEFT	0x02		/* Rear right */
 #define AC97SLOT_CNTR		0x10            /* Center enable */
 #define AC97SLOT_LFE		0x20            /* LFE enable */
 
@@ -937,7 +938,8 @@
 	struct resource *res_port;
 	int APS: 1,				/* APS flag */
 	    no_ac97: 1,				/* no AC'97 */
-	    tos_link: 1;			/* tos link detected */
+	    tos_link: 1,			/* tos link detected */
+	    rear_ac97: 1;			/* rear channels are on AC'97 */
 	unsigned int audigy;			/* is Audigy? */
 	unsigned int revision;			/* chip revision */
 	unsigned int serial;			/* serial number */
@@ -1184,8 +1186,8 @@
 #define EXTOUT_AC97_R	   0x01	/* AC'97 playback channel - right */
 #define EXTOUT_TOSLINK_L   0x02	/* LiveDrive - TOSLink Optical - left */
 #define EXTOUT_TOSLINK_R   0x03	/* LiveDrive - TOSLink Optical - right */
-#define EXTOUT_CENTER      0x04	/* SB Live 5.1 - center */
-#define EXTOUT_LFE         0x05 /* SB Live 5.1 - LFE */
+#define EXTOUT_AC97_CENTER 0x04	/* SB Live 5.1 - center */
+#define EXTOUT_AC97_LFE	   0x05 /* SB Live 5.1 - LFE */
 #define EXTOUT_HEADPHONE_L 0x06	/* LiveDrive - Headphone - left */
 #define EXTOUT_HEADPHONE_R 0x07	/* LiveDrive - Headphone - right */
 #define EXTOUT_REAR_L	   0x08	/* Rear channel - left */
@@ -1193,6 +1195,8 @@
 #define EXTOUT_ADC_CAP_L   0x0a	/* ADC Capture buffer - left */
 #define EXTOUT_ADC_CAP_R   0x0b	/* ADC Capture buffer - right */
 #define EXTOUT_MIC_CAP	   0x0c	/* MIC Capture buffer */
+#define EXTOUT_AC97_REAR_L 0x0d	/* SB Live 5.1 (c) 2003 - Rear Left */
+#define EXTOUT_AC97_REAR_R 0x0e	/* SB Live 5.1 (c) 2003 - Rear Right */
 #define EXTOUT_ACENTER	   0x11 /* Analog Center */
 #define EXTOUT_ALFE	   0x12 /* Analog LFE */
 
diff -Nru a/include/sound/initval.h b/include/sound/initval.h
--- a/include/sound/initval.h	2004-05-26 15:01:35 -07:00
+++ b/include/sound/initval.h	2004-05-26 15:01:35 -07:00
@@ -133,44 +133,4 @@
 }
 #endif
 
-#if defined(SNDRV_GET_ID) && !defined(MODULE)
-#include <linux/ctype.h>
-#include <linux/init.h>
-#include <linux/bootmem.h>
-static int __init get_id(char **str, char **dst)
-{
-	char *s;
-
-	if (!(*str) || !(**str))
-		return 0;
-	for (s = *str; isalpha(*s) || isdigit(*s) || *s == '_'; s++);
-	if (s != *str) {
-		int len = s - *str;
-		char *d = (char *)alloc_bootmem(len + 1);
-		if (d != NULL) {
-			memcpy(*dst = d, *str, len);
-			d[len] = '\0';
-		}
-	}
-	if (*s == ',') {
-		*str = s + 1;
-		return 2;
-	}
-	*str = s;
-	return 1;
-}
-#endif
-
-/* simple wrapper for long variable.
- * the value more than 32bit won't work!
- */
-inline static int get_option_long(char **str, long *valp)
-{
-	int val, ret;
-	ret = get_option(str, &val);
-	if (ret)
-		*valp = val;
-	return ret;
-}
-
 #endif /* __SOUND_INITVAL_H */
diff -Nru a/include/sound/timer.h b/include/sound/timer.h
--- a/include/sound/timer.h	2004-05-26 15:01:36 -07:00
+++ b/include/sound/timer.h	2004-05-26 15:01:36 -07:00
@@ -60,6 +60,7 @@
 #define SNDRV_TIMER_IFLG_FAST	  0x00000010	/* fast callback (do not use tasklet) */
 #define SNDRV_TIMER_IFLG_CALLBACK 0x00000020	/* timer callback is active */
 #define SNDRV_TIMER_IFLG_EXCLUSIVE 0x00000040	/* exclusive owner - no more instances */
+#define SNDRV_TIMER_IFLG_EARLY_EVENT 0x00000080	/* write early event to the poll queue */
 
 #define SNDRV_TIMER_FLG_CHANGE	0x00000001
 #define SNDRV_TIMER_FLG_RESCHED	0x00000002	/* need reschedule */
diff -Nru a/include/sound/trident.h b/include/sound/trident.h
--- a/include/sound/trident.h	2004-05-26 15:01:36 -07:00
+++ b/include/sound/trident.h	2004-05-26 15:01:36 -07:00
@@ -54,13 +54,6 @@
 #define TRIDENT_DEVICE_ID_NX		((PCI_VENDOR_ID_TRIDENT<<16)|PCI_DEVICE_ID_TRIDENT_4DWAVE_NX)
 #define TRIDENT_DEVICE_ID_SI7018	((PCI_VENDOR_ID_SI<<16)|PCI_DEVICE_ID_SI_7018)
 
-/* Trident chipsets have 1GB memory limit */
-#ifdef __alpha__
-#define TRIDENT_DMA_TYPE        SNDRV_DMA_TYPE_PCI_16MB
-#else
-#define TRIDENT_DMA_TYPE        SNDRV_DMA_TYPE_PCI
-#endif
-
 #define SNDRV_SEQ_DEV_ID_TRIDENT			"trident-synth"
 
 #define SNDRV_TRIDENT_VOICE_TYPE_PCM		0
@@ -487,11 +480,5 @@
 int snd_trident_synth_free(trident_t *trident, snd_util_memblk_t *blk);
 int snd_trident_synth_bzero(trident_t *trident, snd_util_memblk_t *blk, int offset, int size);
 int snd_trident_synth_copy_from_user(trident_t *trident, snd_util_memblk_t *blk, int offset, const char *data, int size);
-
-/* Power Management */
-#ifdef CONFIG_PM
-void snd_trident_suspend(trident_t *trident);
-void snd_trident_resume(trident_t *trident);
-#endif
 
 #endif /* __SOUND_TRIDENT_H */
diff -Nru a/include/sound/uda1341.h b/include/sound/uda1341.h
--- a/include/sound/uda1341.h	2004-05-26 15:01:36 -07:00
+++ b/include/sound/uda1341.h	2004-05-26 15:01:36 -07:00
@@ -15,7 +15,7 @@
  *                           features support
  */
 
-/* $Id: uda1341.h,v 1.5 2003/04/19 13:34:32 perex Exp $ */
+/* $Id: uda1341.h,v 1.6 2004/05/03 17:36:50 tiwai Exp $ */
 
 #define UDA1341_ALSA_NAME "snd-uda1341"
 
diff -Nru a/include/sound/version.h b/include/sound/version.h
--- a/include/sound/version.h	2004-05-26 15:01:35 -07:00
+++ b/include/sound/version.h	2004-05-26 15:01:35 -07:00
@@ -1,3 +1,3 @@
 /* include/version.h.  Generated by configure.  */
-#define CONFIG_SND_VERSION "1.0.4rc2"
-#define CONFIG_SND_DATE " (Tue Mar 30 08:19:30 2004 UTC)"
+#define CONFIG_SND_VERSION "1.0.4"
+#define CONFIG_SND_DATE " (Mon May 17 14:31:44 2004 UTC)"
diff -Nru a/include/sound/ymfpci.h b/include/sound/ymfpci.h
--- a/include/sound/ymfpci.h	2004-05-26 15:01:35 -07:00
+++ b/include/sound/ymfpci.h	2004-05-26 15:01:35 -07:00
@@ -393,11 +393,6 @@
 int snd_ymfpci_voice_alloc(ymfpci_t *chip, ymfpci_voice_type_t type, int pair, ymfpci_voice_t **rvoice);
 int snd_ymfpci_voice_free(ymfpci_t *chip, ymfpci_voice_t *pvoice);
 
-#ifdef CONFIG_PM
-void snd_ymfpci_suspend(ymfpci_t *chip);
-void snd_ymfpci_resume(ymfpci_t *chip);
-#endif
-
 #if defined(CONFIG_GAMEPORT) || (defined(MODULE) && defined(CONFIG_GAMEPORT_MODULE))
 #define SUPPORT_JOYSTICK
 #endif
diff -Nru a/init/initramfs.c b/init/initramfs.c
--- a/init/initramfs.c	2004-05-26 15:01:35 -07:00
+++ b/init/initramfs.c	2004-05-26 15:01:35 -07:00
@@ -207,7 +207,7 @@
 
 static int __init do_skip(void)
 {
-	if (this_header + count <= next_header) {
+	if (this_header + count < next_header) {
 		eat(count);
 		return 1;
 	} else {
diff -Nru a/kernel/fork.c b/kernel/fork.c
--- a/kernel/fork.c	2004-05-26 15:01:35 -07:00
+++ b/kernel/fork.c	2004-05-26 15:01:35 -07:00
@@ -333,9 +333,9 @@
       
 			/* insert tmp into the share list, just after mpnt */
 			spin_lock(&file->f_mapping->i_mmap_lock);
-			flush_dcache_mmap_lock(mapping);
+			flush_dcache_mmap_lock(file->f_mapping);
 			vma_prio_tree_add(tmp, mpnt);
-			flush_dcache_mmap_unlock(mapping);
+			flush_dcache_mmap_unlock(file->f_mapping);
 			spin_unlock(&file->f_mapping->i_mmap_lock);
 		}
 
diff -Nru a/kernel/printk.c b/kernel/printk.c
--- a/kernel/printk.c	2004-05-26 15:01:36 -07:00
+++ b/kernel/printk.c	2004-05-26 15:01:36 -07:00
@@ -472,6 +472,27 @@
 }
 
 /*
+ * Zap console related locks when oopsing. Only zap at most once
+ * every 10 seconds, to leave time for slow consoles to print a
+ * full oops.
+ */
+static void zap_locks(void)
+{
+	static unsigned long oops_timestamp;
+
+	if (time_after_eq(jiffies, oops_timestamp) &&
+			!time_after(jiffies, oops_timestamp + 30*HZ))
+		return;
+
+	oops_timestamp = jiffies;
+
+	/* If a crash is occurring, make sure we can't deadlock */
+	spin_lock_init(&logbuf_lock);
+	/* And make sure that we print immediately */
+	init_MUTEX(&console_sem);
+}
+
+/*
  * This is printk.  It can be called from any context.  We want it to work.
  * 
  * We try to grab the console_sem.  If we succeed, it's easy - we log the output and
@@ -493,12 +514,8 @@
 	static char printk_buf[1024];
 	static int log_level_unknown = 1;
 
-	if (oops_in_progress) {
-		/* If a crash is occurring, make sure we can't deadlock */
-		spin_lock_init(&logbuf_lock);
-		/* And make sure that we print immediately */
-		init_MUTEX(&console_sem);
-	}
+	if (unlikely(oops_in_progress))
+		zap_locks();
 
 	/* This stops the holder of console_sem just where we want him */
 	spin_lock_irqsave(&logbuf_lock, flags);
diff -Nru a/kernel/sched.c b/kernel/sched.c
--- a/kernel/sched.c	2004-05-26 15:01:36 -07:00
+++ b/kernel/sched.c	2004-05-26 15:01:36 -07:00
@@ -141,8 +141,7 @@
 	(v1) * (v2_max) / (v1_max)
 
 #define DELTA(p) \
-	(SCALE(TASK_NICE(p), 40, MAX_USER_PRIO*PRIO_BONUS_RATIO/100) + \
-		INTERACTIVE_DELTA)
+	(SCALE(TASK_NICE(p), 40, MAX_BONUS) + INTERACTIVE_DELTA)
 
 #define TASK_INTERACTIVE(p) \
 	((p)->prio <= (p)->static_prio - DELTA(p))
@@ -2991,10 +2990,9 @@
 
 	/*
 	 * Since we are going to call schedule() anyway, there's
-	 * no need to preempt:
+	 * no need to preempt or enable interrupts:
 	 */
 	_raw_spin_unlock(&rq->lock);
-	local_irq_enable();
 	preempt_enable_no_resched();
 
 	schedule();
diff -Nru a/kernel/sys.c b/kernel/sys.c
--- a/kernel/sys.c	2004-05-26 15:01:35 -07:00
+++ b/kernel/sys.c	2004-05-26 15:01:35 -07:00
@@ -1281,8 +1281,12 @@
 
 	groups_sort(group_info);
 	get_group_info(group_info);
+
+	task_lock(current);
 	old_info = current->group_info;
 	current->group_info = group_info;
+	task_unlock(current);
+
 	put_group_info(old_info);
 
 	return 0;
@@ -1302,6 +1306,7 @@
 	if (gidsetsize < 0)
 		return -EINVAL;
 
+	/* no need to grab task_lock here; it cannot change */
 	get_group_info(current->group_info);
 	i = current->group_info->ngroups;
 	if (gidsetsize) {
diff -Nru a/mm/memory.c b/mm/memory.c
--- a/mm/memory.c	2004-05-26 15:01:35 -07:00
+++ b/mm/memory.c	2004-05-26 15:01:35 -07:00
@@ -1004,7 +1004,7 @@
 	flush_cache_page(vma, address);
 	entry = maybe_mkwrite(pte_mkdirty(mk_pte(new_page, vma->vm_page_prot)),
 			      vma);
-	ptep_establish(vma, address, page_table, entry);
+	ptep_establish(vma, address, page_table, entry, 1);
 	update_mmu_cache(vma, address, entry);
 }
 
@@ -1056,7 +1056,7 @@
 			flush_cache_page(vma, address);
 			entry = maybe_mkwrite(pte_mkyoung(pte_mkdirty(pte)),
 					      vma);
-			ptep_establish(vma, address, page_table, entry);
+			ptep_establish(vma, address, page_table, entry, 1);
 			update_mmu_cache(vma, address, entry);
 			pte_unmap(page_table);
 			spin_unlock(&mm->page_table_lock);
@@ -1646,7 +1646,7 @@
 		entry = pte_mkdirty(entry);
 	}
 	entry = pte_mkyoung(entry);
-	ptep_establish(vma, address, pte, entry);
+	ptep_establish(vma, address, pte, entry, write_access);
 	update_mmu_cache(vma, address, entry);
 	pte_unmap(pte);
 	spin_unlock(&mm->page_table_lock);
diff -Nru a/mm/mempolicy.c b/mm/mempolicy.c
--- a/mm/mempolicy.c	2004-05-26 15:01:36 -07:00
+++ b/mm/mempolicy.c	2004-05-26 15:01:36 -07:00
@@ -444,17 +444,16 @@
 
 /* Copy a kernel node mask to user space */
 static int copy_nodes_to_user(unsigned long *user_mask, unsigned long maxnode,
-			      unsigned long *nodes)
+			      void *nodes, unsigned nbytes)
 {
 	unsigned long copy = ALIGN(maxnode-1, 64) / 8;
 
-	if (copy > sizeof(nodes)) {
+	if (copy > nbytes) {
 		if (copy > PAGE_SIZE)
 			return -EINVAL;
-		if (clear_user((char*)user_mask + sizeof(nodes),
-				copy - sizeof(nodes)))
+		if (clear_user((char*)user_mask + nbytes, copy - nbytes))
 			return -EFAULT;
-		copy = sizeof(nodes);
+		copy = nbytes;
 	}
 	return copy_to_user(user_mask, nodes, copy) ? -EFAULT : 0;
 }
@@ -514,7 +513,7 @@
 	if (nmask) {
 		DECLARE_BITMAP(nodes, MAX_NUMNODES);
 		get_zonemask(pol, nodes);
-		err = copy_nodes_to_user(nmask, maxnode, nodes);
+		err = copy_nodes_to_user(nmask, maxnode, nodes, sizeof(nodes));
 	}
 
  out:
diff -Nru a/mm/mmap.c b/mm/mmap.c
--- a/mm/mmap.c	2004-05-26 15:01:36 -07:00
+++ b/mm/mmap.c	2004-05-26 15:01:36 -07:00
@@ -951,7 +951,7 @@
 	}
 	if (flags & MAP_POPULATE) {
 		up_write(&mm->mmap_sem);
-		sys_remap_file_pages(addr, len, prot,
+		sys_remap_file_pages(addr, len, 0,
 					pgoff, flags & MAP_NONBLOCK);
 		down_write(&mm->mmap_sem);
 	}
diff -Nru a/mm/prio_tree.c b/mm/prio_tree.c
--- a/mm/prio_tree.c	2004-05-26 15:01:36 -07:00
+++ b/mm/prio_tree.c	2004-05-26 15:01:36 -07:00
@@ -661,4 +661,3 @@
 	} else
 		return NULL;
 }
-EXPORT_SYMBOL(vma_prio_tree_next);
diff -Nru a/mm/rmap.c b/mm/rmap.c
--- a/mm/rmap.c	2004-05-26 15:01:36 -07:00
+++ b/mm/rmap.c	2004-05-26 15:01:36 -07:00
@@ -537,11 +537,7 @@
  * there there won't be many ptes located within the scan cluster.  In this case
  * maybe we could scan further - to the end of the pte page, perhaps.
  */
-#define CLUSTER_SIZE	(32 * PAGE_SIZE)
-#if     CLUSTER_SIZE  >	PMD_SIZE
-#undef  CLUSTER_SIZE
-#define CLUSTER_SIZE	PMD_SIZE
-#endif
+#define CLUSTER_SIZE	min(32*PAGE_SIZE, PMD_SIZE)
 #define CLUSTER_MASK	(~(CLUSTER_SIZE - 1))
 
 static int try_to_unmap_cluster(unsigned long cursor,
diff -Nru a/net/8021q/vlan.h b/net/8021q/vlan.h
--- a/net/8021q/vlan.h	2004-05-26 15:01:36 -07:00
+++ b/net/8021q/vlan.h	2004-05-26 15:01:36 -07:00
@@ -7,7 +7,7 @@
 /* #define VLAN_DEBUG */
 
 #define VLAN_ERR KERN_ERR
-#define VLAN_INF KERN_ALERT
+#define VLAN_INF KERN_INFO
 #define VLAN_DBG KERN_ALERT /* change these... to debug, having a hard time
                              * changing the log level at run-time..for some reason.
                              */
diff -Nru a/net/bluetooth/rfcomm/core.c b/net/bluetooth/rfcomm/core.c
--- a/net/bluetooth/rfcomm/core.c	2004-05-26 15:01:35 -07:00
+++ b/net/bluetooth/rfcomm/core.c	2004-05-26 15:01:35 -07:00
@@ -470,32 +470,33 @@
 	if (!s)
 		return NULL;
 	memset(s, 0, sizeof(*s));
-	
+
 	BT_DBG("session %p sock %p", s, sock);
 
 	INIT_LIST_HEAD(&s->dlcs);
 	s->state = state;
 	s->sock  = sock;
 
-	s->mtu   = RFCOMM_DEFAULT_MTU;
-	s->cfc   = RFCOMM_CFC_UNKNOWN;
-	
-	list_add(&s->list, &session_list);
+	s->mtu = RFCOMM_DEFAULT_MTU;
+	s->cfc = RFCOMM_CFC_UNKNOWN;
 
-	/* Do not increment module usage count for listeting sessions.
-	 * Otherwise we won't be able to unload the module.
-	 * Non listening session are added either by a socket or a TTYs
-	 * which means that we already hold refcount to this module.
-	 */
+	/* Do not increment module usage count for listening sessions.
+	 * Otherwise we won't be able to unload the module. */
 	if (state != BT_LISTEN)
-		__module_get(THIS_MODULE);
+		if (!try_module_get(THIS_MODULE)) {
+			kfree(s);
+			return NULL;
+		}
+
+	list_add(&s->list, &session_list);
+
 	return s;
 }
 
 void rfcomm_session_del(struct rfcomm_session *s)
 {
 	int state = s->state;
-	
+
 	BT_DBG("session %p state %ld", s, s->state);
 
 	list_del(&s->list);
diff -Nru a/net/core/net-sysfs.c b/net/core/net-sysfs.c
--- a/net/core/net-sysfs.c	2004-05-26 15:01:36 -07:00
+++ b/net/core/net-sysfs.c	2004-05-26 15:01:36 -07:00
@@ -20,9 +20,9 @@
 #define to_class_dev(obj) container_of(obj,struct class_device,kobj)
 #define to_net_dev(class) container_of(class, struct net_device, class_dev)
 
-static const char *fmt_hex = "%#x\n";
-static const char *fmt_dec = "%d\n";
-static const char *fmt_ulong = "%lu\n";
+static const char fmt_hex[] = "%#x\n";
+static const char fmt_dec[] = "%d\n";
+static const char fmt_ulong[] = "%lu\n";
 
 static inline int dev_isalive(const struct net_device *dev) 
 {
diff -Nru a/net/ipv4/xfrm4_state.c b/net/ipv4/xfrm4_state.c
--- a/net/ipv4/xfrm4_state.c	2004-05-26 15:01:35 -07:00
+++ b/net/ipv4/xfrm4_state.c	2004-05-26 15:01:35 -07:00
@@ -83,9 +83,7 @@
 			    break;
 		    }
 	}
-	if (x0) {
-		xfrm_state_hold(x0);
-	} else if (create && (x0 = xfrm_state_alloc()) != NULL) {
+	if (!x0 && create && (x0 = xfrm_state_alloc()) != NULL) {
 		x0->sel.daddr.a4 = daddr->a4;
 		x0->sel.saddr.a4 = saddr->a4;
 		x0->sel.prefixlen_d = 32;
@@ -100,11 +98,14 @@
 		x0->props.family = AF_INET;
 		x0->lft.hard_add_expires_seconds = XFRM_ACQ_EXPIRES;
 		xfrm_state_hold(x0);
-		mod_timer(&x0->timer, jiffies + XFRM_ACQ_EXPIRES*HZ);
+		x0->timer.expires = jiffies + XFRM_ACQ_EXPIRES*HZ;
+		add_timer(&x0->timer);
 		xfrm_state_hold(x0);
 		list_add_tail(&x0->bydst, xfrm4_state_afinfo.state_bydst+h);
 		wake_up(&km_waitq);
 	}
+	if (x0)
+		xfrm_state_hold(x0);
 	return x0;
 }
 
diff -Nru a/net/ipv6/xfrm6_state.c b/net/ipv6/xfrm6_state.c
--- a/net/ipv6/xfrm6_state.c	2004-05-26 15:01:35 -07:00
+++ b/net/ipv6/xfrm6_state.c	2004-05-26 15:01:35 -07:00
@@ -90,9 +90,7 @@
 			    break;
 		    }
 	}
-	if (x0) {
-		xfrm_state_hold(x0);
-	} else if (create && (x0 = xfrm_state_alloc()) != NULL) {
+	if (!x0 && create && (x0 = xfrm_state_alloc()) != NULL) {
 		ipv6_addr_copy((struct in6_addr *)x0->sel.daddr.a6,
 			       (struct in6_addr *)daddr);
 		ipv6_addr_copy((struct in6_addr *)x0->sel.saddr.a6,
@@ -110,11 +108,14 @@
 		x0->props.reqid = reqid;
 		x0->lft.hard_add_expires_seconds = XFRM_ACQ_EXPIRES;
 		xfrm_state_hold(x0);
-		mod_timer(&x0->timer, jiffies + XFRM_ACQ_EXPIRES*HZ);
+		x0->timer.expires = jiffies + XFRM_ACQ_EXPIRES*HZ;
+		add_timer(&x0->timer);
 		xfrm_state_hold(x0);
 		list_add_tail(&x0->bydst, xfrm6_state_afinfo.state_bydst+h);
 		wake_up(&km_waitq);
 	}
+	if (x0)
+		xfrm_state_hold(x0);
 	return x0;
 }
 
diff -Nru a/net/irda/ircomm/ircomm_tty.c b/net/irda/ircomm/ircomm_tty.c
--- a/net/irda/ircomm/ircomm_tty.c	2004-05-26 15:01:35 -07:00
+++ b/net/irda/ircomm/ircomm_tty.c	2004-05-26 15:01:35 -07:00
@@ -721,8 +721,10 @@
 		kbuf = kmalloc(count, GFP_KERNEL);
 		if (kbuf == NULL)
 			return -ENOMEM;
-		if (copy_from_user(kbuf, ubuf, count))
+		if (copy_from_user(kbuf, ubuf, count)) {
+			kfree(kbuf);
 			return -EFAULT;
+		}
 	} else
 		/* The buffer is already in kernel space */
 		kbuf = (unsigned char *) ubuf;
@@ -779,6 +781,8 @@
 					    self->max_header_size);
 			if (!skb) {
 				spin_unlock_irqrestore(&self->spinlock, flags);
+	                        if (from_user)
+		                        kfree(kbuf);
 				return -ENOBUFS;
 			}
 			skb_reserve(skb, self->max_header_size);
diff -Nru a/net/key/af_key.c b/net/key/af_key.c
--- a/net/key/af_key.c	2004-05-26 15:01:35 -07:00
+++ b/net/key/af_key.c	2004-05-26 15:01:35 -07:00
@@ -1976,7 +1976,7 @@
 	memset(&sel, 0, sizeof(sel));
 
 	sa = ext_hdrs[SADB_EXT_ADDRESS_SRC-1], 
-	pfkey_sadb_addr2xfrm_addr(sa, &sel.saddr);
+	sel.family = pfkey_sadb_addr2xfrm_addr(sa, &sel.saddr);
 	sel.prefixlen_s = sa->sadb_address_prefixlen;
 	sel.proto = pfkey_proto_to_xfrm(sa->sadb_address_proto);
 	sel.sport = ((struct sockaddr_in *)(sa+1))->sin_port;
diff -Nru a/net/sunrpc/cache.c b/net/sunrpc/cache.c
--- a/net/sunrpc/cache.c	2004-05-26 15:01:36 -07:00
+++ b/net/sunrpc/cache.c	2004-05-26 15:01:36 -07:00
@@ -910,9 +910,8 @@
 {
 	if (detail->last_warn != detail->last_close) {
 		detail->last_warn = detail->last_close;
-		printk(KERN_WARNING "nfsd: nobody listening for %s upcall;"
-				" has some daemon %s?\n", detail->name,
-		      		detail->last_close?"died" : "not been started");
+		if (detail->warn_no_listener)
+			detail->warn_no_listener(detail);
 	}
 }
 
diff -Nru a/net/xfrm/xfrm_state.c b/net/xfrm/xfrm_state.c
--- a/net/xfrm/xfrm_state.c	2004-05-26 15:01:36 -07:00
+++ b/net/xfrm/xfrm_state.c	2004-05-26 15:01:36 -07:00
@@ -221,13 +221,9 @@
 		if (atomic_read(&x->refcnt) > 2)
 			xfrm_flush_bundles();
 
-		/* All xfrm_state objects are created by one of two possible
-		 * paths:
-		 *
-		 * 2) xfrm_state_lookup --> xfrm_state_insert
-		 *
-		 * The xfrm_state_lookup or xfrm_state_alloc call gives a
-		 * reference, and that is what we are dropping here.
+		/* All xfrm_state objects are created by xfrm_state_alloc.
+		 * The xfrm_state_alloc call gives a reference, and that
+		 * is what we are dropping here.
 		 */
 		atomic_dec(&x->refcnt);
 	}
@@ -331,14 +327,8 @@
 		}
 	}
 
-	if (best) {
-		xfrm_state_hold(best);
-		spin_unlock_bh(&xfrm_state_lock);
-		return best;
-	}
-
-	x = NULL;
-	if (!error && !acquire_in_progress &&
+	x = best;
+	if (!x && !error && !acquire_in_progress &&
 	    ((x = xfrm_state_alloc()) != NULL)) {
 		/* Initialize temporary selector matching only
 		 * to current session. */
@@ -355,7 +345,8 @@
 			}
 			x->lft.hard_add_expires_seconds = XFRM_ACQ_EXPIRES;
 			xfrm_state_hold(x);
-			mod_timer(&x->timer, XFRM_ACQ_EXPIRES*HZ);
+			x->timer.expires = jiffies + XFRM_ACQ_EXPIRES*HZ;
+			add_timer(&x->timer);
 		} else {
 			x->km.state = XFRM_STATE_DEAD;
 			xfrm_state_put(x);
@@ -363,10 +354,12 @@
 			error = 1;
 		}
 	}
-	spin_unlock_bh(&xfrm_state_lock);
-	if (!x)
+	if (x)
+		xfrm_state_hold(x);
+	else
 		*err = acquire_in_progress ? -EAGAIN :
 			(error ? -ESRCH : -ENOMEM);
+	spin_unlock_bh(&xfrm_state_lock);
 	return x;
 }
 
diff -Nru a/scripts/mk_elfconfig.c b/scripts/mk_elfconfig.c
--- a/scripts/mk_elfconfig.c	2004-05-26 15:01:36 -07:00
+++ b/scripts/mk_elfconfig.c	2004-05-26 15:01:36 -07:00
@@ -55,7 +55,7 @@
 	else
 		abort();
 
-	if (strcmp(argv[1], "v850") == 0)
+	if ((strcmp(argv[1], "v850") == 0) || (strcmp(argv[1], "h8300") == 0))
 		printf("#define MODULE_SYMBOL_PREFIX \"_\"\n");
 	else 
 		printf("#define MODULE_SYMBOL_PREFIX \"\"\n");
diff -Nru a/sound/arm/sa11xx-uda1341.c b/sound/arm/sa11xx-uda1341.c
--- a/sound/arm/sa11xx-uda1341.c	2004-05-26 15:01:35 -07:00
+++ b/sound/arm/sa11xx-uda1341.c	2004-05-26 15:01:35 -07:00
@@ -21,7 +21,7 @@
  *                              merged HAL layer (patches from Brian)
  */
 
-/* $Id: sa11xx-uda1341.c,v 1.13 2004/03/02 15:32:35 perex Exp $ */
+/* $Id: sa11xx-uda1341.c,v 1.15 2004/05/03 17:36:50 tiwai Exp $ */
 
 /***************************************************************************************************
 *
@@ -62,6 +62,7 @@
 #include <linux/config.h>
 #include <sound/driver.h>
 #include <linux/module.h>
+#include <linux/moduleparam.h>
 #include <linux/init.h>
 #include <linux/errno.h>
 #include <linux/ioctl.h>
@@ -112,7 +113,7 @@
 
 static char *id = NULL;	/* ID for this card */
 
-MODULE_PARM(id, "s");
+module_param(id, charp, 0444);
 MODULE_PARM_DESC(id, "ID string for SA1100/SA1111 + UDA1341TS soundcard.");
 
 #define chip_t sa11xx_uda1341_t
@@ -136,7 +137,6 @@
 }audio_stream_t;
 
 typedef struct snd_card_sa11xx_uda1341 {
-	struct pm_dev *pm_dev;        
 	snd_card_t *card;
 	struct l3_client *uda1341;
 	snd_pcm_t *pcm;
@@ -867,12 +867,10 @@
 
 #ifdef CONFIG_PM
 
-static void snd_sa11xx_uda1341_suspend(sa11xx_uda1341_t *chip)
+static int snd_sa11xx_uda1341_suspend(snd_card_t *card, unsigned int state)
 {
-	snd_card_t *card = chip->card;
+	sa11xx_uda1341_t *chip = snd_magic_cast(sa11x_uda1341_t, card->pm_private_data, return -EINVAL);
 
-	if (card->power_state == SNDRV_CTL_POWER_D3hot)
-		return;
 	snd_pcm_suspend_all(chip->pcm);
 #ifdef HH_VERSION	
 	sa1100_dma_sleep(chip->s[SNDRV_PCM_STREAM_PLAYBACK].dmach);
@@ -883,14 +881,13 @@
 	l3_command(chip->uda1341, CMD_SUSPEND, NULL);
 	sa11xx_uda1341_audio_shutdown(chip);
 	snd_power_change_state(card, SNDRV_CTL_POWER_D3hot);
+	return 0;
 }
 
-static void snd_sa11xx_uda1341_resume(sa11xx_uda1341_t *chip)
+static int snd_sa11xx_uda1341_resume(snd_card_t *card, unsigned int state)
 {
-	snd_card_t *card = chip->card;
+	sa11xx_uda1341_t *chip = snd_magic_cast(sa11x_uda1341_t, card->pm_private_data, return -EINVAL);
 
-	if (card->power_state == SNDRV_CTL_POWER_D0)
-		return;
 	sa11xx_uda1341_audio_init(chip);
 	l3_command(chip->uda1341, CMD_RESUME, NULL);
 #ifdef HH_VERSION	
@@ -900,50 +897,14 @@
 	//FIXME
 #endif
 	snd_power_change_state(card, SNDRV_CTL_POWER_D0);
-}
-
-static int sa11xx_uda1341_pm_callback(struct pm_dev *pm_dev, pm_request_t req, void *data)
-{
-	sa11xx_uda1341_t *chip = pm_dev->data;
-        
-	switch (req) {
-	case PM_SUSPEND: /* enter D1-D3 */
-		snd_sa11xx_uda1341_suspend(chip);
-		break;
-	case PM_RESUME:  /* enter D0 */
-		snd_sa11xx_uda1341_resume(chip);
-		break;
-	}
-	return 0;
-}
-
-static int sa11xx_uda1341_set_power_state(snd_card_t *card, unsigned int power_state)
-{
-	sa11xx_uda1341_t *chip = snd_magic_cast(sa11xx_uda1341_t, card->power_state_private_data, return);
-
-	switch (power_state) {
-	case SNDRV_CTL_POWER_D0:
-	case SNDRV_CTL_POWER_D1:
-	case SNDRV_CTL_POWER_D2:
-		snd_sa11xx_uda1341_resume(chip);
-		break;
-	case SNDRV_CTL_POWER_D3hot:
-	case SNDRV_CTL_POWER_D3cold:
-		snd_sa11xx_uda1341_suspend(chip);
-		break;
-	default:
-		return -EINVAL;
-	}
 	return 0;
 }
-
 #endif /* COMFIG_PM */
 
 void snd_sa11xx_uda1341_free(snd_card_t *card)
 {
 	sa11xx_uda1341_t *chip = snd_magic_cast(sa11xx_uda1341_t, card->private_data, return);
 
-	pm_unregister(chip->pm_dev);
 	audio_dma_free(&chip->s[SNDRV_PCM_STREAM_PLAYBACK]);
 	audio_dma_free(&chip->s[SNDRV_PCM_STREAM_CAPTURE]);
 	sa11xx_uda1341 = NULL;
@@ -984,15 +945,10 @@
 	if ((err = snd_card_sa11xx_uda1341_pcm(sa11xx_uda1341, 0)) < 0)
 		goto nodev;
         
-       
-#ifdef CONFIG_PM
-	card->power_state_private_data = sa11xx_uda1341;
-	card->set_power_state = sa11xx_uda1341_set_power_state;
-	sa11xx_uda1341->pm_dev = pm_register(PM_SYS_DEV, 0, sa11xx_uda1341_pm_callback);
-	if (sa11xx_uda1341->pm_dev)
-		sa11xx_uda1341->pm_dev->data = sa11xx_uda1341;
-#endif
-        
+	snd_card_set_dev_pm_callback(card, PM_SYS_DEV,
+				     snd_sa11xx_uda1341_suspend, snd_sa11_uda1341_resume,
+				     sa11xx_uda1341);
+
 	strcpy(card->driver, "UDA1341");
 	strcpy(card->shortname, "H3600 UDA1341TS");
 	sprintf(card->longname, "Compaq iPAQ H3600 with Philips UDA1341TS");
diff -Nru a/sound/core/Kconfig b/sound/core/Kconfig
--- a/sound/core/Kconfig	2004-05-26 15:01:36 -07:00
+++ b/sound/core/Kconfig	2004-05-26 15:01:36 -07:00
@@ -1,8 +1,4 @@
 # ALSA soundcard-configuration
-config SND_BIT32_EMUL
-	tristate "Emulation for 32-bit applications"
-	depends on SND && SND_PCM && (MIPS64 || SPARC64 || PPC64 || X86_64 && IA32_EMULATION)
-
 config SND_TIMER
 	tristate
 
@@ -58,6 +54,17 @@
 	help
 	  Say 'Y' to enable OSS sequencer emulation (both /dev/sequencer and
 	  /dev/music interfaces).
+
+config SND_BIT32_EMUL
+	tristate "Emulation for 32-bit applications"
+	depends on SND && (MIPS64 || SPARC64 || PPC64 || X86_64 && IA32_EMULATION)
+	select SND_PCM
+	select SND_RAWMIDI
+	select SND_TIMER
+	select SND_HWDEP
+	help
+	  Say 'Y' or 'M' to enable the emulation for 32-bit ALSA-native
+	  applications.
 
 config SND_RTCTIMER
 	tristate "RTC Timer support"
diff -Nru a/sound/core/control.c b/sound/core/control.c
--- a/sound/core/control.c	2004-05-26 15:01:35 -07:00
+++ b/sound/core/control.c	2004-05-26 15:01:35 -07:00
@@ -995,6 +995,33 @@
 	return 0;
 }
 
+#ifdef CONFIG_PM
+/*
+ * change the power state
+ */
+static int snd_ctl_set_power_state(snd_card_t *card, unsigned int power_state)
+{
+	switch (power_state) {
+	case SNDRV_CTL_POWER_D0:
+	case SNDRV_CTL_POWER_D1:
+	case SNDRV_CTL_POWER_D2:
+		if (card->power_state != power_state)
+			/* FIXME: pass the correct state value */
+			card->pm_resume(card, 0);
+		break;
+	case SNDRV_CTL_POWER_D3hot:
+	case SNDRV_CTL_POWER_D3cold:
+		if (card->power_state != power_state)
+			/* FIXME: pass the correct state value */
+			card->pm_suspend(card, 0);
+		break;
+	default:
+		return -EINVAL;
+	}
+	return 0;
+}
+#endif
+
 static int snd_ctl_ioctl(struct inode *inode, struct file *file,
 			 unsigned int cmd, unsigned long arg)
 {
@@ -1038,9 +1065,9 @@
 		if (!capable(CAP_SYS_ADMIN))
 			return -EPERM;
 #ifdef CONFIG_PM
-		if (card->set_power_state) {
+		if (card->pm_suspend && card->pm_resume) {
 			snd_power_lock(card);
-			err = card->set_power_state(card, err);
+			err = snd_ctl_set_power_state(card, err);
 			snd_power_unlock(card);
 		} else
 #endif
diff -Nru a/sound/core/init.c b/sound/core/init.c
--- a/sound/core/init.c	2004-05-26 15:01:35 -07:00
+++ b/sound/core/init.c	2004-05-26 15:01:35 -07:00
@@ -26,6 +26,8 @@
 #include <linux/slab.h>
 #include <linux/time.h>
 #include <linux/ctype.h>
+#include <linux/pci.h>
+#include <linux/pm.h>
 #include <sound/core.h>
 #include <sound/control.h>
 #include <sound/info.h>
@@ -254,6 +256,12 @@
 
 #ifdef CONFIG_PM
 	wake_up(&card->power_sleep);
+#ifdef CONFIG_ISA
+	if (card->pm_dev) {
+		pm_unregister(card->pm_dev);
+		card->pm_dev = NULL;
+	}
+#endif
 #endif
 
 	/* wait, until all devices are ready for the free operation */
@@ -708,4 +716,93 @@
 	remove_wait_queue(&card->power_sleep, &wait);
 	return result;
 }
+
+/**
+ * snd_card_set_pm_callback - set the PCI power-management callbacks
+ * @card: soundcard structure
+ * @suspend: suspend callback function
+ * @resume: resume callback function
+ * @private_data: private data to pass to the callback functions
+ *
+ * Sets the power-management callback functions of the card.
+ * These callbacks are called from ALSA's common PCI suspend/resume
+ * handler and from the control API.
+ */
+int snd_card_set_pm_callback(snd_card_t *card,
+			     int (*suspend)(snd_card_t *, unsigned int),
+			     int (*resume)(snd_card_t *, unsigned int),
+			     void *private_data)
+{
+	card->pm_suspend = suspend;
+	card->pm_resume = resume;
+	card->pm_private_data = private_data;
+	return 0;
+}
+
+static int snd_generic_pm_callback(struct pm_dev *dev, pm_request_t rqst, void *data)
+{
+	snd_card_t *card = dev->data;
+
+	switch (rqst) {
+	case PM_SUSPEND:
+		/* FIXME: the correct state value? */
+		card->pm_suspend(card, 0);
+		break;
+	case PM_RESUME:
+		/* FIXME: the correct state value? */
+		card->pm_resume(card, 0);
+		break;
+	}
+	return 0;
+}
+
+/**
+ * snd_card_set_dev_pm_callback - set the generic power-management callbacks
+ * @card: soundcard structure
+ * @type: PM device type (PM_XXX)
+ * @suspend: suspend callback function
+ * @resume: resume callback function
+ * @private_data: private data to pass to the callback functions
+ *
+ * Registers the power-management and sets the lowlevel callbacks for
+ * the given card with the given PM type.  These callbacks are called
+ * from the ALSA's common PM handler and from the control API.
+ */
+int snd_card_set_dev_pm_callback(snd_card_t *card, int type,
+				 int (*suspend)(snd_card_t *, unsigned int),
+				 int (*resume)(snd_card_t *, unsigned int),
+				 void *private_data)
+{
+	card->pm_dev = pm_register(type, 0, snd_generic_pm_callback);
+	if (! card->pm_dev)
+		return -ENOMEM;
+	card->pm_dev->data = card;
+	snd_card_set_pm_callback(card, suspend, resume, private_data);
+	return 0;
+}
+
+#ifdef CONFIG_PCI
+int snd_card_pci_suspend(struct pci_dev *dev, u32 state)
+{
+	snd_card_t *card = pci_get_drvdata(dev);
+	if (! card || ! card->pm_suspend)
+		return 0;
+	if (card->power_state == SNDRV_CTL_POWER_D3hot)
+		return 0;
+	/* FIXME: correct state value? */
+	return card->pm_suspend(card, 0);
+}
+
+int snd_card_pci_resume(struct pci_dev *dev)
+{
+	snd_card_t *card = pci_get_drvdata(dev);
+	if (! card || ! card->pm_resume)
+		return 0;
+	if (card->power_state == SNDRV_CTL_POWER_D0)
+		return 0;
+	/* FIXME: correct state value? */
+	return card->pm_resume(card, 0);
+}
+#endif
+
 #endif /* CONFIG_PM */
diff -Nru a/sound/core/memalloc.c b/sound/core/memalloc.c
--- a/sound/core/memalloc.c	2004-05-26 15:01:36 -07:00
+++ b/sound/core/memalloc.c	2004-05-26 15:01:36 -07:00
@@ -29,6 +29,7 @@
 #include <linux/slab.h>
 #include <linux/mm.h>
 #include <linux/dma-mapping.h>
+#include <linux/moduleparam.h>
 #include <asm/semaphore.h>
 #include <sound/memalloc.h>
 #ifdef CONFIG_SBUS
@@ -45,7 +46,8 @@
 #define SNDRV_CARDS	8
 #endif
 static int enable[SNDRV_CARDS] = {[0 ... (SNDRV_CARDS-1)] = 1};
-MODULE_PARM(enable, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+static int boot_devs;
+module_param_array(enable, bool, boot_devs, 0444);
 MODULE_PARM_DESC(enable, "Enable cards to allocate buffers.");
 
 /*
@@ -89,32 +91,7 @@
  *  Hacks
  */
 
-static void *snd_dma_alloc_coherent1(struct device *dev, size_t size,
-				     dma_addr_t *dma_handle, int flags)
-{
-	if (dev)
-		return dma_alloc_coherent(dev, size, dma_handle, flags);
-	else /* FIXME: dma_alloc_coherent does't always accept dev=NULL */
-		return pci_alloc_consistent(NULL, size, dma_handle);
-}
-
-static void snd_dma_free_coherent1(struct device *dev, size_t size, void *dma_addr,
-				   dma_addr_t dma_handle)
-{
-	if (dev)
-		return dma_free_coherent(dev, size, dma_addr, dma_handle);
-	else
-		return pci_free_consistent(NULL, size, dma_addr, dma_handle);
-}
-
-#undef dma_alloc_coherent
-#define dma_alloc_coherent snd_dma_alloc_coherent1
-#undef dma_free_coherent
-#define dma_free_coherent snd_dma_free_coherent1
-
-
 #if defined(__i386__) || defined(__ppc__) || defined(__x86_64__)
-
 /*
  * A hack to allocate large buffers via dma_alloc_coherent()
  *
@@ -135,14 +112,17 @@
 					 dma_addr_t *dma_handle, int flags)
 {
 	void *ret;
-	u64 dma_mask;
+	u64 dma_mask, coherent_dma_mask;
 
 	if (dev == NULL || !dev->dma_mask)
 		return dma_alloc_coherent(dev, size, dma_handle, flags);
 	dma_mask = *dev->dma_mask;
+	coherent_dma_mask = dev->coherent_dma_mask;
 	*dev->dma_mask = 0xffffffff; 	/* do without masking */
+	dev->coherent_dma_mask = 0xffffffff; 	/* do without masking */
 	ret = dma_alloc_coherent(dev, size, dma_handle, flags);
 	*dev->dma_mask = dma_mask;	/* restore */
+	dev->coherent_dma_mask = coherent_dma_mask;	/* restore */
 	if (ret) {
 		/* obtained address is out of range? */
 		if (((unsigned long)*dma_handle + size - 1) & ~dma_mask) {
@@ -152,8 +132,12 @@
 		}
 	} else {
 		/* wish to success now with the proper mask... */
-		if (dma_mask != 0xffffffffUL)
+		if (dma_mask != 0xffffffffUL) {
+			/* allocation with GFP_ATOMIC to avoid the long stall */
+			flags &= ~GFP_KERNEL;
+			flags |= GFP_ATOMIC;
 			ret = dma_alloc_coherent(dev, size, dma_handle, flags);
+		}
 	}
 	return ret;
 }
@@ -841,25 +825,6 @@
 module_init(snd_mem_init)
 module_exit(snd_mem_exit)
 
-
-#ifndef MODULE
-
-/* format is: snd-page-alloc=enable */
-
-static int __init snd_mem_setup(char *str)
-{
-	static unsigned __initdata nr_dev = 0;
-
-	if (nr_dev >= SNDRV_CARDS)
-		return 0;
-	(void)(get_option(&str,&enable[nr_dev]) == 2);
-	nr_dev++;
-	return 1;
-}
-
-__setup("snd-page-alloc=", snd_mem_setup);
-
-#endif
 
 /*
  * exports
diff -Nru a/sound/core/oss/pcm_oss.c b/sound/core/oss/pcm_oss.c
--- a/sound/core/oss/pcm_oss.c	2004-05-26 15:01:36 -07:00
+++ b/sound/core/oss/pcm_oss.c	2004-05-26 15:01:36 -07:00
@@ -31,6 +31,7 @@
 #include <linux/slab.h>
 #include <linux/time.h>
 #include <linux/vmalloc.h>
+#include <linux/moduleparam.h>
 #include <sound/core.h>
 #include <sound/minors.h>
 #include <sound/pcm.h>
@@ -45,17 +46,18 @@
 static int dsp_map[SNDRV_CARDS] = {[0 ... (SNDRV_CARDS-1)] = 0};
 static int adsp_map[SNDRV_CARDS] = {[0 ... (SNDRV_CARDS-1)] = 1};
 static int nonblock_open;
+static int boot_devs;
 
 MODULE_AUTHOR("Jaroslav Kysela <perex@suse.cz>, Abramo Bagnara <abramo@alsa-project.org>");
 MODULE_DESCRIPTION("PCM OSS emulation for ALSA.");
 MODULE_LICENSE("GPL");
-MODULE_PARM(dsp_map, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+module_param_array(dsp_map, int, boot_devs, 0444);
 MODULE_PARM_DESC(dsp_map, "PCM device number assigned to 1st OSS device.");
 MODULE_PARM_SYNTAX(dsp_map, "default:0,skill:advanced");
-MODULE_PARM(adsp_map, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+module_param_array(adsp_map, int, boot_devs, 0444);
 MODULE_PARM_DESC(adsp_map, "PCM device number assigned to 2nd OSS device.");
 MODULE_PARM_SYNTAX(adsp_map, "default:1,skill:advanced");
-MODULE_PARM(nonblock_open, "i");
+module_param(nonblock_open, bool, 0644);
 MODULE_PARM_DESC(nonblock_open, "Don't block opening busy PCM devices.");
 MODULE_PARM_SYNTAX(nonblock_open, "default:0,skill:advanced");
 MODULE_ALIAS_SNDRV_MINOR(SNDRV_MINOR_OSS_PCM);
@@ -1514,14 +1516,14 @@
 		runtime->oss.prev_hw_ptr_interrupt = delay;
 		if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
 			snd_pcm_oss_simulate_fill(substream, delay);
-		info.bytes = snd_pcm_oss_bytes(substream, runtime->status->hw_ptr);
+		info.bytes = snd_pcm_oss_bytes(substream, runtime->status->hw_ptr) & INT_MAX;
 	} else {
 		delay = snd_pcm_oss_bytes(substream, delay) + fixup;
 		info.blocks = delay / runtime->oss.period_bytes;
 		if (stream == SNDRV_PCM_STREAM_PLAYBACK)
-			info.bytes = runtime->oss.bytes - delay;
+			info.bytes = (runtime->oss.bytes - delay) & INT_MAX;
 		else
-			info.bytes = runtime->oss.bytes + delay;
+			info.bytes = (runtime->oss.bytes + delay) & INT_MAX;
 	}
 	if (copy_to_user(_info, &info, sizeof(info)))
 		return -EFAULT;
@@ -2510,24 +2512,3 @@
 
 module_init(alsa_pcm_oss_init)
 module_exit(alsa_pcm_oss_exit)
-
-#ifndef MODULE
-
-/* format is: snd-pcm-oss=dsp_map,adsp_map[,nonblock_open] */
-
-static int __init alsa_pcm_oss_setup(char *str)
-{
-	static unsigned __initdata nr_dev = 0;
-
-	if (nr_dev >= SNDRV_CARDS)
-		return 0;
-	(void)(get_option(&str,&dsp_map[nr_dev]) == 2 &&
-	       get_option(&str,&adsp_map[nr_dev]) == 2);
-	(void)(get_option(&str,&nonblock_open) == 2);
-	nr_dev++;
-	return 1;
-}
-
-__setup("snd-pcm-oss=", alsa_pcm_oss_setup);
-
-#endif /* !MODULE */
diff -Nru a/sound/core/pcm_memory.c b/sound/core/pcm_memory.c
--- a/sound/core/pcm_memory.c	2004-05-26 15:01:36 -07:00
+++ b/sound/core/pcm_memory.c	2004-05-26 15:01:36 -07:00
@@ -23,18 +23,19 @@
 #include <asm/io.h>
 #include <linux/time.h>
 #include <linux/init.h>
+#include <linux/moduleparam.h>
 #include <sound/core.h>
 #include <sound/pcm.h>
 #include <sound/info.h>
 #include <sound/initval.h>
 
 static int preallocate_dma = 1;
-MODULE_PARM(preallocate_dma, "i");
+module_param(preallocate_dma, int, 0444);
 MODULE_PARM_DESC(preallocate_dma, "Preallocate DMA memory when the PCM devices are initialized.");
 MODULE_PARM_SYNTAX(preallocate_dma, SNDRV_BOOLEAN_TRUE_DESC);
 
 static int maximum_substreams = 4;
-MODULE_PARM(maximum_substreams, "i");
+module_param(maximum_substreams, int, 0444);
 MODULE_PARM_DESC(maximum_substreams, "Maximum substreams with preallocated DMA memory.");
 MODULE_PARM_SYNTAX(maximum_substreams, SNDRV_BOOLEAN_TRUE_DESC);
 
@@ -223,9 +224,13 @@
  */
 static inline void setup_pcm_id(snd_pcm_substream_t *subs)
 {
-	if (! subs->dma_device.id)
+	if (! subs->dma_device.id) {
 		subs->dma_device.id = subs->pcm->device << 16 |
 			subs->stream << 8 | (subs->number + 1);
+		if (subs->dma_device.type == SNDRV_DMA_TYPE_CONTINUOUS ||
+		    subs->dma_device.dev == NULL)
+			subs->dma_device.id |= (subs->pcm->card->number + 1) << 24;
+	}
 }
 
 /**
diff -Nru a/sound/core/pcm_misc.c b/sound/core/pcm_misc.c
--- a/sound/core/pcm_misc.c	2004-05-26 15:01:36 -07:00
+++ b/sound/core/pcm_misc.c	2004-05-26 15:01:36 -07:00
@@ -230,7 +230,7 @@
 		return 64;
 	case SNDRV_PCM_FORMAT_IEC958_SUBFRAME_LE:
 	case SNDRV_PCM_FORMAT_IEC958_SUBFRAME_BE:
-		return 24;
+		return 32;
 	case SNDRV_PCM_FORMAT_MU_LAW:
 	case SNDRV_PCM_FORMAT_A_LAW:
 		return 8;
diff -Nru a/sound/core/pcm_native.c b/sound/core/pcm_native.c
--- a/sound/core/pcm_native.c	2004-05-26 15:01:35 -07:00
+++ b/sound/core/pcm_native.c	2004-05-26 15:01:35 -07:00
@@ -1038,7 +1038,7 @@
 
 	snd_power_lock(card);
 	if ((res = snd_power_wait(card, SNDRV_CTL_POWER_D0, substream->ffile)) >= 0)
-		return snd_pcm_action_lock_irq(&snd_pcm_action_resume, substream, 0, 0);
+		res = snd_pcm_action_lock_irq(&snd_pcm_action_resume, substream, 0, 0);
 	snd_power_unlock(card);
 	return res;
 }
@@ -2335,6 +2335,45 @@
 	return err;
 }
 		
+static int snd_pcm_sync_ptr(snd_pcm_substream_t *substream, struct sndrv_pcm_sync_ptr *_sync_ptr)
+{
+	snd_pcm_runtime_t *runtime = substream->runtime;
+	struct sndrv_pcm_sync_ptr sync_ptr;
+	volatile struct sndrv_pcm_mmap_status *status;
+	volatile struct sndrv_pcm_mmap_control *control;
+	int err;
+
+	memset(&sync_ptr, 0, sizeof(sync_ptr));
+	if (get_user(sync_ptr.flags, (unsigned int *) &(_sync_ptr->flags)))
+		return -EFAULT;
+	if (copy_from_user(&sync_ptr.c.control, &(_sync_ptr->c.control), sizeof(struct sndrv_pcm_mmap_control)))
+		return -EFAULT;	
+	status = runtime->status;
+	control = runtime->control;
+	if (sync_ptr.flags & SNDRV_PCM_SYNC_PTR_HWSYNC) {
+		err = snd_pcm_hwsync(substream);
+		if (err < 0)
+			return err;
+	}
+	snd_pcm_stream_lock_irq(substream);
+	if (!(sync_ptr.flags & SNDRV_PCM_SYNC_PTR_APPL))
+		control->appl_ptr = sync_ptr.c.control.appl_ptr;
+	else
+		sync_ptr.c.control.appl_ptr = control->appl_ptr;
+	if (!(sync_ptr.flags & SNDRV_PCM_SYNC_PTR_AVAIL_MIN))
+		control->avail_min = sync_ptr.c.control.avail_min;
+	else
+		sync_ptr.c.control.avail_min = control->avail_min;
+	sync_ptr.s.status.state = status->state;
+	sync_ptr.s.status.hw_ptr = status->hw_ptr;
+	sync_ptr.s.status.tstamp = status->tstamp;
+	sync_ptr.s.status.suspended_state = status->suspended_state;
+	snd_pcm_stream_unlock_irq(substream);
+	if (copy_to_user(_sync_ptr, &sync_ptr, sizeof(sync_ptr)))
+		return -EFAULT;
+	return 0;
+}
+		
 static int snd_pcm_playback_ioctl1(snd_pcm_substream_t *substream,
 				   unsigned int cmd, void *arg);
 static int snd_pcm_capture_ioctl1(snd_pcm_substream_t *substream,
@@ -2388,6 +2427,8 @@
 		return snd_pcm_hwsync(substream);
 	case SNDRV_PCM_IOCTL_DELAY:
 		return snd_pcm_delay(substream, (snd_pcm_sframes_t *) arg);
+	case SNDRV_PCM_IOCTL_SYNC_PTR:
+		return snd_pcm_sync_ptr(substream, (struct sndrv_pcm_sync_ptr *) arg);
 	case SNDRV_PCM_IOCTL_HW_REFINE_OLD:
 		return snd_pcm_hw_refine_old_user(substream, (struct sndrv_pcm_hw_params_old *) arg);
 	case SNDRV_PCM_IOCTL_HW_PARAMS_OLD:
diff -Nru a/sound/core/rawmidi.c b/sound/core/rawmidi.c
--- a/sound/core/rawmidi.c	2004-05-26 15:01:35 -07:00
+++ b/sound/core/rawmidi.c	2004-05-26 15:01:35 -07:00
@@ -27,6 +27,7 @@
 #include <linux/slab.h>
 #include <linux/time.h>
 #include <linux/wait.h>
+#include <linux/moduleparam.h>
 #include <sound/rawmidi.h>
 #include <sound/info.h>
 #include <sound/control.h>
@@ -40,10 +41,11 @@
 #ifdef CONFIG_SND_OSSEMUL
 static int midi_map[SNDRV_CARDS] = {[0 ... (SNDRV_CARDS-1)] = 0};
 static int amidi_map[SNDRV_CARDS] = {[0 ... (SNDRV_CARDS-1)] = 1};
-MODULE_PARM(midi_map, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+static int boot_devs;
+module_param_array(midi_map, int, boot_devs, 0444);
 MODULE_PARM_DESC(midi_map, "Raw MIDI device number assigned to 1st OSS device.");
 MODULE_PARM_SYNTAX(midi_map, "default:0,skill:advanced");
-MODULE_PARM(amidi_map, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+module_param_array(amidi_map, int, boot_devs, 0444);
 MODULE_PARM_DESC(amidi_map, "Raw MIDI device number assigned to 2nd OSS device.");
 MODULE_PARM_SYNTAX(amidi_map, "default:1,skill:advanced");
 #endif /* CONFIG_SND_OSSEMUL */
@@ -1636,26 +1638,6 @@
 
 module_init(alsa_rawmidi_init)
 module_exit(alsa_rawmidi_exit)
-
-#ifndef MODULE
-#ifdef CONFIG_SND_OSSEMUL
-/* format is: snd-rawmidi=midi_map,amidi_map */
-
-static int __init alsa_rawmidi_setup(char *str)
-{
-	static unsigned __initdata nr_dev = 0;
-
-	if (nr_dev >= SNDRV_CARDS)
-		return 0;
-	(void)(get_option(&str,&midi_map[nr_dev]) == 2 &&
-	       get_option(&str,&amidi_map[nr_dev]) == 2);
-	nr_dev++;
-	return 1;
-}
-
-__setup("snd-rawmidi=", alsa_rawmidi_setup);
-#endif /* CONFIG_SND_OSSEMUL */
-#endif /* ifndef MODULE */
 
 EXPORT_SYMBOL(snd_rawmidi_output_params);
 EXPORT_SYMBOL(snd_rawmidi_input_params);
diff -Nru a/sound/core/rtctimer.c b/sound/core/rtctimer.c
--- a/sound/core/rtctimer.c	2004-05-26 15:01:36 -07:00
+++ b/sound/core/rtctimer.c	2004-05-26 15:01:36 -07:00
@@ -25,6 +25,7 @@
 #include <linux/time.h>
 #include <linux/threads.h>
 #include <linux/interrupt.h>
+#include <linux/moduleparam.h>
 #include <sound/core.h>
 #include <sound/timer.h>
 #include <sound/info.h>
@@ -177,21 +178,9 @@
 module_init(rtctimer_init)
 module_exit(rtctimer_exit)
 
-MODULE_PARM(rtctimer_freq, "i");
+module_param(rtctimer_freq, int, 0444);
 MODULE_PARM_DESC(rtctimer_freq, "timer frequency in Hz");
 
 MODULE_LICENSE("GPL");
-
-#ifndef MODULE
-/* format is: snd-rtctimer=freq */
-
-static int __init rtctimer_setup(char *str)
-{
-	(void)(get_option(&str,&rtctimer_freq) == 2);
-	return 1;
-}
-
-__setup("snd-rtctimer=", rtctimer_setup);
-#endif /* ifndef MODULE */
 
 #endif /* CONFIG_RTC || CONFIG_RTC_MODULE */
diff -Nru a/sound/core/seq/oss/seq_oss.c b/sound/core/seq/oss/seq_oss.c
--- a/sound/core/seq/oss/seq_oss.c	2004-05-26 15:01:36 -07:00
+++ b/sound/core/seq/oss/seq_oss.c	2004-05-26 15:01:36 -07:00
@@ -22,6 +22,7 @@
 
 #include <sound/driver.h>
 #include <linux/init.h>
+#include <linux/moduleparam.h>
 #include <sound/core.h>
 #include <sound/minors.h>
 #include <sound/initval.h>
@@ -40,7 +41,7 @@
 MODULE_ALIAS_SNDRV_MINOR(SNDRV_MINOR_OSS_MUSIC);
 
 #ifdef SNDRV_SEQ_OSS_DEBUG
-MODULE_PARM(seq_oss_debug, "i");
+module_param(seq_oss_debug, int, 0644);
 MODULE_PARM_DESC(seq_oss_debug, "debug option");
 int seq_oss_debug = 0;
 #endif
diff -Nru a/sound/core/seq/oss/seq_oss_init.c b/sound/core/seq/oss/seq_oss_init.c
--- a/sound/core/seq/oss/seq_oss_init.c	2004-05-26 15:01:35 -07:00
+++ b/sound/core/seq/oss/seq_oss_init.c	2004-05-26 15:01:35 -07:00
@@ -28,17 +28,18 @@
 #include "seq_oss_timer.h"
 #include "seq_oss_event.h"
 #include <linux/init.h>
+#include <linux/moduleparam.h>
 
 /*
  * common variables
  */
-MODULE_PARM(maxqlen, "i");
+static int maxqlen = SNDRV_SEQ_OSS_MAX_QLEN;
+module_param(maxqlen, int, 0444);
 MODULE_PARM_DESC(maxqlen, "maximum queue length");
 
 static int system_client = -1; /* ALSA sequencer client number */
 static int system_port = -1;
 
-int maxqlen = SNDRV_SEQ_OSS_MAX_QLEN;
 static int num_clients;
 static seq_oss_devinfo_t *client_table[SNDRV_SEQ_OSS_MAX_CLIENTS];
 
diff -Nru a/sound/core/seq/seq.c b/sound/core/seq/seq.c
--- a/sound/core/seq/seq.c	2004-05-26 15:01:36 -07:00
+++ b/sound/core/seq/seq.c	2004-05-26 15:01:36 -07:00
@@ -21,6 +21,7 @@
 
 #include <sound/driver.h>
 #include <linux/init.h>
+#include <linux/moduleparam.h>
 #include <sound/core.h>
 #include <sound/initval.h>
 
@@ -34,7 +35,11 @@
 #include "seq_info.h"
 #include <sound/seq_device.h>
 
+#if defined(CONFIG_SND_SEQ_DUMMY_MODULE)
+int seq_client_load[64] = {[0] = SNDRV_SEQ_CLIENT_DUMMY, [1 ... 63] = -1};
+#else
 int seq_client_load[64] = {[0 ... 63] = -1};
+#endif
 int seq_default_timer_class = SNDRV_TIMER_CLASS_GLOBAL;
 int seq_default_timer_sclass = SNDRV_TIMER_SCLASS_NONE;
 int seq_default_timer_card = -1;
@@ -48,19 +53,20 @@
 MODULE_CLASSES("{sound}");
 MODULE_SUPPORTED_DEVICE("sound");
 
-MODULE_PARM(seq_client_load, "1-64i");
+static int boot_devs;
+module_param_array(seq_client_load, int, boot_devs, 0444);
 MODULE_PARM_DESC(seq_client_load, "The numbers of global (system) clients to load through kmod.");
-MODULE_PARM(seq_default_timer_class, "i");
+module_param(seq_default_timer_class, int, 0644);
 MODULE_PARM_DESC(seq_default_timer_class, "The default timer class.");
-MODULE_PARM(seq_default_timer_sclass, "i");
+module_param(seq_default_timer_sclass, int, 0644);
 MODULE_PARM_DESC(seq_default_timer_sclass, "The default timer slave class.");
-MODULE_PARM(seq_default_timer_card, "i");
+module_param(seq_default_timer_card, int, 0644);
 MODULE_PARM_DESC(seq_default_timer_card, "The default timer card number.");
-MODULE_PARM(seq_default_timer_device, "i");
+module_param(seq_default_timer_device, int, 0644);
 MODULE_PARM_DESC(seq_default_timer_device, "The default timer device number.");
-MODULE_PARM(seq_default_timer_subdevice, "i");
+module_param(seq_default_timer_subdevice, int, 0644);
 MODULE_PARM_DESC(seq_default_timer_subdevice, "The default timer subdevice number.");
-MODULE_PARM(seq_default_timer_resolution, "i");
+module_param(seq_default_timer_resolution, int, 0644);
 MODULE_PARM_DESC(seq_default_timer_resolution, "The default timer resolution in Hz.");
 
 /*
diff -Nru a/sound/core/seq/seq_dummy.c b/sound/core/seq/seq_dummy.c
--- a/sound/core/seq/seq_dummy.c	2004-05-26 15:01:36 -07:00
+++ b/sound/core/seq/seq_dummy.c	2004-05-26 15:01:36 -07:00
@@ -21,6 +21,7 @@
 #include <sound/driver.h>
 #include <linux/init.h>
 #include <linux/slab.h>
+#include <linux/moduleparam.h>
 #include <sound/core.h>
 #include "seq_clientmgr.h"
 #include <sound/initval.h>
@@ -64,12 +65,14 @@
 MODULE_LICENSE("GPL");
 MODULE_CLASSES("{sound}");
 MODULE_SUPPORTED_DEVICE("sound");
-MODULE_PARM(ports, "i");
+
+static int ports = 1;
+static int duplex = 0;
+
+module_param(ports, int, 0444);
 MODULE_PARM_DESC(ports, "number of ports to be created");
-MODULE_PARM(duplex, "i");
+module_param(duplex, bool, 0444);
 MODULE_PARM_DESC(duplex, "create DUPLEX ports");
-int ports = 1;
-int duplex = 0;
 
 typedef struct snd_seq_dummy_port {
 	int client;
diff -Nru a/sound/core/seq/seq_midi.c b/sound/core/seq/seq_midi.c
--- a/sound/core/seq/seq_midi.c	2004-05-26 15:01:36 -07:00
+++ b/sound/core/seq/seq_midi.c	2004-05-26 15:01:36 -07:00
@@ -31,6 +31,7 @@
 #include <linux/slab.h>
 #include <linux/errno.h>
 #include <linux/string.h>
+#include <linux/moduleparam.h>
 #include <asm/semaphore.h>
 #include <sound/core.h>
 #include <sound/rawmidi.h>
@@ -45,10 +46,10 @@
 MODULE_CLASSES("{sound}");
 MODULE_SUPPORTED_DEVICE("sound");
 int output_buffer_size = PAGE_SIZE;
-MODULE_PARM(output_buffer_size, "i");
+module_param(output_buffer_size, int, 0644);
 MODULE_PARM_DESC(output_buffer_size, "Output buffer size in bytes.");
 int input_buffer_size = PAGE_SIZE;
-MODULE_PARM(input_buffer_size, "i");
+module_param(input_buffer_size, int, 0644);
 MODULE_PARM_DESC(input_buffer_size, "Input buffer size in bytes.");
 
 /* data for this midi synth driver */
diff -Nru a/sound/core/sound.c b/sound/core/sound.c
--- a/sound/core/sound.c	2004-05-26 15:01:36 -07:00
+++ b/sound/core/sound.c	2004-05-26 15:01:36 -07:00
@@ -23,6 +23,7 @@
 #include <linux/init.h>
 #include <linux/slab.h>
 #include <linux/time.h>
+#include <linux/moduleparam.h>
 #include <sound/core.h>
 #include <sound/minors.h>
 #include <sound/info.h>
@@ -45,15 +46,15 @@
 MODULE_LICENSE("GPL");
 MODULE_CLASSES("{sound}");
 MODULE_SUPPORTED_DEVICE("sound");
-MODULE_PARM(major, "i");
+module_param(major, int, 0444);
 MODULE_PARM_DESC(major, "Major # for sound driver.");
 MODULE_PARM_SYNTAX(major, "default:116,skill:devel");
-MODULE_PARM(cards_limit, "i");
+module_param(cards_limit, int, 0444);
 MODULE_PARM_DESC(cards_limit, "Count of auto-loadable soundcards.");
 MODULE_PARM_SYNTAX(cards_limit, "default:8,skill:advanced");
 MODULE_ALIAS_CHARDEV_MAJOR(CONFIG_SND_MAJOR);
 #ifdef CONFIG_DEVFS_FS
-MODULE_PARM(device_mode, "i");
+module_param(device_mode, int, 0444);
 MODULE_PARM_DESC(device_mode, "Device file permission mask for devfs.");
 MODULE_PARM_SYNTAX(device_mode, "default:0666,base:8");
 #endif
@@ -465,6 +466,12 @@
 EXPORT_SYMBOL(snd_card_file_remove);
 #ifdef CONFIG_PM
 EXPORT_SYMBOL(snd_power_wait);
+EXPORT_SYMBOL(snd_card_set_pm_callback);
+EXPORT_SYMBOL(snd_card_set_dev_pm_callback);
+#ifdef CONFIG_PCI
+EXPORT_SYMBOL(snd_card_pci_suspend);
+EXPORT_SYMBOL(snd_card_pci_resume);
+#endif
 #endif
   /* device.c */
 EXPORT_SYMBOL(snd_device_new);
diff -Nru a/sound/core/timer.c b/sound/core/timer.c
--- a/sound/core/timer.c	2004-05-26 15:01:36 -07:00
+++ b/sound/core/timer.c	2004-05-26 15:01:36 -07:00
@@ -24,6 +24,7 @@
 #include <linux/init.h>
 #include <linux/slab.h>
 #include <linux/time.h>
+#include <linux/moduleparam.h>
 #include <sound/core.h>
 #include <sound/timer.h>
 #include <sound/control.h>
@@ -46,7 +47,7 @@
 MODULE_DESCRIPTION("ALSA timer interface");
 MODULE_LICENSE("GPL");
 MODULE_CLASSES("{sound}");
-MODULE_PARM(timer_limit, "i");
+module_param(timer_limit, int, 0444);
 MODULE_PARM_DESC(timer_limit, "Maximum global timers in system.");
 
 typedef struct {
@@ -1512,7 +1513,6 @@
 
 static int snd_timer_user_params(struct file *file, snd_timer_params_t *_params)
 {
-	unsigned long flags;
 	snd_timer_user_t *tu;
 	snd_timer_params_t params;
 	snd_timer_t *t;
@@ -1548,18 +1548,17 @@
 		goto _end;
 	}
 	snd_timer_stop(tu->timeri);
-	spin_lock_irqsave(&t->lock, flags);
-	if (params.flags & SNDRV_TIMER_PSFLG_AUTO) {
+	spin_lock_irq(&t->lock);
+	tu->timeri->flags &= ~(SNDRV_TIMER_IFLG_AUTO|
+			       SNDRV_TIMER_IFLG_EXCLUSIVE|
+			       SNDRV_TIMER_IFLG_EARLY_EVENT);
+	if (params.flags & SNDRV_TIMER_PSFLG_AUTO)
 		tu->timeri->flags |= SNDRV_TIMER_IFLG_AUTO;
-	} else {
-		tu->timeri->flags &= ~SNDRV_TIMER_IFLG_AUTO;
-	}
-	if (params.flags & SNDRV_TIMER_PSFLG_EXCLUSIVE) {
+	if (params.flags & SNDRV_TIMER_PSFLG_EXCLUSIVE)
 		tu->timeri->flags |= SNDRV_TIMER_IFLG_EXCLUSIVE;
-	} else {
-		tu->timeri->flags &= ~SNDRV_TIMER_IFLG_EXCLUSIVE;
-	}
-	spin_unlock_irqrestore(&t->lock, flags);
+	if (params.flags & SNDRV_TIMER_PSFLG_EARLY_EVENT)
+		tu->timeri->flags |= SNDRV_TIMER_IFLG_EARLY_EVENT;
+	spin_unlock_irq(&t->lock);
 	if (params.queue_size > 0 && (unsigned int)tu->queue_size != params.queue_size) {
 		if (tu->tread) {
 			ttr = (snd_timer_tread_t *)kmalloc(params.queue_size * sizeof(snd_timer_tread_t), GFP_KERNEL);
@@ -1577,6 +1576,24 @@
 			}
 		}
 	}
+	tu->qhead = tu->qtail = tu->qused = 0;
+	if (tu->timeri->flags & SNDRV_TIMER_IFLG_EARLY_EVENT) {
+		if (tu->tread) {
+			snd_timer_tread_t tread;
+			tread.event = SNDRV_TIMER_EVENT_EARLY;
+			tread.tstamp.tv_sec = 0;
+			tread.tstamp.tv_nsec = 0;
+			tread.val = 0;
+			snd_timer_user_append_to_tqueue(tu, &tread);
+		} else {
+			snd_timer_read_t *r = &tu->queue[0];
+			r->resolution = 0;
+			r->ticks = 0;
+			tu->qused++;
+			tu->qtail++;
+		}
+		
+	}
 	tu->filter = params.filter;
 	tu->ticks = params.ticks;
 	err = 0;
@@ -1588,7 +1605,6 @@
 
 static int snd_timer_user_status(struct file *file, snd_timer_status_t *_status)
 {
-	unsigned long flags;
 	snd_timer_user_t *tu;
 	snd_timer_status_t status;
 	
@@ -1599,9 +1615,9 @@
 	status.resolution = snd_timer_resolution(tu->timeri);
 	status.lost = tu->timeri->lost;
 	status.overrun = tu->overrun;
-	spin_lock_irqsave(&tu->qlock, flags);
+	spin_lock_irq(&tu->qlock);
 	status.queue = tu->qused;
-	spin_unlock_irqrestore(&tu->qlock, flags);
+	spin_unlock_irq(&tu->qlock);
 	if (copy_to_user(_status, &status, sizeof(status)))
 		return -EFAULT;
 	return 0;
@@ -1847,18 +1863,6 @@
 
 module_init(alsa_timer_init)
 module_exit(alsa_timer_exit)
-
-#ifndef MODULE
-/* format is: snd-timer=timer_limit */
-
-static int __init alsa_timer_setup(char *str)
-{
-	(void)(get_option(&str,&timer_limit) == 2);
-	return 1;
-}
-
-__setup("snd-timer=", alsa_timer_setup);
-#endif /* ifndef MODULE */
 
 EXPORT_SYMBOL(snd_timer_open);
 EXPORT_SYMBOL(snd_timer_close);
diff -Nru a/sound/drivers/dummy.c b/sound/drivers/dummy.c
--- a/sound/drivers/dummy.c	2004-05-26 15:01:36 -07:00
+++ b/sound/drivers/dummy.c	2004-05-26 15:01:36 -07:00
@@ -24,11 +24,11 @@
 #include <linux/slab.h>
 #include <linux/time.h>
 #include <linux/wait.h>
+#include <linux/moduleparam.h>
 #include <sound/core.h>
 #include <sound/control.h>
 #include <sound/pcm.h>
 #include <sound/rawmidi.h>
-#define SNDRV_GET_ID
 #include <sound/initval.h>
 
 MODULE_AUTHOR("Jaroslav Kysela <perex@suse.cz>");
@@ -129,23 +129,24 @@
 static int pcm_devs[SNDRV_CARDS] = {[0 ... (SNDRV_CARDS - 1)] = 1};
 static int pcm_substreams[SNDRV_CARDS] = {[0 ... (SNDRV_CARDS - 1)] = 8};
 //static int midi_devs[SNDRV_CARDS] = {[0 ... (SNDRV_CARDS - 1)] = 2};
+static int boot_devs;
 
-MODULE_PARM(index, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+module_param_array(index, int, boot_devs, 0444);
 MODULE_PARM_DESC(index, "Index value for dummy soundcard.");
 MODULE_PARM_SYNTAX(index, SNDRV_INDEX_DESC);
-MODULE_PARM(id, "1-" __MODULE_STRING(SNDRV_CARDS) "s");
+module_param_array(id, charp, boot_devs, 0444);
 MODULE_PARM_DESC(id, "ID string for dummy soundcard.");
 MODULE_PARM_SYNTAX(id, SNDRV_ID_DESC);
-MODULE_PARM(enable, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+module_param_array(enable, bool, boot_devs, 0444);
 MODULE_PARM_DESC(enable, "Enable this dummy soundcard.");
 MODULE_PARM_SYNTAX(enable, SNDRV_ENABLE_DESC);
-MODULE_PARM(pcm_devs, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+module_param_array(pcm_devs, int, boot_devs, 0444);
 MODULE_PARM_DESC(pcm_devs, "PCM devices # (0-4) for dummy driver.");
 MODULE_PARM_SYNTAX(pcm_devs, SNDRV_ENABLED ",allows:{{0,4}},default:1,dialog:list");
-MODULE_PARM(pcm_substreams, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+module_param_array(pcm_substreams, int, boot_devs, 0444);
 MODULE_PARM_DESC(pcm_substreams, "PCM substreams # (1-16) for dummy driver.");
 MODULE_PARM_SYNTAX(pcm_substreams, SNDRV_ENABLED ",allows:{{1,16}},default:8,dialog:list");
-//MODULE_PARM(midi_devs, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+//module_param_array(midi_devs, int, boot_devs, 0444);
 //MODULE_PARM_DESC(midi_devs, "MIDI devices # (0-2) for dummy driver.");
 //MODULE_PARM_SYNTAX(midi_devs, SNDRV_ENABLED ",allows:{{0,2}},default:8,dialog:list");
 
@@ -661,27 +662,3 @@
 
 module_init(alsa_card_dummy_init)
 module_exit(alsa_card_dummy_exit)
-
-#ifndef MODULE
-
-/* format is: snd-dummy=enable,index,id,
-			pcm_devs,pcm_substreams */
-
-static int __init alsa_card_dummy_setup(char *str)
-{
-	static unsigned __initdata nr_dev = 0;
-
-	if (nr_dev >= SNDRV_CARDS)
-		return 0;
-	(void)(get_option(&str,&enable[nr_dev]) == 2 &&
-	       get_option(&str,&index[nr_dev]) == 2 &&
-	       get_id(&str,&id[nr_dev]) == 2 &&
-	       get_option(&str,&pcm_devs[nr_dev]) == 2 &&
-	       get_option(&str,&pcm_substreams[nr_dev]) == 2);
-	nr_dev++;
-	return 1;
-}
-
-__setup("snd-dummy=", alsa_card_dummy_setup);
-
-#endif /* ifndef MODULE */
diff -Nru a/sound/drivers/mpu401/mpu401.c b/sound/drivers/mpu401/mpu401.c
--- a/sound/drivers/mpu401/mpu401.c	2004-05-26 15:01:36 -07:00
+++ b/sound/drivers/mpu401/mpu401.c	2004-05-26 15:01:36 -07:00
@@ -30,9 +30,9 @@
 #ifdef CONFIG_ACPI_BUS
 #include <acpi/acpi_bus.h>
 #endif
+#include <linux/moduleparam.h>
 #include <sound/core.h>
 #include <sound/mpu401.h>
-#define SNDRV_GET_ID
 #include <sound/initval.h>
 
 #ifdef CONFIG_ACPI_BUS
@@ -55,29 +55,30 @@
 #ifdef CONFIG_X86_PC9800
 static int pc98ii[SNDRV_CARDS];				/* PC98-II dauther board */
 #endif
+static int boot_devs;
 
-MODULE_PARM(index, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+module_param_array(index, int, boot_devs, 0444);
 MODULE_PARM_DESC(index, "Index value for MPU-401 device.");
 MODULE_PARM_SYNTAX(index, SNDRV_INDEX_DESC);
-MODULE_PARM(id, "1-" __MODULE_STRING(SNDRV_CARDS) "s");
+module_param_array(id, charp, boot_devs, 0444);
 MODULE_PARM_DESC(id, "ID string for MPU-401 device.");
 MODULE_PARM_SYNTAX(id, SNDRV_ID_DESC);
-MODULE_PARM(enable, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+module_param_array(enable, bool, boot_devs, 0444);
 MODULE_PARM_DESC(enable, "Enable MPU-401 device.");
 MODULE_PARM_SYNTAX(enable, SNDRV_ENABLE_DESC);
 #ifdef USE_ACPI_PNP
-MODULE_PARM(acpipnp, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+module_param_array(acpipnp, bool, boot_devs, 0444);
 MODULE_PARM_DESC(acpipnp, "ACPI PnP detection for MPU-401 device.");
 MODULE_PARM_SYNTAX(acpipnp, SNDRV_ENABLED "," SNDRV_BOOLEAN_TRUE_DESC);
 #endif
-MODULE_PARM(port, "1-" __MODULE_STRING(SNDRV_CARDS) "l");
+module_param_array(port, long, boot_devs, 0444);
 MODULE_PARM_DESC(port, "Port # for MPU-401 device.");
 MODULE_PARM_SYNTAX(port, SNDRV_PORT12_DESC);
-MODULE_PARM(irq, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+module_param_array(irq, int, boot_devs, 0444);
 MODULE_PARM_DESC(irq, "IRQ # for MPU-401 device.");
 MODULE_PARM_SYNTAX(irq, SNDRV_IRQ_DESC);
 #ifdef CONFIG_X86_PC9800
-MODULE_PARM(pc98ii, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+module_param_array(pc98ii, bool, boot_devs, 0444);
 MODULE_PARM_DESC(pc98ii, "Roland MPU-PC98II support.");
 MODULE_PARM_SYNTAX(pc98ii, SNDRV_BOOLEAN_FALSE_DESC);
 #endif
@@ -303,35 +304,3 @@
 
 module_init(alsa_card_mpu401_init)
 module_exit(alsa_card_mpu401_exit)
-
-#ifndef MODULE
-
-/* format is: snd-mpu401=enable,index,id,acpipnp[,pc98ii],port,irq */
-
-static int __init alsa_card_mpu401_setup(char *str)
-{
-	static unsigned __initdata nr_dev = 0;
-	int __attribute__ ((__unused__)) pnp = INT_MAX;
-
-	if (nr_dev >= SNDRV_CARDS)
-		return 0;
-	(void)(get_option(&str,&enable[nr_dev]) == 2 &&
-	       get_option(&str,&index[nr_dev]) == 2 &&
-	       get_id(&str,&id[nr_dev]) == 2 &&
-	       get_option(&str,&pnp) == 2 &&
-#ifdef CONFIG_X86_PC9800
-	       get_option(&str,&pc98ii[nr_dev]) == 2 &&
-#endif
-	       get_option_long(&str,&port[nr_dev]) == 2 &&
-	       get_option(&str,&irq[nr_dev]) == 2);
-#ifdef USE_ACPI_PNP
-	if (pnp != INT_MAX)
-		acpipnp[nr_dev] = pnp;
-#endif
-	nr_dev++;
-	return 1;
-}
-
-__setup("snd-mpu401=", alsa_card_mpu401_setup);
-
-#endif /* ifndef MODULE */
diff -Nru a/sound/drivers/mtpav.c b/sound/drivers/mtpav.c
--- a/sound/drivers/mtpav.c	2004-05-26 15:01:36 -07:00
+++ b/sound/drivers/mtpav.c	2004-05-26 15:01:36 -07:00
@@ -55,8 +55,8 @@
 #include <linux/interrupt.h>
 #include <linux/slab.h>
 #include <linux/ioport.h>
+#include <linux/moduleparam.h>
 #include <sound/core.h>
-#define SNDRV_GET_ID
 #include <sound/initval.h>
 #include <sound/rawmidi.h>
 #include <linux/delay.h>
@@ -83,19 +83,19 @@
 static int irq = MTPAV_IRQ;		/* 7, 5 */
 static int hwports = MTPAV_MAX_PORTS;	/* use hardware ports 1-8 */
 
-MODULE_PARM(index, "i");
+module_param(index, int, 0444);
 MODULE_PARM_DESC(index, "Index value for MotuMTPAV MIDI.");
 MODULE_PARM_SYNTAX(index, SNDRV_INDEX_DESC);
-MODULE_PARM(id, "s");
+module_param(id, charp, 0444);
 MODULE_PARM_DESC(id, "ID string for MotuMTPAV MIDI.");
 MODULE_PARM_SYNTAX(id, SNDRV_ID_DESC);
-MODULE_PARM(port, "l");
+module_param(port, long, 0444);
 MODULE_PARM_DESC(port, "Parallel port # for MotuMTPAV MIDI.");
 MODULE_PARM_SYNTAX(port, SNDRV_ENABLED ",allows:{{0x378},{0x278}},dialog:list");
-MODULE_PARM(irq, "i");
+module_param(irq, int, 0444);
 MODULE_PARM_DESC(irq, "Parallel IRQ # for MotuMTPAV MIDI.");
 MODULE_PARM_SYNTAX(irq,  SNDRV_ENABLED ",allows:{{7},{5}},dialog:list");
-MODULE_PARM(hwports, "i");
+module_param(hwports, int, 0444);
 MODULE_PARM_DESC(hwports, "Hardware ports # for MotuMTPAV MIDI.");
 MODULE_PARM_SYNTAX(hwports, SNDRV_ENABLED ",allows:{{1,8}},dialog:list");
 
@@ -800,25 +800,3 @@
 
 module_init(alsa_card_mtpav_init)
 module_exit(alsa_card_mtpav_exit)
-
-#ifndef MODULE
-
-/* format is: snd-mtpav=enable,index,id,
-			port,irq,hwports */
-
-static int __init alsa_card_mtpav_setup(char *str)
-{
-        int __attribute__ ((__unused__)) enable = 1;
-
-	(void)(get_option(&str,&enable) == 2 &&
-	       get_option(&str,&index) == 2 &&
-	       get_id(&str,&id) == 2 &&
-	       get_option_long(&str,&port) == 2 &&
-	       get_option(&str,&irq) == 2 &&
-	       get_option(&str,&hwports) == 2);
-	return 1;
-}
-
-__setup("snd-mtpav=", alsa_card_mtpav_setup);
-
-#endif /* ifndef MODULE */
diff -Nru a/sound/drivers/opl3/opl3_seq.c b/sound/drivers/opl3/opl3_seq.c
--- a/sound/drivers/opl3/opl3_seq.c	2004-05-26 15:01:36 -07:00
+++ b/sound/drivers/opl3/opl3_seq.c	2004-05-26 15:01:36 -07:00
@@ -24,6 +24,7 @@
 
 #include "opl3_voice.h"
 #include <linux/init.h>
+#include <linux/moduleparam.h>
 #include <sound/initval.h>
 
 MODULE_AUTHOR("Uros Bizjak <uros@kss-loka.si>");
@@ -32,7 +33,7 @@
 MODULE_CLASSES("{sound}");
 
 int use_internal_drums = 0;
-MODULE_PARM(use_internal_drums, "i");
+module_param(use_internal_drums, bool, 0444);
 MODULE_PARM_DESC(use_internal_drums, "Enable internal OPL2/3 drums.");
 
 int snd_opl3_synth_use_inc(opl3_t * opl3)
diff -Nru a/sound/drivers/opl4/opl4_seq.c b/sound/drivers/opl4/opl4_seq.c
--- a/sound/drivers/opl4/opl4_seq.c	2004-05-26 15:01:36 -07:00
+++ b/sound/drivers/opl4/opl4_seq.c	2004-05-26 15:01:36 -07:00
@@ -33,6 +33,7 @@
 
 #include "opl4_local.h"
 #include <linux/init.h>
+#include <linux/moduleparam.h>
 #include <sound/initval.h>
 
 MODULE_AUTHOR("Clemens Ladisch <clemens@ladisch.de>");
@@ -42,7 +43,7 @@
 
 int volume_boost = 8;
 
-MODULE_PARM(volume_boost, "i");
+module_param(volume_boost, int, 0644);
 MODULE_PARM_DESC(volume_boost, "Additional volume for OPL4 wavetable sounds.");
 MODULE_PARM_SYNTAX(volume_boost, "default:8");
 
diff -Nru a/sound/drivers/serial-u16550.c b/sound/drivers/serial-u16550.c
--- a/sound/drivers/serial-u16550.c	2004-05-26 15:01:35 -07:00
+++ b/sound/drivers/serial-u16550.c	2004-05-26 15:01:35 -07:00
@@ -35,9 +35,9 @@
 #include <linux/interrupt.h>
 #include <linux/slab.h>
 #include <linux/ioport.h>
+#include <linux/moduleparam.h>
 #include <sound/core.h>
 #include <sound/rawmidi.h>
-#define SNDRV_GET_ID
 #include <sound/initval.h>
 
 #include <linux/serial_reg.h>
@@ -77,39 +77,40 @@
 static int ins[SNDRV_CARDS] = {[0 ... (SNDRV_CARDS - 1)] = 1};	/* 1 to 16 */
 static int adaptor[SNDRV_CARDS] = {[0 ... (SNDRV_CARDS - 1)] = SNDRV_SERIAL_SOUNDCANVAS};
 static int droponfull[SNDRV_CARDS] = {[0 ... (SNDRV_CARDS -1)] = SNDRV_SERIAL_NORMALBUFF };
+static int boot_devs;
 
-MODULE_PARM(index, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+module_param_array(index, int, boot_devs, 0444);
 MODULE_PARM_DESC(index, "Index value for Serial MIDI.");
 MODULE_PARM_SYNTAX(index, SNDRV_INDEX_DESC);
-MODULE_PARM(id, "1-" __MODULE_STRING(SNDRV_CARDS) "s");
+module_param_array(id, charp, boot_devs, 0444);
 MODULE_PARM_DESC(id, "ID string for Serial MIDI.");
 MODULE_PARM_SYNTAX(id, SNDRV_ID_DESC);
-MODULE_PARM(enable, "1-" __MODULE_STRING(SNDRV_CARDS) "l");
+module_param_array(enable, bool, boot_devs, 0444);
 MODULE_PARM_DESC(enable, "Enable UART16550A chip.");
 MODULE_PARM_SYNTAX(enable, SNDRV_ENABLE_DESC);
-MODULE_PARM(port, "1-" __MODULE_STRING(SNDRV_CARDS) "l");
+module_param_array(port, long, boot_devs, 0444);
 MODULE_PARM_DESC(port, "Port # for UART16550A chip.");
 MODULE_PARM_SYNTAX(port, SNDRV_PORT12_DESC);
-MODULE_PARM(irq, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+module_param_array(irq, int, boot_devs, 0444);
 MODULE_PARM_DESC(irq, "IRQ # for UART16550A chip.");
 MODULE_PARM_SYNTAX(irq, SNDRV_IRQ_DESC);
-MODULE_PARM(speed, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+module_param_array(speed, int, boot_devs, 0444);
 MODULE_PARM_DESC(speed, "Speed in bauds.");
 MODULE_PARM_SYNTAX(speed, SNDRV_ENABLED ",allows:{9600,19200,38400,57600,115200},dialog:list");
-MODULE_PARM(base, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+module_param_array(base, int, boot_devs, 0444);
 MODULE_PARM_DESC(base, "Base for divisor in bauds.");
 MODULE_PARM_SYNTAX(base, SNDRV_ENABLED ",allows:{57600,115200,230400,460800},dialog:list");
-MODULE_PARM(outs, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+module_param_array(outs, int, boot_devs, 0444);
 MODULE_PARM_DESC(outs, "Number of MIDI outputs.");
-MODULE_PARM(ins, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+module_param_array(ins, int, boot_devs, 0444);
 MODULE_PARM_DESC(ins, "Number of MIDI inputs.");
-MODULE_PARM(droponfull, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+module_param_array(droponfull, bool, boot_devs, 0444);
 MODULE_PARM_DESC(droponfull, "Flag to enable drop-on-full buffer mode");
 MODULE_PARM_SYNTAX(droponfull, SNDRV_ENABLED "," SNDRV_BOOLEAN_FALSE_DESC);
 
 MODULE_PARM_SYNTAX(outs, SNDRV_ENABLED ",allows:{{1,16}},dialog:list");
 MODULE_PARM_SYNTAX(ins, SNDRV_ENABLED ",allows:{{1,16}},dialog:list");
-MODULE_PARM(adaptor, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+module_param_array(adaptor, int, boot_devs, 0444);
 MODULE_PARM_DESC(adaptor, "Type of adaptor.");
 MODULE_PARM_SYNTAX(adaptor, SNDRV_ENABLED ",allows:{{0=Soundcanvas,1=MS-124T,2=MS-124W S/A,3=MS-124W M/B,4=Generic}},dialog:list");
 
@@ -987,34 +988,3 @@
 
 module_init(alsa_card_serial_init)
 module_exit(alsa_card_serial_exit)
-
-#ifndef MODULE
-
-/* format is: snd-serial=enable,index,id,
-			 port,irq,speed,base,outs,
- 			 ins,adaptor,droponfull */
-
-static int __init alsa_card_serial_setup(char *str)
-{
-	static unsigned __initdata nr_dev = 0;
-
-	if (nr_dev >= SNDRV_CARDS)
-		return 0;
-	(void)(get_option(&str,&enable[nr_dev]) == 2 &&
-	       get_option(&str,&index[nr_dev]) == 2 &&
-	       get_id(&str,&id[nr_dev]) == 2 &&
-	       get_option_long(&str,&port[nr_dev]) == 2 &&
-	       get_option(&str,&irq[nr_dev]) == 2 &&
-	       get_option(&str,&speed[nr_dev]) == 2 &&
-	       get_option(&str,&base[nr_dev]) == 2 &&
-	       get_option(&str,&outs[nr_dev]) == 2 &&
-	       get_option(&str,&ins[nr_dev]) == 2 &&
-	       get_option(&str,&adaptor[nr_dev]) == 2 &&
-	       get_option(&str,&droponfull[nr_dev]) == 2 );
-	nr_dev++;
-	return 1;
-}
-
-__setup("snd-serial=", alsa_card_serial_setup);
-
-#endif /* ifndef MODULE */
diff -Nru a/sound/drivers/virmidi.c b/sound/drivers/virmidi.c
--- a/sound/drivers/virmidi.c	2004-05-26 15:01:35 -07:00
+++ b/sound/drivers/virmidi.c	2004-05-26 15:01:35 -07:00
@@ -45,10 +45,10 @@
 #include <linux/init.h>
 #include <linux/wait.h>
 #include <linux/sched.h>
+#include <linux/moduleparam.h>
 #include <sound/core.h>
 #include <sound/seq_kernel.h>
 #include <sound/seq_virmidi.h>
-#define SNDRV_GET_ID
 #include <sound/initval.h>
 
 /* hack: OSS defines midi_devs, so undefine it (versioned symbols) */
@@ -66,17 +66,18 @@
 static char *id[SNDRV_CARDS] = SNDRV_DEFAULT_STR;	/* ID for this card */
 static int enable[SNDRV_CARDS] = {1, [1 ... (SNDRV_CARDS - 1)] = 0};
 static int midi_devs[SNDRV_CARDS] = {[0 ... (SNDRV_CARDS - 1)] = 4};
+static int boot_devs;
 
-MODULE_PARM(index, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+module_param_array(index, int, boot_devs, 0444);
 MODULE_PARM_DESC(index, "Index value for virmidi soundcard.");
 MODULE_PARM_SYNTAX(index, SNDRV_INDEX_DESC);
-MODULE_PARM(id, "1-" __MODULE_STRING(SNDRV_CARDS) "s");
+module_param_array(id, charp, boot_devs, 0444);
 MODULE_PARM_DESC(id, "ID string for virmidi soundcard.");
 MODULE_PARM_SYNTAX(id, SNDRV_ID_DESC);
-MODULE_PARM(enable, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+module_param_array(enable, bool, boot_devs, 0444);
 MODULE_PARM_DESC(enable, "Enable this soundcard.");
 MODULE_PARM_SYNTAX(enable, SNDRV_ENABLE_DESC);
-MODULE_PARM(midi_devs, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+module_param_array(midi_devs, int, boot_devs, 0444);
 MODULE_PARM_DESC(midi_devs, "MIDI devices # (1-8)");
 MODULE_PARM_SYNTAX(midi_devs, SNDRV_ENABLED ",allows:{{1,8}}");
 
@@ -162,25 +163,3 @@
 
 module_init(alsa_card_virmidi_init)
 module_exit(alsa_card_virmidi_exit)
-
-#ifndef MODULE
-
-/* format is: snd-virmidi=enable,index,id,midi_devs */
-
-static int __init alsa_card_virmidi_setup(char *str)
-{
-	static unsigned __initdata nr_dev = 0;
-
-	if (nr_dev >= SNDRV_CARDS)
-		return 0;
-	(void)(get_option(&str,&enable[nr_dev]) == 2 &&
-	       get_option(&str,&index[nr_dev]) == 2 &&
-	       get_id(&str,&id[nr_dev]) == 2 &&
-	       get_option(&str,&midi_devs[nr_dev]) == 2);
-	nr_dev++;
-	return 1;
-}
-
-__setup("snd-virmidi=", alsa_card_virmidi_setup);
-
-#endif /* ifndef MODULE */
diff -Nru a/sound/isa/ad1816a/ad1816a.c b/sound/isa/ad1816a/ad1816a.c
--- a/sound/isa/ad1816a/ad1816a.c	2004-05-26 15:01:35 -07:00
+++ b/sound/isa/ad1816a/ad1816a.c	2004-05-26 15:01:35 -07:00
@@ -23,8 +23,8 @@
 #include <linux/time.h>
 #include <linux/wait.h>
 #include <linux/pnp.h>
+#include <linux/moduleparam.h>
 #include <sound/core.h>
-#define SNDRV_GET_ID
 #include <sound/initval.h>
 #include <sound/ad1816a.h>
 #include <sound/mpu401.h>
@@ -56,35 +56,36 @@
 static int mpu_irq[SNDRV_CARDS] = SNDRV_DEFAULT_IRQ;	/* Pnp setup */
 static int dma1[SNDRV_CARDS] = SNDRV_DEFAULT_DMA;	/* PnP setup */
 static int dma2[SNDRV_CARDS] = SNDRV_DEFAULT_DMA;	/* PnP setup */
+static int boot_devs;
 
-MODULE_PARM(index, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+module_param_array(index, int, boot_devs, 0444);
 MODULE_PARM_DESC(index, "Index value for ad1816a based soundcard.");
 MODULE_PARM_SYNTAX(index, SNDRV_INDEX_DESC);
-MODULE_PARM(id, "1-" __MODULE_STRING(SNDRV_CARDS) "s");
+module_param_array(id, charp, boot_devs, 0444);
 MODULE_PARM_DESC(id, "ID string for ad1816a based soundcard.");
 MODULE_PARM_SYNTAX(id, SNDRV_ID_DESC);
-MODULE_PARM(enable, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+module_param_array(enable, bool, boot_devs, 0444);
 MODULE_PARM_DESC(enable, "Enable ad1816a based soundcard.");
 MODULE_PARM_SYNTAX(enable, SNDRV_ENABLE_DESC);
-MODULE_PARM(port, "1-" __MODULE_STRING(SNDRV_CARDS) "l");
+module_param_array(port, long, boot_devs, 0444);
 MODULE_PARM_DESC(port, "Port # for ad1816a driver.");
 MODULE_PARM_SYNTAX(port, SNDRV_PORT12_DESC);
-MODULE_PARM(mpu_port, "1-" __MODULE_STRING(SNDRV_CARDS) "l");
+module_param_array(mpu_port, long, boot_devs, 0444);
 MODULE_PARM_DESC(mpu_port, "MPU-401 port # for ad1816a driver.");
 MODULE_PARM_SYNTAX(mpu_port, SNDRV_PORT12_DESC);
-MODULE_PARM(fm_port, "1-" __MODULE_STRING(SNDRV_CARDS) "l");
+module_param_array(fm_port, long, boot_devs, 0444);
 MODULE_PARM_DESC(fm_port, "FM port # for ad1816a driver.");
 MODULE_PARM_SYNTAX(fm_port, SNDRV_PORT12_DESC);
-MODULE_PARM(irq, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+module_param_array(irq, int, boot_devs, 0444);
 MODULE_PARM_DESC(irq, "IRQ # for ad1816a driver.");
 MODULE_PARM_SYNTAX(irq, SNDRV_IRQ_DESC);
-MODULE_PARM(mpu_irq, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+module_param_array(mpu_irq, int, boot_devs, 0444);
 MODULE_PARM_DESC(mpu_irq, "MPU-401 IRQ # for ad1816a driver.");
 MODULE_PARM_SYNTAX(mpu_irq, SNDRV_IRQ_DESC);
-MODULE_PARM(dma1, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+module_param_array(dma1, int, boot_devs, 0444);
 MODULE_PARM_DESC(dma1, "1st DMA # for ad1816a driver.");
 MODULE_PARM_SYNTAX(dma1, SNDRV_DMA_DESC);
-MODULE_PARM(dma2, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+module_param_array(dma2, int, boot_devs, 0444);
 MODULE_PARM_DESC(dma2, "2nd DMA # for ad1816a driver.");
 MODULE_PARM_SYNTAX(dma2, SNDRV_DMA_DESC);
 
@@ -323,33 +324,3 @@
 
 module_init(alsa_card_ad1816a_init)
 module_exit(alsa_card_ad1816a_exit)
-
-#ifndef MODULE
-
-/* format is: snd-ad1816a=enable,index,id,port,
-			  mpu_port,fm_port,irq,mpu_irq,
-			  dma1,dma2 */
-
-static int __init alsa_card_ad1816a_setup(char *str)
-{
-	static unsigned __initdata nr_dev = 0;
-
-	if (nr_dev >= SNDRV_CARDS)
-		return 0;
-	(void)(get_option(&str,&enable[nr_dev]) == 2 &&
-	       get_option(&str,&index[nr_dev]) == 2 &&
-	       get_id(&str,&id[nr_dev]) == 2 &&
-	       get_option_long(&str,&port[nr_dev]) == 2 &&
-	       get_option_long(&str,&mpu_port[nr_dev]) == 2 &&
-	       get_option_long(&str,&fm_port[nr_dev]) == 2 &&
-	       get_option(&str,&irq[nr_dev]) == 2 &&
-	       get_option(&str,&mpu_irq[nr_dev]) == 2 &&
-	       get_option(&str,&dma1[nr_dev]) == 2 &&
-	       get_option(&str,&dma2[nr_dev]) == 2);
-	nr_dev++;
-	return 1;
-}
-
-__setup("snd-ad1816a=", alsa_card_ad1816a_setup);
-
-#endif /* ifndef MODULE */
diff -Nru a/sound/isa/ad1848/ad1848.c b/sound/isa/ad1848/ad1848.c
--- a/sound/isa/ad1848/ad1848.c	2004-05-26 15:01:36 -07:00
+++ b/sound/isa/ad1848/ad1848.c	2004-05-26 15:01:36 -07:00
@@ -25,9 +25,9 @@
 #include <linux/init.h>
 #include <linux/time.h>
 #include <linux/wait.h>
+#include <linux/moduleparam.h>
 #include <sound/core.h>
 #include <sound/ad1848.h>
-#define SNDRV_GET_ID
 #include <sound/initval.h>
 
 #define chip_t ad1848_t
@@ -47,26 +47,27 @@
 static int irq[SNDRV_CARDS] = SNDRV_DEFAULT_IRQ;	/* 5,7,9,11,12,15 */
 static int dma1[SNDRV_CARDS] = SNDRV_DEFAULT_DMA;	/* 0,1,3,5,6,7 */
 static int thinkpad[SNDRV_CARDS];			/* Thinkpad special case */
+static int boot_devs;
 
-MODULE_PARM(index, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+module_param_array(index, int, boot_devs, 0444);
 MODULE_PARM_DESC(index, "Index value for AD1848 soundcard.");
 MODULE_PARM_SYNTAX(index, SNDRV_INDEX_DESC);
-MODULE_PARM(id, "1-" __MODULE_STRING(SNDRV_CARDS) "s");
+module_param_array(id, charp, boot_devs, 0444);
 MODULE_PARM_DESC(id, "ID string for AD1848 soundcard.");
 MODULE_PARM_SYNTAX(id, SNDRV_ID_DESC);
-MODULE_PARM(enable, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+module_param_array(enable, bool, boot_devs, 0444);
 MODULE_PARM_DESC(enable, "Enable AD1848 soundcard.");
 MODULE_PARM_SYNTAX(enable, SNDRV_ENABLE_DESC);
-MODULE_PARM(port, "1-" __MODULE_STRING(SNDRV_CARDS) "l");
+module_param_array(port, long, boot_devs, 0444);
 MODULE_PARM_DESC(port, "Port # for AD1848 driver.");
 MODULE_PARM_SYNTAX(port, SNDRV_PORT12_DESC);
-MODULE_PARM(irq, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+module_param_array(irq, int, boot_devs, 0444);
 MODULE_PARM_DESC(irq, "IRQ # for AD1848 driver.");
 MODULE_PARM_SYNTAX(irq, SNDRV_IRQ_DESC);
-MODULE_PARM(dma1, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+module_param_array(dma1, int, boot_devs, 0444);
 MODULE_PARM_DESC(dma1, "DMA1 # for AD1848 driver.");
 MODULE_PARM_SYNTAX(dma1, SNDRV_DMA_DESC);
-MODULE_PARM(thinkpad, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+module_param_array(thinkpad, bool, boot_devs, 0444);
 MODULE_PARM_DESC(thinkpad, "Enable only for the onboard CS4248 of IBM Thinkpad 360/750/755 series.");
 MODULE_PARM_SYNTAX(thinkpad,  SNDRV_ENABLED "," SNDRV_BOOLEAN_FALSE_DESC);
 
@@ -159,29 +160,3 @@
 
 module_init(alsa_card_ad1848_init)
 module_exit(alsa_card_ad1848_exit)
-
-#ifndef MODULE
-
-/* format is: snd-ad1848=enable,index,id,port,
-			 irq,dma1 */
-
-static int __init alsa_card_ad1848_setup(char *str)
-{
-	static unsigned __initdata nr_dev = 0;
-
-	if (nr_dev >= SNDRV_CARDS)
-		return 0;
-	(void)(get_option(&str,&enable[nr_dev]) == 2 &&
-	       get_option(&str,&index[nr_dev]) == 2 &&
-	       get_id(&str,&id[nr_dev]) == 2 &&
-	       get_option_long(&str,&port[nr_dev]) == 2 &&
-	       get_option(&str,&irq[nr_dev]) == 2 &&
-	       get_option(&str,&dma1[nr_dev]) == 2 &&
-	       get_option(&str,&thinkpad[nr_dev]) == 2);
-	nr_dev++;
-	return 1;
-}
-
-__setup("snd-ad1848=", alsa_card_ad1848_setup);
-
-#endif /* ifndef MODULE */
diff -Nru a/sound/isa/ad1848/ad1848_lib.c b/sound/isa/ad1848/ad1848_lib.c
--- a/sound/isa/ad1848/ad1848_lib.c	2004-05-26 15:01:36 -07:00
+++ b/sound/isa/ad1848/ad1848_lib.c	2004-05-26 15:01:36 -07:00
@@ -647,12 +647,12 @@
 }
 
 #ifdef CONFIG_PM
-static void snd_ad1848_suspend(ad1848_t *chip) {
-
-	snd_card_t *card = chip->card;
+static int snd_ad1848_suspend(snd_card_t *card, unsigned int state)
+{
+	ad1848_t *chip = snd_magic_cast(ad1848_t, card->pm_private_data, return -EINVAL);
 
 	if (card->power_state == SNDRV_CTL_POWER_D3hot)
-		return;
+		return 0;
 
 	snd_pcm_suspend_all(chip->pcm);
 	/* FIXME: save registers? */
@@ -661,14 +661,15 @@
 		snd_ad1848_thinkpad_twiddle(chip, 0);
 
 	snd_power_change_state(card, SNDRV_CTL_POWER_D3hot);
+	return 0;
 }
 
-static void snd_ad1848_resume(ad1848_t *chip) {
-
-	snd_card_t *card = chip->card;
+static int snd_ad1848_resume(snd_card_t *card, unsigned int state)
+{
+	ad1848_t *chip = snd_magic_cast(ad1848_t, card->pm_private_data, return -EINVAL);
 
 	if (card->power_state == SNDRV_CTL_POWER_D0)
-		return;
+		return 0;
 
 	if (chip->thinkpad_flag)
 		snd_ad1848_thinkpad_twiddle(chip, 1);
@@ -676,43 +677,8 @@
 	/* FIXME: restore registers? */
 
 	snd_power_change_state(card, SNDRV_CTL_POWER_D0);
-}
-
-/* callback for control API */
-static int snd_ad1848_set_power_state(snd_card_t *card, unsigned int power_state)
-{
-	ad1848_t *chip = (ad1848_t *) card->power_state_private_data;
-	switch (power_state) {
-	case SNDRV_CTL_POWER_D0:
-	case SNDRV_CTL_POWER_D1:
-	case SNDRV_CTL_POWER_D2:
-		snd_ad1848_resume(chip);
-		break;
-	case SNDRV_CTL_POWER_D3hot:
-	case SNDRV_CTL_POWER_D3cold:
-		snd_ad1848_suspend(chip);
-		break;
-	default:
-		return -EINVAL;
-	}
 	return 0;
 }
-
-static int snd_ad1848_pm_callback(struct pm_dev *dev, pm_request_t rqst, void *data)
-{
-	ad1848_t *chip = snd_magic_cast(ad1848_t, dev->data, return 0);
-
-	switch (rqst) {
-	case PM_SUSPEND:
-		snd_ad1848_suspend(chip);
-		break;
-	case PM_RESUME:
-		snd_ad1848_resume(chip);
-		break;
-	}
-	return 0;
-}
-
 #endif /* CONFIG_PM */
 
 static int snd_ad1848_probe(ad1848_t * chip)
@@ -891,10 +857,6 @@
 
 static int snd_ad1848_free(ad1848_t *chip)
 {
-#ifdef CONFIG_PM
-        if (chip->thinkpad_pmstate)
-                pm_unregister(chip->thinkpad_pmstate);
-#endif
 	if (chip->res_port) {
 		release_resource(chip->res_port);
 		kfree_nocheck(chip->res_port);
@@ -973,14 +935,7 @@
 		chip->thinkpad_flag = 1;
 		chip->hardware = AD1848_HW_DETECT; /* reset */
 		snd_ad1848_thinkpad_twiddle(chip, 1);
-#ifdef CONFIG_PM
-		chip->thinkpad_pmstate = pm_register(PM_ISA_DEV, 0, snd_ad1848_pm_callback);
-		if (chip->thinkpad_pmstate) {
-			chip->thinkpad_pmstate->data = chip;
-			card->set_power_state = snd_ad1848_set_power_state; /* callback */
-			card->power_state_private_data = chip;
-		}
-#endif
+		snd_card_set_isa_pm_callback(card, snd_ad1848_suspend, snd_ad1848_resume, chip);
 	}
 
 	if (snd_ad1848_probe(chip) < 0) {
diff -Nru a/sound/isa/als100.c b/sound/isa/als100.c
--- a/sound/isa/als100.c	2004-05-26 15:01:35 -07:00
+++ b/sound/isa/als100.c	2004-05-26 15:01:35 -07:00
@@ -25,8 +25,8 @@
 #include <linux/wait.h>
 #include <linux/time.h>
 #include <linux/pnp.h>
+#include <linux/moduleparam.h>
 #include <sound/core.h>
-#define SNDRV_GET_ID
 #include <sound/initval.h>
 #include <sound/mpu401.h>
 #include <sound/opl3.h>
@@ -59,35 +59,36 @@
 static int mpu_irq[SNDRV_CARDS] = SNDRV_DEFAULT_IRQ;	/* PnP setup */
 static int dma8[SNDRV_CARDS] = SNDRV_DEFAULT_DMA;	/* PnP setup */
 static int dma16[SNDRV_CARDS] = SNDRV_DEFAULT_DMA;	/* PnP setup */
+static int boot_devs;
 
-MODULE_PARM(index, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+module_param_array(index, int, boot_devs, 0444);
 MODULE_PARM_DESC(index, "Index value for als100 based soundcard.");
 MODULE_PARM_SYNTAX(index, SNDRV_INDEX_DESC);
-MODULE_PARM(id, "1-" __MODULE_STRING(SNDRV_CARDS) "s");
+module_param_array(id, charp, boot_devs, 0444);
 MODULE_PARM_DESC(id, "ID string for als100 based soundcard.");
 MODULE_PARM_SYNTAX(id, SNDRV_ID_DESC);
-MODULE_PARM(enable, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+module_param_array(enable, bool, boot_devs, 0444);
 MODULE_PARM_DESC(enable, "Enable als100 based soundcard.");
 MODULE_PARM_SYNTAX(enable, SNDRV_ENABLE_DESC);
-MODULE_PARM(port, "1-" __MODULE_STRING(SNDRV_CARDS) "l");
+module_param_array(port, long, boot_devs, 0444);
 MODULE_PARM_DESC(port, "Port # for als100 driver.");
 MODULE_PARM_SYNTAX(port, SNDRV_PORT12_DESC);
-MODULE_PARM(mpu_port, "1-" __MODULE_STRING(SNDRV_CARDS) "l");
+module_param_array(mpu_port, long, boot_devs, 0444);
 MODULE_PARM_DESC(mpu_port, "MPU-401 port # for als100 driver.");
 MODULE_PARM_SYNTAX(mpu_port, SNDRV_PORT12_DESC);
-MODULE_PARM(fm_port, "1-" __MODULE_STRING(SNDRV_CARDS) "l");
+module_param_array(fm_port, long, boot_devs, 0444);
 MODULE_PARM_DESC(fm_port, "FM port # for als100 driver.");
 MODULE_PARM_SYNTAX(fm_port, SNDRV_PORT12_DESC);
-MODULE_PARM(irq, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+module_param_array(irq, int, boot_devs, 0444);
 MODULE_PARM_DESC(irq, "IRQ # for als100 driver.");
 MODULE_PARM_SYNTAX(irq, SNDRV_IRQ_DESC);
-MODULE_PARM(mpu_irq, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+module_param_array(mpu_irq, int, boot_devs, 0444);
 MODULE_PARM_DESC(mpu_irq, "MPU-401 IRQ # for als100 driver.");
 MODULE_PARM_SYNTAX(mpu_irq, SNDRV_IRQ_DESC);
-MODULE_PARM(dma8, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+module_param_array(dma8, int, boot_devs, 0444);
 MODULE_PARM_DESC(dma8, "8-bit DMA # for als100 driver.");
 MODULE_PARM_SYNTAX(dma8, SNDRV_DMA8_DESC);
-MODULE_PARM(dma16, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+module_param_array(dma16, int, boot_devs, 0444);
 MODULE_PARM_DESC(dma16, "16-bit DMA # for als100 driver.");
 MODULE_PARM_SYNTAX(dma16, SNDRV_DMA16_DESC);
 
@@ -345,33 +346,3 @@
 
 module_init(alsa_card_als100_init)
 module_exit(alsa_card_als100_exit)
-
-#ifndef MODULE
-
-/* format is: snd-als100=enable,index,id,port,
-			 mpu_port,fm_port,irq,mpu_irq,
-			 dma8,dma16 */
-
-static int __init alsa_card_als100_setup(char *str)
-{
-	static unsigned __initdata nr_dev = 0;
-
-	if (nr_dev >= SNDRV_CARDS)
-		return 0;
-	(void)(get_option(&str,&enable[nr_dev]) == 2 &&
-	       get_option(&str,&index[nr_dev]) == 2 &&
-	       get_id(&str,&id[nr_dev]) == 2 &&
-	       get_option_long(&str,&port[nr_dev]) == 2 &&
-	       get_option_long(&str,&mpu_port[nr_dev]) == 2 &&
-	       get_option_long(&str,&fm_port[nr_dev]) == 2 &&
-	       get_option(&str,&irq[nr_dev]) == 2 &&
-	       get_option(&str,&mpu_irq[nr_dev]) == 2 &&
-	       get_option(&str,&dma8[nr_dev]) == 2 &&
-	       get_option(&str,&dma16[nr_dev]) == 2);
-	nr_dev++;
-	return 1;
-}
-
-__setup("snd-als100=", alsa_card_als100_setup);
-
-#endif /* ifndef MODULE */
diff -Nru a/sound/isa/azt2320.c b/sound/isa/azt2320.c
--- a/sound/isa/azt2320.c	2004-05-26 15:01:36 -07:00
+++ b/sound/isa/azt2320.c	2004-05-26 15:01:36 -07:00
@@ -36,8 +36,8 @@
 #include <linux/time.h>
 #include <linux/wait.h>
 #include <linux/pnp.h>
+#include <linux/moduleparam.h>
 #include <sound/core.h>
-#define SNDRV_GET_ID
 #include <sound/initval.h>
 #include <sound/cs4231.h>
 #include <sound/mpu401.h>
@@ -68,38 +68,39 @@
 static int mpu_irq[SNDRV_CARDS] = SNDRV_DEFAULT_IRQ;	/* Pnp setup */
 static int dma1[SNDRV_CARDS] = SNDRV_DEFAULT_DMA;	/* PnP setup */
 static int dma2[SNDRV_CARDS] = SNDRV_DEFAULT_DMA;	/* PnP setup */
+static int boot_devs;
 
-MODULE_PARM(index, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+module_param_array(index, int, boot_devs, 0444);
 MODULE_PARM_DESC(index, "Index value for azt2320 based soundcard.");
 MODULE_PARM_SYNTAX(index, SNDRV_INDEX_DESC);
-MODULE_PARM(id, "1-" __MODULE_STRING(SNDRV_CARDS) "s");
+module_param_array(id, charp, boot_devs, 0444);
 MODULE_PARM_DESC(id, "ID string for azt2320 based soundcard.");
 MODULE_PARM_SYNTAX(id, SNDRV_ID_DESC);
-MODULE_PARM(enable, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+module_param_array(enable, bool, boot_devs, 0444);
 MODULE_PARM_DESC(enable, "Enable azt2320 based soundcard.");
 MODULE_PARM_SYNTAX(enable, SNDRV_ENABLE_DESC);
-MODULE_PARM(port, "1-" __MODULE_STRING(SNDRV_CARDS) "l");
+module_param_array(port, long, boot_devs, 0444);
 MODULE_PARM_DESC(port, "Port # for azt2320 driver.");
 MODULE_PARM_SYNTAX(port, SNDRV_PORT12_DESC);
-MODULE_PARM(wss_port, "1-" __MODULE_STRING(SNDRV_CARDS) "l");
+module_param_array(wss_port, long, boot_devs, 0444);
 MODULE_PARM_DESC(wss_port, "WSS Port # for azt2320 driver.");
 MODULE_PARM_SYNTAX(wss_port, SNDRV_PORT12_DESC);
-MODULE_PARM(mpu_port, "1-" __MODULE_STRING(SNDRV_CARDS) "l");
+module_param_array(mpu_port, long, boot_devs, 0444);
 MODULE_PARM_DESC(mpu_port, "MPU-401 port # for azt2320 driver.");
 MODULE_PARM_SYNTAX(mpu_port, SNDRV_PORT12_DESC);
-MODULE_PARM(fm_port, "1-" __MODULE_STRING(SNDRV_CARDS) "l");
+module_param_array(fm_port, long, boot_devs, 0444);
 MODULE_PARM_DESC(fm_port, "FM port # for azt2320 driver.");
 MODULE_PARM_SYNTAX(fm_port, SNDRV_PORT12_DESC);
-MODULE_PARM(irq, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+module_param_array(irq, int, boot_devs, 0444);
 MODULE_PARM_DESC(irq, "IRQ # for azt2320 driver.");
 MODULE_PARM_SYNTAX(irq, SNDRV_IRQ_DESC);
-MODULE_PARM(mpu_irq, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+module_param_array(mpu_irq, int, boot_devs, 0444);
 MODULE_PARM_DESC(mpu_irq, "MPU-401 IRQ # for azt2320 driver.");
 MODULE_PARM_SYNTAX(mpu_irq, SNDRV_IRQ_DESC);
-MODULE_PARM(dma1, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+module_param_array(dma1, int, boot_devs, 0444);
 MODULE_PARM_DESC(dma1, "1st DMA # for azt2320 driver.");
 MODULE_PARM_SYNTAX(dma1, SNDRV_DMA_DESC);
-MODULE_PARM(dma2, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+module_param_array(dma2, int, boot_devs, 0444);
 MODULE_PARM_DESC(dma2, "2nd DMA # for azt2320 driver.");
 MODULE_PARM_SYNTAX(dma2, SNDRV_DMA_DESC);
 
@@ -378,33 +379,3 @@
 
 module_init(alsa_card_azt2320_init)
 module_exit(alsa_card_azt2320_exit)
-
-#ifndef MODULE
-
-/* format is: snd-azt2320=enable,index,id,port,
-			  wss_port,mpu_port,fm_port,
-			  irq,mpu_irq,dma1,dma2 */
-
-static int __init alsa_card_azt2320_setup(char *str)
-{
-	static unsigned __initdata nr_dev = 0;
-
-	if (nr_dev >= SNDRV_CARDS)
-		return 0;
-	(void)(get_option(&str,&enable[nr_dev]) == 2 &&
-	       get_option(&str,&index[nr_dev]) == 2 &&
-	       get_id(&str,&id[nr_dev]) == 2 &&
-	       get_option_long(&str,&port[nr_dev]) == 2 &&
-	       get_option_long(&str,&wss_port[nr_dev]) == 2 &&
-	       get_option_long(&str,&mpu_port[nr_dev]) == 2 &&
-	       get_option(&str,&irq[nr_dev]) == 2 &&
-	       get_option(&str,&mpu_irq[nr_dev]) == 2 &&
-	       get_option(&str,&dma1[nr_dev]) == 2 &&
-	       get_option(&str,&dma2[nr_dev]) == 2);
-	nr_dev++;
-	return 1;
-}
-
-__setup("snd-azt2320=", alsa_card_azt2320_setup);
-
-#endif /* ifndef MODULE */
diff -Nru a/sound/isa/cmi8330.c b/sound/isa/cmi8330.c
--- a/sound/isa/cmi8330.c	2004-05-26 15:01:35 -07:00
+++ b/sound/isa/cmi8330.c	2004-05-26 15:01:35 -07:00
@@ -47,10 +47,10 @@
 #include <linux/init.h>
 #include <linux/slab.h>
 #include <linux/pnp.h>
+#include <linux/moduleparam.h>
 #include <sound/core.h>
 #include <sound/ad1848.h>
 #include <sound/sb.h>
-#define SNDRV_GET_ID
 #include <sound/initval.h>
 
 /*
@@ -79,42 +79,43 @@
 static long wssport[SNDRV_CARDS] = SNDRV_DEFAULT_PORT;
 static int wssirq[SNDRV_CARDS] = SNDRV_DEFAULT_IRQ;
 static int wssdma[SNDRV_CARDS] = SNDRV_DEFAULT_DMA;
+static int boot_devs;
 
-MODULE_PARM(index, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+module_param_array(index, int, boot_devs, 0444);
 MODULE_PARM_DESC(index, "Index value for CMI8330 soundcard.");
 MODULE_PARM_SYNTAX(index, SNDRV_INDEX_DESC);
-MODULE_PARM(id, "1-" __MODULE_STRING(SNDRV_CARDS) "s");
+module_param_array(id, charp, boot_devs, 0444);
 MODULE_PARM_DESC(id, "ID string  for CMI8330 soundcard.");
 MODULE_PARM_SYNTAX(id, SNDRV_ID_DESC);
-MODULE_PARM(enable, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+module_param_array(enable, bool, boot_devs, 0444);
 MODULE_PARM_DESC(enable, "Enable CMI8330 soundcard.");
 MODULE_PARM_SYNTAX(enable, SNDRV_ENABLE_DESC);
 #ifdef CONFIG_PNP
-MODULE_PARM(isapnp, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+module_param_array(isapnp, bool, boot_devs, 0444);
 MODULE_PARM_DESC(isapnp, "PnP detection for specified soundcard.");
 MODULE_PARM_SYNTAX(isapnp, SNDRV_ISAPNP_DESC);
 #endif
 
-MODULE_PARM(sbport, "1-" __MODULE_STRING(SNDRV_CARDS) "l");
+module_param_array(sbport, long, boot_devs, 0444);
 MODULE_PARM_DESC(sbport, "Port # for CMI8330 SB driver.");
 MODULE_PARM_SYNTAX(sbport, SNDRV_ENABLED ",allows:{{0x220,0x280,0x20}},prefers:{0x220},base:16,dialog:list");
-MODULE_PARM(sbirq, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+module_param_array(sbirq, int, boot_devs, 0444);
 MODULE_PARM_DESC(sbirq, "IRQ # for CMI8330 SB driver.");
 MODULE_PARM_SYNTAX(sbirq, SNDRV_ENABLED ",allows:{{5},{7},{9},{10},{11},{12}},prefers:{5},dialog:list");
-MODULE_PARM(sbdma8, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+module_param_array(sbdma8, int, boot_devs, 0444);
 MODULE_PARM_DESC(sbdma8, "DMA8 for CMI8330 SB driver.");
 MODULE_PARM_SYNTAX(sbdma8, SNDRV_DMA8_DESC ",prefers:{1}");
-MODULE_PARM(sbdma16, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+module_param_array(sbdma16, int, boot_devs, 0444);
 MODULE_PARM_DESC(sbdma16, "DMA16 for CMI8330 SB driver.");
 MODULE_PARM_SYNTAX(sbdma16, SNDRV_ENABLED ",allows:{{5},{7}},prefers:{5},dialog:list");
 
-MODULE_PARM(wssport, "1-" __MODULE_STRING(SNDRV_CARDS) "l");
+module_param_array(wssport, long, boot_devs, 0444);
 MODULE_PARM_DESC(wssport, "Port # for CMI8330 WSS driver.");
 MODULE_PARM_SYNTAX(wssport, SNDRV_ENABLED ",allows:{{0x530},{0xe80,0xf40,0xc0}},prefers:{0x530},base:16,dialog:list");
-MODULE_PARM(wssirq, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+module_param_array(wssirq, int, boot_devs, 0444);
 MODULE_PARM_DESC(wssirq, "IRQ # for CMI8330 WSS driver.");
 MODULE_PARM_SYNTAX(wssirq, SNDRV_ENABLED ",allows:{{5},{7},{9},{10},{11},{12}},prefers:{11},dialog:list");
-MODULE_PARM(wssdma, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+module_param_array(wssdma, int, boot_devs, 0444);
 MODULE_PARM_DESC(wssdma, "DMA for CMI8330 WSS driver.");
 MODULE_PARM_SYNTAX(wssdma, SNDRV_DMA8_DESC ",prefers:{0}");
 
@@ -643,41 +644,3 @@
 
 module_init(alsa_card_cmi8330_init)
 module_exit(alsa_card_cmi8330_exit)
-
-#ifndef MODULE
-
-/* format is: snd-cmi8330=enable,index,id,isapnp,
-			  sbport,sbirq,
-			  sbdma8,sbdma16,
-			  wssport,wssirq,
-			  wssdma */
-
-static int __init alsa_card_cmi8330_setup(char *str)
-{
-	static unsigned __initdata nr_dev = 0;
-	int __attribute__ ((__unused__)) pnp = INT_MAX;
-
-	if (nr_dev >= SNDRV_CARDS)
-		return 0;
-	(void)(get_option(&str,&enable[nr_dev]) == 2 &&
-	       get_option(&str,&index[nr_dev]) == 2 &&
-	       get_id(&str,&id[nr_dev]) == 2 &&
-	       get_option(&str,&pnp) == 2 &&
-	       get_option_long(&str,&sbport[nr_dev]) == 2 &&
-	       get_option(&str,&sbirq[nr_dev]) == 2 &&
-	       get_option(&str,&sbdma8[nr_dev]) == 2 &&
-	       get_option(&str,&sbdma16[nr_dev]) == 2 &&
-	       get_option_long(&str,&wssport[nr_dev]) == 2 &&
-	       get_option(&str,&wssirq[nr_dev]) == 2 &&
-	       get_option(&str,&wssdma[nr_dev]) == 2);
-#ifdef CONFIG_PNP
-	if (pnp != INT_MAX)
-		isapnp[nr_dev] = pnp;
-#endif
-	nr_dev++;
-	return 1;
-}
-
-__setup("snd-cmi8330=", alsa_card_cmi8330_setup);
-
-#endif /* ifndef MODULE */
diff -Nru a/sound/isa/cs423x/cs4231.c b/sound/isa/cs423x/cs4231.c
--- a/sound/isa/cs423x/cs4231.c	2004-05-26 15:01:35 -07:00
+++ b/sound/isa/cs423x/cs4231.c	2004-05-26 15:01:35 -07:00
@@ -24,10 +24,10 @@
 #include <linux/init.h>
 #include <linux/time.h>
 #include <linux/wait.h>
+#include <linux/moduleparam.h>
 #include <sound/core.h>
 #include <sound/cs4231.h>
 #include <sound/mpu401.h>
-#define SNDRV_GET_ID
 #include <sound/initval.h>
 
 #define chip_t cs4231_t
@@ -47,32 +47,33 @@
 static int mpu_irq[SNDRV_CARDS] = SNDRV_DEFAULT_IRQ;	/* 9,11,12,15 */
 static int dma1[SNDRV_CARDS] = SNDRV_DEFAULT_DMA;	/* 0,1,3,5,6,7 */
 static int dma2[SNDRV_CARDS] = SNDRV_DEFAULT_DMA;	/* 0,1,3,5,6,7 */
+static int boot_devs;
 
-MODULE_PARM(index, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+module_param_array(index, int, boot_devs, 0444);
 MODULE_PARM_DESC(index, "Index value for CS4231 soundcard.");
 MODULE_PARM_SYNTAX(index, SNDRV_INDEX_DESC);
-MODULE_PARM(id, "1-" __MODULE_STRING(SNDRV_CARDS) "s");
+module_param_array(id, charp, boot_devs, 0444);
 MODULE_PARM_DESC(id, "ID string for CS4231 soundcard.");
 MODULE_PARM_SYNTAX(id, SNDRV_ID_DESC);
-MODULE_PARM(enable, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+module_param_array(enable, bool, boot_devs, 0444);
 MODULE_PARM_DESC(enable, "Enable CS4231 soundcard.");
 MODULE_PARM_SYNTAX(enable, SNDRV_ENABLE_DESC);
-MODULE_PARM(port, "1-" __MODULE_STRING(SNDRV_CARDS) "l");
+module_param_array(port, long, boot_devs, 0444);
 MODULE_PARM_DESC(port, "Port # for CS4231 driver.");
 MODULE_PARM_SYNTAX(port, SNDRV_PORT12_DESC);
-MODULE_PARM(mpu_port, "1-" __MODULE_STRING(SNDRV_CARDS) "l");
+module_param_array(mpu_port, long, boot_devs, 0444);
 MODULE_PARM_DESC(mpu_port, "MPU-401 port # for CS4231 driver.");
 MODULE_PARM_SYNTAX(mpu_port, SNDRV_PORT12_DESC);
-MODULE_PARM(irq, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+module_param_array(irq, int, boot_devs, 0444);
 MODULE_PARM_DESC(irq, "IRQ # for CS4231 driver.");
 MODULE_PARM_SYNTAX(irq, SNDRV_IRQ_DESC);
-MODULE_PARM(mpu_irq, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+module_param_array(mpu_irq, int, boot_devs, 0444);
 MODULE_PARM_DESC(mpu_irq, "MPU-401 IRQ # for CS4231 driver.");
 MODULE_PARM_SYNTAX(mpu_irq, SNDRV_IRQ_DESC);
-MODULE_PARM(dma1, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+module_param_array(dma1, int, boot_devs, 0444);
 MODULE_PARM_DESC(dma1, "DMA1 # for CS4231 driver.");
 MODULE_PARM_SYNTAX(dma1, SNDRV_DMA_DESC);
-MODULE_PARM(dma2, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+module_param_array(dma2, int, boot_devs, 0444);
 MODULE_PARM_DESC(dma2, "DMA2 # for CS4231 driver.");
 MODULE_PARM_SYNTAX(dma2, SNDRV_DMA_DESC);
 
@@ -179,34 +180,3 @@
 
 module_init(alsa_card_cs4231_init)
 module_exit(alsa_card_cs4231_exit)
-
-#ifndef MODULE
-
-/* format is: snd-cs4231=enable,index,id,
-			 port,mpu_port,irq,mpu_irq,
-			 dma1,dma2 */
-
-static int __init alsa_card_cs4231_setup(char *str)
-{
-	static unsigned __initdata nr_dev = 0;
-	int __attribute__ ((__unused__)) pnp = INT_MAX;
-
-	if (nr_dev >= SNDRV_CARDS)
-		return 0;
-	(void)(get_option(&str,&enable[nr_dev]) == 2 &&
-	       get_option(&str,&index[nr_dev]) == 2 &&
-	       get_id(&str,&id[nr_dev]) == 2 &&
-	       get_option(&str,&pnp) == 2 &&
-	       get_option_long(&str,&port[nr_dev]) == 2 &&
-	       get_option_long(&str,&mpu_port[nr_dev]) == 2 &&
-	       get_option(&str,&irq[nr_dev]) == 2 &&
-	       get_option(&str,&mpu_irq[nr_dev]) == 2 &&
-	       get_option(&str,&dma1[nr_dev]) == 2 &&
-	       get_option(&str,&dma2[nr_dev]) == 2);
-	nr_dev++;
-	return 1;
-}
-
-__setup("snd-cs4231=", alsa_card_cs4231_setup);
-
-#endif /* ifndef MODULE */
diff -Nru a/sound/isa/cs423x/cs4231_lib.c b/sound/isa/cs423x/cs4231_lib.c
--- a/sound/isa/cs423x/cs4231_lib.c	2004-05-26 15:01:35 -07:00
+++ b/sound/isa/cs423x/cs4231_lib.c	2004-05-26 15:01:35 -07:00
@@ -979,19 +979,27 @@
 	}		
 	if (chip->single_dma && chip->hardware != CS4231_HW_INTERWAVE) {
 		if (status & CS4231_PLAYBACK_IRQ) {
-			if (chip->mode & CS4231_MODE_PLAY)
-				snd_pcm_period_elapsed(chip->playback_substream);
+			if (chip->mode & CS4231_MODE_PLAY) {
+				if (chip->playback_substream)
+					snd_pcm_period_elapsed(chip->playback_substream);
+			}
 			if (chip->mode & CS4231_MODE_RECORD) {
-				snd_cs4231_overrange(chip);
-				snd_pcm_period_elapsed(chip->capture_substream);
+				if (chip->capture_substream) {
+					snd_cs4231_overrange(chip);
+					snd_pcm_period_elapsed(chip->capture_substream);
+				}
 			}
 		}
 	} else {
-		if (status & CS4231_PLAYBACK_IRQ)
-			snd_pcm_period_elapsed(chip->playback_substream);
+		if (status & CS4231_PLAYBACK_IRQ) {
+			if (chip->playback_substream)
+				snd_pcm_period_elapsed(chip->playback_substream);
+		}
 		if (status & CS4231_RECORD_IRQ) {
-			snd_cs4231_overrange(chip);
-			snd_pcm_period_elapsed(chip->capture_substream);
+			if (chip->capture_substream) {
+				snd_cs4231_overrange(chip);
+				snd_pcm_period_elapsed(chip->capture_substream);
+			}
 		}
 	}
 
@@ -1343,6 +1351,7 @@
 
 #ifdef CONFIG_PM
 
+/* lowlevel suspend callback for CS4231 */
 static void snd_cs4231_suspend(cs4231_t *chip)
 {
 	int reg;
@@ -1354,6 +1363,7 @@
 	spin_unlock_irqrestore(&chip->reg_lock, flags);
 }
 
+/* lowlevel resume callback for CS4231 */
 static void snd_cs4231_resume(cs4231_t *chip)
 {
 	int reg;
@@ -1395,25 +1405,25 @@
 #endif
 }
 
-static int snd_cs4231_pm_callback(struct pm_dev *dev, pm_request_t rqst, void *data)
+static int snd_cs4231_pm_suspend(snd_card_t *card, unsigned int state)
 {
-	cs4231_t *chip = snd_magic_cast(cs4231_t, dev->data, return 0);
-
-	switch (rqst) {
-	case PM_SUSPEND:
-		if (chip->suspend) {
-			snd_pcm_suspend_all(chip->pcm);
-			(*chip->suspend)(chip);
-		}
-		break;
-	case PM_RESUME:
-		if (chip->resume)
-			(*chip->resume)(chip);
-		break;
+	cs4231_t *chip = snd_magic_cast(cs4231_t, card->pm_private_data, return -EINVAL);
+	if (chip->suspend) {
+		chip->suspend(chip);
+		snd_power_change_state(card, SNDRV_CTL_POWER_D3hot);
 	}
 	return 0;
 }
 
+static int snd_cs4231_pm_resume(snd_card_t *card, unsigned int state)
+{
+	cs4231_t *chip = snd_magic_cast(cs4231_t, card->pm_private_data, return -EINVAL);
+	if (chip->resume) {
+		chip->resume(chip);
+		snd_power_change_state(card, SNDRV_CTL_POWER_D0);
+	}
+	return 0;
+}
 #endif /* CONFIG_PM */
 
 #ifdef LEGACY_SUPPORT
@@ -1441,10 +1451,6 @@
 		snd_dma_disable(chip->dma2);
 		free_dma(chip->dma2);
 	}
-#ifdef CONFIG_PM
-	if (chip->pm_dev)
-		pm_unregister(chip->pm_dev);
-#endif
 	if (chip->timer)
 		snd_device_free(chip->card, chip->timer);
 	snd_magic_kfree(chip);
@@ -1587,9 +1593,7 @@
 	/* Power Management */
 	chip->suspend = snd_cs4231_suspend;
 	chip->resume = snd_cs4231_resume;
-	chip->pm_dev = pm_register(PM_ISA_DEV, 0, snd_cs4231_pm_callback);
-	if (chip->pm_dev)
-		chip->pm_dev->data = chip;
+	snd_card_set_isa_pm_callback(card, snd_cs4231_pm_suspend, snd_cs4231_pm_resume, chip);
 #endif
 
 	*rchip = chip;
@@ -1659,7 +1663,7 @@
 #else
 #  ifdef EBUS_SUPPORT
         if (chip->ebus_flag) {
-                snd_pcm_lib_preallocate_pages_for_all(pcm, SNDRV_DMA_TYPE_PCI,
+                snd_pcm_lib_preallocate_pages_for_all(pcm, SNDRV_DMA_TYPE_DEV,
                 				      chip->dev_u.pdev,
 						      64*1024, 128*1024);
         } else {
diff -Nru a/sound/isa/cs423x/cs4236.c b/sound/isa/cs423x/cs4236.c
--- a/sound/isa/cs423x/cs4236.c	2004-05-26 15:01:35 -07:00
+++ b/sound/isa/cs423x/cs4236.c	2004-05-26 15:01:35 -07:00
@@ -23,11 +23,11 @@
 #include <linux/init.h>
 #include <linux/slab.h>
 #include <linux/pnp.h>
+#include <linux/moduleparam.h>
 #include <sound/core.h>
 #include <sound/cs4231.h>
 #include <sound/mpu401.h>
 #include <sound/opl3.h>
-#define SNDRV_GET_ID
 #include <sound/initval.h>
 
 #define chip_t cs4231_t
@@ -95,46 +95,47 @@
 static int mpu_irq[SNDRV_CARDS] = SNDRV_DEFAULT_IRQ;	/* 9,11,12,15 */
 static int dma1[SNDRV_CARDS] = SNDRV_DEFAULT_DMA;	/* 0,1,3,5,6,7 */
 static int dma2[SNDRV_CARDS] = SNDRV_DEFAULT_DMA;	/* 0,1,3,5,6,7 */
+static int boot_devs;
 
-MODULE_PARM(index, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+module_param_array(index, int, boot_devs, 0444);
 MODULE_PARM_DESC(index, "Index value for " IDENT " soundcard.");
 MODULE_PARM_SYNTAX(index, SNDRV_INDEX_DESC);
-MODULE_PARM(id, "1-" __MODULE_STRING(SNDRV_CARDS) "s");
+module_param_array(id, charp, boot_devs, 0444);
 MODULE_PARM_DESC(id, "ID string for " IDENT " soundcard.");
 MODULE_PARM_SYNTAX(id, SNDRV_ID_DESC);
-MODULE_PARM(enable, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+module_param_array(enable, bool, boot_devs, 0444);
 MODULE_PARM_DESC(enable, "Enable " IDENT " soundcard.");
 MODULE_PARM_SYNTAX(enable, SNDRV_ENABLE_DESC);
 #ifdef CONFIG_PNP
-MODULE_PARM(isapnp, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+module_param_array(isapnp, bool, boot_devs, 0444);
 MODULE_PARM_DESC(isapnp, "ISA PnP detection for specified soundcard.");
 MODULE_PARM_SYNTAX(isapnp, SNDRV_ISAPNP_DESC);
 #endif
-MODULE_PARM(port, "1-" __MODULE_STRING(SNDRV_CARDS) "l");
+module_param_array(port, long, boot_devs, 0444);
 MODULE_PARM_DESC(port, "Port # for " IDENT " driver.");
 MODULE_PARM_SYNTAX(port, SNDRV_PORT12_DESC);
-MODULE_PARM(cport, "1-" __MODULE_STRING(SNDRV_CARDS) "l");
+module_param_array(cport, long, boot_devs, 0444);
 MODULE_PARM_DESC(cport, "Control port # for " IDENT " driver.");
 MODULE_PARM_SYNTAX(cport, SNDRV_PORT12_DESC);
-MODULE_PARM(mpu_port, "1-" __MODULE_STRING(SNDRV_CARDS) "l");
+module_param_array(mpu_port, long, boot_devs, 0444);
 MODULE_PARM_DESC(mpu_port, "MPU-401 port # for " IDENT " driver.");
 MODULE_PARM_SYNTAX(mpu_port, SNDRV_PORT12_DESC);
-MODULE_PARM(fm_port, "1-" __MODULE_STRING(SNDRV_CARDS) "l");
+module_param_array(fm_port, long, boot_devs, 0444);
 MODULE_PARM_DESC(fm_port, "FM port # for " IDENT " driver.");
 MODULE_PARM_SYNTAX(fm_port, SNDRV_PORT12_DESC);
-MODULE_PARM(sb_port, "1-" __MODULE_STRING(SNDRV_CARDS) "l");
+module_param_array(sb_port, long, boot_devs, 0444);
 MODULE_PARM_DESC(sb_port, "SB port # for " IDENT " driver (optional).");
 MODULE_PARM_SYNTAX(sb_port, SNDRV_PORT12_DESC);
-MODULE_PARM(irq, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+module_param_array(irq, int, boot_devs, 0444);
 MODULE_PARM_DESC(irq, "IRQ # for " IDENT " driver.");
 MODULE_PARM_SYNTAX(irq, SNDRV_IRQ_DESC);
-MODULE_PARM(mpu_irq, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+module_param_array(mpu_irq, int, boot_devs, 0444);
 MODULE_PARM_DESC(mpu_irq, "MPU-401 IRQ # for " IDENT " driver.");
 MODULE_PARM_SYNTAX(mpu_irq, SNDRV_IRQ_DESC);
-MODULE_PARM(dma1, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+module_param_array(dma1, int, boot_devs, 0444);
 MODULE_PARM_DESC(dma1, "DMA1 # for " IDENT " driver.");
 MODULE_PARM_SYNTAX(dma1, SNDRV_DMA_DESC);
-MODULE_PARM(dma2, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+module_param_array(dma2, int, boot_devs, 0444);
 MODULE_PARM_DESC(dma2, "DMA2 # for " IDENT " driver.");
 MODULE_PARM_SYNTAX(dma2, SNDRV_DMA_DESC);
 
@@ -198,6 +199,8 @@
 	{ .id = "CSC0225", .devs = { { "CSC0000" }, { "CSC0010" }, { "CSC0003" } } },
 	/* Intel Marlin Spike Motherboard (#2) - CS4235 */
 	{ .id = "CSC0225", .devs = { { "CSC0100" }, { "CSC0110" }, { "CSC0103" } } },
+	/* Unknown Intel mainboard - CS4235 */
+	{ .id = "CSC0225", .devs = { { "CSC0100" }, { "CSC0110" } } },
 	/* Genius Sound Maker 3DJ - CS4237B */
 	{ .id = "CSC0437", .devs = { { "CSC0000" }, { "CSC0010" }, { "CSC0003" } } },
 	/* Digital PC 5000 Onboard - CS4236B */
@@ -618,48 +621,3 @@
 
 module_init(alsa_card_cs423x_init)
 module_exit(alsa_card_cs423x_exit)
-
-#ifndef MODULE
-
-/* format is: snd-cs4232=enable,index,id,isapnp,port,
-			 cport,mpu_port,fm_port,sb_port,
-			 irq,mpu_irq,dma1,dma2 */
-/* format is: snd-cs4236=enable,index,id,isapnp,port,
-			 cport,mpu_port,fm_port,sb_port,
-			 irq,mpu_irq,dma1,dma2 */
-
-static int __init alsa_card_cs423x_setup(char *str)
-{
-	static unsigned __initdata nr_dev = 0;
-	int __attribute__ ((__unused__)) pnp = INT_MAX;
-
-	if (nr_dev >= SNDRV_CARDS)
-		return 0;
-	(void)(get_option(&str,&enable[nr_dev]) == 2 &&
-	       get_option(&str,&index[nr_dev]) == 2 &&
-	       get_id(&str,&id[nr_dev]) == 2 &&
-	       get_option(&str,&pnp) == 2 &&
-	       get_option_long(&str,&port[nr_dev]) == 2 &&
-	       get_option_long(&str,&cport[nr_dev]) == 2 &&
-	       get_option_long(&str,&mpu_port[nr_dev]) == 2 &&
-	       get_option_long(&str,&fm_port[nr_dev]) == 2 &&
-	       get_option_long(&str,&sb_port[nr_dev]) == 2 &&
-	       get_option(&str,&irq[nr_dev]) == 2 &&
-	       get_option(&str,&mpu_irq[nr_dev]) == 2 &&
-	       get_option(&str,&dma1[nr_dev]) == 2 &&
-	       get_option(&str,&dma2[nr_dev]) == 2);
-#ifdef CONFIG_PNP
-	if (pnp != INT_MAX)
-		isapnp[nr_dev] = pnp;
-#endif
-	nr_dev++;
-	return 1;
-}
-
-#ifdef CS4232
-__setup("snd-cs4232=", alsa_card_cs423x_setup);
-#else /* CS4236 */
-__setup("snd-cs4236=", alsa_card_cs423x_setup);
-#endif
-
-#endif /* ifndef MODULE */
diff -Nru a/sound/isa/cs423x/pc98.c b/sound/isa/cs423x/pc98.c
--- a/sound/isa/cs423x/pc98.c	2004-05-26 15:01:35 -07:00
+++ b/sound/isa/cs423x/pc98.c	2004-05-26 15:01:35 -07:00
@@ -25,11 +25,11 @@
 #include <sound/driver.h>
 #include <linux/init.h>
 #include <linux/slab.h>
+#include <linux/moduleparam.h>
 #include <sound/core.h>
 #include <sound/cs4231.h>
 #include <sound/mpu401.h>
 #include <sound/opl3.h>
-#define SNDRV_GET_ID
 #include <sound/initval.h>
 #include "sound_pc9800.h"
 
@@ -57,43 +57,44 @@
 static int dma1[SNDRV_CARDS] = SNDRV_DEFAULT_DMA;	/* 0,1,3,5,6,7 */
 static int dma2[SNDRV_CARDS] = SNDRV_DEFAULT_DMA;	/* 0,1,3,5,6,7 */
 static int pc98ii[SNDRV_CARDS];				/* PC98II */
+static int boot_devs;
 
-MODULE_PARM(index, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+module_param_array(index, int, boot_devs, 0444);
 MODULE_PARM_DESC(index, "Index value for " IDENT " soundcard.");
 MODULE_PARM_SYNTAX(index, SNDRV_INDEX_DESC);
-MODULE_PARM(id, "1-" __MODULE_STRING(SNDRV_CARDS) "s");
+module_param_array(id, charp, boot_devs, 0444);
 MODULE_PARM_DESC(id, "ID string for " IDENT " soundcard.");
 MODULE_PARM_SYNTAX(id, SNDRV_ID_DESC);
-MODULE_PARM(enable, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+module_param_array(enable, bool, boot_devs, 0444);
 MODULE_PARM_DESC(enable, "Enable " IDENT " soundcard.");
 MODULE_PARM_SYNTAX(enable, SNDRV_ENABLE_DESC);
-MODULE_PARM(port, "1-" __MODULE_STRING(SNDRV_CARDS) "l");
+module_param_array(port, long, boot_devs, 0444);
 MODULE_PARM_DESC(port, "Port # for " IDENT " driver.");
 MODULE_PARM_SYNTAX(port, SNDRV_PORT12_DESC);
 #if 0 /* NOT USED */
-MODULE_PARM(cport, "1-" __MODULE_STRING(SNDRV_CARDS) "l");
+module_param_array(cport, long, boot_devs, 0444);
 MODULE_PARM_DESC(cport, "Control port # for " IDENT " driver.");
 MODULE_PARM_SYNTAX(cport, SNDRV_PORT12_DESC);
 #endif
-MODULE_PARM(mpu_port, "1-" __MODULE_STRING(SNDRV_CARDS) "l");
+module_param_array(mpu_port, long, boot_devs, 0444);
 MODULE_PARM_DESC(mpu_port, "MPU-401 port # for " IDENT " driver.");
 MODULE_PARM_SYNTAX(mpu_port, SNDRV_PORT12_DESC);
-MODULE_PARM(fm_port, "1-" __MODULE_STRING(SNDRV_CARDS) "l");
+module_param_array(fm_port, long, boot_devs, 0444);
 MODULE_PARM_DESC(fm_port, "FM port # for " IDENT " driver.");
 MODULE_PARM_SYNTAX(fm_port, SNDRV_PORT12_DESC);
-MODULE_PARM(irq, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+module_param_array(irq, int, boot_devs, 0444);
 MODULE_PARM_DESC(irq, "IRQ # for " IDENT " driver.");
 MODULE_PARM_SYNTAX(irq, SNDRV_IRQ_DESC);
-MODULE_PARM(mpu_irq, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+module_param_array(mpu_irq, int, boot_devs, 0444);
 MODULE_PARM_DESC(mpu_irq, "MPU-401 IRQ # for " IDENT " driver.");
 MODULE_PARM_SYNTAX(mpu_irq, SNDRV_IRQ_DESC);
-MODULE_PARM(dma1, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+module_param_array(dma1, int, boot_devs, 0444);
 MODULE_PARM_DESC(dma1, "DMA1 # for " IDENT " driver.");
 MODULE_PARM_SYNTAX(dma1, SNDRV_DMA_DESC);
-MODULE_PARM(dma2, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+module_param_array(dma2, int, boot_devs, 0444);
 MODULE_PARM_DESC(dma2, "DMA2 # for " IDENT " driver.");
 MODULE_PARM_SYNTAX(dma2, SNDRV_DMA_DESC);
-MODULE_PARM(pc98ii, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+module_param_array(pc98ii, bool, boot_devs, 0444);
 MODULE_PARM_DESC(pc98ii, "Roland MPU-PC98II support.");
 MODULE_PARM_SYNTAX(pc98ii, SNDRV_BOOLEAN_FALSE_DESC);
 
@@ -435,34 +436,3 @@
 
 module_init(alsa_card_pc98_init)
 module_exit(alsa_card_pc98_exit)
-
-#ifndef MODULE
-
-/* format is: snd-pc98-cs4232=enable,index,id,port,
-			 mpu_port,fm_port,
-			 irq,mpu_irq,dma1,dma2,pc98ii */
-
-static int __init alsa_card_pc98_setup(char *str)
-{
-	static unsigned __initdata nr_dev = 0;
-
-	if (nr_dev >= SNDRV_CARDS)
-		return 0;
-	(void)(get_option(&str,&enable[nr_dev]) == 2 &&
-	       get_option(&str,&index[nr_dev]) == 2 &&
-	       get_id(&str,&id[nr_dev]) == 2 &&
-	       get_option_long(&str,&port[nr_dev]) == 2 &&
-	       get_option_long(&str,&mpu_port[nr_dev]) == 2 &&
-	       get_option_long(&str,&fm_port[nr_dev]) == 2 &&
-	       get_option(&str,&irq[nr_dev]) == 2 &&
-	       get_option(&str,&mpu_irq[nr_dev]) == 2 &&
-	       get_option(&str,&dma1[nr_dev]) == 2 &&
-	       get_option(&str,&dma2[nr_dev]) == 2 &&
-	       get_option(&str,&pc98ii[nr_dev]) == 2);
-	nr_dev++;
-	return 1;
-}
-
-__setup("snd-pc98-cs4232=", alsa_card_pc98_setup);
-
-#endif /* ifndef MODULE */
diff -Nru a/sound/isa/dt019x.c b/sound/isa/dt019x.c
--- a/sound/isa/dt019x.c	2004-05-26 15:01:35 -07:00
+++ b/sound/isa/dt019x.c	2004-05-26 15:01:35 -07:00
@@ -26,8 +26,8 @@
 #include <linux/sched.h>
 #include <linux/wait.h>
 #include <linux/pnp.h>
+#include <linux/moduleparam.h>
 #include <sound/core.h>
-#define SNDRV_GET_ID
 #include <sound/initval.h>
 #include <sound/mpu401.h>
 #include <sound/opl3.h>
@@ -53,32 +53,33 @@
 static int irq[SNDRV_CARDS] = SNDRV_DEFAULT_IRQ;	/* PnP setup */
 static int mpu_irq[SNDRV_CARDS] = SNDRV_DEFAULT_IRQ;	/* PnP setup */
 static int dma8[SNDRV_CARDS] = SNDRV_DEFAULT_DMA;	/* PnP setup */
+static int boot_devs;
 
-MODULE_PARM(index, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+module_param_array(index, int, boot_devs, 0444);
 MODULE_PARM_DESC(index, "Index value for DT-019X based soundcard.");
 MODULE_PARM_SYNTAX(index, SNDRV_INDEX_DESC);
-MODULE_PARM(id, "1-" __MODULE_STRING(SNDRV_CARDS) "s");
+module_param_array(id, charp, boot_devs, 0444);
 MODULE_PARM_DESC(id, "ID string for DT-019X based soundcard.");
 MODULE_PARM_SYNTAX(id, SNDRV_ID_DESC);
-MODULE_PARM(enable, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+module_param_array(enable, bool, boot_devs, 0444);
 MODULE_PARM_DESC(enable, "Enable DT-019X based soundcard.");
 MODULE_PARM_SYNTAX(enable, SNDRV_ENABLE_DESC);
-MODULE_PARM(port, "1-" __MODULE_STRING(SNDRV_CARDS) "l");
+module_param_array(port, long, boot_devs, 0444);
 MODULE_PARM_DESC(port, "Port # for dt019x driver.");
 MODULE_PARM_SYNTAX(port, SNDRV_PORT12_DESC);
-MODULE_PARM(mpu_port, "1-" __MODULE_STRING(SNDRV_CARDS) "l");
+module_param_array(mpu_port, long, boot_devs, 0444);
 MODULE_PARM_DESC(mpu_port, "MPU-401 port # for dt019x driver.");
 MODULE_PARM_SYNTAX(mpu_port, SNDRV_PORT12_DESC);
-MODULE_PARM(fm_port, "1-" __MODULE_STRING(SNDRV_CARDS) "l");
+module_param_array(fm_port, long, boot_devs, 0444);
 MODULE_PARM_DESC(fm_port, "FM port # for dt019x driver.");
 MODULE_PARM_SYNTAX(fm_port, SNDRV_PORT12_DESC);
-MODULE_PARM(irq, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+module_param_array(irq, int, boot_devs, 0444);
 MODULE_PARM_DESC(irq, "IRQ # for dt019x driver.");
 MODULE_PARM_SYNTAX(irq, SNDRV_IRQ_DESC);
-MODULE_PARM(mpu_irq, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+module_param_array(mpu_irq, int, boot_devs, 0444);
 MODULE_PARM_DESC(mpu_irq, "MPU-401 IRQ # for dt019x driver.");
 MODULE_PARM_SYNTAX(mpu_irq, SNDRV_IRQ_DESC);
-MODULE_PARM(dma8, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+module_param_array(dma8, int, boot_devs, 0444);
 MODULE_PARM_DESC(dma8, "8-bit DMA # for dt019x driver.");
 MODULE_PARM_SYNTAX(dma8, SNDRV_DMA8_DESC);
 
@@ -337,32 +338,3 @@
 
 module_init(alsa_card_dt019x_init)
 module_exit(alsa_card_dt019x_exit)
-
-#ifndef MODULE
-
-/* format is: snd-dt019x=enable,index,id,
-			  port,mpu_port,fm_port,
-			  irq,mpu_irq,dma8,dma8_size */
-
-static int __init alsa_card_dt019x_setup(char *str)
-{
-	static unsigned __initdata nr_dev = 0;
-
-	if (nr_dev >= SNDRV_CARDS)
-		return 0;
-	(void)(get_option(&str,&enable[nr_dev]) == 2 &&
-	       get_option(&str,&index[nr_dev]) == 2 &&
-	       get_id(&str,&id[nr_dev]) == 2 &&
-	       get_option_long(&str,&port[nr_dev]) == 2 &&
-	       get_option_long(&str,&mpu_port[nr_dev]) == 2 &&
-	       get_option_long(&str,&fm_port[nr_dev]) == 2 &&
-	       get_option(&str,&irq[nr_dev]) == 2 &&
-	       get_option(&str,&mpu_irq[nr_dev]) == 2 &&
-	       get_option(&str,&dma8[nr_dev]) == 2);
-	nr_dev++;
-	return 1;
-}
-
-__setup("snd-dt019x=", alsa_card_dt019x_setup);
-
-#endif /* ifndef MODULE */
diff -Nru a/sound/isa/es1688/es1688.c b/sound/isa/es1688/es1688.c
--- a/sound/isa/es1688/es1688.c	2004-05-26 15:01:35 -07:00
+++ b/sound/isa/es1688/es1688.c	2004-05-26 15:01:35 -07:00
@@ -24,6 +24,7 @@
 #include <linux/init.h>
 #include <linux/time.h>
 #include <linux/wait.h>
+#include <linux/moduleparam.h>
 #include <sound/core.h>
 #include <sound/es1688.h>
 #include <sound/mpu401.h>
@@ -31,7 +32,6 @@
 #define SNDRV_LEGACY_AUTO_PROBE
 #define SNDRV_LEGACY_FIND_FREE_IRQ
 #define SNDRV_LEGACY_FIND_FREE_DMA
-#define SNDRV_GET_ID
 #include <sound/initval.h>
 
 MODULE_AUTHOR("Jaroslav Kysela <perex@suse.cz>");
@@ -51,29 +51,30 @@
 static int irq[SNDRV_CARDS] = SNDRV_DEFAULT_IRQ;	/* 5,7,9,10 */
 static int mpu_irq[SNDRV_CARDS] = SNDRV_DEFAULT_IRQ;	/* 5,7,9,10 */
 static int dma8[SNDRV_CARDS] = SNDRV_DEFAULT_DMA;	/* 0,1,3 */
+static int boot_devs;
 
-MODULE_PARM(index, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+module_param_array(index, int, boot_devs, 0444);
 MODULE_PARM_DESC(index, "Index value for ESx688 soundcard.");
 MODULE_PARM_SYNTAX(index, SNDRV_INDEX_DESC);
-MODULE_PARM(id, "1-" __MODULE_STRING(SNDRV_CARDS) "s");
+module_param_array(id, charp, boot_devs, 0444);
 MODULE_PARM_DESC(id, "ID string for ESx688 soundcard.");
 MODULE_PARM_SYNTAX(id, SNDRV_ID_DESC);
-MODULE_PARM(enable, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+module_param_array(enable, bool, boot_devs, 0444);
 MODULE_PARM_DESC(enable, "Enable ESx688 soundcard.");
 MODULE_PARM_SYNTAX(enable, SNDRV_ENABLE_DESC);
-MODULE_PARM(port, "1-" __MODULE_STRING(SNDRV_CARDS) "l");
+module_param_array(port, long, boot_devs, 0444);
 MODULE_PARM_DESC(port, "Port # for ESx688 driver.");
 MODULE_PARM_SYNTAX(port, SNDRV_PORT12_DESC);
-MODULE_PARM(mpu_port, "1-" __MODULE_STRING(SNDRV_CARDS) "l");
+module_param_array(mpu_port, long, boot_devs, 0444);
 MODULE_PARM_DESC(mpu_port, "MPU-401 port # for ESx688 driver.");
 MODULE_PARM_SYNTAX(mpu_port, SNDRV_PORT12_DESC);
-MODULE_PARM(irq, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+module_param_array(irq, int, boot_devs, 0444);
 MODULE_PARM_DESC(irq, "IRQ # for ESx688 driver.");
 MODULE_PARM_SYNTAX(irq, SNDRV_IRQ_DESC);
-MODULE_PARM(mpu_irq, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+module_param_array(mpu_irq, int, boot_devs, 0444);
 MODULE_PARM_DESC(mpu_irq, "MPU-401 IRQ # for ESx688 driver.");
 MODULE_PARM_SYNTAX(mpu_irq, SNDRV_IRQ_DESC);
-MODULE_PARM(dma8, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+module_param_array(dma8, int, boot_devs, 0444);
 MODULE_PARM_DESC(dma8, "8-bit DMA # for ESx688 driver.");
 MODULE_PARM_SYNTAX(dma8, SNDRV_DMA8_DESC);
 
@@ -211,32 +212,3 @@
 
 module_init(alsa_card_es1688_init)
 module_exit(alsa_card_es1688_exit)
-
-#ifndef MODULE
-
-/* format is: snd-es1688=enable,index,id,
-			 port,mpu_port,
-			 irq,mpu_irq,
-			 dma8 */
-
-static int __init alsa_card_es1688_setup(char *str)
-{
-	static unsigned __initdata nr_dev = 0;
-
-	if (nr_dev >= SNDRV_CARDS)
-		return 0;
-	(void)(get_option(&str,&enable[nr_dev]) == 2 &&
-	       get_option(&str,&index[nr_dev]) == 2 &&
-	       get_id(&str,&id[nr_dev]) == 2 &&
-	       get_option_long(&str,&port[nr_dev]) == 2 &&
-	       get_option_long(&str,&mpu_port[nr_dev]) == 2 &&
-	       get_option(&str,&irq[nr_dev]) == 2 &&
-	       get_option(&str,&mpu_irq[nr_dev]) == 2 &&
-	       get_option(&str,&dma8[nr_dev]) == 2);
-	nr_dev++;
-	return 1;
-}
-
-__setup("snd-es1688=", alsa_card_es1688_setup);
-
-#endif /* ifndef MODULE */
diff -Nru a/sound/isa/es18xx.c b/sound/isa/es18xx.c
--- a/sound/isa/es18xx.c	2004-05-26 15:01:35 -07:00
+++ b/sound/isa/es18xx.c	2004-05-26 15:01:35 -07:00
@@ -72,6 +72,7 @@
 #include <linux/slab.h>
 #include <linux/pnp.h>
 #include <linux/isapnp.h>
+#include <linux/moduleparam.h>
 #include <sound/core.h>
 #include <sound/control.h>
 #include <sound/pcm.h>
@@ -81,7 +82,6 @@
 #define SNDRV_LEGACY_AUTO_PROBE
 #define SNDRV_LEGACY_FIND_FREE_IRQ
 #define SNDRV_LEGACY_FIND_FREE_DMA
-#define SNDRV_GET_ID
 #include <sound/initval.h>
 
 #define PFX "es18xx: "
@@ -124,7 +124,6 @@
 	spinlock_t mixer_lock;
 	spinlock_t ctrl_lock;
 #ifdef CONFIG_PM
-	struct pm_dev *pm_dev;
 	unsigned char pm_reg;
 #endif
 };
@@ -1610,12 +1609,9 @@
 
 /* Power Management support functions */
 #ifdef CONFIG_PM
-static void snd_es18xx_suspend(es18xx_t *chip)
+static int snd_es18xx_suspend(snd_card_t *card, unsigned int state)
 {
-	snd_card_t *card = chip->card;
-
-	if (card->power_state == SNDRV_CTL_POWER_D3hot)
-		return;
+	es18xx_t *chip = snd_magic_cast(es18xx_t, card->pm_private_data, return -EINVAL);
 
 	snd_pcm_suspend_all(chip->pcm);
 
@@ -1626,63 +1622,23 @@
 	snd_es18xx_write(chip, ES18XX_PM, chip->pm_reg ^= ES18XX_PM_SUS);
 
 	snd_power_change_state(card, SNDRV_CTL_POWER_D3hot);
+	return 0;
 }
 
-static void snd_es18xx_resume(es18xx_t *chip)
+static int snd_es18xx_resume(snd_card_t *card, unsigned int state)
 {
-	snd_card_t *card = chip->card;
-
-	if (card->power_state == SNDRV_CTL_POWER_D0)
-		return;
+	es18xx_t *chip = snd_magic_cast(es18xx_t, card->pm_private_data, return -EINVAL);
 
 	/* restore PM register, we won't wake till (not 0x07) i/o activity though */
 	snd_es18xx_write(chip, ES18XX_PM, chip->pm_reg ^= ES18XX_PM_FM);
 
 	snd_power_change_state(card, SNDRV_CTL_POWER_D0);
-}
-
-/* callback for control API */
-static int snd_es18xx_set_power_state(snd_card_t *card, unsigned int power_state)
-{
-	es18xx_t *chip = (es18xx_t *) card->power_state_private_data;
-	switch (power_state) {
-	case SNDRV_CTL_POWER_D0:
-	case SNDRV_CTL_POWER_D1:
-	case SNDRV_CTL_POWER_D2:
-		snd_es18xx_resume(chip);
-		break;
-	case SNDRV_CTL_POWER_D3hot:
-	case SNDRV_CTL_POWER_D3cold:
-		snd_es18xx_suspend(chip);
-		break;
-	default:
-		return -EINVAL;
-	}
-	return 0;
-}
-
-static int snd_es18xx_pm_callback(struct pm_dev *dev, pm_request_t rqst, void *data)
-{
-	es18xx_t *chip = snd_magic_cast(es18xx_t, dev->data, return 0);
-
-	switch (rqst) {
-	case PM_SUSPEND:
-		snd_es18xx_suspend(chip);
-		break;
-	case PM_RESUME:
-		snd_es18xx_resume(chip);
-		break;
-	}
 	return 0;
 }
 #endif /* CONFIG_PM */
 
 static int snd_es18xx_free(es18xx_t *chip)
 {
-#ifdef CONFIG_PM
-	if (chip->pm_dev)
-		pm_unregister(chip->pm_dev);
-#endif
 	if (chip->res_port) {
 		release_resource(chip->res_port);
 		kfree_nocheck(chip->res_port);
@@ -1900,37 +1856,38 @@
 static int irq[SNDRV_CARDS] = SNDRV_DEFAULT_IRQ;	/* 5,7,9,10 */
 static int dma1[SNDRV_CARDS] = SNDRV_DEFAULT_DMA;	/* 0,1,3 */
 static int dma2[SNDRV_CARDS] = SNDRV_DEFAULT_DMA;	/* 0,1,3 */
+static int boot_devs;
 
-MODULE_PARM(index, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+module_param_array(index, int, boot_devs, 0444);
 MODULE_PARM_DESC(index, "Index value for ES18xx soundcard.");
 MODULE_PARM_SYNTAX(index, SNDRV_INDEX_DESC);
-MODULE_PARM(id, "1-" __MODULE_STRING(SNDRV_CARDS) "s");
+module_param_array(id, charp, boot_devs, 0444);
 MODULE_PARM_DESC(id, "ID string for ES18xx soundcard.");
 MODULE_PARM_SYNTAX(id, SNDRV_ID_DESC);
-MODULE_PARM(enable, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+module_param_array(enable, bool, boot_devs, 0444);
 MODULE_PARM_DESC(enable, "Enable ES18xx soundcard.");
 MODULE_PARM_SYNTAX(enable, SNDRV_ENABLE_DESC);
 #ifdef CONFIG_PNP
-MODULE_PARM(isapnp, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+module_param_array(isapnp, bool, boot_devs, 0444);
 MODULE_PARM_DESC(isapnp, "PnP detection for specified soundcard.");
 MODULE_PARM_SYNTAX(isapnp, SNDRV_ISAPNP_DESC);
 #endif
-MODULE_PARM(port, "1-" __MODULE_STRING(SNDRV_CARDS) "l");
+module_param_array(port, long, boot_devs, 0444);
 MODULE_PARM_DESC(port, "Port # for ES18xx driver.");
 MODULE_PARM_SYNTAX(port, SNDRV_ENABLED ",allows:{{0x220,0x280,0x20}},prefers:{0x220},base:16,dialog:list");
-MODULE_PARM(mpu_port, "1-" __MODULE_STRING(SNDRV_CARDS) "l");
+module_param_array(mpu_port, long, boot_devs, 0444);
 MODULE_PARM_DESC(mpu_port, "MPU-401 port # for ES18xx driver.");
 MODULE_PARM_SYNTAX(mpu_port, SNDRV_ENABLED ",allows:{{0x300,0x330,0x30},{0x800,0xffe,0x2}},prefers:{0x330,0x300},base:16,dialog:combo");
-MODULE_PARM(fm_port, "1-" __MODULE_STRING(SNDRV_CARDS) "l");
+module_param_array(fm_port, long, boot_devs, 0444);
 MODULE_PARM_DESC(fm_port, "FM port # for ES18xx driver.");
 MODULE_PARM_SYNTAX(fm_port, SNDRV_ENABLED ",allows:{{0x388},{0x800,0xffc,0x4}},prefers:{0x388},base:16,dialog:combo");
-MODULE_PARM(irq, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+module_param_array(irq, int, boot_devs, 0444);
 MODULE_PARM_DESC(irq, "IRQ # for ES18xx driver.");
 MODULE_PARM_SYNTAX(irq, SNDRV_IRQ_DESC ",prefers:{5}");
-MODULE_PARM(dma1, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+module_param_array(dma1, int, boot_devs, 0444);
 MODULE_PARM_DESC(dma1, "DMA 1 # for ES18xx driver.");
 MODULE_PARM_SYNTAX(dma1, SNDRV_DMA8_DESC ",prefers:{1}");
-MODULE_PARM(dma2, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+module_param_array(dma2, int, boot_devs, 0444);
 MODULE_PARM_DESC(dma2, "DMA 2 # for ES18xx driver.");
 MODULE_PARM_SYNTAX(dma2, SNDRV_ENABLED ",allows:{{0},{1},{3},{5}},dialog:list,prefers:{0}");
 
@@ -2149,16 +2106,9 @@
 		chip->rmidi = rmidi;
 	}
 
-#ifdef CONFIG_PM
 	/* Power Management */
-	chip->pm_dev = pm_register(PM_ISA_DEV, 0, snd_es18xx_pm_callback);
-	if (chip->pm_dev) {
-		chip->pm_dev->data = chip;
-		/* set control api callback */
-		card->set_power_state = snd_es18xx_set_power_state;
-		card->power_state_private_data = chip;
-	}
-#endif
+	snd_card_set_isa_pm_callback(card, snd_es18xx_suspend, snd_es18xx_resume, chip);
+
 	if ((err = snd_card_register(card)) < 0) {
 		snd_card_free(card);
 		return err;
@@ -2283,39 +2233,3 @@
 
 module_init(alsa_card_es18xx_init)
 module_exit(alsa_card_es18xx_exit)
-
-
-#ifndef MODULE
-
-/* format is: snd-es18xx=enable,index,id,isapnp,
-			 port,mpu_port,fm_port,irq,
-			 dma1,dma2 */
-
-static int __init alsa_card_es18xx_setup(char *str)
-{
-	static unsigned __initdata nr_dev = 0;
-	int __attribute__ ((__unused__)) pnp = INT_MAX;
-
-	if (nr_dev >= SNDRV_CARDS)
-		return 0;
-	(void)(get_option(&str,&enable[nr_dev]) == 2 &&
-	       get_option(&str,&index[nr_dev]) == 2 &&
-	       get_id(&str,&id[nr_dev]) == 2 &&
-	       get_option(&str,&pnp) == 2 &&
-	       get_option_long(&str,&port[nr_dev]) == 2 &&
-	       get_option_long(&str,&mpu_port[nr_dev]) == 2 &&
-	       get_option_long(&str,&fm_port[nr_dev]) == 2 &&
-	       get_option(&str,&irq[nr_dev]) == 2 &&
-	       get_option(&str,&dma1[nr_dev]) == 2 &&
-	       get_option(&str,&dma2[nr_dev]) == 2);
-#ifdef CONFIG_PNP
-	if (pnp != INT_MAX)
-		isapnp[nr_dev] = pnp;
-#endif
-	nr_dev++;
-	return 1;
-}
-
-__setup("snd-es18xx=", alsa_card_es18xx_setup);
-
-#endif /* ifndef MODULE */
diff -Nru a/sound/isa/gus/gusclassic.c b/sound/isa/gus/gusclassic.c
--- a/sound/isa/gus/gusclassic.c	2004-05-26 15:01:36 -07:00
+++ b/sound/isa/gus/gusclassic.c	2004-05-26 15:01:36 -07:00
@@ -24,12 +24,12 @@
 #include <linux/init.h>
 #include <linux/delay.h>
 #include <linux/time.h>
+#include <linux/moduleparam.h>
 #include <sound/core.h>
 #include <sound/gus.h>
 #define SNDRV_LEGACY_AUTO_PROBE
 #define SNDRV_LEGACY_FIND_FREE_IRQ
 #define SNDRV_LEGACY_FIND_FREE_DMA
-#define SNDRV_GET_ID
 #include <sound/initval.h>
 
 MODULE_AUTHOR("Jaroslav Kysela <perex@suse.cz>");
@@ -49,35 +49,36 @@
 				/* 0 to 31, (0.59V-4.52V or 0.389V-2.98V) */
 static int channels[SNDRV_CARDS] = {[0 ... (SNDRV_CARDS - 1)] = 24};
 static int pcm_channels[SNDRV_CARDS] = {[0 ... (SNDRV_CARDS - 1)] = 2};
+static int boot_devs;
 
-MODULE_PARM(index, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+module_param_array(index, int, boot_devs, 0444);
 MODULE_PARM_DESC(index, "Index value for GUS Classic soundcard.");
 MODULE_PARM_SYNTAX(index, SNDRV_INDEX_DESC);
-MODULE_PARM(id, "1-" __MODULE_STRING(SNDRV_CARDS) "s");
+module_param_array(id, charp, boot_devs, 0444);
 MODULE_PARM_DESC(id, "ID string for GUS Classic soundcard.");
 MODULE_PARM_SYNTAX(id, SNDRV_ID_DESC);
-MODULE_PARM(enable, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+module_param_array(enable, bool, boot_devs, 0444);
 MODULE_PARM_DESC(enable, "Enable GUS Classic soundcard.");
 MODULE_PARM_SYNTAX(enable, SNDRV_ENABLE_DESC);
-MODULE_PARM(port, "1-" __MODULE_STRING(SNDRV_CARDS) "l");
+module_param_array(port, long, boot_devs, 0444);
 MODULE_PARM_DESC(port, "Port # for GUS Classic driver.");
 MODULE_PARM_SYNTAX(port, SNDRV_ENABLED ",allows:{{0x220,0x260,0x10}},dialog:list");
-MODULE_PARM(irq, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+module_param_array(irq, int, boot_devs, 0444);
 MODULE_PARM_DESC(irq, "IRQ # for GUS Classic driver.");
 MODULE_PARM_SYNTAX(irq, SNDRV_ENABLED ",allows:{{3},{5},{9},{11},{12},{15}},dialog:list");
-MODULE_PARM(dma1, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+module_param_array(dma1, int, boot_devs, 0444);
 MODULE_PARM_DESC(dma1, "DMA1 # for GUS Classic driver.");
 MODULE_PARM_SYNTAX(dma1, SNDRV_ENABLED ",allows:{{1},{3},{5},{6},{7}},dialog:list");
-MODULE_PARM(dma2, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+module_param_array(dma2, int, boot_devs, 0444);
 MODULE_PARM_DESC(dma2, "DMA2 # for GUS Classic driver.");
 MODULE_PARM_SYNTAX(dma2, SNDRV_ENABLED ",allows:{{1},{3},{5},{6},{7}},dialog:list");
-MODULE_PARM(joystick_dac, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+module_param_array(joystick_dac, int, boot_devs, 0444);
 MODULE_PARM_DESC(joystick_dac, "Joystick DAC level 0.59V-4.52V or 0.389V-2.98V for GUS Classic driver.");
 MODULE_PARM_SYNTAX(joystick_dac, SNDRV_ENABLED ",allows:{{0,31}}");
-MODULE_PARM(channels, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+module_param_array(channels, int, boot_devs, 0444);
 MODULE_PARM_DESC(channels, "GF1 channels for GUS Classic driver.");
 MODULE_PARM_SYNTAX(channels,  SNDRV_ENABLED ",allows:{{14,32}}");
-MODULE_PARM(pcm_channels, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+module_param_array(pcm_channels, int, boot_devs, 0444);
 MODULE_PARM_DESC(pcm_channels, "Reserved PCM channels for GUS Classic driver.");
 MODULE_PARM_SYNTAX(pcm_channels, SNDRV_ENABLED ",allows:{{2,16}}");
 
@@ -269,35 +270,3 @@
 
 module_init(alsa_card_gusclassic_init)
 module_exit(alsa_card_gusclassic_exit)
-
-#ifndef MODULE
-
-/* format is: snd-gusclassic=enable,index,id,
-			     port,irq,
-			     dma1,dma2,
-			     joystick_dac,
-			     channels,pcm_channels */
-
-static int __init alsa_card_gusclassic_setup(char *str)
-{
-	static unsigned __initdata nr_dev = 0;
-
-	if (nr_dev >= SNDRV_CARDS)
-		return 0;
-	(void)(get_option(&str,&enable[nr_dev]) == 2 &&
-	       get_option(&str,&index[nr_dev]) == 2 &&
-	       get_id(&str,&id[nr_dev]) == 2 &&
-	       get_option_long(&str,&port[nr_dev]) == 2 &&
-	       get_option(&str,&irq[nr_dev]) == 2 &&
-	       get_option(&str,&dma1[nr_dev]) == 2 &&
-	       get_option(&str,&dma2[nr_dev]) == 2 &&
-	       get_option(&str,&joystick_dac[nr_dev]) == 2 &&
-	       get_option(&str,&channels[nr_dev]) == 2 &&
-	       get_option(&str,&pcm_channels[nr_dev]) == 2);
-	nr_dev++;
-	return 1;
-}
-
-__setup("snd-gusclassic=", alsa_card_gusclassic_setup);
-
-#endif /* ifndef MODULE */
diff -Nru a/sound/isa/gus/gusextreme.c b/sound/isa/gus/gusextreme.c
--- a/sound/isa/gus/gusextreme.c	2004-05-26 15:01:36 -07:00
+++ b/sound/isa/gus/gusextreme.c	2004-05-26 15:01:36 -07:00
@@ -24,6 +24,7 @@
 #include <linux/init.h>
 #include <linux/delay.h>
 #include <linux/time.h>
+#include <linux/moduleparam.h>
 #include <sound/core.h>
 #include <sound/gus.h>
 #include <sound/es1688.h>
@@ -32,7 +33,6 @@
 #define SNDRV_LEGACY_AUTO_PROBE
 #define SNDRV_LEGACY_FIND_FREE_IRQ
 #define SNDRV_LEGACY_FIND_FREE_DMA
-#define SNDRV_GET_ID
 #include <sound/initval.h>
 
 MODULE_AUTHOR("Jaroslav Kysela <perex@suse.cz>");
@@ -56,47 +56,48 @@
 				/* 0 to 31, (0.59V-4.52V or 0.389V-2.98V) */
 static int channels[SNDRV_CARDS] = {[0 ... (SNDRV_CARDS - 1)] = 24};
 static int pcm_channels[SNDRV_CARDS] = {[0 ... (SNDRV_CARDS - 1)] = 2};
+static int boot_devs;
 
-MODULE_PARM(index, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+module_param_array(index, int, boot_devs, 0444);
 MODULE_PARM_DESC(index, "Index value for GUS Extreme soundcard.");
 MODULE_PARM_SYNTAX(index, SNDRV_INDEX_DESC);
-MODULE_PARM(id, "1-" __MODULE_STRING(SNDRV_CARDS) "s");
+module_param_array(id, charp, boot_devs, 0444);
 MODULE_PARM_DESC(id, "ID string for GUS Extreme soundcard.");
 MODULE_PARM_SYNTAX(id, SNDRV_ID_DESC);
-MODULE_PARM(enable, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+module_param_array(enable, bool, boot_devs, 0444);
 MODULE_PARM_DESC(enable, "Enable GUS Extreme soundcard.");
 MODULE_PARM_SYNTAX(enable, SNDRV_ENABLE_DESC);
-MODULE_PARM(port, "1-" __MODULE_STRING(SNDRV_CARDS) "l");
+module_param_array(port, long, boot_devs, 0444);
 MODULE_PARM_DESC(port, "Port # for GUS Extreme driver.");
 MODULE_PARM_SYNTAX(port, SNDRV_ENABLED ",allows:{{0x220,0x260,0x20}},dialog:list");
-MODULE_PARM(gf1_port, "1-" __MODULE_STRING(SNDRV_CARDS) "l");
+module_param_array(gf1_port, long, boot_devs, 0444);
 MODULE_PARM_DESC(gf1_port, "GF1 port # for GUS Extreme driver (optional).");
 MODULE_PARM_SYNTAX(gf1_port, SNDRV_ENABLED ",allows:{{0x210,0x270,0x10}},dialog:list");
-MODULE_PARM(mpu_port, "1-" __MODULE_STRING(SNDRV_CARDS) "l");
+module_param_array(mpu_port, long, boot_devs, 0444);
 MODULE_PARM_DESC(mpu_port, "MPU-401 port # for GUS Extreme driver.");
 MODULE_PARM_SYNTAX(mpu_port, SNDRV_ENABLED ",allows:{{0x300,0x320,0x10}},dialog:list");
-MODULE_PARM(irq, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+module_param_array(irq, int, boot_devs, 0444);
 MODULE_PARM_DESC(irq, "IRQ # for GUS Extreme driver.");
 MODULE_PARM_SYNTAX(irq, SNDRV_ENABLED ",allows:{{5},{7},{9},{10}},dialog:list");
-MODULE_PARM(mpu_irq, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+module_param_array(mpu_irq, int, boot_devs, 0444);
 MODULE_PARM_DESC(mpu_irq, "MPU-401 IRQ # for GUS Extreme driver.");
 MODULE_PARM_SYNTAX(mpu_irq, SNDRV_ENABLED ",allows:{{5},{7},{9},{10}},dialog:list");
-MODULE_PARM(gf1_irq, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+module_param_array(gf1_irq, int, boot_devs, 0444);
 MODULE_PARM_DESC(gf1_irq, "GF1 IRQ # for GUS Extreme driver.");
 MODULE_PARM_SYNTAX(gf1_irq, SNDRV_ENABLED ",allows:{{2},{3},{5},{9},{11},{12},{15}},dialog:list");
-MODULE_PARM(dma8, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+module_param_array(dma8, int, boot_devs, 0444);
 MODULE_PARM_DESC(dma8, "8-bit DMA # for GUS Extreme driver.");
 MODULE_PARM_SYNTAX(dma8, SNDRV_DMA8_DESC);
-MODULE_PARM(dma1, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+module_param_array(dma1, int, boot_devs, 0444);
 MODULE_PARM_DESC(dma1, "GF1 DMA # for GUS Extreme driver.");
 MODULE_PARM_SYNTAX(dma1, SNDRV_DMA_DESC);
-MODULE_PARM(joystick_dac, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+module_param_array(joystick_dac, int, boot_devs, 0444);
 MODULE_PARM_DESC(joystick_dac, "Joystick DAC level 0.59V-4.52V or 0.389V-2.98V for GUS Extreme driver.");
 MODULE_PARM_SYNTAX(joystick_dac, SNDRV_ENABLED ",allows:{{0,31}}");
-MODULE_PARM(channels, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+module_param_array(channels, int, boot_devs, 0444);
 MODULE_PARM_DESC(channels, "GF1 channels for GUS Extreme driver.");
 MODULE_PARM_SYNTAX(channels, SNDRV_ENABLED ",allows:{{14,32}}");
-MODULE_PARM(pcm_channels, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+module_param_array(pcm_channels, int, boot_devs, 0444);
 MODULE_PARM_DESC(pcm_channels, "Reserved PCM channels for GUS Extreme driver.");
 MODULE_PARM_SYNTAX(pcm_channels, SNDRV_ENABLED ",allows:{{2,16}}");
 
@@ -387,37 +388,3 @@
 
 module_init(alsa_card_gusextreme_init)
 module_exit(alsa_card_gusextreme_exit)
-
-#ifndef MODULE
-
-/* format is: snd-gusextreme=enable,index,id,
-			     port,gf1_port,mpu_port,
-			     irq,gf1_irq,mpu_irq,
-			     dma8,dma1,
-			     joystick_dac,
-			     channels,pcm_channels */
-
-static int __init alsa_card_gusextreme_setup(char *str)
-{
-	static unsigned __initdata nr_dev = 0;
-
-	if (nr_dev >= SNDRV_CARDS)
-		return 0;
-	(void)(get_option(&str,&enable[nr_dev]) == 2 &&
-	       get_option(&str,&index[nr_dev]) == 2 &&
-	       get_id(&str,&id[nr_dev]) == 2 &&
-	       get_option_long(&str,&port[nr_dev]) == 2 &&
-	       get_option_long(&str,&gf1_port[nr_dev]) == 2 &&
-	       get_option_long(&str,&mpu_port[nr_dev]) == 2 &&
-	       get_option(&str,&irq[nr_dev]) == 2 &&
-	       get_option(&str,&gf1_irq[nr_dev]) == 2 &&
-	       get_option(&str,&mpu_irq[nr_dev]) == 2 &&
-	       get_option(&str,&dma8[nr_dev]) == 2 &&
-	       get_option(&str,&dma1[nr_dev]) == 2);
-	nr_dev++;
-	return 1;
-}
-
-__setup("snd-gusextreme=", alsa_card_gusextreme_setup);
-
-#endif /* ifndef MODULE */
diff -Nru a/sound/isa/gus/gusmax.c b/sound/isa/gus/gusmax.c
--- a/sound/isa/gus/gusmax.c	2004-05-26 15:01:36 -07:00
+++ b/sound/isa/gus/gusmax.c	2004-05-26 15:01:36 -07:00
@@ -24,13 +24,13 @@
 #include <linux/init.h>
 #include <linux/delay.h>
 #include <linux/time.h>
+#include <linux/moduleparam.h>
 #include <sound/core.h>
 #include <sound/gus.h>
 #include <sound/cs4231.h>
 #define SNDRV_LEGACY_AUTO_PROBE
 #define SNDRV_LEGACY_FIND_FREE_IRQ
 #define SNDRV_LEGACY_FIND_FREE_DMA
-#define SNDRV_GET_ID
 #include <sound/initval.h>
 
 MODULE_AUTHOR("Jaroslav Kysela <perex@suse.cz>");
@@ -50,35 +50,36 @@
 				/* 0 to 31, (0.59V-4.52V or 0.389V-2.98V) */
 static int channels[SNDRV_CARDS] = {[0 ... (SNDRV_CARDS - 1)] = 24};
 static int pcm_channels[SNDRV_CARDS] = {[0 ... (SNDRV_CARDS - 1)] = 2};
+static int boot_devs;
 
-MODULE_PARM(index, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+module_param_array(index, int, boot_devs, 0444);
 MODULE_PARM_DESC(index, "Index value for GUS MAX soundcard.");
 MODULE_PARM_SYNTAX(index, SNDRV_INDEX_DESC);
-MODULE_PARM(id, "1-" __MODULE_STRING(SNDRV_CARDS) "s");
+module_param_array(id, charp, boot_devs, 0444);
 MODULE_PARM_DESC(id, "ID string for GUS MAX soundcard.");
 MODULE_PARM_SYNTAX(id, SNDRV_ID_DESC);
-MODULE_PARM(enable, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+module_param_array(enable, bool, boot_devs, 0444);
 MODULE_PARM_DESC(enable, "Enable GUS MAX soundcard.");
 MODULE_PARM_SYNTAX(enable, SNDRV_ENABLE_DESC);
-MODULE_PARM(port, "1-" __MODULE_STRING(SNDRV_CARDS) "l");
+module_param_array(port, long, boot_devs, 0444);
 MODULE_PARM_DESC(port, "Port # for GUS MAX driver.");
 MODULE_PARM_SYNTAX(port, SNDRV_ENABLED ",allows:{{0x220},{0x230},{0x240},{0x250},{0x260}},dialog:list");
-MODULE_PARM(irq, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+module_param_array(irq, int, boot_devs, 0444);
 MODULE_PARM_DESC(irq, "IRQ # for GUS MAX driver.");
 MODULE_PARM_SYNTAX(irq, SNDRV_ENABLED ",allows:{{3},{5},{9},{11},{12},{15}},dialog:list");
-MODULE_PARM(dma1, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+module_param_array(dma1, int, boot_devs, 0444);
 MODULE_PARM_DESC(dma1, "DMA1 # for GUS MAX driver.");
 MODULE_PARM_SYNTAX(dma1, SNDRV_DMA_DESC);
-MODULE_PARM(dma2, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+module_param_array(dma2, int, boot_devs, 0444);
 MODULE_PARM_DESC(dma2, "DMA2 # for GUS MAX driver.");
 MODULE_PARM_SYNTAX(dma2, SNDRV_DMA_DESC);
-MODULE_PARM(joystick_dac, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+module_param_array(joystick_dac, int, boot_devs, 0444);
 MODULE_PARM_DESC(joystick_dac, "Joystick DAC level 0.59V-4.52V or 0.389V-2.98V for GUS MAX driver.");
 MODULE_PARM_SYNTAX(joystick_dac, SNDRV_ENABLED ",allows:{{0,31}}");
-MODULE_PARM(channels, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+module_param_array(channels, int, boot_devs, 0444);
 MODULE_PARM_DESC(channels, "Used GF1 channels for GUS MAX driver.");
 MODULE_PARM_SYNTAX(channels, SNDRV_ENABLED ",allows:{{14,32}}");
-MODULE_PARM(pcm_channels, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+module_param_array(pcm_channels, int, boot_devs, 0444);
 MODULE_PARM_DESC(pcm_channels, "Reserved PCM channels for GUS MAX driver.");
 MODULE_PARM_SYNTAX(pcm_channels, SNDRV_ENABLED ",allows:{{2,16}}");
 
@@ -409,35 +410,3 @@
 
 module_init(alsa_card_gusmax_init)
 module_exit(alsa_card_gusmax_exit)
-
-#ifndef MODULE
-
-/* format is: snd-gusmax=enable,index,id,
-			 port,irq,
-			 dma1,dma2,
-			 joystick_dac,
-			 channels,pcm_channels */
-
-static int __init alsa_card_gusmax_setup(char *str)
-{
-	static unsigned __initdata nr_dev = 0;
-
-	if (nr_dev >= SNDRV_CARDS)
-		return 0;
-	(void)(get_option(&str,&enable[nr_dev]) == 2 &&
-	       get_option(&str,&index[nr_dev]) == 2 &&
-	       get_id(&str,&id[nr_dev]) == 2 &&
-	       get_option_long(&str,&port[nr_dev]) == 2 &&
-	       get_option(&str,&irq[nr_dev]) == 2 &&
-	       get_option(&str,&dma1[nr_dev]) == 2 &&
-	       get_option(&str,&dma2[nr_dev]) == 2 &&
-	       get_option(&str,&joystick_dac[nr_dev]) == 2 &&
-	       get_option(&str,&channels[nr_dev]) == 2 &&
-	       get_option(&str,&pcm_channels[nr_dev]) == 2);
-	nr_dev++;
-	return 1;
-}
-
-__setup("snd-gusmax=", alsa_card_gusmax_setup);
-
-#endif /* ifndef MODULE */
diff -Nru a/sound/isa/gus/interwave.c b/sound/isa/gus/interwave.c
--- a/sound/isa/gus/interwave.c	2004-05-26 15:01:36 -07:00
+++ b/sound/isa/gus/interwave.c	2004-05-26 15:01:36 -07:00
@@ -28,6 +28,7 @@
 #include <linux/init.h>
 #include <linux/slab.h>
 #include <linux/pnp.h>
+#include <linux/moduleparam.h>
 #include <sound/core.h>
 #include <sound/gus.h>
 #include <sound/cs4231.h>
@@ -37,7 +38,6 @@
 #define SNDRV_LEGACY_AUTO_PROBE
 #define SNDRV_LEGACY_FIND_FREE_IRQ
 #define SNDRV_LEGACY_FIND_FREE_DMA
-#define SNDRV_GET_ID
 #include <sound/initval.h>
 
 MODULE_AUTHOR("Jaroslav Kysela <perex@suse.cz>");
@@ -73,46 +73,47 @@
 static int midi[SNDRV_CARDS] = {[0 ... (SNDRV_CARDS - 1)] = 0};
 static int pcm_channels[SNDRV_CARDS] = {[0 ... (SNDRV_CARDS - 1)] = 2};
 static int effect[SNDRV_CARDS] = {[0 ... (SNDRV_CARDS - 1)] = 0};
+static int boot_devs;
 
-MODULE_PARM(index, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+module_param_array(index, int, boot_devs, 0444);
 MODULE_PARM_DESC(index, "Index value for InterWave soundcard.");
 MODULE_PARM_SYNTAX(index, SNDRV_INDEX_DESC);
-MODULE_PARM(id, "1-" __MODULE_STRING(SNDRV_CARDS) "s");
+module_param_array(id, charp, boot_devs, 0444);
 MODULE_PARM_DESC(id, "ID string for InterWave soundcard.");
 MODULE_PARM_SYNTAX(id, SNDRV_ID_DESC);
-MODULE_PARM(enable, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+module_param_array(enable, bool, boot_devs, 0444);
 MODULE_PARM_DESC(enable, "Enable InterWave soundcard.");
 MODULE_PARM_SYNTAX(enable, SNDRV_ENABLE_DESC);
-MODULE_PARM(isapnp, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+module_param_array(isapnp, bool, boot_devs, 0444);
 MODULE_PARM_DESC(isapnp, "ISA PnP detection for specified soundcard.");
 MODULE_PARM_SYNTAX(isapnp, SNDRV_ISAPNP_DESC);
-MODULE_PARM(port, "1-" __MODULE_STRING(SNDRV_CARDS) "l");
+module_param_array(port, long, boot_devs, 0444);
 MODULE_PARM_DESC(port, "Port # for InterWave driver.");
 MODULE_PARM_SYNTAX(port, SNDRV_ENABLED ",allows:{{0x210,0x260,0x10}},dialog:list");
 #ifdef SNDRV_STB
-MODULE_PARM(port_tc, "1-" __MODULE_STRING(SNDRV_CARDS) "l");
+module_param_array(port_tc, long, boot_devs, 0444);
 MODULE_PARM_DESC(port_tc, "Tone control (TEA6330T - i2c bus) port # for InterWave driver.");
 MODULE_PARM_SYNTAX(port_tc, SNDRV_ENABLED ",allows:{{0x350,0x380,0x10}},dialog:list");
 #endif
-MODULE_PARM(irq, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+module_param_array(irq, int, boot_devs, 0444);
 MODULE_PARM_DESC(irq, "IRQ # for InterWave driver.");
 MODULE_PARM_SYNTAX(irq, SNDRV_ENABLED ",allows:{{3},{5},{9},{11},{12},{15}},dialog:list");
-MODULE_PARM(dma1, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+module_param_array(dma1, int, boot_devs, 0444);
 MODULE_PARM_DESC(dma1, "DMA1 # for InterWave driver.");
 MODULE_PARM_SYNTAX(dma1, SNDRV_DMA_DESC);
-MODULE_PARM(dma2, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+module_param_array(dma2, int, boot_devs, 0444);
 MODULE_PARM_DESC(dma2, "DMA2 # for InterWave driver.");
 MODULE_PARM_SYNTAX(dma2, SNDRV_DMA_DESC);
-MODULE_PARM(joystick_dac, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+module_param_array(joystick_dac, int, boot_devs, 0444);
 MODULE_PARM_DESC(joystick_dac, "Joystick DAC level 0.59V-4.52V or 0.389V-2.98V for InterWave driver.");
 MODULE_PARM_SYNTAX(joystick_dac, SNDRV_ENABLED ",allows:{{0,31}}");
-MODULE_PARM(midi, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+module_param_array(midi, int, boot_devs, 0444);
 MODULE_PARM_DESC(midi, "MIDI UART enable for InterWave driver.");
 MODULE_PARM_SYNTAX(midi, SNDRV_ENABLED "," SNDRV_ENABLE_DESC);
-MODULE_PARM(pcm_channels, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+module_param_array(pcm_channels, int, boot_devs, 0444);
 MODULE_PARM_DESC(pcm_channels, "Reserved PCM channels for InterWave driver.");
 MODULE_PARM_SYNTAX(pcm_channels, SNDRV_ENABLED ",allows:{{2,16}}");
-MODULE_PARM(effect, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+module_param_array(effect, int, boot_devs, 0444);
 MODULE_PARM_DESC(effect, "Effects enable for InterWave driver.");
 MODULE_PARM_SYNTAX(effect, SNDRV_ENABLED "," SNDRV_ENABLE_DESC);
 
@@ -985,49 +986,3 @@
 
 module_init(alsa_card_interwave_init)
 module_exit(alsa_card_interwave_exit)
-
-#ifndef MODULE
-
-/* format is: snd-interwave=enable,index,id,isapnp,
-			    port[,port_tc],irq,
-			    dma1,dma2,
-			    joystick_dac,midi,
-			    pcm_channels,effect */
-
-static int __init alsa_card_interwave_setup(char *str)
-{
-	static unsigned __initdata nr_dev = 0;
-	int __attribute__ ((__unused__)) pnp = INT_MAX;
-
-	if (nr_dev >= SNDRV_CARDS)
-		return 0;
-	(void)(get_option(&str,&enable[nr_dev]) == 2 &&
-	       get_option(&str,&index[nr_dev]) == 2 &&
-	       get_id(&str,&id[nr_dev]) == 2 &&
-	       get_option(&str,&pnp) == 2 &&
-	       get_option_long(&str,&port[nr_dev]) == 2 &&
-#ifdef SNDRV_STB
-	       get_option_long(&str,&port_tc[nr_dev]) == 2 &&
-#endif
-	       get_option(&str,&irq[nr_dev]) == 2 &&
-	       get_option(&str,&dma1[nr_dev]) == 2 &&
-	       get_option(&str,&dma2[nr_dev]) == 2 &&
-	       get_option(&str,&joystick_dac[nr_dev]) == 2 &&
-	       get_option(&str,&midi[nr_dev]) == 2 &&
-	       get_option(&str,&pcm_channels[nr_dev]) == 2 &&
-	       get_option(&str,&effect[nr_dev]) == 2);
-#ifdef CONFIG_PNP
-	if (pnp != INT_MAX)
-		isapnp[nr_dev] = pnp;
-#endif
-	nr_dev++;
-	return 1;
-}
-
-#ifndef SNDRV_STB
-__setup("snd-interwave=", alsa_card_interwave_setup);
-#else
-__setup("snd-interwave-stb=", alsa_card_interwave_setup);
-#endif
-
-#endif /* ifndef MODULE */
diff -Nru a/sound/isa/opl3sa2.c b/sound/isa/opl3sa2.c
--- a/sound/isa/opl3sa2.c	2004-05-26 15:01:36 -07:00
+++ b/sound/isa/opl3sa2.c	2004-05-26 15:01:36 -07:00
@@ -25,11 +25,11 @@
 #include <linux/pm.h>
 #include <linux/slab.h>
 #include <linux/pnp.h>
+#include <linux/moduleparam.h>
 #include <sound/core.h>
 #include <sound/cs4231.h>
 #include <sound/mpu401.h>
 #include <sound/opl3.h>
-#define SNDRV_GET_ID
 #include <sound/initval.h>
 
 #include <asm/io.h>
@@ -59,46 +59,47 @@
 static int dma1[SNDRV_CARDS] = SNDRV_DEFAULT_DMA;	/* 1,3,5,6,7 */
 static int dma2[SNDRV_CARDS] = SNDRV_DEFAULT_DMA;	/* 1,3,5,6,7 */
 static int opl3sa3_ymode[SNDRV_CARDS] = { [0 ... (SNDRV_CARDS-1)] = 0 };   /* 0,1,2,3 */ /*SL Added*/
+static int boot_devs;
 
-MODULE_PARM(index, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+module_param_array(index, int, boot_devs, 0444);
 MODULE_PARM_DESC(index, "Index value for OPL3-SA soundcard.");
 MODULE_PARM_SYNTAX(index, SNDRV_INDEX_DESC);
-MODULE_PARM(id, "1-" __MODULE_STRING(SNDRV_CARDS) "s");
+module_param_array(id, charp, boot_devs, 0444);
 MODULE_PARM_DESC(id, "ID string for OPL3-SA soundcard.");
 MODULE_PARM_SYNTAX(id, SNDRV_ID_DESC);
-MODULE_PARM(enable, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+module_param_array(enable, bool, boot_devs, 0444);
 MODULE_PARM_DESC(enable, "Enable OPL3-SA soundcard.");
 MODULE_PARM_SYNTAX(enable, SNDRV_ENABLE_DESC);
 #ifdef CONFIG_PNP
-MODULE_PARM(isapnp, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+module_param_array(isapnp, bool, boot_devs, 0444);
 MODULE_PARM_DESC(isapnp, "PnP detection for specified soundcard.");
 MODULE_PARM_SYNTAX(isapnp, SNDRV_ISAPNP_DESC);
 #endif
-MODULE_PARM(port, "1-" __MODULE_STRING(SNDRV_CARDS) "l");
+module_param_array(port, long, boot_devs, 0444);
 MODULE_PARM_DESC(port, "Port # for OPL3-SA driver.");
 MODULE_PARM_SYNTAX(port, SNDRV_ENABLED ",allows:{{0xf86},{0x370},{0x100}},dialog:list");
-MODULE_PARM(sb_port, "1-" __MODULE_STRING(SNDRV_CARDS) "l");
+module_param_array(sb_port, long, boot_devs, 0444);
 MODULE_PARM_DESC(sb_port, "SB port # for OPL3-SA driver.");
 MODULE_PARM_SYNTAX(sb_port, SNDRV_ENABLED ",allows:{{0x220},{0x240},{0x260}},dialog:list");
-MODULE_PARM(wss_port, "1-" __MODULE_STRING(SNDRV_CARDS) "l");
+module_param_array(wss_port, long, boot_devs, 0444);
 MODULE_PARM_DESC(wss_port, "WSS port # for OPL3-SA driver.");
 MODULE_PARM_SYNTAX(wss_port, SNDRV_ENABLED ",allows:{{0x530},{0xe80},{0xf40},{0x604}},dialog:list");
-MODULE_PARM(fm_port, "1-" __MODULE_STRING(SNDRV_CARDS) "l");
+module_param_array(fm_port, long, boot_devs, 0444);
 MODULE_PARM_DESC(fm_port, "FM port # for OPL3-SA driver.");
 MODULE_PARM_SYNTAX(fm_port, SNDRV_ENABLED ",allows:{{0x388}},dialog:list");
-MODULE_PARM(midi_port, "1-" __MODULE_STRING(SNDRV_CARDS) "l");
+module_param_array(midi_port, long, boot_devs, 0444);
 MODULE_PARM_DESC(midi_port, "MIDI port # for OPL3-SA driver.");
 MODULE_PARM_SYNTAX(midi_port, SNDRV_ENABLED ",allows:{{0x330},{0x300}},dialog:list");
-MODULE_PARM(irq, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+module_param_array(irq, int, boot_devs, 0444);
 MODULE_PARM_DESC(irq, "IRQ # for OPL3-SA driver.");
 MODULE_PARM_SYNTAX(irq, SNDRV_ENABLED ",allows:{{0},{1},{3},{5},{9},{11},{12},{15}},dialog:list");
-MODULE_PARM(dma1, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+module_param_array(dma1, int, boot_devs, 0444);
 MODULE_PARM_DESC(dma1, "DMA1 # for OPL3-SA driver.");
 MODULE_PARM_SYNTAX(dma1, SNDRV_ENABLED ",allows:{{1},{3},{5},{6},{7}},dialog:list");
-MODULE_PARM(dma2, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+module_param_array(dma2, int, boot_devs, 0444);
 MODULE_PARM_DESC(dma2, "DMA2 # for OPL3-SA driver.");
 MODULE_PARM_SYNTAX(dma2, SNDRV_ENABLED ",allows:{{1},{3},{5},{6},{7}},dialog:list");
-MODULE_PARM(opl3sa3_ymode, "1-" __MODULE_STRING(SNDRV_CARDS) "i"); /* SL Added */
+module_param_array(opl3sa3_ymode, int, boot_devs, 0444);
 MODULE_PARM_DESC(opl3sa3_ymode, "Speaker size selection for 3D Enhancement mode: Desktop/Large Notebook/Small Notebook/HiFi.");
 MODULE_PARM_SYNTAX(opl3sa3_ymode, SNDRV_ENABLED ",allows:{{0,3}},dialog:list");  /* SL Added */
 
@@ -151,7 +152,6 @@
 	snd_kcontrol_t *master_switch;
 	snd_kcontrol_t *master_volume;
 #ifdef CONFIG_PM
-	struct pm_dev *pm_dev;
 	void (*cs4231_suspend)(cs4231_t *);
 	void (*cs4231_resume)(cs4231_t *);
 #endif
@@ -168,6 +168,8 @@
 	{ .id = "YMH0030", .devs = { { "YMH0021" } } },
 	/* Yamaha OPL3-SA2 */
 	{ .id = "YMH0800", .devs = { { "YMH0021" } } },
+	/* Yamaha OPL3-SA2 */
+	{ .id = "YMH0801", .devs = { { "YMH0021" } } },
 	/* NeoMagic MagicWave 3DX */
 	{ .id = "NMX2200", .devs = { { "YMH2210" } } },
 	/* --- */
@@ -547,12 +549,9 @@
 
 /* Power Management support functions */
 #ifdef CONFIG_PM
-static void snd_opl3sa2_suspend(opl3sa2_t *chip)
+static int snd_opl3sa2_suspend(snd_card_t *card, unsigned int state)
 {
-	snd_card_t *card = chip->card;
-
-	if (card->power_state == SNDRV_CTL_POWER_D3hot)
-		return;
+	opl3sa2_t *chip = snd_magic_cast(opl3sa2_t, card->pm_private_data, return -EINVAL);
 
 	snd_pcm_suspend_all(chip->cs4231->pcm); /* stop before saving regs */
 	chip->cs4231_suspend(chip->cs4231);
@@ -561,16 +560,14 @@
 	snd_opl3sa2_write(chip, OPL3SA2_PM_CTRL, OPL3SA2_PM_D3);
 
 	snd_power_change_state(card, SNDRV_CTL_POWER_D3hot);
+	return 0;
 }
 
-static void snd_opl3sa2_resume(opl3sa2_t *chip)
+static int snd_opl3sa2_resume(snd_card_t *card, unsigned int state)
 {
-	snd_card_t *card = chip->card;
+	opl3sa2_t *chip = snd_magic_cast(opl3sa2_t, card->pm_private_data, return -EINVAL);
 	int i;
 
-	if (card->power_state == SNDRV_CTL_POWER_D0)
-		return;
-
 	/* power up */
 	snd_opl3sa2_write(chip, OPL3SA2_PM_CTRL, OPL3SA2_PM_D0);
 
@@ -587,43 +584,8 @@
 	chip->cs4231_resume(chip->cs4231);
 
 	snd_power_change_state(card, SNDRV_CTL_POWER_D0);
-}
-
-/* callback for control API */
-static int snd_opl3sa2_set_power_state(snd_card_t *card, unsigned int power_state)
-{
-	opl3sa2_t *chip = (opl3sa2_t *) card->power_state_private_data;
-	switch (power_state) {
-	case SNDRV_CTL_POWER_D0:
-	case SNDRV_CTL_POWER_D1:
-	case SNDRV_CTL_POWER_D2:
-		snd_opl3sa2_resume(chip);
-		break;
-	case SNDRV_CTL_POWER_D3hot:
-	case SNDRV_CTL_POWER_D3cold:
-		snd_opl3sa2_suspend(chip);
-		break;
-	default:
-		return -EINVAL;
-	}
 	return 0;
 }
-
-static int snd_opl3sa2_pm_callback(struct pm_dev *dev, pm_request_t rqst, void *data)
-{
-	opl3sa2_t *chip = snd_magic_cast(opl3sa2_t, dev->data, return 0);
-
-	switch (rqst) {
-	case PM_SUSPEND:
-		snd_opl3sa2_suspend(chip);
-		break;
-	case PM_RESUME:
-		snd_opl3sa2_resume(chip);
-		break;
-	}
-	return 0;
-}
-
 #endif /* CONFIG_PM */
 
 #ifdef CONFIG_PNP
@@ -688,10 +650,6 @@
 
 static int snd_opl3sa2_free(opl3sa2_t *chip)
 {
-#ifdef CONFIG_PM
-	if (chip->pm_dev)
-		pm_unregister(chip->pm_dev);
-#endif
 	if (chip->irq >= 0)
 		free_irq(chip->irq, (void *)chip);
 	if (chip->res_port) {
@@ -816,22 +774,12 @@
 			goto __error;
 	}
 #ifdef CONFIG_PM
-	/* Power Management */
-	chip->pm_dev = pm_register(PM_ISA_DEV, 0, snd_opl3sa2_pm_callback);
-	if (chip->pm_dev) {
-		chip->pm_dev->data = chip;
-		/* remember callbacks for cs4231 - they are called inside
-		 * opl3sa2 pm callback
-		 */
-		chip->cs4231_suspend = chip->cs4231->suspend;
-		chip->cs4231_resume = chip->cs4231->resume;
-		/* now clear callbacks for cs4231 */
-		chip->cs4231->suspend = NULL;
-		chip->cs4231->resume = NULL;
-		/* set control api callback */
-		card->set_power_state = snd_opl3sa2_set_power_state;
-		card->power_state_private_data = chip;
-	}
+	chip->cs4231_suspend = chip->cs4231->suspend;
+	chip->cs4231_resume = chip->cs4231->resume;
+	/* now clear callbacks for cs4231 */
+	chip->cs4231->suspend = NULL;
+	chip->cs4231->resume = NULL;
+	snd_card_set_isa_pm_callback(card, snd_opl3sa2_suspend, snd_opl3sa2_resume, chip);
 #endif
 
 	sprintf(card->longname, "%s at 0x%lx, irq %d, dma %d",
@@ -932,42 +880,3 @@
 
 module_init(alsa_card_opl3sa2_init)
 module_exit(alsa_card_opl3sa2_exit)
-
-#ifndef MODULE
-
-/* format is: snd-opl3sa2=enable,index,id,isapnp,
-			  port,sb_port,wss_port,fm_port,
-			  midi_port,irq,dma1,dma2,
-			  opl3sa3_ymode */
-
-static int __init alsa_card_opl3sa2_setup(char *str)
-{
-	static unsigned __initdata nr_dev = 0;
-	int __attribute__ ((__unused__)) pnp = INT_MAX;
-
-	if (nr_dev >= SNDRV_CARDS)
-		return 0;
-	(void)(get_option(&str,&enable[nr_dev]) == 2 &&
-	       get_option(&str,&index[nr_dev]) == 2 &&
-	       get_id(&str,&id[nr_dev]) == 2 &&
-	       get_option(&str,&pnp) == 2 &&
-	       get_option_long(&str,&port[nr_dev]) == 2 &&
-	       get_option_long(&str,&sb_port[nr_dev]) == 2 &&
-	       get_option_long(&str,&wss_port[nr_dev]) == 2 &&
-	       get_option_long(&str,&fm_port[nr_dev]) == 2 &&
-	       get_option_long(&str,&midi_port[nr_dev]) == 2 &&
-	       get_option(&str,&irq[nr_dev]) == 2 &&
-	       get_option(&str,&dma1[nr_dev]) == 2 &&
-	       get_option(&str,&dma2[nr_dev]) == 2 &&
-	       get_option(&str,&opl3sa3_ymode[nr_dev]) == 2);
-#ifdef CONFIG_PNP
-	if (pnp != INT_MAX)
-		isapnp[nr_dev] = pnp;
-#endif
-	nr_dev++;
-	return 1;
-}
-
-__setup("snd-opl3sa2=", alsa_card_opl3sa2_setup);
-
-#endif /* ifndef MODULE */
diff -Nru a/sound/isa/opti9xx/opti92x-ad1848.c b/sound/isa/opti9xx/opti92x-ad1848.c
--- a/sound/isa/opti9xx/opti92x-ad1848.c	2004-05-26 15:01:35 -07:00
+++ b/sound/isa/opti9xx/opti92x-ad1848.c	2004-05-26 15:01:35 -07:00
@@ -30,6 +30,7 @@
 #include <linux/init.h>
 #include <linux/slab.h>
 #include <linux/pnp.h>
+#include <linux/moduleparam.h>
 #include <sound/core.h>
 #ifdef CS4231
 #include <sound/cs4231.h>
@@ -48,7 +49,6 @@
 #endif
 #define SNDRV_LEGACY_FIND_FREE_IRQ
 #define SNDRV_LEGACY_FIND_FREE_DMA
-#define SNDRV_GET_ID
 #include <sound/initval.h>
 
 MODULE_AUTHOR("Massimo Piccioni <dafastidio@libero.it>");
@@ -84,38 +84,38 @@
 static int dma2 = SNDRV_DEFAULT_DMA1;		/* 0,1,3 */
 #endif	/* CS4231 || OPTi93X */
 
-MODULE_PARM(index, "i");
+module_param(index, int, 0444);
 MODULE_PARM_DESC(index, "Index value for opti9xx based soundcard.");
 MODULE_PARM_SYNTAX(index, SNDRV_INDEX_DESC);
-MODULE_PARM(id, "s");
+module_param(id, charp, 0444);
 MODULE_PARM_DESC(id, "ID string for opti9xx based soundcard.");
 MODULE_PARM_SYNTAX(id, SNDRV_ID_DESC);
-//MODULE_PARM(enable, "i");
+//module_param(enable, bool, 0444);
 //MODULE_PARM_DESC(enable, "Enable opti9xx soundcard.");
 //MODULE_PARM_SYNTAX(enable, SNDRV_ENABLE_DESC);
-MODULE_PARM(isapnp, "i");
+module_param(isapnp, bool, 0444);
 MODULE_PARM_DESC(isapnp, "Enable ISA PnP detection for specified soundcard.");
 MODULE_PARM_SYNTAX(isapnp, SNDRV_ISAPNP_DESC);
-MODULE_PARM(port, "l");
+module_param(port, long, 0444);
 MODULE_PARM_DESC(port, "WSS port # for opti9xx driver.");
 MODULE_PARM_SYNTAX(port, SNDRV_PORT_DESC);
-MODULE_PARM(mpu_port, "l");
+module_param(mpu_port, long, 0444);
 MODULE_PARM_DESC(mpu_port, "MPU-401 port # for opti9xx driver.");
 MODULE_PARM_SYNTAX(mpu_port, SNDRV_PORT_DESC);
-MODULE_PARM(fm_port, "l");
+module_param(fm_port, long, 0444);
 MODULE_PARM_DESC(fm_port, "FM port # for opti9xx driver.");
 MODULE_PARM_SYNTAX(fm_port, SNDRV_PORT_DESC);
-MODULE_PARM(irq, "i");
+module_param(irq, int, 0444);
 MODULE_PARM_DESC(irq, "WSS irq # for opti9xx driver.");
 MODULE_PARM_SYNTAX(irq, SNDRV_IRQ_DESC);
-MODULE_PARM(mpu_irq, "i");
+module_param(mpu_irq, int, 0444);
 MODULE_PARM_DESC(mpu_irq, "MPU-401 irq # for opti9xx driver.");
 MODULE_PARM_SYNTAX(mpu_irq, SNDRV_IRQ_DESC);
-MODULE_PARM(dma1, "i");
+module_param(dma1, int, 0444);
 MODULE_PARM_DESC(dma1, "1st dma # for opti9xx driver.");
 MODULE_PARM_SYNTAX(dma1, SNDRV_DMA_DESC);
 #if defined(CS4231) || defined(OPTi93X)
-MODULE_PARM(dma2, "i");
+module_param(dma2, int, 0444);
 MODULE_PARM_DESC(dma2, "2nd dma # for opti9xx driver.");
 MODULE_PARM_SYNTAX(dma2, SNDRV_DMA_DESC);
 #endif	/* CS4231 || OPTi93X */
@@ -602,7 +602,11 @@
 #endif	/* CS4231 || OPTi93X */
 
 	spin_lock_irqsave(&chip->lock, flags);
+#ifndef OPTi93X
+	 outb(irq_bits << 3 | dma_bits, chip->wss_base);
+#else /* OPTi93X */
 	snd_opti9xx_write(chip, OPTi9XX_MC_REG(3), (irq_bits << 3 | dma_bits));
+#endif /* OPTi93X */
 	spin_unlock_irqrestore(&chip->lock, flags);
 
 __skip_resources:
@@ -2253,47 +2257,3 @@
 
 module_init(alsa_card_opti9xx_init)
 module_exit(alsa_card_opti9xx_exit)
-
-#ifndef MODULE
-
-/* format is: snd-opti9xx=enable,index,id,isapnp,
-			  port,mpu_port,fm_port,
-			  irq,mpu_irq,
-			  dma1,[dma2] */
-
-static int __init alsa_card_opti9xx_setup(char *str)
-{
-	int __attribute__ ((__unused__)) enable = 1;
-	int __attribute__ ((__unused__)) pnp = INT_MAX;
-
-	(void)(get_option(&str,&enable) == 2 &&
-	       get_option(&str,&index) == 2 &&
-	       get_id(&str,&id) == 2 &&
-	       get_option(&str,&pnp) == 2 &&
-	       get_option_long(&str,&port) == 2 &&
-	       get_option_long(&str,&mpu_port) == 2 &&
-	       get_option_long(&str,&fm_port) == 2 &&
-	       get_option(&str,&irq) == 2 &&
-	       get_option(&str,&mpu_irq) == 2 &&
-	       get_option(&str,&dma1) == 2
-#if defined(CS4231) || defined(OPTi93X)
-	       &&
-	       get_option(&str,&dma2) == 2
-#endif
-	       );
-#ifdef CONFIG_PNP
-	if (pnp != INT_MAX)
-		isapnp = pnp;
-#endif
-	return 1;
-}
-
-#if defined(OPTi93X)
-__setup("snd-opti93x=", alsa_card_opti9xx_setup);
-#elif defined(CS4231)
-__setup("snd-opti92x-cs4231=", alsa_card_opti9xx_setup);
-#else
-__setup("snd-opti92x-ad1848=", alsa_card_opti9xx_setup);
-#endif
-
-#endif /* ifndef MODULE */
diff -Nru a/sound/isa/sb/emu8000_patch.c b/sound/isa/sb/emu8000_patch.c
--- a/sound/isa/sb/emu8000_patch.c	2004-05-26 15:01:35 -07:00
+++ b/sound/isa/sb/emu8000_patch.c	2004-05-26 15:01:35 -07:00
@@ -21,11 +21,11 @@
 
 #include "emu8000_local.h"
 #include <asm/uaccess.h>
+#include <linux/moduleparam.h>
 
-MODULE_PARM(emu8000_reset_addr, "i");
+static int emu8000_reset_addr = 0;
+module_param(emu8000_reset_addr, int, 0444);
 MODULE_PARM_DESC(emu8000_reset_addr, "reset write address at each time (makes slowdown)");
-
-int emu8000_reset_addr = 0;
 
 
 /*
diff -Nru a/sound/isa/sb/es968.c b/sound/isa/sb/es968.c
--- a/sound/isa/sb/es968.c	2004-05-26 15:01:36 -07:00
+++ b/sound/isa/sb/es968.c	2004-05-26 15:01:36 -07:00
@@ -24,8 +24,8 @@
 #include <linux/init.h>
 #include <linux/time.h>
 #include <linux/pnp.h>
+#include <linux/moduleparam.h>
 #include <sound/core.h>
-#define SNDRV_GET_ID
 #include <sound/initval.h>
 #include <sound/sb.h>
 
@@ -45,23 +45,24 @@
 static long port[SNDRV_CARDS] = SNDRV_DEFAULT_PORT;	/* PnP setup */
 static int irq[SNDRV_CARDS] = SNDRV_DEFAULT_IRQ;	/* Pnp setup */
 static int dma8[SNDRV_CARDS] = SNDRV_DEFAULT_DMA;	/* PnP setup */
+static int boot_devs;
 
-MODULE_PARM(index, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+module_param_array(index, int, boot_devs, 0444);
 MODULE_PARM_DESC(index, "Index value for es968 based soundcard.");
 MODULE_PARM_SYNTAX(index, SNDRV_INDEX_DESC);
-MODULE_PARM(id, "1-" __MODULE_STRING(SNDRV_CARDS) "s");
+module_param_array(id, charp, boot_devs, 0444);
 MODULE_PARM_DESC(id, "ID string for es968 based soundcard.");
 MODULE_PARM_SYNTAX(id, SNDRV_ID_DESC);
-MODULE_PARM(enable, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+module_param_array(enable, bool, boot_devs, 0444);
 MODULE_PARM_DESC(enable, "Enable es968 based soundcard.");
 MODULE_PARM_SYNTAX(enable, SNDRV_ENABLE_DESC);
-MODULE_PARM(port, "1-" __MODULE_STRING(SNDRV_CARDS) "l");
+module_param_array(port, long, boot_devs, 0444);
 MODULE_PARM_DESC(port, "Port # for es968 driver.");
 MODULE_PARM_SYNTAX(port, SNDRV_PORT12_DESC);
-MODULE_PARM(irq, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+module_param_array(irq, int, boot_devs, 0444);
 MODULE_PARM_DESC(irq, "IRQ # for es968 driver.");
 MODULE_PARM_SYNTAX(irq, SNDRV_IRQ_DESC);
-MODULE_PARM(dma8, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+module_param_array(dma8, int, boot_devs, 0444);
 MODULE_PARM_DESC(dma8, "8-bit DMA # for es968 driver.");
 MODULE_PARM_SYNTAX(dma8, SNDRV_DMA8_DESC);
 
@@ -242,28 +243,3 @@
 
 module_init(alsa_card_es968_init)
 module_exit(alsa_card_es968_exit)
-
-#ifndef MODULE
-
-/* format is: snd-es968=enable,index,id,
-			port,irq,dma1 */
-
-static int __init alsa_card_es968_setup(char *str)
-{
-	static unsigned __initdata nr_dev = 0;
-
-	if (nr_dev >= SNDRV_CARDS)
-		return 0;
-	(void)(get_option(&str,&enable[nr_dev]) == 2 &&
-	       get_option(&str,&index[nr_dev]) == 2 &&
-	       get_id(&str,&id[nr_dev]) == 2 &&
-	       get_option_long(&str,&port[nr_dev]) == 2 &&
-	       get_option(&str,&irq[nr_dev]) == 2 &&
-	       get_option(&str,&dma8[nr_dev]) == 2);
-	nr_dev++;
-	return 1;
-}
-
-__setup("snd-es968=", alsa_card_es968_setup);
-
-#endif /* ifndef MODULE */
diff -Nru a/sound/isa/sb/sb16.c b/sound/isa/sb/sb16.c
--- a/sound/isa/sb/sb16.c	2004-05-26 15:01:36 -07:00
+++ b/sound/isa/sb/sb16.c	2004-05-26 15:01:36 -07:00
@@ -24,6 +24,7 @@
 #include <linux/init.h>
 #include <linux/slab.h>
 #include <linux/pnp.h>
+#include <linux/moduleparam.h>
 #include <sound/core.h>
 #include <sound/sb.h>
 #include <sound/sb16_csp.h>
@@ -34,7 +35,6 @@
 #define SNDRV_LEGACY_AUTO_PROBE
 #define SNDRV_LEGACY_FIND_FREE_IRQ
 #define SNDRV_LEGACY_FIND_FREE_DMA
-#define SNDRV_GET_ID
 #include <sound/initval.h>
 
 #define chip_t sb_t
@@ -92,54 +92,55 @@
 #ifdef SNDRV_SBAWE_EMU8000
 static int seq_ports[SNDRV_CARDS] = {[0 ... (SNDRV_CARDS - 1)] = 4};
 #endif
+static int boot_devs;
 
-MODULE_PARM(index, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+module_param_array(index, int, boot_devs, 0444);
 MODULE_PARM_DESC(index, "Index value for SoundBlaster 16 soundcard.");
 MODULE_PARM_SYNTAX(index, SNDRV_INDEX_DESC);
-MODULE_PARM(id, "1-" __MODULE_STRING(SNDRV_CARDS) "s");
+module_param_array(id, charp, boot_devs, 0444);
 MODULE_PARM_DESC(id, "ID string for SoundBlaster 16 soundcard.");
 MODULE_PARM_SYNTAX(id, SNDRV_ID_DESC);
-MODULE_PARM(enable, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+module_param_array(enable, bool, boot_devs, 0444);
 MODULE_PARM_DESC(enable, "Enable SoundBlaster 16 soundcard.");
 MODULE_PARM_SYNTAX(enable, SNDRV_ENABLE_DESC);
 #ifdef CONFIG_PNP
-MODULE_PARM(isapnp, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+module_param_array(isapnp, bool, boot_devs, 0444);
 MODULE_PARM_DESC(isapnp, "PnP detection for specified soundcard.");
 MODULE_PARM_SYNTAX(isapnp, SNDRV_ISAPNP_DESC);
 #endif
-MODULE_PARM(port, "1-" __MODULE_STRING(SNDRV_CARDS) "l");
+module_param_array(port, long, boot_devs, 0444);
 MODULE_PARM_DESC(port, "Port # for SB16 driver.");
 MODULE_PARM_SYNTAX(port, SNDRV_ENABLED ",allows:{{0x220},{0x240},{0x260},{0x280}},dialog:list");
-MODULE_PARM(mpu_port, "1-" __MODULE_STRING(SNDRV_CARDS) "l");
+module_param_array(mpu_port, long, boot_devs, 0444);
 MODULE_PARM_DESC(mpu_port, "MPU-401 port # for SB16 driver.");
 MODULE_PARM_SYNTAX(mpu_port, SNDRV_ENABLED ",allows:{{0x330},{0x300}},dialog:list");
-MODULE_PARM(fm_port, "1-" __MODULE_STRING(SNDRV_CARDS) "l");
+module_param_array(fm_port, long, boot_devs, 0444);
 MODULE_PARM_DESC(fm_port, "FM port # for SB16 PnP driver.");
 MODULE_PARM_SYNTAX(fm_port, SNDRV_ENABLED ",allows:{{0x388},{0x38c},{0x390},{0x394}},dialog:list");
 #ifdef SNDRV_SBAWE_EMU8000
-MODULE_PARM(awe_port, "1-" __MODULE_STRING(SNDRV_CARDS) "l");
+module_param_array(awe_port, long, boot_devs, 0444);
 MODULE_PARM_DESC(awe_port, "AWE port # for SB16 PnP driver.");
 MODULE_PARM_SYNTAX(awe_port, SNDRV_ENABLED ",allows:{{0x620},{0x640},{0x660},{0x680}},dialog:list");
 #endif
-MODULE_PARM(irq, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+module_param_array(irq, int, boot_devs, 0444);
 MODULE_PARM_DESC(irq, "IRQ # for SB16 driver.");
 MODULE_PARM_SYNTAX(irq, SNDRV_IRQ_DESC);
-MODULE_PARM(dma8, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+module_param_array(dma8, int, boot_devs, 0444);
 MODULE_PARM_DESC(dma8, "8-bit DMA # for SB16 driver.");
 MODULE_PARM_SYNTAX(dma8, SNDRV_DMA8_DESC);
-MODULE_PARM(dma16, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+module_param_array(dma16, int, boot_devs, 0444);
 MODULE_PARM_DESC(dma16, "16-bit DMA # for SB16 driver.");
 MODULE_PARM_SYNTAX(dma16, SNDRV_DMA16_DESC);
-MODULE_PARM(mic_agc, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+module_param_array(mic_agc, int, boot_devs, 0444);
 MODULE_PARM_DESC(mic_agc, "Mic Auto-Gain-Control switch.");
 MODULE_PARM_SYNTAX(mic_agc, SNDRV_ENABLED "," SNDRV_BOOLEAN_TRUE_DESC);
 #ifdef CONFIG_SND_SB16_CSP
-MODULE_PARM(csp, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+module_param_array(csp, int, boot_devs, 0444);
 MODULE_PARM_DESC(csp, "ASP/CSP chip support.");
 MODULE_PARM_SYNTAX(csp, SNDRV_ENABLED "," SNDRV_ENABLE_DESC);
 #endif
 #ifdef SNDRV_SBAWE_EMU8000
-MODULE_PARM(seq_ports, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+module_param_array(seq_ports, int, boot_devs, 0444);
 MODULE_PARM_DESC(seq_ports, "Number of sequencer ports for WaveTable synth.");
 MODULE_PARM_SYNTAX(seq_ports, SNDRV_ENABLED ",allows:{{0,8}},skill:advanced");
 #endif
@@ -247,6 +248,8 @@
 	{ .id = "CTLXXXX" , .devs = { { "CTL0044" }, { "CTL0023" } } },
 	{ .id = "CTLXXXX" , .devs = { { "CTL0045" }, { "CTL0022" } } },
 #endif /* SNDRV_SBAWE */
+	/* Sound Blaster 16 PnP (Virtual PC 2004)*/
+	{ .id = "tBA03b0", .devs = { { "PNPb003" } } },
 	{ .id = "", }
 };
 
@@ -691,60 +694,3 @@
 
 module_init(alsa_card_sb16_init)
 module_exit(alsa_card_sb16_exit)
-
-#ifndef MODULE
-
-/* format is: snd-sb16=enable,index,id,isapnp,
-		       port,mpu_port,fm_port,
-		       irq,dma8,dma16,
-		       mic_agc,csp,
-		       [awe_port,seq_ports] */
-
-static int __init alsa_card_sb16_setup(char *str)
-{
-	static unsigned __initdata nr_dev = 0;
-	int __attribute__ ((__unused__)) pnp = INT_MAX;
-	int __attribute__ ((__unused__)) xcsp = INT_MAX;
-
-	if (nr_dev >= SNDRV_CARDS)
-		return 0;
-	(void)(get_option(&str,&enable[nr_dev]) == 2 &&
-	       get_option(&str,&index[nr_dev]) == 2 &&
-	       get_id(&str,&id[nr_dev]) == 2 &&
-	       get_option(&str,&pnp) == 2 &&
-	       get_option_long(&str,&port[nr_dev]) == 2 &&
-	       get_option_long(&str,&mpu_port[nr_dev]) == 2 &&
-	       get_option_long(&str,&fm_port[nr_dev]) == 2 &&
-	       get_option(&str,&irq[nr_dev]) == 2 &&
-	       get_option(&str,&dma8[nr_dev]) == 2 &&
-	       get_option(&str,&dma16[nr_dev]) == 2 &&
-	       get_option(&str,&mic_agc[nr_dev]) == 2
-#ifdef CONFIG_SND_SB16_CSP
-	       &&
-	       get_option(&str,&xcsp) == 2
-#endif
-#ifdef SNDRV_SBAWE_EMU8000
-	       &&
-	       get_option_long(&str,&awe_port[nr_dev]) == 2 &&
-	       get_option(&str,&seq_ports[nr_dev]) == 2
-#endif
-	       );
-#ifdef CONFIG_PNP
-	if (pnp != INT_MAX)
-		isapnp[nr_dev] = pnp;
-#endif
-#ifdef CONFIG_SND_SB16_CSP
-	if (xcsp != INT_MAX)
-		csp[nr_dev] = xcsp;
-#endif
-	nr_dev++;
-	return 1;
-}
-
-#ifndef SNDRV_SBAWE_EMU8000
-__setup("snd-sb16=", alsa_card_sb16_setup);
-#else
-__setup("snd-sbawe=", alsa_card_sb16_setup);
-#endif
-
-#endif /* ifndef MODULE */
diff -Nru a/sound/isa/sb/sb8.c b/sound/isa/sb/sb8.c
--- a/sound/isa/sb/sb8.c	2004-05-26 15:01:36 -07:00
+++ b/sound/isa/sb/sb8.c	2004-05-26 15:01:36 -07:00
@@ -23,11 +23,11 @@
 #include <linux/init.h>
 #include <linux/slab.h>
 #include <linux/ioport.h>
+#include <linux/moduleparam.h>
 #include <sound/core.h>
 #include <sound/sb.h>
 #include <sound/opl3.h>
 #define SNDRV_LEGACY_AUTO_PROBE
-#define SNDRV_GET_ID
 #include <sound/initval.h>
 
 #define chip_t sb_t
@@ -44,23 +44,24 @@
 static long port[SNDRV_CARDS] = SNDRV_DEFAULT_PORT;	/* 0x220,0x240,0x260 */
 static int irq[SNDRV_CARDS] = SNDRV_DEFAULT_IRQ;	/* 5,7,9,10 */
 static int dma8[SNDRV_CARDS] = SNDRV_DEFAULT_DMA;	/* 1,3 */
+static int boot_devs;
 
-MODULE_PARM(index, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+module_param_array(index, int, boot_devs, 0444);
 MODULE_PARM_DESC(index, "Index value for Sound Blaster soundcard.");
 MODULE_PARM_SYNTAX(index, SNDRV_INDEX_DESC);
-MODULE_PARM(id, "1-" __MODULE_STRING(SNDRV_CARDS) "s");
+module_param_array(id, charp, boot_devs, 0444);
 MODULE_PARM_DESC(id, "ID string for Sound Blaster soundcard.");
 MODULE_PARM_SYNTAX(id, SNDRV_ID_DESC);
-MODULE_PARM(enable, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+module_param_array(enable, bool, boot_devs, 0444);
 MODULE_PARM_DESC(enable, "Enable Sound Blaster soundcard.");
 MODULE_PARM_SYNTAX(enable, SNDRV_ENABLE_DESC);
-MODULE_PARM(port, "1-" __MODULE_STRING(SNDRV_CARDS) "l");
+module_param_array(port, long, boot_devs, 0444);
 MODULE_PARM_DESC(port, "Port # for SB8 driver.");
 MODULE_PARM_SYNTAX(port, SNDRV_PORT12_DESC);
-MODULE_PARM(irq, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+module_param_array(irq, int, boot_devs, 0444);
 MODULE_PARM_DESC(irq, "IRQ # for SB8 driver.");
 MODULE_PARM_SYNTAX(irq, SNDRV_IRQ_DESC);
-MODULE_PARM(dma8, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+module_param_array(dma8, int, boot_devs, 0444);
 MODULE_PARM_DESC(dma8, "8-bit DMA # for SB8 driver.");
 MODULE_PARM_SYNTAX(dma8, SNDRV_DMA8_DESC);
 
@@ -230,28 +231,3 @@
 
 module_init(alsa_card_sb8_init)
 module_exit(alsa_card_sb8_exit)
-
-#ifndef MODULE
-
-/* format is: snd-sb8=enable,index,id,
-		      port,irq,dma8 */
-
-static int __init alsa_card_sb8_setup(char *str)
-{
-	static unsigned __initdata nr_dev = 0;
-
-	if (nr_dev >= SNDRV_CARDS)
-		return 0;
-	(void)(get_option(&str,&enable[nr_dev]) == 2 &&
-	       get_option(&str,&index[nr_dev]) == 2 &&
-	       get_id(&str,&id[nr_dev]) == 2 &&
-	       get_option_long(&str,&port[nr_dev]) == 2 &&
-	       get_option(&str,&irq[nr_dev]) == 2 &&
-	       get_option(&str,&dma8[nr_dev]) == 2);
-	nr_dev++;
-	return 1;
-}
-
-__setup("snd-sb8=", alsa_card_sb8_setup);
-
-#endif /* ifndef MODULE */
diff -Nru a/sound/isa/sgalaxy.c b/sound/isa/sgalaxy.c
--- a/sound/isa/sgalaxy.c	2004-05-26 15:01:36 -07:00
+++ b/sound/isa/sgalaxy.c	2004-05-26 15:01:36 -07:00
@@ -27,13 +27,13 @@
 #include <linux/delay.h>
 #include <linux/time.h>
 #include <linux/irq.h>
+#include <linux/moduleparam.h>
 #include <sound/core.h>
 #include <sound/sb.h>
 #include <sound/ad1848.h>
 #include <sound/control.h>
 #define SNDRV_LEGACY_FIND_FREE_IRQ
 #define SNDRV_LEGACY_FIND_FREE_DMA
-#define SNDRV_GET_ID
 #include <sound/initval.h>
 
 MODULE_AUTHOR("Christopher Butler <chrisb@sandy.force9.co.uk>");
@@ -49,23 +49,24 @@
 static long wssport[SNDRV_CARDS] = SNDRV_DEFAULT_PORT;	/* 0x530,0xe80,0xf40,0x604 */
 static int irq[SNDRV_CARDS] = SNDRV_DEFAULT_IRQ;	/* 7,9,10,11 */
 static int dma1[SNDRV_CARDS] = SNDRV_DEFAULT_DMA;	/* 0,1,3 */
+static int boot_devs;
 
-MODULE_PARM(index, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+module_param_array(index, int, boot_devs, 0444);
 MODULE_PARM_DESC(index, "Index value for Sound Galaxy soundcard.");
 MODULE_PARM_SYNTAX(index, SNDRV_INDEX_DESC);
-MODULE_PARM(id, "1-" __MODULE_STRING(SNDRV_CARDS) "s");
+module_param_array(id, charp, boot_devs, 0444);
 MODULE_PARM_DESC(id, "ID string for Sound Galaxy soundcard.");
 MODULE_PARM_SYNTAX(id, SNDRV_ID_DESC);
-MODULE_PARM(sbport, "1-" __MODULE_STRING(SNDRV_CARDS) "l");
+module_param_array(sbport, long, boot_devs, 0444);
 MODULE_PARM_DESC(sbport, "Port # for Sound Galaxy SB driver.");
 MODULE_PARM_SYNTAX(sbport, SNDRV_ENABLED ",allows:{{0x220},{0x240}},dialog:list");
-MODULE_PARM(wssport, "1-" __MODULE_STRING(SNDRV_CARDS) "l");
+module_param_array(wssport, long, boot_devs, 0444);
 MODULE_PARM_DESC(wssport, "Port # for Sound Galaxy WSS driver.");
 MODULE_PARM_SYNTAX(wssport, SNDRV_ENABLED ",allows:{{0x530},{0xe80},{0xf40},{0x604}},dialog:list");
-MODULE_PARM(irq, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+module_param_array(irq, int, boot_devs, 0444);
 MODULE_PARM_DESC(irq, "IRQ # for Sound Galaxy driver.");
 MODULE_PARM_SYNTAX(irq, SNDRV_ENABLED ",allows:{{7},{9},{10},{11}},dialog:list");
-MODULE_PARM(dma1, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+module_param_array(dma1, int, boot_devs, 0444);
 MODULE_PARM_DESC(dma1, "DMA1 # for Sound Galaxy driver.");
 MODULE_PARM_SYNTAX(dma1, SNDRV_DMA8_DESC);
 
@@ -327,30 +328,3 @@
 
 module_init(alsa_card_sgalaxy_init)
 module_exit(alsa_card_sgalaxy_exit)
-
-#ifndef MODULE
-
-/* format is: snd-sgalaxy=enable,index,id,
-			  sbport,wssport,
-			  irq,dma1 */
-
-static int __init alsa_card_sgalaxy_setup(char *str)
-{
-	static unsigned __initdata nr_dev = 0;
-
-	if (nr_dev >= SNDRV_CARDS)
-		return 0;
-	(void)(get_option(&str,&enable[nr_dev]) == 2 &&
-	       get_option(&str,&index[nr_dev]) == 2 &&
-	       get_id(&str,&id[nr_dev]) == 2 &&
-	       get_option_long(&str,&sbport[nr_dev]) == 2 &&
-	       get_option_long(&str,&wssport[nr_dev]) == 2 &&
-	       get_option(&str,&irq[nr_dev]) == 2 &&
-	       get_option(&str,&dma1[nr_dev]) == 2);
-	nr_dev++;
-	return 1;
-}
-
-__setup("snd-sgalaxy=", alsa_card_sgalaxy_setup);
-
-#endif /* ifndef MODULE */
diff -Nru a/sound/isa/sscape.c b/sound/isa/sscape.c
--- a/sound/isa/sscape.c	2004-05-26 15:01:35 -07:00
+++ b/sound/isa/sscape.c	2004-05-26 15:01:35 -07:00
@@ -26,12 +26,12 @@
 #include <linux/delay.h>
 #include <linux/pnp.h>
 #include <linux/spinlock.h>
+#include <linux/moduleparam.h>
 #include <asm/dma.h>
 #include <sound/core.h>
 #include <sound/hwdep.h>
 #include <sound/cs4231.h>
 #include <sound/mpu401.h>
-#define SNDRV_GET_ID
 #include <sound/initval.h>
 
 #include <sound/sscape_ioctl.h>
@@ -49,28 +49,29 @@
 static int irq[SNDRV_CARDS] __devinitdata = SNDRV_DEFAULT_IRQ;
 static int mpu_irq[SNDRV_CARDS] __devinitdata = SNDRV_DEFAULT_IRQ;
 static int dma[SNDRV_CARDS] __devinitdata = SNDRV_DEFAULT_DMA;
+static int boot_devs;
 
-MODULE_PARM(index, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+module_param_array(index, int, boot_devs, 0444);
 MODULE_PARM_DESC(index, "Index number for SoundScape soundcard");
 MODULE_PARM_SYNTAX(index, SNDRV_INDEX_DESC);
 
-MODULE_PARM(id, "1-" __MODULE_STRING(SNDRV_CARDS) "s");
+module_param_array(id, charp, boot_devs, 0444);
 MODULE_PARM_DESC(id, "Description for SoundScape card");
 MODULE_PARM_SYNTAX(id, SNDRV_ID_DESC);
 
-MODULE_PARM(port, "1-" __MODULE_STRING(SNDRV_CARDS) "l");
+module_param_array(port, long, boot_devs, 0444);
 MODULE_PARM_DESC(port, "Port # for SoundScape driver.");
 MODULE_PARM_SYNTAX(port, SNDRV_ENABLED);
 
-MODULE_PARM(irq, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+module_param_array(irq, int, boot_devs, 0444);
 MODULE_PARM_DESC(irq, "IRQ # for SoundScape driver.");
 MODULE_PARM_SYNTAX(irq, SNDRV_IRQ_DESC);
 
-MODULE_PARM(mpu_irq, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+module_param_array(mpu_irq, int, boot_devs, 0444);
 MODULE_PARM_DESC(mpu_irq, "MPU401 IRQ # for SoundScape driver.");
 MODULE_PARM_SYNTAX(mpu_irq, SNDRV_IRQ_DESC);
 
-MODULE_PARM(dma, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+module_param_array(dma, int, boot_devs, 0444);
 MODULE_PARM_DESC(dma, "DMA # for SoundScape driver.");
 MODULE_PARM_SYNTAX(dma, SNDRV_DMA8_DESC);
   
@@ -1531,30 +1532,3 @@
 
 module_init(sscape_init);
 module_exit(sscape_exit);
-
-#ifndef MODULE
-
-/* format is: snd-sscape=index,id,port,irq,mpu_irq,dma */
-
-static int __init builtin_sscape_setup(char *str)
-{
-	static unsigned __initdata nr_dev;
-
-	if (nr_dev >= SNDRV_CARDS)
-		return 0;
-
-	(void)((get_option(&str, &index[nr_dev]) == 2) &&
-	       (get_id(&str, &id[nr_dev]) == 2) &&
-	       (get_option_long(&str, &port[nr_dev]) == 2) &&
-	       (get_option(&str, &irq[nr_dev]) == 2) &&
-	       (get_option(&str, &mpu_irq[nr_dev]) == 2) &&
-	       (get_option(&str, &dma[nr_dev]) == 2)); 
- 
-	++nr_dev;
-	return 1;
-}
-
-__setup("snd-sscape=", builtin_sscape_setup);
-
-#endif
-
diff -Nru a/sound/isa/wavefront/wavefront.c b/sound/isa/wavefront/wavefront.c
--- a/sound/isa/wavefront/wavefront.c	2004-05-26 15:01:36 -07:00
+++ b/sound/isa/wavefront/wavefront.c	2004-05-26 15:01:36 -07:00
@@ -24,8 +24,8 @@
 #include <linux/interrupt.h>
 #include <linux/slab.h>
 #include <linux/pnp.h>
+#include <linux/moduleparam.h>
 #include <sound/core.h>
-#define SNDRV_GET_ID
 #include <sound/initval.h>
 #include <sound/opl3.h>
 #include <sound/snd_wavefront.h>
@@ -52,49 +52,50 @@
 static int dma1[SNDRV_CARDS] = SNDRV_DEFAULT_DMA;	    /* 0,1,3,5,6,7 */
 static int dma2[SNDRV_CARDS] = SNDRV_DEFAULT_DMA;	    /* 0,1,3,5,6,7 */
 static int use_cs4232_midi[SNDRV_CARDS] = {[0 ... (SNDRV_CARDS - 1)] = 0}; 
+static int boot_devs;
 
-MODULE_PARM(index, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+module_param_array(index, int, boot_devs, 0444);
 MODULE_PARM_DESC(index, "Index value for WaveFront soundcard.");
 MODULE_PARM_SYNTAX(index, SNDRV_INDEX_DESC);
-MODULE_PARM(id, "1-" __MODULE_STRING(SNDRV_CARDS) "s");
+module_param_array(id, charp, boot_devs, 0444);
 MODULE_PARM_DESC(id, "ID string for WaveFront soundcard.");
 MODULE_PARM_SYNTAX(id, SNDRV_ID_DESC);
-MODULE_PARM(enable, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+module_param_array(enable, bool, boot_devs, 0444);
 MODULE_PARM_DESC(enable, "Enable WaveFront soundcard.");
 MODULE_PARM_SYNTAX(enable, SNDRV_ENABLE_DESC);
 #ifdef CONFIG_PNP
-MODULE_PARM(isapnp, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+module_param_array(isapnp, bool, boot_devs, 0444);
 MODULE_PARM_DESC(isapnp, "ISA PnP detection for WaveFront soundcards.");
 MODULE_PARM_SYNTAX(isapnp, SNDRV_ISAPNP_DESC);
 #endif
-MODULE_PARM(cs4232_pcm_port, "1-" __MODULE_STRING(SNDRV_CARDS) "l");
+module_param_array(cs4232_pcm_port, long, boot_devs, 0444);
 MODULE_PARM_DESC(cs4232_pcm_port, "Port # for CS4232 PCM interface.");
 MODULE_PARM_SYNTAX(cs4232_pcm_port, SNDRV_PORT12_DESC);
-MODULE_PARM(cs4232_pcm_irq, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+module_param_array(cs4232_pcm_irq, int, boot_devs, 0444);
 MODULE_PARM_DESC(cs4232_pcm_irq, "IRQ # for CS4232 PCM interface.");
 MODULE_PARM_SYNTAX(cs4232_pcm_irq, SNDRV_ENABLED ",allows:{{5},{7},{9},{11},{12},{15}},dialog:list");
-MODULE_PARM(dma1, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+module_param_array(dma1, int, boot_devs, 0444);
 MODULE_PARM_DESC(dma1, "DMA1 # for CS4232 PCM interface.");
 MODULE_PARM_SYNTAX(dma1, SNDRV_DMA_DESC);
-MODULE_PARM(dma2, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+module_param_array(dma2, int, boot_devs, 0444);
 MODULE_PARM_DESC(dma2, "DMA2 # for CS4232 PCM interface.");
 MODULE_PARM_SYNTAX(dma2, SNDRV_DMA_DESC);
-MODULE_PARM(cs4232_mpu_port, "1-" __MODULE_STRING(SNDRV_CARDS) "l");
+module_param_array(cs4232_mpu_port, long, boot_devs, 0444);
 MODULE_PARM_DESC(cs4232_mpu_port, "port # for CS4232 MPU-401 interface.");
 MODULE_PARM_SYNTAX(cs4232_mpu_port, SNDRV_PORT12_DESC);
-MODULE_PARM(cs4232_mpu_irq, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+module_param_array(cs4232_mpu_irq, int, boot_devs, 0444);
 MODULE_PARM_DESC(cs4232_mpu_irq, "IRQ # for CS4232 MPU-401 interface.");
 MODULE_PARM_SYNTAX(cs4232_mpu_irq, SNDRV_ENABLED ",allows:{{9},{11},{12},{15}},dialog:list");
-MODULE_PARM(ics2115_irq, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+module_param_array(ics2115_irq, int, boot_devs, 0444);
 MODULE_PARM_DESC(ics2115_irq, "IRQ # for ICS2115.");
 MODULE_PARM_SYNTAX(ics2115_irq, SNDRV_ENABLED ",allows:{{9},{11},{12},{15}},dialog:list");
-MODULE_PARM(ics2115_port, "1-" __MODULE_STRING(SNDRV_CARDS) "l");
+module_param_array(ics2115_port, long, boot_devs, 0444);
 MODULE_PARM_DESC(ics2115_port, "Port # for ICS2115.");
 MODULE_PARM_SYNTAX(ics2115_port, SNDRV_PORT12_DESC);
-MODULE_PARM(fm_port, "1-" __MODULE_STRING(SNDRV_CARDS) "l");
+module_param_array(fm_port, long, boot_devs, 0444);
 MODULE_PARM_DESC(fm_port, "FM port #.");
 MODULE_PARM_SYNTAX(fm_port, SNDRV_PORT12_DESC);
-MODULE_PARM(use_cs4232_midi, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+module_param_array(use_cs4232_midi, bool, boot_devs, 0444);
 MODULE_PARM_DESC(use_cs4232_midi, "Use CS4232 MPU-401 interface (inaccessibly located inside your computer)");
 MODULE_PARM_SYNTAX(use_cs4232_midi, SNDRV_ENABLED "," SNDRV_BOOLEAN_FALSE_DESC);
 
@@ -731,41 +732,3 @@
 
 module_init(alsa_card_wavefront_init)
 module_exit(alsa_card_wavefront_exit)
-
-#ifndef MODULE
-
-/* format is: snd-wavefront=enable,index,id,isapnp,
-			    cs4232_pcm_port,cs4232_pcm_irq,
-			    cs4232_mpu_port,cs4232_mpu_irq,
-			    ics2115_port,ics2115_irq,
-			    fm_port,
-			    dma1,dma2,
-			    use_cs4232_midi */
-
-static int __init alsa_card_wavefront_setup(char *str)
-{
-	static unsigned __initdata nr_dev = 0;
-
-	if (nr_dev >= SNDRV_CARDS)
-		return 0;
-	(void)(get_option(&str,&enable[nr_dev]) == 2 &&
-	       get_option(&str,&index[nr_dev]) == 2 &&
-	       get_id(&str,&id[nr_dev]) == 2 &&
-	       get_option(&str,&isapnp[nr_dev]) == 2 &&
-	       get_option_long(&str,&cs4232_pcm_port[nr_dev]) == 2 &&
-	       get_option(&str,&cs4232_pcm_irq[nr_dev]) == 2 &&
-	       get_option_long(&str,&cs4232_mpu_port[nr_dev]) == 2 &&
-	       get_option(&str,&cs4232_mpu_irq[nr_dev]) == 2 &&
-	       get_option_long(&str,&ics2115_port[nr_dev]) == 2 &&
-	       get_option(&str,&ics2115_irq[nr_dev]) == 2 &&
-	       get_option_long(&str,&fm_port[nr_dev]) == 2 &&
-	       get_option(&str,&dma1[nr_dev]) == 2 &&
-	       get_option(&str,&dma2[nr_dev]) == 2 &&
-	       get_option(&str,&use_cs4232_midi[nr_dev]) == 2);
-	nr_dev++;
-	return 1;
-}
-
-__setup("snd-wavefront=", alsa_card_wavefront_setup);
-
-#endif /* ifndef MODULE */
diff -Nru a/sound/isa/wavefront/wavefront_synth.c b/sound/isa/wavefront/wavefront_synth.c
--- a/sound/isa/wavefront/wavefront_synth.c	2004-05-26 15:01:35 -07:00
+++ b/sound/isa/wavefront/wavefront_synth.c	2004-05-26 15:01:35 -07:00
@@ -27,6 +27,7 @@
 #include <linux/delay.h>
 #include <linux/time.h>
 #include <linux/wait.h>
+#include <linux/moduleparam.h>
 #include <sound/core.h>
 #include <sound/snd_wavefront.h>
 #include <sound/initval.h>
@@ -83,25 +84,25 @@
 int osrun_time = 10;       /* time in seconds we wait for the OS to
 			      start running.
 			   */
-MODULE_PARM(wf_raw,"i");
+module_param(wf_raw, int, 0444);
 MODULE_PARM_DESC(wf_raw, "if non-zero, assume that we need to boot the OS");
-MODULE_PARM(fx_raw,"i");
+module_param(fx_raw, int, 0444);
 MODULE_PARM_DESC(fx_raw, "if non-zero, assume that the FX process needs help");
-MODULE_PARM(debug_default,"i");
+module_param(debug_default, int, 0444);
 MODULE_PARM_DESC(debug_default, "debug parameters for card initialization");
-MODULE_PARM(wait_usecs,"i");
+module_param(wait_usecs, int, 0444);
 MODULE_PARM_DESC(wait_usecs, "how long to wait without sleeping, usecs");
-MODULE_PARM(sleep_interval,"i");
+module_param(sleep_interval, int, 0444);
 MODULE_PARM_DESC(sleep_interval, "how long to sleep when waiting for reply");
-MODULE_PARM(sleep_tries,"i");
+module_param(sleep_tries, int, 0444);
 MODULE_PARM_DESC(sleep_tries, "how many times to try sleeping during a wait");
-MODULE_PARM(ospath,"s");
+module_param(ospath, charp, 0444);
 MODULE_PARM_DESC(ospath, "full pathname to processed ICS2115 OS firmware");
-MODULE_PARM(reset_time,"i");
+module_param(reset_time, int, 0444);
 MODULE_PARM_DESC(reset_time, "how long to wait for a reset to take effect");
-MODULE_PARM(ramcheck_time,"i");
+module_param(ramcheck_time, int, 0444);
 MODULE_PARM_DESC(ramcheck_time, "how many seconds to wait for the RAM test");
-MODULE_PARM(osrun_time,"i");
+module_param(osrun_time, int, 0444);
 MODULE_PARM_DESC(osrun_time, "how many seconds to wait for the ICS2115 OS");
 
 /* if WF_DEBUG not defined, no run-time debugging messages will
diff -Nru a/sound/oss/nm256_audio.c b/sound/oss/nm256_audio.c
--- a/sound/oss/nm256_audio.c	2004-05-26 15:01:35 -07:00
+++ b/sound/oss/nm256_audio.c	2004-05-26 15:01:35 -07:00
@@ -52,6 +52,7 @@
 /* These belong in linux/pci.h. */
 #define PCI_DEVICE_ID_NEOMAGIC_NM256AV_AUDIO 0x8005
 #define PCI_DEVICE_ID_NEOMAGIC_NM256ZX_AUDIO 0x8006
+#define PCI_DEVICE_ID_NEOMAGIC_NM256XL_PLUS_AUDIO 0x8016
 
 /* List of cards.  */
 static struct nm256_info *nmcard_list;
@@ -1275,6 +1276,8 @@
 	return nm256_install(pcidev, REV_NM256AV, "256AV");
     if (pcidev->device == PCI_DEVICE_ID_NEOMAGIC_NM256ZX_AUDIO)
 	return nm256_install(pcidev, REV_NM256ZX, "256ZX");
+    if (pcidev->device == PCI_DEVICE_ID_NEOMAGIC_NM256XL_PLUS_AUDIO)
+	return nm256_install(pcidev, REV_NM256ZX, "256XL+");
     return -1; /* should not come here ... */
 }
 
@@ -1661,6 +1664,8 @@
 	{PCI_VENDOR_ID_NEOMAGIC, PCI_DEVICE_ID_NEOMAGIC_NM256AV_AUDIO,
 	PCI_ANY_ID, PCI_ANY_ID, 0, 0},
 	{PCI_VENDOR_ID_NEOMAGIC, PCI_DEVICE_ID_NEOMAGIC_NM256ZX_AUDIO,
+	PCI_ANY_ID, PCI_ANY_ID, 0, 0},
+	{PCI_VENDOR_ID_NEOMAGIC, PCI_DEVICE_ID_NEOMAGIC_NM256XL_PLUS_AUDIO,
 	PCI_ANY_ID, PCI_ANY_ID, 0, 0},
 	{0,}
 };
diff -Nru a/sound/oss/sb_card.c b/sound/oss/sb_card.c
--- a/sound/oss/sb_card.c	2004-05-26 15:01:36 -07:00
+++ b/sound/oss/sb_card.c	2004-05-26 15:01:36 -07:00
@@ -181,6 +181,13 @@
 		scc->mpucnf.io_base = pnp_port_start(dev,1);
 		return;
 	}
+	if(!strncmp("tBA",scc->card_id,3)) {
+		scc->conf.io_base   = pnp_port_start(dev,0);
+		scc->conf.irq       = pnp_irq(dev,0);
+		scc->conf.dma       = pnp_dma(dev,0);
+		scc->conf.dma2      = pnp_dma(dev,1);
+		return;
+	}
 	if(!strncmp("ESS",scc->card_id,3)) {
 		scc->conf.io_base   = pnp_port_start(dev,0);
 		scc->conf.irq       = pnp_irq(dev,0);
diff -Nru a/sound/oss/sb_card.h b/sound/oss/sb_card.h
--- a/sound/oss/sb_card.h	2004-05-26 15:01:36 -07:00
+++ b/sound/oss/sb_card.h	2004-05-26 15:01:36 -07:00
@@ -140,6 +140,8 @@
 	{.id = "RTL3000", .driver_data = 0, .devs = { {.id="@@@2001"},
 						     {.id="@X@2001"},
 						     {.id="@H@0001"}, } },
+	/* Sound Blaster 16 (Virtual PC 2004) */
+	{.id = "tBA03b0", .driver_data = 0, .devs = { {.id="PNPb003"}, } },
 	/* -end- */
 	{.id = "", }
 };
diff -Nru a/sound/parisc/harmony.c b/sound/parisc/harmony.c
--- a/sound/parisc/harmony.c	2004-05-26 15:01:35 -07:00
+++ b/sound/parisc/harmony.c	2004-05-26 15:01:35 -07:00
@@ -56,11 +56,7 @@
  * also controls for enabling/disabling internal speaker and line
  * input.
  *
- * Buffers used by this driver are all DMA consistent. Since harmony is
- * not "real" pci device, we use a fake struct pci_dev for
- * pci_alloc_consistent().
- * (note that some machines -712 for ex.- don't implement DMA consistent
- * memory, so we will need to use kmalloc instead)
+ * Buffers used by this driver are all DMA consistent.
  */
 
 #include <linux/delay.h>
@@ -70,11 +66,11 @@
 #include <linux/slab.h>
 #include <linux/time.h>
 #include <linux/wait.h>
+#include <linux/moduleparam.h>
 #include <sound/core.h>
 #include <sound/control.h>
 #include <sound/pcm.h>
 #include <sound/rawmidi.h>
-#define SNDRV_GET_ID
 #include <sound/initval.h>
 #include <sound/info.h>
 #include <asm/hardware.h>
@@ -100,16 +96,14 @@
 #define MAX_PCM_SUBSTREAMS	4
 #define MAX_MIDI_DEVICES	0
 
-#define BUFFER_SIZE			4096
-#define MAX_BUFS			10
+#define HARMONY_BUF_SIZE	4096
+#define MAX_BUFS		10
+#define MAX_BUFFER_SIZE		(MAX_BUFS * HARMONY_BUF_SIZE)
 
 /* number of silence & graveyard buffers */
 #define GRAVEYARD_BUFS		3
 #define SILENCE_BUFS		3
 
-#define MAX_BUFFER_SIZE		(MAX_BUFS * BUFFER_SIZE)
-#define HARMONY_BUF_SIZE	BUFFER_SIZE
-
 #define HARMONY_CNTL_C		0x80000000
 
 #define HARMONY_DSTATUS_PN	0x00000200
@@ -140,6 +134,17 @@
 static int index[SNDRV_CARDS] = SNDRV_DEFAULT_IDX;	/* Index 0-MAX */
 static char *id[SNDRV_CARDS] = SNDRV_DEFAULT_STR;	/* ID for this card */
 static int enable[SNDRV_CARDS] = SNDRV_DEFAULT_ENABLE;
+static int boot_devs;
+
+module_param_array(index, int, boot_devs, 0444);
+MODULE_PARM_DESC(index, "Index value for Sun CS4231 soundcard.");
+MODULE_PARM_SYNTAX(index, SNDRV_INDEX_DESC);
+module_param_array(id, charp, boot_devs, 0444);
+MODULE_PARM_DESC(id, "ID string for Sun CS4231 soundcard.");
+MODULE_PARM_SYNTAX(id, SNDRV_ID_DESC);
+module_param_array(enable, bool, boot_devs, 0444);
+MODULE_PARM_DESC(enable, "Enable Sun CS4231 soundcard.");
+MODULE_PARM_SYNTAX(enable, SNDRV_ENABLE_DESC);
 
 /* Register offset (from base hpa) */
 #define REG_ID		0x00
@@ -191,21 +196,18 @@
 	int cap_stopped;
 	int cap_total;
 
-	struct pci_dev *fake_pci_dev; /* The fake pci_dev needed for 
-					pci_* functions under ccio. */
+	struct parisc_device *pa_dev;
+
+	struct snd_dma_device dma_dev;
 
 	/* the graveyard buffer is used as recording buffer when playback, 
 	 * because harmony always want a buffer to put recorded data */
-
-	unsigned char *graveyard_addr;
-	dma_addr_t graveyard_dma;
+	struct snd_dma_buffer graveyard_dma;
 	int graveyard_count;
 	
 	/* same thing for silence buffer */
-	unsigned char *silence_addr;
-	dma_addr_t silence_dma;
+	struct snd_dma_buffer silence_dma;
 	int silence_count;
-	struct snd_dma_device dma_dev;
 
 	/* alsa stuff */
 	snd_card_t *card;
@@ -264,6 +266,15 @@
 #define HARMONY_SR_33KHZ	0x16
 #define HARMONY_SR_6KHZ		0x17
 
+/* bits corresponding to the entries of snd_card_harmony_rates */
+static unsigned int rate_bits[14] = {
+	HARMONY_SR_5KHZ, HARMONY_SR_6KHZ, HARMONY_SR_8KHZ,
+	HARMONY_SR_9KHZ, HARMONY_SR_11KHZ, HARMONY_SR_16KHZ,
+	HARMONY_SR_18KHZ, HARMONY_SR_22KHZ, HARMONY_SR_27KHZ,
+	HARMONY_SR_32KHZ, HARMONY_SR_33KHZ, HARMONY_SR_37KHZ,
+	HARMONY_SR_44KHZ, HARMONY_SR_48KHZ
+};
+
 /* snd_card_harmony_rate_bits
  * @rate:	index of current data rate in list
  * returns: harmony hex code for registers
@@ -273,26 +284,9 @@
 	unsigned int idx;
 	
 	for (idx = 0; idx <= RATES; idx++)
-		if (snd_card_harmony_rates[idx] == rate) break;
-	
-	switch (idx) {
-		case 0: return HARMONY_SR_5KHZ;
-		case 1: return HARMONY_SR_6KHZ;
-		case 2: return HARMONY_SR_8KHZ;
-		case 3: return HARMONY_SR_9KHZ;
-		case 4: return HARMONY_SR_11KHZ;
-		case 5: return HARMONY_SR_16KHZ;
-		case 6: return HARMONY_SR_18KHZ;
-		case 7: return HARMONY_SR_22KHZ;
-		case 8: return HARMONY_SR_27KHZ;
-		case 9: return HARMONY_SR_32KHZ;
-		case 10: return HARMONY_SR_33KHZ;
-		case 11: return HARMONY_SR_37KHZ;
-		case 12: return HARMONY_SR_44KHZ;
-		case 13: return HARMONY_SR_48KHZ;
-		default:  /* fallback */
-				return HARMONY_SR_44KHZ;
-	}
+		if (snd_card_harmony_rates[idx] == rate)
+			return rate_bits[idx];
+	return HARMONY_SR_44KHZ; /* fallback */
 }
 
 /*
@@ -317,27 +311,6 @@
 }
 
 /*
- * silence a buffer
- * XXX: alsa could probably do this by itself
- * XXX: memset hpmc, commented.
- */
-
-void snd_harmony_silence(snd_card_harmony_t *harmony,
-		void *addr, int length)
-{
-	u8 silence_char;
-	
-	switch(harmony->data_format) {
-			case HARMONY_DF_8BIT_ULAW: silence_char = 0x55; break;
-			case HARMONY_DF_8BIT_ALAW: silence_char = 0xff; break;
-			case HARMONY_DF_16BIT_LINEAR:
-			default:
-									   silence_char = 0;
-	}
-	//memset(addr, silence_char, length);
-}
-
-/*
  * interruption controls routines
  */
 
@@ -385,9 +358,9 @@
 			snd_pcm_period_elapsed(harmony->playback_substream);
 			harmony->ply_total++;
 		} else {
-			gsc_writel(harmony->silence_dma + 
-					(HARMONY_BUF_SIZE*harmony->silence_count),
-					hpa+REG_PNXTADD);
+			gsc_writel(harmony->silence_dma.addr + 
+				   (HARMONY_BUF_SIZE*harmony->silence_count),
+				   hpa+REG_PNXTADD);
 			harmony->silence_count++;
 			harmony->silence_count %= SILENCE_BUFS;
 		}
@@ -406,9 +379,9 @@
 			harmony->cap_total++;
 		} else {
 			/* graveyard buffer */
-			gsc_writel(harmony->graveyard_dma +
-						(HARMONY_BUF_SIZE*harmony->graveyard_count),
-						hpa+REG_RNXTADD);
+			gsc_writel(harmony->graveyard_dma.addr +
+				   (HARMONY_BUF_SIZE*harmony->graveyard_count),
+				   hpa+REG_RNXTADD);
 			harmony->graveyard_count++;
 			harmony->graveyard_count %= GRAVEYARD_BUFS;
 		}
@@ -465,26 +438,8 @@
 {
 	snd_info_entry_t *entry;
 	
-	if ((entry = snd_info_create_card_entry(harmony->card, "harmony", harmony->card->proc_root)) != NULL) {
-		entry->content = SNDRV_INFO_CONTENT_TEXT;
-		entry->private_data = harmony;
-		entry->mode = S_IFREG | S_IRUGO | S_IWUSR;
-		entry->c.text.read_size = 2048;	 /* should be enough */
-		entry->c.text.read = snd_harmony_proc_read;
-		if (snd_info_register(entry) < 0) {
-			snd_info_free_entry(entry);
-			entry = NULL;
-		}
-	}
-	harmony->proc_entry = entry;
-}
-
-static void snd_harmony_proc_done(snd_card_harmony_t *harmony)
-{
-	if (harmony->proc_entry) {
-		snd_info_unregister(harmony->proc_entry);
-		harmony->proc_entry = NULL;
-	}
+	if (! snd_card_proc_new(harmony->card, "harmony", &entry))
+		snd_info_set_text_ops(entry, harmony, 2048, snd_harmony_proc_read);
 }
 
 /* 
@@ -563,6 +518,30 @@
 	return 0;
 }
 
+/* set data format */
+static int snd_harmony_set_data_format(snd_card_harmony_t *harmony, int pcm_format)
+{
+	int old_format = harmony->data_format;
+	int new_format = old_format;
+	switch (pcm_format) {
+	case SNDRV_PCM_FORMAT_S16_BE:
+		new_format = HARMONY_DF_16BIT_LINEAR;
+		break;
+	case SNDRV_PCM_FORMAT_A_LAW:
+		new_format = HARMONY_DF_8BIT_ALAW;
+		break;
+	case SNDRV_PCM_FORMAT_MU_LAW:
+		new_format = HARMONY_DF_8BIT_ULAW;
+		break;
+	}
+	/* re-initialize silence buffer if needed */
+	if (old_format != new_format)
+		snd_pcm_format_set_silence(pcm_format, harmony->silence_dma.area,
+					   (HARMONY_BUF_SIZE * SILENCE_BUFS * 8) / snd_pcm_format_width(pcm_format));
+
+	return new_format;
+}
+
 static int snd_card_harmony_playback_prepare(snd_pcm_substream_t * substream)
 {
 	snd_card_harmony_t *harmony = snd_pcm_substream_chip(substream);
@@ -577,12 +556,13 @@
 	harmony->sample_rate = snd_card_harmony_rate_bits(runtime->rate);
 
 	/* data format */
-	if (snd_pcm_format_width(runtime->format) == 16) harmony->data_format = HARMONY_DF_16BIT_LINEAR;
-	else harmony->data_format = HARMONY_DF_8BIT_ULAW;
-	
+	harmony->data_format = snd_harmony_set_data_format(haromny, runtime->format);
+
 	/* number of channels */
-	if (runtime->channels == 2) harmony->stereo_select = HARMONY_SS_STEREO;
-	else harmony->stereo_select = HARMONY_SS_MONO;
+	if (runtime->channels == 2)
+		harmony->stereo_select = HARMONY_SS_STEREO;
+	else
+		harmony->stereo_select = HARMONY_SS_MONO;
 	
 	DPRINTK(KERN_INFO PFX "Playback_prepare, sr=%d(%x), df=%x, ss=%x hpa=%lx\n", runtime->rate,
 				harmony->sample_rate, harmony->data_format, harmony->stereo_select, harmony->hpa);
@@ -607,12 +587,13 @@
 	harmony->sample_rate = snd_card_harmony_rate_bits(runtime->rate);
 	
 	/* data format */
-	if (snd_pcm_format_width(runtime->format) == 16) harmony->data_format = HARMONY_DF_16BIT_LINEAR;
-	else harmony->data_format = HARMONY_DF_8BIT_ULAW;
+	harmony->data_format = snd_harmony_set_data_format(haromny, runtime->format);
 	
 	/* number of channels */
-	if (runtime->channels == 1) harmony->stereo_select = HARMONY_SS_MONO;
-	else if (runtime->channels == 2) harmony->stereo_select = HARMONY_SS_STEREO;
+	if (runtime->channels == 1)
+		harmony->stereo_select = HARMONY_SS_MONO;
+	else if (runtime->channels == 2)
+		harmony->stereo_select = HARMONY_SS_STEREO;
 		
 	snd_harmony_update_control(harmony);
 	harmony->format_initialized = 1;
@@ -709,13 +690,6 @@
 	snd_pcm_runtime_t *runtime = substream->runtime;
 	int err;
 	
-	/*
-	 * harmony is not "real" pci, but we need a pci_dev
-	 * to alloc PCI DMA pages
-	 */
-	substream->runtime->dma_private = harmony->fake_pci_dev;
-//	substream->dma_type = SNDRV_PCM_DMA_TYPE_PCI;
-	
 	harmony->playback_substream = substream;
 	runtime->hw = snd_card_harmony_playback;
 	snd_pcm_hw_constraint_list(runtime, 0, SNDRV_PCM_HW_PARAM_RATE, &hw_constraint_rates);
@@ -732,14 +706,6 @@
 	snd_pcm_runtime_t *runtime = substream->runtime;
 	int err;
 	
-	
-	/*
-	 * harmony is not "real" pci, but we need a pci_dev
-	 * to alloc PCI DMA pages
-	 */
-	substream->runtime->dma_private = harmony->fake_pci_dev;
-//	substream->dma_type = SNDRV_PCM_DMA_TYPE_PCI;
-
 	harmony->capture_substream = substream;
 	runtime->hw = snd_card_harmony_capture;
 	snd_pcm_hw_constraint_list(runtime, 0, SNDRV_PCM_HW_PARAM_RATE, &hw_constraint_rates);
@@ -752,7 +718,6 @@
 static int snd_card_harmony_playback_close(snd_pcm_substream_t * substream)
 {
 	snd_card_harmony_t *harmony = snd_pcm_substream_chip(substream);
-	snd_pcm_lib_free_pages(substream);
 	
 	harmony->playback_substream = NULL;
 	harmony->ply_size 			= 0;
@@ -769,8 +734,6 @@
 {
 	snd_card_harmony_t *harmony = snd_pcm_substream_chip(substream);
 	
-	snd_pcm_lib_free_pages(substream);
-	
 	harmony->capture_substream = NULL;
 	harmony->cap_size 			= 0;
 	harmony->cap_buf			= 0;
@@ -785,12 +748,11 @@
 static int snd_card_harmony_hw_params(snd_pcm_substream_t *substream, 
 	                   snd_pcm_hw_params_t * hw_params)
 {
-	snd_pcm_runtime_t *runtime = substream->runtime;
 	int err;
 	
 	err = snd_pcm_lib_malloc_pages(substream, params_buffer_bytes(hw_params));
 	DPRINTK(KERN_INFO PFX "HW Params returned %d, dma_addr %lx\n", err,
-			(unsigned long)runtime->dma_addr);
+			(unsigned long)substream->runtime->dma_addr);
 	return err;
 }
 
@@ -847,15 +809,19 @@
 	harmony->pcm = pcm;
 	
 	/* initialize graveyard buffer */
-	harmony->dma_dev.type = SNDRV_DMA_TYPE_PCI;
-	harmony->dma_dev.dev = snd_dma_pci_data(harmony->fake_pci_dev); 
-	harmony->graveyard_addr = snd_dma_alloc_pages(&chip->dma_dev,
-			HARMONY_BUF_SIZE*GRAVEYARD_BUFS, &harmony->graveyard_dma);
+	harmony->dma_dev.type = SNDRV_DMA_TYPE_DEV;
+	harmony->dma_dev.dev = &harmony->pa_dev->dev;
+	err = snd_dma_alloc_pages(&harmony->dma_dev, HARMONY_BUF_SIZE*GRAVEYARD_BUFS,
+				  &harmony->graveyard_dma);
+	if (err < 0)
+		return err;
 	harmony->graveyard_count = 0;
 	
 	/* initialize silence buffers */
-	harmony->silence_addr = snd_dma_alloc_pages(&chip->dma_dev,
-			HARMONY_BUF_SIZE*SILENCE_BUFS, &harmony->silence_dma);
+	err = snd_dma_alloc_pages(&harmony->dma_dev, HARMONY_BUF_SIZE*SILENCE_BUFS,
+				  &harmony->silence_dma);
+	if (err < 0)
+		return err;
 	harmony->silence_count = 0;
 
 	harmony->ply_stopped = harmony->cap_stopped = 1;
@@ -865,8 +831,8 @@
 	harmony->graveyard_count = 0;
 	
 	snd_pcm_lib_preallocate_pages_for_all(pcm, SNDRV_DMA_TYPE_DEV,
-					      snd_dma_pci_data(harmony->fake_pci_dev),
-					      64 * 1024, 128 * 1024);
+					      &harmony->pa_dev->dev,
+					      MAX_BUFFER_SIZE, MAX_BUFFER_SIZE);
 
 	return 0;
 }
@@ -963,7 +929,7 @@
 HARMONY_VOLUME("PCM Playback Volume", 6, 0, 0x3f, 1),
 };
 
-static void snd_harmony_reset_codec(snd_card_harmony_t *harmony)
+static void __init snd_harmony_reset_codec(snd_card_harmony_t *harmony)
 {
  	snd_harmony_wait_cntl(harmony);
 	gsc_writel(1, harmony->hpa+REG_RESET);
@@ -985,7 +951,7 @@
 }
 
 
-int __init snd_card_harmony_mixer_init(snd_card_harmony_t *harmony)
+static int __init snd_card_harmony_mixer_init(snd_card_harmony_t *harmony)
 {
 	snd_card_t *card = harmony->card;
 	int idx, err;
@@ -1009,10 +975,11 @@
 	
 	harmony->card = card;
 	
+	harmony->pa_dev = pa_dev;
+
 	/* Set the HPA of harmony */
 	harmony->hpa = pa_dev->hpa;
 	
-
 	harmony->irq = pa_dev->irq;
 	if (!harmony->irq) {
 		printk(KERN_ERR PFX "no irq found\n");
@@ -1038,8 +1005,6 @@
 		return -EBUSY;
 	}
 	
-	/* a fake pci_dev is needed for pci_* functions under ccio */
-	harmony->fake_pci_dev = ccio_get_fake(pa_dev);
 	return 0;
 }
 	
@@ -1050,7 +1015,7 @@
 	snd_card_t *card;
 	int err;
 	
-    if (dev >= SNDRV_CARDS)
+	if (dev >= SNDRV_CARDS)
 		return -ENODEV;
 	if (!enable[dev]) {
 		dev++;
@@ -1064,6 +1029,8 @@
 	if (card == NULL)
 		return -ENOMEM;
 	chip = (struct snd_card_harmony *)card->private_data;
+	spin_lock_init(&chip->control_lock);
+	spin_lock_init(&chip->mixer_lock);
 	
 	if ((err = snd_card_harmony_create(card, pa_dev, chip)) < 0) {
 		printk(KERN_ERR PFX "Creation failed\n");
@@ -1144,7 +1111,6 @@
 		{	
 			DPRINTK(KERN_INFO PFX "Freeing card %d\n", idx);
 			harmony = snd_harmony_cards[idx]->private_data;
-			snd_harmony_proc_done(harmony);
 			free_irq(harmony->irq, snd_card_harmony_interrupt);
 			printk(KERN_INFO PFX "Card unloaded %d, irq=%d\n", idx, harmony->irq);
 			snd_card_free(snd_harmony_cards[idx]);
diff -Nru a/sound/pci/Kconfig b/sound/pci/Kconfig
--- a/sound/pci/Kconfig	2004-05-26 15:01:35 -07:00
+++ b/sound/pci/Kconfig	2004-05-26 15:01:35 -07:00
@@ -16,11 +16,11 @@
 	  Say 'Y' or 'M' to include support for ALI PCI Audio M5451 sound core.
 
 config SND_ATIIXP
-	tristate "ATI IXP 150/200/250"
+	tristate "ATI IXP 150/200/250/300"
 	depends on SND
 	select SND_AC97_CODEC
 	help
-	  Say 'Y' or 'M' to include support for ATI IXP 150/200/250 AC97 controller.
+	  Say 'Y' or 'M' to include support for ATI IXP 150/200/250/300 AC97 controller.
 
 config SND_AU8810
         tristate "Aureal Advantage"
@@ -29,6 +29,9 @@
 	select SND_AC97_CODEC
         help
           Say 'Y' or 'M' to include support for Aureal Advantage soundcards.
+          Supported features: Hardware Mixer, SRC, EQ and SPDIF output.
+          3D support code is in place, but not yet useable. For more info, 
+          email the ALSA developer list, or mjander@users.sourceforge.net.
  
 config SND_AU8820
         tristate "Aureal Vortex"
@@ -37,6 +40,8 @@
 	select SND_AC97_CODEC
         help
           Say 'Y' or 'M' to include support for Aureal Vortex soundcards.
+          Supported features: Hardware Mixer and SRC. For more info, email 
+          the ALSA developer list, or mjander@users.sourceforge.net.
  
 config SND_AU8830
         tristate "Aureal Vortex 2"
@@ -45,6 +50,9 @@
 	select SND_AC97_CODEC
         help
           Say 'Y' or 'M' to include support for Aureal Vortex 2 soundcards.
+          Supported features: Hardware Mixer, SRC, EQ and SPDIF output.
+          3D support code is in place, but not yet useable. For more info, 
+          email the ALSA developer list, or mjander@users.sourceforge.net.
  
 config SND_AZT3328
 	tristate "Aztech AZF3328 / PCI168 (EXPERIMENTAL)"
@@ -262,15 +270,15 @@
 	  TerraTec - EWX 24/96, EWS 88MT, EWS 88D, DMX 6Fire.
 
 config SND_ICE1724
-	tristate "ICE/VT1724 (Envy24HT)"
+	tristate "ICE/VT1724/1720 (Envy24HT/PT)"
 	depends on SND
 	select SND_MPU401_UART
 	select SND_AC97_CODEC
 	help
-	  Say 'Y' or 'M' to include support for ICE/VT1724 (Envy24HT) based
+	  Say 'Y' or 'M' to include support for ICE/VT1724/1720 (Envy24HT/PT) based
 	  soundcards.
 	  Currently supported hardware is: MidiMan M Audio - Revolution 7.1,
-	  AMP Ltd AUDIO2000.
+	  AMP Ltd AUDIO2000, Terratec Aureon 5.1 Sky/7.1, AudioTrak Prodigy 7.1.
 
 config SND_INTEL8X0
 	tristate "Intel i8x0/MX440, SiS 7012; Ali 5455; NForce Audio; AMD768/8111"
diff -Nru a/sound/pci/ac97/ac97_codec.c b/sound/pci/ac97/ac97_codec.c
--- a/sound/pci/ac97/ac97_codec.c	2004-05-26 15:01:35 -07:00
+++ b/sound/pci/ac97/ac97_codec.c	2004-05-26 15:01:35 -07:00
@@ -27,6 +27,7 @@
 #include <linux/init.h>
 #include <linux/slab.h>
 #include <linux/pci.h>
+#include <linux/moduleparam.h>
 #include <sound/core.h>
 #include <sound/pcm.h>
 #include <sound/ac97_codec.h>
@@ -42,7 +43,7 @@
 
 static int enable_loopback;
 
-MODULE_PARM(enable_loopback, "i");
+module_param(enable_loopback, bool, 0444);
 MODULE_PARM_DESC(enable_loopback, "Enable AC97 ADC/DAC Loopback Control");
 MODULE_PARM_SYNTAX(enable_loopback, SNDRV_BOOLEAN_FALSE_DESC);
 
@@ -299,6 +300,16 @@
 	return ac97->bus->read(ac97, reg);
 }
 
+/* read a register - return the cached value if already read */
+static inline unsigned short snd_ac97_read_cache(ac97_t *ac97, unsigned short reg)
+{
+	if (! test_bit(reg, ac97->reg_accessed)) {
+		ac97->regs[reg] = ac97->bus->read(ac97, reg);
+		// set_bit(reg, ac97->reg_accessed);
+	}
+	return ac97->regs[reg];
+}
+
 /**
  * snd_ac97_write_cache - write a value on the given register and update the cache
  * @ac97: the ac97 instance
@@ -370,7 +381,7 @@
 	if (!snd_ac97_valid_reg(ac97, reg))
 		return -EINVAL;
 	spin_lock(&ac97->reg_lock);
-	old = ac97->regs[reg];
+	old = snd_ac97_read_cache(ac97, reg);
 	new = (old & ~mask) | value;
 	change = old != new;
 	if (change) {
@@ -385,25 +396,26 @@
 static int snd_ac97_ad18xx_update_pcm_bits(ac97_t *ac97, int codec, unsigned short mask, unsigned short value)
 {
 	int change;
-	unsigned short old, new;
+	unsigned short old, new, cfg;
 
 	down(&ac97->spec.ad18xx.mutex);
 	spin_lock(&ac97->reg_lock);
 	old = ac97->spec.ad18xx.pcmreg[codec];
 	new = (old & ~mask) | value;
+	cfg = snd_ac97_read_cache(ac97, AC97_AD_SERIAL_CFG);
 	change = old != new;
 	if (change) {
 		ac97->spec.ad18xx.pcmreg[codec] = new;
 		spin_unlock(&ac97->reg_lock);
 		/* select single codec */
 		ac97->bus->write(ac97, AC97_AD_SERIAL_CFG,
-				 (ac97->regs[AC97_AD_SERIAL_CFG] & ~0x7000) |
+				 (cfg & ~0x7000) |
 				 ac97->spec.ad18xx.unchained[codec] | ac97->spec.ad18xx.chained[codec]);
 		/* update PCM bits */
 		ac97->bus->write(ac97, AC97_PCM, new);
 		/* select all codecs */
 		ac97->bus->write(ac97, AC97_AD_SERIAL_CFG,
-				 ac97->regs[AC97_AD_SERIAL_CFG] | 0x7000);
+				 cfg | 0x7000);
 	} else
 		spin_unlock(&ac97->reg_lock);
 	up(&ac97->spec.ad18xx.mutex);
@@ -435,7 +447,7 @@
 	ac97_t *ac97 = snd_kcontrol_chip(kcontrol);
 	unsigned short val;
 	
-	val = ac97->regs[AC97_REC_SEL];
+	val = snd_ac97_read_cache(ac97, AC97_REC_SEL);
 	ucontrol->value.enumerated.item[0] = (val >> 8) & 7;
 	ucontrol->value.enumerated.item[1] = (val >> 0) & 7;
 	return 0;
@@ -493,7 +505,7 @@
 	int shift = (kcontrol->private_value >> 8) & 0xff;
 	int invert = (kcontrol->private_value >> 24) & 0xff;
 	
-	val = (ac97->regs[reg] >> shift) & 1;
+	val = (snd_ac97_read_cache(ac97, reg) >> shift) & 1;
 	if (invert)
 		val ^= 1;
 	ucontrol->value.enumerated.item[0] = val;
@@ -535,7 +547,7 @@
 	int mask = (kcontrol->private_value >> 16) & 0xff;
 	int invert = (kcontrol->private_value >> 24) & 0xff;
 	
-	ucontrol->value.integer.value[0] = (ac97->regs[reg] >> shift) & mask;
+	ucontrol->value.integer.value[0] = (snd_ac97_read_cache(ac97, reg) >> shift) & mask;
 	if (invert)
 		ucontrol->value.integer.value[0] = mask - ucontrol->value.integer.value[0];
 	return 0;
@@ -582,8 +594,8 @@
 	int invert = (kcontrol->private_value >> 24) & 0xff;
 	
 	spin_lock(&ac97->reg_lock);
-	ucontrol->value.integer.value[0] = (ac97->regs[reg] >> shift_left) & mask;
-	ucontrol->value.integer.value[1] = (ac97->regs[reg] >> shift_right) & mask;
+	ucontrol->value.integer.value[0] = (snd_ac97_read_cache(ac97, reg) >> shift_left) & mask;
+	ucontrol->value.integer.value[1] = (snd_ac97_read_cache(ac97, reg) >> shift_right) & mask;
 	spin_unlock(&ac97->reg_lock);
 	if (invert) {
 		ucontrol->value.integer.value[0] = mask - ucontrol->value.integer.value[0];
@@ -796,7 +808,7 @@
 					       AC97_CXR_SPDIF_MASK | AC97_CXR_COPYRGT,
 					       v);
 	} else {
-		unsigned short extst = ac97->regs[AC97_EXTENDED_STATUS];
+		unsigned short extst = snd_ac97_read_cache(ac97, AC97_EXTENDED_STATUS);
 		snd_ac97_update_bits(ac97, AC97_EXTENDED_STATUS, AC97_EA_SPDIF, 0); /* turn off */
 
 		change |= snd_ac97_update_bits(ac97, AC97_SPDIF, 0x3fff, val);
@@ -822,13 +834,13 @@
 	mask <<= shift;
 	value <<= shift;
 	spin_lock(&ac97->reg_lock);
-	old = ac97->regs[reg];
+	old = snd_ac97_read_cache(ac97, reg);
 	new = (old & ~mask) | value;
 	spin_unlock(&ac97->reg_lock);
 
 	if (old != new) {
 		int change;
-		unsigned short extst = ac97->regs[AC97_EXTENDED_STATUS];
+		unsigned short extst = snd_ac97_read_cache(ac97, AC97_EXTENDED_STATUS);
 		snd_ac97_update_bits(ac97, AC97_EXTENDED_STATUS, AC97_EA_SPDIF, 0); /* turn off */
 		change = snd_ac97_update_bits(ac97, reg, mask, value);
 		if (extst & AC97_EA_SPDIF)
@@ -868,14 +880,14 @@
 		.info = snd_ac97_info_single,
 		.get = snd_ac97_get_single,
 		.put = snd_ac97_put_spsa,
-		.private_value = AC97_EXTENDED_STATUS | (4 << 8) | (3 << 16) | (0 << 24),
+		.private_value = AC97_SINGLE_VALUE(AC97_EXTENDED_STATUS, 4, 3, 0)
 	},
 };
 
 #define AD18XX_PCM_BITS(xname, codec, lshift, rshift, mask) \
 { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, .info = snd_ac97_ad18xx_pcm_info_bits, \
   .get = snd_ac97_ad18xx_pcm_get_bits, .put = snd_ac97_ad18xx_pcm_put_bits, \
-  .private_value = (codec) | ((lshift) << 8) | ((rshift) << 12) | ((mask) << 24) }
+  .private_value = (codec) | ((lshift) << 8) | ((rshift) << 12) | ((mask) << 16) }
 
 static int snd_ac97_ad18xx_pcm_info_bits(snd_kcontrol_t *kcontrol, snd_ctl_elem_info_t * uinfo)
 {
@@ -987,6 +999,8 @@
  *
  */
 
+static void snd_ac97_powerdown(ac97_t *ac97);
+
 static int snd_ac97_bus_free(ac97_bus_t *bus)
 {
 	if (bus) {
@@ -1022,6 +1036,7 @@
 static int snd_ac97_dev_free(snd_device_t *device)
 {
 	ac97_t *ac97 = snd_magic_cast(ac97_t, device->device_data, return -ENXIO);
+	snd_ac97_powerdown(ac97); /* for avoiding click noises during shut down */
 	return snd_ac97_free(ac97);
 }
 
@@ -1572,6 +1587,26 @@
 	*r_result = result;
 }
 
+/* check AC97_SPDIF register to accept which sample rates */
+static unsigned int snd_ac97_determine_spdif_rates(ac97_t *ac97)
+{
+	unsigned int result = 0;
+	int i;
+	static unsigned short ctl_bits[] = {
+		AC97_SC_SPSR_44K, AC97_SC_SPSR_32K, AC97_SC_SPSR_48K
+	};
+	static unsigned int rate_bits[] = {
+		SNDRV_PCM_RATE_44100, SNDRV_PCM_RATE_32000, SNDRV_PCM_RATE_48000
+	};
+
+	for (i = 0; i < (int)ARRAY_SIZE(ctl_bits); i++) {
+		snd_ac97_update_bits(ac97, AC97_SPDIF, AC97_SC_SPSR_MASK, ctl_bits[i]);
+		if ((snd_ac97_read(ac97, AC97_SPDIF) & AC97_SC_SPSR_MASK) == ctl_bits[i])
+			result |= rate_bits[i];
+	}
+	return result;
+}
+
 void snd_ac97_get_name(ac97_t *ac97, unsigned int id, char *name, int modem)
 {
 	const ac97_codec_id_t *pid;
@@ -1889,9 +1924,7 @@
 		else if (ac97->id == AC97_ID_CM9739)
 			ac97->rates[AC97_RATES_SPDIF] = SNDRV_PCM_RATE_48000;
 		else
-			ac97->rates[AC97_RATES_SPDIF] = SNDRV_PCM_RATE_48000 |
-						SNDRV_PCM_RATE_44100 |
-						SNDRV_PCM_RATE_32000;
+			ac97->rates[AC97_RATES_SPDIF] = snd_ac97_determine_spdif_rates(ac97);
 	}
 	if (ac97->ext_id & AC97_EI_VRM) {	/* MIC VRA support */
 		snd_ac97_determine_rates(ac97, AC97_PCM_MIC_ADC_RATE, 0, &ac97->rates[AC97_RATES_MIC_ADC]);
@@ -1949,12 +1982,12 @@
 	}
 	/* make sure the proper powerdown bits are cleared */
 	if (ac97->scaps) {
-		reg = snd_ac97_read(ac97, AC97_EXTENDED_ID);
+		reg = snd_ac97_read(ac97, AC97_EXTENDED_STATUS);
 		if (ac97->scaps & AC97_SCAP_SURROUND_DAC) 
 			reg &= ~AC97_EA_PRJ;
 		if (ac97->scaps & AC97_SCAP_CENTER_LFE_DAC) 
 			reg &= ~(AC97_EA_PRI | AC97_EA_PRK);
-		snd_ac97_write_cache(ac97, AC97_EXTENDED_ID, reg);
+		snd_ac97_write_cache(ac97, AC97_EXTENDED_STATUS, reg);
 	}
 	snd_ac97_proc_init(ac97);
 	if ((err = snd_device_new(card, SNDRV_DEV_LOWLEVEL, ac97, &ops)) < 0) {
@@ -1965,17 +1998,24 @@
 	return 0;
 }
 
-#ifdef CONFIG_PM
-/**
- * snd_ac97_suspend - General suspend function for AC97 codec
- * @ac97: the ac97 instance
+
+/*
+ * Power down the chip.
  *
- * Suspends the codec, power down the chip.
+ * MASTER and HEADPHONE registers are muted but the register cache values
+ * are not changed, so that the values can be restored in snd_ac97_resume().
  */
-void snd_ac97_suspend(ac97_t *ac97)
+static void snd_ac97_powerdown(ac97_t *ac97)
 {
-	unsigned short power = (ac97->regs[AC97_POWERDOWN] ^ 0x8000) & ~0x8000;	/* invert EAPD */
+	unsigned short power;
+
+	if (ac97_is_audio(ac97)) {
+		/* some codecs have stereo mute bits */
+		snd_ac97_write(ac97, AC97_MASTER, 0x9f9f);
+		snd_ac97_write(ac97, AC97_HEADPHONE, 0x9f9f);
+	}
 
+	power = ac97->regs[AC97_POWERDOWN] | 0x8000;	/* EAPD */
 	power |= 0x4000;	/* Headphone amplifier powerdown */
 	power |= 0x0300;	/* ADC & DAC powerdown */
 	snd_ac97_write(ac97, AC97_POWERDOWN, power);
@@ -1983,8 +2023,24 @@
 	power |= 0x0400;	/* Analog Mixer powerdown (Vref on) */
 	snd_ac97_write(ac97, AC97_POWERDOWN, power);
 	udelay(100);
+#if 0
+	/* FIXME: this causes click noises on some boards at resume */
 	power |= 0x3800;	/* AC-link powerdown, internal Clk disable */
 	snd_ac97_write(ac97, AC97_POWERDOWN, power);
+#endif
+}
+
+
+#ifdef CONFIG_PM
+/**
+ * snd_ac97_suspend - General suspend function for AC97 codec
+ * @ac97: the ac97 instance
+ *
+ * Suspends the codec, power down the chip.
+ */
+void snd_ac97_suspend(ac97_t *ac97)
+{
+	snd_ac97_powerdown(ac97);
 }
 
 /**
@@ -2267,6 +2323,7 @@
 EXPORT_SYMBOL(snd_ac97_set_rate);
 #ifdef CONFIG_PM
 EXPORT_SYMBOL(snd_ac97_resume);
+EXPORT_SYMBOL(snd_ac97_suspend);
 #endif
 
 /*
diff -Nru a/sound/pci/ac97/ac97_local.h b/sound/pci/ac97/ac97_local.h
--- a/sound/pci/ac97/ac97_local.h	2004-05-26 15:01:35 -07:00
+++ b/sound/pci/ac97/ac97_local.h	2004-05-26 15:01:35 -07:00
@@ -22,10 +22,11 @@
  *
  */
 
+#define AC97_SINGLE_VALUE(reg,shift,mask,invert) ((reg) | ((shift) << 8) | ((mask) << 16) | ((invert) << 24))
 #define AC97_SINGLE(xname, reg, shift, mask, invert) \
 { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, .info = snd_ac97_info_single, \
   .get = snd_ac97_get_single, .put = snd_ac97_put_single, \
-  .private_value = (reg) | ((shift) << 8) | ((mask) << 16) | ((invert) << 24) }
+  .private_value =  AC97_SINGLE_VALUE(reg, shift, mask, invert) }
 
 /* ac97_codec.c */
 extern const char *snd_ac97_stereo_enhancements[];
diff -Nru a/sound/pci/ac97/ac97_patch.c b/sound/pci/ac97/ac97_patch.c
--- a/sound/pci/ac97/ac97_patch.c	2004-05-26 15:01:36 -07:00
+++ b/sound/pci/ac97/ac97_patch.c	2004-05-26 15:01:36 -07:00
@@ -447,18 +447,198 @@
 	return 0;
 }
 
+static int snd_ac97_stac9758_output_jack_info(snd_kcontrol_t *kcontrol, snd_ctl_elem_info_t *uinfo)
+{
+	static char *texts[5] = { "Input/Disabled", "Front Output",
+		"Rear Output", "Center/LFE Output", "Mixer Output" };
+
+	uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;
+	uinfo->count = 1;
+	uinfo->value.enumerated.items = 5;
+	if (uinfo->value.enumerated.item > 4)
+		uinfo->value.enumerated.item = 4;
+	strcpy(uinfo->value.enumerated.name, texts[uinfo->value.enumerated.item]);
+	return 0;
+}
+
+static int snd_ac97_stac9758_output_jack_get(snd_kcontrol_t *kcontrol, snd_ctl_elem_value_t* ucontrol)
+{
+	ac97_t *ac97 = snd_kcontrol_chip(kcontrol);
+	int shift = kcontrol->private_value;
+	unsigned short val;
+
+	val = ac97->regs[AC97_SIGMATEL_OUTSEL];
+	if (!((val >> shift) & 4))
+		ucontrol->value.enumerated.item[0] = 0;
+	else
+		ucontrol->value.enumerated.item[0] = 1 + ((val >> shift) & 3);
+	return 0;
+}
+
+static int snd_ac97_stac9758_output_jack_put(snd_kcontrol_t *kcontrol, snd_ctl_elem_value_t *ucontrol)
+{
+	ac97_t *ac97 = snd_kcontrol_chip(kcontrol);
+	int shift = kcontrol->private_value;
+	unsigned short val;
+
+	if (ucontrol->value.enumerated.item[0] > 4)
+		return -EINVAL;
+	if (ucontrol->value.enumerated.item[0] == 0)
+		val = 0;
+	else
+		val = 4 | (ucontrol->value.enumerated.item[0] - 1);
+	return snd_ac97_update_bits(ac97, AC97_SIGMATEL_OUTSEL,
+				    7 << shift, val << shift);
+}
+
+static int snd_ac97_stac9758_input_jack_info(snd_kcontrol_t *kcontrol, snd_ctl_elem_info_t *uinfo)
+{
+	static char *texts[7] = { "Mic2 Jack", "Mic1 Jack", "Line In Jack",
+		"Front Jack", "Rear Jack", "Center/LFE Jack", "Mute" };
+
+	uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;
+	uinfo->count = 1;
+	uinfo->value.enumerated.items = 7;
+	if (uinfo->value.enumerated.item > 6)
+		uinfo->value.enumerated.item = 6;
+	strcpy(uinfo->value.enumerated.name, texts[uinfo->value.enumerated.item]);
+	return 0;
+}
+
+static int snd_ac97_stac9758_input_jack_get(snd_kcontrol_t *kcontrol, snd_ctl_elem_value_t* ucontrol)
+{
+	ac97_t *ac97 = snd_kcontrol_chip(kcontrol);
+	int shift = kcontrol->private_value;
+	unsigned short val;
+
+	val = ac97->regs[AC97_SIGMATEL_INSEL];
+	ucontrol->value.enumerated.item[0] = (val >> shift) & 7;
+	return 0;
+}
+
+static int snd_ac97_stac9758_input_jack_put(snd_kcontrol_t *kcontrol, snd_ctl_elem_value_t *ucontrol)
+{
+	ac97_t *ac97 = snd_kcontrol_chip(kcontrol);
+	int shift = kcontrol->private_value;
+
+	return snd_ac97_update_bits(ac97, AC97_SIGMATEL_INSEL, 7 << shift,
+				    ucontrol->value.enumerated.item[0] << shift);
+}
+
+static int snd_ac97_stac9758_phonesel_info(snd_kcontrol_t *kcontrol, snd_ctl_elem_info_t *uinfo)
+{
+	static char *texts[3] = { "None", "Front Jack", "Rear Jack" };
+
+	uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;
+	uinfo->count = 1;
+	uinfo->value.enumerated.items = 3;
+	if (uinfo->value.enumerated.item > 2)
+		uinfo->value.enumerated.item = 2;
+	strcpy(uinfo->value.enumerated.name, texts[uinfo->value.enumerated.item]);
+	return 0;
+}
+
+static int snd_ac97_stac9758_phonesel_get(snd_kcontrol_t *kcontrol, snd_ctl_elem_value_t* ucontrol)
+{
+	ac97_t *ac97 = snd_kcontrol_chip(kcontrol);
+
+	ucontrol->value.enumerated.item[0] = ac97->regs[AC97_SIGMATEL_IOMISC] & 3;
+	return 0;
+}
+
+static int snd_ac97_stac9758_phonesel_put(snd_kcontrol_t *kcontrol, snd_ctl_elem_value_t *ucontrol)
+{
+	ac97_t *ac97 = snd_kcontrol_chip(kcontrol);
+
+	return snd_ac97_update_bits(ac97, AC97_SIGMATEL_IOMISC, 3,
+				    ucontrol->value.enumerated.item[0]);
+}
+
+#define STAC9758_OUTPUT_JACK(xname, shift) \
+{	.iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, \
+	.info = snd_ac97_stac9758_output_jack_info, \
+	.get = snd_ac97_stac9758_output_jack_get, \
+	.put = snd_ac97_stac9758_output_jack_put, \
+	.private_value = shift }
+#define STAC9758_INPUT_JACK(xname, shift) \
+{	.iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, \
+	.info = snd_ac97_stac9758_input_jack_info, \
+	.get = snd_ac97_stac9758_input_jack_get, \
+	.put = snd_ac97_stac9758_input_jack_put, \
+	.private_value = shift }
+static const snd_kcontrol_new_t snd_ac97_sigmatel_stac9758_controls[] = {
+	STAC9758_OUTPUT_JACK("Mic1 Jack", 1),
+	STAC9758_OUTPUT_JACK("LineIn Jack", 4),
+	STAC9758_OUTPUT_JACK("Front Jack", 7),
+	STAC9758_OUTPUT_JACK("Rear Jack", 10),
+	STAC9758_OUTPUT_JACK("Center/LFE Jack", 13),
+	STAC9758_INPUT_JACK("Mic Input Source", 0),
+	STAC9758_INPUT_JACK("Line Input Source", 8),
+	{
+		.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
+		.name = "Headphone Amp",
+		.info = snd_ac97_stac9758_phonesel_info,
+		.get = snd_ac97_stac9758_phonesel_get,
+		.put = snd_ac97_stac9758_phonesel_put
+	},
+	AC97_SINGLE("Exchange Center/LFE", AC97_SIGMATEL_IOMISC, 4, 1, 0),
+	AC97_SINGLE("Headphone +3dB Boost", AC97_SIGMATEL_IOMISC, 8, 1, 0)
+};
+
+static int patch_sigmatel_stac9758_specific(ac97_t *ac97)
+{
+	int err;
+
+	err = patch_sigmatel_stac97xx_specific(ac97);
+	if (err < 0)
+		return err;
+	err = patch_build_controls(ac97, snd_ac97_sigmatel_stac9758_controls,
+				   ARRAY_SIZE(snd_ac97_sigmatel_stac9758_controls));
+	if (err < 0)
+		return err;
+	return 0;
+}
+
+static struct snd_ac97_build_ops patch_sigmatel_stac9758_ops = {
+	.build_3d	= patch_sigmatel_stac9700_3d,
+	.build_specific	= patch_sigmatel_stac9758_specific
+};
+
 int patch_sigmatel_stac9758(ac97_t * ac97)
 {
+	static unsigned short regs[4] = {
+		AC97_SIGMATEL_OUTSEL,
+		AC97_SIGMATEL_IOMISC,
+		AC97_SIGMATEL_INSEL,
+		AC97_SIGMATEL_VARIOUS
+	};
+	static unsigned short def_regs[4] = {
+		/* OUTSEL */ 0xd794,
+		/* IOMISC */ 0x2001,
+		/* INSEL */ 0x0201,
+		/* VARIOUS */ 0x0040
+	};
+	static unsigned short m675_regs[4] = {
+		/* OUTSEL */ 0x9040,
+		/* IOMISC */ 0x2102,
+		/* INSEL */ 0x0203,
+		/* VARIOUS */ 0x0041
+	};
+	unsigned short *pregs = def_regs;
+	int i;
+
+	/* Gateway M675 notebook */
+	if (ac97->pci && 
+	    ac97->subsystem_vendor == 0x107b &&
+	    ac97->subsystem_device == 0x0601)
+	    	pregs = m675_regs;
+
 	// patch for SigmaTel
-	ac97->build_ops = &patch_sigmatel_stac9700_ops;
-	// turn on stereo speaker, headphone and line-out
-	snd_ac97_write_cache(ac97, AC97_SIGMATEL_OUTSEL, 0x9040);
-	// headphone select and boost
-	snd_ac97_write_cache(ac97, AC97_SIGMATEL_IOMISC, 0x2102);
-	// enable mic
-	snd_ac97_write_cache(ac97, AC97_SIGMATEL_INSEL, 0x0203);
-	// enable stereo mic
-	snd_ac97_write_cache(ac97, AC97_SIGMATEL_VARIOUS, 0x0001);
+	ac97->build_ops = &patch_sigmatel_stac9758_ops;
+	for (i = 0; i < 4; i++)
+		snd_ac97_write_cache(ac97, regs[i], pregs[i]);
+
+	ac97->flags |= AC97_STEREO_MUTES;
 	return 0;
 }
 
@@ -1027,6 +1207,8 @@
 			     AC97_AD198X_MSPLT |
 			     AC97_AD198X_AC97NC);
 	ac97->flags |= AC97_STEREO_MUTES;
+	/* on AD1985 rev. 3, AC'97 revision bits are zero */
+	ac97->ext_id = (ac97->ext_id & ~AC97_EI_REV_MASK) | AC97_EI_REV_23;
 	return 0;
 }
 
@@ -1088,6 +1270,7 @@
 		.info = snd_ac97_info_single,
 		.get = snd_ac97_alc650_mic_get,
 		.put = snd_ac97_alc650_mic_put,
+		.private_value = AC97_SINGLE_VALUE(0, 0, 1, 0) /* only mask needed */
 	},
 };
 
@@ -1188,6 +1371,7 @@
 		.info = snd_ac97_info_single,
 		.get = snd_ac97_alc655_mic_get,
 		.put = snd_ac97_alc655_mic_put,
+		.private_value = AC97_SINGLE_VALUE(0, 0, 1, 0) /* only mask needed */
 	},
 };
 
@@ -1358,8 +1542,34 @@
 	/* BIT 8: SPD32 - 32bit SPDIF - not supported yet */
 };
 
+static int snd_ac97_cm9739_center_mic_get(snd_kcontrol_t * kcontrol, snd_ctl_elem_value_t * ucontrol)
+{
+	ac97_t *ac97 = snd_kcontrol_chip(kcontrol);
+	if (ac97->regs[AC97_CM9739_MULTI_CHAN] & 0x1000)
+		ucontrol->value.integer.value[0] = 1;
+	else
+		ucontrol->value.integer.value[0] = 0;
+	return 0;
+}
+
+static int snd_ac97_cm9739_center_mic_put(snd_kcontrol_t * kcontrol, snd_ctl_elem_value_t * ucontrol)
+{
+	ac97_t *ac97 = snd_kcontrol_chip(kcontrol);
+	return snd_ac97_update_bits(ac97, AC97_CM9739_MULTI_CHAN, 0x3000,
+				    ucontrol->value.integer.value[0] ? 
+				    0x1000 : 0x2000);
+}
+
 static const snd_kcontrol_new_t snd_ac97_cm9739_controls[] = {
 	AC97_SINGLE("Line-In As Surround", AC97_CM9739_MULTI_CHAN, 10, 1, 0),
+	{
+		.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
+		.name = "Mic As Center/LFE",
+		.info = snd_ac97_info_single,
+		.get = snd_ac97_cm9739_center_mic_get,
+		.put = snd_ac97_cm9739_center_mic_put,
+		.private_value = AC97_SINGLE_VALUE(0, 0, 1, 0) /* only mask needed */
+	},
 };
 
 static int patch_cm9739_specific(ac97_t * ac97)
@@ -1394,10 +1604,13 @@
 	}
 
 	/* set-up multi channel */
-	/* bit 13: enable internal vref output for mic */
-	/* bit 12: enable center/lfe */
 	/* bit 14: 0 = SPDIF, 1 = EAPD */
-	val = (1 << 12) | (1 << 13);
+	/* bit 13: enable internal vref output for mic */
+	/* bit 12: disable center/lfe (swithable) */
+	/* bit 10: disable surround/line (switchable) */
+	/* bit 9: mix 2 surround off */
+	/* bit 0: dB */
+	val = (1 << 13);
 	if (! (ac97->ext_id & AC97_EI_SPDIF))
 		val |= (1 << 14);
 	snd_ac97_write_cache(ac97, AC97_CM9739_MULTI_CHAN, val);
diff -Nru a/sound/pci/ac97/ac97_pcm.c b/sound/pci/ac97/ac97_pcm.c
--- a/sound/pci/ac97/ac97_pcm.c	2004-05-26 15:01:35 -07:00
+++ b/sound/pci/ac97/ac97_pcm.c	2004-05-26 15:01:35 -07:00
@@ -210,7 +210,7 @@
 	}
 
 	spin_lock(&ac97->reg_lock);
-	old = ac97->regs[reg] & mask;
+	old = snd_ac97_read(ac97, reg) & mask;
 	spin_unlock(&ac97->reg_lock);
 	if (old != bits) {
 		snd_ac97_update_bits(ac97, AC97_EXTENDED_STATUS, AC97_EA_SPDIF, 0);
diff -Nru a/sound/pci/ac97/ac97_proc.c b/sound/pci/ac97/ac97_proc.c
--- a/sound/pci/ac97/ac97_proc.c	2004-05-26 15:01:36 -07:00
+++ b/sound/pci/ac97/ac97_proc.c	2004-05-26 15:01:36 -07:00
@@ -34,6 +34,40 @@
  * proc interface
  */
 
+static void snd_ac97_proc_read_functions(ac97_t *ac97, snd_info_buffer_t *buffer)
+{
+	int header = 0, function;
+	unsigned short info, sense_info;
+	static const char *function_names[12] = {
+		"Master Out", "AUX Out", "Center/LFE Out", "SPDIF Out",
+		"Phone In", "Mic 1", "Mic 2", "Line In", "CD In", "Video In",
+		"Aux In", "Mono Out"
+	};
+	static const char *locations[8] = {
+		"Rear I/O Panel", "Front Panel", "Motherboard", "Dock/External",
+		"reserved", "reserved", "reserved", "NC/unused"
+	};
+
+	for (function = 0; function < 12; ++function) {
+		snd_ac97_write(ac97, AC97_FUNC_SELECT, function << 1);
+		info = snd_ac97_read(ac97, AC97_FUNC_INFO);
+		if (!(info & 0x0001))
+			continue;
+		if (!header) {
+			snd_iprintf(buffer, "\n                    Gain     Inverted  Buffer delay  Location\n");
+			header = 1;
+		}
+		sense_info = snd_ac97_read(ac97, AC97_SENSE_INFO);
+		snd_iprintf(buffer, "%-17s: %3d.%d dBV    %c      %2d/fs         %s\n",
+			    function_names[function],
+			    (info & 0x8000 ? -1 : 1) * ((info & 0x7000) >> 12) * 3 / 2,
+			    ((info & 0x0800) >> 11) * 5,
+			    info & 0x0400 ? 'X' : '-',
+			    (info & 0x03e0) >> 5,
+			    locations[sense_info >> 13]);
+	}
+}
+
 static void snd_ac97_proc_read_main(ac97_t *ac97, snd_info_buffer_t * buffer, int subidx)
 {
 	char name[64];
@@ -47,6 +81,21 @@
 	if ((ac97->scaps & AC97_SCAP_AUDIO) == 0)
 		goto __modem;
 
+	if ((ac97->ext_id & AC97_EI_REV_MASK) >= AC97_EI_REV_23) {
+		val = snd_ac97_read(ac97, AC97_INT_PAGING);
+		snd_ac97_update_bits(ac97, AC97_INT_PAGING,
+				     AC97_PAGE_MASK, AC97_PAGE_1);
+		tmp = snd_ac97_read(ac97, AC97_CODEC_CLASS_REV);
+		snd_iprintf(buffer, "Revision         : 0x%02x\n", tmp & 0xff);
+		snd_iprintf(buffer, "Compat. Class    : 0x%02x\n", (tmp >> 8) & 0x1f);
+		snd_iprintf(buffer, "Subsys. Vendor ID: 0x%04x\n",
+			    snd_ac97_read(ac97, AC97_PCI_SVID));
+		snd_iprintf(buffer, "Subsys. ID       : 0x%04x\n\n",
+			    snd_ac97_read(ac97, AC97_PCI_SID));
+		snd_ac97_update_bits(ac97, AC97_INT_PAGING,
+				     AC97_PAGE_MASK, val & AC97_PAGE_MASK);
+	}
+
 	// val = snd_ac97_read(ac97, AC97_RESET);
 	val = ac97->caps;
 	snd_iprintf(buffer, "Capabilities     :%s%s%s%s%s%s\n",
@@ -185,6 +234,14 @@
 			}
 		}
 	}
+	if ((ac97->ext_id & AC97_EI_REV_MASK) >= AC97_EI_REV_23) {
+		val = snd_ac97_read(ac97, AC97_INT_PAGING);
+		snd_ac97_update_bits(ac97, AC97_INT_PAGING,
+				     AC97_PAGE_MASK, AC97_PAGE_1);
+		snd_ac97_proc_read_functions(ac97, buffer);
+		snd_ac97_update_bits(ac97, AC97_INT_PAGING,
+				     AC97_PAGE_MASK, val & AC97_PAGE_MASK);
+	}
 
 
       __modem:
@@ -264,6 +321,23 @@
 	}
 }
 
+#ifdef CONFIG_SND_DEBUG
+/* direct register write for debugging */
+static void snd_ac97_proc_regs_write(snd_info_entry_t *entry, snd_info_buffer_t *buffer)
+{
+	ac97_t *ac97 = snd_magic_cast(ac97_t, entry->private_data, return);
+	char line[64];
+	unsigned int reg, val;
+	while (!snd_info_get_line(buffer, line, sizeof(line))) {
+		if (sscanf(line, "%x %x", &reg, &val) != 2)
+			continue;
+		/* register must be odd */
+		if (reg < 0x80 && (reg & 1) == 0 && val <= 0xffff)
+			snd_ac97_write_cache(ac97, reg, val);
+	}
+}
+#endif
+
 static void snd_ac97_proc_regs_read_main(ac97_t *ac97, snd_info_buffer_t * buffer, int subidx)
 {
 	int reg, val;
@@ -319,6 +393,11 @@
 	sprintf(name, "%s#%d-%d+regs", prefix, ac97->addr, ac97->num);
 	if ((entry = snd_info_create_card_entry(ac97->bus->card, name, ac97->bus->proc)) != NULL) {
 		snd_info_set_text_ops(entry, ac97, 1024, snd_ac97_proc_regs_read);
+#ifdef CONFIG_SND_DEBUG
+		entry->mode |= S_IWUSR;
+		entry->c.text.write_size = 1024;
+		entry->c.text.write = snd_ac97_proc_regs_write;
+#endif
 		if (snd_info_register(entry) < 0) {
 			snd_info_free_entry(entry);
 			entry = NULL;
diff -Nru a/sound/pci/ali5451/ali5451.c b/sound/pci/ali5451/ali5451.c
--- a/sound/pci/ali5451/ali5451.c	2004-05-26 15:01:36 -07:00
+++ b/sound/pci/ali5451/ali5451.c	2004-05-26 15:01:36 -07:00
@@ -25,8 +25,6 @@
  *
  */
 
-#define __SNDRV_OSS_COMPAT__
-
 #include <sound/driver.h>
 #include <asm/io.h>
 #include <linux/delay.h>
@@ -34,12 +32,12 @@
 #include <linux/init.h>
 #include <linux/pci.h>
 #include <linux/slab.h>
+#include <linux/moduleparam.h>
 #include <sound/core.h>
 #include <sound/pcm.h>
 #include <sound/info.h>
 #include <sound/ac97_codec.h>
 #include <sound/mpu401.h>
-#define SNDRV_GET_ID
 #include <sound/initval.h>
 
 MODULE_AUTHOR("Matt Wu <Matt_Wu@acersoftech.com.cn>");
@@ -53,20 +51,21 @@
 static int enable[SNDRV_CARDS] = SNDRV_DEFAULT_ENABLE_PNP;
 static int pcm_channels[SNDRV_CARDS] = {[0 ... (SNDRV_CARDS - 1)] = 32};
 static int spdif[SNDRV_CARDS] = {[0 ... (SNDRV_CARDS - 1)] = 0};
+static int boot_devs;
 
-MODULE_PARM(index, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+module_param_array(index, int, boot_devs, 0444);
 MODULE_PARM_DESC(index, "Index value for ALI M5451 PCI Audio.");
 MODULE_PARM_SYNTAX(index, SNDRV_INDEX_DESC);
-MODULE_PARM(id, "1-" __MODULE_STRING(SNDRV_CARDS) "s");
+module_param_array(id, charp, boot_devs, 0444);
 MODULE_PARM_DESC(id, "ID string for ALI M5451 PCI Audio.");
 MODULE_PARM_SYNTAX(id, SNDRV_ID_DESC);
-MODULE_PARM(enable, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+module_param_array(enable, bool, boot_devs, 0444);
 MODULE_PARM_DESC(enable, "Enable ALI 5451 PCI Audio.");
 MODULE_PARM_SYNTAX(enable, SNDRV_ENABLE_DESC);
-MODULE_PARM(pcm_channels, "1-" __MODULE_STRING(SNDRV_CARDS) "l");
+module_param_array(pcm_channels, int, boot_devs, 0444);
 MODULE_PARM_DESC(pcm_channels, "PCM Channels");
 MODULE_PARM_SYNTAX(pcm_channels, SNDRV_ENABLED ",default:32,allows:{{1,32}}");
-MODULE_PARM(spdif, "1-" __MODULE_STRING(SNDRV_CARDS) "l");
+module_param_array(spdif, bool, boot_devs, 0444);
 MODULE_PARM_DESC(spdif, "Support SPDIF I/O");
 MODULE_PARM_SYNTAX(spdif, SNDRV_ENABLED "," SNDRV_BOOLEAN_FALSE_DESC);
 
@@ -1906,14 +1905,18 @@
 }
 
 #ifdef CONFIG_PM
-static void ali_suspend(ali_t *chip)
+static int ali_suspend(snd_card_t *card, unsigned int state)
 {
+	ali_t *chip = snd_magic_cast(ali_t, card->pm_private_data, return -EINVAL);
 	ali_image_t *im;
 	int i, j;
 
 	im = chip->image;
 	if (! im)
-		return;
+		return 0;
+
+	snd_pcm_suspend_all(chip->pcm);
+	snd_ac97_suspend(chip->ac97);
 
 	spin_lock_irq(&chip->reg_lock);
 	
@@ -1940,16 +1943,18 @@
 	outl(0xffffffff, ALI_REG(chip, ALI_STOP));
 
 	spin_unlock_irq(&chip->reg_lock);
+	return 0;
 }
 
-static void ali_resume(ali_t *chip)
+static int ali_resume(snd_card_t *card, unsigned int state)
 {
+	ali_t *chip = snd_magic_cast(ali_t, card->pm_private_data, return -EINVAL);
 	ali_image_t *im;
 	int i, j;
 
 	im = chip->image;
 	if (! im)
-		return;
+		return 0;
 
 	pci_enable_device(chip->pci);
 
@@ -1967,27 +1972,15 @@
 		outl(im->regs[i], ALI_REG(chip, i*4));
 	}
 	
-	snd_ac97_resume(chip->ac97);
-	
 	// start HW channel
 	outl(im->regs[ALI_START >> 2], ALI_REG(chip, ALI_START));
 	// restore IRQ enable bits
 	outl(im->regs[ALI_MISCINT >> 2], ALI_REG(chip, ALI_MISCINT));
 	
 	spin_unlock_irq(&chip->reg_lock);
-	return;
-}
 
-static int snd_ali_suspend(struct pci_dev *dev, u32 state)
-{
-	ali_t *chip = snd_magic_cast(ali_t, pci_get_drvdata(dev), return -ENXIO);
-	ali_suspend(chip);
-	return 0;
-}
-static int snd_ali_resume(struct pci_dev *dev)
-{
-	ali_t *chip = snd_magic_cast(ali_t, pci_get_drvdata(dev), return -ENXIO);
-	ali_resume(chip);
+	snd_ac97_resume(chip->ac97);
+	
 	return 0;
 }
 #endif /* CONFIG_PM */
@@ -2203,7 +2196,9 @@
 #ifdef CONFIG_PM
 	codec->image = kmalloc(sizeof(*codec->image), GFP_KERNEL);
 	if (! codec->image)
-		snd_printk("can't allocate apm buffer\n");
+		snd_printk(KERN_WARNING "can't allocate apm buffer\n");
+	else
+		snd_card_set_pm_callback(card, ali_suspend, ali_resume, codec);
 #endif
 
 	snd_ali_enable_address_interrupt(codec);
@@ -2263,16 +2258,14 @@
 		snd_card_free(card);
 		return err;
 	}
-	pci_set_drvdata(pci, codec);
+	pci_set_drvdata(pci, card);
 	dev++;
 	return 0;
 }
 
 static void __devexit snd_ali_remove(struct pci_dev *pci)
 {
-	ali_t *chip = snd_magic_cast(ali_t, pci_get_drvdata(pci), return);
-	if (chip)
-		snd_card_free(chip->card);
+	snd_card_free(pci_get_drvdata(pci));
 	pci_set_drvdata(pci, NULL);
 }
 
@@ -2281,23 +2274,12 @@
 	.id_table = snd_ali_ids,
 	.probe = snd_ali_probe,
 	.remove = __devexit_p(snd_ali_remove),
-#ifdef CONFIG_PM
-	.suspend = snd_ali_suspend,
-	.resume = snd_ali_resume,
-#endif
+	SND_PCI_PM_CALLBACKS
 };                                
 
 static int __init alsa_card_ali_init(void)
 {
-	int err;
-
-	if ((err = pci_module_init(&driver)) < 0) {
-#ifdef MODULE
-		printk(KERN_ERR "ALi pci audio not found or device busy.\n");
-#endif
-		return err;
-	}
-	return 0;
+	return pci_module_init(&driver);
 }
 
 static void __exit alsa_card_ali_exit(void)
@@ -2307,25 +2289,3 @@
 
 module_init(alsa_card_ali_init)
 module_exit(alsa_card_ali_exit)
-
-#ifndef MODULE
-
-/* format is: snd-ali5451=enable,index,id,pcm_channels */
-
-static int __init alsa_card_ali_setup(char *str)
-{
-	static unsigned __initdata nr_dev = 0;
-
-	if (nr_dev >= SNDRV_CARDS)
-		return 0;
-	(void)(get_option(&str,&enable[nr_dev]) == 2 &&
-	       get_option(&str,&index[nr_dev]) == 2 &&
-	       get_id(&str,&id[nr_dev]) == 2 &&
-	       get_option(&str,&pcm_channels[nr_dev]) == 2);
-	nr_dev++;
-	return 1;
-}
-
-__setup("snd-ali5451=", alsa_card_ali_setup);
-
-#endif /* ifndef */
diff -Nru a/sound/pci/als4000.c b/sound/pci/als4000.c
--- a/sound/pci/als4000.c	2004-05-26 15:01:36 -07:00
+++ b/sound/pci/als4000.c	2004-05-26 15:01:36 -07:00
@@ -64,13 +64,13 @@
 #include <linux/pci.h>
 #include <linux/slab.h>
 #include <linux/gameport.h>
+#include <linux/moduleparam.h>
 #include <sound/core.h>
 #include <sound/pcm.h>
 #include <sound/rawmidi.h>
 #include <sound/mpu401.h>
 #include <sound/opl3.h>
 #include <sound/sb.h>
-#define SNDRV_GET_ID
 #include <sound/initval.h>
 
 MODULE_AUTHOR("Bart Hartgers <bart@etpmod.phys.tue.nl>");
@@ -89,18 +89,19 @@
 #ifdef SUPPORT_JOYSTICK
 static int joystick_port[SNDRV_CARDS];
 #endif
+static int boot_devs;
 
-MODULE_PARM(index, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+module_param_array(index, int, boot_devs, 0444);
 MODULE_PARM_DESC(index, "Index value for ALS4000 soundcard.");
 MODULE_PARM_SYNTAX(index, SNDRV_INDEX_DESC);
-MODULE_PARM(id, "1-" __MODULE_STRING(SNDRV_CARDS) "s");
+module_param_array(id, charp, boot_devs, 0444);
 MODULE_PARM_DESC(id, "ID string for ALS4000 soundcard.");
 MODULE_PARM_SYNTAX(id, SNDRV_ID_DESC);
-MODULE_PARM(enable, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+module_param_array(enable, bool, boot_devs, 0444);
 MODULE_PARM_DESC(enable, "Enable ALS4000 soundcard.");
 MODULE_PARM_SYNTAX(enable, SNDRV_INDEX_DESC);
 #ifdef SUPPORT_JOYSTICK
-MODULE_PARM(joystick_port, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+module_param_array(joystick_port, int, boot_devs, 0444);
 MODULE_PARM_DESC(joystick_port, "Joystick port address for ALS4000 soundcard. (0 = disabled)");
 MODULE_PARM_SYNTAX(joystick_port, SNDRV_ENABLED);
 #endif
@@ -755,15 +756,7 @@
 
 static int __init alsa_card_als4000_init(void)
 {
-	int err;
-	
-	if ((err = pci_module_init(&driver)) < 0) {
-#ifdef MODULE
-		printk(KERN_ERR "no ALS4000 based soundcards found or device busy\n");
-#endif
-		return err;
-	}
-	return 0;
+	return pci_module_init(&driver);
 }
 
 static void __exit alsa_card_als4000_exit(void)
@@ -773,28 +766,3 @@
 
 module_init(alsa_card_als4000_init)
 module_exit(alsa_card_als4000_exit)
-
-#ifndef MODULE
-
-/* format is: snd-als4000=enable,index,id,joystick_port */
-
-static int __init alsa_card_als4000_setup(char *str)
-{
-	static unsigned __initdata nr_dev = 0;
-
-	if (nr_dev >= SNDRV_CARDS)
-		return 0;
-	(void)(get_option(&str,&enable[nr_dev]) == 2 &&
-	       get_option(&str,&index[nr_dev]) == 2 &&
-	       get_id(&str,&id[nr_dev]) == 2
-#ifdef SUPPORT_JOYSTICK
-	       && get_option(&str,&joystick_port[nr_dev]) == 2
-#endif
-	       );
-	nr_dev++;
-	return 1;
-}
-
-__setup("snd-als4000=", alsa_card_als4000_setup);
-
-#endif /* ifndef MODULE */
diff -Nru a/sound/pci/atiixp.c b/sound/pci/atiixp.c
--- a/sound/pci/atiixp.c	2004-05-26 15:01:36 -07:00
+++ b/sound/pci/atiixp.c	2004-05-26 15:01:36 -07:00
@@ -26,39 +26,40 @@
 #include <linux/init.h>
 #include <linux/pci.h>
 #include <linux/slab.h>
+#include <linux/moduleparam.h>
 #include <sound/core.h>
 #include <sound/pcm.h>
 #include <sound/pcm_params.h>
 #include <sound/info.h>
 #include <sound/ac97_codec.h>
-#define SNDRV_GET_ID
 #include <sound/initval.h>
 
 MODULE_AUTHOR("Takashi Iwai <tiwai@suse.de>");
 MODULE_DESCRIPTION("ATI IXP AC97 controller");
 MODULE_LICENSE("GPL");
 MODULE_CLASSES("{sound}");
-MODULE_DEVICES("{{ATI,IXP150/200/250}}");
+MODULE_DEVICES("{{ATI,IXP150/200/250/300}}");
 
 static int index[SNDRV_CARDS] = SNDRV_DEFAULT_IDX;	/* Index 0-MAX */
 static char *id[SNDRV_CARDS] = SNDRV_DEFAULT_STR;	/* ID for this card */
 static int enable[SNDRV_CARDS] = SNDRV_DEFAULT_ENABLE_PNP;	/* Enable this card */
 static int ac97_clock[SNDRV_CARDS] = {[0 ... (SNDRV_CARDS - 1)] = 48000};
 static int spdif_aclink[SNDRV_CARDS] = {[0 ... (SNDRV_CARDS - 1)] = 1};
+static int boot_devs;
 
-MODULE_PARM(index, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+module_param_array(index, int, boot_devs, 0444);
 MODULE_PARM_DESC(index, "Index value for ATI IXP controller.");
 MODULE_PARM_SYNTAX(index, SNDRV_INDEX_DESC);
-MODULE_PARM(id, "1-" __MODULE_STRING(SNDRV_CARDS) "s");
+module_param_array(id, charp, boot_devs, 0444);
 MODULE_PARM_DESC(id, "ID string for ATI IXP controller.");
 MODULE_PARM_SYNTAX(id, SNDRV_ID_DESC);
-MODULE_PARM(enable, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+module_param_array(enable, bool, boot_devs, 0444);
 MODULE_PARM_DESC(enable, "Enable audio part of ATI IXP controller.");
 MODULE_PARM_SYNTAX(enable, SNDRV_ENABLE_DESC);
-MODULE_PARM(ac97_clock, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+module_param_array(ac97_clock, int, boot_devs, 0444);
 MODULE_PARM_DESC(ac97_clock, "AC'97 codec clock (default 48000Hz).");
 MODULE_PARM_SYNTAX(ac97_clock, SNDRV_ENABLED ",default:48000");
-MODULE_PARM(spdif_aclink, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+module_param_array(spdif_aclink, bool, boot_devs, 0444);
 MODULE_PARM_DESC(spdif_aclink, "S/PDIF over AC-link.");
 MODULE_PARM_SYNTAX(spdif_aclink, SNDRV_ENABLED "," SNDRV_BOOLEAN_TRUE_DESC);
 
@@ -223,7 +224,12 @@
 /*
  * stream enum
  */
-enum { ATI_DMA_PLAYBACK, ATI_DMA_CAPTURE, ATI_DMA_SPDIF };
+enum { ATI_DMA_PLAYBACK, ATI_DMA_CAPTURE, ATI_DMA_SPDIF, NUM_ATI_DMAS }; /* DMAs */
+enum { ATI_PCM_OUT, ATI_PCM_IN, ATI_PCM_SPDIF, NUM_ATI_PCMS }; /* AC97 pcm slots */
+enum { ATI_PCMDEV_ANALOG, ATI_PCMDEV_DIGITAL, NUM_ATI_PCMDEVS }; /* pcm devices */
+
+#define NUM_ATI_CODECS	3
+
 
 /*
  * constants and callbacks for each DMA type
@@ -231,6 +237,7 @@
 struct snd_atiixp_dma_ops {
 	int type;			/* ATI_DMA_XXX */
 	unsigned int llp_offset;	/* LINKPTR offset */
+	unsigned int dt_cur;		/* DT_CUR offset */
 	void (*enable_dma)(atiixp_t *chip, int on);	/* called from open callback */
 	void (*enable_transfer)(atiixp_t *chip, int on); /* called from trigger (START/STOP) */
 	void (*flush_dma)(atiixp_t *chip);		/* called from trigger (STOP only) */
@@ -246,9 +253,10 @@
 	snd_pcm_substream_t *substream;	/* assigned PCM substream */
 	unsigned int buf_addr, buf_bytes;	/* DMA buffer address, bytes */
 	unsigned int period_bytes, periods;
+	int opened;
 	int running;
-	struct ac97_pcm *pcm;
 	int pcm_open_flag;
+	int ac97_pcm_type;	/* index # of ac97_pcm to access, -1 = not used */
 };
 
 /*
@@ -264,25 +272,34 @@
 	int irq;
 	
 	ac97_bus_t *ac97_bus;
-	ac97_t *ac97[3];		/* IXP can have up to 3 codecs */
+	ac97_t *ac97[NUM_ATI_CODECS];
 
 	spinlock_t reg_lock;
 	spinlock_t ac97_lock;
 
-	atiixp_dma_t dmas[3];		/* playback, capture, spdif */
+	atiixp_dma_t dmas[NUM_ATI_DMAS];
+	struct ac97_pcm *pcms[NUM_ATI_PCMS];
+	snd_pcm_t *pcmdevs[NUM_ATI_PCMDEVS];
 
 	int max_channels;		/* max. channels for PCM out */
 
 	unsigned int codec_not_ready_bits;	/* for codec detection */
 
 	int spdif_over_aclink;		/* passed from the module option */
+	struct semaphore open_mutex;	/* playback open mutex */
+
+#ifdef CONFIG_PM
+	u32 pci_state[16];
+#endif
 };
 
 
 /*
  */
 static struct pci_device_id snd_atiixp_ids[] = {
-	{ 0x1002, 0x4341, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 },
+	{ 0x1002, 0x4341, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 }, /* SB200 */
+	{ 0x1002, 0x4361, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 }, /* SB300 */
+	{ 0, }
 };
 
 MODULE_DEVICE_TABLE(pci, snd_atiixp_ids);
@@ -393,7 +410,7 @@
 		addr += period_bytes;
 	}
 
-	writel(cpu_to_le32((u32)dma->desc_buf.addr | ATI_REG_LINKPTR_EN),
+	writel((u32)dma->desc_buf.addr | ATI_REG_LINKPTR_EN,
 	       chip->remap_addr + dma->ops->llp_offset);
 
 	dma->period_bytes = period_bytes;
@@ -452,7 +469,9 @@
 			return data >> ATI_REG_PHYS_IN_DATA_SHIFT;
 		udelay(1);
 	} while (--timeout);
-	snd_printk(KERN_WARNING "atiixp: codec read timeout\n");
+	/* time out may happen during reset */
+	if (reg < 0x7c)
+		snd_printk(KERN_WARNING "atiixp: codec read timeout (reg %x)\n", reg);
 	return 0xffff;
 }
 
@@ -527,13 +546,11 @@
 	return 0;
 }
 
-#if 0 /* for P/M */
+#ifdef CONFIG_PM
 static int snd_atiixp_aclink_down(atiixp_t *chip)
 {
-	unsigned long flags;
-
-	if (atiixp_read(chip, MODEM_MIRROR) & ATI_REG_MODEM_MIRROR_RUNNING)
-		return -EBUSY;
+	// if (atiixp_read(chip, MODEM_MIRROR) & 0x1) /* modem running, too? */
+	//	return -EBUSY;
 	atiixp_update(chip, CMD,
 		     ATI_REG_CMD_POWERDOWN | ATI_REG_CMD_AC_RESET,
 		     ATI_REG_CMD_POWERDOWN);
@@ -585,12 +602,16 @@
 {
 	unsigned int reg;
 
-	/* enable burst mode */
+	/* set up spdif, enable burst mode */
 	reg = atiixp_read(chip, CMD);
 	reg |= 0x02 << ATI_REG_CMD_SPDF_THRESHOLD_SHIFT;
 	reg |= ATI_REG_CMD_BURST_EN;
 	atiixp_write(chip, CMD, reg);
 
+	reg = atiixp_read(chip, SPDF_CMD);
+	reg &= ~(ATI_REG_SPDF_CMD_LFSR|ATI_REG_SPDF_CMD_SINGLE_CH);
+	atiixp_write(chip, SPDF_CMD, reg);
+
 	/* clear all interrupt source */
 	atiixp_write(chip, ISR, 0xffffffff);
 	/* enable irqs */
@@ -635,7 +656,7 @@
 	unsigned long flags;
 
 	spin_lock_irqsave(&chip->reg_lock, flags);
-	curptr = readl(chip->remap_addr + dma->ops->llp_offset + 12); /* XXX_DMA_DT_CUR */
+	curptr = readl(chip->remap_addr + dma->ops->dt_cur);
 	if (curptr < dma->buf_addr) {
 		snd_printdd("curptr = %x, base = %x\n", curptr, dma->buf_addr);
 		curptr = 0;
@@ -657,7 +678,7 @@
 {
 	if (! dma->substream || ! dma->running)
 		return;
-	snd_printd(KERN_DEBUG "atiixp: XRUN detected (DMA %d)\n", dma->ops->type);
+	snd_printdd("atiixp: XRUN detected (DMA %d)\n", dma->ops->type);
 	snd_pcm_stop(dma->substream, SNDRV_PCM_STATE_XRUN);
 }
 
@@ -800,15 +821,10 @@
 {
 	unsigned int data;
 	data = atiixp_read(chip, CMD);
-	if (on) {
+	if (on)
 		data |= ATI_REG_CMD_SPDF_OUT_EN;
-		if (chip->spdif_over_aclink)
-			data |= ATI_REG_CMD_SEND_EN;
-	}  else {
+	else
 		data &= ~ATI_REG_CMD_SPDF_OUT_EN;
-		if (chip->spdif_over_aclink)
-			data &= ~ATI_REG_CMD_SEND_EN;
-	}
 	atiixp_write(chip, CMD, data);
 }
 
@@ -835,25 +851,25 @@
 static int snd_atiixp_spdif_prepare(snd_pcm_substream_t *substream)
 {
 	atiixp_t *chip = snd_pcm_substream_chip(substream);
-	unsigned int data;
 
 	spin_lock(&chip->reg_lock);
 	if (chip->spdif_over_aclink) {
+		unsigned int data;
 		/* enable slots 10/11 */
 		atiixp_update(chip, CMD, ATI_REG_CMD_SPDF_CONFIG_MASK,
 			      ATI_REG_CMD_SPDF_CONFIG_01);
-		data = atiixp_read(chip, OUT_DMA_SLOT);
+		data = atiixp_read(chip, OUT_DMA_SLOT) & ~ATI_REG_OUT_DMA_SLOT_MASK;
 		data |= ATI_REG_OUT_DMA_SLOT_BIT(10) |
 			ATI_REG_OUT_DMA_SLOT_BIT(11);
 		data |= 0x04 << ATI_REG_OUT_DMA_THRESHOLD_SHIFT;
 		atiixp_write(chip, OUT_DMA_SLOT, data);
+		atiixp_update(chip, CMD, ATI_REG_CMD_INTERLEAVE_OUT,
+			      substream->runtime->format == SNDRV_PCM_FORMAT_S16_LE ?
+			      ATI_REG_CMD_INTERLEAVE_OUT : 0);
 	} else {
 		atiixp_update(chip, CMD, ATI_REG_CMD_SPDF_CONFIG_MASK, 0);
+		atiixp_update(chip, CMD, ATI_REG_CMD_INTERLEAVE_SPDF, 0);
 	}
-
-	atiixp_update(chip, CMD, ATI_REG_CMD_INTERLEAVE_SPDF,
-		      substream->runtime->format == SNDRV_PCM_FORMAT_S16_LE ?
-		      ATI_REG_CMD_INTERLEAVE_SPDF : 0);
 	spin_unlock(&chip->reg_lock);
 	return 0;
 }
@@ -938,17 +954,18 @@
 	if (err < 0)
 		return err;
 
-	if (dma->pcm) {
+	if (dma->ac97_pcm_type >= 0) {
+		struct ac97_pcm *pcm = chip->pcms[dma->ac97_pcm_type];
 		/* PCM is bound to AC97 codec(s)
 		 * set up the AC97 codecs
 		 */
 		if (dma->pcm_open_flag) {
-			snd_ac97_pcm_close(dma->pcm);
+			snd_ac97_pcm_close(pcm);
 			dma->pcm_open_flag = 0;
 		}
-		err = snd_ac97_pcm_open(dma->pcm, params_rate(hw_params),
+		err = snd_ac97_pcm_open(pcm, params_rate(hw_params),
 					params_channels(hw_params),
-					dma->pcm->r[0].slots);
+					pcm->r[0].slots);
 		if (err >= 0)
 			dma->pcm_open_flag = 1;
 	}
@@ -962,7 +979,8 @@
 	atiixp_dma_t *dma = (atiixp_dma_t *)substream->runtime->private_data;
 
 	if (dma->pcm_open_flag) {
-		snd_ac97_pcm_close(dma->pcm);
+		struct ac97_pcm *pcm = chip->pcms[dma->ac97_pcm_type];
+		snd_ac97_pcm_close(pcm);
 		dma->pcm_open_flag = 0;
 	}
 	atiixp_clear_dma_packets(chip, dma, substream);
@@ -992,7 +1010,7 @@
 	.periods_max =		ATI_MAX_DESCRIPTORS,
 };
 
-static int snd_atiixp_pcm_open(snd_pcm_substream_t *substream, atiixp_dma_t *dma)
+static int snd_atiixp_pcm_open(snd_pcm_substream_t *substream, atiixp_dma_t *dma, int pcm_type)
 {
 	atiixp_t *chip = snd_pcm_substream_chip(substream);
 	snd_pcm_runtime_t *runtime = substream->runtime;
@@ -1001,15 +1019,17 @@
 
 	snd_assert(dma->ops && dma->ops->enable_dma, return -EINVAL);
 
+	if (dma->opened)
+		return -EBUSY;
 	dma->substream = substream;
 	runtime->hw = snd_atiixp_pcm_hw;
-	if (dma->pcm) {
-		runtime->hw.rates = dma->pcm->rates;
+	dma->ac97_pcm_type = pcm_type;
+	if (pcm_type >= 0) {
+		runtime->hw.rates = chip->pcms[pcm_type]->rates;
 		snd_pcm_limit_hw_rates(runtime);
 	} else {
-		/* SPDIF */
-		runtime->hw.rates = SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_44100 | SNDRV_PCM_RATE_32000;
-		runtime->hw.rate_min = 32000;
+		/* direct SPDIF */
+		runtime->hw.formats = SNDRV_PCM_FMTBIT_IEC958_SUBFRAME_LE;
 	}
 	if ((err = snd_pcm_hw_constraint_integer(runtime, SNDRV_PCM_HW_PARAM_PERIODS)) < 0)
 		return err;
@@ -1019,6 +1039,7 @@
 	spin_lock_irqsave(&chip->reg_lock, flags);
 	dma->ops->enable_dma(chip, 1);
 	spin_unlock_irqrestore(&chip->reg_lock, flags);
+	dma->opened = 1;
 
 	return 0;
 }
@@ -1032,6 +1053,7 @@
 	dma->ops->enable_dma(chip, 0);
 	spin_unlock_irq(&chip->reg_lock);
 	dma->substream = NULL;
+	dma->opened = 0;
 	return 0;
 }
 
@@ -1042,26 +1064,33 @@
 	atiixp_t *chip = snd_pcm_substream_chip(substream);
 	int err;
 
-	err = snd_atiixp_pcm_open(substream, &chip->dmas[ATI_DMA_PLAYBACK]);
+	down(&chip->open_mutex);
+	err = snd_atiixp_pcm_open(substream, &chip->dmas[ATI_DMA_PLAYBACK], 0);
+	up(&chip->open_mutex);
+	if (err < 0)
+		return err;
 	substream->runtime->hw.channels_max = chip->max_channels;
 	if (chip->max_channels > 2)
 		/* channels must be even */
 		snd_pcm_hw_constraint_step(substream->runtime, 0,
 					   SNDRV_PCM_HW_PARAM_CHANNELS, 2);
-
 	return 0;
 }
 
 static int snd_atiixp_playback_close(snd_pcm_substream_t *substream)
 {
 	atiixp_t *chip = snd_pcm_substream_chip(substream);
-	return snd_atiixp_pcm_close(substream, &chip->dmas[ATI_DMA_PLAYBACK]);
+	int err;
+	down(&chip->open_mutex);
+	err = snd_atiixp_pcm_close(substream, &chip->dmas[ATI_DMA_PLAYBACK]);
+	up(&chip->open_mutex);
+	return err;
 }
 
 static int snd_atiixp_capture_open(snd_pcm_substream_t *substream)
 {
 	atiixp_t *chip = snd_pcm_substream_chip(substream);
-	return snd_atiixp_pcm_open(substream, &chip->dmas[ATI_DMA_CAPTURE]);
+	return snd_atiixp_pcm_open(substream, &chip->dmas[ATI_DMA_CAPTURE], 1);
 }
 
 static int snd_atiixp_capture_close(snd_pcm_substream_t *substream)
@@ -1073,13 +1102,27 @@
 static int snd_atiixp_spdif_open(snd_pcm_substream_t *substream)
 {
 	atiixp_t *chip = snd_pcm_substream_chip(substream);
-	return snd_atiixp_pcm_open(substream, &chip->dmas[ATI_DMA_SPDIF]);
+	int err;
+	down(&chip->open_mutex);
+	if (chip->spdif_over_aclink) /* share DMA_PLAYBACK */
+		err = snd_atiixp_pcm_open(substream, &chip->dmas[ATI_DMA_PLAYBACK], 2);
+	else
+		err = snd_atiixp_pcm_open(substream, &chip->dmas[ATI_DMA_SPDIF], -1);
+	up(&chip->open_mutex);
+	return err;
 }
 
 static int snd_atiixp_spdif_close(snd_pcm_substream_t *substream)
 {
 	atiixp_t *chip = snd_pcm_substream_chip(substream);
-	return snd_atiixp_pcm_close(substream, &chip->dmas[ATI_DMA_SPDIF]);
+	int err;
+	down(&chip->open_mutex);
+	if (chip->spdif_over_aclink)
+		err = snd_atiixp_pcm_close(substream, &chip->dmas[ATI_DMA_PLAYBACK]);
+	else
+		err = snd_atiixp_pcm_close(substream, &chip->dmas[ATI_DMA_SPDIF]);
+	up(&chip->open_mutex);
+	return err;
 }
 
 /* AC97 playback */
@@ -1157,6 +1200,7 @@
 static atiixp_dma_ops_t snd_atiixp_playback_dma_ops = {
 	.type = ATI_DMA_PLAYBACK,
 	.llp_offset = ATI_REG_OUT_DMA_LINKPTR,
+	.dt_cur = ATI_REG_OUT_DMA_DT_CUR,
 	.enable_dma = atiixp_out_enable_dma,
 	.enable_transfer = atiixp_out_enable_transfer,
 	.flush_dma = atiixp_out_flush_dma,
@@ -1165,6 +1209,7 @@
 static atiixp_dma_ops_t snd_atiixp_capture_dma_ops = {
 	.type = ATI_DMA_CAPTURE,
 	.llp_offset = ATI_REG_IN_DMA_LINKPTR,
+	.dt_cur = ATI_REG_IN_DMA_DT_CUR,
 	.enable_dma = atiixp_in_enable_dma,
 	.enable_transfer = atiixp_in_enable_transfer,
 	.flush_dma = atiixp_in_flush_dma,
@@ -1173,6 +1218,7 @@
 static atiixp_dma_ops_t snd_atiixp_spdif_dma_ops = {
 	.type = ATI_DMA_SPDIF,
 	.llp_offset = ATI_REG_SPDF_DMA_LINKPTR,
+	.dt_cur = ATI_REG_SPDF_DMA_DT_CUR,
 	.enable_dma = atiixp_spdif_enable_dma,
 	.enable_transfer = atiixp_spdif_enable_transfer,
 	.flush_dma = atiixp_spdif_flush_dma,
@@ -1188,7 +1234,8 @@
 	/* initialize constants */
 	chip->dmas[ATI_DMA_PLAYBACK].ops = &snd_atiixp_playback_dma_ops;
 	chip->dmas[ATI_DMA_CAPTURE].ops = &snd_atiixp_capture_dma_ops;
-	chip->dmas[ATI_DMA_SPDIF].ops = &snd_atiixp_spdif_dma_ops;
+	if (! chip->spdif_over_aclink)
+		chip->dmas[ATI_DMA_SPDIF].ops = &snd_atiixp_spdif_dma_ops;
 
 	/* assign AC97 pcm */
 	if (chip->spdif_over_aclink)
@@ -1198,49 +1245,55 @@
 	err = snd_ac97_pcm_assign(pbus, num_pcms, atiixp_pcm_defs);
 	if (err < 0)
 		return err;
+	for (i = 0; i < num_pcms; i++)
+		chip->pcms[i] = &pbus->pcms[i];
 
 	chip->max_channels = 2;
-	if (pbus->pcms[0].r[0].slots & (1 << AC97_SLOT_PCM_SLEFT)) {
-		if (pbus->pcms[0].r[0].slots & (1 << AC97_SLOT_LFE))
+	if (pbus->pcms[ATI_PCM_OUT].r[0].slots & (1 << AC97_SLOT_PCM_SLEFT)) {
+		if (pbus->pcms[ATI_PCM_OUT].r[0].slots & (1 << AC97_SLOT_LFE))
 			chip->max_channels = 6;
 		else
 			chip->max_channels = 4;
 	}
 
-	chip->dmas[ATI_DMA_PLAYBACK].pcm = &pbus->pcms[0];
-	chip->dmas[ATI_DMA_CAPTURE].pcm = &pbus->pcms[1];
-	if (chip->spdif_over_aclink)
-		chip->dmas[ATI_DMA_SPDIF].pcm = &pbus->pcms[2];
-
 	/* PCM #0: analog I/O */
-	err = snd_pcm_new(chip->card, "ATI IXP AC97", 0, 1, 1, &pcm);
+	err = snd_pcm_new(chip->card, "ATI IXP AC97", ATI_PCMDEV_ANALOG, 1, 1, &pcm);
 	if (err < 0)
 		return err;
 	snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_PLAYBACK, &snd_atiixp_playback_ops);
 	snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_CAPTURE, &snd_atiixp_capture_ops);
 	pcm->private_data = chip;
 	strcpy(pcm->name, "ATI IXP AC97");
+	chip->pcmdevs[ATI_PCMDEV_ANALOG] = pcm;
 
 	snd_pcm_lib_preallocate_pages_for_all(pcm, SNDRV_DMA_TYPE_DEV,
 					      snd_dma_pci_data(chip->pci), 64*1024, 128*1024);
 
 	/* no SPDIF support on codec? */
-	if (chip->dmas[ATI_DMA_SPDIF].pcm && ! chip->dmas[ATI_DMA_SPDIF].pcm->rates)
+	if (chip->pcms[ATI_PCM_SPDIF] && ! chip->pcms[ATI_PCM_SPDIF]->rates)
 		return 0;
 		
+	/* FIXME: non-48k sample rate doesn't work on my test machine with AD1888 */
+	if (chip->pcms[ATI_PCM_SPDIF])
+		chip->pcms[ATI_PCM_SPDIF]->rates = SNDRV_PCM_RATE_48000;
+
 	/* PCM #1: spdif playback */
-	err = snd_pcm_new(chip->card, "ATI IXP IEC958", 1, 1, 0, &pcm);
+	err = snd_pcm_new(chip->card, "ATI IXP IEC958", ATI_PCMDEV_DIGITAL, 1, 0, &pcm);
 	if (err < 0)
 		return err;
 	snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_PLAYBACK, &snd_atiixp_spdif_ops);
 	pcm->private_data = chip;
-	strcpy(pcm->name, "ATI IXP IEC958");
+	if (chip->spdif_over_aclink)
+		strcpy(pcm->name, "ATI IXP IEC958 (AC97)");
+	else
+		strcpy(pcm->name, "ATI IXP IEC958 (Direct)");
+	chip->pcmdevs[ATI_PCMDEV_DIGITAL] = pcm;
 
 	snd_pcm_lib_preallocate_pages_for_all(pcm, SNDRV_DMA_TYPE_DEV,
 					      snd_dma_pci_data(chip->pci), 64*1024, 128*1024);
 
 	/* pre-select AC97 SPDIF slots 10/11 */
-	for (i = 0; i < 3; i++) {
+	for (i = 0; i < NUM_ATI_CODECS; i++) {
 		if (chip->ac97[i])
 			snd_ac97_update_bits(chip->ac97[i], AC97_EXTENDED_STATUS, 0x03 << 4, 0x03 << 4);
 	}
@@ -1272,10 +1325,12 @@
 		snd_atiixp_xrun_dma(chip,  &chip->dmas[ATI_DMA_CAPTURE]);
 	else if (status & ATI_REG_ISR_IN_STATUS)
 		snd_atiixp_update_dma(chip, &chip->dmas[ATI_DMA_CAPTURE]);
-	if (status & ATI_REG_ISR_SPDF_XRUN)
-		snd_atiixp_xrun_dma(chip,  &chip->dmas[ATI_DMA_SPDIF]);
-	else if (status & ATI_REG_ISR_SPDF_STATUS)
-		snd_atiixp_update_dma(chip, &chip->dmas[ATI_DMA_SPDIF]);
+	if (! chip->spdif_over_aclink) {
+		if (status & ATI_REG_ISR_SPDF_XRUN)
+			snd_atiixp_xrun_dma(chip,  &chip->dmas[ATI_DMA_SPDIF]);
+		else if (status & ATI_REG_ISR_SPDF_STATUS)
+			snd_atiixp_update_dma(chip, &chip->dmas[ATI_DMA_SPDIF]);
+	}
 
 	/* for codec detection */
 	if (status & CODEC_CHECK_BITS) {
@@ -1303,7 +1358,8 @@
 	ac97_bus_t bus, *pbus;
 	ac97_t ac97;
 	int i, err;
-	static unsigned int codec_skip[3] = {
+	int codec_count;
+	static unsigned int codec_skip[NUM_ATI_CODECS] = {
 		ATI_REG_ISR_CODEC0_NOT_READY,
 		ATI_REG_ISR_CODEC1_NOT_READY,
 		ATI_REG_ISR_CODEC2_NOT_READY,
@@ -1321,15 +1377,34 @@
 		return err;
 	chip->ac97_bus = pbus;
 
-	for (i = 0; i < 3; i++) {
+	codec_count = 0;
+	for (i = 0; i < NUM_ATI_CODECS; i++) {
 		if (chip->codec_not_ready_bits & codec_skip[i])
 			continue;
 		memset(&ac97, 0, sizeof(ac97));
 		ac97.private_data = chip;
 		ac97.pci = chip->pci;
 		ac97.num = i;
-		if ((err = snd_ac97_mixer(pbus, &ac97, &chip->ac97[i])) < 0)
-			return err;
+		ac97.scaps = AC97_SCAP_SKIP_MODEM;
+		if ((err = snd_ac97_mixer(pbus, &ac97, &chip->ac97[i])) < 0) {
+			if (chip->codec_not_ready_bits)
+				/* codec(s) was detected but not available.
+				 * return the error
+				 */
+				return err;
+			else {
+				/* codec(s) was NOT detected, so just ignore here */
+				chip->ac97[i] = NULL; /* to be sure */
+				snd_printd("atiixp: codec %d not found\n", i);
+				continue;
+			}
+		}
+		codec_count++;
+	}
+
+	if (! codec_count) {
+		snd_printk(KERN_ERR "atiixp: no codec available\n");
+		return -ENODEV;
 	}
 
 	/* snd_ac97_tune_hardware(chip->ac97, ac97_quirks); */
@@ -1338,6 +1413,53 @@
 }
 
 
+#ifdef CONFIG_PM
+/*
+ * power management
+ */
+static int snd_atiixp_suspend(snd_card_t *card, unsigned int state)
+{
+	atiixp_t *chip = snd_magic_cast(atiixp_t, card->pm_private_data, return -EINVAL);
+	int i;
+
+	for (i = 0; i < NUM_ATI_PCMDEVS; i++)
+		if (chip->pcmdevs[i])
+			snd_pcm_suspend_all(chip->pcmdevs[i]);
+	for (i = 0; i < NUM_ATI_CODECS; i++)
+		if (chip->ac97[i])
+			snd_ac97_suspend(chip->ac97[i]);
+	snd_atiixp_aclink_down(chip);
+	snd_atiixp_chip_stop(chip);
+
+	pci_save_state(chip->pci, chip->pci_state);
+	pci_set_power_state(chip->pci, 3);
+	pci_disable_device(chip->pci);
+	snd_power_change_state(card, SNDRV_CTL_POWER_D3hot);
+	return 0;
+}
+
+static int snd_atiixp_resume(snd_card_t *card, unsigned int state)
+{
+	atiixp_t *chip = snd_magic_cast(atiixp_t, card->pm_private_data, return -EINVAL);
+	int i;
+
+	pci_enable_device(chip->pci);
+	pci_restore_state(chip->pci, chip->pci_state);
+	pci_set_power_state(chip->pci, 0);
+
+	snd_atiixp_aclink_reset(chip);
+	snd_atiixp_chip_start(chip);
+
+	for (i = 0; i < NUM_ATI_CODECS; i++)
+		if (chip->ac97[i])
+			snd_ac97_resume(chip->ac97[i]);
+
+	snd_power_change_state(card, SNDRV_CTL_POWER_D0);
+	return 0;
+}
+#endif /* CONFIG_PM */
+
+
 /*
  * proc interface for register dump
  */
@@ -1412,24 +1534,25 @@
 
 	spin_lock_init(&chip->reg_lock);
 	spin_lock_init(&chip->ac97_lock);
+	init_MUTEX(&chip->open_mutex);
 	chip->card = card;
 	chip->pci = pci;
 	chip->irq = -1;
 	chip->addr = pci_resource_start(pci, 0);
 	if ((chip->res = request_mem_region(chip->addr, ATI_MEM_REGION, "ATI IXP AC97")) == NULL) {
-		snd_printk("unable to grab I/O memory 0x%lx\n", chip->addr);
+		snd_printk(KERN_ERR "unable to grab I/O memory 0x%lx\n", chip->addr);
 		snd_atiixp_free(chip);
 		return -EBUSY;
 	}
 	chip->remap_addr = (unsigned long) ioremap_nocache(chip->addr, ATI_MEM_REGION);
 	if (chip->remap_addr == 0) {
-		snd_printk("AC'97 space ioremap problem\n");
+		snd_printk(KERN_ERR "AC'97 space ioremap problem\n");
 		snd_atiixp_free(chip);
 		return -EIO;
 	}
 
 	if (request_irq(pci->irq, snd_atiixp_interrupt, SA_INTERRUPT|SA_SHIRQ, card->shortname, (void *)chip)) {
-		snd_printk("unable to grab IRQ %d\n", pci->irq);
+		snd_printk(KERN_ERR "unable to grab IRQ %d\n", pci->irq);
 		snd_atiixp_free(chip);
 		return -EBUSY;
 	}
@@ -1471,7 +1594,7 @@
 
 	pci_read_config_byte(pci, PCI_REVISION_ID, &revision);
 
-	strcpy(card->driver, "ATIIXP");
+	strcpy(card->driver, spdif_aclink[dev] ? "ATIIXP" : "ATIIXP-SPDMA");
 	strcpy(card->shortname, "ATI IXP");
 	if ((err = snd_atiixp_create(card, pci, &chip)) < 0)
 		goto __error;
@@ -1494,10 +1617,12 @@
 	sprintf(card->longname, "%s rev %x at 0x%lx, irq %i",
 		card->shortname, revision, chip->addr, chip->irq);
 
+	snd_card_set_pm_callback(card, snd_atiixp_suspend, snd_atiixp_resume, chip);
+
 	if ((err = snd_card_register(card)) < 0)
 		goto __error;
 
-	pci_set_drvdata(pci, chip);
+	pci_set_drvdata(pci, card);
 	dev++;
 	return 0;
 
@@ -1508,9 +1633,7 @@
 
 static void __devexit snd_atiixp_remove(struct pci_dev *pci)
 {
-	atiixp_t *chip = snd_magic_cast(atiixp_t, pci_get_drvdata(pci), return);
-	if (chip)
-		snd_card_free(chip->card);
+	snd_card_free(pci_get_drvdata(pci));
 	pci_set_drvdata(pci, NULL);
 }
 
@@ -1519,21 +1642,13 @@
 	.id_table = snd_atiixp_ids,
 	.probe = snd_atiixp_probe,
 	.remove = __devexit_p(snd_atiixp_remove),
+	SND_PCI_PM_CALLBACKS
 };
 
 
 static int __init alsa_card_atiixp_init(void)
 {
-	int err;
-
-        if ((err = pci_module_init(&driver)) < 0) {
-#ifdef MODULE
-		printk(KERN_ERR "ATI IXP AC97 controller not found or device busy\n");
-#endif
-                return err;
-        }
-
-        return 0;
+	return pci_module_init(&driver);
 }
 
 static void __exit alsa_card_atiixp_exit(void)
@@ -1543,27 +1658,3 @@
 
 module_init(alsa_card_atiixp_init)
 module_exit(alsa_card_atiixp_exit)
-
-#ifndef MODULE
-
-/* format is: snd-atiixp=enable,index,id,ac97_clock,spdif_aclink */
-
-static int __init alsa_card_atiixp_setup(char *str)
-{
-	static unsigned __initdata nr_dev = 0;
-
-	if (nr_dev >= SNDRV_CARDS)
-		return 0;
-	(void)(get_option(&str,&enable[nr_dev]) == 2 &&
-	       get_option(&str,&index[nr_dev]) == 2 &&
-	       get_id(&str,&id[nr_dev]) == 2 &&
-	       get_option(&str,&ac97_clock[nr_dev]) == 2 &&
-	       get_option(&str,&spdif_aclink[nr_dev]) == 2
-	       );
-	nr_dev++;
-	return 1;
-}
-
-__setup("snd-atiixp=", alsa_card_atiixp_setup);
-
-#endif /* ifndef MODULE */
diff -Nru a/sound/pci/au88x0/au8810.h b/sound/pci/au88x0/au8810.h
--- a/sound/pci/au88x0/au8810.h	2004-05-26 15:01:36 -07:00
+++ b/sound/pci/au88x0/au8810.h	2004-05-26 15:01:36 -07:00
@@ -7,7 +7,7 @@
 #define CARD_NAME "Aureal Advantage 3D Sound Processor"
 #define CARD_NAME_SHORT "au8810"
 
-#define NR_ADB		0x20
+#define NR_ADB		0x10
 #define NR_WT		0x00
 #define NR_SRC		0x10
 #define NR_A3D		0x10
@@ -51,13 +51,14 @@
 /* ADB */
 #define VORTEX_ADB_SR 0x28400	/* Samplerates enable/disable */
 #define VORTEX_ADB_RTBASE 0x28000
-#define VORTEX_ADB_RTBASE_SIZE (VORTEX_ADB_CHNBASE - VORTEX_ADB_RTBASE)
+#define VORTEX_ADB_RTBASE_COUNT 173
 #define VORTEX_ADB_CHNBASE 0x282b4
-#define VORTEX_ADB_CHNBASE_SIZE (ADB_MASK - VORTEX_ADB_RTBASE_SIZE)
+#define VORTEX_ADB_CHNBASE_COUNT 24
 #define 	ROUTE_MASK	0xffff
 #define		SOURCE_MASK	0xff00
 #define     ADB_MASK   0xff
 #define		ADB_SHIFT 0x8
+
 /* ADB address */
 #define		OFFSET_ADBDMA	0x00
 #define		OFFSET_SRCIN	0x40
@@ -69,10 +70,12 @@
 #define		OFFSET_SPORTIN	0x78	/* ch 0x13 */
 #define		OFFSET_SPORTOUT	0x90
 #define		OFFSET_SPDIFOUT	0x92	/* ch 0x14 check this! */
-#define		OFFSET_EQIN		0xa0
+#define		OFFSET_EQIN	0xa0
 #define		OFFSET_EQOUT	0x7e	/* 2 routes on ch 0x11 */
 #define		OFFSET_XTALKOUT	0x66	/* crosstalk canceller (source) */
 #define		OFFSET_XTALKIN	0x96	/* crosstalk canceller (sink) */
+#define		OFFSET_A3DIN	0x70	/* ADB sink. */
+#define		OFFSET_A3DOUT	0xA6	/* ADB source. 2 routes per slice = 8 */
 #define		OFFSET_EFXIN	0x80	/* ADB sink. */
 #define		OFFSET_EFXOUT	0x68	/* ADB source. */
 
@@ -89,8 +92,8 @@
 #define ADB_SPDIFOUT(x)	(x + OFFSET_SPDIFOUT)
 #define ADB_EQIN(x) (x + OFFSET_EQIN)
 #define ADB_EQOUT(x) (x + OFFSET_EQOUT)
-#define ADB_A3DOUT(x) (x + 0x50)	/* A3D blocks */
-#define ADB_A3DIN(x) (x + 0x70)
+#define ADB_A3DOUT(x) (x + OFFSET_A3DOUT)	/* 0x10 A3D blocks */
+#define ADB_A3DIN(x) (x + OFFSET_A3DIN)
 #define ADB_XTALKIN(x) (x + OFFSET_XTALKIN)
 #define ADB_XTALKOUT(x) (x + OFFSET_XTALKOUT)
 
@@ -120,20 +123,31 @@
 #define		VOL_MAX 0x7f	/* FIXME: Not confirmed! Just guessed. */
 
 /* SRC */
-#define VORTEX_SRCBLOCK_SR	0x26cc0
-#define VORTEX_SRC_CHNBASE	0x26c40
-#define VORTEX_SRC_RTBASE	0x26c00
-#define VORTEX_SRC_SOURCE	0x26cc4
-#define VORTEX_SRC_SOURCESIZE 0x26cc8
-#define VORTEX_SRC_CONVRATIO 0x26e40
-#define VORTEX_SRC_DRIFT0	0x26e80
-#define VORTEX_SRC_DRIFT1	0x26ec0
-#define VORTEX_SRC_DRIFT2	0x26f40
-#define VORTEX_SRC_U0		0x26e00
-#define VORTEX_SRC_U1		0x26f00
-#define VORTEX_SRC_U2		0x26f80
-#define VORTEX_SRC_DATA		0x26800	/* 0xc800 */
-#define VORTEX_SRC_DATA0	0x26000
+#define VORTEX_SRC_CHNBASE		0x26c40
+#define VORTEX_SRC_RTBASE		0x26c00
+#define VORTEX_SRCBLOCK_SR		0x26cc0
+#define VORTEX_SRC_SOURCE		0x26cc4
+#define VORTEX_SRC_SOURCESIZE	0x26cc8
+/* Params
+	0x26e00	: 1 U0
+	0x26e40	: 2 CR
+	0x26e80	: 3 U3
+	0x26ec0	: 4 DRIFT1
+	0x26f00 : 5 U1
+	0x26f40	: 6 DRIFT2
+	0x26f80	: 7 U2 : Target rate, direction
+*/
+
+#define VORTEX_SRC_CONVRATIO	0x26e40
+#define VORTEX_SRC_DRIFT0		0x26e80
+#define VORTEX_SRC_DRIFT1		0x26ec0
+#define VORTEX_SRC_DRIFT2		0x26f40
+#define VORTEX_SRC_U0			0x26e00
+#define		U0_SLOWLOCK		0x200
+#define VORTEX_SRC_U1			0x26f00
+#define VORTEX_SRC_U2			0x26f80
+#define VORTEX_SRC_DATA			0x26800	/* 0xc800 */
+#define VORTEX_SRC_DATA0		0x26000
 
 /* FIFO */
 #define VORTEX_FIFO_ADBCTRL 0x16100	/* Control bits. */
@@ -150,33 +164,37 @@
 //#define       FIFO_MASK       0x1f    /* at shift left 0xb */
 //#define               FIFO_SIZE       0x20
 #define 	FIFO_BITS	0x03880000
-#define VORTEX_FIFO_ADBDATA 0x14000
-#define VORTEX_FIFO_WTDATA 0x10000
+#define VORTEX_FIFO_ADBDATA	0x14000
+#define VORTEX_FIFO_WTDATA	0x10000
 
 /* CODEC */
-#define VORTEX_CODEC_CTRL 0x29184
-#define VORTEX_CODEC_EN 0x29190
+#define VORTEX_CODEC_CTRL	0x29184
+#define VORTEX_CODEC_EN		0x29190
 #define		EN_CODEC0	0x00000300
+#define 	EN_AC98		0x00000c00 /* Modem AC98 slots. */
 #define		EN_CODEC1	0x00003000
 #define		EN_CODEC	(EN_CODEC0 | EN_CODEC1)
 #define		EN_SPORT	0x00030000
 #define		EN_SPDIF	0x000c0000
-#define VORTEX_CODEC_CHN 0x29080
-#define VORTEX_CODEC_WRITE 0x00800000
-#define VORTEX_CODEC_ADDSHIFT 16
-#define VORTEX_CODEC_ADDMASK 0x7f0000	/* 0x000f0000 */
-#define VORTEX_CODEC_DATSHIFT 0
-#define VORTEX_CODEC_DATMASK 0xffff
-#define VORTEX_CODEC_IO 0x29188
+
+#define VORTEX_CODEC_CHN 	0x29080
+#define VORTEX_CODEC_WRITE	0x00800000
+#define VORTEX_CODEC_ADDSHIFT 	16
+#define VORTEX_CODEC_ADDMASK	0x7f0000	/* 0x000f0000 */
+#define VORTEX_CODEC_DATSHIFT	0
+#define VORTEX_CODEC_DATMASK	0xffff
+#define VORTEX_CODEC_IO		0x29188
 
 /* SPDIF */
-#define VORTEX_SPDIF_FLAGS		0x2205c
-#define VORTEX_SPDIF_CFG0		0x291D0
-#define VORTEX_SPDIF_CFG1		0x291D4
+#define VORTEX_SPDIF_FLAGS	0x2205c
+#define VORTEX_SPDIF_CFG0	0x291D0
+#define VORTEX_SPDIF_CFG1	0x291D4
 #define VORTEX_SPDIF_SMPRATE	0x29194
 
 /* Sample timer */
-#define VORTEX_SMP_TIME  0x29198
+#define VORTEX_SMP_TIME		0x29198
+
+#define VORTEX_MODEM_CTRL	0x291ac
 
 /* IRQ */
 #define VORTEX_IRQ_SOURCE 0x2a000	/* Interrupt source flags. */
@@ -193,19 +211,19 @@
 #define 	CTRL_IRQ_ENABLE	0x00004000
 
 /* write: Timer period config / read: TIMER IRQ ack. */
-#define VORTEX_IRQ_STAT 0x2919c
+#define VORTEX_IRQ_STAT		0x2919c
 
 /* DMA */
-#define VORTEX_ENGINE_CTRL 0x27ae8
-#define 	ENGINE_INIT 0x1380000
+#define VORTEX_ENGINE_CTRL	0x27ae8
+#define 	ENGINE_INIT	0x1380000
 
-		     /* MIDI *//* GAME. */
-#define VORTEX_MIDI_DATA 0x28800
-#define VORTEX_MIDI_CMD 0x28804	/* Write command / Read status */
+/* MIDI *//* GAME. */
+#define VORTEX_MIDI_DATA	0x28800
+#define VORTEX_MIDI_CMD		0x28804	/* Write command / Read status */
 
-#define VORTEX_CTRL2 0x2880c
+#define VORTEX_CTRL2		0x2880c
 #define		CTRL2_GAME_ADCMODE 0x40
-#define VORTEX_GAME_LEGACY 0x28808
-#define VORTEX_GAME_AXIS 0x28810
+#define VORTEX_GAME_LEGACY	0x28808
+#define VORTEX_GAME_AXIS	0x28810
 #define		AXIS_SIZE 4
 #define		AXIS_RANGE 0x1fff
diff -Nru a/sound/pci/au88x0/au8820.c b/sound/pci/au88x0/au8820.c
--- a/sound/pci/au88x0/au8820.c	2004-05-26 15:01:36 -07:00
+++ b/sound/pci/au88x0/au8820.c	2004-05-26 15:01:36 -07:00
@@ -1,7 +1,7 @@
 #include "au8820.h"
 #include "au88x0.h"
 static struct pci_device_id snd_vortex_ids[] = {
-	{PCI_VENDOR_ID_AUREAL, PCI_DEVICE_ID_AUREAL_VORTEX,
+	{PCI_VENDOR_ID_AUREAL, PCI_DEVICE_ID_AUREAL_VORTEX_1,
 	 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0,},
 	{0,}
 };
diff -Nru a/sound/pci/au88x0/au8820.h b/sound/pci/au88x0/au8820.h
--- a/sound/pci/au88x0/au8820.h	2004-05-26 15:01:35 -07:00
+++ b/sound/pci/au88x0/au8820.h	2004-05-26 15:01:35 -07:00
@@ -48,9 +48,9 @@
 /* ADB */
 #define VORTEX_ADB_SR 0x10a00	/* Samplerates enable/disable */
 #define VORTEX_ADB_RTBASE 0x10800
-#define VORTEX_ADB_RTBASE_SIZE (VORTEX_ADB_CHNBASE - VORTEX_ADB_RTBASE)
+#define VORTEX_ADB_RTBASE_COUNT 103
 #define VORTEX_ADB_CHNBASE 0x1099c
-#define VORTEX_ADB_CHNBASE_SIZE (ADB_MASK - VORTEX_ADB_RTBASE_SIZE)
+#define VORTEX_ADB_CHNBASE_COUNT 22
 #define 	ROUTE_MASK	0x3fff
 #define     ADB_MASK   0x7f
 #define		ADB_SHIFT 0x7
diff -Nru a/sound/pci/au88x0/au8830.c b/sound/pci/au88x0/au8830.c
--- a/sound/pci/au88x0/au8830.c	2004-05-26 15:01:35 -07:00
+++ b/sound/pci/au88x0/au8830.c	2004-05-26 15:01:35 -07:00
@@ -1,7 +1,7 @@
 #include "au8830.h"
 #include "au88x0.h"
 static struct pci_device_id snd_vortex_ids[] = {
-	{PCI_VENDOR_ID_AUREAL, PCI_DEVICE_ID_AUREAL_VORTEX2,
+	{PCI_VENDOR_ID_AUREAL, PCI_DEVICE_ID_AUREAL_VORTEX_2,
 	 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0,},
 	{0,}
 };
diff -Nru a/sound/pci/au88x0/au8830.h b/sound/pci/au88x0/au8830.h
--- a/sound/pci/au88x0/au8830.h	2004-05-26 15:01:35 -07:00
+++ b/sound/pci/au88x0/au8830.h	2004-05-26 15:01:35 -07:00
@@ -45,7 +45,7 @@
 #define VORTEX_ADBDMA_START 0x27c00	/* Which subbuffer starts */
 
 #define VORTEX_ADBDMA_STATUS 0x27A90	/* stored at AdbDma->this_10 / 2 DWORD in size. */
-/* Starting at MSB, each pair seem to be the current DMA page. */
+/* Starting at the MSB, each pair of bits seem to be the current DMA page. */
 /* This current page bits are consistent (same value) with VORTEX_ADBDMA_STAT) */
 
 /* DMA */
@@ -65,9 +65,9 @@
 /* ADB */
 #define VORTEX_ADB_SR 0x28400	/* Samplerates enable/disable */
 #define VORTEX_ADB_RTBASE 0x28000
-#define VORTEX_ADB_RTBASE_SIZE (VORTEX_ADB_CHNBASE - VORTEX_ADB_RTBASE)
+#define VORTEX_ADB_RTBASE_COUNT 173
 #define VORTEX_ADB_CHNBASE 0x282b4
-#define VORTEX_ADB_CHNBASE_SIZE (ADB_MASK - VORTEX_ADB_RTBASE_SIZE)
+#define VORTEX_ADB_CHNBASE_COUNT 24
 #define 	ROUTE_MASK	0xffff
 #define		SOURCE_MASK	0xff00
 #define     ADB_MASK   0xff
@@ -147,7 +147,7 @@
 #define VORTEX_SRC_RTBASE		0x26c00
 #define VORTEX_SRCBLOCK_SR		0x26cc0
 #define VORTEX_SRC_SOURCE		0x26cc4
-#define VORTEX_SRC_SOURCESIZE	0x26cc4
+#define VORTEX_SRC_SOURCESIZE	0x26cc8
 /* Params
 	0x26e00	: 1 U0
 	0x26e40	: 2 CR
diff -Nru a/sound/pci/au88x0/au88x0.c b/sound/pci/au88x0/au88x0.c
--- a/sound/pci/au88x0/au88x0.c	2004-05-26 15:01:36 -07:00
+++ b/sound/pci/au88x0/au88x0.c	2004-05-26 15:01:36 -07:00
@@ -19,7 +19,7 @@
 #include <linux/pci.h>
 #include <linux/slab.h>
 #include <linux/interrupt.h>
-#define SNDRV_GET_ID
+#include <linux/moduleparam.h>
 #include <sound/initval.h>
 
 // module parameters (see "Module Parameters")
@@ -27,17 +27,18 @@
 static char *id[SNDRV_CARDS] = SNDRV_DEFAULT_STR;
 static int enable[SNDRV_CARDS] = SNDRV_DEFAULT_ENABLE_PNP;
 static int pcifix[SNDRV_CARDS] = {[0 ... (SNDRV_CARDS - 1)] = 255 };
+static int boot_devs;
 
-MODULE_PARM(index, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+module_param_array(index, int, boot_devs, 0444);
 MODULE_PARM_DESC(index, "Index value for " CARD_NAME " soundcard.");
 MODULE_PARM_SYNTAX(index, SNDRV_INDEX_DESC);
-MODULE_PARM(id, "1-" __MODULE_STRING(SNDRV_CARDS) "s");
+module_param_array(id, charp, boot_devs, 0444);
 MODULE_PARM_DESC(id, "ID string for " CARD_NAME " soundcard.");
 MODULE_PARM_SYNTAX(id, SNDRV_ID_DESC);
-MODULE_PARM(enable, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+module_param_array(enable, bool, boot_devs, 0444);
 MODULE_PARM_DESC(enable, "Enable " CARD_NAME " soundcard.");
 MODULE_PARM_SYNTAX(enable, SNDRV_ENABLE_DESC);
-MODULE_PARM(pcifix, "1-255i");
+module_param_array(pcifix, int, boot_devs, 0444);
 MODULE_PARM_DESC(pcifix, "Enable VIA-workaround for " CARD_NAME " soundcard.");
 MODULE_PARM_SYNTAX(pcifix,
 		   SNDRV_ENABLED
@@ -48,80 +49,72 @@
 MODULE_LICENSE("GPL");
 MODULE_DEVICES("{{Aureal Semiconductor Inc., Aureal Vortex Sound Processor}}");
 
-#ifndef MODULE
-/* format is: snd-mychip=enable,index,id */
-static int __init alsa_card_vortex_setup(char *str)
-{
-	static unsigned __initdata nr_dev = 0;
-
-	if (nr_dev >= SNDRV_CARDS)
-		return 0;
-	(void)(get_option(&str, &enable[nr_dev]) == 2 &&
-	       get_option(&str, &index[nr_dev]) == 2 &&
-	       get_id(&str, &id[nr_dev]) == 2);
-	nr_dev++;
-	return 1;
-}
-
-__setup("snd-au88x0=", alsa_card_vortex_setup);
-#endif				/* ifndef MODULE */
-
 MODULE_DEVICE_TABLE(pci, snd_vortex_ids);
 
-static void __devinit snd_vortex_workaround(struct pci_dev *vortex, int fix)
+static void vortex_fix_latency(struct pci_dev *vortex)
 {
-	struct pci_dev *via = NULL;
 	int rc;
-
-	/* autodetect if workarounds are required */
-	while ((via = pci_find_device(PCI_VENDOR_ID_VIA,
-				      PCI_DEVICE_ID_VIA_8365_1, via))) {
-		if (fix == 255) {
+	if (!(rc = pci_write_config_byte(vortex, 0x40, 0xff))) {
 			printk(KERN_INFO CARD_NAME
-			       ": detected VIA KT133/KM133. activating workaround...\n");
-			fix = 3;	// do latency and via bridge workaround
-		}
-		break;
+			       ": vortex latency is 0xff\n");
+	} else {
+		printk(KERN_WARNING CARD_NAME
+				": could not set vortex latency: pci error 0x%x\n", rc);
 	}
+}
 
-	/* do not do anything if autodetection was enabled and found no VIA */
-	if (fix == 255)
-		return;
+static void vortex_fix_agp_bridge(struct pci_dev *via)
+{
+	int rc;
+	u8 value;
 
-	/* fix vortex latency */
-	if (fix & 0x01) {
-		if (!(rc = pci_write_config_byte(vortex, 0x40, 0xff))) {
-			printk(KERN_INFO CARD_NAME
-			       ": vortex latency is 0xff\n");
-		} else {
-			printk(KERN_WARNING CARD_NAME
-			       ": could not set vortex latency: pci error 0x%x\n",
-			       rc);
-		}
+	/*
+	 * only set the bit (Extend PCI#2 Internal Master for
+	 * Efficient Handling of Dummy Requests) if the can
+	 * read the config and it is not already set
+	 */
+
+	if (!(rc = pci_read_config_byte(via, 0x42, &value))
+			&& ((value & 0x10)
+				|| !(rc = pci_write_config_byte(via, 0x42, value | 0x10)))) {
+		printk(KERN_INFO CARD_NAME
+				": bridge config is 0x%x\n", value | 0x10);
+	} else {
+		printk(KERN_WARNING CARD_NAME
+				": could not set vortex latency: pci error 0x%x\n", rc);
 	}
+}
 
-	/* fix via agp bridge */
-	if (via && (fix & 0x02)) {
-		u8 value;
-
-		/*
-		 * only set the bit (Extend PCI#2 Internal Master for
-		 * Efficient Handling of Dummy Requests) if the can
-		 * read the config and it is not already set
-		 */
-
-		if (!(rc = pci_read_config_byte(via, 0x42, &value))
-		    && ((value & 0x10)
-			|| !(rc =
-			     pci_write_config_byte(via, 0x42, value | 0x10)))) {
+static void __devinit snd_vortex_workaround(struct pci_dev *vortex, int fix)
+{
+	struct pci_dev *via;
 
-			printk(KERN_INFO CARD_NAME
-			       ": bridge config is 0x%x\n", value | 0x10);
-		} else {
-			printk(KERN_WARNING CARD_NAME
-			       ": could not set vortex latency: pci error 0x%x\n",
-			       rc);
+	/* autodetect if workarounds are required */
+	if (fix == 255) {
+		/* VIA KT133 */
+		via = pci_find_device(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_8365_1, NULL);
+		/* VIA Apollo */
+		if (via == NULL) {
+			via = pci_find_device(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_82C598_1, NULL);
+		}
+		/* AMD Irongate */
+		if (via == NULL) {
+			via = pci_find_device(PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_FE_GATE_7007, NULL);
 		}
+		if (via) {
+			printk(KERN_INFO CARD_NAME ": Activating latency workaround...\n");
+			vortex_fix_latency(vortex);
+			vortex_fix_agp_bridge(via);
+		}
+	} else {
+		if (fix & 0x1)
+			vortex_fix_latency(vortex);
+		if ((fix & 0x2) && (via = pci_find_device(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_8365_1, NULL)))
+			vortex_fix_agp_bridge(via);
+		if ((fix & 0x4) && (via = pci_find_device(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_82C598_1, NULL)))
+			vortex_fix_agp_bridge(via);
+		if ((fix & 0x8) && (via = pci_find_device(PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_FE_GATE_7007, NULL)))
+			vortex_fix_agp_bridge(via);
 	}
 }
 
@@ -370,7 +363,7 @@
 		return err;
 	}
 	// (7)
-	pci_set_drvdata(pci, chip);
+	pci_set_drvdata(pci, card);
 	dev++;
 	vortex_connect_default(chip, 1);
 	vortex_enable_int(chip);
@@ -380,16 +373,8 @@
 // destructor -- see "Destructor" sub-section
 static void __devexit snd_vortex_remove(struct pci_dev *pci)
 {
-	vortex_t *vortex = snd_magic_cast(vortex_t,
-					  pci_get_drvdata(pci), return);
-
-	if (vortex) {
-		// Release ALSA stuff.
-		snd_card_free(vortex->card);
-		// Free Vortex struct.
-		pci_set_drvdata(pci, NULL);
-	} else
-		printk("snd_vortex_remove called more than one time!\n");
+	snd_card_free(pci_get_drvdata(pci));
+	pci_set_drvdata(pci, NULL);
 }
 
 // pci_driver definition
@@ -403,16 +388,7 @@
 // initialization of the module
 static int __init alsa_card_vortex_init(void)
 {
-	int err;
-
-	if ((err = pci_module_init(&driver)) < 0) {
-#ifdef MODULE
-		printk(KERN_ERR "Aureal soundcard not found "
-		       "or device busy\n");
-#endif
-		return err;
-	}
-	return 0;
+	return pci_module_init(&driver);
 }
 
 // clean up the module
diff -Nru a/sound/pci/au88x0/au88x0.h b/sound/pci/au88x0/au88x0.h
--- a/sound/pci/au88x0/au88x0.h	2004-05-26 15:01:36 -07:00
+++ b/sound/pci/au88x0/au88x0.h	2004-05-26 15:01:36 -07:00
@@ -17,6 +17,7 @@
 #ifndef __SOUND_AU88X0_H
 #define __SOUND_AU88X0_H
 
+#ifdef __KERNEL__
 #include <sound/driver.h>
 #include <linux/init.h>
 #include <linux/pci.h>
@@ -28,6 +29,8 @@
 #include <sound/hwdep.h>
 #include <sound/ac97_codec.h>
 
+#endif
+
 #ifndef CHIP_AU8820
 #include "au88x0_eq.h"
 #include "au88x0_a3d.h"
@@ -69,20 +72,19 @@
 #define IRQ_MODEM	0x4000
 
 /* ADB Resource */
-#define VORTEX_RESOURCE_DMA		0x00000000
-#define VORTEX_RESOURCE_SRC		0x00000001
+#define VORTEX_RESOURCE_DMA	0x00000000
+#define VORTEX_RESOURCE_SRC	0x00000001
 #define VORTEX_RESOURCE_MIXIN	0x00000002
 #define VORTEX_RESOURCE_MIXOUT	0x00000003
-#define VORTEX_RESOURCE_A3D		0x00000004
+#define VORTEX_RESOURCE_A3D	0x00000004
 #define VORTEX_RESOURCE_LAST	0x00000005
 
 /* Check for SDAC bit in "Extended audio ID" AC97 register */
-#define VORTEX_IS_QUAD(x) ((x->codec == NULL) ?  0 : (x->codec->ext_id|0x80))
+#define VORTEX_IS_QUAD(x) ((x->codec == NULL) ?  0 : (x->codec->ext_id&0x80))
 /* Check if chip has bug. */
 #define IS_BAD_CHIP(x) (\
-	(x->rev < 3 && x->device == PCI_DEVICE_ID_AUREAL_VORTEX) || \
-	(x->rev < 0xfe && x->device == PCI_DEVICE_ID_AUREAL_VORTEX2) || \
-	(x->rev < 0xfe && x->device == PCI_DEVICE_ID_AUREAL_ADVANTAGE))
+	(x->rev == 0xfe && x->device == PCI_DEVICE_ID_AUREAL_VORTEX_2) || \
+	(x->rev == 0xfe && x->device == PCI_DEVICE_ID_AUREAL_ADVANTAGE))
 
 
 /* PCM devices */
diff -Nru a/sound/pci/au88x0/au88x0_a3d.c b/sound/pci/au88x0/au88x0_a3d.c
--- a/sound/pci/au88x0/au88x0_a3d.c	2004-05-26 15:01:36 -07:00
+++ b/sound/pci/au88x0/au88x0_a3d.c	2004-05-26 15:01:36 -07:00
@@ -617,6 +617,12 @@
 static void vortex_Vort3D_connect(vortex_t * v, int en)
 {
 	int i;
+	
+// Disable AU8810 routes, since they seem to be wrong (in au8810.h).
+#ifdef CHIP_AU8810
+	return;
+#endif
+	
 #if 1
 	/* Alloc Xtalk mixin resources */
 	v->mixxtlk[0] =
diff -Nru a/sound/pci/au88x0/au88x0_core.c b/sound/pci/au88x0/au88x0_core.c
--- a/sound/pci/au88x0/au88x0_core.c	2004-05-26 15:01:36 -07:00
+++ b/sound/pci/au88x0/au88x0_core.c	2004-05-26 15:01:36 -07:00
@@ -72,6 +72,7 @@
             into au88x0_pcm.c .
  06-06-2003 Buffer shifter bugfix. Mixer volume fix.
  07-12-2003 A3D routing finally fixed. Believed to be OK.
+ 25-03-2004 Many thanks to Claudia, for such valuable bug reports.
  
 */
 
@@ -772,7 +773,9 @@
 	return 1;
 }
 
- /*FIFO*/ static void
+ /*FIFO*/ 
+
+static void
 vortex_fifo_clearadbdata(vortex_t * vortex, int fifo, int x)
 {
 	for (x--; x >= 0; x--)
@@ -1345,31 +1348,29 @@
 	dma->nr_periods = count;
 	dma->sgbuf = sgbuf;
 
-	psize--;
-
 	dma->cfg0 = 0;
 	dma->cfg1 = 0;
 	switch (count) {
 		/* Four or more pages */
 	default:
 	case 4:
-		dma->cfg1 |= 0x88000000 | 0x44000000 | 0x30000000 | psize;
-		hwwrite(vortex->mmio, VORTEX_WTDMA_BUFBASE + (wtdma << 4),
+		dma->cfg1 |= 0x88000000 | 0x44000000 | 0x30000000 | (psize-1);
+		hwwrite(vortex->mmio, VORTEX_WTDMA_BUFBASE + (wtdma << 4) + 0xc,
 			snd_sgbuf_get_addr(sgbuf, psize * 3));
 		/* 3 pages */
 	case 3:
 		dma->cfg0 |= 0x12000000;
-		dma->cfg1 |= 0x80000000 | 0x40000000 | (psize << 0xc);
-		hwwrite(vortex->mmio, VORTEX_WTDMA_BUFBASE + (wtdma << 4),
+		dma->cfg1 |= 0x80000000 | 0x40000000 | ((psize-1) << 0xc);
+		hwwrite(vortex->mmio, VORTEX_WTDMA_BUFBASE + (wtdma << 4)  + 0x8,
 			snd_sgbuf_get_addr(sgbuf, psize * 2));
 		/* 2 pages */
 	case 2:
-		dma->cfg0 |= 0x88000000 | 0x44000000 | 0x10000000 | psize;
-		hwwrite(vortex->mmio, VORTEX_WTDMA_BUFBASE + (wtdma << 4),
+		dma->cfg0 |= 0x88000000 | 0x44000000 | 0x10000000 | (psize-1);
+		hwwrite(vortex->mmio, VORTEX_WTDMA_BUFBASE + (wtdma << 4) + 0x4,
 			snd_sgbuf_get_addr(sgbuf, psize));
 		/* 1 page */
 	case 1:
-		dma->cfg0 |= 0x80000000 | 0x40000000 | (psize << 0xc);
+		dma->cfg0 |= 0x80000000 | 0x40000000 | ((psize-1) << 0xc);
 		hwwrite(vortex->mmio, VORTEX_WTDMA_BUFBASE + (wtdma << 4),
 			snd_sgbuf_get_addr(sgbuf, 0));
 		break;
@@ -1575,11 +1576,11 @@
 	/* it looks like we are writing more than we need to...
 	 * if we write what we are supposed to it breaks things... */
 	hwwrite(vortex->mmio, VORTEX_ADB_SR, 0);
-	for (i = 0; i < VORTEX_ADB_RTBASE_SIZE; i++)
+	for (i = 0; i < VORTEX_ADB_RTBASE_COUNT; i++)
 		hwwrite(vortex->mmio, VORTEX_ADB_RTBASE + (i << 2),
 			hwread(vortex->mmio,
 			       VORTEX_ADB_RTBASE + (i << 2)) | ROUTE_MASK);
-	for (i = 0; i < VORTEX_ADB_CHNBASE_SIZE; i++) {
+	for (i = 0; i < VORTEX_ADB_CHNBASE_COUNT; i++) {
 		hwwrite(vortex->mmio, VORTEX_ADB_CHNBASE + (i << 2),
 			hwread(vortex->mmio,
 			       VORTEX_ADB_CHNBASE + (i << 2)) | ROUTE_MASK);
@@ -1922,6 +1923,9 @@
 	// Connect front channels through EQ.
 	vortex_connection_mix_adb(vortex, en, 0x11, mixers[0], ADB_EQIN(0));
 	vortex_connection_mix_adb(vortex, en, 0x11, mixers[1], ADB_EQIN(1));
+	/* Lower volume, since EQ has some gain. */
+	vortex_mix_setvolumebyte(vortex, mixers[0], 0);
+	vortex_mix_setvolumebyte(vortex, mixers[1], 0);
 	vortex_route(vortex, en, 0x11, ADB_EQOUT(0), ADB_CODECOUT(0));
 	vortex_route(vortex, en, 0x11, ADB_EQOUT(1), ADB_CODECOUT(1));
 
@@ -2007,9 +2011,11 @@
 }
 
 /* Default Connections  */
+static int
+vortex_adb_allocroute(vortex_t * vortex, int dma, int nr_ch, int dir, int type);
+
 static void vortex_connect_default(vortex_t * vortex, int en)
 {
-	// FIXME: check if checkout was succesful.
 	// Connect AC97 codec.
 	vortex->mixplayb[0] = vortex_adb_checkinout(vortex, vortex->fixed_res, en,
 				  VORTEX_RESOURCE_MIXOUT);
@@ -2044,7 +2050,7 @@
 #ifndef CHIP_AU8810
 	vortex_wt_connect(vortex, en);
 #endif
-	// A3D (crosstalk canceler and A3D slices).
+	// A3D (crosstalk canceler and A3D slices). AU8810 disabled for now.
 #ifndef CHIP_AU8820
 	vortex_Vort3D_connect(vortex, en);
 #endif
@@ -2053,18 +2059,7 @@
 	// Connect DSP interface for SQ3500 turbo (not here i think...)
 
 	// Connect AC98 modem codec
- 	
- 	/* Fast Play Workaround. Revision 0xFE does not seem to need it. */
- 	printk(KERN_INFO "vortex: revision = 0x%x, device = %d\n", vortex->rev, vortex->device);
- 	if (IS_BAD_CHIP(vortex)) {
- 		printk(KERN_INFO "vortex: Erratum workaround enabled.\n");
- #ifndef CHIP_AU8820
- 		vortex->fixed_res[VORTEX_RESOURCE_DMA] = 0x00000001;
- #endif
- 		// Channel swapping workaround. We are nuking registers somewhere, or
- 		// its a hardware bug.
- 		vortex->fixed_res[VORTEX_RESOURCE_SRC] = 0x00000001;
- 	}
+	
 }
 
 /*
@@ -2081,7 +2076,7 @@
 {
 	stream_t *stream;
 	int i, en;
-
+	
 	if ((nr_ch == 3)
 	    || ((dir == SNDRV_PCM_STREAM_CAPTURE) && (nr_ch > 2)))
 		return -EBUSY;
@@ -2105,7 +2100,6 @@
 	stream->dir = dir;
 	stream->type = type;
 
-	// FIXME: check for success of checkout or checkin.
 	/* PLAYBACK ROUTES. */
 	if (dir == SNDRV_PCM_STREAM_PLAYBACK) {
 		int src[4], mix[4], ch_top;
@@ -2165,8 +2159,7 @@
 		for (i = 0; i < nr_ch; i++) {
 			if (stream->type == VORTEX_PCM_ADB) {
 				vortex_connection_adbdma_src(vortex, en,
-							     src[nr_ch - 1], 
-							     //src[0], 
+							     src[nr_ch - 1],
 							     dma,
 							     src[i]);
 				vortex_connection_src_mixin(vortex, en,
@@ -2188,7 +2181,7 @@
 #ifndef CHIP_AU8820
 			if (stream->type == VORTEX_PCM_A3D) {
 				vortex_connection_adbdma_src(vortex, en,
-							     src[0], 
+							     src[nr_ch - 1], 
 								 dma,
 							     src[i]);
 				vortex_route(vortex, en, 0x11, ADB_SRCOUT(src[i]), ADB_A3DIN(a3d));
@@ -2237,7 +2230,7 @@
 				     ADB_SPDIFOUT(1));
 		}
 #endif
-		/* CAPTURE ROUTES. */
+	/* CAPTURE ROUTES. */
 	} else {
 		int src[2], mix[2];
 
@@ -2271,7 +2264,7 @@
 			vortex_connection_mixin_mix(vortex, en,
 						    MIX_CAPT(1), mix[0], 0);
 			vortex_connection_src_adbdma(vortex, en,
-						     src[nr_ch - 1],
+						     src[0],
 						     src[0], dma);
 		} else {
 			vortex_connection_mixin_mix(vortex, en,
@@ -2279,7 +2272,7 @@
 			vortex_connection_mix_src(vortex, en, 0x11, mix[1],
 						  src[1]);
 			vortex_connection_src_src_adbdma(vortex, en,
-							 src[0], src[0],
+							 src[1], src[0],
 							 src[1], dma);
 		}
 	}
diff -Nru a/sound/pci/au88x0/au88x0_eq.c b/sound/pci/au88x0/au88x0_eq.c
--- a/sound/pci/au88x0/au88x0_eq.c	2004-05-26 15:01:36 -07:00
+++ b/sound/pci/au88x0/au88x0_eq.c	2004-05-26 15:01:36 -07:00
@@ -710,11 +710,13 @@
 static void vortex_Eqlzr_SetBypass(vortex_t * vortex, long bp)
 {
 	eqlzr_t *eq = &(vortex->eq);
-
+	
 	if ((eq->this28) && (bp == 0)) {
+		/* EQ enabled */
 		vortex_Eqlzr_SetAllBandsFromActiveCoeffSet(vortex);
 		vortex_EqHw_SetBypassGain(vortex, eq->this08, eq->this08);
 	} else {
+		/* EQ disabled. */
 		vortex_EqHw_SetLeftGainsTarget(vortex, (u16 *) (eq->this14));
 		vortex_EqHw_SetRightGainsTarget(vortex, (u16 *) (eq->this14));
 		vortex_EqHw_SetBypassGain(vortex, eq->this0c, eq->this0c);
diff -Nru a/sound/pci/au88x0/au88x0_game.c b/sound/pci/au88x0/au88x0_game.c
--- a/sound/pci/au88x0/au88x0_game.c	2004-05-26 15:01:35 -07:00
+++ b/sound/pci/au88x0/au88x0_game.c	2004-05-26 15:01:35 -07:00
@@ -42,8 +42,6 @@
 
 #define VORTEX_GAME_DWAIT	20	/* 20 ms */
 
-static struct gameport gameport;
-
 static unsigned char vortex_game_read(struct gameport *gameport)
 {
 	vortex_t *vortex = gameport->driver;
@@ -98,8 +96,10 @@
 
 static int vortex_gameport_register(vortex_t * vortex)
 {
-	vortex->gameport = &gameport;
-
+	if ((vortex->gameport = snd_kcalloc(sizeof(struct gameport), GFP_KERNEL)) == NULL) {
+		return -1;
+	};
+	
 	vortex->gameport->driver = vortex;
 	vortex->gameport->fuzz = 64;
 
@@ -118,8 +118,10 @@
 
 static int vortex_gameport_unregister(vortex_t * vortex)
 {
-	if (vortex->gameport != NULL)
+	if (vortex->gameport != NULL) {
 		gameport_unregister_port(vortex->gameport);
+		kfree(vortex->gameport);
+	}
 	return 0;
 }
 
diff -Nru a/sound/pci/au88x0/au88x0_pcm.c b/sound/pci/au88x0/au88x0_pcm.c
--- a/sound/pci/au88x0/au88x0_pcm.c	2004-05-26 15:01:36 -07:00
+++ b/sound/pci/au88x0/au88x0_pcm.c	2004-05-26 15:01:36 -07:00
@@ -18,8 +18,7 @@
  * Vortex PCM ALSA driver.
  *
  * Supports ADB and WT DMA. Unfortunately, WT channels do not run yet.
- * It remains stuck,and DMA transfers do not happen.
- *
+ * It remains stuck,and DMA transfers do not happen. 
  */
 
 #include <sound/driver.h>
@@ -124,7 +123,7 @@
 	vortex_t *vortex = snd_pcm_substream_chip(substream);
 	snd_pcm_runtime_t *runtime = substream->runtime;
 	int err;
-
+	
 	/* Force equal size periods */
 	if ((err =
 	     snd_pcm_hw_constraint_integer(runtime,
@@ -232,12 +231,13 @@
 	}
 #ifndef CHIP_AU8810
 	else {
-		/*if (stream != NULL)
+		/* if (stream != NULL)
 		   vortex_wt_allocroute(chip, substream->number, 0); */
 		vortex_wt_allocroute(chip, substream->number,
 				     params_channels(hw_params));
 		stream = substream->runtime->private_data =
 		    &chip->dma_wt[substream->number];
+		stream->dma = substream->number;
 		stream->substream = substream;
 		vortex_wtdma_setbuffers(chip, substream->number, sgbuf,
 					params_period_bytes(hw_params),
@@ -325,7 +325,7 @@
 		break;
 	case SNDRV_PCM_TRIGGER_STOP:
 		// do something to stop the PCM engine
-		//printk(KERN_INFO "vortex: stop %d\n", dma)
+		//printk(KERN_INFO "vortex: stop %d\n", dma);
 		stream->fifo_enabled = 0;
 		if (VORTEX_PCM_TYPE(substream->pcm) != VORTEX_PCM_WT)
 			vortex_adbdma_pausefifo(chip, dma);
@@ -502,18 +502,13 @@
 	if (idx == VORTEX_PCM_ADB)
 		snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_CAPTURE,
 				&snd_vortex_playback_ops);
-
+	
 	/* pre-allocation of Scatter-Gather buffers */
 	
 	snd_pcm_lib_preallocate_pages_for_all(pcm, SNDRV_DMA_TYPE_DEV_SG,
-										  snd_dma_pci_data(chip->pci_dev),
-										  0x10000, 0x10000);
-	
-	// The above should be used, as soon as ALSA gets updated.
-	/*
-	snd_pcm_lib_preallocate_sg_pages_for_all(chip->pci_dev, pcm,
-						 0x10000, 0x10000);
-	*/
+					      snd_dma_pci_data(chip->pci_dev),
+					      0x10000, 0x10000);
+
 	if (VORTEX_PCM_TYPE(pcm) == VORTEX_PCM_SPDIF) {
 		snd_kcontrol_t *kcontrol;
 
diff -Nru a/sound/pci/au88x0/au88x0_synth.c b/sound/pci/au88x0/au88x0_synth.c
--- a/sound/pci/au88x0/au88x0_synth.c	2004-05-26 15:01:36 -07:00
+++ b/sound/pci/au88x0/au88x0_synth.c	2004-05-26 15:01:36 -07:00
@@ -36,6 +36,7 @@
 
 /* WT */
 
+/* Put 2 WT channels together for one stereo interlaced channel. */
 static void vortex_wt_setstereo(vortex_t * vortex, u32 wt, u32 stereo)
 {
 	int temp;
@@ -47,6 +48,7 @@
 	hwwrite(vortex->mmio, WT_STEREO(wt), temp);
 }
 
+/* Join to mixdown route. */
 static void vortex_wt_setdsout(vortex_t * vortex, u32 wt, int en)
 {
 	int temp;
@@ -60,7 +62,7 @@
 	hwwrite(vortex->mmio, WT_DSREG((wt >= 0x20) ? 1 : 0), temp);
 }
 
-// WT routing is still a mistery.
+/* Setup WT route. */
 static int vortex_wt_allocroute(vortex_t * vortex, int wt, int nr_ch)
 {
 	wt_voice_t *voice = &(vortex->wt_voice[wt]);
@@ -68,13 +70,15 @@
 
 	//FIXME: WT audio routing.
 	if (nr_ch) {
-		vortex_fifo_wtinitialize(vortex, wt, 2);
+		vortex_fifo_wtinitialize(vortex, wt, 1);
 		vortex_fifo_setwtvalid(vortex, wt, 1);
 		vortex_wt_setstereo(vortex, wt, nr_ch - 1);
 	} else
 		vortex_fifo_setwtvalid(vortex, wt, 0);
-
-	vortex_wt_setdsout(vortex, wt, 0);
+	
+	/* Set mixdown mode. */
+	vortex_wt_setdsout(vortex, wt, 1);
+	/* Set other parameter registers. */
 	hwwrite(vortex->mmio, WT_SRAMP(0), 0x880000);
 	//hwwrite(vortex->mmio, WT_GMODE(0), 0xffffffff);
 #ifdef CHIP_AU8830
@@ -87,7 +91,7 @@
 
 	temp = hwread(vortex->mmio, WT_PARM(wt, 3));
 	printk("vortex: WT PARM3: %x\n", temp);
-	hwwrite(vortex->mmio, WT_PARM(wt, 3), temp);
+	//hwwrite(vortex->mmio, WT_PARM(wt, 3), temp);
 
 	hwwrite(vortex->mmio, WT_DELAY(wt, 0), 0);
 	hwwrite(vortex->mmio, WT_DELAY(wt, 1), 0);
@@ -106,6 +110,7 @@
 	return 0;
 }
 
+
 static void vortex_wt_connect(vortex_t * vortex, int en)
 {
 	int i, ii, mix;
@@ -129,15 +134,12 @@
 				     ADB_WTOUT(i, ii + 0x20), ADB_MIXIN(mix));
 
 			vortex_connection_mixin_mix(vortex, en, mix,
-						    vortex->mixplayb[ii %
-								     2], 0);
+						    vortex->mixplayb[ii % 2], 0);
 			if (VORTEX_IS_QUAD(vortex))
 				vortex_connection_mixin_mix(vortex, en,
 							    mix,
-							    vortex->
-							    mixplayb[2 +
-								     (ii %
-								      2)], 0);
+							    vortex->mixplayb[2 +
+								     (ii % 2)], 0);
 		}
 	}
 	for (i = 0; i < NR_WT; i++) {
diff -Nru a/sound/pci/azt3328.c b/sound/pci/azt3328.c
--- a/sound/pci/azt3328.c	2004-05-26 15:01:36 -07:00
+++ b/sound/pci/azt3328.c	2004-05-26 15:01:36 -07:00
@@ -98,13 +98,13 @@
 #include <linux/delay.h>
 #include <linux/slab.h>
 #include <linux/gameport.h>
+#include <linux/moduleparam.h>
 #include <sound/core.h>
 #include <sound/control.h>
 #include <sound/pcm.h>
 #include <sound/rawmidi.h>
 #include <sound/mpu401.h>
 #include <sound/opl3.h>
-#define SNDRV_GET_ID
 #include <sound/initval.h>
 #include "azt3328.h"
 
@@ -166,18 +166,19 @@
 #ifdef SUPPORT_JOYSTICK
 static int joystick[SNDRV_CARDS];
 #endif
+static int boot_devs;
 
-MODULE_PARM(index, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+module_param_array(index, int, boot_devs, 0444);
 MODULE_PARM_DESC(index, "Index value for AZF3328 soundcard.");
 MODULE_PARM_SYNTAX(index, SNDRV_INDEX_DESC);
-MODULE_PARM(id, "1-" __MODULE_STRING(SNDRV_CARDS) "s");
+module_param_array(id, charp, boot_devs, 0444);
 MODULE_PARM_DESC(id, "ID string for AZF3328 soundcard.");
 MODULE_PARM_SYNTAX(id, SNDRV_ID_DESC);
-MODULE_PARM(enable, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+module_param_array(enable, bool, boot_devs, 0444);
 MODULE_PARM_DESC(enable, "Enable AZF3328 soundcard.");
 MODULE_PARM_SYNTAX(enable, SNDRV_INDEX_DESC);
 #ifdef SUPPORT_JOYSTICK
-MODULE_PARM(joystick, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+module_param_array(joystick, bool, boot_devs, 0444);
 MODULE_PARM_DESC(joystick, "Enable joystick for AZF3328 soundcard.");
 MODULE_PARM_SYNTAX(joystick, SNDRV_BOOLEAN_FALSE_DESC);
 #endif
@@ -1267,6 +1268,10 @@
         if (chip->irq < 0)
                 goto __end_hw;
 
+	/* reset (close) mixer */
+	snd_azf3328_mixer_set_mute(chip, IDX_MIXER_PLAY_MASTER, 1); /* first mute master volume */
+	snd_azf3328_mixer_write(chip, IDX_MIXER_RESET, 0x0, WORD_VALUE);
+
         /* interrupt setup - mask everything */
 	/* FIXME */
 
@@ -1540,7 +1545,7 @@
 	snd_azf3328_config_joystick(chip, joystick[dev]);
 #endif
 
-	pci_set_drvdata(pci, chip);
+	pci_set_drvdata(pci, card);
 	dev++;
 
 	snd_azf3328_dbgcallleave();
@@ -1549,16 +1554,8 @@
 
 static void __devexit snd_azf3328_remove(struct pci_dev *pci)
 {
-        azf3328_t *chip = snd_magic_cast(azf3328_t, pci_get_drvdata(pci), return);
-	
 	snd_azf3328_dbgcallenter();
-
-	/* reset (close) mixer */
-	snd_azf3328_mixer_set_mute(chip, IDX_MIXER_PLAY_MASTER, 1); /* first mute master volume */
-	snd_azf3328_mixer_write(chip, IDX_MIXER_RESET, 0x0, WORD_VALUE);
-
-        if (chip)
-		snd_card_free(chip->card);
+	snd_card_free(pci_get_drvdata(pci));
 	pci_set_drvdata(pci, NULL);
 	snd_azf3328_dbgcallleave();
 }
@@ -1573,18 +1570,10 @@
 static int __init alsa_card_azf3328_init(void)
 {
 	int err;
-	
 	snd_azf3328_dbgcallenter();
-
-	if ((err = pci_module_init(&driver)) < 0)
-	{
-#ifdef MODULE
-		printk(KERN_ERR "azt3328: no AZF3328 based soundcards found or device busy\n");
-#endif
-		return err;
-	}
+	err = pci_module_init(&driver);
 	snd_azf3328_dbgcallleave();
-	return 0;
+	return err;
 }
 
 static void __exit alsa_card_azf3328_exit(void)
@@ -1596,31 +1585,3 @@
 
 module_init(alsa_card_azf3328_init)
 module_exit(alsa_card_azf3328_exit)
-
-#ifndef MODULE
-
-/* format is: snd-azf3328=enable,index,id,joystick */
-
-static int __init alsa_card_azf3328_setup(char *str)
-{
-	static unsigned __initdata nr_dev = 0;
-
-	snd_azf3328_dbgcallenter();
-
-	if (nr_dev >= SNDRV_CARDS)
-		return 0;
-	(void)(get_option(&str,&enable[nr_dev]) == 2 &&
-	       get_option(&str,&index[nr_dev]) == 2 &&
-	       get_id(&str,&id[nr_dev]) == 2
-#ifdef SUPPORT_JOYSTICK
-	       && get_option(&str,&joystick[nr_dev]) == 2
-#endif
-	       );
-	nr_dev++;
-	snd_azf3328_dbgcallleave();
-	return 1;
-}
-
-__setup("snd-azt3328=", alsa_card_azf3328_setup);
-
-#endif /* ifndef MODULE */
diff -Nru a/sound/pci/bt87x.c b/sound/pci/bt87x.c
--- a/sound/pci/bt87x.c	2004-05-26 15:01:36 -07:00
+++ b/sound/pci/bt87x.c	2004-05-26 15:01:36 -07:00
@@ -26,13 +26,13 @@
 #include <linux/interrupt.h>
 #include <linux/pci.h>
 #include <linux/slab.h>
+#include <linux/moduleparam.h>
 #include <asm/io.h>
 #include <asm/bitops.h>
 #include <sound/core.h>
 #include <sound/pcm.h>
 #include <sound/pcm_params.h>
 #include <sound/control.h>
-#define SNDRV_GET_ID
 #include <sound/initval.h>
 
 MODULE_AUTHOR("Clemens Ladisch <clemens@ladisch.de>");
@@ -46,17 +46,18 @@
 static char *id[SNDRV_CARDS] = SNDRV_DEFAULT_STR;	/* ID for this card */
 static int enable[SNDRV_CARDS] = SNDRV_DEFAULT_ENABLE_PNP;	/* Enable this card */
 static int digital_rate[SNDRV_CARDS] = { [0 ... (SNDRV_CARDS-1)] = 0 }; /* digital input rate */
+static int boot_devs;
 
-MODULE_PARM(index, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+module_param_array(index, int, boot_devs, 0444);
 MODULE_PARM_DESC(index, "Index value for Bt87x soundcard");
 MODULE_PARM_SYNTAX(index, SNDRV_INDEX_DESC);
-MODULE_PARM(id, "1-" __MODULE_STRING(SNDRV_CARDS) "s");
+module_param_array(id, charp, boot_devs, 0444);
 MODULE_PARM_DESC(id, "ID string for Bt87x soundcard");
 MODULE_PARM_SYNTAX(id, SNDRV_ID_DESC);
-MODULE_PARM(enable, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+module_param_array(enable, bool, boot_devs, 0444);
 MODULE_PARM_DESC(enable, "Enable Bt87x soundcard");
 MODULE_PARM_SYNTAX(enable, SNDRV_ENABLE_DESC);
-MODULE_PARM(digital_rate, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+module_param_array(digital_rate, int, boot_devs, 0444);
 MODULE_PARM_DESC(digital_rate, "Digital input rate for Bt87x soundcard");
 MODULE_PARM_SYNTAX(digital_rate, SNDRV_ENABLED);
 
@@ -808,7 +809,7 @@
 	if (err < 0)
 		goto _error;
 
-	pci_set_drvdata(pci, chip);
+	pci_set_drvdata(pci, card);
 	++dev;
 	return 0;
 
@@ -819,9 +820,7 @@
 
 static void __devexit snd_bt87x_remove(struct pci_dev *pci)
 {
-	bt87x_t *chip = snd_magic_cast(bt87x_t, pci_get_drvdata(pci), return);
-	if (chip)
-		snd_card_free(chip->card);
+	snd_card_free(pci_get_drvdata(pci));
 	pci_set_drvdata(pci, NULL);
 }
 
@@ -851,16 +850,7 @@
 
 static int __init alsa_card_bt87x_init(void)
 {
-	int err;
-
-	err = pci_module_init(&driver);
-	if (err < 0) {
-#ifdef MODULE
-		printk(KERN_ERR "Bt87x soundcard not found or device busy\n");
-#endif
-		return err;
-	}
-	return 0;
+	return pci_module_init(&driver);
 }
 
 static void __exit alsa_card_bt87x_exit(void)
@@ -870,24 +860,3 @@
 
 module_init(alsa_card_bt87x_init)
 module_exit(alsa_card_bt87x_exit)
-
-#ifndef MODULE
-
-/* format is: snd-bt87x=enable,index,id */
-
-static int __init alsa_card_bt87x_setup(char *str)
-{
-	static unsigned __initdata nr_dev = 0;
-
-	if (nr_dev >= SNDRV_CARDS)
-		return 0;
-	(void)(get_option(&str,&enable[nr_dev]) == 2 &&
-	       get_option(&str,&index[nr_dev]) == 2 &&
-	       get_id(&str,&id[nr_dev]) == 2);
-	nr_dev++;
-	return 1;
-}
-
-__setup("snd-bt87x=", alsa_card_bt87x_setup);
-
-#endif /* ifndef MODULE */
diff -Nru a/sound/pci/cmipci.c b/sound/pci/cmipci.c
--- a/sound/pci/cmipci.c	2004-05-26 15:01:36 -07:00
+++ b/sound/pci/cmipci.c	2004-05-26 15:01:36 -07:00
@@ -20,10 +20,6 @@
 /* Does not work. Warning may block system in capture mode */
 /* #define USE_VAR48KRATE */
 
-/* Define this if you want soft ac3 encoding */
-#define DO_SOFT_AC3
-#define USE_AES_IEC958
-
 #include <sound/driver.h>
 #include <asm/io.h>
 #include <linux/delay.h>
@@ -32,6 +28,7 @@
 #include <linux/pci.h>
 #include <linux/slab.h>
 #include <linux/gameport.h>
+#include <linux/moduleparam.h>
 #include <sound/core.h>
 #include <sound/info.h>
 #include <sound/control.h>
@@ -41,7 +38,6 @@
 #include <sound/opl3.h>
 #include <sound/sb.h>
 #include <sound/asoundef.h>
-#define SNDRV_GET_ID
 #include <sound/initval.h>
 
 MODULE_AUTHOR("Takashi Iwai <tiwai@suse.de>");
@@ -62,35 +58,31 @@
 static int enable[SNDRV_CARDS] = SNDRV_DEFAULT_ENABLE_PNP;	/* Enable switches */
 static long mpu_port[SNDRV_CARDS];
 static long fm_port[SNDRV_CARDS];
-#ifdef DO_SOFT_AC3
 static int soft_ac3[SNDRV_CARDS] = {[0 ... (SNDRV_CARDS-1)]=1};
-#endif
 #ifdef SUPPORT_JOYSTICK
 static int joystick_port[SNDRV_CARDS];
 #endif
+static int boot_devs;
 
-MODULE_PARM(index, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+module_param_array(index, int, boot_devs, 0444);
 MODULE_PARM_DESC(index, "Index value for C-Media PCI soundcard.");
 MODULE_PARM_SYNTAX(index, SNDRV_INDEX_DESC);
-MODULE_PARM(id, "1-" __MODULE_STRING(SNDRV_CARDS) "s");
+module_param_array(id, charp, boot_devs, 0444);
 MODULE_PARM_DESC(id, "ID string for C-Media PCI soundcard.");
 MODULE_PARM_SYNTAX(id, SNDRV_ID_DESC);
-MODULE_PARM(enable, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+module_param_array(enable, bool, boot_devs, 0444);
 MODULE_PARM_DESC(enable, "Enable C-Media PCI soundcard.");
 MODULE_PARM_SYNTAX(enable, SNDRV_ENABLE_DESC);
-MODULE_PARM(mpu_port, "1-" __MODULE_STRING(SNDRV_CARDS) "l");
+module_param_array(mpu_port, long, boot_devs, 0444);
 MODULE_PARM_DESC(mpu_port, "MPU-401 port.");
 MODULE_PARM_SYNTAX(mpu_port, SNDRV_ENABLED ",allows:{{0},{0x330},{0x320},{0x310},{0x300}},dialog:list");
-MODULE_PARM(fm_port, "1-" __MODULE_STRING(SNDRV_CARDS) "l");
+module_param_array(fm_port, long, boot_devs, 0444);
 MODULE_PARM_DESC(fm_port, "FM port.");
 MODULE_PARM_SYNTAX(fm_port, SNDRV_ENABLED ",allows:{{0},{0x388},{0x3c8},{0x3e0},{0x3e8}},dialog:list");
-#ifdef DO_SOFT_AC3
-MODULE_PARM(soft_ac3, "1-" __MODULE_STRING(SNDRV_CARDS) "l");
+module_param_array(soft_ac3, bool, boot_devs, 0444);
 MODULE_PARM_DESC(soft_ac3, "Sofware-conversion of raw SPDIF packets (model 033 only).");
-MODULE_PARM_SYNTAX(soft_ac3, SNDRV_ENABLED "," SNDRV_BOOLEAN_TRUE_DESC);
-#endif
 #ifdef SUPPORT_JOYSTICK
-MODULE_PARM(joystick_port, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+module_param_array(joystick_port, int, boot_devs, 0444);
 MODULE_PARM_DESC(joystick_port, "Joystick port address.");
 MODULE_PARM_SYNTAX(joystick_port, SNDRV_ENABLED ",allows:{{0},{1},{0x200},{0x201}},dialog:list");
 #endif
@@ -426,7 +418,6 @@
 	unsigned int is_dac;		/* is dac? */
 	int bytes_per_frame;
 	int shift;
-	int ac3_shift;	/* extra shift: 1 on soft ac3 mode */
 };
 
 /* mixer elements toggled/resumed during ac3 playback */
@@ -472,10 +463,6 @@
 
 	unsigned int dig_status;
 	unsigned int dig_pcm_status;
-#ifdef USE_AES_IEC958
-	snd_ctl_elem_value_t *spdif_channel;
-#endif
-	snd_kcontrol_t *spdif_pcm_ctl;
 
 	snd_pcm_hardware_t *hw_info[3]; /* for playbacks */
 
@@ -784,8 +771,6 @@
 	/* buffer and period sizes in frame */
 	rec->dma_size = runtime->buffer_size << rec->shift;
 	rec->period_size = runtime->period_size << rec->shift;
-	rec->dma_size <<= rec->ac3_shift;
-	rec->period_size <<= rec->ac3_shift;
 	if (runtime->channels > 2) {
 		/* multi-channels */
 		rec->dma_size = (rec->dma_size * runtime->channels) / 2;
@@ -911,7 +896,6 @@
 	ptr = snd_cmipci_read(cm, reg) - rec->offset;
 	ptr = bytes_to_frames(substream->runtime, ptr);
 #endif
-	ptr >>= rec->ac3_shift;
 	if (substream->runtime->channels > 2)
 		ptr = (ptr * 2) / substream->runtime->channels;
 	return ptr;
@@ -953,358 +937,6 @@
 	return snd_cmipci_pcm_pointer(cm, &cm->channel[CM_CH_CAPT], substream);
 }
 
-#ifdef DO_SOFT_AC3
-/*
- * special tricks for soft ac3 transfer:
- *
- * we compose an iec958 subframe from 16bit ac3 sample and
- * write the raw subframe via 32bit data mode.
- */
-
-# ifndef USE_AES_IEC958
-
-/* find parity for bit 4~30 */
-static unsigned int parity(unsigned int data)
-{
-	unsigned int parity = 0;
-	int counter = 4;
-
-	data >>= 4;	/* start from bit 4 */
-	while (counter <= 30) {
-		if (data & 1)
-			parity++;
-		data >>= 1;
-		counter++;
-	}
-	return parity & 1;
-}
-
-/*
- * compose 32bit iec958 subframe with non-audio data.
- * bit 0-3  = preamble
- *     4-7  = aux (=0)
- *     8-27 = data (12-27 for 16bit)
- *     28   = validity (=0)
- *     29   = user data (=0)
- *     30   = channel status
- *     31   = parity
- *
- * channel status is assumed as consumer, non-audio
- * thus all 0 except bit 1
- */
-inline static u32 convert_ac3_32bit(cmipci_t *cm, u32 val)
-{
-	u32 data = (u32)val << 12;
-
-	if (cm->spdif_counter == 2 || cm->spdif_counter == 3) /* bit 1 */
-		data |= 0x40000000;	/* indicate AC-3 raw data */
-	if (parity(data))		/* parity bit 4-30 */
-		data |= 0x80000000;
-	if (cm->spdif_counter == 0)
-		data |= 3;		/* preamble 'M' */
-	else if (cm->spdif_counter & 1)
-		data |= 5;		/* odd, 'W' */
-	else
-		data |= 9;		/* even, 'M' */
-
-	cm->spdif_counter++;
-	if (cm->spdif_counter == 384)
-		cm->spdif_counter = 0;
-
-	return data;
-}
-
-# else  /* if USE_AES_IEC958 */
-
-/*
- * The bitstream handling
- */
-typedef struct iec958_stru_bitstream {
-	u32 *data;		/* Holds the current position */
-	u32  left;		/* Bits left in current 32bit frame */
-	u32  word;		/* The 32bit frame of the current position */
-	u32  bits;		/* All bits together */
-	int   err;		/* Error condition */
-} iec958_bitstream_t ;
-
-static iec958_bitstream_t bs;
-
-/* Initialize ptr on the buffer */
-static void iec958_init_bitstream(u8 *buf, u32 size)
-{
-	bs.data = (u32 *)buf;		/* Set initial position */
-	bs.word = *bs.data;		/* The first 32bit frame */
-	bs.left = 32;			/* has exactly 32bits */
-	bs.bits = size;
-	bs.err = 0;
-}
-
-/* Remove ptr on the buffer */
-static void iec958_clear_bitstream(void)
-{
-	bs.data = NULL;
-	bs.left = 0;
-	bs.err = 0;
-}
-
-/* Get bits from bitstream (max 32) */
-static inline u32 iec958_getbits(u32 bits)
-{
-	u32 res;
-
-	if (bs.bits < bits) {
-		bits = bs.bits;
-		bs.err = 1;
-	}
-	if (bits > 32) {
-		bits = 32;
-		bs.err = 1;
-	}
-	bs.bits -= bits;
-
-#  ifdef WORDS_BIGENDIAN
-	if (bits < bs.left) {		/* Within 32bit frame */
-		res = (bs.word << (32 - bs.left)) >> (32 - bits);
-		bs.left -= bits;
-		goto out;
-	}				/* We may cross the frame boundary */
-	res   = (bs.word << (32 - bs.left)) >> (32 - bs.left);
-	bits -= bs.left;
-
-	bs.word = *(++bs.data);		/* Next 32bit frame */
-
-	if (bits)			/* Add remaining bits, if any */
-		res = (res << bits) | (bs.word >> (32 - bits));
-
-#  else  /* not WORDS_BIGENDIAN */
-
-	if (bits < bs.left) {		/* Within 32bit frame */
-		res = (bs.word << (32 - bits)) >> (32 - bits);
-		bs.word >>= bits;
-		bs.left -= bits;
-		goto out;
-	}				/* We may cross the frame boundary */
-	res   = bs.word;
-	bits -= bs.left;
-
-	bs.word = *(++bs.data);		/* Next 32bit frame */
-
-	if (bits) {			/* Add remaining bits, if any */
-		res = res | (((bs.word << (32 - bits)) >> (32 - bits)) << bits);
-		bs.word >>= bits;
-	}
-#  endif /* not WORDS_BIGENDIAN */
-
-	bs.left = (32 - bits);
-out:
-	return res;
-}
-
-static inline u32 iec958_bits_avail(void)
-{
-	return bs.bits;
-}
-
-static inline int iec958_error(void)
-{
-	return bs.err;
-}
-
-/*
- * Determine parity for time slots 4 upto 30
- * to be sure that bit 4 upt 31 will carry
- * an even number of ones and zeros.
- */
-static u32 iec958_parity(u32 data)
-{
-	u32 parity = 0;
-	int counter = 4;
-
-	data >>= 4;     /* start from bit 4 */
-	while (counter++ <= 30) {
-		if (data & 0x00000001)
-			parity++;
-		data >>= 1;
-	}
-	return (parity & 0x00000001);
-}
-
-/*
- * Compose 32bit iec958 subframe, two sub frames
- * build one frame with two channels.
- *
- * bit 0-3  = preamble
- *     4-7  = AUX (=0)
- *     8-27 = data (12-27 for 16bit, 8-27 for 20bit, and 24bit without AUX)
- *     28   = validity (0 for valid data, else 'in error')
- *     29   = user data (0)
- *     30   = channel status (24 bytes for 192 frames)
- *     31   = parity
- */
-
-static inline u32 iec958_subframe(cmipci_t *cm, snd_ctl_elem_value_t * ucontrol)
-{
-	u32 data;
-	u32 byte = cm->spdif_counter >> 4;
-	u32 mask = 1 << ((cm->spdif_counter >> 1) - (byte << 3));
-	u8 * status = ucontrol->value.iec958.status;
-
-	if (status[2] & IEC958_AES2_PRO_SBITS_24) {
-		/* Does this work for LE systems ??? */
-		if (status[2] & IEC958_AES2_PRO_WORDLEN_24_20) {
-			data = iec958_getbits(24);
-			data <<= 4;
-		} else {
-			data = iec958_getbits(20);
-			data <<= 8;
-		}
-	} else {
-		if (status[2] & IEC958_AES2_PRO_WORDLEN_24_20) {
-			/* Does this work for LE systems ??? */
-			data = iec958_getbits(20);
-			data <<= 8;
-		} else {
-			data = iec958_getbits(16);
-			data <<= 12;
-		}
-	}
-
-	/*
-	 * Set one of the 192 bits of the channel status (AES3 and higher)
-	 */
-	if (status[byte] & mask)
-		data |= 0x40000000;
-
-	if (iec958_parity(data))	/* parity bit 4-30 */
-		data |= 0x80000000;
-
-	/* Preamble */
-	if      (!cm->spdif_counter)
-		data |= 0x03;		/* Block start, 'Z' */
-	else if (cm->spdif_counter % 2)
-		data |= 0x05;		/* odd sub frame, 'Y' */
-	else
-		data |= 0x09;		/* even sub frame, 'X' */
-
-	/*
-	 * sub frame counter: 2 sub frame are one audio frame
-	 * and 192 frames are one block
-	 */
-	cm->spdif_counter = (++cm->spdif_counter) % 384;
-
-	return data;
-}
-# endif /* if USE_AES_IEC958 */
-
-static int snd_cmipci_ac3_copy(snd_pcm_substream_t *subs, int channel,
-			       snd_pcm_uframes_t pos, void *src,
-			       snd_pcm_uframes_t count)
-{
-	cmipci_t *cm = snd_pcm_substream_chip(subs);
-	u32 *dst;
-	snd_pcm_uframes_t offset;
-	snd_pcm_runtime_t *runtime = subs->runtime;
-#ifndef USE_AES_IEC958
-	u16 *srcp = src, val;
-#else
-	char buf[480];         /* bits can be divided by 20, 24, 16 */
-	size_t bytes = frames_to_bytes(runtime, count);
-#endif
-
-
-	if (!cm->channel[CM_CH_PLAY].ac3_shift) {
-		if (copy_from_user(runtime->dma_area +
-				   frames_to_bytes(runtime, pos), src,
-				   frames_to_bytes(runtime, count)))
-			return -EFAULT;
-		return 0;
-	}
-
-	if (! access_ok(VERIFY_READ, src, count))
-		return -EFAULT;
-
-	/* frame = 16bit stereo */
-	offset = (pos << 1) % (cm->channel[CM_CH_PLAY].dma_size << 2);
-	dst = (u32*)(runtime->dma_area + offset);
-# ifndef USE_AES_IEC958
-	count /= 2;
-	while (count-- > 0) {
-		get_user(val, srcp);
-		srcp++;
-		*dst++ = convert_ac3_32bit(cm, val);
-	}
-# else
-	while (bytes) {
-		size_t c = bytes;
-
-		if (c > sizeof(buf))
-			c = sizeof(buf);
-
-		if (copy_from_user(buf, src, c))
-			return -EFAULT;
-		bytes -= c;
-		src   += c;
-
-		iec958_init_bitstream(buf, c*8);
-		while (iec958_bits_avail()) {
-			*(dst++) = iec958_subframe(cm, cm->spdif_channel);
-			if (iec958_error())
-				return -EINVAL;
-		}
-		iec958_clear_bitstream();
-	}
-# endif
-	return 0;
-}
-
-static int snd_cmipci_ac3_silence(snd_pcm_substream_t *subs, int channel,
-				  snd_pcm_uframes_t pos,
-				  snd_pcm_uframes_t count)
-{
-	cmipci_t *cm = snd_pcm_substream_chip(subs);
-	u32 *dst;
-	snd_pcm_uframes_t offset;
-	snd_pcm_runtime_t *runtime = subs->runtime;
-# ifdef USE_AES_IEC958
-	char buf[480];		/* bits can be divided by 20, 24, 16 */
-	size_t bytes = frames_to_bytes(runtime, count);
-# endif
-	if (! cm->channel[CM_CH_PLAY].ac3_shift)
-		return snd_pcm_format_set_silence(runtime->format,
-						  runtime->dma_area + frames_to_bytes(runtime, pos), count);
-	
-	/* frame = 16bit stereo */
-	offset = (pos << 1) % (cm->channel[CM_CH_PLAY].dma_size << 2);
-	dst = (u32*)(subs->runtime->dma_area + offset);
-# ifndef USE_AES_IEC958
-	count /= 2;
-	while (count-- > 0) {
-		*dst++ = convert_ac3_32bit(cm, 0);
-	}
-# else
-	while (bytes) {
-		size_t c = bytes;
-
-		if (c > sizeof(buf))
-			c = sizeof(buf);
-
-		/* Q: Does this function know about 24bit silence? */
-		if (snd_pcm_format_set_silence(runtime->format, buf, bytes_to_frames(runtime, c)))
-			return -EINVAL;
-
-		iec958_init_bitstream(buf, c*8);
-		while (iec958_bits_avail()) {
-			*(dst++) = iec958_subframe(cm, cm->spdif_channel);
-			if (iec958_error())
-				return -EINVAL;
-		}
-		iec958_clear_bitstream();
-	}
-# endif
-	return 0;
-}
-#endif /* DO_SOFT_AC3 */
-
 
 /*
  * hw preparation for spdif
@@ -1404,9 +1036,6 @@
 	spin_lock_irqsave(&chip->reg_lock, flags);
 	for (i = 0; i < 4; i++)
 		ucontrol->value.iec958.status[i] = (chip->dig_pcm_status >> (i * 8)) & 0xff;
-#ifdef USE_AES_IEC958
-	ucontrol = chip->spdif_channel;
-#endif
 	spin_unlock_irqrestore(&chip->reg_lock, flags);
 	return 0;
 }
@@ -1425,9 +1054,6 @@
 		val |= (unsigned int)ucontrol->value.iec958.status[i] << (i * 8);
 	change = val != chip->dig_pcm_status;
 	chip->dig_pcm_status = val;
-#ifdef USE_AES_IEC958
-	chip->spdif_channel = ucontrol;
-#endif
 	spin_unlock_irqrestore(&chip->reg_lock, flags);
 	return change;
 }
@@ -1504,9 +1130,6 @@
 /* spinlock held! */
 static void setup_ac3(cmipci_t *cm, snd_pcm_substream_t *subs, int do_ac3, int rate)
 {
-	cm->channel[CM_CH_PLAY].ac3_shift = 0;
-	cm->spdif_counter = 0;
-
 	if (do_ac3) {
 		/* AC3EN for 037 */
 		snd_cmipci_set_bit(cm, CM_REG_CHFORMAT, CM_AC3EN1);
@@ -1519,9 +1142,6 @@
 			snd_cmipci_set_bit(cm, CM_REG_CHFORMAT, CM_SPD24SEL);
 			snd_cmipci_clear_bit(cm, CM_REG_MISC_CTRL, CM_SPD32SEL);
 		} else { /* can_ac3_sw */
-#ifdef DO_SOFT_AC3
-			/* FIXME: ugly hack! */
-			subs->runtime->buffer_size /= 2;
 			/* SPD32SEL for 037 & 039, 0x20 */
 			snd_cmipci_set_bit(cm, CM_REG_MISC_CTRL, CM_SPD32SEL);
 			/* set 176K sample rate to fix 033 HW bug */
@@ -1532,8 +1152,6 @@
 					snd_cmipci_clear_bit(cm, CM_REG_CHFORMAT, CM_PLAYBACK_SRATE_176K);
 				}
 			}
-			cm->channel[CM_CH_PLAY].ac3_shift = 1; /* use 32bit */
-#endif /* DO_SOFT_AC3 */
 		}
 
 	} else {
@@ -1550,11 +1168,9 @@
 				snd_cmipci_clear_bit(cm, CM_REG_CHFORMAT, CM_SPD24SEL);
 			}
 		} else {
-#ifdef DO_SOFT_AC3
 			snd_cmipci_clear_bit(cm, CM_REG_MISC_CTRL, CM_SPD32SEL);
 			snd_cmipci_clear_bit(cm, CM_REG_CHFORMAT, CM_SPD24SEL);
 			snd_cmipci_clear_bit(cm, CM_REG_CHFORMAT, CM_PLAYBACK_SRATE_176K);
-#endif /* DO_SOFT_AC3 */
 		}
 	}
 }
@@ -1604,15 +1220,12 @@
 {
 	cmipci_t *cm = snd_pcm_substream_chip(substream);
 	int rate = substream->runtime->rate;
-	int do_spdif, do_ac3;
+	int do_spdif, do_ac3 = 0;
 	do_spdif = ((rate == 44100 || rate == 48000) &&
 		    substream->runtime->format == SNDRV_PCM_FORMAT_S16_LE &&
 		    substream->runtime->channels == 2);
-	do_ac3 = cm->dig_pcm_status & IEC958_AES0_NONAUDIO;
-#ifdef DO_SOFT_AC3
-	if (do_ac3 && cm->can_ac3_sw)
-		do_spdif = 0;
-#endif
+	if (do_spdif && cm->can_ac3_hw) 
+		do_ac3 = cm->dig_pcm_status & IEC958_AES0_NONAUDIO;
 	setup_spdif_playback(cm, substream, do_spdif, do_ac3);
 	return snd_cmipci_pcm_prepare(cm, &cm->channel[CM_CH_PLAY], substream);
 }
@@ -1621,7 +1234,12 @@
 static int snd_cmipci_playback_spdif_prepare(snd_pcm_substream_t *substream)
 {
 	cmipci_t *cm = snd_pcm_substream_chip(substream);
-	setup_spdif_playback(cm, substream, 1, cm->dig_pcm_status & IEC958_AES0_NONAUDIO);
+	int do_ac3;
+	if (cm->can_ac3_hw) 
+		do_ac3 = cm->dig_pcm_status & IEC958_AES0_NONAUDIO;
+	else
+		do_ac3 = 1; /* doesn't matter */
+	setup_spdif_playback(cm, substream, 1, do_ac3);
 	return snd_cmipci_pcm_prepare(cm, &cm->channel[CM_CH_PLAY], substream);
 }
 
@@ -1768,8 +1386,9 @@
 /* spdif playback on channel A */
 static snd_pcm_hardware_t snd_cmipci_playback_spdif =
 {
-	.info =			(SNDRV_PCM_INFO_INTERLEAVED |
-				 SNDRV_PCM_INFO_BLOCK_TRANSFER | SNDRV_PCM_INFO_PAUSE),
+	.info =			(SNDRV_PCM_INFO_MMAP | SNDRV_PCM_INFO_INTERLEAVED |
+				 SNDRV_PCM_INFO_BLOCK_TRANSFER | SNDRV_PCM_INFO_PAUSE |
+				 SNDRV_PCM_INFO_MMAP_VALID),
 	.formats =		SNDRV_PCM_FMTBIT_S16_LE,
 	.rates =		SNDRV_PCM_RATE_44100 | SNDRV_PCM_RATE_48000,
 	.rate_min =		44100,
@@ -1784,6 +1403,26 @@
 	.fifo_size =		0,
 };
 
+/* spdif playback on channel A (32bit, IEC958 subframes) */
+static snd_pcm_hardware_t snd_cmipci_playback_iec958_subframe =
+{
+	.info =			(SNDRV_PCM_INFO_MMAP | SNDRV_PCM_INFO_INTERLEAVED |
+				 SNDRV_PCM_INFO_BLOCK_TRANSFER | SNDRV_PCM_INFO_PAUSE |
+				 SNDRV_PCM_INFO_MMAP_VALID),
+	.formats =		SNDRV_PCM_FMTBIT_IEC958_SUBFRAME_LE,
+	.rates =		SNDRV_PCM_RATE_44100 | SNDRV_PCM_RATE_48000,
+	.rate_min =		44100,
+	.rate_max =		48000,
+	.channels_min =		2,
+	.channels_max =		2,
+	.buffer_bytes_max =	(128*1024),
+	.period_bytes_min =	64,
+	.period_bytes_max =	(128*1024),
+	.periods_min =		2,
+	.periods_max =		1024,
+	.fifo_size =		0,
+};
+
 /* spdif capture on channel B */
 static snd_pcm_hardware_t snd_cmipci_capture_spdif =
 {
@@ -1921,13 +1560,13 @@
 
 	if ((err = open_device_check(cm, CM_OPEN_SPDIF_PLAYBACK, substream)) < 0) /* use channel A */
 		return err;
-	runtime->hw = snd_cmipci_playback_spdif;
-#ifdef DO_SOFT_AC3
-	if (cm->can_ac3_hw)
-#endif
-		runtime->hw.info |= SNDRV_PCM_INFO_MMAP | SNDRV_PCM_INFO_MMAP_VALID;
-	if (cm->chip_version >= 37)
-		runtime->hw.formats |= SNDRV_PCM_FMTBIT_S32_LE;
+	if (cm->can_ac3_hw) {
+		runtime->hw = snd_cmipci_playback_spdif;
+		if (cm->chip_version >= 37)
+			runtime->hw.formats |= SNDRV_PCM_FMTBIT_S32_LE;
+	} else {
+		runtime->hw = snd_cmipci_playback_iec958_subframe;
+	}
 	snd_pcm_hw_constraint_minmax(runtime, SNDRV_PCM_HW_PARAM_BUFFER_SIZE, 0, 0x40000);
 	cm->dig_pcm_status = cm->dig_status;
 	return 0;
@@ -2034,21 +1673,6 @@
 	.pointer =	snd_cmipci_playback_pointer,
 };
 
-#ifdef DO_SOFT_AC3
-static snd_pcm_ops_t snd_cmipci_playback_spdif_soft_ops = {
-	.open =		snd_cmipci_playback_spdif_open,
-	.close =	snd_cmipci_playback_spdif_close,
-	.ioctl =	snd_pcm_lib_ioctl,
-	.hw_params =	snd_cmipci_hw_params,
-	.hw_free =	snd_cmipci_playback_hw_free,
-	.prepare =	snd_cmipci_playback_spdif_prepare,	/* set up rate */
-	.trigger =	snd_cmipci_playback_trigger,
-	.pointer =	snd_cmipci_playback_pointer,
-	.copy =		snd_cmipci_ac3_copy,
-	.silence =	snd_cmipci_ac3_silence,
-};
-#endif
-
 static snd_pcm_ops_t snd_cmipci_capture_spdif_ops = {
 	.open =		snd_cmipci_capture_spdif_open,
 	.close =	snd_cmipci_capture_spdif_close,
@@ -2125,14 +1749,7 @@
 	if (err < 0)
 		return err;
 
-#ifdef DO_SOFT_AC3
-	if (cm->can_ac3_hw)
-		snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_PLAYBACK, &snd_cmipci_playback_spdif_ops);
-	else
-		snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_PLAYBACK, &snd_cmipci_playback_spdif_soft_ops);
-#else
 	snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_PLAYBACK, &snd_cmipci_playback_spdif_ops);
-#endif
 	snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_CAPTURE, &snd_cmipci_capture_spdif_ops);
 
 	pcm->private_data = cm;
@@ -2770,16 +2387,17 @@
 			if (err < 0)
 				return err;
 		}
-		if ((err = snd_ctl_add(card, kctl = snd_ctl_new1(&snd_cmipci_spdif_default, cm))) < 0)
-			return err;
-		kctl->id.device = pcm_spdif_device;
-		if ((err = snd_ctl_add(card, kctl = snd_ctl_new1(&snd_cmipci_spdif_mask, cm))) < 0)
-			return err;
-		kctl->id.device = pcm_spdif_device;
-		if ((err = snd_ctl_add(card, kctl = snd_ctl_new1(&snd_cmipci_spdif_stream, cm))) < 0)
-			return err;
-		kctl->id.device = pcm_spdif_device;
-		cm->spdif_pcm_ctl = kctl;
+		if (cm->can_ac3_hw) {
+			if ((err = snd_ctl_add(card, kctl = snd_ctl_new1(&snd_cmipci_spdif_default, cm))) < 0)
+				return err;
+			kctl->id.device = pcm_spdif_device;
+			if ((err = snd_ctl_add(card, kctl = snd_ctl_new1(&snd_cmipci_spdif_mask, cm))) < 0)
+				return err;
+			kctl->id.device = pcm_spdif_device;
+			if ((err = snd_ctl_add(card, kctl = snd_ctl_new1(&snd_cmipci_spdif_stream, cm))) < 0)
+				return err;
+			kctl->id.device = pcm_spdif_device;
+		}
 		if (cm->chip_version <= 37) {
 			sw = snd_cmipci_old_mixer_switches;
 			for (idx = 0; idx < num_controls(snd_cmipci_old_mixer_switches); idx++, sw++) {
@@ -2917,6 +2535,8 @@
 	if (cm->can_multi_ch)
 		sprintf(cm->card->driver + strlen(cm->card->driver),
 			"-MC%d", cm->max_channels);
+	else if (cm->can_ac3_sw)
+		strcpy(cm->card->driver + strlen(cm->card->driver), "-SWIEC");
 }
 
 
@@ -3013,9 +2633,7 @@
 
 	cm->chip_version = 0;
 	cm->max_channels = 2;
-#ifdef DO_SOFT_AC3
 	cm->do_soft_ac3 = soft_ac3[dev];
-#endif
 
 	query_chip(cm);
 
@@ -3264,15 +2882,7 @@
 	
 static int __init alsa_card_cmipci_init(void)
 {
-	int err;
-
-	if ((err = pci_module_init(&driver)) < 0) {
-#ifdef MODULE
-		printk(KERN_ERR "C-Media PCI soundcard not found or device busy\n");
-#endif
-		return err;
-	}
-	return 0;
+	return pci_module_init(&driver);
 }
 
 static void __exit alsa_card_cmipci_exit(void)
@@ -3282,34 +2892,3 @@
 
 module_init(alsa_card_cmipci_init)
 module_exit(alsa_card_cmipci_exit)
-
-#ifndef MODULE
-
-/* format is: snd-cmipci=enable,index,id,
-			 mpu_port,fm_port,soft_ac3,joystick_port */
-
-static int __init alsa_card_cmipci_setup(char *str)
-{
-	static unsigned __initdata nr_dev = 0;
-
-	if (nr_dev >= SNDRV_CARDS)
-		return 0;
-	(void)(get_option(&str,&enable[nr_dev]) == 2 &&
-	       get_option(&str,&index[nr_dev]) == 2 &&
-	       get_id(&str,&id[nr_dev]) == 2 &&
-	       get_option_long(&str,&mpu_port[nr_dev]) == 2 &&
-	       get_option_long(&str,&fm_port[nr_dev]) == 2
-#ifdef DO_SOFT_AC3
-	       && get_option(&str,&soft_ac3[nr_dev]) == 2
-#endif
-#ifdef SUPPORT_JOYSTICK
-	       && get_option(&str,&joystick_port[nr_dev]) == 2
-#endif
-	       );
-	nr_dev++;
-	return 1;
-}
-
-__setup("snd-cmipci=", alsa_card_cmipci_setup);
-
-#endif /* ifndef MODULE */
diff -Nru a/sound/pci/cs4281.c b/sound/pci/cs4281.c
--- a/sound/pci/cs4281.c	2004-05-26 15:01:36 -07:00
+++ b/sound/pci/cs4281.c	2004-05-26 15:01:36 -07:00
@@ -27,13 +27,13 @@
 #include <linux/pci.h>
 #include <linux/slab.h>
 #include <linux/gameport.h>
+#include <linux/moduleparam.h>
 #include <sound/core.h>
 #include <sound/control.h>
 #include <sound/pcm.h>
 #include <sound/rawmidi.h>
 #include <sound/ac97_codec.h>
 #include <sound/opl3.h>
-#define SNDRV_GET_ID
 #include <sound/initval.h>
 
 
@@ -47,17 +47,18 @@
 static char *id[SNDRV_CARDS] = SNDRV_DEFAULT_STR;	/* ID for this card */
 static int enable[SNDRV_CARDS] = SNDRV_DEFAULT_ENABLE_PNP;	/* Enable switches */
 static int dual_codec[SNDRV_CARDS];	/* dual codec */
+static int boot_devs;
 
-MODULE_PARM(index, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+module_param_array(index, int, boot_devs, 0444);
 MODULE_PARM_DESC(index, "Index value for CS4281 soundcard.");
 MODULE_PARM_SYNTAX(index, SNDRV_INDEX_DESC);
-MODULE_PARM(id, "1-" __MODULE_STRING(SNDRV_CARDS) "s");
+module_param_array(id, charp, boot_devs, 0444);
 MODULE_PARM_DESC(id, "ID string for CS4281 soundcard.");
 MODULE_PARM_SYNTAX(id, SNDRV_ID_DESC);
-MODULE_PARM(enable, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+module_param_array(enable, bool, boot_devs, 0444);
 MODULE_PARM_DESC(enable, "Enable CS4281 soundcard.");
 MODULE_PARM_SYNTAX(enable, SNDRV_ENABLE_DESC);
-MODULE_PARM(dual_codec, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+module_param_array(dual_codec, bool, boot_devs, 0444);
 MODULE_PARM_DESC(dual_codec, "Secondary Codec ID (0 = disabled).");
 MODULE_PARM_SYNTAX(dual_codec, SNDRV_ENABLED ",allows:{{0,3}}");
 
@@ -1395,7 +1396,8 @@
 
 static int snd_cs4281_chip_init(cs4281_t *chip); /* defined below */
 #ifdef CONFIG_PM
-static int snd_cs4281_set_power_state(snd_card_t *card, unsigned int power_state);
+static int cs4281_suspend(snd_card_t *card, unsigned int state);
+static int cs4281_resume(snd_card_t *card, unsigned int state);
 #endif
 
 static int __devinit snd_cs4281_create(snd_card_t * card,
@@ -1461,10 +1463,7 @@
 
 	snd_cs4281_proc_init(chip);
 
-#ifdef CONFIG_PM
-	card->set_power_state = snd_cs4281_set_power_state;
-	card->power_state_private_data = chip;
-#endif
+	snd_card_set_pm_callback(card, cs4281_suspend, cs4281_resume, chip);
 
 	if ((err = snd_device_new(card, SNDRV_DEV_LOWLEVEL, chip, &ops)) < 0) {
 		snd_cs4281_free(chip);
@@ -1481,7 +1480,9 @@
 {
 	unsigned int tmp;
 	int timeout;
+	int retry_count = 2;
 
+      __retry:
 	tmp = snd_cs4281_peekBA0(chip, BA0_CFLR);
 	if (tmp != BA0_CFLR_DEFAULT) {
 		snd_cs4281_pokeBA0(chip, BA0_CFLR, BA0_CFLR_DEFAULT);
@@ -1629,6 +1630,8 @@
 		snd_cs4281_delay_long();
 	} while (timeout-- > 0);
 
+	if (--retry_count > 0)
+		goto __retry;
 	snd_printk(KERN_ERR "never read ISV3 and ISV4 from AC'97\n");
 	return -EIO;
 
@@ -1999,15 +2002,14 @@
 		return err;
 	}
 
-	pci_set_drvdata(pci, chip);
+	pci_set_drvdata(pci, card);
 	dev++;
 	return 0;
 }
 
 static void __devexit snd_cs4281_remove(struct pci_dev *pci)
 {
-	cs4281_t *chip = pci_get_drvdata(pci);
-	snd_card_free(chip->card);
+	snd_card_free(pci_get_drvdata(pci));
 	pci_set_drvdata(pci, NULL);
 }
 
@@ -2036,17 +2038,19 @@
 
 #define CLKCR1_CKRA                             0x00010000L
 
-static void cs4281_suspend(cs4281_t *chip)
+static int cs4281_suspend(snd_card_t *card, unsigned int state)
 {
-	snd_card_t *card = chip->card;
+	cs4281_t *chip = snd_magic_cast(cs4281_t, card->pm_private_data, return -EINVAL);
 	u32 ulCLK;
 	unsigned int i;
 
-	if (card->power_state == SNDRV_CTL_POWER_D3hot)
-		return;
-
 	snd_pcm_suspend_all(chip->pcm);
 
+	if (chip->ac97)
+		snd_ac97_suspend(chip->ac97);
+	if (chip->ac97_secondary)
+		snd_ac97_suspend(chip->ac97_secondary);
+
 	ulCLK = snd_cs4281_peekBA0(chip, BA0_CLKCR1);
 	ulCLK |= CLKCR1_CKRA;
 	snd_cs4281_pokeBA0(chip, BA0_CLKCR1, ulCLK);
@@ -2076,17 +2080,15 @@
 	snd_cs4281_pokeBA0(chip, BA0_CLKCR1, ulCLK);
 
 	snd_power_change_state(card, SNDRV_CTL_POWER_D3hot);
+	return 0;
 }
 
-static void cs4281_resume(cs4281_t *chip)
+static int cs4281_resume(snd_card_t *card, unsigned int state)
 {
-	snd_card_t *card = chip->card;
+	cs4281_t *chip = snd_magic_cast(cs4281_t, card->pm_private_data, return -EINVAL);
 	unsigned int i;
 	u32 ulCLK;
 
-	if (card->power_state == SNDRV_CTL_POWER_D0)
-		return;
-
 	pci_enable_device(chip->pci);
 
 	ulCLK = snd_cs4281_peekBA0(chip, BA0_CLKCR1);
@@ -2110,41 +2112,8 @@
 	snd_cs4281_pokeBA0(chip, BA0_CLKCR1, ulCLK);
 
 	snd_power_change_state(card, SNDRV_CTL_POWER_D0);
-}
-
-static int snd_cs4281_suspend(struct pci_dev *dev, u32 state)
-{
-	cs4281_t *chip = snd_magic_cast(cs4281_t, pci_get_drvdata(dev), return -ENXIO);
-	cs4281_suspend(chip);
-	return 0;
-}
-static int snd_cs4281_resume(struct pci_dev *dev)
-{
-	cs4281_t *chip = snd_magic_cast(cs4281_t, pci_get_drvdata(dev), return -ENXIO);
-	cs4281_resume(chip);
 	return 0;
 }
-
-/* callback */
-static int snd_cs4281_set_power_state(snd_card_t *card, unsigned int power_state)
-{
-	cs4281_t *chip = snd_magic_cast(cs4281_t, card->power_state_private_data, return -ENXIO);
-	switch (power_state) {
-	case SNDRV_CTL_POWER_D0:
-	case SNDRV_CTL_POWER_D1:
-	case SNDRV_CTL_POWER_D2:
-		cs4281_resume(chip);
-		break;
-	case SNDRV_CTL_POWER_D3hot:
-	case SNDRV_CTL_POWER_D3cold:
-		cs4281_suspend(chip);
-		break;
-	default:
-		return -EINVAL;
-	}
-	return 0;
-}
-
 #endif /* CONFIG_PM */
 
 static struct pci_driver driver = {
@@ -2152,23 +2121,12 @@
 	.id_table = snd_cs4281_ids,
 	.probe = snd_cs4281_probe,
 	.remove = __devexit_p(snd_cs4281_remove),
-#ifdef CONFIG_PM
-	.suspend = snd_cs4281_suspend,
-	.resume = snd_cs4281_resume,
-#endif
+	SND_PCI_PM_CALLBACKS
 };
 	
 static int __init alsa_card_cs4281_init(void)
 {
-	int err;
-
-	if ((err = pci_module_init(&driver)) < 0) {
-#ifdef MODULE
-		printk(KERN_ERR "CS4281 soundcard not found or device busy\n");
-#endif
-		return err;
-	}
-	return 0;
+	return pci_module_init(&driver);
 }
 
 static void __exit alsa_card_cs4281_exit(void)
@@ -2178,24 +2136,3 @@
 
 module_init(alsa_card_cs4281_init)
 module_exit(alsa_card_cs4281_exit)
-
-#ifndef MODULE
-
-/* format is: snd-cs4281=enable,index,id */
-
-static int __init alsa_card_cs4281_setup(char *str)
-{
-	static unsigned __initdata nr_dev = 0;
-
-	if (nr_dev >= SNDRV_CARDS)
-		return 0;
-	(void)(get_option(&str,&enable[nr_dev]) == 2 &&
-	       get_option(&str,&index[nr_dev]) == 2 &&
-	       get_id(&str,&id[nr_dev]) == 2);
-	nr_dev++;
-	return 1;
-}
-
-__setup("snd-cs4281=", alsa_card_cs4281_setup);
-
-#endif /* ifndef MODULE */
diff -Nru a/sound/pci/cs46xx/cs46xx.c b/sound/pci/cs46xx/cs46xx.c
--- a/sound/pci/cs46xx/cs46xx.c	2004-05-26 15:01:36 -07:00
+++ b/sound/pci/cs46xx/cs46xx.c	2004-05-26 15:01:36 -07:00
@@ -29,9 +29,9 @@
 #include <linux/pci.h>
 #include <linux/time.h>
 #include <linux/init.h>
+#include <linux/moduleparam.h>
 #include <sound/core.h>
 #include <sound/cs46xx.h>
-#define SNDRV_GET_ID
 #include <sound/initval.h>
 
 MODULE_AUTHOR("Jaroslav Kysela <perex@suse.cz>");
@@ -52,23 +52,24 @@
 static int external_amp[SNDRV_CARDS] = {[0 ... (SNDRV_CARDS - 1)] = 0};
 static int thinkpad[SNDRV_CARDS] = {[0 ... (SNDRV_CARDS - 1)] = 0};
 static int mmap_valid[SNDRV_CARDS] = {[0 ... (SNDRV_CARDS - 1)] = 1};
+static int boot_devs;
 
-MODULE_PARM(index, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+module_param_array(index, int, boot_devs, 0444);
 MODULE_PARM_DESC(index, "Index value for the CS46xx soundcard.");
 MODULE_PARM_SYNTAX(index, SNDRV_INDEX_DESC);
-MODULE_PARM(id, "1-" __MODULE_STRING(SNDRV_CARDS) "s");
+module_param_array(id, charp, boot_devs, 0444);
 MODULE_PARM_DESC(id, "ID string for the CS46xx soundcard.");
 MODULE_PARM_SYNTAX(id, SNDRV_ID_DESC);
-MODULE_PARM(enable, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+module_param_array(enable, bool, boot_devs, 0444);
 MODULE_PARM_DESC(enable, "Enable CS46xx soundcard.");
 MODULE_PARM_SYNTAX(enable, SNDRV_ENABLE_DESC);
-MODULE_PARM(external_amp, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+module_param_array(external_amp, bool, boot_devs, 0444);
 MODULE_PARM_DESC(external_amp, "Force to enable external amplifer.");
 MODULE_PARM_SYNTAX(external_amp, SNDRV_ENABLED "," SNDRV_BOOLEAN_FALSE_DESC);
-MODULE_PARM(thinkpad, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+module_param_array(thinkpad, bool, boot_devs, 0444);
 MODULE_PARM_DESC(thinkpad, "Force to enable Thinkpad's CLKRUN control.");
 MODULE_PARM_SYNTAX(thinkpad, SNDRV_ENABLED "," SNDRV_BOOLEAN_FALSE_DESC);
-MODULE_PARM(mmap_valid, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+module_param_array(mmap_valid, bool, boot_devs, 0444);
 MODULE_PARM_DESC(mmap_valid, "Support OSS mmap.");
 MODULE_PARM_SYNTAX(mmap_valid, SNDRV_ENABLED "," SNDRV_BOOLEAN_TRUE_DESC);
 
@@ -157,31 +158,14 @@
 		return err;
 	}
 
-	pci_set_drvdata(pci, chip);
+	pci_set_drvdata(pci, card);
 	dev++;
 	return 0;
 }
 
-#ifdef CONFIG_PM
-static int snd_card_cs46xx_suspend(struct pci_dev *pci, u32 state)
-{
-	cs46xx_t *chip = snd_magic_cast(cs46xx_t, pci_get_drvdata(pci), return -ENXIO);
-	snd_cs46xx_suspend(chip);
-	return 0;
-}
-static int snd_card_cs46xx_resume(struct pci_dev *pci)
-{
-	cs46xx_t *chip = snd_magic_cast(cs46xx_t, pci_get_drvdata(pci), return -ENXIO);
-	snd_cs46xx_resume(chip);
-	return 0;
-}
-#endif
-
 static void __devexit snd_card_cs46xx_remove(struct pci_dev *pci)
 {
-	cs46xx_t *chip = snd_magic_cast(cs46xx_t, pci_get_drvdata(pci), return);
-	if (chip)
-		snd_card_free(chip->card);
+	snd_card_free(pci_get_drvdata(pci));
 	pci_set_drvdata(pci, NULL);
 }
 
@@ -190,23 +174,12 @@
 	.id_table = snd_cs46xx_ids,
 	.probe = snd_card_cs46xx_probe,
 	.remove = __devexit_p(snd_card_cs46xx_remove),
-#ifdef CONFIG_PM
-	.suspend = snd_card_cs46xx_suspend,
-	.resume = snd_card_cs46xx_resume,
-#endif
+	SND_PCI_PM_CALLBACKS
 };
 
 static int __init alsa_card_cs46xx_init(void)
 {
-	int err;
-
-	if ((err = pci_module_init(&driver)) < 0) {
-#ifdef MODULE
-		printk(KERN_ERR "Sound Fusion CS46xx soundcard not found or device busy\n");
-#endif
-		return err;
-	}
-	return 0;
+	return pci_module_init(&driver);
 }
 
 static void __exit alsa_card_cs46xx_exit(void)
@@ -216,27 +189,3 @@
 
 module_init(alsa_card_cs46xx_init)
 module_exit(alsa_card_cs46xx_exit)
-
-#ifndef MODULE
-
-/* format is: snd-cs46xx=enable,index,id,mmap_valid,external_amp,thinkpad */
-
-static int __init alsa_card_cs46xx_setup(char *str)
-{
-	static unsigned __initdata nr_dev = 0;
-
-	if (nr_dev >= SNDRV_CARDS)
-		return 0;
-	(void)(get_option(&str,&enable[nr_dev]) == 2 &&
-	       get_option(&str,&index[nr_dev]) == 2 &&
-	       get_id(&str,&id[nr_dev]) == 2 &&
-	       get_option(&str,&mmap_valid[nr_dev]) == 2 &&
-	       get_option(&str,&external_amp[nr_dev]) == 2 &&
-	       get_option(&str,&thinkpad[nr_dev]) == 2);
-	nr_dev++;
-	return 1;
-}
-
-__setup("snd-cs46xx=", alsa_card_cs46xx_setup);
-
-#endif /* ifndef MODULE */
diff -Nru a/sound/pci/cs46xx/cs46xx_lib.c b/sound/pci/cs46xx/cs46xx_lib.c
--- a/sound/pci/cs46xx/cs46xx_lib.c	2004-05-26 15:01:35 -07:00
+++ b/sound/pci/cs46xx/cs46xx_lib.c	2004-05-26 15:01:35 -07:00
@@ -3784,17 +3784,19 @@
  * APM support
  */
 #ifdef CONFIG_PM
-void snd_cs46xx_suspend(cs46xx_t *chip)
+static int snd_cs46xx_suspend(snd_card_t *card, unsigned int state)
 {
+	cs46xx_t *chip = snd_magic_cast(cs46xx_t, card->pm_private_data, return -EINVAL);
 	int amp_saved;
 
-	snd_card_t *card = chip->card;
-
-	if (card->power_state == SNDRV_CTL_POWER_D3hot)
-		return;
 	snd_pcm_suspend_all(chip->pcm);
 	// chip->ac97_powerdown = snd_cs46xx_codec_read(chip, AC97_POWER_CONTROL);
 	// chip->ac97_general_purpose = snd_cs46xx_codec_read(chip, BA0_AC97_GENERAL_PURPOSE);
+
+	snd_ac97_suspend(chip->ac97[CS46XX_PRIMARY_CODEC_INDEX]);
+	if (chip->ac97[CS46XX_SECONDARY_CODEC_INDEX])
+		snd_ac97_suspend(chip->ac97[CS46XX_SECONDARY_CODEC_INDEX]);
+
 	amp_saved = chip->amplifier;
 	/* turn off amp */
 	chip->amplifier_ctrl(chip, -chip->amplifier);
@@ -3803,16 +3805,14 @@
 	chip->active_ctrl(chip, -chip->amplifier);
 	chip->amplifier = amp_saved; /* restore the status */
 	snd_power_change_state(card, SNDRV_CTL_POWER_D3hot);
+	return 0;
 }
 
-void snd_cs46xx_resume(cs46xx_t *chip)
+static int snd_cs46xx_resume(snd_card_t *card, unsigned int state)
 {
-	snd_card_t *card = chip->card;
+	cs46xx_t *chip = snd_magic_cast(cs46xx_t, card->pm_private_data, return -EINVAL);
 	int amp_saved;
 
-	if (card->power_state == SNDRV_CTL_POWER_D0)
-		return;
-
 	pci_enable_device(chip->pci);
 	amp_saved = chip->amplifier;
 	chip->amplifier = 0;
@@ -3832,6 +3832,8 @@
 #endif
 
 	snd_ac97_resume(chip->ac97[CS46XX_PRIMARY_CODEC_INDEX]);
+	if (chip->ac97[CS46XX_SECONDARY_CODEC_INDEX])
+		snd_ac97_resume(chip->ac97[CS46XX_SECONDARY_CODEC_INDEX]);
 
 	if (amp_saved)
 		chip->amplifier_ctrl(chip, 1); /* turn amp on */
@@ -3839,25 +3841,6 @@
 		chip->active_ctrl(chip, -1); /* disable CLKRUN */
 	chip->amplifier = amp_saved;
 	snd_power_change_state(card, SNDRV_CTL_POWER_D0);
-}
-
-static int snd_cs46xx_set_power_state(snd_card_t *card, unsigned int power_state)
-{
-	cs46xx_t *chip = snd_magic_cast(cs46xx_t, card->power_state_private_data, return -ENXIO);
-
-	switch (power_state) {
-	case SNDRV_CTL_POWER_D0:
-	case SNDRV_CTL_POWER_D1:
-	case SNDRV_CTL_POWER_D2:
-		snd_cs46xx_resume(chip);
-		break;
-	case SNDRV_CTL_POWER_D3hot:
-	case SNDRV_CTL_POWER_D3cold:
-		snd_cs46xx_suspend(chip);
-		break;
-	default:
-		return -EINVAL;
-	}
 	return 0;
 }
 #endif /* CONFIG_PM */
@@ -4010,10 +3993,7 @@
 
 	snd_cs46xx_proc_init(card, chip);
 
-#ifdef CONFIG_PM
-	card->set_power_state = snd_cs46xx_set_power_state;
-	card->power_state_private_data = chip;
-#endif
+	snd_card_set_pm_callback(card, snd_cs46xx_suspend, snd_cs46xx_resume, chip);
 
 	if ((err = snd_device_new(card, SNDRV_DEV_LOWLEVEL, chip, &ops)) < 0) {
 		snd_cs46xx_free(chip);
diff -Nru a/sound/pci/emu10k1/emu10k1.c b/sound/pci/emu10k1/emu10k1.c
--- a/sound/pci/emu10k1/emu10k1.c	2004-05-26 15:01:35 -07:00
+++ b/sound/pci/emu10k1/emu10k1.c	2004-05-26 15:01:35 -07:00
@@ -23,9 +23,9 @@
 #include <linux/init.h>
 #include <linux/pci.h>
 #include <linux/time.h>
+#include <linux/moduleparam.h>
 #include <sound/core.h>
 #include <sound/emu10k1.h>
-#define SNDRV_GET_ID
 #include <sound/initval.h>
 
 MODULE_AUTHOR("Jaroslav Kysela <perex@suse.cz>");
@@ -49,32 +49,33 @@
 static int max_synth_voices[SNDRV_CARDS] = {[0 ... (SNDRV_CARDS - 1)] = 64};
 static int max_buffer_size[SNDRV_CARDS] = {[0 ... (SNDRV_CARDS - 1)] = 128};
 static int enable_ir[SNDRV_CARDS] = {[0 ... (SNDRV_CARDS - 1)] = 0};
+static int boot_devs;
 
-MODULE_PARM(index, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+module_param_array(index, int, boot_devs, 0444);
 MODULE_PARM_DESC(index, "Index value for the EMU10K1 soundcard.");
 MODULE_PARM_SYNTAX(index, SNDRV_INDEX_DESC);
-MODULE_PARM(id, "1-" __MODULE_STRING(SNDRV_CARDS) "s");
+module_param_array(id, charp, boot_devs, 0444);
 MODULE_PARM_DESC(id, "ID string for the EMU10K1 soundcard.");
 MODULE_PARM_SYNTAX(id, SNDRV_ID_DESC);
-MODULE_PARM(enable, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+module_param_array(enable, bool, boot_devs, 0444);
 MODULE_PARM_DESC(enable, "Enable the EMU10K1 soundcard.");
 MODULE_PARM_SYNTAX(enable, SNDRV_ENABLE_DESC);
-MODULE_PARM(extin, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+module_param_array(extin, int, boot_devs, 0444);
 MODULE_PARM_DESC(extin, "Available external inputs for FX8010. Zero=default.");
 MODULE_PARM_SYNTAX(extin, SNDRV_ENABLED "allows:{{0,0x0ffff}},base:16");
-MODULE_PARM(extout, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+module_param_array(extout, int, boot_devs, 0444);
 MODULE_PARM_DESC(extout, "Available external outputs for FX8010. Zero=default.");
 MODULE_PARM_SYNTAX(extout, SNDRV_ENABLED "allows:{{0,0x0ffff}},base:16");
-MODULE_PARM(seq_ports, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+module_param_array(seq_ports, int, boot_devs, 0444);
 MODULE_PARM_DESC(seq_ports, "Allocated sequencer ports for internal synthesizer.");
 MODULE_PARM_SYNTAX(seq_ports, SNDRV_ENABLED "allows:{{0,32}}");
-MODULE_PARM(max_synth_voices, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+module_param_array(max_synth_voices, int, boot_devs, 0444);
 MODULE_PARM_DESC(max_synth_voices, "Maximum number of voices for WaveTable.");
 MODULE_PARM_SYNTAX(max_synth_voices, SNDRV_ENABLED);
-MODULE_PARM(max_buffer_size, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+module_param_array(max_buffer_size, int, boot_devs, 0444);
 MODULE_PARM_DESC(max_buffer_size, "Maximum sample buffer size in MB.");
 MODULE_PARM_SYNTAX(max_buffer_size, SNDRV_ENABLED);
-MODULE_PARM(enable_ir, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+module_param_array(enable_ir, bool, boot_devs, 0444);
 MODULE_PARM_DESC(enable_ir, "Enable IR.");
 MODULE_PARM_SYNTAX(enable_ir, SNDRV_ENABLE_DESC);
 
@@ -211,15 +212,7 @@
 
 static int __init alsa_card_emu10k1_init(void)
 {
-	int err;
-
-	if ((err = pci_module_init(&driver)) < 0) {
-#ifdef MODULE
-		printk(KERN_ERR "EMU10K1/Audigy soundcard not found or device busy\n");
-#endif
-		return err;
-	}
-	return 0;
+	return pci_module_init(&driver);
 }
 
 static void __exit alsa_card_emu10k1_exit(void)
@@ -229,27 +222,3 @@
 
 module_init(alsa_card_emu10k1_init)
 module_exit(alsa_card_emu10k1_exit)
-
-#ifndef MODULE
-
-/* format is: snd-emu10k1=enable,index,id,
-			  seq_ports,max_synth_voices */
-
-static int __init alsa_card_emu10k1_setup(char *str)
-{
-	static unsigned __initdata nr_dev = 0;
-
-	if (nr_dev >= SNDRV_CARDS)
-		return 0;
-	(void)(get_option(&str,&enable[nr_dev]) == 2 &&
-	       get_option(&str,&index[nr_dev]) == 2 &&
-	       get_id(&str,&id[nr_dev]) == 2 &&
-	       get_option(&str,&seq_ports[nr_dev]) == 2 &&
-	       get_option(&str,&max_synth_voices[nr_dev]) == 2);
-	nr_dev++;
-	return 1;
-}
-
-__setup("snd-emu10k1=", alsa_card_emu10k1_setup);
-
-#endif /* ifndef MODULE */
diff -Nru a/sound/pci/emu10k1/emu10k1_main.c b/sound/pci/emu10k1/emu10k1_main.c
--- a/sound/pci/emu10k1/emu10k1_main.c	2004-05-26 15:01:36 -07:00
+++ b/sound/pci/emu10k1/emu10k1_main.c	2004-05-26 15:01:36 -07:00
@@ -690,7 +690,7 @@
 	if (extin_mask == 0)
 		extin_mask = 0x3fcf;
 	if (extout_mask == 0)
-		extout_mask = 0x1fff;
+		extout_mask = 0x7fff;
 	emu->fx8010.extin_mask = extin_mask;
 	emu->fx8010.extout_mask = extout_mask;
 
diff -Nru a/sound/pci/emu10k1/emufx.c b/sound/pci/emu10k1/emufx.c
--- a/sound/pci/emu10k1/emufx.c	2004-05-26 15:01:36 -07:00
+++ b/sound/pci/emu10k1/emufx.c	2004-05-26 15:01:36 -07:00
@@ -120,8 +120,8 @@
 	/* 0x0a */ "PCM Capture Left",
 	/* 0x0b */ "PCM Capture Right",
 	/* 0x0c */ "MIC Capture",
-	/* 0x0d */ NULL,
-	/* 0x0e */ NULL,
+	/* 0x0d */ "AC97 Surround Left",
+	/* 0x0e */ "AC97 Surround Right",
 	/* 0x0f */ NULL,
 	/* 0x10 */ NULL,
 	/* 0x11 */ "Analog Center",
@@ -2113,22 +2113,26 @@
 		for (z = 0; z < 2; z++)
 			OP(icode, &ptr, iACC3, EXTOUT(EXTOUT_REAR_L + z), GPR(playback + SND_EMU10K1_PLAYBACK_CHANNELS + 2 + z), C_00000000, C_00000000);
 
-	if (emu->fx8010.extout_mask & (1<<EXTOUT_CENTER)) {
+	if (emu->fx8010.extout_mask & ((1<<EXTOUT_AC97_REAR_L)|(1<<EXTOUT_AC97_REAR_R)))
+		for (z = 0; z < 2; z++)
+			OP(icode, &ptr, iACC3, EXTOUT(EXTOUT_AC97_REAR_L + z), GPR(playback + SND_EMU10K1_PLAYBACK_CHANNELS + 2 + z), C_00000000, C_00000000);
+
+	if (emu->fx8010.extout_mask & (1<<EXTOUT_AC97_CENTER)) {
 #ifndef EMU10K1_CENTER_LFE_FROM_FRONT
-		OP(icode, &ptr, iACC3, EXTOUT(EXTOUT_CENTER), GPR(playback + SND_EMU10K1_PLAYBACK_CHANNELS + 4), C_00000000, C_00000000);
+		OP(icode, &ptr, iACC3, EXTOUT(EXTOUT_AC97_CENTER), GPR(playback + SND_EMU10K1_PLAYBACK_CHANNELS + 4), C_00000000, C_00000000);
 		OP(icode, &ptr, iACC3, EXTOUT(EXTOUT_ACENTER), GPR(playback + SND_EMU10K1_PLAYBACK_CHANNELS + 4), C_00000000, C_00000000);
 #else
-		OP(icode, &ptr, iACC3, EXTOUT(EXTOUT_CENTER), GPR(playback + SND_EMU10K1_PLAYBACK_CHANNELS + 0), C_00000000, C_00000000);
+		OP(icode, &ptr, iACC3, EXTOUT(EXTOUT_AC97_CENTER), GPR(playback + SND_EMU10K1_PLAYBACK_CHANNELS + 0), C_00000000, C_00000000);
 		OP(icode, &ptr, iACC3, EXTOUT(EXTOUT_ACENTER), GPR(playback + SND_EMU10K1_PLAYBACK_CHANNELS + 0), C_00000000, C_00000000);
 #endif
 	}
 
-	if (emu->fx8010.extout_mask & (1<<EXTOUT_LFE)) {
+	if (emu->fx8010.extout_mask & (1<<EXTOUT_AC97_LFE)) {
 #ifndef EMU10K1_CENTER_LFE_FROM_FRONT
-		OP(icode, &ptr, iACC3, EXTOUT(EXTOUT_LFE), GPR(playback + SND_EMU10K1_PLAYBACK_CHANNELS + 5), C_00000000, C_00000000);
+		OP(icode, &ptr, iACC3, EXTOUT(EXTOUT_AC97_LFE), GPR(playback + SND_EMU10K1_PLAYBACK_CHANNELS + 5), C_00000000, C_00000000);
 		OP(icode, &ptr, iACC3, EXTOUT(EXTOUT_ALFE), GPR(playback + SND_EMU10K1_PLAYBACK_CHANNELS + 5), C_00000000, C_00000000);
 #else
-		OP(icode, &ptr, iACC3, EXTOUT(EXTOUT_LFE), GPR(playback + SND_EMU10K1_PLAYBACK_CHANNELS + 1), C_00000000, C_00000000);
+		OP(icode, &ptr, iACC3, EXTOUT(EXTOUT_AC97_LFE), GPR(playback + SND_EMU10K1_PLAYBACK_CHANNELS + 1), C_00000000, C_00000000);
 		OP(icode, &ptr, iACC3, EXTOUT(EXTOUT_ALFE), GPR(playback + SND_EMU10K1_PLAYBACK_CHANNELS + 1), C_00000000, C_00000000);
 #endif
 	}
diff -Nru a/sound/pci/emu10k1/emumixer.c b/sound/pci/emu10k1/emumixer.c
--- a/sound/pci/emu10k1/emumixer.c	2004-05-26 15:01:36 -07:00
+++ b/sound/pci/emu10k1/emumixer.c	2004-05-26 15:01:36 -07:00
@@ -34,6 +34,8 @@
 
 #define chip_t emu10k1_t
 
+#define AC97_ID_STAC9758	0x83847658
+
 static int snd_emu10k1_spdif_info(snd_kcontrol_t *kcontrol, snd_ctl_elem_info_t * uinfo)
 {
 	uinfo->type = SNDRV_CTL_ELEM_TYPE_IEC958;
@@ -531,6 +533,15 @@
 			snd_ac97_write(emu->ac97, AC97_REC_SEL, 0x0000);
 			c = audigy_remove_ctls;
 		} else {
+			/*
+			 * Credits for cards based on STAC9758:
+			 *   James Courtier-Dutton <James@superbug.demon.co.uk>
+			 *   Voluspa <voluspa@comhem.se>
+			 */
+			if (emu->ac97->id == AC97_ID_STAC9758) {
+				emu->rear_ac97 = 1;
+				snd_emu10k1_ptr_write(emu, AC97SLOT, 0, AC97SLOT_CNTR|AC97SLOT_LFE|AC97SLOT_REAR_LEFT|AC97SLOT_REAR_RIGHT);
+			}
 			/* remove unused AC97 controls */
 			snd_ac97_write(emu->ac97, AC97_SURROUND_MASTER, 0x0202);
 			snd_ac97_write(emu->ac97, AC97_CENTER_LFE_MASTER, 0x0202);
diff -Nru a/sound/pci/ens1370.c b/sound/pci/ens1370.c
--- a/sound/pci/ens1370.c	2004-05-26 15:01:36 -07:00
+++ b/sound/pci/ens1370.c	2004-05-26 15:01:36 -07:00
@@ -27,6 +27,7 @@
 #include <linux/pci.h>
 #include <linux/slab.h>
 #include <linux/gameport.h>
+#include <linux/moduleparam.h>
 #include <sound/core.h>
 #include <sound/control.h>
 #include <sound/pcm.h>
@@ -36,7 +37,6 @@
 #else
 #include <sound/ak4531_codec.h>
 #endif
-#define SNDRV_GET_ID
 #include <sound/initval.h>
 #include <sound/asoundef.h>
 
@@ -86,23 +86,24 @@
 static int joystick[SNDRV_CARDS];
 #endif
 #endif
+static int boot_devs;
 
-MODULE_PARM(index, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+module_param_array(index, int, boot_devs, 0444);
 MODULE_PARM_DESC(index, "Index value for Ensoniq AudioPCI soundcard.");
 MODULE_PARM_SYNTAX(index, SNDRV_INDEX_DESC);
-MODULE_PARM(id, "1-" __MODULE_STRING(SNDRV_CARDS) "s");
+module_param_array(id, charp, boot_devs, 0444);
 MODULE_PARM_DESC(id, "ID string for Ensoniq AudioPCI soundcard.");
 MODULE_PARM_SYNTAX(id, SNDRV_ID_DESC);
-MODULE_PARM(enable, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+module_param_array(enable, bool, boot_devs, 0444);
 MODULE_PARM_DESC(enable, "Enable Ensoniq AudioPCI soundcard.");
 MODULE_PARM_SYNTAX(enable, SNDRV_ENABLE_DESC);
 #ifdef SUPPORT_JOYSTICK
 #ifdef CHIP1371
-MODULE_PARM(joystick_port, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+module_param_array(joystick_port, int, boot_devs, 0444);
 MODULE_PARM_DESC(joystick_port, "Joystick port address.");
 MODULE_PARM_SYNTAX(joystick_port, SNDRV_ENABLED ",allows:{{0},{1},{0x200},{0x208},{0x210},{0x218}},dialog:list");
 #else
-MODULE_PARM(joystick, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+module_param_array(joystick, bool, boot_devs, 0444);
 MODULE_PARM_DESC(joystick, "Enable joystick.");
 MODULE_PARM_SYNTAX(joystick, SNDRV_ENABLED "," SNDRV_BOOLEAN_FALSE_DESC);
 #endif
@@ -2371,15 +2372,7 @@
 	
 static int __init alsa_card_ens137x_init(void)
 {
-	int err;
-
-	if ((err = pci_module_init(&driver)) < 0) {
-#ifdef MODULE
-		printk(KERN_ERR "Ensoniq AudioPCI soundcard not found or device busy\n");
-#endif
-		return err;
-	}
-	return 0;
+	return pci_module_init(&driver);
 }
 
 static void __exit alsa_card_ens137x_exit(void)
@@ -2389,36 +2382,3 @@
 
 module_init(alsa_card_ens137x_init)
 module_exit(alsa_card_ens137x_exit)
-
-#ifndef MODULE
-
-/* format is: snd-ens1370=enable,index,id,joystick */
-
-static int __init alsa_card_ens137x_setup(char *str)
-{
-	static unsigned __initdata nr_dev = 0;
-
-	if (nr_dev >= SNDRV_CARDS)
-		return 0;
-	(void)(get_option(&str,&enable[nr_dev]) == 2 &&
-	       get_option(&str,&index[nr_dev]) == 2 &&
-	       get_id(&str,&id[nr_dev]) == 2
-#ifdef SUPPORT_JOYSTICK
-#ifdef CHIP1371
-	       && get_option(&str,&joystick_port[nr_dev]) == 2
-#else
-	       && get_option(&str,&joystick[nr_dev]) == 2
-#endif
-#endif
-	       );
-	nr_dev++;
-	return 1;
-}
-
-#if defined(CHIP1370)
-__setup("snd-ens1370=", alsa_card_ens137x_setup);
-#elif defined(CHIP1371)
-__setup("snd-ens1371=", alsa_card_ens137x_setup);
-#endif
-
-#endif /* ifndef MODULE */
diff -Nru a/sound/pci/es1938.c b/sound/pci/es1938.c
--- a/sound/pci/es1938.c	2004-05-26 15:01:36 -07:00
+++ b/sound/pci/es1938.c	2004-05-26 15:01:36 -07:00
@@ -53,12 +53,12 @@
 #include <linux/pci.h>
 #include <linux/slab.h>
 #include <linux/gameport.h>
+#include <linux/moduleparam.h>
 #include <sound/core.h>
 #include <sound/control.h>
 #include <sound/pcm.h>
 #include <sound/opl3.h>
 #include <sound/mpu401.h>
-#define SNDRV_GET_ID
 #include <sound/initval.h>
 
 #include <asm/io.h>
@@ -84,14 +84,15 @@
 static int index[SNDRV_CARDS] = SNDRV_DEFAULT_IDX;	/* Index 0-MAX */
 static char *id[SNDRV_CARDS] = SNDRV_DEFAULT_STR;	/* ID for this card */
 static int enable[SNDRV_CARDS] = SNDRV_DEFAULT_ENABLE_PNP;	/* Enable this card */
+static int boot_devs;
 
-MODULE_PARM(index, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+module_param_array(index, int, boot_devs, 0444);
 MODULE_PARM_DESC(index, "Index value for ESS Solo-1 soundcard.");
 MODULE_PARM_SYNTAX(index, SNDRV_INDEX_DESC);
-MODULE_PARM(id, "1-" __MODULE_STRING(SNDRV_CARDS) "s");
+module_param_array(id, charp, boot_devs, 0444);
 MODULE_PARM_DESC(id, "ID string for ESS Solo-1 soundcard.");
 MODULE_PARM_SYNTAX(id, SNDRV_ID_DESC);
-MODULE_PARM(enable, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+module_param_array(enable, bool, boot_devs, 0444);
 MODULE_PARM_DESC(enable, "Enable ESS Solo-1 soundcard.");
 MODULE_PARM_SYNTAX(enable, SNDRV_ENABLE_DESC);
 
@@ -1700,15 +1701,7 @@
 
 static int __init alsa_card_es1938_init(void)
 {
-	int err;
-
-	if ((err = pci_module_init(&driver)) < 0) {
-#ifdef MODULE
-		printk(KERN_ERR "ESS Solo-1 soundcard not found or device busy\n");
-#endif
-		return err;
-	}
-	return 0;
+	return pci_module_init(&driver);
 }
 
 static void __exit alsa_card_es1938_exit(void)
@@ -1718,24 +1711,3 @@
 
 module_init(alsa_card_es1938_init)
 module_exit(alsa_card_es1938_exit)
-
-#ifndef MODULE
-
-/* format is: snd-es1938=enable,index,id */
-
-static int __init alsa_card_es1938_setup(char *str)
-{
-	static unsigned __initdata nr_dev = 0;
-
-	if (nr_dev >= SNDRV_CARDS)
-		return 0;
-	(void)(get_option(&str,&enable[nr_dev]) == 2 &&
-	       get_option(&str,&index[nr_dev]) == 2 &&
-	       get_id(&str,&id[nr_dev]) == 2);
-	nr_dev++;
-	return 1;
-}
-
-__setup("snd-es1938=", alsa_card_es1938_setup);
-
-#endif /* ifndef MODULE */
diff -Nru a/sound/pci/es1968.c b/sound/pci/es1968.c
--- a/sound/pci/es1968.c	2004-05-26 15:01:36 -07:00
+++ b/sound/pci/es1968.c	2004-05-26 15:01:36 -07:00
@@ -102,11 +102,11 @@
 #include <linux/pci.h>
 #include <linux/slab.h>
 #include <linux/gameport.h>
+#include <linux/moduleparam.h>
 #include <sound/core.h>
 #include <sound/pcm.h>
 #include <sound/mpu401.h>
 #include <sound/ac97_codec.h>
-#define SNDRV_GET_ID
 #include <sound/initval.h>
 
 #define chip_t es1968_t
@@ -138,36 +138,37 @@
 #ifdef SUPPORT_JOYSTICK
 static int joystick[SNDRV_CARDS];
 #endif
+static int boot_devs;
 
-MODULE_PARM(index, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+module_param_array(index, int, boot_devs, 0444);
 MODULE_PARM_DESC(index, "Index value for " CARD_NAME " soundcard.");
 MODULE_PARM_SYNTAX(index, SNDRV_INDEX_DESC);
-MODULE_PARM(id, "1-" __MODULE_STRING(SNDRV_CARDS) "s");
+module_param_array(id, charp, boot_devs, 0444);
 MODULE_PARM_DESC(id, "ID string for " CARD_NAME " soundcard.");
 MODULE_PARM_SYNTAX(id, SNDRV_ID_DESC);
-MODULE_PARM(enable, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+module_param_array(enable, bool, boot_devs, 0444);
 MODULE_PARM_DESC(enable, "Enable " CARD_NAME " soundcard.");
 MODULE_PARM_SYNTAX(enable, SNDRV_ENABLE_DESC);
-MODULE_PARM(total_bufsize, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+module_param_array(total_bufsize, int, boot_devs, 0444);
 MODULE_PARM_DESC(total_bufsize, "Total buffer size in kB.");
 MODULE_PARM_SYNTAX(total_bufsize, SNDRV_ENABLED ",allows:{{1,4096}},skill:advanced");
-MODULE_PARM(pcm_substreams_p, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+module_param_array(pcm_substreams_p, int, boot_devs, 0444);
 MODULE_PARM_DESC(pcm_substreams_p, "PCM Playback substreams for " CARD_NAME " soundcard.");
 MODULE_PARM_SYNTAX(pcm_substreams_p, SNDRV_ENABLED ",allows:{{1,8}}");
-MODULE_PARM(pcm_substreams_c, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+module_param_array(pcm_substreams_c, int, boot_devs, 0444);
 MODULE_PARM_DESC(pcm_substreams_c, "PCM Capture substreams for " CARD_NAME " soundcard.");
 MODULE_PARM_SYNTAX(pcm_substreams_c, SNDRV_ENABLED ",allows:{{0,8}}");
-MODULE_PARM(clock, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+module_param_array(clock, int, boot_devs, 0444);
 MODULE_PARM_DESC(clock, "Clock on " CARD_NAME " soundcard.  (0 = auto-detect)");
 MODULE_PARM_SYNTAX(clock, SNDRV_ENABLED);
-MODULE_PARM(use_pm, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+module_param_array(use_pm, int, boot_devs, 0444);
 MODULE_PARM_DESC(use_pm, "Toggle power-management.  (0 = off, 1 = on, 2 = auto)");
-MODULE_PARM_SYNTAX(use_pm, SNDRV_ENABLED ",allows:{{0,1,2}},skill:advanced");
-MODULE_PARM(enable_mpu, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+MODULE_PARM_SYNTAX(use_pm, SNDRV_ENABLED ",allows:{{0,1,2}},default:2,skill:advanced");
+module_param_array(enable_mpu, int, boot_devs, 0444);
 MODULE_PARM_DESC(enable_mpu, "Enable MPU401.  (0 = off, 1 = on, 2 = auto)");
-MODULE_PARM_SYNTAX(enable_mpu, SNDRV_ENABLED "," SNDRV_BOOLEAN_TRUE_DESC);
+MODULE_PARM_SYNTAX(enable_mpu, SNDRV_ENABLED ",allows:{{0,2}},default:2");
 #ifdef SUPPORT_JOYSTICK
-MODULE_PARM(joystick, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+module_param_array(joystick, bool, boot_devs, 0444);
 MODULE_PARM_DESC(joystick, "Enable joystick.");
 MODULE_PARM_SYNTAX(joystick, SNDRV_ENABLED "," SNDRV_BOOLEAN_FALSE_DESC);
 #endif
@@ -2415,30 +2416,27 @@
 /*
  * PM support
  */
-static void es1968_suspend(es1968_t *chip)
+static int es1968_suspend(snd_card_t *card, unsigned int state)
 {
-	snd_card_t *card = chip->card;
+	es1968_t *chip = snd_magic_cast(es1968_t, card->pm_private_data, return -EINVAL);
 
 	if (! chip->do_pm)
-		return;
-
-	if (card->power_state == SNDRV_CTL_POWER_D3hot)
-		return;
+		return 0;
 
 	snd_pcm_suspend_all(chip->pcm);
+	snd_ac97_suspend(chip->ac97);
 	snd_es1968_bob_stop(chip);
+	snd_es1968_set_acpi(chip, ACPI_D3);
 	snd_power_change_state(card, SNDRV_CTL_POWER_D3hot);
+	return 0;
 }
 
-static void es1968_resume(es1968_t *chip)
+static int es1968_resume(snd_card_t *card, unsigned int state)
 {
-	snd_card_t *card = chip->card;
+	es1968_t *chip = snd_magic_cast(es1968_t, card->pm_private_data, return -EINVAL);
 
 	if (! chip->do_pm)
-		return;
-
-	if (card->power_state == SNDRV_CTL_POWER_D0)
-		return;
+		return 0;
 
 	/* restore all our config */
 	pci_enable_device(chip->pci);
@@ -2460,47 +2458,17 @@
 		snd_es1968_bob_start(chip);
 
 	snd_power_change_state(card, SNDRV_CTL_POWER_D0);
-}
-
-static int snd_es1968_suspend(struct pci_dev *dev, u32 state)
-{
-	es1968_t *chip = snd_magic_cast(es1968_t, pci_get_drvdata(dev), return -ENXIO);
-	es1968_suspend(chip);
 	return 0;
 }
-static int snd_es1968_resume(struct pci_dev *dev)
-{
-	es1968_t *chip = snd_magic_cast(es1968_t, pci_get_drvdata(dev), return -ENXIO);
-	es1968_resume(chip);
-	return 0;
-}
-
-/* callback */
-static int snd_es1968_set_power_state(snd_card_t *card, unsigned int power_state)
-{
-	es1968_t *chip = snd_magic_cast(es1968_t, card->power_state_private_data, return -ENXIO);
-	switch (power_state) {
-	case SNDRV_CTL_POWER_D0:
-	case SNDRV_CTL_POWER_D1:
-	case SNDRV_CTL_POWER_D2:
-		es1968_resume(chip);
-		break;
-	case SNDRV_CTL_POWER_D3hot:
-	case SNDRV_CTL_POWER_D3cold:
-		es1968_suspend(chip);
-		break;
-	default:
-		return -EINVAL;
-	}
-	return 0;
-}
-
 #endif /* CONFIG_PM */
 
 static int snd_es1968_free(es1968_t *chip)
 {
-	if (chip->res_io_port)
-		snd_es1968_reset(chip);
+	if (chip->res_io_port) {
+		synchronize_irq(chip->irq);
+		outw(1, chip->io_port + 0x04); /* clear WP interrupts */
+		outw(0, chip->io_port + ESM_PORT_HOST_IRQ); /* disable IRQ */
+	}
 
 #ifdef SUPPORT_JOYSTICK
 	if (chip->res_joystick) {
@@ -2534,6 +2502,7 @@
 };
 
 static struct ess_device_list pm_whitelist[] __devinitdata = {
+	{ TYPE_MAESTRO2E, 0x0e11 },	/* Compaq Armada */
 	{ TYPE_MAESTRO2E, 0x1028 },
 	{ TYPE_MAESTRO2E, 0x103c },
 	{ TYPE_MAESTRO2E, 0x1179 },
@@ -2636,12 +2605,8 @@
 
 	snd_es1968_chip_init(chip);
 
-#ifdef CONFIG_PM
-	if (chip->do_pm) {
-		card->set_power_state = snd_es1968_set_power_state;
-		card->power_state_private_data = chip;
-	}
-#endif
+	if (chip->do_pm)
+		snd_card_set_pm_callback(card, es1968_suspend, es1968_resume, chip);
 
 	if ((err = snd_device_new(card, SNDRV_DEV_LOWLEVEL, chip, &ops)) < 0) {
 		snd_es1968_free(chip);
@@ -2763,16 +2728,14 @@
 		snd_card_free(card);
 		return err;
 	}
-	pci_set_drvdata(pci, chip);
+	pci_set_drvdata(pci, card);
 	dev++;
 	return 0;
 }
 
 static void __devexit snd_es1968_remove(struct pci_dev *pci)
 {
-	es1968_t *chip = snd_magic_cast(es1968_t, pci_get_drvdata(pci), return);
-	if (chip)
-		snd_card_free(chip->card);
+	snd_card_free(pci_get_drvdata(pci));
 	pci_set_drvdata(pci, NULL);
 }
 
@@ -2781,71 +2744,18 @@
 	.id_table = snd_es1968_ids,
 	.probe = snd_es1968_probe,
 	.remove = __devexit_p(snd_es1968_remove),
-#ifdef CONFIG_PM
-	.suspend = snd_es1968_suspend,
-	.resume = snd_es1968_resume,
-#endif
+	SND_PCI_PM_CALLBACKS
 };
 
 static int __init alsa_card_es1968_init(void)
 {
-	int err;
-
-        if ((err = pci_module_init(&driver)) < 0) {
-#ifdef MODULE
-		printk(KERN_ERR "ESS Maestro soundcard not found or device busy\n");
-#endif
-		return err;
-	}
-	return 0;
+	return pci_module_init(&driver);
 }
 
 static void __exit alsa_card_es1968_exit(void)
 {
-#if 0 // do we really need this?
-	unregister_reboot_notifier(&snd_es1968_nb);
-#endif
 	pci_unregister_driver(&driver);
 }
 
 module_init(alsa_card_es1968_init)
 module_exit(alsa_card_es1968_exit)
-
-#ifndef MODULE
-
-/* format is: snd-es1968=enable,index,id,
-			 total_bufsize,
-			 pcm_substreams_p,
-			 pcm_substreams_c,
-			 clock,
-			 use_pm,
-			 enable_mpu,
-			 joystick
-*/
-
-static int __init alsa_card_es1968_setup(char *str)
-{
-	static unsigned __initdata nr_dev = 0;
-
-	if (nr_dev >= SNDRV_CARDS)
-		return 0;
-	(void)(get_option(&str,&enable[nr_dev]) == 2 &&
-	       get_option(&str,&index[nr_dev]) == 2 &&
-	       get_id(&str,&id[nr_dev]) == 2 &&
-	       get_option(&str,&total_bufsize[nr_dev]) == 2 &&
-	       get_option(&str,&pcm_substreams_p[nr_dev]) == 2 &&
-	       get_option(&str,&pcm_substreams_c[nr_dev]) == 2 &&
-	       get_option(&str,&clock[nr_dev]) == 2 &&
-	       get_option(&str,&use_pm[nr_dev]) == 2 &&
-	       get_option(&str,&enable_mpu[nr_dev]) == 2
-#ifdef SUPPORT_JOYSTICK
-	       && get_option(&str,&joystick[nr_dev]) == 2
-#endif
-	       );
-	nr_dev++;
-	return 1;
-}
-
-__setup("snd-es1968=", alsa_card_es1968_setup);
-
-#endif /* ifndef MODULE */
diff -Nru a/sound/pci/fm801.c b/sound/pci/fm801.c
--- a/sound/pci/fm801.c	2004-05-26 15:01:36 -07:00
+++ b/sound/pci/fm801.c	2004-05-26 15:01:36 -07:00
@@ -25,12 +25,12 @@
 #include <linux/interrupt.h>
 #include <linux/pci.h>
 #include <linux/slab.h>
+#include <linux/moduleparam.h>
 #include <sound/core.h>
 #include <sound/pcm.h>
 #include <sound/ac97_codec.h>
 #include <sound/mpu401.h>
 #include <sound/opl3.h>
-#define SNDRV_GET_ID
 #include <sound/initval.h>
 
 #include <asm/io.h>
@@ -60,17 +60,18 @@
  *  High 16-bits are video (radio) device number + 1
  */
 static int tea575x_tuner[SNDRV_CARDS] = { [0 ... (SNDRV_CARDS-1)] = 0 };
+static int boot_devs;
 
-MODULE_PARM(index, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+module_param_array(index, int, boot_devs, 0444);
 MODULE_PARM_DESC(index, "Index value for the FM801 soundcard.");
 MODULE_PARM_SYNTAX(index, SNDRV_INDEX_DESC);
-MODULE_PARM(id, "1-" __MODULE_STRING(SNDRV_CARDS) "s");
+module_param_array(id, charp, boot_devs, 0444);
 MODULE_PARM_DESC(id, "ID string for the FM801 soundcard.");
 MODULE_PARM_SYNTAX(id, SNDRV_ID_DESC);
-MODULE_PARM(enable, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+module_param_array(enable, bool, boot_devs, 0444);
 MODULE_PARM_DESC(enable, "Enable FM801 soundcard.");
 MODULE_PARM_SYNTAX(enable, SNDRV_ENABLE_DESC);
-MODULE_PARM(tea575x_tuner, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+module_param_array(tea575x_tuner, bool, boot_devs, 0444);
 MODULE_PARM_DESC(tea575x_tuner, "Enable TEA575x tuner.");
 MODULE_PARM_SYNTAX(tea575x_tuner, SNDRV_ENABLE_DESC);
 
@@ -1482,15 +1483,7 @@
 
 static int __init alsa_card_fm801_init(void)
 {
-	int err;
-
-	if ((err = pci_module_init(&driver)) < 0) {
-#ifdef MODULE
-		printk(KERN_ERR "ForteMedia FM801 soundcard not found or device busy\n");
-#endif
-		return err;
-	}
-	return 0;
+	return pci_module_init(&driver);
 }
 
 static void __exit alsa_card_fm801_exit(void)
@@ -1500,25 +1493,3 @@
 
 module_init(alsa_card_fm801_init)
 module_exit(alsa_card_fm801_exit)
-
-#ifndef MODULE
-
-/* format is: snd-fm801=enable,index,id,tea575x_tuner */
-
-static int __init alsa_card_fm801_setup(char *str)
-{
-	static unsigned __initdata nr_dev = 0;
-
-	if (nr_dev >= SNDRV_CARDS)
-		return 0;
-	(void)(get_option(&str,&enable[nr_dev]) == 2 &&
-	       get_option(&str,&index[nr_dev]) == 2 &&
-	       get_id(&str,&id[nr_dev]) == 2 &&
-	       get_option(&str,&tea575x_tuner[nr_dev]));
-	nr_dev++;
-	return 1;
-}
-
-__setup("snd-fm801=", alsa_card_fm801_setup);
-
-#endif /* ifndef MODULE */
diff -Nru a/sound/pci/ice1712/Makefile b/sound/pci/ice1712/Makefile
--- a/sound/pci/ice1712/Makefile	2004-05-26 15:01:35 -07:00
+++ b/sound/pci/ice1712/Makefile	2004-05-26 15:01:35 -07:00
@@ -5,7 +5,7 @@
 
 snd-ice17xx-ak4xxx-objs := ak4xxx.o
 snd-ice1712-objs := ice1712.o delta.o hoontech.o ews.o
-snd-ice1724-objs := ice1724.o amp.o revo.o aureon.o prodigy.o
+snd-ice1724-objs := ice1724.o amp.o revo.o aureon.o
 
 # Toplevel Module Dependency
 obj-$(CONFIG_SND_ICE1712) += snd-ice1712.o snd-ice17xx-ak4xxx.o
diff -Nru a/sound/pci/ice1712/amp.c b/sound/pci/ice1712/amp.c
--- a/sound/pci/ice1712/amp.c	2004-05-26 15:01:36 -07:00
+++ b/sound/pci/ice1712/amp.c	2004-05-26 15:01:36 -07:00
@@ -54,10 +54,11 @@
 /* entry point */
 struct snd_ice1712_card_info snd_vt1724_amp_cards[] __devinitdata = {
 	{
-		VT1724_SUBDEVICE_AUDIO2000,
-		"AMP Ltd AUDIO2000",
-		snd_vt1724_amp_init,
-		snd_vt1724_amp_add_controls,
+		.subvendor = VT1724_SUBDEVICE_AUDIO2000,
+		.name = "AMP Ltd AUDIO2000",
+		.model = "amp2000",
+		.chip_init = snd_vt1724_amp_init,
+		.build_controls = snd_vt1724_amp_add_controls,
 	},
 	{ } /* terminator */
 };
diff -Nru a/sound/pci/ice1712/aureon.c b/sound/pci/ice1712/aureon.c
--- a/sound/pci/ice1712/aureon.c	2004-05-26 15:01:35 -07:00
+++ b/sound/pci/ice1712/aureon.c	2004-05-26 15:01:35 -07:00
@@ -38,6 +38,25 @@
  *   the analog mixing but not easily controllable (it's not connected
  *   directly from envy24ht chip).  so let's leave it as it is.
  *
+ *
+ *   Lowlevel functions for AudioTrak Prodigy 7.1 (and possibly 192) cards
+ *      Copyright (c) 2003 Dimitromanolakis Apostolos <apostol@cs.utoronto.ca>
+ *
+ *   version 0.82: Stable / not all features work yet (no communication with AC97 secondary)
+ *       added 64x/128x oversampling switch (should be 64x only for 96khz)
+ *       fixed some recording labels (still need to check the rest)
+ *       recording is working probably thanks to correct wm8770 initialization
+ *
+ *   version 0.5: Initial release:
+ *           working: analog output, mixer, headphone amplifier switch
+ *       not working: prety much everything else, at least i could verify that
+ *                    we have no digital output, no capture, pretty bad clicks and poops
+ *                    on mixer switch and other coll stuff.
+ *
+ * - Prodigy boards are equipped with AC97 STAC9744 chip , too.  it's used to do
+ *   the analog mixing but not easily controllable (it's not connected
+ *   directly from envy24ht chip).  so let's leave it as it is.
+ *
  */      
 
 #include <sound/driver.h>
@@ -77,12 +96,18 @@
 static void aureon_spi_write(ice1712_t *ice, unsigned int cs, unsigned int data, int bits)
 {
 	unsigned int tmp;
+	unsigned int cscs;
 	int i;
 
 	tmp = snd_ice1712_gpio_read(ice);
 
+	if (ice->eeprom.subvendor == VT1724_SUBDEVICE_PRODIGY71)
+		cscs = PRODIGY_CS8415_CS;
+	else
+		cscs = AUREON_CS8415_CS;
+
 	snd_ice1712_gpio_set_mask(ice, ~(AUREON_WM_RW|AUREON_WM_DATA|AUREON_WM_CLK|
-					 AUREON_WM_CS|AUREON_CS8415_CS));
+					 AUREON_WM_CS|cscs));
 	tmp |= AUREON_WM_RW;
 	tmp &= ~cs;
 	snd_ice1712_gpio_write(ice, tmp);
@@ -135,6 +160,47 @@
 }
 
 /*
+ * DAC mute control
+ */
+static int wm_dac_mute_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;
+}
+
+static int wm_dac_mute_get(snd_kcontrol_t *kcontrol, snd_ctl_elem_value_t *ucontrol)
+{
+	ice1712_t *ice = snd_kcontrol_chip(kcontrol);
+	unsigned short val;
+
+	down(&ice->gpio_mutex);
+	val = wm_get(ice, snd_ctl_get_ioffidx(kcontrol, &ucontrol->id)+WM_MUTE);
+	ucontrol->value.integer.value[0] = ~val>>4 & 0x1;
+	up(&ice->gpio_mutex);
+	return 0;
+}
+
+static int wm_dac_mute_put(snd_kcontrol_t * kcontrol, snd_ctl_elem_value_t * ucontrol)
+{
+	ice1712_t *ice = snd_kcontrol_chip(kcontrol);
+	unsigned short new, old;
+	int change;
+
+	snd_ice1712_save_gpio_status(ice);
+	old = wm_get(ice, snd_ctl_get_ioffidx(kcontrol, &ucontrol->id)+WM_MUTE);
+	new = (~ucontrol->value.integer.value[0]<<4&0x10) | (old&~0x10);
+	change = (new != old);
+	if (change)
+		wm_put(ice, snd_ctl_get_ioffidx(kcontrol, &ucontrol->id)+WM_MUTE, new);
+	snd_ice1712_restore_gpio_status(ice);
+
+	return change;
+}
+
+/*
  * DAC volume attenuation mixer control
  */
 static int wm_dac_vol_info(snd_kcontrol_t *kcontrol, snd_ctl_elem_info_t *uinfo)
@@ -192,6 +258,47 @@
 }
 
 /*
+ * ADC mute control
+ */
+static int wm_adc_mute_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;
+}
+
+static int wm_adc_mute_get(snd_kcontrol_t *kcontrol, snd_ctl_elem_value_t *ucontrol)
+{
+	ice1712_t *ice = snd_kcontrol_chip(kcontrol);
+	unsigned short val;
+
+	down(&ice->gpio_mutex);
+	val = wm_get(ice, snd_ctl_get_ioffidx(kcontrol, &ucontrol->id)+WM_ADC_GAIN);
+	ucontrol->value.integer.value[0] = ~val>>5 & 0x1;
+	up(&ice->gpio_mutex);
+	return 0;
+}
+
+static int wm_adc_mute_put(snd_kcontrol_t * kcontrol, snd_ctl_elem_value_t * ucontrol)
+{
+	ice1712_t *ice = snd_kcontrol_chip(kcontrol);
+	unsigned short new, old;
+	int change;
+
+	snd_ice1712_save_gpio_status(ice);
+	old = wm_get(ice, snd_ctl_get_ioffidx(kcontrol, &ucontrol->id)+WM_ADC_GAIN);
+	new = (~ucontrol->value.integer.value[0]<<5&0x20) | (old&~0x20);
+	change = (new != old);
+	if (change)
+		wm_put(ice, snd_ctl_get_ioffidx(kcontrol, &ucontrol->id)+WM_ADC_GAIN, new);
+	snd_ice1712_restore_gpio_status(ice);
+
+	return change;
+}
+
+/*
  * ADC gain mixer control
  */
 static int wm_adc_vol_info(snd_kcontrol_t *kcontrol, snd_ctl_elem_info_t *uinfo)
@@ -227,10 +334,10 @@
 	snd_ice1712_save_gpio_status(ice);
 	idx  = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id) + WM_ADC_GAIN;
 	nvol = ucontrol->value.integer.value[0];
-	ovol = wm_get(ice, idx) & 0x1f;
-	change = (ovol != nvol);
+	ovol = wm_get(ice, idx);
+	change = ((ovol & 0x1f)  != nvol);
 	if (change)
-		wm_put(ice, idx, nvol);
+		wm_put(ice, idx, nvol | (ovol & ~0x1f));
 	snd_ice1712_restore_gpio_status(ice);
 	return change;
 }
@@ -241,18 +348,15 @@
 static int wm_adc_mux_info(snd_kcontrol_t *kcontrol, snd_ctl_elem_info_t *uinfo)
 {
 	static char *texts[] = {
-		"CD Left",
-		"CD Right",
-		"Aux Left",
-		"Aux Right",
-		"Line Left",
-		"Line Right",
-		"Mic Left",
-		"Mic Right",
+		"CD",		//AIN1
+		"Aux",		//AIN2
+		"Line",		//AIN3
+		"Mic",		//AIN4
+		"AC97"		//AIN5
 	};
 	uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;
-	uinfo->count = 2;
-	uinfo->value.enumerated.items = 8;
+	uinfo->count = 1;
+	uinfo->value.enumerated.items = 5;
 	if (uinfo->value.enumerated.item >= uinfo->value.enumerated.items)
 		uinfo->value.enumerated.item = uinfo->value.enumerated.items - 1;
 	strcpy(uinfo->value.enumerated.name, texts[uinfo->value.enumerated.item]);
@@ -291,6 +395,127 @@
 }
 
 /*
+ * Headphone Amplifier
+ */
+static int aureon_set_headphone_amp(ice1712_t *ice, int enable)
+{
+	unsigned int tmp, tmp2;
+
+	tmp2 = tmp = snd_ice1712_gpio_read(ice);
+	if (enable)
+		tmp |= AUREON_HP_SEL;
+	else
+		tmp &= ~ AUREON_HP_SEL;
+	if (tmp != tmp2) {
+		snd_ice1712_gpio_write(ice, tmp);
+		return 1;
+	}
+	return 0;
+}
+
+static int aureon_get_headphone_amp(ice1712_t *ice)
+{
+	unsigned int tmp = snd_ice1712_gpio_read(ice);
+
+	return ( tmp & AUREON_HP_SEL )!= 0;
+}
+
+static int aureon_bool_info(snd_kcontrol_t *k, 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;
+}
+
+static int aureon_hpamp_get(snd_kcontrol_t *kcontrol, snd_ctl_elem_value_t *ucontrol)
+{
+	ice1712_t *ice = snd_kcontrol_chip(kcontrol);
+
+	ucontrol->value.integer.value[0] = aureon_get_headphone_amp(ice);
+	return 0;
+}
+
+
+static int aureon_hpamp_put(snd_kcontrol_t *kcontrol, snd_ctl_elem_value_t *ucontrol)
+{
+	ice1712_t *ice = snd_kcontrol_chip(kcontrol);
+
+	return aureon_set_headphone_amp(ice,ucontrol->value.integer.value[0]);
+}
+
+/*
+ * Deemphasis
+ */
+static int aureon_deemp_get(snd_kcontrol_t *kcontrol, snd_ctl_elem_value_t *ucontrol)
+{
+	ice1712_t *ice = snd_kcontrol_chip(kcontrol);
+	ucontrol->value.integer.value[0] = (wm_get(ice, WM_DAC_CTRL2) & 0xf) == 0xf;
+	return 0;
+}
+
+static int aureon_deemp_put(snd_kcontrol_t *kcontrol, snd_ctl_elem_value_t *ucontrol)
+{
+	ice1712_t *ice = snd_kcontrol_chip(kcontrol);
+	int temp, temp2;
+	temp2 = temp = wm_get(ice, WM_DAC_CTRL2);
+	if (ucontrol->value.integer.value[0])
+		temp |= 0xf;
+	else
+		temp &= ~0xf;
+	if (temp != temp2) {
+		wm_put(ice, WM_DAC_CTRL2, temp);
+		return 1;
+	}
+	return 0;
+}
+
+/*
+ * ADC Oversampling
+ */
+static int aureon_oversampling_info(snd_kcontrol_t *k, snd_ctl_elem_info_t *uinfo)
+{
+	static char *texts[2] = { "128x", "64x"	};
+
+	uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;
+	uinfo->count = 1;
+	uinfo->value.enumerated.items = 2;
+
+	if (uinfo->value.enumerated.item >= uinfo->value.enumerated.items)
+		uinfo->value.enumerated.item = uinfo->value.enumerated.items - 1;
+	strcpy(uinfo->value.enumerated.name, texts[uinfo->value.enumerated.item]);
+
+        return 0;
+}
+
+static int aureon_oversampling_get(snd_kcontrol_t *kcontrol, snd_ctl_elem_value_t *ucontrol)
+{
+	ice1712_t *ice = snd_kcontrol_chip(kcontrol);
+	ucontrol->value.enumerated.item[0] = (wm_get(ice, WM_MASTER) & 0x8) == 0x8;
+	return 0;
+}
+
+static int aureon_oversampling_put(snd_kcontrol_t *kcontrol, snd_ctl_elem_value_t *ucontrol)
+{
+	int temp, temp2;
+	ice1712_t *ice = snd_kcontrol_chip(kcontrol);
+
+	temp2 = temp = wm_get(ice, WM_MASTER);
+
+	if (ucontrol->value.enumerated.item[0])
+		temp |= 0x8;
+	else
+		temp &= ~0x8;
+
+	if (temp != temp2) {
+		wm_put(ice, WM_MASTER, temp);
+		return 1;
+	}
+	return 0;
+}
+
+/*
  * mixers
  */
 
@@ -315,6 +540,13 @@
 static snd_kcontrol_new_t wm_controls[] __devinitdata = {
 	{
 		.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
+		.name = "Master Playback Switch",
+		.info = wm_dac_mute_info,
+		.get = wm_dac_mute_get,
+		.put = wm_dac_mute_put,
+	},
+	{
+		.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
 		.name = "Master Playback Volume",
 		.info = wm_dac_vol_info,
 		.get = wm_dac_vol_get,
@@ -323,6 +555,15 @@
 	},
 	{
 		.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
+		.name = "ADC Switch",
+		.count = 2,
+		.info = wm_adc_mute_info,
+		.get = wm_adc_mute_get,
+		.put = wm_adc_mute_put,
+
+	},
+	{
+		.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
 		.name = "ADC Volume",
 		.count = 2,
 		.info = wm_adc_vol_info,
@@ -336,6 +577,27 @@
 		.get = wm_adc_mux_get,
 		.put = wm_adc_mux_put,
 	},
+	{
+		.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
+		.name = "Headphone Amplifier Switch",
+		.info = aureon_bool_info,
+		.get = aureon_hpamp_get,
+		.put = aureon_hpamp_put
+	},
+	{
+		.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
+		.name = "DAC Deemphasis Switch",
+		.info = aureon_bool_info,
+		.get = aureon_deemp_get,
+		.put = aureon_deemp_put
+	},
+	{
+		.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
+		.name = "ADC Oversampling",
+		.info = aureon_oversampling_info,
+		.get = aureon_oversampling_get,
+		.put = aureon_oversampling_put
+	},
 };
 
 
@@ -365,7 +627,7 @@
  */
 static int __devinit aureon_init(ice1712_t *ice)
 {
-	static unsigned short wm_inits[] = {
+	static unsigned short wm_inits_aureon[] = {
 		/* These come first to reduce init pop noise */
 		0x1b, 0x000,		/* ADC Mux */
 		0x1c, 0x009,		/* Out Mux1 */
@@ -399,20 +661,66 @@
 		0x15, 0x000,		/* no deemphasis, no ZFLG */
 		0x19, 0x000,		/* -12dB ADC/L */
 		0x1a, 0x000,		/* -12dB ADC/R */
+		(unsigned short)-1
+	};
+	static unsigned short wm_inits_prodigy[] = {
+
+		/* These come first to reduce init pop noise */
+		0x1b, 0x000,		/* ADC Mux */
+		0x1c, 0x009,		/* Out Mux1 */
+		0x1d, 0x009,		/* Out Mux2 */
+
+		0x18, 0x000,		/* All power-up */
+
+		0x16, 0x022,		/* I2S, normal polarity, 24bit, high-pass on */
+		0x17, 0x006,		/* 128fs, slave mode */
+
+		0x00, 0,		/* DAC1 analog mute */
+		0x01, 0,		/* DAC2 analog mute */
+		0x02, 0,		/* DAC3 analog mute */
+		0x03, 0,		/* DAC4 analog mute */
+		0x04, 0,		/* DAC5 analog mute */
+		0x05, 0,		/* DAC6 analog mute */
+		0x06, 0,		/* DAC7 analog mute */
+		0x07, 0,		/* DAC8 analog mute */
+		0x08, 0x100,		/* master analog mute */
+
+		0x09, 0x7f,		/* DAC1 digital full */
+		0x0a, 0x7f,		/* DAC2 digital full */
+		0x0b, 0x7f,		/* DAC3 digital full */
+		0x0c, 0x7f,		/* DAC4 digital full */
+		0x0d, 0x7f,		/* DAC5 digital full */
+		0x0e, 0x7f,		/* DAC6 digital full */
+		0x0f, 0x7f,		/* DAC7 digital full */
+		0x10, 0x7f,		/* DAC8 digital full */
+		0x11, 0x1FF,		/* master digital full */
+
+		0x12, 0x000,		/* phase normal */
+		0x13, 0x090,		/* unmute DAC L/R */
+		0x14, 0x000,		/* all unmute */
+		0x15, 0x000,		/* no deemphasis, no ZFLG */
+
+		0x19, 0x000,		/* -12dB ADC/L */
+		0x1a, 0x000,		/* -12dB ADC/R */
+		(unsigned short)-1
+
 	};
 	static unsigned short cs_inits[] = {
 		0x0441, /* RUN */
 		0x0100, /* no mute */
 		0x0200, /* */
 		0x0600, /* slave, 24bit */
+		(unsigned short)-1
 	};
 	unsigned int tmp;
-	unsigned int i;
+	unsigned short *p;
+	unsigned int cscs;
 
 	if (ice->eeprom.subvendor == VT1724_SUBDEVICE_AUREON51_SKY) {
 		ice->num_total_dacs = 6;
 		ice->num_total_adcs = 6;
 	} else {
+		/* aureon 7.1 and prodigy 7.1 */
 		ice->num_total_dacs = 8;
 		ice->num_total_adcs = 8;
 	}
@@ -423,16 +731,22 @@
 		return -ENOMEM;
 	ice->akm_codecs = 1;
 
+	if (ice->eeprom.subvendor == VT1724_SUBDEVICE_PRODIGY71)
+		cscs = PRODIGY_CS8415_CS;
+	else
+		cscs = AUREON_CS8415_CS;
+
 	snd_ice1712_gpio_set_dir(ice, 0xbfffff); /* fix this for the time being */
 
 	/* reset the wm codec as the SPI mode */
 	snd_ice1712_save_gpio_status(ice);
-	snd_ice1712_gpio_set_mask(ice, ~(AUREON_WM_RESET|AUREON_WM_CS|AUREON_CS8415_CS));
+	snd_ice1712_gpio_set_mask(ice, ~(AUREON_WM_RESET|AUREON_WM_CS|
+					 cscs|AUREON_HP_SEL));
 	tmp = snd_ice1712_gpio_read(ice);
 	tmp &= ~AUREON_WM_RESET;
 	snd_ice1712_gpio_write(ice, tmp);
 	udelay(1);
-	tmp |= AUREON_WM_CS | AUREON_CS8415_CS;
+	tmp |= AUREON_WM_CS | cscs;
 	snd_ice1712_gpio_write(ice, tmp);
 	udelay(1);
 	tmp |= AUREON_WM_RESET;
@@ -440,13 +754,19 @@
 	udelay(1);
 
 	/* initialize WM8770 codec */
-	for (i = 0; i < ARRAY_SIZE(wm_inits); i += 2)
-		wm_put(ice, wm_inits[i], wm_inits[i+1]);
+	if (ice->eeprom.subvendor == VT1724_SUBDEVICE_PRODIGY71)
+		p = wm_inits_prodigy;
+	else
+		p = wm_inits_aureon;
+	for (; *p != (unsigned short)-1; p += 2)
+		wm_put(ice, p[0], p[1]);
 
 	/* initialize CS8415A codec */
-	for (i = 0; i < ARRAY_SIZE(cs_inits); i++)
-		aureon_spi_write(ice, AUREON_CS8415_CS,
-				 cs_inits[i] | 0x200000, 24);
+	for (p = cs_inits; *p != (unsigned short)-1; p++)
+		aureon_spi_write(ice, cscs,
+				 *p | 0x200000, 24);
+
+	aureon_set_headphone_amp(ice, 1);
 
 	snd_ice1712_restore_gpio_status(ice);
 
@@ -460,7 +780,7 @@
  */
 
 static unsigned char aureon51_eeprom[] __devinitdata = {
-	0x12,	/* SYSCONF: clock 512, mpu401, spdif-in/ADC, 3DACs */
+	0x2a,	/* SYSCONF: clock 512, mpu401, spdif-in/ADC, 3DACs */
 	0x80,	/* ACLINK: I2S */
 	0xf8,	/* I2S: vol, 96k, 24bit, 192k */
 	0xc3,	/* SPDIF: out-en, out-int, spdif-in */
@@ -476,7 +796,23 @@
 };
 
 static unsigned char aureon71_eeprom[] __devinitdata = {
-	0x13,	/* SYSCONF: clock 512, mpu401, spdif-in/ADC, 4DACs */
+	0x2b,	/* SYSCONF: clock 512, mpu401, spdif-in/ADC, 4DACs */
+	0x80,	/* ACLINK: I2S */
+	0xf8,	/* I2S: vol, 96k, 24bit, 192k */
+	0xc3,	/* SPDIF: out-en, out-int, spdif-in */
+	0xff,	/* GPIO_DIR */
+	0xff,	/* GPIO_DIR1 */
+	0xbf,	/* GPIO_DIR2 */
+	0x00,	/* GPIO_MASK */
+	0x00,	/* GPIO_MASK1 */
+	0x00,	/* GPIO_MASK2 */
+	0x00,	/* GPIO_STATE */
+	0x00,	/* GPIO_STATE1 */
+	0x00,	/* GPIO_STATE2 */
+};
+
+static unsigned char prodigy71_eeprom[] __devinitdata = {
+	0x2b,	/* SYSCONF: clock 512, mpu401, spdif-in/ADC, 4DACs */
 	0x80,	/* ACLINK: I2S */
 	0xf8,	/* I2S: vol, 96k, 24bit, 192k */
 	0xc3,	/* SPDIF: out-en, out-int, spdif-in */
@@ -496,6 +832,7 @@
 	{
 		.subvendor = VT1724_SUBDEVICE_AUREON51_SKY,
 		.name = "Terratec Aureon 5.1-Sky",
+		.model = "aureon51",
 		.chip_init = aureon_init,
 		.build_controls = aureon_add_controls,
 		.eeprom_size = sizeof(aureon51_eeprom),
@@ -504,10 +841,29 @@
 	{
 		.subvendor = VT1724_SUBDEVICE_AUREON71_SPACE,
 		.name = "Terratec Aureon 7.1-Space",
+		.model = "aureon71",
 		.chip_init = aureon_init,
 		.build_controls = aureon_add_controls,
 		.eeprom_size = sizeof(aureon71_eeprom),
 		.eeprom_data = aureon71_eeprom,
+	},
+ 	{
+ 		.subvendor = VT1724_SUBDEVICE_AUREON71_UNIVERSE,
+ 		.name = "Terratec Aureon 7.1-Universe",
+		/* model not needed - identical with 7.1-Space */
+ 		.chip_init = aureon_init,
+ 		.build_controls = aureon_add_controls,
+ 		.eeprom_size = sizeof(aureon71_eeprom),
+ 		.eeprom_data = aureon71_eeprom,
+	},
+	{
+		.subvendor = VT1724_SUBDEVICE_PRODIGY71,
+		.name = "Audiotrak Prodigy 7.1",
+		.model = "prodigy71",
+		.chip_init = aureon_init,
+		.build_controls = aureon_add_controls,
+		.eeprom_size = sizeof(prodigy71_eeprom),
+		.eeprom_data = prodigy71_eeprom,
 	},
 	{ } /* terminator */
 };
diff -Nru a/sound/pci/ice1712/aureon.h b/sound/pci/ice1712/aureon.h
--- a/sound/pci/ice1712/aureon.h	2004-05-26 15:01:36 -07:00
+++ b/sound/pci/ice1712/aureon.h	2004-05-26 15:01:36 -07:00
@@ -25,10 +25,14 @@
  */      
 
 #define  AUREON_DEVICE_DESC 	       "{Terratec,Aureon 5.1 Sky},"\
-				       "{Terratec,Aureon 7.1 Space},"
+				       "{Terratec,Aureon 7.1 Space},"\
+				       "{Terratec,Aureon 7.1 Universe}," \
+					"{AudioTrak,Prodigy 7.1},"
 
 #define VT1724_SUBDEVICE_AUREON51_SKY	0x3b154711	/* Aureon 5.1 Sky */
 #define VT1724_SUBDEVICE_AUREON71_SPACE	0x3b154511	/* Aureon 7.1 Space */
+#define VT1724_SUBDEVICE_AUREON71_UNIVERSE	0x3b155311	/* Aureon 7.1 Universe */
+#define VT1724_SUBDEVICE_PRODIGY71	0x33495345	/* PRODIGY 7.1 */
 
 extern struct snd_ice1712_card_info  snd_vt1724_aureon_cards[];
 
@@ -43,5 +47,9 @@
 #define AUREON_DIGITAL_SEL1	(1 << 15)
 #define AUREON_HP_SEL		(1 << 14)
 #define AUREON_WM_CS		(1 << 12)
+
+/* Prodigy has different pin assignment for chip select */
+#define PRODIGY_CS8415_CS	(1 << 23)
+#define PRODIGY_CS8415_CDTO	(1 << 22)
 
 #endif /* __SOUND_AUREON_H */
diff -Nru a/sound/pci/ice1712/delta.c b/sound/pci/ice1712/delta.c
--- a/sound/pci/ice1712/delta.c	2004-05-26 15:01:35 -07:00
+++ b/sound/pci/ice1712/delta.c	2004-05-26 15:01:35 -07:00
@@ -692,56 +692,64 @@
 /* entry point */
 struct snd_ice1712_card_info snd_ice1712_delta_cards[] __devinitdata = {
 	{
-		ICE1712_SUBDEVICE_DELTA1010,
-		"M Audio Delta 1010",
-		snd_ice1712_delta_init,
-		snd_ice1712_delta_add_controls,
-	},
-	{
-		ICE1712_SUBDEVICE_DELTADIO2496,
-		"M Audio Delta DiO 2496",
-		snd_ice1712_delta_init,
-		snd_ice1712_delta_add_controls,
-		1, /* NO MPU */
-	},
-	{
-		ICE1712_SUBDEVICE_DELTA66,
-		"M Audio Delta 66",
-		snd_ice1712_delta_init,
-		snd_ice1712_delta_add_controls,
-		1, /* NO MPU */
-	},
-	{
-		ICE1712_SUBDEVICE_DELTA44,
-		"M Audio Delta 44",
-		snd_ice1712_delta_init,
-		snd_ice1712_delta_add_controls,
-		1, /* NO MPU */
-	},
-	{
-		ICE1712_SUBDEVICE_AUDIOPHILE,
-		"M Audio Audiophile 24/96",
-		snd_ice1712_delta_init,
-		snd_ice1712_delta_add_controls,
-	},
-	{
-		ICE1712_SUBDEVICE_DELTA410,
-		"M Audio Delta 410",
-		snd_ice1712_delta_init,
-		snd_ice1712_delta_add_controls,
-	},
-	{
-		ICE1712_SUBDEVICE_DELTA1010LT,
-		"M Audio Delta 1010LT",
-		snd_ice1712_delta_init,
-		snd_ice1712_delta_add_controls,
-	},
-	{
-		ICE1712_SUBDEVICE_VX442,
-		"Digigram VX442",
-		snd_ice1712_delta_init,
-		snd_ice1712_delta_add_controls,
-		1, /* NO MPU */
+		.subvendor = ICE1712_SUBDEVICE_DELTA1010,
+		.name = "M Audio Delta 1010",
+		.model = "delta1010",
+		.chip_init = snd_ice1712_delta_init,
+		.build_controls = snd_ice1712_delta_add_controls,
+	},
+	{
+		.subvendor = ICE1712_SUBDEVICE_DELTADIO2496,
+		.name = "M Audio Delta DiO 2496",
+		.model = "dio2496",
+		.chip_init = snd_ice1712_delta_init,
+		.build_controls = snd_ice1712_delta_add_controls,
+		.no_mpu401 = 1,
+	},
+	{
+		.subvendor = ICE1712_SUBDEVICE_DELTA66,
+		.name = "M Audio Delta 66",
+		.model = "delta66",
+		.chip_init = snd_ice1712_delta_init,
+		.build_controls = snd_ice1712_delta_add_controls,
+		.no_mpu401 = 1,
+	},
+	{
+		.subvendor = ICE1712_SUBDEVICE_DELTA44,
+		.name = "M Audio Delta 44",
+		.model = "delta44",
+		.chip_init = snd_ice1712_delta_init,
+		.build_controls = snd_ice1712_delta_add_controls,
+		.no_mpu401 = 1,
+	},
+	{
+		.subvendor = ICE1712_SUBDEVICE_AUDIOPHILE,
+		.name = "M Audio Audiophile 24/96",
+		.model = "audiophile",
+		.chip_init = snd_ice1712_delta_init,
+		.build_controls = snd_ice1712_delta_add_controls,
+	},
+	{
+		.subvendor = ICE1712_SUBDEVICE_DELTA410,
+		.name = "M Audio Delta 410",
+		.model = "delta410",
+		.chip_init = snd_ice1712_delta_init,
+		.build_controls = snd_ice1712_delta_add_controls,
+	},
+	{
+		.subvendor = ICE1712_SUBDEVICE_DELTA1010LT,
+		.name = "M Audio Delta 1010LT",
+		.model = "delta1010lt",
+		.chip_init = snd_ice1712_delta_init,
+		.build_controls = snd_ice1712_delta_add_controls,
+	},
+	{
+		.subvendor = ICE1712_SUBDEVICE_VX442,
+		.name = "Digigram VX442",
+		.model = "vx442",
+		.chip_init = snd_ice1712_delta_init,
+		.build_controls = snd_ice1712_delta_add_controls,
+		.no_mpu401 = 1,
 	},
 	{ } /* terminator */
 };
diff -Nru a/sound/pci/ice1712/envy24ht.h b/sound/pci/ice1712/envy24ht.h
--- a/sound/pci/ice1712/envy24ht.h	2004-05-26 15:01:36 -07:00
+++ b/sound/pci/ice1712/envy24ht.h	2004-05-26 15:01:36 -07:00
@@ -209,4 +209,7 @@
 #define VT1724_MT_PDMA1_COUNT		0x76	/* word */
 
 
+unsigned char snd_vt1724_read_i2c(ice1712_t *ice, unsigned char dev, unsigned char addr);
+void snd_vt1724_write_i2c(ice1712_t *ice, unsigned char dev, unsigned char addr, unsigned char data);
+
 #endif /* __SOUND_VT1724_H */
diff -Nru a/sound/pci/ice1712/ews.c b/sound/pci/ice1712/ews.c
--- a/sound/pci/ice1712/ews.c	2004-05-26 15:01:35 -07:00
+++ b/sound/pci/ice1712/ews.c	2004-05-26 15:01:35 -07:00
@@ -971,34 +971,39 @@
 /* entry point */
 struct snd_ice1712_card_info snd_ice1712_ews_cards[] __devinitdata = {
 	{
-		ICE1712_SUBDEVICE_EWX2496,
-		"TerraTec EWX24/96",
-		snd_ice1712_ews_init,
-		snd_ice1712_ews_add_controls,
+		.subvendor = ICE1712_SUBDEVICE_EWX2496,
+		.name = "TerraTec EWX24/96",
+		.model = "ewx2496",
+		.chip_init = snd_ice1712_ews_init,
+		.build_controls = snd_ice1712_ews_add_controls,
 	},
 	{
-		ICE1712_SUBDEVICE_EWS88MT,
-		"TerraTec EWS88MT",
-		snd_ice1712_ews_init,
-		snd_ice1712_ews_add_controls,
+		.subvendor = ICE1712_SUBDEVICE_EWS88MT,
+		.name = "TerraTec EWS88MT",
+		.model = "ews88mt",
+		.chip_init = snd_ice1712_ews_init,
+		.build_controls = snd_ice1712_ews_add_controls,
 	},
 	{
-		ICE1712_SUBDEVICE_EWS88MT_NEW,
-		"TerraTec EWS88MT",
-		snd_ice1712_ews_init,
-		snd_ice1712_ews_add_controls,
+		.subvendor = ICE1712_SUBDEVICE_EWS88MT_NEW,
+		.name = "TerraTec EWS88MT",
+		.model = "ews88mt_new",
+		.chip_init = snd_ice1712_ews_init,
+		.build_controls = snd_ice1712_ews_add_controls,
 	},
 	{
-		ICE1712_SUBDEVICE_EWS88D,
-		"TerraTec EWS88D",
-		snd_ice1712_ews_init,
-		snd_ice1712_ews_add_controls,
+		.subvendor = ICE1712_SUBDEVICE_EWS88D,
+		.name = "TerraTec EWS88D",
+		.model = "ews88d",
+		.chip_init = snd_ice1712_ews_init,
+		.build_controls = snd_ice1712_ews_add_controls,
 	},
 	{
-		ICE1712_SUBDEVICE_DMX6FIRE,
-		"TerraTec DMX6Fire",
-		snd_ice1712_ews_init,
-		snd_ice1712_ews_add_controls,
+		.subvendor = ICE1712_SUBDEVICE_DMX6FIRE,
+		.name = "TerraTec DMX6Fire",
+		.model = "dmx6fire",
+		.chip_init = snd_ice1712_ews_init,
+		.build_controls = snd_ice1712_ews_add_controls,
 	},
 	{ } /* terminator */
 };
diff -Nru a/sound/pci/ice1712/hoontech.c b/sound/pci/ice1712/hoontech.c
--- a/sound/pci/ice1712/hoontech.c	2004-05-26 15:01:36 -07:00
+++ b/sound/pci/ice1712/hoontech.c	2004-05-26 15:01:36 -07:00
@@ -83,6 +83,7 @@
 		ICE1712_STDSP24_2_CHN4(ice->hoontech_boxbits, 0);
 	ICE1712_STDSP24_2_MIDI1(ice->hoontech_boxbits, activate);
 	snd_ice1712_stdsp24_gpio_write(ice, ice->hoontech_boxbits[2]);
+	snd_ice1712_stdsp24_gpio_write(ice, ice->hoontech_boxbits[3]);
 
 	ICE1712_STDSP24_1_CHN1(ice->hoontech_boxbits, 1);
 	ICE1712_STDSP24_1_CHN2(ice->hoontech_boxbits, 1);
@@ -117,7 +118,7 @@
 	up(&ice->gpio_mutex);
 }
 
-static void __devinit snd_ice1712_stdsp24_box_midi(ice1712_t *ice, int box, int master, int slave)
+static void __devinit snd_ice1712_stdsp24_box_midi(ice1712_t *ice, int box, int master)
 {
 	down(&ice->gpio_mutex);
 
@@ -128,23 +129,26 @@
 	ICE1712_STDSP24_2_MIDIIN(ice->hoontech_boxbits, 1);
 	ICE1712_STDSP24_2_MIDI1(ice->hoontech_boxbits, master);
 	snd_ice1712_stdsp24_gpio_write(ice, ice->hoontech_boxbits[2]);
+	snd_ice1712_stdsp24_gpio_write(ice, ice->hoontech_boxbits[3]);
 
 	udelay(100);
 	
 	ICE1712_STDSP24_2_MIDIIN(ice->hoontech_boxbits, 0);
 	snd_ice1712_stdsp24_gpio_write(ice, ice->hoontech_boxbits[2]);
 	
-	udelay(100);
+	mdelay(10);
 	
 	ICE1712_STDSP24_2_MIDIIN(ice->hoontech_boxbits, 1);
 	snd_ice1712_stdsp24_gpio_write(ice, ice->hoontech_boxbits[2]);
 
-	udelay(100);
+	up(&ice->gpio_mutex);
+}
 
-	/* MIDI2 is direct */
-	ICE1712_STDSP24_3_MIDI2(ice->hoontech_boxbits, slave);
+static void __devinit snd_ice1712_stdsp24_midi2(ice1712_t *ice, int activate)
+{
+	down(&ice->gpio_mutex);
+	ICE1712_STDSP24_3_MIDI2(ice->hoontech_boxbits, activate);
 	snd_ice1712_stdsp24_gpio_write(ice, ice->hoontech_boxbits[3]);
-
 	up(&ice->gpio_mutex);
 }
 
@@ -204,25 +208,118 @@
 		for (chn = 0; chn < 4; chn++)
 			snd_ice1712_stdsp24_box_channel(ice, box, chn, (ice->hoontech_boxconfig[box] & (1 << chn)) ? 1 : 0);
 		snd_ice1712_stdsp24_box_midi(ice, box,
-				(ice->hoontech_boxconfig[box] & ICE1712_STDSP24_BOX_MIDI1) ? 1 : 0,
-				(ice->hoontech_boxconfig[box] & ICE1712_STDSP24_BOX_MIDI2) ? 1 : 0);
+				(ice->hoontech_boxconfig[box] & ICE1712_STDSP24_BOX_MIDI1) ? 1 : 0);
+		if (ice->hoontech_boxconfig[box] & ICE1712_STDSP24_BOX_MIDI2)
+			snd_ice1712_stdsp24_midi2(ice, 1);
 	}
 
 	return 0;
 }
 
+/*
+ * AK4524 access
+ */
+
+/* start callback for STDSP24 with modified hardware */
+static void stdsp24_ak4524_lock(akm4xxx_t *ak, int chip)
+{
+	ice1712_t *ice = ak->private_data[0];
+	unsigned char tmp;
+	snd_ice1712_save_gpio_status(ice);
+	tmp =	ICE1712_STDSP24_SERIAL_DATA |
+		ICE1712_STDSP24_SERIAL_CLOCK |
+		ICE1712_STDSP24_AK4524_CS;
+	snd_ice1712_write(ice, ICE1712_IREG_GPIO_DIRECTION,
+			  ice->gpio.direction | tmp);
+	snd_ice1712_write(ice, ICE1712_IREG_GPIO_WRITE_MASK, ~tmp);
+}
+
+static int __devinit snd_ice1712_value_init(ice1712_t *ice)
+{
+	/* Hoontech STDSP24 with modified hardware */
+	static akm4xxx_t akm_stdsp24_mv __devinitdata = {
+		.num_adcs = 2,
+		.num_dacs = 2,
+		.type = SND_AK4524,
+		.ops = {
+			.lock = stdsp24_ak4524_lock
+		}
+	};
+
+	static struct snd_ak4xxx_private akm_stdsp24_mv_priv __devinitdata = {
+		.caddr = 2,
+		.cif = 1, /* CIF high */
+		.data_mask = ICE1712_STDSP24_SERIAL_DATA,
+		.clk_mask = ICE1712_STDSP24_SERIAL_CLOCK,
+		.cs_mask = ICE1712_STDSP24_AK4524_CS,
+		.cs_addr = ICE1712_STDSP24_AK4524_CS,
+		.cs_none = 0,
+		.add_flags = 0,
+	};
+
+	int err;
+	akm4xxx_t *ak;
+
+	/* set the analog DACs */
+	ice->num_total_dacs = 2;
+
+	/* set the analog ADCs */
+	ice->num_total_adcs = 2;
+	
+	/* analog section */
+	ak = ice->akm = kmalloc(sizeof(akm4xxx_t), GFP_KERNEL);
+	if (! ak)
+		return -ENOMEM;
+	ice->akm_codecs = 1;
+
+	err = snd_ice1712_akm4xxx_init(ak, &akm_stdsp24_mv, &akm_stdsp24_mv_priv, ice);
+	if (err < 0)
+		return err;
+
+	/* ak4524 controls */
+	err = snd_ice1712_akm4xxx_build_controls(ice);
+	if (err < 0)
+		return err;
+
+	return 0;
+}
+
+static int __devinit snd_ice1712_ez8_init(ice1712_t *ice)
+{
+	ice->gpio.write_mask = ice->eeprom.gpiomask;
+	ice->gpio.direction = ice->eeprom.gpiodir;
+	snd_ice1712_write(ice, ICE1712_IREG_GPIO_WRITE_MASK, ice->eeprom.gpiomask);
+	snd_ice1712_write(ice, ICE1712_IREG_GPIO_DIRECTION, ice->eeprom.gpiodir);
+	snd_ice1712_write(ice, ICE1712_IREG_GPIO_DATA, ice->eeprom.gpiostate);
+	return 0;
+}
+
 
 /* entry point */
 struct snd_ice1712_card_info snd_ice1712_hoontech_cards[] __devinitdata = {
 	{
-		ICE1712_SUBDEVICE_STDSP24,
-		"Hoontech SoundTrack Audio DSP24",
-		snd_ice1712_hoontech_init,
+		.subvendor = ICE1712_SUBDEVICE_STDSP24,
+		.name = "Hoontech SoundTrack Audio DSP24",
+		.model = "dsp24",
+		.chip_init = snd_ice1712_hoontech_init,
+	},
+	{
+		.subvendor = ICE1712_SUBDEVICE_STDSP24_VALUE,	/* a dummy id */
+		.name = "Hoontech SoundTrack Audio DSP24 Value",
+		.model = "dsp24_value",
+		.chip_init = snd_ice1712_value_init,
+	},
+	{
+		.subvendor = ICE1712_SUBDEVICE_STDSP24_MEDIA7_1,
+		.name = "Hoontech STA DSP24 Media 7.1",
+		.model = "dsp24_71",
+		.chip_init = snd_ice1712_hoontech_init,
 	},
 	{
-		ICE1712_SUBDEVICE_STDSP24_MEDIA7_1,
-		"Hoontech STA DSP24 Media 7.1",
-		snd_ice1712_hoontech_init,
+		.subvendor = ICE1712_SUBDEVICE_EVENT_EZ8,	/* a dummy id */
+		.name = "Event Electronics EZ8",
+		.model = "ez8",
+		.chip_init = snd_ice1712_ez8_init,
 	},
 	{ } /* terminator */
 };
diff -Nru a/sound/pci/ice1712/hoontech.h b/sound/pci/ice1712/hoontech.h
--- a/sound/pci/ice1712/hoontech.h	2004-05-26 15:01:36 -07:00
+++ b/sound/pci/ice1712/hoontech.h	2004-05-26 15:01:36 -07:00
@@ -25,12 +25,15 @@
  */      
 
 #define  HOONTECH_DEVICE_DESC \
-	"{Hoontech SoundTrack DSP 24}," \
-	"{Hoontech SoundTrack DSP 24 Value}," \
-	"{Hoontech SoundTrack DSP 24 Media 7.1}," \
+	"{Hoontech,SoundTrack DSP 24}," \
+	"{Hoontech,SoundTrack DSP 24 Value}," \
+	"{Hoontech,SoundTrack DSP 24 Media 7.1}," \
+	"{Event Electronics,EZ8},"
 
 #define ICE1712_SUBDEVICE_STDSP24		0x12141217	/* Hoontech SoundTrack Audio DSP 24 */
+#define ICE1712_SUBDEVICE_STDSP24_VALUE		0x00010010	/* A dummy id for Hoontech SoundTrack Audio DSP 24 Value */
 #define ICE1712_SUBDEVICE_STDSP24_MEDIA7_1	0x16141217	/* Hoontech ST Audio DSP24 Media 7.1 */
+#define ICE1712_SUBDEVICE_EVENT_EZ8		0x00010001	/* A dummy id for EZ8 */
 
 extern struct snd_ice1712_card_info snd_ice1712_hoontech_cards[];
 
@@ -64,5 +67,11 @@
 #define ICE1712_STDSP24_BOX_CHN4	(1<<3)	/* input channel 4 */
 #define ICE1712_STDSP24_BOX_MIDI1	(1<<8)
 #define ICE1712_STDSP24_BOX_MIDI2	(1<<9)
+
+/* Hoontech SoundTrack Audio DSP 24 Value definitions for modified hardware */
+
+#define ICE1712_STDSP24_AK4524_CS	0x03	/* AK4524 chip select; low = active */
+#define ICE1712_STDSP24_SERIAL_DATA	0x0c	/* ak4524 data */
+#define ICE1712_STDSP24_SERIAL_CLOCK	0x30	/* ak4524 clock */
 
 #endif /* __SOUND_HOONTECH_H */
diff -Nru a/sound/pci/ice1712/ice1712.c b/sound/pci/ice1712/ice1712.c
--- a/sound/pci/ice1712/ice1712.c	2004-05-26 15:01:35 -07:00
+++ b/sound/pci/ice1712/ice1712.c	2004-05-26 15:01:35 -07:00
@@ -41,6 +41,9 @@
  *  2003.02.20  Taksahi Iwai <tiwai@suse.de>
  *	Split vt1724 part to an independent driver.
  *	The GPIO is accessed through the callback functions now.
+ *
+ * 2004.03.31 Doug McLain <nostar@comcast.net>
+ *    Added support for Event Electronics EZ8 card to hoontech.c.
  */
 
 
@@ -51,11 +54,11 @@
 #include <linux/init.h>
 #include <linux/pci.h>
 #include <linux/slab.h>
+#include <linux/moduleparam.h>
 #include <sound/core.h>
 #include <sound/cs8427.h>
 #include <sound/info.h>
 #include <sound/mpu401.h>
-#define SNDRV_GET_ID
 #include <sound/initval.h>
 
 #include <sound/asoundef.h>
@@ -81,24 +84,28 @@
 static int index[SNDRV_CARDS] = SNDRV_DEFAULT_IDX;	/* Index 0-MAX */
 static char *id[SNDRV_CARDS] = SNDRV_DEFAULT_STR;	/* ID for this card */
 static int enable[SNDRV_CARDS] = SNDRV_DEFAULT_ENABLE_PNP;		/* Enable this card */
-static int omni[SNDRV_CARDS] = {[0 ... (SNDRV_CARDS-1)] = 0};	/* Delta44 & 66 Omni I/O support */
+static char *model[SNDRV_CARDS];
+static int omni[SNDRV_CARDS];	/* Delta44 & 66 Omni I/O support */
 static int cs8427_timeout[SNDRV_CARDS] = {[0 ... (SNDRV_CARDS-1)] = 500}; /* CS8427 S/PDIF transciever reset timeout value in msec */
+static int boot_devs;
 
-MODULE_PARM(index, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+module_param_array(index, int, boot_devs, 0444);
 MODULE_PARM_DESC(index, "Index value for ICE1712 soundcard.");
 MODULE_PARM_SYNTAX(index, SNDRV_INDEX_DESC);
-MODULE_PARM(id, "1-" __MODULE_STRING(SNDRV_CARDS) "s");
+module_param_array(id, charp, boot_devs, 0444);
 MODULE_PARM_DESC(id, "ID string for ICE1712 soundcard.");
 MODULE_PARM_SYNTAX(id, SNDRV_ID_DESC);
-MODULE_PARM(enable, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+module_param_array(enable, bool, boot_devs, 0444);
 MODULE_PARM_DESC(enable, "Enable ICE1712 soundcard.");
 MODULE_PARM_SYNTAX(enable, SNDRV_ENABLE_DESC);
-MODULE_PARM(omni, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+module_param_array(omni, bool, boot_devs, 0444);
 MODULE_PARM_DESC(omni, "Enable Midiman M-Audio Delta Omni I/O support.");
 MODULE_PARM_SYNTAX(omni, SNDRV_ENABLED "," SNDRV_ENABLE_DESC);
-MODULE_PARM(cs8427_timeout, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+module_param_array(cs8427_timeout, int, boot_devs, 0444);
 MODULE_PARM_DESC(cs8427_timeout, "Define reset timeout for cs8427 chip in msec resolution.");
 MODULE_PARM_SYNTAX(cs8427_timeout, SNDRV_ENABLED ", allows:{{1,1000}},default=500,skill:advanced");
+module_param_array(model, charp, boot_devs, 0444);
+MODULE_PARM_DESC(model, "Use the given board model.");
 
 #ifndef PCI_VENDOR_ID_ICE
 #define PCI_VENDOR_ID_ICE		0x1412
@@ -1898,6 +1905,74 @@
 	.put = snd_ice1712_pro_internal_clock_put
 };
 
+static int snd_ice1712_pro_internal_clock_default_info(snd_kcontrol_t *kcontrol, snd_ctl_elem_info_t * uinfo)
+{
+	static char *texts[] = {
+		"8000",		/* 0: 6 */
+		"9600",		/* 1: 3 */
+		"11025",	/* 2: 10 */
+		"12000",	/* 3: 2 */
+		"16000",	/* 4: 5 */
+		"22050",	/* 5: 9 */
+		"24000",	/* 6: 1 */
+		"32000",	/* 7: 4 */
+		"44100",	/* 8: 8 */
+		"48000",	/* 9: 0 */
+		"64000",	/* 10: 15 */
+		"88200",	/* 11: 11 */
+		"96000",	/* 12: 7 */
+		// "IEC958 Input",	/* 13: -- */
+	};
+	uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;
+	uinfo->count = 1;
+	uinfo->value.enumerated.items = 13;
+	if (uinfo->value.enumerated.item >= uinfo->value.enumerated.items)
+		uinfo->value.enumerated.item = uinfo->value.enumerated.items - 1;
+	strcpy(uinfo->value.enumerated.name, texts[uinfo->value.enumerated.item]);
+	return 0;
+}
+
+static int snd_ice1712_pro_internal_clock_default_get(snd_kcontrol_t * kcontrol, snd_ctl_elem_value_t * ucontrol)
+{
+	int val;
+	static unsigned int xrate[13] = {
+		8000, 9600, 11025, 12000, 1600, 22050, 24000,
+		32000, 44100, 48000, 64000, 88200, 96000
+	};
+
+	for (val = 0; val < 13; val++) {
+		if (xrate[val] == PRO_RATE_DEFAULT)
+			break;
+	}
+
+	ucontrol->value.enumerated.item[0] = val;
+	return 0;
+}
+
+static int snd_ice1712_pro_internal_clock_default_put(snd_kcontrol_t * kcontrol, snd_ctl_elem_value_t * ucontrol)
+{
+	static unsigned int xrate[13] = {
+		8000, 9600, 11025, 12000, 1600, 22050, 24000,
+		32000, 44100, 48000, 64000, 88200, 96000
+	};
+	unsigned char oval;
+	int change = 0;
+
+	oval = PRO_RATE_DEFAULT;
+	PRO_RATE_DEFAULT = xrate[ucontrol->value.integer.value[0] % 13];
+	change = PRO_RATE_DEFAULT != oval;
+
+	return change;
+}
+
+static snd_kcontrol_new_t snd_ice1712_pro_internal_clock_default __devinitdata = {
+	.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
+	.name = "Multi Track Internal Clock Default",
+	.info = snd_ice1712_pro_internal_clock_default_info,
+	.get = snd_ice1712_pro_internal_clock_default_get,
+	.put = snd_ice1712_pro_internal_clock_default_put
+};
+
 static int snd_ice1712_pro_rate_locking_info(snd_kcontrol_t *kcontrol, snd_ctl_elem_info_t * uinfo)
 {
 	uinfo->type = SNDRV_CTL_ELEM_TYPE_BOOLEAN;
@@ -2213,6 +2288,16 @@
  *
  */
 
+/*
+ * list of available boards
+ */
+static struct snd_ice1712_card_info *card_tables[] __devinitdata = {
+	snd_ice1712_hoontech_cards,
+	snd_ice1712_delta_cards,
+	snd_ice1712_ews_cards,
+	0,
+};
+
 static unsigned char __devinit snd_ice1712_read_i2c(ice1712_t *ice,
 						 unsigned char dev,
 						 unsigned char addr)
@@ -2225,7 +2310,7 @@
 	return inb(ICEREG(ice, I2C_DATA));
 }
 
-static int __devinit snd_ice1712_read_eeprom(ice1712_t *ice)
+static int __devinit snd_ice1712_read_eeprom(ice1712_t *ice, const char *modelname)
 {
 	int dev = 0xa0;		/* EEPROM device address */
 	unsigned int i, size;
@@ -2234,10 +2319,23 @@
 		snd_printk("ICE1712 has not detected EEPROM\n");
 		return -EIO;
 	}
-	ice->eeprom.subvendor = (snd_ice1712_read_i2c(ice, dev, 0x00) << 0) |
-				(snd_ice1712_read_i2c(ice, dev, 0x01) << 8) | 
-				(snd_ice1712_read_i2c(ice, dev, 0x02) << 16) | 
-				(snd_ice1712_read_i2c(ice, dev, 0x03) << 24);
+	if (modelname && *modelname) {
+		struct snd_ice1712_card_info **tbl, *c;
+		for (tbl = card_tables; *tbl; tbl++) {
+			for (c = *tbl; c->subvendor; c++) {
+				if (c->model && !strcmp(modelname, c->model)) {
+					/* use the given subvendor */
+					printk(KERN_INFO "ice1712: Using board model %s\n", c->name);
+					ice->eeprom.subvendor = c->subvendor;
+					break;
+				}
+			}
+		}
+	} else
+		ice->eeprom.subvendor = (snd_ice1712_read_i2c(ice, dev, 0x00) << 0) |
+			(snd_ice1712_read_i2c(ice, dev, 0x01) << 8) | 
+			(snd_ice1712_read_i2c(ice, dev, 0x02) << 16) | 
+			(snd_ice1712_read_i2c(ice, dev, 0x03) << 24);
 	ice->eeprom.size = snd_ice1712_read_i2c(ice, dev, 0x04);
 	if (ice->eeprom.size < 6)
 		ice->eeprom.size = 32; /* FIXME: any cards without the correct size? */
@@ -2335,6 +2433,9 @@
 	err = snd_ctl_add(ice->card, snd_ctl_new1(&snd_ice1712_pro_internal_clock, ice));
 	if (err < 0)
 		return err;
+	err = snd_ctl_add(ice->card, snd_ctl_new1(&snd_ice1712_pro_internal_clock_default, ice));
+	if (err < 0)
+		return err;
 
 	err = snd_ctl_add(ice->card, snd_ctl_new1(&snd_ice1712_pro_rate_locking, ice));
 	if (err < 0)
@@ -2407,6 +2508,7 @@
 
 static int __devinit snd_ice1712_create(snd_card_t * card,
 					struct pci_dev *pci,
+					const char *modelname,
 					int omni,
 					int cs8427_timeout,
 					ice1712_t ** r_ice1712)
@@ -2491,7 +2593,7 @@
 	
 	ice->irq = pci->irq;
 
-	if (snd_ice1712_read_eeprom(ice) < 0) {
+	if (snd_ice1712_read_eeprom(ice, modelname) < 0) {
 		snd_ice1712_free(ice);
 		return -EIO;
 	}
@@ -2526,14 +2628,6 @@
 
 static struct snd_ice1712_card_info no_matched __devinitdata;
 
-static struct snd_ice1712_card_info *card_tables[] __devinitdata = {
-	snd_ice1712_hoontech_cards,
-	snd_ice1712_delta_cards,
-	snd_ice1712_ews_cards,
-	0,
-};
-
-
 static int __devinit snd_ice1712_probe(struct pci_dev *pci,
 				       const struct pci_device_id *pci_id)
 {
@@ -2557,7 +2651,7 @@
 	strcpy(card->driver, "ICE1712");
 	strcpy(card->shortname, "ICEnsemble ICE1712");
 	
-	if ((err = snd_ice1712_create(card, pci, omni[dev], cs8427_timeout[dev], &ice)) < 0) {
+	if ((err = snd_ice1712_create(card, pci, model[dev], omni[dev], cs8427_timeout[dev], &ice)) < 0) {
 		snd_card_free(card);
 		return err;
 	}
@@ -2566,6 +2660,8 @@
 		for (c = *tbl; c->subvendor; c++) {
 			if (c->subvendor == ice->eeprom.subvendor) {
 				strcpy(card->shortname, c->name);
+				if (c->driver) /* specific driver? */
+					strcpy(card->driver, c->driver);
 				if (c->chip_init) {
 					if ((err = c->chip_init(ice)) < 0) {
 						snd_card_free(card);
@@ -2659,15 +2755,7 @@
 
 static int __init alsa_card_ice1712_init(void)
 {
-	int err;
-
-	if ((err = pci_module_init(&driver)) < 0) {
-#ifdef MODULE
-		printk(KERN_ERR "ICE1712 soundcard not found or device busy\n");
-#endif
-		return err;
-	}
-	return 0;
+	return pci_module_init(&driver);
 }
 
 static void __exit alsa_card_ice1712_exit(void)
@@ -2677,24 +2765,3 @@
 
 module_init(alsa_card_ice1712_init)
 module_exit(alsa_card_ice1712_exit)
-
-#ifndef MODULE
-
-/* format is: snd-ice1712=enable,index,id */
-
-static int __init alsa_card_ice1712_setup(char *str)
-{
-	static unsigned __initdata nr_dev = 0;
-
-	if (nr_dev >= SNDRV_CARDS)
-		return 0;
-	(void)(get_option(&str,&enable[nr_dev]) == 2 &&
-	       get_option(&str,&index[nr_dev]) == 2 &&
-	       get_id(&str,&id[nr_dev]) == 2);
-	nr_dev++;
-	return 1;
-}
-
-__setup("snd-ice1712=", alsa_card_ice1712_setup);
-
-#endif /* ifndef MODULE */
diff -Nru a/sound/pci/ice1712/ice1712.h b/sound/pci/ice1712/ice1712.h
--- a/sound/pci/ice1712/ice1712.h	2004-05-26 15:01:35 -07:00
+++ b/sound/pci/ice1712/ice1712.h	2004-05-26 15:01:35 -07:00
@@ -329,6 +329,10 @@
 	unsigned int pro_volumes[20];
 	unsigned int omni: 1;		/* Delta Omni I/O */
 	unsigned int vt1724: 1;
+	unsigned int vt1720: 1;
+	unsigned int has_spdif: 1;	/* VT1720/4 - has SPDIF I/O */
+	unsigned int force_pdma4: 1;	/* VT1720/4 - PDMA4 as non-spdif */
+	unsigned int force_rdma1: 1;	/* VT1720/4 - RDMA1 as non-spdif */
 	unsigned int num_total_dacs;	/* total DACs */
 	unsigned int num_total_adcs;	/* total ADCs */
 	unsigned char hoontech_boxbits[4];
@@ -460,6 +464,8 @@
 struct snd_ice1712_card_info {
 	unsigned int subvendor;
 	char *name;
+	char *model;
+	char *driver;
 	int (*chip_init)(ice1712_t *);
 	int (*build_controls)(ice1712_t *);
 	int no_mpu401: 1;
diff -Nru a/sound/pci/ice1712/ice1724.c b/sound/pci/ice1712/ice1724.c
--- a/sound/pci/ice1712/ice1724.c	2004-05-26 15:01:35 -07:00
+++ b/sound/pci/ice1712/ice1724.c	2004-05-26 15:01:35 -07:00
@@ -1,5 +1,6 @@
 /*
  *   ALSA driver for VT1724 ICEnsemble ICE1724 / VIA VT1724 (Envy24HT)
+ *                   VIA VT1720 (Envy24PT)
  *
  *	Copyright (c) 2000 Jaroslav Kysela <perex@suse.cz>
  *                    2002 James Stafford <jstafford@ampltd.com>
@@ -28,10 +29,10 @@
 #include <linux/init.h>
 #include <linux/pci.h>
 #include <linux/slab.h>
+#include <linux/moduleparam.h>
 #include <sound/core.h>
 #include <sound/info.h>
 #include <sound/mpu401.h>
-#define SNDRV_GET_ID
 #include <sound/initval.h>
 
 #include <sound/asoundef.h>
@@ -43,35 +44,39 @@
 #include "amp.h"
 #include "revo.h"
 #include "aureon.h"
-#include "prodigy.h"
 
 
 MODULE_AUTHOR("Jaroslav Kysela <perex@suse.cz>");
-MODULE_DESCRIPTION("ICEnsemble ICE1724 (Envy24HT)");
+MODULE_DESCRIPTION("VIA ICEnsemble ICE1724/1720 (Envy24HT/PT)");
 MODULE_LICENSE("GPL");
 MODULE_CLASSES("{sound}");
 MODULE_DEVICES("{"
 	       REVO_DEVICE_DESC
 	       AMP_AUDIO2000_DEVICE_DESC
 	       AUREON_DEVICE_DESC
-	       PRODIGY_DEVICE_DESC
+		"{VIA,VT1720},"
 		"{VIA,VT1724},"
 		"{ICEnsemble,Generic ICE1724},"
-		"{ICEnsemble,Generic Envy24HT}}");
+		"{ICEnsemble,Generic Envy24HT}"
+		"{ICEnsemble,Generic Envy24PT}}");
 
 static int index[SNDRV_CARDS] = SNDRV_DEFAULT_IDX;	/* Index 0-MAX */
 static char *id[SNDRV_CARDS] = SNDRV_DEFAULT_STR;	/* ID for this card */
 static int enable[SNDRV_CARDS] = SNDRV_DEFAULT_ENABLE_PNP;		/* Enable this card */
+static char *model[SNDRV_CARDS];
+static int boot_devs;
 
-MODULE_PARM(index, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+module_param_array(index, int, boot_devs, 0444);
 MODULE_PARM_DESC(index, "Index value for ICE1724 soundcard.");
 MODULE_PARM_SYNTAX(index, SNDRV_INDEX_DESC);
-MODULE_PARM(id, "1-" __MODULE_STRING(SNDRV_CARDS) "s");
+module_param_array(id, charp, boot_devs, 0444);
 MODULE_PARM_DESC(id, "ID string for ICE1724 soundcard.");
 MODULE_PARM_SYNTAX(id, SNDRV_ID_DESC);
-MODULE_PARM(enable, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+module_param_array(enable, bool, boot_devs, 0444);
 MODULE_PARM_DESC(enable, "Enable ICE1724 soundcard.");
 MODULE_PARM_SYNTAX(enable, SNDRV_ENABLE_DESC);
+module_param_array(model, charp, boot_devs, 0444);
+MODULE_PARM_DESC(model, "Use the given board model.");
 
 #ifndef PCI_VENDOR_ID_ICE
 #define PCI_VENDOR_ID_ICE		0x1412
@@ -80,6 +85,7 @@
 #define PCI_DEVICE_ID_VT1724		0x1724
 #endif
 
+/* Both VT1720 and VT1724 have the same PCI IDs */
 static struct pci_device_id snd_vt1724_ids[] = {
 	{ PCI_VENDOR_ID_ICE, PCI_DEVICE_ID_VT1724, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 },
 	{ 0, }
@@ -228,6 +234,17 @@
 			status &= ~(VT1724_IRQ_MPU_RX|VT1724_IRQ_MPU_TX);
 		}
 		if (status & VT1724_IRQ_MTPCM) {
+			/*
+			 * Multi-track PCM
+			 * PCM assignment are:
+			 * Playback DMA0 (M/C) = playback_pro_substream
+			 * Playback DMA1 = playback_con_substream_ds[0]
+			 * Playback DMA2 = playback_con_substream_ds[1]
+			 * Playback DMA3 = playback_con_substream_ds[2]
+			 * Playback DMA4 (SPDIF) = playback_con_substream
+			 * Record DMA0 = capture_pro_substream
+			 * Record DMA1 = capture_con_substream
+			 */
 			unsigned char mtstat = inb(ICEMT1724(ice, IRQ));
 			if (mtstat & VT1724_MULTI_PDMA0) {
 				if (ice->playback_pro_substream)
@@ -288,6 +305,12 @@
 	.mask = 0,
 };
 
+static snd_pcm_hw_constraint_list_t hw_constraints_rates_48 = {
+	.count = ARRAY_SIZE(rates) - 5, /* up to 48000 */
+	.list = rates,
+	.mask = 0,
+};
+
 static snd_pcm_hw_constraint_list_t hw_constraints_rates_192 = {
 	.count = ARRAY_SIZE(rates),
 	.list = rates,
@@ -423,6 +446,15 @@
 		if (ice->akm[i].ops.set_rate_val)
 			ice->akm[i].ops.set_rate_val(&ice->akm[i], rate);
 	}
+
+	/* set up AC97 registers if needed */
+	if (! (ice->eeprom.data[ICE_EEP2_ACLINK] & 0x80) && ice->ac97) {
+		snd_ac97_set_rate(ice->ac97, AC97_PCM_FRONT_DAC_RATE, rate);
+		snd_ac97_set_rate(ice->ac97, AC97_PCM_SURR_DAC_RATE, rate);
+		snd_ac97_set_rate(ice->ac97, AC97_PCM_LFE_DAC_RATE, rate);
+		snd_ac97_set_rate(ice->ac97, AC97_SPDIF, rate);
+		snd_ac97_set_rate(ice->ac97, AC97_PCM_LR_ADC_RATE, rate);
+	}
 }
 
 static int snd_vt1724_pcm_hw_params(snd_pcm_substream_t * substream,
@@ -435,6 +467,7 @@
 	down(&ice->open_mutex);
 	/* mark surround channels */
 	if (substream == ice->playback_pro_substream) {
+		/* PDMA0 can be multi-channel up to 8 */
 		chs = chs / 2 - 1;
 		for (i = 0; i < chs; i++) {
 			if (ice->pcm_reserved[i] && ice->pcm_reserved[i] != substream) {
@@ -449,6 +482,7 @@
 		}
 	} else {
 		for (i = 0; i < 3; i++) {
+			/* check individual playback stream */
 			if (ice->playback_con_substream_ds[i] == substream) {
 				if (ice->pcm_reserved[i] && ice->pcm_reserved[i] != substream) {
 					up(&ice->open_mutex);
@@ -609,7 +643,7 @@
 				 SNDRV_PCM_INFO_PAUSE | SNDRV_PCM_INFO_SYNC_START),
 	.formats =		SNDRV_PCM_FMTBIT_S32_LE,
 	.rates =		SNDRV_PCM_RATE_KNOT | SNDRV_PCM_RATE_8000_192000,
-	.rate_min =		4000,
+	.rate_min =		8000,
 	.rate_max =		192000,
 	.channels_min =		2,
 	.channels_max =		8,
@@ -620,6 +654,25 @@
 	.periods_max =		1024,
 };
 
+static snd_pcm_hardware_t snd_vt1724_spdif =
+{
+	.info =			(SNDRV_PCM_INFO_MMAP | SNDRV_PCM_INFO_INTERLEAVED |
+				 SNDRV_PCM_INFO_BLOCK_TRANSFER |
+				 SNDRV_PCM_INFO_MMAP_VALID |
+				 SNDRV_PCM_INFO_PAUSE | SNDRV_PCM_INFO_SYNC_START),
+	.formats =		SNDRV_PCM_FMTBIT_S32_LE,
+	.rates =	        SNDRV_PCM_RATE_32000|SNDRV_PCM_RATE_44100|SNDRV_PCM_RATE_48000,
+	.rate_min =		32000,
+	.rate_max =		48000,
+	.channels_min =		2,
+	.channels_max =		2,
+	.buffer_bytes_max =	(1UL << 18),	/* 16bits dword */
+	.period_bytes_min =	2 * 4 * 2,
+	.period_bytes_max =	(1UL << 18),
+	.periods_min =		2,
+	.periods_max =		1024,
+};
+
 static snd_pcm_hardware_t snd_vt1724_2ch_stereo =
 {
 	.info =			(SNDRV_PCM_INFO_MMAP | SNDRV_PCM_INFO_INTERLEAVED |
@@ -628,7 +681,7 @@
 				 SNDRV_PCM_INFO_PAUSE | SNDRV_PCM_INFO_SYNC_START),
 	.formats =		SNDRV_PCM_FMTBIT_S32_LE,
 	.rates =		SNDRV_PCM_RATE_KNOT | SNDRV_PCM_RATE_8000_192000,
-	.rate_min =		4000,
+	.rate_min =		8000,
 	.rate_max =		192000,
 	.channels_min =		2,
 	.channels_max =		2,
@@ -639,6 +692,41 @@
 	.periods_max =		1024,
 };
 
+/*
+ * set rate constraints
+ */
+static int set_rate_constraints(ice1712_t *ice, snd_pcm_substream_t *substream)
+{
+	snd_pcm_runtime_t *runtime = substream->runtime;
+	if (ice->eeprom.data[ICE_EEP2_ACLINK] & 0x80) {
+		/* I2S */
+		if (ice->eeprom.data[ICE_EEP2_I2S] & 0x08)
+			return snd_pcm_hw_constraint_list(runtime, 0, SNDRV_PCM_HW_PARAM_RATE, &hw_constraints_rates_192);
+		else {
+			runtime->hw.rates = SNDRV_PCM_RATE_KNOT | SNDRV_PCM_RATE_8000_96000;
+			runtime->hw.rate_max = 96000;
+			return snd_pcm_hw_constraint_list(runtime, 0, SNDRV_PCM_HW_PARAM_RATE, &hw_constraints_rates_96);
+		}
+	} else if (ice->ac97) {
+		/* ACLINK */
+		int ratec;
+		if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
+			ratec = AC97_RATES_FRONT_DAC;
+		else
+			ratec = AC97_RATES_ADC;
+		runtime->hw.rates = ice->ac97->rates[ratec];
+		runtime->hw.rate_max = 48000;
+		if (runtime->hw.rates == SNDRV_PCM_RATE_48000) {
+			runtime->hw.rate_min = 48000;
+			return 0;
+		} else {
+			runtime->hw.rates = SNDRV_PCM_RATE_KNOT | SNDRV_PCM_RATE_8000_48000;
+			return snd_pcm_hw_constraint_list(runtime, 0, SNDRV_PCM_HW_PARAM_RATE, &hw_constraints_rates_48);
+		}
+	}
+	return 0;
+}
+
 /* multi-channel playback needs alignment 8x32bit regarless of the channels
  * actually used
  */
@@ -655,12 +743,7 @@
 	runtime->hw = snd_vt1724_playback_pro;
 	snd_pcm_set_sync(substream);
 	snd_pcm_hw_constraint_msbits(runtime, 0, 32, 24);
-	if ((ice->eeprom.data[ICE_EEP2_ACLINK] & 0x80) &&
-	    (ice->eeprom.data[ICE_EEP2_I2S] & 0x08))
-		snd_pcm_hw_constraint_list(runtime, 0, SNDRV_PCM_HW_PARAM_RATE, &hw_constraints_rates_192);
-	else
-		snd_pcm_hw_constraint_list(runtime, 0, SNDRV_PCM_HW_PARAM_RATE, &hw_constraints_rates_96);
-
+	set_rate_constraints(ice, substream);
 	down(&ice->open_mutex);
 	/* calculate the currently available channels */
 	for (chs = 0; chs < 3; chs++) {
@@ -689,11 +772,7 @@
 	runtime->hw = snd_vt1724_2ch_stereo;
 	snd_pcm_set_sync(substream);
 	snd_pcm_hw_constraint_msbits(runtime, 0, 32, 24);
-	if ((ice->eeprom.data[ICE_EEP2_ACLINK] & 0x80) &&
-	    (ice->eeprom.data[ICE_EEP2_I2S] & 0x08))
-		snd_pcm_hw_constraint_list(runtime, 0, SNDRV_PCM_HW_PARAM_RATE, &hw_constraints_rates_192);
-	else
-		snd_pcm_hw_constraint_list(runtime, 0, SNDRV_PCM_HW_PARAM_RATE, &hw_constraints_rates_96);
+	set_rate_constraints(ice, substream);
 	return 0;
 }
 
@@ -812,11 +891,13 @@
 
 	runtime->private_data = (void*)VT1724_PDMA4_START; /* irq/status/trigger bit */
 	ice->playback_con_substream = substream;
-	runtime->hw = snd_vt1724_2ch_stereo;
+	if (ice->force_pdma4) {
+		runtime->hw = snd_vt1724_2ch_stereo;
+		set_rate_constraints(ice, substream);
+	} else
+		runtime->hw = snd_vt1724_spdif;
 	snd_pcm_set_sync(substream);
 	snd_pcm_hw_constraint_msbits(runtime, 0, 32, 24);
-
-	snd_pcm_hw_constraint_list(runtime, 0, SNDRV_PCM_HW_PARAM_RATE, &hw_constraints_rates_192);
 	return 0;
 }
 
@@ -838,10 +919,13 @@
 
 	runtime->private_data = (void*)VT1724_RDMA1_START; /* irq/status/trigger bit */
 	ice->capture_con_substream = substream;
-	runtime->hw = snd_vt1724_2ch_stereo;
+	if (ice->force_rdma1) {
+		runtime->hw = snd_vt1724_2ch_stereo;
+		set_rate_constraints(ice, substream);
+	} else
+		runtime->hw = snd_vt1724_spdif;
 	snd_pcm_set_sync(substream);
 	snd_pcm_hw_constraint_msbits(runtime, 0, 32, 24);
-	snd_pcm_hw_constraint_list(runtime, 0, SNDRV_PCM_HW_PARAM_RATE, &hw_constraints_rates_96);
 	return 0;
 }
 
@@ -881,22 +965,31 @@
 
 static int __devinit snd_vt1724_pcm_spdif(ice1712_t * ice, int device)
 {
+	char *name;
 	snd_pcm_t *pcm;
 	int play, capt;
 	int err;
 
-	if (ice->eeprom.data[ICE_EEP2_SPDIF] & VT1724_CFG_SPDIF_OUT_INT)
+	if (ice->force_pdma4 ||
+	    (ice->eeprom.data[ICE_EEP2_SPDIF] & VT1724_CFG_SPDIF_OUT_INT)) {
 		play = 1;
-	else
+		ice->has_spdif = 1;
+	} else
 		play = 0;
-	if (ice->eeprom.data[ICE_EEP2_SPDIF] & VT1724_CFG_SPDIF_IN)
+	if (ice->force_rdma1 ||
+	    (ice->eeprom.data[ICE_EEP2_SPDIF] & VT1724_CFG_SPDIF_IN)) {
 		capt = 1;
-	else
+		ice->has_spdif = 1;
+	} else
 		capt = 0;
 	if (! play && ! capt)
 		return 0; /* no spdif device */
 
-	err = snd_pcm_new(ice->card, "ICE1724 IEC958", device, play, capt, &pcm);
+	if (ice->force_pdma4 || ice->force_rdma1)
+		name = "ICE1724 Secondary";
+	else
+		name = "IEC1724 IEC958";
+	err = snd_pcm_new(ice->card, name, device, play, capt, &pcm);
 	if (err < 0)
 		return err;
 
@@ -909,7 +1002,7 @@
 
 	pcm->private_data = ice;
 	pcm->info_flags = 0;
-	strcpy(pcm->name, "ICE1724 IEC958");
+	strcpy(pcm->name, name);
 
 	snd_pcm_lib_preallocate_pages_for_all(pcm, SNDRV_DMA_TYPE_DEV,
 					      snd_dma_pci_data(ice->pci), 64*1024, 64*1024);
@@ -983,8 +1076,7 @@
 	runtime->hw = snd_vt1724_2ch_stereo;
 	snd_pcm_set_sync(substream);
 	snd_pcm_hw_constraint_msbits(runtime, 0, 32, 24);
-
-	snd_pcm_hw_constraint_list(runtime, 0, SNDRV_PCM_HW_PARAM_RATE, &hw_constraints_rates_192);
+	set_rate_constraints(ice, substream);
 	return 0;
 }
 
@@ -1723,7 +1815,6 @@
 	snd_vt1724_revo_cards,
 	snd_vt1724_amp_cards, 
 	snd_vt1724_aureon_cards,
-	snd_vt1724_prodigy_cards,
 	0,
 };
 
@@ -1731,9 +1822,7 @@
 /*
  */
 
-static unsigned char __devinit snd_vt1724_read_i2c(ice1712_t *ice,
-						 unsigned char dev,
-						 unsigned char addr)
+unsigned char snd_vt1724_read_i2c(ice1712_t *ice, unsigned char dev, unsigned char addr)
 {
 	long t = 0x10000;
 
@@ -1743,49 +1832,71 @@
 	return inb(ICEREG1724(ice, I2C_DATA));
 }
 
-static int __devinit snd_vt1724_read_eeprom(ice1712_t *ice)
+void snd_vt1724_write_i2c(ice1712_t *ice, unsigned char dev, unsigned char addr, unsigned char data)
 {
-	int dev = 0xa0;		/* EEPROM device address */
+	long t = 0x10000;
+
+	outb(addr, ICEREG1724(ice, I2C_BYTE_ADDR));
+	outb(data, ICEREG1724(ice, I2C_DATA));
+	outb(dev | VT1724_I2C_WRITE, ICEREG1724(ice, I2C_DEV_ADDR));
+	while (t-- > 0 && (inb(ICEREG1724(ice, I2C_CTRL)) & VT1724_I2C_BUSY)) ;
+}
+
+static int __devinit snd_vt1724_read_eeprom(ice1712_t *ice, const char *modelname)
+{
+	const int dev = 0xa0;		/* EEPROM device address */
 	unsigned int i, size;
 	struct snd_ice1712_card_info **tbl, *c;
 
-	if ((inb(ICEREG1724(ice, I2C_CTRL)) & VT1724_I2C_EEPROM) == 0) {
-		snd_printk(KERN_WARNING "ICE1724 has not detected EEPROM\n");
-		// return -EIO;
-	}
-	ice->eeprom.subvendor = (snd_vt1724_read_i2c(ice, dev, 0x00) << 0) |
+	if (! modelname || ! *modelname) {
+		ice->eeprom.subvendor = 0;
+		if ((inb(ICEREG1724(ice, I2C_CTRL)) & VT1724_I2C_EEPROM) != 0)
+			ice->eeprom.subvendor = (snd_vt1724_read_i2c(ice, dev, 0x00) << 0) |
 				(snd_vt1724_read_i2c(ice, dev, 0x01) << 8) | 
 				(snd_vt1724_read_i2c(ice, dev, 0x02) << 16) | 
 				(snd_vt1724_read_i2c(ice, dev, 0x03) << 24);
-
-	/* if the EEPROM is given by the driver, use it */
+		if (ice->eeprom.subvendor == 0 || ice->eeprom.subvendor == (unsigned int)-1) {
+			/* invalid subvendor from EEPROM, try the PCI subststem ID instead */
+			u16 vendor, device;
+			pci_read_config_word(ice->pci, PCI_SUBSYSTEM_VENDOR_ID, &vendor);
+			pci_read_config_word(ice->pci, PCI_SUBSYSTEM_ID, &device);
+			ice->eeprom.subvendor = ((unsigned int)swab16(vendor) << 16) | swab16(device);
+			if (ice->eeprom.subvendor == 0 || ice->eeprom.subvendor == (unsigned int)-1) {
+				printk(KERN_ERR "ice1724: No valid ID is found\n");
+				return -ENXIO;
+			}
+		}
+	}
 	for (tbl = card_tables; *tbl; tbl++) {
 		for (c = *tbl; c->subvendor; c++) {
-			if (c->subvendor == ice->eeprom.subvendor) {
-				if (! c->eeprom_size || ! c->eeprom_data)
-					goto found;
-				snd_printdd("using the defined eeprom..\n");
-				ice->eeprom.version = 2;
-				ice->eeprom.size = c->eeprom_size + 6;
-				memcpy(ice->eeprom.data, c->eeprom_data, c->eeprom_size);
-				goto read_skipped;
-			}
+			if (modelname && c->model && ! strcmp(modelname, c->model)) {
+				printk(KERN_INFO "ice1724: Using board model %s\n", c->name);
+				ice->eeprom.subvendor = c->subvendor;
+			} else if (c->subvendor != ice->eeprom.subvendor)
+				continue;
+			if (! c->eeprom_size || ! c->eeprom_data)
+				goto found;
+			/* if the EEPROM is given by the driver, use it */
+			snd_printdd("using the defined eeprom..\n");
+			ice->eeprom.version = 2;
+			ice->eeprom.size = c->eeprom_size + 6;
+			memcpy(ice->eeprom.data, c->eeprom_data, c->eeprom_size);
+			goto read_skipped;
 		}
 	}
+	printk(KERN_WARNING "ice1724: No matching model found for ID 0x%x\n", ice->eeprom.subvendor);
 
  found:
 	ice->eeprom.size = snd_vt1724_read_i2c(ice, dev, 0x04);
 	if (ice->eeprom.size < 6)
 		ice->eeprom.size = 32;
 	else if (ice->eeprom.size > 32) {
-		snd_printk("invalid EEPROM (size = %i)\n", ice->eeprom.size);
+		printk(KERN_ERR "ice1724: Invalid EEPROM (size = %i)\n", ice->eeprom.size);
 		return -EIO;
 	}
 	ice->eeprom.version = snd_vt1724_read_i2c(ice, dev, 0x05);
-	if (ice->eeprom.version != 2) {
-		snd_printk("invalid EEPROM version %i\n", ice->eeprom.version);
-		// return -EIO;
-	}
+	if (ice->eeprom.version != 2)
+		printk(KERN_WARNING "ice1724: Invalid EEPROM version %i\n", ice->eeprom.version);
 	size = ice->eeprom.size - 6;
 	for (i = 0; i < size; i++)
 		ice->eeprom.data[i] = snd_vt1724_read_i2c(ice, dev, i + 6);
@@ -1819,6 +1930,9 @@
 
 	outb(0, ICEREG1724(ice, POWERDOWN));
 
+	/* read back to check the availability of SPDIF out */
+	ice->eeprom.data[ICE_EEP2_SPDIF] = inb(ICEREG1724(ice, SPDIF_CFG));
+
 	return 0;
 }
 
@@ -1880,7 +1994,10 @@
 
 	if (ice->num_total_dacs > 0) {
 		snd_kcontrol_new_t tmp = snd_vt1724_mixer_pro_analog_route;
-		tmp.count = ice->num_total_dacs;
+		if (ice->vt1720)
+			tmp.count = 2;
+		else
+			tmp.count = ice->num_total_dacs;
 		err = snd_ctl_add(ice->card, snd_ctl_new1(&tmp, ice));
 		if (err < 0)
 			return err;
@@ -1927,6 +2044,7 @@
 
 static int __devinit snd_vt1724_create(snd_card_t * card,
 				       struct pci_dev *pci,
+				       const char *modelname,
 				       ice1712_t ** r_ice1712)
 {
 	ice1712_t *ice;
@@ -1982,7 +2100,7 @@
 
 	ice->irq = pci->irq;
 
-	if (snd_vt1724_read_eeprom(ice) < 0) {
+	if (snd_vt1724_read_eeprom(ice, modelname) < 0) {
 		snd_vt1724_free(ice);
 		return -EIO;
 	}
@@ -2041,7 +2159,7 @@
 	strcpy(card->driver, "ICE1724");
 	strcpy(card->shortname, "ICEnsemble ICE1724");
 	
-	if ((err = snd_vt1724_create(card, pci, &ice)) < 0) {
+	if ((err = snd_vt1724_create(card, pci, model[dev], &ice)) < 0) {
 		snd_card_free(card);
 		return err;
 	}
@@ -2050,6 +2168,8 @@
 		for (c = *tbl; c->subvendor; c++) {
 			if (c->subvendor == ice->eeprom.subvendor) {
 				strcpy(card->shortname, c->name);
+				if (c->driver) /* specific driver? */
+					strcpy(card->driver, c->driver);
 				if (c->chip_init) {
 					if ((err = c->chip_init(ice)) < 0) {
 						snd_card_free(card);
@@ -2088,7 +2208,7 @@
 		return err;
 	}
 
-	if (ice->pcm) { /* has SPDIF I/O */
+	if (ice->pcm && ice->has_spdif) { /* has SPDIF I/O */
 		if ((err = snd_vt1724_spdif_build_controls(ice)) < 0) {
 			snd_card_free(card);
 			return err;
@@ -2141,15 +2261,7 @@
 
 static int __init alsa_card_ice1724_init(void)
 {
-	int err;
-
-	if ((err = pci_module_init(&driver)) < 0) {
-#ifdef MODULE
-		printk(KERN_ERR "ICE1724 soundcard not found or device busy\n");
-#endif
-		return err;
-	}
-	return 0;
+	return pci_module_init(&driver);
 }
 
 static void __exit alsa_card_ice1724_exit(void)
@@ -2159,24 +2271,3 @@
 
 module_init(alsa_card_ice1724_init)
 module_exit(alsa_card_ice1724_exit)
-
-#ifndef MODULE
-
-/* format is: snd-ice1724=enable,index,id */
-
-static int __init alsa_card_ice1724_setup(char *str)
-{
-	static unsigned __initdata nr_dev = 0;
-
-	if (nr_dev >= SNDRV_CARDS)
-		return 0;
-	(void)(get_option(&str,&enable[nr_dev]) == 2 &&
-	       get_option(&str,&index[nr_dev]) == 2 &&
-	       get_id(&str,&id[nr_dev]) == 2);
-	nr_dev++;
-	return 1;
-}
-
-__setup("snd-ice1724=", alsa_card_ice1724_setup);
-
-#endif /* ifndef MODULE */
diff -Nru a/sound/pci/ice1712/prodigy.c b/sound/pci/ice1712/prodigy.c
--- a/sound/pci/ice1712/prodigy.c	2004-05-26 15:01:36 -07:00
+++ /dev/null	Wed Dec 31 16:00:00 196900
@@ -1,663 +0,0 @@
-/*
- *   ALSA driver for ICEnsemble VT1724 (Envy24HT)
- *
- *   Lowlevel functions for AudioTrak Prodigy 7.1 (and possibly 192) cards
- *      Copyright (c) 2003 Dimitromanolakis Apostolos <apostol@cs.utoronto.ca>
- *	based on the aureon.c code (c) 2003 by Takashi Iwai <tiwai@suse.de>
- *
- *   version 0.82: Stable / not all features work yet (no communication with AC97 secondary)
- *       added 64x/128x oversampling switch (should be 64x only for 96khz)
- *       fixed some recording labels (still need to check the rest)
- *       recording is working probably thanks to correct wm8770 initialization
- *
- *   version 0.5: Initial release:
- *           working: analog output, mixer, headphone amplifier switch
- *       not working: prety much everything else, at least i could verify that
- *                    we have no digital output, no capture, pretty bad clicks and poops
- *                    on mixer switch and other coll stuff.
- *
- *   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
- *
- *
- * NOTES:
- *
- *
- *
- * - we reuse the akm4xxx_t record for storing the wm8770 codec data.
- *   both wm and akm codecs are pretty similar, so we can integrate
- *   both controls in the future, once if wm codecs are reused in
- *   many boards.
- *
- * - writing over SPI is implemented but reading is not yet.
- *   the SPDIF-in channel status, etc. can be read from CS chip.
- *
- * - DAC digital volumes are not implemented in the mixer.
- *   if they show better response than DAC analog volumes, we can use them
- *   instead.
- *
- * - Prodigy boards are equipped with AC97 STAC9744 chip , too.  it's used to do
- *   the analog mixing but not easily controllable (it's not connected
- *   directly from envy24ht chip).  so let's leave it as it is.
- *
- */
-
-#define REVISION 0.82b
-
-#include <sound/driver.h>
-#include <asm/io.h>
-#include <linux/delay.h>
-#include <linux/interrupt.h>
-#include <linux/init.h>
-#include <linux/slab.h>
-#include <sound/core.h>
-
-#include "ice1712.h"
-#include "envy24ht.h"
-#include "prodigy.h"
-
-
-static int prodigy_set_headphone_amp(ice1712_t *ice, int enable)
-{
-	unsigned int tmp, tmp2;
-
-	tmp2 = tmp = snd_ice1712_gpio_read(ice);
-	if (enable)
-		tmp |= PRODIGY_HP_AMP_EN;
-	else
-		tmp &= ~ PRODIGY_HP_AMP_EN;
-	if (tmp != tmp2) {
-		snd_ice1712_gpio_write(ice, tmp);
-		return 1;
-	}
-	return 0;
-}
-
-
-static int prodigy_get_headphone_amp(ice1712_t *ice)
-{
-	unsigned int tmp = snd_ice1712_gpio_read(ice);
-
-	return ( tmp & PRODIGY_HP_AMP_EN )!= 0;
-}
-
-
-/*
- * write data in the SPI mode
- */
-static void prodigy_spi_write(ice1712_t *ice, unsigned int cs, unsigned int data, int bits)
-{
-	unsigned int tmp;
-	int i;
-
-	tmp = snd_ice1712_gpio_read(ice);
-
-	snd_ice1712_gpio_set_mask(ice, ~(PRODIGY_WM_RW|PRODIGY_WM_DATA|PRODIGY_WM_CLK|
-					 PRODIGY_WM_CS|PRODIGY_CS8415_CS|PRODIGY_HP_AMP_EN));
-	tmp |= PRODIGY_WM_RW;
-	tmp &= ~cs;
-	snd_ice1712_gpio_write(ice, tmp);
-	udelay(1);
-
-	for (i = bits - 1; i >= 0; i--) {
-		tmp &= ~PRODIGY_WM_CLK;
-		snd_ice1712_gpio_write(ice, tmp);
-		udelay(1);
-		if (data & (1 << i))
-			tmp |= PRODIGY_WM_DATA;
-		else
-			tmp &= ~PRODIGY_WM_DATA;
-		snd_ice1712_gpio_write(ice, tmp);
-		udelay(1);
-		tmp |= PRODIGY_WM_CLK;
-		snd_ice1712_gpio_write(ice, tmp);
-		udelay(1);
-	}
-
-	tmp &= ~PRODIGY_WM_CLK;
-	tmp |= cs;
-	snd_ice1712_gpio_write(ice, tmp);
-	udelay(1);
-	tmp |= PRODIGY_WM_CLK;
-	snd_ice1712_gpio_write(ice, tmp);
-	udelay(1);
-}
-
-
-/*
- * get the current register value of WM codec
- */
-static unsigned short wm_get(ice1712_t *ice, int reg)
-{
-	reg <<= 1;
-	return ((unsigned short)ice->akm[0].images[reg] << 8) |
-		ice->akm[0].images[reg + 1];
-}
-
-/*
- * set the register value of WM codec and remember it
- */
-static void wm_put(ice1712_t *ice, int reg, unsigned short val)
-{
-	prodigy_spi_write(ice, PRODIGY_WM_CS, (reg << 9) | (val & 0x1ff), 16);
-	reg <<= 1;
-	ice->akm[0].images[reg] = val >> 8;
-	ice->akm[0].images[reg + 1] = val;
-}
-
-
-/*********************************
- ********* Controls section ******
- *********************************/
-
-#define PRODIGY_CON_HPAMP \
-        {                                            \
-                .iface = SNDRV_CTL_ELEM_IFACE_MIXER,      \
-                .name =  "Headphone Amplifier", \
-                .info =  prodigy_hpamp_info,         \
-                .get =   prodigy_hpamp_get, \
-                .put =   prodigy_hpamp_put  \
-        }
-
-static int prodigy_hpamp_info(snd_kcontrol_t *k, snd_ctl_elem_info_t *uinfo)
-{
-	static char *texts[2] = {
-		"Off", "On"
-	};
-
-	uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;
-	uinfo->count = 1;
-	uinfo->value.enumerated.items = 2;
-
-	if (uinfo->value.enumerated.item >= uinfo->value.enumerated.items)
-		uinfo->value.enumerated.item = uinfo->value.enumerated.items - 1;
-	strcpy(uinfo->value.enumerated.name, texts[uinfo->value.enumerated.item]);
-
-        return 0;
-}
-
-
-static int prodigy_hpamp_get(snd_kcontrol_t *kcontrol, snd_ctl_elem_value_t *ucontrol)
-{
-	ice1712_t *ice = snd_kcontrol_chip(kcontrol);
-
-	ucontrol->value.integer.value[0] = prodigy_get_headphone_amp(ice);
-	return 0;
-}
-
-
-static int prodigy_hpamp_put(snd_kcontrol_t *kcontrol, snd_ctl_elem_value_t *ucontrol)
-{
-	ice1712_t *ice = snd_kcontrol_chip(kcontrol);
-
-	return prodigy_set_headphone_amp(ice,ucontrol->value.integer.value[0]);
-}
-
-
-
-#define PRODIGY_CON_DEEMP \
-        {                                            \
-                .iface = SNDRV_CTL_ELEM_IFACE_MIXER,      \
-                .name =  "DAC De-emphasis", \
-                .info =  prodigy_deemp_info,         \
-                .get =   prodigy_deemp_get, \
-                .put =   prodigy_deemp_put  \
-        }
-
-static int prodigy_deemp_info(snd_kcontrol_t *k, snd_ctl_elem_info_t *uinfo)
-{
-	static char *texts[2] = { "Off", "On" };
-
-	uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;
-	uinfo->count = 1;
-	uinfo->value.enumerated.items = 2;
-
-	if (uinfo->value.enumerated.item >= uinfo->value.enumerated.items)
-		uinfo->value.enumerated.item = uinfo->value.enumerated.items - 1;
-	strcpy(uinfo->value.enumerated.name, texts[uinfo->value.enumerated.item]);
-
-        return 0;
-}
-
-static int prodigy_deemp_get(snd_kcontrol_t *kcontrol, snd_ctl_elem_value_t *ucontrol)
-{
-	ice1712_t *ice = snd_kcontrol_chip(kcontrol);
-	ucontrol->value.integer.value[0] = (wm_get(ice, 0x15) & 0xf) == 0xf;
-	return 0;
-}
-
-static int prodigy_deemp_put(snd_kcontrol_t *kcontrol, snd_ctl_elem_value_t *ucontrol)
-{
-	ice1712_t *ice = snd_kcontrol_chip(kcontrol);
-	int temp, temp2;
-	temp2 = temp = wm_get(ice, 0x15);
-	temp = (temp & ~0xf) | ((ucontrol->value.integer.value[0])*0xf);
-	if (temp != temp2) {
-		wm_put(ice,0x15,temp);
-		return 1;
-	}
-	return 0;
-}
-
-
-#define PRODIGY_CON_OVERSAMPLING \
-        {                                            \
-                .iface = SNDRV_CTL_ELEM_IFACE_MIXER,      \
-                .name =  "ADC Oversampling", \
-                .info =  prodigy_oversampling_info,         \
-                .get =   prodigy_oversampling_get, \
-                .put =   prodigy_oversampling_put  \
-        }
-
-static int prodigy_oversampling_info(snd_kcontrol_t *k, snd_ctl_elem_info_t *uinfo)
-{
-	static char *texts[2] = { "128x", "64x"	};
-
-	uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;
-	uinfo->count = 1;
-	uinfo->value.enumerated.items = 2;
-
-	if (uinfo->value.enumerated.item >= uinfo->value.enumerated.items)
-		uinfo->value.enumerated.item = uinfo->value.enumerated.items - 1;
-	strcpy(uinfo->value.enumerated.name, texts[uinfo->value.enumerated.item]);
-
-        return 0;
-}
-
-static int prodigy_oversampling_get(snd_kcontrol_t *kcontrol, snd_ctl_elem_value_t *ucontrol)
-{
-	ice1712_t *ice = snd_kcontrol_chip(kcontrol);
-	ucontrol->value.integer.value[0] = (wm_get(ice, 0x17) & 0x8) == 0x8;
-	return 0;
-}
-
-static int prodigy_oversampling_put(snd_kcontrol_t *kcontrol, snd_ctl_elem_value_t *ucontrol)
-{
-	int temp, temp2;
-	ice1712_t *ice = snd_kcontrol_chip(kcontrol);
-
-	temp2 = temp = wm_get(ice, 0x17);
-
-	if( ucontrol->value.integer.value[0] ) {
-		temp |= 0x8;
-	} else {
-		temp &= ~0x8;
-	}
-
-	if (temp != temp2) {
-		wm_put(ice,0x17,temp);
-		return 1;
-	}
-	return 0;
-}
-
-
-
-
-/*
- * DAC volume attenuation mixer control
- */
-static int wm_dac_vol_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 = 0;		/* mute */
-	uinfo->value.integer.max = 101;		/* 0dB */
-	return 0;
-}
-
-static int wm_dac_vol_get(snd_kcontrol_t *kcontrol, snd_ctl_elem_value_t *ucontrol)
-{
-	ice1712_t *ice = snd_kcontrol_chip(kcontrol);
-	int idx;
-	unsigned short vol;
-
-	down(&ice->gpio_mutex);
-	if (kcontrol->private_value)
-		idx = WM_DAC_MASTER_ATTEN;
-	else
-		idx  = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id) + WM_DAC_ATTEN;
-	vol = wm_get(ice, idx) & 0x7f;
-	if (vol <= 0x1a)
-		ucontrol->value.integer.value[0] = 0;
-	else
-		ucontrol->value.integer.value[0] = vol - 0x1a;
-	up(&ice->gpio_mutex);
-
-	return 0;
-}
-
-static int wm_dac_vol_put(snd_kcontrol_t *kcontrol, snd_ctl_elem_value_t *ucontrol)
-{
-	ice1712_t *ice = snd_kcontrol_chip(kcontrol);
-	int idx;
-	unsigned short ovol, nvol;
-	int change;
-
-	snd_ice1712_save_gpio_status(ice);
-	if (kcontrol->private_value)
-		idx = WM_DAC_MASTER_ATTEN;
-	else
-		idx  = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id) + WM_DAC_ATTEN;
-	nvol = ucontrol->value.integer.value[0] + 0x1a;
-	ovol = wm_get(ice, idx) & 0x7f;
-	change = (ovol != nvol);
-	if (change) {
-		if (nvol <= 0x1a && ovol <= 0x1a)
-			change = 0;
-		else
-			wm_put(ice, idx, nvol | 0x180); /* update on zero detect */
-	}
-	snd_ice1712_restore_gpio_status(ice);
-	return change;
-}
-
-/*
- * ADC gain mixer control
- */
-static int wm_adc_vol_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 = 0;		/* -12dB */
-	uinfo->value.integer.max = 0x1f;	/* 19dB */
-	return 0;
-}
-
-static int wm_adc_vol_get(snd_kcontrol_t *kcontrol, snd_ctl_elem_value_t *ucontrol)
-{
-	ice1712_t *ice = snd_kcontrol_chip(kcontrol);
-	int idx;
-	unsigned short vol;
-
-	down(&ice->gpio_mutex);
-	idx  = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id) + WM_ADC_GAIN;
-	vol = wm_get(ice, idx) & 0x1f;
-	ucontrol->value.integer.value[0] = vol;
-	up(&ice->gpio_mutex);
-	return 0;
-}
-
-static int wm_adc_vol_put(snd_kcontrol_t *kcontrol, snd_ctl_elem_value_t *ucontrol)
-{
-	ice1712_t *ice = snd_kcontrol_chip(kcontrol);
-	int idx;
-	unsigned short ovol, nvol;
-	int change;
-
-	snd_ice1712_save_gpio_status(ice);
-	idx  = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id) + WM_ADC_GAIN;
-	nvol = ucontrol->value.integer.value[0];
-	ovol = wm_get(ice, idx) & 0x1f;
-	change = (ovol != nvol);
-	if (change)
-		wm_put(ice, idx, nvol);
-	snd_ice1712_restore_gpio_status(ice);
-	return change;
-}
-
-/*
- * ADC input mux mixer control
- */
-static int wm_adc_mux_info(snd_kcontrol_t *kcontrol, snd_ctl_elem_info_t *uinfo)
-{
-	static char *texts[] = {
-		"CD Left",
-		"CD Right",
-		"Line Left",
-		"Line Right",
-		"Aux Left",
-		"Aux Right",
-		"Mic Left",
-		"Mic Right",
-	};
-	uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;
-	uinfo->count = 2;
-	uinfo->value.enumerated.items = 8;
-	if (uinfo->value.enumerated.item >= uinfo->value.enumerated.items)
-		uinfo->value.enumerated.item = uinfo->value.enumerated.items - 1;
-	strcpy(uinfo->value.enumerated.name, texts[uinfo->value.enumerated.item]);
-	return 0;
-}
-
-static int wm_adc_mux_get(snd_kcontrol_t * kcontrol, snd_ctl_elem_value_t *ucontrol)
-{
-	ice1712_t *ice = snd_kcontrol_chip(kcontrol);
-	unsigned short val;
-
-	down(&ice->gpio_mutex);
-	val = wm_get(ice, WM_ADC_MUX);
-	ucontrol->value.integer.value[0] = val & 7;
-	ucontrol->value.integer.value[1] = (val >> 4) & 7;
-	up(&ice->gpio_mutex);
-	return 0;
-}
-
-static int wm_adc_mux_put(snd_kcontrol_t * kcontrol, snd_ctl_elem_value_t *ucontrol)
-{
-	ice1712_t *ice = snd_kcontrol_chip(kcontrol);
-	unsigned short oval, nval;
-	int change;
-
-	snd_ice1712_save_gpio_status(ice);
-	oval = wm_get(ice, WM_ADC_MUX);
-	nval = oval & ~0x77;
-	nval |= ucontrol->value.integer.value[0] & 7;
-	nval |= (ucontrol->value.integer.value[1] & 7) << 4;
-	change = (oval != nval);
-	if (change)
-		wm_put(ice, WM_ADC_MUX, nval);
-	snd_ice1712_restore_gpio_status(ice);
-	return 0;
-}
-
-/*
- * mixers
- */
-
-static snd_kcontrol_new_t prodigy71_dac_control __devinitdata = {
-	.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
-	.name = "DAC Volume",
-	.count = 8,
-	.info = wm_dac_vol_info,
-	.get = wm_dac_vol_get,
-	.put = wm_dac_vol_put,
-};
-
-static snd_kcontrol_new_t wm_controls[] __devinitdata = {
-	{
-		.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
-		.name = "Master Playback Volume",
-		.info = wm_dac_vol_info,
-		.get = wm_dac_vol_get,
-		.put = wm_dac_vol_put,
-		.private_value = 1,
-	},
-	{
-		.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
-		.name = "ADC Volume",
-		.count = 2,
-		.info = wm_adc_vol_info,
-		.get = wm_adc_vol_get,
-		.put = wm_adc_vol_put,
-	},
-	{
-		.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
-		.name = "Capture Route",
-		.info = wm_adc_mux_info,
-		.get = wm_adc_mux_get,
-		.put = wm_adc_mux_put,
-	},
-	PRODIGY_CON_HPAMP ,
-	PRODIGY_CON_DEEMP ,
-	PRODIGY_CON_OVERSAMPLING
-};
-
-
-static int __devinit prodigy_add_controls(ice1712_t *ice)
-{
-	unsigned int i;
-	int err;
-
-	err = snd_ctl_add(ice->card, snd_ctl_new1(&prodigy71_dac_control, ice));
-	if (err < 0)
-		return err;
-
-	for (i = 0; i < ARRAY_SIZE(wm_controls); i++) {
-		err = snd_ctl_add(ice->card, snd_ctl_new1(&wm_controls[i], ice));
-		if (err < 0)
-			return err;
-	}
-	return 0;
-}
-
-
-/*
- * initialize the chip
- */
-static int __devinit prodigy_init(ice1712_t *ice)
-{
-	static unsigned short wm_inits[] = {
-
-		/* These come first to reduce init pop noise */
-		0x1b, 0x000,		/* ADC Mux */
-		0x1c, 0x009,		/* Out Mux1 */
-		0x1d, 0x009,		/* Out Mux2 */
-
-		0x18, 0x000,		/* All power-up */
-
-		0x16, 0x022,		/* I2S, normal polarity, 24bit, high-pass on */
-		0x17, 0x006,		/* 128fs, slave mode */
-
-		0x00, 0,		/* DAC1 analog mute */
-		0x01, 0,		/* DAC2 analog mute */
-		0x02, 0,		/* DAC3 analog mute */
-		0x03, 0,		/* DAC4 analog mute */
-		0x04, 0,		/* DAC5 analog mute */
-		0x05, 0,		/* DAC6 analog mute */
-		0x06, 0,		/* DAC7 analog mute */
-		0x07, 0,		/* DAC8 analog mute */
-		0x08, 0x100,		/* master analog mute */
-
-		0x09, 0x7f,		/* DAC1 digital full */
-		0x0a, 0x7f,		/* DAC2 digital full */
-		0x0b, 0x7f,		/* DAC3 digital full */
-		0x0c, 0x7f,		/* DAC4 digital full */
-		0x0d, 0x7f,		/* DAC5 digital full */
-		0x0e, 0x7f,		/* DAC6 digital full */
-		0x0f, 0x7f,		/* DAC7 digital full */
-		0x10, 0x7f,		/* DAC8 digital full */
-		0x11, 0x1FF,		/* master digital full */
-
-		0x12, 0x000,		/* phase normal */
-		0x13, 0x090,		/* unmute DAC L/R */
-		0x14, 0x000,		/* all unmute */
-		0x15, 0x000,		/* no deemphasis, no ZFLG */
-
-		0x19, 0x000,		/* -12dB ADC/L */
-		0x1a, 0x000		/* -12dB ADC/R */
-
-	};
-
-	static unsigned short cs_inits[] = {
-		0x0441, /* RUN */
-		0x0100, /* no mute */
-		0x0200, /* */
-		0x0600, /* slave, 24bit */
-	};
-
-	unsigned int tmp;
-	unsigned int i;
-
-	printk(KERN_INFO "ice1724: AudioTrak Prodigy 7.1 driver rev. 0.82b\n");
-	printk(KERN_INFO "ice1724:   This driver is in beta stage. Forsuccess/failure reporting contact\n");
-	printk(KERN_INFO "ice1724:   Apostolos Dimitromanolakis <apostol@cs.utoronto.ca>\n");
-
-	ice->num_total_dacs = 8;
-	ice->num_total_adcs = 8;
-
-	/* to remeber the register values */
-	ice->akm = snd_kcalloc(sizeof(akm4xxx_t), GFP_KERNEL);
-	if (! ice->akm)
-		return -ENOMEM;
-	ice->akm_codecs = 1;
-
-	snd_ice1712_gpio_set_dir(ice, 0xbfffff); /* fix this for the time being */
-
-	/* reset the wm codec as the SPI mode */
-	snd_ice1712_save_gpio_status(ice);
-	snd_ice1712_gpio_set_mask(ice,~( PRODIGY_WM_RESET|PRODIGY_WM_CS|
-		PRODIGY_CS8415_CS|PRODIGY_HP_AMP_EN ));
-
-	tmp = snd_ice1712_gpio_read(ice);
-	tmp &= ~PRODIGY_WM_RESET;
-	snd_ice1712_gpio_write(ice, tmp);
-	udelay(1);
-	tmp |= PRODIGY_WM_CS | PRODIGY_CS8415_CS;
-	snd_ice1712_gpio_write(ice, tmp);
-	udelay(1);
-	tmp |= PRODIGY_WM_RESET;
-	snd_ice1712_gpio_write(ice, tmp);
-	udelay(1);
-
-	/* initialize WM8770 codec */
-	for (i = 0; i < ARRAY_SIZE(wm_inits); i += 2)
-		wm_put(ice, wm_inits[i], wm_inits[i+1]);
-
-	/* initialize CS8415A codec */
-	for (i = 0; i < ARRAY_SIZE(cs_inits); i++)
-		prodigy_spi_write(ice, PRODIGY_CS8415_CS,
-				 cs_inits[i] | 0x200000, 24);
-
-
-	prodigy_set_headphone_amp(ice, 1);
-
-	snd_ice1712_restore_gpio_status(ice);
-
-	return 0;
-}
-
-/*
- * Prodigy boards don't provide the EEPROM data except for the vendor IDs.
- * hence the driver needs to sets up it properly.
- */
-
-static unsigned char prodigy71_eeprom[] __devinitdata = {
-	0x2b,	/* SYSCONF: clock 512, mpu401, spdif-in/ADC, 4DACs */
-	0x80,	/* ACLINK: I2S */
-	0xf8,	/* I2S: vol, 96k, 24bit, 192k */
-	0xc3,	/* SPDIF: out-en, out-int, spdif-in */
-	0xff,	/* GPIO_DIR */
-	0xff,	/* GPIO_DIR1 */
-	0xbf,	/* GPIO_DIR2 */
-	0x00,	/* GPIO_MASK */
-	0x00,	/* GPIO_MASK1 */
-	0x00,	/* GPIO_MASK2 */
-	0x00,	/* GPIO_STATE */
-	0x00,	/* GPIO_STATE1 */
-	0x00,	/* GPIO_STATE2 */
-};
-
-/* entry point */
-struct snd_ice1712_card_info snd_vt1724_prodigy_cards[] __devinitdata = {
-	{
-		.subvendor = VT1724_SUBDEVICE_PRODIGY71,
-		.name = "Audiotrak Prodigy 7.1",
-		.chip_init = prodigy_init,
-		.build_controls = prodigy_add_controls,
-		.eeprom_size = sizeof(prodigy71_eeprom),
-		.eeprom_data = prodigy71_eeprom,
-	},
-	{ } /* terminator */
-};
diff -Nru a/sound/pci/ice1712/prodigy.h b/sound/pci/ice1712/prodigy.h
--- a/sound/pci/ice1712/prodigy.h	2004-05-26 15:01:35 -07:00
+++ /dev/null	Wed Dec 31 16:00:00 196900
@@ -1,67 +0,0 @@
-#ifndef __SOUND_PRODIGY_H
-#define __SOUND_PRODIGY_H
-
-/*
- *   ALSA driver for VIA VT1724 (Envy24HT)
- *
- *   Lowlevel functions for Terratec PRODIGY cards
- *
- *	Copyright (c) 2003 Takashi Iwai <tiwai@suse.de>
- *
- *   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
- *
- */      
-
-#define  PRODIGY_DEVICE_DESC 	       "{AudioTrak,Prodigy 7.1},"
-
-#define VT1724_SUBDEVICE_PRODIGY71	0x33495345	/* PRODIGY 7.1 */
-
-extern struct snd_ice1712_card_info  snd_vt1724_prodigy_cards[];
-
-/* GPIO bits */
-#define PRODIGY_CS8415_CS	(1 << 23)
-#define PRODIGY_CS8415_CDTO	(1 << 22)
-#define PRODIGY_WM_RESET	(1 << 20)
-#define PRODIGY_WM_CLK		(1 << 19)
-#define PRODIGY_WM_DATA		(1 << 18)
-#define PRODIGY_WM_RW		(1 << 17)
-#define PRODIGY_AC97_RESET	(1 << 16)
-#define PRODIGY_DIGITAL_SEL1	(1 << 15)
-// #define PRODIGY_HP_SEL		(1 << 14)
-#define PRODIGY_WM_CS		(1 << 12)
-
-#define PRODIGY_HP_AMP_EN	(1 << 14)
-
-
-/* WM8770 registers */
-#define WM_DAC_ATTEN		0x00	/* DAC1-8 analog attenuation */
-#define WM_DAC_MASTER_ATTEN	0x08	/* DAC master analog attenuation */
-#define WM_DAC_DIG_ATTEN	0x09	/* DAC1-8 digital attenuation */
-#define WM_DAC_DIG_MATER_ATTEN	0x11	/* DAC master digital attenuation */
-#define WM_PHASE_SWAP		0x12	/* DAC phase */
-#define WM_DAC_CTRL1		0x13	/* DAC control bits */
-#define WM_MUTE			0x14	/* mute controls */
-#define WM_DAC_CTRL2		0x15	/* de-emphasis and zefo-flag */
-#define WM_INT_CTRL		0x16	/* interface control */
-#define WM_MASTER		0x17	/* master clock and mode */
-#define WM_POWERDOWN		0x18	/* power-down controls */
-#define WM_ADC_GAIN		0x19	/* ADC gain L(19)/R(1a) */
-#define WM_ADC_MUX		0x1b	/* input MUX */
-#define WM_OUT_MUX1		0x1c	/* output MUX */
-#define WM_OUT_MUX2		0x1e	/* output MUX */
-#define WM_RESET		0x1f	/* software reset */
-
-
-#endif /* __SOUND_PRODIGY_H */
diff -Nru a/sound/pci/ice1712/revo.c b/sound/pci/ice1712/revo.c
--- a/sound/pci/ice1712/revo.c	2004-05-26 15:01:36 -07:00
+++ b/sound/pci/ice1712/revo.c	2004-05-26 15:01:36 -07:00
@@ -171,10 +171,11 @@
 /* entry point */
 struct snd_ice1712_card_info snd_vt1724_revo_cards[] __devinitdata = {
 	{
-		VT1724_SUBDEVICE_REVOLUTION71,
-		"M Audio Revolution-7.1",
-		revo_init,
-		revo_add_controls,
+		.subvendor = VT1724_SUBDEVICE_REVOLUTION71,
+		.name = "M Audio Revolution-7.1",
+		.model = "revo71",
+		.chip_init = revo_init,
+		.build_controls = revo_add_controls,
 	},
 	{ } /* terminator */
 };
diff -Nru a/sound/pci/intel8x0.c b/sound/pci/intel8x0.c
--- a/sound/pci/intel8x0.c	2004-05-26 15:01:36 -07:00
+++ b/sound/pci/intel8x0.c	2004-05-26 15:01:36 -07:00
@@ -34,12 +34,12 @@
 #include <linux/pci.h>
 #include <linux/slab.h>
 #include <linux/gameport.h>
+#include <linux/moduleparam.h>
 #include <sound/core.h>
 #include <sound/pcm.h>
 #include <sound/ac97_codec.h>
 #include <sound/info.h>
 #include <sound/mpu401.h>
-#define SNDRV_GET_ID
 #include <sound/initval.h>
 /* for 440MX workaround */
 #include <asm/pgtable.h>
@@ -81,29 +81,30 @@
 #ifdef SUPPORT_MIDI
 static int mpu_port[SNDRV_CARDS]; /* disabled */
 #endif
+static int boot_devs;
 
-MODULE_PARM(index, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+module_param_array(index, int, boot_devs, 0444);
 MODULE_PARM_DESC(index, "Index value for Intel i8x0 soundcard.");
 MODULE_PARM_SYNTAX(index, SNDRV_INDEX_DESC);
-MODULE_PARM(id, "1-" __MODULE_STRING(SNDRV_CARDS) "s");
+module_param_array(id, charp, boot_devs, 0444);
 MODULE_PARM_DESC(id, "ID string for Intel i8x0 soundcard.");
 MODULE_PARM_SYNTAX(id, SNDRV_ID_DESC);
-MODULE_PARM(enable, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+module_param_array(enable, bool, boot_devs, 0444);
 MODULE_PARM_DESC(enable, "Enable Intel i8x0 soundcard.");
 MODULE_PARM_SYNTAX(enable, SNDRV_ENABLE_DESC);
-MODULE_PARM(ac97_clock, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+module_param_array(ac97_clock, int, boot_devs, 0444);
 MODULE_PARM_DESC(ac97_clock, "AC'97 codec clock (0 = auto-detect).");
 MODULE_PARM_SYNTAX(ac97_clock, SNDRV_ENABLED ",default:0");
-MODULE_PARM(ac97_quirk, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+module_param_array(ac97_quirk, int, boot_devs, 0444);
 MODULE_PARM_DESC(ac97_quirk, "AC'97 workaround for strange hardware.");
 MODULE_PARM_SYNTAX(ac97_quirk, SNDRV_ENABLED ",allows:{{-1,4}},dialog:list,default:-1");
 #ifdef SUPPORT_JOYSTICK
-MODULE_PARM(joystick, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+module_param_array(joystick, bool, boot_devs, 0444);
 MODULE_PARM_DESC(joystick, "Enable joystick for Intel i8x0 soundcard.");
 MODULE_PARM_SYNTAX(joystick, SNDRV_ENABLED "," SNDRV_BOOLEAN_FALSE_DESC);
 #endif
 #ifdef SUPPORT_MIDI
-MODULE_PARM(mpu_port, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+module_param_array(mpu_port, int, boot_devs, 0444);
 MODULE_PARM_DESC(mpu_port, "MPU401 port # for Intel i8x0 driver.");
 MODULE_PARM_SYNTAX(mpu_port, SNDRV_ENABLED ",allows:{{0},{0x330},{0x300}},dialog:list");
 #endif
@@ -235,6 +236,7 @@
 #define   ICH_P2INT		0x02000000	/* ICH4: PCM2-In interrupt */
 #define   ICH_M2INT		0x01000000	/* ICH4: Mic2-In interrupt */
 #define   ICH_SAMPLE_CAP	0x00c00000	/* ICH4: sample capability bits (RO) */
+#define   ICH_SAMPLE_16_20	0x00400000	/* ICH4: 16- and 20-bit samples */
 #define   ICH_MULTICHAN_CAP	0x00300000	/* ICH4: multi-channel capability bits (RO) */
 #define   ICH_MD3		0x00020000	/* modem power down semaphore */
 #define   ICH_AD3		0x00010000	/* audio power down semaphore */
@@ -378,6 +380,7 @@
         unsigned int fragsize;
         unsigned int fragsize1;
         unsigned int position;
+	unsigned int pos_shift;
         int frags;
         int lvi;
         int lvi_frag;
@@ -441,10 +444,9 @@
 	struct snd_dma_buffer bdbars;
 	u32 int_sta_reg;		/* interrupt status register */
 	u32 int_sta_mask;		/* interrupt status mask */
-	unsigned int pcm_pos_shift;
-	
+
 #ifdef CONFIG_PM
-	int in_suspend;
+	u32 pci_state[64 / sizeof(u32)];
 #endif
 };
 
@@ -719,10 +721,10 @@
 		for (idx = 0; idx < (ICH_REG_LVI_MASK + 1) * 2; idx += 4) {
 			bdbar[idx + 0] = cpu_to_le32(ichdev->physbuf);
 			bdbar[idx + 1] = cpu_to_le32(0x80000000 | /* interrupt on completion */
-						     ichdev->fragsize1 >> chip->pcm_pos_shift);
+						     ichdev->fragsize1 >> ichdev->pos_shift);
 			bdbar[idx + 2] = cpu_to_le32(ichdev->physbuf + (ichdev->size >> 1));
 			bdbar[idx + 3] = cpu_to_le32(0x80000000 | /* interrupt on completion */
-						     ichdev->fragsize1 >> chip->pcm_pos_shift);
+						     ichdev->fragsize1 >> ichdev->pos_shift);
 		}
 		ichdev->frags = 2;
 	} else {
@@ -731,7 +733,7 @@
 		for (idx = 0; idx < (ICH_REG_LVI_MASK + 1) * 2; idx += 2) {
 			bdbar[idx + 0] = cpu_to_le32(ichdev->physbuf + (((idx >> 1) * ichdev->fragsize) % ichdev->size));
 			bdbar[idx + 1] = cpu_to_le32(0x80000000 | /* interrupt on completion */
-						     ichdev->fragsize >> chip->pcm_pos_shift);
+						     ichdev->fragsize >> ichdev->pos_shift);
 			// printk("bdbar[%i] = 0x%x [0x%x]\n", idx + 0, bdbar[idx + 0], bdbar[idx + 1]);
 		}
 		ichdev->frags = ichdev->size / ichdev->fragsize;
@@ -773,11 +775,14 @@
 static inline void snd_intel8x0_update(intel8x0_t *chip, ichdev_t *ichdev)
 {
 	unsigned long port = ichdev->reg_offset;
-	int civ, i, step;
+	int status, civ, i, step;
 	int ack = 0;
 
+	status = igetbyte(chip, port + ichdev->roff_sr);
 	civ = igetbyte(chip, port + ICH_REG_OFF_CIV);
-	if (civ == ichdev->civ) {
+	if (!(status & ICH_BCIS)) {
+		step = 0;
+	} else if (civ == ichdev->civ) {
 		// snd_printd("civ same %d\n", civ);
 		step = 1;
 		ichdev->civ++;
@@ -811,7 +816,8 @@
 		snd_pcm_period_elapsed(ichdev->substream);
 		spin_lock(&chip->reg_lock);
 	}
-	iputbyte(chip, port + ichdev->roff_sr, ICH_FIFOE | ICH_BCIS | ICH_LVBCI);
+	iputbyte(chip, port + ichdev->roff_sr,
+		 status & (ICH_FIFOE | ICH_BCIS | ICH_LVBCI));
 }
 
 static irqreturn_t snd_intel8x0_interrupt(int irq, void *dev_id, struct pt_regs *regs)
@@ -981,7 +987,8 @@
 	return snd_pcm_lib_free_pages(substream);
 }
 
-static void snd_intel8x0_setup_multi_channels(intel8x0_t *chip, int channels)
+static void snd_intel8x0_setup_pcm_out(intel8x0_t *chip,
+				       int channels, int sample_bits)
 {
 	unsigned int cnt;
 	switch (chip->device_type) {
@@ -1005,7 +1012,7 @@
 		break;
 	default:
 		cnt = igetdword(chip, ICHREG(GLOB_CNT));
-		cnt &= ~ICH_PCM_246_MASK;
+		cnt &= ~(ICH_PCM_246_MASK | ICH_PCM_20BIT);
 		if (chip->multi4 && channels == 4)
 			cnt |= ICH_PCM_4;
 		else if (chip->multi6 && channels == 6)
@@ -1016,6 +1023,9 @@
 			 */
 			iputdword(chip, ICHREG(GLOB_CNT), (cnt & 0xcfffff));
 			mdelay(50); /* grrr... */
+		} else if (chip->device_type == DEVICE_INTEL_ICH4) {
+			if (sample_bits > 16)
+				cnt |= ICH_PCM_20BIT;
 		}
 		iputdword(chip, ICHREG(GLOB_CNT), cnt);
 		break;
@@ -1033,8 +1043,12 @@
 	ichdev->fragsize = snd_pcm_lib_period_bytes(substream);
 	if (ichdev->ichd == ICHD_PCMOUT) {
 		spin_lock(&chip->reg_lock);
-		snd_intel8x0_setup_multi_channels(chip, runtime->channels);
+		snd_intel8x0_setup_pcm_out(chip, runtime->channels,
+					   runtime->sample_bits);
 		spin_unlock(&chip->reg_lock);
+		if (chip->device_type == DEVICE_INTEL_ICH4) {
+			ichdev->pos_shift = (runtime->sample_bits > 16) ? 2 : 1;
+		}
 	}
 	snd_intel8x0_setup_periods(chip, ichdev);
 	return 0;
@@ -1047,7 +1061,7 @@
 	unsigned long flags;
 	size_t ptr1, ptr;
 
-	ptr1 = igetword(chip, ichdev->reg_offset + ichdev->roff_picb) << chip->pcm_pos_shift;
+	ptr1 = igetword(chip, ichdev->reg_offset + ichdev->roff_picb) << ichdev->pos_shift;
 	if (ptr1 != 0)
 		ptr = ichdev->fragsize1 - ptr1;
 	else
@@ -1142,6 +1156,8 @@
 		runtime->hw.channels_max = 4;
 		snd_pcm_hw_constraint_list(runtime, 0, SNDRV_PCM_HW_PARAM_CHANNELS, &hw_constraints_channels4);
 	}
+	if (chip->smp20bit)
+		runtime->hw.formats |= SNDRV_PCM_FMTBIT_S32_LE;
 	return 0;
 }
 
@@ -1844,6 +1860,7 @@
 	memset(&ac97, 0, sizeof(ac97));
 	ac97.private_data = chip;
 	ac97.private_free = snd_intel8x0_mixer_free_ac97;
+	ac97.scaps = AC97_SCAP_SKIP_MODEM;
 	if (chip->device_type != DEVICE_ALI) {
 		glob_sta = igetdword(chip, ICHREG(GLOB_STA));
 		bus.write = snd_intel8x0_codec_write;
@@ -1892,7 +1909,8 @@
 	for (i = 0; i < codecs; i++) {
 		ac97.num = i;
 		if ((err = snd_ac97_mixer(pbus, &ac97, &x97)) < 0) {
-			snd_printk(KERN_ERR "Unable to initialize codec #%d\n", i);
+			if (err != -EACCES)
+				snd_printk(KERN_ERR "Unable to initialize codec #%d\n", i);
 			if (i == 0)
 				goto __err;
 			continue;
@@ -1946,6 +1964,10 @@
 		if (pbus->pcms[0].r[0].slots & (1 << AC97_SLOT_LFE))
 			chip->multi6 = 1;
 	}
+	if (chip->device_type == DEVICE_INTEL_ICH4) {
+		if ((igetdword(chip, ICHREG(GLOB_STA)) & ICH_SAMPLE_CAP) == ICH_SAMPLE_16_20)
+			chip->smp20bit = 1;
+	}
 	if (chip->device_type == DEVICE_NFORCE) {
 		/* 48kHz only */
 		chip->ichd[spdif_idx].pcm->rates = SNDRV_PCM_RATE_48000;
@@ -2184,74 +2206,54 @@
 /*
  * power management
  */
-static void intel8x0_suspend(intel8x0_t *chip)
+static int intel8x0_suspend(snd_card_t *card, unsigned int state)
 {
-	snd_card_t *card = chip->card;
+	intel8x0_t *chip = snd_magic_cast(intel8x0_t, card->pm_private_data, return -EINVAL);
 	int i;
 
-	if (chip->in_suspend ||
-	    card->power_state == SNDRV_CTL_POWER_D3hot)
-		return;
-
-	chip->in_suspend = 1;
 	for (i = 0; i < chip->pcm_devs; i++)
 		snd_pcm_suspend_all(chip->pcm[i]);
+	for (i = 0; i < 3; i++)
+		if (chip->ac97[i])
+			snd_ac97_suspend(chip->ac97[i]);
+	pci_save_state(chip->pci, chip->pci_state);
 	snd_power_change_state(card, SNDRV_CTL_POWER_D3hot);
+	return 0;
 }
 
-static void intel8x0_resume(intel8x0_t *chip)
+static int intel8x0_resume(snd_card_t *card, unsigned int state)
 {
-	snd_card_t *card = chip->card;
+	intel8x0_t *chip = snd_magic_cast(intel8x0_t, card->pm_private_data, return -EINVAL);
 	int i;
 
-	if (! chip->in_suspend ||
-	    card->power_state == SNDRV_CTL_POWER_D0)
-		return;
-
+	pci_restore_state(chip->pci, chip->pci_state);
 	pci_enable_device(chip->pci);
 	pci_set_master(chip->pci);
 	snd_intel8x0_chip_init(chip, 0);
+
+	/* refill nocache */
+	if (chip->fix_nocache)
+		fill_nocache(chip->bdbars.area, chip->bdbars.bytes, 1);
+
 	for (i = 0; i < 3; i++)
 		if (chip->ac97[i])
 			snd_ac97_resume(chip->ac97[i]);
 
-	chip->in_suspend = 0;
-	snd_power_change_state(card, SNDRV_CTL_POWER_D0);
-}
-
-static int snd_intel8x0_suspend(struct pci_dev *dev, u32 state)
-{
-	intel8x0_t *chip = snd_magic_cast(intel8x0_t, pci_get_drvdata(dev), return -ENXIO);
-	intel8x0_suspend(chip);
-	return 0;
-}
-static int snd_intel8x0_resume(struct pci_dev *dev)
-{
-	intel8x0_t *chip = snd_magic_cast(intel8x0_t, pci_get_drvdata(dev), return -ENXIO);
-	intel8x0_resume(chip);
-	return 0;
-}
-
-/* callback */
-static int snd_intel8x0_set_power_state(snd_card_t *card, unsigned int power_state)
-{
-	intel8x0_t *chip = snd_magic_cast(intel8x0_t, card->power_state_private_data, return -ENXIO);
-	switch (power_state) {
-	case SNDRV_CTL_POWER_D0:
-	case SNDRV_CTL_POWER_D1:
-	case SNDRV_CTL_POWER_D2:
-		intel8x0_resume(chip);
-		break;
-	case SNDRV_CTL_POWER_D3hot:
-	case SNDRV_CTL_POWER_D3cold:
-		intel8x0_suspend(chip);
-		break;
-	default:
-		return -EINVAL;
+	/* refill nocache */
+	if (chip->fix_nocache) {
+		for (i = 0; i < chip->bdbars_count; i++) {
+			ichdev_t *ichdev = &chip->ichd[i];
+			if (ichdev->substream) {
+				snd_pcm_runtime_t *runtime = ichdev->substream->runtime;
+				if (runtime->dma_area)
+					fill_nocache(runtime->dma_area, runtime->dma_bytes, 1);
+			}
+		}
 	}
+
+	snd_power_change_state(card, SNDRV_CTL_POWER_D0);
 	return 0;
 }
-
 #endif /* CONFIG_PM */
 
 #define INTEL8X0_TESTBUF_SIZE	32768	/* enough large for one shot */
@@ -2305,7 +2307,7 @@
 	spin_lock_irqsave(&chip->reg_lock, flags);
 	/* check the position */
 	pos = ichdev->fragsize1;
-	pos -= igetword(chip, ichdev->reg_offset + ichdev->roff_picb) << chip->pcm_pos_shift;
+	pos -= igetword(chip, ichdev->reg_offset + ichdev->roff_picb) << ichdev->pos_shift;
 	pos += ichdev->position;
 	do_gettimeofday(&stop_time);
 	/* stop */
@@ -2546,9 +2548,9 @@
 		}
 		if (device_type == DEVICE_ALI)
 			ichdev->ali_slot = (ichdev->reg_offset - 0x40) / 0x10;
+		/* SIS7012 handles the pcm data in bytes, others are in samples */
+		ichdev->pos_shift = (device_type == DEVICE_SIS) ? 0 : 1;
 	}
-	/* SIS7012 handles the pcm data in bytes, others are in words */
-	chip->pcm_pos_shift = (device_type == DEVICE_SIS) ? 0 : 1;
 
 	memset(&chip->dma_dev, 0, sizeof(chip->dma_dev));
 	chip->dma_dev.type = SNDRV_DMA_TYPE_DEV;
@@ -2581,10 +2583,7 @@
 		return err;
 	}
 
-#ifdef CONFIG_PM
-	card->set_power_state = snd_intel8x0_set_power_state;
-	card->power_state_private_data = chip;
-#endif
+	snd_card_set_pm_callback(card, intel8x0_suspend, intel8x0_resume, chip);
 
 	if ((err = snd_device_new(card, SNDRV_DEV_LOWLEVEL, chip, &ops)) < 0) {
 		snd_intel8x0_free(chip);
@@ -2692,16 +2691,14 @@
 		snd_card_free(card);
 		return err;
 	}
-	pci_set_drvdata(pci, chip);
+	pci_set_drvdata(pci, card);
 	dev++;
 	return 0;
 }
 
 static void __devexit snd_intel8x0_remove(struct pci_dev *pci)
 {
-	intel8x0_t *chip = snd_magic_cast(intel8x0_t, pci_get_drvdata(pci), return);
-	if (chip)
-		snd_card_free(chip->card);
+	snd_card_free(pci_get_drvdata(pci));
 	pci_set_drvdata(pci, NULL);
 }
 
@@ -2710,10 +2707,7 @@
 	.id_table = snd_intel8x0_ids,
 	.probe = snd_intel8x0_probe,
 	.remove = __devexit_p(snd_intel8x0_remove),
-#ifdef CONFIG_PM
-	.suspend = snd_intel8x0_suspend,
-	.resume = snd_intel8x0_resume,
-#endif
+	SND_PCI_PM_CALLBACKS
 };
 
 
@@ -2817,12 +2811,9 @@
 {
 	int err;
 
-        if ((err = pci_module_init(&driver)) < 0) {
-#ifdef MODULE
-		printk(KERN_ERR "Intel ICH soundcard not found or device busy\n");
-#endif
+        if ((err = pci_module_init(&driver)) < 0)
                 return err;
-        }
+
 #if defined(SUPPORT_JOYSTICK) || defined(SUPPORT_MIDI)
 	if (pci_module_init(&joystick_driver) < 0) {
 		snd_printdd(KERN_INFO "no joystick found\n");
@@ -2847,33 +2838,3 @@
 
 module_init(alsa_card_intel8x0_init)
 module_exit(alsa_card_intel8x0_exit)
-
-#ifndef MODULE
-
-/* format is: snd-intel8x0=enable,index,id,ac97_clock,ac97_quirk,mpu_port,joystick */
-
-static int __init alsa_card_intel8x0_setup(char *str)
-{
-	static unsigned __initdata nr_dev = 0;
-
-	if (nr_dev >= SNDRV_CARDS)
-		return 0;
-	(void)(get_option(&str,&enable[nr_dev]) == 2 &&
-	       get_option(&str,&index[nr_dev]) == 2 &&
-	       get_id(&str,&id[nr_dev]) == 2 &&
-	       get_option(&str,&ac97_clock[nr_dev]) == 2 &&
-	       get_option(&str,&ac97_quirk[nr_dev]) == 2
-#ifdef SUPPORT_MIDI
-	       && get_option(&str,&mpu_port[nr_dev]) == 2
-#endif
-#ifdef SUPPORT_JOYSTICK
-	       && get_option(&str,&joystick[nr_dev]) == 2
-#endif
-	       );
-	nr_dev++;
-	return 1;
-}
-
-__setup("snd-intel8x0=", alsa_card_intel8x0_setup);
-
-#endif /* ifndef MODULE */
diff -Nru a/sound/pci/intel8x0m.c b/sound/pci/intel8x0m.c
--- a/sound/pci/intel8x0m.c	2004-05-26 15:01:36 -07:00
+++ b/sound/pci/intel8x0m.c	2004-05-26 15:01:36 -07:00
@@ -31,12 +31,12 @@
 #include <linux/pci.h>
 #include <linux/slab.h>
 #include <linux/gameport.h>
+#include <linux/moduleparam.h>
 #include <sound/core.h>
 #include <sound/pcm.h>
 #include <sound/ac97_codec.h>
 #include <sound/info.h>
 #include <sound/mpu401.h>
-#define SNDRV_GET_ID
 #include <sound/initval.h>
 
 MODULE_AUTHOR("Jaroslav Kysela <perex@suse.cz>");
@@ -56,17 +56,18 @@
 static char *id[SNDRV_CARDS] = SNDRV_DEFAULT_STR;	/* ID for this card */
 static int enable[SNDRV_CARDS] = SNDRV_DEFAULT_ENABLE_PNP;	/* Enable this card */
 static int ac97_clock[SNDRV_CARDS] = {[0 ... (SNDRV_CARDS - 1)] = 0};
+static int boot_devs;
 
-MODULE_PARM(index, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+module_param_array(index, int, boot_devs, 0444);
 MODULE_PARM_DESC(index, "Index value for Intel i8x0 modemcard.");
 MODULE_PARM_SYNTAX(index, SNDRV_INDEX_DESC);
-MODULE_PARM(id, "1-" __MODULE_STRING(SNDRV_CARDS) "s");
+module_param_array(id, charp, boot_devs, 0444);
 MODULE_PARM_DESC(id, "ID string for Intel i8x0 modemcard.");
 MODULE_PARM_SYNTAX(id, SNDRV_ID_DESC);
-MODULE_PARM(enable, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+module_param_array(enable, bool, boot_devs, 0444);
 MODULE_PARM_DESC(enable, "Enable Intel i8x0 modemcard.");
 MODULE_PARM_SYNTAX(enable, SNDRV_ENABLE_DESC);
-MODULE_PARM(ac97_clock, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+module_param_array(ac97_clock, int, boot_devs, 0444);
 MODULE_PARM_DESC(ac97_clock, "AC'97 codec clock (0 = auto-detect).");
 MODULE_PARM_SYNTAX(ac97_clock, SNDRV_ENABLED ",default:0");
 
@@ -266,10 +267,6 @@
 	u32 int_sta_reg;		/* interrupt status register */
 	u32 int_sta_mask;		/* interrupt status mask */
 	unsigned int pcm_pos_shift;
-	
-#ifdef CONFIG_PM
-	int in_suspend;
-#endif
 };
 
 static struct pci_device_id snd_intel8x0m_ids[] = {
@@ -905,6 +902,7 @@
 	memset(&ac97, 0, sizeof(ac97));
 	ac97.private_data = chip;
 	ac97.private_free = snd_intel8x0_mixer_free_ac97;
+	ac97.scaps = AC97_SCAP_SKIP_AUDIO;
 
 	glob_sta = igetdword(chip, ICHREG(GLOB_STA));
 	bus.write = snd_intel8x0_codec_write;
@@ -1081,72 +1079,31 @@
 /*
  * power management
  */
-static void intel8x0_suspend(intel8x0_t *chip)
+static int intel8x0m_suspend(snd_card_t *card, unsigned int state)
 {
-	snd_card_t *card = chip->card;
+	intel8x0_t *chip = snd_magic_cast(intel8x0_t, card->pm_private_data, return -EINVAL);
 	int i;
 
-	if (chip->in_suspend ||
-	    card->power_state == SNDRV_CTL_POWER_D3hot)
-		return;
-
-	chip->in_suspend = 1;
 	for (i = 0; i < chip->pcm_devs; i++)
 		snd_pcm_suspend_all(chip->pcm[i]);
+	if (chip->ac97)
+		snd_ac97_suspend(chip->ac97);
 	snd_power_change_state(card, SNDRV_CTL_POWER_D3hot);
+	return 0;
 }
 
-static void intel8x0_resume(intel8x0_t *chip)
+static int intel8x0m_resume(snd_card_t *card, unsigned int state)
 {
-	snd_card_t *card = chip->card;
-
-	if (! chip->in_suspend ||
-	    card->power_state == SNDRV_CTL_POWER_D0)
-		return;
-
+	intel8x0_t *chip = snd_magic_cast(intel8x0_t, card->pm_private_data, return -EINVAL);
 	pci_enable_device(chip->pci);
 	pci_set_master(chip->pci);
 	snd_intel8x0_chip_init(chip, 0);
 	if (chip->ac97)
 		snd_ac97_resume(chip->ac97);
 
-	chip->in_suspend = 0;
 	snd_power_change_state(card, SNDRV_CTL_POWER_D0);
-}
-
-static int snd_intel8x0m_suspend(struct pci_dev *dev, u32 state)
-{
-	intel8x0_t *chip = snd_magic_cast(intel8x0_t, pci_get_drvdata(dev), return -ENXIO);
-	intel8x0_suspend(chip);
-	return 0;
-}
-static int snd_intel8x0m_resume(struct pci_dev *dev)
-{
-	intel8x0_t *chip = snd_magic_cast(intel8x0_t, pci_get_drvdata(dev), return -ENXIO);
-	intel8x0_resume(chip);
 	return 0;
 }
-
-/* callback */
-static int snd_intel8x0_set_power_state(snd_card_t *card, unsigned int power_state)
-{
-	intel8x0_t *chip = snd_magic_cast(intel8x0_t, card->power_state_private_data, return -ENXIO);
-	switch (power_state) {
-	case SNDRV_CTL_POWER_D0:
-	case SNDRV_CTL_POWER_D1:
-	case SNDRV_CTL_POWER_D2:
-		intel8x0_resume(chip);
-		break;
-	case SNDRV_CTL_POWER_D3hot:
-	case SNDRV_CTL_POWER_D3cold:
-		intel8x0_suspend(chip);
-		break;
-	default:
-		return -EINVAL;
-	}
-	return 0;
-}
-
 #endif /* CONFIG_PM */
 
 static void snd_intel8x0m_proc_read(snd_info_entry_t * entry,
@@ -1338,10 +1295,7 @@
 		return err;
 	}
 
-#ifdef CONFIG_PM
-	card->set_power_state = snd_intel8x0_set_power_state;
-	card->power_state_private_data = chip;
-#endif
+	snd_card_set_pm_callback(card, intel8x0m_suspend, intel8x0m_resume, chip);
 
 	if ((err = snd_device_new(card, SNDRV_DEV_LOWLEVEL, chip, &ops)) < 0) {
 		snd_intel8x0_free(chip);
@@ -1436,16 +1390,14 @@
 		snd_card_free(card);
 		return err;
 	}
-	pci_set_drvdata(pci, chip);
+	pci_set_drvdata(pci, card);
 	dev++;
 	return 0;
 }
 
 static void __devexit snd_intel8x0m_remove(struct pci_dev *pci)
 {
-	intel8x0_t *chip = snd_magic_cast(intel8x0_t, pci_get_drvdata(pci), return);
-	if (chip)
-		snd_card_free(chip->card);
+	snd_card_free(pci_get_drvdata(pci));
 	pci_set_drvdata(pci, NULL);
 }
 
@@ -1454,25 +1406,13 @@
 	.id_table = snd_intel8x0m_ids,
 	.probe = snd_intel8x0m_probe,
 	.remove = __devexit_p(snd_intel8x0m_remove),
-#ifdef CONFIG_PM
-	.suspend = snd_intel8x0m_suspend,
-	.resume = snd_intel8x0m_resume,
-#endif
+	SND_PCI_PM_CALLBACKS
 };
 
 
 static int __init alsa_card_intel8x0m_init(void)
 {
-	int err;
-
-        if ((err = pci_module_init(&driver)) < 0) {
-#ifdef MODULE
-		printk(KERN_ERR "Intel ICH modemcard not found or device busy\n");
-#endif
-                return err;
-        }
-
-        return 0;
+	return pci_module_init(&driver);
 }
 
 static void __exit alsa_card_intel8x0m_exit(void)
@@ -1482,26 +1422,3 @@
 
 module_init(alsa_card_intel8x0m_init)
 module_exit(alsa_card_intel8x0m_exit)
-
-#ifndef MODULE
-
-/* format is: snd-intel8x0=enable,index,id,ac97_clock,mpu_port,joystick */
-
-static int __init alsa_card_intel8x0m_setup(char *str)
-{
-	static unsigned __initdata nr_dev = 0;
-
-	if (nr_dev >= SNDRV_CARDS)
-		return 0;
-	(void)(get_option(&str,&enable[nr_dev]) == 2 &&
-	       get_option(&str,&index[nr_dev]) == 2 &&
-	       get_id(&str,&id[nr_dev]) == 2 &&
-	       get_option(&str,&ac97_clock[nr_dev]) == 2
-	       );
-	nr_dev++;
-	return 1;
-}
-
-__setup("snd-intel8x0m=", alsa_card_intel8x0m_setup);
-
-#endif /* ifndef MODULE */
diff -Nru a/sound/pci/korg1212/korg1212.c b/sound/pci/korg1212/korg1212.c
--- a/sound/pci/korg1212/korg1212.c	2004-05-26 15:01:35 -07:00
+++ b/sound/pci/korg1212/korg1212.c	2004-05-26 15:01:35 -07:00
@@ -26,13 +26,13 @@
 #include <linux/pci.h>
 #include <linux/slab.h>
 #include <linux/wait.h>
+#include <linux/moduleparam.h>
 
 #include <sound/core.h>
 #include <sound/info.h>
 #include <sound/control.h>
 #include <sound/pcm.h>
 #include <sound/pcm_params.h>
-#define SNDRV_GET_ID
 #include <sound/initval.h>
 
 #include <asm/io.h>
@@ -417,14 +417,15 @@
 static int index[SNDRV_CARDS] = SNDRV_DEFAULT_IDX;     /* Index 0-MAX */
 static char *id[SNDRV_CARDS] = SNDRV_DEFAULT_STR;	   /* ID for this card */
 static int enable[SNDRV_CARDS] = SNDRV_DEFAULT_ENABLE; /* Enable this card */
+static int boot_devs;
 
-MODULE_PARM(index, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+module_param_array(index, int, boot_devs, 0444);
 MODULE_PARM_DESC(index, "Index value for Korg 1212 soundcard.");
 MODULE_PARM_SYNTAX(index, SNDRV_INDEX_DESC);
-MODULE_PARM(id, "1-" __MODULE_STRING(SNDRV_CARDS) "s");
+module_param_array(id, charp, boot_devs, 0444);
 MODULE_PARM_DESC(id, "ID string for Korg 1212 soundcard.");
 MODULE_PARM_SYNTAX(id, SNDRV_ID_DESC);
-MODULE_PARM(enable, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+module_param_array(enable, bool, boot_devs, 0444);
 MODULE_PARM_DESC(enable, "Enable Korg 1212 soundcard.");
 MODULE_PARM_SYNTAX(enable, SNDRV_ENABLE_DESC);
 MODULE_AUTHOR("Haroldo Gamal <gamal@alternex.com.br>");
@@ -2504,15 +2505,14 @@
 		snd_card_free(card);
 		return err;
 	}
-	pci_set_drvdata(pci, korg1212);
+	pci_set_drvdata(pci, card);
 	dev++;
 	return 0;
 }
 
 static void __devexit snd_korg1212_remove(struct pci_dev *pci)
 {
-	korg1212_t *korg1212 = pci_get_drvdata(pci);
-	snd_card_free(korg1212->card);
+	snd_card_free(pci_get_drvdata(pci));
 	pci_set_drvdata(pci, NULL);
 }
 
@@ -2525,15 +2525,7 @@
 
 static int __init alsa_card_korg1212_init(void)
 {
-	int err;
-
-	if ((err = pci_module_init(&driver)) < 0) {
-#ifdef MODULE
-		printk(KERN_ERR "No Korg 1212IO cards found\n");
-#endif
-		return err;
-	}
-	return 0;
+	return pci_module_init(&driver);
 }
 
 static void __exit alsa_card_korg1212_exit(void)
@@ -2543,25 +2535,3 @@
 
 module_init(alsa_card_korg1212_init)
 module_exit(alsa_card_korg1212_exit)
-
-#ifndef MODULE
-
-/* format is: snd-korg1212=enable,index,id */
-
-static int __init alsa_card_korg1212_setup(char *str)
-{
-	static unsigned __initdata nr_dev = 0;
-
-	if (nr_dev >= SNDRV_CARDS)
-		return 0;
-	(void)(get_option(&str,&enable[nr_dev]) == 2 &&
-	       get_option(&str,&index[nr_dev]) == 2 &&
-	       get_id(&str,&id[nr_dev]) == 2);
-	nr_dev++;
-	return 1;
-}
-
-__setup("snd-korg1212=", alsa_card_korg1212_setup);
-
-#endif /* ifndef MODULE */
-
diff -Nru a/sound/pci/maestro3.c b/sound/pci/maestro3.c
--- a/sound/pci/maestro3.c	2004-05-26 15:01:36 -07:00
+++ b/sound/pci/maestro3.c	2004-05-26 15:01:36 -07:00
@@ -39,13 +39,13 @@
 #include <linux/pci.h>
 #include <linux/slab.h>
 #include <linux/vmalloc.h>
+#include <linux/moduleparam.h>
 #include <sound/core.h>
 #include <sound/info.h>
 #include <sound/control.h>
 #include <sound/pcm.h>
 #include <sound/mpu401.h>
 #include <sound/ac97_codec.h>
-#define SNDRV_GET_ID
 #include <sound/initval.h>
 
 MODULE_AUTHOR("Zach Brown <zab@zabbo.net>, Takashi Iwai <tiwai@suse.de>");
@@ -63,20 +63,21 @@
 static int enable[SNDRV_CARDS] = SNDRV_DEFAULT_ENABLE_PNP; /* all enabled */
 static int external_amp[SNDRV_CARDS] = {[0 ... (SNDRV_CARDS - 1)] = 1};
 static int amp_gpio[SNDRV_CARDS] = {[0 ... (SNDRV_CARDS - 1)] = -1};
+static int boot_devs;
 
-MODULE_PARM(index, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+module_param_array(index, int, boot_devs, 0444);
 MODULE_PARM_DESC(index, "Index value for " CARD_NAME " soundcard.");
 MODULE_PARM_SYNTAX(index, SNDRV_INDEX_DESC);
-MODULE_PARM(id, "1-" __MODULE_STRING(SNDRV_CARDS) "s");
+module_param_array(id, charp, boot_devs, 0444);
 MODULE_PARM_DESC(id, "ID string for " CARD_NAME " soundcard.");
 MODULE_PARM_SYNTAX(id, SNDRV_ID_DESC);
-MODULE_PARM(enable, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+module_param_array(enable, bool, boot_devs, 0444);
 MODULE_PARM_DESC(enable, "Enable this soundcard.");
 MODULE_PARM_SYNTAX(enable, SNDRV_ENABLE_DESC);
-MODULE_PARM(external_amp, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+module_param_array(external_amp, bool, boot_devs, 0444);
 MODULE_PARM_DESC(external_amp, "Enable external amp for " CARD_NAME " soundcard.");
 MODULE_PARM_SYNTAX(external_amp, SNDRV_ENABLED "," SNDRV_BOOLEAN_TRUE_DESC);
-MODULE_PARM(amp_gpio, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+module_param_array(amp_gpio, int, boot_devs, 0444);
 MODULE_PARM_DESC(amp_gpio, "GPIO pin number for external amp. (default = -1)");
 MODULE_PARM_SYNTAX(amp_gpio, SNDRV_ENABLED);
 
@@ -2410,18 +2411,16 @@
  * APM support
  */
 #ifdef CONFIG_PM
-
-static void m3_suspend(m3_t *chip)
+static int m3_suspend(snd_card_t *card, unsigned int state)
 {
-	snd_card_t *card = chip->card;
+	m3_t *chip = snd_magic_cast(m3_t, card->pm_private_data, return -EINVAL);
 	int i, index;
 
 	if (chip->suspend_mem == NULL)
-		return;
-	if (card->power_state == SNDRV_CTL_POWER_D3hot)
-		return;
+		return 0;
 
 	snd_pcm_suspend_all(chip->pcm);
+	snd_ac97_suspend(chip->ac97);
 
 	big_mdelay(10); /* give the assp a chance to idle.. */
 
@@ -2440,17 +2439,16 @@
 	snd_m3_outw(chip, 0xffff, 0x54);
 	snd_m3_outw(chip, 0xffff, 0x56);
 	snd_power_change_state(card, SNDRV_CTL_POWER_D3hot);
+	return 0;
 }
 
-static void m3_resume(m3_t *chip)
+static int m3_resume(snd_card_t *card, unsigned int state)
 {
-	snd_card_t *card = chip->card;
+	m3_t *chip = snd_magic_cast(m3_t, card->pm_private_data, return -EINVAL);
 	int i, index;
 
 	if (chip->suspend_mem == NULL)
-		return;
-	if (card->power_state == SNDRV_CTL_POWER_D0)
-		return;
+		return 0;
 
 	/* first lets just bring everything back. .*/
 	snd_m3_outw(chip, 0, 0x54);
@@ -2481,41 +2479,8 @@
 	snd_m3_amp_enable(chip, 1);
 
 	snd_power_change_state(card, SNDRV_CTL_POWER_D0);
-}
-
-static int snd_m3_suspend(struct pci_dev *pci, u32 state)
-{
-	m3_t *chip = snd_magic_cast(m3_t, pci_get_drvdata(pci), return -ENXIO);
-	m3_suspend(chip);
-	return 0;
-}
-static int snd_m3_resume(struct pci_dev *pci)
-{
-	m3_t *chip = snd_magic_cast(m3_t, pci_get_drvdata(pci), return -ENXIO);
-	m3_resume(chip);
-	return 0;
-}
-
-/* callback */
-static int snd_m3_set_power_state(snd_card_t *card, unsigned int power_state)
-{
-	m3_t *chip = snd_magic_cast(m3_t, card->power_state_private_data, return -ENXIO);
-	switch (power_state) {
-	case SNDRV_CTL_POWER_D0:
-	case SNDRV_CTL_POWER_D1:
-	case SNDRV_CTL_POWER_D2:
-		m3_resume(chip);
-		break;
-	case SNDRV_CTL_POWER_D3hot:
-	case SNDRV_CTL_POWER_D3cold:
-		m3_suspend(chip);
-		break;
-	default:
-		return -EINVAL;
-	}
 	return 0;
 }
-
 #endif /* CONFIG_PM */
 
 
@@ -2651,11 +2616,9 @@
 #ifdef CONFIG_PM
 	chip->suspend_mem = vmalloc(sizeof(u16) * (REV_B_CODE_MEMORY_LENGTH + REV_B_DATA_MEMORY_LENGTH));
 	if (chip->suspend_mem == NULL)
-		snd_printk("can't allocate apm buffer\n");
-	else {
-		card->set_power_state = snd_m3_set_power_state;
-		card->power_state_private_data = chip;
-	}
+		snd_printk(KERN_WARNING "can't allocate apm buffer\n");
+	else
+		snd_card_set_pm_callback(card, m3_suspend, m3_resume, chip);
 #endif
 
 	if ((err = snd_device_new(card, SNDRV_DEV_LOWLEVEL, chip, &ops)) < 0) {
@@ -2738,16 +2701,14 @@
 		printk(KERN_WARNING "maestro3: no midi support.\n");
 #endif
 
-	pci_set_drvdata(pci, chip);
+	pci_set_drvdata(pci, card);
 	dev++;
 	return 0;
 }
 
 static void __devexit snd_m3_remove(struct pci_dev *pci)
 {
-	m3_t *chip = snd_magic_cast(m3_t, pci_get_drvdata(pci), return);
-	if (chip)
-		snd_card_free(chip->card);
+	snd_card_free(pci_get_drvdata(pci));
 	pci_set_drvdata(pci, NULL);
 }
 
@@ -2756,23 +2717,12 @@
 	.id_table = snd_m3_ids,
 	.probe = snd_m3_probe,
 	.remove = __devexit_p(snd_m3_remove),
-#ifdef CONFIG_PM
-	.suspend = snd_m3_suspend,
-	.resume = snd_m3_resume,
-#endif
+	SND_PCI_PM_CALLBACKS
 };
 	
 static int __init alsa_card_m3_init(void)
 {
-	int err;
-
-	if ((err = pci_module_init(&driver)) < 0) {
-#ifdef MODULE
-		printk(KERN_ERR "Maestro3/Allegro soundcard not found or device busy\n");
-#endif
-		return err;
-	}
-	return 0;
+	return pci_module_init(&driver);
 }
 
 static void __exit alsa_card_m3_exit(void)
@@ -2782,26 +2732,3 @@
 
 module_init(alsa_card_m3_init)
 module_exit(alsa_card_m3_exit)
-
-#ifndef MODULE
-
-/* format is: snd-maestro3=enable,index,id,external_amp,amp_gpio */
-
-static int __init alsa_card_maestro3_setup(char *str)
-{
-	static unsigned __initdata nr_dev = 0;
-
-	if (nr_dev >= SNDRV_CARDS)
-		return 0;
-	(void)(get_option(&str,&enable[nr_dev]) == 2 &&
-	       get_option(&str,&index[nr_dev]) == 2 &&
-	       get_id(&str,&id[nr_dev]) == 2 &&
-	       get_option(&str,&external_amp[nr_dev]) == 2 &&
-	       get_option(&str,&amp_gpio[nr_dev]) == 2);
-	nr_dev++;
-	return 1;
-}
-
-__setup("snd-maestro3=", alsa_card_maestro3_setup);
-
-#endif /* ifndef MODULE */
diff -Nru a/sound/pci/mixart/mixart.c b/sound/pci/mixart/mixart.c
--- a/sound/pci/mixart/mixart.c	2004-05-26 15:01:36 -07:00
+++ b/sound/pci/mixart/mixart.c	2004-05-26 15:01:36 -07:00
@@ -25,8 +25,8 @@
 #include <linux/init.h>
 #include <linux/interrupt.h>
 #include <linux/pci.h>
+#include <linux/moduleparam.h>
 #include <sound/core.h>
-#define SNDRV_GET_ID
 #include <sound/initval.h>
 #include <sound/info.h>
 #include <sound/control.h>
@@ -48,16 +48,17 @@
 static int index[SNDRV_CARDS] = SNDRV_DEFAULT_IDX;             /* Index 0-MAX */
 static char *id[SNDRV_CARDS] = SNDRV_DEFAULT_STR;              /* ID for this card */
 static int enable[SNDRV_CARDS] = SNDRV_DEFAULT_ENABLE_PNP;     /* Enable this card */
+static int boot_devs;
 
 #define chip_t mixart_t
 
-MODULE_PARM(index, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+module_param_array(index, int, boot_devs, 0444);
 MODULE_PARM_DESC(index, "Index value for Digigram " CARD_NAME " soundcard.");
 MODULE_PARM_SYNTAX(index, SNDRV_INDEX_DESC);
-MODULE_PARM(id, "1-" __MODULE_STRING(SNDRV_CARDS) "s");
+module_param_array(id, charp, boot_devs, 0444);
 MODULE_PARM_DESC(id, "ID string for Digigram " CARD_NAME " soundcard.");
 MODULE_PARM_SYNTAX(id, SNDRV_ID_DESC);
-MODULE_PARM(enable, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+module_param_array(enable, bool, boot_devs, 0444);
 MODULE_PARM_DESC(enable, "Enable Digigram " CARD_NAME " soundcard.");
 MODULE_PARM_SYNTAX(enable, SNDRV_ENABLE_DESC);
 
@@ -1432,15 +1433,7 @@
 
 static int __init alsa_card_mixart_init(void)
 {
-	int err;
-
-	if ((err = pci_module_init(&driver)) < 0) {
-#ifdef MODULE
-		snd_printk(KERN_ERR "Digigram miXart soundcard not found or device busy\n");
-#endif
-		return err;
-	}
-	return 0;
+	return pci_module_init(&driver);
 }
 
 static void __exit alsa_card_mixart_exit(void)
@@ -1450,24 +1443,3 @@
 
 module_init(alsa_card_mixart_init)
 module_exit(alsa_card_mixart_exit)
-
-#ifndef MODULE
-
-/* format is: snd-mixart=enable,index,id */
-
-static int __init alsa_card_mixart_setup(char *str)
-{
-	static unsigned __initdata nr_dev = 0;
-
-	if (nr_dev >= SNDRV_CARDS)
-		return 0;
-	(void)(get_option(&str,&enable[nr_dev]) == 2 &&
-	       get_option(&str,&index[nr_dev]) == 2 &&
-	       get_id(&str,&id[nr_dev]) == 2);
-	nr_dev++;
-	return 1;
-}
-
-__setup("snd-mixart=", alsa_card_mixart_setup);
-
-#endif /* ifndef MODULE */
diff -Nru a/sound/pci/nm256/nm256.c b/sound/pci/nm256/nm256.c
--- a/sound/pci/nm256/nm256.c	2004-05-26 15:01:36 -07:00
+++ b/sound/pci/nm256/nm256.c	2004-05-26 15:01:36 -07:00
@@ -31,12 +31,12 @@
 #include <linux/init.h>
 #include <linux/pci.h>
 #include <linux/slab.h>
+#include <linux/moduleparam.h>
 #include <sound/core.h>
 #include <sound/info.h>
 #include <sound/control.h>
 #include <sound/pcm.h>
 #include <sound/ac97_codec.h>
-#define SNDRV_GET_ID
 #include <sound/initval.h>
 
 #define CARD_NAME "NeoMagic 256AV/ZX"
@@ -62,32 +62,33 @@
 static int buffer_top[SNDRV_CARDS] = {[0 ... (SNDRV_CARDS - 1)] = 0}; /* not specified */
 static int use_cache[SNDRV_CARDS] = {[0 ... (SNDRV_CARDS - 1)] = 0}; /* disabled */
 static int vaio_hack[SNDRV_CARDS] = {[0 ... (SNDRV_CARDS - 1)] = 0}; /* disabled */
+static int boot_devs;
 
-MODULE_PARM(index, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+module_param_array(index, int, boot_devs, 0444);
 MODULE_PARM_DESC(index, "Index value for " CARD_NAME " soundcard.");
 MODULE_PARM_SYNTAX(index, SNDRV_INDEX_DESC);
-MODULE_PARM(id, "1-" __MODULE_STRING(SNDRV_CARDS) "s");
+module_param_array(id, charp, boot_devs, 0444);
 MODULE_PARM_DESC(id, "ID string for " CARD_NAME " soundcard.");
 MODULE_PARM_SYNTAX(id, SNDRV_ID_DESC);
-MODULE_PARM(enable, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+module_param_array(enable, bool, boot_devs, 0444);
 MODULE_PARM_DESC(enable, "Enable this soundcard.");
 MODULE_PARM_SYNTAX(enable, SNDRV_ENABLE_DESC);
-MODULE_PARM(playback_bufsize, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+module_param_array(playback_bufsize, int, boot_devs, 0444);
 MODULE_PARM_DESC(playback_bufsize, "DAC frame size in kB for " CARD_NAME " soundcard.");
 MODULE_PARM_SYNTAX(playback_bufsize, SNDRV_ENABLED);
-MODULE_PARM(capture_bufsize, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+module_param_array(capture_bufsize, int, boot_devs, 0444);
 MODULE_PARM_DESC(capture_bufsize, "ADC frame size in kB for " CARD_NAME " soundcard.");
 MODULE_PARM_SYNTAX(capture_bufsize, SNDRV_ENABLED);
-MODULE_PARM(force_ac97, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+module_param_array(force_ac97, bool, boot_devs, 0444);
 MODULE_PARM_DESC(force_ac97, "Force to use AC97 codec for " CARD_NAME " soundcard.");
 MODULE_PARM_SYNTAX(force_ac97, SNDRV_ENABLED "," SNDRV_BOOLEAN_FALSE_DESC);
-MODULE_PARM(buffer_top, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+module_param_array(buffer_top, int, boot_devs, 0444);
 MODULE_PARM_DESC(buffer_top, "Set the top address of audio buffer for " CARD_NAME " soundcard.");
 MODULE_PARM_SYNTAX(buffer_top, SNDRV_ENABLED);
-MODULE_PARM(use_cache, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+module_param_array(use_cache, bool, boot_devs, 0444);
 MODULE_PARM_DESC(use_cache, "Enable the cache for coefficient table access.");
 MODULE_PARM_SYNTAX(use_cache, SNDRV_ENABLED "," SNDRV_BOOLEAN_FALSE_DESC);
-MODULE_PARM(vaio_hack, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+module_param_array(vaio_hack, bool, boot_devs, 0444);
 MODULE_PARM_DESC(vaio_hack, "Enable workaround for Sony VAIO notebooks.");
 MODULE_PARM_SYNTAX(vaio_hack, SNDRV_ENABLED "," SNDRV_BOOLEAN_FALSE_DESC);
 
@@ -274,11 +275,15 @@
 #ifndef PCI_DEVICE_ID_NEOMAGIC_NM256ZX_AUDIO
 #define PCI_DEVICE_ID_NEOMAGIC_NM256ZX_AUDIO 0x8006
 #endif
+#ifndef PCI_DEVICE_ID_NEOMAGIC_NM256XL_PLUS_AUDIO
+#define PCI_DEVICE_ID_NEOMAGIC_NM256XL_PLUS_AUDIO 0x8016
+#endif
 
 
 static struct pci_device_id snd_nm256_ids[] = {
 	{PCI_VENDOR_ID_NEOMAGIC, PCI_DEVICE_ID_NEOMAGIC_NM256AV_AUDIO, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
 	{PCI_VENDOR_ID_NEOMAGIC, PCI_DEVICE_ID_NEOMAGIC_NM256ZX_AUDIO, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
+	{PCI_VENDOR_ID_NEOMAGIC, PCI_DEVICE_ID_NEOMAGIC_NM256XL_PLUS_AUDIO, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
 	{0,},
 };
 
@@ -1283,24 +1288,20 @@
  * APM event handler, so the card is properly reinitialized after a power
  * event.
  */
-static void nm256_suspend(nm256_t *chip)
+static int nm256_suspend(snd_card_t *card, unsigned int state)
 {
-	snd_card_t *card = chip->card;
-
-	if (card->power_state == SNDRV_CTL_POWER_D3hot)
-		return;
+	nm256_t *chip = snd_magic_cast(nm256_t, card->pm_private_data, return -EINVAL);
 
 	snd_pcm_suspend_all(chip->pcm);
+	snd_ac97_suspend(chip->ac97);
 	chip->coeffs_current = 0;
 	snd_power_change_state(card, SNDRV_CTL_POWER_D3hot);
+	return 0;
 }
 
-static void nm256_resume(nm256_t *chip)
+static int nm256_resume(snd_card_t *card, unsigned int state)
 {
-	snd_card_t *card = chip->card;
-
-	if (card->power_state == SNDRV_CTL_POWER_D0)
-		return;
+	nm256_t *chip = snd_magic_cast(nm256_t, card->pm_private_data, return -EINVAL);
 
 	/* Perform a full reset on the hardware */
 	pci_enable_device(chip->pci);
@@ -1310,41 +1311,8 @@
 	snd_ac97_resume(chip->ac97);
 
 	snd_power_change_state(card, SNDRV_CTL_POWER_D0);
-}
-
-static int snd_nm256_suspend(struct pci_dev *dev, u32 state)
-{
-	nm256_t *chip = snd_magic_cast(nm256_t, pci_get_drvdata(dev), return -ENXIO);
-	nm256_suspend(chip);
-	return 0;
-}
-static int snd_nm256_resume(struct pci_dev *dev)
-{
-	nm256_t *chip = snd_magic_cast(nm256_t, pci_get_drvdata(dev), return -ENXIO);
-	nm256_resume(chip);
-	return 0;
-}
-
-/* callback */
-static int snd_nm256_set_power_state(snd_card_t *card, unsigned int power_state)
-{
-	nm256_t *chip = snd_magic_cast(nm256_t, card->power_state_private_data, return -ENXIO);
-	switch (power_state) {
-	case SNDRV_CTL_POWER_D0:
-	case SNDRV_CTL_POWER_D1:
-	case SNDRV_CTL_POWER_D2:
-		nm256_resume(chip);
-		break;
-	case SNDRV_CTL_POWER_D3hot:
-	case SNDRV_CTL_POWER_D3cold:
-		nm256_suspend(chip);
-		break;
-	default:
-		return -EINVAL;
-	}
 	return 0;
 }
-
 #endif /* CONFIG_PM */
 
 static int snd_nm256_free(nm256_t *chip)
@@ -1552,10 +1520,7 @@
 
 	// pci_set_master(pci); /* needed? */
 	
-#ifdef CONFIG_PM
-	card->set_power_state = snd_nm256_set_power_state;
-	card->power_state_private_data = chip;
-#endif
+	snd_card_set_pm_callback(card, nm256_suspend, nm256_resume, chip);
 
 	if ((err = snd_device_new(card, SNDRV_DEV_LOWLEVEL, chip, &ops)) < 0)
 		goto __error;
@@ -1571,6 +1536,21 @@
 }
 
 
+struct nm256_quirk {
+	unsigned short vendor;
+	unsigned short device;
+	int type;
+};
+
+#define NM_BLACKLISTED	1
+
+static struct nm256_quirk nm256_quirks[] __devinitdata = {
+	/* HP omnibook 4150 has cs4232 codec internally */
+	{ .vendor = 0x103c, .device = 0x0007, .type = NM_BLACKLISTED },
+	{ } /* terminator */
+};
+
+
 static int __devinit snd_nm256_probe(struct pci_dev *pci,
 				     const struct pci_device_id *pci_id)
 {
@@ -1579,6 +1559,8 @@
 	nm256_t *chip;
 	int err;
 	unsigned int xbuffer_top;
+	struct nm256_quirk *q;
+	u16 subsystem_vendor, subsystem_device;
 
 	if ((err = pci_enable_device(pci)) < 0)
 		return err;
@@ -1590,6 +1572,18 @@
 		return -ENOENT;
 	}
 
+	pci_read_config_word(pci, PCI_SUBSYSTEM_VENDOR_ID, &subsystem_vendor);
+	pci_read_config_word(pci, PCI_SUBSYSTEM_ID, &subsystem_device);
+
+	for (q = nm256_quirks; q->vendor; q++) {
+		if (q->vendor == subsystem_vendor && q->device == subsystem_device) {
+			if (q->type == NM_BLACKLISTED) {
+				printk(KERN_INFO "nm256: The device is blacklisted.  Loading stopped\n");
+				return -ENODEV;
+			}
+		}
+	}
+
 	card = snd_card_new(index[dev], id[dev], THIS_MODULE, 0);
 	if (card == NULL)
 		return -ENOMEM;
@@ -1601,6 +1595,9 @@
 	case PCI_DEVICE_ID_NEOMAGIC_NM256ZX_AUDIO:
 		strcpy(card->driver, "NM256ZX");
 		break;
+	case PCI_DEVICE_ID_NEOMAGIC_NM256XL_PLUS_AUDIO:
+		strcpy(card->driver, "NM256XL+");
+		break;
 	default:
 		snd_printk("invalid device id 0x%x\n", pci->device);
 		snd_card_free(card);
@@ -1641,16 +1638,14 @@
 		return err;
 	}
 
-	pci_set_drvdata(pci, chip);
+	pci_set_drvdata(pci, card);
 	dev++;
 	return 0;
 }
 
 static void __devexit snd_nm256_remove(struct pci_dev *pci)
 {
-	nm256_t *chip = snd_magic_cast(nm256_t, pci_get_drvdata(pci), return);
-	if (chip)
-		snd_card_free(chip->card);
+	snd_card_free(pci_get_drvdata(pci));
 	pci_set_drvdata(pci, NULL);
 }
 
@@ -1660,23 +1655,13 @@
 	.id_table = snd_nm256_ids,
 	.probe = snd_nm256_probe,
 	.remove = __devexit_p(snd_nm256_remove),
-#ifdef CONFIG_PM
-	.suspend = snd_nm256_suspend,
-	.resume = snd_nm256_resume,
-#endif
+	SND_PCI_PM_CALLBACKS
 };
 
 
 static int __init alsa_card_nm256_init(void)
 {
-	int err;
-	if ((err = pci_module_init(&driver)) < 0) {
-#ifdef MODULE
-		printk(KERN_ERR "NeoMagic 256 audio soundchip not found or device busy\n");
-#endif
-		return err;
-	}
-	return 0;
+	return pci_module_init(&driver);
 }
 
 static void __exit alsa_card_nm256_exit(void)
@@ -1686,31 +1671,3 @@
 
 module_init(alsa_card_nm256_init)
 module_exit(alsa_card_nm256_exit)
-
-#ifndef MODULE
-
-/* format is: snd-nm256=enable,index,id,
-			playback_bufsize,capture_bufsize,
-			force_ac97,buffer_top,use_cache */
-
-static int __init alsa_card_nm256_setup(char *str)
-{
-	static unsigned __initdata nr_dev = 0;
-
-	if (nr_dev >= SNDRV_CARDS)
-		return 0;
-	(void)(get_option(&str,&enable[nr_dev]) == 2 &&
-	       get_option(&str,&index[nr_dev]) == 2 &&
-	       get_id(&str,&id[nr_dev]) == 2 &&
-	       get_option(&str,&playback_bufsize[nr_dev]) == 2 &&
-	       get_option(&str,&capture_bufsize[nr_dev]) == 2 &&
-	       get_option(&str,&force_ac97[nr_dev]) == 2 &&
-	       get_option(&str,&buffer_top[nr_dev]) == 2 &&
-	       get_option(&str,&use_cache[nr_dev]) == 2);
-	nr_dev++;
-	return 1;
-}
-
-__setup("snd-nm256=", alsa_card_nm256_setup);
-
-#endif /* ifndef MODULE */
diff -Nru a/sound/pci/rme32.c b/sound/pci/rme32.c
--- a/sound/pci/rme32.c	2004-05-26 15:01:36 -07:00
+++ b/sound/pci/rme32.c	2004-05-26 15:01:36 -07:00
@@ -61,6 +61,7 @@
 #include <linux/interrupt.h>
 #include <linux/pci.h>
 #include <linux/slab.h>
+#include <linux/moduleparam.h>
 
 #include <sound/core.h>
 #include <sound/info.h>
@@ -68,7 +69,6 @@
 #include <sound/pcm.h>
 #include <sound/pcm_params.h>
 #include <sound/asoundef.h>
-#define SNDRV_GET_ID
 #include <sound/initval.h>
 
 #include <asm/io.h>
@@ -76,14 +76,15 @@
 static int index[SNDRV_CARDS] = SNDRV_DEFAULT_IDX;	/* Index 0-MAX */
 static char *id[SNDRV_CARDS] = SNDRV_DEFAULT_STR;	/* ID for this card */
 static int enable[SNDRV_CARDS] = SNDRV_DEFAULT_ENABLE_PNP;	/* Enable this card */
+static int boot_devs;
 
-MODULE_PARM(index, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+module_param_array(index, int, boot_devs, 0444);
 MODULE_PARM_DESC(index, "Index value for RME Digi32 soundcard.");
 MODULE_PARM_SYNTAX(index, SNDRV_INDEX_DESC);
-MODULE_PARM(id, "1-" __MODULE_STRING(SNDRV_CARDS) "s");
+module_param_array(id, charp, boot_devs, 0444);
 MODULE_PARM_DESC(id, "ID string for RME Digi32 soundcard.");
 MODULE_PARM_SYNTAX(id, SNDRV_ID_DESC);
-MODULE_PARM(enable, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+module_param_array(enable, bool, boot_devs, 0444);
 MODULE_PARM_DESC(enable, "Enable RME Digi32 soundcard.");
 MODULE_PARM_SYNTAX(enable, SNDRV_ENABLE_DESC);
 MODULE_AUTHOR("Martin Langer <martin-langer@gmx.de>");
@@ -1995,15 +1996,7 @@
 
 static int __init alsa_card_rme32_init(void)
 {
-	int err;
-
-	if ((err = pci_module_init(&driver)) < 0) {
-#ifdef MODULE
-		snd_printk("No RME Digi32 cards found\n");
-#endif
-		return err;
-	}
-	return 0;
+	return pci_module_init(&driver);
 }
 
 static void __exit alsa_card_rme32_exit(void)
@@ -2013,22 +2006,3 @@
 
 module_init(alsa_card_rme32_init)
 module_exit(alsa_card_rme32_exit)
-
-#ifndef MODULE
-
-static int __init alsa_card_rme32_setup(char *str)
-{
-	static unsigned __initdata nr_dev = 0;
-
-	if (nr_dev >= SNDRV_CARDS)
-		return 0;
-	(void) (get_option(&str, &enable[nr_dev]) == 2 &&
-		get_option(&str, &index[nr_dev]) == 2 &&
-		get_id(&str, &id[nr_dev]) == 2);
-	nr_dev++;
-	return 1;
-}
-
-__setup("snd-rme32=", alsa_card_rme32_setup);
-
-#endif				/* ifndef MODULE */
diff -Nru a/sound/pci/rme96.c b/sound/pci/rme96.c
--- a/sound/pci/rme96.c	2004-05-26 15:01:35 -07:00
+++ b/sound/pci/rme96.c	2004-05-26 15:01:35 -07:00
@@ -29,6 +29,7 @@
 #include <linux/interrupt.h>
 #include <linux/pci.h>
 #include <linux/slab.h>
+#include <linux/moduleparam.h>
 
 #include <sound/core.h>
 #include <sound/info.h>
@@ -36,7 +37,6 @@
 #include <sound/pcm.h>
 #include <sound/pcm_params.h>
 #include <sound/asoundef.h>
-#define SNDRV_GET_ID
 #include <sound/initval.h>
 
 #include <asm/io.h>
@@ -57,14 +57,15 @@
 static int index[SNDRV_CARDS] = SNDRV_DEFAULT_IDX;	/* Index 0-MAX */
 static char *id[SNDRV_CARDS] = SNDRV_DEFAULT_STR;	/* ID for this card */
 static int enable[SNDRV_CARDS] = SNDRV_DEFAULT_ENABLE_PNP;	/* Enable this card */
+static int boot_devs;
 
-MODULE_PARM(index, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+module_param_array(index, int, boot_devs, 0444);
 MODULE_PARM_DESC(index, "Index value for RME Digi96 soundcard.");
 MODULE_PARM_SYNTAX(index, SNDRV_INDEX_DESC);
-MODULE_PARM(id, "1-" __MODULE_STRING(SNDRV_CARDS) "s");
+module_param_array(id, charp, boot_devs, 0444);
 MODULE_PARM_DESC(id, "ID string for RME Digi96 soundcard.");
 MODULE_PARM_SYNTAX(id, SNDRV_ID_DESC);
-MODULE_PARM(enable, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+module_param_array(enable, bool, boot_devs, 0444);
 MODULE_PARM_DESC(enable, "Enable RME Digi96 soundcard.");
 MODULE_PARM_SYNTAX(enable, SNDRV_ENABLE_DESC);
 
@@ -2565,15 +2566,7 @@
 
 static int __init alsa_card_rme96_init(void)
 {
-	int err;
-
-	if ((err = pci_module_init(&driver)) < 0) {
-#ifdef MODULE
-		printk(KERN_ERR "No RME Digi96 cards found\n");
-#endif
-		return err;
-	}
-	return 0;
+	return pci_module_init(&driver);
 }
 
 static void __exit alsa_card_rme96_exit(void)
@@ -2583,24 +2576,3 @@
 
 module_init(alsa_card_rme96_init)
 module_exit(alsa_card_rme96_exit)
-
-#ifndef MODULE
-
-/* format is: snd-rme96=enable,index,id */
-
-static int __init alsa_card_rme96_setup(char *str)
-{
-	static unsigned __initdata nr_dev = 0;
-
-	if (nr_dev >= SNDRV_CARDS)
-		return 0;
-	(void)(get_option(&str,&enable[nr_dev]) == 2 &&
-	       get_option(&str,&index[nr_dev]) == 2 &&
-	       get_id(&str,&id[nr_dev]) == 2);
-	nr_dev++;
-	return 1;
-}
-
-__setup("snd-rme96=", alsa_card_rme96_setup);
-
-#endif /* ifndef MODULE */
diff -Nru a/sound/pci/rme9652/hdsp.c b/sound/pci/rme9652/hdsp.c
--- a/sound/pci/rme9652/hdsp.c	2004-05-26 15:01:35 -07:00
+++ b/sound/pci/rme9652/hdsp.c	2004-05-26 15:01:35 -07:00
@@ -27,6 +27,7 @@
 #include <linux/interrupt.h>
 #include <linux/slab.h>
 #include <linux/pci.h>
+#include <linux/moduleparam.h>
 
 #include <sound/core.h>
 #include <sound/control.h>
@@ -35,7 +36,6 @@
 #include <sound/asoundef.h>
 #include <sound/rawmidi.h>
 #include <sound/hwdep.h>
-#define SNDRV_GET_ID
 #include <sound/initval.h>
 #include <sound/hdsp.h>
 
@@ -48,20 +48,21 @@
 static int enable[SNDRV_CARDS] = SNDRV_DEFAULT_ENABLE_PNP;	/* Enable this card */
 static int precise_ptr[SNDRV_CARDS] = { [0 ... (SNDRV_CARDS-1)] = 0 }; /* Enable precise pointer */
 static int line_outs_monitor[SNDRV_CARDS] = { [0 ... (SNDRV_CARDS-1)] = 0}; /* Send all inputs/playback to line outs */
+static int boot_devs;
 
-MODULE_PARM(index, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+module_param_array(index, int, boot_devs, 0444);
 MODULE_PARM_DESC(index, "Index value for RME Hammerfall DSP interface.");
 MODULE_PARM_SYNTAX(index, SNDRV_INDEX_DESC);
-MODULE_PARM(id, "1-" __MODULE_STRING(SNDRV_CARDS) "s");
+module_param_array(id, charp, boot_devs, 0444);
 MODULE_PARM_DESC(id, "ID string for RME Hammerfall DSP interface.");
 MODULE_PARM_SYNTAX(id, SNDRV_ID_DESC);
-MODULE_PARM(enable, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+module_param_array(enable, bool, boot_devs, 0444);
 MODULE_PARM_DESC(enable, "Enable/disable specific Hammerfall DSP soundcards.");
 MODULE_PARM_SYNTAX(enable, SNDRV_ENABLE_DESC);
-MODULE_PARM(precise_ptr, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+module_param_array(precise_ptr, bool, boot_devs, 0444);
 MODULE_PARM_DESC(precise_ptr, "Enable precise pointer (doesn't work reliably).");
 MODULE_PARM_SYNTAX(precise_ptr, SNDRV_ENABLED "," SNDRV_BOOLEAN_FALSE_DESC);
-MODULE_PARM(line_outs_monitor,"1-" __MODULE_STRING(SNDRV_CARDS) "i");
+module_param_array(line_outs_monitor, bool, boot_devs, 0444);
 MODULE_PARM_DESC(line_outs_monitor, "Send all input and playback streams to line outs by default.");
 MODULE_PARM_SYNTAX(line_outs_monitor, SNDRV_ENABLED "," SNDRV_BOOLEAN_FALSE_DESC);
 MODULE_AUTHOR("Paul Davis <paul@linuxaudiosystems.com>, Marcus Andersson, Thomas Charbonnel <thomas@undata.org>");
@@ -634,6 +635,7 @@
 	case 0xa:
 		return (64 * out) + (32 + (in));
 	case 0x96:
+	case 0x97:
 		return (32 * out) + (16 + (in));
 	default:
 		return (52 * out) + (26 + (in));
@@ -646,6 +648,7 @@
 	case 0xa:
 		return (64 * out) + in;
 	case 0x96:
+	case 0x97:
 		return (32 * out) + in;
 	default:
 		return (52 * out) + in;
@@ -4120,10 +4123,10 @@
 		return -EIO;
 	}
 
-	spin_lock_irq(&hdsp->lock);
+	spin_lock(&hdsp->lock);
 	if (!hdsp->running)
 		hdsp_reset_hw_pointer(hdsp);
-	spin_unlock_irq(&hdsp->lock);
+	spin_unlock(&hdsp->lock);
 	return result;
 }
 
@@ -5018,6 +5021,7 @@
 		is_9652 = 1;
 		break;
 	case 0x96:
+	case 0x97:
 		hdsp->card_name = "RME HDSP 9632";
 		hdsp->max_channels = 16;
 		is_9632 = 1;
@@ -5198,14 +5202,7 @@
 
 static int __init alsa_card_hdsp_init(void)
 {
-	if (pci_module_init(&driver) < 0) {
-#ifdef MODULE
-		printk(KERN_ERR "RME Hammerfall-DSP: no cards found\n");
-#endif
-		return -ENODEV;
-	}
-
-	return 0;
+	return pci_module_init(&driver);
 }
 
 static void __exit alsa_card_hdsp_exit(void)
@@ -5215,24 +5212,3 @@
 
 module_init(alsa_card_hdsp_init)
 module_exit(alsa_card_hdsp_exit)
-
-#ifndef MODULE
-
-/* format is: snd-hdsp=enable,index,id */
-
-static int __init alsa_card_hdsp_setup(char *str)
-{
-	static unsigned __initdata nr_dev = 0;
-
-	if (nr_dev >= SNDRV_CARDS)
-		return 0;
-	(void)(get_option(&str,&enable[nr_dev]) == 2 &&
-	       get_option(&str,&index[nr_dev]) == 2 &&
-	       get_id(&str,&id[nr_dev]) == 2);
-	nr_dev++;
-	return 1;
-}
-
-__setup("snd-hdsp=", alsa_card_hdsp_setup);
-
-#endif /* ifndef MODULE */
diff -Nru a/sound/pci/rme9652/rme9652.c b/sound/pci/rme9652/rme9652.c
--- a/sound/pci/rme9652/rme9652.c	2004-05-26 15:01:35 -07:00
+++ b/sound/pci/rme9652/rme9652.c	2004-05-26 15:01:35 -07:00
@@ -26,13 +26,13 @@
 #include <linux/interrupt.h>
 #include <linux/pci.h>
 #include <linux/slab.h>
+#include <linux/moduleparam.h>
 
 #include <sound/core.h>
 #include <sound/control.h>
 #include <sound/pcm.h>
 #include <sound/info.h>
 #include <sound/asoundef.h>
-#define SNDRV_GET_ID
 #include <sound/initval.h>
 
 #include <asm/current.h>
@@ -42,17 +42,18 @@
 static char *id[SNDRV_CARDS] = SNDRV_DEFAULT_STR;	/* ID for this card */
 static int enable[SNDRV_CARDS] = SNDRV_DEFAULT_ENABLE_PNP;	/* Enable this card */
 static int precise_ptr[SNDRV_CARDS] = { [0 ... (SNDRV_CARDS-1)] = 0 }; /* Enable precise pointer */
+static int boot_devs;
 
-MODULE_PARM(index, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+module_param_array(index, int, boot_devs, 0444);
 MODULE_PARM_DESC(index, "Index value for RME Digi9652 (Hammerfall) soundcard.");
 MODULE_PARM_SYNTAX(index, SNDRV_INDEX_DESC);
-MODULE_PARM(id, "1-" __MODULE_STRING(SNDRV_CARDS) "s");
+module_param_array(id, charp, boot_devs, 0444);
 MODULE_PARM_DESC(id, "ID string for RME Digi9652 (Hammerfall) soundcard.");
 MODULE_PARM_SYNTAX(id, SNDRV_ID_DESC);
-MODULE_PARM(enable, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+module_param_array(enable, bool, boot_devs, 0444);
 MODULE_PARM_DESC(enable, "Enable/disable specific RME96{52,36} soundcards.");
 MODULE_PARM_SYNTAX(enable, SNDRV_ENABLE_DESC);
-MODULE_PARM(precise_ptr, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+module_param_array(precise_ptr, bool, boot_devs, 0444);
 MODULE_PARM_DESC(precise_ptr, "Enable precise pointer (doesn't work reliably).");
 MODULE_PARM_SYNTAX(precise_ptr, SNDRV_ENABLED "," SNDRV_BOOLEAN_FALSE_DESC);
 MODULE_AUTHOR("Paul Davis <pbd@op.net>, Winfried Ritsch");
@@ -2262,10 +2263,10 @@
 	rme9652_t *rme9652 = _snd_pcm_substream_chip(substream);
 	int result = 0;
 
-	spin_lock_irq(&rme9652->lock);
+	spin_lock(&rme9652->lock);
 	if (!rme9652->running)
 		rme9652_reset_hw_pointer(rme9652);
-	spin_unlock_irq(&rme9652->lock);
+	spin_unlock(&rme9652->lock);
 	return result;
 }
 
@@ -2748,14 +2749,7 @@
 
 static int __init alsa_card_hammerfall_init(void)
 {
-	if (pci_module_init(&driver) < 0) {
-#ifdef MODULE
-		printk(KERN_ERR "RME Digi9652/Digi9636: no cards found\n");
-#endif
-		return -ENODEV;
-	}
-
-	return 0;
+	return pci_module_init(&driver);
 }
 
 static void __exit alsa_card_hammerfall_exit(void)
@@ -2765,24 +2759,3 @@
 
 module_init(alsa_card_hammerfall_init)
 module_exit(alsa_card_hammerfall_exit)
-
-#ifndef MODULE
-
-/* format is: snd-rme9652=enable,index,id */
-
-static int __init alsa_card_rme9652_setup(char *str)
-{
-	static unsigned __initdata nr_dev = 0;
-
-	if (nr_dev >= SNDRV_CARDS)
-		return 0;
-	(void)(get_option(&str,&enable[nr_dev]) == 2 &&
-	       get_option(&str,&index[nr_dev]) == 2 &&
-	       get_id(&str,&id[nr_dev]) == 2);
-	nr_dev++;
-	return 1;
-}
-
-__setup("snd-rme9652=", alsa_card_rme9652_setup);
-
-#endif /* ifndef MODULE */
diff -Nru a/sound/pci/sonicvibes.c b/sound/pci/sonicvibes.c
--- a/sound/pci/sonicvibes.c	2004-05-26 15:01:36 -07:00
+++ b/sound/pci/sonicvibes.c	2004-05-26 15:01:36 -07:00
@@ -29,6 +29,7 @@
 #include <linux/pci.h>
 #include <linux/slab.h>
 #include <linux/gameport.h>
+#include <linux/moduleparam.h>
 
 #include <sound/core.h>
 #include <sound/pcm.h>
@@ -36,7 +37,6 @@
 #include <sound/control.h>
 #include <sound/mpu401.h>
 #include <sound/opl3.h>
-#define SNDRV_GET_ID
 #include <sound/initval.h>
 
 #include <asm/io.h>
@@ -60,23 +60,24 @@
 static int reverb[SNDRV_CARDS] = {[0 ... (SNDRV_CARDS - 1)] = 0};
 static int mge[SNDRV_CARDS] = {[0 ... (SNDRV_CARDS - 1)] = 0};
 static unsigned int dmaio = 0x7a00;	/* DDMA i/o address */
+static int boot_devs;
 
-MODULE_PARM(index, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+module_param_array(index, int, boot_devs, 0444);
 MODULE_PARM_DESC(index, "Index value for S3 SonicVibes soundcard.");
 MODULE_PARM_SYNTAX(index, SNDRV_INDEX_DESC);
-MODULE_PARM(id, "1-" __MODULE_STRING(SNDRV_CARDS) "s");
+module_param_array(id, charp, boot_devs, 0444);
 MODULE_PARM_DESC(id, "ID string for S3 SonicVibes soundcard.");
 MODULE_PARM_SYNTAX(id, SNDRV_ID_DESC);
-MODULE_PARM(enable, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+module_param_array(enable, bool, boot_devs, 0444);
 MODULE_PARM_DESC(enable, "Enable S3 SonicVibes soundcard.");
 MODULE_PARM_SYNTAX(enable, SNDRV_ENABLE_DESC);
-MODULE_PARM(reverb, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+module_param_array(reverb, bool, boot_devs, 0444);
 MODULE_PARM_DESC(reverb, "Enable reverb (SRAM is present) for S3 SonicVibes soundcard.");
 MODULE_PARM_SYNTAX(reverb, SNDRV_ENABLED "," SNDRV_ENABLE_DESC);
-MODULE_PARM(mge, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+module_param_array(mge, bool, boot_devs, 0444);
 MODULE_PARM_DESC(mge, "MIC Gain Enable for S3 SonicVibes soundcard.");
 MODULE_PARM_SYNTAX(mge, SNDRV_ENABLED "," SNDRV_ENABLE_DESC);
-MODULE_PARM(dmaio, "i");
+module_param(dmaio, uint, 0444);
 MODULE_PARM_DESC(dmaio, "DDMA i/o base address for S3 SonicVibes soundcard.");
 MODULE_PARM_SYNTAX(dmaio, "global," SNDRV_PORT_DESC);
 
@@ -1535,15 +1536,7 @@
 
 static int __init alsa_card_sonicvibes_init(void)
 {
-	int err;
-
-	if ((err = pci_module_init(&driver)) < 0) {
-#ifdef MODULE
-		printk(KERN_ERR "S3 SonicVibes soundcard not found or device busy\n");
-#endif
-		return err;
-	}
-	return 0;
+	return pci_module_init(&driver);
 }
 
 static void __exit alsa_card_sonicvibes_exit(void)
@@ -1553,28 +1546,3 @@
 
 module_init(alsa_card_sonicvibes_init)
 module_exit(alsa_card_sonicvibes_exit)
-
-#ifndef MODULE
-
-/* format is: snd-sonicvibes=enable,index,id,
-			     reverb,mge,dmaio */
-
-static int __init alsa_card_sonicvibes_setup(char *str)
-{
-	static unsigned __initdata nr_dev = 0;
-
-	if (nr_dev >= SNDRV_CARDS)
-		return 0;
-	(void)(get_option(&str,&enable[nr_dev]) == 2 &&
-	       get_option(&str,&index[nr_dev]) == 2 &&
-	       get_id(&str,&id[nr_dev]) == 2 &&
-	       get_option(&str,&reverb[nr_dev]) == 2 &&
-	       get_option(&str,&mge[nr_dev]) == 2 &&
-	       get_option(&str,(int *)&dmaio) == 2);
-	nr_dev++;
-	return 1;
-}
-
-__setup("snd-sonicvibes=", alsa_card_sonicvibes_setup);
-
-#endif /* ifndef MODULE */
diff -Nru a/sound/pci/trident/trident.c b/sound/pci/trident/trident.c
--- a/sound/pci/trident/trident.c	2004-05-26 15:01:35 -07:00
+++ b/sound/pci/trident/trident.c	2004-05-26 15:01:35 -07:00
@@ -25,9 +25,9 @@
 #include <linux/init.h>
 #include <linux/pci.h>
 #include <linux/time.h>
+#include <linux/moduleparam.h>
 #include <sound/core.h>
 #include <sound/trident.h>
-#define SNDRV_GET_ID
 #include <sound/initval.h>
 
 MODULE_AUTHOR("Jaroslav Kysela <perex@suse.cz>, <audio@tridentmicro.com>");
@@ -52,20 +52,21 @@
 static int enable[SNDRV_CARDS] = SNDRV_DEFAULT_ENABLE_PNP;	/* Enable this card */
 static int pcm_channels[SNDRV_CARDS] = {[0 ... (SNDRV_CARDS - 1)] = 32};
 static int wavetable_size[SNDRV_CARDS] = {[0 ... (SNDRV_CARDS - 1)] = 8192};
+static int boot_devs;
 
-MODULE_PARM(index, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+module_param_array(index, int, boot_devs, 0444);
 MODULE_PARM_DESC(index, "Index value for Trident 4DWave PCI soundcard.");
 MODULE_PARM_SYNTAX(index, SNDRV_INDEX_DESC);
-MODULE_PARM(id, "1-" __MODULE_STRING(SNDRV_CARDS) "s");
+module_param_array(id, charp, boot_devs, 0444);
 MODULE_PARM_DESC(id, "ID string for Trident 4DWave PCI soundcard.");
 MODULE_PARM_SYNTAX(id, SNDRV_ID_DESC);
-MODULE_PARM(enable, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+module_param_array(enable, bool, boot_devs, 0444);
 MODULE_PARM_DESC(enable, "Enable Trident 4DWave PCI soundcard.");
 MODULE_PARM_SYNTAX(enable, SNDRV_ENABLE_DESC);
-MODULE_PARM(pcm_channels, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+module_param_array(pcm_channels, int, boot_devs, 0444);
 MODULE_PARM_DESC(pcm_channels, "Number of hardware channels assigned for PCM.");
 MODULE_PARM_SYNTAX(pcm_channels, SNDRV_ENABLED ",default:32,allows:{{1,32}}");
-MODULE_PARM(wavetable_size, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+module_param_array(wavetable_size, int, boot_devs, 0444);
 MODULE_PARM_DESC(wavetable_size, "Maximum memory size in kB for wavetable synth.");
 MODULE_PARM_SYNTAX(wavetable_size, SNDRV_ENABLED ",default:8192,skill:advanced");
 
@@ -169,56 +170,28 @@
 		snd_card_free(card);
 		return err;
 	}
-	pci_set_drvdata(pci, trident);
+	pci_set_drvdata(pci, card);
 	dev++;
 	return 0;
 }
 
 static void __devexit snd_trident_remove(struct pci_dev *pci)
 {
-	trident_t *trident = snd_magic_cast(trident_t, pci_get_drvdata(pci), return);
-	if (trident)
-		snd_card_free(trident->card);
+	snd_card_free(pci_get_drvdata(pci));
 	pci_set_drvdata(pci, NULL);
 }
 
-#ifdef CONFIG_PM
-static int snd_card_trident_suspend(struct pci_dev *pci, u32 state)
-{
-	trident_t *chip = snd_magic_cast(trident_t, pci_get_drvdata(pci), return -ENXIO);
-	snd_trident_suspend(chip);
-	return 0;
-}
-static int snd_card_trident_resume(struct pci_dev *pci)
-{
-	trident_t *chip = snd_magic_cast(trident_t, pci_get_drvdata(pci), return -ENXIO);
-	snd_trident_resume(chip);
-	return 0;
-}
-#endif
-
 static struct pci_driver driver = {
 	.name = "Trident4DWaveAudio",
 	.id_table = snd_trident_ids,
 	.probe = snd_trident_probe,
 	.remove = __devexit_p(snd_trident_remove),
-#ifdef CONFIG_PM
-	.suspend = snd_card_trident_suspend,
-	.resume = snd_card_trident_resume,
-#endif
+	SND_PCI_PM_CALLBACKS
 };
 
 static int __init alsa_card_trident_init(void)
 {
-	int err;
-
-	if ((err = pci_module_init(&driver)) < 0) {
-#ifdef MODULE
-		printk(KERN_ERR "Trident 4DWave PCI soundcard not found or device busy\n");
-#endif
-		return err;
-	}
-	return 0;
+	return pci_module_init(&driver);
 }
 
 static void __exit alsa_card_trident_exit(void)
@@ -228,27 +201,3 @@
 
 module_init(alsa_card_trident_init)
 module_exit(alsa_card_trident_exit)
-
-#ifndef MODULE
-
-/* format is: snd-trident=enable,index,id,
-			  pcm_channels,wavetable_size */
-
-static int __init alsa_card_trident_setup(char *str)
-{
-	static unsigned __initdata nr_dev = 0;
-
-	if (nr_dev >= SNDRV_CARDS)
-		return 0;
-	(void)(get_option(&str,&enable[nr_dev]) == 2 &&
-	       get_option(&str,&index[nr_dev]) == 2 &&
-	       get_id(&str,&id[nr_dev]) == 2 &&
-	       get_option(&str,&pcm_channels[nr_dev]) == 2 &&
-	       get_option(&str,&wavetable_size[nr_dev]) == 2);
-	nr_dev++;
-	return 1;
-}
-
-__setup("snd-trident=", alsa_card_trident_setup);
-
-#endif /* ifndef MODULE */
diff -Nru a/sound/pci/trident/trident_main.c b/sound/pci/trident/trident_main.c
--- a/sound/pci/trident/trident_main.c	2004-05-26 15:01:36 -07:00
+++ b/sound/pci/trident/trident_main.c	2004-05-26 15:01:36 -07:00
@@ -50,7 +50,8 @@
 static int snd_trident_pcm_mixer_free(trident_t *trident, snd_trident_voice_t * voice, snd_pcm_substream_t *substream);
 static irqreturn_t snd_trident_interrupt(int irq, void *dev_id, struct pt_regs *regs);
 #ifdef CONFIG_PM
-static int snd_trident_set_power_state(snd_card_t *card, unsigned int power_state);
+static int snd_trident_suspend(snd_card_t *card, unsigned int state);
+static int snd_trident_resume(snd_card_t *card, unsigned int state);
 #endif
 static int snd_trident_sis_reset(trident_t *trident);
 
@@ -3646,10 +3647,8 @@
 
 	snd_trident_enable_eso(trident);
 
-#ifdef CONFIG_PM
-	card->set_power_state = snd_trident_set_power_state;
-	card->power_state_private_data = trident;
-#endif
+	
+	snd_card_set_pm_callback(card, snd_trident_suspend, snd_trident_resume, trident);
 
 	snd_trident_proc_init(trident);
 	if ((err = snd_device_new(card, SNDRV_DEV_LOWLEVEL, trident, &ops)) < 0) {
@@ -3949,19 +3948,21 @@
 }
 
 #ifdef CONFIG_PM
-
-void snd_trident_suspend(trident_t *trident)
+static int snd_trident_suspend(snd_card_t *card, unsigned int state)
 {
-	snd_card_t *card = trident->card;
+	trident_t *trident = snd_magic_cast(trident_t, card->pm_private_data, return -EINVAL);
 
-	if (card->power_state == SNDRV_CTL_POWER_D3hot)
-		return;
 	trident->in_suspend = 1;
 	snd_pcm_suspend_all(trident->pcm);
 	if (trident->foldback)
 		snd_pcm_suspend_all(trident->foldback);
 	if (trident->spdif)
 		snd_pcm_suspend_all(trident->spdif);
+
+	snd_ac97_suspend(trident->ac97);
+	if (trident->ac97_sec)
+		snd_ac97_suspend(trident->ac97_sec);
+
 	switch (trident->device) {
 	case TRIDENT_DEVICE_ID_DX:
 	case TRIDENT_DEVICE_ID_NX:
@@ -3970,14 +3971,12 @@
 		break;
 	}
 	snd_power_change_state(card, SNDRV_CTL_POWER_D3hot);
+	return 0;
 }
 
-void snd_trident_resume(trident_t *trident)
+static int snd_trident_resume(snd_card_t *card, unsigned int state)
 {
-	snd_card_t *card = trident->card;
-
-	if (card->power_state == SNDRV_CTL_POWER_D0)
-		return;
+	trident_t *trident = snd_magic_cast(trident_t, card->pm_private_data, return -EINVAL);
 
 	pci_enable_device(trident->pci);
 	if (pci_set_dma_mask(trident->pci, 0x3fffffff) < 0 ||
@@ -3998,6 +3997,8 @@
 	}
 
 	snd_ac97_resume(trident->ac97);
+	if (trident->ac97_sec)
+		snd_ac97_resume(trident->ac97_sec);
 
 	/* restore some registers */
 	outl(trident->musicvol_wavevol, TRID_REG(trident, T4D_MUSICVOL_WAVEVOL));
@@ -4006,28 +4007,8 @@
 
 	snd_power_change_state(card, SNDRV_CTL_POWER_D0);
 	trident->in_suspend = 0;
+	return 0;
 }
-
-static int snd_trident_set_power_state(snd_card_t *card, unsigned int power_state)
-{
-	trident_t *chip = snd_magic_cast(trident_t, card->power_state_private_data, return -ENXIO);
-        
-	switch (power_state) {
-        case SNDRV_CTL_POWER_D0:
-        case SNDRV_CTL_POWER_D1:
-        case SNDRV_CTL_POWER_D2:
-        	snd_trident_resume(chip);
-                break;
-	case SNDRV_CTL_POWER_D3hot:
-        case SNDRV_CTL_POWER_D3cold:
-		snd_trident_suspend(chip);
-		break;
-        default:
-	        return -EINVAL;
-        }
-        return 0;
-}
-
 #endif /* CONFIG_PM */
 
 EXPORT_SYMBOL(snd_trident_alloc_voice);
diff -Nru a/sound/pci/via82xx.c b/sound/pci/via82xx.c
--- a/sound/pci/via82xx.c	2004-05-26 15:01:36 -07:00
+++ b/sound/pci/via82xx.c	2004-05-26 15:01:36 -07:00
@@ -51,13 +51,13 @@
 #include <linux/pci.h>
 #include <linux/slab.h>
 #include <linux/gameport.h>
+#include <linux/moduleparam.h>
 #include <sound/core.h>
 #include <sound/pcm.h>
 #include <sound/pcm_params.h>
 #include <sound/info.h>
 #include <sound/ac97_codec.h>
 #include <sound/mpu401.h>
-#define SNDRV_GET_ID
 #include <sound/initval.h>
 
 #if 0
@@ -84,31 +84,32 @@
 static int ac97_clock[SNDRV_CARDS] = {[0 ... (SNDRV_CARDS - 1)] = 48000};
 static int ac97_quirk[SNDRV_CARDS] = {[0 ... (SNDRV_CARDS - 1)] = AC97_TUNE_DEFAULT};
 static int dxs_support[SNDRV_CARDS];
+static int boot_devs;
 
-MODULE_PARM(index, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+module_param_array(index, int, boot_devs, 0444);
 MODULE_PARM_DESC(index, "Index value for VIA 82xx bridge.");
 MODULE_PARM_SYNTAX(index, SNDRV_INDEX_DESC);
-MODULE_PARM(id, "1-" __MODULE_STRING(SNDRV_CARDS) "s");
+module_param_array(id, charp, boot_devs, 0444);
 MODULE_PARM_DESC(id, "ID string for VIA 82xx bridge.");
 MODULE_PARM_SYNTAX(id, SNDRV_ID_DESC);
-MODULE_PARM(enable, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+module_param_array(enable, bool, boot_devs, 0444);
 MODULE_PARM_DESC(enable, "Enable audio part of VIA 82xx bridge.");
 MODULE_PARM_SYNTAX(enable, SNDRV_ENABLE_DESC);
-MODULE_PARM(mpu_port, "1-" __MODULE_STRING(SNDRV_CARDS) "l");
+module_param_array(mpu_port, long, boot_devs, 0444);
 MODULE_PARM_DESC(mpu_port, "MPU-401 port. (VT82C686x only)");
 MODULE_PARM_SYNTAX(mpu_port, SNDRV_PORT_DESC);
 #ifdef SUPPORT_JOYSTICK
-MODULE_PARM(joystick, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+module_param_array(joystick, bool, boot_devs, 0444);
 MODULE_PARM_DESC(joystick, "Enable joystick. (VT82C686x only)");
 MODULE_PARM_SYNTAX(joystick, SNDRV_ENABLE_DESC "," SNDRV_BOOLEAN_FALSE_DESC);
 #endif
-MODULE_PARM(ac97_clock, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+module_param_array(ac97_clock, int, boot_devs, 0444);
 MODULE_PARM_DESC(ac97_clock, "AC'97 codec clock (default 48000Hz).");
 MODULE_PARM_SYNTAX(ac97_clock, SNDRV_ENABLED ",default:48000");
-MODULE_PARM(ac97_quirk, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+module_param_array(ac97_quirk, int, boot_devs, 0444);
 MODULE_PARM_DESC(ac97_quirk, "AC'97 workaround for strange hardware.");
 MODULE_PARM_SYNTAX(ac97_quirk, SNDRV_ENABLED ",allows:{{-1,4}},dialog:list,default:-1");
-MODULE_PARM(dxs_support, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+module_param_array(dxs_support, int, boot_devs, 0444);
 MODULE_PARM_DESC(dxs_support, "Support for DXS channels (0 = auto, 1 = enable, 2 = disable, 3 = 48k only, 4 = no VRA)");
 MODULE_PARM_SYNTAX(dxs_support, SNDRV_ENABLED ",allows:{{0,4}},dialog:list");
 
@@ -368,6 +369,14 @@
 
 	unsigned char old_legacy;
 	unsigned char old_legacy_cfg;
+#ifdef CONFIG_PM
+	unsigned char legacy_saved;
+	unsigned char legacy_cfg_saved;
+	unsigned char spdif_ctrl_saved;
+	unsigned char capture_src_saved[2];
+	unsigned int mpu_port_saved;
+	u32 pci_state[16];
+#endif
 
 	unsigned char playback_volume[4][2]; /* for VIA8233/C/8235; default = 0 */
 
@@ -384,6 +393,7 @@
 	unsigned int no_vra: 1;		/* no need to set VRA on DXS channels */
 	unsigned int spdif_on: 1;	/* only spdif rates work to external DACs */
 
+	snd_pcm_t *pcms[2];
 	snd_rawmidi_t *rmidi;
 
 	ac97_bus_t *ac97_bus;
@@ -1289,6 +1299,7 @@
 	snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_CAPTURE, &snd_via8233_capture_ops);
 	pcm->private_data = chip;
 	strcpy(pcm->name, chip->card->shortname);
+	chip->pcms[0] = pcm;
 	/* set up playbacks */
 	for (i = 0; i < 4; i++)
 		init_viadev(chip, i, 0x10 * i, 0);
@@ -1307,6 +1318,7 @@
 	snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_CAPTURE, &snd_via8233_capture_ops);
 	pcm->private_data = chip;
 	strcpy(pcm->name, chip->card->shortname);
+	chip->pcms[1] = pcm;
 	/* set up playback */
 	init_viadev(chip, chip->multi_devno, VIA_REG_MULTPLAY_STATUS, 0);
 	/* set up capture */
@@ -1341,6 +1353,7 @@
 	snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_CAPTURE, &snd_via8233_capture_ops);
 	pcm->private_data = chip;
 	strcpy(pcm->name, chip->card->shortname);
+	chip->pcms[0] = pcm;
 	/* set up playback */
 	init_viadev(chip, chip->multi_devno, VIA_REG_MULTPLAY_STATUS, 0);
 	/* capture */
@@ -1357,6 +1370,7 @@
 	snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_PLAYBACK, &snd_via8233_playback_ops);
 	pcm->private_data = chip;
 	strcpy(pcm->name, chip->card->shortname);
+	chip->pcms[1] = pcm;
 	/* set up playback */
 	init_viadev(chip, chip->playback_devno, 0x30, 0);
 
@@ -1387,6 +1401,7 @@
 	snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_CAPTURE, &snd_via686_capture_ops);
 	pcm->private_data = chip;
 	strcpy(pcm->name, chip->card->shortname);
+	chip->pcms[0] = pcm;
 	init_viadev(chip, 0, VIA_REG_PLAYBACK_STATUS, 0);
 	init_viadev(chip, 1, VIA_REG_CAPTURE_STATUS, 1);
 
@@ -1404,8 +1419,11 @@
 
 static int snd_via8233_capture_source_info(snd_kcontrol_t *kcontrol, snd_ctl_elem_info_t *uinfo)
 {
+	/* formerly they were "Line" and "Mic", but it looks like that they
+	 * have nothing to do with the actual physical connections...
+	 */
 	static char *texts[2] = {
-		"Line", "Mic"
+		"Input1", "Input2"
 	};
 	uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;
 	uinfo->count = 1;
@@ -1584,6 +1602,12 @@
 		.name = "Mitac Mobo",
 		.type = AC97_TUNE_ALC_JACK
 	},
+	{
+		.vendor = 0x161f,
+		.device = 0x202b,
+		.name = "Arima Notebook",
+		.type = AC97_TUNE_HP_ONLY,
+	},
 	{ } /* terminator */
 };
 
@@ -1667,6 +1691,9 @@
 		if (mpu_port[dev] >= 0x200) {	/* force MIDI */
 			mpu_port[dev] &= 0xfffc;
 			pci_write_config_dword(chip->pci, 0x18, mpu_port[dev] | 0x01);
+#ifdef CONFIG_PM
+			chip->mpu_port_saved = mpu_port[dev];
+#endif
 		} else {
 			mpu_port[dev] = pci_resource_start(chip->pci, 2);
 		}
@@ -1725,6 +1752,11 @@
 		gameport_register_port(&chip->gameport);
 #endif
 
+#ifdef CONFIG_PM
+	chip->legacy_saved = legacy;
+	chip->legacy_cfg_saved = legacy_cfg;
+#endif
+
 	return 0;
 }
 
@@ -1865,6 +1897,74 @@
 	return 0;
 }
 
+#ifdef CONFIG_PM
+/*
+ * power management
+ */
+static int snd_via82xx_suspend(snd_card_t *card, unsigned int state)
+{
+	via82xx_t *chip = snd_magic_cast(via82xx_t, card->pm_private_data, return -EINVAL);
+	int i;
+
+	for (i = 0; i < 2; i++)
+		if (chip->pcms[i])
+			snd_pcm_suspend_all(chip->pcms[i]);
+	for (i = 0; i < chip->num_devs; i++)
+		snd_via82xx_channel_reset(chip, &chip->devs[i]);
+	synchronize_irq(chip->irq);
+	snd_ac97_suspend(chip->ac97);
+
+	/* save misc values */
+	if (chip->chip_type != TYPE_VIA686) {
+		pci_read_config_byte(chip->pci, VIA8233_SPDIF_CTRL, &chip->spdif_ctrl_saved);
+		chip->capture_src_saved[0] = inb(chip->port + VIA_REG_CAPTURE_CHANNEL);
+		chip->capture_src_saved[1] = inb(chip->port + VIA_REG_CAPTURE_CHANNEL + 0x10);
+	}
+
+	pci_save_state(chip->pci, chip->pci_state);
+	pci_set_power_state(chip->pci, 3);
+	pci_disable_device(chip->pci);
+	snd_power_change_state(card, SNDRV_CTL_POWER_D3hot);
+	return 0;
+}
+
+static int snd_via82xx_resume(snd_card_t *card, unsigned int state)
+{
+	via82xx_t *chip = snd_magic_cast(via82xx_t, card->pm_private_data, return -EINVAL);
+	int idx, i;
+
+	pci_enable_device(chip->pci);
+	pci_restore_state(chip->pci, chip->pci_state);
+	pci_set_power_state(chip->pci, 0);
+
+	snd_via82xx_chip_init(chip);
+
+	if (chip->chip_type == TYPE_VIA686) {
+		if (chip->mpu_port_saved)
+			pci_write_config_dword(chip->pci, 0x18, chip->mpu_port_saved | 0x01);
+		pci_write_config_byte(chip->pci, VIA_FUNC_ENABLE, chip->legacy_saved);
+		pci_write_config_byte(chip->pci, VIA_PNP_CONTROL, chip->legacy_cfg_saved);
+	} else {
+		pci_write_config_byte(chip->pci, VIA8233_SPDIF_CTRL, chip->spdif_ctrl_saved);
+		outb(chip->capture_src_saved[0], chip->port + VIA_REG_CAPTURE_CHANNEL);
+		outb(chip->capture_src_saved[1], chip->port + VIA_REG_CAPTURE_CHANNEL + 0x10);
+		for (idx = 0; idx < 4; idx++) {
+			unsigned long port = chip->port + 0x10 * idx;
+			for (i = 0; i < 2; i++)
+				outb(chip->playback_volume[idx][i], port + VIA_REG_OFS_PLAYBACK_VOLUME_L + i);
+		}
+	}
+
+	snd_ac97_resume(chip->ac97);
+
+	for (i = 0; i < chip->num_devs; i++)
+		snd_via82xx_channel_reset(chip, &chip->devs[i]);
+
+	snd_power_change_state(card, SNDRV_CTL_POWER_D0);
+	return 0;
+}
+#endif /* CONFIG_PM */
+
 static int snd_via82xx_free(via82xx_t *chip)
 {
 	unsigned int i;
@@ -2010,7 +2110,8 @@
 	static struct dxs_whitelist whitelist[] = {
 		{ .vendor = 0x1005, .device = 0x4710, .action = VIA_DXS_ENABLE }, /* Avance Logic Mobo */
 		{ .vendor = 0x1019, .device = 0x0996, .action = VIA_DXS_48K },
-		{ .vendor = 0x1043, .device = 0x8095, .action = VIA_DXS_ENABLE }, /* ASUS A7V8X */
+		{ .vendor = 0x1019, .device = 0x0a81, .action = VIA_DXS_NO_VRA }, /* ECS K7VTA3 v8.0 */
+		{ .vendor = 0x1043, .device = 0x8095, .action = VIA_DXS_NO_VRA }, /* ASUS A7V8X (FIXME: possibly VIA_DXS_ENABLE?)*/
 		{ .vendor = 0x1043, .device = 0x80a1, .action = VIA_DXS_NO_VRA }, /* ASUS A7V8-X */
 		{ .vendor = 0x1043, .device = 0x80b0, .action = VIA_DXS_NO_VRA }, /* ASUS A7V600 & K8V*/ 
 		{ .vendor = 0x10cf, .device = 0x118e, .action = VIA_DXS_ENABLE }, /* FSC laptop */
@@ -2025,6 +2126,8 @@
 		{ .vendor = 0x1462, .device = 0x7120, .action = VIA_DXS_ENABLE }, /* MSI KT4V */
 		{ .vendor = 0x1462, .device = 0x5901, .action = VIA_DXS_NO_VRA }, /* MSI KT6 Delta-SR */
 		{ .vendor = 0x1584, .device = 0x8120, .action = VIA_DXS_ENABLE }, /* Gericom/Targa/Vobis/Uniwill laptop */
+		{ .vendor = 0x161f, .device = 0x202b, .action = VIA_DXS_NO_VRA }, /* Amira Note book */
+		{ .vendor = 0x161f, .device = 0x2032, .action = VIA_DXS_48K }, /* m680x machines */
 		{ .vendor = 0x1631, .device = 0xe004, .action = VIA_DXS_ENABLE }, /* Easy Note 3174, Packard Bell */
 		{ .vendor = 0x1695, .device = 0x3005, .action = VIA_DXS_ENABLE }, /* EPoX EP-8K9A */
 		{ .vendor = 0x1849, .device = 0x3059, .action = VIA_DXS_NO_VRA }, /* ASRock K7VM2 */
@@ -2145,6 +2248,9 @@
 		if ((err = snd_via8233_init_misc(chip, dev)) < 0)
 			goto __error;
 	}
+
+	snd_card_set_pm_callback(card, snd_via82xx_suspend, snd_via82xx_resume, chip);
+
 	/* disable interrupts */
 	for (i = 0; i < chip->num_devs; i++)
 		snd_via82xx_channel_reset(chip, &chip->devs[i]);
@@ -2178,19 +2284,12 @@
 	.id_table = snd_via82xx_ids,
 	.probe = snd_via82xx_probe,
 	.remove = __devexit_p(snd_via82xx_remove),
+	SND_PCI_PM_CALLBACKS
 };
 
 static int __init alsa_card_via82xx_init(void)
 {
-	int err;
-
-	if ((err = pci_module_init(&driver)) < 0) {
-#ifdef MODULE
-		printk(KERN_ERR "VIA 82xx soundcard not found or device busy\n");
-#endif
-		return err;
-	}
-	return 0;
+	return pci_module_init(&driver);
 }
 
 static void __exit alsa_card_via82xx_exit(void)
@@ -2200,33 +2299,3 @@
 
 module_init(alsa_card_via82xx_init)
 module_exit(alsa_card_via82xx_exit)
-
-#ifndef MODULE
-
-/* format is: snd-via82xx=enable,index,id,
-			  mpu_port,joystick,
-			  ac97_quirk,ac97_clock,dxs_support */
-
-static int __init alsa_card_via82xx_setup(char *str)
-{
-	static unsigned __initdata nr_dev = 0;
-
-	if (nr_dev >= SNDRV_CARDS)
-		return 0;
-	(void)(get_option(&str,&enable[nr_dev]) == 2 &&
-	       get_option(&str,&index[nr_dev]) == 2 &&
-	       get_id(&str,&id[nr_dev]) == 2 &&
-	       get_option_long(&str,&mpu_port[nr_dev]) == 2 &&
-#ifdef SUPPORT_JOYSTICK
-	       get_option(&str,&joystick[nr_dev]) == 2 &&
-#endif
-	       get_option(&str,&ac97_quirk[nr_dev]) == 2 &&
-	       get_option(&str,&ac97_clock[nr_dev]) == 2 &&
-	       get_option(&str,&dxs_support[nr_dev]) == 2);
-	nr_dev++;
-	return 1;
-}
-
-__setup("snd-via82xx=", alsa_card_via82xx_setup);
-
-#endif /* ifndef MODULE */
diff -Nru a/sound/pci/vx222/vx222.c b/sound/pci/vx222/vx222.c
--- a/sound/pci/vx222/vx222.c	2004-05-26 15:01:36 -07:00
+++ b/sound/pci/vx222/vx222.c	2004-05-26 15:01:36 -07:00
@@ -23,8 +23,8 @@
 #include <linux/interrupt.h>
 #include <linux/pci.h>
 #include <linux/slab.h>
+#include <linux/moduleparam.h>
 #include <sound/core.h>
-#define SNDRV_GET_ID
 #include <sound/initval.h>
 #include "vx222.h"
 
@@ -43,20 +43,21 @@
 static int enable[SNDRV_CARDS] = SNDRV_DEFAULT_ENABLE_PNP;	/* Enable this card */
 static int mic[SNDRV_CARDS]; /* microphone */
 static int ibl[SNDRV_CARDS]; /* microphone */
+static int boot_devs;
 
-MODULE_PARM(index, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+module_param_array(index, int, boot_devs, 0444);
 MODULE_PARM_DESC(index, "Index value for Digigram " CARD_NAME " soundcard.");
 MODULE_PARM_SYNTAX(index, SNDRV_INDEX_DESC);
-MODULE_PARM(id, "1-" __MODULE_STRING(SNDRV_CARDS) "s");
+module_param_array(id, charp, boot_devs, 0444);
 MODULE_PARM_DESC(id, "ID string for Digigram " CARD_NAME " soundcard.");
 MODULE_PARM_SYNTAX(id, SNDRV_ID_DESC);
-MODULE_PARM(enable, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+module_param_array(enable, bool, boot_devs, 0444);
 MODULE_PARM_DESC(enable, "Enable Digigram " CARD_NAME " soundcard.");
 MODULE_PARM_SYNTAX(enable, SNDRV_ENABLE_DESC);
-MODULE_PARM(mic, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+module_param_array(mic, bool, boot_devs, 0444);
 MODULE_PARM_DESC(mic, "Enable Microphone.");
 MODULE_PARM_SYNTAX(mic, SNDRV_ENABLED "," SNDRV_BOOLEAN_FALSE_DESC);
-MODULE_PARM(ibl, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+module_param_array(ibl, int, boot_devs, 0444);
 MODULE_PARM_DESC(ibl, "Capture IBL size.");
 MODULE_PARM_SYNTAX(ibl, SNDRV_ENABLED);
 
@@ -272,15 +273,7 @@
 
 static int __init alsa_card_vx222_init(void)
 {
-	int err;
-
-	if ((err = pci_module_init(&driver)) < 0) {
-#ifdef MODULE
-		printk(KERN_ERR "Digigram VX222 soundcard not found or device busy\n");
-#endif
-		return err;
-	}
-	return 0;
+	return pci_module_init(&driver);
 }
 
 static void __exit alsa_card_vx222_exit(void)
@@ -290,24 +283,3 @@
 
 module_init(alsa_card_vx222_init)
 module_exit(alsa_card_vx222_exit)
-
-#ifndef MODULE
-
-/* format is: snd-vx222=enable,index,id */
-
-static int __init alsa_card_vx222_setup(char *str)
-{
-	static unsigned __initdata nr_dev = 0;
-
-	if (nr_dev >= SNDRV_CARDS)
-		return 0;
-	(void)(get_option(&str,&enable[nr_dev]) == 2 &&
-	       get_option(&str,&index[nr_dev]) == 2 &&
-	       get_id(&str,&id[nr_dev]) == 2);
-	nr_dev++;
-	return 1;
-}
-
-__setup("snd-vx222=", alsa_card_vx222_setup);
-
-#endif /* ifndef MODULE */
diff -Nru a/sound/pci/ymfpci/ymfpci.c b/sound/pci/ymfpci/ymfpci.c
--- a/sound/pci/ymfpci/ymfpci.c	2004-05-26 15:01:35 -07:00
+++ b/sound/pci/ymfpci/ymfpci.c	2004-05-26 15:01:35 -07:00
@@ -23,11 +23,11 @@
 #include <linux/init.h>
 #include <linux/pci.h>
 #include <linux/time.h>
+#include <linux/moduleparam.h>
 #include <sound/core.h>
 #include <sound/ymfpci.h>
 #include <sound/mpu401.h>
 #include <sound/opl3.h>
-#define SNDRV_GET_ID
 #include <sound/initval.h>
 
 MODULE_AUTHOR("Jaroslav Kysela <perex@suse.cz>");
@@ -50,28 +50,29 @@
 static long joystick_port[SNDRV_CARDS];
 #endif
 static int rear_switch[SNDRV_CARDS];
+static int boot_devs;
 
-MODULE_PARM(index, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+module_param_array(index, int, boot_devs, 0444);
 MODULE_PARM_DESC(index, "Index value for the Yamaha DS-XG PCI soundcard.");
 MODULE_PARM_SYNTAX(index, SNDRV_INDEX_DESC);
-MODULE_PARM(id, "1-" __MODULE_STRING(SNDRV_CARDS) "s");
+module_param_array(id, charp, boot_devs, 0444);
 MODULE_PARM_DESC(id, "ID string for the Yamaha DS-XG PCI soundcard.");
 MODULE_PARM_SYNTAX(id, SNDRV_ID_DESC);
-MODULE_PARM(enable, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+module_param_array(enable, bool, boot_devs, 0444);
 MODULE_PARM_DESC(enable, "Enable Yamaha DS-XG soundcard.");
 MODULE_PARM_SYNTAX(enable, SNDRV_ENABLE_DESC);
-MODULE_PARM(mpu_port, "1-" __MODULE_STRING(SNDRV_CARDS) "l");
+module_param_array(mpu_port, long, boot_devs, 0444);
 MODULE_PARM_DESC(mpu_port, "MPU-401 Port.");
 MODULE_PARM_SYNTAX(mpu_port, SNDRV_ENABLED);
-MODULE_PARM(fm_port, "1-" __MODULE_STRING(SNDRV_CARDS) "l");
+module_param_array(fm_port, long, boot_devs, 0444);
 MODULE_PARM_DESC(fm_port, "FM OPL-3 Port.");
 MODULE_PARM_SYNTAX(fm_port, SNDRV_ENABLED);
 #ifdef SUPPORT_JOYSTICK
-MODULE_PARM(joystick_port, "1-" __MODULE_STRING(SNDRV_CARDS) "l");
+module_param_array(joystick_port, long, boot_devs, 0444);
 MODULE_PARM_DESC(joystick_port, "Joystick port address");
 MODULE_PARM_SYNTAX(joystick_port, SNDRV_ENABLED);
 #endif
-MODULE_PARM(rear_switch, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+module_param_array(rear_switch, bool, boot_devs, 0444);
 MODULE_PARM_DESC(rear_switch, "Enable shared rear/line-in switch");
 MODULE_PARM_SYNTAX(rear_switch, SNDRV_ENABLED "," SNDRV_BOOLEAN_FALSE_DESC);
 
@@ -311,31 +312,14 @@
 		snd_card_free(card);
 		return err;
 	}
-	pci_set_drvdata(pci, chip);
+	pci_set_drvdata(pci, card);
 	dev++;
 	return 0;
 }
 
-#ifdef CONFIG_PM
-static int snd_card_ymfpci_suspend(struct pci_dev *pci, u32 state)
-{
-	ymfpci_t *chip = snd_magic_cast(ymfpci_t, pci_get_drvdata(pci), return -ENXIO);
-	snd_ymfpci_suspend(chip);
-	return 0;
-}
-static int snd_card_ymfpci_resume(struct pci_dev *pci)
-{
-	ymfpci_t *chip = snd_magic_cast(ymfpci_t, pci_get_drvdata(pci), return -ENXIO);
-	snd_ymfpci_resume(chip);
-	return 0;
-}
-#endif
-
 static void __devexit snd_card_ymfpci_remove(struct pci_dev *pci)
 {
-	ymfpci_t *chip = snd_magic_cast(ymfpci_t, pci_get_drvdata(pci), return);
-	if (chip)
-		snd_card_free(chip->card);
+	snd_card_free(pci_get_drvdata(pci));
 	pci_set_drvdata(pci, NULL);
 }
 
@@ -344,23 +328,12 @@
 	.id_table = snd_ymfpci_ids,
 	.probe = snd_card_ymfpci_probe,
 	.remove = __devexit_p(snd_card_ymfpci_remove),
-#ifdef CONFIG_PM
-	.suspend = snd_card_ymfpci_suspend,
-	.resume = snd_card_ymfpci_resume,
-#endif	
+	SND_PCI_PM_CALLBACKS
 };
 
 static int __init alsa_card_ymfpci_init(void)
 {
-	int err;
-
-	if ((err = pci_module_init(&driver)) < 0) {
-#ifdef MODULE
-		printk(KERN_ERR "Yamaha DS-XG PCI soundcard not found or device busy\n");
-#endif
-		return err;
-	}
-	return 0;
+	return pci_module_init(&driver);
 }
 
 static void __exit alsa_card_ymfpci_exit(void)
@@ -370,27 +343,3 @@
 
 module_init(alsa_card_ymfpci_init)
 module_exit(alsa_card_ymfpci_exit)
-
-#ifndef MODULE
-
-/* format is: snd-ymfpci=enable,index,id,
-			 fm_port,mpu_port */
-
-static int __init alsa_card_ymfpci_setup(char *str)
-{
-	static unsigned __initdata nr_dev = 0;
-
-	if (nr_dev >= SNDRV_CARDS)
-		return 0;
-	(void)(get_option(&str,&enable[nr_dev]) == 2 &&
-	       get_option(&str,&index[nr_dev]) == 2 &&
-	       get_id(&str,&id[nr_dev]) == 2 &&
-	       get_option_long(&str,&fm_port[nr_dev]) == 2 &&
-	       get_option_long(&str,&mpu_port[nr_dev]) == 2);
-	nr_dev++;
-	return 1;
-}
-
-__setup("snd-ymfpci=", alsa_card_ymfpci_setup);
-
-#endif /* ifndef MODULE */
diff -Nru a/sound/pci/ymfpci/ymfpci_main.c b/sound/pci/ymfpci/ymfpci_main.c
--- a/sound/pci/ymfpci/ymfpci_main.c	2004-05-26 15:01:36 -07:00
+++ b/sound/pci/ymfpci/ymfpci_main.c	2004-05-26 15:01:36 -07:00
@@ -2157,33 +2157,30 @@
 };
 #define YDSXGR_NUM_SAVED_REGS	ARRAY_SIZE(saved_regs_index)
 
-void snd_ymfpci_suspend(ymfpci_t *chip)
+static int snd_ymfpci_suspend(snd_card_t *card, unsigned int state)
 {
-	snd_card_t *card = chip->card;
+	ymfpci_t *chip = snd_magic_cast(ymfpci_t, card->pm_private_data, return -EINVAL);
 	unsigned int i;
 	
-	if (card->power_state == SNDRV_CTL_POWER_D3hot)
-		return;
 	snd_pcm_suspend_all(chip->pcm);
 	snd_pcm_suspend_all(chip->pcm2);
 	snd_pcm_suspend_all(chip->pcm_spdif);
 	snd_pcm_suspend_all(chip->pcm_4ch);
+	snd_ac97_suspend(chip->ac97);
 	for (i = 0; i < YDSXGR_NUM_SAVED_REGS; i++)
 		chip->saved_regs[i] = snd_ymfpci_readl(chip, saved_regs_index[i]);
 	chip->saved_ydsxgr_mode = snd_ymfpci_readl(chip, YDSXGR_MODE);
 	snd_ymfpci_writel(chip, YDSXGR_NATIVEDACOUTVOL, 0);
 	snd_ymfpci_disable_dsp(chip);
 	snd_power_change_state(card, SNDRV_CTL_POWER_D3hot);
+	return 0;
 }
 
-void snd_ymfpci_resume(ymfpci_t *chip)
+static int snd_ymfpci_resume(snd_card_t *card, unsigned int state)
 {
-	snd_card_t *card = chip->card;
+	ymfpci_t *chip = snd_magic_cast(ymfpci_t, card->pm_private_data, return -EINVAL);
 	unsigned int i;
 
-	if (card->power_state == SNDRV_CTL_POWER_D0)
-		return;
-
 	pci_enable_device(chip->pci);
 	pci_set_master(chip->pci);
 	snd_ymfpci_aclink_reset(chip->pci);
@@ -2205,25 +2202,6 @@
 		spin_unlock_irqrestore(&chip->reg_lock, flags);
 	}
 	snd_power_change_state(card, SNDRV_CTL_POWER_D0);
-}
-
-static int snd_ymfpci_set_power_state(snd_card_t *card, unsigned int power_state)
-{
-	ymfpci_t *chip = snd_magic_cast(ymfpci_t, card->power_state_private_data, return -ENXIO);
-
-	switch (power_state) {
-	case SNDRV_CTL_POWER_D0:
-	case SNDRV_CTL_POWER_D1:
-	case SNDRV_CTL_POWER_D2:
-		snd_ymfpci_resume(chip);
-		break;
-	case SNDRV_CTL_POWER_D3hot:
-	case SNDRV_CTL_POWER_D3cold:
-		snd_ymfpci_suspend(chip);
-		break;
-	default:
-		return -EINVAL;
-	}
 	return 0;
 }
 #endif /* CONFIG_PM */
@@ -2304,8 +2282,7 @@
 		snd_ymfpci_free(chip);
 		return -ENOMEM;
 	}
-	card->set_power_state = snd_ymfpci_set_power_state;
-	card->power_state_private_data = chip;
+	snd_card_set_pm_callback(card, snd_ymfpci_suspend, snd_ymfpci_resume, chip);
 #endif
 
 	snd_ymfpci_proc_init(card, chip);
diff -Nru a/sound/pcmcia/Kconfig b/sound/pcmcia/Kconfig
--- a/sound/pcmcia/Kconfig	2004-05-26 15:01:36 -07:00
+++ b/sound/pcmcia/Kconfig	2004-05-26 15:01:36 -07:00
@@ -20,6 +20,7 @@
 config SND_PDAUDIOCF
 	tristate "Sound Core PDAudioCF"
 	depends on SND && PCMCIA && ISA
+	select SND_PCM
 	help
 	  Say 'Y' or 'M' to include support for Sound Core PDAudioCF soundcard.
 
diff -Nru a/sound/pcmcia/pdaudiocf/pdaudiocf.c b/sound/pcmcia/pdaudiocf/pdaudiocf.c
--- a/sound/pcmcia/pdaudiocf/pdaudiocf.c	2004-05-26 15:01:35 -07:00
+++ b/sound/pcmcia/pdaudiocf/pdaudiocf.c	2004-05-26 15:01:35 -07:00
@@ -21,6 +21,7 @@
 #include <sound/driver.h>
 #include <sound/core.h>
 #include <linux/slab.h>
+#include <linux/moduleparam.h>
 #include <pcmcia/version.h>
 #include <pcmcia/ciscode.h>
 #include <pcmcia/cisreg.h>
@@ -44,19 +45,20 @@
 static int enable[SNDRV_CARDS] = SNDRV_DEFAULT_ENABLE_PNP;	/* Enable switches */
 static unsigned int irq_mask = 0xffff;
 static int irq_list[4] = { -1 };
+static int boot_devs;
 
-MODULE_PARM(index, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+module_param_array(index, int, boot_devs, 0444);
 MODULE_PARM_DESC(index, "Index value for " CARD_NAME " soundcard.");
 MODULE_PARM_SYNTAX(index, SNDRV_INDEX_DESC);
-MODULE_PARM(id, "1-" __MODULE_STRING(SNDRV_CARDS) "s");
+module_param_array(id, charp, boot_devs, 0444);
 MODULE_PARM_DESC(id, "ID string for " CARD_NAME " soundcard.");
 MODULE_PARM_SYNTAX(id, SNDRV_ID_DESC);
-MODULE_PARM(enable, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+module_param_array(enable, bool, boot_devs, 0444);
 MODULE_PARM_DESC(enable, "Enable " CARD_NAME " soundcard.");
 MODULE_PARM_SYNTAX(enable, SNDRV_ENABLE_DESC);
-MODULE_PARM(irq_mask, "i");
+module_param(irq_mask, int, 0444);
 MODULE_PARM_DESC(irq_mask, "IRQ bitmask for " CARD_NAME " soundcard.");
-MODULE_PARM(irq_list, "1-4i");
+module_param_array(irq_list, int, boot_devs, 0444);
 MODULE_PARM_DESC(irq_list, "List of Available interrupts for " CARD_NAME " soundcard.");
  
 
@@ -242,10 +244,7 @@
 	if (err < 0)
 		return err;
 
-#ifdef CONFIG_PM
-	card->power_state_private_data = pdacf;
-	card->set_power_state = snd_pdacf_set_power_state;
-#endif
+	snd_card_set_pm_callback(card, snd_pdacf_suspend, snd_pdacf_resume, pdacf);
 
 	if ((err = snd_card_register(card)) < 0)
 		return err;
@@ -370,7 +369,7 @@
 		link->state |= DEV_SUSPEND;
 		if (chip) {
 			snd_printdd(KERN_DEBUG "snd_pdacf_suspend calling\n");
-			snd_pdacf_suspend(chip);
+			snd_pdacf_suspend(chip->card, 0);
 		}
 		/* Fall through... */
 	case CS_EVENT_RESET_PHYSICAL:
@@ -389,7 +388,7 @@
 			pcmcia_request_configuration(link->handle, &link->conf);
 			if (chip) {
 				snd_printdd(KERN_DEBUG "calling snd_pdacf_resume\n");
-				snd_pdacf_resume(chip);
+				snd_pdacf_resume(chip->card, 0);
 			}
 		}
 		snd_printdd(KERN_DEBUG "resume done!\n");
diff -Nru a/sound/pcmcia/pdaudiocf/pdaudiocf.h b/sound/pcmcia/pdaudiocf/pdaudiocf.h
--- a/sound/pcmcia/pdaudiocf/pdaudiocf.h	2004-05-26 15:01:35 -07:00
+++ b/sound/pcmcia/pdaudiocf/pdaudiocf.h	2004-05-26 15:01:35 -07:00
@@ -136,12 +136,11 @@
 int snd_pdacf_ak4117_create(pdacf_t *pdacf);
 void snd_pdacf_powerdown(pdacf_t *chip);
 #ifdef CONFIG_PM
-void snd_pdacf_suspend(pdacf_t *chip);
-void snd_pdacf_resume(pdacf_t *chip);
-int snd_pdacf_set_power_state(snd_card_t *card, unsigned int power_state);
+int snd_pdacf_suspend(snd_card_t *card, unsigned int state);
+int snd_pdacf_resume(snd_card_t *card, unsigned int state);
 #endif
 int snd_pdacf_pcm_new(pdacf_t *chip);
-void pdacf_interrupt(int irq, void *dev, struct pt_regs *regs);
+irqreturn_t pdacf_interrupt(int irq, void *dev, struct pt_regs *regs);
 void pdacf_tasklet(unsigned long private_data);
 void pdacf_reinit(pdacf_t *chip, int resume);
 
diff -Nru a/sound/pcmcia/pdaudiocf/pdaudiocf_core.c b/sound/pcmcia/pdaudiocf/pdaudiocf_core.c
--- a/sound/pcmcia/pdaudiocf/pdaudiocf_core.c	2004-05-26 15:01:35 -07:00
+++ b/sound/pcmcia/pdaudiocf/pdaudiocf_core.c	2004-05-26 15:01:35 -07:00
@@ -255,13 +255,11 @@
 
 #ifdef CONFIG_PM
 
-void snd_pdacf_suspend(pdacf_t *chip)
+int snd_pdacf_suspend(snd_card_t *card, unsigned int state)
 {
-	snd_card_t *card = chip->card;
+	pdacf_t *chip = snd_magic_cast(pdacf_t, card->pm_private_data, return -EINVAL);
 	u16 val;
 	
-	if (card->power_state == SNDRV_CTL_POWER_D3hot)
-		return;
 	snd_pcm_suspend_all(chip->pcm);
 	/* disable interrupts, but use direct write to preserve old register value in chip->regmap */
 	val = inw(chip->port + PDAUDIOCF_REG_IER);
@@ -270,6 +268,7 @@
 	chip->chip_status |= PDAUDIOCF_STAT_IS_SUSPENDED;	/* ignore interrupts from now */
 	snd_pdacf_powerdown(chip);
 	snd_power_change_state(card, SNDRV_CTL_POWER_D3hot);
+	return 0;
 }
 
 static inline int check_signal(pdacf_t *chip)
@@ -277,13 +276,11 @@
 	return (chip->ak4117->rcs0 & AK4117_UNLCK) == 0;
 }
 
-void snd_pdacf_resume(pdacf_t *chip)
+int snd_pdacf_resume(snd_card_t *card, unsigned int state)
 {
-	snd_card_t *card = chip->card;
+	pdacf_t *chip = snd_magic_cast(pdacf_t, card->pm_private_data, return -EINVAL);
 	int timeout = 40;
 
-	if (card->power_state == SNDRV_CTL_POWER_D0)
-		return;
 	pdacf_reinit(chip, 1);
 	/* wait for AK4117's PLL */
 	while (timeout-- > 0 &&
@@ -291,26 +288,6 @@
 		mdelay(1);
 	chip->chip_status &= ~PDAUDIOCF_STAT_IS_SUSPENDED;
 	snd_power_change_state(card, SNDRV_CTL_POWER_D0);
-}
-
-int snd_pdacf_set_power_state(snd_card_t *card, unsigned int power_state)
-{
-	pdacf_t *chip = snd_magic_cast(pdacf_t, card->power_state_private_data, return -ENXIO);
-
-	switch (power_state) {
-	case SNDRV_CTL_POWER_D0:
-	case SNDRV_CTL_POWER_D1:
-	case SNDRV_CTL_POWER_D2:
-		snd_pdacf_resume(chip);
-		break;
-	case SNDRV_CTL_POWER_D3hot:
-	case SNDRV_CTL_POWER_D3cold:
-		snd_pdacf_suspend(chip);
-		break;
-	default:
-		return -EINVAL;
-	}
 	return 0;
 }
-
 #endif
diff -Nru a/sound/pcmcia/pdaudiocf/pdaudiocf_irq.c b/sound/pcmcia/pdaudiocf/pdaudiocf_irq.c
--- a/sound/pcmcia/pdaudiocf/pdaudiocf_irq.c	2004-05-26 15:01:36 -07:00
+++ b/sound/pcmcia/pdaudiocf/pdaudiocf_irq.c	2004-05-26 15:01:36 -07:00
@@ -26,15 +26,15 @@
 /*
  *
  */
-void pdacf_interrupt(int irq, void *dev, struct pt_regs *regs)
+irqreturn_t pdacf_interrupt(int irq, void *dev, struct pt_regs *regs)
 {
-	pdacf_t *chip = snd_magic_cast(pdacf_t, dev, return);
+	pdacf_t *chip = snd_magic_cast(pdacf_t, dev, return IRQ_NONE);
 	unsigned short stat;
 
 	if ((chip->chip_status & (PDAUDIOCF_STAT_IS_STALE|
 				  PDAUDIOCF_STAT_IS_CONFIGURED|
 				  PDAUDIOCF_STAT_IS_SUSPENDED)) != PDAUDIOCF_STAT_IS_CONFIGURED)
-		return;
+		return IRQ_HANDLED;	/* IRQ_NONE here? */
 
 	stat = inw(chip->port + PDAUDIOCF_REG_ISR);
 	if (stat & (PDAUDIOCF_IRQLVL|PDAUDIOCF_IRQOVR)) {
@@ -47,6 +47,7 @@
 	}
 	if (regs != NULL)
 		snd_ak4117_check_rate_and_errors(chip->ak4117, 0);
+	return IRQ_HANDLED;
 }
 
 static inline void pdacf_transfer_mono16(u16 *dst, u16 xor, unsigned int size, unsigned long rdp_port)
diff -Nru a/sound/pcmcia/vx/vxpocket.c b/sound/pcmcia/vx/vxpocket.c
--- a/sound/pcmcia/vx/vxpocket.c	2004-05-26 15:01:35 -07:00
+++ b/sound/pcmcia/vx/vxpocket.c	2004-05-26 15:01:35 -07:00
@@ -32,6 +32,7 @@
 
 #include <sound/driver.h>
 #include <linux/init.h>
+#include <linux/moduleparam.h>
 #include <sound/core.h>
 #include <pcmcia/version.h>
 #include "vxpocket.h"
@@ -58,21 +59,22 @@
 static unsigned int irq_mask = 0xffff;
 static int irq_list[4] = { -1 };
 static int ibl[SNDRV_CARDS];
+static int boot_devs;
 
-MODULE_PARM(index, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+module_param_array(index, int, boot_devs, 0444);
 MODULE_PARM_DESC(index, "Index value for " CARD_NAME " soundcard.");
 MODULE_PARM_SYNTAX(index, SNDRV_INDEX_DESC);
-MODULE_PARM(id, "1-" __MODULE_STRING(SNDRV_CARDS) "s");
+module_param_array(id, charp, boot_devs, 0444);
 MODULE_PARM_DESC(id, "ID string for " CARD_NAME " soundcard.");
 MODULE_PARM_SYNTAX(id, SNDRV_ID_DESC);
-MODULE_PARM(enable, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+module_param_array(enable, bool, boot_devs, 0444);
 MODULE_PARM_DESC(enable, "Enable " CARD_NAME " soundcard.");
 MODULE_PARM_SYNTAX(enable, SNDRV_ENABLE_DESC);
-MODULE_PARM(irq_mask, "i");
+module_param(irq_mask, int, 0444);
 MODULE_PARM_DESC(irq_mask, "IRQ bitmask for " CARD_NAME " soundcard.");
-MODULE_PARM(irq_list, "1-4i");
+module_param_array(irq_list, int, boot_devs, 0444);
 MODULE_PARM_DESC(irq_list, "List of Available interrupts for " CARD_NAME " soundcard.");
-MODULE_PARM(ibl, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+module_param_array(ibl, int, boot_devs, 0444);
 MODULE_PARM_DESC(ibl, "Capture IBL size for " CARD_NAME " soundcard.");
 MODULE_PARM_SYNTAX(ibl, SNDRV_ENABLED);
  
diff -Nru a/sound/ppc/keywest.c b/sound/ppc/keywest.c
--- a/sound/ppc/keywest.c	2004-05-26 15:01:36 -07:00
+++ b/sound/ppc/keywest.c	2004-05-26 15:01:36 -07:00
@@ -79,12 +79,7 @@
 
 	new_client->id = keywest_ctx->id++; /* Automatically unique */
 	keywest_ctx->client = new_client;
-
-	if ((err = keywest_ctx->init_client(keywest_ctx)) < 0) {
-		snd_printk(KERN_ERR "tumbler: cannot initialize the MCS\n");
-		goto __err;
-	}
-
+	
 	/* Tell the i2c layer a new client has arrived */
 	if (i2c_attach_client(new_client)) {
 		snd_printk(KERN_ERR "tumbler: cannot attach i2c client\n");
@@ -119,6 +114,17 @@
 		i2c_del_driver(&keywest_driver);
 		keywest_ctx = NULL;
 	}
+}
+
+int __init snd_pmac_tumbler_post_init(void)
+{
+	int err;
+	
+	if ((err = keywest_ctx->init_client(keywest_ctx)) < 0) {
+		snd_printk(KERN_ERR "tumbler: %i :cannot initialize the MCS\n", err);
+		return err;
+	}
+	return 0;
 }
 
 /* exported */
diff -Nru a/sound/ppc/pmac.c b/sound/ppc/pmac.c
--- a/sound/ppc/pmac.c	2004-05-26 15:01:36 -07:00
+++ b/sound/ppc/pmac.c	2004-05-26 15:01:36 -07:00
@@ -42,7 +42,8 @@
 #if defined(CONFIG_PM) && defined(CONFIG_PMAC_PBOOK)
 static int snd_pmac_register_sleep_notifier(pmac_t *chip);
 static int snd_pmac_unregister_sleep_notifier(pmac_t *chip);
-static int snd_pmac_set_power_state(snd_card_t *card, unsigned int power_state);
+static int snd_pmac_suspend(snd_card_t *card, unsigned int state);
+static int snd_pmac_resume(snd_card_t *card, unsigned int state);
 #endif
 
 
@@ -687,7 +688,7 @@
 static irqreturn_t
 snd_pmac_tx_intr(int irq, void *devid, struct pt_regs *regs)
 {
-	pmac_t *chip = snd_magic_cast(pmac_t, devid, return);
+	pmac_t *chip = snd_magic_cast(pmac_t, devid, return IRQ_NONE);
 	snd_pmac_pcm_update(chip, &chip->playback);
 	return IRQ_HANDLED;
 }
@@ -696,7 +697,7 @@
 static irqreturn_t
 snd_pmac_rx_intr(int irq, void *devid, struct pt_regs *regs)
 {
-	pmac_t *chip = snd_magic_cast(pmac_t, devid, return);
+	pmac_t *chip = snd_magic_cast(pmac_t, devid, return IRQ_NONE);
 	snd_pmac_pcm_update(chip, &chip->capture);
 	return IRQ_HANDLED;
 }
@@ -705,7 +706,7 @@
 static irqreturn_t
 snd_pmac_ctrl_intr(int irq, void *devid, struct pt_regs *regs)
 {
-	pmac_t *chip = snd_magic_cast(pmac_t, devid, return);
+	pmac_t *chip = snd_magic_cast(pmac_t, devid, return IRQ_NONE);
 	int ctrl = in_le32(&chip->awacs->control);
 
 	/*printk("pmac: control interrupt.. 0x%x\n", ctrl);*/
@@ -1170,9 +1171,8 @@
 
 #if defined(CONFIG_PM) && defined(CONFIG_PMAC_PBOOK)
 	/* add sleep notifier */
-	snd_pmac_register_sleep_notifier(chip);
-	card->set_power_state = snd_pmac_set_power_state;
-	card->power_state_private_data = chip;
+	if (! snd_pmac_register_sleep_notifier(chip))
+		snd_card_set_pm_callback(chip->card, snd_pmac_suspend, snd_pmac_resume, chip);
 #endif
 
 	if ((err = snd_device_new(card, SNDRV_DEV_LOWLEVEL, chip, &ops)) < 0)
@@ -1197,13 +1197,10 @@
  * Save state when going to sleep, restore it afterwards.
  */
 
-static void snd_pmac_suspend(pmac_t *chip)
+static int snd_pmac_suspend(snd_card_t *card, unsigned int state)
 {
+	pmac_t *chip = snd_magic_cast(pmac_t, card->pm_private_data, return -EINVAL);
 	unsigned long flags;
-	snd_card_t *card = chip->card;
-
-	if (card->power_state == SNDRV_CTL_POWER_D3hot)
-		return;
 
 	if (chip->suspend)
 		chip->suspend(chip);
@@ -1219,14 +1216,12 @@
 		disable_irq(chip->rx_irq);
 	snd_pmac_sound_feature(chip, 0);
 	snd_power_change_state(card, SNDRV_CTL_POWER_D3hot);
+	return 0;
 }
 
-static void snd_pmac_resume(pmac_t *chip)
+static int snd_pmac_resume(snd_card_t *card, unsigned int state)
 {
-	snd_card_t *card = chip->card;
-
-	if (card->power_state == SNDRV_CTL_POWER_D0)
-		return;
+	pmac_t *chip = snd_magic_cast(pmac_t, card->pm_private_data, return -EINVAL);
 
 	snd_pmac_sound_feature(chip, 1);
 	if (chip->resume)
@@ -1248,6 +1243,7 @@
 		enable_irq(chip->rx_irq);
 
 	snd_power_change_state(card, SNDRV_CTL_POWER_D0);
+	return 0;
 }
 
 /* the chip is stored statically by snd_pmac_register_sleep_notifier
@@ -1264,10 +1260,10 @@
 
 	switch (when) {
 	case PBOOK_SLEEP_NOW:
-		snd_pmac_suspend(chip);
+		snd_pmac_suspend(chip->card, 0);
 		break;
 	case PBOOK_WAKE:
-		snd_pmac_resume(chip);
+		snd_pmac_resume(chip->card, 0);
 		break;
 	}
 	return PBOOK_SLEEP_OK;
@@ -1280,45 +1276,18 @@
 static int __init snd_pmac_register_sleep_notifier(pmac_t *chip)
 {
 	/* should be protected here.. */
-	if (sleeping_pmac) {
-		snd_printd("sleep notifier already reigistered\n");
-		return -EBUSY;
-	}
+	snd_assert(! sleeping_pmac, return -EBUSY);
 	sleeping_pmac = chip;
 	pmu_register_sleep_notifier(&snd_pmac_sleep_notifier);
-	chip->sleep_registered = 1;
 	return 0;
 }
 						    
 static int snd_pmac_unregister_sleep_notifier(pmac_t *chip)
 {
-	if (! chip->sleep_registered)
-		return 0;
 	/* should be protected here.. */
-	if (sleeping_pmac != chip)
-		return -ENODEV;
+	snd_assert(sleeping_pmac == chip, return -ENODEV);
 	pmu_unregister_sleep_notifier(&snd_pmac_sleep_notifier);
 	sleeping_pmac = NULL;
-	return 0;
-}
-
-/* callback */
-static int snd_pmac_set_power_state(snd_card_t *card, unsigned int power_state)
-{
-	pmac_t *chip = snd_magic_cast(pmac_t, card->power_state_private_data, return -ENXIO);
-	switch (power_state) {
-	case SNDRV_CTL_POWER_D0:
-	case SNDRV_CTL_POWER_D1:
-	case SNDRV_CTL_POWER_D2:
-		snd_pmac_resume(chip);
-		break;
-	case SNDRV_CTL_POWER_D3hot:
-	case SNDRV_CTL_POWER_D3cold:
-		snd_pmac_suspend(chip);
-		break;
-	default:
-		return -EINVAL;
-	}
 	return 0;
 }
 
diff -Nru a/sound/ppc/pmac.h b/sound/ppc/pmac.h
--- a/sound/ppc/pmac.h	2004-05-26 15:01:36 -07:00
+++ b/sound/ppc/pmac.h	2004-05-26 15:01:36 -07:00
@@ -162,7 +162,6 @@
 	void (*update_automute)(pmac_t *chip, int do_notify);
 	int (*detect_headphone)(pmac_t *chip);
 #ifdef CONFIG_PMAC_PBOOK
-	unsigned int sleep_registered : 1;
 	void (*suspend)(pmac_t *chip);
 	void (*resume)(pmac_t *chip);
 #endif
@@ -180,6 +179,7 @@
 int snd_pmac_burgundy_init(pmac_t *chip);
 int snd_pmac_daca_init(pmac_t *chip);
 int snd_pmac_tumbler_init(pmac_t *chip);
+int snd_pmac_tumbler_post_init(void);
 
 /* i2c functions */
 typedef struct snd_pmac_keywest {
diff -Nru a/sound/ppc/powermac.c b/sound/ppc/powermac.c
--- a/sound/ppc/powermac.c	2004-05-26 15:01:36 -07:00
+++ b/sound/ppc/powermac.c	2004-05-26 15:01:36 -07:00
@@ -20,8 +20,8 @@
 
 #include <sound/driver.h>
 #include <linux/init.h>
+#include <linux/moduleparam.h>
 #include <sound/core.h>
-#define SNDRV_GET_ID
 #include <sound/initval.h>
 #include "pmac.h"
 #include "awacs.h"
@@ -41,17 +41,17 @@
 static int enable_beep = 1;
 #endif
 
-MODULE_PARM(index, "i");
+module_param(index, int, 0444);
 MODULE_PARM_DESC(index, "Index value for " CHIP_NAME " soundchip.");
 MODULE_PARM_SYNTAX(index, SNDRV_INDEX_DESC);
-MODULE_PARM(id, "s");
+module_param(id, charp, 0444);
 MODULE_PARM_DESC(id, "ID string for " CHIP_NAME " soundchip.");
 MODULE_PARM_SYNTAX(id, SNDRV_ID_DESC);
-/* MODULE_PARM(enable, "i");
+/* module_param(enable, bool, 0444);
    MODULE_PARM_DESC(enable, "Enable this soundchip.");
    MODULE_PARM_SYNTAX(enable, SNDRV_ENABLE_DESC); */
 #ifdef PMAC_SUPPORT_PCM_BEEP
-MODULE_PARM(enable_beep, "i");
+module_param(enable_beep, bool, 0444);
 MODULE_PARM_DESC(enable_beep, "Enable beep using PCM.");
 MODULE_PARM_SYNTAX(enable_beep, SNDRV_ENABLED "," SNDRV_BOOLEAN_TRUE_DESC);
 #endif
@@ -104,7 +104,7 @@
 		sprintf(card->shortname, "PowerMac %s", name_ext);
 		sprintf(card->longname, "%s (Dev %d) Sub-frame %d",
 			card->shortname, chip->device_id, chip->subframe);
-		if ((err = snd_pmac_tumbler_init(chip)) < 0)
+		if ( snd_pmac_tumbler_init(chip) < 0 || snd_pmac_tumbler_post_init() < 0)
 			goto __error;
 		break;
 	case PMAC_AWACS:
@@ -175,26 +175,3 @@
 
 module_init(alsa_card_pmac_init)
 module_exit(alsa_card_pmac_exit)
-
-#ifndef MODULE
-
-/* format is: snd-pmac=enable,index,id,enable_beep
- */
-
-static int __init alsa_card_pmac_setup(char *str)
-{
-	int __attribute__ ((__unused__)) enable = 1;
-
-	(void)(get_option(&str,&enable) == 2 &&
-	       get_option(&str,&index) == 2 &&
-	       get_id(&str,&id) == 2
-#ifdef PMAC_SUPPORT_PCM_BEEP
-	       && get_option(&str,&enable_beep) == 2
-#endif
-	       );
-	return 1;
-}
-
-__setup("snd-pmac=", alsa_card_pmac_setup);
-
-#endif /* ifndef MODULE */
diff -Nru a/sound/ppc/tumbler.c b/sound/ppc/tumbler.c
--- a/sound/ppc/tumbler.c	2004-05-26 15:01:35 -07:00
+++ b/sound/ppc/tumbler.c	2004-05-26 15:01:35 -07:00
@@ -684,6 +684,8 @@
 
 static int snapper_set_capture_source(pmac_tumbler_t *mix)
 {
+	if (! mix->i2c.client)
+		return -ENODEV;
 	return snd_pmac_keywest_write_byte(&mix->i2c, TAS_REG_ACS,
 					   mix->capture_source ? 2 : 0);
 }
@@ -870,7 +872,7 @@
 /* interrupt - headphone plug changed */
 static irqreturn_t headphone_intr(int irq, void *devid, struct pt_regs *regs)
 {
-	pmac_t *chip = snd_magic_cast(pmac_t, devid, return);
+	pmac_t *chip = snd_magic_cast(pmac_t, devid, return IRQ_NONE);
 	if (chip->update_automute && chip->initialized) {
 		chip->update_automute(chip, 1);
 		return IRQ_HANDLED;
diff -Nru a/sound/sparc/amd7930.c b/sound/sparc/amd7930.c
--- a/sound/sparc/amd7930.c	2004-05-26 15:01:35 -07:00
+++ b/sound/sparc/amd7930.c	2004-05-26 15:01:35 -07:00
@@ -34,13 +34,13 @@
 #include <linux/slab.h>
 #include <linux/init.h>
 #include <linux/interrupt.h>
+#include <linux/moduleparam.h>
 
 #include <sound/driver.h>
 #include <sound/core.h>
 #include <sound/pcm.h>
 #include <sound/info.h>
 #include <sound/control.h>
-#define SNDRV_GET_ID
 #include <sound/initval.h>
 
 #include <asm/io.h>
@@ -50,14 +50,15 @@
 static int index[SNDRV_CARDS] = SNDRV_DEFAULT_IDX;	/* Index 0-MAX */
 static char *id[SNDRV_CARDS] = SNDRV_DEFAULT_STR;	/* ID for this card */
 static int enable[SNDRV_CARDS] = SNDRV_DEFAULT_ENABLE_PNP;	/* Enable this card */
+static int boot_devs;
 
-MODULE_PARM(index, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+module_param_array(index, int, boot_devs, 0444);
 MODULE_PARM_DESC(index, "Index value for Sun AMD7930 soundcard.");
 MODULE_PARM_SYNTAX(index, SNDRV_INDEX_DESC);
-MODULE_PARM(id, "1-" __MODULE_STRING(SNDRV_CARDS) "s");
+module_param_array(id, charp, boot_devs, 0444);
 MODULE_PARM_DESC(id, "ID string for Sun AMD7930 soundcard.");
 MODULE_PARM_SYNTAX(id, SNDRV_ID_DESC);
-MODULE_PARM(enable, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+module_param_array(enable, bool, boot_devs, 0444);
 MODULE_PARM_DESC(enable, "Enable Sun AMD7930 soundcard.");
 MODULE_PARM_SYNTAX(enable, SNDRV_ENABLE_DESC);
 MODULE_AUTHOR("Thomas K. Dyas and David S. Miller");
@@ -1152,24 +1153,3 @@
 
 module_init(amd7930_init);
 module_exit(amd7930_exit);
-
-#ifndef MODULE
-
-/* format is: snd-sun-amd7930=index,id,enable */
-
-static int __init alsa_card_sun_amd7930_setup(char *str)
-{
-	static unsigned __initdata nr_dev = 0;
-
-	if (nr_dev >= SNDRV_CARDS)
-		return 0;
-	(void)(get_option(&str,&index[nr_dev]) == 2 &&
-	       get_option(&str,&id[nr_dev]) == 2 &&
-	       get_id(&str,&enable[nr_dev]) == 2);
-	nr_dev++;
-	return 1;
-}
-
-__setup("snd-sun-amd7930=", alsa_card_sun_amd7930_setup);
-
-#endif /* ifndef MODULE */
diff -Nru a/sound/sparc/cs4231.c b/sound/sparc/cs4231.c
--- a/sound/sparc/cs4231.c	2004-05-26 15:01:35 -07:00
+++ b/sound/sparc/cs4231.c	2004-05-26 15:01:35 -07:00
@@ -15,6 +15,7 @@
 #include <linux/delay.h>
 #include <linux/init.h>
 #include <linux/interrupt.h>
+#include <linux/moduleparam.h>
 
 #include <sound/driver.h>
 #include <sound/core.h>
@@ -22,7 +23,6 @@
 #include <sound/info.h>
 #include <sound/control.h>
 #include <sound/timer.h>
-#define SNDRV_GET_ID
 #include <sound/initval.h>
 #include <sound/pcm_params.h>
 
@@ -49,14 +49,15 @@
 static int index[SNDRV_CARDS] = SNDRV_DEFAULT_IDX;	/* Index 0-MAX */
 static char *id[SNDRV_CARDS] = SNDRV_DEFAULT_STR;	/* ID for this card */
 static int enable[SNDRV_CARDS] = SNDRV_DEFAULT_ENABLE_PNP;	/* Enable this card */
+static int boot_devs;
 
-MODULE_PARM(index, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+module_param_array(index, int, boot_devs, 0444);
 MODULE_PARM_DESC(index, "Index value for Sun CS4231 soundcard.");
 MODULE_PARM_SYNTAX(index, SNDRV_INDEX_DESC);
-MODULE_PARM(id, "1-" __MODULE_STRING(SNDRV_CARDS) "s");
+module_param_array(id, charp, boot_devs, 0444);
 MODULE_PARM_DESC(id, "ID string for Sun CS4231 soundcard.");
 MODULE_PARM_SYNTAX(id, SNDRV_ID_DESC);
-MODULE_PARM(enable, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+module_param_array(enable, bool, boot_devs, 0444);
 MODULE_PARM_DESC(enable, "Enable Sun CS4231 soundcard.");
 MODULE_PARM_SYNTAX(enable, SNDRV_ENABLE_DESC);
 MODULE_AUTHOR("Jaroslav Kysela, Derrick J. Brashear and David S. Miller");
@@ -2251,24 +2252,3 @@
 
 module_init(cs4231_init);
 module_exit(cs4231_exit);
-
-#ifndef MODULE
-
-/* format is: snd-sun-cs4231=index,id,enable */
-
-static int __init alsa_card_sun_cs4231_setup(char *str)
-{
-	static unsigned __initdata nr_dev = 0;
-
-	if (nr_dev >= SNDRV_CARDS)
-		return 0;
-	(void)(get_option(&str,&index[nr_dev]) == 2 &&
-	       get_option(&str,&id[nr_dev]) == 2 &&
-	       get_id(&str,&enable[nr_dev]) == 2);
-	nr_dev++;
-	return 1;
-}
-
-__setup("snd-sun-cs4231=", alsa_card_sun_cs4231_setup);
-
-#endif /* ifndef MODULE */
diff -Nru a/sound/usb/usbaudio.c b/sound/usb/usbaudio.c
--- a/sound/usb/usbaudio.c	2004-05-26 15:01:36 -07:00
+++ b/sound/usb/usbaudio.c	2004-05-26 15:01:36 -07:00
@@ -45,11 +45,11 @@
 #include <linux/slab.h>
 #include <linux/string.h>
 #include <linux/usb.h>
+#include <linux/moduleparam.h>
 #include <sound/core.h>
 #include <sound/info.h>
 #include <sound/pcm.h>
 #include <sound/pcm_params.h>
-#define SNDRV_GET_ID
 #include <sound/initval.h>
 
 #include "usbaudio.h"
@@ -69,26 +69,27 @@
 static int pid[SNDRV_CARDS] = { [0 ... (SNDRV_CARDS-1)] = -1 }; /* Product ID for this card */
 static int nrpacks = 4;		/* max. number of packets per urb */
 static int async_unlink = 1;
+static int boot_devs;
 
-MODULE_PARM(index, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+module_param_array(index, int, boot_devs, 0444);
 MODULE_PARM_DESC(index, "Index value for the USB audio adapter.");
 MODULE_PARM_SYNTAX(index, SNDRV_INDEX_DESC);
-MODULE_PARM(id, "1-" __MODULE_STRING(SNDRV_CARDS) "s");
+module_param_array(id, charp, boot_devs, 0444);
 MODULE_PARM_DESC(id, "ID string for the USB audio adapter.");
 MODULE_PARM_SYNTAX(id, SNDRV_ID_DESC);
-MODULE_PARM(enable, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+module_param_array(enable, bool, boot_devs, 0444);
 MODULE_PARM_DESC(enable, "Enable USB audio adapter.");
 MODULE_PARM_SYNTAX(enable, SNDRV_ENABLE_DESC);
-MODULE_PARM(vid, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+module_param_array(vid, int, boot_devs, 0444);
 MODULE_PARM_DESC(vid, "Vendor ID for the USB audio device.");
 MODULE_PARM_SYNTAX(vid, SNDRV_ENABLED ",allows:{{-1,0xffff}},base:16");
-MODULE_PARM(pid, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+module_param_array(pid, int, boot_devs, 0444);
 MODULE_PARM_DESC(pid, "Product ID for the USB audio device.");
 MODULE_PARM_SYNTAX(pid, SNDRV_ENABLED ",allows:{{-1,0xffff}},base:16");
-MODULE_PARM(nrpacks, "i");
+module_param(nrpacks, int, 0444);
 MODULE_PARM_DESC(nrpacks, "Max. number of packets per URB.");
 MODULE_PARM_SYNTAX(nrpacks, SNDRV_ENABLED ",allows:{{1,10}}");
-MODULE_PARM(async_unlink, "i");
+module_param(async_unlink, bool, 0444);
 MODULE_PARM_DESC(async_unlink, "Use async unlink mode.");
 MODULE_PARM_SYNTAX(async_unlink, SNDRV_BOOLEAN_TRUE_DESC);
 
@@ -1146,7 +1147,7 @@
 	/* if endpoint has pitch control, enable it */
 	if (fmt->attributes & EP_CS_ATTR_PITCH_CONTROL) {
 		data[0] = 1;
-		if ((err = usb_control_msg(dev, usb_sndctrlpipe(dev, 0), SET_CUR,
+		if ((err = snd_usb_ctl_msg(dev, usb_sndctrlpipe(dev, 0), SET_CUR,
 					   USB_TYPE_CLASS|USB_RECIP_ENDPOINT|USB_DIR_OUT, 
 					   PITCH_CONTROL << 8, ep, data, 1, HZ)) < 0) {
 			snd_printk(KERN_ERR "%d:%d:%d: cannot set enable PITCH\n",
@@ -1172,14 +1173,14 @@
 		data[0] = rate;
 		data[1] = rate >> 8;
 		data[2] = rate >> 16;
-		if ((err = usb_control_msg(dev, usb_sndctrlpipe(dev, 0), SET_CUR,
+		if ((err = snd_usb_ctl_msg(dev, usb_sndctrlpipe(dev, 0), SET_CUR,
 					   USB_TYPE_CLASS|USB_RECIP_ENDPOINT|USB_DIR_OUT, 
 					   SAMPLING_FREQ_CONTROL << 8, ep, data, 3, HZ)) < 0) {
 			snd_printk(KERN_ERR "%d:%d:%d: cannot set freq %d to ep 0x%x\n",
 				   dev->devnum, iface, fmt->altsetting, rate, ep);
 			return err;
 		}
-		if ((err = usb_control_msg(dev, usb_rcvctrlpipe(dev, 0), GET_CUR,
+		if ((err = snd_usb_ctl_msg(dev, usb_rcvctrlpipe(dev, 0), GET_CUR,
 					   USB_TYPE_CLASS|USB_RECIP_ENDPOINT|USB_DIR_IN,
 					   SAMPLING_FREQ_CONTROL << 8, ep, data, 3, HZ)) < 0) {
 			snd_printk(KERN_ERR "%d:%d:%d: cannot get freq at ep 0x%x\n",
@@ -1231,7 +1232,7 @@
 				   dev->devnum, fmt->iface, fmt->altsetting);
 			return -EIO;
 		}
-		snd_printdd(KERN_INFO "setting usb interface %d:%d\n", fmt->iface, fmt->altset_idx);
+		snd_printdd(KERN_INFO "setting usb interface %d:%d\n", fmt->iface, fmt->altsetting);
 		subs->interface = fmt->iface;
 		subs->format = fmt->altset_idx;
 	}
@@ -1884,6 +1885,32 @@
 	return NULL;
 }
 
+/*
+ * Wrapper for usb_control_msg().
+ * Allocates a temp buffer to prevent dmaing from/to the stack.
+ */
+int snd_usb_ctl_msg(struct usb_device *dev, unsigned int pipe, __u8 request,
+		    __u8 requesttype, __u16 value, __u16 index, void *data,
+		    __u16 size, int timeout)
+{
+	int err;
+	void *buf = NULL;
+
+	if (size > 0) {
+		buf = kmalloc(size, GFP_KERNEL);
+		if (!buf)
+			return -ENOMEM;
+		memcpy(buf, data, size);
+	}
+	err = usb_control_msg(dev, pipe, request, requesttype,
+			      value, index, buf, size, timeout);
+	if (size > 0) {
+		memcpy(data, buf, size);
+		kfree(buf);
+	}
+	return err;
+}
+
 
 /*
  * entry point for linux usb interface
@@ -1926,7 +1953,7 @@
 		struct audioformat *fp;
 		fp = list_entry(p, struct audioformat, list);
 		snd_iprintf(buffer, "  Interface %d\n", fp->iface);
-		snd_iprintf(buffer, "    Altset %d\n", fp->altset_idx);
+		snd_iprintf(buffer, "    Altset %d\n", fp->altsetting);
 		snd_iprintf(buffer, "    Format: %s\n", snd_pcm_format_name(fp->format));
 		snd_iprintf(buffer, "    Channels: %d\n", fp->channels);
 		snd_iprintf(buffer, "    Endpoint: %d %s (%s)\n",
@@ -2640,6 +2667,7 @@
 	struct audioformat *fp;
 	struct usb_host_interface *alts;
 	int stream, err;
+	int *rate_table = NULL;
 
 	fp = kmalloc(sizeof(*fp), GFP_KERNEL);
 	if (! fp) {
@@ -2647,16 +2675,30 @@
 		return -ENOMEM;
 	}
 	memcpy(fp, quirk->data, sizeof(*fp));
+	if (fp->nr_rates > 0) {
+		rate_table = kmalloc(sizeof(int) * fp->nr_rates, GFP_KERNEL);
+		if (!rate_table) {
+			kfree(fp);
+			return -ENOMEM;
+		}
+		memcpy(rate_table, fp->rate_table, sizeof(int) * fp->nr_rates);
+		fp->rate_table = rate_table;
+	}
+
 	stream = (fp->endpoint & USB_DIR_IN)
 		? SNDRV_PCM_STREAM_CAPTURE : SNDRV_PCM_STREAM_PLAYBACK;
 	err = add_audio_endpoint(chip, stream, fp);
 	if (err < 0) {
 		kfree(fp);
+		if (rate_table)
+			kfree(rate_table);
 		return err;
 	}
 	if (fp->iface != get_iface_desc(&iface->altsetting[0])->bInterfaceNumber ||
 	    fp->altset_idx >= iface->num_altsetting) {
 		kfree(fp);
+		if (rate_table)
+			kfree(rate_table);
 		return -EINVAL;
 	}
 	alts = &iface->altsetting[fp->altset_idx];
@@ -2700,6 +2742,83 @@
 	return 0;
 }
 
+/*
+ * Create a stream for an Edirol UA-700 interface.  The only way
+ * to detect the sample rate is by looking at wMaxPacketSize.
+ */
+static int create_ua700_quirk(snd_usb_audio_t *chip, struct usb_interface *iface)
+{
+	static const struct audioformat ua700_format = {
+		.format = SNDRV_PCM_FORMAT_S24_3LE,
+		.channels = 2,
+		.fmt_type = USB_FORMAT_TYPE_I,
+		.altsetting = 1,
+		.altset_idx = 1,
+		.rates = SNDRV_PCM_RATE_CONTINUOUS,
+	};
+	struct usb_host_interface *alts;
+	struct usb_interface_descriptor *altsd;
+	struct audioformat *fp;
+	int stream, err;
+
+	/* both PCM and MIDI interfaces have 2 altsettings */
+	if (iface->num_altsetting != 2)
+		return -ENXIO;
+	alts = &iface->altsetting[1];
+	altsd = get_iface_desc(alts);
+
+	if (altsd->bNumEndpoints == 2) {
+		static const snd_usb_midi_endpoint_info_t ep = {
+			.out_cables = 0x0003,
+			.in_cables  = 0x0003
+		};
+		static const snd_usb_audio_quirk_t quirk = {
+			.type = QUIRK_MIDI_FIXED_ENDPOINT,
+			.data = &ep
+		};
+		return snd_usb_create_midi_interface(chip, iface, &quirk);
+	}
+
+	if (altsd->bNumEndpoints != 1)
+		return -ENXIO;
+
+	fp = kmalloc(sizeof(*fp), GFP_KERNEL);
+	if (!fp)
+		return -ENOMEM;
+	memcpy(fp, &ua700_format, sizeof(*fp));
+
+	fp->iface = altsd->bInterfaceNumber;
+	fp->endpoint = get_endpoint(alts, 0)->bEndpointAddress;
+	fp->ep_attr = get_endpoint(alts, 0)->bmAttributes;
+	fp->maxpacksize = get_endpoint(alts, 0)->wMaxPacketSize;
+
+	switch (fp->maxpacksize) {
+	case 0x120:
+		fp->rate_max = fp->rate_min = 44100;
+		break;
+	case 0x138:
+		fp->rate_max = fp->rate_min = 48000;
+		break;
+	case 0x258:
+		fp->rate_max = fp->rate_min = 96000;
+		break;
+	default:
+		snd_printk(KERN_ERR "unknown sample rate\n");
+		kfree(fp);
+		return -ENXIO;
+	}
+
+	stream = (fp->endpoint & USB_DIR_IN)
+		? SNDRV_PCM_STREAM_CAPTURE : SNDRV_PCM_STREAM_PLAYBACK;
+	err = add_audio_endpoint(chip, stream, fp);
+	if (err < 0) {
+		kfree(fp);
+		return err;
+	}
+	usb_set_interface(chip->dev, fp->iface, 0);
+	return 0;
+}
+
 static int snd_usb_create_quirk(snd_usb_audio_t *chip,
 				struct usb_interface *iface,
 				const snd_usb_audio_quirk_t *quirk);
@@ -2747,7 +2866,7 @@
 	    get_cfg_desc(config)->wTotalLength == EXTIGY_FIRMWARE_SIZE_NEW) {
 		snd_printdd("sending Extigy boot sequence...\n");
 		/* Send message to force it to reconnect with full interface. */
-		err = usb_control_msg(dev, usb_sndctrlpipe(dev,0),
+		err = snd_usb_ctl_msg(dev, usb_sndctrlpipe(dev,0),
 				      0x10, 0x43, 0x0001, 0x000a, NULL, 0, HZ);
 		if (err < 0) snd_printdd("error sending boot message: %d\n", err);
 		err = usb_get_descriptor(dev, USB_DT_DEVICE, 0,
@@ -2787,6 +2906,8 @@
 	case QUIRK_AUDIO_STANDARD_INTERFACE:
 	case QUIRK_MIDI_STANDARD_INTERFACE:
 		return create_standard_interface_quirk(chip, iface, quirk);
+	case QUIRK_AUDIO_EDIROL_UA700:
+		return create_ua700_quirk(chip, iface);
 	default:
 		snd_printd(KERN_ERR "invalid quirk type %d\n", quirk->type);
 		return -ENXIO;
@@ -3124,26 +3245,3 @@
 
 module_init(snd_usb_audio_init);
 module_exit(snd_usb_audio_cleanup);
-
-#ifndef MODULE
-/*
- * format is snd-usb-audio=enable,index,id,vid,pid
- */
-static int __init snd_usb_audio_module_setup(char* str)
-{
-	static unsigned __initdata nr_dev = 0;
-
-	if (nr_dev >= SNDRV_CARDS)
-		return 0;
-	(void)(get_option(&str, &enable[nr_dev]) == 2 &&
-	       get_option(&str, &index[nr_dev]) == 2 &&
-	       get_id(&str, &id[nr_dev]) == 2 &&
-	       get_option(&str, &vid[nr_dev]) == 2 &&
-	       get_option(&str, &pid[nr_dev]) == 2);
-	++nr_dev;
-	return 1;
-}
-
-__setup("snd-usb-audio=", snd_usb_audio_module_setup);
-
-#endif /* !MODULE */
diff -Nru a/sound/usb/usbaudio.h b/sound/usb/usbaudio.h
--- a/sound/usb/usbaudio.h	2004-05-26 15:01:36 -07:00
+++ b/sound/usb/usbaudio.h	2004-05-26 15:01:36 -07:00
@@ -154,6 +154,7 @@
 #define QUIRK_AUDIO_FIXED_ENDPOINT	4
 #define QUIRK_AUDIO_STANDARD_INTERFACE	5
 #define QUIRK_MIDI_STANDARD_INTERFACE	6
+#define QUIRK_AUDIO_EDIROL_UA700	7
 
 typedef struct snd_usb_audio_quirk snd_usb_audio_quirk_t;
 typedef struct snd_usb_midi_endpoint_info snd_usb_midi_endpoint_info_t;
@@ -185,6 +186,8 @@
 
 /* for QUIRK_AUDIO/MIDI_STANDARD_INTERFACE, data is NULL */
 
+/* for QUIRK_AUDIO_EDIROL_UA700, data is NULL */
+
 /*
  */
 
@@ -196,6 +199,8 @@
 
 void *snd_usb_find_desc(void *descstart, int desclen, void *after, u8 dtype);
 void *snd_usb_find_csint_desc(void *descstart, int desclen, void *after, u8 dsubtype);
+
+int snd_usb_ctl_msg(struct usb_device *dev, unsigned int pipe, __u8 request, __u8 requesttype, __u16 value, __u16 index, void *data, __u16 size, int timeout);
 
 int snd_usb_create_mixer(snd_usb_audio_t *chip, int ctrlif);
 
diff -Nru a/sound/usb/usbmixer.c b/sound/usb/usbmixer.c
--- a/sound/usb/usbmixer.c	2004-05-26 15:01:35 -07:00
+++ b/sound/usb/usbmixer.c	2004-05-26 15:01:35 -07:00
@@ -301,7 +301,7 @@
 	int timeout = 10;
  
 	while (timeout-- > 0) {
-		if (usb_control_msg(cval->chip->dev, usb_rcvctrlpipe(cval->chip->dev, 0),
+		if (snd_usb_ctl_msg(cval->chip->dev, usb_rcvctrlpipe(cval->chip->dev, 0),
 				    request,
 				    USB_RECIP_INTERFACE | USB_TYPE_CLASS | USB_DIR_IN,
 				    validx, cval->ctrlif | (cval->id << 8),
@@ -339,7 +339,7 @@
 	buf[0] = value_set & 0xff;
 	buf[1] = (value_set >> 8) & 0xff;
 	while (timeout -- > 0)
-		if (usb_control_msg(cval->chip->dev, usb_sndctrlpipe(cval->chip->dev, 0),
+		if (snd_usb_ctl_msg(cval->chip->dev, usb_sndctrlpipe(cval->chip->dev, 0),
 				    request,
 				    USB_RECIP_INTERFACE | USB_TYPE_CLASS | USB_DIR_OUT,
 				    validx, cval->ctrlif | (cval->id << 8),
diff -Nru a/sound/usb/usbquirks.h b/sound/usb/usbquirks.h
--- a/sound/usb/usbquirks.h	2004-05-26 15:01:35 -07:00
+++ b/sound/usb/usbquirks.h	2004-05-26 15:01:35 -07:00
@@ -113,7 +113,7 @@
 		.product_name = "UA-100",
 		.ifnum = QUIRK_ANY_INTERFACE,
 		.type = QUIRK_COMPOSITE,
-		.data = & (const snd_usb_audio_quirk_t[]) {
+		.data = (const snd_usb_audio_quirk_t[]) {
 			{
 				.ifnum = 0,
 				.type = QUIRK_AUDIO_FIXED_ENDPOINT,
@@ -274,7 +274,7 @@
 		.product_name = "SC-D70",
 		.ifnum = QUIRK_ANY_INTERFACE,
 		.type = QUIRK_COMPOSITE,
-		.data = & (const snd_usb_audio_quirk_t[]) {
+		.data = (const snd_usb_audio_quirk_t[]) {
 			{
 				.ifnum = 0,
 				.type = QUIRK_AUDIO_FIXED_ENDPOINT,
@@ -338,7 +338,7 @@
 		.product_name = "UA-5",
 		.ifnum = QUIRK_ANY_INTERFACE,
 		.type = QUIRK_COMPOSITE,
-		.data = & (const snd_usb_audio_quirk_t[]) {
+		.data = (const snd_usb_audio_quirk_t[]) {
 			{
 				.ifnum = 1,
 				.type = QUIRK_AUDIO_STANDARD_INTERFACE
@@ -443,7 +443,7 @@
 		.product_name = "UA-20",
 		.ifnum = QUIRK_ANY_INTERFACE,
 		.type = QUIRK_COMPOSITE,
-		.data = & (const snd_usb_audio_quirk_t[]) {
+		.data = (const snd_usb_audio_quirk_t[]) {
 			{
 				.ifnum = 1,
 				.type = QUIRK_AUDIO_STANDARD_INTERFACE
@@ -488,16 +488,34 @@
 		}
 	}
 },
-{
+{	/*
+	 * This quirk is for the "Advanced" modes of the Edirol UA-700.
+	 * If the sample format switch is not in an advanced setting, the
+	 * UA-700 has ID 0x0582/0x002c and is standard compliant (no quirks),
+	 * but offers only 16-bit PCM and no MIDI.
+	 */
 	USB_DEVICE_VENDOR_SPEC(0x0582, 0x002b),
 	.driver_info = (unsigned long) & (const snd_usb_audio_quirk_t) {
 		.vendor_name = "EDIROL",
 		.product_name = "UA-700",
-		.ifnum = 3,
-		.type = QUIRK_MIDI_FIXED_ENDPOINT,
-		.data = & (const snd_usb_midi_endpoint_info_t) {
-			.out_cables = 0x0003,
-			.in_cables  = 0x0003
+		.ifnum = QUIRK_ANY_INTERFACE,
+		.type = QUIRK_COMPOSITE,
+		.data = (const snd_usb_audio_quirk_t[]) {
+			{
+				.ifnum = 1,
+				.type = QUIRK_AUDIO_EDIROL_UA700
+			},
+			{
+				.ifnum = 2,
+				.type = QUIRK_AUDIO_EDIROL_UA700
+			},
+			{
+				.ifnum = 3,
+				.type = QUIRK_AUDIO_EDIROL_UA700
+			},
+			{
+				.ifnum = -1
+			}
 		}
 	}
 },
@@ -580,6 +598,62 @@
 	}
 },
 {
+	USB_DEVICE(0x0582, 0x0044),
+	.driver_info = (unsigned long) & (const snd_usb_audio_quirk_t) {
+		.vendor_name = "Roland",
+		.product_name = "UA-1000",
+		.ifnum = QUIRK_ANY_INTERFACE,
+		.type = QUIRK_COMPOSITE,
+		.data = (const snd_usb_audio_quirk_t[]) {
+			{
+				.ifnum = 1,
+				.type = QUIRK_AUDIO_FIXED_ENDPOINT,
+				.data = & (const struct audioformat) {
+					.format = SNDRV_PCM_FORMAT_S24,
+					.channels = 12,
+					.iface = 1,
+					.altsetting = 1,
+					.altset_idx = 1,
+					.attributes = 0,
+					.endpoint = 0x81,
+					.ep_attr = 0x01,
+					.rates = SNDRV_PCM_RATE_CONTINUOUS,
+					.rate_min = 48000,
+					.rate_max = 48000,
+				}
+			},
+			{
+				.ifnum = 2,
+				.type = QUIRK_AUDIO_FIXED_ENDPOINT,
+				.data = & (const struct audioformat) {
+					.format = SNDRV_PCM_FORMAT_S24,
+					.channels = 10,
+					.iface = 2,
+					.altsetting = 1,
+					.altset_idx = 1,
+					.attributes = 0,
+					.endpoint = 0x02,
+					.ep_attr = 0x01,
+					.rates = SNDRV_PCM_RATE_CONTINUOUS,
+					.rate_min = 48000,
+					.rate_max = 48000,
+				}
+			},
+			{
+				.ifnum = 3,
+				.type = QUIRK_MIDI_FIXED_ENDPOINT,
+				.data = & (const snd_usb_midi_endpoint_info_t) {
+					.out_cables = 0x0003,
+					.in_cables  = 0x0003
+				}
+			},
+			{
+				.ifnum = -1
+			}
+		}
+	}
+},
+{
 	USB_DEVICE(0x0582, 0x0048),
 	.driver_info = (unsigned long) & (const snd_usb_audio_quirk_t) {
 		.vendor_name = "EDIROL",
@@ -629,7 +703,7 @@
 		.product_name = "UA-3FX",
 		.ifnum = QUIRK_ANY_INTERFACE,
 		.type = QUIRK_COMPOSITE,
-		.data = & (const snd_usb_audio_quirk_t[]) {
+		.data = (const snd_usb_audio_quirk_t[]) {
 			{
 				.ifnum = 1,
 				.type = QUIRK_AUDIO_STANDARD_INTERFACE