From 453c34d2bd7de09177c55dd435055adc82fcb1ed Mon Sep 17 00:00:00 2001 From: Tahir Dawson Date: Thu, 5 Nov 2020 18:24:21 -0500 Subject: [PATCH] ASoC: msm: Add second proxy tx device FE and AFE Rx BE * Add AFE playback backend with port 0x2002 * Add proxy capture frontend to read data from port 0x2002 * Modify AFE platform and DSP drivers to support dual proxy usecase Change-Id: I35e33e5e922fb3092cffcc065fb514268c16cc17 Signed-off-by: Alexy Joseph --- asoc/msm-dai-q6-v2.c | 42 +++++++++++-- asoc/msm-pcm-routing-v2.c | 126 ++++++++++++++++++++++++++++++++++++- asoc/msm-pcm-routing-v2.h | 2 + dsp/q6afe.c | 107 ++++++++++++++++++++----------- dsp/q6audio-v2.c | 1 + include/dsp/apr_audio-v2.h | 2 + include/dsp/q6afe-v2.h | 1 + 7 files changed, 240 insertions(+), 41 deletions(-) mode change 100644 => 100755 asoc/msm-dai-q6-v2.c mode change 100644 => 100755 asoc/msm-pcm-routing-v2.c diff --git a/asoc/msm-dai-q6-v2.c b/asoc/msm-dai-q6-v2.c old mode 100644 new mode 100755 index 3f5b0bcc4c95..55fa8d3179f5 --- a/asoc/msm-dai-q6-v2.c +++ b/asoc/msm-dai-q6-v2.c @@ -2769,6 +2769,7 @@ static int msm_dai_q6_hw_params(struct snd_pcm_substream *substream, case RT_PROXY_DAI_002_TX: case RT_PROXY_DAI_002_RX: case RT_PROXY_DAI_003_TX: + case RT_PROXY_DAI_003_RX: case RT_PROXY_PORT_002_TX: case RT_PROXY_PORT_002_RX: rc = msm_dai_q6_afe_rtproxy_hw_params(params, dai); @@ -4091,6 +4092,10 @@ static const struct soc_enum rt_proxy_1_rx_enum = SOC_ENUM_SINGLE(RT_PROXY_PORT_001_RX, 0, ARRAY_SIZE(afe_cal_mode_text), afe_cal_mode_text); +static const struct soc_enum rt_proxy_2_rx_enum = + SOC_ENUM_SINGLE(RT_PROXY_PORT_002_RX, 0, ARRAY_SIZE(afe_cal_mode_text), + afe_cal_mode_text); + static const struct soc_enum rt_proxy_1_tx_enum = SOC_ENUM_SINGLE(RT_PROXY_PORT_001_TX, 0, ARRAY_SIZE(afe_cal_mode_text), afe_cal_mode_text); @@ -4112,11 +4117,14 @@ static const struct snd_kcontrol_new sb_config_controls[] = { static const struct snd_kcontrol_new rt_proxy_config_controls[] = { SOC_ENUM_EXT("RT_PROXY_1_RX SetCalMode", rt_proxy_1_rx_enum, - msm_dai_q6_cal_info_get, - msm_dai_q6_cal_info_put), + msm_dai_q6_cal_info_get, + msm_dai_q6_cal_info_put), SOC_ENUM_EXT("RT_PROXY_1_TX SetCalMode", rt_proxy_1_tx_enum, - msm_dai_q6_cal_info_get, - msm_dai_q6_cal_info_put), + msm_dai_q6_cal_info_get, + msm_dai_q6_cal_info_put), + SOC_ENUM_EXT("RT_PROXY_2_RX SetCalMode", rt_proxy_2_rx_enum, + msm_dai_q6_cal_info_get, + msm_dai_q6_cal_info_put), }; static const struct snd_kcontrol_new usb_audio_cfg_controls[] = { @@ -4284,6 +4292,11 @@ static int msm_dai_q6_dai_probe(struct snd_soc_dai *dai) snd_ctl_new1(&rt_proxy_config_controls[1], dai_data)); break; + case RT_PROXY_DAI_003_RX: + rc = snd_ctl_add(dai->component->card->snd_card, + snd_ctl_new1(&rt_proxy_config_controls[2], + dai_data)); + break; case AFE_PORT_ID_USB_RX: rc = snd_ctl_add(dai->component->card->snd_card, snd_ctl_new1(&usb_audio_cfg_controls[0], @@ -4381,6 +4394,24 @@ static struct snd_soc_dai_driver msm_dai_q6_afe_rx_dai[] = { .probe = msm_dai_q6_dai_probe, .remove = msm_dai_q6_dai_remove, }, + { + .playback = { + .stream_name = "AFE Playback1", + .aif_name = "PCM_RX1", + .rates = SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_8000 | + SNDRV_PCM_RATE_16000, + .formats = SNDRV_PCM_FMTBIT_S16_LE | + SNDRV_PCM_FMTBIT_S24_LE, + .channels_min = 1, + .channels_max = 2, + .rate_min = 8000, + .rate_max = 48000, + }, + .ops = &msm_dai_q6_ops, + .id = RT_PROXY_DAI_003_RX, + .probe = msm_dai_q6_dai_probe, + .remove = msm_dai_q6_dai_remove, + }, }; static struct snd_soc_dai_driver msm_dai_q6_afe_lb_tx_dai[] = { @@ -7616,6 +7647,9 @@ register_slim_capture: case RT_PROXY_DAI_001_RX: strlcpy(stream_name, "AFE Playback", 80); goto register_afe_playback; + case RT_PROXY_DAI_003_RX: + strlcpy(stream_name, "AFE Playback1", 80); + goto register_afe_playback; case RT_PROXY_DAI_002_RX: strlcpy(stream_name, "AFE-PROXY RX", 80); register_afe_playback: diff --git a/asoc/msm-pcm-routing-v2.c b/asoc/msm-pcm-routing-v2.c old mode 100644 new mode 100755 index e28683fb0cd2..d45f92822b97 --- a/asoc/msm-pcm-routing-v2.c +++ b/asoc/msm-pcm-routing-v2.c @@ -478,7 +478,8 @@ static void msm_pcm_routng_cfg_matrix_map_pp(struct route_payload payload, is_custom_stereo_on) { for (itr = 0; itr < payload.num_copps; itr++) { if ((payload.port_id[itr] != SLIMBUS_0_RX) && - (payload.port_id[itr] != RT_PROXY_PORT_001_RX)) { + (payload.port_id[itr] != RT_PROXY_PORT_001_RX) && + (payload.port_id[itr] != RT_PROXY_PORT_002_RX)) { continue; } @@ -886,6 +887,8 @@ struct msm_pcm_routing_bdai_data msm_bedais[MSM_BACKEND_DAI_MAX] = { { RT_PROXY_PORT_002_RX, 0, {0}, {0}, 0, 0, 0, 0, LPASS_BE_PROXY_RX}, { RT_PROXY_PORT_002_TX, 0, {0}, {0}, 0, 0, 0, 0, LPASS_BE_PROXY_TX}, { HDMI_RX_MS, 0, {0}, {0}, 0, 0, 0, 0, LPASS_BE_HDMI_MS}, + { RT_PROXY_PORT_002_RX, 0, {0}, {0}, 0, 0, 0, 0, + LPASS_BE_AFE_PCM_RX1}, }; /* Track ASM playback & capture sessions of DAI @@ -3746,7 +3749,7 @@ static const char *const be_name[] = { "RX_CDC_DMA_RX_6", "RX_CDC_DMA_RX_7", "PRI_SPDIF_TX", "SEC_SPDIF_RX", "SEC_SPDIF_TX", "SLIM_9_RX", "SLIM_9_TX", "AFE_LOOPBACK_TX", "PRI_META_MI2S_RX", -"SEC_META_MI2S_RX", "PROXY_RX", "PROXY_TX", "HDMI_RX_MS" +"SEC_META_MI2S_RX", "PROXY_RX", "PROXY_TX", "HDMI_RX_MS", "AFE_PCM_RX1" }; static SOC_ENUM_SINGLE_DECL(mm1_channel_mux, @@ -9983,6 +9986,101 @@ static const struct snd_kcontrol_new afe_pcm_rx_mixer_controls[] = { msm_routing_put_audio_mixer), }; +static const struct snd_kcontrol_new afe_pcm_rx_1_mixer_controls[] = { + SOC_DOUBLE_EXT("MultiMedia1", SND_SOC_NOPM, + MSM_BACKEND_DAI_AFE_PCM_RX1, + MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer, + msm_routing_put_audio_mixer), + SOC_DOUBLE_EXT("MultiMedia2", SND_SOC_NOPM, + MSM_BACKEND_DAI_AFE_PCM_RX1, + MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer, + msm_routing_put_audio_mixer), + SOC_DOUBLE_EXT("MultiMedia3", SND_SOC_NOPM, + MSM_BACKEND_DAI_AFE_PCM_RX1, + MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer, + msm_routing_put_audio_mixer), + SOC_DOUBLE_EXT("MultiMedia4", SND_SOC_NOPM, + MSM_BACKEND_DAI_AFE_PCM_RX1, + MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer, + msm_routing_put_audio_mixer), + SOC_DOUBLE_EXT("MultiMedia5", SND_SOC_NOPM, + MSM_BACKEND_DAI_AFE_PCM_RX1, + MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer, + msm_routing_put_audio_mixer), + SOC_DOUBLE_EXT("MultiMedia6", SND_SOC_NOPM, + MSM_BACKEND_DAI_AFE_PCM_RX1, + MSM_FRONTEND_DAI_MULTIMEDIA6, 1, 0, msm_routing_get_audio_mixer, + msm_routing_put_audio_mixer), + SOC_DOUBLE_EXT("MultiMedia7", SND_SOC_NOPM, + MSM_BACKEND_DAI_AFE_PCM_RX1, + MSM_FRONTEND_DAI_MULTIMEDIA7, 1, 0, msm_routing_get_audio_mixer, + msm_routing_put_audio_mixer), + SOC_DOUBLE_EXT("MultiMedia8", SND_SOC_NOPM, + MSM_BACKEND_DAI_AFE_PCM_RX1, + MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer, + msm_routing_put_audio_mixer), + SOC_DOUBLE_EXT("MultiMedia9", SND_SOC_NOPM, + MSM_BACKEND_DAI_AFE_PCM_RX1, + MSM_FRONTEND_DAI_MULTIMEDIA9, 1, 0, msm_routing_get_audio_mixer, + msm_routing_put_audio_mixer), + SOC_DOUBLE_EXT("MultiMedia10", SND_SOC_NOPM, + MSM_BACKEND_DAI_AFE_PCM_RX1, + MSM_FRONTEND_DAI_MULTIMEDIA10, 1, 0, msm_routing_get_audio_mixer, + msm_routing_put_audio_mixer), + SOC_DOUBLE_EXT("MultiMedia11", SND_SOC_NOPM, + MSM_BACKEND_DAI_AFE_PCM_RX1, + MSM_FRONTEND_DAI_MULTIMEDIA11, 1, 0, msm_routing_get_audio_mixer, + msm_routing_put_audio_mixer), + SOC_DOUBLE_EXT("MultiMedia12", SND_SOC_NOPM, + MSM_BACKEND_DAI_AFE_PCM_RX1, + MSM_FRONTEND_DAI_MULTIMEDIA12, 1, 0, msm_routing_get_audio_mixer, + msm_routing_put_audio_mixer), + SOC_DOUBLE_EXT("MultiMedia13", SND_SOC_NOPM, + MSM_BACKEND_DAI_AFE_PCM_RX1, + MSM_FRONTEND_DAI_MULTIMEDIA13, 1, 0, msm_routing_get_audio_mixer, + msm_routing_put_audio_mixer), + SOC_DOUBLE_EXT("MultiMedia14", SND_SOC_NOPM, + MSM_BACKEND_DAI_AFE_PCM_RX1, + MSM_FRONTEND_DAI_MULTIMEDIA14, 1, 0, msm_routing_get_audio_mixer, + msm_routing_put_audio_mixer), + SOC_DOUBLE_EXT("MultiMedia15", SND_SOC_NOPM, + MSM_BACKEND_DAI_AFE_PCM_RX1, + MSM_FRONTEND_DAI_MULTIMEDIA15, 1, 0, msm_routing_get_audio_mixer, + msm_routing_put_audio_mixer), + SOC_DOUBLE_EXT("MultiMedia16", SND_SOC_NOPM, + MSM_BACKEND_DAI_AFE_PCM_RX1, + MSM_FRONTEND_DAI_MULTIMEDIA16, 1, 0, msm_routing_get_audio_mixer, + msm_routing_put_audio_mixer), + SOC_DOUBLE_EXT("MultiMedia17", SND_SOC_NOPM, + MSM_BACKEND_DAI_AFE_PCM_RX1, + MSM_FRONTEND_DAI_MULTIMEDIA17, 1, 0, msm_routing_get_audio_mixer, + msm_routing_put_audio_mixer), + SOC_DOUBLE_EXT("MultiMedia18", SND_SOC_NOPM, + MSM_BACKEND_DAI_AFE_PCM_RX1, + MSM_FRONTEND_DAI_MULTIMEDIA18, 1, 0, msm_routing_get_audio_mixer, + msm_routing_put_audio_mixer), + SOC_DOUBLE_EXT("MultiMedia19", SND_SOC_NOPM, + MSM_BACKEND_DAI_AFE_PCM_RX1, + MSM_FRONTEND_DAI_MULTIMEDIA19, 1, 0, msm_routing_get_audio_mixer, + msm_routing_put_audio_mixer), + SOC_DOUBLE_EXT("MultiMedia26", SND_SOC_NOPM, + MSM_BACKEND_DAI_AFE_PCM_RX1, + MSM_FRONTEND_DAI_MULTIMEDIA26, 1, 0, msm_routing_get_audio_mixer, + msm_routing_put_audio_mixer), + SOC_DOUBLE_EXT("MultiMedia28", SND_SOC_NOPM, + MSM_BACKEND_DAI_AFE_PCM_RX1, + MSM_FRONTEND_DAI_MULTIMEDIA28, 1, 0, msm_routing_get_audio_mixer, + msm_routing_put_audio_mixer), + SOC_DOUBLE_EXT("MultiMedia29", SND_SOC_NOPM, + MSM_BACKEND_DAI_AFE_PCM_RX1, + MSM_FRONTEND_DAI_MULTIMEDIA29, 1, 0, msm_routing_get_audio_mixer, + msm_routing_put_audio_mixer), + SOC_DOUBLE_EXT("MultiMedia30", SND_SOC_NOPM, + MSM_BACKEND_DAI_AFE_PCM_RX1, + MSM_FRONTEND_DAI_MULTIMEDIA30, 1, 0, msm_routing_get_audio_mixer, + msm_routing_put_audio_mixer), +}; + #ifndef CONFIG_AUXPCM_DISABLE static const struct snd_kcontrol_new auxpcm_rx_mixer_controls[] = { SOC_DOUBLE_EXT("MultiMedia1", SND_SOC_NOPM, @@ -23067,6 +23165,7 @@ static int msm_routing_put_stereo_to_custom_stereo_control( continue; if ((port_id != SLIMBUS_0_RX) && (port_id != RT_PROXY_PORT_001_RX) && + (port_id != RT_PROXY_PORT_002_RX) && (port_id != AFE_PORT_ID_PRIMARY_MI2S_RX) && (port_id != AFE_PORT_ID_INT4_MI2S_RX)) continue; @@ -24504,6 +24603,8 @@ static const struct snd_soc_dapm_widget msm_qdsp6_widgets[] = { 0, 0, 0, 0), SND_SOC_DAPM_AIF_IN("PCM_TX", "AFE Capture", 0, 0, 0, 0), + SND_SOC_DAPM_AIF_OUT("PCM_RX1", "AFE Playback1", + 0, 0, 0, 0), SND_SOC_DAPM_AIF_OUT("WSA_CDC_DMA_RX_0", "WSA CDC DMA0 Playback", 0, 0, 0, 0), SND_SOC_DAPM_AIF_IN("WSA_CDC_DMA_TX_0", "WSA CDC DMA0 Capture", @@ -24808,6 +24909,8 @@ static const struct snd_soc_dapm_widget msm_qdsp6_widgets[] = { int_fm_rx_mixer_controls, ARRAY_SIZE(int_fm_rx_mixer_controls)), SND_SOC_DAPM_MIXER("AFE_PCM_RX Audio Mixer", SND_SOC_NOPM, 0, 0, afe_pcm_rx_mixer_controls, ARRAY_SIZE(afe_pcm_rx_mixer_controls)), + SND_SOC_DAPM_MIXER("AFE_PCM_RX1 Audio Mixer", SND_SOC_NOPM, 0, 0, + afe_pcm_rx_1_mixer_controls, ARRAY_SIZE(afe_pcm_rx_1_mixer_controls)), SND_SOC_DAPM_MIXER("Voice Stub Tx Mixer", SND_SOC_NOPM, 0, 0, tx_voice_stub_mixer_controls, ARRAY_SIZE(tx_voice_stub_mixer_controls)), SND_SOC_DAPM_MIXER("Voice2 Stub Tx Mixer", SND_SOC_NOPM, 0, 0, @@ -26916,6 +27019,24 @@ static const struct snd_soc_dapm_route intercon[] = { {"AFE_PCM_RX Audio Mixer", "MultiMedia16", "MM_DL16"}, {"PCM_RX", NULL, "AFE_PCM_RX Audio Mixer"}, + {"AFE_PCM_RX1 Audio Mixer", "MultiMedia1", "MM_DL1"}, + {"AFE_PCM_RX1 Audio Mixer", "MultiMedia2", "MM_DL2"}, + {"AFE_PCM_RX1 Audio Mixer", "MultiMedia3", "MM_DL3"}, + {"AFE_PCM_RX1 Audio Mixer", "MultiMedia4", "MM_DL4"}, + {"AFE_PCM_RX1 Audio Mixer", "MultiMedia5", "MM_DL5"}, + {"AFE_PCM_RX1 Audio Mixer", "MultiMedia6", "MM_DL6"}, + {"AFE_PCM_RX1 Audio Mixer", "MultiMedia7", "MM_DL7"}, + {"AFE_PCM_RX1 Audio Mixer", "MultiMedia8", "MM_DL8"}, + {"AFE_PCM_RX1 Audio Mixer", "MultiMedia9", "MM_DL9"}, + {"AFE_PCM_RX1 Audio Mixer", "MultiMedia10", "MM_DL10"}, + {"AFE_PCM_RX1 Audio Mixer", "MultiMedia11", "MM_DL11"}, + {"AFE_PCM_RX1 Audio Mixer", "MultiMedia12", "MM_DL12"}, + {"AFE_PCM_RX1 Audio Mixer", "MultiMedia13", "MM_DL13"}, + {"AFE_PCM_RX1 Audio Mixer", "MultiMedia14", "MM_DL14"}, + {"AFE_PCM_RX1 Audio Mixer", "MultiMedia15", "MM_DL15"}, + {"AFE_PCM_RX1 Audio Mixer", "MultiMedia16", "MM_DL16"}, + {"PCM_RX1", NULL, "AFE_PCM_RX1 Audio Mixer"}, + {"MultiMedia1 Mixer", "INTERNAL_BT_SCO_TX", "INT_BT_SCO_TX"}, {"MultiMedia3 Mixer", "INTERNAL_BT_SCO_TX", "INT_BT_SCO_TX"}, {"MultiMedia4 Mixer", "INTERNAL_BT_SCO_TX", "INT_BT_SCO_TX"}, @@ -27451,6 +27572,7 @@ static const struct snd_soc_dapm_route intercon[] = { {"BE_OUT", NULL, "RX_CDC_DMA_RX_6"}, {"BE_OUT", NULL, "RX_CDC_DMA_RX_7"}, {"BE_OUT", NULL, "PROXY_RX"}, + {"BE_OUT", NULL, "PCM_RX1"}, {"SLIMBUS_0_TX", NULL, "BE_IN" }, {"SLIMBUS_1_TX", NULL, "BE_IN" }, diff --git a/asoc/msm-pcm-routing-v2.h b/asoc/msm-pcm-routing-v2.h index c3fba04f31de..fb2310466905 100644 --- a/asoc/msm-pcm-routing-v2.h +++ b/asoc/msm-pcm-routing-v2.h @@ -27,6 +27,7 @@ #define LPASS_BE_INT_FM_TX "INT_FM_TX" #define LPASS_BE_AFE_PCM_RX "RT_PROXY_DAI_001_RX" #define LPASS_BE_AFE_PCM_TX "RT_PROXY_DAI_002_TX" +#define LPASS_BE_AFE_PCM_RX1 "RT_PROXY_DAI_003_RX" #define LPASS_BE_AUXPCM_RX "AUX_PCM_RX" #define LPASS_BE_AUXPCM_TX "AUX_PCM_TX" #define LPASS_BE_SEC_AUXPCM_RX "SEC_AUX_PCM_RX" @@ -513,6 +514,7 @@ enum { MSM_BACKEND_DAI_PROXY_RX, MSM_BACKEND_DAI_PROXY_TX, MSM_BACKEND_DAI_HDMI_RX_MS, + MSM_BACKEND_DAI_AFE_PCM_RX1, MSM_BACKEND_DAI_MAX, }; diff --git a/dsp/q6afe.c b/dsp/q6afe.c index 0823ab344b8a..79073c1b5f74 100644 --- a/dsp/q6afe.c +++ b/dsp/q6afe.c @@ -338,15 +338,17 @@ static struct afe_ctl this_afe; #define TIMEOUT_MS 1000 #define Q6AFE_MAX_VOLUME 0x3FFF -static int pcm_afe_instance[2]; -static int proxy_afe_instance[2]; -bool afe_close_done[2] = {true, true}; +static int pcm_afe_instance[3]; +static int proxy_afe_instance[3]; +bool afe_close_done[3] = {true, true, true}; static bool proxy_afe_started = false; #define SIZEOF_CFG_CMD(y) \ (sizeof(struct apr_hdr) + sizeof(u16) + (sizeof(struct y))) +static bool is_afe_proxy_port(int port_id); + static void q6afe_unload_avcs_modules(u16 port_id, int index) { int ret = 0; @@ -5736,28 +5738,30 @@ static int __afe_port_start(u16 port_id, union afe_port_config *afe_config, proxy_afe_started = true; } if ((port_id == RT_PROXY_DAI_001_RX) || - (port_id == RT_PROXY_DAI_002_TX)) { + (port_id == RT_PROXY_DAI_002_TX) || + (port_id == RT_PROXY_DAI_003_RX)) { pr_debug("%s: before incrementing pcm_afe_instance %d port_id 0x%x\n", __func__, - pcm_afe_instance[port_id & 0x1], port_id); + pcm_afe_instance[port_id & 0x3], port_id); port_id = VIRTUAL_ID_TO_PORTID(port_id); - pcm_afe_instance[port_id & 0x1]++; + pcm_afe_instance[port_id & 0x3]++; return 0; } if ((port_id == RT_PROXY_DAI_002_RX) || - (port_id == RT_PROXY_DAI_001_TX)) { + (port_id == RT_PROXY_DAI_001_TX) || + (port_id == RT_PROXY_DAI_003_TX)) { pr_debug("%s: before incrementing proxy_afe_instance %d port_id 0x%x\n", __func__, - proxy_afe_instance[port_id & 0x1], port_id); + proxy_afe_instance[port_id & 0x3], port_id); - if (!afe_close_done[port_id & 0x1]) { + if (!afe_close_done[port_id & 0x3]) { /*close pcm dai corresponding to the proxy dai*/ afe_close(port_id - 0x10); - pcm_afe_instance[port_id & 0x1]++; + pcm_afe_instance[port_id & 0x3]++; pr_debug("%s: reconfigure afe port again\n", __func__); } - proxy_afe_instance[port_id & 0x1]++; - afe_close_done[port_id & 0x1] = false; + proxy_afe_instance[port_id & 0x3]++; + afe_close_done[port_id & 0x3] = false; port_id = VIRTUAL_ID_TO_PORTID(port_id); } @@ -6653,12 +6657,14 @@ int afe_open(u16 port_id, } if ((port_id == RT_PROXY_DAI_001_RX) || - (port_id == RT_PROXY_DAI_002_TX)) { + (port_id == RT_PROXY_DAI_002_TX) || + (port_id == RT_PROXY_DAI_003_RX)) { pr_err("%s: wrong port 0x%x\n", __func__, port_id); return -EINVAL; } if ((port_id == RT_PROXY_DAI_002_RX) || - (port_id == RT_PROXY_DAI_001_TX)) + (port_id == RT_PROXY_DAI_001_TX) || + (port_id == RT_PROXY_DAI_003_TX)) port_id = VIRTUAL_ID_TO_PORTID(port_id); ret = afe_q6_interface_prepare(); @@ -8828,6 +8834,29 @@ int afe_validate_port(u16 port_id) return ret; } +static bool is_afe_proxy_port(int port_id) +{ + bool ret = false; + switch(port_id) { + case RT_PROXY_DAI_001_RX: + case RT_PROXY_DAI_001_TX: + case RT_PROXY_DAI_002_RX: + case RT_PROXY_DAI_002_TX: + case RT_PROXY_DAI_003_RX: + case RT_PROXY_DAI_003_TX: + { + ret = true; + break; + } + default: + pr_debug("%s: afe port %d is not a proxy port\n", + __func__, port_id); + ret = false; + } + + return ret; +} + int afe_convert_virtual_to_portid(u16 port_id) { int ret; @@ -8841,6 +8870,7 @@ int afe_convert_virtual_to_portid(u16 port_id) port_id == RT_PROXY_DAI_001_TX || port_id == RT_PROXY_DAI_002_RX || port_id == RT_PROXY_DAI_002_TX || + port_id == RT_PROXY_DAI_003_RX || port_id == RT_PROXY_DAI_003_TX) { ret = VIRTUAL_ID_TO_PORTID(port_id); } else { @@ -8903,43 +8933,50 @@ int afe_close(int port_id) if (this_afe.apr == NULL) { pr_err("%s: AFE is already closed\n", __func__); - if ((port_id == RT_PROXY_DAI_001_RX) || - (port_id == RT_PROXY_DAI_002_TX)) - pcm_afe_instance[port_id & 0x1] = 0; - if ((port_id == RT_PROXY_DAI_002_RX) || - (port_id == RT_PROXY_DAI_001_TX)) - proxy_afe_instance[port_id & 0x1] = 0; - afe_close_done[port_id & 0x1] = true; + + if (is_afe_proxy_port(port_id)) { + if ((port_id == RT_PROXY_DAI_001_RX) || + (port_id == RT_PROXY_DAI_002_TX) || + (port_id == RT_PROXY_DAI_003_RX)) + pcm_afe_instance[port_id & 0x3] = 0; + if ((port_id == RT_PROXY_DAI_002_RX) || + (port_id == RT_PROXY_DAI_001_TX) || + (port_id == RT_PROXY_DAI_003_TX)) + proxy_afe_instance[port_id & 0x3] = 0; + afe_close_done[port_id & 0x3] = true; + } ret = -EINVAL; goto fail_cmd; } pr_debug("%s: port_id = 0x%x\n", __func__, port_id); if ((port_id == RT_PROXY_DAI_001_RX) || - (port_id == RT_PROXY_DAI_002_TX)) { + (port_id == RT_PROXY_DAI_002_TX) || + (port_id == RT_PROXY_DAI_003_RX)) { pr_debug("%s: before decrementing pcm_afe_instance %d\n", - __func__, pcm_afe_instance[port_id & 0x1]); + __func__, pcm_afe_instance[port_id & 0x3]); port_id = VIRTUAL_ID_TO_PORTID(port_id); - pcm_afe_instance[port_id & 0x1]--; - if ((!(pcm_afe_instance[port_id & 0x1] == 0 && - proxy_afe_instance[port_id & 0x1] == 0)) || - afe_close_done[port_id & 0x1] == true) + pcm_afe_instance[port_id & 0x3]--; + if ((!(pcm_afe_instance[port_id & 0x3] == 0 && + proxy_afe_instance[port_id & 0x3] == 0)) || + afe_close_done[port_id & 0x3] == true) return 0; - afe_close_done[port_id & 0x1] = true; + afe_close_done[port_id & 0x3] = true; } if ((port_id == RT_PROXY_DAI_002_RX) || - (port_id == RT_PROXY_DAI_001_TX)) { + (port_id == RT_PROXY_DAI_001_TX) || + (port_id == RT_PROXY_DAI_003_TX)) { pr_debug("%s: before decrementing proxy_afe_instance %d\n", - __func__, proxy_afe_instance[port_id & 0x1]); + __func__, proxy_afe_instance[port_id & 0x3]); port_id = VIRTUAL_ID_TO_PORTID(port_id); - proxy_afe_instance[port_id & 0x1]--; - if ((!(pcm_afe_instance[port_id & 0x1] == 0 && - proxy_afe_instance[port_id & 0x1] == 0)) || - afe_close_done[port_id & 0x1] == true) + proxy_afe_instance[port_id & 0x3]--; + if ((!(pcm_afe_instance[port_id & 0x3] == 0 && + proxy_afe_instance[port_id & 0x3] == 0)) || + afe_close_done[port_id & 0x3] == true) return 0; - afe_close_done[port_id & 0x1] = true; + afe_close_done[port_id & 0x3] = true; } if (port_id == RT_PROXY_PORT_002_RX && proxy_afe_started) diff --git a/dsp/q6audio-v2.c b/dsp/q6audio-v2.c index 4a741000aa69..5b71d56a630e 100644 --- a/dsp/q6audio-v2.c +++ b/dsp/q6audio-v2.c @@ -795,6 +795,7 @@ int q6audio_convert_virtual_to_portid(u16 port_id) port_id == RT_PROXY_DAI_001_TX || port_id == RT_PROXY_DAI_002_RX || port_id == RT_PROXY_DAI_002_TX || + port_id == RT_PROXY_DAI_003_RX || port_id == RT_PROXY_DAI_003_TX) ret = VIRTUAL_ID_TO_PORTID(port_id); else diff --git a/include/dsp/apr_audio-v2.h b/include/dsp/apr_audio-v2.h index 87173c79da61..63168ba71abb 100644 --- a/include/dsp/apr_audio-v2.h +++ b/include/dsp/apr_audio-v2.h @@ -1358,6 +1358,7 @@ struct adm_cmd_connect_afe_port_v5 { #define INT_FM_TX 0x3005 #define RT_PROXY_PORT_001_RX 0x2000 #define RT_PROXY_PORT_001_TX 0x2001 +#define RT_PROXY_PORT_002_RX 0x2002 #define AFE_LOOPBACK_TX 0x6001 #define HDMI_RX_MS 0x6002 #define DISPLAY_PORT_RX 0x6020 @@ -1521,6 +1522,7 @@ struct adm_cmd_connect_afe_port_v5 { #define AFE_PORT_ID_RT_PROXY_PORT_001_RX 0x2000 #define AFE_PORT_ID_RT_PROXY_PORT_001_TX 0x2001 +#define AFE_PORT_ID_RT_PROXY_PORT_002_RX 0x2002 #define AFE_PORT_ID_INTERNAL_BT_SCO_RX 0x3000 #define AFE_PORT_ID_INTERNAL_BT_SCO_TX 0x3001 #define AFE_PORT_ID_INTERNAL_BT_A2DP_RX 0x3002 diff --git a/include/dsp/q6afe-v2.h b/include/dsp/q6afe-v2.h index 5c66b4b5ca64..6141bfe494cd 100644 --- a/include/dsp/q6afe-v2.h +++ b/include/dsp/q6afe-v2.h @@ -34,6 +34,7 @@ #define RT_PROXY_DAI_001_TX 0xF0 #define RT_PROXY_DAI_002_RX 0xF1 #define RT_PROXY_DAI_002_TX 0xE1 +#define RT_PROXY_DAI_003_RX 0xE2 #define RT_PROXY_DAI_003_TX 0xF2 #define VIRTUAL_ID_TO_PORTID(val) ((val & 0xF) | 0x2000) #define PORTID_TO_IDX(val) ((val & 0xF) >> 1)