[PATCH] 2nd ALSA update [6/12] - 2002/08/21

From: Jaroslav Kysela (perex@suse.cz)
Date: Tue Oct 01 2002 - 11:48:50 EST


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.649, 2002-10-01 10:34:42+02:00, perex@suse.cz
  ALSA update 2002/08/21 :
    - CS46xx
      - SPDIF input fixes
      - fixed missplaced #ifndef
      - amplifier fix for Game Theater XP
      - refine on the PCM multichannel functionality
    - EMU10K1
      - added the support for Audigy spdif controls
    - PCM midlevel
      - fixed hw_free (wrong state for drivers with no callback
      - fixed sw_params (runtime) lock
    - AC'97 codec
      - fixed spin deadlock
    - CS4281
      - fixed wrong mdelays and allowed scheduling in module_init
    - PPC drivers
      - added the missing inclusion of linux/slab.h
    - USB MIDI driver
      - replaced urb_t -> struct urb

 include/sound/cs46xx_dsp_spos.h | 1
 include/sound/emu10k1.h | 4 +
 include/sound/sndmagic.h | 7 +
 include/sound/version.h | 2
 sound/Config.in | 5 +
 sound/core/pcm_native.c | 6 +
 sound/pci/ac97/ac97_codec.c | 21 +++--
 sound/pci/cs4281.c | 11 +--
 sound/pci/cs46xx/cs46xx_lib.c | 54 ++++++++++-----
 sound/pci/cs46xx/cs46xx_lib.h | 4 -
 sound/pci/cs46xx/dsp_spos.c | 129 ++++++------------------------------
 sound/pci/cs46xx/dsp_spos.h | 6 -
 sound/pci/cs46xx/dsp_spos_scb_lib.c | 107 +++++++++++++++++++++++++++--
 sound/pci/emu10k1/emufx.c | 30 +++++++-
 sound/ppc/awacs.c | 37 +++++++---
 sound/ppc/burgundy.c | 8 +-
 sound/ppc/daca.c | 1
 sound/ppc/keywest.c | 1
 sound/ppc/pmac.c | 10 +-
 sound/ppc/tumbler.c | 1
 sound/usb/usbmidi.c | 10 +-
 21 files changed, 280 insertions(+), 175 deletions(-)

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:07:40 2002
+++ b/include/sound/cs46xx_dsp_spos.h Tue Oct 1 17:07:40 2002
@@ -177,6 +177,7 @@
         /* SPDIF status */
         int spdif_status_out;
         int spdif_status_in;
+ u32 spdif_input_volume;
 
         /* SPDIF input sample rate converter */
         dsp_scb_descriptor_t * spdif_in_src;
diff -Nru a/include/sound/emu10k1.h b/include/sound/emu10k1.h
--- a/include/sound/emu10k1.h Tue Oct 1 17:07:40 2002
+++ b/include/sound/emu10k1.h Tue Oct 1 17:07:40 2002
@@ -1195,8 +1195,12 @@
 #define A_EXTIN_AC97_R 0x01 /* AC'97 capture channel - right */
 #define A_EXTIN_SPDIF_CD_L 0x02 /* digital CD left */
 #define A_EXTIN_SPDIF_CD_R 0x03 /* digital CD left */
+#define A_EXTIN_OPT_SPDIF_L 0x04 /* audigy drive Optical SPDIF - left */
+#define A_EXTIN_OPT_SPDIF_R 0x05 /* right */
 #define A_EXTIN_LINE2_L 0x08 /* audigy drive line2/mic2 - left */
 #define A_EXTIN_LINE2_R 0x09 /* right */
+#define A_EXTIN_RCA_SPDIF_L 0x0a /* audigy drive RCA SPDIF - left */
+#define A_EXTIN_RCA_SPDIF_R 0x0b /* right */
 #define A_EXTIN_AUX2_L 0x0c /* audigy drive aux2 - left */
 #define A_EXTIN_AUX2_R 0x0d /* - right */
 
diff -Nru a/include/sound/sndmagic.h b/include/sound/sndmagic.h
--- a/include/sound/sndmagic.h Tue Oct 1 17:07:40 2002
+++ b/include/sound/sndmagic.h Tue Oct 1 17:07:40 2002
@@ -137,6 +137,13 @@
 #define sa11xx_uda1341_t_magic 0xa15a3b00
 #define uda1341_t_magic 0xa15a3c00
 #define l3_client_t_magic 0xa15a3d00
+#define snd_usb_audio_t_magic 0xa15a3e01
+#define usb_mixer_elem_info_t_magic 0xa15a3e02
+#define snd_usb_stream_t_magic 0xa15a3e03
+#define usbmidi_t_magic 0xa15a3f01
+#define usbmidi_out_endpoint_t_magic 0xa15a3f02
+#define usbmidi_in_endpoint_t_magic 0xa15a3f03
+
 
 #else
 
diff -Nru a/include/sound/version.h b/include/sound/version.h
--- a/include/sound/version.h Tue Oct 1 17:07:40 2002
+++ b/include/sound/version.h Tue Oct 1 17:07:40 2002
@@ -1,3 +1,3 @@
 /* include/version.h. Generated automatically by configure. */
 #define CONFIG_SND_VERSION "0.9.0rc3"
-#define CONFIG_SND_DATE " (Thu Aug 15 19:10:53 2002 UTC)"
+#define CONFIG_SND_DATE " (Wed Aug 21 14:00:18 2002 UTC)"
diff -Nru a/sound/Config.in b/sound/Config.in
--- a/sound/Config.in Tue Oct 1 17:07:40 2002
+++ b/sound/Config.in Tue Oct 1 17:07:40 2002
@@ -31,6 +31,11 @@
 if [ "$CONFIG_SND" != "n" -a "$CONFIG_ARM" = "y" ]; then
   source sound/arm/Config.in
 fi
+# the following will depenend on the order of config.
+# here assuming USB is defined before ALSA
+if [ "$CONFIG_SND" != "n" -a "$CONFIG_USB" != "n" ]; then
+ source sound/usb/Config.in
+fi
 if [ "$CONFIG_SND" != "n" -a "$CONFIG_SPARC32" = "y" ]; then
   source sound/sparc/Config.in
 fi
diff -Nru a/sound/core/pcm_native.c b/sound/core/pcm_native.c
--- a/sound/core/pcm_native.c Tue Oct 1 17:07:40 2002
+++ b/sound/core/pcm_native.c Tue Oct 1 17:07:40 2002
@@ -438,8 +438,10 @@
         }
         if (atomic_read(&runtime->mmap_count))
                 return -EBADFD;
- if (substream->ops->hw_free == NULL)
+ if (substream->ops->hw_free == NULL) {
+ runtime->status->state = SNDRV_PCM_STATE_OPEN;
                 return 0;
+ }
         result = substream->ops->hw_free(substream);
         runtime->status->state = SNDRV_PCM_STATE_OPEN;
         return result;
@@ -463,6 +465,7 @@
                 return -EINVAL;
         if (params->silence_threshold + params->silence_size > runtime->buffer_size)
                 return -EINVAL;
+ spin_lock_irq(&runtime->lock);
         runtime->tstamp_mode = params->tstamp_mode;
         runtime->sleep_min = params->sleep_min;
         runtime->period_step = params->period_step;
@@ -473,7 +476,6 @@
         runtime->silence_size = params->silence_size;
         runtime->xfer_align = params->xfer_align;
         params->boundary = runtime->boundary;
- spin_lock_irq(&runtime->lock);
         if (snd_pcm_running(substream)) {
                 if (runtime->sleep_min)
                         snd_pcm_tick_prepare(substream);
diff -Nru a/sound/pci/ac97/ac97_codec.c b/sound/pci/ac97/ac97_codec.c
--- a/sound/pci/ac97/ac97_codec.c Tue Oct 1 17:07:40 2002
+++ b/sound/pci/ac97/ac97_codec.c Tue Oct 1 17:07:40 2002
@@ -276,14 +276,13 @@
         return change;
 }
 
-int snd_ac97_update_bits(ac97_t *ac97, unsigned short reg, unsigned short mask, unsigned short value)
+int snd_ac97_update_bits_nolock(ac97_t *ac97, unsigned short reg, unsigned short mask, unsigned short value)
 {
         int change;
         unsigned short old, new;
 
         if (!snd_ac97_valid_reg(ac97, reg))
                 return -EINVAL;
- spin_lock(&ac97->reg_lock);
         old = ac97->regs[reg];
         new = (old & ~mask) | value;
         change = old != new;
@@ -291,6 +290,14 @@
                 ac97->write(ac97, reg, new);
                 ac97->regs[reg] = new;
         }
+ return change;
+}
+
+int snd_ac97_update_bits(ac97_t *ac97, unsigned short reg, unsigned short mask, unsigned short value)
+{
+ int change;
+ spin_lock(&ac97->reg_lock);
+ change = snd_ac97_update_bits_nolock(ac97, reg, mask, value);
         spin_unlock(&ac97->reg_lock);
         return change;
 }
@@ -740,16 +747,16 @@
                 case 2: x = 0; break; // 48.0
                 default: x = 0; break; // illegal.
                 }
- change = snd_ac97_update_bits(ac97, AC97_CSR_SPDIF, 0x3fff, ((val & 0xcfff) | (x << 12)));
+ change = snd_ac97_update_bits_nolock(ac97, AC97_CSR_SPDIF, 0x3fff, ((val & 0xcfff) | (x << 12)));
         } else if (ac97->flags & AC97_CX_SPDIF) {
                 int v;
                 v = ucontrol->value.iec958.status[0] & (IEC958_AES0_CON_EMPHASIS_5015|IEC958_AES0_CON_NOT_COPYRIGHT) ? 0 : AC97_CXR_COPYRGT;
                 v |= ucontrol->value.iec958.status[0] & IEC958_AES0_NONAUDIO ? AC97_CXR_SPDIF_AC3 : AC97_CXR_SPDIF_PCM;
- change = snd_ac97_update_bits(ac97, AC97_CXR_AUDIO_MISC,
- AC97_CXR_SPDIF_MASK | AC97_CXR_COPYRGT,
- v);
+ change = snd_ac97_update_bits_nolock(ac97, AC97_CXR_AUDIO_MISC,
+ AC97_CXR_SPDIF_MASK | AC97_CXR_COPYRGT,
+ v);
         } else {
- change = snd_ac97_update_bits(ac97, AC97_SPDIF, 0x3fff, val);
+ change = snd_ac97_update_bits_nolock(ac97, AC97_SPDIF, 0x3fff, val);
         }
 
         change |= ac97->spdif_status != new;
diff -Nru a/sound/pci/cs4281.c b/sound/pci/cs4281.c
--- a/sound/pci/cs4281.c Tue Oct 1 17:07:40 2002
+++ b/sound/pci/cs4281.c Tue Oct 1 17:07:40 2002
@@ -549,8 +549,11 @@
                                 set_current_state(TASK_UNINTERRUPTIBLE);
                                 schedule_timeout(1);
                         } while (end_time - (signed long)jiffies >= 0);
- } else
- mdelay(delay);
+ } else {
+ delay += 999;
+ delay /= 1000;
+ mdelay(delay > 0 ? delay : 1);
+ }
         } else {
                 udelay(delay);
         }
@@ -562,7 +565,7 @@
                 set_current_state(TASK_UNINTERRUPTIBLE);
                 schedule_timeout(1);
         } else
- mdelay(1999 / HZ);
+ mdelay(10);
 }
 
 static inline void snd_cs4281_pokeBA0(cs4281_t *chip, unsigned long offset, unsigned int val)
@@ -1502,7 +1505,7 @@
                 return -ENOMEM;
         }
         
- tmp = snd_cs4281_chip_init(chip, 0);
+ tmp = snd_cs4281_chip_init(chip, 1);
         if (tmp) {
                 snd_cs4281_free(chip);
                 return tmp;
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:07:40 2002
+++ b/sound/pci/cs46xx/cs46xx_lib.c Tue Oct 1 17:07:40 2002
@@ -6,9 +6,9 @@
  *
  * 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.
+ * and the SPDIF get somewhat "distorcionated", or/and left right channel
+ * are swapped. 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.
  *
@@ -16,11 +16,19 @@
  * - Secondary CODEC on some soundcards
  * - SPDIF input support for other sample rates then 48khz
  * - Independent PCM channels for rear output
+ * - Posibility to mix the SPDIF output with analog sources.
  *
  * NOTE: with CONFIG_SND_CS46XX_NEW_DSP unset uses old DSP image (which
  * is default configuration), no SPDIF, no secondary codec, no
  * multi channel PCM. But known to work.
  *
+ * FINALLY: A credit to the developers Tom and Jordan
+ * at Cirrus for have helping me out with the DSP, however we
+ * still dont have sufficient documentation and technical
+ * references to be able to implement all fancy feutures
+ * supported by the cs46xx DPS's.
+ * Benny <benny@hostmobility.com>
+ *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
  * the Free Software Foundation; either version 2 of the License, or
@@ -839,6 +847,8 @@
         char *hwbuf;
         cs46xx_pcm_t *cpcm = snd_magic_cast(cs46xx_pcm_t, substream->runtime->private_data, return -ENXIO);
 
+ snd_assert(runtime->dma_area, return -EINVAL);
+
         hwoffb = hwoff << cpcm->shift;
         bytes = frames << cpcm->shift;
         hwbuf = runtime->dma_area + hwoffb;
@@ -895,6 +905,8 @@
                         cs46xx_dsp_pcm_link(chip,cpcm->pcm_channel);
                 if (substream->runtime->periods != CS46XX_FRAGS)
                         snd_cs46xx_playback_transfer(substream, 0);
+ /* raise playback volume */
+ snd_cs46xx_poke(chip, (cpcm->pcm_channel->pcm_reader_scb->address + 0xE) << 2, 0x80008000);
 #else
                 if (substream->runtime->periods != CS46XX_FRAGS)
                         snd_cs46xx_playback_transfer(substream, 0);
@@ -1028,7 +1040,7 @@
             cpcm->pcm_channel->src_scb->ref_count != 1) {
                 cs46xx_dsp_destroy_pcm_channel (chip,cpcm->pcm_channel);
 
- if ( (cpcm->pcm_channel = cs46xx_dsp_create_pcm_channel (chip,runtime->rate,cpcm)) == NULL) {
+ if ( (cpcm->pcm_channel = cs46xx_dsp_create_pcm_channel (chip, runtime->rate, cpcm, cpcm->hw_addr)) == NULL) {
                         snd_printk(KERN_ERR "cs46xx: failed to re-create virtual PCM channel\n");
                         return -ENXIO;
                 }
@@ -1073,9 +1085,6 @@
         cpcm->appl_ptr = 0;
 
 #ifdef CONFIG_SND_CS46XX_NEW_DSP
- /* playback address */
- snd_cs46xx_poke(chip, (cpcm->pcm_channel->pcm_reader_scb->address + 2) << 2, cpcm->hw_addr);
-
         tmp = snd_cs46xx_peek(chip, (cpcm->pcm_channel->pcm_reader_scb->address) << 2);
         tmp &= ~0x000003ff;
         tmp |= (4 << cpcm->shift) - 1;
@@ -1315,7 +1324,7 @@
 
         cpcm->substream = substream;
 #ifdef CONFIG_SND_CS46XX_NEW_DSP
- cpcm->pcm_channel = cs46xx_dsp_create_pcm_channel (chip,runtime->rate,cpcm);
+ cpcm->pcm_channel = cs46xx_dsp_create_pcm_channel (chip, runtime->rate, cpcm, cpcm->hw_addr);
 
         if (cpcm->pcm_channel == NULL) {
                 snd_printk(KERN_ERR "cs46xx: failed to create virtual PCM channel\n");
@@ -1522,7 +1531,7 @@
         int change = (old != val);
         if (change) {
                 snd_cs46xx_poke(chip, reg, val);
-#ifndef CONFIG_SND_CS46XX_NEW_DSP
+#ifdef 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
@@ -1531,6 +1540,14 @@
                    channel volume.
                 */
                 snd_cs46xx_poke(chip, reg + 4, val);
+
+ /* shadow the SPDIF input volume */
+ if (reg == (ASYNCRX_SCB_ADDR + 0xE) << 2) {
+ /* FIXME: I known this is uggly ...
+ any other suggestion ?
+ */
+ chip->dsp_spos_instance->spdif_input_volume = val;
+ }
 #endif
         }
         return change;
@@ -1579,8 +1596,10 @@
                 break;
         case CS46XX_MIXER_SPDIF_INPUT_ELEMENT:
                 change = chip->dsp_spos_instance->spdif_status_in;
- if (ucontrol->value.integer.value[0] && !change)
+ if (ucontrol->value.integer.value[0] && !change) {
                         cs46xx_dsp_enable_spdif_in(chip);
+ /* restore volume */
+ }
                 else if (change && !ucontrol->value.integer.value[0])
                         cs46xx_dsp_disable_spdif_in(chip);
                 
@@ -1822,7 +1841,7 @@
         .info = snd_mixer_boolean_info,
         .get = snd_cs46xx_iec958_get,
         .put = snd_cs46xx_iec958_put,
- .private_value = CS46XX_MIXER_SPDIF_INPUT_ELEMENT,
+ .private_value = CS46XX_MIXER_SPDIF_INPUT_ELEMENT,
 },
 {
         .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
@@ -2742,12 +2761,14 @@
         snd_cs46xx_poke(chip, BA1_CVOL, 0x80008000);
 
 #ifdef CONFIG_SND_CS46XX_NEW_DSP
+ /* time countdown enable */
+ cs46xx_poke_via_dsp (chip,SP_ASER_COUNTDOWN, 0x80000000);
+
+ /* SPDIF input MASTER ENABLE */
+ cs46xx_poke_via_dsp (chip,SP_SPDIN_CONTROL, 0x800003ff);
+
         /* mute spdif out */
         cs46xx_dsp_disable_spdif_out(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;
@@ -2943,6 +2964,9 @@
         snd_printdd ("initializing Hercules mixer\n");
 
 #ifdef CONFIG_SND_CS46XX_NEW_DSP
+ /* turnon Amplifier and leave it on */
+ chip->amplifier_ctrl(chip, 1);
+
         for (idx = 0 ; idx < sizeof(snd_hercules_controls) /
                      sizeof(snd_hercules_controls[0]) ; idx++) {
                 snd_kcontrol_t *kctl;
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:07:40 2002
+++ b/sound/pci/cs46xx/cs46xx_lib.h Tue Oct 1 17:07:40 2002
@@ -185,7 +185,7 @@
                                                           dsp_scb_descriptor_t * snoop_scb,
                                                           dsp_scb_descriptor_t * parent_scb,
                                                           int scb_child_type);
-pcm_channel_descriptor_t * cs46xx_dsp_create_pcm_channel (cs46xx_t * chip,u32 sample_rate, void * private_data);
+pcm_channel_descriptor_t * cs46xx_dsp_create_pcm_channel (cs46xx_t * chip,u32 sample_rate, void * private_data, u32 hw_dma_addr);
 void cs46xx_dsp_destroy_pcm_channel (cs46xx_t * chip,
                                                            pcm_channel_descriptor_t * pcm_channel);
 void cs46xx_dsp_set_src_sample_rate(cs46xx_t * chip,dsp_scb_descriptor_t * src,
@@ -194,4 +194,6 @@
 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);
+int cs46xx_src_unlink(cs46xx_t *chip,dsp_scb_descriptor_t * src);
+int cs46xx_src_link(cs46xx_t *chip,dsp_scb_descriptor_t * src);
 #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:07:40 2002
+++ b/sound/pci/cs46xx/dsp_spos.c Tue Oct 1 17:07:40 2002
@@ -36,74 +36,6 @@
 #include "cs46xx_lib.h"
 #include "dsp_spos.h"
 
-#if 0
-/* OBSOLETE NOW */
-
-static void handle_goto (cs46xx_t * chip,u32 * hival,u32 * loval,char * format, u32 overlay_begin_address);
-
-typedef struct _dsp_opcode_desc_t {
- u32 hival,loval;
- u32 himask,lomask;
- void (*handler_func)(cs46xx_t * chip,u32 * hival,u32 * loval,char * format, u32 overlay_begin_address);
- char * format;
-} dsp_opcode_desc_t;
-
-/* NOTE: theese opcodes are known needed to be reallocated,
- there may be more. */
-dsp_opcode_desc_t dsp_opcodes[] = {
- { 0x01000,0x02730, 0xFF000,0x07FFF,handle_goto,"goto %s" },
- { 0x01000,0x00730, 0xFF000,0x07FFF,handle_goto,"goto %s after" },
- { 0x01000,0x02630, 0xFF000,0x07FFF,handle_goto,"if (tb) goto %s" },
- { 0x01000,0x00630, 0xFF000,0x07FFF,handle_goto,"if (tb) goto %s after" },
- { 0x01000,0x00530, 0xFF000,0x07FFF,handle_goto,"if (lt) goto %s after" },
- { 0x01000,0x02530, 0xFF000,0x07FFF,handle_goto,"if (lt) goto %s" },
- { 0x01000,0x006B0, 0xFF000,0x07FFF,handle_goto,"if (!tb) goto %s after" },
- { 0x01000,0x026B0, 0xFF000,0x07FFF,handle_goto,"if (!tb) goto %s" },
- { 0x01000,0x00FB0, 0xFF000,0x07FFF,handle_goto,"if (gt) goto %s after" },
- { 0x01000,0x02FB0, 0xFF000,0x07FFF,handle_goto,"if (gt) goto %s" },
- { 0x01000,0x02734, 0xFF000,0x07FFF,NULL,"goto *ind" },
- { 0x01000,0x00734, 0xFF000,0x07FFF,NULL,"goto *ind after" },
- { 0x01000,0x02130, 0xFF000,0x07FFF,handle_goto,"if (N) goto %s" },
- { 0x01000,0x00130, 0xFF000,0x07FFF,handle_goto,"if (N) goto %s after" },
- { 0x01000,0x020F2, 0xFF000,0x07FFF,handle_goto,"tb = Z, if(!Z) goto %s" },
- { 0x01000,0x000F2, 0xFF000,0x07FFF,handle_goto,"tb = Z, if(!Z) goto %s after" },
- { 0x01000,0x04030, 0xFF000,0x07FFF,handle_goto,"if(Z) goto %s" },
- { 0x01000,0x00030, 0xFF000,0x07FFF,handle_goto,"if(Z) goto %s after" },
- { 0x01000,0x020B0, 0xFF000,0x07FFF,handle_goto,"if(!Z) goto %s" },
- { 0x01000,0x000B0, 0xFF000,0x07FFF,handle_goto,"if(!Z) goto %s after" },
- { 0x01000,0x02731, 0xFF000,0x07FFF,handle_goto,"%s();" },
-};
-
-static void handle_goto (cs46xx_t * chip,u32 * hival,u32 * loval,
- char * format, u32 overlay_begin_address)
-{
- u32 address ;
- dsp_spos_instance_t * ins = chip->dsp_spos_instance;
-
- address = (*hival & 0x00FFF) << 5;
- address |= *loval >> 15;
-
- snd_printdd("handle_goto[1]: %05x:%05x addr %04x\n",*hival,*loval,address);
-
- if ( !(address & 0x8000) ) {
- address += (ins->code.offset / 2) - overlay_begin_address;
- } else {
- snd_printdd("handle_goto[1]: ROM symbol not reallocated\n");
- }
-
- *hival &= 0xFF000;
- *loval &= 0x07FFF;
-
- *hival |= ( (address >> 5) & 0x00FFF);
- *loval |= ( (address << 15) & 0xF8000);
-
- address = (*hival & 0x00FFF) << 5;
- address |= *loval >> 15;
-
- snd_printdd("handle_goto:[2] %05x:%05x addr %04x\n",*hival,*loval,address);
-}
-#endif /* #if 0 */
-
 static wide_opcode_t wide_opcodes[] = {
         WIDE_FOR_BEGIN_LOOP,
         WIDE_FOR_BEGIN_LOOP2,
@@ -133,18 +65,6 @@
                 hival = data[i++];
 
                 if (ins->code.offset > 0) {
-#if 0
- /* OBSOLETE NOW */
- for (j = 0;j < sizeof(dsp_opcodes) / sizeof(dsp_opcode_desc_t); ++j) {
- if ( (hival & dsp_opcodes[j].himask) == dsp_opcodes[j].hival &&
- (loval & dsp_opcodes[j].lomask) == dsp_opcodes[j].loval &&
- dsp_opcodes[j].handler_func != NULL) {
- dsp_opcodes[j].handler_func (chip,&hival,&loval,dsp_opcodes[j].format, overlay_begin_address);
- nreallocated ++;
- }
- }
-#endif
-
                         mop_operands = (hival >> 6) & 0x03fff;
                         mop_type = mop_operands >> 10;
       
@@ -337,7 +257,10 @@
 
         /* default SPDIF input sample rate
            to 48000 khz */
- ins->spdif_in_sample_rate = 32000;
+ ins->spdif_in_sample_rate = 48000;
+
+ /* maximize volume */
+ ins->spdif_input_volume = 0x80008000;
 
         return ins;
 }
@@ -655,7 +578,6 @@
 static void cs46xx_dsp_proc_sample_dump_read (snd_info_entry_t *entry, snd_info_buffer_t * buffer)
 {
         cs46xx_t *chip = snd_magic_cast(cs46xx_t, entry->private_data, return);
- /*dsp_spos_instance_t * ins = chip->dsp_spos_instance; */
         int i,col = 0;
         unsigned long dst = chip->region.idx[2].remap_addr;
 
@@ -1370,7 +1292,8 @@
 
         /* create the record mixer SCB */
         record_mix_scb = cs46xx_dsp_create_mix_only_scb(chip,"RecordMixerSCB",
- MIX_SAMPLE_BUF2,0x170,
+ MIX_SAMPLE_BUF2,
+ RECORD_MIXER_SCB_ADDR,
                                                         vari_decimate_scb,
                                                         SCB_ON_PARENT_SUBLIST_SCB);
         ins->record_mixer_scb = record_mix_scb;
@@ -1417,8 +1340,7 @@
                 goto _fail_end;
 
 
- /* the magic snooper */
-
+ /* SPDIF input sampel rate converter */
         src_task_scb = cs46xx_dsp_create_src_task_scb(chip,"SrcTaskSCB_SPDIFI",
                                                       SRC_OUTPUT_BUF1,
                                                       SRC_DELAY_BUF1,SRCTASK_SCB_ADDR,
@@ -1427,6 +1349,8 @@
 
         if (!src_task_scb) goto _fail_end;
 
+ cs46xx_src_unlink(chip,src_task_scb);
+
         /* 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;
@@ -1644,19 +1568,14 @@
 int cs46xx_dsp_enable_spdif_in (cs46xx_t *chip)
 {
         dsp_spos_instance_t * ins = chip->dsp_spos_instance;
+ unsigned int flags;
 
         /* 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,
@@ -1665,21 +1584,24 @@
                                                                 ins->spdif_in_src,
                                                                 SCB_ON_PARENT_SUBLIST_SCB);
 
- if (!ins->asynch_rx_scb)
- return -EINVAL;
-
+ save_flags(flags);
+ cli();
         /* 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);
+ cs46xx_src_link(chip,ins->spdif_in_src);
 
- /* SPDIF input MASTER ENABLE */
- cs46xx_poke_via_dsp (chip,SP_SPDIN_CONTROL, 0x800003ff);
+ /* restore SPDIF input volume */
+ snd_cs46xx_poke(chip, (ASYNCRX_SCB_ADDR + 0xE) << 2, ins->spdif_input_volume);
+ snd_cs46xx_poke(chip, (ASYNCRX_SCB_ADDR + 0xF) << 2, ins->spdif_input_volume);
+ restore_flags(flags);
+
+ /* set SPDIF input sample rate and unmute
+ NOTE: only 48khz support for SPDIF input this time */
+ cs46xx_dsp_set_src_sample_rate(chip,ins->spdif_in_src,48000);
 
         /* monitor state */
         ins->spdif_status_in = 1;
@@ -1692,16 +1614,13 @@
         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);
+ snd_assert (ins->spdif_in_src != NULL,return -EINVAL);
 
         /* Remove the asynchronous receiver SCB */
         cs46xx_dsp_remove_scb (chip,ins->asynch_rx_scb);
         ins->asynch_rx_scb = NULL;
+
+ cs46xx_src_unlink(chip,ins->spdif_in_src);
 
         /* monitor state */
         ins->spdif_status_in = 0;
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:07:40 2002
+++ b/sound/pci/cs46xx/dsp_spos.h Tue Oct 1 17:07:40 2002
@@ -75,10 +75,6 @@
 #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
-
 /* Task stack address */
 #define HFG_STACK 0x066A
 #define FG_STACK 0x066E
@@ -107,6 +103,7 @@
 #define SEC_CODECOUT_SCB_ADDR 0x140
 #define OUTPUTSNOOPII_SCB_ADDR 0x150
 #define PCMSERIALIN_PCM_SCB_ADDR 0x160
+#define RECORD_MIXER_SCB_ADDR 0x170
 
 /* hyperforground SCB's*/
 #define HFG_TREE_SCB 0xBA0
@@ -184,4 +181,3 @@
 
 #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:07:40 2002
+++ b/sound/pci/cs46xx/dsp_spos_scb_lib.c Tue Oct 1 17:07:40 2002
@@ -137,7 +137,7 @@
                                 scb->next_scb_ptr = ins->the_null_scb;
                         }
                 } else {
- snd_assert ( (scb->sub_list_ptr == ins->the_null_scb), return);
+ /* snd_assert ( (scb->sub_list_ptr == ins->the_null_scb), return); */
                         scb->parent_scb_ptr->next_scb_ptr = scb->next_scb_ptr;
 
                         if (scb->next_scb_ptr != ins->the_null_scb) {
@@ -166,6 +166,16 @@
         }
 }
 
+static void _dsp_clear_sample_buffer (cs46xx_t *chip, u32 sample_buffer_addr, int dword_count)
+{
+ u32 dst = chip->region.idx[2].remap_addr + sample_buffer_addr;
+ int i;
+
+ for (i = 0; i < dword_count ; ++i ) {
+ writel(0, dst);
+ }
+}
+
 void cs46xx_dsp_remove_scb (cs46xx_t *chip, dsp_scb_descriptor_t * scb)
 {
         dsp_spos_instance_t * ins = chip->dsp_spos_instance;
@@ -564,9 +574,10 @@
                 /* Fractional increment per output sample in the input sample buffer */
                 0,
                 {
- /* Standard stereo volume control */
- 0x8000,0x8000,
- 0x8000,0x8000
+ /* Standard stereo volume control
+ default muted */
+ 0xffff,0xffff,
+ 0xffff,0xffff
                 }
         };
 
@@ -614,8 +625,8 @@
                 src_buffer_addr << 0x10,
                 0x04000000,
                 {
- 0x8000,0x8000,
- 0x8000,0x8000
+ 0xffff,0xffff,
+ 0xffff,0xffff
                 }
         };
 
@@ -629,6 +640,10 @@
                 }
         }
 
+ /* clear buffers */
+ _dsp_clear_sample_buffer (chip,src_buffer_addr,8);
+ _dsp_clear_sample_buffer (chip,src_delay_buffer_addr,32);
+
         scb = _dsp_create_generic_scb(chip,scb_name,(u32 *)&src_task_scb,
                                       dest,ins->s16_up,parent_scb,
                                       scb_child_type);
@@ -899,8 +914,9 @@
                 /* There is no correct initial value, it will depend upon the detected
                    rate etc */
                 0x18000000,
+ /* Mute stream */
                 0x8000,0x8000,
- 0xFFFF,0xFFFF
+ 0xffff,0xffff
         };
 
         scb = cs46xx_dsp_create_generic_scb(chip,scb_name,(u32 *)&asynch_fg_rx_scb,
@@ -1091,7 +1107,7 @@
 };
 
 
-pcm_channel_descriptor_t * cs46xx_dsp_create_pcm_channel (cs46xx_t * chip,u32 sample_rate, void * private_data)
+pcm_channel_descriptor_t * cs46xx_dsp_create_pcm_channel (cs46xx_t * chip,u32 sample_rate, void * private_data, u32 hw_dma_addr)
 {
         dsp_spos_instance_t * ins = chip->dsp_spos_instance;
         dsp_scb_descriptor_t * src_scb = NULL,* pcm_scb;
@@ -1206,7 +1222,7 @@
                                                    /* 0x200 - 400 PCMreader SCBs */
                                                    (pcm_index * 0x10) + 0x200,
                                                    pcm_index, /* virtual channel 0-31 */
- 0, /* pcm hw addr */
+ hw_dma_addr, /* pcm hw addr */
                                                    pcm_parent_scb,
                                                    insert_point);
 
@@ -1386,11 +1402,15 @@
          */
         spin_lock_irqsave(&chip->reg_lock, flags);
 
+ /* mute SCB */
+ snd_cs46xx_poke(chip, (src->address + 0xE) << 2, 0xffffffff);
         snd_cs46xx_poke(chip, (src->address + SRCCorPerGof) << 2,
           ((correctionPerSec << 16) & 0xFFFF0000) | (correctionPerGOF & 0xFFFF));
 
         snd_cs46xx_poke(chip, (src->address + SRCPhiIncr6Int26Frac) << 2, phiIncr);
 
+ /* raise volume */
+ snd_cs46xx_poke(chip, (src->address + 0xE) << 2, 0x80008000);
         spin_unlock_irqrestore(&chip->reg_lock, flags);
 }
 
@@ -1418,4 +1438,73 @@
                                                            insert_point);
 
         return pcm_input;
+}
+
+int cs46xx_src_unlink(cs46xx_t *chip,dsp_scb_descriptor_t * src)
+{
+ dsp_spos_instance_t * ins = chip->dsp_spos_instance;
+ down(&ins->pcm_mutex);
+ down(&ins->scb_mutex);
+
+ snd_assert (src->parent_scb_ptr != NULL,goto _fail_end);
+
+ /* mute SCB */
+ snd_cs46xx_poke(chip, (src->address + 0xE) << 2, 0xffffffff);
+
+ _dsp_unlink_scb (chip,src);
+
+ up(&ins->scb_mutex);
+ up(&ins->pcm_mutex);
+
+ return 0;
+
+ _fail_end:
+ up(&ins->scb_mutex);
+ up(&ins->pcm_mutex);
+
+ return -EINVAL;
+}
+
+int cs46xx_src_link(cs46xx_t *chip,dsp_scb_descriptor_t * src)
+{
+ dsp_spos_instance_t * ins = chip->dsp_spos_instance;
+ dsp_scb_descriptor_t * parent_scb;
+ unsigned int flags;
+
+ down(&ins->pcm_mutex);
+ down(&ins->scb_mutex);
+
+ snd_assert (src->parent_scb_ptr == NULL,goto _fail_end);
+ snd_assert(ins->master_mix_scb !=NULL,goto _fail_end);
+
+ if (ins->master_mix_scb->sub_list_ptr != ins->the_null_scb) {
+ parent_scb = find_next_free_scb (chip,ins->master_mix_scb->sub_list_ptr);
+ parent_scb->next_scb_ptr = src;
+ } else {
+ parent_scb = ins->master_mix_scb;
+ parent_scb->sub_list_ptr = src;
+ }
+
+ src->parent_scb_ptr = parent_scb;
+
+ /* update entry in DSP RAM */
+ spin_lock_irqsave(&chip->reg_lock, flags);
+ snd_cs46xx_poke(chip,
+ (parent_scb->address + SCBsubListPtr) << 2,
+ (parent_scb->sub_list_ptr->address << 0x10) |
+ (parent_scb->next_scb_ptr->address));
+
+
+ spin_unlock_irqrestore(&chip->reg_lock, flags);
+
+ up(&ins->scb_mutex);
+ up(&ins->pcm_mutex);
+
+ return 0;
+
+ _fail_end:
+ up(&ins->scb_mutex);
+ up(&ins->pcm_mutex);
+
+ return -EINVAL;
 }
diff -Nru a/sound/pci/emu10k1/emufx.c b/sound/pci/emu10k1/emufx.c
--- a/sound/pci/emu10k1/emufx.c Tue Oct 1 17:07:40 2002
+++ b/sound/pci/emu10k1/emufx.c Tue Oct 1 17:07:40 2002
@@ -91,14 +91,14 @@
         /* 0x01 */ "AC97 Right",
         /* 0x02 */ "Audigy CD Left",
         /* 0x03 */ "Audigy CD Right",
- /* 0x04 */ NULL,
- /* 0x05 */ NULL,
+ /* 0x04 */ "Optical IEC958 Left",
+ /* 0x05 */ "Optical IEC958 Right",
         /* 0x06 */ NULL,
         /* 0x07 */ NULL,
         /* 0x08 */ "Line/Mic 2 Left",
         /* 0x09 */ "Line/Mic 2 Right",
- /* 0x0a */ NULL,
- /* 0x0b */ NULL,
+ /* 0x0a */ "SPDIF Left",
+ /* 0x0b */ "SPDIF Right",
         /* 0x0c */ "Aux2 Left",
         /* 0x0d */ "Aux2 Right",
         /* 0x0e */ NULL,
@@ -1313,6 +1313,17 @@
         snd_emu10k1_init_stereo_control(&controls[nctl++], "Audigy CD Capture Volume", gpr, 0);
         gpr += 2;
 
+ /* Optical SPDIF Playback Volume */
+ A_ADD_VOLUME_IN(playback, gpr, A_EXTIN_OPT_SPDIF_L);
+ A_ADD_VOLUME_IN(playback+1, gpr+1, A_EXTIN_OPT_SPDIF_R);
+ snd_emu10k1_init_stereo_control(&controls[nctl++], "Optical IEC958 Playback Volume", gpr, 0);
+ gpr += 2;
+ /* Optical SPDIF Capture Volume */
+ A_ADD_VOLUME_IN(capture, gpr, A_EXTIN_OPT_SPDIF_L);
+ A_ADD_VOLUME_IN(capture+1, gpr+1, A_EXTIN_OPT_SPDIF_R);
+ snd_emu10k1_init_stereo_control(&controls[nctl++], "Optical IEC958 Capture Volume", gpr, 0);
+ gpr += 2;
+
         /* Line2 Playback Volume */
         A_ADD_VOLUME_IN(playback, gpr, A_EXTIN_LINE2_L);
         A_ADD_VOLUME_IN(playback+1, gpr+1, A_EXTIN_LINE2_R);
@@ -1322,6 +1333,17 @@
         A_ADD_VOLUME_IN(capture, gpr, A_EXTIN_LINE2_L);
         A_ADD_VOLUME_IN(capture+1, gpr+1, A_EXTIN_LINE2_R);
         snd_emu10k1_init_stereo_control(&controls[nctl++], "Line2 Capture Volume", gpr, 0);
+ gpr += 2;
+
+ /* RCA SPDIF Playback Volume */
+ A_ADD_VOLUME_IN(playback, gpr, A_EXTIN_RCA_SPDIF_L);
+ A_ADD_VOLUME_IN(playback+1, gpr+1, A_EXTIN_RCA_SPDIF_R);
+ snd_emu10k1_init_stereo_control(&controls[nctl++], "RCA SPDIF Playback Volume", gpr, 0);
+ gpr += 2;
+ /* RCA SPDIF Capture Volume */
+ A_ADD_VOLUME_IN(capture, gpr, A_EXTIN_RCA_SPDIF_L);
+ A_ADD_VOLUME_IN(capture+1, gpr+1, A_EXTIN_RCA_SPDIF_R);
+ snd_emu10k1_init_stereo_control(&controls[nctl++], "RCA SPDIF Capture Volume", gpr, 0);
         gpr += 2;
 
         /* Aux2 Playback Volume */
diff -Nru a/sound/ppc/awacs.c b/sound/ppc/awacs.c
--- a/sound/ppc/awacs.c Tue Oct 1 17:07:40 2002
+++ b/sound/ppc/awacs.c Tue Oct 1 17:07:40 2002
@@ -25,6 +25,7 @@
 #include <asm/nvram.h>
 #include <linux/init.h>
 #include <linux/delay.h>
+#include <linux/slab.h>
 #include <sound/core.h>
 #include "pmac.h"
 
@@ -134,12 +135,20 @@
         pmac_t *chip = snd_kcontrol_chip(kcontrol);
         int reg = kcontrol->private_value & 0xff;
         int lshift = (kcontrol->private_value >> 8) & 0xff;
+ int inverted = (kcontrol->private_value >> 16) & 1;
         unsigned long flags;
+ int vol[2];
 
         spin_lock_irqsave(&chip->reg_lock, flags);
- ucontrol->value.integer.value[0] = 0x0f - ((chip->awacs_reg[reg] >> lshift) & 0xf);
- ucontrol->value.integer.value[1] = 0x0f - (chip->awacs_reg[reg] & 0xf);
+ vol[0] = (chip->awacs_reg[reg] >> lshift) & 0xf;
+ vol[1] = chip->awacs_reg[reg] & 0xf;
         spin_unlock_irqrestore(&chip->reg_lock, flags);
+ if (inverted) {
+ vol[0] = 0x0f - vol[0];
+ vol[1] = 0x0f - vol[1];
+ }
+ ucontrol->value.integer.value[0] = vol[0];
+ ucontrol->value.integer.value[1] = vol[1];
         return 0;
 }
 
@@ -148,14 +157,24 @@
         pmac_t *chip = snd_kcontrol_chip(kcontrol);
         int reg = kcontrol->private_value & 0xff;
         int lshift = (kcontrol->private_value >> 8) & 0xff;
+ int inverted = (kcontrol->private_value >> 16) & 1;
         int val, oldval;
         unsigned long flags;
+ int vol[2];
 
+ vol[0] = ucontrol->value.integer.value[0];
+ vol[1] = ucontrol->value.integer.value[1];
+ if (inverted) {
+ vol[0] = 0x0f - vol[0];
+ vol[1] = 0x0f - vol[1];
+ }
+ vol[0] &= 0x0f;
+ vol[1] &= 0x0f;
         spin_lock_irqsave(&chip->reg_lock, flags);
         oldval = chip->awacs_reg[reg];
         val = oldval & ~(0xf | (0xf << lshift));
- val |= ((0x0f - (ucontrol->value.integer.value[0] & 0xf)) << lshift);
- val |= 0x0f - (ucontrol->value.integer.value[1] & 0xf);
+ val |= vol[0] << lshift;
+ val |= vol[1];
         if (oldval != val)
                 snd_pmac_awacs_write_reg(chip, reg, val);
         spin_unlock_irqrestore(&chip->reg_lock, flags);
@@ -163,12 +182,12 @@
 }
 
 
-#define AWACS_VOLUME(xname, xreg, xshift) \
+#define AWACS_VOLUME(xname, xreg, xshift, xinverted) \
 { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, .index = 0, \
   .info = snd_pmac_awacs_info_volume, \
   .get = snd_pmac_awacs_get_volume, \
   .put = snd_pmac_awacs_put_volume, \
- .private_value = (xreg) | ((xshift) << 8) }
+ .private_value = (xreg) | ((xshift) << 8) | ((xinverted) << 16) }
 
 /*
  * mute master/ogain for AWACS: mono
@@ -539,9 +558,9 @@
  * lists of mixer elements
  */
 static snd_kcontrol_new_t snd_pmac_awacs_mixers[] __initdata = {
- AWACS_VOLUME("Master Playback Volume", 2, 6),
+ AWACS_VOLUME("Master Playback Volume", 2, 6, 1),
         AWACS_SWITCH("Master Capture Switch", 1, SHIFT_LOOPTHRU, 0),
- AWACS_VOLUME("Capture Volume", 0, 4),
+ AWACS_VOLUME("Capture Volume", 0, 4, 0),
         AWACS_SWITCH("Line Capture Switch", 0, SHIFT_MUX_LINE, 0),
         AWACS_SWITCH("CD Capture Switch", 0, SHIFT_MUX_CD, 0),
         AWACS_SWITCH("Mic Capture Switch", 0, SHIFT_MUX_MIC, 0),
@@ -564,7 +583,7 @@
 };
 
 static snd_kcontrol_new_t snd_pmac_awacs_speaker_vol[] __initdata = {
- AWACS_VOLUME("PC Speaker Playback Volume", 4, 6),
+ AWACS_VOLUME("PC Speaker Playback Volume", 4, 6, 1),
 };
 static snd_kcontrol_new_t snd_pmac_awacs_speaker_sw __initdata =
 AWACS_SWITCH("PC Speaker Playback Switch", 1, SHIFT_SPKMUTE, 1);
diff -Nru a/sound/ppc/burgundy.c b/sound/ppc/burgundy.c
--- a/sound/ppc/burgundy.c Tue Oct 1 17:07:40 2002
+++ b/sound/ppc/burgundy.c Tue Oct 1 17:07:40 2002
@@ -22,6 +22,7 @@
 #include <sound/driver.h>
 #include <asm/io.h>
 #include <linux/init.h>
+#include <linux/slab.h>
 #include <sound/core.h>
 #include "pmac.h"
 #include "burgundy.h"
@@ -196,9 +197,10 @@
 
 #define BURGUNDY_VOLUME(xname, xindex, addr, shift) \
 { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, .index = xindex,\
- .info = snd_pmac_burgundy_info_volume,\ .get = snd_pmac_burgundy_get_volume,\
- .put = snd_pmac_burgundy_put_volume,\ .private_value = ((ADDR2BASE(addr) &
- 0xff) | ((shift) << 8)) }
+ .info = snd_pmac_burgundy_info_volume,\
+ .get = snd_pmac_burgundy_get_volume,\
+ .put = snd_pmac_burgundy_put_volume,\
+ .private_value = ((ADDR2BASE(addr) & 0xff) | ((shift) << 8)) }
 
 /* lineout/speaker */
 
diff -Nru a/sound/ppc/daca.c b/sound/ppc/daca.c
--- a/sound/ppc/daca.c Tue Oct 1 17:07:40 2002
+++ b/sound/ppc/daca.c Tue Oct 1 17:07:40 2002
@@ -24,6 +24,7 @@
 #include <linux/i2c.h>
 #include <linux/i2c-dev.h>
 #include <linux/kmod.h>
+#include <linux/slab.h>
 #include <sound/core.h>
 #include "pmac.h"
 
diff -Nru a/sound/ppc/keywest.c b/sound/ppc/keywest.c
--- a/sound/ppc/keywest.c Tue Oct 1 17:07:40 2002
+++ b/sound/ppc/keywest.c Tue Oct 1 17:07:40 2002
@@ -23,6 +23,7 @@
 #include <linux/init.h>
 #include <linux/i2c.h>
 #include <linux/i2c-dev.h>
+#include <linux/slab.h>
 #include <sound/core.h>
 #include "pmac.h"
 
diff -Nru a/sound/ppc/pmac.c b/sound/ppc/pmac.c
--- a/sound/ppc/pmac.c Tue Oct 1 17:07:40 2002
+++ b/sound/ppc/pmac.c Tue Oct 1 17:07:40 2002
@@ -25,6 +25,7 @@
 #include <asm/irq.h>
 #include <linux/init.h>
 #include <linux/delay.h>
+#include <linux/slab.h>
 #include <sound/core.h>
 #include "pmac.h"
 #include <sound/pcm_params.h>
@@ -243,7 +244,10 @@
                 snd_pmac_dma_set_command(rec, &chip->extra_dma);
                 snd_pmac_dma_run(rec, RUN);
         }
- offset = runtime->dma_addr;
+ /* continuous DMA memory type doesn't provide the physical address,
+ * so we need to resolve the address here...
+ */
+ offset = virt_to_bus(runtime->dma_area);
         for (i = 0, cp = rec->cmd.cmds; i < rec->nperiods; i++, cp++) {
                 st_le32(&cp->phy_addr, offset);
                 st_le16(&cp->req_count, rec->period_size);
@@ -650,9 +654,7 @@
 
 static void pmac_pcm_free(snd_pcm_t *pcm)
 {
-#if 0
         snd_pcm_lib_preallocate_free_for_all(pcm);
-#endif
 }
 
 int __init snd_pmac_pcm_new(pmac_t *chip)
@@ -686,10 +688,8 @@
         chip->playback.cur_freqs = chip->freqs_ok;
         chip->capture.cur_freqs = chip->freqs_ok;
 
-#if 0
         /* preallocate 64k buffer */
         snd_pcm_lib_preallocate_pages_for_all(pcm, 64 * 1024, 64 * 1024, GFP_KERNEL);
-#endif
 
         return 0;
 }
diff -Nru a/sound/ppc/tumbler.c b/sound/ppc/tumbler.c
--- a/sound/ppc/tumbler.c Tue Oct 1 17:07:40 2002
+++ b/sound/ppc/tumbler.c Tue Oct 1 17:07:40 2002
@@ -25,6 +25,7 @@
 #include <linux/i2c.h>
 #include <linux/i2c-dev.h>
 #include <linux/kmod.h>
+#include <linux/slab.h>
 #include <sound/core.h>
 #include <asm/io.h>
 #include <asm/irq.h>
diff -Nru a/sound/usb/usbmidi.c b/sound/usb/usbmidi.c
--- a/sound/usb/usbmidi.c Tue Oct 1 17:07:40 2002
+++ b/sound/usb/usbmidi.c Tue Oct 1 17:07:40 2002
@@ -194,7 +194,7 @@
 
 struct usbmidi_out_endpoint {
         usbmidi_t* umidi;
- urb_t* urb;
+ struct urb* urb;
         int max_transfer; /* size of urb buffer */
         struct tasklet_struct tasklet;
 
@@ -214,7 +214,7 @@
 struct usbmidi_in_endpoint {
         usbmidi_t* umidi;
         usbmidi_endpoint_t* ep;
- urb_t* urb;
+ struct urb* urb;
         struct usbmidi_in_port {
                 int seq_port;
                 snd_midi_event_t* midi_event;
@@ -229,7 +229,7 @@
 /*
  * Submits the URB, with error handling.
  */
-static int snd_usbmidi_submit_urb(urb_t* urb, int flags)
+static int snd_usbmidi_submit_urb(struct urb* urb, int flags)
 {
         int err = usb_submit_urb(urb, flags);
         if (err < 0 && err != -ENODEV)
@@ -283,7 +283,7 @@
 /*
  * Processes the data read from the device.
  */
-static void snd_usbmidi_in_urb_complete(urb_t* urb)
+static void snd_usbmidi_in_urb_complete(struct urb* urb)
 {
         usbmidi_in_endpoint_t* ep = snd_magic_cast(usbmidi_in_endpoint_t, urb->context, return);
 
@@ -305,7 +305,7 @@
         }
 }
 
-static void snd_usbmidi_out_urb_complete(urb_t* urb)
+static void snd_usbmidi_out_urb_complete(struct urb* urb)
 {
         usbmidi_out_endpoint_t* ep = snd_magic_cast(usbmidi_out_endpoint_t, urb->context, return);
         unsigned long flags;

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

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

begin 664 bkpatch22972
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
=3O[:R\G[V>1FM5Z>SJ8NK7<T[WX#BID&4G%S````
`
end

-----
Jaroslav Kysela <perex@suse.cz>
Linux Kernel Sound Maintainer
ALSA Project http://www.alsa-project.org
SuSE Linux http://www.suse.com

-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/



This archive was generated by hypermail 2b29 : Mon Oct 07 2002 - 22:00:27 EST