]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
ASoC: qcom: q6asm-dai: do not set stream state in event and trigger callbacks
authorSrinivas Kandagatla <srinivas.kandagatla@oss.qualcomm.com>
Mon, 18 May 2026 09:23:43 +0000 (09:23 +0000)
committerMark Brown <broonie@kernel.org>
Mon, 25 May 2026 12:46:43 +0000 (13:46 +0100)
The q6asm-dai stream state is used by prepare() to decide whether an
existing stream setup needs to be closed before opening/configuring a new
one. Updating the state from trigger or asynchronous DSP callbacks can make
that state stale or incorrect relative to the actual setup lifetime.

In particular, setting Q6ASM_STREAM_STOPPED on STOP or EOS completion can
make prepare() believe there is no active setup to close, which can result
in opening/configuring the same stream more than once.

Keep stream state updates tied to prepare(), where the stream is actually
closed and reopened, and stop changing it from trigger and EOS callbacks.

Fixes: bfbb12dfa144 ("ASoC: qcom: q6asm-dai: perform correct state check before closing")
Cc: Stable@vger.kernel.org
Closes: https://lore.kernel.org/all/afS7rTHdc9TyIeLx@rdacayan/
Signed-off-by: Srinivas Kandagatla <srinivas.kandagatla@oss.qualcomm.com>
Link: https://patch.msgid.link/20260518092347.3446946-2-srinivas.kandagatla@oss.qualcomm.com
Signed-off-by: Mark Brown <broonie@kernel.org>
sound/soc/qcom/qdsp6/q6asm-dai.c

index 4f8f7db6c3d39f42ca023f2300ef7897b96f68d6..56f0d8913904d6d3ce81ed1e71dfab5842b9f958 100644 (file)
@@ -186,7 +186,6 @@ static void event_handler(uint32_t opcode, uint32_t token,
        case ASM_CLIENT_EVENT_CMD_RUN_DONE:
                break;
        case ASM_CLIENT_EVENT_CMD_EOS_DONE:
-               prtd->state = Q6ASM_STREAM_STOPPED;
                break;
        case ASM_CLIENT_EVENT_DATA_WRITE_DONE: {
                snd_pcm_period_elapsed(substream);
@@ -341,7 +340,6 @@ static int q6asm_dai_trigger(struct snd_soc_component *component,
                                       0, 0, 0);
                break;
        case SNDRV_PCM_TRIGGER_STOP:
-               prtd->state = Q6ASM_STREAM_STOPPED;
                ret = q6asm_cmd_nowait(prtd->audio_client, prtd->stream_id,
                                       CMD_EOS);
                break;
@@ -555,8 +553,6 @@ static void compress_event_handler(uint32_t opcode, uint32_t token,
                        snd_compr_drain_notify(prtd->cstream);
                        prtd->notify_on_drain = false;
 
-               } else {
-                       prtd->state = Q6ASM_STREAM_STOPPED;
                }
                break;
 
@@ -1014,7 +1010,6 @@ static int q6asm_dai_compr_trigger(struct snd_soc_component *component,
                                       0, 0, 0);
                break;
        case SNDRV_PCM_TRIGGER_STOP:
-               prtd->state = Q6ASM_STREAM_STOPPED;
                ret = q6asm_cmd_nowait(prtd->audio_client, prtd->stream_id,
                                       CMD_EOS);
                break;