aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorH Hartley Sweeten <hartleys@visionengravers.com>2012-03-26 19:00:17 -0400
committerMark Brown <broonie@opensource.wolfsonmicro.com>2012-04-01 06:28:29 -0400
commit01651babb66fb7b51719ff3389a7bfc3ad25fe13 (patch)
tree77b7308f74de236973ebfc73a873f581d84a6486
parente7cff0abf99a0895bc2094e08809bd5e0c4f6a4a (diff)
ASoC: ep93xx-i2s: use devm_* helpers to cleanup probe
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>
-rw-r--r--sound/soc/ep93xx/ep93xx-i2s.c49
1 files changed, 14 insertions, 35 deletions
diff --git a/sound/soc/ep93xx/ep93xx-i2s.c b/sound/soc/ep93xx/ep93xx-i2s.c
index f7a62348e3fe..8df8f6dc474f 100644
--- a/sound/soc/ep93xx/ep93xx-i2s.c
+++ b/sound/soc/ep93xx/ep93xx-i2s.c
@@ -63,7 +63,6 @@ struct ep93xx_i2s_info {
63 struct clk *sclk; 63 struct clk *sclk;
64 struct clk *lrclk; 64 struct clk *lrclk;
65 struct ep93xx_pcm_dma_params *dma_params; 65 struct ep93xx_pcm_dma_params *dma_params;
66 struct resource *mem;
67 void __iomem *regs; 66 void __iomem *regs;
68}; 67};
69 68
@@ -373,38 +372,22 @@ static int ep93xx_i2s_probe(struct platform_device *pdev)
373 struct resource *res; 372 struct resource *res;
374 int err; 373 int err;
375 374
376 info = kzalloc(sizeof(struct ep93xx_i2s_info), GFP_KERNEL); 375 info = devm_kzalloc(&pdev->dev, sizeof(*info), GFP_KERNEL);
377 if (!info) { 376 if (!info)
378 err = -ENOMEM; 377 return -ENOMEM;
379 goto fail;
380 }
381
382 dev_set_drvdata(&pdev->dev, info);
383 info->dma_params = ep93xx_i2s_dma_params;
384 378
385 res = platform_get_resource(pdev, IORESOURCE_MEM, 0); 379 res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
386 if (!res) { 380 if (!res)
387 err = -ENODEV; 381 return -ENODEV;
388 goto fail_free_info;
389 }
390 382
391 info->mem = request_mem_region(res->start, resource_size(res), 383 info->regs = devm_request_and_ioremap(&pdev->dev, res);
392 pdev->name); 384 if (!info->regs)
393 if (!info->mem) { 385 return -ENXIO;
394 err = -EBUSY;
395 goto fail_free_info;
396 }
397
398 info->regs = ioremap(info->mem->start, resource_size(info->mem));
399 if (!info->regs) {
400 err = -ENXIO;
401 goto fail_release_mem;
402 }
403 386
404 info->mclk = clk_get(&pdev->dev, "mclk"); 387 info->mclk = clk_get(&pdev->dev, "mclk");
405 if (IS_ERR(info->mclk)) { 388 if (IS_ERR(info->mclk)) {
406 err = PTR_ERR(info->mclk); 389 err = PTR_ERR(info->mclk);
407 goto fail_unmap_mem; 390 goto fail;
408 } 391 }
409 392
410 info->sclk = clk_get(&pdev->dev, "sclk"); 393 info->sclk = clk_get(&pdev->dev, "sclk");
@@ -419,6 +402,9 @@ static int ep93xx_i2s_probe(struct platform_device *pdev)
419 goto fail_put_sclk; 402 goto fail_put_sclk;
420 } 403 }
421 404
405 dev_set_drvdata(&pdev->dev, info);
406 info->dma_params = ep93xx_i2s_dma_params;
407
422 err = snd_soc_register_dai(&pdev->dev, &ep93xx_i2s_dai); 408 err = snd_soc_register_dai(&pdev->dev, &ep93xx_i2s_dai);
423 if (err) 409 if (err)
424 goto fail_put_lrclk; 410 goto fail_put_lrclk;
@@ -426,17 +412,12 @@ static int ep93xx_i2s_probe(struct platform_device *pdev)
426 return 0; 412 return 0;
427 413
428fail_put_lrclk: 414fail_put_lrclk:
415 dev_set_drvdata(&pdev->dev, NULL);
429 clk_put(info->lrclk); 416 clk_put(info->lrclk);
430fail_put_sclk: 417fail_put_sclk:
431 clk_put(info->sclk); 418 clk_put(info->sclk);
432fail_put_mclk: 419fail_put_mclk:
433 clk_put(info->mclk); 420 clk_put(info->mclk);
434fail_unmap_mem:
435 iounmap(info->regs);
436fail_release_mem:
437 release_mem_region(info->mem->start, resource_size(info->mem));
438fail_free_info:
439 kfree(info);
440fail: 421fail:
441 return err; 422 return err;
442} 423}
@@ -446,12 +427,10 @@ static int __devexit ep93xx_i2s_remove(struct platform_device *pdev)
446 struct ep93xx_i2s_info *info = dev_get_drvdata(&pdev->dev); 427 struct ep93xx_i2s_info *info = dev_get_drvdata(&pdev->dev);
447 428
448 snd_soc_unregister_dai(&pdev->dev); 429 snd_soc_unregister_dai(&pdev->dev);
430 dev_set_drvdata(&pdev->dev, NULL);
449 clk_put(info->lrclk); 431 clk_put(info->lrclk);
450 clk_put(info->sclk); 432 clk_put(info->sclk);
451 clk_put(info->mclk); 433 clk_put(info->mclk);
452 iounmap(info->regs);
453 release_mem_region(info->mem->start, resource_size(info->mem));
454 kfree(info);
455 return 0; 434 return 0;
456} 435}
457 436