On 11/28/23 06:39, Peter Ujfalusi wrote:
> 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@xxxxxxxxxxxxxxx>
> ---
> Hi,
>
> Changes since v1:
> - Drop the patch for patch_hdmi to export a funtion to match the device
> - Use the struct hdac_hda_priv.need_display_power boolean as indication that the
> device is a HDMI/DP audio codec
LGTM.
Reviewed-by: Pierre-Louis Bossart <pierre-louis.bossart@xxxxxxxxxxxxxxx>
> Regards,
> Peter
>
> sound/soc/codecs/hdac_hda.c | 23 ++++++++++++++++++++---
> 1 file changed, 20 insertions(+), 3 deletions(-)
>
> diff --git a/sound/soc/codecs/hdac_hda.c b/sound/soc/codecs/hdac_hda.c
> index 355f30779a34..b075689db2dc 100644
> --- a/sound/soc/codecs/hdac_hda.c
> +++ b/sound/soc/codecs/hdac_hda.c
> @@ -132,6 +132,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",
> @@ -607,8 +610,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;
>
> @@ -621,9 +632,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;
[Index of Archives]
[Pulseaudio]
[Linux Audio Users]
[ALSA Devel]
[Fedora Desktop]
[Fedora SELinux]
[Big List of Linux Books]
[Yosemite News]
[KDE Users]