ASoC: ep93xx-i2s: use devm_* helpers to cleanup probe
authorH Hartley Sweeten <hartleys@visionengravers.com>
Mon, 26 Mar 2012 23:00:17 +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 value 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-i2s.c

index f7a6234..8df8f6d 100644 (file)
@@ -63,7 +63,6 @@ struct ep93xx_i2s_info {
        struct clk                      *sclk;
        struct clk                      *lrclk;
        struct ep93xx_pcm_dma_params    *dma_params;
-       struct resource                 *mem;
        void __iomem                    *regs;
 };
 
@@ -373,38 +372,22 @@ static int ep93xx_i2s_probe(struct platform_device *pdev)
        struct resource *res;
        int err;
 
-       info = kzalloc(sizeof(struct ep93xx_i2s_info), GFP_KERNEL);
-       if (!info) {
-               err = -ENOMEM;
-               goto fail;
-       }
-
-       dev_set_drvdata(&pdev->dev, info);
-       info->dma_params = ep93xx_i2s_dma_params;
+       info = devm_kzalloc(&pdev->dev, sizeof(*info), GFP_KERNEL);
+       if (!info)
+               return -ENOMEM;
 
        res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
-       if (!res) {
-               err = -ENODEV;
-               goto fail_free_info;
-       }
+       if (!res)
+               return -ENODEV;
 
-       info->mem = request_mem_region(res->start, resource_size(res),
-                                      pdev->name);
-       if (!info->mem) {
-               err = -EBUSY;
-               goto fail_free_info;
-       }
-
-       info->regs = ioremap(info->mem->start, resource_size(info->mem));
-       if (!info->regs) {
-               err = -ENXIO;
-               goto fail_release_mem;
-       }
+       info->regs = devm_request_and_ioremap(&pdev->dev, res);
+       if (!info->regs)
+               return -ENXIO;
 
        info->mclk = clk_get(&pdev->dev, "mclk");
        if (IS_ERR(info->mclk)) {
                err = PTR_ERR(info->mclk);
-               goto fail_unmap_mem;
+               goto fail;
        }
 
        info->sclk = clk_get(&pdev->dev, "sclk");
@@ -419,6 +402,9 @@ static int ep93xx_i2s_probe(struct platform_device *pdev)
                goto fail_put_sclk;
        }
 
+       dev_set_drvdata(&pdev->dev, info);
+       info->dma_params = ep93xx_i2s_dma_params;
+
        err = snd_soc_register_dai(&pdev->dev, &ep93xx_i2s_dai);
        if (err)
                goto fail_put_lrclk;
@@ -426,17 +412,12 @@ static int ep93xx_i2s_probe(struct platform_device *pdev)
        return 0;
 
 fail_put_lrclk:
+       dev_set_drvdata(&pdev->dev, NULL);
        clk_put(info->lrclk);
 fail_put_sclk:
        clk_put(info->sclk);
 fail_put_mclk:
        clk_put(info->mclk);
-fail_unmap_mem:
-       iounmap(info->regs);
-fail_release_mem:
-       release_mem_region(info->mem->start, resource_size(info->mem));
-fail_free_info:
-       kfree(info);
 fail:
        return err;
 }
@@ -446,12 +427,10 @@ static int __devexit ep93xx_i2s_remove(struct platform_device *pdev)
        struct ep93xx_i2s_info *info = dev_get_drvdata(&pdev->dev);
 
        snd_soc_unregister_dai(&pdev->dev);
+       dev_set_drvdata(&pdev->dev, NULL);
        clk_put(info->lrclk);
        clk_put(info->sclk);
        clk_put(info->mclk);
-       iounmap(info->regs);
-       release_mem_region(info->mem->start, resource_size(info->mem));
-       kfree(info);
        return 0;
 }