|
@@ -612,10 +612,10 @@ static int snd_es1688_capture_close(struct snd_pcm_substream *substream)
|
|
|
|
|
|
static int snd_es1688_free(struct snd_es1688 *chip)
|
|
|
{
|
|
|
- if (chip->res_port) {
|
|
|
+ if (chip->hardware != ES1688_HW_UNDEF)
|
|
|
snd_es1688_init(chip, 0);
|
|
|
+ if (chip->res_port)
|
|
|
release_and_free_resource(chip->res_port);
|
|
|
- }
|
|
|
if (chip->irq >= 0)
|
|
|
free_irq(chip->irq, (void *) chip);
|
|
|
if (chip->dma8 >= 0) {
|
|
@@ -657,19 +657,27 @@ int snd_es1688_create(struct snd_card *card,
|
|
|
return -ENOMEM;
|
|
|
chip->irq = -1;
|
|
|
chip->dma8 = -1;
|
|
|
+ chip->hardware = ES1688_HW_UNDEF;
|
|
|
|
|
|
- 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;
|
|
|
}
|
|
|
+
|
|
|
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;
|
|
|
}
|
|
|
chip->dma8 = dma8;
|
|
|
|
|
@@ -685,14 +693,18 @@ 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 */
|
|
|
- return snd_device_new(card, SNDRV_DEV_LOWLEVEL, chip, &ops);
|
|
|
+ err = snd_device_new(card, SNDRV_DEV_LOWLEVEL, chip, &ops);
|
|
|
+exit:
|
|
|
+ if (err)
|
|
|
+ snd_es1688_free(chip);
|
|
|
+ return err;
|
|
|
}
|
|
|
|
|
|
static struct snd_pcm_ops snd_es1688_playback_ops = {
|