.tdm_mode = false,
 };
 
-static const struct snd_kcontrol_new acp_controls[] = {
-       SOC_DAPM_PIN_SWITCH("Headphone Jack"),
-       SOC_DAPM_PIN_SWITCH("Headset Mic"),
-       SOC_DAPM_PIN_SWITCH("Spk"),
-       SOC_DAPM_PIN_SWITCH("Left Spk"),
-       SOC_DAPM_PIN_SWITCH("Right Spk"),
-
-};
-
-static const struct snd_soc_dapm_widget acp_widgets[] = {
-       SND_SOC_DAPM_HP("Headphone Jack", NULL),
-       SND_SOC_DAPM_MIC("Headset Mic", NULL),
-       SND_SOC_DAPM_SPK("Spk", NULL),
-       SND_SOC_DAPM_SPK("Left Spk", NULL),
-       SND_SOC_DAPM_SPK("Right Spk", NULL),
-};
-
 static int acp_asoc_probe(struct platform_device *pdev)
 {
        struct snd_soc_card *card = NULL;
        card->dev = dev;
        card->owner = THIS_MODULE;
        card->name = pdev->id_entry->name;
-       card->dapm_widgets = acp_widgets;
-       card->num_dapm_widgets = ARRAY_SIZE(acp_widgets);
-       card->controls = acp_controls;
-       card->num_controls = ARRAY_SIZE(acp_controls);
        card->drvdata = (struct acp_card_drvdata *)pdev->id_entry->driver_data;
+       /* Widgets and controls added per-codec in acp-mach-common.c */
 
        acp_card_drvdata = card->drvdata;
        dmi_id = dmi_first_match(acp_quirk_table);
 
        DAILINK_COMP_ARRAY(COMP_CODEC("i2c-10EC1019:00", "rt1019-aif"),
                          COMP_CODEC("i2c-10EC1019:01", "rt1019-aif")));
 
+static const struct snd_kcontrol_new rt1019_controls[] = {
+       SOC_DAPM_PIN_SWITCH("Left Spk"),
+       SOC_DAPM_PIN_SWITCH("Right Spk"),
+};
+
+static const struct snd_soc_dapm_widget rt1019_widgets[] = {
+       SND_SOC_DAPM_SPK("Left Spk", NULL),
+       SND_SOC_DAPM_SPK("Right Spk", NULL),
+};
+
 static const struct snd_soc_dapm_route rt1019_map_lr[] = {
        { "Left Spk", NULL, "Left SPO" },
        { "Right Spk", NULL, "Right SPO" },
 {
        struct snd_soc_card *card = rtd->card;
        struct acp_card_drvdata *drvdata = card->drvdata;
+       int ret;
 
        if (drvdata->amp_codec_id != RT1019)
                return -EINVAL;
 
+       ret = snd_soc_dapm_new_controls(&card->dapm, rt1019_widgets,
+                                       ARRAY_SIZE(rt1019_widgets));
+       if (ret) {
+               dev_err(rtd->dev, "unable to add widget dapm controls, ret %d\n", ret);
+               return ret;
+       }
+
+       ret = snd_soc_add_card_controls(card, rt1019_controls,
+                                       ARRAY_SIZE(rt1019_controls));
+       if (ret) {
+               dev_err(rtd->dev, "unable to add card controls, ret %d\n", ret);
+               return ret;
+       }
+
        return snd_soc_dapm_add_routes(&rtd->card->dapm, rt1019_map_lr,
                                       ARRAY_SIZE(rt1019_map_lr));
 }
 SND_SOC_DAILINK_DEF(max98360a,
        DAILINK_COMP_ARRAY(COMP_CODEC("MX98360A:00", "HiFi")));
 
+static const struct snd_kcontrol_new max98360a_controls[] = {
+       SOC_DAPM_PIN_SWITCH("Spk"),
+};
+
+static const struct snd_soc_dapm_widget max98360a_widgets[] = {
+       SND_SOC_DAPM_SPK("Spk", NULL),
+};
+
 static const struct snd_soc_dapm_route max98360a_map[] = {
        {"Spk", NULL, "Speaker"},
 };
 {
        struct snd_soc_card *card = rtd->card;
        struct acp_card_drvdata *drvdata = card->drvdata;
+       int ret;
 
        if (drvdata->amp_codec_id != MAX98360A)
                return -EINVAL;
 
+       ret = snd_soc_dapm_new_controls(&card->dapm, max98360a_widgets,
+                                       ARRAY_SIZE(max98360a_widgets));
+       if (ret) {
+               dev_err(rtd->dev, "unable to add widget dapm controls, ret %d\n", ret);
+               return ret;
+       }
+
+       ret = snd_soc_add_card_controls(card, max98360a_controls,
+                                       ARRAY_SIZE(max98360a_controls));
+       if (ret) {
+               dev_err(rtd->dev, "unable to add card controls, ret %d\n", ret);
+               return ret;
+       }
+
        return snd_soc_dapm_add_routes(&rtd->card->dapm, max98360a_map,
                                       ARRAY_SIZE(max98360a_map));
 }
                    DAILINK_COMP_ARRAY(COMP_CODEC("i2c-ADS8388:00", "max98388-aif1"),
                                       COMP_CODEC("i2c-ADS8388:01", "max98388-aif1")));
 
+static const struct snd_kcontrol_new max98388_controls[] = {
+       SOC_DAPM_PIN_SWITCH("Left Spk"),
+       SOC_DAPM_PIN_SWITCH("Right Spk"),
+};
+
 static const struct snd_soc_dapm_widget max98388_widgets[] = {
-       SND_SOC_DAPM_SPK("SPK", NULL),
+       SND_SOC_DAPM_SPK("Left Spk", NULL),
+       SND_SOC_DAPM_SPK("Right Spk", NULL),
 };
 
 static const struct snd_soc_dapm_route max98388_map[] = {
-       { "SPK", NULL, "Left BE_OUT" },
-       { "SPK", NULL, "Right BE_OUT" },
+       { "Left Spk", NULL, "Left BE_OUT" },
+       { "Right Spk", NULL, "Right BE_OUT" },
 };
 
 static struct snd_soc_codec_conf max98388_conf[] = {
                /* Don't need to add routes if widget addition failed */
                return ret;
        }
+
+       ret = snd_soc_add_card_controls(card, max98388_controls,
+                                       ARRAY_SIZE(max98388_controls));
+       if (ret) {
+               dev_err(rtd->dev, "unable to add card controls, ret %d\n", ret);
+               return ret;
+       }
+
        return snd_soc_dapm_add_routes(&rtd->card->dapm, max98388_map,
                                       ARRAY_SIZE(max98388_map));
 }
 
        .tdm_mode = false,
 };
 
-static const struct snd_kcontrol_new acp_controls[] = {
-       SOC_DAPM_PIN_SWITCH("Headphone Jack"),
-       SOC_DAPM_PIN_SWITCH("Headset Mic"),
-       SOC_DAPM_PIN_SWITCH("Spk"),
-       SOC_DAPM_PIN_SWITCH("Left Spk"),
-       SOC_DAPM_PIN_SWITCH("Right Spk"),
-};
-
-static const struct snd_soc_dapm_widget acp_widgets[] = {
-       SND_SOC_DAPM_HP("Headphone Jack", NULL),
-       SND_SOC_DAPM_MIC("Headset Mic", NULL),
-       SND_SOC_DAPM_SPK("Spk", NULL),
-       SND_SOC_DAPM_SPK("Left Spk", NULL),
-       SND_SOC_DAPM_SPK("Right Spk", NULL),
-};
-
 static int acp_sof_probe(struct platform_device *pdev)
 {
        struct snd_soc_card *card = NULL;
        card->dev = dev;
        card->owner = THIS_MODULE;
        card->name = pdev->id_entry->name;
-       card->dapm_widgets = acp_widgets;
-       card->num_dapm_widgets = ARRAY_SIZE(acp_widgets);
-       card->controls = acp_controls;
-       card->num_controls = ARRAY_SIZE(acp_controls);
        card->drvdata = (struct acp_card_drvdata *)pdev->id_entry->driver_data;
+       /* Widgets and controls added per-codec in acp-mach-common.c */
 
        acp_card_drvdata = card->drvdata;
        dmi_id = dmi_first_match(acp_quirk_table);