]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
ASoC: Intel: sof_sdw: Always register the HDMI dai links
authorPeter Ujfalusi <peter.ujfalusi@linux.intel.com>
Fri, 24 Nov 2023 12:40:32 +0000 (14:40 +0200)
committerMark Brown <broonie@kernel.org>
Fri, 24 Nov 2023 12:55:05 +0000 (12:55 +0000)
The topology files for SDW devices require HDMI dai links to be present and
this is granted under normal conditions but in case of special use cases
the display (i915) driver might not be enabled due to deny-listing,
booting with nomodeset or just not compiled at all.

This should not block the non HDMI audio to be usable so register the dai
links unconditionally. The code has been prepared for this and in case of
no HDMI audio the link is created with dummy codec.

Closes: https://github.com/thesofproject/linux/issues/4594
Closes: https://github.com/thesofproject/linux/issues/4648
Signed-off-by: Peter Ujfalusi <peter.ujfalusi@linux.intel.com>
Reviewed-by: Kai Vehmanen <kai.vehmanen@linux.intel.com>
Reviewed-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
Link: https://lore.kernel.org/r/20231124124032.15946-1-peter.ujfalusi@linux.intel.com
Signed-off-by: Mark Brown <broonie@kernel.org>
sound/soc/intel/boards/sof_sdw.c

index 3312ad8a563b3fb812ba4070fd0914b9a07848fd..4e428472977326eb883223d580f9364225fbbc7c 100644 (file)
@@ -1546,7 +1546,7 @@ static int sof_card_dai_links_create(struct snd_soc_card *card)
 {
        struct device *dev = card->dev;
        struct snd_soc_acpi_mach *mach = dev_get_platdata(card->dev);
-       int sdw_be_num = 0, ssp_num = 0, dmic_num = 0, hdmi_num = 0, bt_num = 0;
+       int sdw_be_num = 0, ssp_num = 0, dmic_num = 0, bt_num = 0;
        struct mc_private *ctx = snd_soc_card_get_drvdata(card);
        struct snd_soc_acpi_mach_params *mach_params = &mach->mach_params;
        const struct snd_soc_acpi_link_adr *adr_link = mach_params->links;
@@ -1564,6 +1564,7 @@ static int sof_card_dai_links_create(struct snd_soc_card *card)
        char *codec_name, *codec_dai_name;
        int i, j, be_id = 0;
        int codec_index;
+       int hdmi_num;
        int ret;
 
        ret = get_dailink_info(dev, adr_link, &sdw_be_num, &codec_conf_num);
@@ -1584,14 +1585,13 @@ static int sof_card_dai_links_create(struct snd_soc_card *card)
                ssp_num = hweight_long(ssp_mask);
        }
 
-       if (mach_params->codec_mask & IDISP_CODEC_MASK) {
+       if (mach_params->codec_mask & IDISP_CODEC_MASK)
                ctx->hdmi.idisp_codec = true;
 
-               if (sof_sdw_quirk & SOF_SDW_TGL_HDMI)
-                       hdmi_num = SOF_TGL_HDMI_COUNT;
-               else
-                       hdmi_num = SOF_PRE_TGL_HDMI_COUNT;
-       }
+       if (sof_sdw_quirk & SOF_SDW_TGL_HDMI)
+               hdmi_num = SOF_TGL_HDMI_COUNT;
+       else
+               hdmi_num = SOF_PRE_TGL_HDMI_COUNT;
 
        /* enable dmic01 & dmic16k */
        if (sof_sdw_quirk & SOF_SDW_PCH_DMIC || mach_params->dmic_num)
@@ -1601,7 +1601,8 @@ static int sof_card_dai_links_create(struct snd_soc_card *card)
                bt_num = 1;
 
        dev_dbg(dev, "sdw %d, ssp %d, dmic %d, hdmi %d, bt: %d\n",
-               sdw_be_num, ssp_num, dmic_num, hdmi_num, bt_num);
+               sdw_be_num, ssp_num, dmic_num,
+               ctx->hdmi.idisp_codec ? hdmi_num : 0, bt_num);
 
        /* allocate BE dailinks */
        num_links = sdw_be_num + ssp_num + dmic_num + hdmi_num + bt_num;