ASoC: codecs: lpass-tx-macro: add dapm widgets and route
authorSrinivas Kandagatla <srinivas.kandagatla@linaro.org>
Thu, 11 Feb 2021 12:27:35 +0000 (12:27 +0000)
committerMark Brown <broonie@kernel.org>
Thu, 11 Feb 2021 13:11:33 +0000 (13:11 +0000)
This patch adds dapm widgets and routes on this codec

Signed-off-by: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
Link: https://lore.kernel.org/r/20210211122735.5691-8-srinivas.kandagatla@linaro.org
Signed-off-by: Mark Brown <broonie@kernel.org>
sound/soc/codecs/lpass-tx-macro.c

index 06589da..36d7a64 100644 (file)
@@ -706,6 +706,289 @@ static void tx_macro_mute_update_callback(struct work_struct *work)
                                      CDC_TXn_PGA_MUTE_MASK, 0x0);
 }
 
+static int tx_macro_mclk_event(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 tx_macro *tx = snd_soc_component_get_drvdata(component);
+
+       switch (event) {
+       case SND_SOC_DAPM_PRE_PMU:
+               tx_macro_mclk_enable(tx, true);
+               break;
+       case SND_SOC_DAPM_POST_PMD:
+               tx_macro_mclk_enable(tx, false);
+               break;
+       default:
+               break;
+       }
+
+       return 0;
+}
+
+static int tx_macro_put_dec_enum(struct snd_kcontrol *kcontrol,
+                                struct snd_ctl_elem_value *ucontrol)
+{
+       struct snd_soc_dapm_widget *widget = snd_soc_dapm_kcontrol_widget(kcontrol);
+       struct snd_soc_component *component = snd_soc_dapm_to_component(widget->dapm);
+       struct soc_enum *e = (struct soc_enum *)kcontrol->private_value;
+       unsigned int val, dmic;
+       u16 mic_sel_reg;
+       u16 dmic_clk_reg;
+       struct tx_macro *tx = snd_soc_component_get_drvdata(component);
+
+       val = ucontrol->value.enumerated.item[0];
+
+       switch (e->reg) {
+       case CDC_TX_INP_MUX_ADC_MUX0_CFG0:
+               mic_sel_reg = CDC_TX0_TX_PATH_CFG0;
+               break;
+       case CDC_TX_INP_MUX_ADC_MUX1_CFG0:
+               mic_sel_reg = CDC_TX1_TX_PATH_CFG0;
+               break;
+       case CDC_TX_INP_MUX_ADC_MUX2_CFG0:
+               mic_sel_reg = CDC_TX2_TX_PATH_CFG0;
+               break;
+       case CDC_TX_INP_MUX_ADC_MUX3_CFG0:
+               mic_sel_reg = CDC_TX3_TX_PATH_CFG0;
+               break;
+       case CDC_TX_INP_MUX_ADC_MUX4_CFG0:
+               mic_sel_reg = CDC_TX4_TX_PATH_CFG0;
+               break;
+       case CDC_TX_INP_MUX_ADC_MUX5_CFG0:
+               mic_sel_reg = CDC_TX5_TX_PATH_CFG0;
+               break;
+       case CDC_TX_INP_MUX_ADC_MUX6_CFG0:
+               mic_sel_reg = CDC_TX6_TX_PATH_CFG0;
+               break;
+       case CDC_TX_INP_MUX_ADC_MUX7_CFG0:
+               mic_sel_reg = CDC_TX7_TX_PATH_CFG0;
+               break;
+       }
+
+       if (val != 0) {
+               if (val < 5) {
+                       snd_soc_component_write_field(component, mic_sel_reg,
+                                                     CDC_TXn_ADC_DMIC_SEL_MASK, 0);
+               } else {
+                       snd_soc_component_write_field(component, mic_sel_reg,
+                                                     CDC_TXn_ADC_DMIC_SEL_MASK, 1);
+                       dmic = TX_ADC_TO_DMIC(val);
+                       dmic_clk_reg = CDC_TX_TOP_CSR_SWR_DMICn_CTL(dmic);
+                       snd_soc_component_write_field(component, dmic_clk_reg,
+                                               CDC_TX_SWR_DMIC_CLK_SEL_MASK,
+                                               tx->dmic_clk_div);
+               }
+       }
+
+       return snd_soc_dapm_put_enum_double(kcontrol, ucontrol);
+}
+
+static int tx_macro_tx_mixer_get(struct snd_kcontrol *kcontrol,
+                                struct snd_ctl_elem_value *ucontrol)
+{
+       struct snd_soc_dapm_widget *widget = snd_soc_dapm_kcontrol_widget(kcontrol);
+       struct snd_soc_component *component = snd_soc_dapm_to_component(widget->dapm);
+       struct soc_mixer_control *mc = (struct soc_mixer_control *)kcontrol->private_value;
+       u32 dai_id = widget->shift;
+       u32 dec_id = mc->shift;
+       struct tx_macro *tx = snd_soc_component_get_drvdata(component);
+
+       if (test_bit(dec_id, &tx->active_ch_mask[dai_id]))
+               ucontrol->value.integer.value[0] = 1;
+       else
+               ucontrol->value.integer.value[0] = 0;
+
+       return 0;
+}
+
+static int tx_macro_tx_mixer_put(struct snd_kcontrol *kcontrol,
+                                struct snd_ctl_elem_value *ucontrol)
+{
+       struct snd_soc_dapm_widget *widget = snd_soc_dapm_kcontrol_widget(kcontrol);
+       struct snd_soc_component *component = snd_soc_dapm_to_component(widget->dapm);
+       struct snd_soc_dapm_update *update = NULL;
+       struct soc_mixer_control *mc = (struct soc_mixer_control *)kcontrol->private_value;
+       u32 dai_id = widget->shift;
+       u32 dec_id = mc->shift;
+       u32 enable = ucontrol->value.integer.value[0];
+       struct tx_macro *tx = snd_soc_component_get_drvdata(component);
+
+       if (enable) {
+               set_bit(dec_id, &tx->active_ch_mask[dai_id]);
+               tx->active_ch_cnt[dai_id]++;
+               tx->active_decimator[dai_id] = dec_id;
+       } else {
+               tx->active_ch_cnt[dai_id]--;
+               clear_bit(dec_id, &tx->active_ch_mask[dai_id]);
+               tx->active_decimator[dai_id] = -1;
+       }
+       snd_soc_dapm_mixer_update_power(widget->dapm, kcontrol, enable, update);
+
+       return 0;
+}
+
+static int tx_macro_enable_dec(struct snd_soc_dapm_widget *w,
+                              struct snd_kcontrol *kcontrol, int event)
+{
+       struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm);
+       unsigned int decimator;
+       u16 tx_vol_ctl_reg, dec_cfg_reg, hpf_gate_reg, tx_gain_ctl_reg;
+       u8 hpf_cut_off_freq;
+       int hpf_delay = TX_MACRO_DMIC_HPF_DELAY_MS;
+       int unmute_delay = TX_MACRO_DMIC_UNMUTE_DELAY_MS;
+       u16 adc_mux_reg, adc_reg, adc_n, dmic;
+       u16 dmic_clk_reg;
+       struct tx_macro *tx = snd_soc_component_get_drvdata(component);
+
+       decimator = w->shift;
+       tx_vol_ctl_reg = CDC_TXn_TX_PATH_CTL(decimator);
+       hpf_gate_reg = CDC_TXn_TX_PATH_SEC2(decimator);
+       dec_cfg_reg = CDC_TXn_TX_PATH_CFG0(decimator);
+       tx_gain_ctl_reg = CDC_TXn_TX_VOL_CTL(decimator);
+
+       switch (event) {
+       case SND_SOC_DAPM_PRE_PMU:
+               adc_mux_reg = CDC_TX_INP_MUX_ADC_MUXn_CFG1(decimator);
+               if (snd_soc_component_read(component, adc_mux_reg) & SWR_MIC) {
+                       adc_reg = CDC_TX_INP_MUX_ADC_MUXn_CFG0(decimator);
+                       adc_n = snd_soc_component_read(component, adc_reg) &
+                               CDC_TX_MACRO_SWR_MIC_MUX_SEL_MASK;
+                       if (adc_n >= TX_ADC_MAX) {
+                               dmic = TX_ADC_TO_DMIC(adc_n);
+                               dmic_clk_reg = CDC_TX_TOP_CSR_SWR_DMICn_CTL(dmic);
+
+                               snd_soc_component_write_field(component, dmic_clk_reg,
+                                                       CDC_TX_SWR_DMIC_CLK_SEL_MASK,
+                                                       tx->dmic_clk_div);
+                       }
+               }
+               snd_soc_component_write_field(component, dec_cfg_reg,
+                                             CDC_TXn_ADC_MODE_MASK,
+                                             tx->dec_mode[decimator]);
+               /* Enable TX PGA Mute */
+               snd_soc_component_write_field(component, tx_vol_ctl_reg,
+                                             CDC_TXn_PGA_MUTE_MASK, 0x1);
+               break;
+       case SND_SOC_DAPM_POST_PMU:
+               snd_soc_component_write_field(component, tx_vol_ctl_reg,
+                                            CDC_TXn_CLK_EN_MASK, 0x1);
+               if (!is_amic_enabled(component, decimator)) {
+                       snd_soc_component_update_bits(component, hpf_gate_reg, 0x01, 0x00);
+                       /* Minimum 1 clk cycle delay is required as per HW spec */
+                       usleep_range(1000, 1010);
+               }
+               hpf_cut_off_freq = snd_soc_component_read_field(component, dec_cfg_reg,
+                                                               CDC_TXn_HPF_CUT_FREQ_MASK);
+
+               tx->tx_hpf_work[decimator].hpf_cut_off_freq =
+                                               hpf_cut_off_freq;
+
+               if (hpf_cut_off_freq != CF_MIN_3DB_150HZ)
+                       snd_soc_component_write_field(component, dec_cfg_reg,
+                                                     CDC_TXn_HPF_CUT_FREQ_MASK,
+                                                     CF_MIN_3DB_150HZ);
+
+               if (is_amic_enabled(component, decimator)) {
+                       hpf_delay = TX_MACRO_AMIC_HPF_DELAY_MS;
+                       unmute_delay = TX_MACRO_AMIC_UNMUTE_DELAY_MS;
+               }
+               /* schedule work queue to Remove Mute */
+               queue_delayed_work(system_freezable_wq,
+                                  &tx->tx_mute_dwork[decimator].dwork,
+                                  msecs_to_jiffies(unmute_delay));
+               if (tx->tx_hpf_work[decimator].hpf_cut_off_freq != CF_MIN_3DB_150HZ) {
+                       queue_delayed_work(system_freezable_wq,
+                               &tx->tx_hpf_work[decimator].dwork,
+                               msecs_to_jiffies(hpf_delay));
+                       snd_soc_component_update_bits(component, hpf_gate_reg,
+                                             CDC_TXn_HPF_F_CHANGE_MASK |
+                                             CDC_TXn_HPF_ZERO_GATE_MASK,
+                                             0x02);
+                       if (!is_amic_enabled(component, decimator))
+                               snd_soc_component_update_bits(component, hpf_gate_reg,
+                                                     CDC_TXn_HPF_F_CHANGE_MASK |
+                                                     CDC_TXn_HPF_ZERO_GATE_MASK,
+                                                     0x00);
+                       snd_soc_component_update_bits(component, hpf_gate_reg,
+                                             CDC_TXn_HPF_F_CHANGE_MASK |
+                                             CDC_TXn_HPF_ZERO_GATE_MASK,
+                                             0x01);
+
+                       /*
+                        * 6ms delay is required as per HW spec
+                        */
+                       usleep_range(6000, 6010);
+               }
+               /* apply gain after decimator is enabled */
+               snd_soc_component_write(component, tx_gain_ctl_reg,
+                             snd_soc_component_read(component,
+                                       tx_gain_ctl_reg));
+               if (tx->bcs_enable) {
+                       snd_soc_component_update_bits(component, dec_cfg_reg,
+                                       0x01, 0x01);
+                       tx->bcs_clk_en = true;
+               }
+               break;
+       case SND_SOC_DAPM_PRE_PMD:
+               hpf_cut_off_freq =
+                       tx->tx_hpf_work[decimator].hpf_cut_off_freq;
+               snd_soc_component_write_field(component, tx_vol_ctl_reg,
+                                             CDC_TXn_PGA_MUTE_MASK, 0x1);
+               if (cancel_delayed_work_sync(
+                   &tx->tx_hpf_work[decimator].dwork)) {
+                       if (hpf_cut_off_freq != CF_MIN_3DB_150HZ) {
+                               snd_soc_component_write_field(
+                                               component, dec_cfg_reg,
+                                               CDC_TXn_HPF_CUT_FREQ_MASK,
+                                               hpf_cut_off_freq);
+                               if (is_amic_enabled(component, decimator))
+                                       snd_soc_component_update_bits(component,
+                                             hpf_gate_reg,
+                                             CDC_TXn_HPF_F_CHANGE_MASK |
+                                             CDC_TXn_HPF_ZERO_GATE_MASK,
+                                             0x02);
+                               else
+                                       snd_soc_component_update_bits(component,
+                                             hpf_gate_reg,
+                                             CDC_TXn_HPF_F_CHANGE_MASK |
+                                             CDC_TXn_HPF_ZERO_GATE_MASK,
+                                             0x03);
+
+                               /*
+                                * Minimum 1 clk cycle delay is required
+                                * as per HW spec
+                                */
+                               usleep_range(1000, 1010);
+                               snd_soc_component_update_bits(component, hpf_gate_reg,
+                                             CDC_TXn_HPF_F_CHANGE_MASK |
+                                             CDC_TXn_HPF_ZERO_GATE_MASK,
+                                             0x1);
+                       }
+               }
+               cancel_delayed_work_sync(&tx->tx_mute_dwork[decimator].dwork);
+               break;
+       case SND_SOC_DAPM_POST_PMD:
+               snd_soc_component_write_field(component, tx_vol_ctl_reg,
+                                             CDC_TXn_CLK_EN_MASK, 0x0);
+               snd_soc_component_write_field(component, dec_cfg_reg,
+                                             CDC_TXn_ADC_MODE_MASK, 0x0);
+               snd_soc_component_write_field(component, tx_vol_ctl_reg,
+                                             CDC_TXn_PGA_MUTE_MASK, 0x0);
+               if (tx->bcs_enable) {
+                       snd_soc_component_write_field(component, dec_cfg_reg,
+                                                     CDC_TXn_PH_EN_MASK, 0x0);
+                       snd_soc_component_write_field(component,
+                                                     CDC_TX0_TX_PATH_SEC7,
+                                                     CDC_TX0_MBHC_CTL_EN_MASK,
+                                                     0x0);
+                       tx->bcs_clk_en = false;
+               }
+               break;
+       }
+       return 0;
+}
+
 static int tx_macro_dec_mode_get(struct snd_kcontrol *kcontrol,
                                 struct snd_ctl_elem_value *ucontrol)
 {
@@ -892,6 +1175,83 @@ static struct snd_soc_dai_driver tx_macro_dai[] = {
        },
 };
 
+static const char * const adc_mux_text[] = {
+       "MSM_DMIC", "SWR_MIC", "ANC_FB_TUNE1"
+};
+
+static SOC_ENUM_SINGLE_DECL(tx_dec0_enum, CDC_TX_INP_MUX_ADC_MUX0_CFG1,
+                  0, adc_mux_text);
+static SOC_ENUM_SINGLE_DECL(tx_dec1_enum, CDC_TX_INP_MUX_ADC_MUX1_CFG1,
+                  0, adc_mux_text);
+static SOC_ENUM_SINGLE_DECL(tx_dec2_enum, CDC_TX_INP_MUX_ADC_MUX2_CFG1,
+                  0, adc_mux_text);
+static SOC_ENUM_SINGLE_DECL(tx_dec3_enum, CDC_TX_INP_MUX_ADC_MUX3_CFG1,
+                  0, adc_mux_text);
+static SOC_ENUM_SINGLE_DECL(tx_dec4_enum, CDC_TX_INP_MUX_ADC_MUX4_CFG1,
+                  0, adc_mux_text);
+static SOC_ENUM_SINGLE_DECL(tx_dec5_enum, CDC_TX_INP_MUX_ADC_MUX5_CFG1,
+                  0, adc_mux_text);
+static SOC_ENUM_SINGLE_DECL(tx_dec6_enum, CDC_TX_INP_MUX_ADC_MUX6_CFG1,
+                  0, adc_mux_text);
+static SOC_ENUM_SINGLE_DECL(tx_dec7_enum, CDC_TX_INP_MUX_ADC_MUX7_CFG1,
+                  0, adc_mux_text);
+
+static const struct snd_kcontrol_new tx_dec0_mux = SOC_DAPM_ENUM("tx_dec0", tx_dec0_enum);
+static const struct snd_kcontrol_new tx_dec1_mux = SOC_DAPM_ENUM("tx_dec1", tx_dec1_enum);
+static const struct snd_kcontrol_new tx_dec2_mux = SOC_DAPM_ENUM("tx_dec2", tx_dec2_enum);
+static const struct snd_kcontrol_new tx_dec3_mux = SOC_DAPM_ENUM("tx_dec3", tx_dec3_enum);
+static const struct snd_kcontrol_new tx_dec4_mux = SOC_DAPM_ENUM("tx_dec4", tx_dec4_enum);
+static const struct snd_kcontrol_new tx_dec5_mux = SOC_DAPM_ENUM("tx_dec5", tx_dec5_enum);
+static const struct snd_kcontrol_new tx_dec6_mux = SOC_DAPM_ENUM("tx_dec6", tx_dec6_enum);
+static const struct snd_kcontrol_new tx_dec7_mux = SOC_DAPM_ENUM("tx_dec7", tx_dec7_enum);
+
+static const char * const smic_mux_text[] = {
+       "ZERO", "ADC0", "ADC1", "ADC2", "ADC3", "SWR_DMIC0",
+       "SWR_DMIC1", "SWR_DMIC2", "SWR_DMIC3", "SWR_DMIC4",
+       "SWR_DMIC5", "SWR_DMIC6", "SWR_DMIC7"
+};
+
+static SOC_ENUM_SINGLE_DECL(tx_smic0_enum, CDC_TX_INP_MUX_ADC_MUX0_CFG0,
+                       0, smic_mux_text);
+
+static SOC_ENUM_SINGLE_DECL(tx_smic1_enum, CDC_TX_INP_MUX_ADC_MUX1_CFG0,
+                       0, smic_mux_text);
+
+static SOC_ENUM_SINGLE_DECL(tx_smic2_enum, CDC_TX_INP_MUX_ADC_MUX2_CFG0,
+                       0, smic_mux_text);
+
+static SOC_ENUM_SINGLE_DECL(tx_smic3_enum, CDC_TX_INP_MUX_ADC_MUX3_CFG0,
+                       0, smic_mux_text);
+
+static SOC_ENUM_SINGLE_DECL(tx_smic4_enum, CDC_TX_INP_MUX_ADC_MUX4_CFG0,
+                       0, smic_mux_text);
+
+static SOC_ENUM_SINGLE_DECL(tx_smic5_enum, CDC_TX_INP_MUX_ADC_MUX5_CFG0,
+                       0, smic_mux_text);
+
+static SOC_ENUM_SINGLE_DECL(tx_smic6_enum, CDC_TX_INP_MUX_ADC_MUX6_CFG0,
+                       0, smic_mux_text);
+
+static SOC_ENUM_SINGLE_DECL(tx_smic7_enum, CDC_TX_INP_MUX_ADC_MUX7_CFG0,
+                       0, smic_mux_text);
+
+static const struct snd_kcontrol_new tx_smic0_mux = SOC_DAPM_ENUM_EXT("tx_smic0", tx_smic0_enum,
+                       snd_soc_dapm_get_enum_double, tx_macro_put_dec_enum);
+static const struct snd_kcontrol_new tx_smic1_mux = SOC_DAPM_ENUM_EXT("tx_smic1", tx_smic1_enum,
+                       snd_soc_dapm_get_enum_double, tx_macro_put_dec_enum);
+static const struct snd_kcontrol_new tx_smic2_mux = SOC_DAPM_ENUM_EXT("tx_smic2", tx_smic2_enum,
+                       snd_soc_dapm_get_enum_double, tx_macro_put_dec_enum);
+static const struct snd_kcontrol_new tx_smic3_mux = SOC_DAPM_ENUM_EXT("tx_smic3", tx_smic3_enum,
+                       snd_soc_dapm_get_enum_double, tx_macro_put_dec_enum);
+static const struct snd_kcontrol_new tx_smic4_mux = SOC_DAPM_ENUM_EXT("tx_smic4", tx_smic4_enum,
+                       snd_soc_dapm_get_enum_double, tx_macro_put_dec_enum);
+static const struct snd_kcontrol_new tx_smic5_mux = SOC_DAPM_ENUM_EXT("tx_smic5", tx_smic5_enum,
+                       snd_soc_dapm_get_enum_double, tx_macro_put_dec_enum);
+static const struct snd_kcontrol_new tx_smic6_mux = SOC_DAPM_ENUM_EXT("tx_smic6", tx_smic6_enum,
+                       snd_soc_dapm_get_enum_double, tx_macro_put_dec_enum);
+static const struct snd_kcontrol_new tx_smic7_mux = SOC_DAPM_ENUM_EXT("tx_smic7", tx_smic7_enum,
+                       snd_soc_dapm_get_enum_double, tx_macro_put_dec_enum);
+
 static const char * const dec_mode_mux_text[] = {
        "ADC_DEFAULT", "ADC_LOW_PWR", "ADC_HIGH_PERF",
 };
@@ -915,6 +1275,327 @@ static const struct soc_enum dec_mode_mux_enum[] = {
                        dec_mode_mux_text),
 };
 
+static const struct snd_kcontrol_new tx_aif1_cap_mixer[] = {
+       SOC_SINGLE_EXT("DEC0", SND_SOC_NOPM, TX_MACRO_DEC0, 1, 0,
+                       tx_macro_tx_mixer_get, tx_macro_tx_mixer_put),
+       SOC_SINGLE_EXT("DEC1", SND_SOC_NOPM, TX_MACRO_DEC1, 1, 0,
+                       tx_macro_tx_mixer_get, tx_macro_tx_mixer_put),
+       SOC_SINGLE_EXT("DEC2", SND_SOC_NOPM, TX_MACRO_DEC2, 1, 0,
+                       tx_macro_tx_mixer_get, tx_macro_tx_mixer_put),
+       SOC_SINGLE_EXT("DEC3", SND_SOC_NOPM, TX_MACRO_DEC3, 1, 0,
+                       tx_macro_tx_mixer_get, tx_macro_tx_mixer_put),
+       SOC_SINGLE_EXT("DEC4", SND_SOC_NOPM, TX_MACRO_DEC4, 1, 0,
+                       tx_macro_tx_mixer_get, tx_macro_tx_mixer_put),
+       SOC_SINGLE_EXT("DEC5", SND_SOC_NOPM, TX_MACRO_DEC5, 1, 0,
+                       tx_macro_tx_mixer_get, tx_macro_tx_mixer_put),
+       SOC_SINGLE_EXT("DEC6", SND_SOC_NOPM, TX_MACRO_DEC6, 1, 0,
+                       tx_macro_tx_mixer_get, tx_macro_tx_mixer_put),
+       SOC_SINGLE_EXT("DEC7", SND_SOC_NOPM, TX_MACRO_DEC7, 1, 0,
+                       tx_macro_tx_mixer_get, tx_macro_tx_mixer_put),
+};
+
+static const struct snd_kcontrol_new tx_aif2_cap_mixer[] = {
+       SOC_SINGLE_EXT("DEC0", SND_SOC_NOPM, TX_MACRO_DEC0, 1, 0,
+                       tx_macro_tx_mixer_get, tx_macro_tx_mixer_put),
+       SOC_SINGLE_EXT("DEC1", SND_SOC_NOPM, TX_MACRO_DEC1, 1, 0,
+                       tx_macro_tx_mixer_get, tx_macro_tx_mixer_put),
+       SOC_SINGLE_EXT("DEC2", SND_SOC_NOPM, TX_MACRO_DEC2, 1, 0,
+                       tx_macro_tx_mixer_get, tx_macro_tx_mixer_put),
+       SOC_SINGLE_EXT("DEC3", SND_SOC_NOPM, TX_MACRO_DEC3, 1, 0,
+                       tx_macro_tx_mixer_get, tx_macro_tx_mixer_put),
+       SOC_SINGLE_EXT("DEC4", SND_SOC_NOPM, TX_MACRO_DEC4, 1, 0,
+                       tx_macro_tx_mixer_get, tx_macro_tx_mixer_put),
+       SOC_SINGLE_EXT("DEC5", SND_SOC_NOPM, TX_MACRO_DEC5, 1, 0,
+                       tx_macro_tx_mixer_get, tx_macro_tx_mixer_put),
+       SOC_SINGLE_EXT("DEC6", SND_SOC_NOPM, TX_MACRO_DEC6, 1, 0,
+                       tx_macro_tx_mixer_get, tx_macro_tx_mixer_put),
+       SOC_SINGLE_EXT("DEC7", SND_SOC_NOPM, TX_MACRO_DEC7, 1, 0,
+                       tx_macro_tx_mixer_get, tx_macro_tx_mixer_put),
+};
+
+static const struct snd_kcontrol_new tx_aif3_cap_mixer[] = {
+       SOC_SINGLE_EXT("DEC0", SND_SOC_NOPM, TX_MACRO_DEC0, 1, 0,
+                       tx_macro_tx_mixer_get, tx_macro_tx_mixer_put),
+       SOC_SINGLE_EXT("DEC1", SND_SOC_NOPM, TX_MACRO_DEC1, 1, 0,
+                       tx_macro_tx_mixer_get, tx_macro_tx_mixer_put),
+       SOC_SINGLE_EXT("DEC2", SND_SOC_NOPM, TX_MACRO_DEC2, 1, 0,
+                       tx_macro_tx_mixer_get, tx_macro_tx_mixer_put),
+       SOC_SINGLE_EXT("DEC3", SND_SOC_NOPM, TX_MACRO_DEC3, 1, 0,
+                       tx_macro_tx_mixer_get, tx_macro_tx_mixer_put),
+       SOC_SINGLE_EXT("DEC4", SND_SOC_NOPM, TX_MACRO_DEC4, 1, 0,
+                       tx_macro_tx_mixer_get, tx_macro_tx_mixer_put),
+       SOC_SINGLE_EXT("DEC5", SND_SOC_NOPM, TX_MACRO_DEC5, 1, 0,
+                       tx_macro_tx_mixer_get, tx_macro_tx_mixer_put),
+       SOC_SINGLE_EXT("DEC6", SND_SOC_NOPM, TX_MACRO_DEC6, 1, 0,
+                       tx_macro_tx_mixer_get, tx_macro_tx_mixer_put),
+       SOC_SINGLE_EXT("DEC7", SND_SOC_NOPM, TX_MACRO_DEC7, 1, 0,
+                       tx_macro_tx_mixer_get, tx_macro_tx_mixer_put),
+};
+
+static const struct snd_soc_dapm_widget tx_macro_dapm_widgets[] = {
+       SND_SOC_DAPM_AIF_OUT("TX_AIF1 CAP", "TX_AIF1 Capture", 0,
+               SND_SOC_NOPM, TX_MACRO_AIF1_CAP, 0),
+
+       SND_SOC_DAPM_AIF_OUT("TX_AIF2 CAP", "TX_AIF2 Capture", 0,
+               SND_SOC_NOPM, TX_MACRO_AIF2_CAP, 0),
+
+       SND_SOC_DAPM_AIF_OUT("TX_AIF3 CAP", "TX_AIF3 Capture", 0,
+               SND_SOC_NOPM, TX_MACRO_AIF3_CAP, 0),
+
+       SND_SOC_DAPM_MIXER("TX_AIF1_CAP Mixer", SND_SOC_NOPM, TX_MACRO_AIF1_CAP, 0,
+               tx_aif1_cap_mixer, ARRAY_SIZE(tx_aif1_cap_mixer)),
+
+       SND_SOC_DAPM_MIXER("TX_AIF2_CAP Mixer", SND_SOC_NOPM, TX_MACRO_AIF2_CAP, 0,
+               tx_aif2_cap_mixer, ARRAY_SIZE(tx_aif2_cap_mixer)),
+
+       SND_SOC_DAPM_MIXER("TX_AIF3_CAP Mixer", SND_SOC_NOPM, TX_MACRO_AIF3_CAP, 0,
+               tx_aif3_cap_mixer, ARRAY_SIZE(tx_aif3_cap_mixer)),
+
+       SND_SOC_DAPM_MUX("TX SMIC MUX0", SND_SOC_NOPM, 0, 0, &tx_smic0_mux),
+       SND_SOC_DAPM_MUX("TX SMIC MUX1", SND_SOC_NOPM, 0, 0, &tx_smic1_mux),
+       SND_SOC_DAPM_MUX("TX SMIC MUX2", SND_SOC_NOPM, 0, 0, &tx_smic2_mux),
+       SND_SOC_DAPM_MUX("TX SMIC MUX3", SND_SOC_NOPM, 0, 0, &tx_smic3_mux),
+       SND_SOC_DAPM_MUX("TX SMIC MUX4", SND_SOC_NOPM, 0, 0, &tx_smic4_mux),
+       SND_SOC_DAPM_MUX("TX SMIC MUX5", SND_SOC_NOPM, 0, 0, &tx_smic5_mux),
+       SND_SOC_DAPM_MUX("TX SMIC MUX6", SND_SOC_NOPM, 0, 0, &tx_smic6_mux),
+       SND_SOC_DAPM_MUX("TX SMIC MUX7", SND_SOC_NOPM, 0, 0, &tx_smic7_mux),
+
+       SND_SOC_DAPM_INPUT("TX SWR_ADC0"),
+       SND_SOC_DAPM_INPUT("TX SWR_ADC1"),
+       SND_SOC_DAPM_INPUT("TX SWR_ADC2"),
+       SND_SOC_DAPM_INPUT("TX SWR_ADC3"),
+       SND_SOC_DAPM_INPUT("TX SWR_DMIC0"),
+       SND_SOC_DAPM_INPUT("TX SWR_DMIC1"),
+       SND_SOC_DAPM_INPUT("TX SWR_DMIC2"),
+       SND_SOC_DAPM_INPUT("TX SWR_DMIC3"),
+       SND_SOC_DAPM_INPUT("TX SWR_DMIC4"),
+       SND_SOC_DAPM_INPUT("TX SWR_DMIC5"),
+       SND_SOC_DAPM_INPUT("TX SWR_DMIC6"),
+       SND_SOC_DAPM_INPUT("TX SWR_DMIC7"),
+
+       SND_SOC_DAPM_MUX_E("TX DEC0 MUX", SND_SOC_NOPM,
+                          TX_MACRO_DEC0, 0,
+                          &tx_dec0_mux, tx_macro_enable_dec,
+                          SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
+                          SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD),
+
+       SND_SOC_DAPM_MUX_E("TX DEC1 MUX", SND_SOC_NOPM,
+                          TX_MACRO_DEC1, 0,
+                          &tx_dec1_mux, tx_macro_enable_dec,
+                          SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
+                          SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD),
+
+       SND_SOC_DAPM_MUX_E("TX DEC2 MUX", SND_SOC_NOPM,
+                          TX_MACRO_DEC2, 0,
+                          &tx_dec2_mux, tx_macro_enable_dec,
+                          SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
+                          SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD),
+
+       SND_SOC_DAPM_MUX_E("TX DEC3 MUX", SND_SOC_NOPM,
+                          TX_MACRO_DEC3, 0,
+                          &tx_dec3_mux, tx_macro_enable_dec,
+                          SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
+                          SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD),
+
+       SND_SOC_DAPM_MUX_E("TX DEC4 MUX", SND_SOC_NOPM,
+                          TX_MACRO_DEC4, 0,
+                          &tx_dec4_mux, tx_macro_enable_dec,
+                          SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
+                          SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD),
+
+       SND_SOC_DAPM_MUX_E("TX DEC5 MUX", SND_SOC_NOPM,
+                          TX_MACRO_DEC5, 0,
+                          &tx_dec5_mux, tx_macro_enable_dec,
+                          SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
+                          SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD),
+
+       SND_SOC_DAPM_MUX_E("TX DEC6 MUX", SND_SOC_NOPM,
+                          TX_MACRO_DEC6, 0,
+                          &tx_dec6_mux, tx_macro_enable_dec,
+                          SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
+                          SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD),
+
+       SND_SOC_DAPM_MUX_E("TX DEC7 MUX", SND_SOC_NOPM,
+                          TX_MACRO_DEC7, 0,
+                          &tx_dec7_mux, tx_macro_enable_dec,
+                          SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
+                          SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD),
+
+       SND_SOC_DAPM_SUPPLY_S("TX_MCLK", 0, SND_SOC_NOPM, 0, 0,
+       tx_macro_mclk_event, SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
+
+       SND_SOC_DAPM_SUPPLY_S("TX_SWR_CLK", 0, SND_SOC_NOPM, 0, 0, NULL, 0),
+
+       SND_SOC_DAPM_SUPPLY_S("VA_SWR_CLK", 0, SND_SOC_NOPM, 0, 0,
+                       NULL, 0),
+};
+
+static const struct snd_soc_dapm_route tx_audio_map[] = {
+       {"TX_AIF1 CAP", NULL, "TX_MCLK"},
+       {"TX_AIF2 CAP", NULL, "TX_MCLK"},
+       {"TX_AIF3 CAP", NULL, "TX_MCLK"},
+
+       {"TX_AIF1 CAP", NULL, "TX_AIF1_CAP Mixer"},
+       {"TX_AIF2 CAP", NULL, "TX_AIF2_CAP Mixer"},
+       {"TX_AIF3 CAP", NULL, "TX_AIF3_CAP Mixer"},
+
+       {"TX_AIF1_CAP Mixer", "DEC0", "TX DEC0 MUX"},
+       {"TX_AIF1_CAP Mixer", "DEC1", "TX DEC1 MUX"},
+       {"TX_AIF1_CAP Mixer", "DEC2", "TX DEC2 MUX"},
+       {"TX_AIF1_CAP Mixer", "DEC3", "TX DEC3 MUX"},
+       {"TX_AIF1_CAP Mixer", "DEC4", "TX DEC4 MUX"},
+       {"TX_AIF1_CAP Mixer", "DEC5", "TX DEC5 MUX"},
+       {"TX_AIF1_CAP Mixer", "DEC6", "TX DEC6 MUX"},
+       {"TX_AIF1_CAP Mixer", "DEC7", "TX DEC7 MUX"},
+
+       {"TX_AIF2_CAP Mixer", "DEC0", "TX DEC0 MUX"},
+       {"TX_AIF2_CAP Mixer", "DEC1", "TX DEC1 MUX"},
+       {"TX_AIF2_CAP Mixer", "DEC2", "TX DEC2 MUX"},
+       {"TX_AIF2_CAP Mixer", "DEC3", "TX DEC3 MUX"},
+       {"TX_AIF2_CAP Mixer", "DEC4", "TX DEC4 MUX"},
+       {"TX_AIF2_CAP Mixer", "DEC5", "TX DEC5 MUX"},
+       {"TX_AIF2_CAP Mixer", "DEC6", "TX DEC6 MUX"},
+       {"TX_AIF2_CAP Mixer", "DEC7", "TX DEC7 MUX"},
+
+       {"TX_AIF3_CAP Mixer", "DEC0", "TX DEC0 MUX"},
+       {"TX_AIF3_CAP Mixer", "DEC1", "TX DEC1 MUX"},
+       {"TX_AIF3_CAP Mixer", "DEC2", "TX DEC2 MUX"},
+       {"TX_AIF3_CAP Mixer", "DEC3", "TX DEC3 MUX"},
+       {"TX_AIF3_CAP Mixer", "DEC4", "TX DEC4 MUX"},
+       {"TX_AIF3_CAP Mixer", "DEC5", "TX DEC5 MUX"},
+       {"TX_AIF3_CAP Mixer", "DEC6", "TX DEC6 MUX"},
+       {"TX_AIF3_CAP Mixer", "DEC7", "TX DEC7 MUX"},
+
+       {"TX DEC0 MUX", NULL, "TX_MCLK"},
+       {"TX DEC1 MUX", NULL, "TX_MCLK"},
+       {"TX DEC2 MUX", NULL, "TX_MCLK"},
+       {"TX DEC3 MUX", NULL, "TX_MCLK"},
+       {"TX DEC4 MUX", NULL, "TX_MCLK"},
+       {"TX DEC5 MUX", NULL, "TX_MCLK"},
+       {"TX DEC6 MUX", NULL, "TX_MCLK"},
+       {"TX DEC7 MUX", NULL, "TX_MCLK"},
+
+       {"TX DEC0 MUX", "SWR_MIC", "TX SMIC MUX0"},
+       {"TX SMIC MUX0", NULL, "TX_SWR_CLK"},
+       {"TX SMIC MUX0", "ADC0", "TX SWR_ADC0"},
+       {"TX SMIC MUX0", "ADC1", "TX SWR_ADC1"},
+       {"TX SMIC MUX0", "ADC2", "TX SWR_ADC2"},
+       {"TX SMIC MUX0", "ADC3", "TX SWR_ADC3"},
+       {"TX SMIC MUX0", "SWR_DMIC0", "TX SWR_DMIC0"},
+       {"TX SMIC MUX0", "SWR_DMIC1", "TX SWR_DMIC1"},
+       {"TX SMIC MUX0", "SWR_DMIC2", "TX SWR_DMIC2"},
+       {"TX SMIC MUX0", "SWR_DMIC3", "TX SWR_DMIC3"},
+       {"TX SMIC MUX0", "SWR_DMIC4", "TX SWR_DMIC4"},
+       {"TX SMIC MUX0", "SWR_DMIC5", "TX SWR_DMIC5"},
+       {"TX SMIC MUX0", "SWR_DMIC6", "TX SWR_DMIC6"},
+       {"TX SMIC MUX0", "SWR_DMIC7", "TX SWR_DMIC7"},
+
+       {"TX DEC1 MUX", "SWR_MIC", "TX SMIC MUX1"},
+       {"TX SMIC MUX1", NULL, "TX_SWR_CLK"},
+       {"TX SMIC MUX1", "ADC0", "TX SWR_ADC0"},
+       {"TX SMIC MUX1", "ADC1", "TX SWR_ADC1"},
+       {"TX SMIC MUX1", "ADC2", "TX SWR_ADC2"},
+       {"TX SMIC MUX1", "ADC3", "TX SWR_ADC3"},
+       {"TX SMIC MUX1", "SWR_DMIC0", "TX SWR_DMIC0"},
+       {"TX SMIC MUX1", "SWR_DMIC1", "TX SWR_DMIC1"},
+       {"TX SMIC MUX1", "SWR_DMIC2", "TX SWR_DMIC2"},
+       {"TX SMIC MUX1", "SWR_DMIC3", "TX SWR_DMIC3"},
+       {"TX SMIC MUX1", "SWR_DMIC4", "TX SWR_DMIC4"},
+       {"TX SMIC MUX1", "SWR_DMIC5", "TX SWR_DMIC5"},
+       {"TX SMIC MUX1", "SWR_DMIC6", "TX SWR_DMIC6"},
+       {"TX SMIC MUX1", "SWR_DMIC7", "TX SWR_DMIC7"},
+
+       {"TX DEC2 MUX", "SWR_MIC", "TX SMIC MUX2"},
+       {"TX SMIC MUX2", NULL, "TX_SWR_CLK"},
+       {"TX SMIC MUX2", "ADC0", "TX SWR_ADC0"},
+       {"TX SMIC MUX2", "ADC1", "TX SWR_ADC1"},
+       {"TX SMIC MUX2", "ADC2", "TX SWR_ADC2"},
+       {"TX SMIC MUX2", "ADC3", "TX SWR_ADC3"},
+       {"TX SMIC MUX2", "SWR_DMIC0", "TX SWR_DMIC0"},
+       {"TX SMIC MUX2", "SWR_DMIC1", "TX SWR_DMIC1"},
+       {"TX SMIC MUX2", "SWR_DMIC2", "TX SWR_DMIC2"},
+       {"TX SMIC MUX2", "SWR_DMIC3", "TX SWR_DMIC3"},
+       {"TX SMIC MUX2", "SWR_DMIC4", "TX SWR_DMIC4"},
+       {"TX SMIC MUX2", "SWR_DMIC5", "TX SWR_DMIC5"},
+       {"TX SMIC MUX2", "SWR_DMIC6", "TX SWR_DMIC6"},
+       {"TX SMIC MUX2", "SWR_DMIC7", "TX SWR_DMIC7"},
+
+       {"TX DEC3 MUX", "SWR_MIC", "TX SMIC MUX3"},
+       {"TX SMIC MUX3", NULL, "TX_SWR_CLK"},
+       {"TX SMIC MUX3", "ADC0", "TX SWR_ADC0"},
+       {"TX SMIC MUX3", "ADC1", "TX SWR_ADC1"},
+       {"TX SMIC MUX3", "ADC2", "TX SWR_ADC2"},
+       {"TX SMIC MUX3", "ADC3", "TX SWR_ADC3"},
+       {"TX SMIC MUX3", "SWR_DMIC0", "TX SWR_DMIC0"},
+       {"TX SMIC MUX3", "SWR_DMIC1", "TX SWR_DMIC1"},
+       {"TX SMIC MUX3", "SWR_DMIC2", "TX SWR_DMIC2"},
+       {"TX SMIC MUX3", "SWR_DMIC3", "TX SWR_DMIC3"},
+       {"TX SMIC MUX3", "SWR_DMIC4", "TX SWR_DMIC4"},
+       {"TX SMIC MUX3", "SWR_DMIC5", "TX SWR_DMIC5"},
+       {"TX SMIC MUX3", "SWR_DMIC6", "TX SWR_DMIC6"},
+       {"TX SMIC MUX3", "SWR_DMIC7", "TX SWR_DMIC7"},
+
+       {"TX DEC4 MUX", "SWR_MIC", "TX SMIC MUX4"},
+       {"TX SMIC MUX4", NULL, "TX_SWR_CLK"},
+       {"TX SMIC MUX4", "ADC0", "TX SWR_ADC0"},
+       {"TX SMIC MUX4", "ADC1", "TX SWR_ADC1"},
+       {"TX SMIC MUX4", "ADC2", "TX SWR_ADC2"},
+       {"TX SMIC MUX4", "ADC3", "TX SWR_ADC3"},
+       {"TX SMIC MUX4", "SWR_DMIC0", "TX SWR_DMIC0"},
+       {"TX SMIC MUX4", "SWR_DMIC1", "TX SWR_DMIC1"},
+       {"TX SMIC MUX4", "SWR_DMIC2", "TX SWR_DMIC2"},
+       {"TX SMIC MUX4", "SWR_DMIC3", "TX SWR_DMIC3"},
+       {"TX SMIC MUX4", "SWR_DMIC4", "TX SWR_DMIC4"},
+       {"TX SMIC MUX4", "SWR_DMIC5", "TX SWR_DMIC5"},
+       {"TX SMIC MUX4", "SWR_DMIC6", "TX SWR_DMIC6"},
+       {"TX SMIC MUX4", "SWR_DMIC7", "TX SWR_DMIC7"},
+
+       {"TX DEC5 MUX", "SWR_MIC", "TX SMIC MUX5"},
+       {"TX SMIC MUX5", NULL, "TX_SWR_CLK"},
+       {"TX SMIC MUX5", "ADC0", "TX SWR_ADC0"},
+       {"TX SMIC MUX5", "ADC1", "TX SWR_ADC1"},
+       {"TX SMIC MUX5", "ADC2", "TX SWR_ADC2"},
+       {"TX SMIC MUX5", "ADC3", "TX SWR_ADC3"},
+       {"TX SMIC MUX5", "SWR_DMIC0", "TX SWR_DMIC0"},
+       {"TX SMIC MUX5", "SWR_DMIC1", "TX SWR_DMIC1"},
+       {"TX SMIC MUX5", "SWR_DMIC2", "TX SWR_DMIC2"},
+       {"TX SMIC MUX5", "SWR_DMIC3", "TX SWR_DMIC3"},
+       {"TX SMIC MUX5", "SWR_DMIC4", "TX SWR_DMIC4"},
+       {"TX SMIC MUX5", "SWR_DMIC5", "TX SWR_DMIC5"},
+       {"TX SMIC MUX5", "SWR_DMIC6", "TX SWR_DMIC6"},
+       {"TX SMIC MUX5", "SWR_DMIC7", "TX SWR_DMIC7"},
+
+       {"TX DEC6 MUX", "SWR_MIC", "TX SMIC MUX6"},
+       {"TX SMIC MUX6", NULL, "TX_SWR_CLK"},
+       {"TX SMIC MUX6", "ADC0", "TX SWR_ADC0"},
+       {"TX SMIC MUX6", "ADC1", "TX SWR_ADC1"},
+       {"TX SMIC MUX6", "ADC2", "TX SWR_ADC2"},
+       {"TX SMIC MUX6", "ADC3", "TX SWR_ADC3"},
+       {"TX SMIC MUX6", "SWR_DMIC0", "TX SWR_DMIC0"},
+       {"TX SMIC MUX6", "SWR_DMIC1", "TX SWR_DMIC1"},
+       {"TX SMIC MUX6", "SWR_DMIC2", "TX SWR_DMIC2"},
+       {"TX SMIC MUX6", "SWR_DMIC3", "TX SWR_DMIC3"},
+       {"TX SMIC MUX6", "SWR_DMIC4", "TX SWR_DMIC4"},
+       {"TX SMIC MUX6", "SWR_DMIC5", "TX SWR_DMIC5"},
+       {"TX SMIC MUX6", "SWR_DMIC6", "TX SWR_DMIC6"},
+       {"TX SMIC MUX6", "SWR_DMIC7", "TX SWR_DMIC7"},
+
+       {"TX DEC7 MUX", "SWR_MIC", "TX SMIC MUX7"},
+       {"TX SMIC MUX7", NULL, "TX_SWR_CLK"},
+       {"TX SMIC MUX7", "ADC0", "TX SWR_ADC0"},
+       {"TX SMIC MUX7", "ADC1", "TX SWR_ADC1"},
+       {"TX SMIC MUX7", "ADC2", "TX SWR_ADC2"},
+       {"TX SMIC MUX7", "ADC3", "TX SWR_ADC3"},
+       {"TX SMIC MUX7", "SWR_DMIC0", "TX SWR_DMIC0"},
+       {"TX SMIC MUX7", "SWR_DMIC1", "TX SWR_DMIC1"},
+       {"TX SMIC MUX7", "SWR_DMIC2", "TX SWR_DMIC2"},
+       {"TX SMIC MUX7", "SWR_DMIC3", "TX SWR_DMIC3"},
+       {"TX SMIC MUX7", "SWR_DMIC4", "TX SWR_DMIC4"},
+       {"TX SMIC MUX7", "SWR_DMIC5", "TX SWR_DMIC5"},
+       {"TX SMIC MUX7", "SWR_DMIC6", "TX SWR_DMIC6"},
+       {"TX SMIC MUX7", "SWR_DMIC7", "TX SWR_DMIC7"},
+};
+
 static const struct snd_kcontrol_new tx_macro_snd_controls[] = {
        SOC_SINGLE_S8_TLV("TX_DEC0 Volume",
                          CDC_TX0_TX_VOL_CTL,
@@ -1088,6 +1769,10 @@ static const struct snd_soc_component_driver tx_macro_component_drv = {
        .probe = tx_macro_component_probe,
        .controls = tx_macro_snd_controls,
        .num_controls = ARRAY_SIZE(tx_macro_snd_controls),
+       .dapm_widgets = tx_macro_dapm_widgets,
+       .num_dapm_widgets = ARRAY_SIZE(tx_macro_dapm_widgets),
+       .dapm_routes = tx_audio_map,
+       .num_dapm_routes = ARRAY_SIZE(tx_audio_map),
 };
 
 static int tx_macro_probe(struct platform_device *pdev)