Commit 747213b0 authored by Biju Das's avatar Biju Das Committed by Vinod Koul
Browse files

dmaengine: sh: rz-dmac: Fix rz_dmac_terminate_all()



After audio full duplex testing, playing the recorded file contains a few
playback frames from the previous time. The rz_dmac_terminate_all() does
not reset all the hardware descriptors queued previously, leading to the
wrong descriptor being picked up during the next DMA transfer. Fix the
above issue by resetting all the descriptor headers for a channel in
rz_dmac_terminate_all() as rz_dmac_lmdesc_recycle() points to the proper
descriptor header filled by the rz_dmac_prepare_descs_for_slave_sg().

Cc: stable@kernel.org
Fixes: 5000d370 ("dmaengine: sh: Add DMAC driver for RZ/G2L SoC")
Reviewed-by: default avatarGeert Uytterhoeven <geert+renesas@glider.be>
Signed-off-by: default avatarBiju Das <biju.das.jz@bp.renesas.com>
Reviewed-by: default avatarClaudiu Beznea <claudiu.beznea.uj@bp.renesas.com>
Tested-by: default avatarClaudiu Beznea <claudiu.beznea.uj@bp.renesas.com>
Link: https://patch.msgid.link/20251113195052.564338-1-biju.das.jz@bp.renesas.com


Signed-off-by: default avatarVinod Koul <vkoul@kernel.org>
parent c0732fe7
Loading
Loading
Loading
Loading
+5 −0
Original line number Diff line number Diff line
@@ -557,11 +557,16 @@ rz_dmac_prep_slave_sg(struct dma_chan *chan, struct scatterlist *sgl,
static int rz_dmac_terminate_all(struct dma_chan *chan)
{
	struct rz_dmac_chan *channel = to_rz_dmac_chan(chan);
	struct rz_lmdesc *lmdesc = channel->lmdesc.base;
	unsigned long flags;
	unsigned int i;
	LIST_HEAD(head);

	rz_dmac_disable_hw(channel);
	spin_lock_irqsave(&channel->vc.lock, flags);
	for (i = 0; i < DMAC_NR_LMDESC; i++)
		lmdesc[i].header = 0;

	list_splice_tail_init(&channel->ld_active, &channel->ld_free);
	list_splice_tail_init(&channel->ld_queue, &channel->ld_free);
	vchan_get_all_descriptors(&channel->vc, &head);