dmaengine: sh: rcar-dmac: avoid to write CHCR.TE to 1 if TCR is set to 0
This patch fixes an issue that unexpected retransfering happens if TCR is set to 0 before rcar_dmac_sync_tcr() writes DE bit to the CHCR register. For example, sh-sci driver can reproduce this issue like below: In rx_timer_fn(): /* CHCR DE bit may be set to 1 */ dmaengine_tx_status() rcar_dmac_tx_status() rcar_dmac_chan_get_residue() rcar_dmac_sync_tcr() /* TCR is possible to be set to 0 */ According to the description of commit73a47bd0da
("dmaengine: rcar-dmac: use TCRB instead of TCR for residue"), "this buffered data will be transferred if CHCR::DE bit was cleared". So, this patch doesn't need to check TCRB register. Fixes:73a47bd0da
("dmaengine: rcar-dmac: use TCRB instead of TCR for residue") Signed-off-by: Yoshihiro Shimoda <yoshihiro.shimoda.uh@renesas.com> Signed-off-by: Vinod Koul <vkoul@kernel.org>
This commit is contained in:
parent
e919417bd6
commit
538603c602
|
@ -772,8 +772,9 @@ static void rcar_dmac_sync_tcr(struct rcar_dmac_chan *chan)
|
|||
/* make sure all remaining data was flushed */
|
||||
rcar_dmac_chcr_de_barrier(chan);
|
||||
|
||||
/* back DE */
|
||||
rcar_dmac_chan_write(chan, RCAR_DMACHCR, chcr);
|
||||
/* back DE if remain data exists */
|
||||
if (rcar_dmac_chan_read(chan, RCAR_DMATCR))
|
||||
rcar_dmac_chan_write(chan, RCAR_DMACHCR, chcr);
|
||||
}
|
||||
|
||||
static void rcar_dmac_chan_halt(struct rcar_dmac_chan *chan)
|
||||
|
|
Loading…
Reference in New Issue