Message ID | 1347624358-25582-3-git-send-email-peter.ujfalusi@ti.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
On Fri, 2012-09-14 at 15:05 +0300, Peter Ujfalusi wrote: > - /* FIXME: not supported by platform private API */ > - return -EINVAL; > + /* Pause/Resume only allowed with cyclic mode */ > + if (!c->cyclic) > + return -EINVAL; This is not a dma restriction right?
Hi Vinod, On 09/17/2012 06:13 AM, Vinod Koul wrote: > On Fri, 2012-09-14 at 15:05 +0300, Peter Ujfalusi wrote: >> - /* FIXME: not supported by platform private API */ >> - return -EINVAL; >> + /* Pause/Resume only allowed with cyclic mode */ >> + if (!c->cyclic) >> + return -EINVAL; > This is not a dma restriction right? The pause/resume operation has been only used by audio. This might work with non cyclic modes as well but it has never been used/tested so to be safe I have added this restriction.
On Fri, 2012-09-14 at 15:05 +0300, Peter Ujfalusi wrote: > The audio stack used omap_stop_dma/omap_start_dma to pause/resume the > DMA. > This method has been used for years on OMAP based products. > We only allow pause/resume when the DMA has been configured in cyclic > mode > which is used by the audio stack. > > Signed-off-by: Peter Ujfalusi <peter.ujfalusi@ti.com> > CC: Russell King <rmk+kernel@arm.linux.org.uk> > --- Acked-by: Vinod Koul <vinod.koul@linux.intel.com>
On Mon, Sep 17, 2012 at 08:43:57AM +0530, Vinod Koul wrote: > On Fri, 2012-09-14 at 15:05 +0300, Peter Ujfalusi wrote: > > - /* FIXME: not supported by platform private API */ > > - return -EINVAL; > > + /* Pause/Resume only allowed with cyclic mode */ > > + if (!c->cyclic) > > + return -EINVAL; > This is not a dma restriction right? This is needed because this is not a real "pause" - it is a stop, which causes the contents of the DMA engine's FIFOs to be discarded - which means a subsequent resume will loose data. -- To unsubscribe from this list: send the line "unsubscribe linux-omap" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
diff --git a/drivers/dma/omap-dma.c b/drivers/dma/omap-dma.c index b77a40d..71d7869 100644 --- a/drivers/dma/omap-dma.c +++ b/drivers/dma/omap-dma.c @@ -34,6 +34,7 @@ struct omap_chan { struct dma_slave_config cfg; unsigned dma_sig; bool cyclic; + bool paused; int dma_ch; struct omap_desc *desc; @@ -470,11 +471,14 @@ static int omap_dma_terminate_all(struct omap_chan *c) */ if (c->desc) { c->desc = NULL; - omap_stop_dma(c->dma_ch); + /* Avoid stopping the dma twice */ + if (!c->paused) + omap_stop_dma(c->dma_ch); } if (c->cyclic) { c->cyclic = false; + c->paused = false; omap_dma_unlink_lch(c->dma_ch, c->dma_ch); } @@ -487,14 +491,30 @@ static int omap_dma_terminate_all(struct omap_chan *c) static int omap_dma_pause(struct omap_chan *c) { - /* FIXME: not supported by platform private API */ - return -EINVAL; + /* Pause/Resume only allowed with cyclic mode */ + if (!c->cyclic) + return -EINVAL; + + if (!c->paused) { + omap_stop_dma(c->dma_ch); + c->paused = true; + } + + return 0; } static int omap_dma_resume(struct omap_chan *c) { - /* FIXME: not supported by platform private API */ - return -EINVAL; + /* Pause/Resume only allowed with cyclic mode */ + if (!c->cyclic) + return -EINVAL; + + if (c->paused) { + omap_start_dma(c->dma_ch); + c->paused = false; + } + + return 0; } static int omap_dma_control(struct dma_chan *chan, enum dma_ctrl_cmd cmd,
The audio stack used omap_stop_dma/omap_start_dma to pause/resume the DMA. This method has been used for years on OMAP based products. We only allow pause/resume when the DMA has been configured in cyclic mode which is used by the audio stack. Signed-off-by: Peter Ujfalusi <peter.ujfalusi@ti.com> CC: Russell King <rmk+kernel@arm.linux.org.uk> --- drivers/dma/omap-dma.c | 30 +++++++++++++++++++++++++----- 1 file changed, 25 insertions(+), 5 deletions(-)