diff options
author | Peter Ujfalusi <peter.ujfalusi@ti.com> | 2014-04-14 15:41:59 +0400 |
---|---|---|
committer | Vinod Koul <vinod.koul@intel.com> | 2014-04-22 20:05:31 +0400 |
commit | 72c7b67affc3ee63fc3df6e4a28d452a4e82e332 (patch) | |
tree | 75be25a35ba848ca36377befdbc3b15cdd1757f4 /drivers/dma | |
parent | b2b617de04081931cc10fd862b76b9fcaa9489e2 (diff) | |
download | linux-72c7b67affc3ee63fc3df6e4a28d452a4e82e332.tar.xz |
dmaengine: edma: Add support for DMA_PAUSE/RESUME operation
Pause/Resume can be used by the audio stack when the stream is paused/resumed
The edma platform code has support for this and the legacy audio stack used
this.
Signed-off-by: Peter Ujfalusi <peter.ujfalusi@ti.com>
Acked-by: Joel Fernandes <joelf@ti.com>
Reviewed-and-Tested-by: Joel Fernandes <joelf@ti.com>
Signed-off-by: Vinod Koul <vinod.koul@intel.com>
Diffstat (limited to 'drivers/dma')
-rw-r--r-- | drivers/dma/edma.c | 28 |
1 files changed, 28 insertions, 0 deletions
diff --git a/drivers/dma/edma.c b/drivers/dma/edma.c index d7649d229755..35db3f282bdb 100644 --- a/drivers/dma/edma.c +++ b/drivers/dma/edma.c @@ -242,6 +242,26 @@ static int edma_slave_config(struct edma_chan *echan, return 0; } +static int edma_dma_pause(struct edma_chan *echan) +{ + /* Pause/Resume only allowed with cyclic mode */ + if (!echan->edesc->cyclic) + return -EINVAL; + + edma_pause(echan->ch_num); + return 0; +} + +static int edma_dma_resume(struct edma_chan *echan) +{ + /* Pause/Resume only allowed with cyclic mode */ + if (!echan->edesc->cyclic) + return -EINVAL; + + edma_resume(echan->ch_num); + return 0; +} + static int edma_control(struct dma_chan *chan, enum dma_ctrl_cmd cmd, unsigned long arg) { @@ -257,6 +277,14 @@ static int edma_control(struct dma_chan *chan, enum dma_ctrl_cmd cmd, config = (struct dma_slave_config *)arg; ret = edma_slave_config(echan, config); break; + case DMA_PAUSE: + ret = edma_dma_pause(echan); + break; + + case DMA_RESUME: + ret = edma_dma_resume(echan); + break; + default: ret = -ENOSYS; } |