diff options
Diffstat (limited to 'drivers/dma/dw_dmac.c')
-rw-r--r-- | drivers/dma/dw_dmac.c | 26 |
1 files changed, 18 insertions, 8 deletions
diff --git a/drivers/dma/dw_dmac.c b/drivers/dma/dw_dmac.c index 7439079f5eed..e23dc82d43ac 100644 --- a/drivers/dma/dw_dmac.c +++ b/drivers/dma/dw_dmac.c | |||
@@ -17,6 +17,7 @@ | |||
17 | #include <linux/init.h> | 17 | #include <linux/init.h> |
18 | #include <linux/interrupt.h> | 18 | #include <linux/interrupt.h> |
19 | #include <linux/io.h> | 19 | #include <linux/io.h> |
20 | #include <linux/of.h> | ||
20 | #include <linux/mm.h> | 21 | #include <linux/mm.h> |
21 | #include <linux/module.h> | 22 | #include <linux/module.h> |
22 | #include <linux/platform_device.h> | 23 | #include <linux/platform_device.h> |
@@ -742,7 +743,7 @@ dwc_prep_slave_sg(struct dma_chan *chan, struct scatterlist *sgl, | |||
742 | struct dw_desc *desc; | 743 | struct dw_desc *desc; |
743 | u32 len, dlen, mem; | 744 | u32 len, dlen, mem; |
744 | 745 | ||
745 | mem = sg_phys(sg); | 746 | mem = sg_dma_address(sg); |
746 | len = sg_dma_len(sg); | 747 | len = sg_dma_len(sg); |
747 | 748 | ||
748 | if (!((mem | len) & 7)) | 749 | if (!((mem | len) & 7)) |
@@ -809,7 +810,7 @@ slave_sg_todev_fill_desc: | |||
809 | struct dw_desc *desc; | 810 | struct dw_desc *desc; |
810 | u32 len, dlen, mem; | 811 | u32 len, dlen, mem; |
811 | 812 | ||
812 | mem = sg_phys(sg); | 813 | mem = sg_dma_address(sg); |
813 | len = sg_dma_len(sg); | 814 | len = sg_dma_len(sg); |
814 | 815 | ||
815 | if (!((mem | len) & 7)) | 816 | if (!((mem | len) & 7)) |
@@ -1429,7 +1430,7 @@ static int __init dw_probe(struct platform_device *pdev) | |||
1429 | err = PTR_ERR(dw->clk); | 1430 | err = PTR_ERR(dw->clk); |
1430 | goto err_clk; | 1431 | goto err_clk; |
1431 | } | 1432 | } |
1432 | clk_enable(dw->clk); | 1433 | clk_prepare_enable(dw->clk); |
1433 | 1434 | ||
1434 | /* force dma off, just in case */ | 1435 | /* force dma off, just in case */ |
1435 | dw_dma_off(dw); | 1436 | dw_dma_off(dw); |
@@ -1510,7 +1511,7 @@ static int __init dw_probe(struct platform_device *pdev) | |||
1510 | return 0; | 1511 | return 0; |
1511 | 1512 | ||
1512 | err_irq: | 1513 | err_irq: |
1513 | clk_disable(dw->clk); | 1514 | clk_disable_unprepare(dw->clk); |
1514 | clk_put(dw->clk); | 1515 | clk_put(dw->clk); |
1515 | err_clk: | 1516 | err_clk: |
1516 | iounmap(dw->regs); | 1517 | iounmap(dw->regs); |
@@ -1540,7 +1541,7 @@ static int __exit dw_remove(struct platform_device *pdev) | |||
1540 | channel_clear_bit(dw, CH_EN, dwc->mask); | 1541 | channel_clear_bit(dw, CH_EN, dwc->mask); |
1541 | } | 1542 | } |
1542 | 1543 | ||
1543 | clk_disable(dw->clk); | 1544 | clk_disable_unprepare(dw->clk); |
1544 | clk_put(dw->clk); | 1545 | clk_put(dw->clk); |
1545 | 1546 | ||
1546 | iounmap(dw->regs); | 1547 | iounmap(dw->regs); |
@@ -1559,7 +1560,7 @@ static void dw_shutdown(struct platform_device *pdev) | |||
1559 | struct dw_dma *dw = platform_get_drvdata(pdev); | 1560 | struct dw_dma *dw = platform_get_drvdata(pdev); |
1560 | 1561 | ||
1561 | dw_dma_off(platform_get_drvdata(pdev)); | 1562 | dw_dma_off(platform_get_drvdata(pdev)); |
1562 | clk_disable(dw->clk); | 1563 | clk_disable_unprepare(dw->clk); |
1563 | } | 1564 | } |
1564 | 1565 | ||
1565 | static int dw_suspend_noirq(struct device *dev) | 1566 | static int dw_suspend_noirq(struct device *dev) |
@@ -1568,7 +1569,7 @@ static int dw_suspend_noirq(struct device *dev) | |||
1568 | struct dw_dma *dw = platform_get_drvdata(pdev); | 1569 | struct dw_dma *dw = platform_get_drvdata(pdev); |
1569 | 1570 | ||
1570 | dw_dma_off(platform_get_drvdata(pdev)); | 1571 | dw_dma_off(platform_get_drvdata(pdev)); |
1571 | clk_disable(dw->clk); | 1572 | clk_disable_unprepare(dw->clk); |
1572 | 1573 | ||
1573 | return 0; | 1574 | return 0; |
1574 | } | 1575 | } |
@@ -1578,7 +1579,7 @@ static int dw_resume_noirq(struct device *dev) | |||
1578 | struct platform_device *pdev = to_platform_device(dev); | 1579 | struct platform_device *pdev = to_platform_device(dev); |
1579 | struct dw_dma *dw = platform_get_drvdata(pdev); | 1580 | struct dw_dma *dw = platform_get_drvdata(pdev); |
1580 | 1581 | ||
1581 | clk_enable(dw->clk); | 1582 | clk_prepare_enable(dw->clk); |
1582 | dma_writel(dw, CFG, DW_CFG_DMA_EN); | 1583 | dma_writel(dw, CFG, DW_CFG_DMA_EN); |
1583 | return 0; | 1584 | return 0; |
1584 | } | 1585 | } |
@@ -1592,12 +1593,21 @@ static const struct dev_pm_ops dw_dev_pm_ops = { | |||
1592 | .poweroff_noirq = dw_suspend_noirq, | 1593 | .poweroff_noirq = dw_suspend_noirq, |
1593 | }; | 1594 | }; |
1594 | 1595 | ||
1596 | #ifdef CONFIG_OF | ||
1597 | static const struct of_device_id dw_dma_id_table[] = { | ||
1598 | { .compatible = "snps,dma-spear1340" }, | ||
1599 | {} | ||
1600 | }; | ||
1601 | MODULE_DEVICE_TABLE(of, dw_dma_id_table); | ||
1602 | #endif | ||
1603 | |||
1595 | static struct platform_driver dw_driver = { | 1604 | static struct platform_driver dw_driver = { |
1596 | .remove = __exit_p(dw_remove), | 1605 | .remove = __exit_p(dw_remove), |
1597 | .shutdown = dw_shutdown, | 1606 | .shutdown = dw_shutdown, |
1598 | .driver = { | 1607 | .driver = { |
1599 | .name = "dw_dmac", | 1608 | .name = "dw_dmac", |
1600 | .pm = &dw_dev_pm_ops, | 1609 | .pm = &dw_dev_pm_ops, |
1610 | .of_match_table = of_match_ptr(dw_dma_id_table), | ||
1601 | }, | 1611 | }, |
1602 | }; | 1612 | }; |
1603 | 1613 | ||