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 = {