dmaengine.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH v1] dmaengine: dw: Enable runtime PM
@ 2020-11-03 18:39 Andy Shevchenko
  2020-11-04  3:05 ` Viresh Kumar
  2020-11-09 11:49 ` Vinod Koul
  0 siblings, 2 replies; 3+ messages in thread
From: Andy Shevchenko @ 2020-11-03 18:39 UTC (permalink / raw)
  To: Viresh Kumar, dmaengine, Vinod Koul, Dan Williams, Serge Semin
  Cc: Andy Shevchenko

When consumer requests channel power on the DMA controller device
and otherwise on the freeing channel resources.

Note, in some cases consumer acquires channel at the ->probe() stage and
releases it at the ->remove() stage. It will mean that DMA controller device
will be powered during all this time if there is no assist from hardware
to idle it. The above mentioned cases should be investigated separately
and individually.

Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
---
 drivers/dma/dw/core.c | 6 ++++++
 1 file changed, 6 insertions(+)

diff --git a/drivers/dma/dw/core.c b/drivers/dma/dw/core.c
index 7ab83fe601ed..19a23767533a 100644
--- a/drivers/dma/dw/core.c
+++ b/drivers/dma/dw/core.c
@@ -982,8 +982,11 @@ static int dwc_alloc_chan_resources(struct dma_chan *chan)
 
 	dev_vdbg(chan2dev(chan), "%s\n", __func__);
 
+	pm_runtime_get_sync(dw->dma.dev);
+
 	/* ASSERT:  channel is idle */
 	if (dma_readl(dw, CH_EN) & dwc->mask) {
+		pm_runtime_put_sync_suspend(dw->dma.dev);
 		dev_dbg(chan2dev(chan), "DMA channel not idle?\n");
 		return -EIO;
 	}
@@ -1000,6 +1003,7 @@ static int dwc_alloc_chan_resources(struct dma_chan *chan)
 	 * We need controller-specific data to set up slave transfers.
 	 */
 	if (chan->private && !dw_dma_filter(chan, chan->private)) {
+		pm_runtime_put_sync_suspend(dw->dma.dev);
 		dev_warn(chan2dev(chan), "Wrong controller-specific data\n");
 		return -EINVAL;
 	}
@@ -1043,6 +1047,8 @@ static void dwc_free_chan_resources(struct dma_chan *chan)
 	if (!dw->in_use)
 		do_dw_dma_off(dw);
 
+	pm_runtime_put_sync_suspend(dw->dma.dev);
+
 	dev_vdbg(chan2dev(chan), "%s: done\n", __func__);
 }
 
-- 
2.28.0


^ permalink raw reply related	[flat|nested] 3+ messages in thread

* Re: [PATCH v1] dmaengine: dw: Enable runtime PM
  2020-11-03 18:39 [PATCH v1] dmaengine: dw: Enable runtime PM Andy Shevchenko
@ 2020-11-04  3:05 ` Viresh Kumar
  2020-11-09 11:49 ` Vinod Koul
  1 sibling, 0 replies; 3+ messages in thread
From: Viresh Kumar @ 2020-11-04  3:05 UTC (permalink / raw)
  To: Andy Shevchenko
  Cc: Viresh Kumar, dmaengine, Vinod Koul, Dan Williams, Serge Semin

On 03-11-20, 20:39, Andy Shevchenko wrote:
> When consumer requests channel power on the DMA controller device
> and otherwise on the freeing channel resources.
> 
> Note, in some cases consumer acquires channel at the ->probe() stage and
> releases it at the ->remove() stage. It will mean that DMA controller device
> will be powered during all this time if there is no assist from hardware
> to idle it. The above mentioned cases should be investigated separately
> and individually.
> 
> Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
> ---
>  drivers/dma/dw/core.c | 6 ++++++
>  1 file changed, 6 insertions(+)
> 
> diff --git a/drivers/dma/dw/core.c b/drivers/dma/dw/core.c
> index 7ab83fe601ed..19a23767533a 100644
> --- a/drivers/dma/dw/core.c
> +++ b/drivers/dma/dw/core.c
> @@ -982,8 +982,11 @@ static int dwc_alloc_chan_resources(struct dma_chan *chan)
>  
>  	dev_vdbg(chan2dev(chan), "%s\n", __func__);
>  
> +	pm_runtime_get_sync(dw->dma.dev);
> +
>  	/* ASSERT:  channel is idle */
>  	if (dma_readl(dw, CH_EN) & dwc->mask) {
> +		pm_runtime_put_sync_suspend(dw->dma.dev);
>  		dev_dbg(chan2dev(chan), "DMA channel not idle?\n");
>  		return -EIO;
>  	}
> @@ -1000,6 +1003,7 @@ static int dwc_alloc_chan_resources(struct dma_chan *chan)
>  	 * We need controller-specific data to set up slave transfers.
>  	 */
>  	if (chan->private && !dw_dma_filter(chan, chan->private)) {
> +		pm_runtime_put_sync_suspend(dw->dma.dev);
>  		dev_warn(chan2dev(chan), "Wrong controller-specific data\n");
>  		return -EINVAL;
>  	}
> @@ -1043,6 +1047,8 @@ static void dwc_free_chan_resources(struct dma_chan *chan)
>  	if (!dw->in_use)
>  		do_dw_dma_off(dw);
>  
> +	pm_runtime_put_sync_suspend(dw->dma.dev);
> +
>  	dev_vdbg(chan2dev(chan), "%s: done\n", __func__);
>  }

Acked-by: Viresh Kumar <viresh.kumar@linaro.org>

-- 
viresh

^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: [PATCH v1] dmaengine: dw: Enable runtime PM
  2020-11-03 18:39 [PATCH v1] dmaengine: dw: Enable runtime PM Andy Shevchenko
  2020-11-04  3:05 ` Viresh Kumar
@ 2020-11-09 11:49 ` Vinod Koul
  1 sibling, 0 replies; 3+ messages in thread
From: Vinod Koul @ 2020-11-09 11:49 UTC (permalink / raw)
  To: Andy Shevchenko; +Cc: Viresh Kumar, dmaengine, Dan Williams, Serge Semin

On 03-11-20, 20:39, Andy Shevchenko wrote:
> When consumer requests channel power on the DMA controller device
> and otherwise on the freeing channel resources.
> 
> Note, in some cases consumer acquires channel at the ->probe() stage and
> releases it at the ->remove() stage. It will mean that DMA controller device
> will be powered during all this time if there is no assist from hardware
> to idle it. The above mentioned cases should be investigated separately
> and individually.

Applied, thanks

-- 
~Vinod

^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2020-11-09 11:49 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-11-03 18:39 [PATCH v1] dmaengine: dw: Enable runtime PM Andy Shevchenko
2020-11-04  3:05 ` Viresh Kumar
2020-11-09 11:49 ` Vinod Koul

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).