summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorqctecmdr <qctecmdr@localhost>2019-10-23 12:15:24 -0700
committerGerrit - the friendly Code Review server <code-review@localhost>2019-10-23 12:15:24 -0700
commit309767748c6d1447b0fc718e59f14dcaa9992cc4 (patch)
treed63963e0e12207f2738e06b375dfb9d92f8e9df9
parentb55454695def1f848f74ec8feb7cf11acbaca3cd (diff)
parent01b8a2c2d5e4271ef0d89be9d5457593b1873fb3 (diff)
downloadmsm-extra-309767748c6d1447b0fc718e59f14dcaa9992cc4.tar.gz
Merge "ASoC: Add pseudo port to support downlink playback"
-rw-r--r--asoc/msm-dai-q6-v2.c21
-rw-r--r--asoc/msm-pcm-routing-v2.c60
-rw-r--r--asoc/msm-pcm-routing-v2.h2
-rw-r--r--asoc/sdxpoorwills.c35
-rw-r--r--dsp/q6afe.c5
-rw-r--r--dsp/q6audio-v2.c3
-rw-r--r--dsp/q6voice.c2
-rw-r--r--include/dsp/apr_audio-v2.h1
8 files changed, 121 insertions, 8 deletions
diff --git a/asoc/msm-dai-q6-v2.c b/asoc/msm-dai-q6-v2.c
index 2ab7da5e..bbac4053 100644
--- a/asoc/msm-dai-q6-v2.c
+++ b/asoc/msm-dai-q6-v2.c
@@ -1929,6 +1929,7 @@ static int msm_dai_q6_hw_params(struct snd_pcm_substream *substream,
rc = msm_dai_q6_afe_rtproxy_hw_params(params, dai);
break;
case VOICE_PLAYBACK_TX:
+ case VOICE_PLAYBACK_DL_TX:
case VOICE2_PLAYBACK_TX:
case VOICE_RECORD_RX:
case VOICE_RECORD_TX:
@@ -3085,6 +3086,23 @@ static struct snd_soc_dai_driver msm_dai_q6_voc_playback_dai[] = {
.probe = msm_dai_q6_dai_probe,
.remove = msm_dai_q6_dai_remove,
},
+ {
+ .playback = {
+ .stream_name = "Voice Downlink Playback",
+ .aif_name = "VOICE_PLAYBACK_DL_TX",
+ .rates = SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_8000 |
+ SNDRV_PCM_RATE_16000,
+ .formats = SNDRV_PCM_FMTBIT_S16_LE,
+ .channels_min = 1,
+ .channels_max = 2,
+ .rate_min = 8000,
+ .rate_max = 48000,
+ },
+ .ops = &msm_dai_q6_ops,
+ .id = VOICE_PLAYBACK_DL_TX,
+ .probe = msm_dai_q6_dai_probe,
+ .remove = msm_dai_q6_dai_remove,
+ },
};
static struct snd_soc_dai_driver msm_dai_q6_incall_record_dai[] = {
@@ -5160,6 +5178,9 @@ register_afe_capture:
pr_err("%s: Device not found stream name %s\n",
__func__, stream_name);
break;
+ case VOICE_PLAYBACK_DL_TX:
+ strlcpy(stream_name, "Voice Downlink Playback", 80);
+ goto register_voice_playback;
case VOICE_PLAYBACK_TX:
strlcpy(stream_name, "Voice Farend Playback", 80);
goto register_voice_playback;
diff --git a/asoc/msm-pcm-routing-v2.c b/asoc/msm-pcm-routing-v2.c
index 8a44b528..6ac7be8b 100644
--- a/asoc/msm-pcm-routing-v2.c
+++ b/asoc/msm-pcm-routing-v2.c
@@ -311,6 +311,8 @@ struct msm_pcm_routing_bdai_data msm_bedais[MSM_BACKEND_DAI_MAX] = {
LPASS_BE_AUXPCM_TX},
{ VOICE_PLAYBACK_TX, 0, {0}, {0}, 0, 0, 0, 0, {0},
LPASS_BE_VOICE_PLAYBACK_TX},
+ { VOICE_PLAYBACK_DL_TX, 0, {0}, {0}, 0, 0, 0, 0, {0},
+ LPASS_BE_VOICE_PLAYBACK_DL_TX},
{ VOICE2_PLAYBACK_TX, 0, {0}, {0}, 0, 0, 0, 0, {0},
LPASS_BE_VOICE2_PLAYBACK_TX},
{ VOICE_RECORD_RX, 0, {0}, {0}, 0, 0, 0, 0, {0},
@@ -1656,7 +1658,8 @@ static void msm_pcm_routing_process_audio(u16 reg, u16 val, int set)
if (set) {
if (!test_bit(val, &msm_bedais[reg].fe_sessions[0]) &&
((msm_bedais[reg].port_id == VOICE_PLAYBACK_TX) ||
- (msm_bedais[reg].port_id == VOICE2_PLAYBACK_TX)))
+ (msm_bedais[reg].port_id == VOICE2_PLAYBACK_TX) ||
+ (msm_bedais[reg].port_id == VOICE_PLAYBACK_DL_TX)))
voc_start_playback(set, msm_bedais[reg].port_id);
set_bit(val, &msm_bedais[reg].fe_sessions[0]);
@@ -1755,7 +1758,8 @@ static void msm_pcm_routing_process_audio(u16 reg, u16 val, int set)
} else {
if (test_bit(val, &msm_bedais[reg].fe_sessions[0]) &&
((msm_bedais[reg].port_id == VOICE_PLAYBACK_TX) ||
- (msm_bedais[reg].port_id == VOICE2_PLAYBACK_TX)))
+ (msm_bedais[reg].port_id == VOICE2_PLAYBACK_TX) ||
+ (msm_bedais[reg].port_id == VOICE_PLAYBACK_DL_TX)))
voc_start_playback(set, msm_bedais[reg].port_id);
clear_bit(val, &msm_bedais[reg].fe_sessions[0]);
fdai = &fe_dai_map[val][session_type];
@@ -2869,9 +2873,9 @@ static const char *const be_name[] = {
"ZERO", "PRI_I2S_RX", "PRI_I2S_TX", "SLIM_0_RX",
"SLIM_0_TX", "HDMI_RX", "INT_BT_SCO_RX", "INT_BT_SCO_TX",
"INT_FM_RX", "INT_FM_TX", "AFE_PCM_RX", "AFE_PCM_TX",
-"AUXPCM_RX", "AUXPCM_TX", "VOICE_PLAYBACK_TX", "VOICE2_PLAYBACK_TX",
-"INCALL_RECORD_RX", "INCALL_RECORD_TX", "MI2S_RX", "MI2S_TX",
-"SEC_I2S_RX", "SLIM_1_RX", "SLIM_1_TX", "SLIM_2_RX",
+"AUXPCM_RX", "AUXPCM_TX", "VOICE_PLAYBACK_TX", "VOICE_PLAYBACK_DL_TX",
+"VOICE2_PLAYBACK_TX", "INCALL_RECORD_RX", "INCALL_RECORD_TX", "MI2S_RX",
+"MI2S_TX", "SEC_I2S_RX", "SLIM_1_RX", "SLIM_1_TX", "SLIM_2_RX",
"SLIM_2_TX", "SLIM_3_RX", "SLIM_3_TX", "SLIM_4_RX",
"SLIM_4_TX", "SLIM_5_RX", "SLIM_5_TX", "SLIM_6_RX",
"SLIM_6_TX", "SLIM_7_RX", "SLIM_7_TX", "SLIM_8_RX",
@@ -5212,12 +5216,38 @@ static const struct snd_kcontrol_new incall_music_delivery_mixer_controls[] = {
MSM_BACKEND_DAI_VOICE_PLAYBACK_TX,
MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer,
msm_routing_put_audio_mixer),
+ SOC_DOUBLE_EXT("MultiMedia7", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_VOICE_PLAYBACK_TX,
+ MSM_FRONTEND_DAI_MULTIMEDIA7, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
SOC_DOUBLE_EXT("MultiMedia9", SND_SOC_NOPM,
MSM_BACKEND_DAI_VOICE_PLAYBACK_TX,
MSM_FRONTEND_DAI_MULTIMEDIA9, 1, 0, msm_routing_get_audio_mixer,
msm_routing_put_audio_mixer),
};
+ /* incall music downlink delivery mixer */
+static const struct snd_kcontrol_new incall_music_dl_delivery_mixer_controls[] = {
+ SOC_SINGLE_EXT("MultiMedia1", MSM_BACKEND_DAI_VOICE_PLAYBACK_DL_TX,
+ MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("MultiMedia2", MSM_BACKEND_DAI_VOICE_PLAYBACK_DL_TX,
+ MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("MultiMedia4", MSM_BACKEND_DAI_VOICE_PLAYBACK_DL_TX,
+ MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("MultiMedia5", MSM_BACKEND_DAI_VOICE_PLAYBACK_DL_TX,
+ MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("MultiMedia7", MSM_BACKEND_DAI_VOICE_PLAYBACK_DL_TX,
+ MSM_FRONTEND_DAI_MULTIMEDIA7, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("MultiMedia9", MSM_BACKEND_DAI_VOICE_PLAYBACK_DL_TX,
+ MSM_FRONTEND_DAI_MULTIMEDIA9, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+};
+
static const struct snd_kcontrol_new incall_music2_delivery_mixer_controls[] = {
SOC_DOUBLE_EXT("MultiMedia1", SND_SOC_NOPM,
MSM_BACKEND_DAI_VOICE2_PLAYBACK_TX,
@@ -5231,6 +5261,10 @@ static const struct snd_kcontrol_new incall_music2_delivery_mixer_controls[] = {
MSM_BACKEND_DAI_VOICE2_PLAYBACK_TX,
MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer,
msm_routing_put_audio_mixer),
+ SOC_DOUBLE_EXT("MultiMedia7", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_VOICE2_PLAYBACK_TX,
+ MSM_FRONTEND_DAI_MULTIMEDIA7, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
SOC_DOUBLE_EXT("MultiMedia9", SND_SOC_NOPM,
MSM_BACKEND_DAI_VOICE2_PLAYBACK_TX,
MSM_FRONTEND_DAI_MULTIMEDIA9, 1, 0, msm_routing_get_audio_mixer,
@@ -14276,7 +14310,7 @@ static int msm_voc_session_id_get(struct snd_kcontrol *kcontrol,
static struct snd_kcontrol_new msm_voc_session_controls[] = {
SOC_SINGLE_MULTI_EXT("Voc VSID", SND_SOC_NOPM, 0,
- 0xFFFFFFFF, 0, 1, msm_voc_session_id_get,
+ 0x7FFFFFFF, 0, 1, msm_voc_session_id_get,
msm_voc_session_id_put),
};
@@ -15505,6 +15539,8 @@ static const struct snd_soc_dapm_widget msm_qdsp6_widgets[] = {
/* incall */
SND_SOC_DAPM_AIF_OUT("VOICE_PLAYBACK_TX", "Voice Farend Playback",
0, 0, 0, 0),
+ SND_SOC_DAPM_AIF_OUT("VOICE_PLAYBACK_DL_TX", "Voice Downlink Playback",
+ 0, 0, 0, 0),
SND_SOC_DAPM_AIF_OUT("VOICE2_PLAYBACK_TX", "Voice2 Farend Playback",
0, 0, 0, 0),
SND_SOC_DAPM_AIF_OUT("SLIMBUS_4_RX", "Slimbus4 Playback",
@@ -15783,6 +15819,9 @@ static const struct snd_soc_dapm_widget msm_qdsp6_widgets[] = {
SND_SOC_DAPM_MIXER("Incall_Music Audio Mixer", SND_SOC_NOPM, 0, 0,
incall_music_delivery_mixer_controls,
ARRAY_SIZE(incall_music_delivery_mixer_controls)),
+ SND_SOC_DAPM_MIXER("Incall_Music_DL Audio Mixer", SND_SOC_NOPM, 0, 0,
+ incall_music_dl_delivery_mixer_controls,
+ ARRAY_SIZE(incall_music_dl_delivery_mixer_controls)),
SND_SOC_DAPM_MIXER("Incall_Music_2 Audio Mixer", SND_SOC_NOPM, 0, 0,
incall_music2_delivery_mixer_controls,
ARRAY_SIZE(incall_music2_delivery_mixer_controls)),
@@ -16271,8 +16310,16 @@ static const struct snd_soc_dapm_route intercon[] = {
{"Incall_Music Audio Mixer", "MultiMedia2", "MM_DL2"},
{"Incall_Music Audio Mixer", "MultiMedia4", "MM_DL4"},
{"Incall_Music Audio Mixer", "MultiMedia5", "MM_DL5"},
+ {"Incall_Music Audio Mixer", "MultiMedia7", "MM_DL7"},
{"Incall_Music Audio Mixer", "MultiMedia9", "MM_DL9"},
{"VOICE_PLAYBACK_TX", NULL, "Incall_Music Audio Mixer"},
+ {"Incall_Music_DL Audio Mixer", "MultiMedia1", "MM_DL1"},
+ {"Incall_Music_DL Audio Mixer", "MultiMedia2", "MM_DL2"},
+ {"Incall_Music_DL Audio Mixer", "MultiMedia4", "MM_DL4"},
+ {"Incall_Music_DL Audio Mixer", "MultiMedia5", "MM_DL5"},
+ {"Incall_Music_DL Audio Mixer", "MultiMedia7", "MM_DL7"},
+ {"Incall_Music_DL Audio Mixer", "MultiMedia9", "MM_DL9"},
+ {"VOICE_PLAYBACK_DL_TX", NULL, "Incall_Music_DL Audio Mixer"},
{"Incall_Music_2 Audio Mixer", "MultiMedia1", "MM_DL1"},
{"Incall_Music_2 Audio Mixer", "MultiMedia2", "MM_DL2"},
{"Incall_Music_2 Audio Mixer", "MultiMedia5", "MM_DL5"},
@@ -18805,6 +18852,7 @@ static const struct snd_soc_dapm_route intercon[] = {
{"BE_OUT", NULL, "PCM_RX"},
{"BE_OUT", NULL, "SLIMBUS_3_RX"},
{"BE_OUT", NULL, "VOICE_PLAYBACK_TX"},
+ {"BE_OUT", NULL, "VOICE_PLAYBACK_DL_TX"},
{"BE_OUT", NULL, "VOICE2_PLAYBACK_TX"},
{"BE_OUT", NULL, "PRI_TDM_RX_0"},
{"BE_OUT", NULL, "PRI_TDM_RX_1"},
diff --git a/asoc/msm-pcm-routing-v2.h b/asoc/msm-pcm-routing-v2.h
index e25c256e..7ade05d5 100644
--- a/asoc/msm-pcm-routing-v2.h
+++ b/asoc/msm-pcm-routing-v2.h
@@ -43,6 +43,7 @@
#define LPASS_BE_QUIN_AUXPCM_RX "QUIN_AUX_PCM_RX"
#define LPASS_BE_QUIN_AUXPCM_TX "QUIN_AUX_PCM_TX"
#define LPASS_BE_VOICE_PLAYBACK_TX "VOICE_PLAYBACK_TX"
+#define LPASS_BE_VOICE_PLAYBACK_DL_TX "VOICE_PLAYBACK_DL_TX"
#define LPASS_BE_VOICE2_PLAYBACK_TX "VOICE2_PLAYBACK_TX"
#define LPASS_BE_INCALL_RECORD_RX "INCALL_RECORD_RX"
#define LPASS_BE_INCALL_RECORD_TX "INCALL_RECORD_TX"
@@ -254,6 +255,7 @@ enum {
MSM_BACKEND_DAI_AUXPCM_RX,
MSM_BACKEND_DAI_AUXPCM_TX,
MSM_BACKEND_DAI_VOICE_PLAYBACK_TX,
+ MSM_BACKEND_DAI_VOICE_PLAYBACK_DL_TX,
MSM_BACKEND_DAI_VOICE2_PLAYBACK_TX,
MSM_BACKEND_DAI_INCALL_RECORD_RX,
MSM_BACKEND_DAI_INCALL_RECORD_TX,
diff --git a/asoc/sdxpoorwills.c b/asoc/sdxpoorwills.c
index a2dbfd5d..216b6100 100644
--- a/asoc/sdxpoorwills.c
+++ b/asoc/sdxpoorwills.c
@@ -2773,12 +2773,30 @@ static struct snd_soc_dai_link sdx_common_dai_links[] = {
.codec_dai_name = "snd-soc-dummy-dai",
.codec_name = "snd-soc-dummy",
},
+ {
+ /*hw:x,33*/
+ .name = SDX_DAILINK_NAME(Compress2),
+ .stream_name = "COMPR2",
+ .cpu_dai_name = "MultiMedia7",
+ .platform_name = "msm-compress-dsp",
+ .dynamic = 1,
+ .async_ops = ASYNC_DPCM_SND_SOC_HW_PARAMS,
+ .dpcm_playback = 1,
+ .dpcm_capture = 1,
+ .trigger = {SND_SOC_DPCM_TRIGGER_POST,
+ SND_SOC_DPCM_TRIGGER_POST},
+ .codec_dai_name = "snd-soc-dummy-dai",
+ .codec_name = "snd-soc-dummy",
+ .ignore_suspend = 1,
+ .ignore_pmdown_time = 1,
+ .id = MSM_FRONTEND_DAI_MULTIMEDIA7,
+ },
};
static struct snd_soc_dai_link sdx_common_misc_fe_dai_links[] = {
{
- /*hw:x,33*/
+ /*hw:x,34*/
.name = SDX_DAILINK_NAME(ASM Loopback),
.stream_name = "MultiMedia6",
.cpu_dai_name = "MultiMedia6",
@@ -2884,6 +2902,21 @@ static struct snd_soc_dai_link sdx_common_be_dai_links[] = {
.ignore_suspend = 1,
.ignore_pmdown_time = 1,
},
+ /* Incall Music BACK END DAI Link */
+ {
+ .name = LPASS_BE_VOICE_PLAYBACK_DL_TX,
+ .stream_name = "Voice Downlink Playback",
+ .cpu_dai_name = "msm-dai-q6-dev.32774",
+ .platform_name = "msm-pcm-routing",
+ .codec_name = "msm-stub-codec.1",
+ .codec_dai_name = "msm-stub-rx",
+ .no_pcm = 1,
+ .dpcm_playback = 1,
+ .id = MSM_BACKEND_DAI_VOICE_PLAYBACK_DL_TX,
+ .be_hw_params_fixup = sdx_be_hw_params_fixup,
+ .ignore_suspend = 1,
+ .ignore_pmdown_time = 1,
+ },
};
static struct snd_soc_dai_link sdx_mi2s_be_dai_links[] = {
diff --git a/dsp/q6afe.c b/dsp/q6afe.c
index 2d3447a1..ee8f0d6a 100644
--- a/dsp/q6afe.c
+++ b/dsp/q6afe.c
@@ -515,6 +515,7 @@ int afe_get_port_type(u16 port_id)
case INT_BT_A2DP_RX:
case INT_FM_RX:
case VOICE_PLAYBACK_TX:
+ case VOICE_PLAYBACK_DL_TX:
case VOICE2_PLAYBACK_TX:
case RT_PROXY_PORT_001_RX:
case AUDIO_PORT_ID_I2S_RX:
@@ -715,6 +716,7 @@ int afe_sizeof_cfg_cmd(u16 port_id)
ret_size = SIZEOF_CFG_CMD(afe_param_id_slimbus_cfg);
break;
case VOICE_PLAYBACK_TX:
+ case VOICE_PLAYBACK_DL_TX:
case VOICE2_PLAYBACK_TX:
case VOICE_RECORD_RX:
case VOICE_RECORD_TX:
@@ -3491,6 +3493,7 @@ static int __afe_port_start(u16 port_id, union afe_port_config *afe_config,
cfg_type = AFE_PARAM_ID_HDMI_CONFIG;
break;
case VOICE_PLAYBACK_TX:
+ case VOICE_PLAYBACK_DL_TX:
case VOICE2_PLAYBACK_TX:
case VOICE_RECORD_RX:
case VOICE_RECORD_TX:
@@ -3713,6 +3716,7 @@ int afe_get_port_index(u16 port_id)
case VOICE_RECORD_RX: return IDX_VOICE_RECORD_RX;
case VOICE_RECORD_TX: return IDX_VOICE_RECORD_TX;
case VOICE_PLAYBACK_TX: return IDX_VOICE_PLAYBACK_TX;
+ case VOICE_PLAYBACK_DL_TX: return IDX_VOICE_RECORD_RX;
case VOICE2_PLAYBACK_TX: return IDX_VOICE2_PLAYBACK_TX;
case SLIMBUS_0_RX: return IDX_SLIMBUS_0_RX;
case SLIMBUS_0_TX: return IDX_SLIMBUS_0_TX;
@@ -5725,6 +5729,7 @@ int afe_validate_port(u16 port_id)
case VOICE_RECORD_RX:
case VOICE_RECORD_TX:
case VOICE_PLAYBACK_TX:
+ case VOICE_PLAYBACK_DL_TX:
case VOICE2_PLAYBACK_TX:
case SLIMBUS_0_RX:
case SLIMBUS_0_TX:
diff --git a/dsp/q6audio-v2.c b/dsp/q6audio-v2.c
index 088d9b27..e0d09688 100644
--- a/dsp/q6audio-v2.c
+++ b/dsp/q6audio-v2.c
@@ -57,6 +57,7 @@ int q6audio_get_port_index(u16 port_id)
case VOICE_RECORD_RX: return IDX_VOICE_RECORD_RX;
case VOICE_RECORD_TX: return IDX_VOICE_RECORD_TX;
case VOICE_PLAYBACK_TX: return IDX_VOICE_PLAYBACK_TX;
+ case VOICE_PLAYBACK_DL_TX: return IDX_VOICE_RECORD_RX;
case VOICE2_PLAYBACK_TX: return IDX_VOICE2_PLAYBACK_TX;
case SLIMBUS_0_RX: return IDX_SLIMBUS_0_RX;
case SLIMBUS_0_TX: return IDX_SLIMBUS_0_TX;
@@ -344,6 +345,7 @@ int q6audio_get_port_id(u16 port_id)
case VOICE_RECORD_RX: return AFE_PORT_ID_VOICE_RECORD_RX;
case VOICE_RECORD_TX: return AFE_PORT_ID_VOICE_RECORD_TX;
case VOICE_PLAYBACK_TX: return AFE_PORT_ID_VOICE_PLAYBACK_TX;
+ case VOICE_PLAYBACK_DL_TX: return AFE_PORT_ID_VOICE_RECORD_RX;
case VOICE2_PLAYBACK_TX: return AFE_PORT_ID_VOICE2_PLAYBACK_TX;
case SLIMBUS_0_RX: return AFE_PORT_ID_SLIMBUS_MULTI_CHAN_0_RX;
case SLIMBUS_0_TX: return AFE_PORT_ID_SLIMBUS_MULTI_CHAN_0_TX;
@@ -779,6 +781,7 @@ int q6audio_validate_port(u16 port_id)
case VOICE_RECORD_RX:
case VOICE_RECORD_TX:
case VOICE_PLAYBACK_TX:
+ case VOICE_PLAYBACK_DL_TX:
case VOICE2_PLAYBACK_TX:
case SLIMBUS_0_RX:
case SLIMBUS_0_TX:
diff --git a/dsp/q6voice.c b/dsp/q6voice.c
index 1731831c..8b6a4d78 100644
--- a/dsp/q6voice.c
+++ b/dsp/q6voice.c
@@ -6093,7 +6093,7 @@ int voc_start_playback(uint32_t set, uint16_t port_id)
voice_itr_init(&itr, ALL_SESSION_VSID);
while (voice_itr_get_next_session(&itr, &v)) {
if ((v != NULL) &&
- (((port_id == VOICE_PLAYBACK_TX) &&
+ ((((port_id == VOICE_PLAYBACK_TX) || (port_id == VOICE_PLAYBACK_DL_TX))&&
is_sub1_vsid(v->session_id)) ||
((port_id == VOICE2_PLAYBACK_TX) &&
is_sub2_vsid(v->session_id)))) {
diff --git a/include/dsp/apr_audio-v2.h b/include/dsp/apr_audio-v2.h
index 7e0dfeec..2a925d05 100644
--- a/include/dsp/apr_audio-v2.h
+++ b/include/dsp/apr_audio-v2.h
@@ -946,6 +946,7 @@ struct adm_cmd_connect_afe_port_v5 {
#define VOICE_RECORD_RX 0x8003
#define VOICE_RECORD_TX 0x8004
#define VOICE_PLAYBACK_TX 0x8005
+#define VOICE_PLAYBACK_DL_TX 0x8006
/* Slimbus Multi channel port id pool */
#define SLIMBUS_0_RX 0x4000