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 <quic_hongtaop@quicinc.com>
This commit is contained in:
Hongtao Peng 2022-02-15 21:14:13 +08:00
commit 5e85dafc9c
4 changed files with 88 additions and 34 deletions

View file

@ -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 <linux/init.h>
@ -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;
}

View file

@ -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;
}

64
asoc/msm-pcm-routing-v2.c Executable file → Normal file
View file

@ -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 <linux/init.h>
@ -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) ||

View file

@ -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,