| From c344ef36dbc2fe920ec7291b68b11fe867a2c8f6 Mon Sep 17 00:00:00 2001 |
| From: Peter Ujfalusi <peter.ujfalusi@linux.intel.com> |
| Date: Thu, 7 Dec 2023 11:54:25 +0200 |
| Subject: ASoC: SOF: Intel: hda-codec: Delay the codec device registration |
| |
| From: Peter Ujfalusi <peter.ujfalusi@linux.intel.com> |
| |
| commit c344ef36dbc2fe920ec7291b68b11fe867a2c8f6 upstream. |
| |
| The current code flow is: |
| 1. snd_hdac_device_register() |
| 2. set parameters needed by the hdac driver |
| 3. request_codec_module() |
| the hdac driver is probed at this point |
| |
| During boot the codec drivers are not loaded when the hdac device is |
| registered, it is going to be probed later when loading the codec module, |
| which point the parameters are set. |
| |
| On module remove/insert |
| rmmod snd_sof_pci_intel_tgl |
| modprobe snd_sof_pci_intel_tgl |
| |
| The codec module remains loaded and the driver will be probed when the |
| hdac device is created right away, before the parameters for the driver |
| has been configured: |
| |
| 1. snd_hdac_device_register() |
| the hdac driver is probed at this point |
| 2. set parameters needed by the hdac driver |
| 3. request_codec_module() |
| will be a NOP as the module is already loaded |
| |
| Move the snd_hdac_device_register() later, to be done right before |
| requesting the codec module to make sure that the parameters are all set |
| before the device is created: |
| |
| 1. set parameters needed by the hdac driver |
| 2. snd_hdac_device_register() |
| 3. request_codec_module() |
| |
| This way at the hdac driver probe all parameters will be set in all cases. |
| |
| Link: https://github.com/thesofproject/linux/issues/4731 |
| Fixes: a0575b4add21 ("ASoC: hdac_hda: Conditionally register dais for HDMI and Analog") |
| Signed-off-by: Peter Ujfalusi <peter.ujfalusi@linux.intel.com> |
| Reviewed-by: Bard Liao <yung-chuan.liao@linux.intel.com> |
| Reviewed-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com> |
| Link: https://lore.kernel.org/r/20231207095425.19597-1-peter.ujfalusi@linux.intel.com |
| Signed-off-by: Mark Brown <broonie@kernel.org> |
| Link: https://lore.kernel.org/r/ZYvUIxtrqBQZbNlC@shine.dominikbrodowski.net |
| Link: https://bugzilla.kernel.org/show_bug.cgi?id=218304 |
| Signed-off-by: Takashi Iwai <tiwai@suse.de> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| --- |
| sound/soc/sof/intel/hda-codec.c | 18 +++++++++--------- |
| 1 file changed, 9 insertions(+), 9 deletions(-) |
| |
| --- a/sound/soc/sof/intel/hda-codec.c |
| +++ b/sound/soc/sof/intel/hda-codec.c |
| @@ -54,8 +54,16 @@ static int request_codec_module(struct h |
| |
| static int hda_codec_load_module(struct hda_codec *codec) |
| { |
| - int ret = request_codec_module(codec); |
| + int ret; |
| + |
| + ret = snd_hdac_device_register(&codec->core); |
| + if (ret) { |
| + dev_err(&codec->core.dev, "failed to register hdac device\n"); |
| + put_device(&codec->core.dev); |
| + return ret; |
| + } |
| |
| + ret = request_codec_module(codec); |
| if (ret <= 0) { |
| codec->probe_id = HDA_CODEC_ID_GENERIC; |
| ret = request_codec_module(codec); |
| @@ -112,7 +120,6 @@ EXPORT_SYMBOL_NS(hda_codec_jack_check, S |
| static struct hda_codec *hda_codec_device_init(struct hdac_bus *bus, int addr, int type) |
| { |
| struct hda_codec *codec; |
| - int ret; |
| |
| codec = snd_hda_codec_device_init(to_hda_bus(bus), addr, "ehdaudio%dD%d", bus->idx, addr); |
| if (IS_ERR(codec)) { |
| @@ -122,13 +129,6 @@ static struct hda_codec *hda_codec_devic |
| |
| codec->core.type = type; |
| |
| - ret = snd_hdac_device_register(&codec->core); |
| - if (ret) { |
| - dev_err(bus->dev, "failed to register hdac device\n"); |
| - put_device(&codec->core.dev); |
| - return ERR_PTR(ret); |
| - } |
| - |
| return codec; |
| } |
| |