]> www.infradead.org Git - users/dwmw2/linux.git/commitdiff
ASoC: codecs: wcd937x: add capture dapm widgets
authorPrasad Kumpatla <quic_pkumpatl@quicinc.com>
Fri, 24 May 2024 03:55:34 +0000 (09:25 +0530)
committerMark Brown <broonie@kernel.org>
Mon, 10 Jun 2024 11:47:30 +0000 (12:47 +0100)
This patch adds required dapm widgets for capture path.

Signed-off-by: Prasad Kumpatla <quic_pkumpatl@quicinc.com>
Co-developed-by: Mohammad Rafi Shaik <quic_mohs@quicinc.com>
Signed-off-by: Mohammad Rafi Shaik <quic_mohs@quicinc.com>
Link: https://lore.kernel.org/r/20240524035535.3119208-7-quic_mohs@quicinc.com
Signed-off-by: Mark Brown <broonie@kernel.org>
sound/soc/codecs/wcd937x.c

index 3b0e4bd4eb4fddfd77baad750de7694ddd080c08..f8b57f47ad555a2548ccc5900880929fb4222e7d 100644 (file)
@@ -915,6 +915,145 @@ static int wcd937x_get_micb_vout_ctl_val(u32 micb_mv)
        return (micb_mv - 1000) / 50;
 }
 
+static int wcd937x_tx_swr_ctrl(struct snd_soc_dapm_widget *w,
+                              struct snd_kcontrol *kcontrol, int event)
+{
+       struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm);
+       struct wcd937x_priv *wcd937x = snd_soc_component_get_drvdata(component);
+       bool use_amic3 = snd_soc_component_read(component, WCD937X_TX_NEW_TX_CH2_SEL) & BIT(7);
+
+       /* Enable BCS for Headset mic */
+       if (event == SND_SOC_DAPM_PRE_PMU && strnstr(w->name, "ADC", sizeof("ADC")))
+               if (w->shift == 1 && !use_amic3)
+                       set_bit(AMIC2_BCS_ENABLE, &wcd937x->status_mask);
+
+       return 0;
+}
+
+static int wcd937x_codec_enable_adc(struct snd_soc_dapm_widget *w,
+                                   struct snd_kcontrol *kcontrol, int event)
+{
+       struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm);
+       struct wcd937x_priv *wcd937x = snd_soc_component_get_drvdata(component);
+
+       switch (event) {
+       case SND_SOC_DAPM_PRE_PMU:
+               atomic_inc(&wcd937x->ana_clk_count);
+               snd_soc_component_update_bits(component,
+                                             WCD937X_DIGITAL_CDC_DIG_CLK_CTL, BIT(7), BIT(7));
+               snd_soc_component_update_bits(component,
+                                             WCD937X_DIGITAL_CDC_ANA_CLK_CTL, BIT(3), BIT(3));
+               snd_soc_component_update_bits(component,
+                                             WCD937X_DIGITAL_CDC_ANA_CLK_CTL, BIT(4), BIT(4));
+               break;
+       case SND_SOC_DAPM_POST_PMD:
+               if (w->shift == 1 && test_bit(AMIC2_BCS_ENABLE, &wcd937x->status_mask))
+                       clear_bit(AMIC2_BCS_ENABLE, &wcd937x->status_mask);
+
+               snd_soc_component_update_bits(component,
+                                             WCD937X_DIGITAL_CDC_ANA_CLK_CTL, BIT(3), 0x00);
+               break;
+       }
+
+       return 0;
+}
+
+static int wcd937x_enable_req(struct snd_soc_dapm_widget *w,
+                             struct snd_kcontrol *kcontrol, int event)
+{
+       struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm);
+       struct wcd937x_priv *wcd937x = snd_soc_component_get_drvdata(component);
+
+       switch (event) {
+       case SND_SOC_DAPM_PRE_PMU:
+               snd_soc_component_update_bits(component,
+                                             WCD937X_DIGITAL_CDC_REQ_CTL, BIT(1), BIT(1));
+               snd_soc_component_update_bits(component,
+                                             WCD937X_DIGITAL_CDC_REQ_CTL, BIT(0), 0x00);
+               snd_soc_component_update_bits(component,
+                                             WCD937X_ANA_TX_CH2, BIT(6), BIT(6));
+               snd_soc_component_update_bits(component,
+                                             WCD937X_ANA_TX_CH3_HPF, BIT(6), BIT(6));
+               snd_soc_component_update_bits(component,
+                                             WCD937X_DIGITAL_CDC_DIG_CLK_CTL, 0x70, 0x70);
+               snd_soc_component_update_bits(component,
+                                             WCD937X_ANA_TX_CH1, BIT(7), BIT(7));
+               snd_soc_component_update_bits(component,
+                                             WCD937X_ANA_TX_CH2, BIT(6), 0x00);
+               snd_soc_component_update_bits(component,
+                                             WCD937X_ANA_TX_CH2, BIT(7), BIT(7));
+               snd_soc_component_update_bits(component,
+                                             WCD937X_ANA_TX_CH3, BIT(7), BIT(7));
+               break;
+       case SND_SOC_DAPM_POST_PMD:
+               snd_soc_component_update_bits(component,
+                                             WCD937X_ANA_TX_CH1, BIT(7), 0x00);
+               snd_soc_component_update_bits(component,
+                                             WCD937X_ANA_TX_CH2, BIT(7), 0x00);
+               snd_soc_component_update_bits(component,
+                                             WCD937X_ANA_TX_CH3, BIT(7), 0x00);
+               snd_soc_component_update_bits(component,
+                                             WCD937X_DIGITAL_CDC_DIG_CLK_CTL, BIT(4), 0x00);
+
+               atomic_dec(&wcd937x->ana_clk_count);
+               if (atomic_read(&wcd937x->ana_clk_count) <= 0) {
+                       snd_soc_component_update_bits(component,
+                                                     WCD937X_DIGITAL_CDC_ANA_CLK_CTL,
+                                                     BIT(4), 0x00);
+                       atomic_set(&wcd937x->ana_clk_count, 0);
+               }
+
+               snd_soc_component_update_bits(component,
+                                             WCD937X_DIGITAL_CDC_DIG_CLK_CTL,
+                                             BIT(7), 0x00);
+               break;
+       }
+
+       return 0;
+}
+
+static int wcd937x_codec_enable_dmic(struct snd_soc_dapm_widget *w,
+                                    struct snd_kcontrol *kcontrol,
+                                    int event)
+{
+       struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm);
+       u16 dmic_clk_reg;
+
+       switch (w->shift) {
+       case 0:
+       case 1:
+               dmic_clk_reg = WCD937X_DIGITAL_CDC_DMIC1_CTL;
+               break;
+       case 2:
+       case 3:
+               dmic_clk_reg = WCD937X_DIGITAL_CDC_DMIC2_CTL;
+               break;
+       case 4:
+       case 5:
+               dmic_clk_reg = WCD937X_DIGITAL_CDC_DMIC3_CTL;
+               break;
+       default:
+               dev_err(component->dev, "Invalid DMIC Selection\n");
+               return -EINVAL;
+       }
+
+       switch (event) {
+       case SND_SOC_DAPM_PRE_PMU:
+               snd_soc_component_update_bits(component,
+                                             WCD937X_DIGITAL_CDC_DIG_CLK_CTL,
+                                             BIT(7), BIT(7));
+               snd_soc_component_update_bits(component,
+                                             dmic_clk_reg, 0x07, BIT(1));
+               snd_soc_component_update_bits(component,
+                                             dmic_clk_reg, BIT(3), BIT(3));
+               snd_soc_component_update_bits(component,
+                                             dmic_clk_reg, 0x70, BIT(5));
+               break;
+       }
+
+       return 0;
+}
+
 static int wcd937x_micbias_control(struct snd_soc_component *component,
                                   int micb_num, int req, bool is_dapm)
 {
@@ -1026,6 +1165,82 @@ static int wcd937x_micbias_control(struct snd_soc_component *component,
        return 0;
 }
 
+static int __wcd937x_codec_enable_micbias(struct snd_soc_dapm_widget *w,
+                                         int event)
+{
+       struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm);
+       int micb_num;
+
+       if (strnstr(w->name, "MIC BIAS1", sizeof("MIC BIAS1")))
+               micb_num = MIC_BIAS_1;
+       else if (strnstr(w->name, "MIC BIAS2", sizeof("MIC BIAS2")))
+               micb_num = MIC_BIAS_2;
+       else if (strnstr(w->name, "MIC BIAS3", sizeof("MIC BIAS3")))
+               micb_num = MIC_BIAS_3;
+       else
+               return -EINVAL;
+
+       switch (event) {
+       case SND_SOC_DAPM_PRE_PMU:
+               wcd937x_micbias_control(component, micb_num,
+                                       MICB_ENABLE, true);
+               break;
+       case SND_SOC_DAPM_POST_PMU:
+               usleep_range(1000, 1100);
+               break;
+       case SND_SOC_DAPM_POST_PMD:
+               wcd937x_micbias_control(component, micb_num,
+                                       MICB_DISABLE, true);
+               break;
+       }
+
+       return 0;
+}
+
+static int wcd937x_codec_enable_micbias(struct snd_soc_dapm_widget *w,
+                                       struct snd_kcontrol *kcontrol,
+                                       int event)
+{
+       return __wcd937x_codec_enable_micbias(w, event);
+}
+
+static int __wcd937x_codec_enable_micbias_pullup(struct snd_soc_dapm_widget *w,
+                                                int event)
+{
+       struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm);
+       int micb_num;
+
+       if (strnstr(w->name, "VA MIC BIAS1", sizeof("VA MIC BIAS1")))
+               micb_num = MIC_BIAS_1;
+       else if (strnstr(w->name, "VA MIC BIAS2", sizeof("VA MIC BIAS2")))
+               micb_num = MIC_BIAS_2;
+       else if (strnstr(w->name, "VA MIC BIAS3", sizeof("VA MIC BIAS3")))
+               micb_num = MIC_BIAS_3;
+       else
+               return -EINVAL;
+
+       switch (event) {
+       case SND_SOC_DAPM_PRE_PMU:
+               wcd937x_micbias_control(component, micb_num, MICB_PULLUP_ENABLE, true);
+               break;
+       case SND_SOC_DAPM_POST_PMU:
+               usleep_range(1000, 1100);
+               break;
+       case SND_SOC_DAPM_POST_PMD:
+               wcd937x_micbias_control(component, micb_num, MICB_PULLUP_DISABLE, true);
+               break;
+       }
+
+       return 0;
+}
+
+static int wcd937x_codec_enable_micbias_pullup(struct snd_soc_dapm_widget *w,
+                                              struct snd_kcontrol *kcontrol,
+                                              int event)
+{
+       return __wcd937x_codec_enable_micbias_pullup(w, event);
+}
+
 static int wcd937x_connect_port(struct wcd937x_sdw_priv *wcd, u8 port_idx, u8 ch_id, bool enable)
 {
        struct sdw_port_config *port_config = &wcd->port_config[port_idx - 1];
@@ -1912,6 +2127,42 @@ static const struct snd_kcontrol_new wcd937x_snd_controls[] = {
                       wcd937x_get_swr_port, wcd937x_set_swr_port),
 };
 
+static const struct snd_kcontrol_new adc1_switch[] = {
+       SOC_DAPM_SINGLE("Switch", SND_SOC_NOPM, 0, 1, 0)
+};
+
+static const struct snd_kcontrol_new adc2_switch[] = {
+       SOC_DAPM_SINGLE("Switch", SND_SOC_NOPM, 0, 1, 0)
+};
+
+static const struct snd_kcontrol_new adc3_switch[] = {
+       SOC_DAPM_SINGLE("Switch", SND_SOC_NOPM, 0, 1, 0)
+};
+
+static const struct snd_kcontrol_new dmic1_switch[] = {
+       SOC_DAPM_SINGLE("Switch", SND_SOC_NOPM, 0, 1, 0)
+};
+
+static const struct snd_kcontrol_new dmic2_switch[] = {
+       SOC_DAPM_SINGLE("Switch", SND_SOC_NOPM, 0, 1, 0)
+};
+
+static const struct snd_kcontrol_new dmic3_switch[] = {
+       SOC_DAPM_SINGLE("Switch", SND_SOC_NOPM, 0, 1, 0)
+};
+
+static const struct snd_kcontrol_new dmic4_switch[] = {
+       SOC_DAPM_SINGLE("Switch", SND_SOC_NOPM, 0, 1, 0)
+};
+
+static const struct snd_kcontrol_new dmic5_switch[] = {
+       SOC_DAPM_SINGLE("Switch", SND_SOC_NOPM, 0, 1, 0)
+};
+
+static const struct snd_kcontrol_new dmic6_switch[] = {
+       SOC_DAPM_SINGLE("Switch", SND_SOC_NOPM, 0, 1, 0)
+};
+
 static const struct snd_kcontrol_new ear_rdac_switch[] = {
        SOC_DAPM_SINGLE("Switch", SND_SOC_NOPM, 0, 1, 0)
 };
@@ -1928,22 +2179,76 @@ static const struct snd_kcontrol_new hphr_rdac_switch[] = {
        SOC_DAPM_SINGLE("Switch", SND_SOC_NOPM, 0, 1, 0)
 };
 
+static const char * const adc2_mux_text[] = {
+       "INP2", "INP3"
+};
+
 static const char * const rdac3_mux_text[] = {
        "RX1", "RX3"
 };
 
+static const struct soc_enum adc2_enum =
+       SOC_ENUM_SINGLE(WCD937X_TX_NEW_TX_CH2_SEL, 7,
+                       ARRAY_SIZE(adc2_mux_text), adc2_mux_text);
+
 static const struct soc_enum rdac3_enum =
        SOC_ENUM_SINGLE(WCD937X_DIGITAL_CDC_EAR_PATH_CTL, 0,
                        ARRAY_SIZE(rdac3_mux_text), rdac3_mux_text);
 
+static const struct snd_kcontrol_new tx_adc2_mux = SOC_DAPM_ENUM("ADC2 MUX Mux", adc2_enum);
+
 static const struct snd_kcontrol_new rx_rdac3_mux = SOC_DAPM_ENUM("RDAC3_MUX Mux", rdac3_enum);
 
 static const struct snd_soc_dapm_widget wcd937x_dapm_widgets[] = {
        /* Input widgets */
+       SND_SOC_DAPM_INPUT("AMIC1"),
+       SND_SOC_DAPM_INPUT("AMIC2"),
+       SND_SOC_DAPM_INPUT("AMIC3"),
        SND_SOC_DAPM_INPUT("IN1_HPHL"),
        SND_SOC_DAPM_INPUT("IN2_HPHR"),
        SND_SOC_DAPM_INPUT("IN3_AUX"),
 
+       /* TX widgets */
+       SND_SOC_DAPM_ADC_E("ADC1", NULL, SND_SOC_NOPM, 0, 0,
+                          wcd937x_codec_enable_adc,
+                          SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
+       SND_SOC_DAPM_ADC_E("ADC2", NULL, SND_SOC_NOPM, 1, 0,
+                          wcd937x_codec_enable_adc,
+                          SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
+
+       SND_SOC_DAPM_MIXER_E("ADC1 REQ", SND_SOC_NOPM, 0, 0,
+                            NULL, 0, wcd937x_enable_req,
+                            SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
+       SND_SOC_DAPM_MIXER_E("ADC2 REQ", SND_SOC_NOPM, 0, 0,
+                            NULL, 0, wcd937x_enable_req,
+                            SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
+
+       SND_SOC_DAPM_MUX("ADC2 MUX", SND_SOC_NOPM, 0, 0, &tx_adc2_mux),
+
+       /* TX mixers */
+       SND_SOC_DAPM_MIXER_E("ADC1_MIXER", SND_SOC_NOPM, 0, 0,
+                            adc1_switch, ARRAY_SIZE(adc1_switch),
+                            wcd937x_tx_swr_ctrl, SND_SOC_DAPM_PRE_PMU |
+                            SND_SOC_DAPM_POST_PMD),
+       SND_SOC_DAPM_MIXER_E("ADC2_MIXER", SND_SOC_NOPM, 1, 0,
+                            adc2_switch, ARRAY_SIZE(adc2_switch),
+                            wcd937x_tx_swr_ctrl, SND_SOC_DAPM_PRE_PMU |
+                            SND_SOC_DAPM_POST_PMD),
+
+       /* MIC_BIAS widgets */
+       SND_SOC_DAPM_SUPPLY("MIC BIAS1", SND_SOC_NOPM, 0, 0,
+                           wcd937x_codec_enable_micbias,
+                           SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
+                           SND_SOC_DAPM_POST_PMD),
+       SND_SOC_DAPM_SUPPLY("MIC BIAS2", SND_SOC_NOPM, 0, 0,
+                           wcd937x_codec_enable_micbias,
+                           SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
+                           SND_SOC_DAPM_POST_PMD),
+       SND_SOC_DAPM_SUPPLY("MIC BIAS3", SND_SOC_NOPM, 0, 0,
+                           wcd937x_codec_enable_micbias,
+                           SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
+                           SND_SOC_DAPM_POST_PMD),
+
        SND_SOC_DAPM_SUPPLY("VDD_BUCK", SND_SOC_NOPM, 0, 0,
                            wcd937x_codec_enable_vdd_buck,
                            SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
@@ -2007,11 +2312,101 @@ static const struct snd_soc_dapm_widget wcd937x_dapm_widgets[] = {
        SND_SOC_DAPM_MIXER("HPHR_RDAC", SND_SOC_NOPM, 0, 0,
                           hphr_rdac_switch, ARRAY_SIZE(hphr_rdac_switch)),
 
+       /* TX output widgets */
+       SND_SOC_DAPM_OUTPUT("ADC1_OUTPUT"),
+       SND_SOC_DAPM_OUTPUT("ADC2_OUTPUT"),
+       SND_SOC_DAPM_OUTPUT("ADC3_OUTPUT"),
+       SND_SOC_DAPM_OUTPUT("WCD_TX_OUTPUT"),
+
        /* RX output widgets */
        SND_SOC_DAPM_OUTPUT("EAR"),
        SND_SOC_DAPM_OUTPUT("AUX"),
        SND_SOC_DAPM_OUTPUT("HPHL"),
        SND_SOC_DAPM_OUTPUT("HPHR"),
+
+       /* MIC_BIAS pull up widgets */
+       SND_SOC_DAPM_SUPPLY("VA MIC BIAS1", SND_SOC_NOPM, 0, 0,
+                           wcd937x_codec_enable_micbias_pullup,
+                           SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
+                           SND_SOC_DAPM_POST_PMD),
+       SND_SOC_DAPM_SUPPLY("VA MIC BIAS2", SND_SOC_NOPM, 0, 0,
+                           wcd937x_codec_enable_micbias_pullup,
+                           SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
+                           SND_SOC_DAPM_POST_PMD),
+       SND_SOC_DAPM_SUPPLY("VA MIC BIAS3", SND_SOC_NOPM, 0, 0,
+                           wcd937x_codec_enable_micbias_pullup,
+                           SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
+                           SND_SOC_DAPM_POST_PMD),
+};
+
+static const struct snd_soc_dapm_widget wcd9375_dapm_widgets[] = {
+       /* Input widgets */
+       SND_SOC_DAPM_INPUT("AMIC4"),
+
+       /* TX widgets */
+       SND_SOC_DAPM_ADC_E("ADC3", NULL, SND_SOC_NOPM, 2, 0,
+                          wcd937x_codec_enable_adc,
+                          SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
+
+       SND_SOC_DAPM_MIXER_E("ADC3 REQ", SND_SOC_NOPM, 0, 0,
+                            NULL, 0, wcd937x_enable_req,
+                            SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
+
+       SND_SOC_DAPM_ADC_E("DMIC1", NULL, SND_SOC_NOPM, 0, 0,
+                          wcd937x_codec_enable_dmic,
+                          SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
+       SND_SOC_DAPM_ADC_E("DMIC2", NULL, SND_SOC_NOPM, 1, 0,
+                          wcd937x_codec_enable_dmic,
+                          SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
+       SND_SOC_DAPM_ADC_E("DMIC3", NULL, SND_SOC_NOPM, 2, 0,
+                          wcd937x_codec_enable_dmic,
+                          SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
+       SND_SOC_DAPM_ADC_E("DMIC4", NULL, SND_SOC_NOPM, 3, 0,
+                          wcd937x_codec_enable_dmic,
+                          SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
+       SND_SOC_DAPM_ADC_E("DMIC5", NULL, SND_SOC_NOPM, 4, 0,
+                          wcd937x_codec_enable_dmic,
+                          SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
+       SND_SOC_DAPM_ADC_E("DMIC6", NULL, SND_SOC_NOPM, 5, 0,
+                          wcd937x_codec_enable_dmic,
+                          SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
+
+       /* TX mixer widgets */
+       SND_SOC_DAPM_MIXER_E("DMIC1_MIXER", SND_SOC_NOPM, 0,
+                            0, dmic1_switch, ARRAY_SIZE(dmic1_switch),
+                            wcd937x_tx_swr_ctrl, SND_SOC_DAPM_PRE_PMU |
+                            SND_SOC_DAPM_POST_PMD),
+       SND_SOC_DAPM_MIXER_E("DMIC2_MIXER", SND_SOC_NOPM, 1,
+                            0, dmic2_switch, ARRAY_SIZE(dmic2_switch),
+                            wcd937x_tx_swr_ctrl, SND_SOC_DAPM_PRE_PMU |
+                            SND_SOC_DAPM_POST_PMD),
+       SND_SOC_DAPM_MIXER_E("DMIC3_MIXER", SND_SOC_NOPM, 2,
+                            0, dmic3_switch, ARRAY_SIZE(dmic3_switch),
+                            wcd937x_tx_swr_ctrl, SND_SOC_DAPM_PRE_PMU |
+                            SND_SOC_DAPM_POST_PMD),
+       SND_SOC_DAPM_MIXER_E("DMIC4_MIXER", SND_SOC_NOPM, 3,
+                            0, dmic4_switch, ARRAY_SIZE(dmic4_switch),
+                            wcd937x_tx_swr_ctrl, SND_SOC_DAPM_PRE_PMU |
+                            SND_SOC_DAPM_POST_PMD),
+       SND_SOC_DAPM_MIXER_E("DMIC5_MIXER", SND_SOC_NOPM, 4,
+                            0, dmic5_switch, ARRAY_SIZE(dmic5_switch),
+                            wcd937x_tx_swr_ctrl, SND_SOC_DAPM_PRE_PMU |
+                            SND_SOC_DAPM_POST_PMD),
+       SND_SOC_DAPM_MIXER_E("DMIC6_MIXER", SND_SOC_NOPM, 5,
+                            0, dmic6_switch, ARRAY_SIZE(dmic6_switch),
+                            wcd937x_tx_swr_ctrl, SND_SOC_DAPM_PRE_PMU |
+                            SND_SOC_DAPM_POST_PMD),
+       SND_SOC_DAPM_MIXER_E("ADC3_MIXER", SND_SOC_NOPM, 2, 0, adc3_switch,
+                            ARRAY_SIZE(adc3_switch), wcd937x_tx_swr_ctrl,
+                            SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
+
+       /* Output widgets */
+       SND_SOC_DAPM_OUTPUT("DMIC1_OUTPUT"),
+       SND_SOC_DAPM_OUTPUT("DMIC2_OUTPUT"),
+       SND_SOC_DAPM_OUTPUT("DMIC3_OUTPUT"),
+       SND_SOC_DAPM_OUTPUT("DMIC4_OUTPUT"),
+       SND_SOC_DAPM_OUTPUT("DMIC5_OUTPUT"),
+       SND_SOC_DAPM_OUTPUT("DMIC6_OUTPUT"),
 };
 
 static int wcd937x_set_micbias_data(struct wcd937x_priv *wcd937x)
@@ -2143,6 +2538,15 @@ static int wcd937x_soc_codec_probe(struct snd_soc_component *component)
        disable_irq_nosync(wcd937x->hphl_pdm_wd_int);
        disable_irq_nosync(wcd937x->aux_pdm_wd_int);
 
+       if (wcd937x->chipid == CHIPID_WCD9375) {
+               ret = snd_soc_dapm_new_controls(dapm, wcd9375_dapm_widgets,
+                                               ARRAY_SIZE(wcd9375_dapm_widgets));
+               if (ret < 0) {
+                       dev_err(component->dev, "Failed to add snd_ctls\n");
+                       return ret;
+               }
+       }
+
        ret = wcd937x_mbhc_init(component);
        if (ret)
                dev_err(component->dev, "mbhc initialization failed\n");