You can import this changeset into BK by piping this whole message to:
'| bk receive [path to repository]' or apply the patch as usual.

===================================================================


ChangeSet@1.645, 2002-10-01 08:42:11+02:00, perex@suse.cz
  ALSA update 2002/08/12 :
    - removed __NO_VERSION__
    - CS46xx
      - SDPIF input support, only 48khz
      - PCM multichannel bug fix
    - EMU10K1
      - Added workaround for EMU10K1 capture (wrong pointer)
    - Keywest (PPC)
      - fixed the initialization of driver


 include/sound/cs46xx.h                |   14 
 include/sound/cs46xx_dsp_spos.h       |   20 +
 include/sound/emu10k1.h               |    3 
 include/sound/version.h               |    2 
 sound/core/control.c                  |    1 
 sound/core/device.c                   |    1 
 sound/core/info.c                     |    1 
 sound/core/info_oss.c                 |    1 
 sound/core/init.c                     |    1 
 sound/core/ioctl32/hwdep32.c          |    1 
 sound/core/ioctl32/ioctl32.c          |    1 
 sound/core/ioctl32/pcm32.c            |    1 
 sound/core/ioctl32/rawmidi32.c        |    1 
 sound/core/ioctl32/seq32.c            |    1 
 sound/core/ioctl32/timer32.c          |    1 
 sound/core/isadma.c                   |    1 
 sound/core/memory.c                   |    1 
 sound/core/misc.c                     |    1 
 sound/core/oss/copy.c                 |    1 
 sound/core/oss/io.c                   |    1 
 sound/core/oss/linear.c               |    1 
 sound/core/oss/mulaw.c                |    1 
 sound/core/oss/pcm_plugin.c           |    1 
 sound/core/oss/rate.c                 |    1 
 sound/core/oss/route.c                |    1 
 sound/core/pcm_lib.c                  |    1 
 sound/core/pcm_memory.c               |    1 
 sound/core/pcm_misc.c                 |    1 
 sound/core/pcm_native.c               |    1 
 sound/core/pcm_sgbuf.c                |    1 
 sound/core/pcm_timer.c                |    1 
 sound/core/seq/oss/seq_oss_event.c    |    1 
 sound/core/seq/oss/seq_oss_init.c     |    1 
 sound/core/seq/oss/seq_oss_ioctl.c    |    1 
 sound/core/seq/oss/seq_oss_midi.c     |    1 
 sound/core/seq/oss/seq_oss_readq.c    |    1 
 sound/core/seq/oss/seq_oss_rw.c       |    1 
 sound/core/seq/oss/seq_oss_synth.c    |    1 
 sound/core/seq/oss/seq_oss_timer.c    |    1 
 sound/core/seq/oss/seq_oss_writeq.c   |    1 
 sound/core/seq/seq_clientmgr.c        |    1 
 sound/core/seq/seq_fifo.c             |    1 
 sound/core/seq/seq_info.c             |    1 
 sound/core/seq/seq_lock.c             |    1 
 sound/core/seq/seq_memory.c           |    1 
 sound/core/seq/seq_ports.c            |    1 
 sound/core/seq/seq_prioq.c            |    1 
 sound/core/seq/seq_queue.c            |    1 
 sound/core/seq/seq_system.c           |    1 
 sound/core/seq/seq_timer.c            |    1 
 sound/core/sound_oss.c                |    1 
 sound/core/wrappers.c                 |    1 
 sound/drivers/opl3/opl3_drums.c       |    1 
 sound/drivers/opl3/opl3_midi.c        |    1 
 sound/drivers/opl3/opl3_oss.c         |    1 
 sound/drivers/opl3/opl3_synth.c       |    1 
 sound/isa/gus/gus_dma.c               |    1 
 sound/isa/gus/gus_dram.c              |    1 
 sound/isa/gus/gus_instr.c             |    1 
 sound/isa/gus/gus_io.c                |    1 
 sound/isa/gus/gus_irq.c               |    1 
 sound/isa/gus/gus_lfo.c               |    1 
 sound/isa/gus/gus_mem.c               |    1 
 sound/isa/gus/gus_mem_proc.c          |    1 
 sound/isa/gus/gus_mixer.c             |    1 
 sound/isa/gus/gus_pcm.c               |    1 
 sound/isa/gus/gus_reset.c             |    1 
 sound/isa/gus/gus_sample.c            |    1 
 sound/isa/gus/gus_simple.c            |    1 
 sound/isa/gus/gus_timer.c             |    1 
 sound/isa/gus/gus_uart.c              |    1 
 sound/isa/gus/gus_volume.c            |    1 
 sound/isa/sb/emu8000.c                |    1 
 sound/isa/sb/emu8000_callback.c       |    1 
 sound/isa/sb/emu8000_patch.c          |    1 
 sound/isa/sb/sb8_midi.c               |    1 
 sound/isa/sb/sb_mixer.c               |    1 
 sound/isa/wavefront/wavefront_fx.c    |    1 
 sound/isa/wavefront/wavefront_midi.c  |    1 
 sound/isa/wavefront/wavefront_synth.c |    1 
 sound/pci/cs46xx/cs46xx_lib.c         |  575 +++++++++++++++++++++++++++-------
 sound/pci/cs46xx/cs46xx_lib.h         |    6 
 sound/pci/cs46xx/dsp_spos.c           |  237 ++++++++------
 sound/pci/cs46xx/dsp_spos.h           |   83 +++-
 sound/pci/cs46xx/dsp_spos_scb_lib.c   |  138 +++++---
 sound/pci/emu10k1/emu10k1_callback.c  |    1 
 sound/pci/emu10k1/emu10k1_main.c      |    1 
 sound/pci/emu10k1/emu10k1_patch.c     |    1 
 sound/pci/emu10k1/emufx.c             |    1 
 sound/pci/emu10k1/emumixer.c          |    1 
 sound/pci/emu10k1/emumpu401.c         |    1 
 sound/pci/emu10k1/emupcm.c            |    7 
 sound/pci/emu10k1/emuproc.c           |    1 
 sound/pci/emu10k1/io.c                |    1 
 sound/pci/emu10k1/irq.c               |    1 
 sound/pci/emu10k1/memory.c            |    1 
 sound/pci/emu10k1/voice.c             |    1 
 sound/pci/trident/trident_main.c      |    1 
 sound/pci/trident/trident_memory.c    |    1 
 sound/pci/ymfpci/ymfpci_main.c        |    1 
 sound/ppc/awacs.c                     |    1 
 sound/ppc/burgundy.c                  |    1 
 sound/ppc/daca.c                      |    1 
 sound/ppc/keywest.c                   |    6 
 sound/ppc/pmac.c                      |    1 
 sound/ppc/tumbler.c                   |    1 
 sound/synth/emux/emux_effect.c        |    1 
 sound/synth/emux/emux_nrpn.c          |    1 
 sound/synth/emux/emux_oss.c           |    1 
 sound/synth/emux/emux_proc.c          |    1 
 sound/synth/emux/emux_seq.c           |    1 
 sound/synth/emux/emux_synth.c         |    1 
 sound/synth/emux/soundfont.c          |    1 
 113 files changed, 802 insertions(+), 391 deletions(-)


diff -Nru a/include/sound/cs46xx.h b/include/sound/cs46xx.h
--- a/include/sound/cs46xx.h	Tue Oct  1 17:06:00 2002
+++ b/include/sound/cs46xx.h	Tue Oct  1 17:06:00 2002
@@ -1710,9 +1710,12 @@
 #define CS46XX_SECONDARY_CODEC_OFFSET		0x80
 #define CS46XX_DSP_CAPTURE_CHANNEL          1
 
-/*
- *
- */
+/* capture */
+#define CS46XX_DSP_CAPTURE_CHANNEL          1
+
+/* mixer */
+#define CS46XX_MIXER_SPDIF_INPUT_ELEMENT    1
+#define CS46XX_MIXER_SPDIF_OUTPUT_ELEMENT   2
 
 typedef struct _snd_cs46xx cs46xx_t;
 
@@ -1809,8 +1812,11 @@
 #ifdef CONFIG_PM
 	struct pm_dev *pm_dev;
 #endif
-
+#ifdef CONFIG_SND_CS46XX_DEBUG_GPIO
+  int current_gpio;
+#endif
 #ifdef CONFIG_SND_CS46XX_NEW_DSP
+  	void (*mixer_init)(cs46xx_t *);
 	dsp_spos_instance_t * dsp_spos_instance;
 #else /* for compatibility */
 	cs46xx_pcm_t *playback_pcm;
diff -Nru a/include/sound/cs46xx_dsp_spos.h b/include/sound/cs46xx_dsp_spos.h
--- a/include/sound/cs46xx_dsp_spos.h	Tue Oct  1 17:06:00 2002
+++ b/include/sound/cs46xx_dsp_spos.h	Tue Oct  1 17:06:00 2002
@@ -177,6 +177,26 @@
 	/* SPDIF status */
 	int spdif_status_out;
 	int spdif_status_in;
+
+	/* SPDIF input sample rate converter */
+	dsp_scb_descriptor_t * spdif_in_src;
+	/* SPDIF input asynch. receiver */
+	dsp_scb_descriptor_t * asynch_rx_scb;
+
+	/* Capture record mixer SCB */
+	dsp_scb_descriptor_t * record_mixer_scb;
+    
+	/* CODEC input SCB */
+	dsp_scb_descriptor_t * codec_in_scb;
+
+	/* reference snooper */
+	dsp_scb_descriptor_t * ref_snoop_scb;
+
+	/* record sources */
+	dsp_scb_descriptor_t * pcm_input;
+	dsp_scb_descriptor_t * adc_input;
+
+	int spdif_in_sample_rate;
 } dsp_spos_instance_t;
 
 #endif /* __DSP_SPOS_H__ */
diff -Nru a/include/sound/emu10k1.h b/include/sound/emu10k1.h
--- a/include/sound/emu10k1.h	Tue Oct  1 17:06:00 2002
+++ b/include/sound/emu10k1.h	Tue Oct  1 17:06:00 2002
@@ -795,7 +795,8 @@
 	snd_pcm_substream_t *substream;
 	emu10k1_voice_t *voices[2];
 	emu10k1_voice_t *extra;
-	int running;
+	unsigned short running;
+	unsigned short first_ptr;
 	snd_util_memblk_t *memblk;
 	unsigned int start_addr;
 	unsigned int ccca_start_addr;
diff -Nru a/include/sound/version.h b/include/sound/version.h
--- a/include/sound/version.h	Tue Oct  1 17:06:00 2002
+++ b/include/sound/version.h	Tue Oct  1 17:06:00 2002
@@ -1,3 +1,3 @@
 /* include/version.h.  Generated automatically by configure.  */
 #define CONFIG_SND_VERSION "0.9.0rc2"
-#define CONFIG_SND_DATE " (Fri Aug 09 11:49:03 2002 UTC)"
+#define CONFIG_SND_DATE " (Mon Aug 12 16:33:34 2002 UTC)"
diff -Nru a/sound/core/control.c b/sound/core/control.c
--- a/sound/core/control.c	Tue Oct  1 17:06:00 2002
+++ b/sound/core/control.c	Tue Oct  1 17:06:00 2002
@@ -19,7 +19,6 @@
  *
  */
 
-#define __NO_VERSION__
 #include <sound/driver.h>
 #include <linux/threads.h>
 #include <linux/interrupt.h>
diff -Nru a/sound/core/device.c b/sound/core/device.c
--- a/sound/core/device.c	Tue Oct  1 17:06:00 2002
+++ b/sound/core/device.c	Tue Oct  1 17:06:00 2002
@@ -19,7 +19,6 @@
  *
  */
 
-#define __NO_VERSION__
 #include <sound/driver.h>
 #include <linux/slab.h>
 #include <linux/time.h>
diff -Nru a/sound/core/info.c b/sound/core/info.c
--- a/sound/core/info.c	Tue Oct  1 17:06:00 2002
+++ b/sound/core/info.c	Tue Oct  1 17:06:00 2002
@@ -19,7 +19,6 @@
  *
  */
 
-#define __NO_VERSION__
 #include <sound/driver.h>
 #include <linux/init.h>
 #include <linux/vmalloc.h>
diff -Nru a/sound/core/info_oss.c b/sound/core/info_oss.c
--- a/sound/core/info_oss.c	Tue Oct  1 17:06:00 2002
+++ b/sound/core/info_oss.c	Tue Oct  1 17:06:00 2002
@@ -19,7 +19,6 @@
  *
  */
 
-#define __NO_VERSION__
 #include <sound/driver.h>
 #include <linux/slab.h>
 #include <linux/time.h>
diff -Nru a/sound/core/init.c b/sound/core/init.c
--- a/sound/core/init.c	Tue Oct  1 17:06:00 2002
+++ b/sound/core/init.c	Tue Oct  1 17:06:00 2002
@@ -19,7 +19,6 @@
  *
  */
 
-#define __NO_VERSION__
 #include <sound/driver.h>
 #include <linux/init.h>
 #include <linux/slab.h>
diff -Nru a/sound/core/ioctl32/hwdep32.c b/sound/core/ioctl32/hwdep32.c
--- a/sound/core/ioctl32/hwdep32.c	Tue Oct  1 17:06:00 2002
+++ b/sound/core/ioctl32/hwdep32.c	Tue Oct  1 17:06:00 2002
@@ -18,7 +18,6 @@
  *
  */
 
-#define __NO_VERSION__
 #include <sound/driver.h>
 #include <linux/time.h>
 #include <sound/core.h>
diff -Nru a/sound/core/ioctl32/ioctl32.c b/sound/core/ioctl32/ioctl32.c
--- a/sound/core/ioctl32/ioctl32.c	Tue Oct  1 17:06:00 2002
+++ b/sound/core/ioctl32/ioctl32.c	Tue Oct  1 17:06:00 2002
@@ -18,7 +18,6 @@
  *
  */
 
-#define __NO_VERSION__
 #include <sound/driver.h>
 #include <linux/sched.h>
 #include <linux/smp_lock.h>
diff -Nru a/sound/core/ioctl32/pcm32.c b/sound/core/ioctl32/pcm32.c
--- a/sound/core/ioctl32/pcm32.c	Tue Oct  1 17:06:00 2002
+++ b/sound/core/ioctl32/pcm32.c	Tue Oct  1 17:06:00 2002
@@ -18,7 +18,6 @@
  *
  */
 
-#define __NO_VERSION__
 #include <sound/driver.h>
 #include <linux/time.h>
 #include <sound/core.h>
diff -Nru a/sound/core/ioctl32/rawmidi32.c b/sound/core/ioctl32/rawmidi32.c
--- a/sound/core/ioctl32/rawmidi32.c	Tue Oct  1 17:06:00 2002
+++ b/sound/core/ioctl32/rawmidi32.c	Tue Oct  1 17:06:00 2002
@@ -18,7 +18,6 @@
  *
  */
 
-#define __NO_VERSION__
 #include <sound/driver.h>
 #include <linux/time.h>
 #include <sound/core.h>
diff -Nru a/sound/core/ioctl32/seq32.c b/sound/core/ioctl32/seq32.c
--- a/sound/core/ioctl32/seq32.c	Tue Oct  1 17:06:01 2002
+++ b/sound/core/ioctl32/seq32.c	Tue Oct  1 17:06:01 2002
@@ -18,7 +18,6 @@
  *
  */
 
-#define __NO_VERSION__
 #include <sound/driver.h>
 #include <linux/time.h>
 #include <sound/core.h>
diff -Nru a/sound/core/ioctl32/timer32.c b/sound/core/ioctl32/timer32.c
--- a/sound/core/ioctl32/timer32.c	Tue Oct  1 17:06:00 2002
+++ b/sound/core/ioctl32/timer32.c	Tue Oct  1 17:06:00 2002
@@ -18,7 +18,6 @@
  *
  */
 
-#define __NO_VERSION__
 #include <sound/driver.h>
 #include <linux/time.h>
 #include <sound/core.h>
diff -Nru a/sound/core/isadma.c b/sound/core/isadma.c
--- a/sound/core/isadma.c	Tue Oct  1 17:06:00 2002
+++ b/sound/core/isadma.c	Tue Oct  1 17:06:00 2002
@@ -26,7 +26,6 @@
 
 #undef HAVE_REALLY_SLOW_DMA_CONTROLLER
 
-#define __NO_VERSION__
 #include <sound/driver.h>
 #include <sound/core.h>
 #include <asm/dma.h>
diff -Nru a/sound/core/memory.c b/sound/core/memory.c
--- a/sound/core/memory.c	Tue Oct  1 17:06:00 2002
+++ b/sound/core/memory.c	Tue Oct  1 17:06:00 2002
@@ -19,7 +19,6 @@
  *
  */
 
-#define __NO_VERSION__
 #include <sound/driver.h>
 #include <asm/io.h>
 #include <asm/uaccess.h>
diff -Nru a/sound/core/misc.c b/sound/core/misc.c
--- a/sound/core/misc.c	Tue Oct  1 17:06:00 2002
+++ b/sound/core/misc.c	Tue Oct  1 17:06:00 2002
@@ -19,7 +19,6 @@
  *
  */
 
-#define __NO_VERSION__
 #include <sound/driver.h>
 #include <linux/init.h>
 #include <linux/sched.h>
diff -Nru a/sound/core/oss/copy.c b/sound/core/oss/copy.c
--- a/sound/core/oss/copy.c	Tue Oct  1 17:06:00 2002
+++ b/sound/core/oss/copy.c	Tue Oct  1 17:06:00 2002
@@ -19,7 +19,6 @@
  *
  */
 
-#define __NO_VERSION__
 #include <sound/driver.h>
 #include <linux/time.h>
 #include <sound/core.h>
diff -Nru a/sound/core/oss/io.c b/sound/core/oss/io.c
--- a/sound/core/oss/io.c	Tue Oct  1 17:06:00 2002
+++ b/sound/core/oss/io.c	Tue Oct  1 17:06:00 2002
@@ -19,7 +19,6 @@
  *
  */
   
-#define __NO_VERSION__
 #include <sound/driver.h>
 #include <linux/time.h>
 #include <sound/core.h>
diff -Nru a/sound/core/oss/linear.c b/sound/core/oss/linear.c
--- a/sound/core/oss/linear.c	Tue Oct  1 17:06:00 2002
+++ b/sound/core/oss/linear.c	Tue Oct  1 17:06:00 2002
@@ -20,7 +20,6 @@
  *
  */
 
-#define __NO_VERSION__
 #include <sound/driver.h>
 #include <linux/time.h>
 #include <sound/core.h>
diff -Nru a/sound/core/oss/mulaw.c b/sound/core/oss/mulaw.c
--- a/sound/core/oss/mulaw.c	Tue Oct  1 17:06:01 2002
+++ b/sound/core/oss/mulaw.c	Tue Oct  1 17:06:01 2002
@@ -21,7 +21,6 @@
  *
  */
   
-#define __NO_VERSION__
 #include <sound/driver.h>
 #include <linux/time.h>
 #include <sound/core.h>
diff -Nru a/sound/core/oss/pcm_plugin.c b/sound/core/oss/pcm_plugin.c
--- a/sound/core/oss/pcm_plugin.c	Tue Oct  1 17:06:00 2002
+++ b/sound/core/oss/pcm_plugin.c	Tue Oct  1 17:06:00 2002
@@ -24,7 +24,6 @@
 #define PLUGIN_DEBUG
 #endif
 
-#define __NO_VERSION__
 #include <sound/driver.h>
 #include <linux/slab.h>
 #include <linux/time.h>
diff -Nru a/sound/core/oss/rate.c b/sound/core/oss/rate.c
--- a/sound/core/oss/rate.c	Tue Oct  1 17:06:00 2002
+++ b/sound/core/oss/rate.c	Tue Oct  1 17:06:00 2002
@@ -19,7 +19,6 @@
  *
  */
   
-#define __NO_VERSION__
 #include <sound/driver.h>
 #include <linux/time.h>
 #include <sound/core.h>
diff -Nru a/sound/core/oss/route.c b/sound/core/oss/route.c
--- a/sound/core/oss/route.c	Tue Oct  1 17:06:01 2002
+++ b/sound/core/oss/route.c	Tue Oct  1 17:06:01 2002
@@ -19,7 +19,6 @@
  *
  */
 
-#define __NO_VERSION__
 #include <sound/driver.h>
 #include <linux/slab.h>
 #include <linux/time.h>
diff -Nru a/sound/core/pcm_lib.c b/sound/core/pcm_lib.c
--- a/sound/core/pcm_lib.c	Tue Oct  1 17:06:00 2002
+++ b/sound/core/pcm_lib.c	Tue Oct  1 17:06:00 2002
@@ -20,7 +20,6 @@
  *
  */
 
-#define __NO_VERSION__
 #include <sound/driver.h>
 #include <linux/slab.h>
 #include <linux/time.h>
diff -Nru a/sound/core/pcm_memory.c b/sound/core/pcm_memory.c
--- a/sound/core/pcm_memory.c	Tue Oct  1 17:06:01 2002
+++ b/sound/core/pcm_memory.c	Tue Oct  1 17:06:01 2002
@@ -19,7 +19,6 @@
  *
  */
 
-#define __NO_VERSION__
 #include <sound/driver.h>
 #include <asm/io.h>
 #include <linux/time.h>
diff -Nru a/sound/core/pcm_misc.c b/sound/core/pcm_misc.c
--- a/sound/core/pcm_misc.c	Tue Oct  1 17:06:01 2002
+++ b/sound/core/pcm_misc.c	Tue Oct  1 17:06:01 2002
@@ -19,7 +19,6 @@
  *
  */
   
-#define __NO_VERSION__
 #include <sound/driver.h>
 #include <linux/time.h>
 #include <sound/core.h>
diff -Nru a/sound/core/pcm_native.c b/sound/core/pcm_native.c
--- a/sound/core/pcm_native.c	Tue Oct  1 17:06:00 2002
+++ b/sound/core/pcm_native.c	Tue Oct  1 17:06:00 2002
@@ -19,7 +19,6 @@
  *
  */
 
-#define __NO_VERSION__
 #include <sound/driver.h>
 #include <linux/mm.h>
 #include <linux/file.h>
diff -Nru a/sound/core/pcm_sgbuf.c b/sound/core/pcm_sgbuf.c
--- a/sound/core/pcm_sgbuf.c	Tue Oct  1 17:06:01 2002
+++ b/sound/core/pcm_sgbuf.c	Tue Oct  1 17:06:01 2002
@@ -19,7 +19,6 @@
  *
  */
 
-#define __NO_VERSION__
 #include <sound/driver.h>
 #include <linux/slab.h>
 #include <sound/core.h>
diff -Nru a/sound/core/pcm_timer.c b/sound/core/pcm_timer.c
--- a/sound/core/pcm_timer.c	Tue Oct  1 17:06:01 2002
+++ b/sound/core/pcm_timer.c	Tue Oct  1 17:06:01 2002
@@ -19,7 +19,6 @@
  *
  */
 
-#define __NO_VERSION__
 #include <sound/driver.h>
 #include <linux/time.h>
 #include <sound/core.h>
diff -Nru a/sound/core/seq/oss/seq_oss_event.c b/sound/core/seq/oss/seq_oss_event.c
--- a/sound/core/seq/oss/seq_oss_event.c	Tue Oct  1 17:06:00 2002
+++ b/sound/core/seq/oss/seq_oss_event.c	Tue Oct  1 17:06:00 2002
@@ -18,7 +18,6 @@
  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
  */
 
-#define __NO_VERSION__
 #include "seq_oss_device.h"
 #include "seq_oss_synth.h"
 #include "seq_oss_midi.h"
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	Tue Oct  1 17:06:00 2002
+++ b/sound/core/seq/oss/seq_oss_init.c	Tue Oct  1 17:06:00 2002
@@ -20,7 +20,6 @@
  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
  */
 
-#define __NO_VERSION__
 #include "seq_oss_device.h"
 #include "seq_oss_synth.h"
 #include "seq_oss_midi.h"
diff -Nru a/sound/core/seq/oss/seq_oss_ioctl.c b/sound/core/seq/oss/seq_oss_ioctl.c
--- a/sound/core/seq/oss/seq_oss_ioctl.c	Tue Oct  1 17:06:00 2002
+++ b/sound/core/seq/oss/seq_oss_ioctl.c	Tue Oct  1 17:06:00 2002
@@ -20,7 +20,6 @@
  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
  */
 
-#define __NO_VERSION__
 #include "seq_oss_device.h"
 #include "seq_oss_readq.h"
 #include "seq_oss_writeq.h"
diff -Nru a/sound/core/seq/oss/seq_oss_midi.c b/sound/core/seq/oss/seq_oss_midi.c
--- a/sound/core/seq/oss/seq_oss_midi.c	Tue Oct  1 17:06:00 2002
+++ b/sound/core/seq/oss/seq_oss_midi.c	Tue Oct  1 17:06:00 2002
@@ -20,7 +20,6 @@
  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
  */
 
-#define __NO_VERSION__
 #include "seq_oss_midi.h"
 #include "seq_oss_readq.h"
 #include "seq_oss_timer.h"
diff -Nru a/sound/core/seq/oss/seq_oss_readq.c b/sound/core/seq/oss/seq_oss_readq.c
--- a/sound/core/seq/oss/seq_oss_readq.c	Tue Oct  1 17:06:00 2002
+++ b/sound/core/seq/oss/seq_oss_readq.c	Tue Oct  1 17:06:00 2002
@@ -20,7 +20,6 @@
  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
  */
 
-#define __NO_VERSION__
 #include "seq_oss_readq.h"
 #include "seq_oss_event.h"
 #include <sound/seq_oss_legacy.h>
diff -Nru a/sound/core/seq/oss/seq_oss_rw.c b/sound/core/seq/oss/seq_oss_rw.c
--- a/sound/core/seq/oss/seq_oss_rw.c	Tue Oct  1 17:06:00 2002
+++ b/sound/core/seq/oss/seq_oss_rw.c	Tue Oct  1 17:06:00 2002
@@ -20,7 +20,6 @@
  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
  */
 
-#define __NO_VERSION__
 #include "seq_oss_device.h"
 #include "seq_oss_readq.h"
 #include "seq_oss_writeq.h"
diff -Nru a/sound/core/seq/oss/seq_oss_synth.c b/sound/core/seq/oss/seq_oss_synth.c
--- a/sound/core/seq/oss/seq_oss_synth.c	Tue Oct  1 17:06:00 2002
+++ b/sound/core/seq/oss/seq_oss_synth.c	Tue Oct  1 17:06:00 2002
@@ -20,7 +20,6 @@
  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
  */
 
-#define __NO_VERSION__
 #include "seq_oss_synth.h"
 #include "seq_oss_midi.h"
 #include "../seq_lock.h"
diff -Nru a/sound/core/seq/oss/seq_oss_timer.c b/sound/core/seq/oss/seq_oss_timer.c
--- a/sound/core/seq/oss/seq_oss_timer.c	Tue Oct  1 17:06:00 2002
+++ b/sound/core/seq/oss/seq_oss_timer.c	Tue Oct  1 17:06:00 2002
@@ -20,7 +20,6 @@
  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
  */
 
-#define __NO_VERSION__
 #include "seq_oss_timer.h"
 #include "seq_oss_event.h"
 #include <sound/seq_oss_legacy.h>
diff -Nru a/sound/core/seq/oss/seq_oss_writeq.c b/sound/core/seq/oss/seq_oss_writeq.c
--- a/sound/core/seq/oss/seq_oss_writeq.c	Tue Oct  1 17:06:00 2002
+++ b/sound/core/seq/oss/seq_oss_writeq.c	Tue Oct  1 17:06:00 2002
@@ -20,7 +20,6 @@
  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
  */
 
-#define __NO_VERSION__
 #include "seq_oss_writeq.h"
 #include "seq_oss_event.h"
 #include "seq_oss_timer.h"
diff -Nru a/sound/core/seq/seq_clientmgr.c b/sound/core/seq/seq_clientmgr.c
--- a/sound/core/seq/seq_clientmgr.c	Tue Oct  1 17:06:00 2002
+++ b/sound/core/seq/seq_clientmgr.c	Tue Oct  1 17:06:00 2002
@@ -21,7 +21,6 @@
  *
  */
 
-#define __NO_VERSION__
 #include <sound/driver.h>
 #include <linux/init.h>
 #include <linux/slab.h>
diff -Nru a/sound/core/seq/seq_fifo.c b/sound/core/seq/seq_fifo.c
--- a/sound/core/seq/seq_fifo.c	Tue Oct  1 17:06:00 2002
+++ b/sound/core/seq/seq_fifo.c	Tue Oct  1 17:06:00 2002
@@ -19,7 +19,6 @@
  *
  */
 
-#define __NO_VERSION__
 #include <sound/driver.h>
 #include <sound/core.h>
 #include <linux/slab.h>
diff -Nru a/sound/core/seq/seq_info.c b/sound/core/seq/seq_info.c
--- a/sound/core/seq/seq_info.c	Tue Oct  1 17:06:00 2002
+++ b/sound/core/seq/seq_info.c	Tue Oct  1 17:06:00 2002
@@ -19,7 +19,6 @@
  *
  */
 
-#define __NO_VERSION__
 #include <sound/driver.h>
 #include <linux/init.h>
 #include <sound/core.h>
diff -Nru a/sound/core/seq/seq_lock.c b/sound/core/seq/seq_lock.c
--- a/sound/core/seq/seq_lock.c	Tue Oct  1 17:06:00 2002
+++ b/sound/core/seq/seq_lock.c	Tue Oct  1 17:06:00 2002
@@ -19,7 +19,6 @@
  *
  */
 
-#define __NO_VERSION__
 #include <sound/driver.h>
 #include <sound/core.h>
 #include "seq_lock.h"
diff -Nru a/sound/core/seq/seq_memory.c b/sound/core/seq/seq_memory.c
--- a/sound/core/seq/seq_memory.c	Tue Oct  1 17:06:00 2002
+++ b/sound/core/seq/seq_memory.c	Tue Oct  1 17:06:00 2002
@@ -20,7 +20,6 @@
  *
  */
 
-#define __NO_VERSION__
 #include <sound/driver.h>
 #include <linux/init.h>
 #include <linux/slab.h>
diff -Nru a/sound/core/seq/seq_ports.c b/sound/core/seq/seq_ports.c
--- a/sound/core/seq/seq_ports.c	Tue Oct  1 17:06:01 2002
+++ b/sound/core/seq/seq_ports.c	Tue Oct  1 17:06:01 2002
@@ -20,7 +20,6 @@
  *
  */
 
-#define __NO_VERSION__
 #include <sound/driver.h>
 #include <sound/core.h>
 #include <linux/slab.h>
diff -Nru a/sound/core/seq/seq_prioq.c b/sound/core/seq/seq_prioq.c
--- a/sound/core/seq/seq_prioq.c	Tue Oct  1 17:06:00 2002
+++ b/sound/core/seq/seq_prioq.c	Tue Oct  1 17:06:00 2002
@@ -19,7 +19,6 @@
  *
  */
 
-#define __NO_VERSION__
 #include <sound/driver.h>
 #include <linux/time.h>
 #include <linux/slab.h>
diff -Nru a/sound/core/seq/seq_queue.c b/sound/core/seq/seq_queue.c
--- a/sound/core/seq/seq_queue.c	Tue Oct  1 17:06:01 2002
+++ b/sound/core/seq/seq_queue.c	Tue Oct  1 17:06:01 2002
@@ -35,7 +35,6 @@
  *     - Addition of experimental sync support.
  */
 
-#define __NO_VERSION__
 #include <sound/driver.h>
 #include <linux/init.h>
 #include <linux/slab.h>
diff -Nru a/sound/core/seq/seq_system.c b/sound/core/seq/seq_system.c
--- a/sound/core/seq/seq_system.c	Tue Oct  1 17:06:00 2002
+++ b/sound/core/seq/seq_system.c	Tue Oct  1 17:06:00 2002
@@ -19,7 +19,6 @@
  *
  */
 
-#define __NO_VERSION__
 #include <sound/driver.h>
 #include <linux/init.h>
 #include <sound/core.h>
diff -Nru a/sound/core/seq/seq_timer.c b/sound/core/seq/seq_timer.c
--- a/sound/core/seq/seq_timer.c	Tue Oct  1 17:06:01 2002
+++ b/sound/core/seq/seq_timer.c	Tue Oct  1 17:06:01 2002
@@ -20,7 +20,6 @@
  *
  */
 
-#define __NO_VERSION__
 #include <sound/driver.h>
 #include <sound/core.h>
 #include <linux/slab.h>
diff -Nru a/sound/core/sound_oss.c b/sound/core/sound_oss.c
--- a/sound/core/sound_oss.c	Tue Oct  1 17:06:01 2002
+++ b/sound/core/sound_oss.c	Tue Oct  1 17:06:01 2002
@@ -19,7 +19,6 @@
  *
  */
 
-#define __NO_VERSION__
 #include <sound/driver.h>
 
 #ifdef CONFIG_SND_OSSEMUL
diff -Nru a/sound/core/wrappers.c b/sound/core/wrappers.c
--- a/sound/core/wrappers.c	Tue Oct  1 17:06:00 2002
+++ b/sound/core/wrappers.c	Tue Oct  1 17:06:00 2002
@@ -23,7 +23,6 @@
 #include "config.h"
 #endif
 
-#define __NO_VERSION__
 #include <linux/version.h>
 #include <linux/config.h>
 #ifdef ALSA_BUILD
diff -Nru a/sound/drivers/opl3/opl3_drums.c b/sound/drivers/opl3/opl3_drums.c
--- a/sound/drivers/opl3/opl3_drums.c	Tue Oct  1 17:06:00 2002
+++ b/sound/drivers/opl3/opl3_drums.c	Tue Oct  1 17:06:00 2002
@@ -19,7 +19,6 @@
  *
  */
 
-#define __NO_VERSION__
 #include "opl3_voice.h"
 
 extern char snd_opl3_regmap[MAX_OPL2_VOICES][4];
diff -Nru a/sound/drivers/opl3/opl3_midi.c b/sound/drivers/opl3/opl3_midi.c
--- a/sound/drivers/opl3/opl3_midi.c	Tue Oct  1 17:06:00 2002
+++ b/sound/drivers/opl3/opl3_midi.c	Tue Oct  1 17:06:00 2002
@@ -22,7 +22,6 @@
 #undef DEBUG_ALLOC
 #undef DEBUG_MIDI
 
-#define __NO_VERSION__
 #include "opl3_voice.h"
 #include <sound/asoundef.h>
 
diff -Nru a/sound/drivers/opl3/opl3_oss.c b/sound/drivers/opl3/opl3_oss.c
--- a/sound/drivers/opl3/opl3_oss.c	Tue Oct  1 17:06:00 2002
+++ b/sound/drivers/opl3/opl3_oss.c	Tue Oct  1 17:06:00 2002
@@ -18,7 +18,6 @@
  *   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
  */
 
-#define __NO_VERSION__
 #include "opl3_voice.h"
 #include <linux/slab.h>
 
diff -Nru a/sound/drivers/opl3/opl3_synth.c b/sound/drivers/opl3/opl3_synth.c
--- a/sound/drivers/opl3/opl3_synth.c	Tue Oct  1 17:06:00 2002
+++ b/sound/drivers/opl3/opl3_synth.c	Tue Oct  1 17:06:00 2002
@@ -19,7 +19,6 @@
  *
  */
 
-#define __NO_VERSION__
 #include <sound/opl3.h>
 #define __SND_OSS_COMPAT__
 #include <sound/asound_fm.h>
diff -Nru a/sound/isa/gus/gus_dma.c b/sound/isa/gus/gus_dma.c
--- a/sound/isa/gus/gus_dma.c	Tue Oct  1 17:06:00 2002
+++ b/sound/isa/gus/gus_dma.c	Tue Oct  1 17:06:00 2002
@@ -19,7 +19,6 @@
  *
  */
 
-#define __NO_VERSION__
 #include <sound/driver.h>
 #include <asm/dma.h>
 #include <linux/slab.h>
diff -Nru a/sound/isa/gus/gus_dram.c b/sound/isa/gus/gus_dram.c
--- a/sound/isa/gus/gus_dram.c	Tue Oct  1 17:06:00 2002
+++ b/sound/isa/gus/gus_dram.c	Tue Oct  1 17:06:00 2002
@@ -19,7 +19,6 @@
  *
  */
 
-#define __NO_VERSION__
 #include <sound/driver.h>
 #include <linux/time.h>
 #include <sound/core.h>
diff -Nru a/sound/isa/gus/gus_instr.c b/sound/isa/gus/gus_instr.c
--- a/sound/isa/gus/gus_instr.c	Tue Oct  1 17:06:01 2002
+++ b/sound/isa/gus/gus_instr.c	Tue Oct  1 17:06:01 2002
@@ -19,7 +19,6 @@
  *
  */
 
-#define __NO_VERSION__
 #include <sound/driver.h>
 #include <linux/time.h>
 #include <sound/core.h>
diff -Nru a/sound/isa/gus/gus_io.c b/sound/isa/gus/gus_io.c
--- a/sound/isa/gus/gus_io.c	Tue Oct  1 17:06:01 2002
+++ b/sound/isa/gus/gus_io.c	Tue Oct  1 17:06:01 2002
@@ -19,7 +19,6 @@
  *
  */
 
-#define __NO_VERSION__
 #include <sound/driver.h>
 #include <linux/delay.h>
 #include <linux/time.h>
diff -Nru a/sound/isa/gus/gus_irq.c b/sound/isa/gus/gus_irq.c
--- a/sound/isa/gus/gus_irq.c	Tue Oct  1 17:06:01 2002
+++ b/sound/isa/gus/gus_irq.c	Tue Oct  1 17:06:01 2002
@@ -19,7 +19,6 @@
  *
  */
 
-#define __NO_VERSION__
 #include <sound/driver.h>
 #include <sound/core.h>
 #include <sound/info.h>
diff -Nru a/sound/isa/gus/gus_lfo.c b/sound/isa/gus/gus_lfo.c
--- a/sound/isa/gus/gus_lfo.c	Tue Oct  1 17:06:00 2002
+++ b/sound/isa/gus/gus_lfo.c	Tue Oct  1 17:06:00 2002
@@ -20,7 +20,6 @@
  *
  */
 
-#define __NO_VERSION__
 #include <sound/driver.h>
 #include <sound/core.h>
 #include <sound/gus.h>
diff -Nru a/sound/isa/gus/gus_mem.c b/sound/isa/gus/gus_mem.c
--- a/sound/isa/gus/gus_mem.c	Tue Oct  1 17:06:00 2002
+++ b/sound/isa/gus/gus_mem.c	Tue Oct  1 17:06:00 2002
@@ -19,7 +19,6 @@
  *
  */
 
-#define __NO_VERSION__
 #include <sound/driver.h>
 #include <linux/slab.h>
 #include <sound/core.h>
diff -Nru a/sound/isa/gus/gus_mem_proc.c b/sound/isa/gus/gus_mem_proc.c
--- a/sound/isa/gus/gus_mem_proc.c	Tue Oct  1 17:06:01 2002
+++ b/sound/isa/gus/gus_mem_proc.c	Tue Oct  1 17:06:01 2002
@@ -19,7 +19,6 @@
  *
  */
 
-#define __NO_VERSION__
 #include <sound/driver.h>
 #include <linux/slab.h>
 #include <sound/core.h>
diff -Nru a/sound/isa/gus/gus_mixer.c b/sound/isa/gus/gus_mixer.c
--- a/sound/isa/gus/gus_mixer.c	Tue Oct  1 17:06:00 2002
+++ b/sound/isa/gus/gus_mixer.c	Tue Oct  1 17:06:00 2002
@@ -19,7 +19,6 @@
  *
  */
 
-#define __NO_VERSION__
 #include <sound/driver.h>
 #include <linux/time.h>
 #include <linux/wait.h>
diff -Nru a/sound/isa/gus/gus_pcm.c b/sound/isa/gus/gus_pcm.c
--- a/sound/isa/gus/gus_pcm.c	Tue Oct  1 17:06:00 2002
+++ b/sound/isa/gus/gus_pcm.c	Tue Oct  1 17:06:00 2002
@@ -25,7 +25,6 @@
  *
  */
 
-#define __NO_VERSION__
 #include <sound/driver.h>
 #include <asm/dma.h>
 #include <linux/slab.h>
diff -Nru a/sound/isa/gus/gus_reset.c b/sound/isa/gus/gus_reset.c
--- a/sound/isa/gus/gus_reset.c	Tue Oct  1 17:06:00 2002
+++ b/sound/isa/gus/gus_reset.c	Tue Oct  1 17:06:00 2002
@@ -18,7 +18,6 @@
  *
  */
 
-#define __NO_VERSION__
 #include <sound/driver.h>
 #include <linux/delay.h>
 #include <linux/interrupt.h>
diff -Nru a/sound/isa/gus/gus_sample.c b/sound/isa/gus/gus_sample.c
--- a/sound/isa/gus/gus_sample.c	Tue Oct  1 17:06:00 2002
+++ b/sound/isa/gus/gus_sample.c	Tue Oct  1 17:06:00 2002
@@ -19,7 +19,6 @@
  *
  */
 
-#define __NO_VERSION__
 #include <sound/driver.h>
 #include <linux/time.h>
 #include <sound/core.h>
diff -Nru a/sound/isa/gus/gus_simple.c b/sound/isa/gus/gus_simple.c
--- a/sound/isa/gus/gus_simple.c	Tue Oct  1 17:06:00 2002
+++ b/sound/isa/gus/gus_simple.c	Tue Oct  1 17:06:00 2002
@@ -19,7 +19,6 @@
  *
  */
 
-#define __NO_VERSION__
 #include <sound/driver.h>
 #include <linux/time.h>
 #include <sound/core.h>
diff -Nru a/sound/isa/gus/gus_timer.c b/sound/isa/gus/gus_timer.c
--- a/sound/isa/gus/gus_timer.c	Tue Oct  1 17:06:00 2002
+++ b/sound/isa/gus/gus_timer.c	Tue Oct  1 17:06:00 2002
@@ -21,7 +21,6 @@
  *
  */
 
-#define __NO_VERSION__
 #include <sound/driver.h>
 #include <linux/time.h>
 #include <sound/core.h>
diff -Nru a/sound/isa/gus/gus_uart.c b/sound/isa/gus/gus_uart.c
--- a/sound/isa/gus/gus_uart.c	Tue Oct  1 17:06:00 2002
+++ b/sound/isa/gus/gus_uart.c	Tue Oct  1 17:06:00 2002
@@ -19,7 +19,6 @@
  *
  */
 
-#define __NO_VERSION__
 #include <sound/driver.h>
 #include <linux/delay.h>
 #include <linux/interrupt.h>
diff -Nru a/sound/isa/gus/gus_volume.c b/sound/isa/gus/gus_volume.c
--- a/sound/isa/gus/gus_volume.c	Tue Oct  1 17:06:00 2002
+++ b/sound/isa/gus/gus_volume.c	Tue Oct  1 17:06:00 2002
@@ -18,7 +18,6 @@
  *
  */
 
-#define __NO_VERSION__
 #include <sound/driver.h>
 #include <linux/time.h>
 #include <sound/core.h>
diff -Nru a/sound/isa/sb/emu8000.c b/sound/isa/sb/emu8000.c
--- a/sound/isa/sb/emu8000.c	Tue Oct  1 17:06:00 2002
+++ b/sound/isa/sb/emu8000.c	Tue Oct  1 17:06:00 2002
@@ -20,7 +20,6 @@
  *   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
  */
 
-#define __NO_VERSION__
 #include <sound/driver.h>
 #include <linux/wait.h>
 #include <linux/sched.h>
diff -Nru a/sound/isa/sb/emu8000_callback.c b/sound/isa/sb/emu8000_callback.c
--- a/sound/isa/sb/emu8000_callback.c	Tue Oct  1 17:06:00 2002
+++ b/sound/isa/sb/emu8000_callback.c	Tue Oct  1 17:06:00 2002
@@ -19,7 +19,6 @@
  *   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
  */
 
-#define __NO_VERSION__
 #include "emu8000_local.h"
 #include <sound/asoundef.h>
 
diff -Nru a/sound/isa/sb/emu8000_patch.c b/sound/isa/sb/emu8000_patch.c
--- a/sound/isa/sb/emu8000_patch.c	Tue Oct  1 17:06:00 2002
+++ b/sound/isa/sb/emu8000_patch.c	Tue Oct  1 17:06:00 2002
@@ -19,7 +19,6 @@
  *   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
  */
 
-#define __NO_VERSION__
 #include "emu8000_local.h"
 #include <asm/uaccess.h>
 
diff -Nru a/sound/isa/sb/sb8_midi.c b/sound/isa/sb/sb8_midi.c
--- a/sound/isa/sb/sb8_midi.c	Tue Oct  1 17:06:00 2002
+++ b/sound/isa/sb/sb8_midi.c	Tue Oct  1 17:06:00 2002
@@ -23,7 +23,6 @@
  *   working.
  */
 
-#define __NO_VERSION__
 #include <sound/driver.h>
 #include <asm/io.h>
 #include <linux/time.h>
diff -Nru a/sound/isa/sb/sb_mixer.c b/sound/isa/sb/sb_mixer.c
--- a/sound/isa/sb/sb_mixer.c	Tue Oct  1 17:06:00 2002
+++ b/sound/isa/sb/sb_mixer.c	Tue Oct  1 17:06:00 2002
@@ -19,7 +19,6 @@
  *
  */
 
-#define __NO_VERSION__
 #include <sound/driver.h>
 #include <asm/io.h>
 #include <linux/delay.h>
diff -Nru a/sound/isa/wavefront/wavefront_fx.c b/sound/isa/wavefront/wavefront_fx.c
--- a/sound/isa/wavefront/wavefront_fx.c	Tue Oct  1 17:06:00 2002
+++ b/sound/isa/wavefront/wavefront_fx.c	Tue Oct  1 17:06:00 2002
@@ -16,7 +16,6 @@
  *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
  */
 
-#define __NO_VERSION__
 #include <sound/driver.h>
 #include <asm/io.h>
 #include <linux/init.h>
diff -Nru a/sound/isa/wavefront/wavefront_midi.c b/sound/isa/wavefront/wavefront_midi.c
--- a/sound/isa/wavefront/wavefront_midi.c	Tue Oct  1 17:06:01 2002
+++ b/sound/isa/wavefront/wavefront_midi.c	Tue Oct  1 17:06:01 2002
@@ -47,7 +47,6 @@
  *  
  */
 
-#define __NO_VERSION__
 #include <sound/driver.h>
 #include <asm/io.h>
 #include <linux/init.h>
diff -Nru a/sound/isa/wavefront/wavefront_synth.c b/sound/isa/wavefront/wavefront_synth.c
--- a/sound/isa/wavefront/wavefront_synth.c	Tue Oct  1 17:06:00 2002
+++ b/sound/isa/wavefront/wavefront_synth.c	Tue Oct  1 17:06:00 2002
@@ -20,7 +20,6 @@
  *
  */
 
-#define __NO_VERSION__
 #include <sound/driver.h>
 #include <asm/io.h>
 #include <linux/interrupt.h>
diff -Nru a/sound/pci/cs46xx/cs46xx_lib.c b/sound/pci/cs46xx/cs46xx_lib.c
--- a/sound/pci/cs46xx/cs46xx_lib.c	Tue Oct  1 17:06:00 2002
+++ b/sound/pci/cs46xx/cs46xx_lib.c	Tue Oct  1 17:06:00 2002
@@ -4,12 +4,18 @@
  *                   Cirrus Logic, Inc.
  *  Routines for control of Cirrus Logic CS461x chips
  *
- *  BUGS:
- *    --
+ *  KNOWN BUGS:
+ *    - Sometimes the SPDIF input DSP tasks get's unsynchronized
+ *      and the SPDIF get somewhat "distorcionated". To get around
+ *      this problem when it happens, mute and unmute the SPDIF input 
+ *      mixer controll.
+ *    - On the Hercules Game Theater XP the amplifier are sometimes turned
+ *      off on inadecuate moments which causes distorcions on sound.
  *
  *  TODO:
- *    SPDIF input.
- *    Secondary CODEC on some soundcards
+ *    - Secondary CODEC on some soundcards
+ *    - SPDIF input support for other sample rates then 48khz
+ *    - Independent PCM channels for rear output
  *
  *  NOTE: with CONFIG_SND_CS46XX_NEW_DSP unset uses old DSP image (which
  *        is default configuration), no SPDIF, no secondary codec, no
@@ -31,7 +37,6 @@
  *
  */
 
-#define __NO_VERSION__
 #include <sound/driver.h>
 #include <asm/io.h>
 #include <linux/delay.h>
@@ -47,6 +52,7 @@
 #include <linux/gameport.h>
 #endif
 #include "cs46xx_lib.h"
+#include "dsp_spos.h"
 
 static unsigned short snd_cs46xx_codec_read(cs46xx_t *chip,
 					    unsigned short reg,
@@ -292,7 +298,11 @@
 	 */
 	 
 	/* CD mute change ? */
-	
+
+	/* Benny: this hack dont seems to make any sense to me, at least on the Game Theater XP,
+	   Turning of the amplifier just make the PCM sound very distorcionated.
+	   is this really needed ????????????????
+	*/
 	if (reg == AC97_CD) {
 		/* Mute bit change ? */
 		if ((val2^val)&0x8000 || ((val2 == 0x1f1f || val == 0x1f1f) && val2 != val)) {
@@ -1510,14 +1520,25 @@
 			    (0xffff - ucontrol->value.integer.value[1]));
 	unsigned int old = snd_cs46xx_peek(chip, reg);
 	int change = (old != val);
-	if (change)
+	if (change) {
 		snd_cs46xx_poke(chip, reg, val);
+#ifndef CONFIG_SND_CS46XX_NEW_DSP
+		/* NOTE: this updates the current left and right volume
+		   that should be automatically updated by the DSP and
+		   not touched by the host. But for some strange reason
+		   the DSP only updates the right channel volume, so with
+		   this dirty hack we force updating the right and left
+		   channel volume. 
+		*/
+		snd_cs46xx_poke(chip, reg + 4, val);
+#endif
+	}
 	return change;
 }
 
 #ifdef CONFIG_SND_CS46XX_NEW_DSP
 
-static int snd_cs46xx_iec958_info(snd_kcontrol_t *kcontrol, 
+static int snd_mixer_boolean_info(snd_kcontrol_t *kcontrol, 
 				  snd_ctl_elem_info_t *uinfo)
 {
 	uinfo->type = SNDRV_CTL_ELEM_TYPE_BOOLEAN;
@@ -1531,7 +1552,12 @@
                                  snd_ctl_elem_value_t *ucontrol)
 {
 	cs46xx_t *chip = snd_kcontrol_chip(kcontrol);
-	ucontrol->value.integer.value[0] = chip->dsp_spos_instance->spdif_status_out;
+	int reg = kcontrol->private_value;
+
+	if (reg == CS46XX_MIXER_SPDIF_OUTPUT_ELEMENT)
+		ucontrol->value.integer.value[0] = chip->dsp_spos_instance->spdif_status_out;
+	else
+		ucontrol->value.integer.value[0] = chip->dsp_spos_instance->spdif_status_in;
 	return 0;
 }
 
@@ -1539,44 +1565,320 @@
                                   snd_ctl_elem_value_t *ucontrol)
 {
 	cs46xx_t *chip = snd_kcontrol_chip(kcontrol);
-	int change = chip->dsp_spos_instance->spdif_status_out;
+	int change, res;
+
+	switch (kcontrol->private_value) {
+	case CS46XX_MIXER_SPDIF_OUTPUT_ELEMENT:
+		change = chip->dsp_spos_instance->spdif_status_out;
+		if (ucontrol->value.integer.value[0] && !change) 
+			cs46xx_dsp_enable_spdif_out(chip);
+		else if (change && !ucontrol->value.integer.value[0])
+			cs46xx_dsp_disable_spdif_out(chip);
+
+		res = (change != chip->dsp_spos_instance->spdif_status_out);
+		break;
+	case CS46XX_MIXER_SPDIF_INPUT_ELEMENT:
+		change = chip->dsp_spos_instance->spdif_status_in;
+		if (ucontrol->value.integer.value[0] && !change) 
+			cs46xx_dsp_enable_spdif_in(chip);
+		else if (change && !ucontrol->value.integer.value[0])
+			cs46xx_dsp_disable_spdif_in(chip);
+		
+		res = (change != chip->dsp_spos_instance->spdif_status_in);
+		break;
+	default:
+		snd_assert(0, return -EINVAL);
+	}
+
+	return res;
+}
+
+static int snd_cs46xx_adc_capture_get(snd_kcontrol_t *kcontrol, 
+                                      snd_ctl_elem_value_t *ucontrol)
+{
+	cs46xx_t *chip = snd_kcontrol_chip(kcontrol);
+	dsp_spos_instance_t * ins = chip->dsp_spos_instance;
+
+	if (ins->adc_input != NULL) 
+		ucontrol->value.integer.value[0] = 1;
+	else 
+		ucontrol->value.integer.value[0] = 0;
+	
+	return 0;
+}
+
+static int snd_cs46xx_adc_capture_put(snd_kcontrol_t *kcontrol, 
+                                      snd_ctl_elem_value_t *ucontrol)
+{
+	cs46xx_t *chip = snd_kcontrol_chip(kcontrol);
+	dsp_spos_instance_t * ins = chip->dsp_spos_instance;
+	int change = 0;
 
-	if (ucontrol->value.integer.value[0] && !change) 
-		cs46xx_dsp_enable_spdif_out(chip);
-	else if (change)
-		cs46xx_dsp_disable_spdif_out(chip);
-	return (change != chip->dsp_spos_instance->spdif_status_out);
+	if (ucontrol->value.integer.value[0] && !ins->adc_input) {
+		cs46xx_dsp_enable_adc_capture(chip);
+		change = 1;
+	} else  if (!ucontrol->value.integer.value[0] && ins->adc_input) {
+		cs46xx_dsp_disable_adc_capture(chip);
+		change = 1;
+	}
+	return change;
+}
+
+static int snd_cs46xx_pcm_capture_get(snd_kcontrol_t *kcontrol, 
+                                      snd_ctl_elem_value_t *ucontrol)
+{
+	cs46xx_t *chip = snd_kcontrol_chip(kcontrol);
+	dsp_spos_instance_t * ins = chip->dsp_spos_instance;
+
+	if (ins->pcm_input != NULL) 
+		ucontrol->value.integer.value[0] = 1;
+	else 
+		ucontrol->value.integer.value[0] = 0;
+
+	return 0;
+}
+
+static int snd_cs46xx_pcm_capture_put(snd_kcontrol_t *kcontrol, 
+                                      snd_ctl_elem_value_t *ucontrol)
+{
+	cs46xx_t *chip = snd_kcontrol_chip(kcontrol);
+	dsp_spos_instance_t * ins = chip->dsp_spos_instance;
+	int change = 0;
+
+	if (ucontrol->value.integer.value[0] && !ins->pcm_input) {
+		cs46xx_dsp_enable_pcm_capture(chip);
+		change = 1;
+	} else  if (!ucontrol->value.integer.value[0] && ins->pcm_input) {
+		cs46xx_dsp_disable_pcm_capture(chip);
+		change = 1;
+	}
+
+	return change;
+}
+
+static int snd_herc_spdif_select_get(snd_kcontrol_t *kcontrol, 
+                                     snd_ctl_elem_value_t *ucontrol)
+{
+	cs46xx_t *chip = snd_kcontrol_chip(kcontrol);
+
+	int val1 = snd_cs46xx_peekBA0(chip, BA0_EGPIODR);
+
+	if (val1 & EGPIODR_GPOE0)
+		ucontrol->value.integer.value[0] = 1;
+	else
+		ucontrol->value.integer.value[0] = 0;
+
+	return 0;
+}
+
+/*
+ *	Game Theatre XP card - EGPIO[0] is used to select SDPIF input optical or coaxial.
+ */ 
+static int snd_herc_spdif_select_put(snd_kcontrol_t *kcontrol, 
+                                       snd_ctl_elem_value_t *ucontrol)
+{
+	cs46xx_t *chip = snd_kcontrol_chip(kcontrol);
+	int val1 = snd_cs46xx_peekBA0(chip, BA0_EGPIODR);
+	int val2 = snd_cs46xx_peekBA0(chip, BA0_EGPIOPTR);
+
+	if (ucontrol->value.integer.value[0]) {
+		/* optical is default */
+		snd_cs46xx_pokeBA0(chip, BA0_EGPIODR, 
+				   EGPIODR_GPOE0 | val1);  /* enable EGPIO0 output */
+		snd_cs46xx_pokeBA0(chip, BA0_EGPIOPTR, 
+				   EGPIOPTR_GPPT0 | val2); /* open-drain on output */
+	} else {
+		/* coaxial */
+		snd_cs46xx_pokeBA0(chip, BA0_EGPIODR,  val1 & ~EGPIODR_GPOE0); /* disable */
+		snd_cs46xx_pokeBA0(chip, BA0_EGPIOPTR, val2 & ~EGPIOPTR_GPPT0); /* disable */
+	}
+
+	/* checking diff from the EGPIO direction register 
+	   should be enough */
+	return (val1 != snd_cs46xx_peekBA0(chip, BA0_EGPIODR));
 }
 
 #endif /* CONFIG_SND_CS46XX_NEW_DSP */
 
+
+#ifdef CONFIG_SND_CS46XX_DEBUG_GPIO
+static int snd_cs46xx_egpio_select_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;
+	uinfo->value.integer.max = 8;
+	return 0;
+}
+
+static int snd_cs46xx_egpio_select_get(snd_kcontrol_t *kcontrol, 
+                                       snd_ctl_elem_value_t *ucontrol)
+{
+	cs46xx_t *chip = snd_kcontrol_chip(kcontrol);
+	ucontrol->value.integer.value[0] = chip->current_gpio;
+
+	return 0;
+}
+
+static int snd_cs46xx_egpio_select_put(snd_kcontrol_t *kcontrol, 
+                                       snd_ctl_elem_value_t *ucontrol)
+{
+	cs46xx_t *chip = snd_kcontrol_chip(kcontrol);
+	int change = (chip->current_gpio != ucontrol->value.integer.value[0]);
+	chip->current_gpio = ucontrol->value.integer.value[0];
+
+	return change;
+}
+
+
+static int snd_cs46xx_egpio_get(snd_kcontrol_t *kcontrol, 
+                                       snd_ctl_elem_value_t *ucontrol)
+{
+	cs46xx_t *chip = snd_kcontrol_chip(kcontrol);
+	int reg = kcontrol->private_value;
+
+	snd_printdd ("put: reg = %04x, gpio %02x\n",reg,chip->current_gpio);
+	ucontrol->value.integer.value[0] = 
+		(snd_cs46xx_peekBA0(chip, reg) & (1 << chip->current_gpio)) ? 1 : 0;
+  
+	return 0;
+}
+
+static int snd_cs46xx_egpio_put(snd_kcontrol_t *kcontrol, 
+                                       snd_ctl_elem_value_t *ucontrol)
+{
+	cs46xx_t *chip = snd_kcontrol_chip(kcontrol);
+	int reg = kcontrol->private_value;
+	int val = snd_cs46xx_peekBA0(chip, reg);
+	int oldval = val;
+	snd_printdd ("put: reg = %04x, gpio %02x\n",reg,chip->current_gpio);
+
+	if (ucontrol->value.integer.value[0])
+		val |= (1 << chip->current_gpio);
+	else
+		val &= ~(1 << chip->current_gpio);
+
+	snd_cs46xx_pokeBA0(chip, reg,val);
+	snd_printdd ("put: val %08x oldval %08x\n",val,oldval);
+
+	return (oldval != val);
+}
+#endif /* CONFIG_SND_CS46XX_DEBUG_GPIO */
+
 static snd_kcontrol_new_t snd_cs46xx_controls[] __devinitdata = {
 {
-	.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
-	.name = "DAC Volume",
-	.info = snd_cs46xx_vol_info,
-	.get = snd_cs46xx_vol_get,
-	.put = snd_cs46xx_vol_put,
-	.private_value = BA1_PVOL,
+	iface: SNDRV_CTL_ELEM_IFACE_MIXER,
+	name: "DAC Volume",
+	info: snd_cs46xx_vol_info,
+	get: snd_cs46xx_vol_get,
+	put: snd_cs46xx_vol_put,
+
+#ifndef CONFIG_SND_CS46XX_NEW_DSP
+	private_value: BA1_PVOL,
+#else
+	private_value: (MASTERMIX_SCB_ADDR + 0xE) << 2,
+#endif
 },
+
 {
-	.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
-	.name = "ADC Volume",
-	.info = snd_cs46xx_vol_info,
-	.get = snd_cs46xx_vol_get,
-	.put = snd_cs46xx_vol_put,
-	.private_value = BA1_CVOL,
+	iface: SNDRV_CTL_ELEM_IFACE_MIXER,
+	name: "ADC Volume",
+	info: snd_cs46xx_vol_info,
+	get: snd_cs46xx_vol_get,
+	put: snd_cs46xx_vol_put,
+#ifndef CONFIG_SND_CS46XX_NEW_DSP
+	private_value: BA1_CVOL,
+#else
+	private_value: (VARIDECIMATE_SCB_ADDR + 0xE) << 2,
+#endif
 },
 #ifdef CONFIG_SND_CS46XX_NEW_DSP
 {
-	.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
-	.name = "IEC 958 output",
-	.info = snd_cs46xx_iec958_info,
-	.get = snd_cs46xx_iec958_get,
-	.put = snd_cs46xx_iec958_put,
+	iface: SNDRV_CTL_ELEM_IFACE_MIXER,
+	name: "ADC Capture Switch",
+	info: snd_mixer_boolean_info,
+	get: snd_cs46xx_adc_capture_get,
+	put: snd_cs46xx_adc_capture_put
+},
+{
+	iface: SNDRV_CTL_ELEM_IFACE_MIXER,
+	name: "DAC Capture Switch",
+	info: snd_mixer_boolean_info,
+	get: snd_cs46xx_pcm_capture_get,
+	put: snd_cs46xx_pcm_capture_put
+},
+{
+	iface: SNDRV_CTL_ELEM_IFACE_MIXER,
+	name: "IEC 958 Output Switch",
+	info: snd_mixer_boolean_info,
+	get: snd_cs46xx_iec958_get,
+	put: snd_cs46xx_iec958_put,
+	private_value: CS46XX_MIXER_SPDIF_OUTPUT_ELEMENT,
+},
+{
+	iface: SNDRV_CTL_ELEM_IFACE_MIXER,
+	name: "IEC 958 Input Switch",
+	info: snd_mixer_boolean_info,
+	get: snd_cs46xx_iec958_get,
+	put: snd_cs46xx_iec958_put,
+    private_value: CS46XX_MIXER_SPDIF_INPUT_ELEMENT,
+},
+{
+	iface: SNDRV_CTL_ELEM_IFACE_MIXER,
+	name: "IEC 958 Input Volume",
+	info: snd_cs46xx_vol_info,
+	get: snd_cs46xx_vol_get,
+	put: snd_cs46xx_vol_put,
+	private_value: (ASYNCRX_SCB_ADDR + 0xE) << 2,
 },
 #endif
-	};
+#ifdef CONFIG_SND_CS46XX_DEBUG_GPIO
+{
+	iface: SNDRV_CTL_ELEM_IFACE_MIXER,
+	name: "EGPIO select",
+	info: snd_cs46xx_egpio_select_info,
+	get: snd_cs46xx_egpio_select_get,
+	put: snd_cs46xx_egpio_select_put,
+	private_value: 0,
+},
+{
+	iface: SNDRV_CTL_ELEM_IFACE_MIXER,
+	name: "EGPIO Input/Output",
+	info: snd_mixer_boolean_info,
+	get: snd_cs46xx_egpio_get,
+	put: snd_cs46xx_egpio_put,
+	private_value: BA0_EGPIODR,
+},
+{
+	iface: SNDRV_CTL_ELEM_IFACE_MIXER,
+	name: "EGPIO CMOS/Open drain",
+	info: snd_mixer_boolean_info,
+	get: snd_cs46xx_egpio_get,
+	put: snd_cs46xx_egpio_put,
+	private_value: BA0_EGPIOPTR,
+},
+{
+	iface: SNDRV_CTL_ELEM_IFACE_MIXER,
+	name: "EGPIO On/Off",
+	info: snd_mixer_boolean_info,
+	get: snd_cs46xx_egpio_get,
+	put: snd_cs46xx_egpio_put,
+	private_value: BA0_EGPIOSR,
+},
+#endif
+};
+
+/* Only available on the Hercules Game Theater XP soundcard */
+static snd_kcontrol_new_t snd_hercules_controls[] __devinitdata = {
+{
+	iface: SNDRV_CTL_ELEM_IFACE_MIXER,
+	name: "Optical/Coaxial SPDIF Input Switch",
+	info: snd_mixer_boolean_info,
+	get: snd_herc_spdif_select_get,
+	put: snd_herc_spdif_select_put,
+},
+};
 
 int __devinit snd_cs46xx_mixer(cs46xx_t *chip)
 {
@@ -1656,6 +1958,12 @@
     
 	/* add cs4630 mixer controls */
  _end:
+	/* dosoundcard specific mixer setup */
+	if (chip->mixer_init) {
+		snd_printdd ("calling chip->mixer_init(chip);\n");
+		chip->mixer_init(chip);
+	}
+    
 #endif /* CONFIG_SND_CS46XX_NEW_DSP */
 
 	for (idx = 0; idx < sizeof(snd_cs46xx_controls) / 
@@ -1671,7 +1979,7 @@
 	id.iface = SNDRV_CTL_ELEM_IFACE_MIXER;
 	strcpy(id.name, "External Amplifier Power Down");
 	chip->eapd_switch = snd_ctl_find_id(chip->card, &id);
-
+    
 	return 0;
 }
 
@@ -2434,7 +2742,10 @@
 #ifdef CONFIG_SND_CS46XX_NEW_DSP
 	/* mute spdif out */
 	cs46xx_dsp_disable_spdif_out(chip);
-	cs46xx_dsp_disable_spdif_in(chip);
+
+	/* mute spdif in */
+	cs46xx_poke_via_dsp (chip,SP_ASER_COUNTDOWN, 0x00000000);
+	cs46xx_poke_via_dsp (chip,SP_SPDIN_CONTROL, 0x000003ff);
 #endif
 
 	return 0;
@@ -2454,95 +2765,94 @@
 static int voyetra_setup_eapd_slot(cs46xx_t *chip)
 {
 	int i;
-    u32 idx;
-    u16 modem_power,pin_config,logic_type,valid_slots,status;
+	u32 idx;
+	u16 modem_power,pin_config,logic_type,valid_slots,status;
 
 	snd_printd ("cs46xx: cs46xx_setup_eapd_slot()+\n");
 	/*
-	* Clear PRA.  The Bonzo chip will be used for GPIO not for modem
-	* stuff.
-	*/
-	if(chip->nr_ac97_codecs != 2)
-	{
-      snd_printk (KERN_ERR "cs46xx: cs46xx_setup_eapd_slot() - no secondary codec configured\n");
-      return -EINVAL;
+	 * Clear PRA.  The Bonzo chip will be used for GPIO not for modem
+	 * stuff.
+	 */
+	if(chip->nr_ac97_codecs != 2) {
+		snd_printk (KERN_ERR "cs46xx: cs46xx_setup_eapd_slot() - no secondary codec configured\n");
+		return -EINVAL;
 	}
 
 	modem_power = snd_cs46xx_codec_read (chip, 
-                                         BA0_AC97_EXT_MODEM_POWER,
-                                         CS46XX_SECONDARY_CODEC_INDEX);
+					     BA0_AC97_EXT_MODEM_POWER,
+					     CS46XX_SECONDARY_CODEC_INDEX);
 	modem_power &=0xFEFF;
 
 	snd_cs46xx_codec_write(chip, 
-                           BA0_AC97_EXT_MODEM_POWER, modem_power,
-                           CS46XX_SECONDARY_CODEC_INDEX);
+			       BA0_AC97_EXT_MODEM_POWER, modem_power,
+			       CS46XX_SECONDARY_CODEC_INDEX);
 
-    /*
-     * Set GPIO pin's 7 and 8 so that they are configured for output.
-     */
+	/*
+	 * Set GPIO pin's 7 and 8 so that they are configured for output.
+	 */
 	pin_config = snd_cs46xx_codec_read (chip, 
-                                        BA0_AC97_GPIO_PIN_CONFIG,
-                                        CS46XX_SECONDARY_CODEC_INDEX);
+					    BA0_AC97_GPIO_PIN_CONFIG,
+					    CS46XX_SECONDARY_CODEC_INDEX);
 	pin_config &=0x27F;
 
 	snd_cs46xx_codec_write(chip, 
-                           BA0_AC97_GPIO_PIN_CONFIG, pin_config,
-                           CS46XX_SECONDARY_CODEC_INDEX);
+			       BA0_AC97_GPIO_PIN_CONFIG, pin_config,
+			       CS46XX_SECONDARY_CODEC_INDEX);
     
-    /*
-     * Set GPIO pin's 7 and 8 so that they are compatible with CMOS logic.
-     */
+	/*
+	 * Set GPIO pin's 7 and 8 so that they are compatible with CMOS logic.
+	 */
 
 	logic_type = snd_cs46xx_codec_read(chip, BA0_AC97_GPIO_PIN_TYPE,
-                                       CS46XX_SECONDARY_CODEC_INDEX);
+					   CS46XX_SECONDARY_CODEC_INDEX);
 	logic_type &=0x27F;
 	snd_cs46xx_codec_write (chip, BA0_AC97_GPIO_PIN_TYPE, logic_type,
-                            CS46XX_SECONDARY_CODEC_INDEX);
+				CS46XX_SECONDARY_CODEC_INDEX);
 
 	valid_slots = snd_cs46xx_peekBA0(chip, BA0_ACOSV);
 	valid_slots |= 0x200;
 	snd_cs46xx_pokeBA0(chip, BA0_ACOSV, valid_slots);
 
-    /*
-     * Fill slots 12 with the correct value for the GPIO pins. 
-     */
+	/*
+	 * Fill slots 12 with the correct value for the GPIO pins. 
+	 */
 	for(idx = 0x90; idx <= 0x9F; idx++) {
 
-      /*
-       * Initialize the fifo so that bits 7 and 8 are on.
-       *
-       * Remember that the GPIO pins in bonzo are shifted by 4 bits to
-       * the left.  0x1800 corresponds to bits 7 and 8.
-       */
-      snd_cs46xx_pokeBA0(chip, BA0_SERBWP, 0x1800);
+		/*
+		 * Initialize the fifo so that bits 7 and 8 are on.
+		 *
+		 * Remember that the GPIO pins in bonzo are shifted by 4 bits to
+		 * the left.  0x1800 corresponds to bits 7 and 8.
+		 */
+		snd_cs46xx_pokeBA0(chip, BA0_SERBWP, 0x1800);
       
-      /*
-       * Make sure the previous FIFO write operation has completed.
-       */
-      for(i = 0; i < 5; i++){
-        status = snd_cs46xx_peekBA0(chip, BA0_SERBST);
+		/*
+		 * Make sure the previous FIFO write operation has completed.
+		 */
+		for(i = 0; i < 5; i++){
+			status = snd_cs46xx_peekBA0(chip, BA0_SERBST);
 
-        if( !(status & SERBST_WBSY) ) {
-          break;
-        }
-        mdelay(100);
-      }
+			if( !(status & SERBST_WBSY) ) {
+				break;
+			}
+			mdelay(100);
+		}
 
-      if(status & SERBST_WBSY) {
-        snd_printk( KERN_ERR "cs46xx: cs46xx_setup_eapd_slot() " \
-                             "Failure to write the GPIO pins for slot 12.\n");
-         return -EINVAL;
-      }
+		if(status & SERBST_WBSY) {
+			snd_printk( KERN_ERR "cs46xx: cs46xx_setup_eapd_slot() " \
+				    "Failure to write the GPIO pins for slot 12.\n");
+			return -EINVAL;
+		}
       
-      /*
-       * Write the serial port FIFO index.
-       */
-      snd_cs46xx_pokeBA0(chip, BA0_SERBAD, idx);
+		/*
+		 * Write the serial port FIFO index.
+		 */
+		snd_cs46xx_pokeBA0(chip, BA0_SERBAD, idx);
       
-      /*
-       * Tell the serial port to load the new value into the FIFO location.
-       */
-      snd_cs46xx_pokeBA0(chip, BA0_SERBCM, SERBCM_WRC);
+		/*
+		 * Tell the serial port to load the new value into the FIFO location.
+		 */
+		snd_cs46xx_pokeBA0(chip, BA0_SERBCM, SERBCM_WRC);
 	}
 
 	return 0;
@@ -2581,33 +2891,64 @@
 	}
 
 #ifdef CONFIG_SND_CS46XX_NEW_DSP
-    if (chip->amplifier && !old) {
-      voyetra_setup_eapd_slot(chip);
-    }
+	if (chip->amplifier && !old) {
+		voyetra_setup_eapd_slot(chip);
+	}
 #endif
 }
 
 
+static void hercules_init(cs46xx_t *chip) 
+{
+	/* default: AMP off, and SPDIF input optical */
+	snd_cs46xx_pokeBA0(chip, BA0_EGPIODR, EGPIODR_GPOE0);
+	snd_cs46xx_pokeBA0(chip, BA0_EGPIOPTR, EGPIODR_GPOE0);
+}
+
 /*
  *	Game Theatre XP card - EGPIO[2] is used to enable the external amp.
- */
- 
+ */ 
 static void amp_hercules(cs46xx_t *chip, int change)
 {
 	int old = chip->amplifier;
+	int val1 = snd_cs46xx_peekBA0(chip, BA0_EGPIODR);
+	int val2 = snd_cs46xx_peekBA0(chip, BA0_EGPIOPTR);
 
 	chip->amplifier += change;
 	if (chip->amplifier && !old) {
+		snd_printdd ("Hercules amplifier ON\n");
 		snd_cs46xx_pokeBA0(chip, BA0_EGPIODR, 
-				   EGPIODR_GPOE2);     /* enable EGPIO2 output */
+				   EGPIODR_GPOE2 | val1);     /* enable EGPIO2 output */
 		snd_cs46xx_pokeBA0(chip, BA0_EGPIOPTR, 
-				   EGPIOPTR_GPPT2);   /* open-drain on output */
+				   EGPIOPTR_GPPT2 | val2);   /* open-drain on output */
 	} else if (old && !chip->amplifier) {
-		snd_cs46xx_pokeBA0(chip, BA0_EGPIODR, 0); /* disable */
-		snd_cs46xx_pokeBA0(chip, BA0_EGPIOPTR, 0); /* disable */
+		snd_printdd ("Hercules amplifier OFF\n");
+		snd_cs46xx_pokeBA0(chip, BA0_EGPIODR,  val1 & ~EGPIODR_GPOE2); /* disable */
+		snd_cs46xx_pokeBA0(chip, BA0_EGPIOPTR, val2 & ~EGPIOPTR_GPPT2); /* disable */
 	}
 }
 
+static void hercules_mixer_init (cs46xx_t *chip)
+{
+	int idx,err;
+	snd_card_t *card = chip->card;
+
+	/* set EGPIO to default */
+	hercules_init(chip);
+
+	snd_printdd ("initializing Hercules mixer\n");
+
+	for (idx = 0 ; idx < sizeof(snd_hercules_controls) / 
+		     sizeof(snd_hercules_controls[0]) ; idx++) {
+		snd_kcontrol_t *kctl;
+
+		kctl = snd_ctl_new1(&snd_hercules_controls[idx], chip);
+		if ((err = snd_ctl_add(card, kctl)) < 0) {
+			printk (KERN_ERR "cs46xx: failed to initialize Hercules mixer (%d)\n",err);
+			break;
+		}
+	}
+}
 
 #if 0
 /*
@@ -2706,24 +3047,25 @@
 	void (*init)(cs46xx_t *);
 	void (*amp)(cs46xx_t *, int);
 	void (*active)(cs46xx_t *, int);
+	void (*mixer_init)(cs46xx_t *);
 };
 
 static struct cs_card_type __initdata cards[] = {
-	{0x1489, 0x7001, "Genius Soundmaker 128 value", NULL, amp_none, NULL},
-	{0x5053, 0x3357, "Voyetra", NULL, amp_voyetra, NULL},
-	{0x1071, 0x6003, "Mitac MI6020/21", NULL, amp_voyetra, NULL},
-	{0x14AF, 0x0050, "Hercules Game Theatre XP", NULL, amp_hercules, NULL},
-	{0x1681, 0x0050, "Hercules Game Theatre XP", NULL, amp_hercules, NULL},
-	{0x1681, 0x0051, "Hercules Game Theatre XP", NULL, amp_hercules, NULL},
-	{0x1681, 0x0052, "Hercules Game Theatre XP", NULL, amp_hercules, NULL},
-	{0x1681, 0x0053, "Hercules Game Theatre XP", NULL, amp_hercules, NULL},
-	{0x1681, 0x0054, "Hercules Game Theatre XP", NULL, amp_hercules, NULL},
+	{0x1489, 0x7001, "Genius Soundmaker 128 value", NULL, amp_none, NULL, NULL},
+	{0x5053, 0x3357, "Voyetra", NULL, amp_voyetra, NULL, NULL},
+	{0x1071, 0x6003, "Mitac MI6020/21", NULL, amp_voyetra, NULL, NULL},
+	{0x14AF, 0x0050, "Hercules Game Theatre XP", NULL, amp_hercules, NULL, hercules_mixer_init},
+	{0x1681, 0x0050, "Hercules Game Theatre XP", NULL, amp_hercules, NULL, hercules_mixer_init},
+	{0x1681, 0x0051, "Hercules Game Theatre XP", NULL, amp_hercules, NULL, hercules_mixer_init},
+	{0x1681, 0x0052, "Hercules Game Theatre XP", NULL, amp_hercules, NULL, hercules_mixer_init},
+	{0x1681, 0x0053, "Hercules Game Theatre XP", NULL, amp_hercules, NULL, hercules_mixer_init},
+	{0x1681, 0x0054, "Hercules Game Theatre XP", NULL, amp_hercules, NULL, hercules_mixer_init},
 	/* Not sure if the 570 needs the clkrun hack */
-	{PCI_VENDOR_ID_IBM, 0x0132, "Thinkpad 570", clkrun_init, NULL, clkrun_hack},
-	{PCI_VENDOR_ID_IBM, 0x0153, "Thinkpad 600X/A20/T20", clkrun_init, NULL, clkrun_hack},
-	{PCI_VENDOR_ID_IBM, 0x1010, "Thinkpad 600E (unsupported)", NULL, NULL, NULL},
-	{0, 0, "Card without SSID set", NULL, NULL, NULL },
-	{0, 0, NULL, NULL, NULL, NULL}
+	{PCI_VENDOR_ID_IBM, 0x0132, "Thinkpad 570", clkrun_init, NULL, clkrun_hack, NULL},
+	{PCI_VENDOR_ID_IBM, 0x0153, "Thinkpad 600X/A20/T20", clkrun_init, NULL, clkrun_hack, NULL},
+	{PCI_VENDOR_ID_IBM, 0x1010, "Thinkpad 600E (unsupported)", NULL, NULL, NULL, NULL},
+	{0, 0, "Card without SSID set", NULL, NULL, NULL, NULL },
+	{0, 0, NULL, NULL, NULL, NULL, NULL}
 };
 
 
@@ -2885,6 +3227,7 @@
 				cp->init(chip);
 			chip->amplifier_ctrl = cp->amp;
 			chip->active_ctrl = cp->active;
+			chip->mixer_init = cp->mixer_init;
 			break;
 		}
 	}
diff -Nru a/sound/pci/cs46xx/cs46xx_lib.h b/sound/pci/cs46xx/cs46xx_lib.h
--- a/sound/pci/cs46xx/cs46xx_lib.h	Tue Oct  1 17:06:00 2002
+++ b/sound/pci/cs46xx/cs46xx_lib.h	Tue Oct  1 17:06:00 2002
@@ -99,6 +99,10 @@
 int                    cs46xx_dsp_disable_spdif_out (cs46xx_t *chip);
 int                    cs46xx_dsp_enable_spdif_in (cs46xx_t *chip);
 int                    cs46xx_dsp_disable_spdif_in (cs46xx_t *chip);
+int                    cs46xx_dsp_enable_pcm_capture (cs46xx_t *chip);
+int                    cs46xx_dsp_disable_pcm_capture (cs46xx_t *chip);
+int                    cs46xx_dsp_enable_adc_capture (cs46xx_t *chip);
+int                    cs46xx_dsp_disable_adc_capture (cs46xx_t *chip);
 int                    cs46xx_poke_via_dsp (cs46xx_t *chip,u32 address,u32 data);
 dsp_scb_descriptor_t * cs46xx_dsp_create_scb (cs46xx_t *chip,char * name, u32 * scb_data,u32 dest);
 void                   cs46xx_dsp_proc_free_scb_desc (dsp_scb_descriptor_t * scb);
@@ -188,4 +192,6 @@
                                                           u32 rate);
 int                        cs46xx_dsp_pcm_unlink (cs46xx_t * chip,pcm_channel_descriptor_t * pcm_channel);
 int                        cs46xx_dsp_pcm_link (cs46xx_t * chip,pcm_channel_descriptor_t * pcm_channel);
+dsp_scb_descriptor_t *     cs46xx_add_record_source (cs46xx_t *chip,dsp_scb_descriptor_t * source,
+                                                     u16 addr,char * scb_name);
 #endif /* __CS46XX_LIB_H__ */
diff -Nru a/sound/pci/cs46xx/dsp_spos.c b/sound/pci/cs46xx/dsp_spos.c
--- a/sound/pci/cs46xx/dsp_spos.c	Tue Oct  1 17:06:01 2002
+++ b/sound/pci/cs46xx/dsp_spos.c	Tue Oct  1 17:06:01 2002
@@ -20,7 +20,6 @@
  */
 
 
-#define __NO_VERSION__
 #include <sound/driver.h>
 #include <asm/io.h>
 #include <linux/delay.h>
@@ -251,8 +250,8 @@
 
 			ins->symbol_table.nsymbols++;
 		} else {
-			// if (0) printk ("dsp_spos: symbol <%s> duplicated, probably nothing wrong with that (Cirrus?)\n",
-			//                module->symbol_table.symbols[i].symbol_name);
+          /* if (0) printk ("dsp_spos: symbol <%s> duplicated, probably nothing wrong with that (Cirrus?)\n",
+                             module->symbol_table.symbols[i].symbol_name); */
 		}
 	}
 
@@ -336,6 +335,10 @@
 		return NULL;
 	}
 
+	/* default SPDIF input sample rate
+	   to 48000 khz */
+	ins->spdif_in_sample_rate = 32000;
+
 	return ins;
 }
 
@@ -688,7 +691,7 @@
 
 	snd_iprintf(buffer,"\n\n");
 	col = 0;
-	for (i = SPDIFO_IP_OUTPUT_BUFFER1 - 0x80;i < SPDIFO_IP_OUTPUT_BUFFER1; i += sizeof(u32),col ++) {
+	for (i = SPDIFI_IP_OUTPUT_BUFFER1;i < SPDIFI_IP_OUTPUT_BUFFER1 + 0x40; i += sizeof(u32),col ++) {
 		if (col == 4) {
 			snd_iprintf(buffer,"\n");
 			col = 0;
@@ -1083,17 +1086,15 @@
 	dsp_scb_descriptor_t * timing_master_scb;
 	dsp_scb_descriptor_t * codec_out_scb;
 	dsp_scb_descriptor_t * codec_in_scb;
-	dsp_scb_descriptor_t * pcm_reader_scb;
 	dsp_scb_descriptor_t * src_task_scb;
 	dsp_scb_descriptor_t * master_mix_scb;
+	dsp_scb_descriptor_t * record_mix_scb;
 	dsp_scb_descriptor_t * write_back_scb;
 	dsp_scb_descriptor_t * vari_decimate_scb;
 	dsp_scb_descriptor_t * pcm_serial_input_task;
 	dsp_scb_descriptor_t * asynch_tx_scb;
-	dsp_scb_descriptor_t * asynch_rx_scb;
 	dsp_scb_descriptor_t * sec_codec_out_scb;
 	dsp_scb_descriptor_t * magic_snoop_scb;
-	dsp_scb_descriptor_t * sec_magic_snoop_scb;
 
 	spos_control_block_t sposcb = {
 		/* 0 */ HFG_TREE_SCB,HFG_STACK,
@@ -1310,13 +1311,9 @@
 				0,0
 			}
 		};
-		// debug_tree = 1;
 		cs46xx_dsp_create_task_tree(chip,"BGtaskTreeHdr",(u32 *)&bg_task_tree_hdr,BG_TREE_SCB_ADDR,0x35);
-		// debug_tree = 0;
-    
 	}
 
-	//debug_scb = 1;
 	/* create timing master SCB */
 	timing_master_scb = cs46xx_dsp_create_timing_master_scb(chip);
 
@@ -1335,21 +1332,6 @@
 	ins->master_mix_scb = master_mix_scb;
 
 	if (!master_mix_scb) goto _fail_end;
-#if 0
-	/* the sample rate converter SCB */
-	src_task_scb = cs46xx_dsp_create_src_task_scb(chip,"SrcTaskSCB_I",
-						      SRC_OUTPUT_BUF1,
-						      SRC_DELAY_BUF1,SRCTASK_SCB_ADDR,
-						      asynch_tx_scb,
-
-						      SCB_ON_PARENT_SUBLIST_SCB);
-	/* create the PCM reader SCB */
-	pcm_reader_scb = cs46xx_dsp_create_pcm_reader_scb(chip,"PCMReaderSCB_I",
-							  PCM_READER_BUF1,PCMREADER_SCB_ADDR,
-							  0, /* playback how hw addr */
-							  src_task_scb,
-							  SCB_ON_PARENT_SUBLIST_SCB);
-#endif
 
 	/* create codec in */
 	codec_in_scb = cs46xx_dsp_create_codec_in_scb(chip,"CodecInSCB",0x0010,0x00A0,
@@ -1357,7 +1339,8 @@
                                                   CODECIN_SCB_ADDR,codec_out_scb,
                                                   SCB_ON_PARENT_NEXT_SCB);
 	if (!codec_in_scb) goto _fail_end;
-  
+	ins->codec_in_scb = codec_in_scb;
+
 	/* create write back scb */
 	write_back_scb = cs46xx_dsp_create_mix_to_ostream_scb(chip,"WriteBackSCB",
 							      WRITE_BACK_BUF1,WRITE_BACK_SPB,
@@ -1385,25 +1368,14 @@
 								SCB_ON_PARENT_SUBLIST_SCB);
 	if (!vari_decimate_scb) goto _fail_end;
 
+	/* create the record mixer SCB */
+	record_mix_scb = cs46xx_dsp_create_mix_only_scb(chip,"RecordMixerSCB",
+							MIX_SAMPLE_BUF2,0x170,
+							vari_decimate_scb,
+							SCB_ON_PARENT_SUBLIST_SCB);
+	ins->record_mixer_scb = record_mix_scb;
 
-	/* pcm input */
-	pcm_serial_input_task = cs46xx_dsp_create_pcm_serial_input_scb(chip,"PCMSerialInput",
-								       PCMSERIALIN_SCB_ADDR,
-								       codec_in_scb, vari_decimate_scb,
-								       SCB_ON_PARENT_SUBLIST_SCB);
-	if (!pcm_serial_input_task) goto _fail_end;
-  
-
-#if 0  /* asynch. receive task */
-	asynch_rx_scb = cs46xx_dsp_create_asynch_fg_rx_scb(chip,"AsynchFGRxSCB",
-							   ASYNCRX_SCB_ADDR,
-							   SPDIFI_SCB_INST,
-							   SPDIFI_IP_OUTPUT_BUFFER1,
-							   master_mix_scb,
-							   SCB_ON_PARENT_NEXT_SCB);
-	if (!asynch_rx_scb) goto _fail_end;
-#endif
-
+	if (!record_mix_scb) goto _fail_end;
 
 	/* create secondary CODEC output */
 	sec_codec_out_scb = cs46xx_dsp_create_codec_out_scb(chip,"CodecOutSCB_II",0x0010,0x0040,
@@ -1419,6 +1391,7 @@
 							     sec_codec_out_scb,
 							     SCB_ON_PARENT_SUBLIST_SCB);
 	if (!magic_snoop_scb) goto _fail_end;
+	ins->ref_snoop_scb = magic_snoop_scb;
 
 	/* The asynch. transfer task */
 	asynch_tx_scb = cs46xx_dsp_create_asynch_fg_tx_scb(chip,"AsynchFGTxSCB",ASYNCTX_SCB_ADDR,
@@ -1445,16 +1418,19 @@
 
 
 	/* the magic snooper */
-#if 0
-	sec_magic_snoop_scb = cs46xx_dsp_create_magic_snoop_scb (chip,"MagicSnoopSCB_II",OUTPUTSNOOPII_SCB_ADDR,
-								 MIX_SAMPLE_BUF1,
-								 master_mix_scb,
-								 asynch_tx_scb,
-								 SCB_ON_PARENT_SUBLIST_SCB);
-	if (!sec_magic_scb) goto _fail_end;
-#endif
 
-	//debug_scb = 0;
+	src_task_scb = cs46xx_dsp_create_src_task_scb(chip,"SrcTaskSCB_SPDIFI",
+						      SRC_OUTPUT_BUF1,
+						      SRC_DELAY_BUF1,SRCTASK_SCB_ADDR,
+						      master_mix_scb,
+						      SCB_ON_PARENT_SUBLIST_SCB);
+
+	if (!src_task_scb) goto _fail_end;
+
+	/* NOTE: when we now how to detect the SPDIF input
+	   sample rate we will use this SRC to adjust it */
+	ins->spdif_in_src = src_task_scb;
+
 	cs46xx_dsp_async_init(chip,timing_master_scb);
 	return 0;
 
@@ -1493,15 +1469,19 @@
 		spdifoscb_t spdifo_scb = {
 			/* 0 */ DSP_SPOS_UUUU,
 			{
-				/* 1 */ 0xb0, //DSP_SPOS_UUUU,
-				/* 2 */ 0, //DSP_SPOS_UUUU,
-				/* 3 */ 0, //DSP_SPOS_UUUU, 
-				/* 4 */ 0, //DSP_SPOS_UUUU,
+				/* 1 */ 0xb0, 
+				/* 2 */ 0, 
+				/* 3 */ 0, 
+				/* 4 */ 0, 
 			},
-			/* 5 */ 0x00000085,
+			/* NOTE: the SPDIF output task read samples in mono
+			   format, the AsynchFGTxSCB task writes to buffer
+			   in stereo format
+			*/
+			/* 5 */ RSCONFIG_SAMPLE_16MONO + RSCONFIG_MODULO_256,
 			/* 6 */ ( SPDIFO_IP_OUTPUT_BUFFER1 << 0x10 )  |  0xFFFC,
-			/* 7 */ 0,0, // DSP_SPOS_UU,1, //DSP_SPOS_DC,DSP_SPOS_UU, 
-			/* 8 */ 0, //DSP_SPOS_UUUU,      
+			/* 7 */ 0,0, 
+			/* 8 */ 0, 
 			/* 9 */ FG_TASK_HEADER_ADDR, NULL_SCB_ADDR, 
 			/* A */ spdifo_task->address,
 			SPDIFO_SCB_INST + SPDIFOFIFOPointer,
@@ -1528,8 +1508,11 @@
 			/* 9 */ SPDIFO_SCB_INST, NULL_SCB_ADDR,
 			/* A */ spdifi_task->address,
 			SPDIFI_SCB_INST + SPDIFIFIFOPointer,
-              
-			/* B */ 0x00000083,				
+			/* NOTE: The SPDIF input task write the sample in mono
+			   format from the HW FIFO, the AsynchFGRxSCB task  reads 
+			   them in stereo 
+			*/
+			/* B */ RSCONFIG_SAMPLE_16MONO + RSCONFIG_MODULO_128,
 			/* C */ (SPDIFI_IP_OUTPUT_BUFFER1 << 0x10) | 0xFFFC,
 			/* D */ 0x8048,0,
 			/* E */ 0x01f0,0x0001,
@@ -1543,7 +1526,7 @@
 			/* 2 */ 0,
 			/* 3 */ 1,4000,
 			/* 4 */ 0x0118,0x0001,
-			/* 5 */ 0x00000083,
+			/* 5 */ RSCONFIG_SAMPLE_16MONO + RSCONFIG_MODULO_64,
 			/* 6 */ (ASYNC_IP_OUTPUT_BUFFER1 << 0x10) | 0xFFFC,
 			/* 7 */ DSP_SPOS_UU,0x3,
 			/* 8 */ DSP_SPOS_UUUU,
@@ -1614,8 +1597,8 @@
 		   is the FG task tree */
 		fg_entry->parent_scb_ptr = spdifo_scb_desc;
 
-		/* dirty hack to start forground task ... */
-		//snd_cs46xx_poke(chip,DSP_PARAMETER_BYTE_OFFSET  + 0x070 * sizeof(u32),0x066a0ba0);
+		/* Async MASTER ENABLE, affects both SPDIF input and output */
+		snd_cs46xx_pokeBA0(chip, BA0_ASER_MASTER, 0x1 );
 	}
 
 	return 0;
@@ -1626,19 +1609,7 @@
 	dsp_spos_instance_t * ins = chip->dsp_spos_instance;
 
 	/* set SPDIF output FIFO slot */
-	snd_cs46xx_pokeBA0(chip, BA0_ASER_FADDR, ( 0x8100 | ((SP_SPDOUT_FIFO >> 4) << 4) ));
-
-	/* Async MASTER ENABLE */
-	snd_cs46xx_pokeBA0(chip, BA0_ASER_MASTER, 0x1 );
-
-#if 0
-	/* reset buffers */
-	snd_cs46xx_poke (chip, (SPDIFO_SCB_INST + 6) << 2,(SPDIFO_IP_OUTPUT_BUFFER1 << 0x10)  |  0xFFFC);
-	snd_cs46xx_poke (chip, (ASYNCTX_SCB_ADDR + 12) << 2, (SPDIFO_IP_OUTPUT_BUFFER1) << 0x10);
-
-	/* insert the foreground asynch tranfer task */
-	snd_cs46xx_poke (chip, (MASTERMIX_SCB_ADDR + 9) << 2, ASYNCTX_SCB_ADDR << 0x10 /*| ASYNCRX_SCB_ADDR*/);
-#endif
+	snd_cs46xx_pokeBA0(chip, BA0_ASER_FADDR, ( 0x8000 | ((SP_SPDOUT_FIFO >> 4) << 4) ));
 
 	/* SPDIF output MASTER ENABLE */
 	cs46xx_poke_via_dsp (chip,SP_SPDOUT_CONTROL, 0x80000000);
@@ -1658,13 +1629,8 @@
 {
 	dsp_spos_instance_t * ins = chip->dsp_spos_instance;
 
-#if 0
-	/* unlink the foreground asynch tranfer task */
-	snd_cs46xx_poke (chip, (MASTERMIX_SCB_ADDR + 9) << 2, SRCTASK_SCB_ADDR << 0x10 /* | ASYNCRX_SCB_ADDR*/);
-#endif
-
-	/* Async MASTER DISABLE */
-	snd_cs46xx_pokeBA0(chip, BA0_ASER_MASTER, 0x0 );
+	/* disable  SPDIF output FIFO slot */
+	snd_cs46xx_pokeBA0(chip, BA0_ASER_FADDR, 0);
 
 	/* SPDIF output MASTER DISABLE */
 	cs46xx_poke_via_dsp (chip,SP_SPDOUT_CONTROL, 0x0);
@@ -1679,12 +1645,39 @@
 {
 	dsp_spos_instance_t * ins = chip->dsp_spos_instance;
 
-	/* Async MASTER ENABLE */
-	snd_cs46xx_pokeBA0(chip, BA0_ASER_MASTER, 0x1 );
+	/* turn on amplifier */
+	chip->active_ctrl(chip, 1);
+	chip->amplifier_ctrl(chip, 1);
+
+	/* set SPDIF input sample rate 
+	   NOTE: only 48khz support for SPDIF input this time */
+	cs46xx_dsp_set_src_sample_rate(chip,ins->spdif_in_src,48000);
+
+
+	snd_assert (ins->asynch_rx_scb == NULL,return -EINVAL);
+	snd_assert (ins->spdif_in_src != NULL,return -EINVAL);
+
+	/* create and start the asynchronous receiver SCB */
+	ins->asynch_rx_scb = cs46xx_dsp_create_asynch_fg_rx_scb(chip,"AsynchFGRxSCB",
+								ASYNCRX_SCB_ADDR,
+								SPDIFI_SCB_INST,
+								SPDIFI_IP_OUTPUT_BUFFER1,
+								ins->spdif_in_src,
+								SCB_ON_PARENT_SUBLIST_SCB);
+
+	if (!ins->asynch_rx_scb) 
+		return -EINVAL;
 
-	/* Time countdown enable */
+	/* reset SPDIF input sample buffer pointer */
+	snd_cs46xx_poke (chip, (SPDIFI_SCB_INST + 0x0c) << 2,
+			 (SPDIFI_IP_OUTPUT_BUFFER1 << 0x10) | 0xFFFC);
+
+	/* time countdown enable */
 	cs46xx_poke_via_dsp (chip,SP_ASER_COUNTDOWN, 0x80000000);
 
+	/* reset FIFO ptr */
+	cs46xx_poke_via_dsp (chip,SP_SPDIN_FIFOPTR, 0x0);
+
 	/* SPDIF input MASTER ENABLE */
 	cs46xx_poke_via_dsp (chip,SP_SPDIN_CONTROL, 0x800003ff);
 
@@ -1698,15 +1691,79 @@
 {
 	dsp_spos_instance_t * ins = chip->dsp_spos_instance;
 
+	snd_assert (ins->asynch_rx_scb != NULL, return -EINVAL);
+
+	/* Time countdown disable */
+	cs46xx_poke_via_dsp (chip,SP_ASER_COUNTDOWN, 0x00000000);
+
 	/* SPDIF input MASTER DISABLE */
 	cs46xx_poke_via_dsp (chip,SP_SPDIN_CONTROL, 0x000003ff);
 
+	/* Remove the asynchronous receiver SCB */
+	cs46xx_dsp_remove_scb (chip,ins->asynch_rx_scb);
+	ins->asynch_rx_scb = NULL;
+
 	/* monitor state */
 	ins->spdif_status_in = 0;
+
+	/* restore amplifier */
+	chip->active_ctrl(chip, -1);
+	chip->amplifier_ctrl(chip, -1);
+
+	return 0;
+}
+
+int cs46xx_dsp_enable_pcm_capture (cs46xx_t *chip)
+{
+	dsp_spos_instance_t * ins = chip->dsp_spos_instance;
+
+	snd_assert (ins->pcm_input == NULL,return -EINVAL);
+	snd_assert (ins->ref_snoop_scb != NULL,return -EINVAL);
+
+	ins->pcm_input = cs46xx_add_record_source(chip,ins->ref_snoop_scb,PCMSERIALIN_PCM_SCB_ADDR,
+                                                  "PCMSerialInput_Wave");
+                                                  
+	return 0;
+}
+
+int cs46xx_dsp_disable_pcm_capture (cs46xx_t *chip)
+{
+	dsp_spos_instance_t * ins = chip->dsp_spos_instance;
+
+	snd_assert (ins->pcm_input != NULL,return -EINVAL);
+
+	cs46xx_dsp_remove_scb (chip,ins->pcm_input);
+	ins->pcm_input = NULL;
+
+	return 0;
+}
+
+int cs46xx_dsp_enable_adc_capture (cs46xx_t *chip)
+{
+	dsp_spos_instance_t * ins = chip->dsp_spos_instance;
+
+	snd_assert (ins->adc_input == NULL,return -EINVAL);
+	snd_assert (ins->codec_in_scb != NULL,return -EINVAL);
+
+	ins->adc_input = cs46xx_add_record_source(chip,ins->codec_in_scb,PCMSERIALIN_SCB_ADDR,
+						  "PCMSerialInput_ADC");
+                                                  
+	return 0;
+}
+
+int cs46xx_dsp_disable_adc_capture (cs46xx_t *chip)
+{
+	dsp_spos_instance_t * ins = chip->dsp_spos_instance;
+
+	snd_assert (ins->adc_input != NULL,return -EINVAL);
+
+	cs46xx_dsp_remove_scb (chip,ins->adc_input);
+	ins->adc_input = NULL;
+
 	return 0;
 }
 
-int  cs46xx_poke_via_dsp (cs46xx_t *chip,u32 address,u32 data)
+int cs46xx_poke_via_dsp (cs46xx_t *chip,u32 address,u32 data)
 {
 	u32 temp;
 	int  i;
diff -Nru a/sound/pci/cs46xx/dsp_spos.h b/sound/pci/cs46xx/dsp_spos.h
--- a/sound/pci/cs46xx/dsp_spos.h	Tue Oct  1 17:06:00 2002
+++ b/sound/pci/cs46xx/dsp_spos.h	Tue Oct  1 17:06:00 2002
@@ -23,6 +23,10 @@
  * 2002-07 Benny Sjostrand benny@hostmobility.com
  */
 
+#ifdef  CONFIG_SND_CS46XX_NEW_DSP /* hack ... */
+#ifndef __DSP_SPOS_H__
+#define __DSP_SPOS_H__
+
 #define DSP_MAX_SYMBOLS 1024
 #define DSP_MAX_MODULES 64
 
@@ -40,20 +44,20 @@
    needs to be reallocated when load
    code into DSP */
 typedef enum  {
-  WIDE_FOR_BEGIN_LOOP = 0x20,
-  WIDE_FOR_BEGIN_LOOP2,
+	WIDE_FOR_BEGIN_LOOP = 0x20,
+	WIDE_FOR_BEGIN_LOOP2,
 
-  WIDE_COND_GOTO_ADDR = 0x30,
-  WIDE_COND_GOTO_CALL,
+	WIDE_COND_GOTO_ADDR = 0x30,
+	WIDE_COND_GOTO_CALL,
 
-  WIDE_TBEQ_COND_GOTO_ADDR = 0x70,
-  WIDE_TBEQ_COND_CALL_ADDR,
-  WIDE_TBEQ_NCOND_GOTO_ADDR,
-  WIDE_TBEQ_NCOND_CALL_ADDR,
-  WIDE_TBEQ_COND_GOTO1_ADDR,
-  WIDE_TBEQ_COND_CALL1_ADDR,
-  WIDE_TBEQ_NCOND_GOTOI_ADDR,
-  WIDE_TBEQ_NCOND_CALL1_ADDR,
+	WIDE_TBEQ_COND_GOTO_ADDR = 0x70,
+	WIDE_TBEQ_COND_CALL_ADDR,
+	WIDE_TBEQ_NCOND_GOTO_ADDR,
+	WIDE_TBEQ_NCOND_CALL_ADDR,
+	WIDE_TBEQ_COND_GOTO1_ADDR,
+	WIDE_TBEQ_COND_CALL1_ADDR,
+	WIDE_TBEQ_NCOND_GOTOI_ADDR,
+	WIDE_TBEQ_NCOND_CALL1_ADDR,
 } wide_opcode_t;
 
 /* SAMPLE segment */
@@ -69,7 +73,9 @@
 #define SPDIFI_IP_OUTPUT_BUFFER1 0x0E00
 #define SPDIFO_IP_OUTPUT_BUFFER1 0x1000
 #define MIX_SAMPLE_BUF1          0x1400
+#define MIX_SAMPLE_BUF2          0x3000
 
+// #define SPDIFI_IP_OUTPUT_BUFFER1 0x2800
 // #define SRC_OUTPUT_BUF2          0x1280
 // #define SRC_DELAY_BUF2           0x1288
 
@@ -100,6 +106,7 @@
 #define SPIOWRITE_SCB_ADDR       0x130
 #define SEC_CODECOUT_SCB_ADDR    0x140
 #define OUTPUTSNOOPII_SCB_ADDR   0x150
+#define PCMSERIALIN_PCM_SCB_ADDR 0x160
 
 /* hyperforground SCB's*/
 #define HFG_TREE_SCB             0xBA0
@@ -123,19 +130,45 @@
 /* conf */
 #define UseASER1Input 1
 
-/* constants */
+
+
+/*
+ * The following defines are for the flags in the rsConfig01/23 registers of
+ * the SP.
+ */
+
+#define RSCONFIG_MODULO_SIZE_MASK               0x0000000FL
+#define RSCONFIG_MODULO_16                      0x00000001L
+#define RSCONFIG_MODULO_32                      0x00000002L
+#define RSCONFIG_MODULO_64                      0x00000003L
+#define RSCONFIG_MODULO_128                     0x00000004L
+#define RSCONFIG_MODULO_256                     0x00000005L
+#define RSCONFIG_MODULO_512                     0x00000006L
+#define RSCONFIG_MODULO_1024                    0x00000007L
+#define RSCONFIG_MODULO_4                       0x00000008L
+#define RSCONFIG_MODULO_8                       0x00000009L
+#define RSCONFIG_SAMPLE_SIZE_MASK               0x000000C0L
+#define RSCONFIG_SAMPLE_8MONO                   0x00000000L
+#define RSCONFIG_SAMPLE_8STEREO                 0x00000040L
+#define RSCONFIG_SAMPLE_16MONO                  0x00000080L
+#define RSCONFIG_SAMPLE_16STEREO                0x000000C0L
+#define RSCONFIG_UNDERRUN_ZERO                  0x00004000L
+#define RSCONFIG_DMA_TO_HOST                    0x00008000L
+#define RSCONFIG_STREAM_NUM_MASK                0x00FF0000L
+#define RSCONFIG_MAX_DMA_SIZE_MASK              0x1F000000L
+#define RSCONFIG_DMA_ENABLE                     0x20000000L
+#define RSCONFIG_PRIORITY_MASK                  0xC0000000L
+#define RSCONFIG_PRIORITY_HIGH                  0x00000000L
+#define RSCONFIG_PRIORITY_MEDIUM_HIGH           0x40000000L
+#define RSCONFIG_PRIORITY_MEDIUM_LOW            0x80000000L
+#define RSCONFIG_PRIORITY_LOW                   0xC0000000L
+#define RSCONFIG_STREAM_NUM_SHIFT               16L
+#define RSCONFIG_MAX_DMA_SIZE_SHIFT             24L
+
+/* SP constants */
 #define FG_INTERVAL_TIMER_PERIOD                0x0051
 #define BG_INTERVAL_TIMER_PERIOD                0x0100
-#define RSCONFIG_MODULO_32                      0x00000002
-#define RSCONFIG_MODULO_64                      0x00000003
-#define RSCONFIG_MODULO_256                     0x00000005
-#define RSCONFIG_MODULO_8                       0x00000009
-#define RSCONFIG_SAMPLE_16STEREO                0x000000C0
-#define RSCONFIG_SAMPLE_16MONO                  0x00000080
-#define RSCONFIG_DMA_TO_HOST                    0x00008000
-#define RSCONFIG_DMA_ENABLE                     0x20000000
-#define RSCONFIG_STREAM_NUM_SHIFT               16
-#define RSCONFIG_MAX_DMA_SIZE_SHIFT             24
+
 
 /* Only SP accesible registers */
 #define SP_ASER_COUNTDOWN 0x8040
@@ -148,3 +181,7 @@
 #define SP_SPDOUT_STATUS  0x804C
 #define SP_SPDOUT_CONTROL 0x804D
 #define SP_SPDOUT_CSUV    0x808E
+
+#endif /* __DSP_SPOS_H__ */
+#endif /* CONFIG_SND_CS46XX_NEW_DSP  */
+
diff -Nru a/sound/pci/cs46xx/dsp_spos_scb_lib.c b/sound/pci/cs46xx/dsp_spos_scb_lib.c
--- a/sound/pci/cs46xx/dsp_spos_scb_lib.c	Tue Oct  1 17:06:01 2002
+++ b/sound/pci/cs46xx/dsp_spos_scb_lib.c	Tue Oct  1 17:06:01 2002
@@ -21,7 +21,6 @@
  */
 
 
-#define __NO_VERSION__
 #include <sound/driver.h>
 #include <asm/io.h>
 #include <linux/delay.h>
@@ -149,16 +148,18 @@
 		}
 
 		spin_lock_irqsave(&chip->reg_lock, flags);    
-		/* update entry in DSP RAM */
-		snd_cs46xx_poke(chip,
-				(scb->address + SCBsubListPtr) << 2,
-				(scb->sub_list_ptr->address << 0x10) |
-				(scb->next_scb_ptr->address));
-		/* update parent entry in DSP RAM */
+
+		/* update parent first entry in DSP RAM */
 		snd_cs46xx_poke(chip,
 				(scb->parent_scb_ptr->address + SCBsubListPtr) << 2,
 				(scb->parent_scb_ptr->sub_list_ptr->address << 0x10) |
 				(scb->parent_scb_ptr->next_scb_ptr->address));
+
+		/* then update entry in DSP RAM */
+		snd_cs46xx_poke(chip,
+				(scb->address + SCBsubListPtr) << 2,
+				(scb->sub_list_ptr->address << 0x10) |
+				(scb->next_scb_ptr->address));
     
 		scb->parent_scb_ptr = NULL;
 		spin_unlock_irqrestore(&chip->reg_lock, flags);
@@ -614,7 +615,7 @@
 		0x04000000,
 		{ 
 			0x8000,0x8000,
-			0xFFFF,0xFFFF
+			0x8000,0x8000
 		}
 	};
 
@@ -642,37 +643,37 @@
                                dsp_scb_descriptor_t * parent_scb,
                                int scb_child_type)
 {
-  dsp_scb_descriptor_t * scb;
+	dsp_scb_descriptor_t * scb;
   
-  mix_only_scb_t master_mix_scb = {
-    /* 0 */ { 0,
-    /* 1 */   0,
-    /* 2 */  mix_buffer_addr,
-    /* 3 */  0
-    /*   */ },
-    {
-    /* 4 */  0,
-    /* 5 */  0,
-    /* 6 */  0,
-    /* 7 */  0,
-    /* 8 */  0x00000080
-    },
-    /* 9 */ 0,0,
-    /* A */ 0,0,
-    /* B */ RSCONFIG_SAMPLE_16STEREO + RSCONFIG_MODULO_64,
-    /* C */ (mix_buffer_addr  + (32 * 4)) << 0x10, 
-    /* D */ 0,
-    {
-    /* E */ 0x8000,0x8000,
-    /* F */ 0xFFFF,0xFFFF
-    }
-  };
-
-
-  scb = cs46xx_dsp_create_generic_scb(chip,scb_name,(u32 *)&master_mix_scb,
-                                      dest,"S16_MIX",parent_scb,
-                                      scb_child_type);
-  return scb;
+	mix_only_scb_t master_mix_scb = {
+		/* 0 */ { 0,
+			  /* 1 */   0,
+			  /* 2 */  mix_buffer_addr,
+			  /* 3 */  0
+			  /*   */ },
+		{
+			/* 4 */  0,
+			/* 5 */  0,
+			/* 6 */  0,
+			/* 7 */  0,
+			/* 8 */  0x00000080
+		},
+		/* 9 */ 0,0,
+		/* A */ 0,0,
+		/* B */ RSCONFIG_SAMPLE_16STEREO + RSCONFIG_MODULO_64,
+		/* C */ (mix_buffer_addr  + (32 * 4)) << 0x10, 
+		/* D */ 0,
+		{
+			/* E */ 0x8000,0x8000,
+			/* F */ 0x8000,0x8000
+		}
+	};
+
+
+	scb = cs46xx_dsp_create_generic_scb(chip,scb_name,(u32 *)&master_mix_scb,
+					    dest,"S16_MIX",parent_scb,
+					    scb_child_type);
+	return scb;
 }
 
 
@@ -800,7 +801,7 @@
 		0,0,
 		0,0,
 
-		0x000000c1,
+		RSCONFIG_SAMPLE_16STEREO + RSCONFIG_MODULO_16,
 		0,
 		0,input_scb->address, 
 		{
@@ -844,9 +845,9 @@
 		0,0,
 		0,dest + AFGTxAccumPhi,
     
-		0x000000c5,                       /* Stereo, 256 dword */
+		RSCONFIG_SAMPLE_16STEREO + RSCONFIG_MODULO_256, /* Stereo, 256 dword */
 		(asynch_buffer_address) << 0x10,  /* This should be automagically synchronized
-						     to the producer pointer */
+                                             to the producer pointer */
     
 		/* There is no correct initial value, it will depend upon the detected
 		   rate etc  */
@@ -874,9 +875,9 @@
 	dsp_scb_descriptor_t * scb;
 
 	asynch_fg_rx_scb_t asynch_fg_rx_scb = {
-		0xff00,0x00ff,      /* Prototype sample buffer size of 512 dwords */
+		0xfe00,0x01ff,      /*  Prototype sample buffer size of 128 dwords */
 		0x0064,0x001c,      /* Min Delta 7 dwords == 28 bytes */
-		/* : Max delta 25 dwords == 100 bytes */
+		                    /* : Max delta 25 dwords == 100 bytes */
 		0,hfg_scb_address,  /* Point to HFG task SCB */
 		0,0,				/* Initialize current Delta and Consumer ptr adjustment count */
 		{
@@ -890,13 +891,14 @@
 		0,0,
 		0,dest,
     
-		0x000000c3,                            /* Stereo, 512 dword */
-		(asynch_buffer_address  << 0x10),      /* This should be automagically 
-							  synchrinized to the producer pointer */
+		RSCONFIG_MODULO_128 |
+        RSCONFIG_SAMPLE_16STEREO,                         /* Stereo, 128 dword */
+		( (asynch_buffer_address + (16 * 4))  << 0x10),   /* This should be automagically 
+							                                  synchrinized to the producer pointer */
     
 		/* There is no correct initial value, it will depend upon the detected
 		   rate etc  */
-		0,         
+		0x18000000,         
 		0x8000,0x8000,       
 		0xFFFF,0xFFFF
 	};
@@ -936,7 +938,7 @@
 		0,0,
 		0,0,
     
-		0x000000c3,
+		RSCONFIG_SAMPLE_16STEREO + RSCONFIG_MODULO_64,
 		snoop_buffer_address << 0x10,  
 		0,0,
 		0,
@@ -1088,6 +1090,7 @@
 	0x2B00,
 };
 
+
 pcm_channel_descriptor_t * cs46xx_dsp_create_pcm_channel (cs46xx_t * chip,u32 sample_rate, void * private_data)
 {
 	dsp_spos_instance_t * ins = chip->dsp_spos_instance;
@@ -1177,10 +1180,19 @@
 		pcm_parent_scb = src_scb;
 		insert_point = SCB_ON_PARENT_SUBLIST_SCB;
 	} else {
-		snd_assert (src_scb->sub_list_ptr != ins->the_null_scb, goto _end);
+      
+      /* if channel is unlinked then src_scb->sub_list_ptr == null_scb, and
+         that's a correct state.
+        snd_assert (src_scb->sub_list_ptr != ins->the_null_scb, goto _end); 
+      */
+      if (src_scb->sub_list_ptr != ins->the_null_scb) {
 		pcm_parent_scb = find_next_free_scb(chip,src_scb->sub_list_ptr);
-    
+        
 		insert_point = SCB_ON_PARENT_NEXT_SCB;
+      } else {
+        pcm_parent_scb = src_scb;
+		insert_point = SCB_ON_PARENT_SUBLIST_SCB;
+      }
 	}
   
   
@@ -1380,4 +1392,30 @@
 	snd_cs46xx_poke(chip, (src->address + SRCPhiIncr6Int26Frac) << 2, phiIncr);
 
 	spin_unlock_irqrestore(&chip->reg_lock, flags);
+}
+
+dsp_scb_descriptor_t *
+cs46xx_add_record_source (cs46xx_t *chip,dsp_scb_descriptor_t * source,
+			  u16 addr,char * scb_name)
+{
+  	dsp_spos_instance_t * ins = chip->dsp_spos_instance;
+	dsp_scb_descriptor_t * parent;
+	dsp_scb_descriptor_t * pcm_input;
+	int insert_point;
+
+	snd_assert (ins->record_mixer_scb != NULL,return NULL);
+
+	if (ins->record_mixer_scb->sub_list_ptr != ins->the_null_scb) {
+		parent = find_next_free_scb (chip,ins->record_mixer_scb->sub_list_ptr);
+		insert_point = SCB_ON_PARENT_NEXT_SCB;
+	} else {
+		parent = ins->record_mixer_scb;
+		insert_point = SCB_ON_PARENT_SUBLIST_SCB;
+	}
+
+	pcm_input = cs46xx_dsp_create_pcm_serial_input_scb(chip,scb_name,addr,
+							   source, parent,
+							   insert_point);
+
+	return pcm_input;
 }
diff -Nru a/sound/pci/emu10k1/emu10k1_callback.c b/sound/pci/emu10k1/emu10k1_callback.c
--- a/sound/pci/emu10k1/emu10k1_callback.c	Tue Oct  1 17:06:00 2002
+++ b/sound/pci/emu10k1/emu10k1_callback.c	Tue Oct  1 17:06:00 2002
@@ -18,7 +18,6 @@
  *   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
  */
 
-#define __NO_VERSION__
 #include "emu10k1_synth_local.h"
 #include <sound/asoundef.h>
 
diff -Nru a/sound/pci/emu10k1/emu10k1_main.c b/sound/pci/emu10k1/emu10k1_main.c
--- a/sound/pci/emu10k1/emu10k1_main.c	Tue Oct  1 17:06:00 2002
+++ b/sound/pci/emu10k1/emu10k1_main.c	Tue Oct  1 17:06:00 2002
@@ -25,7 +25,6 @@
  *
  */
 
-#define __NO_VERSION__
 #include <sound/driver.h>
 #include <linux/delay.h>
 #include <linux/init.h>
diff -Nru a/sound/pci/emu10k1/emu10k1_patch.c b/sound/pci/emu10k1/emu10k1_patch.c
--- a/sound/pci/emu10k1/emu10k1_patch.c	Tue Oct  1 17:06:00 2002
+++ b/sound/pci/emu10k1/emu10k1_patch.c	Tue Oct  1 17:06:00 2002
@@ -22,7 +22,6 @@
  * chip specific here.  Just the actual writing to the board.
  */
 
-#define __NO_VERSION__
 #include "emu10k1_synth_local.h"
 
 /*
diff -Nru a/sound/pci/emu10k1/emufx.c b/sound/pci/emu10k1/emufx.c
--- a/sound/pci/emu10k1/emufx.c	Tue Oct  1 17:06:00 2002
+++ b/sound/pci/emu10k1/emufx.c	Tue Oct  1 17:06:00 2002
@@ -25,7 +25,6 @@
  *
  */
 
-#define __NO_VERSION__
 #include <sound/driver.h>
 #include <linux/delay.h>
 #include <linux/slab.h>
diff -Nru a/sound/pci/emu10k1/emumixer.c b/sound/pci/emu10k1/emumixer.c
--- a/sound/pci/emu10k1/emumixer.c	Tue Oct  1 17:06:01 2002
+++ b/sound/pci/emu10k1/emumixer.c	Tue Oct  1 17:06:01 2002
@@ -26,7 +26,6 @@
  *
  */
 
-#define __NO_VERSION__
 #include <sound/driver.h>
 #include <linux/time.h>
 #include <linux/init.h>
diff -Nru a/sound/pci/emu10k1/emumpu401.c b/sound/pci/emu10k1/emumpu401.c
--- a/sound/pci/emu10k1/emumpu401.c	Tue Oct  1 17:06:00 2002
+++ b/sound/pci/emu10k1/emumpu401.c	Tue Oct  1 17:06:00 2002
@@ -19,7 +19,6 @@
  *
  */
 
-#define __NO_VERSION__
 #include <sound/driver.h>
 #include <linux/time.h>
 #include <linux/init.h>
diff -Nru a/sound/pci/emu10k1/emupcm.c b/sound/pci/emu10k1/emupcm.c
--- a/sound/pci/emu10k1/emupcm.c	Tue Oct  1 17:06:00 2002
+++ b/sound/pci/emu10k1/emupcm.c	Tue Oct  1 17:06:00 2002
@@ -25,8 +25,8 @@
  *
  */
 
-#define __NO_VERSION__
 #include <sound/driver.h>
+#include <linux/delay.h>
 #include <linux/slab.h>
 #include <linux/time.h>
 #include <linux/init.h>
@@ -625,6 +625,7 @@
 		}
 		snd_emu10k1_ptr_write(emu, epcm->capture_bs_reg, 0, epcm->capture_bs_val);
 		epcm->running = 1;
+		epcm->first_ptr = 1;
 		break;
 	case SNDRV_PCM_TRIGGER_STOP:
 		epcm->running = 0;
@@ -682,6 +683,10 @@
 
 	if (!epcm->running)
 		return 0;
+	if (epcm->first_ptr) {
+		udelay(50);	// hack, it takes awhile until capture is started
+		epcm->first_ptr = 0;
+	}
 	ptr = snd_emu10k1_ptr_read(emu, epcm->capture_idx_reg, 0) & 0x0000ffff;
 	return bytes_to_frames(runtime, ptr);
 }
diff -Nru a/sound/pci/emu10k1/emuproc.c b/sound/pci/emu10k1/emuproc.c
--- a/sound/pci/emu10k1/emuproc.c	Tue Oct  1 17:06:00 2002
+++ b/sound/pci/emu10k1/emuproc.c	Tue Oct  1 17:06:00 2002
@@ -25,7 +25,6 @@
  *
  */
 
-#define __NO_VERSION__
 #include <sound/driver.h>
 #include <linux/slab.h>
 #include <linux/init.h>
diff -Nru a/sound/pci/emu10k1/io.c b/sound/pci/emu10k1/io.c
--- a/sound/pci/emu10k1/io.c	Tue Oct  1 17:06:00 2002
+++ b/sound/pci/emu10k1/io.c	Tue Oct  1 17:06:00 2002
@@ -25,7 +25,6 @@
  *
  */
 
-#define __NO_VERSION__
 #include <sound/driver.h>
 #include <linux/time.h>
 #include <sound/core.h>
diff -Nru a/sound/pci/emu10k1/irq.c b/sound/pci/emu10k1/irq.c
--- a/sound/pci/emu10k1/irq.c	Tue Oct  1 17:06:00 2002
+++ b/sound/pci/emu10k1/irq.c	Tue Oct  1 17:06:00 2002
@@ -25,7 +25,6 @@
  *
  */
 
-#define __NO_VERSION__
 #include <sound/driver.h>
 #include <linux/time.h>
 #include <sound/core.h>
diff -Nru a/sound/pci/emu10k1/memory.c b/sound/pci/emu10k1/memory.c
--- a/sound/pci/emu10k1/memory.c	Tue Oct  1 17:06:01 2002
+++ b/sound/pci/emu10k1/memory.c	Tue Oct  1 17:06:01 2002
@@ -21,7 +21,6 @@
  *
  */
 
-#define __NO_VERSION__
 #include <sound/driver.h>
 #include <linux/time.h>
 #include <sound/core.h>
diff -Nru a/sound/pci/emu10k1/voice.c b/sound/pci/emu10k1/voice.c
--- a/sound/pci/emu10k1/voice.c	Tue Oct  1 17:06:00 2002
+++ b/sound/pci/emu10k1/voice.c	Tue Oct  1 17:06:00 2002
@@ -25,7 +25,6 @@
  *
  */
 
-#define __NO_VERSION__
 #include <sound/driver.h>
 #include <linux/time.h>
 #include <sound/core.h>
diff -Nru a/sound/pci/trident/trident_main.c b/sound/pci/trident/trident_main.c
--- a/sound/pci/trident/trident_main.c	Tue Oct  1 17:06:00 2002
+++ b/sound/pci/trident/trident_main.c	Tue Oct  1 17:06:00 2002
@@ -25,7 +25,6 @@
  *
  */
 
-#define __NO_VERSION__
 #include <sound/driver.h>
 #include <asm/io.h>
 #include <linux/delay.h>
diff -Nru a/sound/pci/trident/trident_memory.c b/sound/pci/trident/trident_memory.c
--- a/sound/pci/trident/trident_memory.c	Tue Oct  1 17:06:01 2002
+++ b/sound/pci/trident/trident_memory.c	Tue Oct  1 17:06:01 2002
@@ -23,7 +23,6 @@
  *
  */
 
-#define __NO_VERSION__
 #include <sound/driver.h>
 #include <asm/io.h>
 #include <linux/time.h>
diff -Nru a/sound/pci/ymfpci/ymfpci_main.c b/sound/pci/ymfpci/ymfpci_main.c
--- a/sound/pci/ymfpci/ymfpci_main.c	Tue Oct  1 17:06:01 2002
+++ b/sound/pci/ymfpci/ymfpci_main.c	Tue Oct  1 17:06:01 2002
@@ -24,7 +24,6 @@
  *
  */
 
-#define __NO_VERSION__
 #include <sound/driver.h>
 #include <asm/io.h>
 #include <linux/delay.h>
diff -Nru a/sound/ppc/awacs.c b/sound/ppc/awacs.c
--- a/sound/ppc/awacs.c	Tue Oct  1 17:06:00 2002
+++ b/sound/ppc/awacs.c	Tue Oct  1 17:06:00 2002
@@ -20,7 +20,6 @@
  */
 
 
-#define __NO_VERSION__
 #include <sound/driver.h>
 #include <asm/io.h>
 #include <asm/nvram.h>
diff -Nru a/sound/ppc/burgundy.c b/sound/ppc/burgundy.c
--- a/sound/ppc/burgundy.c	Tue Oct  1 17:06:00 2002
+++ b/sound/ppc/burgundy.c	Tue Oct  1 17:06:00 2002
@@ -19,7 +19,6 @@
  *   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
  */
 
-#define __NO_VERSION__
 #include <sound/driver.h>
 #include <asm/io.h>
 #include <linux/init.h>
diff -Nru a/sound/ppc/daca.c b/sound/ppc/daca.c
--- a/sound/ppc/daca.c	Tue Oct  1 17:06:00 2002
+++ b/sound/ppc/daca.c	Tue Oct  1 17:06:00 2002
@@ -19,7 +19,6 @@
  */
 
 
-#define __NO_VERSION__
 #include <sound/driver.h>
 #include <linux/init.h>
 #include <linux/i2c.h>
diff -Nru a/sound/ppc/keywest.c b/sound/ppc/keywest.c
--- a/sound/ppc/keywest.c	Tue Oct  1 17:06:00 2002
+++ b/sound/ppc/keywest.c	Tue Oct  1 17:06:00 2002
@@ -19,7 +19,6 @@
  */
 
 
-#define __NO_VERSION__
 #include <sound/driver.h>
 #include <linux/init.h>
 #include <linux/i2c.h>
@@ -57,7 +56,7 @@
 		return -EINVAL;
 
 	if (strncmp(adapter->name, "mac-io", 6))
-		return 0;
+		return 0; /* ignored */
 
 	new_client = kmalloc(sizeof(struct i2c_client), GFP_KERNEL);
 	if (! new_client)
@@ -120,10 +119,11 @@
 	if (keywest_ctx)
 		return -EBUSY;
 
+	keywest_ctx = i2c;
+
 	if ((err = i2c_add_driver(&keywest_driver))) {
 		snd_printk(KERN_ERR "cannot register keywest i2c driver\n");
 		return err;
 	}
-	keywest_ctx = i2c;
 	return 0;
 }
diff -Nru a/sound/ppc/pmac.c b/sound/ppc/pmac.c
--- a/sound/ppc/pmac.c	Tue Oct  1 17:06:00 2002
+++ b/sound/ppc/pmac.c	Tue Oct  1 17:06:00 2002
@@ -20,7 +20,6 @@
  */
 
 
-#define __NO_VERSION__
 #include <sound/driver.h>
 #include <asm/io.h>
 #include <asm/irq.h>
diff -Nru a/sound/ppc/tumbler.c b/sound/ppc/tumbler.c
--- a/sound/ppc/tumbler.c	Tue Oct  1 17:06:00 2002
+++ b/sound/ppc/tumbler.c	Tue Oct  1 17:06:00 2002
@@ -19,7 +19,6 @@
  */
 
 
-#define __NO_VERSION__
 #include <sound/driver.h>
 #include <linux/init.h>
 #include <linux/delay.h>
diff -Nru a/sound/synth/emux/emux_effect.c b/sound/synth/emux/emux_effect.c
--- a/sound/synth/emux/emux_effect.c	Tue Oct  1 17:06:00 2002
+++ b/sound/synth/emux/emux_effect.c	Tue Oct  1 17:06:00 2002
@@ -22,7 +22,6 @@
  *
  */
 
-#define __NO_VERSION__
 #include "emux_voice.h"
 #include <linux/slab.h>
 
diff -Nru a/sound/synth/emux/emux_nrpn.c b/sound/synth/emux/emux_nrpn.c
--- a/sound/synth/emux/emux_nrpn.c	Tue Oct  1 17:06:00 2002
+++ b/sound/synth/emux/emux_nrpn.c	Tue Oct  1 17:06:00 2002
@@ -19,7 +19,6 @@
  *
  */
 
-#define __NO_VERSION__
 #include "emux_voice.h"
 #include <sound/asoundef.h>
 
diff -Nru a/sound/synth/emux/emux_oss.c b/sound/synth/emux/emux_oss.c
--- a/sound/synth/emux/emux_oss.c	Tue Oct  1 17:06:00 2002
+++ b/sound/synth/emux/emux_oss.c	Tue Oct  1 17:06:00 2002
@@ -22,7 +22,6 @@
  * 				midi emulation.
  */
 
-#define __NO_VERSION__
 #include <sound/driver.h>
 
 #ifdef CONFIG_SND_SEQUENCER_OSS
diff -Nru a/sound/synth/emux/emux_proc.c b/sound/synth/emux/emux_proc.c
--- a/sound/synth/emux/emux_proc.c	Tue Oct  1 17:06:01 2002
+++ b/sound/synth/emux/emux_proc.c	Tue Oct  1 17:06:01 2002
@@ -18,7 +18,6 @@
  *   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
  */
 
-#define __NO_VERSION__
 #include <sound/driver.h>
 #include <linux/wait.h>
 #include <linux/sched.h>
diff -Nru a/sound/synth/emux/emux_seq.c b/sound/synth/emux/emux_seq.c
--- a/sound/synth/emux/emux_seq.c	Tue Oct  1 17:06:00 2002
+++ b/sound/synth/emux/emux_seq.c	Tue Oct  1 17:06:00 2002
@@ -19,7 +19,6 @@
  *   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
  */
 
-#define __NO_VERSION__
 #include "emux_voice.h"
 #include <linux/slab.h>
 
diff -Nru a/sound/synth/emux/emux_synth.c b/sound/synth/emux/emux_synth.c
--- a/sound/synth/emux/emux_synth.c	Tue Oct  1 17:06:00 2002
+++ b/sound/synth/emux/emux_synth.c	Tue Oct  1 17:06:00 2002
@@ -22,7 +22,6 @@
  *
  */
 
-#define __NO_VERSION__
 #include "emux_voice.h"
 #include <sound/asoundef.h>
 
diff -Nru a/sound/synth/emux/soundfont.c b/sound/synth/emux/soundfont.c
--- a/sound/synth/emux/soundfont.c	Tue Oct  1 17:06:01 2002
+++ b/sound/synth/emux/soundfont.c	Tue Oct  1 17:06:01 2002
@@ -25,7 +25,6 @@
  * of doing things so that the old sfxload utility can be used.
  * Everything may change when there is an alsa way of doing things.
  */
-#define __NO_VERSION__
 #include <sound/driver.h>
 #include <asm/uaccess.h>
 #include <linux/slab.h>

===================================================================


This BitKeeper patch contains the following changesets:
1.645
## Wrapped with gzip_uu ##


begin 664 bkpatch22839
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
1"J-V%(2D%?X!42&=_=>;`0``
`
end
