ASoC: mediatek: mt8188: add control for timing select
authorTrevor Wu <trevor.wu@mediatek.com>
Mon, 16 Jan 2023 03:41:27 +0000 (11:41 +0800)
committerMark Brown <broonie@kernel.org>
Mon, 16 Jan 2023 11:16:27 +0000 (11:16 +0000)
Add mixer control for irq and memif timing selection.

Signed-off-by: Trevor Wu <trevor.wu@mediatek.com>
Reviewed-by: AngeloGioacchino Del Regno <angelogioacchino.delregno@collabora.com>
Link: https://lore.kernel.org/r/20230116034131.23943-10-trevor.wu@mediatek.com
Signed-off-by: Mark Brown <broonie@kernel.org>
sound/soc/mediatek/mt8188/mt8188-afe-pcm.c

index 6bef980846faa4c96e98e979d82163edf6e01344..57a31330e5f4e5595db48bdbeedfe913cf1350f3 100644 (file)
@@ -1394,6 +1394,510 @@ static const struct snd_soc_dapm_route mt8188_memif_routes[] = {
        {"O041", "I169 Switch", "I169"},
 };
 
+static const char * const mt8188_afe_1x_en_sel_text[] = {
+       "a1sys_a2sys", "a3sys", "a4sys",
+};
+
+static const unsigned int mt8188_afe_1x_en_sel_values[] = {
+       0, 1, 2,
+};
+
+static SOC_VALUE_ENUM_SINGLE_DECL(dl2_1x_en_sel_enum,
+                                 A3_A4_TIMING_SEL1, 18, 0x3,
+                                 mt8188_afe_1x_en_sel_text,
+                                 mt8188_afe_1x_en_sel_values);
+static SOC_VALUE_ENUM_SINGLE_DECL(dl3_1x_en_sel_enum,
+                                 A3_A4_TIMING_SEL1, 20, 0x3,
+                                 mt8188_afe_1x_en_sel_text,
+                                 mt8188_afe_1x_en_sel_values);
+static SOC_VALUE_ENUM_SINGLE_DECL(dl6_1x_en_sel_enum,
+                                 A3_A4_TIMING_SEL1, 22, 0x3,
+                                 mt8188_afe_1x_en_sel_text,
+                                 mt8188_afe_1x_en_sel_values);
+static SOC_VALUE_ENUM_SINGLE_DECL(dl7_1x_en_sel_enum,
+                                 A3_A4_TIMING_SEL1, 24, 0x3,
+                                 mt8188_afe_1x_en_sel_text,
+                                 mt8188_afe_1x_en_sel_values);
+static SOC_VALUE_ENUM_SINGLE_DECL(dl8_1x_en_sel_enum,
+                                 A3_A4_TIMING_SEL1, 26, 0x3,
+                                 mt8188_afe_1x_en_sel_text,
+                                 mt8188_afe_1x_en_sel_values);
+static SOC_VALUE_ENUM_SINGLE_DECL(dl10_1x_en_sel_enum,
+                                 A3_A4_TIMING_SEL1, 28, 0x3,
+                                 mt8188_afe_1x_en_sel_text,
+                                 mt8188_afe_1x_en_sel_values);
+static SOC_VALUE_ENUM_SINGLE_DECL(dl11_1x_en_sel_enum,
+                                 A3_A4_TIMING_SEL1, 30, 0x3,
+                                 mt8188_afe_1x_en_sel_text,
+                                 mt8188_afe_1x_en_sel_values);
+static SOC_VALUE_ENUM_SINGLE_DECL(ul1_1x_en_sel_enum,
+                                 A3_A4_TIMING_SEL1, 0, 0x3,
+                                 mt8188_afe_1x_en_sel_text,
+                                 mt8188_afe_1x_en_sel_values);
+static SOC_VALUE_ENUM_SINGLE_DECL(ul2_1x_en_sel_enum,
+                                 A3_A4_TIMING_SEL1, 2, 0x3,
+                                 mt8188_afe_1x_en_sel_text,
+                                 mt8188_afe_1x_en_sel_values);
+static SOC_VALUE_ENUM_SINGLE_DECL(ul3_1x_en_sel_enum,
+                                 A3_A4_TIMING_SEL1, 4, 0x3,
+                                 mt8188_afe_1x_en_sel_text,
+                                 mt8188_afe_1x_en_sel_values);
+static SOC_VALUE_ENUM_SINGLE_DECL(ul4_1x_en_sel_enum,
+                                 A3_A4_TIMING_SEL1, 6, 0x3,
+                                 mt8188_afe_1x_en_sel_text,
+                                 mt8188_afe_1x_en_sel_values);
+static SOC_VALUE_ENUM_SINGLE_DECL(ul5_1x_en_sel_enum,
+                                 A3_A4_TIMING_SEL1, 8, 0x3,
+                                 mt8188_afe_1x_en_sel_text,
+                                 mt8188_afe_1x_en_sel_values);
+static SOC_VALUE_ENUM_SINGLE_DECL(ul6_1x_en_sel_enum,
+                                 A3_A4_TIMING_SEL1, 10, 0x3,
+                                 mt8188_afe_1x_en_sel_text,
+                                 mt8188_afe_1x_en_sel_values);
+static SOC_VALUE_ENUM_SINGLE_DECL(ul8_1x_en_sel_enum,
+                                 A3_A4_TIMING_SEL1, 12, 0x3,
+                                 mt8188_afe_1x_en_sel_text,
+                                 mt8188_afe_1x_en_sel_values);
+static SOC_VALUE_ENUM_SINGLE_DECL(ul9_1x_en_sel_enum,
+                                 A3_A4_TIMING_SEL1, 14, 0x3,
+                                 mt8188_afe_1x_en_sel_text,
+                                 mt8188_afe_1x_en_sel_values);
+static SOC_VALUE_ENUM_SINGLE_DECL(ul10_1x_en_sel_enum,
+                                 A3_A4_TIMING_SEL1, 16, 0x3,
+                                 mt8188_afe_1x_en_sel_text,
+                                 mt8188_afe_1x_en_sel_values);
+
+static SOC_VALUE_ENUM_SINGLE_DECL(asys_irq1_1x_en_sel_enum,
+                                 A3_A4_TIMING_SEL6, 0, 0x3,
+                                 mt8188_afe_1x_en_sel_text,
+                                 mt8188_afe_1x_en_sel_values);
+static SOC_VALUE_ENUM_SINGLE_DECL(asys_irq2_1x_en_sel_enum,
+                                 A3_A4_TIMING_SEL6, 2, 0x3,
+                                 mt8188_afe_1x_en_sel_text,
+                                 mt8188_afe_1x_en_sel_values);
+static SOC_VALUE_ENUM_SINGLE_DECL(asys_irq3_1x_en_sel_enum,
+                                 A3_A4_TIMING_SEL6, 4, 0x3,
+                                 mt8188_afe_1x_en_sel_text,
+                                 mt8188_afe_1x_en_sel_values);
+static SOC_VALUE_ENUM_SINGLE_DECL(asys_irq4_1x_en_sel_enum,
+                                 A3_A4_TIMING_SEL6, 6, 0x3,
+                                 mt8188_afe_1x_en_sel_text,
+                                 mt8188_afe_1x_en_sel_values);
+static SOC_VALUE_ENUM_SINGLE_DECL(asys_irq5_1x_en_sel_enum,
+                                 A3_A4_TIMING_SEL6, 8, 0x3,
+                                 mt8188_afe_1x_en_sel_text,
+                                 mt8188_afe_1x_en_sel_values);
+static SOC_VALUE_ENUM_SINGLE_DECL(asys_irq6_1x_en_sel_enum,
+                                 A3_A4_TIMING_SEL6, 10, 0x3,
+                                 mt8188_afe_1x_en_sel_text,
+                                 mt8188_afe_1x_en_sel_values);
+static SOC_VALUE_ENUM_SINGLE_DECL(asys_irq7_1x_en_sel_enum,
+                                 A3_A4_TIMING_SEL6, 12, 0x3,
+                                 mt8188_afe_1x_en_sel_text,
+                                 mt8188_afe_1x_en_sel_values);
+static SOC_VALUE_ENUM_SINGLE_DECL(asys_irq8_1x_en_sel_enum,
+                                 A3_A4_TIMING_SEL6, 14, 0x3,
+                                 mt8188_afe_1x_en_sel_text,
+                                 mt8188_afe_1x_en_sel_values);
+static SOC_VALUE_ENUM_SINGLE_DECL(asys_irq9_1x_en_sel_enum,
+                                 A3_A4_TIMING_SEL6, 16, 0x3,
+                                 mt8188_afe_1x_en_sel_text,
+                                 mt8188_afe_1x_en_sel_values);
+static SOC_VALUE_ENUM_SINGLE_DECL(asys_irq10_1x_en_sel_enum,
+                                 A3_A4_TIMING_SEL6, 18, 0x3,
+                                 mt8188_afe_1x_en_sel_text,
+                                 mt8188_afe_1x_en_sel_values);
+static SOC_VALUE_ENUM_SINGLE_DECL(asys_irq11_1x_en_sel_enum,
+                                 A3_A4_TIMING_SEL6, 20, 0x3,
+                                 mt8188_afe_1x_en_sel_text,
+                                 mt8188_afe_1x_en_sel_values);
+static SOC_VALUE_ENUM_SINGLE_DECL(asys_irq12_1x_en_sel_enum,
+                                 A3_A4_TIMING_SEL6, 22, 0x3,
+                                 mt8188_afe_1x_en_sel_text,
+                                 mt8188_afe_1x_en_sel_values);
+static SOC_VALUE_ENUM_SINGLE_DECL(asys_irq13_1x_en_sel_enum,
+                                 A3_A4_TIMING_SEL6, 24, 0x3,
+                                 mt8188_afe_1x_en_sel_text,
+                                 mt8188_afe_1x_en_sel_values);
+static SOC_VALUE_ENUM_SINGLE_DECL(asys_irq14_1x_en_sel_enum,
+                                 A3_A4_TIMING_SEL6, 26, 0x3,
+                                 mt8188_afe_1x_en_sel_text,
+                                 mt8188_afe_1x_en_sel_values);
+static SOC_VALUE_ENUM_SINGLE_DECL(asys_irq15_1x_en_sel_enum,
+                                 A3_A4_TIMING_SEL6, 28, 0x3,
+                                 mt8188_afe_1x_en_sel_text,
+                                 mt8188_afe_1x_en_sel_values);
+static SOC_VALUE_ENUM_SINGLE_DECL(asys_irq16_1x_en_sel_enum,
+                                 A3_A4_TIMING_SEL6, 30, 0x3,
+                                 mt8188_afe_1x_en_sel_text,
+                                 mt8188_afe_1x_en_sel_values);
+
+static const char * const mt8188_afe_fs_timing_sel_text[] = {
+       "asys",
+       "etdmout1_1x_en",
+       "etdmout2_1x_en",
+       "etdmout3_1x_en",
+       "etdmin1_1x_en",
+       "etdmin2_1x_en",
+       "etdmin1_nx_en",
+       "etdmin2_nx_en",
+};
+
+static const unsigned int mt8188_afe_fs_timing_sel_values[] = {
+       0,
+       MT8188_ETDM_OUT1_1X_EN,
+       MT8188_ETDM_OUT2_1X_EN,
+       MT8188_ETDM_OUT3_1X_EN,
+       MT8188_ETDM_IN1_1X_EN,
+       MT8188_ETDM_IN2_1X_EN,
+       MT8188_ETDM_IN1_NX_EN,
+       MT8188_ETDM_IN2_NX_EN,
+};
+
+static SOC_VALUE_ENUM_SINGLE_DECL(dl2_fs_timing_sel_enum,
+                                 SND_SOC_NOPM, 0, 0,
+                                 mt8188_afe_fs_timing_sel_text,
+                                 mt8188_afe_fs_timing_sel_values);
+static SOC_VALUE_ENUM_SINGLE_DECL(dl3_fs_timing_sel_enum,
+                                 SND_SOC_NOPM, 0, 0,
+                                 mt8188_afe_fs_timing_sel_text,
+                                 mt8188_afe_fs_timing_sel_values);
+static SOC_VALUE_ENUM_SINGLE_DECL(dl6_fs_timing_sel_enum,
+                                 SND_SOC_NOPM, 0, 0,
+                                 mt8188_afe_fs_timing_sel_text,
+                                 mt8188_afe_fs_timing_sel_values);
+static SOC_VALUE_ENUM_SINGLE_DECL(dl8_fs_timing_sel_enum,
+                                 SND_SOC_NOPM, 0, 0,
+                                 mt8188_afe_fs_timing_sel_text,
+                                 mt8188_afe_fs_timing_sel_values);
+static SOC_VALUE_ENUM_SINGLE_DECL(dl11_fs_timing_sel_enum,
+                                 SND_SOC_NOPM, 0, 0,
+                                 mt8188_afe_fs_timing_sel_text,
+                                 mt8188_afe_fs_timing_sel_values);
+static SOC_VALUE_ENUM_SINGLE_DECL(ul2_fs_timing_sel_enum,
+                                 SND_SOC_NOPM, 0, 0,
+                                 mt8188_afe_fs_timing_sel_text,
+                                 mt8188_afe_fs_timing_sel_values);
+static SOC_VALUE_ENUM_SINGLE_DECL(ul4_fs_timing_sel_enum,
+                                 SND_SOC_NOPM, 0, 0,
+                                 mt8188_afe_fs_timing_sel_text,
+                                 mt8188_afe_fs_timing_sel_values);
+static SOC_VALUE_ENUM_SINGLE_DECL(ul5_fs_timing_sel_enum,
+                                 SND_SOC_NOPM, 0, 0,
+                                 mt8188_afe_fs_timing_sel_text,
+                                 mt8188_afe_fs_timing_sel_values);
+static SOC_VALUE_ENUM_SINGLE_DECL(ul9_fs_timing_sel_enum,
+                                 SND_SOC_NOPM, 0, 0,
+                                 mt8188_afe_fs_timing_sel_text,
+                                 mt8188_afe_fs_timing_sel_values);
+static SOC_VALUE_ENUM_SINGLE_DECL(ul10_fs_timing_sel_enum,
+                                 SND_SOC_NOPM, 0, 0,
+                                 mt8188_afe_fs_timing_sel_text,
+                                 mt8188_afe_fs_timing_sel_values);
+
+static int mt8188_memif_1x_en_sel_put(struct snd_kcontrol *kcontrol,
+                                     struct snd_ctl_elem_value *ucontrol)
+{
+       struct snd_soc_component *component =
+               snd_soc_kcontrol_component(kcontrol);
+       struct mtk_base_afe *afe = snd_soc_component_get_drvdata(component);
+       struct mt8188_afe_private *afe_priv = afe->platform_priv;
+       struct mtk_dai_memif_priv *memif_priv;
+       unsigned int dai_id = kcontrol->id.device;
+       long val = ucontrol->value.integer.value[0];
+       int ret = 0;
+
+       memif_priv = afe_priv->dai_priv[dai_id];
+
+       if (val == memif_priv->asys_timing_sel)
+               return 0;
+
+       ret = snd_soc_put_enum_double(kcontrol, ucontrol);
+
+       memif_priv->asys_timing_sel = val;
+
+       return ret;
+}
+
+static int mt8188_asys_irq_1x_en_sel_put(struct snd_kcontrol *kcontrol,
+                                        struct snd_ctl_elem_value *ucontrol)
+{
+       struct snd_soc_component *component =
+               snd_soc_kcontrol_component(kcontrol);
+       struct mtk_base_afe *afe = snd_soc_component_get_drvdata(component);
+       struct mt8188_afe_private *afe_priv = afe->platform_priv;
+       unsigned int id = kcontrol->id.device;
+       long val = ucontrol->value.integer.value[0];
+       int ret = 0;
+
+       if (val == afe_priv->irq_priv[id].asys_timing_sel)
+               return 0;
+
+       ret = snd_soc_put_enum_double(kcontrol, ucontrol);
+
+       afe_priv->irq_priv[id].asys_timing_sel = val;
+
+       return ret;
+}
+
+static int mt8188_memif_fs_timing_sel_get(struct snd_kcontrol *kcontrol,
+                                         struct snd_ctl_elem_value *ucontrol)
+{
+       struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol);
+       struct mtk_base_afe *afe = snd_soc_component_get_drvdata(component);
+       struct mt8188_afe_private *afe_priv = afe->platform_priv;
+       struct mtk_dai_memif_priv *memif_priv;
+       unsigned int dai_id = kcontrol->id.device;
+       struct soc_enum *e = (struct soc_enum *)kcontrol->private_value;
+
+       memif_priv = afe_priv->dai_priv[dai_id];
+
+       ucontrol->value.enumerated.item[0] =
+               snd_soc_enum_val_to_item(e, memif_priv->fs_timing);
+
+       return 0;
+}
+
+static int mt8188_memif_fs_timing_sel_put(struct snd_kcontrol *kcontrol,
+                                         struct snd_ctl_elem_value *ucontrol)
+{
+       struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol);
+       struct mtk_base_afe *afe = snd_soc_component_get_drvdata(component);
+       struct mt8188_afe_private *afe_priv = afe->platform_priv;
+       struct mtk_dai_memif_priv *memif_priv;
+       unsigned int dai_id = kcontrol->id.device;
+       struct soc_enum *e = (struct soc_enum *)kcontrol->private_value;
+       unsigned int *item = ucontrol->value.enumerated.item;
+       unsigned int prev_item = 0;
+
+       if (item[0] >= e->items)
+               return -EINVAL;
+
+       memif_priv = afe_priv->dai_priv[dai_id];
+
+       prev_item = snd_soc_enum_val_to_item(e, memif_priv->fs_timing);
+
+       if (item[0] == prev_item)
+               return 0;
+
+       memif_priv->fs_timing = snd_soc_enum_item_to_val(e, item[0]);
+
+       return 1;
+}
+
+static const struct snd_kcontrol_new mt8188_memif_controls[] = {
+       MT8188_SOC_ENUM_EXT("dl2_1x_en_sel",
+                           dl2_1x_en_sel_enum,
+                           snd_soc_get_enum_double,
+                           mt8188_memif_1x_en_sel_put,
+                           MT8188_AFE_MEMIF_DL2),
+       MT8188_SOC_ENUM_EXT("dl3_1x_en_sel",
+                           dl3_1x_en_sel_enum,
+                           snd_soc_get_enum_double,
+                           mt8188_memif_1x_en_sel_put,
+                           MT8188_AFE_MEMIF_DL3),
+       MT8188_SOC_ENUM_EXT("dl6_1x_en_sel",
+                           dl6_1x_en_sel_enum,
+                           snd_soc_get_enum_double,
+                           mt8188_memif_1x_en_sel_put,
+                           MT8188_AFE_MEMIF_DL6),
+       MT8188_SOC_ENUM_EXT("dl7_1x_en_sel",
+                           dl7_1x_en_sel_enum,
+                           snd_soc_get_enum_double,
+                           mt8188_memif_1x_en_sel_put,
+                           MT8188_AFE_MEMIF_DL7),
+       MT8188_SOC_ENUM_EXT("dl8_1x_en_sel",
+                           dl8_1x_en_sel_enum,
+                           snd_soc_get_enum_double,
+                           mt8188_memif_1x_en_sel_put,
+                           MT8188_AFE_MEMIF_DL8),
+       MT8188_SOC_ENUM_EXT("dl10_1x_en_sel",
+                           dl10_1x_en_sel_enum,
+                           snd_soc_get_enum_double,
+                           mt8188_memif_1x_en_sel_put,
+                           MT8188_AFE_MEMIF_DL10),
+       MT8188_SOC_ENUM_EXT("dl11_1x_en_sel",
+                           dl11_1x_en_sel_enum,
+                           snd_soc_get_enum_double,
+                           mt8188_memif_1x_en_sel_put,
+                           MT8188_AFE_MEMIF_DL11),
+       MT8188_SOC_ENUM_EXT("ul1_1x_en_sel",
+                           ul1_1x_en_sel_enum,
+                           snd_soc_get_enum_double,
+                           mt8188_memif_1x_en_sel_put,
+                           MT8188_AFE_MEMIF_UL1),
+       MT8188_SOC_ENUM_EXT("ul2_1x_en_sel",
+                           ul2_1x_en_sel_enum,
+                           snd_soc_get_enum_double,
+                           mt8188_memif_1x_en_sel_put,
+                           MT8188_AFE_MEMIF_UL2),
+       MT8188_SOC_ENUM_EXT("ul3_1x_en_sel",
+                           ul3_1x_en_sel_enum,
+                           snd_soc_get_enum_double,
+                           mt8188_memif_1x_en_sel_put,
+                           MT8188_AFE_MEMIF_UL3),
+       MT8188_SOC_ENUM_EXT("ul4_1x_en_sel",
+                           ul4_1x_en_sel_enum,
+                           snd_soc_get_enum_double,
+                           mt8188_memif_1x_en_sel_put,
+                           MT8188_AFE_MEMIF_UL4),
+       MT8188_SOC_ENUM_EXT("ul5_1x_en_sel",
+                           ul5_1x_en_sel_enum,
+                           snd_soc_get_enum_double,
+                           mt8188_memif_1x_en_sel_put,
+                           MT8188_AFE_MEMIF_UL5),
+       MT8188_SOC_ENUM_EXT("ul6_1x_en_sel",
+                           ul6_1x_en_sel_enum,
+                           snd_soc_get_enum_double,
+                           mt8188_memif_1x_en_sel_put,
+                           MT8188_AFE_MEMIF_UL6),
+       MT8188_SOC_ENUM_EXT("ul8_1x_en_sel",
+                           ul8_1x_en_sel_enum,
+                           snd_soc_get_enum_double,
+                           mt8188_memif_1x_en_sel_put,
+                           MT8188_AFE_MEMIF_UL8),
+       MT8188_SOC_ENUM_EXT("ul9_1x_en_sel",
+                           ul9_1x_en_sel_enum,
+                           snd_soc_get_enum_double,
+                           mt8188_memif_1x_en_sel_put,
+                           MT8188_AFE_MEMIF_UL9),
+       MT8188_SOC_ENUM_EXT("ul10_1x_en_sel",
+                           ul10_1x_en_sel_enum,
+                           snd_soc_get_enum_double,
+                           mt8188_memif_1x_en_sel_put,
+                           MT8188_AFE_MEMIF_UL10),
+       MT8188_SOC_ENUM_EXT("asys_irq1_1x_en_sel",
+                           asys_irq1_1x_en_sel_enum,
+                           snd_soc_get_enum_double,
+                           mt8188_asys_irq_1x_en_sel_put,
+                           MT8188_AFE_IRQ_13),
+       MT8188_SOC_ENUM_EXT("asys_irq2_1x_en_sel",
+                           asys_irq2_1x_en_sel_enum,
+                           snd_soc_get_enum_double,
+                           mt8188_asys_irq_1x_en_sel_put,
+                           MT8188_AFE_IRQ_14),
+       MT8188_SOC_ENUM_EXT("asys_irq3_1x_en_sel",
+                           asys_irq3_1x_en_sel_enum,
+                           snd_soc_get_enum_double,
+                           mt8188_asys_irq_1x_en_sel_put,
+                           MT8188_AFE_IRQ_15),
+       MT8188_SOC_ENUM_EXT("asys_irq4_1x_en_sel",
+                           asys_irq4_1x_en_sel_enum,
+                           snd_soc_get_enum_double,
+                           mt8188_asys_irq_1x_en_sel_put,
+                           MT8188_AFE_IRQ_16),
+       MT8188_SOC_ENUM_EXT("asys_irq5_1x_en_sel",
+                           asys_irq5_1x_en_sel_enum,
+                           snd_soc_get_enum_double,
+                           mt8188_asys_irq_1x_en_sel_put,
+                           MT8188_AFE_IRQ_17),
+       MT8188_SOC_ENUM_EXT("asys_irq6_1x_en_sel",
+                           asys_irq6_1x_en_sel_enum,
+                           snd_soc_get_enum_double,
+                           mt8188_asys_irq_1x_en_sel_put,
+                           MT8188_AFE_IRQ_18),
+       MT8188_SOC_ENUM_EXT("asys_irq7_1x_en_sel",
+                           asys_irq7_1x_en_sel_enum,
+                           snd_soc_get_enum_double,
+                           mt8188_asys_irq_1x_en_sel_put,
+                           MT8188_AFE_IRQ_19),
+       MT8188_SOC_ENUM_EXT("asys_irq8_1x_en_sel",
+                           asys_irq8_1x_en_sel_enum,
+                           snd_soc_get_enum_double,
+                           mt8188_asys_irq_1x_en_sel_put,
+                           MT8188_AFE_IRQ_20),
+       MT8188_SOC_ENUM_EXT("asys_irq9_1x_en_sel",
+                           asys_irq9_1x_en_sel_enum,
+                           snd_soc_get_enum_double,
+                           mt8188_asys_irq_1x_en_sel_put,
+                           MT8188_AFE_IRQ_21),
+       MT8188_SOC_ENUM_EXT("asys_irq10_1x_en_sel",
+                           asys_irq10_1x_en_sel_enum,
+                           snd_soc_get_enum_double,
+                           mt8188_asys_irq_1x_en_sel_put,
+                           MT8188_AFE_IRQ_22),
+       MT8188_SOC_ENUM_EXT("asys_irq11_1x_en_sel",
+                           asys_irq11_1x_en_sel_enum,
+                           snd_soc_get_enum_double,
+                           mt8188_asys_irq_1x_en_sel_put,
+                           MT8188_AFE_IRQ_23),
+       MT8188_SOC_ENUM_EXT("asys_irq12_1x_en_sel",
+                           asys_irq12_1x_en_sel_enum,
+                           snd_soc_get_enum_double,
+                           mt8188_asys_irq_1x_en_sel_put,
+                           MT8188_AFE_IRQ_24),
+       MT8188_SOC_ENUM_EXT("asys_irq13_1x_en_sel",
+                           asys_irq13_1x_en_sel_enum,
+                           snd_soc_get_enum_double,
+                           mt8188_asys_irq_1x_en_sel_put,
+                           MT8188_AFE_IRQ_25),
+       MT8188_SOC_ENUM_EXT("asys_irq14_1x_en_sel",
+                           asys_irq14_1x_en_sel_enum,
+                           snd_soc_get_enum_double,
+                           mt8188_asys_irq_1x_en_sel_put,
+                           MT8188_AFE_IRQ_26),
+       MT8188_SOC_ENUM_EXT("asys_irq15_1x_en_sel",
+                           asys_irq15_1x_en_sel_enum,
+                           snd_soc_get_enum_double,
+                           mt8188_asys_irq_1x_en_sel_put,
+                           MT8188_AFE_IRQ_27),
+       MT8188_SOC_ENUM_EXT("asys_irq16_1x_en_sel",
+                           asys_irq16_1x_en_sel_enum,
+                           snd_soc_get_enum_double,
+                           mt8188_asys_irq_1x_en_sel_put,
+                           MT8188_AFE_IRQ_28),
+       MT8188_SOC_ENUM_EXT("dl2_fs_timing_sel",
+                           dl2_fs_timing_sel_enum,
+                           mt8188_memif_fs_timing_sel_get,
+                           mt8188_memif_fs_timing_sel_put,
+                           MT8188_AFE_MEMIF_DL2),
+       MT8188_SOC_ENUM_EXT("dl3_fs_timing_sel",
+                           dl3_fs_timing_sel_enum,
+                           mt8188_memif_fs_timing_sel_get,
+                           mt8188_memif_fs_timing_sel_put,
+                           MT8188_AFE_MEMIF_DL3),
+       MT8188_SOC_ENUM_EXT("dl6_fs_timing_sel",
+                           dl6_fs_timing_sel_enum,
+                           mt8188_memif_fs_timing_sel_get,
+                           mt8188_memif_fs_timing_sel_put,
+                           MT8188_AFE_MEMIF_DL6),
+       MT8188_SOC_ENUM_EXT("dl8_fs_timing_sel",
+                           dl8_fs_timing_sel_enum,
+                           mt8188_memif_fs_timing_sel_get,
+                           mt8188_memif_fs_timing_sel_put,
+                           MT8188_AFE_MEMIF_DL8),
+       MT8188_SOC_ENUM_EXT("dl11_fs_timing_sel",
+                           dl11_fs_timing_sel_enum,
+                           mt8188_memif_fs_timing_sel_get,
+                           mt8188_memif_fs_timing_sel_put,
+                           MT8188_AFE_MEMIF_DL11),
+       MT8188_SOC_ENUM_EXT("ul2_fs_timing_sel",
+                           ul2_fs_timing_sel_enum,
+                           mt8188_memif_fs_timing_sel_get,
+                           mt8188_memif_fs_timing_sel_put,
+                           MT8188_AFE_MEMIF_UL2),
+       MT8188_SOC_ENUM_EXT("ul4_fs_timing_sel",
+                           ul4_fs_timing_sel_enum,
+                           mt8188_memif_fs_timing_sel_get,
+                           mt8188_memif_fs_timing_sel_put,
+                           MT8188_AFE_MEMIF_UL4),
+       MT8188_SOC_ENUM_EXT("ul5_fs_timing_sel",
+                           ul5_fs_timing_sel_enum,
+                           mt8188_memif_fs_timing_sel_get,
+                           mt8188_memif_fs_timing_sel_put,
+                           MT8188_AFE_MEMIF_UL5),
+       MT8188_SOC_ENUM_EXT("ul9_fs_timing_sel",
+                           ul9_fs_timing_sel_enum,
+                           mt8188_memif_fs_timing_sel_get,
+                           mt8188_memif_fs_timing_sel_put,
+                           MT8188_AFE_MEMIF_UL9),
+       MT8188_SOC_ENUM_EXT("ul10_fs_timing_sel",
+                           ul10_fs_timing_sel_enum,
+                           mt8188_memif_fs_timing_sel_get,
+                           mt8188_memif_fs_timing_sel_put,
+                           MT8188_AFE_MEMIF_UL10),
+};
+
 static const struct snd_soc_component_driver mt8188_afe_pcm_dai_component = {
        .name = "mt8188-afe-pcm-dai",
 };
@@ -2583,6 +3087,8 @@ static int mt8188_dai_memif_register(struct mtk_base_afe *afe)
        dai->num_dapm_widgets = ARRAY_SIZE(mt8188_memif_widgets);
        dai->dapm_routes = mt8188_memif_routes;
        dai->num_dapm_routes = ARRAY_SIZE(mt8188_memif_routes);
+       dai->controls = mt8188_memif_controls;
+       dai->num_controls = ARRAY_SIZE(mt8188_memif_controls);
 
        return init_memif_priv_data(afe);
 }