diff options
-rw-r--r-- | drivers/dma/dw/core.c | 11 |
1 files changed, 11 insertions, 0 deletions
diff --git a/drivers/dma/dw/core.c b/drivers/dma/dw/core.c index 244722170410..380478562b7d 100644 --- a/drivers/dma/dw/core.c +++ b/drivers/dma/dw/core.c | |||
@@ -22,6 +22,7 @@ | |||
22 | #include <linux/mm.h> | 22 | #include <linux/mm.h> |
23 | #include <linux/module.h> | 23 | #include <linux/module.h> |
24 | #include <linux/slab.h> | 24 | #include <linux/slab.h> |
25 | #include <linux/pm_runtime.h> | ||
25 | 26 | ||
26 | #include "../dmaengine.h" | 27 | #include "../dmaengine.h" |
27 | #include "internal.h" | 28 | #include "internal.h" |
@@ -1504,6 +1505,9 @@ int dw_dma_probe(struct dw_dma_chip *chip, struct dw_dma_platform_data *pdata) | |||
1504 | dw->regs = chip->regs; | 1505 | dw->regs = chip->regs; |
1505 | chip->dw = dw; | 1506 | chip->dw = dw; |
1506 | 1507 | ||
1508 | pm_runtime_enable(chip->dev); | ||
1509 | pm_runtime_get_sync(chip->dev); | ||
1510 | |||
1507 | dw_params = dma_read_byaddr(chip->regs, DW_PARAMS); | 1511 | dw_params = dma_read_byaddr(chip->regs, DW_PARAMS); |
1508 | autocfg = dw_params >> DW_PARAMS_EN & 0x1; | 1512 | autocfg = dw_params >> DW_PARAMS_EN & 0x1; |
1509 | 1513 | ||
@@ -1667,11 +1671,14 @@ int dw_dma_probe(struct dw_dma_chip *chip, struct dw_dma_platform_data *pdata) | |||
1667 | dev_info(chip->dev, "DesignWare DMA Controller, %d channels\n", | 1671 | dev_info(chip->dev, "DesignWare DMA Controller, %d channels\n", |
1668 | nr_channels); | 1672 | nr_channels); |
1669 | 1673 | ||
1674 | pm_runtime_put_sync_suspend(chip->dev); | ||
1675 | |||
1670 | return 0; | 1676 | return 0; |
1671 | 1677 | ||
1672 | err_dma_register: | 1678 | err_dma_register: |
1673 | free_irq(chip->irq, dw); | 1679 | free_irq(chip->irq, dw); |
1674 | err_pdata: | 1680 | err_pdata: |
1681 | pm_runtime_put_sync_suspend(chip->dev); | ||
1675 | return err; | 1682 | return err; |
1676 | } | 1683 | } |
1677 | EXPORT_SYMBOL_GPL(dw_dma_probe); | 1684 | EXPORT_SYMBOL_GPL(dw_dma_probe); |
@@ -1681,6 +1688,8 @@ int dw_dma_remove(struct dw_dma_chip *chip) | |||
1681 | struct dw_dma *dw = chip->dw; | 1688 | struct dw_dma *dw = chip->dw; |
1682 | struct dw_dma_chan *dwc, *_dwc; | 1689 | struct dw_dma_chan *dwc, *_dwc; |
1683 | 1690 | ||
1691 | pm_runtime_get_sync(chip->dev); | ||
1692 | |||
1684 | dw_dma_off(dw); | 1693 | dw_dma_off(dw); |
1685 | dma_async_device_unregister(&dw->dma); | 1694 | dma_async_device_unregister(&dw->dma); |
1686 | 1695 | ||
@@ -1693,6 +1702,8 @@ int dw_dma_remove(struct dw_dma_chip *chip) | |||
1693 | channel_clear_bit(dw, CH_EN, dwc->mask); | 1702 | channel_clear_bit(dw, CH_EN, dwc->mask); |
1694 | } | 1703 | } |
1695 | 1704 | ||
1705 | pm_runtime_put_sync_suspend(chip->dev); | ||
1706 | pm_runtime_disable(chip->dev); | ||
1696 | return 0; | 1707 | return 0; |
1697 | } | 1708 | } |
1698 | EXPORT_SYMBOL_GPL(dw_dma_remove); | 1709 | EXPORT_SYMBOL_GPL(dw_dma_remove); |