asoc: codec: lpass: Update input mux config controls per HW version

Update MUX config controls for WSA macro per HW version.

Change-Id: I9fb083c776da531d9e2422af639f3a4af5c178ef
Signed-off-by: Prasad Kumpatla <quic_pkumpatl@quicinc.com>
This commit is contained in:
Prasad Kumpatla
2024-04-18 20:26:55 +05:30
parent 9729e275b2
commit 2fc4076bff
3 changed files with 237 additions and 92 deletions

View File

@@ -325,15 +325,26 @@ struct lpass_cdc_wsa_macro_priv {
static struct snd_soc_dai_driver lpass_cdc_wsa_macro_dai[]; static struct snd_soc_dai_driver lpass_cdc_wsa_macro_dai[];
static const DECLARE_TLV_DB_SCALE(digital_gain, 0, 1, 0); static const DECLARE_TLV_DB_SCALE(digital_gain, 0, 1, 0);
static const char *const rx_text[] = { /* for Version 2P6 */
static const char *const rx_text_v2p6[] = {
"ZERO", "RX0", "RX1", "RX_MIX0", "RX_MIX1", "RX4", "ZERO", "RX0", "RX1", "RX_MIX0", "RX_MIX1", "RX4",
"RX5", "RX6", "RX7", "RX8", "DEC0", "DEC1" "RX5", "RX6", "RX7", "RX8", "DEC0", "DEC1"
}; };
static const char *const rx_mix_text[] = { static const char *const rx_mix_text_v2p6[] = {
"ZERO", "RX0", "RX1", "RX_MIX0", "RX_MIX1", "RX4", "RX5", "RX6", "RX7", "RX8" "ZERO", "RX0", "RX1", "RX_MIX0", "RX_MIX1", "RX4", "RX5", "RX6", "RX7", "RX8"
}; };
/* for Version 2P5 */
static const char *const rx_text_v2p5[] = {
"ZERO", "RX0", "RX1", "RX_MIX0", "RX_MIX1", "RX4",
"RX5", "DEC0", "DEC1"
};
static const char *const rx_mix_text_v2p5[] = {
"ZERO", "RX0", "RX1", "RX_MIX0", "RX_MIX1", "RX4", "RX5"
};
static const char *const rx_mix_ec_text[] = { static const char *const rx_mix_ec_text[] = {
"ZERO", "RX_MIX_TX0", "RX_MIX_TX1" "ZERO", "RX_MIX_TX0", "RX_MIX_TX1"
}; };
@@ -370,69 +381,128 @@ static SOC_ENUM_SINGLE_EXT_DECL(lpass_cdc_wsa_macro_comp_mode_enum,
lpass_cdc_wsa_macro_comp_mode_text); lpass_cdc_wsa_macro_comp_mode_text);
/* RX INT0 */ /* RX INT0 */
static const struct soc_enum rx0_prim_inp0_chain_enum =
SOC_ENUM_SINGLE(LPASS_CDC_WSA_RX_INP_MUX_RX_INT0_CFG0,
0, 12, rx_text);
static const struct soc_enum rx0_prim_inp1_chain_enum =
SOC_ENUM_SINGLE(LPASS_CDC_WSA_RX_INP_MUX_RX_INT0_CFG0,
3, 12, rx_text);
static const struct soc_enum rx0_prim_inp2_chain_enum =
SOC_ENUM_SINGLE(LPASS_CDC_WSA_RX_INP_MUX_RX_INT0_CFG1,
3, 12, rx_text);
static const struct soc_enum rx0_mix_chain_enum =
SOC_ENUM_SINGLE(LPASS_CDC_WSA_RX_INP_MUX_RX_INT0_CFG1,
0, 10, rx_mix_text);
static const struct soc_enum rx0_sidetone_mix_enum = static const struct soc_enum rx0_sidetone_mix_enum =
SOC_ENUM_SINGLE(SND_SOC_NOPM, 0, 2, rx_sidetone_mix_text); SOC_ENUM_SINGLE(SND_SOC_NOPM, 0, 2, rx_sidetone_mix_text);
static const struct snd_kcontrol_new rx0_prim_inp0_mux = /* for Version 2P5 */
SOC_DAPM_ENUM("WSA_RX0 INP0 Mux", rx0_prim_inp0_chain_enum); static const struct soc_enum rx0_prim_inp0_chain_enum_v2p5 =
SOC_ENUM_SINGLE(LPASS_CDC_WSA_RX_INP_MUX_RX_INT0_CFG0,
0, 9, rx_text_v2p5);
static const struct snd_kcontrol_new rx0_prim_inp1_mux = static const struct soc_enum rx0_prim_inp1_chain_enum_v2p5 =
SOC_DAPM_ENUM("WSA_RX0 INP1 Mux", rx0_prim_inp1_chain_enum); SOC_ENUM_SINGLE(LPASS_CDC_WSA_RX_INP_MUX_RX_INT0_CFG0,
3, 9, rx_text_v2p5);
static const struct snd_kcontrol_new rx0_prim_inp2_mux = static const struct soc_enum rx0_prim_inp2_chain_enum_v2p5 =
SOC_DAPM_ENUM("WSA_RX0 INP2 Mux", rx0_prim_inp2_chain_enum); SOC_ENUM_SINGLE(LPASS_CDC_WSA_RX_INP_MUX_RX_INT0_CFG1,
3, 9, rx_text_v2p5);
static const struct snd_kcontrol_new rx0_mix_mux = static const struct soc_enum rx0_mix_chain_enum_v2p5 =
SOC_DAPM_ENUM("WSA_RX0 MIX Mux", rx0_mix_chain_enum); SOC_ENUM_SINGLE(LPASS_CDC_WSA_RX_INP_MUX_RX_INT0_CFG1,
0, 7, rx_mix_text_v2p5);
static const struct snd_kcontrol_new rx0_prim_inp0_mux_v2p5 =
SOC_DAPM_ENUM("WSA_RX0 INP0 Mux", rx0_prim_inp0_chain_enum_v2p5);
static const struct snd_kcontrol_new rx0_prim_inp1_mux_v2p5 =
SOC_DAPM_ENUM("WSA_RX0 INP1 Mux", rx0_prim_inp1_chain_enum_v2p5);
static const struct snd_kcontrol_new rx0_prim_inp2_mux_v2p5 =
SOC_DAPM_ENUM("WSA_RX0 INP2 Mux", rx0_prim_inp2_chain_enum_v2p5);
static const struct snd_kcontrol_new rx0_mix_mux_v2p5 =
SOC_DAPM_ENUM("WSA_RX0 MIX Mux", rx0_mix_chain_enum_v2p5);
static const struct soc_enum rx1_prim_inp0_chain_enum_v2p5 =
SOC_ENUM_SINGLE(LPASS_CDC_WSA_RX_INP_MUX_RX_INT1_CFG0,
0, 9, rx_text_v2p5);
static const struct soc_enum rx1_prim_inp1_chain_enum_v2p5 =
SOC_ENUM_SINGLE(LPASS_CDC_WSA_RX_INP_MUX_RX_INT1_CFG0,
3, 9, rx_text_v2p5);
static const struct soc_enum rx1_prim_inp2_chain_enum_v2p5 =
SOC_ENUM_SINGLE(LPASS_CDC_WSA_RX_INP_MUX_RX_INT1_CFG1,
3, 9, rx_text_v2p5);
static const struct soc_enum rx1_mix_chain_enum_v2p5 =
SOC_ENUM_SINGLE(LPASS_CDC_WSA_RX_INP_MUX_RX_INT1_CFG1,
0, 7, rx_mix_text_v2p5);
static const struct snd_kcontrol_new rx1_prim_inp0_mux_v2p5 =
SOC_DAPM_ENUM("WSA_RX1 INP0 Mux", rx1_prim_inp0_chain_enum_v2p5);
static const struct snd_kcontrol_new rx1_prim_inp1_mux_v2p5 =
SOC_DAPM_ENUM("WSA_RX1 INP1 Mux", rx1_prim_inp1_chain_enum_v2p5);
static const struct snd_kcontrol_new rx1_prim_inp2_mux_v2p5 =
SOC_DAPM_ENUM("WSA_RX1 INP2 Mux", rx1_prim_inp2_chain_enum_v2p5);
static const struct snd_kcontrol_new rx1_mix_mux_v2p5 =
SOC_DAPM_ENUM("WSA_RX1 MIX Mux", rx1_mix_chain_enum_v2p5);
/* End of Version 2P5 */
/* for Version 2P6 */
static const struct soc_enum rx0_prim_inp0_chain_enum_v2p6 =
SOC_ENUM_SINGLE(LPASS_CDC_WSA_RX_INP_MUX_RX_INT0_CFG0,
0, 12, rx_text_v2p6);
static const struct soc_enum rx0_prim_inp1_chain_enum_v2p6 =
SOC_ENUM_SINGLE(LPASS_CDC_WSA_RX_INP_MUX_RX_INT0_CFG0,
3, 12, rx_text_v2p6);
static const struct soc_enum rx0_prim_inp2_chain_enum_v2p6 =
SOC_ENUM_SINGLE(LPASS_CDC_WSA_RX_INP_MUX_RX_INT0_CFG1,
3, 12, rx_text_v2p6);
static const struct soc_enum rx0_mix_chain_enum_v2p6 =
SOC_ENUM_SINGLE(LPASS_CDC_WSA_RX_INP_MUX_RX_INT0_CFG1,
0, 10, rx_mix_text_v2p6);
static const struct snd_kcontrol_new rx0_prim_inp0_mux_v2p6 =
SOC_DAPM_ENUM("WSA_RX0 INP0 Mux", rx0_prim_inp0_chain_enum_v2p6);
static const struct snd_kcontrol_new rx0_prim_inp1_mux_v2p6 =
SOC_DAPM_ENUM("WSA_RX0 INP1 Mux", rx0_prim_inp1_chain_enum_v2p6);
static const struct snd_kcontrol_new rx0_prim_inp2_mux_v2p6 =
SOC_DAPM_ENUM("WSA_RX0 INP2 Mux", rx0_prim_inp2_chain_enum_v2p6);
static const struct snd_kcontrol_new rx0_mix_mux_v2p6 =
SOC_DAPM_ENUM("WSA_RX0 MIX Mux", rx0_mix_chain_enum_v2p6);
static const struct soc_enum rx1_prim_inp0_chain_enum_v2p6 =
SOC_ENUM_SINGLE(LPASS_CDC_WSA_RX_INP_MUX_RX_INT1_CFG0,
0, 12, rx_text_v2p6);
static const struct soc_enum rx1_prim_inp1_chain_enum_v2p6 =
SOC_ENUM_SINGLE(LPASS_CDC_WSA_RX_INP_MUX_RX_INT1_CFG0,
3, 12, rx_text_v2p6);
static const struct soc_enum rx1_prim_inp2_chain_enum_v2p6 =
SOC_ENUM_SINGLE(LPASS_CDC_WSA_RX_INP_MUX_RX_INT1_CFG1,
3, 12, rx_text_v2p6);
static const struct soc_enum rx1_mix_chain_enum_v2p6 =
SOC_ENUM_SINGLE(LPASS_CDC_WSA_RX_INP_MUX_RX_INT1_CFG1,
0, 10, rx_mix_text_v2p6);
static const struct snd_kcontrol_new rx1_prim_inp0_mux_v2p6 =
SOC_DAPM_ENUM("WSA_RX1 INP0 Mux", rx1_prim_inp0_chain_enum_v2p6);
static const struct snd_kcontrol_new rx1_prim_inp1_mux_v2p6 =
SOC_DAPM_ENUM("WSA_RX1 INP1 Mux", rx1_prim_inp1_chain_enum_v2p6);
static const struct snd_kcontrol_new rx1_prim_inp2_mux_v2p6 =
SOC_DAPM_ENUM("WSA_RX1 INP2 Mux", rx1_prim_inp2_chain_enum_v2p6);
static const struct snd_kcontrol_new rx1_mix_mux_v2p6 =
SOC_DAPM_ENUM("WSA_RX1 MIX Mux", rx1_mix_chain_enum_v2p6);
/* End of Version 2P6 */
static const struct snd_kcontrol_new rx0_sidetone_mix_mux = static const struct snd_kcontrol_new rx0_sidetone_mix_mux =
SOC_DAPM_ENUM("WSA_RX0 SIDETONE MIX Mux", rx0_sidetone_mix_enum); SOC_DAPM_ENUM("WSA_RX0 SIDETONE MIX Mux", rx0_sidetone_mix_enum);
/* RX INT1 */
static const struct soc_enum rx1_prim_inp0_chain_enum =
SOC_ENUM_SINGLE(LPASS_CDC_WSA_RX_INP_MUX_RX_INT1_CFG0,
0, 12, rx_text);
static const struct soc_enum rx1_prim_inp1_chain_enum =
SOC_ENUM_SINGLE(LPASS_CDC_WSA_RX_INP_MUX_RX_INT1_CFG0,
3, 12, rx_text);
static const struct soc_enum rx1_prim_inp2_chain_enum =
SOC_ENUM_SINGLE(LPASS_CDC_WSA_RX_INP_MUX_RX_INT1_CFG1,
3, 12, rx_text);
static const struct soc_enum rx1_mix_chain_enum =
SOC_ENUM_SINGLE(LPASS_CDC_WSA_RX_INP_MUX_RX_INT1_CFG1,
0, 10, rx_mix_text);
static const struct snd_kcontrol_new rx1_prim_inp0_mux =
SOC_DAPM_ENUM("WSA_RX1 INP0 Mux", rx1_prim_inp0_chain_enum);
static const struct snd_kcontrol_new rx1_prim_inp1_mux =
SOC_DAPM_ENUM("WSA_RX1 INP1 Mux", rx1_prim_inp1_chain_enum);
static const struct snd_kcontrol_new rx1_prim_inp2_mux =
SOC_DAPM_ENUM("WSA_RX1 INP2 Mux", rx1_prim_inp2_chain_enum);
static const struct snd_kcontrol_new rx1_mix_mux =
SOC_DAPM_ENUM("WSA_RX1 MIX Mux", rx1_mix_chain_enum);
static const struct soc_enum rx_mix_ec0_enum = static const struct soc_enum rx_mix_ec0_enum =
SOC_ENUM_SINGLE(LPASS_CDC_WSA_RX_INP_MUX_RX_MIX_CFG0, SOC_ENUM_SINGLE(LPASS_CDC_WSA_RX_INP_MUX_RX_MIX_CFG0,
0, 3, rx_mix_ec_text); 0, 3, rx_mix_ec_text);
@@ -1648,6 +1718,14 @@ static bool lpass_cdc_wsa_macro_adie_lb(struct snd_soc_component *component,
u16 int_mux_cfg0 = 0, int_mux_cfg1 = 0; u16 int_mux_cfg0 = 0, int_mux_cfg1 = 0;
u8 int_mux_cfg0_val = 0, int_mux_cfg1_val = 0; u8 int_mux_cfg0_val = 0, int_mux_cfg1_val = 0;
u8 int_n_inp0 = 0, int_n_inp1 = 0, int_n_inp2 = 0; u8 int_n_inp0 = 0, int_n_inp1 = 0, int_n_inp2 = 0;
int int_1_rx = INTn_1_INP_SEL_DEC0;
int int_2_rx = INTn_1_INP_SEL_DEC1;
u32 version;
struct device *wsa_dev = NULL;
struct lpass_cdc_wsa_macro_priv *wsa_priv = NULL;
if (!lpass_cdc_wsa_macro_get_data(component, &wsa_dev, &wsa_priv, __func__))
return -EINVAL;
int_mux_cfg0 = LPASS_CDC_WSA_RX_INP_MUX_RX_INT0_CFG0 + interp_idx * 8; int_mux_cfg0 = LPASS_CDC_WSA_RX_INP_MUX_RX_INT0_CFG0 + interp_idx * 8;
int_mux_cfg1 = int_mux_cfg0 + 4; int_mux_cfg1 = int_mux_cfg0 + 4;
@@ -1655,18 +1733,29 @@ static bool lpass_cdc_wsa_macro_adie_lb(struct snd_soc_component *component,
int_mux_cfg1_val = snd_soc_component_read(component, int_mux_cfg1); int_mux_cfg1_val = snd_soc_component_read(component, int_mux_cfg1);
int_n_inp0 = int_mux_cfg0_val & 0x0F; int_n_inp0 = int_mux_cfg0_val & 0x0F;
if (int_n_inp0 == INTn_1_INP_SEL_DEC0 ||
int_n_inp0 == INTn_1_INP_SEL_DEC1) version = lpass_cdc_get_version(wsa_dev);
/* For Lpass version <= 2.5 the config mux didnot have rx6,rx7,rx8.
* So decrease by 3 will select the correct index.
*/
if (version <= LPASS_CDC_VERSION_2_5) {
int_1_rx = int_1_rx - 3;
int_2_rx = int_2_rx - 3;
}
if (int_n_inp0 == int_1_rx ||
int_n_inp0 == int_2_rx)
return true; return true;
int_n_inp1 = int_mux_cfg0_val >> 4; int_n_inp1 = int_mux_cfg0_val >> 4;
if (int_n_inp1 == INTn_1_INP_SEL_DEC0 || if (int_n_inp1 == int_1_rx ||
int_n_inp1 == INTn_1_INP_SEL_DEC1) int_n_inp1 == int_2_rx)
return true; return true;
int_n_inp2 = int_mux_cfg1_val >> 4; int_n_inp2 = int_mux_cfg1_val >> 4;
if (int_n_inp2 == INTn_1_INP_SEL_DEC0 || if (int_n_inp2 == int_1_rx ||
int_n_inp2 == INTn_1_INP_SEL_DEC1) int_n_inp2 == int_2_rx)
return true; return true;
return false; return false;
@@ -2924,6 +3013,61 @@ static const struct snd_kcontrol_new aif_cps_mixer[] = {
lpass_cdc_wsa_macro_cps_feed_mixer_put), lpass_cdc_wsa_macro_cps_feed_mixer_put),
}; };
static const struct snd_soc_dapm_widget lpass_cdc_wsa_macro_dapm_widgets_v2p6[] = {
SND_SOC_DAPM_MUX_E("WSA_RX0 INP0", SND_SOC_NOPM, 0, 0,
&rx0_prim_inp0_mux_v2p6, lpass_cdc_wsa_macro_enable_swr,
SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
SND_SOC_DAPM_MUX_E("WSA_RX0 INP1", SND_SOC_NOPM, 0, 0,
&rx0_prim_inp1_mux_v2p6, lpass_cdc_wsa_macro_enable_swr,
SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
SND_SOC_DAPM_MUX_E("WSA_RX0 INP2", SND_SOC_NOPM, 0, 0,
&rx0_prim_inp2_mux_v2p6, lpass_cdc_wsa_macro_enable_swr,
SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
SND_SOC_DAPM_MUX_E("WSA_RX0 MIX INP", SND_SOC_NOPM,
0, 0, &rx0_mix_mux_v2p6, lpass_cdc_wsa_macro_enable_mix_path,
SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
SND_SOC_DAPM_MUX_E("WSA_RX1 INP0", SND_SOC_NOPM, 0, 0,
&rx1_prim_inp0_mux_v2p6, lpass_cdc_wsa_macro_enable_swr,
SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
SND_SOC_DAPM_MUX_E("WSA_RX1 INP1", SND_SOC_NOPM, 0, 0,
&rx1_prim_inp1_mux_v2p6, lpass_cdc_wsa_macro_enable_swr,
SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
SND_SOC_DAPM_MUX_E("WSA_RX1 INP2", SND_SOC_NOPM, 0, 0,
&rx1_prim_inp2_mux_v2p6, lpass_cdc_wsa_macro_enable_swr,
SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
SND_SOC_DAPM_MUX_E("WSA_RX1 MIX INP", SND_SOC_NOPM,
0, 0, &rx1_mix_mux_v2p6, lpass_cdc_wsa_macro_enable_mix_path,
SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
};
static const struct snd_soc_dapm_widget lpass_cdc_wsa_macro_dapm_widgets_v2p5[] = {
SND_SOC_DAPM_MUX_E("WSA_RX0 INP0", SND_SOC_NOPM, 0, 0,
&rx0_prim_inp0_mux_v2p5, lpass_cdc_wsa_macro_enable_swr,
SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
SND_SOC_DAPM_MUX_E("WSA_RX0 INP1", SND_SOC_NOPM, 0, 0,
&rx0_prim_inp1_mux_v2p5, lpass_cdc_wsa_macro_enable_swr,
SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
SND_SOC_DAPM_MUX_E("WSA_RX0 INP2", SND_SOC_NOPM, 0, 0,
&rx0_prim_inp2_mux_v2p5, lpass_cdc_wsa_macro_enable_swr,
SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
SND_SOC_DAPM_MUX_E("WSA_RX0 MIX INP", SND_SOC_NOPM,
0, 0, &rx0_mix_mux_v2p5, lpass_cdc_wsa_macro_enable_mix_path,
SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
SND_SOC_DAPM_MUX_E("WSA_RX1 INP0", SND_SOC_NOPM, 0, 0,
&rx1_prim_inp0_mux_v2p5, lpass_cdc_wsa_macro_enable_swr,
SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
SND_SOC_DAPM_MUX_E("WSA_RX1 INP1", SND_SOC_NOPM, 0, 0,
&rx1_prim_inp1_mux_v2p5, lpass_cdc_wsa_macro_enable_swr,
SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
SND_SOC_DAPM_MUX_E("WSA_RX1 INP2", SND_SOC_NOPM, 0, 0,
&rx1_prim_inp2_mux_v2p5, lpass_cdc_wsa_macro_enable_swr,
SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
SND_SOC_DAPM_MUX_E("WSA_RX1 MIX INP", SND_SOC_NOPM,
0, 0, &rx1_mix_mux_v2p5, lpass_cdc_wsa_macro_enable_mix_path,
SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
};
static const struct snd_soc_dapm_widget lpass_cdc_wsa_macro_dapm_widgets[] = { static const struct snd_soc_dapm_widget lpass_cdc_wsa_macro_dapm_widgets[] = {
SND_SOC_DAPM_AIF_IN("WSA AIF1 PB", "WSA_AIF1 Playback", 0, SND_SOC_DAPM_AIF_IN("WSA AIF1 PB", "WSA_AIF1 Playback", 0,
SND_SOC_NOPM, 0, 0), SND_SOC_NOPM, 0, 0),
@@ -2975,30 +3119,6 @@ static const struct snd_soc_dapm_widget lpass_cdc_wsa_macro_dapm_widgets[] = {
SND_SOC_DAPM_MIXER("WSA RX4", SND_SOC_NOPM, 0, 0, NULL, 0), SND_SOC_DAPM_MIXER("WSA RX4", SND_SOC_NOPM, 0, 0, NULL, 0),
SND_SOC_DAPM_MIXER("WSA RX5", SND_SOC_NOPM, 0, 0, NULL, 0), SND_SOC_DAPM_MIXER("WSA RX5", SND_SOC_NOPM, 0, 0, NULL, 0),
SND_SOC_DAPM_MUX_E("WSA_RX0 INP0", SND_SOC_NOPM, 0, 0,
&rx0_prim_inp0_mux, lpass_cdc_wsa_macro_enable_swr,
SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
SND_SOC_DAPM_MUX_E("WSA_RX0 INP1", SND_SOC_NOPM, 0, 0,
&rx0_prim_inp1_mux, lpass_cdc_wsa_macro_enable_swr,
SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
SND_SOC_DAPM_MUX_E("WSA_RX0 INP2", SND_SOC_NOPM, 0, 0,
&rx0_prim_inp2_mux, lpass_cdc_wsa_macro_enable_swr,
SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
SND_SOC_DAPM_MUX_E("WSA_RX0 MIX INP", SND_SOC_NOPM,
0, 0, &rx0_mix_mux, lpass_cdc_wsa_macro_enable_mix_path,
SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
SND_SOC_DAPM_MUX_E("WSA_RX1 INP0", SND_SOC_NOPM, 0, 0,
&rx1_prim_inp0_mux, lpass_cdc_wsa_macro_enable_swr,
SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
SND_SOC_DAPM_MUX_E("WSA_RX1 INP1", SND_SOC_NOPM, 0, 0,
&rx1_prim_inp1_mux, lpass_cdc_wsa_macro_enable_swr,
SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
SND_SOC_DAPM_MUX_E("WSA_RX1 INP2", SND_SOC_NOPM, 0, 0,
&rx1_prim_inp2_mux, lpass_cdc_wsa_macro_enable_swr,
SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
SND_SOC_DAPM_MUX_E("WSA_RX1 MIX INP", SND_SOC_NOPM,
0, 0, &rx1_mix_mux, lpass_cdc_wsa_macro_enable_mix_path,
SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
SND_SOC_DAPM_PGA_E("WSA_RX INT0 MIX", SND_SOC_NOPM, SND_SOC_DAPM_PGA_E("WSA_RX INT0 MIX", SND_SOC_NOPM,
0, 0, NULL, 0, lpass_cdc_wsa_macro_enable_main_path, 0, 0, NULL, 0, lpass_cdc_wsa_macro_enable_main_path,
SND_SOC_DAPM_PRE_PMU), SND_SOC_DAPM_PRE_PMU),
@@ -3578,6 +3698,7 @@ static int lpass_cdc_wsa_macro_init(struct snd_soc_component *component)
struct snd_soc_dapm_context *dapm = struct snd_soc_dapm_context *dapm =
snd_soc_component_get_dapm(component); snd_soc_component_get_dapm(component);
int ret; int ret;
u32 version;
struct device *wsa_dev = NULL; struct device *wsa_dev = NULL;
struct lpass_cdc_wsa_macro_priv *wsa_priv = NULL; struct lpass_cdc_wsa_macro_priv *wsa_priv = NULL;
@@ -3601,6 +3722,24 @@ static int lpass_cdc_wsa_macro_init(struct snd_soc_component *component)
return ret; return ret;
} }
version = lpass_cdc_get_version(wsa_dev);
if (version <= LPASS_CDC_VERSION_2_5) {
ret = snd_soc_dapm_new_controls(dapm, lpass_cdc_wsa_macro_dapm_widgets_v2p5,
ARRAY_SIZE(lpass_cdc_wsa_macro_dapm_widgets_v2p5));
if (ret < 0) {
dev_err(wsa_dev, "%s: Failed to add lpass v2p5 controls\n", __func__);
return ret;
}
} else {
ret = snd_soc_dapm_new_controls(dapm, lpass_cdc_wsa_macro_dapm_widgets_v2p6,
ARRAY_SIZE(lpass_cdc_wsa_macro_dapm_widgets_v2p6));
if (ret < 0) {
dev_err(wsa_dev, "%s: Failed to add lpass v2p6 controls\n", __func__);
return ret;
}
}
ret = snd_soc_dapm_add_routes(dapm, wsa_audio_map, ret = snd_soc_dapm_add_routes(dapm, wsa_audio_map,
ARRAY_SIZE(wsa_audio_map)); ARRAY_SIZE(wsa_audio_map));
if (ret < 0) { if (ret < 0) {

View File

@@ -1,6 +1,6 @@
// SPDX-License-Identifier: GPL-2.0-only // SPDX-License-Identifier: GPL-2.0-only
/* Copyright (c) 2018-2021, The Linux Foundation. All rights reserved. /* Copyright (c) 2018-2021, The Linux Foundation. All rights reserved.
* Copyright (c) 2022-2023, Qualcomm Innovation Center, Inc. All rights reserved. * Copyright (c) 2022-2024, Qualcomm Innovation Center, Inc. All rights reserved.
*/ */
#include <linux/of_platform.h> #include <linux/of_platform.h>
@@ -824,10 +824,10 @@ int lpass_cdc_get_version(struct device *dev)
EXPORT_SYMBOL(lpass_cdc_get_version); EXPORT_SYMBOL(lpass_cdc_get_version);
static ssize_t lpass_cdc_version_read(struct snd_info_entry *entry, static ssize_t lpass_cdc_version_read(struct snd_info_entry *entry,
void *file_private_data, void *file_private_data,
struct file *file, struct file *file,
char __user *buf, size_t count, char __user *buf, size_t count,
loff_t pos) loff_t pos)
{ {
struct lpass_cdc_priv *priv; struct lpass_cdc_priv *priv;
char buffer[LPASS_CDC_VERSION_ENTRY_SIZE]; char buffer[LPASS_CDC_VERSION_ENTRY_SIZE];
@@ -1164,10 +1164,14 @@ static int lpass_cdc_soc_codec_probe(struct snd_soc_component *component)
priv->version = LPASS_CDC_VERSION_2_0; priv->version = LPASS_CDC_VERSION_2_0;
if ((core_id_0 == 0x02) && (core_id_1 == 0x0E)) if ((core_id_0 == 0x02) && (core_id_1 == 0x0E))
priv->version = LPASS_CDC_VERSION_2_1; priv->version = LPASS_CDC_VERSION_2_1;
if ((core_id_0 == 0x02) && (core_id_1 == 0x0F)) if ((core_id_0 == 0x02) && (core_id_1 == 0x0F) && (core_id_2 == 0x50 || core_id_2 == 0x51))
priv->version = LPASS_CDC_VERSION_2_5; priv->version = LPASS_CDC_VERSION_2_5;
if ((core_id_0 == 0x02) && (core_id_1 == 0x0F) && (core_id_2 == 0x60 || core_id_2 == 0x61)) if ((core_id_0 == 0x02) && (core_id_1 == 0x0F) && (core_id_2 == 0x60 || core_id_2 == 0x61))
priv->version = LPASS_CDC_VERSION_2_6; priv->version = LPASS_CDC_VERSION_2_6;
if ((core_id_0 == 0x02) && (core_id_1 == 0x0F) && (core_id_2 == 0x70 || core_id_2 == 0x71))
priv->version = LPASS_CDC_VERSION_2_7;
if ((core_id_0 == 0x02) && (core_id_1 == 0x0F) && (core_id_2 == 0x80 || core_id_2 == 0x81))
priv->version = LPASS_CDC_VERSION_2_8;
/* call init for supported macros */ /* call init for supported macros */
for (macro_idx = START_MACRO; macro_idx < MAX_MACRO; macro_idx++) { for (macro_idx = START_MACRO; macro_idx < MAX_MACRO; macro_idx++) {

View File

@@ -1,6 +1,6 @@
/* SPDX-License-Identifier: GPL-2.0-only */ /* SPDX-License-Identifier: GPL-2.0-only */
/* Copyright (c) 2018-2021, The Linux Foundation. All rights reserved. /* Copyright (c) 2018-2021, The Linux Foundation. All rights reserved.
* Copyright (c) 2023 Qualcomm Innovation Center, Inc. All rights reserved. * Copyright (c) 2023-2024 Qualcomm Innovation Center, Inc. All rights reserved.
*/ */
#ifndef LPASS_CDC_H #ifndef LPASS_CDC_H
@@ -16,6 +16,8 @@
#define LPASS_CDC_VERSION_2_1 0x0005 #define LPASS_CDC_VERSION_2_1 0x0005
#define LPASS_CDC_VERSION_2_5 0x0006 #define LPASS_CDC_VERSION_2_5 0x0006
#define LPASS_CDC_VERSION_2_6 0x0007 #define LPASS_CDC_VERSION_2_6 0x0007
#define LPASS_CDC_VERSION_2_7 0x0008
#define LPASS_CDC_VERSION_2_8 0x0009
enum { enum {
START_MACRO, START_MACRO,