From: Kuninori Morimoto kuninori.morimoto.gx@renesas.com
[ Upstream commit 25aa058b5c83a3c455a2a288bb3295c0b234f093 ]
Current DMAC is stopped before HW stop, but it might be cause of sync error. Stop HW first.
Signed-off-by: Kuninori Morimoto kuninori.morimoto.gx@renesas.com Tested-by: Yusuke Goda yusuke.goda.sx@renesas.com Link: https://patch.msgid.link/878qi3yuu0.wl-kuninori.morimoto.gx@renesas.com Signed-off-by: Mark Brown broonie@kernel.org Signed-off-by: Sasha Levin sashal@kernel.org ---
LLM Generated explanations, may be completely bogus:
YES - The bug here is a real hardware-visible problem: stopping the DMA engine before the MSIOF IP has actually quiesced leaves the peripheral still asserting frame-sync, which the driver records as `priv->err_syc` → FSERR warnings (and potential playback/capture glitches). The commit fixes the ordering so that we first wait for the HW disable (`msiof_update_and_wait()` to clear `SICTR_TXE/RXE` at `sound/soc/renesas/rcar/msiof.c:287-293`) and only then tell the DMA framework to shut down (`snd_dmaengine_pcm_trigger()` at `sound/soc/renesas/rcar/msiof.c:294`). - Nothing else changes: interrupts are still masked first, the stop path remains serialized under the same spinlock, and the DMA API call is simply moved a few lines. That makes the fix low risk and easy to review, while removing the source of the frame-sync errors mentioned in the commit message. - Given that the MSIOF audio driver already shipped in stable releases, leaving the old ordering means users continue to see spurious FSERR warnings and potential desynchronization when stopping streams, so pulling this minimal sequencing fix into stable is justified.
sound/soc/renesas/rcar/msiof.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/sound/soc/renesas/rcar/msiof.c b/sound/soc/renesas/rcar/msiof.c index 3a1a6496637dd..555fdd4fb2513 100644 --- a/sound/soc/renesas/rcar/msiof.c +++ b/sound/soc/renesas/rcar/msiof.c @@ -222,9 +222,6 @@ static int msiof_hw_stop(struct snd_soc_component *component, val = SIIER_RDREQE | SIIER_RDMAE | SISTR_ERR_RX; msiof_update(priv, SIIER, val, 0);
- /* Stop DMAC */ - snd_dmaengine_pcm_trigger(substream, cmd); - /* SICTR */ if (is_play) val = SICTR_TXE; @@ -232,6 +229,9 @@ static int msiof_hw_stop(struct snd_soc_component *component, val = SICTR_RXE; msiof_update_and_wait(priv, SICTR, val, 0, 0);
+ /* Stop DMAC */ + snd_dmaengine_pcm_trigger(substream, cmd); + /* indicate error status if exist */ if (priv->err_syc[substream->stream] || priv->err_ovf[substream->stream] ||