dmaengine: edma: Add support for DMA_PAUSE/RESUME operation
authorPeter Ujfalusi <peter.ujfalusi@ti.com>
Mon, 14 Apr 2014 11:41:59 +0000 (14:41 +0300)
committerVinod Koul <vinod.koul@intel.com>
Tue, 22 Apr 2014 16:05:31 +0000 (21:35 +0530)
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>
drivers/dma/edma.c

index d7649d2..35db3f2 100644 (file)
@@ -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;
        }