]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/commitdiff
6.1-stable patches
authorGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 17 Jan 2024 12:03:37 +0000 (13:03 +0100)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 17 Jan 2024 12:03:37 +0000 (13:03 +0100)
added patches:
asoc-sof-intel-hda-codec-delay-the-codec-device-registration.patch

queue-6.1/asoc-sof-intel-hda-codec-delay-the-codec-device-registration.patch [new file with mode: 0644]
queue-6.1/series

diff --git a/queue-6.1/asoc-sof-intel-hda-codec-delay-the-codec-device-registration.patch b/queue-6.1/asoc-sof-intel-hda-codec-delay-the-codec-device-registration.patch
new file mode 100644 (file)
index 0000000..ef6d82c
--- /dev/null
@@ -0,0 +1,100 @@
+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;
+ }
index 8a077696792150499db1ac997c475034610a485c..f1d0915cf3fb5e6feeab38be1c1e5b7a17ccd6a2 100644 (file)
@@ -81,3 +81,4 @@ arm-sun9i-smp-fix-return-code-check-of-of_property_m.patch
 drm-crtc-fix-uninitialized-variable-use.patch
 alsa-hda-realtek-fix-mute-and-mic-mute-leds-for-hp-envy-x360-13-ay0xxx.patch
 acpi-resource-add-another-dmi-match-for-the-tongfang-gmxxgxx.patch
+asoc-sof-intel-hda-codec-delay-the-codec-device-registration.patch