diff options
Diffstat (limited to 'drivers/dma/dw_dmac.c')
-rw-r--r-- | drivers/dma/dw_dmac.c | 53 |
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 | |||
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 | ||