summaryrefslogtreecommitdiffstats
path: root/sound/isa
diff options
context:
space:
mode:
authorTakashi Iwai <tiwai@suse.de>2021-08-05 08:21:48 +0200
committerTakashi Iwai <tiwai@suse.de>2021-08-05 08:24:17 +0200
commitdf8bcf36be2755a39c2f1bcc1ea3c18329c29931 (patch)
tree476fbb0746ec2470c78f28fb97e88bb7280784ff /sound/isa
parentddddc0d4c76aabd15eddbd905d4bf009f2f30725 (diff)
downloadlinux-stable-df8bcf36be2755a39c2f1bcc1ea3c18329c29931.tar.gz
linux-stable-df8bcf36be2755a39c2f1bcc1ea3c18329c29931.tar.bz2
linux-stable-df8bcf36be2755a39c2f1bcc1ea3c18329c29931.zip
ALSA: es1688: Avoid devres management for es1688 object creation
The recent refactoring of es1688 object creation with the use of devres caused a problem with the non-PnP probe of GUS driver, as it tries to probe multiple times with different parameters That is, this object needs the immediate resource release and the devres doesn't fit for it. This patch reverts partially the commit for restoring the classic resource management for es1688 object. Fixes: 1bb11c1c7f6e ("ALSA: es1688: Allocate resources with device-managed APIs") Reported-by: kernel test robot <oliver.sang@intel.com> Link: https://lore.kernel.org/r/20210805032513.GA30485@xsang-OptiPlex-9020 Link: https://lore.kernel.org/r/20210805062148.30951-1-tiwai@suse.de Signed-off-by: Takashi Iwai <tiwai@suse.de>
Diffstat (limited to 'sound/isa')
-rw-r--r--sound/isa/es1688/es1688_lib.c29
1 files changed, 20 insertions, 9 deletions
diff --git a/sound/isa/es1688/es1688_lib.c b/sound/isa/es1688/es1688_lib.c
index 9cd66b236cef..8554cb2263c1 100644
--- a/sound/isa/es1688/es1688_lib.c
+++ b/sound/isa/es1688/es1688_lib.c
@@ -580,6 +580,13 @@ static int snd_es1688_free(struct snd_es1688 *chip)
{
if (chip->hardware != ES1688_HW_UNDEF)
snd_es1688_init(chip, 0);
+ release_and_free_resource(chip->res_port);
+ if (chip->irq >= 0)
+ free_irq(chip->irq, (void *) chip);
+ if (chip->dma8 >= 0) {
+ disable_dma(chip->dma8);
+ free_dma(chip->dma8);
+ }
return 0;
}
@@ -617,25 +624,26 @@ int snd_es1688_create(struct snd_card *card,
chip->dma8 = -1;
chip->hardware = ES1688_HW_UNDEF;
- if (!devm_request_region(card->dev, port + 4, 12, "ES1688")) {
+ chip->res_port = request_region(port + 4, 12, "ES1688");
+ if (chip->res_port == NULL) {
snd_printk(KERN_ERR "es1688: can't grab port 0x%lx\n", port + 4);
- return -EBUSY;
+ err = -EBUSY;
+ goto exit;
}
- err = devm_request_irq(card->dev, irq, snd_es1688_interrupt, 0,
- "ES1688", (void *) chip);
+ err = request_irq(irq, snd_es1688_interrupt, 0, "ES1688", (void *) chip);
if (err < 0) {
snd_printk(KERN_ERR "es1688: can't grab IRQ %d\n", irq);
- return err;
+ goto exit;
}
chip->irq = irq;
card->sync_irq = chip->irq;
- err = snd_devm_request_dma(card->dev, dma8, "ES1688");
+ err = request_dma(dma8, "ES1688");
if (err < 0) {
snd_printk(KERN_ERR "es1688: can't grab DMA8 %d\n", dma8);
- return err;
+ goto exit;
}
chip->dma8 = dma8;
@@ -651,14 +659,17 @@ int snd_es1688_create(struct snd_card *card,
err = snd_es1688_probe(chip);
if (err < 0)
- return err;
+ goto exit;
err = snd_es1688_init(chip, 1);
if (err < 0)
- return err;
+ goto exit;
/* Register device */
err = snd_device_new(card, SNDRV_DEV_LOWLEVEL, chip, &ops);
+exit:
+ if (err)
+ snd_es1688_free(chip);
return err;
}