diff --git a/asoc/codecs/lpass-cdc/lpass-cdc-wsa-macro.c b/asoc/codecs/lpass-cdc/lpass-cdc-wsa-macro.c index 5c64df36ff..b3b7a68b2d 100644 --- a/asoc/codecs/lpass-cdc/lpass-cdc-wsa-macro.c +++ b/asoc/codecs/lpass-cdc/lpass-cdc-wsa-macro.c @@ -325,15 +325,26 @@ struct lpass_cdc_wsa_macro_priv { static struct snd_soc_dai_driver lpass_cdc_wsa_macro_dai[]; 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", "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" }; +/* 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[] = { "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); /* 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 = SOC_ENUM_SINGLE(SND_SOC_NOPM, 0, 2, rx_sidetone_mix_text); -static const struct snd_kcontrol_new rx0_prim_inp0_mux = - SOC_DAPM_ENUM("WSA_RX0 INP0 Mux", rx0_prim_inp0_chain_enum); +/* for Version 2P5 */ +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 = - SOC_DAPM_ENUM("WSA_RX0 INP1 Mux", rx0_prim_inp1_chain_enum); +static const struct soc_enum rx0_prim_inp1_chain_enum_v2p5 = + 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 = - SOC_DAPM_ENUM("WSA_RX0 INP2 Mux", rx0_prim_inp2_chain_enum); +static const struct soc_enum rx0_prim_inp2_chain_enum_v2p5 = + 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 = - SOC_DAPM_ENUM("WSA_RX0 MIX Mux", rx0_mix_chain_enum); +static const struct soc_enum rx0_mix_chain_enum_v2p5 = + 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 = 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 = SOC_ENUM_SINGLE(LPASS_CDC_WSA_RX_INP_MUX_RX_MIX_CFG0, 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; u8 int_mux_cfg0_val = 0, int_mux_cfg1_val = 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_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_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; int_n_inp1 = int_mux_cfg0_val >> 4; - if (int_n_inp1 == INTn_1_INP_SEL_DEC0 || - int_n_inp1 == INTn_1_INP_SEL_DEC1) + if (int_n_inp1 == int_1_rx || + int_n_inp1 == int_2_rx) return true; int_n_inp2 = int_mux_cfg1_val >> 4; - if (int_n_inp2 == INTn_1_INP_SEL_DEC0 || - int_n_inp2 == INTn_1_INP_SEL_DEC1) + if (int_n_inp2 == int_1_rx || + int_n_inp2 == int_2_rx) return true; return false; @@ -2924,6 +3013,61 @@ static const struct snd_kcontrol_new aif_cps_mixer[] = { 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[] = { SND_SOC_DAPM_AIF_IN("WSA AIF1 PB", "WSA_AIF1 Playback", 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 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, 0, 0, NULL, 0, lpass_cdc_wsa_macro_enable_main_path, 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 = snd_soc_component_get_dapm(component); int ret; + u32 version; struct device *wsa_dev = 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; } + 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, ARRAY_SIZE(wsa_audio_map)); if (ret < 0) { diff --git a/asoc/codecs/lpass-cdc/lpass-cdc.c b/asoc/codecs/lpass-cdc/lpass-cdc.c index bc022f81a5..6883749c59 100644 --- a/asoc/codecs/lpass-cdc/lpass-cdc.c +++ b/asoc/codecs/lpass-cdc/lpass-cdc.c @@ -1,6 +1,6 @@ // SPDX-License-Identifier: GPL-2.0-only /* 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 @@ -824,10 +824,10 @@ int lpass_cdc_get_version(struct device *dev) EXPORT_SYMBOL(lpass_cdc_get_version); static ssize_t lpass_cdc_version_read(struct snd_info_entry *entry, - void *file_private_data, - struct file *file, - char __user *buf, size_t count, - loff_t pos) + void *file_private_data, + struct file *file, + char __user *buf, size_t count, + loff_t pos) { struct lpass_cdc_priv *priv; 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; if ((core_id_0 == 0x02) && (core_id_1 == 0x0E)) 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; if ((core_id_0 == 0x02) && (core_id_1 == 0x0F) && (core_id_2 == 0x60 || core_id_2 == 0x61)) 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 */ for (macro_idx = START_MACRO; macro_idx < MAX_MACRO; macro_idx++) { diff --git a/asoc/codecs/lpass-cdc/lpass-cdc.h b/asoc/codecs/lpass-cdc/lpass-cdc.h index 6bf45501d3..2569dc8244 100644 --- a/asoc/codecs/lpass-cdc/lpass-cdc.h +++ b/asoc/codecs/lpass-cdc/lpass-cdc.h @@ -1,6 +1,6 @@ /* SPDX-License-Identifier: GPL-2.0-only */ /* 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 @@ -16,6 +16,8 @@ #define LPASS_CDC_VERSION_2_1 0x0005 #define LPASS_CDC_VERSION_2_5 0x0006 #define LPASS_CDC_VERSION_2_6 0x0007 +#define LPASS_CDC_VERSION_2_7 0x0008 +#define LPASS_CDC_VERSION_2_8 0x0009 enum { START_MACRO,