Skip to content

Commit 8dd65e9

Browse files
bijudasgregkh
authored andcommitted
dmaengine: sh: rz-dmac: Fix rz_dmac_terminate_all()
commit 747213b08a1ab6a76e3e3b3e7a209cc1d402b5d0 upstream. 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: 5000d37 ("dmaengine: sh: Add DMAC driver for RZ/G2L SoC") Reviewed-by: Geert Uytterhoeven <geert+renesas@glider.be> Signed-off-by: Biju Das <biju.das.jz@bp.renesas.com> Reviewed-by: Claudiu Beznea <claudiu.beznea.uj@bp.renesas.com> Tested-by: Claudiu Beznea <claudiu.beznea.uj@bp.renesas.com> Link: https://patch.msgid.link/20251113195052.564338-1-biju.das.jz@bp.renesas.com Signed-off-by: Vinod Koul <vkoul@kernel.org> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
1 parent 926d166 commit 8dd65e9

1 file changed

Lines changed: 5 additions & 0 deletions

File tree

drivers/dma/sh/rz-dmac.c

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -557,11 +557,16 @@ rz_dmac_prep_slave_sg(struct dma_chan *chan, struct scatterlist *sgl,
557557
static int rz_dmac_terminate_all(struct dma_chan *chan)
558558
{
559559
struct rz_dmac_chan *channel = to_rz_dmac_chan(chan);
560+
struct rz_lmdesc *lmdesc = channel->lmdesc.base;
560561
unsigned long flags;
562+
unsigned int i;
561563
LIST_HEAD(head);
562564

563565
rz_dmac_disable_hw(channel);
564566
spin_lock_irqsave(&channel->vc.lock, flags);
567+
for (i = 0; i < DMAC_NR_LMDESC; i++)
568+
lmdesc[i].header = 0;
569+
565570
list_splice_tail_init(&channel->ld_active, &channel->ld_free);
566571
list_splice_tail_init(&channel->ld_queue, &channel->ld_free);
567572
vchan_get_all_descriptors(&channel->vc, &head);

0 commit comments

Comments
 (0)