aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAndy Shevchenko <andriy.shevchenko@linux.intel.com>2012-07-24 04:00:55 -0400
committerVinod Koul <vinod.koul@linux.intel.com>2012-07-26 02:10:07 -0400
commitdbde5c2934d10f87cc45ed9a9b95cac6f0c0fdd2 (patch)
treef1b911eb964f8a80dce0c4eb27af695295708689
parent634332502366554849fe37e88d05ec0a13e550c8 (diff)
dw_dmac: use devm_* functions to simplify code
Use devm_kzalloc, devm_clk_get, devm_request_irq, and devm_request_and_ioremap to reduce the code and to simplify the error path. Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com> Cc: Viresh Kumar <viresh.linux@gmail.com> Acked-by: Viresh Kumar <viresh.kumar@linaro.org> Signed-off-by: Vinod Koul <vinod.koul@linux.intel.com>
-rw-r--r--drivers/dma/dw_dmac.c53
-rw-r--r--drivers/dma/dw_dmac_regs.h2
2 files changed, 10 insertions, 45 deletions
diff --git a/drivers/dma/dw_dmac.c b/drivers/dma/dw_dmac.c
index 57beb5c8e3fd..ed2c9499d3ea 100644
--- a/drivers/dma/dw_dmac.c
+++ b/drivers/dma/dw_dmac.c
@@ -1392,26 +1392,17 @@ static int __devinit dw_probe(struct platform_device *pdev)
1392 1392
1393 size = sizeof(struct dw_dma); 1393 size = sizeof(struct dw_dma);
1394 size += pdata->nr_channels * sizeof(struct dw_dma_chan); 1394 size += pdata->nr_channels * sizeof(struct dw_dma_chan);
1395 dw = kzalloc(size, GFP_KERNEL); 1395 dw = devm_kzalloc(&pdev->dev, size, GFP_KERNEL);
1396 if (!dw) 1396 if (!dw)
1397 return -ENOMEM; 1397 return -ENOMEM;
1398 1398
1399 if (!request_mem_region(io->start, DW_REGLEN, pdev->dev.driver->name)) { 1399 dw->regs = devm_request_and_ioremap(&pdev->dev, io);
1400 err = -EBUSY; 1400 if (!dw->regs)
1401 goto err_kfree; 1401 return -EBUSY;
1402 }
1403
1404 dw->regs = ioremap(io->start, DW_REGLEN);
1405 if (!dw->regs) {
1406 err = -ENOMEM;
1407 goto err_release_r;
1408 }
1409 1402
1410 dw->clk = clk_get(&pdev->dev, "hclk"); 1403 dw->clk = devm_clk_get(&pdev->dev, "hclk");
1411 if (IS_ERR(dw->clk)) { 1404 if (IS_ERR(dw->clk))
1412 err = PTR_ERR(dw->clk); 1405 return PTR_ERR(dw->clk);
1413 goto err_clk;
1414 }
1415 clk_prepare_enable(dw->clk); 1406 clk_prepare_enable(dw->clk);
1416 1407
1417 /* Calculate all channel mask before DMA setup */ 1408 /* Calculate all channel mask before DMA setup */
@@ -1423,9 +1414,10 @@ static int __devinit dw_probe(struct platform_device *pdev)
1423 /* disable BLOCK interrupts as well */ 1414 /* disable BLOCK interrupts as well */
1424 channel_clear_bit(dw, MASK.BLOCK, dw->all_chan_mask); 1415 channel_clear_bit(dw, MASK.BLOCK, dw->all_chan_mask);
1425 1416
1426 err = request_irq(irq, dw_dma_interrupt, 0, "dw_dmac", dw); 1417 err = devm_request_irq(&pdev->dev, irq, dw_dma_interrupt, 0,
1418 "dw_dmac", dw);
1427 if (err) 1419 if (err)
1428 goto err_irq; 1420 return err;
1429 1421
1430 platform_set_drvdata(pdev, dw); 1422 platform_set_drvdata(pdev, dw);
1431 1423
@@ -1491,30 +1483,16 @@ static int __devinit dw_probe(struct platform_device *pdev)
1491 dma_async_device_register(&dw->dma); 1483 dma_async_device_register(&dw->dma);
1492 1484
1493 return 0; 1485 return 0;
1494
1495err_irq:
1496 clk_disable_unprepare(dw->clk);
1497 clk_put(dw->clk);
1498err_clk:
1499 iounmap(dw->regs);
1500 dw->regs = NULL;
1501err_release_r:
1502 release_resource(io);
1503err_kfree:
1504 kfree(dw);
1505 return err;
1506} 1486}
1507 1487
1508static int __devexit dw_remove(struct platform_device *pdev) 1488static int __devexit dw_remove(struct platform_device *pdev)
1509{ 1489{
1510 struct dw_dma *dw = platform_get_drvdata(pdev); 1490 struct dw_dma *dw = platform_get_drvdata(pdev);
1511 struct dw_dma_chan *dwc, *_dwc; 1491 struct dw_dma_chan *dwc, *_dwc;
1512 struct resource *io;
1513 1492
1514 dw_dma_off(dw); 1493 dw_dma_off(dw);
1515 dma_async_device_unregister(&dw->dma); 1494 dma_async_device_unregister(&dw->dma);
1516 1495
1517 free_irq(platform_get_irq(pdev, 0), dw);
1518 tasklet_kill(&dw->tasklet); 1496 tasklet_kill(&dw->tasklet);
1519 1497
1520 list_for_each_entry_safe(dwc, _dwc, &dw->dma.channels, 1498 list_for_each_entry_safe(dwc, _dwc, &dw->dma.channels,
@@ -1523,17 +1501,6 @@ static int __devexit dw_remove(struct platform_device *pdev)
1523 channel_clear_bit(dw, CH_EN, dwc->mask); 1501 channel_clear_bit(dw, CH_EN, dwc->mask);
1524 } 1502 }
1525 1503
1526 clk_disable_unprepare(dw->clk);
1527 clk_put(dw->clk);
1528
1529 iounmap(dw->regs);
1530 dw->regs = NULL;
1531
1532 io = platform_get_resource(pdev, IORESOURCE_MEM, 0);
1533 release_mem_region(io->start, DW_REGLEN);
1534
1535 kfree(dw);
1536
1537 return 0; 1504 return 0;
1538} 1505}
1539 1506
diff --git a/drivers/dma/dw_dmac_regs.h b/drivers/dma/dw_dmac_regs.h
index 50830bee087a..f6d92d72ae40 100644
--- a/drivers/dma/dw_dmac_regs.h
+++ b/drivers/dma/dw_dmac_regs.h
@@ -140,8 +140,6 @@ struct dw_dma_regs {
140/* Bitfields in CFG */ 140/* Bitfields in CFG */
141#define DW_CFG_DMA_EN (1 << 0) 141#define DW_CFG_DMA_EN (1 << 0)
142 142
143#define DW_REGLEN 0x400
144
145enum dw_dmac_flags { 143enum dw_dmac_flags {
146 DW_DMA_IS_CYCLIC = 0, 144 DW_DMA_IS_CYCLIC = 0,
147}; 145};