From afcc911b4efca76e99b0ec6bc977cae342eaab6a Mon Sep 17 00:00:00 2001 From: Sanjana B Date: Thu, 30 Apr 2020 22:07:42 +0530 Subject: [PATCH] dsp: add support for SVA to use afe topology deregister To handle erroneous scenario when audio afe driver registers a FFNS topology in non-island mode instead of island mode, add capability for audio afe driver to deregister previously created topology before registering a new topology for SVA. Change-Id: Iff871da998847ea5d3bcee417c780b8acaf70ca3 Signed-off-by: Sanjana B Signed-off-by: Xiaoyu Ye --- dsp/q6afe.c | 65 ++++++++++++++++++++++++++++++++++++++ include/dsp/apr_audio-v2.h | 2 ++ 2 files changed, 67 insertions(+) diff --git a/dsp/q6afe.c b/dsp/q6afe.c index 74a7def97c94..3575f150c923 100644 --- a/dsp/q6afe.c +++ b/dsp/q6afe.c @@ -3037,6 +3037,63 @@ unlock: return ret; } +static int afe_port_topology_deregister(u16 port_id) +{ + struct param_hdr_v3 param_info; + int ret = 0; + uint32_t build_major_version = 0; + uint32_t build_minor_version = 0; + uint32_t build_branch_version = 0; + uint32_t afe_api_version = 0; + + ret = q6core_get_avcs_avs_build_version_info(&build_major_version, + &build_minor_version, + &build_branch_version); + if (ret < 0) { + pr_err("%s: get AVS build versions failed %d\n", + __func__, ret); + goto done; + } + + afe_api_version = q6core_get_avcs_api_version_per_service( + APRV2_IDS_SERVICE_ID_ADSP_AFE_V); + if (afe_api_version < 0) { + ret = -EINVAL; + goto done; + } + pr_debug("%s: major: %u, minor: %u, branch: %u, afe_api: %u\n", + __func__, build_major_version, build_minor_version, + build_branch_version, afe_api_version); + + if (build_major_version != AVS_BUILD_MAJOR_VERSION_V2 || + build_minor_version != AVS_BUILD_MINOR_VERSION_V9 || + (build_branch_version != AVS_BUILD_BRANCH_VERSION_V0 && + build_branch_version != AVS_BUILD_BRANCH_VERSION_V3) || + afe_api_version < AFE_API_VERSION_V9) { + ret = -EINVAL; + pr_err("%s: AVS build versions mismatched %d\n", + __func__, ret); + goto done; + } + + memset(¶m_info, 0, sizeof(param_info)); + param_info.module_id = AFE_MODULE_AUDIO_DEV_INTERFACE; + param_info.instance_id = INSTANCE_ID_0; + param_info.param_id = AFE_PARAM_ID_DEREGISTER_TOPOLOGY; + param_info.param_size = 0; + ret = q6afe_pack_and_set_param_in_band(port_id, + q6audio_get_port_index(port_id), + param_info, NULL); + if (ret < 0) + pr_err("%s: AFE deregister topology for port 0x%x failed %d\n", + __func__, port_id, ret); + +done: + pr_debug("%s: AFE port 0x%x deregister topology, ret %d\n", + __func__, port_id, ret); + return ret; +} + static int afe_send_port_topology_id(u16 port_id) { struct afe_param_id_set_topology_cfg topology; @@ -5518,6 +5575,14 @@ static int __afe_port_start(u16 port_id, union afe_port_config *afe_config, if (!(this_afe.afe_cal_mode[port_index] == AFE_CAL_MODE_NONE)) { /* One time call: only for first time */ afe_send_custom_topology(); + /* + * Deregister existing afe topology before + * sending a new one for VA use cases only + */ + if (port_id == AFE_PORT_ID_VA_CODEC_DMA_TX_0 || + port_id == AFE_PORT_ID_VA_CODEC_DMA_TX_1 || + port_id == AFE_PORT_ID_VA_CODEC_DMA_TX_2) + afe_port_topology_deregister(port_id); afe_send_port_topology_id(port_id); afe_send_cal(port_id); afe_send_hw_delay(port_id, rate); diff --git a/include/dsp/apr_audio-v2.h b/include/dsp/apr_audio-v2.h index 314f4270ce56..2d9d4167cb5f 100644 --- a/include/dsp/apr_audio-v2.h +++ b/include/dsp/apr_audio-v2.h @@ -3940,6 +3940,7 @@ struct afe_param_id_device_hw_delay_cfg { } __packed; #define AFE_PARAM_ID_SET_TOPOLOGY 0x0001025A +#define AFE_PARAM_ID_DEREGISTER_TOPOLOGY 0x000102E8 #define AFE_API_VERSION_TOPOLOGY_V1 0x1 struct afe_param_id_set_topology_cfg { @@ -12161,6 +12162,7 @@ struct afe_clk_set { #define AVS_BUILD_MAJOR_VERSION_V2 2 #define AVS_BUILD_MINOR_VERSION_V9 9 +#define AVS_BUILD_BRANCH_VERSION_V0 0 #define AVS_BUILD_BRANCH_VERSION_V3 3 #define AFE_PARAM_ID_CLOCK_SET_V2 0x000102E6