]> git.karo-electronics.de Git - karo-tx-linux.git/blobdiff - sound/isa/es1688/es1688_lib.c
Merge tag 'v3.6-rc1' into staging/for_v3.6
[karo-tx-linux.git] / sound / isa / es1688 / es1688_lib.c
index 1d47be8170b59928f758f13bad7106c3959f79e8..b3b4f15e45baa850f0698828589b31673ccbeb6c 100644 (file)
@@ -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 = {