summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/sound/es1688.h1
-rw-r--r--sound/isa/es1688/es1688_lib.c29
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;
}