diff options
author | Andy Shevchenko <andriy.shevchenko@linux.intel.com> | 2012-07-24 04:00:55 -0400 |
---|---|---|
committer | Vinod Koul <vinod.koul@linux.intel.com> | 2012-07-26 02:10:07 -0400 |
commit | dbde5c2934d10f87cc45ed9a9b95cac6f0c0fdd2 (patch) | |
tree | f1b911eb964f8a80dce0c4eb27af695295708689 | |
parent | 634332502366554849fe37e88d05ec0a13e550c8 (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.c | 53 | ||||
-rw-r--r-- | drivers/dma/dw_dmac_regs.h | 2 |
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 | |||
1495 | err_irq: | ||
1496 | clk_disable_unprepare(dw->clk); | ||
1497 | clk_put(dw->clk); | ||
1498 | err_clk: | ||
1499 | iounmap(dw->regs); | ||
1500 | dw->regs = NULL; | ||
1501 | err_release_r: | ||
1502 | release_resource(io); | ||
1503 | err_kfree: | ||
1504 | kfree(dw); | ||
1505 | return err; | ||
1506 | } | 1486 | } |
1507 | 1487 | ||
1508 | static int __devexit dw_remove(struct platform_device *pdev) | 1488 | static 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 | |||
145 | enum dw_dmac_flags { | 143 | enum dw_dmac_flags { |
146 | DW_DMA_IS_CYCLIC = 0, | 144 | DW_DMA_IS_CYCLIC = 0, |
147 | }; | 145 | }; |