Messages in this thread Patch in this message | | | Date | Sat, 28 Jul 2012 17:13:53 +0200 | From | Daniel Mack <> | Subject | Re: genirq: Flags mismatch irq 5. 00000000 (ES1688) vs. 00000000 |
| |
On 28.07.2012 15:20, Fengguang Wu wrote: > (ES1688) > Reply-To: > > Hi all, > > snd_es1688_create() seems not doing things right. It never frees the > previously allocated resources on error return.. Anyone cares about > this driver now?
Could you try the (not even compile-tested) patch attached?
Daniel
diff --git a/sound/isa/es1688/es1688_lib.c b/sound/isa/es1688/es1688_lib.c index 1d47be8..7cb309a 100644 --- a/sound/isa/es1688/es1688_lib.c +++ b/sound/isa/es1688/es1688_lib.c @@ -658,18 +658,25 @@ int snd_es1688_create(struct snd_card *card, chip->irq = -1; chip->dma8 = -1; - if ((chip->res_port = request_region(port + 4, 12, "ES1688")) == NULL) { + 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; } - if (request_irq(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 -EBUSY; + goto exit_release_region; } + chip->irq = irq; - if (request_dma(dma8, "ES1688")) { + err = request_dma(dma8, "ES1688"); + + if (err < 0) { snd_printk(KERN_ERR "es1688: can't grab DMA8 %d\n", dma8); - return -EBUSY; + goto exit_release_irq; } chip->dma8 = dma8; @@ -685,14 +692,23 @@ int snd_es1688_create(struct snd_card *card, err = snd_es1688_probe(chip); if (err < 0) - return err; + goto exit_release_dma; err = snd_es1688_init(chip, 1); if (err < 0) - return err; + goto exit_release_dma; /* Register device */ return snd_device_new(card, SNDRV_DEV_LOWLEVEL, chip, &ops); + +exit_release_dma: + free_dma(chip->dma8); +exit_release_irq: + free_irq(chip->irq, chip); +exit_release_region: + release_and_free_resource(chip->res_port); +exit: + return err; } static struct snd_pcm_ops snd_es1688_playback_ops = { | |