diff options
author | Fabio Estevam <fabio.estevam@freescale.com> | 2014-12-29 12:20:52 -0500 |
---|---|---|
committer | Vinod Koul <vinod.koul@intel.com> | 2015-01-13 13:21:07 -0500 |
commit | 7f24e0ee00d052f1710b68bbf6221cc674eb7a9b (patch) | |
tree | e4a78e402c2d27e7d615dc6590071a363bddf591 /drivers/dma/imx-sdma.c | |
parent | 1e4a4f50d2466d18a3e6c64ddd39f2528172b90d (diff) |
dmaengine: imx-sdma: Use devm functions
By using devm functions we can make the code shorter and cleaner.
Signed-off-by: Fabio Estevam <fabio.estevam@freescale.com>
Signed-off-by: Vinod Koul <vinod.koul@intel.com>
Diffstat (limited to 'drivers/dma/imx-sdma.c')
-rw-r--r-- | drivers/dma/imx-sdma.c | 62 |
1 files changed, 16 insertions, 46 deletions
diff --git a/drivers/dma/imx-sdma.c b/drivers/dma/imx-sdma.c index d28c26bf7a2a..125c326c525f 100644 --- a/drivers/dma/imx-sdma.c +++ b/drivers/dma/imx-sdma.c | |||
@@ -1472,7 +1472,7 @@ static int sdma_probe(struct platform_device *pdev) | |||
1472 | if (ret) | 1472 | if (ret) |
1473 | return ret; | 1473 | return ret; |
1474 | 1474 | ||
1475 | sdma = kzalloc(sizeof(*sdma), GFP_KERNEL); | 1475 | sdma = devm_kzalloc(&pdev->dev, sizeof(*sdma), GFP_KERNEL); |
1476 | if (!sdma) | 1476 | if (!sdma) |
1477 | return -ENOMEM; | 1477 | return -ENOMEM; |
1478 | 1478 | ||
@@ -1481,48 +1481,34 @@ static int sdma_probe(struct platform_device *pdev) | |||
1481 | sdma->dev = &pdev->dev; | 1481 | sdma->dev = &pdev->dev; |
1482 | sdma->drvdata = drvdata; | 1482 | sdma->drvdata = drvdata; |
1483 | 1483 | ||
1484 | iores = platform_get_resource(pdev, IORESOURCE_MEM, 0); | ||
1485 | irq = platform_get_irq(pdev, 0); | 1484 | irq = platform_get_irq(pdev, 0); |
1486 | if (!iores || irq < 0) { | 1485 | if (irq < 0) |
1487 | ret = -EINVAL; | 1486 | return -EINVAL; |
1488 | goto err_irq; | ||
1489 | } | ||
1490 | 1487 | ||
1491 | if (!request_mem_region(iores->start, resource_size(iores), pdev->name)) { | 1488 | iores = platform_get_resource(pdev, IORESOURCE_MEM, 0); |
1492 | ret = -EBUSY; | 1489 | sdma->regs = devm_ioremap_resource(&pdev->dev, iores); |
1493 | goto err_request_region; | 1490 | if (IS_ERR(sdma->regs)) |
1494 | } | 1491 | return PTR_ERR(sdma->regs); |
1495 | 1492 | ||
1496 | sdma->clk_ipg = devm_clk_get(&pdev->dev, "ipg"); | 1493 | sdma->clk_ipg = devm_clk_get(&pdev->dev, "ipg"); |
1497 | if (IS_ERR(sdma->clk_ipg)) { | 1494 | if (IS_ERR(sdma->clk_ipg)) |
1498 | ret = PTR_ERR(sdma->clk_ipg); | 1495 | return PTR_ERR(sdma->clk_ipg); |
1499 | goto err_clk; | ||
1500 | } | ||
1501 | 1496 | ||
1502 | sdma->clk_ahb = devm_clk_get(&pdev->dev, "ahb"); | 1497 | sdma->clk_ahb = devm_clk_get(&pdev->dev, "ahb"); |
1503 | if (IS_ERR(sdma->clk_ahb)) { | 1498 | if (IS_ERR(sdma->clk_ahb)) |
1504 | ret = PTR_ERR(sdma->clk_ahb); | 1499 | return PTR_ERR(sdma->clk_ahb); |
1505 | goto err_clk; | ||
1506 | } | ||
1507 | 1500 | ||
1508 | clk_prepare(sdma->clk_ipg); | 1501 | clk_prepare(sdma->clk_ipg); |
1509 | clk_prepare(sdma->clk_ahb); | 1502 | clk_prepare(sdma->clk_ahb); |
1510 | 1503 | ||
1511 | sdma->regs = ioremap(iores->start, resource_size(iores)); | 1504 | ret = devm_request_irq(&pdev->dev, irq, sdma_int_handler, 0, "sdma", |
1512 | if (!sdma->regs) { | 1505 | sdma); |
1513 | ret = -ENOMEM; | ||
1514 | goto err_ioremap; | ||
1515 | } | ||
1516 | |||
1517 | ret = request_irq(irq, sdma_int_handler, 0, "sdma", sdma); | ||
1518 | if (ret) | 1506 | if (ret) |
1519 | goto err_request_irq; | 1507 | return ret; |
1520 | 1508 | ||
1521 | sdma->script_addrs = kzalloc(sizeof(*sdma->script_addrs), GFP_KERNEL); | 1509 | sdma->script_addrs = kzalloc(sizeof(*sdma->script_addrs), GFP_KERNEL); |
1522 | if (!sdma->script_addrs) { | 1510 | if (!sdma->script_addrs) |
1523 | ret = -ENOMEM; | 1511 | return -ENOMEM; |
1524 | goto err_alloc; | ||
1525 | } | ||
1526 | 1512 | ||
1527 | /* initially no scripts available */ | 1513 | /* initially no scripts available */ |
1528 | saddr_arr = (s32 *)sdma->script_addrs; | 1514 | saddr_arr = (s32 *)sdma->script_addrs; |
@@ -1627,38 +1613,22 @@ err_register: | |||
1627 | dma_async_device_unregister(&sdma->dma_device); | 1613 | dma_async_device_unregister(&sdma->dma_device); |
1628 | err_init: | 1614 | err_init: |
1629 | kfree(sdma->script_addrs); | 1615 | kfree(sdma->script_addrs); |
1630 | err_alloc: | ||
1631 | free_irq(irq, sdma); | ||
1632 | err_request_irq: | ||
1633 | iounmap(sdma->regs); | ||
1634 | err_ioremap: | ||
1635 | err_clk: | ||
1636 | release_mem_region(iores->start, resource_size(iores)); | ||
1637 | err_request_region: | ||
1638 | err_irq: | ||
1639 | kfree(sdma); | ||
1640 | return ret; | 1616 | return ret; |
1641 | } | 1617 | } |
1642 | 1618 | ||
1643 | static int sdma_remove(struct platform_device *pdev) | 1619 | static int sdma_remove(struct platform_device *pdev) |
1644 | { | 1620 | { |
1645 | struct sdma_engine *sdma = platform_get_drvdata(pdev); | 1621 | struct sdma_engine *sdma = platform_get_drvdata(pdev); |
1646 | struct resource *iores = platform_get_resource(pdev, IORESOURCE_MEM, 0); | ||
1647 | int irq = platform_get_irq(pdev, 0); | ||
1648 | int i; | 1622 | int i; |
1649 | 1623 | ||
1650 | dma_async_device_unregister(&sdma->dma_device); | 1624 | dma_async_device_unregister(&sdma->dma_device); |
1651 | kfree(sdma->script_addrs); | 1625 | kfree(sdma->script_addrs); |
1652 | free_irq(irq, sdma); | ||
1653 | iounmap(sdma->regs); | ||
1654 | release_mem_region(iores->start, resource_size(iores)); | ||
1655 | /* Kill the tasklet */ | 1626 | /* Kill the tasklet */ |
1656 | for (i = 0; i < MAX_DMA_CHANNELS; i++) { | 1627 | for (i = 0; i < MAX_DMA_CHANNELS; i++) { |
1657 | struct sdma_channel *sdmac = &sdma->channel[i]; | 1628 | struct sdma_channel *sdmac = &sdma->channel[i]; |
1658 | 1629 | ||
1659 | tasklet_kill(&sdmac->tasklet); | 1630 | tasklet_kill(&sdmac->tasklet); |
1660 | } | 1631 | } |
1661 | kfree(sdma); | ||
1662 | 1632 | ||
1663 | platform_set_drvdata(pdev, NULL); | 1633 | platform_set_drvdata(pdev, NULL); |
1664 | dev_info(&pdev->dev, "Removed...\n"); | 1634 | dev_info(&pdev->dev, "Removed...\n"); |