diff options
-rw-r--r-- | include/sound/es1688.h | 1 | ||||
-rw-r--r-- | sound/isa/es1688/es1688_lib.c | 29 |
2 files changed, 21 insertions, 9 deletions
diff --git a/include/sound/es1688.h b/include/sound/es1688.h index da577bbf9cc7..099569c31fbb 100644 --- a/include/sound/es1688.h +++ b/include/sound/es1688.h @@ -18,6 +18,7 @@ struct snd_es1688 { unsigned long port; /* port of ESS chip */ + struct resource *res_port; unsigned long mpu_port; /* MPU-401 port of ESS chip */ int irq; /* IRQ number of ESS chip */ int mpu_irq; /* MPU IRQ */ 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; } |