aboutsummaryrefslogtreecommitdiffstats
path: root/sound
diff options
context:
space:
mode:
authorTakashi Iwai <tiwai@suse.de>2006-06-01 14:47:29 +0200
committerJaroslav Kysela <perex@suse.cz>2006-06-22 21:34:08 +0200
commit0a50d2b2951cb7ae12726814f9a198e1c699aa0b (patch)
tree38197874a92ead9bf652732d2dc03ecafe3bfdaf /sound
parentf079c25ab8a7d223875c5bac9b23b484e4a18f88 (diff)
downloadkernel_goldelico_gta04-0a50d2b2951cb7ae12726814f9a198e1c699aa0b.zip
kernel_goldelico_gta04-0a50d2b2951cb7ae12726814f9a198e1c699aa0b.tar.gz
kernel_goldelico_gta04-0a50d2b2951cb7ae12726814f9a198e1c699aa0b.tar.bz2
[ALSA] Fix possible races in PCI driver removal
Call free_irq() before releasing others to avoid races when shared irq is issued. Signed-off-by: Takashi Iwai <tiwai@suse.de>
Diffstat (limited to 'sound')
-rw-r--r--sound/pci/cs46xx/cs46xx_lib.c5
-rw-r--r--sound/pci/riptide/riptide.c4
2 files changed, 5 insertions, 4 deletions
diff --git a/sound/pci/cs46xx/cs46xx_lib.c b/sound/pci/cs46xx/cs46xx_lib.c
index 69dbf54..5c21144 100644
--- a/sound/pci/cs46xx/cs46xx_lib.c
+++ b/sound/pci/cs46xx/cs46xx_lib.c
@@ -2877,14 +2877,15 @@ static int snd_cs46xx_free(struct snd_cs46xx *chip)
if (chip->region.idx[0].resource)
snd_cs46xx_hw_stop(chip);
+ if (chip->irq >= 0)
+ free_irq(chip->irq, chip);
+
for (idx = 0; idx < 5; idx++) {
struct snd_cs46xx_region *region = &chip->region.idx[idx];
if (region->remap_addr)
iounmap(region->remap_addr);
release_and_free_resource(region->resource);
}
- if (chip->irq >= 0)
- free_irq(chip->irq, chip);
if (chip->active_ctrl)
chip->active_ctrl(chip, -chip->amplifier);
diff --git a/sound/pci/riptide/riptide.c b/sound/pci/riptide/riptide.c
index c27cd49..5618ec9 100644
--- a/sound/pci/riptide/riptide.c
+++ b/sound/pci/riptide/riptide.c
@@ -1836,11 +1836,11 @@ static int snd_riptide_free(struct snd_riptide *chip)
UNSET_GRESET(cif->hwport);
kfree(chip->cif);
}
+ if (chip->irq >= 0)
+ free_irq(chip->irq, chip);
if (chip->fw_entry)
release_firmware(chip->fw_entry);
release_and_free_resource(chip->res_port);
- if (chip->irq >= 0)
- free_irq(chip->irq, chip);
kfree(chip);
return 0;
}