linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH] ALSA fixes #1
@ 2002-10-03 10:09 Jaroslav Kysela
  2002-10-03 15:37 ` Linus Torvalds
  0 siblings, 1 reply; 5+ messages in thread
From: Jaroslav Kysela @ 2002-10-03 10:09 UTC (permalink / raw)
  To: Linus Torvalds; +Cc: LKML

Hi all,

	this is the first patch which tries to solve major compilation / 
usage trouble for ALSA in 2.5.

						Jaroslav

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.676, 2002-10-03 12:03:21+02:00, perex@suse.cz
  ALSA compilation update
    - save_flags/cli/restore_flags removal
    - updated USB code for 2.5
    - fixed SPARC configuration
    - fixed spinlock/sleep race in PCM midlevel


 drivers/pnp/isapnp.c                  |    2 -
 include/sound/snd_wavefront.h         |    1 
 sound/Config.in                       |    9 +++----
 sound/core/oss/pcm_oss.c              |    4 +--
 sound/core/pcm_native.c               |   22 ++++++------------
 sound/isa/sgalaxy.c                   |   13 ++++------
 sound/isa/wavefront/wavefront.c       |    1 
 sound/isa/wavefront/wavefront_synth.c |   20 +++++++++++-----
 sound/pci/ali5451/ali5451.c           |   12 +++------
 sound/pci/cs46xx/dsp_spos.c           |    5 +---
 sound/pci/cs46xx/dsp_spos_scb_lib.c   |    4 ---
 sound/usb/usbaudio.c                  |   41 ++++++++++++++++++++++++++++++----
 sound/usb/usbmidi.c                   |   22 +++++++++++++++---
 sound/usb/usbmixer.c                  |    6 ++--
 14 files changed, 101 insertions(+), 61 deletions(-)


diff -Nru a/drivers/pnp/isapnp.c b/drivers/pnp/isapnp.c
--- a/drivers/pnp/isapnp.c	Thu Oct  3 12:05:41 2002
+++ b/drivers/pnp/isapnp.c	Thu Oct  3 12:05:41 2002
@@ -1048,7 +1048,7 @@
 	isapnp_wait();
 	isapnp_key();
 	isapnp_wake(csn);
-#if 1
+#if 0
 	/* to avoid malfunction when the isapnptools package is used */
 	/* we must set RDP to our value again */
 	/* it is possible to set RDP only in the isolation phase */ 
diff -Nru a/include/sound/snd_wavefront.h b/include/sound/snd_wavefront.h
--- a/include/sound/snd_wavefront.h	Thu Oct  3 12:05:41 2002
+++ b/include/sound/snd_wavefront.h	Thu Oct  3 12:05:41 2002
@@ -91,6 +91,7 @@
 	int samples_used;                  /* how many */
 	char interrupts_are_midi;          /* h/w MPU interrupts enabled ? */
 	char rom_samples_rdonly;           /* can we write on ROM samples */
+	spinlock_t irq_lock;
 	wait_queue_head_t interrupt_sleeper; 
         snd_wavefront_midi_t midi;         /* ICS2115 MIDI interface */
 };
diff -Nru a/sound/Config.in b/sound/Config.in
--- a/sound/Config.in	Thu Oct  3 12:05:41 2002
+++ b/sound/Config.in	Thu Oct  3 12:05:41 2002
@@ -36,11 +36,10 @@
 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
-if [ "$CONFIG_SND" != "n" -a "$CONFIG_SPARC64" = "y" ]; then
-  source sound/sparc/Config.in
+if [ "$CONFIG_SND" != "n" ]; then
+  if [ "$CONFIG_SPARC32" = "y" -o "$CONFIG_SPARC64" = "y" ]; then
+    source sound/sparc/Config.in
+  fi
 fi
 
 endmenu
diff -Nru a/sound/core/oss/pcm_oss.c b/sound/core/oss/pcm_oss.c
--- a/sound/core/oss/pcm_oss.c	Thu Oct  3 12:05:41 2002
+++ b/sound/core/oss/pcm_oss.c	Thu Oct  3 12:05:41 2002
@@ -1851,8 +1851,8 @@
 	mask = 0;
 	if (psubstream != NULL) {
 		snd_pcm_runtime_t *runtime = psubstream->runtime;
-		spin_lock_irq(&runtime->lock);
 		poll_wait(file, &runtime->sleep, wait);
+		spin_lock_irq(&runtime->lock);
 		if (runtime->status->state != SNDRV_PCM_STATE_DRAINING &&
 		    (runtime->status->state != SNDRV_PCM_STATE_RUNNING ||
 		     snd_pcm_oss_playback_ready(psubstream)))
@@ -1861,8 +1861,8 @@
 	}
 	if (csubstream != NULL) {
 		snd_pcm_runtime_t *runtime = csubstream->runtime;
-		spin_lock_irq(&runtime->lock);
 		poll_wait(file, &runtime->sleep, wait);
+		spin_lock_irq(&runtime->lock);
 		if (runtime->status->state != SNDRV_PCM_STATE_RUNNING ||
 		    snd_pcm_oss_capture_ready(csubstream))
 			mask |= POLLIN | POLLRDNORM;
diff -Nru a/sound/core/pcm_native.c b/sound/core/pcm_native.c
--- a/sound/core/pcm_native.c	Thu Oct  3 12:05:41 2002
+++ b/sound/core/pcm_native.c	Thu Oct  3 12:05:41 2002
@@ -947,7 +947,10 @@
 static int snd_pcm_reset(snd_pcm_substream_t *substream)
 {
 	int res;
+
+	spin_lock_irq(&substream->runtime->lock);
 	_SND_PCM_ACTION(reset, substream, 0, res, 0);
+	spin_unlock_irq(&substream->runtime->lock);
 	return res;
 }
 
@@ -984,6 +987,7 @@
 {
 	int res;
 	snd_card_t *card = substream->pcm->card;
+
 	snd_power_lock(card);
 	while (snd_power_get_state(card) != SNDRV_CTL_POWER_D0) {
 		if (substream->ffile->f_flags & O_NONBLOCK) {
@@ -993,7 +997,9 @@
 		snd_power_wait(card);
 	}
 
+	spin_lock_irq(&substream->runtime->lock);
 	_SND_PCM_ACTION(prepare, substream, 0, res, 0);
+	spin_unlock_irq(&substream->runtime->lock);
 
        _power_unlock:
 	snd_power_unlock(card);
@@ -2051,21 +2057,9 @@
 	case SNDRV_PCM_IOCTL_CHANNEL_INFO:
 		return snd_pcm_channel_info(substream, (snd_pcm_channel_info_t *) arg);
 	case SNDRV_PCM_IOCTL_PREPARE:
-	{
-		int res;
-		spin_lock_irq(&substream->runtime->lock);
-		res = snd_pcm_prepare(substream);
-		spin_unlock_irq(&substream->runtime->lock);
-		return res;
-	}
+		return snd_pcm_prepare(substream);
 	case SNDRV_PCM_IOCTL_RESET:
-	{
-		int res;
-		spin_lock_irq(&substream->runtime->lock);
-		res = snd_pcm_reset(substream);
-		spin_unlock_irq(&substream->runtime->lock);
-		return res;
-	}
+		return snd_pcm_reset(substream);
 	case SNDRV_PCM_IOCTL_START:
 	{
 		int res;
diff -Nru a/sound/isa/sgalaxy.c b/sound/isa/sgalaxy.c
--- a/sound/isa/sgalaxy.c	Thu Oct  3 12:05:41 2002
+++ b/sound/isa/sgalaxy.c	Thu Oct  3 12:05:41 2002
@@ -26,6 +26,7 @@
 #include <linux/init.h>
 #include <linux/delay.h>
 #include <linux/time.h>
+#include <linux/irq.h>
 #include <sound/core.h>
 #include <sound/sb.h>
 #include <sound/ad1848.h>
@@ -117,8 +118,6 @@
 	static int dma_bits[] = {1, 2, 0, 3};
 	int tmp, tmp1;
 
-	unsigned long flags;
-
 	if ((tmp = inb(port + 3)) == 0xff)
 	{
 		snd_printdd("I/O address dead (0x%lx)\n", port);
@@ -140,20 +139,18 @@
 	snd_printdd("sgalaxy - setting up IRQ/DMA for WSS\n");
 #endif
 
-	save_flags(flags);
-	cli();
+	/* FIXME: this is really bogus --jk */
+	/* the irq line is not allocated (thus locked) for this device at the moment */
+	disable_irq(irq);
 
         /* initialize IRQ for WSS codec */
         tmp = interrupt_bits[irq % 16];
-        if (tmp < 0) {
-		restore_flags(flags);
+        if (tmp < 0)
                 return -EINVAL;
-	}
         outb(tmp | 0x40, port);
         tmp1 = dma_bits[dma % 4];
         outb(tmp | tmp1, port);
 
-	restore_flags(flags);
 	return 0;
 }
 
diff -Nru a/sound/isa/wavefront/wavefront.c b/sound/isa/wavefront/wavefront.c
--- a/sound/isa/wavefront/wavefront.c	Thu Oct  3 12:05:41 2002
+++ b/sound/isa/wavefront/wavefront.c	Thu Oct  3 12:05:41 2002
@@ -495,6 +495,7 @@
 	}
 	acard = (snd_wavefront_card_t *)card->private_data;
 	acard->wavefront.irq = -1;
+	spin_lock_init(&acard->wavefront.irq_lock);
 	init_waitqueue_head(&acard->wavefront.interrupt_sleeper);
 	spin_lock_init(&acard->wavefront.midi.open);
 	spin_lock_init(&acard->wavefront.midi.virtual);
diff -Nru a/sound/isa/wavefront/wavefront_synth.c b/sound/isa/wavefront/wavefront_synth.c
--- a/sound/isa/wavefront/wavefront_synth.c	Thu Oct  3 12:05:41 2002
+++ b/sound/isa/wavefront/wavefront_synth.c	Thu Oct  3 12:05:41 2002
@@ -1705,9 +1705,11 @@
 		return;
 	}
 
+	spin_lock(&dev->irq_lock);
 	dev->irq_ok = 1;
 	dev->irq_cnt++;
-	wake_up_interruptible (&dev->interrupt_sleeper);
+	spin_unlock(&dev->irq_lock);
+	wake_up(&dev->interrupt_sleeper);
 }
 
 /* STATUS REGISTER 
@@ -1755,14 +1757,20 @@
 				  int val, int port, int timeout)
 
 {
-	unsigned long flags;
+	wait_queue_t wait;
 
-	save_flags (flags);
-	cli();
+	init_waitqueue_entry(&wait, current);
+	spin_lock_irq(&dev->irq_lock);
+	add_wait_queue(&dev->interrupt_sleeper, &wait);
 	dev->irq_ok = 0;
 	outb (val,port);
-	interruptible_sleep_on_timeout (&dev->interrupt_sleeper, timeout);
-	restore_flags (flags);
+	spin_unlock_irq(&dev->irq_lock);
+	while (1) {
+		if ((timeout = schedule_timeout(timeout)) == 0)
+			return;
+		if (dev->irq_ok)
+			return;
+	}
 }
 
 static int __init
diff -Nru a/sound/pci/ali5451/ali5451.c b/sound/pci/ali5451/ali5451.c
--- a/sound/pci/ali5451/ali5451.c	Thu Oct  3 12:05:41 2002
+++ b/sound/pci/ali5451/ali5451.c	Thu Oct  3 12:05:41 2002
@@ -1871,7 +1871,6 @@
 	ali_t *chip = snd_magic_cast(ali_t, pci_get_drvdata(dev), return);
 #endif
 	ali_image_t *im;
-	unsigned long flags;
 	int i, j;
 
 	im = chip->image;
@@ -1882,8 +1881,7 @@
 		return;
 #endif
 
-	save_flags(flags); 
-	cli();
+	spin_lock_irq(&chip->reg_lock);
 	
 	im->regs[ALI_MISCINT >> 2] = inl(ALI_REG(chip, ALI_MISCINT));
 	// im->regs[ALI_START >> 2] = inl(ALI_REG(chip, ALI_START));
@@ -1907,7 +1905,7 @@
 	// stop all HW channel
 	outl(0xffffffff, ALI_REG(chip, ALI_STOP));
 
-	restore_flags(flags);
+	spin_unlock_irq(&chip->reg_lock);
 #ifndef PCI_OLD_SUSPEND
 	return 0;
 #endif
@@ -1925,7 +1923,6 @@
 	ali_t *chip = snd_magic_cast(ali_t, pci_get_drvdata(dev), return);
 #endif
 	ali_image_t *im;
-	unsigned long flags;
 	int i, j;
 
 	im = chip->image;
@@ -1938,8 +1935,7 @@
 
 	pci_enable_device(chip->pci);
 
-	save_flags(flags); 
-	cli();
+	spin_lock_irq(&chip->reg_lock);
 	
 	for (i = 0; i < ALI_CHANNELS; i++) {
 		outb(i, ALI_REG(chip, ALI_GC_CIR));
@@ -1960,7 +1956,7 @@
 	// restore IRQ enable bits
 	outl(im->regs[ALI_MISCINT >> 2], ALI_REG(chip, ALI_MISCINT));
 	
-	restore_flags(flags);
+	spin_unlock_irq(&chip->reg_lock);
 #ifndef PCI_OLD_SUSPEND
 	return 0;
 #endif
diff -Nru a/sound/pci/cs46xx/dsp_spos.c b/sound/pci/cs46xx/dsp_spos.c
--- a/sound/pci/cs46xx/dsp_spos.c	Thu Oct  3 12:05:41 2002
+++ b/sound/pci/cs46xx/dsp_spos.c	Thu Oct  3 12:05:41 2002
@@ -1595,8 +1595,7 @@
 								ins->spdif_in_src,
 								SCB_ON_PARENT_SUBLIST_SCB);
 
-	save_flags(flags);
-	cli();
+	spin_lock_irq(&chip->reg_lock);
 
 	/* reset SPDIF input sample buffer pointer */
 	snd_cs46xx_poke (chip, (SPDIFI_SCB_INST + 0x0c) << 2,
@@ -1609,7 +1608,7 @@
 	/* 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);
+	spin_unlock_irq(&chip->reg_lock);
 
 	/* set SPDIF input sample rate and unmute
 	   NOTE: only 48khz support for SPDIF input this time */
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	Thu Oct  3 12:05:41 2002
+++ b/sound/pci/cs46xx/dsp_spos_scb_lib.c	Thu Oct  3 12:05:41 2002
@@ -1426,14 +1426,10 @@
 	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);
   
 	return 0;
 }
diff -Nru a/sound/usb/usbaudio.c b/sound/usb/usbaudio.c
--- a/sound/usb/usbaudio.c	Thu Oct  3 12:05:41 2002
+++ b/sound/usb/usbaudio.c	Thu Oct  3 12:05:41 2002
@@ -1292,9 +1292,15 @@
  * entry point for linux usb interface
  */
 
-static void * usb_audio_probe(struct usb_device *dev, unsigned int ifnum,
+#ifndef OLD_USB
+static int usb_audio_probe(struct usb_interface *intf,
+			   const struct usb_device_id *id);
+static void usb_audio_disconnect(struct usb_interface *intf);
+#else
+static void * usb_audio_probe(usb_device *dev, unsigned int ifnum,
 			      const struct usb_device_id *id);
 static void usb_audio_disconnect(struct usb_device *dev, void *ptr);
+#endif
 
 static struct usb_device_id usb_audio_ids [] = {
 #include "usbquirks.h"
@@ -1310,7 +1316,9 @@
 	.name =		"snd-usb-audio",
 	.probe =	usb_audio_probe,
 	.disconnect =	usb_audio_disconnect,
+#ifdef OLD_USB
 	.driver_list =	LIST_HEAD_INIT(usb_audio_driver.driver_list), 
+#endif
 	.id_table =	usb_audio_ids,
 };
 
@@ -2042,9 +2050,18 @@
  * only at the first time.  the successive calls of this function will
  * append the pcm interface to the corresponding card.
  */
+#ifndef OLD_USB
+static int usb_audio_probe(struct usb_interface *intf,
+			   const struct usb_device_id *id)
+#else
 static void *usb_audio_probe(struct usb_device *dev, unsigned int ifnum,
 			     const struct usb_device_id *id)
+#endif
 {
+#ifndef OLD_USB
+	struct usb_device *dev = interface_to_usbdev(intf);
+	int ifnum = intf->altsetting->bInterfaceNumber;
+#endif
 	struct usb_config_descriptor *config = dev->actconfig;	
 	const snd_usb_audio_quirk_t *quirk = (const snd_usb_audio_quirk_t *)id->driver_info;
 	unsigned char *buffer;
@@ -2054,17 +2071,17 @@
 	snd_usb_audio_t *chip;
 
 	if (quirk && ifnum != quirk->ifnum)
-		return NULL;
+		goto __err_val;
 
 	if (usb_set_configuration(dev, config->bConfigurationValue) < 0) {
 		snd_printk(KERN_ERR "cannot set configuration (value 0x%x)\n", config->bConfigurationValue);
-		return NULL;
+		goto __err_val;
 	}
 
 	index = dev->actconfig - config;
 	buflen = alloc_desc_buffer(dev, index, &buffer);
 	if (buflen <= 0)
-		return NULL;
+		goto __err_val;
 
 	/*
 	 * found a config.  now register to ALSA
@@ -2126,12 +2143,21 @@
 	chip->num_interfaces++;
 	up(&register_mutex);
 	kfree(buffer);
+#ifndef OLD_USB
+	return 0;
+#else
 	return chip;
+#endif
 
  __error:
 	up(&register_mutex);
 	kfree(buffer);
+ __err_val:
+#ifndef OLD_USB
+	return -EIO;
+#else
 	return NULL;
+#endif
 }
 
 
@@ -2139,8 +2165,15 @@
  * we need to take care of counter, since disconnection can be called also
  * many times as well as usb_audio_probe(). 
  */
+#ifndef OLD_USB
+static void usb_audio_disconnect(struct usb_interface *intf)
+#else
 static void usb_audio_disconnect(struct usb_device *dev, void *ptr)
+#endif
 {
+#ifndef OLD_USB
+	void *ptr = dev_get_drvdata(&intf->dev);
+#endif
 	snd_usb_audio_t *chip;
 
 	if (ptr == (void *)-1)
diff -Nru a/sound/usb/usbmidi.c b/sound/usb/usbmidi.c
--- a/sound/usb/usbmidi.c	Thu Oct  3 12:05:41 2002
+++ b/sound/usb/usbmidi.c	Thu Oct  3 12:05:41 2002
@@ -479,6 +479,22 @@
 	snd_magic_kfree(ep);
 }
 
+#ifndef OLD_USB
+/* this code is not exported from USB core anymore */
+struct usb_interface *local_usb_ifnum_to_if(struct usb_device *dev, unsigned ifnum)
+{
+	int i;
+        
+	for (i = 0; i < dev->actconfig->bNumInterfaces; i++)
+		if (dev->actconfig->interface[i].altsetting[0].bInterfaceNumber == ifnum)
+			return &dev->actconfig->interface[i];
+                                                        
+	return NULL;
+}
+#else
+#define local_usb_ifnum_to_if usb_ifnum_to_if
+#endif
+
 /*
  * For Roland devices, use the alternate setting which uses interrupt
  * transfers for input.
@@ -491,7 +507,7 @@
 
 	if (umidi->chip->dev->descriptor.idVendor != 0x0582)
 		return NULL;
-	intf = usb_ifnum_to_if(umidi->chip->dev, umidi->ifnum);
+	intf = local_usb_ifnum_to_if(umidi->chip->dev, umidi->ifnum);
 	if (!intf || intf->num_altsetting != 2)
 		return NULL;
 
@@ -803,7 +819,7 @@
 
 	memset(endpoints, 0, sizeof(*endpoints) * MIDI_MAX_ENDPOINTS);
 
-	intf = usb_ifnum_to_if(umidi->chip->dev, umidi->ifnum);
+	intf = local_usb_ifnum_to_if(umidi->chip->dev, umidi->ifnum);
 	if (!intf)
 		return -ENXIO;
 	intfd = &intf->altsetting[0];
@@ -862,7 +878,7 @@
 	usb_endpoint_descriptor_t* epd;
 
 	if (endpoint->epnum == -1) {
-		intf = usb_ifnum_to_if(umidi->chip->dev, umidi->ifnum);
+		intf = local_usb_ifnum_to_if(umidi->chip->dev, umidi->ifnum);
 		if (!intf || intf->num_altsetting < 1)
 			return -ENOENT;
 		intfd = intf->altsetting;
diff -Nru a/sound/usb/usbmixer.c b/sound/usb/usbmixer.c
--- a/sound/usb/usbmixer.c	Thu Oct  3 12:05:41 2002
+++ b/sound/usb/usbmixer.c	Thu Oct  3 12:05:41 2002
@@ -60,7 +60,7 @@
 	unsigned char *buffer;
 	unsigned int buflen;
 	unsigned int ctrlif;
-	unsigned long unitbitmap[32/sizeof(unsigned long)];
+	DECLARE_BITMAP(unitbitmap, 32*32);
 	usb_audio_term_t oterm;
 };
 
@@ -1252,7 +1252,7 @@
 {
 	unsigned char *p1;
 
-	if (test_and_set_bit(unitid, &state->unitbitmap))
+	if (test_and_set_bit(unitid, state->unitbitmap))
 		return 0; /* the unit already visited */
 
 	p1 = find_audio_control_unit(state, unitid);
@@ -1302,7 +1302,7 @@
 	while ((desc = snd_usb_find_csint_desc(buffer, buflen, desc, OUTPUT_TERMINAL, ctrlif, -1)) != NULL) {
 		if (desc[0] < 9)
 			continue; /* invalid descriptor? */
-		set_bit(desc[3], &state.unitbitmap);  /* mark terminal ID as visited */
+		set_bit(desc[3], state.unitbitmap);  /* mark terminal ID as visited */
 		state.oterm.id = desc[3];
 		state.oterm.type = combine_word(&desc[4]);
 		state.oterm.name = desc[8];

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


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


begin 664 bkpatch6928
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
0:1!ZH]"V_@OY(Y)$@S``````
`
end

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


^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2002-10-03 23:12 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2002-10-03 10:09 [PATCH] ALSA fixes #1 Jaroslav Kysela
2002-10-03 15:37 ` Linus Torvalds
2002-10-03 19:31   ` Jaroslav Kysela
2002-10-03 19:52     ` Linus Torvalds
2002-10-03 23:04       ` Jeff Garzik

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).