From 5e85dafc9cfcc95bcc8e33c696fffaaf3a026850 Mon Sep 17 00:00:00 2001 From: Hongtao Peng Date: Tue, 15 Feb 2022 21:14:13 +0800 Subject: [PATCH] ASoC: msm: extend app type cfg mixer command with copp mode ADM can be opened with different perf mode with ASM Change-Id: I22c50ae57c1e1f9ee9a0b080a20bde5b4f50d06c Signed-off-by: Hongtao Peng --- asoc/msm-pcm-loopback-v2.c | 27 ++++++++++------ asoc/msm-pcm-q6-v2.c | 27 ++++++++++------ asoc/msm-pcm-routing-v2.c | 64 +++++++++++++++++++++++++++++--------- asoc/msm-pcm-routing-v2.h | 4 +++ 4 files changed, 88 insertions(+), 34 deletions(-) mode change 100755 => 100644 asoc/msm-pcm-routing-v2.c diff --git a/asoc/msm-pcm-loopback-v2.c b/asoc/msm-pcm-loopback-v2.c index 2492f75e45a9..8bb38cb7a6a5 100644 --- a/asoc/msm-pcm-loopback-v2.c +++ b/asoc/msm-pcm-loopback-v2.c @@ -1,5 +1,6 @@ // SPDX-License-Identifier: GPL-2.0-only /* Copyright (c) 2013-2021, The Linux Foundation. All rights reserved. + * Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved. */ #include @@ -683,7 +684,7 @@ static int msm_pcm_playback_app_type_cfg_ctl_put(struct snd_kcontrol *kcontrol, u64 fe_id = kcontrol->private_value; int session_type = SESSION_TYPE_RX; int be_id = ucontrol->value.integer.value[3]; - struct msm_pcm_stream_app_type_cfg cfg_data = {0, 0, 48000, 0, 0}; + struct msm_pcm_stream_app_type_cfg cfg_data = {0, 0, 48000, 0, 0, 0}; int ret = 0; cfg_data.app_type = ucontrol->value.integer.value[0]; @@ -694,10 +695,12 @@ static int msm_pcm_playback_app_type_cfg_ctl_put(struct snd_kcontrol *kcontrol, cfg_data.copp_token = ucontrol->value.integer.value[4]; if (ucontrol->value.integer.value[5] != 0) cfg_data.bit_width = ucontrol->value.integer.value[5]; + if (ucontrol->value.integer.value[6] != 0) + cfg_data.copp_perf_mode = ucontrol->value.integer.value[6]; pr_debug("%s: fe_id- %llu session_type- %d be_id- %d app_type- %d acdb_dev_id- %d" - "sample_rate- %d copp_token- %d bit_width- %d\n", + "sample_rate- %d copp_token- %d bit_width- %d copp_perf_mode- %d\n", __func__, fe_id, session_type, be_id, cfg_data.app_type, cfg_data.acdb_dev_id, - cfg_data.sample_rate, cfg_data.copp_token, cfg_data.bit_width); + cfg_data.sample_rate, cfg_data.copp_token, cfg_data.bit_width, cfg_data.copp_perf_mode); ret = msm_pcm_routing_reg_stream_app_type_cfg(fe_id, session_type, be_id, &cfg_data); if (ret < 0) @@ -730,11 +733,12 @@ static int msm_pcm_playback_app_type_cfg_ctl_get(struct snd_kcontrol *kcontrol, ucontrol->value.integer.value[3] = be_id; ucontrol->value.integer.value[4] = cfg_data.copp_token; ucontrol->value.integer.value[5] = cfg_data.bit_width; + ucontrol->value.integer.value[6] = cfg_data.copp_perf_mode; pr_debug("%s: fe_id- %llu session_type- %d be_id- %d app_type- %d acdb_dev_id- %d" - "sample_rate- %d copp_token- %d bit_width- %d\n", + "sample_rate- %d copp_token- %d bit_width- %d copp_perf_mode- %d\n", __func__, fe_id, session_type, be_id, cfg_data.app_type, cfg_data.acdb_dev_id, cfg_data.sample_rate, - cfg_data.copp_token, cfg_data.bit_width); + cfg_data.copp_token, cfg_data.bit_width, cfg_data.copp_perf_mode); done: return ret; @@ -746,7 +750,7 @@ static int msm_pcm_capture_app_type_cfg_ctl_put(struct snd_kcontrol *kcontrol, u64 fe_id = kcontrol->private_value; int session_type = SESSION_TYPE_TX; int be_id = ucontrol->value.integer.value[3]; - struct msm_pcm_stream_app_type_cfg cfg_data = {0, 0, 48000, 0, 0}; + struct msm_pcm_stream_app_type_cfg cfg_data = {0, 0, 48000, 0, 0, 0}; int ret = 0; cfg_data.app_type = ucontrol->value.integer.value[0]; @@ -757,10 +761,12 @@ static int msm_pcm_capture_app_type_cfg_ctl_put(struct snd_kcontrol *kcontrol, cfg_data.copp_token = ucontrol->value.integer.value[4]; if (ucontrol->value.integer.value[5] != 0) cfg_data.bit_width = ucontrol->value.integer.value[5]; + if (ucontrol->value.integer.value[6] != 0) + cfg_data.copp_perf_mode = ucontrol->value.integer.value[6]; pr_debug("%s: fe_id- %llu session_type- %d be_id- %d app_type- %d acdb_dev_id- %d" - "sample_rate- %d copp_token- %d bit_width- %d\n", + "sample_rate- %d copp_token- %d bit_width- %d copp_perf_mode- %d\n", __func__, fe_id, session_type, be_id, cfg_data.app_type, cfg_data.acdb_dev_id, - cfg_data.sample_rate, cfg_data.copp_token, cfg_data.bit_width); + cfg_data.sample_rate, cfg_data.copp_token, cfg_data.bit_width, cfg_data.copp_perf_mode); ret = msm_pcm_routing_reg_stream_app_type_cfg(fe_id, session_type, be_id, &cfg_data); if (ret < 0) @@ -793,11 +799,12 @@ static int msm_pcm_capture_app_type_cfg_ctl_get(struct snd_kcontrol *kcontrol, ucontrol->value.integer.value[3] = be_id; ucontrol->value.integer.value[4] = cfg_data.copp_token; ucontrol->value.integer.value[5] = cfg_data.bit_width; + ucontrol->value.integer.value[6] = cfg_data.copp_perf_mode; pr_debug("%s: fe_id- %llu session_type- %d be_id- %d app_type- %d acdb_dev_id- %d" - "sample_rate- %d copp_token- %d bit_width- %d\n", + "sample_rate- %d copp_token- %d bit_width- %d copp_perf_mode- %d\n", __func__, fe_id, session_type, be_id, cfg_data.app_type, cfg_data.acdb_dev_id, cfg_data.sample_rate, - cfg_data.copp_token, cfg_data.bit_width); + cfg_data.copp_token, cfg_data.bit_width, cfg_data.copp_perf_mode); done: return ret; } diff --git a/asoc/msm-pcm-q6-v2.c b/asoc/msm-pcm-q6-v2.c index 31dcfc5027fa..b084c0081f1e 100644 --- a/asoc/msm-pcm-q6-v2.c +++ b/asoc/msm-pcm-q6-v2.c @@ -1,5 +1,6 @@ // SPDX-License-Identifier: GPL-2.0-only /* Copyright (c) 2012-2021, The Linux Foundation. All rights reserved. + * Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved. */ @@ -2091,7 +2092,7 @@ static int msm_pcm_playback_app_type_cfg_ctl_put(struct snd_kcontrol *kcontrol, u64 fe_id = kcontrol->private_value; int session_type = SESSION_TYPE_RX; int be_id = ucontrol->value.integer.value[3]; - struct msm_pcm_stream_app_type_cfg cfg_data = {0, 0, 48000, 0, 0}; + struct msm_pcm_stream_app_type_cfg cfg_data = {0, 0, 48000, 0, 0, 0}; int ret = 0; cfg_data.app_type = ucontrol->value.integer.value[0]; @@ -2102,10 +2103,12 @@ static int msm_pcm_playback_app_type_cfg_ctl_put(struct snd_kcontrol *kcontrol, cfg_data.copp_token = ucontrol->value.integer.value[4]; if (ucontrol->value.integer.value[5] != 0) cfg_data.bit_width = ucontrol->value.integer.value[5]; + if (ucontrol->value.integer.value[6] != 0) + cfg_data.copp_perf_mode = ucontrol->value.integer.value[6]; pr_debug("%s: fe_id- %llu session_type- %d be_id- %d app_type- %d acdb_dev_id- %d" - "sample_rate- %d copp_token- %d bit_width- %d\n", + "sample_rate- %d copp_token- %d bit_width- %d copp_perf_mode- %d\n", __func__, fe_id, session_type, be_id, cfg_data.app_type, cfg_data.acdb_dev_id, - cfg_data.sample_rate, cfg_data.copp_token, cfg_data.bit_width); + cfg_data.sample_rate, cfg_data.copp_token, cfg_data.bit_width, cfg_data.copp_perf_mode); ret = msm_pcm_routing_reg_stream_app_type_cfg(fe_id, session_type, be_id, &cfg_data); if (ret < 0) @@ -2138,10 +2141,11 @@ static int msm_pcm_playback_app_type_cfg_ctl_get(struct snd_kcontrol *kcontrol, ucontrol->value.integer.value[3] = be_id; ucontrol->value.integer.value[4] = cfg_data.copp_token; ucontrol->value.integer.value[5] = cfg_data.bit_width; + ucontrol->value.integer.value[6] = cfg_data.copp_perf_mode; pr_debug("%s: fe_id- %llu session_type- %d be_id- %d app_type- %d acdb_dev_id- %d" - "sample_rate- %d copp_token- %d bit_width- %d\n", + "sample_rate- %d copp_token- %d bit_width- %d copp_perf_mode- %d\n", __func__, fe_id, session_type, be_id, cfg_data.app_type, cfg_data.acdb_dev_id, - cfg_data.sample_rate, cfg_data.copp_token, cfg_data.bit_width); + cfg_data.sample_rate, cfg_data.copp_token, cfg_data.bit_width, cfg_data.copp_perf_mode); done: return ret; } @@ -2152,7 +2156,7 @@ static int msm_pcm_capture_app_type_cfg_ctl_put(struct snd_kcontrol *kcontrol, u64 fe_id = kcontrol->private_value; int session_type = SESSION_TYPE_TX; int be_id = ucontrol->value.integer.value[3]; - struct msm_pcm_stream_app_type_cfg cfg_data = {0, 0, 48000, 0, 0}; + struct msm_pcm_stream_app_type_cfg cfg_data = {0, 0, 48000, 0, 0, 0}; int ret = 0; cfg_data.app_type = ucontrol->value.integer.value[0]; @@ -2163,10 +2167,12 @@ static int msm_pcm_capture_app_type_cfg_ctl_put(struct snd_kcontrol *kcontrol, cfg_data.copp_token = ucontrol->value.integer.value[4]; if (ucontrol->value.integer.value[5] != 0) cfg_data.bit_width = ucontrol->value.integer.value[5]; + if (ucontrol->value.integer.value[6] != 0) + cfg_data.copp_perf_mode = ucontrol->value.integer.value[6]; pr_debug("%s: fe_id- %llu session_type- %d be_id- %d app_type- %d acdb_dev_id- %d" - "sample_rate- %d copp_token- %d bit_width- %d\n", + "sample_rate- %d copp_token- %d bit_width- %d copp_perf_mode- %d\n", __func__, fe_id, session_type, be_id, cfg_data.app_type, cfg_data.acdb_dev_id, - cfg_data.sample_rate, cfg_data.copp_token, cfg_data.bit_width); + cfg_data.sample_rate, cfg_data.copp_token, cfg_data.bit_width, cfg_data.copp_perf_mode); ret = msm_pcm_routing_reg_stream_app_type_cfg(fe_id, session_type, be_id, &cfg_data); if (ret < 0) @@ -2199,10 +2205,11 @@ static int msm_pcm_capture_app_type_cfg_ctl_get(struct snd_kcontrol *kcontrol, ucontrol->value.integer.value[3] = be_id; ucontrol->value.integer.value[4] = cfg_data.copp_token; ucontrol->value.integer.value[5] = cfg_data.bit_width; + ucontrol->value.integer.value[6] = cfg_data.copp_perf_mode; pr_debug("%s: fe_id- %llu session_type- %d be_id- %d app_type- %d acdb_dev_id- %d" - "sample_rate- %d copp_token- %d bit_width- %d\n", + "sample_rate- %d copp_token- %d bit_width- %d copp_perf_mode- %d\n", __func__, fe_id, session_type, be_id, cfg_data.app_type, cfg_data.acdb_dev_id, - cfg_data.sample_rate, cfg_data.copp_token, cfg_data.bit_width); + cfg_data.sample_rate, cfg_data.copp_token, cfg_data.bit_width, cfg_data.copp_perf_mode); done: return ret; } diff --git a/asoc/msm-pcm-routing-v2.c b/asoc/msm-pcm-routing-v2.c old mode 100755 new mode 100644 index f2a9ba603fe8..5b7fc20a08e4 --- a/asoc/msm-pcm-routing-v2.c +++ b/asoc/msm-pcm-routing-v2.c @@ -1,5 +1,6 @@ // SPDX-License-Identifier: GPL-2.0-only /* Copyright (c) 2012-2021, The Linux Foundation. All rights reserved. + * Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved. */ #include @@ -1283,6 +1284,30 @@ static bool is_mm_lsm_fe_id(int fe_id) return rc; } +static int get_copp_perf_mode(int fe_id, int sess_type, int port) +{ + int fdai_mode, copp_perf_mode, flag, value; + int rc = 0; + + if ((fe_id < 0) || (fe_id >= MSM_FRONTEND_DAI_MAX) || + (port < 0) || (port >= MSM_BACKEND_DAI_MAX) || + (sess_type != SESSION_TYPE_RX && sess_type != SESSION_TYPE_TX)) { + pr_err("%s: Input out of bounds\n", __func__); + return rc; + } + fdai_mode = fe_dai_map[fe_id][sess_type].perf_mode; + copp_perf_mode = fe_dai_app_type_cfg[fe_id][sess_type][port].copp_perf_mode; + flag = (copp_perf_mode & PP_PERF_MODE_FLAG_MASK); + value = (copp_perf_mode & PP_PERF_MODE_VALUE_MASK); + rc = fdai_mode; + if ((flag != 0) && (value >= LEGACY_PCM_MODE) && + (value <= ULL_POST_PROCESSING_PCM_MODE)) { + rc = value; + } + pr_debug("%s: Get copp_perf_mode = %d", __func__, rc); + return rc; +} + /* * msm_pcm_routing_send_chmix_cfg: * send the channel mixer command to mix the input channels @@ -1476,11 +1501,11 @@ int msm_pcm_routing_reg_stream_app_type_cfg( } pr_debug("%s: fedai_id %d, session_type %d, be_id %d, app_type %d, acdb_dev_id %d," - "sample_rate %d, copp_token %d, bit_width %d\n", + "sample_rate %d, copp_token %d, bit_width %d, copp_perf_mode %d\n", __func__, fedai_id, session_type, be_id, cfg_data->app_type, cfg_data->acdb_dev_id, cfg_data->sample_rate, cfg_data->copp_token, - cfg_data->bit_width); + cfg_data->bit_width, cfg_data->copp_perf_mode); if (!is_mm_lsm_fe_id(fedai_id)) { pr_err("%s: Invalid machine driver ID %d\n", @@ -1564,11 +1589,11 @@ int msm_pcm_routing_get_stream_app_type_cfg( *bedai_id = be_id; *cfg_data = fe_dai_app_type_cfg[fedai_id][session_type][be_id]; pr_debug("%s: fedai_id %d, session_type %d, be_id %d, app_type %d, acdb_dev_id %d," - "sample_rate %d, copp_token %d, bit_width %d\n", + "sample_rate %d, copp_token %d, bit_width %d, copp_perf_mode %d\n", __func__, fedai_id, session_type, *bedai_id, cfg_data->app_type, cfg_data->acdb_dev_id, cfg_data->sample_rate, cfg_data->copp_token, - cfg_data->bit_width); + cfg_data->bit_width, cfg_data->copp_perf_mode); done: return ret; } @@ -1906,6 +1931,7 @@ int msm_pcm_routing_reg_phy_compr_stream(int fe_id, int perf_mode, u16 bit_width = 16, be_bit_width; bool is_lsm; uint32_t copp_token = 0; + int copp_perf_mode = 0; pr_debug("%s:fe_id[%d] perf_mode[%d] id[%d] stream_type[%d] passt[%d]", __func__, fe_id, perf_mode, dspst_id, @@ -1999,6 +2025,7 @@ int msm_pcm_routing_reg_phy_compr_stream(int fe_id, int perf_mode, } acdb_dev_id = fe_dai_app_type_cfg[fe_id][session_type][i].acdb_dev_id; + copp_perf_mode = get_copp_perf_mode(fe_id, session_type, i); topology = msm_routing_get_adm_topology(fe_id, session_type, i); @@ -2020,7 +2047,7 @@ int msm_pcm_routing_reg_phy_compr_stream(int fe_id, int perf_mode, SNDRV_PCM_FORMAT_S32_LE); copp_idx = adm_open(port_id, path_type, sample_rate, - channels, topology, perf_mode, + channels, topology, copp_perf_mode, bit_width, app_type, acdb_dev_id, session_type, passthr_mode, copp_token); if ((copp_idx < 0) || @@ -2308,6 +2335,7 @@ int msm_pcm_routing_reg_phy_stream(int fedai_id, int perf_mode, uint32_t passthr_mode = LEGACY_PCM; int ret = 0; uint32_t copp_token = 0; + int copp_perf_mode = 0; if (fedai_id >= MSM_FRONTEND_DAI_MM_MAX_ID) { /* bad ID assigned in machine driver */ @@ -2380,7 +2408,7 @@ int msm_pcm_routing_reg_phy_stream(int fedai_id, int perf_mode, i); be_bit_width = msm_routing_get_bit_width( msm_bedais[i].format); - + copp_perf_mode = get_copp_perf_mode(fedai_id, session_type, i); if (hifi_filter_enabled && (msm_bedais[i].sample_rate == 384000 ||msm_bedais[i].sample_rate == 352800) && be_bit_width == 32) @@ -2403,7 +2431,7 @@ int msm_pcm_routing_reg_phy_stream(int fedai_id, int perf_mode, copp_idx = adm_open_v2(port_id, path_type, sample_rate, channels, topology, - perf_mode, bits_per_sample, + copp_perf_mode, bits_per_sample, app_type, acdb_dev_id, session_type, passthr_mode, copp_token, @@ -2414,7 +2442,7 @@ int msm_pcm_routing_reg_phy_stream(int fedai_id, int perf_mode, } else copp_idx = adm_open(port_id, path_type, sample_rate, channels, topology, - perf_mode, bits_per_sample, + copp_perf_mode, bits_per_sample, app_type, acdb_dev_id, session_type, passthr_mode, copp_token); if ((copp_idx < 0) || @@ -2495,6 +2523,7 @@ void msm_pcm_routing_dereg_phy_stream(int fedai_id, int stream_type) { int i, port_type, session_type, path_type, topology, port_id; struct msm_pcm_routing_fdai_data *fdai; + int copp_perf_mode; if (!is_mm_lsm_fe_id(fedai_id)) { /* bad ID assigned in machine driver */ @@ -2536,7 +2565,8 @@ void msm_pcm_routing_dereg_phy_stream(int fedai_id, int stream_type) topology = adm_get_topology_for_port_copp_idx( port_id, idx); msm_routing_unload_topology(topology); - adm_close(port_id, fdai->perf_mode, idx); + copp_perf_mode = get_copp_perf_mode(fedai_id, session_type, i); + adm_close(port_id, copp_perf_mode, idx); pr_debug("%s:copp:%ld,idx bit fe:%d,type:%d,be:%d\n", __func__, copp, fedai_id, session_type, i); clear_bit(idx, @@ -2580,6 +2610,7 @@ static void msm_pcm_routing_process_audio(u16 reg, u16 val, int set) uint32_t passthr_mode; bool is_lsm; uint32_t copp_token = 0; + int copp_perf_mode = 0; pr_debug("%s: reg %x val %x set %x\n", __func__, reg, val, set); @@ -2694,6 +2725,7 @@ static void msm_pcm_routing_process_audio(u16 reg, u16 val, int set) be_bit_width = msm_routing_get_bit_width( msm_bedais[reg].format); + copp_perf_mode = get_copp_perf_mode(val, session_type, reg); if (hifi_filter_enabled && (msm_bedais[reg].sample_rate == 384000 ||msm_bedais[reg].sample_rate == 352800) && be_bit_width == 32) @@ -2701,7 +2733,7 @@ static void msm_pcm_routing_process_audio(u16 reg, u16 val, int set) SNDRV_PCM_FORMAT_S32_LE); copp_idx = adm_open(port_id, path_type, sample_rate, channels, topology, - fdai->perf_mode, bits_per_sample, + copp_perf_mode, bits_per_sample, app_type, acdb_dev_id, session_type, passthr_mode, copp_token); if ((copp_idx < 0) || @@ -2762,7 +2794,8 @@ static void msm_pcm_routing_process_audio(u16 reg, u16 val, int set) topology = adm_get_topology_for_port_copp_idx(port_id, idx); msm_routing_unload_topology(topology); - adm_close(port_id, fdai->perf_mode, idx); + copp_perf_mode = get_copp_perf_mode(val, session_type, reg); + adm_close(port_id, copp_perf_mode, idx); pr_debug("%s: copp: %ld, reset idx bit fe:%d, type: %d, be:%d topology=0x%x\n", __func__, copp, val, session_type, reg, topology); @@ -41329,6 +41362,7 @@ static int msm_pcm_routing_close(struct snd_pcm_substream *substream) int i, session_type, path_type, topology; struct msm_pcm_routing_bdai_data *bedai; struct msm_pcm_routing_fdai_data *fdai; + int copp_perf_mode; pr_debug("%s: substream->pcm->id:%s\n", __func__, substream->pcm->id); @@ -41370,7 +41404,8 @@ static int msm_pcm_routing_close(struct snd_pcm_substream *substream) topology = adm_get_topology_for_port_copp_idx(port_id, idx); msm_routing_unload_topology(topology); - adm_close(port_id, fdai->perf_mode, idx); + copp_perf_mode = get_copp_perf_mode(i, session_type, be_id); + adm_close(port_id, copp_perf_mode, idx); pr_debug("%s: copp:%ld,idx bit fe:%d, type:%d,be:%d topology=0x%x\n", __func__, copp, i, session_type, be_id, topology); @@ -41405,6 +41440,7 @@ static int msm_pcm_routing_prepare(struct snd_pcm_substream *substream) struct media_format_info voc_be_media_format; bool is_lsm; uint32_t copp_token = 0; + int copp_perf_mode = 0; pr_debug("%s: substream->pcm->id:%s\n", __func__, substream->pcm->id); @@ -41515,7 +41551,7 @@ static int msm_pcm_routing_prepare(struct snd_pcm_substream *substream) be_bit_width = msm_routing_get_bit_width( bedai->format); - + copp_perf_mode = get_copp_perf_mode(i, session_type, be_id); if (hifi_filter_enabled && (bedai->sample_rate == 384000 || bedai->sample_rate == 352800) && be_bit_width == 32) @@ -41523,7 +41559,7 @@ static int msm_pcm_routing_prepare(struct snd_pcm_substream *substream) SNDRV_PCM_FORMAT_S32_LE); copp_idx = adm_open(port_id, path_type, sample_rate, channels, topology, - fdai->perf_mode, bits_per_sample, + copp_perf_mode, bits_per_sample, app_type, acdb_dev_id, session_type, fdai->passthr_mode, copp_token); if ((copp_idx < 0) || diff --git a/asoc/msm-pcm-routing-v2.h b/asoc/msm-pcm-routing-v2.h index 63ff45f58df6..4a8e4b6eda58 100644 --- a/asoc/msm-pcm-routing-v2.h +++ b/asoc/msm-pcm-routing-v2.h @@ -1,5 +1,6 @@ /* SPDX-License-Identifier: GPL-2.0-only */ /* Copyright (c) 2012-2021, The Linux Foundation. All rights reserved. + * Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved. */ #ifndef _MSM_PCM_ROUTING_H #define _MSM_PCM_ROUTING_H @@ -688,6 +689,8 @@ enum { #define STREAM_TYPE_ASM 0 #define STREAM_TYPE_LSM 1 +#define PP_PERF_MODE_FLAG_MASK 0x10000 +#define PP_PERF_MODE_VALUE_MASK 0xF enum { ADM_TOPOLOGY_CAL_TYPE_IDX = 0, ADM_LSM_TOPOLOGY_CAL_TYPE_IDX, @@ -743,6 +746,7 @@ struct msm_pcm_stream_app_type_cfg { int sample_rate; uint32_t copp_token; int bit_width; + int copp_perf_mode; }; /* dai_id: front-end ID,