ASoC: keep pointer to resource so it can be freed
authorJulia Lawall <julia@diku.dk>
Tue, 18 Oct 2011 15:06:39 +0000 (17:06 +0200)
committerMark Brown <broonie@opensource.wolfsonmicro.com>
Sat, 22 Oct 2011 09:46:35 +0000 (10:46 +0100)
Add a new variable for storing resources accessed subsequent to the one
accessed using request_mem_region, so the one accessed using
request_mem_region can be released if needed.

The resource variable names are also changed to be more descriptive.

This code is also missing some calls to iounmap.

The semantic match that finds this problem is as follows:
(http://coccinelle.lip6.fr/)

// <smpl>
@r@
expression E, E1;
identifier f;
statement S1,S2,S3;
@@

if (E == NULL)
{
  ... when != if (E == NULL || ...) S1 else S2
      when != E = E1
*E->f
  ... when any
  return ...;
}
else S3
// </smpl>

Signed-off-by: Julia Lawall <julia@diku.dk>
Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
sound/soc/au1x/ac97c.c
sound/soc/au1x/i2sc.c
sound/soc/au1x/psc-ac97.c
sound/soc/au1x/psc-i2s.c
sound/soc/mxs/mxs-saif.c

index 13802ff7cf05956151d59615f6a73d0ee0e61877..726bd651a105970053a726cdee18012ea96a508b 100644 (file)
@@ -226,7 +226,7 @@ static struct snd_soc_dai_driver au1xac97c_dai_driver = {
 static int __devinit au1xac97c_drvprobe(struct platform_device *pdev)
 {
        int ret;
-       struct resource *r;
+       struct resource *iores, *dmares;
        struct au1xpsc_audio_data *ctx;
 
        ctx = kzalloc(sizeof(*ctx), GFP_KERNEL);
@@ -235,29 +235,30 @@ static int __devinit au1xac97c_drvprobe(struct platform_device *pdev)
 
        mutex_init(&ctx->lock);
 
-       r = platform_get_resource(pdev, IORESOURCE_MEM, 0);
-       if (!r) {
+       iores = platform_get_resource(pdev, IORESOURCE_MEM, 0);
+       if (!iores) {
                ret = -ENODEV;
                goto out0;
        }
 
        ret = -EBUSY;
-       if (!request_mem_region(r->start, resource_size(r), pdev->name))
+       if (!request_mem_region(iores->start, resource_size(iores),
+                               pdev->name))
                goto out0;
 
-       ctx->mmio = ioremap_nocache(r->start, resource_size(r));
+       ctx->mmio = ioremap_nocache(iores->start, resource_size(iores));
        if (!ctx->mmio)
                goto out1;
 
-       r = platform_get_resource(pdev, IORESOURCE_DMA, 0);
-       if (!r)
-               goto out1;
-       ctx->dmaids[SNDRV_PCM_STREAM_PLAYBACK] = r->start;
+       dmares = platform_get_resource(pdev, IORESOURCE_DMA, 0);
+       if (!dmares)
+               goto out2;
+       ctx->dmaids[SNDRV_PCM_STREAM_PLAYBACK] = dmares->start;
 
-       r = platform_get_resource(pdev, IORESOURCE_DMA, 1);
-       if (!r)
-               goto out1;
-       ctx->dmaids[SNDRV_PCM_STREAM_CAPTURE] = r->start;
+       dmares = platform_get_resource(pdev, IORESOURCE_DMA, 1);
+       if (!dmares)
+               goto out2;
+       ctx->dmaids[SNDRV_PCM_STREAM_CAPTURE] = dmares->start;
 
        /* switch it on */
        WR(ctx, AC97_ENABLE, EN_D | EN_CE);
@@ -270,13 +271,15 @@ static int __devinit au1xac97c_drvprobe(struct platform_device *pdev)
 
        ret = snd_soc_register_dai(&pdev->dev, &au1xac97c_dai_driver);
        if (ret)
-               goto out1;
+               goto out2;
 
        ac97c_workdata = ctx;
        return 0;
 
+out2:
+       iounmap(ctx->mmio);
 out1:
-       release_mem_region(r->start, resource_size(r));
+       release_mem_region(iores->start, resource_size(iores));
 out0:
        kfree(ctx);
        return ret;
index 19e0d2a9c828ac14cf8d7df3f2991f0a8cd54656..6bcf48f5884c169b0a5d61004bb91f7652647b35 100644 (file)
@@ -228,47 +228,50 @@ static struct snd_soc_dai_driver au1xi2s_dai_driver = {
 static int __devinit au1xi2s_drvprobe(struct platform_device *pdev)
 {
        int ret;
-       struct resource *r;
+       struct resource *iores, *dmares;
        struct au1xpsc_audio_data *ctx;
 
        ctx = kzalloc(sizeof(*ctx), GFP_KERNEL);
        if (!ctx)
                return -ENOMEM;
 
-       r = platform_get_resource(pdev, IORESOURCE_MEM, 0);
-       if (!r) {
+       iores = platform_get_resource(pdev, IORESOURCE_MEM, 0);
+       if (!iores) {
                ret = -ENODEV;
                goto out0;
        }
 
        ret = -EBUSY;
-       if (!request_mem_region(r->start, resource_size(r), pdev->name))
+       if (!request_mem_region(iores->start, resource_size(iores),
+                               pdev->name))
                goto out0;
 
-       ctx->mmio = ioremap_nocache(r->start, resource_size(r));
+       ctx->mmio = ioremap_nocache(iores->start, resource_size(iores));
        if (!ctx->mmio)
                goto out1;
 
-       r = platform_get_resource(pdev, IORESOURCE_DMA, 0);
-       if (!r)
-               goto out1;
-       ctx->dmaids[SNDRV_PCM_STREAM_PLAYBACK] = r->start;
+       dmares = platform_get_resource(pdev, IORESOURCE_DMA, 0);
+       if (!dmares)
+               goto out2;
+       ctx->dmaids[SNDRV_PCM_STREAM_PLAYBACK] = dmares->start;
 
-       r = platform_get_resource(pdev, IORESOURCE_DMA, 1);
-       if (!r)
-               goto out1;
-       ctx->dmaids[SNDRV_PCM_STREAM_CAPTURE] = r->start;
+       dmares = platform_get_resource(pdev, IORESOURCE_DMA, 1);
+       if (!dmares)
+               goto out2;
+       ctx->dmaids[SNDRV_PCM_STREAM_CAPTURE] = dmares->start;
 
        platform_set_drvdata(pdev, ctx);
 
        ret = snd_soc_register_dai(&pdev->dev, &au1xi2s_dai_driver);
        if (ret)
-               goto out1;
+               goto out2;
 
        return 0;
 
+out2:
+       iounmap(ctx->mmio);
 out1:
-       release_mem_region(r->start, resource_size(r));
+       release_mem_region(iores->start, resource_size(iores));
 out0:
        kfree(ctx);
        return ret;
index 172eefd38b2d411008fa527d5f66f92ebd8a55da..0c6acd54714100b09401fac0278f4b412821f0b9 100644 (file)
@@ -364,7 +364,7 @@ static const struct snd_soc_dai_driver au1xpsc_ac97_dai_template = {
 static int __devinit au1xpsc_ac97_drvprobe(struct platform_device *pdev)
 {
        int ret;
-       struct resource *r;
+       struct resource *iores, *dmares;
        unsigned long sel;
        struct au1xpsc_audio_data *wd;
 
@@ -374,29 +374,30 @@ static int __devinit au1xpsc_ac97_drvprobe(struct platform_device *pdev)
 
        mutex_init(&wd->lock);
 
-       r = platform_get_resource(pdev, IORESOURCE_MEM, 0);
-       if (!r) {
+       iores = platform_get_resource(pdev, IORESOURCE_MEM, 0);
+       if (!iores) {
                ret = -ENODEV;
                goto out0;
        }
 
        ret = -EBUSY;
-       if (!request_mem_region(r->start, resource_size(r), pdev->name))
+       if (!request_mem_region(iores->start, resource_size(iores),
+                               pdev->name))
                goto out0;
 
-       wd->mmio = ioremap(r->start, resource_size(r));
+       wd->mmio = ioremap(iores->start, resource_size(iores));
        if (!wd->mmio)
                goto out1;
 
-       r = platform_get_resource(pdev, IORESOURCE_DMA, 0);
-       if (!r)
+       dmares = platform_get_resource(pdev, IORESOURCE_DMA, 0);
+       if (!dmares)
                goto out2;
-       wd->dmaids[SNDRV_PCM_STREAM_PLAYBACK] = r->start;
+       wd->dmaids[SNDRV_PCM_STREAM_PLAYBACK] = dmares->start;
 
-       r = platform_get_resource(pdev, IORESOURCE_DMA, 1);
-       if (!r)
+       dmares = platform_get_resource(pdev, IORESOURCE_DMA, 1);
+       if (!dmares)
                goto out2;
-       wd->dmaids[SNDRV_PCM_STREAM_CAPTURE] = r->start;
+       wd->dmaids[SNDRV_PCM_STREAM_CAPTURE] = dmares->start;
 
        /* configuration: max dma trigger threshold, enable ac97 */
        wd->cfg = PSC_AC97CFG_RT_FIFO8 | PSC_AC97CFG_TT_FIFO8 |
@@ -428,7 +429,7 @@ static int __devinit au1xpsc_ac97_drvprobe(struct platform_device *pdev)
 out2:
        iounmap(wd->mmio);
 out1:
-       release_mem_region(r->start, resource_size(r));
+       release_mem_region(iores->start, resource_size(iores));
 out0:
        kfree(wd);
        return ret;
index 7c5ae920544fd136b1620867ced48948021912ab..e03c5ce01b304ef680e1790f4fd9c39d1313483d 100644 (file)
@@ -290,7 +290,7 @@ static const struct snd_soc_dai_driver au1xpsc_i2s_dai_template = {
 
 static int __devinit au1xpsc_i2s_drvprobe(struct platform_device *pdev)
 {
-       struct resource *r;
+       struct resource *iores, *dmares;
        unsigned long sel;
        int ret;
        struct au1xpsc_audio_data *wd;
@@ -299,29 +299,30 @@ static int __devinit au1xpsc_i2s_drvprobe(struct platform_device *pdev)
        if (!wd)
                return -ENOMEM;
 
-       r = platform_get_resource(pdev, IORESOURCE_MEM, 0);
-       if (!r) {
+       iores = platform_get_resource(pdev, IORESOURCE_MEM, 0);
+       if (!iores) {
                ret = -ENODEV;
                goto out0;
        }
 
        ret = -EBUSY;
-       if (!request_mem_region(r->start, resource_size(r), pdev->name))
+       if (!request_mem_region(iores->start, resource_size(iores),
+                               pdev->name))
                goto out0;
 
-       wd->mmio = ioremap(r->start, resource_size(r));
+       wd->mmio = ioremap(iores->start, resource_size(iores));
        if (!wd->mmio)
                goto out1;
 
-       r = platform_get_resource(pdev, IORESOURCE_DMA, 0);
-       if (!r)
+       dmares = platform_get_resource(pdev, IORESOURCE_DMA, 0);
+       if (!dmares)
                goto out2;
-       wd->dmaids[SNDRV_PCM_STREAM_PLAYBACK] = r->start;
+       wd->dmaids[SNDRV_PCM_STREAM_PLAYBACK] = dmares->start;
 
-       r = platform_get_resource(pdev, IORESOURCE_DMA, 1);
-       if (!r)
+       dmares = platform_get_resource(pdev, IORESOURCE_DMA, 1);
+       if (!dmares)
                goto out2;
-       wd->dmaids[SNDRV_PCM_STREAM_CAPTURE] = r->start;
+       wd->dmaids[SNDRV_PCM_STREAM_CAPTURE] = dmares->start;
 
        /* preserve PSC clock source set up by platform (dev.platform_data
         * is already occupied by soc layer)
@@ -355,7 +356,7 @@ static int __devinit au1xpsc_i2s_drvprobe(struct platform_device *pdev)
 out2:
        iounmap(wd->mmio);
 out1:
-       release_mem_region(r->start, resource_size(r));
+       release_mem_region(iores->start, resource_size(iores));
 out0:
        kfree(wd);
        return ret;
index 401944cf45602d8a514981409ef8f11be45134df..76dc74d24fc2ff7b50b9665b7443c56372c70b7c 100644 (file)
@@ -617,7 +617,7 @@ static irqreturn_t mxs_saif_irq(int irq, void *dev_id)
 
 static int mxs_saif_probe(struct platform_device *pdev)
 {
-       struct resource *res;
+       struct resource *iores, *dmares;
        struct mxs_saif *saif;
        struct mxs_saif_platform_data *pdata;
        int ret = 0;
@@ -655,35 +655,36 @@ static int mxs_saif_probe(struct platform_device *pdev)
                goto failed_clk;
        }
 
-       res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
-       if (!res) {
+       iores = platform_get_resource(pdev, IORESOURCE_MEM, 0);
+       if (!iores) {
                ret = -ENODEV;
                dev_err(&pdev->dev, "failed to get io resource: %d\n",
                        ret);
                goto failed_get_resource;
        }
 
-       if (!request_mem_region(res->start, resource_size(res), "mxs-saif")) {
+       if (!request_mem_region(iores->start, resource_size(iores),
+                               "mxs-saif")) {
                dev_err(&pdev->dev, "request_mem_region failed\n");
                ret = -EBUSY;
                goto failed_get_resource;
        }
 
-       saif->base = ioremap(res->start, resource_size(res));
+       saif->base = ioremap(iores->start, resource_size(iores));
        if (!saif->base) {
                dev_err(&pdev->dev, "ioremap failed\n");
                ret = -ENODEV;
                goto failed_ioremap;
        }
 
-       res = platform_get_resource(pdev, IORESOURCE_DMA, 0);
-       if (!res) {
+       dmares = platform_get_resource(pdev, IORESOURCE_DMA, 0);
+       if (!dmares) {
                ret = -ENODEV;
                dev_err(&pdev->dev, "failed to get dma resource: %d\n",
                        ret);
                goto failed_ioremap;
        }
-       saif->dma_param.chan_num = res->start;
+       saif->dma_param.chan_num = dmares->start;
 
        saif->irq = platform_get_irq(pdev, 0);
        if (saif->irq < 0) {
@@ -742,7 +743,7 @@ failed_get_irq2:
 failed_get_irq1:
        iounmap(saif->base);
 failed_ioremap:
-       release_mem_region(res->start, resource_size(res));
+       release_mem_region(iores->start, resource_size(iores));
 failed_get_resource:
        clk_put(saif->clk);
 failed_clk: