ASoC: ep93xx-ac97: use devm_* helpers to cleanup probe
authorH Hartley Sweeten <hartleys@visionengravers.com>
Mon, 26 Mar 2012 23:00:08 +0000 (16:00 -0700)
committerMark Brown <broonie@opensource.wolfsonmicro.com>
Sun, 1 Apr 2012 10:28:29 +0000 (11:28 +0100)
Use the devm_* helpers to cleanup the probe routine. This also eliminates
having to carry the mem and irq values in the private data for the remove.

Signed-off-by: H Hartley Sweeten <hsweeten@visionengravers.com>
Tested-by: Mika Westerberg <mika.westerberg@iki.fi>
Acked-by: Mika Westerberg <mika.westerberg@iki.fi>
Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
sound/soc/ep93xx/ep93xx-ac97.c

index 0678637..bdffab3 100644 (file)
  * struct ep93xx_ac97_info - EP93xx AC97 controller info structure
  * @lock: mutex serializing access to the bus (slot 1 & 2 ops)
  * @dev: pointer to the platform device dev structure
- * @mem: physical memory resource for the registers
  * @regs: mapped AC97 controller registers
- * @irq: AC97 interrupt number
  * @done: bus ops wait here for an interrupt
  */
 struct ep93xx_ac97_info {
        struct mutex            lock;
        struct device           *dev;
-       struct resource         *mem;
        void __iomem            *regs;
-       int                     irq;
        struct completion       done;
 };
 
@@ -359,66 +355,50 @@ static struct snd_soc_dai_driver ep93xx_ac97_dai = {
 static int __devinit ep93xx_ac97_probe(struct platform_device *pdev)
 {
        struct ep93xx_ac97_info *info;
+       struct resource *res;
+       unsigned int irq;
        int ret;
 
-       info = kzalloc(sizeof(struct ep93xx_ac97_info), GFP_KERNEL);
+       info = devm_kzalloc(&pdev->dev, sizeof(*info), GFP_KERNEL);
        if (!info)
                return -ENOMEM;
 
-       dev_set_drvdata(&pdev->dev, info);
-
-       mutex_init(&info->lock);
-       init_completion(&info->done);
-       info->dev = &pdev->dev;
+       res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
+       if (!res)
+               return -ENODEV;
 
-       info->mem = platform_get_resource(pdev, IORESOURCE_MEM, 0);
-       if (!info->mem) {
-               ret = -ENXIO;
-               goto fail_free_info;
-       }
+       info->regs = devm_request_and_ioremap(&pdev->dev, res);
+       if (!info->regs)
+               return -ENXIO;
 
-       info->irq = platform_get_irq(pdev, 0);
-       if (!info->irq) {
-               ret = -ENXIO;
-               goto fail_free_info;
-       }
+       irq = platform_get_irq(pdev, 0);
+       if (!irq)
+               return -ENODEV;
 
-       if (!request_mem_region(info->mem->start, resource_size(info->mem),
-                               pdev->name)) {
-               ret = -EBUSY;
-               goto fail_free_info;
-       }
+       ret = devm_request_irq(&pdev->dev, irq, ep93xx_ac97_interrupt,
+                              IRQF_TRIGGER_HIGH, pdev->name, info);
+       if (ret)
+               goto fail;
 
-       info->regs = ioremap(info->mem->start, resource_size(info->mem));
-       if (!info->regs) {
-               ret = -ENOMEM;
-               goto fail_release_mem;
-       }
+       dev_set_drvdata(&pdev->dev, info);
 
-       ret = request_irq(info->irq, ep93xx_ac97_interrupt, IRQF_TRIGGER_HIGH,
-                         pdev->name, info);
-       if (ret)
-               goto fail_unmap_mem;
+       mutex_init(&info->lock);
+       init_completion(&info->done);
+       info->dev = &pdev->dev;
 
        ep93xx_ac97_info = info;
        platform_set_drvdata(pdev, info);
 
        ret = snd_soc_register_dai(&pdev->dev, &ep93xx_ac97_dai);
        if (ret)
-               goto fail_free_irq;
+               goto fail;
 
        return 0;
 
-fail_free_irq:
+fail:
        platform_set_drvdata(pdev, NULL);
-       free_irq(info->irq, info);
-fail_unmap_mem:
-       iounmap(info->regs);
-fail_release_mem:
-       release_mem_region(info->mem->start, resource_size(info->mem));
-fail_free_info:
-       kfree(info);
-
+       ep93xx_ac97_info = NULL;
+       dev_set_drvdata(&pdev->dev, NULL);
        return ret;
 }
 
@@ -431,11 +411,9 @@ static int __devexit ep93xx_ac97_remove(struct platform_device *pdev)
        /* disable the AC97 controller */
        ep93xx_ac97_write_reg(info, AC97GCR, 0);
 
-       free_irq(info->irq, info);
-       iounmap(info->regs);
-       release_mem_region(info->mem->start, resource_size(info->mem));
        platform_set_drvdata(pdev, NULL);
-       kfree(info);
+       ep93xx_ac97_info = NULL;
+       dev_set_drvdata(&pdev->dev, NULL);
 
        return 0;
 }