From e0705ab0d415d3ee65a9037976caeda8afd339ea Mon Sep 17 00:00:00 2001 From: Meng Wang Date: Tue, 3 Nov 2020 11:02:29 +0800 Subject: [PATCH] asoc: pcm-noirq: set substream state to disconnect when ssr happens When SSR happens, set substream state to SNDRV_PCM_STATE_DISCONNECTED to avoid userspace keeping waiting for substream state and causing deadlock. Change-Id: Iaa4d76101204652742c55d13da5c770c418a16bc Signed-off-by: Meng Wang --- asoc/msm-pcm-q6-noirq.c | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/asoc/msm-pcm-q6-noirq.c b/asoc/msm-pcm-q6-noirq.c index 1bccd9af2ecd..f10829a2ac31 100644 --- a/asoc/msm-pcm-q6-noirq.c +++ b/asoc/msm-pcm-q6-noirq.c @@ -153,6 +153,8 @@ static const struct soc_enum msm_pcm_fe_topology_enum[] = { static void event_handler(uint32_t opcode, uint32_t token, uint32_t *payload, void *priv) { + struct msm_audio *prtd = priv; + struct snd_pcm_substream *substream; uint32_t *ptrmem = (uint32_t *)payload; switch (opcode) { @@ -171,6 +173,18 @@ static void event_handler(uint32_t opcode, break; } break; + case RESET_EVENTS: + if (!prtd || !prtd->substream) { + pr_err("%s: prtd or substream is NULL\n", __func__); + return; + } + substream = prtd->substream; + if (!substream->runtime || !substream->runtime->status) { + pr_err("%s: runtime or runtime->status is NULL\n", __func__); + return; + } + substream->runtime->status->state = SNDRV_PCM_STATE_DISCONNECTED; + break; default: pr_debug("Not Supported Event opcode[0x%x]\n", opcode); break;