diff options
author | Viresh Kumar <viresh.kumar@st.com> | 2011-08-05 06:02:33 -0400 |
---|---|---|
committer | Vinod Koul <vinod.koul@intel.com> | 2011-08-25 10:03:38 -0400 |
commit | b7b6018bad6fd7ebe5a78bda5f2a71a6ecf5406a (patch) | |
tree | 652c64fd26877df5f5257540aa257e0f64459b23 /drivers/dma/amba-pl08x.c | |
parent | 175a5e617cd820d9e22d9e4f6d3ef736b2f874b1 (diff) |
dmaengine/amba-pl08x: support runtime PM
Insert notifiers for the runtime PM API. With this the runtime PM layer kicks in
to action where used.
Signed-off-by: Viresh Kumar <viresh.kumar@st.com>
Acked-by: Linus Walleij <linus.walleij@linaro.org>
Signed-off-by: Vinod Koul <vinod.koul@intel.com>
Diffstat (limited to 'drivers/dma/amba-pl08x.c')
-rw-r--r-- | drivers/dma/amba-pl08x.c | 12 |
1 files changed, 12 insertions, 0 deletions
diff --git a/drivers/dma/amba-pl08x.c b/drivers/dma/amba-pl08x.c index ead88c9a5e93..5dd97f450925 100644 --- a/drivers/dma/amba-pl08x.c +++ b/drivers/dma/amba-pl08x.c | |||
@@ -84,6 +84,7 @@ | |||
84 | #include <linux/init.h> | 84 | #include <linux/init.h> |
85 | #include <linux/interrupt.h> | 85 | #include <linux/interrupt.h> |
86 | #include <linux/module.h> | 86 | #include <linux/module.h> |
87 | #include <linux/pm_runtime.h> | ||
87 | #include <linux/seq_file.h> | 88 | #include <linux/seq_file.h> |
88 | #include <linux/slab.h> | 89 | #include <linux/slab.h> |
89 | #include <asm/hardware/pl080.h> | 90 | #include <asm/hardware/pl080.h> |
@@ -405,6 +406,7 @@ pl08x_get_phy_channel(struct pl08x_driver_data *pl08x, | |||
405 | return NULL; | 406 | return NULL; |
406 | } | 407 | } |
407 | 408 | ||
409 | pm_runtime_get_sync(&pl08x->adev->dev); | ||
408 | return ch; | 410 | return ch; |
409 | } | 411 | } |
410 | 412 | ||
@@ -418,6 +420,8 @@ static inline void pl08x_put_phy_channel(struct pl08x_driver_data *pl08x, | |||
418 | /* Stop the channel and clear its interrupts */ | 420 | /* Stop the channel and clear its interrupts */ |
419 | pl08x_terminate_phy_chan(pl08x, ch); | 421 | pl08x_terminate_phy_chan(pl08x, ch); |
420 | 422 | ||
423 | pm_runtime_put(&pl08x->adev->dev); | ||
424 | |||
421 | /* Mark it as free */ | 425 | /* Mark it as free */ |
422 | ch->serving = NULL; | 426 | ch->serving = NULL; |
423 | spin_unlock_irqrestore(&ch->lock, flags); | 427 | spin_unlock_irqrestore(&ch->lock, flags); |
@@ -1855,6 +1859,9 @@ static int pl08x_probe(struct amba_device *adev, const struct amba_id *id) | |||
1855 | goto out_no_pl08x; | 1859 | goto out_no_pl08x; |
1856 | } | 1860 | } |
1857 | 1861 | ||
1862 | pm_runtime_set_active(&adev->dev); | ||
1863 | pm_runtime_enable(&adev->dev); | ||
1864 | |||
1858 | /* Initialize memcpy engine */ | 1865 | /* Initialize memcpy engine */ |
1859 | dma_cap_set(DMA_MEMCPY, pl08x->memcpy.cap_mask); | 1866 | dma_cap_set(DMA_MEMCPY, pl08x->memcpy.cap_mask); |
1860 | pl08x->memcpy.dev = &adev->dev; | 1867 | pl08x->memcpy.dev = &adev->dev; |
@@ -1992,6 +1999,8 @@ static int pl08x_probe(struct amba_device *adev, const struct amba_id *id) | |||
1992 | dev_info(&pl08x->adev->dev, "DMA: PL%03x rev%u at 0x%08llx irq %d\n", | 1999 | dev_info(&pl08x->adev->dev, "DMA: PL%03x rev%u at 0x%08llx irq %d\n", |
1993 | amba_part(adev), amba_rev(adev), | 2000 | amba_part(adev), amba_rev(adev), |
1994 | (unsigned long long)adev->res.start, adev->irq[0]); | 2001 | (unsigned long long)adev->res.start, adev->irq[0]); |
2002 | |||
2003 | pm_runtime_put(&adev->dev); | ||
1995 | return 0; | 2004 | return 0; |
1996 | 2005 | ||
1997 | out_no_slave_reg: | 2006 | out_no_slave_reg: |
@@ -2010,6 +2019,9 @@ out_no_ioremap: | |||
2010 | dma_pool_destroy(pl08x->pool); | 2019 | dma_pool_destroy(pl08x->pool); |
2011 | out_no_lli_pool: | 2020 | out_no_lli_pool: |
2012 | out_no_platdata: | 2021 | out_no_platdata: |
2022 | pm_runtime_put(&adev->dev); | ||
2023 | pm_runtime_disable(&adev->dev); | ||
2024 | |||
2013 | kfree(pl08x); | 2025 | kfree(pl08x); |
2014 | out_no_pl08x: | 2026 | out_no_pl08x: |
2015 | amba_release_regions(adev); | 2027 | amba_release_regions(adev); |