From f16ce2916946aaf4960475fc87a5685c7a27166e Mon Sep 17 00:00:00 2001 From: Zhou Song Date: Sat, 15 May 2021 11:57:49 +0800 Subject: [PATCH] afe: release codec port when afe starts failed When afe port starts failed, allocated port should be released to avoid subsequent allocation failed. Change-Id: If0cacce296d14135d23bf45e47de5b253372ea31 Signed-off-by: Zhou Song --- dsp/q6afe.c | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/dsp/q6afe.c b/dsp/q6afe.c index ac6bc11733b5..458f662aab72 100755 --- a/dsp/q6afe.c +++ b/dsp/q6afe.c @@ -5822,6 +5822,7 @@ static int __afe_port_start(u16 port_id, union afe_port_config *afe_config, enum afe_mad_type mad_type; uint16_t port_index; u32 power_mode = 0; + u16 i; memset(¶m_hdr, 0, sizeof(param_hdr)); memset(&port_cfg, 0, sizeof(port_cfg)); @@ -6247,8 +6248,21 @@ static int __afe_port_start(u16 port_id, union afe_port_config *afe_config, ret = afe_send_cmd_port_start(port_id); fail_cmd: - if (ret) + if (ret) { this_afe.afe_port_start_failed[port_index] = true; + if ((codec_format != ASM_MEDIA_FMT_NONE) && + (cfg_type == AFE_PARAM_ID_SLIMBUS_CONFIG)) { + if ((q6core_get_avcs_api_version_per_service( + APRV2_IDS_SERVICE_ID_ADSP_CORE_V) >= AVCS_API_VERSION_V5)) { + for (i = 0; i < MAX_ALLOWED_USE_CASES; i++) { + if (pm[i] && pm[i]->port_id == port_id) { + q6afe_unload_avcs_modules(port_id, i); + break; + } + } + } + } + } mutex_unlock(&this_afe.afe_cmd_lock); return ret; }