2002-10-01 16:50:05

by Jaroslav Kysela

[permalink] [raw]
Subject: [PATCH] 2nd ALSA update [6/12] - 2002/08/21


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

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


[email protected], 2002-10-01 10:34:42+02:00, [email protected]
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 <[email protected]>
+ *
* 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
M'XL(`#RZF3T``^P\:W/;MK*?I5^!X]Q)Y426"?"M-#Y59+=')[;C\:--I^EP
M*!*T.)9(79+RXUSUO]][email protected]*)>I%RI27,[MVEM2"2P6.Q[@85?D)N4)^W:F"?\
ML?Z"_"M.LW8MG:2\Y?T'OE_&,7P_',0C?BCZ'/;O#H=A-'D\2.-)Y"]^KD/_
M"S?S!N2>)VF[1EMJ\21[&O-V[?+DAYO3SF6]_O8MZ0[<Z)9?\8R\?5O/XN3>
M'?KI=VXV&,91*TO<*!WQS&UY\6A:=)TR16'PGTY-5=&-*344S9QZU*?4U2CW
M%:99AE87B'Z7+V)E-%44JEC4H.94IY:AUH\);1F:311V2)5#A1*JM%6MK;'7
M"FLK"ED"[email protected]^COR>3'NUCW2.;WJD,G8=S-.<-2A8AW";&UX1<@!Z5YI
MQN.C^()?KRZ.>]^3,!I/,A*$CSPMWN`WGXS"-!T/70\^[email protected]#R.=!T<$=C8=A
M$/($NY(@[email protected]/[HB3ZP&'J1/R\:+HF?`@C#B)(Y(-.+GHGI'19)B%'JPNXD,2
M3"(O"^/('8;94X[FR=D-5=[3^62^#[email protected]\'0R'L=))B;L3/SP]HFD8S\,B!='
M61(/TQR"F";TA_R>#U<[email protected](XNB6I!G2"N'[email protected][";$"BF'CN
M<-AWO;N5\>F#,W83=Y221C*)LG#$]\DPSKL=D$[W&]L$='SNK0X<AQ'QN>LO
M]`:&,(NN=)2(C7P^=)]2XD8^`4SB!P3A#;@_`76Y!:Z140R?N1-&839;]D5W
MMHP2XB$[Y5!O.$F!YB0.B-"]PW3H]EN#',K-U3MRUCONY:`6.)D+PR3I.QDY
M.`+B)1,OP^_U]T2G3+'J%W.EK!]L^:]>5URE?I2KB_B-RB>-Q'CL'?8GR2U\
M?FIYN4Y0E=HJ4]2I8NA4F;[email protected]=P/K(`[email protected]%)A68&`&*:J57BT(VC
M(+QMA='R]'3*F*JR:6#JJF*ZGJTHMJ<I9NGTRS#RF6'<5%6HR8J95W#VPD,O
M1>7-&V<8`L,D&C:SF:H9NC6E5#.5J6[8MF4Q3>,^\[email protected];`UQAA38&@,`&Q5(
M3=(^_H">A8MT-!G5]"F8**9,#=?T6!\,I190JMOV-G"0'[@D9E;+1.DB5H2#
M`0S%4*96GQN<VZ9G*8&K^OTMR.*MDD6AJDTW2>IXY'HE4FIIACEU;=<#;Z';
MJFE[[email protected]!47T*;-UA3U#$3`JZV10+-01`[email protected],M,PW2!0^\$F*LRA%$MG
M4X-1T]JT]&[email protected]]YLKYZ`,*LJ66I&E-]W52YS0V_0CK7X!0$,*:Z;ILEQ!=F
MS>>'$D(:^2/W-O1F2C+756KI*NBYRE5-\YFNZ#I7%&\%C8W`9M0`,:<Z6)Y-
MS`!K8(I?CO`))5S1%0HBJKDV#SS7]C7/T[E:R99R>`5_0/%,A=G/FQ$_'3OI
M.$Z=U.LO:LV",6&60:>^95,O\%7/50.F<WU'N`6"UE0S+6VC`/FNYY;HCJG9
MRM0S-:H`.H%M^F#EE4KI60!2B(XV!8MB5^L.#',?7"\MF1PDWYZ"8?>L?J"[
M3.D;:E^KG'P1RH)OH8K.C*K9O3B!\[email protected];.9&;@=M=Q8%.P<-H;*KZBD<]%SC$
M7*OOK\KM)EB%K]&F.C-U^ON%I$0XJ`VFR#9TK6]:/C,LUW[6H*Y`*T3"G&[email protected]
M'#::TSO^],#3K$PJ;/!X=F""?U'[8.BY[?%*OBR#6;"I!D30U0C`$OAH0I4[
MBFWP6.)A=,;8U$?SU`^T/NWK5E^IP*,"6D$.>PKN4M.>,W`YC'7[!DX&#%/@
MZ4'?\WRN60'UZ*JB;()5F#>&2F>52.SR:`PW(9I<QX0IIFI#4.:JG/?[S'-I
M0%5W(R;+L`H.`4T8M=8#D>7!N<<NY&P]/E(0E.=#4&09BFO:KFFP'4`N4`@T
M2=W"W);@!%[email protected];`+L5^-F:K0`[email protected]>8*W].R:IO*5F&
M:C))-R829VLI;69Z9=JL?:FL^=J]<]-!2'H/;DB^S4)HY*P^/VH6>32U$3^=
MMG4S3ZBWR$M;D"`)7?I`#I('\3_D.Q=5/-HA=>J!238)J[_P9<+=<4X^7O?.
MG0\7UXY(])U3D<<ICXJ&[>$KXDI,19I'/HPA*7>'^:;``1GR(".O#C?`NYS!
MTW-X&_\EX>T``1*!J5V"Z66WLXJI6X8I]'L6RSFL`LO^<UC.,"Q1GGD`^*SV
M;!MX;E2?56!SLZ&;#()@L?&TIC]ZN?Z87UE_#$)IFS+`;TE_Q`))!-$^[[email protected]
M!D$R2!JC^!Y>!DD\(NXP=0_D9L0^*I(,NC=JTIQP.ZF2:A.SD"F`Y0!*#@IA
M[&2.`%RKU91'E^[email protected]:=,5NH_"1)PX?\I$31L'"@*([email protected]
MF"(O=)KU"I8Q$+WB2>;PR!_'892MH1`LH#`;$$:;^JOU3R5J47CK9[5BRQAA
MHU*4Q0B4J:[email protected]%&I$TQ;[email protected]=CE2D')`?TB2G$C=F%]@K\/<9MPAK>4:?0:
M8K>V^^,5`>YSE&L1XVR4ZV+M.XCUL4IHO8>_9KSO?CC_OO>#<W5^[!QWKD_(
M'FG\!"AW)K>$`>$TH%>;6D*#R<UU=W]/R,#*/E8)[W?:+:O[[CT??1=-LK05
MA=&=VXJ`X*[email protected]`@JAB88H%/;*#>#JE+.<?WKFT&[email protected]:S-[-P,[email protected]'^
M;J[>H963^X$KTK!"CEV,FZH2O?Y""&`0X\8R[@D_A("#S\<\`B,PVZR/$Y\G
MN$DLD6O!J`'0DKAI.AGA*-PI#E,BI<DG?0[H2[&N0^SS"]G[K[F$[9%_O"5[
MT1XY<.?/`4#Q_-<W.&E4)[C(!+*X^>[@?+U!N""":VENI2CNF%S7RZ+P#<FU
MH4."/]4L394R2=F:4&J5L2W[(D+Y;S>)TZ%[3]X_I7SHDF^7)[email protected]
MK.5R^?UNYR7-YPY*WA.Y_5`JVFO4W<70:1I%4X<-J]=`%!OII"]][,%1/$X/
MCF:K`EDZOSD]W2?_4Z_5<C0/CG"1DU2VT(>`^%[^Z%QTSYRK:["3$`.?G+]!
M^`RFJ?T&GPP=/^$1CX-K=,+DOQLO"WCX:/\-X&6"\B\(<.F&7J40_X'MQ%)!
M?FX[$=P1YFE4DSZ5:JO"K%<$FM#SP/R*)G;1=TE1+CF!$QD9;I66BF$I;781
M16;:*([email protected]=A*A'P"J#RF=?IAECI1C"@UQ'-(0;!MDDF4AK=H5],!YI8)OUU[
M-G+3N[6'0/,)WX>I+4-,;:O$JM<2GDV2B'B"ZF_JOT%`5X7.Y\4#-`LGFDT\
M5Y+&2X1_<`0`G5Q#:K(7J-QS9&I*/.3$<B90,%,3,8YL:MM`ZW3A;??J4F:-
[email protected]`(FJ31`.#D)7SWX/L^F9+&(_GV6_#A^_MR1HNH,*.N0+/#C!\OG<[-
M<>^#<]:[ZC9)O2;^B7RTZ"`3V;/.U7N8OGC:_7#Q\^4/U\W%(?<")9T)(HAF
M>Y16"`#+!Z#+-FMV-K315&UU#%5IH-:/H<#)ZMI4MU5:[email protected]("UKVF6
M%*+8;<5HJW1M`VEV-M]/7(^WMO3;BMEF6ENWE_SV+E4$[XD\W:LTB3-N[&()
M(38";]S3=8P_:[7?"!^F7/C=FD"2O'Y+;-M^,W]P^!88JBCBB5Q(0[XX(@KY
M)Y&?VX2BX0`O?*P++]R333&$*[email protected]%?$R[RM9:-QKA)R38XW",>""@W\U!10
MUZ1^]5SX.078[61ZDS)L.)D&?ZU/#45GNM0+NJ871KE>J#8DP?K7WUJ%\%,M
M:I46BI.:9)SP>PY.!%7E^.H"$"6(#'F`A(%,1I,,A/E0-J(/[email protected]@`>?&*K''*
M-V.'0NQQEP;&AT-.QB`F???.P]$0Y+5R#$"/[email protected]?XM)@^8V75QX_.
M^<E/#N"W!S.D&00:^?200NWEPS<,RJ?]$`V?R+]XXH%:IJME56TBO#@D:/,*
M+$$$&8U#-I9/.8Q=M"U"\>\X'Y,[email protected]&`?!;G/68T?95&[OB5E',)[email protected],),9\
M#ICPX`C6$9#[M"5:_!K-2'6Y19%74_21LWZ3+LR;XY5F\[email protected]?G$($GR-49
MSH)3WAU&&),A9ISD-HYXD_2?B#?D;H+C4$!21)V3!./W_B0((%%I(L`<SH*H
M(+*0&$"FF\Y6<X99+(*+)N,4`PW<BX3H!N36%Z5=I`'<!!O4:K7("TB8PV`?
MMV^P)F23Z5S5W5VLJ(W1!JBV6B?Y5C:2J9!W<LLAIHM'_&'@9F3/#X&:B8>D
MS[B_UX24_A#[BVUSN=^=\[email protected]#M:>/KCC,?=;Y#H6`,$73<0LD.R/D[@_Y",I
M*2!4`^P:`9F`[email protected],XG$QP+B'#[email protected])%E[P-R$:=A/T1!02V'
[email protected]&`$3&Z8(TQ;[email protected]&[email protected]_?..Z>G/[=)[email protected])]P%'`(1`?"P'
MC,>8M%[[email protected]^N\X\=UHCJLD04:Z89),Y&[TP`7F#_A0R"0H8SS#(#=&33(`
MMXK*]\"7X:29V%[email protected]*0ABZ(6H='[L34;PP46UD"SDWB#"$YAE&`D'V>41
M+!%7`?+N`[email protected]"CB#0KY/`C;PG$O`)F`>>KJ`A#[email protected]^9)("UED!Q?7'T#
MRKS<^1V/HB?R;1^;[P9QFHUBR0UT`4?+?<6_>L^2:;8(+].4)UFC2'S]D>N`
M0+FH1,)P'9STSG_LG()O_00#Q8%5K7;X"A0U3/E<O>_C(9`'SV)JM=Q'H]:,
MXSN>N^>&[email protected]<>[email protected]"Y1>IREA]<G`$X140(R6O([email protected]]V<>HG6%<:T%,@3\B
M+%!4L560MS6Q65`"'&*%A:[email protected]$"L,[email protected]*T?+TR0(1_X66PZ(T/[^XJ8#
M(&`:H,S'$!)8`A'9UKXD!B(<8GDX)-KG'!IV5#&-_"39E0Y</WY8T^Q%MB$A
M(47#Q38Z5S^?=R\_.E?==T[G^/ARD2-RZP6!?M_[>';2)CUR%\4/D;0V\/_D
M]A8<(IC:NLQR7)#/&&9.0+!O;WDJ-.B?(G,2$]>0#B!ZLT(D=,[email protected]';[email protected]>R
MCD#5R5%]B_E-'CY2W6*2)A8K9&&2VZF#(Y%DMB"5Y;<\:8EOORB_DI<OR3]D
MBH4KP<&J$&HAU1S-+U^B"TYDY<27;:TU!N>-[!1``:><^&>]CR>S[*]W?G%S
M[9R<GIR=G$/.UV.FIA&CCK,@N\&<`M]]I!N/A(G`R1;4QKD/792<7$RN+IS.
MU0DFD3?GU\<??CJ?*88B%:/0;[email protected]<60A5Z?7)*3\\Z[TY/G)\&AYS#+^?7E
MA]-B#[email protected],,]"DW'_!E7`V8"&[email protected]_IK]!^BA!&SBE87(0GCI<E
MPX6X_=-*Y+Y2;[,Q:M^ITJ<R8J^N](%HW9P"*9C,8NVU8+WBP(H97S>+_<-E
M$+*ZJ3).6J'83C&2AHFFK:,>@D2)BH=7AV1O5N+0.^G:ND5.(0C::\ZZZ&5=
M+C%[email protected]@IA6$214Z!^J*$5(YEF'U%][,0*!E!VV'0`<[+5=;7,S\WH]S0]%!
M2^G\^.'TYNP$M+\Q\XU-<CM.FF7E'[email protected]&5XUZ3<4X;$H*.7`DNMF<]B(-=B"!
M27CLY*QKO)SQ\!>(Y8>O7__:7*/6RC+V<[email protected]$R;X[$U]??E==XQARZ;5
M>[++=HO/!_TI:U]>0\72/Z$4,`VE8.'IDJV=%[?\`:%8J*[email protected])4SE
M"C;(PWS,SK+PS)JK9>&S+KE:#!8\TKQ"N-H3;5N+7.Z!2FN1*<-#2EVUE;+Z
M.Z.MJ!6>QR(']E<^.=?;BM56Y[M$X'[email protected],('D"T*#[email protected]$T?>(->=15Y[5XS&[
M9$T>C&%P.4NA.`*1<%+>FH/^O1>GA%L3Q=WE;FW.AET.[)DI(G19!T*^79SX
M"`T*GO*((Q9)"$`:0NZ[(FY=#BZ/[email protected]@U][email protected]',V%JCR"_L5,P-->CJ9
MU.%C"'[email protected]<!B19M[_`SZ\(;0B,"[)]<402O)$C*(XH'9#W`O`,HU>,
ML&[email protected]!#<:`!<D-_?Y&_HRAN*;WZKUYZ-TM_.`6WN2V=]$33N%N].7'G^
MLDA<S*+P+*Y8Y'-X+]+S.;S??#YRYJ->RI=S)(H'D"N90DK`\Z&[email protected]!^<SDB,
M69T4BC=+;ZB0+D.<2<JF*-K\J=.]RFUUXS%R1V#;'\7QWJ.``^U\59`U4%/F
M[*(A9"U]:[email protected]<537>,RE$W"R\B=S4'B,!^S"DP-QDM^336T)G[TS%SU`B3-C
M36)@OM'$\9H<KZV/7W,)2I-HZ!-PG&'*$PMS?=Q%EUR-N7M7.K=6S+WL5^87
M&S>ZEFTO4E9ZE]*+E,+!,*9;6EEE5K6#T<F!^G_!OVAVY?G<!A>PS31:&RBA
M+5<GX#1#D#723R"5CF;7;<46'TR6W[7%D"1TA^%_Q,XA.AYY8[72\<PYM)/O
MT3;XGF.LXU:A$W!60T7$>M?\5`WO+CJSN64AK'2\S4_8$W>5RSK"\Z5^N.50
MUF^^A9/W6S4!#=QG8N\Z5R<-L><E/8\\P&\L&@74_V4=DE?'-NK/-E?4*G5G
M[8J:T!O=,DVK0F\JBL>^V)\3^%/TYCV1M_(J)5C2:2?I-39([S+3BZMA&_F^
MW3VT2LZ7W$,S5%-<KC4ULX+Y5<56?W7FBZMWE<PO2+43__7?S7]YUWHC\[>Y
MTUW)^K4[W:#TYI2:AJ569&,5?`=G^56/[('OB%Q;59:\V(B/XN1)U)IXN8OZ
MTT1)WHRO%"5)^L^>@1TS3=;90:.)W0P,U*%+/$G)\5EG1A+\\S7$CWD:?9/A
M*>I]Z,M"A?'@*15;2?EY5;->([email protected]>[email protected](,:3A'AX+_O/CK6P%EL<BXA=
[email protected](4N%4[\,D<[(8?&6Z?A"'9S^&CM5QT.BBL6S1V&RY-'7Q!OY&M=CROG^E
M9I3=]P?EL*:Z:NG2*)IKRE%1T?)7-XKR3QQ42G)!JL\NS.MW?-9NP,Z%X7/>
MPMT!Y.)M4D7+_PR3^GMODWYM$?F[Y.GODJ>_?,F3O/V^\<;:FN[N="%3E,_7
M)BHCZX?XS]=IEMBLS_!WE;:&.#-8FH)WA`R]W&!55FE^J9N*?QNLOPW6_Q>#
M)?^>V19%FCM=M*66K.42S4*-EN/SU$O",>@P7J]YMJ!+OA8]L;9%F#]!-$<6
M=]W'H0\O9YM?OINY38*][email protected]^.B/AEM5?O?]N[MMVVC2#Z+'W%[email protected]&K;@1:)(
M"[email protected]@($X")P$"5`7!ZN(0EAR#HA(U2/X]<V:7Y/(F2TH;HX7TH(4H[NQU
M9F>&9X9VX`F'PWW:/JJI53()U[>D$MYHC7/;++\G?U5'[email protected][TVW4:X7
M:81VD.K[93#:DYHFSTFX^@'+\T%[email protected]];'J?V2:!;1]C]4:0?1?KWB'29/.P^
MD5ZP[D&9$P+A^0#I(GB??O8M3J5`11]/>%<%MC34!+0X%7V?`YC&[!=:1IMX
M&7\NX4%+E4O`U`*HS#X;'"[email protected]:$K4<)#A3+%Y_+B7?CZZ>6KY^?A;V^?.5E$
M8.?J_/>75V<9C%1A;P%FZSOJ&;_#H.<*Q!,CH-W#(R#>Y:>E"3J+"DC<TVDX
M+2#+\3N-5C<0Z!+A;7OL&^ODD:$X*>:+Z'K%SX('CAAPR2XHV_,XEM+VAA8#
MRJ./LY!O-OB;XT,7L<'X96\X4/>R95`[9="?RL+PD4(U?9L'[_D.GL5K,-T6
M*',+`'T;J-D4+>N:(8QVI?=L!WJJ^Y6IDEL.+L'JVF8,6L1J=(&K?O'RS?D)
MR1([email protected]_YOWG$II3I\'`;`8=:_!?YJ][email protected]#+0IC]'(#O!0/AP<*S&&I1
M1!$`RE"IAE010,Z;[email protected]"U`?J<]RZ.9LVPW;]8A>K<=^\;GO2TS2,@>NHYX)U
MB[%%P[`?^!'!4;TXJA?_??6"\RGNK%X<9"\.?01!D'S00%&-AS=&:6U(UL'&
M'-9RB;3FX-U#DNV;$/A`NKEDLY%1VI&I(.L91OQFR18\-!3U*-J.HNU_(-J0
MB7M7T58P\$$N,6DRR4)&Q^FJGC`X8G.U1A.K-+Q+$\&/(DEIHT&'M^O%@LV*
M+)*T-Y(6"9D,MM5%HJ9X(OUATIV&N<T443F?HNIZ$IH_3=["#C.3C93IIP\)
MJ>F(JNL)Y+#[email protected];D]DUT`WQ=/.'\^<O-.71'5<GM;U.<Z0PQ`CVZ':@
M4!LQ3+R1("&CMR5&XLF36$CP[J<D3F<+PS+1,#3]KU0;B7L8-^H"-QK``.79
M?)W2;HD2[$#$*V0&C!(A*G:2^#FB?<ZQVE,9C]@!+&X^-U51NT*VI\U87\_V
MI<EY7X4+S[4S)`26(=O/W-Z6U<E,2'TM?`Q[ASJ<ZJ-4TW6D"1I8,K"7>G.)
ML'[email protected]].0LL-J9E41LV'<=]&1K,Y4.[<:E##BL(%ZK,T_YH=YE(<$N-TS6&
[email protected]><7U?1:UQ8#XI$]OL6IK.UM#IN?JPQ>4&KB(KH[?O-YFWD=:BLB_80>$%
M>9*J[_%[email protected]=KL<#\+_W(N;EV!VT[1-,:CUD$83TQ=YM>^3K:S*Z/R\8KC_4N
M2NC$XJY!HF7FZ_4'[email protected]?">10OD',U-];_P=49*ZZ1TX4.%,PB_U[?-8RAN*J/
M>)QG#V-75M'SDP/)*+M]U+3`/VYYFXD62S9J]EN-_XV=<=JV,_2T"DQXR>$(
MR#+,J_KHM'5'R6B06I7**?NHZ93EXZ?H(LTCJ4O3\':V23EOHK:A[FV!LS,5
MM'[^E:GD`\<J\M&6IX,JM=M`ODJOK#1D]'C6FV:ZM,*2\=0;T^AJ\C=T;2AD
M5T\O)1_J.1WADC0>YPH`7S=%[IULY%D(:D/O;\&]Q.O4^>?4]U<T3Y*/:[?K
MPRLJT[UD"%H]\:5609_?O$*/@_IY4C`@[email protected],I[V#XJ:"P_7EB(NK`H;-W2
M&Z/:;-L#7D^U#QVDG+:^6/[0MYJ\<MZ)U6*[/C1P-P!PUPY.K,QTW?9>-XYL
MY%=P-9H)I;DYR"P(.`!*%IVBW9_P->J>.3;_+XNF_UT.W)*%[email protected]*RM)999G-B
MH&6<AE3!J!`P"[FNY<OD0K<H=&[email protected]'9HF6B/2W])9E2*1<2U^^"^+-C)(S[Z=
=3O[:R\G[V>1FM5Z>SJ8NK7<T[WX#BID&4G%S````
`
end

-----
Jaroslav Kysela <[email protected]>
Linux Kernel Sound Maintainer
ALSA Project http://www.alsa-project.org
SuSE Linux http://www.suse.com