Skip to content

Commit

Permalink
ASoC: keep pointer to resource so it can be freed
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Julia Lawall authored and Mark Brown committed Oct 22, 2011
1 parent 33cb92c commit 226d0f2
Show file tree
Hide file tree
Showing 5 changed files with 72 additions and 63 deletions.
33 changes: 18 additions & 15 deletions sound/soc/au1x/ac97c.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand All @@ -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);
Expand All @@ -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;
Expand Down
33 changes: 18 additions & 15 deletions sound/soc/au1x/i2sc.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
25 changes: 13 additions & 12 deletions sound/soc/au1x/psc-ac97.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand All @@ -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 |
Expand Down Expand Up @@ -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;
Expand Down
25 changes: 13 additions & 12 deletions sound/soc/au1x/psc-i2s.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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)
Expand Down Expand Up @@ -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;
Expand Down
19 changes: 10 additions & 9 deletions sound/soc/mxs/mxs-saif.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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) {
Expand Down Expand Up @@ -742,7 +743,7 @@ static int mxs_saif_probe(struct platform_device *pdev)
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:
Expand Down

0 comments on commit 226d0f2

Please sign in to comment.