ASoC: hdac_hda: Conditionally register dais for HDMI and Analog
authorPeter Ujfalusi <peter.ujfalusi@linux.intel.com>
Tue, 28 Nov 2023 12:39:14 +0000 (14:39 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Sat, 20 Jan 2024 10:51:40 +0000 (11:51 +0100)
[ Upstream commit a0575b4add21a243cc3257e75ad913cd5377d5f2 ]

The current driver is registering the same dais for each hdev found in the
system which results duplicated widgets to be registered and the kernel
log contains similar prints:
snd_hda_codec_realtek ehdaudio0D0: ASoC: sink widget AIF1TX overwritten
snd_hda_codec_realtek ehdaudio0D0: ASoC: source widget AIF1RX overwritten
skl_hda_dsp_generic skl_hda_dsp_generic: ASoC: sink widget hifi3 overwritten
skl_hda_dsp_generic skl_hda_dsp_generic: ASoC: sink widget hifi2 overwritten
skl_hda_dsp_generic skl_hda_dsp_generic: ASoC: sink widget hifi1 overwritten
skl_hda_dsp_generic skl_hda_dsp_generic: ASoC: source widget Codec Output Pin1 overwritten
skl_hda_dsp_generic skl_hda_dsp_generic: ASoC: sink widget Codec Input Pin1 overwritten
skl_hda_dsp_generic skl_hda_dsp_generic: ASoC: sink widget Analog Codec Playback overwritten
skl_hda_dsp_generic skl_hda_dsp_generic: ASoC: sink widget Digital Codec Playback overwritten
skl_hda_dsp_generic skl_hda_dsp_generic: ASoC: sink widget Alt Analog Codec Playback overwritten
skl_hda_dsp_generic skl_hda_dsp_generic: ASoC: source widget Analog Codec Capture overwritten
skl_hda_dsp_generic skl_hda_dsp_generic: ASoC: source widget Digital Codec Capture overwritten
skl_hda_dsp_generic skl_hda_dsp_generic: ASoC: source widget Alt Analog Codec Capture overwritten

To avoid such issue, split the dai array into HDMI and non HDMI array and
register them conditionally:
for HDMI hdev only register the dais needed for HDMI
for non HDMI hdev do not  register the HDMI dais.

Depends-on: 3d1dc8b1030d ("ASoC: Intel: skl_hda_dsp_generic: Drop HDMI routes when HDMI is not available")
Link: https://github.com/thesofproject/linux/issues/4509
Signed-off-by: Peter Ujfalusi <peter.ujfalusi@linux.intel.com>
Reviewed-by: Kai Vehmanen <kai.vehmanen@linux.intel.com>
Link: https://lore.kernel.org/r/20231128123914.3986-1-peter.ujfalusi@linux.intel.com
Signed-off-by: Mark Brown <broonie@kernel.org>
Signed-off-by: Sasha Levin <sashal@kernel.org>
sound/soc/codecs/hdac_hda.c

index be66853..d59d38c 100644 (file)
@@ -124,6 +124,9 @@ static struct snd_soc_dai_driver hdac_hda_dais[] = {
                .sig_bits = 24,
        },
 },
+};
+
+static struct snd_soc_dai_driver hdac_hda_hdmi_dais[] = {
 {
        .id = HDAC_HDMI_0_DAI_ID,
        .name = "intel-hdmi-hifi1",
@@ -578,8 +581,16 @@ static const struct snd_soc_component_driver hdac_hda_codec = {
        .endianness             = 1,
 };
 
+static const struct snd_soc_component_driver hdac_hda_hdmi_codec = {
+       .probe                  = hdac_hda_codec_probe,
+       .remove                 = hdac_hda_codec_remove,
+       .idle_bias_on           = false,
+       .endianness             = 1,
+};
+
 static int hdac_hda_dev_probe(struct hdac_device *hdev)
 {
+       struct hdac_hda_priv *hda_pvt = dev_get_drvdata(&hdev->dev);
        struct hdac_ext_link *hlink;
        int ret;
 
@@ -592,9 +603,15 @@ static int hdac_hda_dev_probe(struct hdac_device *hdev)
        snd_hdac_ext_bus_link_get(hdev->bus, hlink);
 
        /* ASoC specific initialization */
-       ret = devm_snd_soc_register_component(&hdev->dev,
-                                        &hdac_hda_codec, hdac_hda_dais,
-                                        ARRAY_SIZE(hdac_hda_dais));
+       if (hda_pvt->need_display_power)
+               ret = devm_snd_soc_register_component(&hdev->dev,
+                                               &hdac_hda_hdmi_codec, hdac_hda_hdmi_dais,
+                                               ARRAY_SIZE(hdac_hda_hdmi_dais));
+       else
+               ret = devm_snd_soc_register_component(&hdev->dev,
+                                               &hdac_hda_codec, hdac_hda_dais,
+                                               ARRAY_SIZE(hdac_hda_dais));
+
        if (ret < 0) {
                dev_err(&hdev->dev, "failed to register HDA codec %d\n", ret);
                return ret;