Merge "asoc: Add mixer controls to independently configure TX and RX"
diff --git a/asoc/codecs/sdm660_cdc/msm-analog-cdc.c b/asoc/codecs/sdm660_cdc/msm-analog-cdc.c
index c0aa424..77981dd 100644
--- a/asoc/codecs/sdm660_cdc/msm-analog-cdc.c
+++ b/asoc/codecs/sdm660_cdc/msm-analog-cdc.c
@@ -87,6 +87,9 @@
static char on_demand_supply_name[][MAX_ON_DEMAND_SUPPLY_NAME_LENGTH] = {
"cdc-vdd-mic-bias",
+ "",
+ "cdc-vdda18-l10",
+ "cdc-vdd-l1",
};
static struct wcd_mbhc_register
@@ -3448,6 +3451,16 @@
msm_anlg_cdc_codec_enable_on_demand_supply,
SND_SOC_DAPM_PRE_PMU |
SND_SOC_DAPM_POST_PMD),
+ SND_SOC_DAPM_SUPPLY("VDDA18_L10_REGULATOR", SND_SOC_NOPM,
+ ON_DEMAND_VDDA18_L10, 0,
+ msm_anlg_cdc_codec_enable_on_demand_supply,
+ SND_SOC_DAPM_PRE_PMU |
+ SND_SOC_DAPM_POST_PMD),
+ SND_SOC_DAPM_SUPPLY("VDD_L1_REGULATOR", SND_SOC_NOPM,
+ ON_DEMAND_VDD_L1, 0,
+ msm_anlg_cdc_codec_enable_on_demand_supply,
+ SND_SOC_DAPM_PRE_PMU |
+ SND_SOC_DAPM_POST_PMD),
SND_SOC_DAPM_MICBIAS_E("MIC BIAS Internal1",
MSM89XX_PMIC_ANALOG_MICB_1_EN, 7, 0,
@@ -4137,6 +4150,20 @@
atomic_set(&sdm660_cdc->on_demand_list[ON_DEMAND_MICBIAS].ref,
0);
+ msm_anlg_cdc_update_micbias_regulator(
+ sdm660_cdc,
+ on_demand_supply_name[ON_DEMAND_VDD_L1],
+ &sdm660_cdc->on_demand_list[ON_DEMAND_VDD_L1]);
+ atomic_set(&sdm660_cdc->on_demand_list[ON_DEMAND_VDD_L1].ref,
+ 0);
+
+ msm_anlg_cdc_update_micbias_regulator(
+ sdm660_cdc,
+ on_demand_supply_name[ON_DEMAND_VDDA18_L10],
+ &sdm660_cdc->on_demand_list[ON_DEMAND_VDDA18_L10]);
+ atomic_set(&sdm660_cdc->on_demand_list[ON_DEMAND_VDDA18_L10].ref,
+ 0);
+
sdm660_cdc->fw_data = devm_kzalloc(codec->dev,
sizeof(*(sdm660_cdc->fw_data)),
GFP_KERNEL);
@@ -4183,6 +4210,13 @@
sdm660_cdc_priv->on_demand_list[ON_DEMAND_MICBIAS].supply = NULL;
atomic_set(&sdm660_cdc_priv->on_demand_list[ON_DEMAND_MICBIAS].ref,
0);
+ sdm660_cdc_priv->on_demand_list[ON_DEMAND_VDD_L1].supply = NULL;
+ atomic_set(&sdm660_cdc_priv->on_demand_list[ON_DEMAND_VDD_L1].ref,
+ 0);
+ sdm660_cdc_priv->on_demand_list[ON_DEMAND_VDDA18_L10].supply = NULL;
+ atomic_set(&sdm660_cdc_priv->on_demand_list[ON_DEMAND_VDDA18_L10].ref,
+ 0);
+
wcd_mbhc_deinit(&sdm660_cdc_priv->mbhc);
return 0;
diff --git a/asoc/codecs/sdm660_cdc/msm-analog-cdc.h b/asoc/codecs/sdm660_cdc/msm-analog-cdc.h
index bf69cd0..a44b48e 100644
--- a/asoc/codecs/sdm660_cdc/msm-analog-cdc.h
+++ b/asoc/codecs/sdm660_cdc/msm-analog-cdc.h
@@ -121,6 +121,8 @@
enum {
ON_DEMAND_MICBIAS = 0,
ON_DEMAND_SPKDRV,
+ ON_DEMAND_VDDA18_L10,
+ ON_DEMAND_VDD_L1,
ON_DEMAND_SUPPLIES_MAX,
};
diff --git a/asoc/codecs/sdm660_cdc/msm-digital-cdc.c b/asoc/codecs/sdm660_cdc/msm-digital-cdc.c
index f1f1ed4..8519e67 100644
--- a/asoc/codecs/sdm660_cdc/msm-digital-cdc.c
+++ b/asoc/codecs/sdm660_cdc/msm-digital-cdc.c
@@ -1391,7 +1391,21 @@
atomic_set(&msm_dig_cdc->on_demand_list[ON_DEMAND_DIGITAL].ref, 0);
registered_digcodec = codec;
+ if (msm_dig_cdc->no_analog_codec) {
+ msm_dig_cdc->fw_data = devm_kzalloc(codec->dev,
+ sizeof(*(msm_dig_cdc->fw_data)),
+ GFP_KERNEL);
+ if (!msm_dig_cdc->fw_data)
+ return -ENOMEM;
+ ret = wcd_cal_create_hwdep(msm_dig_cdc->fw_data,
+ WCD9XXX_CODEC_HWDEP_NODE, codec);
+ if (ret < 0) {
+ dev_err(codec->dev, "%s hwdep failed %d\n", __func__,
+ ret);
+ return ret;
+ }
+ }
snd_soc_dapm_ignore_suspend(dapm, "AIF1 Playback");
snd_soc_dapm_ignore_suspend(dapm, "AIF1 Capture");
snd_soc_dapm_ignore_suspend(dapm, "ADC1_IN");
@@ -2469,7 +2483,6 @@
u32 dig_cdc_addr;
struct msm_dig_priv *msm_dig_cdc;
struct dig_ctrl_platform_data *pdata = NULL;
- bool no_analog_codec = false;
int adsp_state;
adsp_state = apr_get_subsys_state();
@@ -2491,10 +2504,11 @@
return -EINVAL;
if (pdev->dev.of_node)
- no_analog_codec = of_property_read_bool(pdev->dev.of_node,
+ msm_dig_cdc->no_analog_codec = of_property_read_bool(
+ pdev->dev.of_node,
"qcom,no-analog-codec");
- if (no_analog_codec) {
+ if (msm_dig_cdc->no_analog_codec) {
dev_dbg(&pdev->dev, "%s:Platform data from device tree\n",
__func__);
if (msm_digital_cdc_populate_dt_pdata(&pdev->dev,
@@ -2549,7 +2563,7 @@
__func__, dig_cdc_addr);
return ret;
err_supplies:
- if (no_analog_codec)
+ if (msm_dig_cdc->no_analog_codec)
msm_digital_cdc_disable_supplies(msm_dig_cdc);
rtn:
return ret;
diff --git a/asoc/codecs/sdm660_cdc/msm-digital-cdc.h b/asoc/codecs/sdm660_cdc/msm-digital-cdc.h
index a841a09..f230cac 100644
--- a/asoc/codecs/sdm660_cdc/msm-digital-cdc.h
+++ b/asoc/codecs/sdm660_cdc/msm-digital-cdc.h
@@ -73,6 +73,9 @@
s32 dmic_3_4_clk_cnt;
bool dec_active[NUM_DECIMATORS];
int version;
+ /* cal info for codec */
+ struct fw_info *fw_data;
+ bool no_analog_codec;
/* Entry for version info */
struct snd_info_entry *entry;
struct snd_info_entry *version_entry;
diff --git a/asoc/codecs/wcd934x/wcd934x-dsp-cntl.c b/asoc/codecs/wcd934x/wcd934x-dsp-cntl.c
index 662f484..de4f399 100644
--- a/asoc/codecs/wcd934x/wcd934x-dsp-cntl.c
+++ b/asoc/codecs/wcd934x/wcd934x-dsp-cntl.c
@@ -1011,10 +1011,12 @@
{
struct wcd_dsp_cntl *cntl = container_of(filep->private_data,
struct wcd_dsp_cntl, miscdev);
- char val[WCD_MISCDEV_CMD_MAX_LEN];
+ char val[WCD_MISCDEV_CMD_MAX_LEN + 1];
bool vote;
int ret = 0;
+ memset(val, 0, WCD_MISCDEV_CMD_MAX_LEN + 1);
+
if (count == 0 || count > WCD_MISCDEV_CMD_MAX_LEN) {
pr_err("%s: Invalid count = %zd\n", __func__, count);
ret = -EINVAL;
diff --git a/asoc/msm-pcm-routing-v2.c b/asoc/msm-pcm-routing-v2.c
index 37f4b27..7e61358 100644
--- a/asoc/msm-pcm-routing-v2.c
+++ b/asoc/msm-pcm-routing-v2.c
@@ -81,6 +81,7 @@
static bool is_custom_stereo_on;
static bool is_ds2_on;
static bool swap_ch;
+static int msm_ec_ref_port_id;
#define WEIGHT_0_DB 0x4000
/* all the FEs which can support channel mixer */
@@ -773,6 +774,11 @@
return 0;
}
+static int get_port_id(int port_id)
+{
+ return (port_id == AFE_LOOPBACK_TX ? msm_ec_ref_port_id : port_id);
+}
+
static bool is_mm_lsm_fe_id(int fe_id)
{
bool rc = true;
@@ -1027,12 +1033,12 @@
(afe_get_port_type(msm_bedais[i].port_id) == port_type) &&
(msm_bedais[i].active) &&
(test_bit(fedai_id, &msm_bedais[i].fe_sessions[0]))) {
+ int port_id = get_port_id(msm_bedais[i].port_id);
for (j = 0; j < MAX_COPPS_PER_PORT; j++) {
unsigned long copp =
session_copp_map[fedai_id][sess_type][i];
if (test_bit(j, &copp)) {
- payload.port_id[num_copps] =
- msm_bedais[i].port_id;
+ payload.port_id[num_copps] = port_id;
payload.copp_idx[num_copps] = j;
payload.app_type[num_copps] =
fe_dai_app_type_cfg
@@ -1179,6 +1185,7 @@
(msm_bedais[i].active) &&
(test_bit(fe_id, &msm_bedais[i].fe_sessions[0]))) {
int app_type, app_type_idx, copp_idx, acdb_dev_id;
+ int port_id = get_port_id(msm_bedais[i].port_id);
/*
* check if ADM needs to be configured with different
@@ -1225,10 +1232,10 @@
topology);
copp_idx =
- adm_open(msm_bedais[i].port_id,
- path_type, sample_rate, channels,
- topology, perf_mode, bit_width,
- app_type, acdb_dev_id);
+ adm_open(port_id, path_type, sample_rate,
+ channels, topology, perf_mode,
+ bit_width, app_type, acdb_dev_id,
+ session_type);
if ((copp_idx < 0) ||
(copp_idx >= MAX_COPPS_PER_PORT)) {
pr_err("%s:adm open failed coppid:%d\n",
@@ -1244,16 +1251,14 @@
if (msm_is_resample_needed(
sample_rate,
msm_bedais[i].sample_rate))
- adm_copp_mfc_cfg(
- msm_bedais[i].port_id, copp_idx,
+ adm_copp_mfc_cfg(port_id, copp_idx,
msm_bedais[i].sample_rate);
for (j = 0; j < MAX_COPPS_PER_PORT; j++) {
unsigned long copp =
session_copp_map[fe_id][session_type][i];
if (test_bit(j, &copp)) {
- payload.port_id[num_copps] =
- msm_bedais[i].port_id;
+ payload.port_id[num_copps] = port_id;
payload.copp_idx[num_copps] = j;
payload.app_type[num_copps] =
fe_dai_app_type_cfg
@@ -1273,8 +1278,7 @@
if (passthr_mode != COMPRESSED_PASSTHROUGH_DSD
&& passthr_mode !=
COMPRESSED_PASSTHROUGH_GEN) {
- msm_routing_send_device_pp_params(
- msm_bedais[i].port_id,
+ msm_routing_send_device_pp_params(port_id,
copp_idx, fe_id);
}
}
@@ -1410,6 +1414,8 @@
(msm_bedais[i].active) &&
(test_bit(fedai_id, &msm_bedais[i].fe_sessions[0]))) {
int app_type, app_type_idx, copp_idx, acdb_dev_id;
+ int port_id = get_port_id(msm_bedais[i].port_id);
+
/*
* check if ADM needs to be configured with different
* channel mapping than backend
@@ -1443,10 +1449,11 @@
topology = msm_routing_get_adm_topology(fedai_id,
session_type,
i);
- copp_idx = adm_open(msm_bedais[i].port_id, path_type,
+ copp_idx = adm_open(port_id, path_type,
sample_rate, channels, topology,
perf_mode, bits_per_sample,
- app_type, acdb_dev_id);
+ app_type, acdb_dev_id,
+ session_type);
if ((copp_idx < 0) ||
(copp_idx >= MAX_COPPS_PER_PORT)) {
pr_err("%s: adm open failed copp_idx:%d\n",
@@ -1462,16 +1469,14 @@
if (msm_is_resample_needed(
sample_rate,
msm_bedais[i].sample_rate))
- adm_copp_mfc_cfg(
- msm_bedais[i].port_id, copp_idx,
+ adm_copp_mfc_cfg(port_id, copp_idx,
msm_bedais[i].sample_rate);
for (j = 0; j < MAX_COPPS_PER_PORT; j++) {
unsigned long copp =
session_copp_map[fedai_id][session_type][i];
if (test_bit(j, &copp)) {
- payload.port_id[num_copps] =
- msm_bedais[i].port_id;
+ payload.port_id[num_copps] = port_id;
payload.copp_idx[num_copps] = j;
payload.app_type[num_copps] =
fe_dai_app_type_cfg
@@ -1491,9 +1496,8 @@
if ((perf_mode == LEGACY_PCM_MODE) &&
(msm_bedais[i].passthr_mode[fedai_id] ==
LEGACY_PCM))
- msm_pcm_routing_cfg_pp(msm_bedais[i].port_id,
- copp_idx, topology,
- channels);
+ msm_pcm_routing_cfg_pp(port_id, copp_idx,
+ topology, channels);
}
}
if (num_copps) {
@@ -1528,7 +1532,7 @@
void msm_pcm_routing_dereg_phy_stream(int fedai_id, int stream_type)
{
- int i, port_type, session_type, path_type, topology;
+ int i, port_type, session_type, path_type, topology, port_id;
struct msm_pcm_routing_fdai_data *fdai;
if (!is_mm_lsm_fe_id(fedai_id)) {
@@ -1567,9 +1571,10 @@
__func__);
continue;
}
+ port_id = get_port_id(msm_bedais[i].port_id);
topology = adm_get_topology_for_port_copp_idx(
- msm_bedais[i].port_id, idx);
- adm_close(msm_bedais[i].port_id, fdai->perf_mode, idx);
+ port_id, idx);
+ adm_close(port_id, fdai->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,
@@ -1579,8 +1584,7 @@
(fdai->perf_mode == LEGACY_PCM_MODE) &&
(msm_bedais[i].passthr_mode[fedai_id] ==
LEGACY_PCM))
- msm_pcm_routing_deinit_pp(msm_bedais[i].port_id,
- topology);
+ msm_pcm_routing_deinit_pp(port_id, topology);
}
}
@@ -1659,6 +1663,7 @@
if (msm_bedais[reg].active && fdai->strm_id !=
INVALID_SESSION) {
int app_type, app_type_idx, copp_idx, acdb_dev_id;
+ int port_id = get_port_id(msm_bedais[reg].port_id);
/*
* check if ADM needs to be configured with different
* channel mapping than backend
@@ -1709,10 +1714,11 @@
reg);
acdb_dev_id =
fe_dai_app_type_cfg[val][session_type][reg].acdb_dev_id;
- copp_idx = adm_open(msm_bedais[reg].port_id, path_type,
+ copp_idx = adm_open(port_id, path_type,
sample_rate, channels, topology,
fdai->perf_mode, bits_per_sample,
- app_type, acdb_dev_id);
+ app_type, acdb_dev_id,
+ session_type);
if ((copp_idx < 0) ||
(copp_idx >= MAX_COPPS_PER_PORT)) {
pr_err("%s: adm open failed\n", __func__);
@@ -1727,8 +1733,7 @@
if (msm_is_resample_needed(
sample_rate,
msm_bedais[reg].sample_rate))
- adm_copp_mfc_cfg(
- msm_bedais[reg].port_id, copp_idx,
+ adm_copp_mfc_cfg(port_id, copp_idx,
msm_bedais[reg].sample_rate);
if (session_type == SESSION_TYPE_RX &&
@@ -1743,9 +1748,8 @@
passthr_mode);
if ((fdai->perf_mode == LEGACY_PCM_MODE) &&
(passthr_mode == LEGACY_PCM))
- msm_pcm_routing_cfg_pp(msm_bedais[reg].port_id,
- copp_idx, topology,
- channels);
+ msm_pcm_routing_cfg_pp(port_id, copp_idx,
+ topology, channels);
}
} else {
if (test_bit(val, &msm_bedais[reg].fe_sessions[0]) &&
@@ -1764,11 +1768,10 @@
if (test_bit(idx, &copp))
break;
- port_id = msm_bedais[reg].port_id;
+ port_id = get_port_id(msm_bedais[reg].port_id);
topology = adm_get_topology_for_port_copp_idx(port_id,
idx);
- adm_close(msm_bedais[reg].port_id, fdai->perf_mode,
- idx);
+ adm_close(port_id, fdai->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);
@@ -1778,9 +1781,7 @@
topology == DS2_ADM_COPP_TOPOLOGY_ID) &&
(fdai->perf_mode == LEGACY_PCM_MODE) &&
(passthr_mode == LEGACY_PCM))
- msm_pcm_routing_deinit_pp(
- msm_bedais[reg].port_id,
- topology);
+ msm_pcm_routing_deinit_pp(port_id, topology);
msm_pcm_routing_build_matrix(val, session_type,
path_type,
fdai->perf_mode,
@@ -3670,6 +3671,7 @@
ec_ref_port_id = AFE_PORT_INVALID;
break;
}
+ msm_ec_ref_port_id = ec_ref_port_id;
adm_ec_ref_rx_id(ec_ref_port_id);
pr_debug("%s: msm_route_ec_ref_rx = %d\n",
__func__, msm_route_ec_ref_rx);
@@ -7904,6 +7906,9 @@
SOC_SINGLE_EXT("QUIN_TDM_TX_3", MSM_BACKEND_DAI_QUIN_TDM_TX_3,
MSM_FRONTEND_DAI_MULTIMEDIA9, 1, 0, msm_routing_get_audio_mixer,
msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("AFE_LOOPBACK_TX", MSM_BACKEND_DAI_AFE_LOOPBACK_TX,
+ MSM_FRONTEND_DAI_MULTIMEDIA9, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
};
static const struct snd_kcontrol_new mmul10_mixer_controls[] = {
@@ -12312,6 +12317,9 @@
} else if (!strcmp(kcontrol->id.name + strlen(prefix),
"INT3_MI2S")) {
*port_id = AFE_PORT_ID_INT3_MI2S_TX;
+ } else if (!strcmp(kcontrol->id.name + strlen(prefix),
+ "PRIMARY_TDM")) {
+ *port_id = AFE_PORT_ID_PRIMARY_TDM_TX;
} else {
pr_err("%s: mixer ctl name=%s, could not derive valid port id\n",
__func__, kcontrol->id.name);
@@ -12546,6 +12554,21 @@
.info = msm_source_tracking_info,
.get = msm_audio_source_tracking_get,
},
+ {
+ .access = SNDRV_CTL_ELEM_ACCESS_READWRITE,
+ .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
+ .name = "Sound Focus Audio Tx PRIMARY_TDM",
+ .info = msm_sound_focus_info,
+ .get = msm_audio_sound_focus_get,
+ .put = msm_audio_sound_focus_put,
+ },
+ {
+ .access = SNDRV_CTL_ELEM_ACCESS_READ,
+ .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
+ .name = "Source Tracking Audio Tx PRIMARY_TDM",
+ .info = msm_source_tracking_info,
+ .get = msm_audio_source_tracking_get,
+ },
};
static int spkr_prot_put_vi_lch_port(struct snd_kcontrol *kcontrol,
@@ -14343,6 +14366,7 @@
{"PRI_MI2S_RX Audio Mixer", "MultiMedia6", "MM_DL6"},
{"PRI_MI2S_RX Audio Mixer", "MultiMedia7", "MM_DL7"},
{"PRI_MI2S_RX Audio Mixer", "MultiMedia8", "MM_DL8"},
+ {"PRI_MI2S_RX Audio Mixer", "MultiMedia9", "MM_DL9"},
{"PRI_MI2S_RX Audio Mixer", "MultiMedia10", "MM_DL10"},
{"PRI_MI2S_RX Audio Mixer", "MultiMedia11", "MM_DL11"},
{"PRI_MI2S_RX Audio Mixer", "MultiMedia12", "MM_DL12"},
@@ -16879,10 +16903,10 @@
if (test_bit(idx, &copp))
break;
fdai->be_srate = bedai->sample_rate;
- port_id = bedai->port_id;
+ port_id = get_port_id(msm_bedais[i].port_id);
topology = adm_get_topology_for_port_copp_idx(port_id,
idx);
- adm_close(bedai->port_id, fdai->perf_mode, idx);
+ adm_close(port_id, fdai->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);
@@ -16890,7 +16914,7 @@
&session_copp_map[i][session_type][be_id]);
if ((fdai->perf_mode == LEGACY_PCM_MODE) &&
(bedai->passthr_mode[i] == LEGACY_PCM))
- msm_pcm_routing_deinit_pp(bedai->port_id,
+ msm_pcm_routing_deinit_pp(port_id,
topology);
}
}
@@ -16963,6 +16987,7 @@
fdai = &fe_dai_map[i][session_type];
if (fdai->strm_id != INVALID_SESSION) {
int app_type, app_type_idx, copp_idx, acdb_dev_id;
+ int port_id = get_port_id(bedai->port_id);
if (session_type == SESSION_TYPE_TX &&
fdai->be_srate &&
@@ -17012,10 +17037,11 @@
fe_dai_app_type_cfg[i][session_type][be_id].acdb_dev_id;
topology = msm_routing_get_adm_topology(i, session_type,
be_id);
- copp_idx = adm_open(bedai->port_id, path_type,
+ copp_idx = adm_open(port_id, path_type,
sample_rate, channels, topology,
fdai->perf_mode, bits_per_sample,
- app_type, acdb_dev_id);
+ app_type, acdb_dev_id,
+ session_type);
if ((copp_idx < 0) ||
(copp_idx >= MAX_COPPS_PER_PORT)) {
pr_err("%s: adm open failed\n", __func__);
@@ -17030,8 +17056,7 @@
if (msm_is_resample_needed(
sample_rate,
bedai->sample_rate))
- adm_copp_mfc_cfg(
- bedai->port_id, copp_idx,
+ adm_copp_mfc_cfg(port_id, copp_idx,
bedai->sample_rate);
msm_pcm_routing_build_matrix(i, session_type, path_type,
@@ -17039,7 +17064,7 @@
bedai->passthr_mode[i]);
if ((fdai->perf_mode == LEGACY_PCM_MODE) &&
(bedai->passthr_mode[i] == LEGACY_PCM))
- msm_pcm_routing_cfg_pp(bedai->port_id, copp_idx,
+ msm_pcm_routing_cfg_pp(port_id, copp_idx,
topology, channels);
}
}
diff --git a/dsp/q6adm.c b/dsp/q6adm.c
index 48e4b16..74a9244 100644
--- a/dsp/q6adm.c
+++ b/dsp/q6adm.c
@@ -66,6 +66,7 @@
atomic_t channels[AFE_MAX_PORTS][MAX_COPPS_PER_PORT];
atomic_t app_type[AFE_MAX_PORTS][MAX_COPPS_PER_PORT];
atomic_t acdb_id[AFE_MAX_PORTS][MAX_COPPS_PER_PORT];
+ atomic_t session_type[AFE_MAX_PORTS][MAX_COPPS_PER_PORT];
wait_queue_head_t wait[AFE_MAX_PORTS][MAX_COPPS_PER_PORT];
wait_queue_head_t adm_delay_wait[AFE_MAX_PORTS][MAX_COPPS_PER_PORT];
atomic_t adm_delay_stat[AFE_MAX_PORTS][MAX_COPPS_PER_PORT];
@@ -267,7 +268,8 @@
}
static int adm_get_idx_if_copp_exists(int port_idx, int topology, int mode,
- int rate, int bit_width, int app_type)
+ int rate, int bit_width, int app_type,
+ int session_type)
{
int idx;
@@ -281,6 +283,9 @@
(rate == atomic_read(&this_adm.copp.rate[port_idx][idx])) &&
(bit_width ==
atomic_read(&this_adm.copp.bit_width[port_idx][idx])) &&
+ (session_type ==
+ atomic_read(
+ &this_adm.copp.session_type[port_idx][idx])) &&
(app_type ==
atomic_read(&this_adm.copp.app_type[port_idx][idx])))
return idx;
@@ -1468,6 +1473,8 @@
&this_adm.copp.app_type[i][j], 0);
atomic_set(
&this_adm.copp.acdb_id[i][j], 0);
+ atomic_set(
+ &this_adm.copp.session_type[i][j], 0);
this_adm.copp.adm_status[i][j] =
ADM_STATUS_CALIBRATION_REQUIRED;
}
@@ -2560,7 +2567,8 @@
* Returns 0 on success or error on failure
*/
int adm_open(int port_id, int path, int rate, int channel_mode, int topology,
- int perf_mode, uint16_t bit_width, int app_type, int acdb_id)
+ int perf_mode, uint16_t bit_width, int app_type, int acdb_id,
+ int session_type)
{
struct adm_cmd_device_open_v5 open;
struct adm_cmd_device_open_v6 open_v6;
@@ -2629,7 +2637,7 @@
copp_idx = adm_get_idx_if_copp_exists(port_idx, topology,
perf_mode,
rate, bit_width,
- app_type);
+ app_type, session_type);
if (copp_idx < 0) {
copp_idx = adm_get_next_available_copp(port_idx);
@@ -2653,6 +2661,8 @@
app_type);
atomic_set(&this_adm.copp.acdb_id[port_idx][copp_idx],
acdb_id);
+ atomic_set(&this_adm.copp.session_type[port_idx][copp_idx],
+ session_type);
set_bit(ADM_STATUS_CALIBRATION_REQUIRED,
(void *)&this_adm.copp.adm_status[port_idx][copp_idx]);
if ((path != ADM_PATH_COMPRESSED_RX) &&
@@ -2703,7 +2713,8 @@
open.endpoint_id_1 = tmp_port;
open.endpoint_id_2 = 0xFFFF;
- if (this_adm.ec_ref_rx && (path != 1)) {
+ if (this_adm.ec_ref_rx && (path != 1) &&
+ (afe_get_port_type(tmp_port) == MSM_AFE_PORT_TYPE_TX)) {
open.endpoint_id_2 = this_adm.ec_ref_rx;
this_adm.ec_ref_rx = -1;
}
@@ -3252,6 +3263,7 @@
atomic_set(&this_adm.copp.channels[port_idx][copp_idx], 0);
atomic_set(&this_adm.copp.bit_width[port_idx][copp_idx], 0);
atomic_set(&this_adm.copp.app_type[port_idx][copp_idx], 0);
+ atomic_set(&this_adm.copp.session_type[port_idx][copp_idx], 0);
clear_bit(ADM_STATUS_CALIBRATION_REQUIRED,
(void *)&this_adm.copp.adm_status[port_idx][copp_idx]);
@@ -5243,6 +5255,7 @@
atomic_set(&this_adm.copp.bit_width[i][j], 0);
atomic_set(&this_adm.copp.app_type[i][j], 0);
atomic_set(&this_adm.copp.acdb_id[i][j], 0);
+ atomic_set(&this_adm.copp.session_type[i][j], 0);
init_waitqueue_head(&this_adm.copp.wait[i][j]);
atomic_set(&this_adm.copp.adm_delay_stat[i][j], 0);
init_waitqueue_head(
diff --git a/include/dsp/q6adm-v2.h b/include/dsp/q6adm-v2.h
index 881943b..e8000ab 100644
--- a/include/dsp/q6adm-v2.h
+++ b/include/dsp/q6adm-v2.h
@@ -102,7 +102,7 @@
int adm_open(int port, int path, int rate, int mode, int topology,
int perf_mode, uint16_t bits_per_sample,
- int app_type, int acdbdev_id);
+ int app_type, int acdbdev_id, int session_type);
int adm_map_rtac_block(struct rtac_cal_block_data *cal_block);