#define RT1011_SPEAKER_AMP_PRESENT             BIT(0)
 #define RT1019_SPEAKER_AMP_PRESENT             BIT(1)
+#define MAX98390_SPEAKER_AMP_PRESENT           BIT(2)
 
 #define RT1011_CODEC_DAI       "rt1011-aif"
 #define RT1011_DEV0_NAME       "rt1011.2-0038"
 #define RT1019_CODEC_DAI       "HiFi"
 #define RT1019_DEV0_NAME       "rt1019p"
 
+#define MAX98390_CODEC_DAI     "max98390-aif1"
+#define MAX98390_DEV0_NAME     "max98390.2-0038" /* right */
+#define MAX98390_DEV1_NAME     "max98390.2-0039" /* left */
+
 #define RT5682_CODEC_DAI       "rt5682-aif1"
 #define RT5682_DEV0_NAME       "rt5682.2-001a"
 
        { "Ext Spk", NULL, "Speaker" },
 };
 
+static const struct snd_soc_dapm_route mt8195_max98390_routes[] = {
+       { "Left Spk", NULL, "Left BE_OUT" },
+       { "Right Spk", NULL, "Right BE_OUT" },
+};
+
 #define CKSYS_AUD_TOP_CFG 0x032c
 #define CKSYS_AUD_TOP_MON 0x0330
 
        return ret;
 }
 
+static int mt8195_max98390_init(struct snd_soc_pcm_runtime *rtd)
+{
+       struct snd_soc_card *card = rtd->card;
+       int ret;
+
+       ret = snd_soc_dapm_new_controls(&card->dapm, mt8195_dual_speaker_widgets,
+                                       ARRAY_SIZE(mt8195_dual_speaker_widgets));
+       if (ret) {
+               dev_err(rtd->dev, "unable to add dapm controls, ret %d\n", ret);
+               /* Don't need to add routes if widget addition failed */
+               return ret;
+       }
+
+       ret = snd_soc_add_card_controls(card, mt8195_dual_speaker_controls,
+                                       ARRAY_SIZE(mt8195_dual_speaker_controls));
+       if (ret) {
+               dev_err(rtd->dev, "unable to add card controls, ret %d\n", ret);
+               return ret;
+       }
+
+       ret = snd_soc_dapm_add_routes(&card->dapm, mt8195_max98390_routes,
+                                     ARRAY_SIZE(mt8195_max98390_routes));
+       if (ret)
+               dev_err(rtd->dev, "unable to add dapm routes, ret %d\n", ret);
+
+       return ret;
+}
+
 static int mt8195_etdm_hw_params_fixup(struct snd_soc_pcm_runtime *rtd,
                                       struct snd_pcm_hw_params *params)
 {
                                       COMP_CODEC(RT1011_DEV1_NAME,
                                                  RT1011_CODEC_DAI)));
 
+SND_SOC_DAILINK_DEF(max98390_comps,
+                   DAILINK_COMP_ARRAY(COMP_CODEC(MAX98390_DEV0_NAME,
+                                                 MAX98390_CODEC_DAI),
+                                      COMP_CODEC(MAX98390_DEV1_NAME,
+                                                 MAX98390_CODEC_DAI)));
+
 static const struct sof_conn_stream g_sof_conn_streams[] = {
        { "ETDM2_OUT_BE", "AFE_SOF_DL2", SOF_DMA_DL2, SNDRV_PCM_STREAM_PLAYBACK},
        { "ETDM1_OUT_BE", "AFE_SOF_DL3", SOF_DMA_DL3, SNDRV_PCM_STREAM_PLAYBACK},
        },
 };
 
+static struct snd_soc_codec_conf max98390_codec_conf[] = {
+       {
+               .dlc = COMP_CODEC_CONF(MAX98390_DEV0_NAME),
+               .name_prefix = "Right",
+       },
+       {
+               .dlc = COMP_CODEC_CONF(MAX98390_DEV1_NAME),
+               .name_prefix = "Left",
+       },
+};
+
 static struct snd_soc_card mt8195_mt6359_soc_card = {
        .owner = THIS_MODULE,
        .dai_link = mt8195_mt6359_dai_links,
                                dai_link->num_codecs = ARRAY_SIZE(rt1019_comps);
                                dai_link->init = mt8195_rt1019_init;
                                break;
+                       case MAX98390_SPEAKER_AMP_PRESENT:
+                               dai_link->codecs = max98390_comps;
+                               dai_link->num_codecs = ARRAY_SIZE(max98390_comps);
+                               dai_link->init = mt8195_max98390_init;
+                               card->codec_conf = max98390_codec_conf;
+                               card->num_configs = ARRAY_SIZE(max98390_codec_conf);
+                               break;
                        default:
                                break;
                        }
        .quirk = RT1011_SPEAKER_AMP_PRESENT,
 };
 
+static struct mt8195_card_data mt8195_mt6359_max98390_rt5682_card = {
+       .name = "mt8195_m98390_r5682",
+       .quirk = MAX98390_SPEAKER_AMP_PRESENT,
+};
+
 #ifdef CONFIG_OF
 static const struct of_device_id mt8195_mt6359_dt_match[] = {
        {
                .compatible = "mediatek,mt8195_mt6359_rt1011_rt5682",
                .data = &mt8195_mt6359_rt1011_rt5682_card,
        },
+       {
+               .compatible = "mediatek,mt8195_mt6359_max98390_rt5682",
+               .data = &mt8195_mt6359_max98390_rt5682_card,
+       },
 };
 #endif