[PATCH] ALSA update [4/10] - 2002/07/14

From: Jaroslav Kysela (perex@suse.cz)
Date: Sun Sep 29 2002 - 13:33:24 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.605.2.15, 2002-09-25 16:23:23+02:00, perex@pnote.perex-int.cz
  ALSA update 2002/07/14:
    - seq_virmidi - exported snd_virmidi_receive() for processing the incoming events from the event handler of a remote virmidi port.
    - pcm_lib.c - fixed wrong spinlock
    - AC'97 code
      - added VIA codecs, fixed order
      - added S/PDIF support for Conexant CX20468
    - ALI5451 - fixed wrong spinlock
    - ES1968 - fixed wrong mutex
    - ICE1712 - fixed SMP dead-lock
    - HDSP driver update
    - RME9652 - fixed wrong spinlock

 include/sound/info.h | 4 -
 include/sound/seq_virmidi.h | 8 +-
 include/sound/version.h | 2
 sound/core/pcm_lib.c | 2
 sound/core/seq/seq_virmidi.c | 34 ++++++++---
 sound/pci/ac97/ac97_codec.c | 13 ++--
 sound/pci/ali5451/ali5451.c | 4 +
 sound/pci/es1968.c | 4 +
 sound/pci/ice1712.c | 10 ++-
 sound/pci/rme9652/digiface_firmware.dat | 2
 sound/pci/rme9652/hdsp.c | 91 ++++++++++++++++++++-----------
 sound/pci/rme9652/multiface_firmware.dat | 2
 sound/pci/rme9652/rme9652.c | 1
 13 files changed, 117 insertions(+), 60 deletions(-)

diff -Nru a/include/sound/info.h b/include/sound/info.h
--- a/include/sound/info.h Sun Sep 29 20:20:47 2002
+++ b/include/sound/info.h Sun Sep 29 20:20:47 2002
@@ -151,8 +151,8 @@
 
 static inline int snd_info_get_line(snd_info_buffer_t * buffer, char *line, int len) { return 0; }
 static inline char *snd_info_get_str(char *dest, char *src, int len) { return NULL; }
-static inline snd_info_entry_t *snd_info_create_module_entry(struct module * module, const char *name, snd_info_entry_t *parent) { return NULL; }
-static inline snd_info_entry_t *snd_info_create_card_entry(snd_card_t * card, const char *name, snd_info_entry_t *parent) { return NULL; }
+static inline snd_info_entry_t *snd_info_create_module_entry(struct module * module, const char *name, snd_info_entry_t * parent) { return NULL; }
+static inline snd_info_entry_t *snd_info_create_card_entry(snd_card_t * card, const char *name, snd_info_entry_t * parent) { return NULL; }
 static inline void snd_info_free_entry(snd_info_entry_t * entry) { ; }
 static inline snd_info_entry_t *snd_info_create_device(const char *name,
                                                        unsigned int number,
diff -Nru a/include/sound/seq_virmidi.h b/include/sound/seq_virmidi.h
--- a/include/sound/seq_virmidi.h Sun Sep 29 20:20:47 2002
+++ b/include/sound/seq_virmidi.h Sun Sep 29 20:20:47 2002
@@ -45,7 +45,7 @@
         snd_rawmidi_substream_t *substream;
 } snd_virmidi_t;
 
-#define SNDRV_VIRMIDI_SUBSCRIBE (1<<0)
+#define SNDRV_VIRMIDI_SUBSCRIBE (1<<0)
 #define SNDRV_VIRMIDI_USE (1<<1)
 
 /*
@@ -69,14 +69,16 @@
  * ATTACH = input/output events from midi device are routed to the
  * attached sequencer port. sequencer port is not created
  * by virmidi itself.
+ * the input to rawmidi must be processed by passing the
+ * incoming events via snd_virmidi_receive()
  * DISPATCH = input/output events are routed to subscribers.
  * sequencer port is created in virmidi.
  */
 #define SNDRV_VIRMIDI_SEQ_NONE 0
-#define SNDRV_VIRMIDI_SEQ_ATTACH 1
+#define SNDRV_VIRMIDI_SEQ_ATTACH 1
 #define SNDRV_VIRMIDI_SEQ_DISPATCH 2
 
 int snd_virmidi_new(snd_card_t *card, int device, snd_rawmidi_t **rrmidi);
+int snd_virmidi_receive(snd_rawmidi_t *rmidi, snd_seq_event_t *ev);
 
 #endif /* __SOUND_SEQ_VIRMIDI */
-
diff -Nru a/include/sound/version.h b/include/sound/version.h
--- a/include/sound/version.h Sun Sep 29 20:20:47 2002
+++ b/include/sound/version.h Sun Sep 29 20:20:47 2002
@@ -1,3 +1,3 @@
 /* include/version.h. Generated automatically by configure. */
 #define CONFIG_SND_VERSION "0.9.0rc2"
-#define CONFIG_SND_DATE " (Wed Jul 03 16:51:35 2002 UTC)"
+#define CONFIG_SND_DATE " (Sun Jul 14 21:30:57 2002 UTC)"
diff -Nru a/sound/core/pcm_lib.c b/sound/core/pcm_lib.c
--- a/sound/core/pcm_lib.c Sun Sep 29 20:20:47 2002
+++ b/sound/core/pcm_lib.c Sun Sep 29 20:20:47 2002
@@ -1899,7 +1899,7 @@
                         frames = cont;
                 if (frames == 0 && runtime->status->state == SNDRV_PCM_STATE_PAUSED) {
                         err = -EPIPE;
- goto _end;
+ goto _end_unlock;
                 }
                 snd_assert(frames != 0,
                            spin_unlock_irq(&runtime->lock);
diff -Nru a/sound/core/seq/seq_virmidi.c b/sound/core/seq/seq_virmidi.c
--- a/sound/core/seq/seq_virmidi.c Sun Sep 29 20:20:47 2002
+++ b/sound/core/seq/seq_virmidi.c Sun Sep 29 20:20:47 2002
@@ -89,11 +89,6 @@
         unsigned char msg[4];
         int len;
 
- snd_assert(rdev != NULL, return -EINVAL);
-
- if (!(rdev->flags & SNDRV_VIRMIDI_USE))
- return 0; /* ignored */
-
         read_lock(&rdev->filelist_lock);
         list_for_each(list, &rdev->filelist) {
                 vmidi = list_entry(list, snd_virmidi_t, list);
@@ -115,14 +110,32 @@
 }
 
 /*
- * event_input callback from sequencer
+ * receive an event from the remote virmidi port
+ *
+ * for rawmidi inputs, you can call this function from the event
+ * handler of a remote port which is attached to the virmidi via
+ * SNDRV_VIRMIDI_SEQ_ATTACH.
+ */
+/* exported */
+int snd_virmidi_receive(snd_rawmidi_t *rmidi, snd_seq_event_t *ev)
+{
+ snd_virmidi_dev_t *rdev;
+
+ rdev = snd_magic_cast(snd_virmidi_dev_t, rmidi->private_data, return -EINVAL);
+ return snd_virmidi_dev_receive_event(rdev, ev);
+}
+
+/*
+ * event handler of virmidi port
  */
-int snd_virmidi_receive(snd_seq_event_t *ev, int direct,
- void *private_data, int atomic, int hop)
+static int snd_virmidi_event_input(snd_seq_event_t *ev, int direct,
+ void *private_data, int atomic, int hop)
 {
         snd_virmidi_dev_t *rdev;
 
         rdev = snd_magic_cast(snd_virmidi_dev_t, private_data, return -EINVAL);
+ if (!(rdev->flags & SNDRV_VIRMIDI_USE))
+ return 0; /* ignored */
         return snd_virmidi_dev_receive_event(rdev, ev);
 }
 
@@ -387,7 +400,7 @@
         pcallbacks.unsubscribe = snd_virmidi_unsubscribe;
         pcallbacks.use = snd_virmidi_use;
         pcallbacks.unuse = snd_virmidi_unuse;
- pcallbacks.event_input = snd_virmidi_receive;
+ pcallbacks.event_input = snd_virmidi_event_input;
         pinfo.kernel = &pcallbacks;
         err = snd_seq_kernel_client_ctl(client, SNDRV_SEQ_IOCTL_CREATE_PORT, &pinfo);
         if (err < 0) {
@@ -470,7 +483,9 @@
 
 /*
  * create a new device
+ *
  */
+/* exported */
 int snd_virmidi_new(snd_card_t *card, int device, snd_rawmidi_t **rrmidi)
 {
         snd_rawmidi_t *rmidi;
@@ -525,3 +540,4 @@
 module_exit(alsa_virmidi_exit)
 
 EXPORT_SYMBOL(snd_virmidi_new);
+EXPORT_SYMBOL(snd_virmidi_receive);
diff -Nru a/sound/pci/ac97/ac97_codec.c b/sound/pci/ac97/ac97_codec.c
--- a/sound/pci/ac97/ac97_codec.c Sun Sep 29 20:20:47 2002
+++ b/sound/pci/ac97/ac97_codec.c Sun Sep 29 20:20:47 2002
@@ -79,17 +79,19 @@
 { 0x414c4300, 0xffffff00, "Realtek", NULL },
 { 0x414c4700, 0xffffff00, "Avance Logic", NULL },
 { 0x43525900, 0xffffff00, "Cirrus Logic", NULL },
+{ 0x43585400, 0xffffff00, "Conexant", NULL },
+{ 0x45838300, 0xffffff00, "ESS Technology", NULL },
 { 0x48525300, 0xffffff00, "Intersil", NULL },
 { 0x49434500, 0xffffff00, "ICEnsemble", NULL },
 { 0x4e534300, 0xffffff00, "National Semiconductor", NULL },
 { 0x53494c00, 0xffffff00, "Silicon Laboratory", NULL },
 { 0x54524100, 0xffffff00, "TriTech", NULL },
 { 0x54584e00, 0xffffff00, "Texas Instruments", NULL },
+{ 0x56494100, 0xffffff00, "VIA Technologies", NULL },
 { 0x57454300, 0xffffff00, "Winbond", NULL },
 { 0x574d4c00, 0xffffff00, "Wolfson", NULL },
 { 0x594d4800, 0xffffff00, "Yamaha", NULL },
 { 0x83847600, 0xffffff00, "SigmaTel", NULL },
-{ 0x45838300, 0xffffff00, "ESS Technology", NULL },
 { 0, 0, NULL, NULL }
 };
 
@@ -115,12 +117,14 @@
 { 0x414c4750, 0xfffffff0, "ALC250", NULL },
 { 0x43525900, 0xfffffff8, "CS4297", NULL },
 { 0x43525910, 0xfffffff8, "CS4297A", patch_cirrus_spdif },
-{ 0x42525920, 0xfffffff8, "CS4294/4298", NULL },
-{ 0x42525928, 0xfffffff8, "CS4294", NULL },
+{ 0x43525920, 0xfffffff8, "CS4294/4298", NULL },
+{ 0x43525928, 0xfffffff8, "CS4294", NULL },
 { 0x43525930, 0xfffffff8, "CS4299", patch_cirrus_cs4299 },
 { 0x43525948, 0xfffffff8, "CS4201", NULL },
 { 0x43525958, 0xfffffff8, "CS4205", patch_cirrus_spdif },
 { 0x43525960, 0xfffffff8, "CS4291", NULL },
+{ 0x43585429, 0xffffffff, "Cx20468", patch_conexant },
+{ 0x45838308, 0xffffffff, "ESS1988", NULL },
 { 0x48525300, 0xffffff00, "HMP9701", NULL },
 { 0x49434501, 0xffffffff, "ICE1230", NULL },
 { 0x49434511, 0xffffffff, "ICE1232", NULL }, // alias VIA VT1611A?
@@ -131,6 +135,7 @@
 { 0x54524108, 0xffffffff, "TR28028", patch_tritech_tr28028 }, // added by xin jin [07/09/99]
 { 0x54524123, 0xffffffff, "TR28602", NULL }, // only guess --jk [TR28023 = eMicro EM28023 (new CT1297)]
 { 0x54584e20, 0xffffffff, "TLC320AD9xC", NULL },
+{ 0x56494161, 0xffffffff, "VIA1612A", NULL }, // modified ICE1232 with S/PDIF
 { 0x57454301, 0xffffffff, "W83971D", NULL },
 { 0x574d4c00, 0xffffffff, "WM9701A", patch_wolfson00 },
 { 0x574d4c03, 0xffffffff, "WM9703/9707", patch_wolfson03 },
@@ -143,8 +148,6 @@
 { 0x83847609, 0xffffffff, "STAC9721/23", patch_sigmatel_stac9721 },
 { 0x83847644, 0xffffffff, "STAC9744", patch_sigmatel_stac9744 },
 { 0x83847656, 0xffffffff, "STAC9756/57", patch_sigmatel_stac9756 },
-{ 0x45838308, 0xffffffff, "ESS1988", NULL },
-{ 0x43585429, 0xffffffff, "Cx20468", patch_conexant },
 { 0, 0, NULL, NULL }
 };
 
diff -Nru a/sound/pci/ali5451/ali5451.c b/sound/pci/ali5451/ali5451.c
--- a/sound/pci/ali5451/ali5451.c Sun Sep 29 20:20:47 2002
+++ b/sound/pci/ali5451/ali5451.c Sun Sep 29 20:20:47 2002
@@ -1440,8 +1440,10 @@
 
                 unsigned int rate;
                 
- if (codec->revision != ALI_5451_V02)
+ if (codec->revision != ALI_5451_V02) {
+ spin_unlock_irqrestore(&codec->reg_lock, flags);
                         return -1;
+ }
                 rate = snd_ali_get_spdif_in_rate(codec);
                 if (rate == 0) {
                         snd_printk("ali_capture_preapre: spdif rate detect err!\n");
diff -Nru a/sound/pci/es1968.c b/sound/pci/es1968.c
--- a/sound/pci/es1968.c Sun Sep 29 20:20:47 2002
+++ b/sound/pci/es1968.c Sun Sep 29 20:20:47 2002
@@ -1446,8 +1446,10 @@
 __found:
         if (buf->size > size) {
                 esm_memory_t *chunk = kmalloc(sizeof(*chunk), GFP_KERNEL);
- if (chunk == NULL)
+ if (chunk == NULL) {
+ up(&chip->memory_mutex);
                         return NULL;
+ }
                 chunk->size = buf->size - size;
                 chunk->buf = buf->buf + size;
                 chunk->addr = buf->addr + size;
diff -Nru a/sound/pci/ice1712.c b/sound/pci/ice1712.c
--- a/sound/pci/ice1712.c Sun Sep 29 20:20:47 2002
+++ b/sound/pci/ice1712.c Sun Sep 29 20:20:47 2002
@@ -1142,6 +1142,8 @@
 {
         unsigned char reg[2] = { 0x80 | 4, 0 }; /* CS8427 auto increment | register number 4 + data */
         unsigned char val, nval;
+ int res = 0;
+
         snd_i2c_lock(ice->i2c);
         if (snd_i2c_sendbytes(ice->cs8427, reg, 1) != 1) {
                 snd_i2c_unlock(ice->i2c);
@@ -1159,13 +1161,13 @@
         if (val != nval) {
                 reg[1] = nval;
                 if (snd_i2c_sendbytes(ice->cs8427, reg, 2) != 2) {
- snd_i2c_unlock(ice->i2c);
- return -EREMOTE;
+ res = -EREMOTE;
+ } else {
+ res++;
                 }
- return 1;
         }
         snd_i2c_unlock(ice->i2c);
- return 0;
+ return res;
 }
 
 /*
diff -Nru a/sound/pci/rme9652/digiface_firmware.dat b/sound/pci/rme9652/digiface_firmware.dat
--- a/sound/pci/rme9652/digiface_firmware.dat Sun Sep 29 20:20:47 2002
+++ b/sound/pci/rme9652/digiface_firmware.dat Sun Sep 29 20:20:47 2002
@@ -1,5 +1,5 @@
 /* stored in little-endian */
-static u32 digiface_firmware[97652] __devinitdata = {
+static u32 digiface_firmware[24413] __devinitdata = {
 0xffffffff, 0x66aa9955, 0x8001000c, 0xe0000000, 0x8006800c, 0xb0000000,
 0x8004800c, 0xb4fc0100, 0x8003000c, 0x00000000, 0x8001000c, 0x90000000,
 0x8004000c, 0x00000000, 0x8001000c, 0x80000000, 0x0002000c, 0x581a000a,
diff -Nru a/sound/pci/rme9652/hdsp.c b/sound/pci/rme9652/hdsp.c
--- a/sound/pci/rme9652/hdsp.c Sun Sep 29 20:20:47 2002
+++ b/sound/pci/rme9652/hdsp.c Sun Sep 29 20:20:47 2002
@@ -42,6 +42,8 @@
 static char *snd_id[SNDRV_CARDS] = SNDRV_DEFAULT_STR; /* ID for this card */
 static int snd_enable[SNDRV_CARDS] = SNDRV_DEFAULT_ENABLE_PNP; /* Enable this card */
 static int snd_precise_ptr[SNDRV_CARDS] = { [0 ... (SNDRV_CARDS-1)] = 0 }; /* Enable precise pointer */
+static int snd_line_outs_monitor[SNDRV_CARDS] = { [0 ... (SNDRV_CARDS-1)] = 0}; /* Send all inputs/playback to line outs */
+static int snd_force_firmware[SNDRV_CARDS] = { [0 ... (SNDRV_CARDS-1)] = 0}; /* Force firmware reload */
 
 MODULE_PARM(snd_index, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
 MODULE_PARM_DESC(snd_index, "Index value for RME Hammerfall DSP interface.");
@@ -55,8 +57,14 @@
 MODULE_PARM(snd_precise_ptr, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
 MODULE_PARM_DESC(snd_precise_ptr, "Enable precise pointer (doesn't work reliably).");
 MODULE_PARM_SYNTAX(snd_precise_ptr, SNDRV_ENABLED "," SNDRV_BOOLEAN_FALSE_DESC);
+MODULE_PARM(snd_line_outs_monitor,"1-" __MODULE_STRING(SNDRV_CARDS) "i");
+MODULE_PARM_DESC(snd_line_outs_monitor, "Send all input and playback streams to line outs by default.");
+MODULE_PARM_SYNTAX(snd_line_outs_monitor, SNDRV_ENABLED "," SNDRV_BOOLEAN_FALSE_DESC);
+MODULE_PARM(snd_force_firmware,"1-" __MODULE_STRING(SNDRV_CARDS) "i");
+MODULE_PARM_DESC(snd_force_firmware, "Force a reload of the I/O box firmware");
+MODULE_PARM_SYNTAX(snd_force_firmware, SNDRV_ENABLED "," SNDRV_BOOLEAN_FALSE_DESC);
 MODULE_AUTHOR("Paul Davis <pbd@op.net>");
-MODULE_DESCRIPTION("RME Hammerfall DDSP");
+MODULE_DESCRIPTION("RME Hammerfall DSP");
 MODULE_LICENSE("GPL");
 MODULE_CLASSES("{sound}");
 MODULE_DEVICES("{{RME,Hammerfall-DSP},");
@@ -2190,6 +2198,25 @@
         for (i = 0; i < 2048; i++)
                 hdsp_write_gain (hdsp, i, MINUS_INFINITY_GAIN);
 
+ if (snd_line_outs_monitor[hdsp->dev]) {
+
+ snd_printk ("sending all inputs and playback streams to line outs.\n");
+
+ /* route all inputs to the line outs for easy monitoring. send
+ odd numbered channels to right, even to left.
+ */
+
+ for (i = 0; i < HDSP_MAX_CHANNELS; i++) {
+ if (i & 1) {
+ hdsp_write_gain (hdsp, INPUT_TO_OUTPUT_KEY (i, 26), UNITY_GAIN);
+ hdsp_write_gain (hdsp, PLAYBACK_TO_OUTPUT_KEY (i, 26), UNITY_GAIN);
+ } else {
+ hdsp_write_gain (hdsp, INPUT_TO_OUTPUT_KEY (i, 27), UNITY_GAIN);
+ hdsp_write_gain (hdsp, PLAYBACK_TO_OUTPUT_KEY (i, 27), UNITY_GAIN);
+ }
+ }
+ }
+
         hdsp->passthru = 0;
 
         /* set a default rate so that the channel map is set up.
@@ -2812,7 +2839,6 @@
 static int __devinit snd_hdsp_initialize_firmware (hdsp_t *hdsp)
 {
         int i;
- int status_reg;
         u32 *firmware_ptr;
 
         if (hdsp_check_for_iobox (hdsp)) {
@@ -2830,52 +2856,33 @@
                 hdsp_write (hdsp, HDSP_outputEnable + (4 * i), 1);
         }
 
- status_reg = hdsp_read (hdsp, HDSP_statusRegister);
+ if (snd_force_firmware[hdsp->dev] || (hdsp_read (hdsp, HDSP_statusRegister) & HDSP_DllError) != 0) {
 
- if ((status_reg & HDSP_DllError) == 0) {
-
- /* i/o box is connected, firmware already loaded */
-
- if (hdsp_read (hdsp, HDSP_status2Register) & HDSP_version1) {
- hdsp->type = Multiface;
- hdsp->card_name = "RME Hammerfall DSP (Multiface)";
- hdsp->ss_channels = MULTIFACE_SS_CHANNELS;
- hdsp->ds_channels = MULTIFACE_DS_CHANNELS;
- } else {
- hdsp->type = Digiface;
- hdsp->card_name = "RME Hammerfall DSP (Digiface)";
- hdsp->ss_channels = DIGIFACE_SS_CHANNELS;
- hdsp->ds_channels = DIGIFACE_DS_CHANNELS;
- }
-
- } else {
+ snd_printk ("loading firmware\n");
 
- /* firmware not loaded, but i/o box is connected */
-
                 hdsp_write (hdsp, HDSP_jtagReg, HDSP_PROGRAM);
                 hdsp_write (hdsp, HDSP_fifoData, 0);
- hdsp_fifo_wait (hdsp, 0, HDSP_SHORT_WAIT);
+ if (hdsp_fifo_wait (hdsp, 0, HDSP_SHORT_WAIT) < 0) {
+ snd_printk ("timeout waiting for firmware setup\n");
+ return -EIO;
+ }
 
                 hdsp_write (hdsp, HDSP_jtagReg, HDSP_S_LOAD);
                 hdsp_write (hdsp, HDSP_fifoData, 0);
 
- if (hdsp_fifo_wait (hdsp, 0, HDSP_SHORT_WAIT) < 0) {
- printk ("looks like a multiface\n");
+ if (hdsp_fifo_wait (hdsp, 0, HDSP_SHORT_WAIT)) {
                         hdsp->type = Multiface;
- hdsp->card_name = "RME Hammerfall DSP (Multiface)";
                         hdsp_write (hdsp, HDSP_jtagReg, HDSP_VERSION_BIT);
                         hdsp_write (hdsp, HDSP_jtagReg, HDSP_S_LOAD);
                         hdsp_fifo_wait (hdsp, 0, HDSP_SHORT_WAIT);
                 } else {
- printk ("looks like a digiface\n");
                         hdsp->type = Digiface;
- hdsp->card_name = "RME Hammerfall DSP (Digiface)";
                 }
 
                 hdsp_write (hdsp, HDSP_jtagReg, HDSP_S_PROGRAM);
                 hdsp_write (hdsp, HDSP_fifoData, 0);
                 
- if (hdsp_fifo_wait (hdsp, 0, HDSP_LONG_WAIT) < 0) {
+ if (hdsp_fifo_wait (hdsp, 0, HDSP_LONG_WAIT)) {
                         snd_printk ("timeout waiting for download preparation\n");
                         return -EIO;
                 }
@@ -2883,9 +2890,9 @@
                 hdsp_write (hdsp, HDSP_jtagReg, HDSP_S_LOAD);
                 
                 if (hdsp->type == Digiface) {
- firmware_ptr = digiface_firmware;
+ firmware_ptr = (u32 *) digiface_firmware;
                 } else {
- firmware_ptr = multiface_firmware;
+ firmware_ptr = (u32 *) multiface_firmware;
                 }
                 
                 for (i = 0; i < 24413; ++i) {
@@ -2901,8 +2908,30 @@
                         return -EIO;
                 }
 
+ } else {
+
+ /* firmware already loaded, but we need to know what type
+ of I/O box is connected.
+ */
+
+ if (hdsp_read(hdsp, HDSP_status2Register) & HDSP_version1) {
+ hdsp->type = Multiface;
+ } else {
+ hdsp->type = Digiface;
+ }
         }
 
+ if (hdsp->type == Digiface) {
+ snd_printk ("I/O Box is a Digiface\n");
+ hdsp->card_name = "RME Hammerfall DSP (Digiface)";
+ hdsp->ss_channels = DIGIFACE_SS_CHANNELS;
+ hdsp->ds_channels = DIGIFACE_DS_CHANNELS;
+ } else {
+ snd_printk ("I/O Box is a Multiface\n");
+ hdsp->card_name = "RME Hammerfall DSP (Multiface)";
+ hdsp->ss_channels = MULTIFACE_SS_CHANNELS;
+ hdsp->ds_channels = MULTIFACE_DS_CHANNELS;
+ }
         
         snd_hdsp_flush_midi_input (hdsp, 0);
         snd_hdsp_flush_midi_input (hdsp, 1);
diff -Nru a/sound/pci/rme9652/multiface_firmware.dat b/sound/pci/rme9652/multiface_firmware.dat
--- a/sound/pci/rme9652/multiface_firmware.dat Sun Sep 29 20:20:47 2002
+++ b/sound/pci/rme9652/multiface_firmware.dat Sun Sep 29 20:20:47 2002
@@ -1,5 +1,5 @@
 /* stored in little-endian */
-static u32 multiface_firmware[97652] __devinitdata = {
+static u32 multiface_firmware[24413] __devinitdata = {
 0xffffffff, 0x66aa9955, 0x8001000c, 0xe0000000, 0x8006800c, 0xb0000000,
 0x8004800c, 0xb4fc0100, 0x8003000c, 0x00000000, 0x8001000c, 0x90000000,
 0x8004000c, 0x00000000, 0x8001000c, 0x80000000, 0x0002000c, 0x581a000a,
diff -Nru a/sound/pci/rme9652/rme9652.c b/sound/pci/rme9652/rme9652.c
--- a/sound/pci/rme9652/rme9652.c Sun Sep 29 20:20:47 2002
+++ b/sound/pci/rme9652/rme9652.c Sun Sep 29 20:20:47 2002
@@ -523,6 +523,7 @@
                 rate = RME9652_DS | RME9652_freq;
                 break;
         default:
+ spin_unlock_irq(&rme9652->lock);
                 return -EINVAL;
         }
 

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

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

begin 664 bkpatch2374
M'XL(`']$EST``^U<^9/:1O;_&?Z*SJ0J7[`YU+J%CPH&;+.9:X<9;U))2M5(
MS:`=D(@D9CQK_+]_WVM)G.(8;-=NJCQ)D)"Z7[]^_7EG-_F1W$0\;!0F/.0?
MBS^2]T$4-PK1-.(UYS_P_2H(X'M]&(QY7;2I]^_J(\^??JQ&P=1WE^^+T/Z2
MQ<Z0W/,P:A1H39D_B1\GO%&XZKR[.6U>%8NO7I'6D/FWO,=C\NI5,0[">S9R
MHY]9/!P%?BT.F1^-><QJ3C">S9O.9$F2X1^-&HJDZ3.J2ZHQ<ZA+*5,I=R59
M-76U*!C]>>(',:^)^ZKGQS"?=4*6K%%%U20Z4S7%,(MM0FNZI-7D&M6()-<E
MJRYKA.H-68%_GTMR0Y+(-N+D.55(52J^(5]W,JVB0YJGO2:93EP6<X*]ZI)1
MIVH#WA!2)1'_R[[WPK'G>O"-?YP$8<Q=$OEN]M@.N<.]>UXJDT$0DDD8.#R*
M//^6Q$-./!_XPB_\GOMQ1`9A,!8OQ'<"_+HC'I)@0!@)^1@F3K+A<*A:RL;$
M&=LCKU]SX'[@?00.'L(`J$83SQ\%SEW:K-GZ/\L@3N!R\0`?,=>%UA^Z3?'8
MB2II_R!T>;C6JE>_;'??DF@ZP;'%=%J!SS\RX+3UJRRINID-=-K55(WNYJ;3
MHY9NKK493V-0AJ1!M]6A!I7G+7IGE\3ES*TN$7G?[L'#$`0<IJN4OK@ZZUBZ
M)F]CX1>BFH8N%2\7RE"L/O&O6)285'R=P1(_$>F)<DX<K^XY'"=0<U*\485:
M"EQGLD)-8Z8;1E^19<G4+5.3U>WXWDX2U4BE*D!8ES7-V&0&`#::NKR>4$#C
MX(%:#%<9HO#54*P9DYC">;\O.XP.J,*V,[23;,*41N49E64YAZG%='B$&,@1
M$#55:Z8QDTD#JKL*-RS+&!PBH%6*F7RT&2PW-;>QX@0AV-A,B=:%`U?9FJFN
MINF2Y5HN99+C]O<QDT<S94<!JV?H>9)9E>N2==E<,FIH)IV9'-@QC;[:US2N
MZO*A2Y9#.F5.U6>*J1O:G+G4(RW).!QSU*WZT(TFV=1TM*<2X'HFFZ8ES?H6
MF'=+IC)G$C4LY9"URZ.;@DG"%92-G>J6=4^OFZA2).2,*["4)DB,#PQ.W1TH
MWTLZ8\Z8:8IFT'WKZ?F#(&<AJ4Z-&5/[QL!1'$WN#S2G;QVZD,LTLQ549A*U
MS*UHQPDQQS+$ARWL_J:L)/#-H,`JL_C`89:K.H[&#UK%+:0S530!N1)5=JHB
MH',%H;D&5)]9"I<E!P*(OJY97*<'J>06VIEJ&C/0=D4Z`/WCZ2CV!LSA]@!(
M/;"0U\#_;&B#!6'-3%$&EL-DS="HR0Q5?0KF=HV3`5`'K;.HNG/%1Q[ZY.R:
ML^*Z+BDS1>VKAN)*H"2*9CK&02N>3SI;<;"=JJ*:!XC4]6X/D*AA@D0'3-55
MG5&M;QA<5P[R#0<,DPE4G<DP$RK"Y3R%P\CYJ^GZ]JAYMZXKBD(IZKJLB@!:
M78F<(4I5]T?.$"')WR1P_@<+@VC$[LDOCQ$?,?)R9?%?5Q;1M$0H;6A60]5(
M$E>W`AS:<X@CQH5@39BS"U(-'\2_$'M=YB[+$3%<FVHJD8M=JFEPB6*&`T.4
MZ/E<Q/%(V(9@/'RT8_)L_L0).02;]CAPIR.>O"]%<3AU8I(\(\_2FPJ$UGX4
MXV1"\LQG8WBR29A,`(=^7":?(-"/IZ%/SF].3U^0ST]FR6&AFS$$K\17'`!O
MOI273758"23V:L41$<W1!,%+@)N@0C/D#<W0]VJ&1JK*-]&,:W;'HJ%'N@_,
M(R]C#RZ)6KA\22TDT&;4B89FD"S=_.($,\WHCDPSG1%G/J19*647^@(T02:@
MH4G,N%-%5];J&$U534*+7?'YH\L'J`Z]\_;5!_M#]^JLV^[:O9LWO=95]TVG
M4"C1ER^E<K%K4-!J@/3\+^%],HUA94G('L0LQU-0BC[/I`<2[C^"%LSEN$)A
M/6F_]UC^@A3;AHX<B\\M''?^:3>OKYNM]P5L:$%#P%\N.7R6\HM**EXFVHN"
M%;S@<WY??E%LFS+)<U[S3&VOICXQ53S4A>6DBN#%%!5314D7NDK7E%5K4'E_
M`8A4Z3=1UAM15'`)?M9C;\RS*2R42)2(6A]Z)`ZY<%8BZ]VI"G,Q'*,&"F)*
M68)4Z^+\;?>=#<BRV\WK#CDAI=[4)_^8C@@%WT8;BH16!"=-;JY;Y1.!C+PT
M-0<6QV?(VS&Q.T-6J")#AJR;IB0`8:P;;X7^]_!P>%@#D@>QFPU52NWWVRV%
M*%$*6(-+GH2."FXL"2U!-[T6"H7;`.P>^'K7G@H.7JR#82-!V@V*(W.U8EXN
ML(N@*EN0D6*"ILHT=>OZ!C*,_0$O^'7KNU\_U*\GV?!V=&ZLUC$HM62B`5:I
M\._B8J#'325`@+ED0O/YY4P&.F`?E%7FU86;CRKD,9A"].O#?Z,1=/<B,ICZ
M3KQBQ,4`2"!/:*+>_3#TG"&!SBR.F3.$U0)%PJX9%Q`'((%M#KX&+^O%^K/%
M:L/7+W?VQ4_%PC(%E]^+'G!]4?RC6,`;\DIT';-;SX&$((I+&STJ1'RIOIZ$
MWCVF$>#P6"6+_ZN=[OF'YBE$%H7TR3J!E/&$M1(.6B$B%/D,3-3%TFR`<F7Y
MVE261!XFT^4\;%4\R<3%NI9RA%$1'5P/F(DK:.P*@._[P`-1KTX+F[$8-,A)
M[H?!I(Q#8PI8\`:D](.80O7U8,1N(_+3VJ+>]#KE,M!/92&](+"LWJT/"B%6
MM:U8DG#2XE*8(/#ZS+F+:DL32!<E9VHO(,@UT%P#I.$.7?T:;+J:;,#3SJ^7
M%U?7=N^WLS<7IZ4<')67K7MN<6ZK<?^"*N$^Q[^G2@CQH*S-)%529&'EK74K
MKYE[K;Q)JMI_U_^CG3<:&'Q9J9UO[MIK0WT(P)J$Z<O#_8F"4E$H#)6.D^S6
M+6_311,70`WFS@F2[3KGH]BN(\[0FP@K+TJRN58^=[&.,/)=$_7Z$Y$^JHIF
M:JHD5>!^(/[P_B3;2SRI+%(M47@@GRM)/\U43&6C7Z?7(]?<&?K!*+A]/*D4
MLCY=$W4$>VJZ:JETHR<NQ;RGQR,Q<M8;G1)-G!):)6HMN)<U2UZB-3"1^QX$
M*&H=/LPE%I8ZF+D=H.V"7RHK*R*2K:4^`^R3+!MVFN#>/BQ'NO^Z*B)SK1^(
M""MHJX,IRHIT=+K6":0##^7F4B]2KV-1RQMX`##<GI45F3QX\3#=&P9QJ3I,
M8<WFK)>'=]N<X^K4139B_L\>!M=@YFO1`R@Z9S5Q1J(6A+>UZ=W^00RP/F!9
M-76F6(J6%%7-#>MC[;4^RO]$]D&!R8:\+_L0I?GMFK\NJ*.2$!A$1'9X!0<K
M/*RP)-77(;_W1#K]PRL\-F#C*/8'22Z33^C`D=,T4;&]\*^01R!47OIIWOO6
MQG=@2M%1EU]`%S&.*I*=SVM(S#:'=P+P:7O2A_BZS3UI='$*I+B4ZEM<G/;W
M`1GPJ>>`+#G*(0Y:T!T(RX1S)+"L%%C6`EC#J7\'*RPL>0JCZ00@`[ZN^GH,
M$7WX:`OF(#J"KIJ4BY7Y28N=8'GB$8^G6:DUXIEU,F>ZHICF%N#L+VSKI*K^
M+\1&BMF0M17@S$_W8*R"QWW&D&AY/H\`1LD!EZTPFLOJF-"$`H!$Y`^>%$P,
M1.829#KH_'4Y\?ZZ0A0$4O*VVKGJG%U<=UX@;@@?13R!&;Q]_OR%Z*<EP8.>
MIK3BFN4+T&P]+M\X8+`3=4>>=,BMN>R@E^VY@M63=,/*`YS6D/:77.BW.ISW
M5$M%&Q#-[72'R3F.K2C;$-0Q:--0=L4-WU;Z*:5:?8V/-E*WG;O7"[A\D]WU
MKT';PBUU6<_;CP,4J7^3DFY63$]0=,FF(])F$,)`K[[[<S"I^3Q^+=Z)CVNL
M-D4\QO1.A.P\:BS>BK]G(@V,",,:7W_$QTE$[?E>[$'8]1]1BB,/0^Z33+CD
M@44+`OC'1B'8SD<R"A@F?Z4'3KB/=]-)0@ZDY`9CL:/N\Q$D@E,_CLK+7$#:
M&(EZ%M81<*_9#J9Q9(\#8`1RR&""?*R.2JH$/"[W&;#M5@B6UY+2!@Q&)B/V
MB$4/$L7`VQ@F&/*U[H2$,`;J(;(XA8$>R2WS_*RR)G:\D8NM?$)VNP2Z0YCL
MUB](/_BXD"4L4,A3N8&4,0??8-.+HW41@T@`I,LK#:C!.4+#*(#5!!%/1AP7
M?NSY`>;U(=:E@+^HMM(M/;]:'[+0%1Q%L0>2C*:#`0_3,\$+<,1#AD[JKZF'
MOH@"%,*QH!3R?A#$I`1#7;;.6EAF`(*$_QL&K8?<@T@CC,N$#6(>"O9&+A$]
M0-BWB-!I#$LG2#T$X9WGW]9(E[`Q'AF((4`1I>=`O$/WS,`TC:8"F^EJI1QB
M/2$Y/+/7C.9:C6,"0;''@1]IW7`*>>D&\=]E5:7*G\3&@B6J%]8"P9M_VF)H
MDV.(AUC6IQR$/"1AV'(04M)5-*.22M.=,67#C.Y/&W2)5)7OAO2[(?UN2/\&
MAC0Y]+S7D":&XIA@5"0^:[LM&YC]/=G^:#6OVKT_T6*2WR52J]5(:>E%E9;Q
MG?19[(;T0&L6.([J<Q##'.=HQ*V,M;%7<7C$P&^1P`*4"2*3/1.#Z,6SB_;-
M:<>^;%Z=E7+G6CFAU1/P$6G#WO55]_S=\G!E<N*=0'2^1,EN=WJM+>3(R:HH
M\E5Z12K]1\B$!V`1X]KZ0+W?SJ^;OVX;*N&R<]Y\<]IIDY/*2?KDS<7%::=Y
M;K]MGO8Z@ME5LJ5-R7^9&-9HD9-D55BV'*#+"/1U$[)CMNL4GS35MB;*1.(S
MI8]OKKJ7U]V+\]+)U5F'O&?C,0\'N$[MWB5RTI4I[@%8R8Y@OF*@XE5?0SSQ
M9U)IPK0.&DY"P/,=*9U$L/:H[PM-V+_^M3]\'/X/H`5X%H9]N?^Z21<[/)Q%
MCR1E2A@<'+@H]C\#UR7^=-SGN#F9NBU!)?1NAW%%;,N*\?D@KD$74!4Q#R1;
M\D0MA'CDI?BIE7W6_-5NO6^>GW=.>_#X^?.TP(82\LA/A.*A4;'SBI*Q'T(O
MYK;P1"5\`%[C_/+FVKZ^L"]NKO'NE\YOT!-"`[U<(3?GW>O?['?-[CGN-&\G
M<GG:_.U-L_7+H726:S1/9LSX2HSET?DL"H\%W"-ORR8512/9%#LSW?0Z!]^:
M95P@C\QFR?@V^M6,%;%<:%RGT16_]2)P5F58(/&X/1IUPC"`!S_`\N(2XJ@:
M'KN`836:E">6<8Q:BSC.AD\@"KTTK.CCU4AXAJN:%F(%2P-O$-@/S(LSOJ24
MM=Y[W+K^5[-[709P25F]?WE0/&X'""?870P.B)P;=H@%IY.$C<)\)[[:Z5Z(
MHARRE-3NX"K$^#264IGHZ8H84GJ5TZN9S%9<#R%]>G'^;H6RJ2<4Q!4FD,W+
MGL0AZ%P),YAGY<TD1@C=3(<WS9V=-W\Y@D;-PAUCZ#97BM30S"6[&I]52!^7
M@!.?)T=>[OS@`>([")[PE\6IC1G,;3E$@1#G^!`K<3<U)W\LBPAI;T)4WL!H
M>D22IL!(X(XCP@3/LHFM%V!76K53V26`P(EK8N(9*UG#1<MDK!4,XK3>)--B
M\W89[!(JXH0]GJ6',7-<"2G-R9\L.D61/;?%P$#W7?=MLP5^MK<PK_.V;G[;
M]DK;)3%LG\!<<$^<P;S?]BF<W9Q>'SR'1>.U26Q)Q?-_`W5(:OXEO]+Z*L0M
M_&F6;&TI>^[?K?E>]OR>K7_/UO\>V7KR(\R]V7J^V?A:=<]-ZCL*G]G_)`0T
6U+F+IN-7G/<9,[E;_']TVH^'GT0`````
`
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 Sep 30 2002 - 22:00:41 EST