asoc: Add support for using AFE_PCM_TX port in listen session

* Add support for AFE_PCM_TX in listen mixer controls
* Modify channel_max for proxy_rx to allow multichannel proxy playback

Change-Id: I388219504a938694425a6eddd9357734f3cab526
Signed-off-by: Tahir Dawson <dawson@codeaurora.org>
This commit is contained in:
Tahir Dawson 2021-05-04 16:39:24 -04:00
parent 83feb0e6f9
commit 60cf8d22c6
3 changed files with 64 additions and 6 deletions

View File

@ -4697,7 +4697,7 @@ static struct snd_soc_dai_driver msm_dai_q6_afe_rx_dai[] = {
.formats = SNDRV_PCM_FMTBIT_S16_LE |
SNDRV_PCM_FMTBIT_S24_LE,
.channels_min = 1,
.channels_max = 2,
.channels_max = 10,
.rate_min = 8000,
.rate_max = 48000,
},

View File

@ -1,5 +1,5 @@
// SPDX-License-Identifier: GPL-2.0-only
/* Copyright (c) 2012-2020, The Linux Foundation. All rights reserved.
/* Copyright (c) 2012-2021, The Linux Foundation. All rights reserved.
*/
@ -50,7 +50,7 @@ static struct snd_pcm_hardware msm_afe_hardware_playback = {
.rate_min = 8000,
.rate_max = 48000,
.channels_min = 1,
.channels_max = 6,
.channels_max = 10,
.buffer_bytes_max = MAX_PLAYBACK_PERIOD_SIZE *
MAX_PLAYBACK_NUM_PERIODS,
.period_bytes_min = MIN_PLAYBACK_PERIOD_SIZE,

View File

@ -134,6 +134,7 @@ enum {
#define TX_CDC_DMA_TX_3_TEXT "TX_CDC_DMA_TX_3"
#define QUIN_TDM_TX_TEXT "QUIN_TDM_TX_0"
#define TERT_TDM_TX_TEXT "TERT_TDM_TX_0"
#define AFE_PCM_TX_TEXT "AFE_PCM_TX"
#define LSM_FUNCTION_TEXT "LSM Function"
static const char * const lsm_port_text[] = {
@ -143,7 +144,7 @@ static const char * const lsm_port_text[] = {
TERT_MI2S_TX_TEXT, QUAT_MI2S_TX_TEXT, ADM_LSM_TX_TEXT,
INT3_MI2S_TX_TEXT, VA_CDC_DMA_TX_0_TEXT, VA_CDC_DMA_TX_1_TEXT,
VA_CDC_DMA_TX_2_TEXT, TX_CDC_DMA_TX_3_TEXT, QUIN_TDM_TX_TEXT,
TERT_TDM_TX_TEXT
TERT_TDM_TX_TEXT, AFE_PCM_TX_TEXT
};
struct msm_pcm_route_bdai_pp_params {
@ -2016,7 +2017,6 @@ int msm_pcm_routing_reg_phy_compr_stream(int fe_id, int perf_mode,
352800) && be_bit_width == 32)
bit_width = msm_routing_get_bit_width(
SNDRV_PCM_FORMAT_S32_LE);
copp_idx =
adm_open(port_id, path_type, sample_rate,
channels, topology, perf_mode,
@ -3601,6 +3601,9 @@ static int msm_routing_lsm_port_put(struct snd_kcontrol *kcontrol,
case 16:
lsm_port = AFE_PORT_ID_TERTIARY_TDM_TX;
break;
case 17:
lsm_port = RT_PROXY_PORT_001_TX;
break;
default:
pr_err("Default lsm port");
break;
@ -3662,6 +3665,10 @@ static int msm_routing_lsm_func_get(struct snd_kcontrol *kcontrol,
strlen(lsm_port_text[16])))
port_id = AFE_PORT_ID_TERTIARY_TDM_TX;
if (strnstr(kcontrol->id.name, lsm_port_text[17],
strlen(lsm_port_text[17])))
port_id = RT_PROXY_PORT_001_TX;
mad_type = afe_port_get_mad_type(port_id);
pr_debug("%s: port_id 0x%x, mad_type %d\n", __func__, port_id,
mad_type);
@ -3754,6 +3761,10 @@ static int msm_routing_lsm_func_put(struct snd_kcontrol *kcontrol,
strlen(lsm_port_text[16])))
port_id = AFE_PORT_ID_TERTIARY_TDM_TX;
if (strnstr(kcontrol->id.name, lsm_port_text[17],
strlen(lsm_port_text[17])))
port_id = RT_PROXY_PORT_001_TX;
pr_debug("%s: port_id 0x%x, mad_type %d\n", __func__, port_id,
mad_type);
return afe_port_set_mad_type(port_id, mad_type);
@ -6089,6 +6100,10 @@ static int get_ec_ref_port_id(int value, int *index)
*index = 43;
port_id = AFE_PORT_ID_QUINARY_MI2S_RX;
break;
case 44:
*index = 44;
port_id = RT_PROXY_PORT_001_TX;
break;
default:
*index = 0; /* NONE */
pr_err("%s: Invalid value %d\n", __func__, value);
@ -6147,7 +6162,7 @@ static const char *const ec_ref_rx[] = { "None", "SLIM_RX", "I2S_RX",
"SLIM_7_RX", "RX_CDC_DMA_RX_0", "RX_CDC_DMA_RX_1", "RX_CDC_DMA_RX_2",
"RX_CDC_DMA_RX_3", "TX_CDC_DMA_TX_0", "TERT_TDM_RX_2", "SEC_TDM_TX_0",
"DISPLAY_PORT1", "SEN_MI2S_RX", "QUIN_TDM_TX_0", "SENARY_MI2S_TX",
"PRI_TDM_RX_0", "PRI_TDM_TX_0", "QUIN_MI2S_RX",
"PRI_TDM_RX_0", "PRI_TDM_TX_0", "QUIN_MI2S_RX", "AFE_PCM_TX",
};
static const struct soc_enum msm_route_ec_ref_rx_enum[] = {
@ -25064,6 +25079,10 @@ static const struct snd_kcontrol_new lsm1_mixer_controls[] = {
MSM_FRONTEND_DAI_LSM1, 1, 0, msm_routing_get_listen_mixer,
msm_routing_put_listen_mixer),
#endif
SOC_DOUBLE_EXT("AFE_PCM_TX", SND_SOC_NOPM,
MSM_BACKEND_DAI_AFE_PCM_TX,
MSM_FRONTEND_DAI_LSM1, 1, 0, msm_routing_get_listen_mixer,
msm_routing_put_listen_mixer),
};
static const struct snd_kcontrol_new lsm2_mixer_controls[] = {
@ -25128,6 +25147,10 @@ static const struct snd_kcontrol_new lsm2_mixer_controls[] = {
MSM_FRONTEND_DAI_LSM2, 1, 0, msm_routing_get_listen_mixer,
msm_routing_put_listen_mixer),
#endif
SOC_DOUBLE_EXT("AFE_PCM_TX", SND_SOC_NOPM,
MSM_BACKEND_DAI_AFE_PCM_TX,
MSM_FRONTEND_DAI_LSM2, 1, 0, msm_routing_get_listen_mixer,
msm_routing_put_listen_mixer),
};
static const struct snd_kcontrol_new lsm3_mixer_controls[] = {
@ -25191,6 +25214,10 @@ static const struct snd_kcontrol_new lsm3_mixer_controls[] = {
MSM_FRONTEND_DAI_LSM3, 1, 0, msm_routing_get_listen_mixer,
msm_routing_put_listen_mixer),
#endif
SOC_DOUBLE_EXT("AFE_PCM_TX", SND_SOC_NOPM,
MSM_BACKEND_DAI_AFE_PCM_TX,
MSM_FRONTEND_DAI_LSM3, 1, 0, msm_routing_get_listen_mixer,
msm_routing_put_listen_mixer),
};
static const struct snd_kcontrol_new lsm4_mixer_controls[] = {
@ -25254,6 +25281,10 @@ static const struct snd_kcontrol_new lsm4_mixer_controls[] = {
MSM_FRONTEND_DAI_LSM4, 1, 0, msm_routing_get_listen_mixer,
msm_routing_put_listen_mixer),
#endif
SOC_DOUBLE_EXT("AFE_PCM_TX", SND_SOC_NOPM,
MSM_BACKEND_DAI_AFE_PCM_TX,
MSM_FRONTEND_DAI_LSM4, 1, 0, msm_routing_get_listen_mixer,
msm_routing_put_listen_mixer),
};
static const struct snd_kcontrol_new lsm5_mixer_controls[] = {
@ -25317,6 +25348,10 @@ static const struct snd_kcontrol_new lsm5_mixer_controls[] = {
MSM_FRONTEND_DAI_LSM5, 1, 0, msm_routing_get_listen_mixer,
msm_routing_put_listen_mixer),
#endif
SOC_DOUBLE_EXT("AFE_PCM_TX", SND_SOC_NOPM,
MSM_BACKEND_DAI_AFE_PCM_TX,
MSM_FRONTEND_DAI_LSM5, 1, 0, msm_routing_get_listen_mixer,
msm_routing_put_listen_mixer),
};
static const struct snd_kcontrol_new lsm6_mixer_controls[] = {
@ -25380,6 +25415,10 @@ static const struct snd_kcontrol_new lsm6_mixer_controls[] = {
MSM_FRONTEND_DAI_LSM6, 1, 0, msm_routing_get_listen_mixer,
msm_routing_put_listen_mixer),
#endif
SOC_DOUBLE_EXT("AFE_PCM_TX", SND_SOC_NOPM,
MSM_BACKEND_DAI_AFE_PCM_TX,
MSM_FRONTEND_DAI_LSM6, 1, 0, msm_routing_get_listen_mixer,
msm_routing_put_listen_mixer),
};
static const struct snd_kcontrol_new lsm7_mixer_controls[] = {
@ -25443,6 +25482,10 @@ static const struct snd_kcontrol_new lsm7_mixer_controls[] = {
MSM_FRONTEND_DAI_LSM7, 1, 0, msm_routing_get_listen_mixer,
msm_routing_put_listen_mixer),
#endif
SOC_DOUBLE_EXT("AFE_PCM_TX", SND_SOC_NOPM,
MSM_BACKEND_DAI_AFE_PCM_TX,
MSM_FRONTEND_DAI_LSM7, 1, 0, msm_routing_get_listen_mixer,
msm_routing_put_listen_mixer),
};
static const struct snd_kcontrol_new lsm8_mixer_controls[] = {
@ -25506,6 +25549,10 @@ static const struct snd_kcontrol_new lsm8_mixer_controls[] = {
MSM_FRONTEND_DAI_LSM8, 1, 0, msm_routing_get_listen_mixer,
msm_routing_put_listen_mixer),
#endif
SOC_DOUBLE_EXT("AFE_PCM_TX", SND_SOC_NOPM,
MSM_BACKEND_DAI_AFE_PCM_TX,
MSM_FRONTEND_DAI_LSM8, 1, 0, msm_routing_get_listen_mixer,
msm_routing_put_listen_mixer),
};
static const struct snd_kcontrol_new slim_fm_switch_mixer_controls =
@ -25623,6 +25670,8 @@ static const struct snd_kcontrol_new lsm_controls[] = {
msm_routing_lsm_func_get, msm_routing_lsm_func_put),
SOC_ENUM_EXT(TERT_TDM_TX_TEXT" "LSM_FUNCTION_TEXT, lsm_func_enum,
msm_routing_lsm_func_get, msm_routing_lsm_func_put),
SOC_ENUM_EXT(AFE_PCM_TX_TEXT" "LSM_FUNCTION_TEXT, lsm_func_enum,
msm_routing_lsm_func_get, msm_routing_lsm_func_put),
/* kcontrol of lsm_port */
SOC_ENUM_EXT("LSM1 Port", lsm_port_enum,
msm_routing_lsm_port_get,
@ -33022,6 +33071,15 @@ static const struct snd_soc_dapm_route intercon_tdm[] = {
{"LSM8 Mixer", "QUIN_TDM_TX_0", "QUIN_TDM_TX_0"},
{"LSM8 Mixer", "TERT_TDM_TX_0", "TERT_TDM_TX_0"},
{"LSM1 Mixer", "AFE_PCM_TX", "PCM_TX"},
{"LSM2 Mixer", "AFE_PCM_TX", "PCM_TX"},
{"LSM3 Mixer", "AFE_PCM_TX", "PCM_TX"},
{"LSM4 Mixer", "AFE_PCM_TX", "PCM_TX"},
{"LSM5 Mixer", "AFE_PCM_TX", "PCM_TX"},
{"LSM6 Mixer", "AFE_PCM_TX", "PCM_TX"},
{"LSM7 Mixer", "AFE_PCM_TX", "PCM_TX"},
{"LSM8 Mixer", "AFE_PCM_TX", "PCM_TX"},
/* Backend Enablement */
{"BE_OUT", NULL, "PRI_TDM_RX_0"},
{"BE_OUT", NULL, "PRI_TDM_RX_1"},