ASoC: qdsp6: q6asm: fix q6asm_dai_prepare error handling

Error handling in q6asm_dai_prepare() seems to be completely broken,
Fix this by handling it properly.

Fixes: 2a9e92d371 ("ASoC: qdsp6: q6asm: Add q6asm dai driver")
Signed-off-by: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
Link: https://lore.kernel.org/r/20211116114721.12517-4-srinivas.kandagatla@linaro.org
Signed-off-by: Mark Brown <broonie@kernel.org>
This commit is contained in:
Srinivas Kandagatla 2021-11-16 11:47:19 +00:00 committed by Mark Brown
parent 861afeac79
commit 721a94b435
No known key found for this signature in database
GPG Key ID: 24D68B725D5487D0

View File

@ -269,9 +269,7 @@ static int q6asm_dai_prepare(struct snd_soc_component *component,
if (ret < 0) { if (ret < 0) {
dev_err(dev, "%s: q6asm_open_write failed\n", __func__); dev_err(dev, "%s: q6asm_open_write failed\n", __func__);
q6asm_audio_client_free(prtd->audio_client); goto open_err;
prtd->audio_client = NULL;
return -ENOMEM;
} }
prtd->session_id = q6asm_get_session_id(prtd->audio_client); prtd->session_id = q6asm_get_session_id(prtd->audio_client);
@ -279,7 +277,7 @@ static int q6asm_dai_prepare(struct snd_soc_component *component,
prtd->session_id, substream->stream); prtd->session_id, substream->stream);
if (ret) { if (ret) {
dev_err(dev, "%s: stream reg failed ret:%d\n", __func__, ret); dev_err(dev, "%s: stream reg failed ret:%d\n", __func__, ret);
return ret; goto routing_err;
} }
if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) { if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
@ -301,10 +299,19 @@ static int q6asm_dai_prepare(struct snd_soc_component *component,
} }
if (ret < 0) if (ret < 0)
dev_info(dev, "%s: CMD Format block failed\n", __func__); dev_info(dev, "%s: CMD Format block failed\n", __func__);
else
prtd->state = Q6ASM_STREAM_RUNNING; prtd->state = Q6ASM_STREAM_RUNNING;
return 0; return ret;
routing_err:
q6asm_cmd(prtd->audio_client, prtd->stream_id, CMD_CLOSE);
open_err:
q6asm_unmap_memory_regions(substream->stream, prtd->audio_client);
q6asm_audio_client_free(prtd->audio_client);
prtd->audio_client = NULL;
return ret;
} }
static int q6asm_dai_trigger(struct snd_soc_component *component, static int q6asm_dai_trigger(struct snd_soc_component *component,