ASoC: Intel: sdw_max98373: add card_late_probe support
authorranderwang <rander.wang@linux.intel.com>
Wed, 8 Jul 2020 20:32:15 +0000 (15:32 -0500)
committerMark Brown <broonie@kernel.org>
Thu, 9 Jul 2020 20:01:28 +0000 (21:01 +0100)
Disable Left and Right Spk pin after boot so that sof can get
suspended.

This follows the same logic added to another machine driver with
commit 94d2d0897474 ("ASoC: Intel: Boards: tgl_max98373: add dai_trigger function")

Signed-off-by: randerwang <rander.wang@linux.intel.com>
Signed-off-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
Reviewed-by: Bard Liao <yung-chuan.liao@linux.intel.com>
Link: https://lore.kernel.org/r/20200708203215.231776-5-pierre-louis.bossart@linux.intel.com
Signed-off-by: Mark Brown <broonie@kernel.org>
sound/soc/intel/boards/sof_sdw.c
sound/soc/intel/boards/sof_sdw_common.h
sound/soc/intel/boards/sof_sdw_max98373.c

index 45be9ec..be8eccb 100644 (file)
@@ -237,6 +237,7 @@ static struct sof_sdw_codec_info codec_info_list[] = {
                .direction = {true, true},
                .dai_name = "max98373-aif1",
                .init = sof_sdw_mx8373_init,
+               .codec_card_late_probe = sof_sdw_mx8373_late_probe,
        },
        {
                .id = 0x5682,
@@ -927,13 +928,29 @@ DMIC:
        return 0;
 }
 
+static int sof_sdw_card_late_probe(struct snd_soc_card *card)
+{
+       int i, ret;
+
+       for (i = 0; i < ARRAY_SIZE(codec_info_list); i++) {
+               if (!codec_info_list[i].late_probe)
+                       continue;
+
+               ret = codec_info_list[i].codec_card_late_probe(card);
+               if (ret < 0)
+                       return ret;
+       }
+
+       return sof_sdw_hdmi_card_late_probe(card);
+}
+
 /* SoC card */
 static const char sdw_card_long_name[] = "Intel Soundwire SOF";
 
 static struct snd_soc_card card_sof_sdw = {
        .name = "soundwire",
        .owner = THIS_MODULE,
-       .late_probe = sof_sdw_hdmi_card_late_probe,
+       .late_probe = sof_sdw_card_late_probe,
        .codec_conf = codec_conf,
        .num_configs = ARRAY_SIZE(codec_conf),
 };
index 3f820cf..4260176 100644 (file)
@@ -11,6 +11,7 @@
 
 #include <linux/bits.h>
 #include <linux/types.h>
+#include <sound/soc.h>
 
 #define MAX_NO_PROPS 2
 #define MAX_HDMI_NUM 4
@@ -61,6 +62,9 @@ struct sof_sdw_codec_info {
                     struct snd_soc_dai_link *dai_links,
                     struct sof_sdw_codec_info *info,
                     bool playback);
+
+       bool late_probe;
+       int (*codec_card_late_probe)(struct snd_soc_card *card);
 };
 
 struct mc_private {
@@ -114,6 +118,8 @@ int sof_sdw_mx8373_init(const struct snd_soc_acpi_link_adr *link,
                        struct sof_sdw_codec_info *info,
                        bool playback);
 
+int sof_sdw_mx8373_late_probe(struct snd_soc_card *card);
+
 /* RT5682 support */
 int sof_sdw_rt5682_init(const struct snd_soc_acpi_link_adr *link,
                        struct snd_soc_dai_link *dai_links,
index a38ddc0..6437872 100644 (file)
@@ -68,7 +68,19 @@ int sof_sdw_mx8373_init(const struct snd_soc_acpi_link_adr *link,
        if (info->amp_num == 2)
                dai_links->init = spk_init;
 
+       info->late_probe = true;
+
        dai_links->ops = &max_98373_sdw_ops;
 
        return 0;
 }
+
+int sof_sdw_mx8373_late_probe(struct snd_soc_card *card)
+{
+       struct snd_soc_dapm_context *dapm = &card->dapm;
+
+       /* Disable Left and Right Spk pin after boot */
+       snd_soc_dapm_disable_pin(dapm, "Left Spk");
+       snd_soc_dapm_disable_pin(dapm, "Right Spk");
+       return snd_soc_dapm_sync(dapm);
+}