|
@@ -759,18 +759,25 @@ static void rcar_dmac_chcr_de_barrier(struct rcar_dmac_chan *chan)
|
|
|
dev_err(chan->chan.device->dev, "CHCR DE check error\n");
|
|
|
}
|
|
|
|
|
|
-static void rcar_dmac_sync_tcr(struct rcar_dmac_chan *chan)
|
|
|
+static void rcar_dmac_clear_chcr_de(struct rcar_dmac_chan *chan)
|
|
|
{
|
|
|
u32 chcr = rcar_dmac_chan_read(chan, RCAR_DMACHCR);
|
|
|
|
|
|
- if (!(chcr & RCAR_DMACHCR_DE))
|
|
|
- return;
|
|
|
-
|
|
|
/* set DE=0 and flush remaining data */
|
|
|
rcar_dmac_chan_write(chan, RCAR_DMACHCR, (chcr & ~RCAR_DMACHCR_DE));
|
|
|
|
|
|
/* make sure all remaining data was flushed */
|
|
|
rcar_dmac_chcr_de_barrier(chan);
|
|
|
+}
|
|
|
+
|
|
|
+static void rcar_dmac_sync_tcr(struct rcar_dmac_chan *chan)
|
|
|
+{
|
|
|
+ u32 chcr = rcar_dmac_chan_read(chan, RCAR_DMACHCR);
|
|
|
+
|
|
|
+ if (!(chcr & RCAR_DMACHCR_DE))
|
|
|
+ return;
|
|
|
+
|
|
|
+ rcar_dmac_clear_chcr_de(chan);
|
|
|
|
|
|
/* back DE if remain data exists */
|
|
|
if (rcar_dmac_chan_read(chan, RCAR_DMATCR))
|