--- /dev/null
+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;
+ }
+