aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/dma/dw_dmac.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/dma/dw_dmac.c')
-rw-r--r--drivers/dma/dw_dmac.c53
1 files changed, 10 insertions, 43 deletions
diff --git a/drivers/dma/dw_dmac.c b/drivers/dma/dw_dmac.c
index d3c5a5a88f1e..4f4ff1337cac 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