@@ -774,6 +774,26 @@ static void rcar_dmac_chan_reinit(struct rcar_dmac_chan *chan)
}
}
+static int rcar_dmac_chan_pause(struct dma_chan *chan)
+{
+ u32 chcr;
+ int ret;
+ unsigned long flags;
+ struct rcar_dmac_chan *rchan = to_rcar_dmac_chan(chan);
+
+ spin_lock_irqsave(&rchan->lock, flags);
+
+ chcr = rcar_dmac_chan_read(rchan, RCAR_DMACHCR);
+ chcr &= ~RCAR_DMACHCR_DE;
+ rcar_dmac_chan_write(rchan, RCAR_DMACHCR, chcr);
+ ret = rcar_dmac_wait_stop(rchan);
+
+ spin_unlock_irqrestore(&rchan->lock, flags);
+
+ WARN_ON(ret < 0);
+ return ret;
+}
+
static void rcar_dmac_stop(struct rcar_dmac *dmac)
{
rcar_dmac_write(dmac, RCAR_DMAOR, 0);
@@ -1740,6 +1760,7 @@ static int rcar_dmac_probe(struct platform_device *pdev)
engine->device_prep_slave_sg = rcar_dmac_prep_slave_sg;
engine->device_prep_dma_cyclic = rcar_dmac_prep_dma_cyclic;
engine->device_config = rcar_dmac_device_config;
+ engine->device_pause = rcar_dmac_chan_pause;
engine->device_terminate_all = rcar_dmac_chan_terminate_all;
engine->device_tx_status = rcar_dmac_tx_status;
engine->device_issue_pending = rcar_dmac_issue_pending;