summarylogtreecommitdiffstats
diff options
context:
space:
mode:
authorJeka2023-09-14 22:57:31 +0300
committerJeka2023-09-14 22:57:31 +0300
commitd6c4b9298dbe30331764702bd49f6ed1c057c341 (patch)
tree6cff64030b63415e174c9cb5ee067538307b565a
parentd1d0ce6f3e085d43ba887a19d0907c24ce9e9c5f (diff)
downloadaur-d6c4b9298dbe30331764702bd49f6ed1c057c341.tar.gz
kernel release 6.5.3
-rw-r--r--.SRCINFO38
-rw-r--r--0001-ALSA-cs35l41-Use-mbox-command-to-enable-speaker-outp.patch238
-rw-r--r--0001-ALSA-hda-cs35l41-Support-ASUS-2023-laptops-with-miss.patch108
-rw-r--r--0001-Cirrus-no-dsdt.patch266
-rw-r--r--0001-GPU-reset.patch257
-rw-r--r--0002-ALSA-cs35l41-Poll-for-Power-Up-Down-rather-than-wait.patch141
-rw-r--r--0003-ALSA-hda-cs35l41-Check-mailbox-status-of-pause-comma.patch36
-rw-r--r--0004-ALSA-hda-cs35l41-Ensure-we-correctly-re-sync-regmap-.patch74
-rw-r--r--0005-ALSA-hda-cs35l41-Ensure-we-pass-up-any-errors-during.patch63
-rw-r--r--0006-ALSA-hda-cs35l41-Move-Play-and-Pause-into-separate-f.patch193
-rw-r--r--0007-ALSA-hda-hda_component-Add-pre-and-post-playback-hoo.patch56
-rw-r--r--0008-ALSA-hda-cs35l41-Use-pre-and-post-playback-hooks.patch122
-rw-r--r--0009-ALSA-hda-cs35l41-Rework-System-Suspend-to-ensure-cor.patch114
-rw-r--r--0010-ALSA-hda-cs35l41-Add-device_link-between-HDA-and-cs3.patch60
-rw-r--r--0011-ALSA-hda-cs35l41-Ensure-amp-is-only-unmuted-during-p.patch73
-rw-r--r--0998-patch_realtek.patch10
-rw-r--r--PKGBUILD40
-rw-r--r--config97
18 files changed, 1937 insertions, 49 deletions
diff --git a/.SRCINFO b/.SRCINFO
index baeb32afbc20..262d16ee67e8 100644
--- a/.SRCINFO
+++ b/.SRCINFO
@@ -1,6 +1,6 @@
pkgbase = linux-jcore
pkgdesc = Kernel for Manjaro/EndeavourOS/Arch (ACS override patch include)
- pkgver = 6.5
+ pkgver = 6.5.3
pkgrel = 1
url = https://www.kernel.org/
arch = x86_64
@@ -21,17 +21,47 @@ pkgbase = linux-jcore
replaces = linux-acs-manjaro
replaces = linux-acs-manjaro-headers
options = !strip
- source = https://cdn.kernel.org/pub/linux/kernel/v6.x/linux-6.5.tar.xz
+ source = https://cdn.kernel.org/pub/linux/kernel/v6.x/linux-6.5.3.tar.xz
source = config
source = 0101-ZEN_Add_sysctl_and_CONFIG_to_disallow_unprivileged_CLONE_NEWUSER.patch
source = 0201-asus-ally-asus-hid-6.5.patch
source = 0202-mt7921e_Perform_FLR_to_recovery_the_device.patch
+ source = 0001-GPU-reset.patch
+ source = 0001-Cirrus-no-dsdt.patch
+ source = 0001-ALSA-hda-cs35l41-Support-ASUS-2023-laptops-with-miss.patch
+ source = 0001-ALSA-cs35l41-Use-mbox-command-to-enable-speaker-outp.patch
+ source = 0002-ALSA-cs35l41-Poll-for-Power-Up-Down-rather-than-wait.patch
+ source = 0003-ALSA-hda-cs35l41-Check-mailbox-status-of-pause-comma.patch
+ source = 0004-ALSA-hda-cs35l41-Ensure-we-correctly-re-sync-regmap-.patch
+ source = 0005-ALSA-hda-cs35l41-Ensure-we-pass-up-any-errors-during.patch
+ source = 0006-ALSA-hda-cs35l41-Move-Play-and-Pause-into-separate-f.patch
+ source = 0007-ALSA-hda-hda_component-Add-pre-and-post-playback-hoo.patch
+ source = 0008-ALSA-hda-cs35l41-Use-pre-and-post-playback-hooks.patch
+ source = 0009-ALSA-hda-cs35l41-Rework-System-Suspend-to-ensure-cor.patch
+ source = 0010-ALSA-hda-cs35l41-Add-device_link-between-HDA-and-cs3.patch
+ source = 0011-ALSA-hda-cs35l41-Ensure-amp-is-only-unmuted-during-p.patch
+ source = 0998-patch_realtek.patch
source = 0999-acs.gitpatch
- sha256sums = 7a574bbc20802ea76b52ca7faf07267f72045e861b18915c5272a98c27abf884
- sha256sums = b528ea0ad54598bcea0fa64fd846b62b5164ffa1abf1594070515aae772d58c1
+ sha256sums = 4cac13f7b17bd8dcf9032ad68f9123ab5313d698c9f59416043165150763eb4f
+ sha256sums = fdfa0d96f3c11d4d52da67d4b0b1ddacdb8347daae88546eba72187d43d558b0
sha256sums = 05f04019d4a2ee072238c32860fa80d673687d84d78ef436ae9332b6fb788467
sha256sums = 6541760a7b0513ce52c7b2d67810135b1bd172849f52765e74a5ec0c7584dd56
sha256sums = d673d034fbcd80426fd8d9c6af56537c5fe5b55fe49d74e313474d7fc285ecc1
+ sha256sums = 11ff8e0119e1bd33a572e18a10dfb94f521b4e38ee5948d3c0508faf07835a78
+ sha256sums = ec6f9f062e94a62ecbec3a9e30bb6fc7ffd33e279eeb621674bfe4e4c398836a
+ sha256sums = 6536e2f6bcb881d412f99d6bf940487c0a79cc432a0ef7e6e60a24e6a445a8f2
+ sha256sums = 27aaf7e14c7f5e127f5b658352ca5c3650477a92462139557aefb73bcea2b418
+ sha256sums = 74da118887929f06afb57eaee716ff433ee5972c9dc91166fc08e66f44edb8e8
+ sha256sums = c5ac510677e58ac6b189939ac853e64bf9ad026a614a47f4cb535ad62bf41163
+ sha256sums = 88f0d69dad01ccfef899b6b08abe162fc7743d40571232dff9a7d9093890d0a8
+ sha256sums = 826bfa21b613d9c198d375d902958c90bb30171aee602c1806aaf99212abbb40
+ sha256sums = 0dae5e24249b712f1501ead600c8ef4a5df21484e39e06a1dbafb57929c4999f
+ sha256sums = 8dddf5537e3feedbf9f9c67f3c19fa7412d9e01b4f78023262b8fa340d3f47b2
+ sha256sums = 3774b4eba753eb5f3768a28a68eb1a17557c0347275c19b8133f9f74d64a80df
+ sha256sums = a5daf210a6f72dde5b477d4b6d38a162b2698cac6c5fcfd4e4fd606274f34cec
+ sha256sums = b9298bde48a9f6c5d028150d627c05c71880e2693933ef2fe070f090e80876a5
+ sha256sums = 4d53a6853b63c0f01b60b408bee61fa729656f925e50fa55ae3cba309668242a
+ sha256sums = 3aa9f1ca47bb078f3c9a52fe61897cf4fe989068cd7e66bfa6644fd605fa40d2
sha256sums = 458d7e024d33d4965b14b9b987f01a2884ff28761cff5da7c6a54132a95e9f36
pkgname = linux-jcore
diff --git a/0001-ALSA-cs35l41-Use-mbox-command-to-enable-speaker-outp.patch b/0001-ALSA-cs35l41-Use-mbox-command-to-enable-speaker-outp.patch
new file mode 100644
index 000000000000..57823933eba4
--- /dev/null
+++ b/0001-ALSA-cs35l41-Use-mbox-command-to-enable-speaker-outp.patch
@@ -0,0 +1,238 @@
+From c21139c6470a5b08c7463e451f2ff404e55f652f Mon Sep 17 00:00:00 2001
+From: Stefan Binding <sbinding@opensource.cirrus.com>
+Date: Fri, 21 Jul 2023 16:18:06 +0100
+Subject: [PATCH 01/11] ALSA: cs35l41: Use mbox command to enable speaker
+ output for external boost
+
+To enable the speaker output in external boost mode, 2 registers must
+be set, one after another. The longer the time between the writes of
+the two registers, the more likely, and more loudly a pop may occur.
+To minimize this, an mbox command can be used to allow the firmware
+to perform this action, minimizing any delay between write, thus
+minimizing any pop or click as a result. The old method will remain
+when running without firmware.
+
+Acked-by: Mark Brown <broonie@kernel.org>
+Signed-off-by: Stefan Binding <sbinding@opensource.cirrus.com>
+---
+ include/sound/cs35l41.h | 5 ++-
+ sound/pci/hda/cs35l41_hda.c | 9 ++--
+ sound/soc/codecs/cs35l41-lib.c | 76 +++++++++++++++++++++++++++-------
+ sound/soc/codecs/cs35l41.c | 8 ++--
+ 4 files changed, 74 insertions(+), 24 deletions(-)
+
+diff --git a/include/sound/cs35l41.h b/include/sound/cs35l41.h
+index 7239d943942c..1bf757901d02 100644
+--- a/include/sound/cs35l41.h
++++ b/include/sound/cs35l41.h
+@@ -829,6 +829,7 @@ enum cs35l41_cspl_mbox_cmd {
+ CSPL_MBOX_CMD_STOP_PRE_REINIT = 4,
+ CSPL_MBOX_CMD_HIBERNATE = 5,
+ CSPL_MBOX_CMD_OUT_OF_HIBERNATE = 6,
++ CSPL_MBOX_CMD_SPK_OUT_ENABLE = 7,
+ CSPL_MBOX_CMD_UNKNOWN_CMD = -1,
+ CSPL_MBOX_CMD_INVALID_SEQUENCE = -2,
+ };
+@@ -901,7 +902,7 @@ int cs35l41_exit_hibernate(struct device *dev, struct regmap *regmap);
+ int cs35l41_init_boost(struct device *dev, struct regmap *regmap,
+ struct cs35l41_hw_cfg *hw_cfg);
+ bool cs35l41_safe_reset(struct regmap *regmap, enum cs35l41_boost_type b_type);
+-int cs35l41_global_enable(struct regmap *regmap, enum cs35l41_boost_type b_type, int enable,
+- struct completion *pll_lock);
++int cs35l41_global_enable(struct device *dev, struct regmap *regmap, enum cs35l41_boost_type b_type,
++ int enable, struct completion *pll_lock, bool firmware_running);
+
+ #endif /* __CS35L41_H */
+diff --git a/sound/pci/hda/cs35l41_hda.c b/sound/pci/hda/cs35l41_hda.c
+index ce5faa620517..f9c97270db6f 100644
+--- a/sound/pci/hda/cs35l41_hda.c
++++ b/sound/pci/hda/cs35l41_hda.c
+@@ -514,13 +514,15 @@ static void cs35l41_hda_playback_hook(struct device *dev, int action)
+ break;
+ case HDA_GEN_PCM_ACT_PREPARE:
+ mutex_lock(&cs35l41->fw_mutex);
+- ret = cs35l41_global_enable(reg, cs35l41->hw_cfg.bst_type, 1, NULL);
++ ret = cs35l41_global_enable(dev, reg, cs35l41->hw_cfg.bst_type, 1, NULL,
++ cs35l41->firmware_running);
+ mutex_unlock(&cs35l41->fw_mutex);
+ break;
+ case HDA_GEN_PCM_ACT_CLEANUP:
+ mutex_lock(&cs35l41->fw_mutex);
+ regmap_multi_reg_write(reg, cs35l41_hda_mute, ARRAY_SIZE(cs35l41_hda_mute));
+- ret = cs35l41_global_enable(reg, cs35l41->hw_cfg.bst_type, 0, NULL);
++ ret = cs35l41_global_enable(dev, reg, cs35l41->hw_cfg.bst_type, 0, NULL,
++ cs35l41->firmware_running);
+ mutex_unlock(&cs35l41->fw_mutex);
+ break;
+ case HDA_GEN_PCM_ACT_CLOSE:
+@@ -672,7 +674,8 @@ static int cs35l41_runtime_suspend(struct device *dev)
+ if (cs35l41->playback_started) {
+ regmap_multi_reg_write(cs35l41->regmap, cs35l41_hda_mute,
+ ARRAY_SIZE(cs35l41_hda_mute));
+- cs35l41_global_enable(cs35l41->regmap, cs35l41->hw_cfg.bst_type, 0, NULL);
++ cs35l41_global_enable(cs35l41->dev, cs35l41->regmap, cs35l41->hw_cfg.bst_type, 0,
++ NULL, cs35l41->firmware_running);
+ regmap_update_bits(cs35l41->regmap, CS35L41_PWR_CTRL2,
+ CS35L41_AMP_EN_MASK, 0 << CS35L41_AMP_EN_SHIFT);
+ if (cs35l41->hw_cfg.bst_type == CS35L41_EXT_BOOST)
+diff --git a/sound/soc/codecs/cs35l41-lib.c b/sound/soc/codecs/cs35l41-lib.c
+index 1e4205295a0d..a7556fa33cdd 100644
+--- a/sound/soc/codecs/cs35l41-lib.c
++++ b/sound/soc/codecs/cs35l41-lib.c
+@@ -1080,28 +1080,32 @@ static const struct reg_sequence cs35l41_safe_to_reset[] = {
+ { 0x00000040, 0x00000033 },
+ };
+
+-static const struct reg_sequence cs35l41_active_to_safe[] = {
++static const struct reg_sequence cs35l41_active_to_safe_start[] = {
+ { 0x00000040, 0x00000055 },
+ { 0x00000040, 0x000000AA },
+ { 0x00007438, 0x00585941 },
+ { CS35L41_PWR_CTRL1, 0x00000000 },
+- { 0x0000742C, 0x00000009, 3000 },
++ { 0x0000742C, 0x00000009 },
++};
++
++static const struct reg_sequence cs35l41_active_to_safe_end[] = {
+ { 0x00007438, 0x00580941 },
+ { 0x00000040, 0x000000CC },
+ { 0x00000040, 0x00000033 },
+ };
+
+-static const struct reg_sequence cs35l41_safe_to_active[] = {
++static const struct reg_sequence cs35l41_safe_to_active_start[] = {
+ { 0x00000040, 0x00000055 },
+ { 0x00000040, 0x000000AA },
+ { 0x0000742C, 0x0000000F },
+ { 0x0000742C, 0x00000079 },
+ { 0x00007438, 0x00585941 },
+- { CS35L41_PWR_CTRL1, 0x00000001, 3000 }, // GLOBAL_EN = 1
++ { CS35L41_PWR_CTRL1, 0x00000001 }, // GLOBAL_EN = 1
++};
++
++static const struct reg_sequence cs35l41_safe_to_active_en_spk[] = {
+ { 0x0000742C, 0x000000F9 },
+ { 0x00007438, 0x00580941 },
+- { 0x00000040, 0x000000CC },
+- { 0x00000040, 0x00000033 },
+ };
+
+ static const struct reg_sequence cs35l41_reset_to_safe[] = {
+@@ -1188,11 +1192,11 @@ bool cs35l41_safe_reset(struct regmap *regmap, enum cs35l41_boost_type b_type)
+ }
+ EXPORT_SYMBOL_GPL(cs35l41_safe_reset);
+
+-int cs35l41_global_enable(struct regmap *regmap, enum cs35l41_boost_type b_type, int enable,
+- struct completion *pll_lock)
++int cs35l41_global_enable(struct device *dev, struct regmap *regmap, enum cs35l41_boost_type b_type,
++ int enable, struct completion *pll_lock, bool firmware_running)
+ {
+ int ret;
+- unsigned int gpio1_func, pad_control, pwr_ctrl1, pwr_ctrl3;
++ unsigned int gpio1_func, pad_control, pwr_ctrl1, pwr_ctrl3, int_status;
+ struct reg_sequence cs35l41_mdsync_down_seq[] = {
+ {CS35L41_PWR_CTRL3, 0},
+ {CS35L41_GPIO_PAD_CONTROL, 0},
+@@ -1204,6 +1208,14 @@ int cs35l41_global_enable(struct regmap *regmap, enum cs35l41_boost_type b_type,
+ {CS35L41_PWR_CTRL1, 0x00000001, 3000},
+ };
+
++ if ((pwr_ctl1_val & CS35L41_GLOBAL_EN_MASK) && enable) {
++ dev_dbg(dev, "Cannot set Global Enable - already set.\n");
++ return 0;
++ } else if (!(pwr_ctl1_val & CS35L41_GLOBAL_EN_MASK) && !enable) {
++ dev_dbg(dev, "Cannot unset Global Enable - not set.\n");
++ return 0;
++ }
++
+ switch (b_type) {
+ case CS35L41_SHD_BOOST_ACTV:
+ case CS35L41_SHD_BOOST_PASS:
+@@ -1244,16 +1256,48 @@ int cs35l41_global_enable(struct regmap *regmap, enum cs35l41_boost_type b_type,
+ case CS35L41_INT_BOOST:
+ ret = regmap_update_bits(regmap, CS35L41_PWR_CTRL1, CS35L41_GLOBAL_EN_MASK,
+ enable << CS35L41_GLOBAL_EN_SHIFT);
++ if (ret) {
++ dev_err(dev, "CS35L41_PWR_CTRL1 set failed: %d\n", ret);
++ return ret;
++ }
+ usleep_range(3000, 3100);
+ break;
+ case CS35L41_EXT_BOOST:
+ case CS35L41_EXT_BOOST_NO_VSPK_SWITCH:
+- if (enable)
+- ret = regmap_multi_reg_write(regmap, cs35l41_safe_to_active,
+- ARRAY_SIZE(cs35l41_safe_to_active));
+- else
+- ret = regmap_multi_reg_write(regmap, cs35l41_active_to_safe,
+- ARRAY_SIZE(cs35l41_active_to_safe));
++ if (enable) {
++ /* Test Key is unlocked here */
++ ret = regmap_multi_reg_write(regmap, cs35l41_safe_to_active_start,
++ ARRAY_SIZE(cs35l41_safe_to_active_start));
++ if (ret)
++ return ret;
++
++ usleep_range(3000, 3100);
++
++ if (firmware_running)
++ ret = cs35l41_set_cspl_mbox_cmd(dev, regmap,
++ CSPL_MBOX_CMD_SPK_OUT_ENABLE);
++ else
++ ret = regmap_multi_reg_write(regmap, cs35l41_safe_to_active_en_spk,
++ ARRAY_SIZE(cs35l41_safe_to_active_en_spk));
++
++ /* Lock the test key, it was unlocked during the multi_reg_write */
++ cs35l41_test_key_lock(dev, regmap);
++ } else {
++ /* Test Key is unlocked here */
++ ret = regmap_multi_reg_write(regmap, cs35l41_active_to_safe_start,
++ ARRAY_SIZE(cs35l41_active_to_safe_start));
++ if (ret) {
++ /* Lock the test key, it was unlocked during the multi_reg_write */
++ cs35l41_test_key_lock(dev, regmap);
++ return ret;
++ }
++
++ usleep_range(3000, 3100);
++
++ /* Test Key is locked here */
++ ret = regmap_multi_reg_write(regmap, cs35l41_active_to_safe_end,
++ ARRAY_SIZE(cs35l41_active_to_safe_end));
++ }
+ break;
+ default:
+ ret = -EINVAL;
+@@ -1344,6 +1388,8 @@ static bool cs35l41_check_cspl_mbox_sts(enum cs35l41_cspl_mbox_cmd cmd,
+ return (sts == CSPL_MBOX_STS_RUNNING);
+ case CSPL_MBOX_CMD_STOP_PRE_REINIT:
+ return (sts == CSPL_MBOX_STS_RDY_FOR_REINIT);
++ case CSPL_MBOX_CMD_SPK_OUT_ENABLE:
++ return (sts == CSPL_MBOX_STS_RUNNING);
+ default:
+ return false;
+ }
+diff --git a/sound/soc/codecs/cs35l41.c b/sound/soc/codecs/cs35l41.c
+index 6ac501f008ec..d4e9c9d9b50a 100644
+--- a/sound/soc/codecs/cs35l41.c
++++ b/sound/soc/codecs/cs35l41.c
+@@ -500,12 +500,12 @@ static int cs35l41_main_amp_event(struct snd_soc_dapm_widget *w,
+ cs35l41_pup_patch,
+ ARRAY_SIZE(cs35l41_pup_patch));
+
+- cs35l41_global_enable(cs35l41->regmap, cs35l41->hw_cfg.bst_type, 1,
+- &cs35l41->pll_lock);
++ ret = cs35l41_global_enable(cs35l41->dev, cs35l41->regmap, cs35l41->hw_cfg.bst_type,
++ 1, &cs35l41->pll_lock, cs35l41->dsp.cs_dsp.running);
+ break;
+ case SND_SOC_DAPM_POST_PMD:
+- cs35l41_global_enable(cs35l41->regmap, cs35l41->hw_cfg.bst_type, 0,
+- &cs35l41->pll_lock);
++ ret = cs35l41_global_enable(cs35l41->dev, cs35l41->regmap, cs35l41->hw_cfg.bst_type,
++ 0, &cs35l41->pll_lock, cs35l41->dsp.cs_dsp.running);
+
+ ret = regmap_read_poll_timeout(cs35l41->regmap, CS35L41_IRQ1_STATUS1,
+ val, val & CS35L41_PDN_DONE_MASK,
+--
+2.41.0
+
diff --git a/0001-ALSA-hda-cs35l41-Support-ASUS-2023-laptops-with-miss.patch b/0001-ALSA-hda-cs35l41-Support-ASUS-2023-laptops-with-miss.patch
new file mode 100644
index 000000000000..3ab4b163498b
--- /dev/null
+++ b/0001-ALSA-hda-cs35l41-Support-ASUS-2023-laptops-with-miss.patch
@@ -0,0 +1,108 @@
+From d99738ad5dd159028f354c1ece9eddabd16a0ed9 Mon Sep 17 00:00:00 2001
+From: "Luke D. Jones" <luke@ljones.dev>
+Date: Wed, 23 Aug 2023 11:05:59 +1200
+Subject: [PATCH] ALSA: hda: cs35l41: Support ASUS 2023 laptops with missing
+ DSD
+
+Support adding the missing DSD properties required for ASUS ROG 2023
+laptops and other ASUS laptops to properly utilise the cs35l41.
+
+The currently added laptops are:
+- ASUS GS650P, i2c
+- ASUS GA402X, i2c
+- ASUS GU604V, spi
+- ASUS GU603V, spi
+- ASUS GV601V, spi
+- ASUS GZ301V, spi
+- ASUS ROG ALLY, i2c
+- ASUS G614J, spi
+- ASUS G634J, spi
+- ASUS G614JI, spi
+- ASUS G713P, i2c
+
+The SPI connected amps may be required to use an external DSD patch
+to fix or add the "cs-gpios" property.
+
+Co-developed-by: Jonathan LoBue <jlobue10@gmail.com>
+Signed-off-by: Jonathan LoBue <jlobue10@gmail.com>
+Co-developed-by: Luke D. Jones <luke@ljones.dev>
+Signed-off-by: Luke D. Jones <luke@ljones.dev>
+---
+ sound/pci/hda/cs35l41_hda_property.c | 54 ++++++++++++++++++++++++++++
+ 1 file changed, 54 insertions(+)
+
+diff --git a/sound/pci/hda/cs35l41_hda_property.c b/sound/pci/hda/cs35l41_hda_property.c
+index 673f23257a09..2bf2365cef50 100644
+--- a/sound/pci/hda/cs35l41_hda_property.c
++++ b/sound/pci/hda/cs35l41_hda_property.c
+@@ -43,6 +43,49 @@ static int lenovo_legion_no_acpi(struct cs35l41_hda *cs35l41, struct device *phy
+ return 0;
+ }
+
++static int asus_rog_2023_i2c_no_acpi(struct cs35l41_hda *cs35l41, struct device *physdev, int id,
++ const char *hid)
++{
++ struct cs35l41_hw_cfg *hw_cfg = &cs35l41->hw_cfg;
++
++ /* check I2C address to assign the index */
++ cs35l41->index = id == 0x40 ? 0 : 1;
++ cs35l41->channel_index = 0;
++ cs35l41->reset_gpio = gpiod_get_index(physdev, NULL, 0, GPIOD_OUT_HIGH);
++ cs35l41->speaker_id = cs35l41_get_speaker_id(physdev, 0, 0, 2);
++ hw_cfg->spk_pos = cs35l41->index;
++ hw_cfg->gpio2.func = CS35L41_INTERRUPT;
++ hw_cfg->gpio2.valid = true;
++ hw_cfg->bst_type = CS35L41_EXT_BOOST_NO_VSPK_SWITCH;
++ hw_cfg->valid = true;
++
++ return 0;
++}
++
++/*
++ * Some SPI connected versions may be missing a chip select GPIO and require a DSD table patch.
++ */
++static int asus_rog_2023_spi_no_acpi(struct cs35l41_hda *cs35l41, struct device *physdev, int id,
++ const char *hid)
++{
++ struct cs35l41_hw_cfg *hw_cfg = &cs35l41->hw_cfg;
++
++ /* check SPI address to assign the index */
++ cs35l41->index = id == 0 ? 0 : 1;
++ cs35l41->channel_index = 0;
++ cs35l41->reset_gpio = gpiod_get_index(physdev, NULL, 0, GPIOD_OUT_HIGH);
++ cs35l41->speaker_id = cs35l41_get_speaker_id(physdev, 0, 0, 2);
++ hw_cfg->spk_pos = cs35l41->index;
++ hw_cfg->bst_type = CS35L41_EXT_BOOST;
++ hw_cfg->gpio1.func = CS35l41_VSPK_SWITCH;
++ hw_cfg->gpio1.valid = true;
++ hw_cfg->gpio2.func = CS35L41_INTERRUPT;
++ hw_cfg->gpio2.valid = true;
++ hw_cfg->valid = true;
++
++ return 0;
++}
++
+ struct cs35l41_prop_model {
+ const char *hid;
+ const char *ssid;
+@@ -53,6 +96,17 @@ struct cs35l41_prop_model {
+ const struct cs35l41_prop_model cs35l41_prop_model_table[] = {
+ { "CLSA0100", NULL, lenovo_legion_no_acpi },
+ { "CLSA0101", NULL, lenovo_legion_no_acpi },
++ { "CSC3551", "10431433", asus_rog_2023_i2c_no_acpi }, // ASUS GS650P
++ { "CSC3551", "10431463", asus_rog_2023_i2c_no_acpi }, // ASUS GA402X
++ { "CSC3551", "10431473", asus_rog_2023_spi_no_acpi }, // ASUS GU604V
++ { "CSC3551", "10431483", asus_rog_2023_spi_no_acpi }, // ASUS GU603V
++ { "CSC3551", "10431493", asus_rog_2023_spi_no_acpi }, // ASUS GV601V
++ { "CSC3551", "10431573", asus_rog_2023_spi_no_acpi }, // ASUS GZ301V
++ { "CSC3551", "104317F3", asus_rog_2023_i2c_no_acpi }, // ASUS ROG ALLY
++ { "CSC3551", "10431B93", asus_rog_2023_spi_no_acpi }, // ASUS G614J
++ { "CSC3551", "10431CAF", asus_rog_2023_spi_no_acpi }, // ASUS G634J
++ { "CSC3551", "10431C9F", asus_rog_2023_spi_no_acpi }, // ASUS G614JI
++ { "CSC3551", "10431D1F", asus_rog_2023_i2c_no_acpi }, // ASUS G713P
+ {}
+ };
+
+--
+2.41.0
+
diff --git a/0001-Cirrus-no-dsdt.patch b/0001-Cirrus-no-dsdt.patch
new file mode 100644
index 000000000000..8de56f9d3a69
--- /dev/null
+++ b/0001-Cirrus-no-dsdt.patch
@@ -0,0 +1,266 @@
+From git@z Thu Jan 1 00:00:00 1970
+Subject: [PATCH v1] ALSA: hda: cs35l41: Support systems with missing _DSD
+ properties
+From: Stefan Binding <sbinding@opensource.cirrus.com>
+Date: Tue, 15 Aug 2023 17:10:33 +0100
+Message-Id: <20230815161033.3519-1-sbinding@opensource.cirrus.com>
+MIME-Version: 1.0
+Content-Type: text/plain; charset="utf-8"
+Content-Transfer-Encoding: 7bit
+
+Some systems using CS35L41 with HDA were released without some
+required _DSD properties in ACPI. To support these special cases,
+add an api to configure the correct properties for systems with
+this issue.
+
+This initial commit moves the no _DSD support for Lenovo
+Legion Laptops (CLSA0100, CLSA0101) into a new framework which
+can be extended to support additional laptops in the future.
+
+Signed-off-by: Stefan Binding <sbinding@opensource.cirrus.com>
+---
+ sound/pci/hda/Makefile | 2 +-
+ sound/pci/hda/cs35l41_hda.c | 65 ++++++-------------------
+ sound/pci/hda/cs35l41_hda.h | 1 +
+ sound/pci/hda/cs35l41_hda_property.c | 73 ++++++++++++++++++++++++++++
+ sound/pci/hda/cs35l41_hda_property.h | 18 +++++++
+ 5 files changed, 108 insertions(+), 51 deletions(-)
+ create mode 100644 sound/pci/hda/cs35l41_hda_property.c
+ create mode 100644 sound/pci/hda/cs35l41_hda_property.h
+
+diff --git a/sound/pci/hda/Makefile b/sound/pci/hda/Makefile
+index c6e6509e7b8e..5506255be895 100644
+--- a/sound/pci/hda/Makefile
++++ b/sound/pci/hda/Makefile
+@@ -28,7 +28,7 @@ snd-hda-codec-via-objs := patch_via.o
+ snd-hda-codec-hdmi-objs := patch_hdmi.o hda_eld.o
+
+ # side codecs
+-snd-hda-scodec-cs35l41-objs := cs35l41_hda.o
++snd-hda-scodec-cs35l41-objs := cs35l41_hda.o cs35l41_hda_property.o
+ snd-hda-scodec-cs35l41-i2c-objs := cs35l41_hda_i2c.o
+ snd-hda-scodec-cs35l41-spi-objs := cs35l41_hda_spi.o
+ snd-hda-scodec-cs35l56-objs := cs35l56_hda.o
+diff --git a/sound/pci/hda/cs35l41_hda.c b/sound/pci/hda/cs35l41_hda.c
+index 825e551be9bb..f9b77353c266 100644
+--- a/sound/pci/hda/cs35l41_hda.c
++++ b/sound/pci/hda/cs35l41_hda.c
+@@ -19,6 +19,7 @@
+ #include "hda_component.h"
+ #include "cs35l41_hda.h"
+ #include "hda_cs_dsp_ctl.h"
++#include "cs35l41_hda_property.h"
+
+ #define CS35L41_FIRMWARE_ROOT "cirrus/"
+ #define CS35L41_PART "cs35l41"
+@@ -1315,8 +1316,7 @@ static int cs35l41_hda_apply_properties(struct cs35l41_hda *cs35l41)
+ return cs35l41_hda_channel_map(cs35l41->dev, 0, NULL, 1, &hw_cfg->spk_pos);
+ }
+
+-static int cs35l41_get_speaker_id(struct device *dev, int amp_index,
+- int num_amps, int fixed_gpio_id)
++int cs35l41_get_speaker_id(struct device *dev, int amp_index, int num_amps, int fixed_gpio_id)
+ {
+ struct gpio_desc *speaker_id_desc;
+ int speaker_id = -ENODEV;
+@@ -1370,49 +1370,6 @@ static int cs35l41_get_speaker_id(struct device *dev, int amp_index,
+ return speaker_id;
+ }
+
+-/*
+- * Device CLSA010(0/1) doesn't have _DSD so a gpiod_get by the label reset won't work.
+- * And devices created by serial-multi-instantiate don't have their device struct
+- * pointing to the correct fwnode, so acpi_dev must be used here.
+- * And devm functions expect that the device requesting the resource has the correct
+- * fwnode.
+- */
+-static int cs35l41_no_acpi_dsd(struct cs35l41_hda *cs35l41, struct device *physdev, int id,
+- const char *hid)
+-{
+- struct cs35l41_hw_cfg *hw_cfg = &cs35l41->hw_cfg;
+-
+- /* check I2C address to assign the index */
+- cs35l41->index = id == 0x40 ? 0 : 1;
+- cs35l41->channel_index = 0;
+- cs35l41->reset_gpio = gpiod_get_index(physdev, NULL, 0, GPIOD_OUT_HIGH);
+- cs35l41->speaker_id = cs35l41_get_speaker_id(physdev, 0, 0, 2);
+- hw_cfg->spk_pos = cs35l41->index;
+- hw_cfg->gpio2.func = CS35L41_INTERRUPT;
+- hw_cfg->gpio2.valid = true;
+- hw_cfg->valid = true;
+-
+- if (strncmp(hid, "CLSA0100", 8) == 0) {
+- hw_cfg->bst_type = CS35L41_EXT_BOOST_NO_VSPK_SWITCH;
+- } else if (strncmp(hid, "CLSA0101", 8) == 0) {
+- hw_cfg->bst_type = CS35L41_EXT_BOOST;
+- hw_cfg->gpio1.func = CS35l41_VSPK_SWITCH;
+- hw_cfg->gpio1.valid = true;
+- } else {
+- /*
+- * Note: CLSA010(0/1) are special cases which use a slightly different design.
+- * All other HIDs e.g. CSC3551 require valid ACPI _DSD properties to be supported.
+- */
+- dev_err(cs35l41->dev, "Error: ACPI _DSD Properties are missing for HID %s.\n", hid);
+- hw_cfg->valid = false;
+- hw_cfg->gpio1.valid = false;
+- hw_cfg->gpio2.valid = false;
+- return -EINVAL;
+- }
+-
+- return 0;
+-}
+-
+ static int cs35l41_hda_read_acpi(struct cs35l41_hda *cs35l41, const char *hid, int id)
+ {
+ struct cs35l41_hw_cfg *hw_cfg = &cs35l41->hw_cfg;
+@@ -1438,12 +1395,17 @@ static int cs35l41_hda_read_acpi(struct cs35l41_hda *cs35l41, const char *hid, i
+ sub = NULL;
+ cs35l41->acpi_subsystem_id = sub;
+
++ ret = cs35l41_add_dsd_properties(cs35l41, physdev, id, hid);
++ if (!ret) {
++ dev_info(cs35l41->dev, "Using extra _DSD properties, bypassing _DSD in ACPI\n");
++ goto put_physdev;
++ }
++
+ property = "cirrus,dev-index";
+ ret = device_property_count_u32(physdev, property);
+- if (ret <= 0) {
+- ret = cs35l41_no_acpi_dsd(cs35l41, physdev, id, hid);
+- goto err_put_physdev;
+- }
++ if (ret <= 0)
++ goto err;
++
+ if (ret > ARRAY_SIZE(values)) {
+ ret = -EINVAL;
+ goto err;
+@@ -1533,7 +1495,10 @@ static int cs35l41_hda_read_acpi(struct cs35l41_hda *cs35l41, const char *hid, i
+
+ err:
+ dev_err(cs35l41->dev, "Failed property %s: %d\n", property, ret);
+-err_put_physdev:
++ hw_cfg->valid = false;
++ hw_cfg->gpio1.valid = false;
++ hw_cfg->gpio2.valid = false;
++put_physdev:
+ put_device(physdev);
+
+ return ret;
+diff --git a/sound/pci/hda/cs35l41_hda.h b/sound/pci/hda/cs35l41_hda.h
+index bdb35f3be68a..b93bf762976e 100644
+--- a/sound/pci/hda/cs35l41_hda.h
++++ b/sound/pci/hda/cs35l41_hda.h
+@@ -83,5 +83,6 @@ extern const struct dev_pm_ops cs35l41_hda_pm_ops;
+ int cs35l41_hda_probe(struct device *dev, const char *device_name, int id, int irq,
+ struct regmap *regmap);
+ void cs35l41_hda_remove(struct device *dev);
++int cs35l41_get_speaker_id(struct device *dev, int amp_index, int num_amps, int fixed_gpio_id);
+
+ #endif /*__CS35L41_HDA_H__*/
+diff --git a/sound/pci/hda/cs35l41_hda_property.c b/sound/pci/hda/cs35l41_hda_property.c
+new file mode 100644
+index 000000000000..673f23257a09
+--- /dev/null
++++ b/sound/pci/hda/cs35l41_hda_property.c
+@@ -0,0 +1,73 @@
++// SPDX-License-Identifier: GPL-2.0
++//
++// CS35L41 ALSA HDA Property driver
++//
++// Copyright 2023 Cirrus Logic, Inc.
++//
++// Author: Stefan Binding <sbinding@opensource.cirrus.com>
++
++#include <linux/gpio/consumer.h>
++#include <linux/string.h>
++#include "cs35l41_hda_property.h"
++
++/*
++ * Device CLSA010(0/1) doesn't have _DSD so a gpiod_get by the label reset won't work.
++ * And devices created by serial-multi-instantiate don't have their device struct
++ * pointing to the correct fwnode, so acpi_dev must be used here.
++ * And devm functions expect that the device requesting the resource has the correct
++ * fwnode.
++ */
++static int lenovo_legion_no_acpi(struct cs35l41_hda *cs35l41, struct device *physdev, int id,
++ const char *hid)
++{
++ struct cs35l41_hw_cfg *hw_cfg = &cs35l41->hw_cfg;
++
++ /* check I2C address to assign the index */
++ cs35l41->index = id == 0x40 ? 0 : 1;
++ cs35l41->channel_index = 0;
++ cs35l41->reset_gpio = gpiod_get_index(physdev, NULL, 0, GPIOD_OUT_HIGH);
++ cs35l41->speaker_id = cs35l41_get_speaker_id(physdev, 0, 0, 2);
++ hw_cfg->spk_pos = cs35l41->index;
++ hw_cfg->gpio2.func = CS35L41_INTERRUPT;
++ hw_cfg->gpio2.valid = true;
++ hw_cfg->valid = true;
++
++ if (strcmp(hid, "CLSA0100") == 0) {
++ hw_cfg->bst_type = CS35L41_EXT_BOOST_NO_VSPK_SWITCH;
++ } else if (strcmp(hid, "CLSA0101") == 0) {
++ hw_cfg->bst_type = CS35L41_EXT_BOOST;
++ hw_cfg->gpio1.func = CS35l41_VSPK_SWITCH;
++ hw_cfg->gpio1.valid = true;
++ }
++
++ return 0;
++}
++
++struct cs35l41_prop_model {
++ const char *hid;
++ const char *ssid;
++ int (*add_prop)(struct cs35l41_hda *cs35l41, struct device *physdev, int id,
++ const char *hid);
++};
++
++const struct cs35l41_prop_model cs35l41_prop_model_table[] = {
++ { "CLSA0100", NULL, lenovo_legion_no_acpi },
++ { "CLSA0101", NULL, lenovo_legion_no_acpi },
++ {}
++};
++
++int cs35l41_add_dsd_properties(struct cs35l41_hda *cs35l41, struct device *physdev, int id,
++ const char *hid)
++{
++ const struct cs35l41_prop_model *model;
++
++ for (model = cs35l41_prop_model_table; model->hid > 0; model++) {
++ if (!strcmp(model->hid, hid) &&
++ (!model->ssid ||
++ (cs35l41->acpi_subsystem_id &&
++ !strcmp(model->ssid, cs35l41->acpi_subsystem_id))))
++ return model->add_prop(cs35l41, physdev, id, hid);
++ }
++
++ return -ENOENT;
++}
+diff --git a/sound/pci/hda/cs35l41_hda_property.h b/sound/pci/hda/cs35l41_hda_property.h
+new file mode 100644
+index 000000000000..fd834042e2fd
+--- /dev/null
++++ b/sound/pci/hda/cs35l41_hda_property.h
+@@ -0,0 +1,18 @@
++/* SPDX-License-Identifier: GPL-2.0
++ *
++ * CS35L41 ALSA HDA Property driver
++ *
++ * Copyright 2023 Cirrus Logic, Inc.
++ *
++ * Author: Stefan Binding <sbinding@opensource.cirrus.com>
++ */
++
++#ifndef CS35L41_HDA_PROP_H
++#define CS35L41_HDA_PROP_H
++
++#include <linux/device.h>
++#include "cs35l41_hda.h"
++
++int cs35l41_add_dsd_properties(struct cs35l41_hda *cs35l41, struct device *physdev, int id,
++ const char *hid);
++#endif /* CS35L41_HDA_PROP_H */
+--
+2.34.1
+
diff --git a/0001-GPU-reset.patch b/0001-GPU-reset.patch
new file mode 100644
index 000000000000..32651f44f5e2
--- /dev/null
+++ b/0001-GPU-reset.patch
@@ -0,0 +1,257 @@
+From 69dfc1d574d2faddf770a40cf5d1f9715da33fd2 Mon Sep 17 00:00:00 2001
+From: Shashank Sharma <shashank.sharma@amd.com>
+Date: Mon, 7 Mar 2022 12:32:49 +0100
+Subject: [PATCH 1/3] drm: Add GPU reset sysfs event
+
+This patch adds a new sysfs event, which will indicate
+the userland about a GPU reset, and can also provide
+some information like:
+- process ID of the process involved with the GPU reset
+- process name of the involved process
+- the GPU status info (using flags)
+
+This patch also introduces the first flag of the flags
+bitmap, which can be appended as and when required.
+
+V2: Addressed review comments from Christian and Amar
+ - move the reset information structure to DRM layer
+ - drop _ctx from struct name
+ - make pid 32 bit(than 64)
+ - set flag when VRAM invalid (than valid)
+ - add process name as well (Amar)
+
+Cc: Alexandar Deucher <alexander.deucher@amd.com>
+Cc: Christian Koenig <christian.koenig@amd.com>
+Cc: Amaranath Somalapuram <amaranath.somalapuram@amd.com>
+Signed-off-by: Shashank Sharma <shashank.sharma@amd.com>
+(cherry picked from commit 90230bd9d9c7d979038547460c9a2cbbeff8d6b9)
+[Forward port to 6.0]
+Signed-off-by: Cristian Ciocaltea <cristian.ciocaltea@collabora.com>
+---
+ drivers/gpu/drm/drm_sysfs.c | 31 +++++++++++++++++++++++++++++++
+ include/drm/drm_sysfs.h | 10 ++++++++++
+ 2 files changed, 41 insertions(+)
+
+diff --git a/drivers/gpu/drm/drm_sysfs.c b/drivers/gpu/drm/drm_sysfs.c
+index 430e00b16eeca..4cf1b9b40e707 100644
+--- a/drivers/gpu/drm/drm_sysfs.c
++++ b/drivers/gpu/drm/drm_sysfs.c
+@@ -434,6 +434,37 @@ void drm_sysfs_connector_hotplug_event(struct drm_connector *connector)
+ }
+ EXPORT_SYMBOL(drm_sysfs_connector_hotplug_event);
+
++/**
++ * drm_sysfs_reset_event - generate a DRM uevent to indicate GPU reset
++ * @dev: DRM device
++ * @reset_info: The contextual information about the reset (like PID, flags)
++ *
++ * Send a uevent for the DRM device specified by @dev. This informs
++ * user that a GPU reset has occurred, so that an interested client
++ * can take any recovery or profiling measure.
++ */
++void drm_sysfs_reset_event(struct drm_device *dev, struct drm_reset_event *reset_info)
++{
++ unsigned char pid_str[13];
++ unsigned char flags_str[15];
++ unsigned char pname_str[TASK_COMM_LEN + 6];
++ unsigned char reset_str[] = "RESET=1";
++ char *envp[] = { reset_str, pid_str, pname_str, flags_str, NULL };
++
++ if (!reset_info) {
++ DRM_WARN("No reset info, not sending the event\n");
++ return;
++ }
++
++ DRM_DEBUG("generating reset event\n");
++
++ snprintf(pid_str, ARRAY_SIZE(pid_str), "PID=%u", reset_info->pid);
++ snprintf(pname_str, ARRAY_SIZE(pname_str), "NAME=%s", reset_info->pname);
++ snprintf(flags_str, ARRAY_SIZE(flags_str), "FLAGS=%u", reset_info->flags);
++ kobject_uevent_env(&dev->primary->kdev->kobj, KOBJ_CHANGE, envp);
++}
++EXPORT_SYMBOL(drm_sysfs_reset_event);
++
+ /**
+ * drm_sysfs_connector_status_event - generate a DRM uevent for connector
+ * property status change
+diff --git a/include/drm/drm_sysfs.h b/include/drm/drm_sysfs.h
+index 6273cac44e479..8c37d6a529328 100644
+--- a/include/drm/drm_sysfs.h
++++ b/include/drm/drm_sysfs.h
+@@ -1,17 +1,27 @@
+ /* SPDX-License-Identifier: GPL-2.0 */
+ #ifndef _DRM_SYSFS_H_
+ #define _DRM_SYSFS_H_
++#include <linux/sched.h>
++
++#define DRM_GPU_RESET_FLAG_VRAM_INVALID (1 << 0)
+
+ struct drm_device;
+ struct device;
+ struct drm_connector;
+ struct drm_property;
+
++struct drm_reset_event {
++ uint32_t pid;
++ uint32_t flags;
++ char pname[TASK_COMM_LEN];
++};
++
+ int drm_class_device_register(struct device *dev);
+ void drm_class_device_unregister(struct device *dev);
+
+ void drm_sysfs_hotplug_event(struct drm_device *dev);
+ void drm_sysfs_connector_hotplug_event(struct drm_connector *connector);
++void drm_sysfs_reset_event(struct drm_device *dev, struct drm_reset_event *reset_info);
+ void drm_sysfs_connector_status_event(struct drm_connector *connector,
+ struct drm_property *property);
+ #endif
+--
+2.41.0
+
+
+From b717d62ae484fe8fc2f87478960e95cad838f574 Mon Sep 17 00:00:00 2001
+From: Shashank Sharma <shashank.sharma@amd.com>
+Date: Mon, 7 Mar 2022 15:33:00 +0100
+Subject: [PATCH 2/3] drm/amdgpu: add work function for GPU reset event
+
+This patch adds a work function, which sends a GPU reset
+uevent and some contextual infomration, like the PID and
+some status flags. This work should be scheduled during
+a GPU reset.
+
+The userspace can do some recovery and post-processing work
+based on this event and information.
+
+V2: Addressed review comments from Christian
+- Changed the name of the work to gpu_reset_event_work
+- Added a structure to accommodate some additional information
+ (like a PID and some flags)
+- Do not add new structure in amdgpu.h
+
+Cc: Alexander Deucher <alexander.deucher@amd.com>
+Cc: Christian Koenig <christian.koenig@amd.com>
+Cc: Amaranath Somalapuram <amaranath.somalapuram@amd.com>
+Signed-off-by: Shashank Sharma <shashank.sharma@amd.com>
+(cherry picked from commit f63b09e78126f7da67b69409e2cce1d3ab2d7f46)
+[Forward port to 6.0]
+Signed-off-by: Cristian Ciocaltea <cristian.ciocaltea@collabora.com>
+---
+ drivers/gpu/drm/amd/amdgpu/amdgpu.h | 3 +++
+ drivers/gpu/drm/amd/amdgpu/amdgpu_device.c | 13 +++++++++++++
+ 2 files changed, 16 insertions(+)
+
+diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu.h b/drivers/gpu/drm/amd/amdgpu/amdgpu.h
+index 2eca58220550e..5c376f7f51f4f 100644
+--- a/drivers/gpu/drm/amd/amdgpu/amdgpu.h
++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu.h
+@@ -60,6 +60,7 @@
+ #include <drm/amdgpu_drm.h>
+ #include <drm/drm_gem.h>
+ #include <drm/drm_ioctl.h>
++#include <drm/drm_sysfs.h>
+
+ #include <kgd_kfd_interface.h>
+ #include "dm_pp_interface.h"
+@@ -1002,6 +1003,7 @@ struct amdgpu_device {
+
+ int asic_reset_res;
+ struct work_struct xgmi_reset_work;
++ struct work_struct gpu_reset_event_work;
+ struct list_head reset_list;
+
+ long gfx_timeout;
+@@ -1035,6 +1037,7 @@ struct amdgpu_device {
+ pci_channel_state_t pci_channel_state;
+
+ struct amdgpu_reset_control *reset_cntl;
++ struct drm_reset_event reset_event_info;
+ uint32_t ip_versions[MAX_HWIP][HWIP_MAX_INSTANCE];
+
+ bool ram_is_direct_mapped;
+diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
+index f1e9663b40510..08aa72743dfce 100644
+--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
+@@ -76,6 +76,7 @@
+ #include <linux/pm_runtime.h>
+
+ #include <drm/drm_drv.h>
++#include <drm/drm_sysfs.h>
+
+ MODULE_FIRMWARE("amdgpu/vega10_gpu_info.bin");
+ MODULE_FIRMWARE("amdgpu/vega12_gpu_info.bin");
+@@ -3355,6 +3356,17 @@ bool amdgpu_device_has_dc_support(struct amdgpu_device *adev)
+ return amdgpu_device_asic_has_dc_support(adev->asic_type);
+ }
+
++static void amdgpu_device_reset_event_func(struct work_struct *__work)
++{
++ struct amdgpu_device *adev = container_of(__work, struct amdgpu_device,
++ gpu_reset_event_work);
++ /*
++ * A GPU reset has happened, inform the userspace and pass the
++ * reset related information.
++ */
++ drm_sysfs_reset_event(&adev->ddev, &adev->reset_event_info);
++}
++
+ static void amdgpu_device_xgmi_reset_func(struct work_struct *__work)
+ {
+ struct amdgpu_device *adev =
+@@ -3606,6 +3618,7 @@ int amdgpu_device_init(struct amdgpu_device *adev,
+ amdgpu_device_delay_enable_gfx_off);
+
+ INIT_WORK(&adev->xgmi_reset_work, amdgpu_device_xgmi_reset_func);
++ INIT_WORK(&adev->gpu_reset_event_work, amdgpu_device_reset_event_func);
+
+ adev->gfx.gfx_off_req_count = 1;
+ adev->gfx.gfx_off_residency = 0;
+--
+2.41.0
+
+
+From b65228799e5ac96211b0e4c342d0a4478a1b6410 Mon Sep 17 00:00:00 2001
+From: Somalapuram Amaranath <Amaranath.Somalapuram@amd.com>
+Date: Thu, 10 Mar 2022 11:31:44 +0530
+Subject: [PATCH 3/3] drm/amdgpu: schedule GPU reset event work function
+
+Schedule work function with valid PID, process name,
+and vram lost status during a GPU reset/ recovery.
+
+Signed-off-by: Somalapuram Amaranath <Amaranath.Somalapuram@amd.com>
+(cherry picked from commit 293c019a84c6402b08db9579819b555b01cd613b)
+[Forward ported to 6.0]
+Signed-off-by: Cristian Ciocaltea <cristian.ciocaltea@collabora.com>
+---
+ drivers/gpu/drm/amd/amdgpu/amdgpu_device.c | 14 ++++++++++++++
+ 1 file changed, 14 insertions(+)
+
+diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
+index 08aa72743dfce..47ff7a56c6848 100644
+--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
+@@ -4924,6 +4924,20 @@ int amdgpu_do_asic_reset(struct list_head *device_list_handle,
+ reset_context->job->vm->task_info;
+ amdgpu_reset_capture_coredumpm(tmp_adev);
+ #endif
++ if (reset_context->job && reset_context->job->vm) {
++ tmp_adev->reset_event_info.pid =
++ reset_context->job->vm->task_info.pid;
++ memset(tmp_adev->reset_event_info.pname, 0, TASK_COMM_LEN);
++ strcpy(tmp_adev->reset_event_info.pname,
++ reset_context->job->vm->task_info.process_name);
++ } else {
++ tmp_adev->reset_event_info.pid = 0;
++ memset(tmp_adev->reset_event_info.pname, 0, TASK_COMM_LEN);
++ }
++
++ tmp_adev->reset_event_info.flags = vram_lost;
++ schedule_work(&tmp_adev->gpu_reset_event_work);
++
+ if (vram_lost) {
+ DRM_INFO("VRAM is lost due to GPU reset!\n");
+ amdgpu_inc_vram_lost(tmp_adev);
+--
+2.41.0
+
diff --git a/0002-ALSA-cs35l41-Poll-for-Power-Up-Down-rather-than-wait.patch b/0002-ALSA-cs35l41-Poll-for-Power-Up-Down-rather-than-wait.patch
new file mode 100644
index 000000000000..396384f9a457
--- /dev/null
+++ b/0002-ALSA-cs35l41-Poll-for-Power-Up-Down-rather-than-wait.patch
@@ -0,0 +1,141 @@
+From 437f5415c5ac8e49b0675f74132b6e1308b6e5c7 Mon Sep 17 00:00:00 2001
+From: Stefan Binding <sbinding@opensource.cirrus.com>
+Date: Fri, 21 Jul 2023 16:18:07 +0100
+Subject: [PATCH 02/11] ALSA: cs35l41: Poll for Power Up/Down rather than
+ waiting a fixed delay
+
+To ensure the chip has correctly powered up or down before continuing,
+the driver will now poll a register, rather than wait a fixed delay.
+
+Acked-by: Mark Brown <broonie@kernel.org>
+Signed-off-by: Stefan Binding <sbinding@opensource.cirrus.com>
+---
+ sound/soc/codecs/cs35l41-lib.c | 48 +++++++++++++++++++++++++++++++---
+ sound/soc/codecs/cs35l41.c | 10 -------
+ 2 files changed, 44 insertions(+), 14 deletions(-)
+
+diff --git a/sound/soc/codecs/cs35l41-lib.c b/sound/soc/codecs/cs35l41-lib.c
+index a7556fa33cdd..a9c559a676e7 100644
+--- a/sound/soc/codecs/cs35l41-lib.c
++++ b/sound/soc/codecs/cs35l41-lib.c
+@@ -1196,7 +1196,8 @@ int cs35l41_global_enable(struct device *dev, struct regmap *regmap, enum cs35l4
+ int enable, struct completion *pll_lock, bool firmware_running)
+ {
+ int ret;
+- unsigned int gpio1_func, pad_control, pwr_ctrl1, pwr_ctrl3, int_status;
++ unsigned int gpio1_func, pad_control, pwr_ctrl1, pwr_ctrl3, int_status, pup_pdn_mask;
++ unsigned int pwr_ctl1_val;
+ struct reg_sequence cs35l41_mdsync_down_seq[] = {
+ {CS35L41_PWR_CTRL3, 0},
+ {CS35L41_GPIO_PAD_CONTROL, 0},
+@@ -1208,6 +1209,12 @@ int cs35l41_global_enable(struct device *dev, struct regmap *regmap, enum cs35l4
+ {CS35L41_PWR_CTRL1, 0x00000001, 3000},
+ };
+
++ pup_pdn_mask = enable ? CS35L41_PUP_DONE_MASK : CS35L41_PDN_DONE_MASK;
++
++ ret = regmap_read(regmap, CS35L41_PWR_CTRL1, &pwr_ctl1_val);
++ if (ret)
++ return ret;
++
+ if ((pwr_ctl1_val & CS35L41_GLOBAL_EN_MASK) && enable) {
+ dev_dbg(dev, "Cannot set Global Enable - already set.\n");
+ return 0;
+@@ -1252,6 +1259,15 @@ int cs35l41_global_enable(struct device *dev, struct regmap *regmap, enum cs35l4
+ ret = regmap_multi_reg_write(regmap, cs35l41_mdsync_up_seq,
+ ARRAY_SIZE(cs35l41_mdsync_up_seq));
+ }
++
++ ret = regmap_read_poll_timeout(regmap, CS35L41_IRQ1_STATUS1,
++ int_status, int_status & pup_pdn_mask,
++ 1000, 100000);
++ if (ret)
++ dev_err(dev, "Enable(%d) failed: %d\n", enable, ret);
++
++ // Clear PUP/PDN status
++ regmap_write(regmap, CS35L41_IRQ1_STATUS1, pup_pdn_mask);
+ break;
+ case CS35L41_INT_BOOST:
+ ret = regmap_update_bits(regmap, CS35L41_PWR_CTRL1, CS35L41_GLOBAL_EN_MASK,
+@@ -1260,7 +1276,15 @@ int cs35l41_global_enable(struct device *dev, struct regmap *regmap, enum cs35l4
+ dev_err(dev, "CS35L41_PWR_CTRL1 set failed: %d\n", ret);
+ return ret;
+ }
+- usleep_range(3000, 3100);
++
++ ret = regmap_read_poll_timeout(regmap, CS35L41_IRQ1_STATUS1,
++ int_status, int_status & pup_pdn_mask,
++ 1000, 100000);
++ if (ret)
++ dev_err(dev, "Enable(%d) failed: %d\n", enable, ret);
++
++ /* Clear PUP/PDN status */
++ regmap_write(regmap, CS35L41_IRQ1_STATUS1, pup_pdn_mask);
+ break;
+ case CS35L41_EXT_BOOST:
+ case CS35L41_EXT_BOOST_NO_VSPK_SWITCH:
+@@ -1271,7 +1295,15 @@ int cs35l41_global_enable(struct device *dev, struct regmap *regmap, enum cs35l4
+ if (ret)
+ return ret;
+
+- usleep_range(3000, 3100);
++ ret = regmap_read_poll_timeout(regmap, CS35L41_IRQ1_STATUS1, int_status,
++ int_status & CS35L41_PUP_DONE_MASK, 1000, 100000);
++ if (ret) {
++ dev_err(dev, "Failed waiting for CS35L41_PUP_DONE_MASK: %d\n", ret);
++ /* Lock the test key, it was unlocked during the multi_reg_write */
++ cs35l41_test_key_lock(dev, regmap);
++ return ret;
++ }
++ regmap_write(regmap, CS35L41_IRQ1_STATUS1, CS35L41_PUP_DONE_MASK);
+
+ if (firmware_running)
+ ret = cs35l41_set_cspl_mbox_cmd(dev, regmap,
+@@ -1292,7 +1324,15 @@ int cs35l41_global_enable(struct device *dev, struct regmap *regmap, enum cs35l4
+ return ret;
+ }
+
+- usleep_range(3000, 3100);
++ ret = regmap_read_poll_timeout(regmap, CS35L41_IRQ1_STATUS1, int_status,
++ int_status & CS35L41_PDN_DONE_MASK, 1000, 100000);
++ if (ret) {
++ dev_err(dev, "Failed waiting for CS35L41_PDN_DONE_MASK: %d\n", ret);
++ /* Lock the test key, it was unlocked during the multi_reg_write */
++ cs35l41_test_key_lock(dev, regmap);
++ return ret;
++ }
++ regmap_write(regmap, CS35L41_IRQ1_STATUS1, CS35L41_PDN_DONE_MASK);
+
+ /* Test Key is locked here */
+ ret = regmap_multi_reg_write(regmap, cs35l41_active_to_safe_end,
+diff --git a/sound/soc/codecs/cs35l41.c b/sound/soc/codecs/cs35l41.c
+index d4e9c9d9b50a..2b3c36f02edb 100644
+--- a/sound/soc/codecs/cs35l41.c
++++ b/sound/soc/codecs/cs35l41.c
+@@ -491,7 +491,6 @@ static int cs35l41_main_amp_event(struct snd_soc_dapm_widget *w,
+ {
+ struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm);
+ struct cs35l41_private *cs35l41 = snd_soc_component_get_drvdata(component);
+- unsigned int val;
+ int ret = 0;
+
+ switch (event) {
+@@ -507,15 +506,6 @@ static int cs35l41_main_amp_event(struct snd_soc_dapm_widget *w,
+ ret = cs35l41_global_enable(cs35l41->dev, cs35l41->regmap, cs35l41->hw_cfg.bst_type,
+ 0, &cs35l41->pll_lock, cs35l41->dsp.cs_dsp.running);
+
+- ret = regmap_read_poll_timeout(cs35l41->regmap, CS35L41_IRQ1_STATUS1,
+- val, val & CS35L41_PDN_DONE_MASK,
+- 1000, 100000);
+- if (ret)
+- dev_warn(cs35l41->dev, "PDN failed: %d\n", ret);
+-
+- regmap_write(cs35l41->regmap, CS35L41_IRQ1_STATUS1,
+- CS35L41_PDN_DONE_MASK);
+-
+ regmap_multi_reg_write_bypassed(cs35l41->regmap,
+ cs35l41_pdn_patch,
+ ARRAY_SIZE(cs35l41_pdn_patch));
+--
+2.41.0
+
diff --git a/0003-ALSA-hda-cs35l41-Check-mailbox-status-of-pause-comma.patch b/0003-ALSA-hda-cs35l41-Check-mailbox-status-of-pause-comma.patch
new file mode 100644
index 000000000000..6eb272a81b13
--- /dev/null
+++ b/0003-ALSA-hda-cs35l41-Check-mailbox-status-of-pause-comma.patch
@@ -0,0 +1,36 @@
+From 796af5ec6c6bb2eadf78a96f629e2c7fba11123b Mon Sep 17 00:00:00 2001
+From: Stefan Binding <sbinding@opensource.cirrus.com>
+Date: Fri, 21 Jul 2023 16:18:08 +0100
+Subject: [PATCH 03/11] ALSA: hda: cs35l41: Check mailbox status of pause
+ command after firmware load
+
+Currently, we do not check the return status of the pause command,
+immediately after we load firmware. If the pause has failed,
+the firmware is not running.
+
+Signed-off-by: Stefan Binding <sbinding@opensource.cirrus.com>
+---
+ sound/pci/hda/cs35l41_hda.c | 7 ++++++-
+ 1 file changed, 6 insertions(+), 1 deletion(-)
+
+diff --git a/sound/pci/hda/cs35l41_hda.c b/sound/pci/hda/cs35l41_hda.c
+index f9c97270db6f..29f1dce45f1d 100644
+--- a/sound/pci/hda/cs35l41_hda.c
++++ b/sound/pci/hda/cs35l41_hda.c
+@@ -781,7 +781,12 @@ static int cs35l41_smart_amp(struct cs35l41_hda *cs35l41)
+ goto clean_dsp;
+ }
+
+- cs35l41_set_cspl_mbox_cmd(cs35l41->dev, cs35l41->regmap, CSPL_MBOX_CMD_PAUSE);
++ ret = cs35l41_set_cspl_mbox_cmd(cs35l41->dev, cs35l41->regmap, CSPL_MBOX_CMD_PAUSE);
++ if (ret) {
++ dev_err(cs35l41->dev, "Error waiting for DSP to pause: %u\n", ret);
++ goto clean_dsp;
++ }
++
+ cs35l41->firmware_running = true;
+
+ return 0;
+--
+2.41.0
+
diff --git a/0004-ALSA-hda-cs35l41-Ensure-we-correctly-re-sync-regmap-.patch b/0004-ALSA-hda-cs35l41-Ensure-we-correctly-re-sync-regmap-.patch
new file mode 100644
index 000000000000..d7cce6083559
--- /dev/null
+++ b/0004-ALSA-hda-cs35l41-Ensure-we-correctly-re-sync-regmap-.patch
@@ -0,0 +1,74 @@
+From 9684d3a1fbe55573eccd6c7e5f72dd519a4e406b Mon Sep 17 00:00:00 2001
+From: Stefan Binding <sbinding@opensource.cirrus.com>
+Date: Fri, 21 Jul 2023 16:18:09 +0100
+Subject: [PATCH 04/11] ALSA: hda: cs35l41: Ensure we correctly re-sync regmap
+ before system suspending.
+
+In order to properly system suspend, it is necessary to unload the firmware
+and ensure the chip is ready for shutdown (if necessary). If the system
+is currently in runtime suspend, it is necessary to wake up the device,
+and then make it ready. Currently, the wake does not correctly resync
+the device, which may mean it cannot suspend correctly. Fix this by
+performaing a resync.
+
+Signed-off-by: Stefan Binding <sbinding@opensource.cirrus.com>
+---
+ sound/pci/hda/cs35l41_hda.c | 32 +++++++++++++++++++++++++++-----
+ 1 file changed, 27 insertions(+), 5 deletions(-)
+
+diff --git a/sound/pci/hda/cs35l41_hda.c b/sound/pci/hda/cs35l41_hda.c
+index 29f1dce45f1d..f42457147ce4 100644
+--- a/sound/pci/hda/cs35l41_hda.c
++++ b/sound/pci/hda/cs35l41_hda.c
+@@ -574,21 +574,43 @@ static int cs35l41_hda_channel_map(struct device *dev, unsigned int tx_num, unsi
+ rx_slot);
+ }
+
+-static void cs35l41_ready_for_reset(struct cs35l41_hda *cs35l41)
++static int cs35l41_ready_for_reset(struct cs35l41_hda *cs35l41)
+ {
++ int ret = 0;
++
+ mutex_lock(&cs35l41->fw_mutex);
+ if (cs35l41->firmware_running) {
+
+ regcache_cache_only(cs35l41->regmap, false);
+
+- cs35l41_exit_hibernate(cs35l41->dev, cs35l41->regmap);
++ ret = cs35l41_exit_hibernate(cs35l41->dev, cs35l41->regmap);
++ if (ret) {
++ dev_warn(cs35l41->dev, "Unable to exit Hibernate.");
++ goto err;
++ }
++
++ /* Test key needs to be unlocked to allow the OTP settings to re-apply */
++ cs35l41_test_key_unlock(cs35l41->dev, cs35l41->regmap);
++ ret = regcache_sync(cs35l41->regmap);
++ cs35l41_test_key_lock(cs35l41->dev, cs35l41->regmap);
++ if (ret) {
++ dev_err(cs35l41->dev, "Failed to restore register cache: %d\n", ret);
++ goto err;
++ }
++
++ if (cs35l41->hw_cfg.bst_type == CS35L41_EXT_BOOST)
++ cs35l41_init_boost(cs35l41->dev, cs35l41->regmap, &cs35l41->hw_cfg);
++
+ cs35l41_shutdown_dsp(cs35l41);
+ cs35l41_safe_reset(cs35l41->regmap, cs35l41->hw_cfg.bst_type);
+-
+- regcache_cache_only(cs35l41->regmap, true);
+- regcache_mark_dirty(cs35l41->regmap);
+ }
++err:
++ regcache_cache_only(cs35l41->regmap, true);
++ regcache_mark_dirty(cs35l41->regmap);
++
+ mutex_unlock(&cs35l41->fw_mutex);
++
++ return ret;
+ }
+
+ static int cs35l41_system_suspend(struct device *dev)
+--
+2.41.0
+
diff --git a/0005-ALSA-hda-cs35l41-Ensure-we-pass-up-any-errors-during.patch b/0005-ALSA-hda-cs35l41-Ensure-we-pass-up-any-errors-during.patch
new file mode 100644
index 000000000000..5ced08481c91
--- /dev/null
+++ b/0005-ALSA-hda-cs35l41-Ensure-we-pass-up-any-errors-during.patch
@@ -0,0 +1,63 @@
+From 05bfc01172a34466e660465922d1cab5b460880f Mon Sep 17 00:00:00 2001
+From: Stefan Binding <sbinding@opensource.cirrus.com>
+Date: Fri, 21 Jul 2023 16:18:10 +0100
+Subject: [PATCH 05/11] ALSA: hda: cs35l41: Ensure we pass up any errors during
+ system suspend.
+
+There are several steps required to put the system into system suspend.
+Some of these steps may fail, so the driver should pass up the errors
+if they occur.
+
+Signed-off-by: Stefan Binding <sbinding@opensource.cirrus.com>
+---
+ sound/pci/hda/cs35l41_hda.c | 17 +++++++++++++----
+ 1 file changed, 13 insertions(+), 4 deletions(-)
+
+diff --git a/sound/pci/hda/cs35l41_hda.c b/sound/pci/hda/cs35l41_hda.c
+index f42457147ce4..d4a11f7b5dbd 100644
+--- a/sound/pci/hda/cs35l41_hda.c
++++ b/sound/pci/hda/cs35l41_hda.c
+@@ -626,17 +626,22 @@ static int cs35l41_system_suspend(struct device *dev)
+ }
+
+ ret = pm_runtime_force_suspend(dev);
+- if (ret)
++ if (ret) {
++ dev_err(dev, "System Suspend Failed, unable to runtime suspend: %d\n", ret);
+ return ret;
++ }
+
+ /* Shutdown DSP before system suspend */
+- cs35l41_ready_for_reset(cs35l41);
++ ret = cs35l41_ready_for_reset(cs35l41);
++
++ if (ret)
++ dev_err(dev, "System Suspend Failed, not ready for Reset: %d\n", ret);
+
+ /*
+ * Reset GPIO may be shared, so cannot reset here.
+ * However beyond this point, amps may be powered down.
+ */
+- return 0;
++ return ret;
+ }
+
+ static int cs35l41_system_resume(struct device *dev)
+@@ -659,9 +664,13 @@ static int cs35l41_system_resume(struct device *dev)
+ usleep_range(2000, 2100);
+
+ ret = pm_runtime_force_resume(dev);
++ if (ret) {
++ dev_err(dev, "System Resume Failed: Unable to runtime resume: %d\n", ret);
++ return ret;
++ }
+
+ mutex_lock(&cs35l41->fw_mutex);
+- if (!ret && cs35l41->request_fw_load && !cs35l41->fw_request_ongoing) {
++ if (cs35l41->request_fw_load && !cs35l41->fw_request_ongoing) {
+ cs35l41->fw_request_ongoing = true;
+ schedule_work(&cs35l41->fw_load_work);
+ }
+--
+2.41.0
+
diff --git a/0006-ALSA-hda-cs35l41-Move-Play-and-Pause-into-separate-f.patch b/0006-ALSA-hda-cs35l41-Move-Play-and-Pause-into-separate-f.patch
new file mode 100644
index 000000000000..b79792840f63
--- /dev/null
+++ b/0006-ALSA-hda-cs35l41-Move-Play-and-Pause-into-separate-f.patch
@@ -0,0 +1,193 @@
+From f352ce9e5389e4746f25bfec33f4e0ee4dcbf690 Mon Sep 17 00:00:00 2001
+From: Stefan Binding <sbinding@opensource.cirrus.com>
+Date: Fri, 21 Jul 2023 16:18:11 +0100
+Subject: [PATCH 06/11] ALSA: hda: cs35l41: Move Play and Pause into separate
+ functions
+
+This allows play and pause to be called from multiple places,
+which is necessary for system suspend and resume.
+
+Signed-off-by: Stefan Binding <sbinding@opensource.cirrus.com>
+---
+ sound/pci/hda/cs35l41_hda.c | 131 ++++++++++++++++++++++--------------
+ 1 file changed, 79 insertions(+), 52 deletions(-)
+
+diff --git a/sound/pci/hda/cs35l41_hda.c b/sound/pci/hda/cs35l41_hda.c
+index d4a11f7b5dbd..f77583b46b6b 100644
+--- a/sound/pci/hda/cs35l41_hda.c
++++ b/sound/pci/hda/cs35l41_hda.c
+@@ -483,63 +483,103 @@ static void cs35l41_irq_release(struct cs35l41_hda *cs35l41)
+ cs35l41->irq_errors = 0;
+ }
+
+-static void cs35l41_hda_playback_hook(struct device *dev, int action)
++static void cs35l41_hda_play_start(struct device *dev)
+ {
+ struct cs35l41_hda *cs35l41 = dev_get_drvdata(dev);
+ struct regmap *reg = cs35l41->regmap;
+- int ret = 0;
++
++ dev_dbg(dev, "Play (Start)\n");
++
++ if (cs35l41->playback_started) {
++ dev_dbg(dev, "Playback already started.");
++ return;
++ }
++
++ cs35l41->playback_started = true;
++
++ if (cs35l41->firmware_running) {
++ regmap_multi_reg_write(reg, cs35l41_hda_config_dsp,
++ ARRAY_SIZE(cs35l41_hda_config_dsp));
++ regmap_update_bits(reg, CS35L41_PWR_CTRL2,
++ CS35L41_VMON_EN_MASK | CS35L41_IMON_EN_MASK,
++ 1 << CS35L41_VMON_EN_SHIFT | 1 << CS35L41_IMON_EN_SHIFT);
++ cs35l41_set_cspl_mbox_cmd(cs35l41->dev, reg, CSPL_MBOX_CMD_RESUME);
++ } else {
++ regmap_multi_reg_write(reg, cs35l41_hda_config, ARRAY_SIZE(cs35l41_hda_config));
++ }
++ regmap_update_bits(reg, CS35L41_PWR_CTRL2, CS35L41_AMP_EN_MASK, 1 << CS35L41_AMP_EN_SHIFT);
++ if (cs35l41->hw_cfg.bst_type == CS35L41_EXT_BOOST)
++ regmap_write(reg, CS35L41_GPIO1_CTRL1, 0x00008001);
++
++}
++
++static void cs35l41_hda_play_done(struct device *dev)
++{
++ struct cs35l41_hda *cs35l41 = dev_get_drvdata(dev);
++ struct regmap *reg = cs35l41->regmap;
++
++ dev_dbg(dev, "Play (Complete)\n");
++
++ cs35l41_global_enable(dev, reg, cs35l41->hw_cfg.bst_type, 1, NULL,
++ cs35l41->firmware_running);
++}
++
++static void cs35l41_hda_pause_start(struct device *dev)
++{
++ struct cs35l41_hda *cs35l41 = dev_get_drvdata(dev);
++ struct regmap *reg = cs35l41->regmap;
++
++ dev_dbg(dev, "Pause (Start)\n");
++
++ regmap_multi_reg_write(reg, cs35l41_hda_mute, ARRAY_SIZE(cs35l41_hda_mute));
++ cs35l41_global_enable(dev, reg, cs35l41->hw_cfg.bst_type, 0, NULL,
++ cs35l41->firmware_running);
++}
++
++static void cs35l41_hda_pause_done(struct device *dev)
++{
++ struct cs35l41_hda *cs35l41 = dev_get_drvdata(dev);
++ struct regmap *reg = cs35l41->regmap;
++
++ dev_dbg(dev, "Pause (Complete)\n");
++
++ regmap_update_bits(reg, CS35L41_PWR_CTRL2, CS35L41_AMP_EN_MASK, 0 << CS35L41_AMP_EN_SHIFT);
++ if (cs35l41->hw_cfg.bst_type == CS35L41_EXT_BOOST)
++ regmap_write(reg, CS35L41_GPIO1_CTRL1, 0x00000001);
++ if (cs35l41->firmware_running) {
++ cs35l41_set_cspl_mbox_cmd(dev, reg, CSPL_MBOX_CMD_PAUSE);
++ regmap_update_bits(reg, CS35L41_PWR_CTRL2,
++ CS35L41_VMON_EN_MASK | CS35L41_IMON_EN_MASK,
++ 0 << CS35L41_VMON_EN_SHIFT | 0 << CS35L41_IMON_EN_SHIFT);
++ }
++ cs35l41_irq_release(cs35l41);
++ cs35l41->playback_started = false;
++}
++
++static void cs35l41_hda_playback_hook(struct device *dev, int action)
++{
++ struct cs35l41_hda *cs35l41 = dev_get_drvdata(dev);
+
+ switch (action) {
+ case HDA_GEN_PCM_ACT_OPEN:
+ pm_runtime_get_sync(dev);
+ mutex_lock(&cs35l41->fw_mutex);
+- cs35l41->playback_started = true;
+- if (cs35l41->firmware_running) {
+- regmap_multi_reg_write(reg, cs35l41_hda_config_dsp,
+- ARRAY_SIZE(cs35l41_hda_config_dsp));
+- regmap_update_bits(cs35l41->regmap, CS35L41_PWR_CTRL2,
+- CS35L41_VMON_EN_MASK | CS35L41_IMON_EN_MASK,
+- 1 << CS35L41_VMON_EN_SHIFT | 1 << CS35L41_IMON_EN_SHIFT);
+- cs35l41_set_cspl_mbox_cmd(cs35l41->dev, cs35l41->regmap,
+- CSPL_MBOX_CMD_RESUME);
+- } else {
+- regmap_multi_reg_write(reg, cs35l41_hda_config,
+- ARRAY_SIZE(cs35l41_hda_config));
+- }
+- ret = regmap_update_bits(reg, CS35L41_PWR_CTRL2,
+- CS35L41_AMP_EN_MASK, 1 << CS35L41_AMP_EN_SHIFT);
+- if (cs35l41->hw_cfg.bst_type == CS35L41_EXT_BOOST)
+- regmap_write(reg, CS35L41_GPIO1_CTRL1, 0x00008001);
++ cs35l41_hda_play_start(dev);
+ mutex_unlock(&cs35l41->fw_mutex);
+ break;
+ case HDA_GEN_PCM_ACT_PREPARE:
+ mutex_lock(&cs35l41->fw_mutex);
+- ret = cs35l41_global_enable(dev, reg, cs35l41->hw_cfg.bst_type, 1, NULL,
+- cs35l41->firmware_running);
++ cs35l41_hda_play_done(dev);
+ mutex_unlock(&cs35l41->fw_mutex);
+ break;
+ case HDA_GEN_PCM_ACT_CLEANUP:
+ mutex_lock(&cs35l41->fw_mutex);
+- regmap_multi_reg_write(reg, cs35l41_hda_mute, ARRAY_SIZE(cs35l41_hda_mute));
+- ret = cs35l41_global_enable(dev, reg, cs35l41->hw_cfg.bst_type, 0, NULL,
+- cs35l41->firmware_running);
++ cs35l41_hda_pause_start(dev);
+ mutex_unlock(&cs35l41->fw_mutex);
+ break;
+ case HDA_GEN_PCM_ACT_CLOSE:
+ mutex_lock(&cs35l41->fw_mutex);
+- ret = regmap_update_bits(reg, CS35L41_PWR_CTRL2,
+- CS35L41_AMP_EN_MASK, 0 << CS35L41_AMP_EN_SHIFT);
+- if (cs35l41->hw_cfg.bst_type == CS35L41_EXT_BOOST)
+- regmap_write(reg, CS35L41_GPIO1_CTRL1, 0x00000001);
+- if (cs35l41->firmware_running) {
+- cs35l41_set_cspl_mbox_cmd(cs35l41->dev, cs35l41->regmap,
+- CSPL_MBOX_CMD_PAUSE);
+- regmap_update_bits(cs35l41->regmap, CS35L41_PWR_CTRL2,
+- CS35L41_VMON_EN_MASK | CS35L41_IMON_EN_MASK,
+- 0 << CS35L41_VMON_EN_SHIFT | 0 << CS35L41_IMON_EN_SHIFT);
+- }
+- cs35l41_irq_release(cs35l41);
+- cs35l41->playback_started = false;
++ cs35l41_hda_pause_done(dev);
+ mutex_unlock(&cs35l41->fw_mutex);
+
+ pm_runtime_mark_last_busy(dev);
+@@ -549,9 +589,6 @@ static void cs35l41_hda_playback_hook(struct device *dev, int action)
+ dev_warn(cs35l41->dev, "Playback action not supported: %d\n", action);
+ break;
+ }
+-
+- if (ret)
+- dev_err(cs35l41->dev, "Regmap access fail: %d\n", ret);
+ }
+
+ static int cs35l41_hda_channel_map(struct device *dev, unsigned int tx_num, unsigned int *tx_slot,
+@@ -703,18 +740,8 @@ static int cs35l41_runtime_suspend(struct device *dev)
+ mutex_lock(&cs35l41->fw_mutex);
+
+ if (cs35l41->playback_started) {
+- regmap_multi_reg_write(cs35l41->regmap, cs35l41_hda_mute,
+- ARRAY_SIZE(cs35l41_hda_mute));
+- cs35l41_global_enable(cs35l41->dev, cs35l41->regmap, cs35l41->hw_cfg.bst_type, 0,
+- NULL, cs35l41->firmware_running);
+- regmap_update_bits(cs35l41->regmap, CS35L41_PWR_CTRL2,
+- CS35L41_AMP_EN_MASK, 0 << CS35L41_AMP_EN_SHIFT);
+- if (cs35l41->hw_cfg.bst_type == CS35L41_EXT_BOOST)
+- regmap_write(cs35l41->regmap, CS35L41_GPIO1_CTRL1, 0x00000001);
+- regmap_update_bits(cs35l41->regmap, CS35L41_PWR_CTRL2,
+- CS35L41_VMON_EN_MASK | CS35L41_IMON_EN_MASK,
+- 0 << CS35L41_VMON_EN_SHIFT | 0 << CS35L41_IMON_EN_SHIFT);
+- cs35l41->playback_started = false;
++ cs35l41_hda_pause_start(dev);
++ cs35l41_hda_pause_done(dev);
+ }
+
+ if (cs35l41->firmware_running) {
+--
+2.41.0
+
diff --git a/0007-ALSA-hda-hda_component-Add-pre-and-post-playback-hoo.patch b/0007-ALSA-hda-hda_component-Add-pre-and-post-playback-hoo.patch
new file mode 100644
index 000000000000..ab7d89945d9f
--- /dev/null
+++ b/0007-ALSA-hda-hda_component-Add-pre-and-post-playback-hoo.patch
@@ -0,0 +1,56 @@
+From c1bf8ed3a5f3d011276d975c7b1f62039bed160e Mon Sep 17 00:00:00 2001
+From: Stefan Binding <sbinding@opensource.cirrus.com>
+Date: Fri, 21 Jul 2023 16:18:12 +0100
+Subject: [PATCH 07/11] ALSA: hda: hda_component: Add pre and post playback
+ hooks to hda_component
+
+These hooks can be used to add callbacks that would be run before and after
+the main playback hooks. These hooks would be called for all amps, before
+moving on to the next hook, i.e. pre_playback_hook would be called for
+all amps, before the playback_hook is called for all amps, then finally
+the post_playback_hook is called for all amps.
+
+Signed-off-by: Stefan Binding <sbinding@opensource.cirrus.com>
+---
+ sound/pci/hda/hda_component.h | 2 ++
+ sound/pci/hda/patch_realtek.c | 10 +++++++++-
+ 2 files changed, 11 insertions(+), 1 deletion(-)
+
+diff --git a/sound/pci/hda/hda_component.h b/sound/pci/hda/hda_component.h
+index 534e845b9cd1..f170aec967c1 100644
+--- a/sound/pci/hda/hda_component.h
++++ b/sound/pci/hda/hda_component.h
+@@ -15,5 +15,7 @@ struct hda_component {
+ struct device *dev;
+ char name[HDA_MAX_NAME_SIZE];
+ struct hda_codec *codec;
++ void (*pre_playback_hook)(struct device *dev, int action);
+ void (*playback_hook)(struct device *dev, int action);
++ void (*post_playback_hook)(struct device *dev, int action);
+ };
+diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c
+index 44fccfb93cff..dff92679ae72 100644
+--- a/sound/pci/hda/patch_realtek.c
++++ b/sound/pci/hda/patch_realtek.c
+@@ -6716,9 +6716,17 @@ static void comp_generic_playback_hook(struct hda_pcm_stream *hinfo, struct hda_
+ int i;
+
+ for (i = 0; i < HDA_MAX_COMPONENTS; i++) {
+- if (spec->comps[i].dev)
++ if (spec->comps[i].dev && spec->comps[i].pre_playback_hook)
++ spec->comps[i].pre_playback_hook(spec->comps[i].dev, action);
++ }
++ for (i = 0; i < HDA_MAX_COMPONENTS; i++) {
++ if (spec->comps[i].dev && spec->comps[i].playback_hook)
+ spec->comps[i].playback_hook(spec->comps[i].dev, action);
+ }
++ for (i = 0; i < HDA_MAX_COMPONENTS; i++) {
++ if (spec->comps[i].dev && spec->comps[i].post_playback_hook)
++ spec->comps[i].post_playback_hook(spec->comps[i].dev, action);
++ }
+ }
+
+ struct cs35l41_dev_name {
+--
+2.41.0
+
diff --git a/0008-ALSA-hda-cs35l41-Use-pre-and-post-playback-hooks.patch b/0008-ALSA-hda-cs35l41-Use-pre-and-post-playback-hooks.patch
new file mode 100644
index 000000000000..ac5b0290b2bc
--- /dev/null
+++ b/0008-ALSA-hda-cs35l41-Use-pre-and-post-playback-hooks.patch
@@ -0,0 +1,122 @@
+From 4f3b42e2f126f96b1e512871d7073fb10d9a7283 Mon Sep 17 00:00:00 2001
+From: Stefan Binding <sbinding@opensource.cirrus.com>
+Date: Fri, 21 Jul 2023 16:18:13 +0100
+Subject: [PATCH 08/11] ALSA: hda: cs35l41: Use pre and post playback hooks
+
+Use new hooks to ensure separation between play/pause actions,
+as required by external boost.
+
+External Boost on CS35L41 requires the amp to go through a
+particular sequence of steps. One of these steps involes
+the setting of a GPIO. This GPIO is connected to one or
+more of the amps, and it may control the boost for all of
+the amps. To ensure that the GPIO is set when it is safe
+to do so, and to ensure that boost is ready for the rest of
+the sequence to be able to continue, we must ensure that
+the each part of the sequence is executed for each amp
+before moving on to the next part of the sequence.
+
+Some of the Play and Pause actions have moved from Open to
+Prepare. This is because Open is not guaranteed to be called
+again on system resume, whereas Prepare should.
+
+Signed-off-by: Stefan Binding <sbinding@opensource.cirrus.com>
+---
+ sound/pci/hda/cs35l41_hda.c | 53 ++++++++++++++++++++++++++++++-------
+ 1 file changed, 43 insertions(+), 10 deletions(-)
+
+diff --git a/sound/pci/hda/cs35l41_hda.c b/sound/pci/hda/cs35l41_hda.c
+index f77583b46b6b..a482d4752b3f 100644
+--- a/sound/pci/hda/cs35l41_hda.c
++++ b/sound/pci/hda/cs35l41_hda.c
+@@ -556,37 +556,68 @@ static void cs35l41_hda_pause_done(struct device *dev)
+ cs35l41->playback_started = false;
+ }
+
++static void cs35l41_hda_pre_playback_hook(struct device *dev, int action)
++{
++ struct cs35l41_hda *cs35l41 = dev_get_drvdata(dev);
++
++ switch (action) {
++ case HDA_GEN_PCM_ACT_CLEANUP:
++ mutex_lock(&cs35l41->fw_mutex);
++ cs35l41_hda_pause_start(dev);
++ mutex_unlock(&cs35l41->fw_mutex);
++ break;
++ default:
++ break;
++ }
++}
+ static void cs35l41_hda_playback_hook(struct device *dev, int action)
+ {
+ struct cs35l41_hda *cs35l41 = dev_get_drvdata(dev);
+
+ switch (action) {
+ case HDA_GEN_PCM_ACT_OPEN:
++ /*
++ * All amps must be resumed before we can start playing back.
++ * This ensures, for external boost, that all amps are in AMP_SAFE mode.
++ * Do this in HDA_GEN_PCM_ACT_OPEN, since this is run prior to any of the
++ * other actions.
++ */
+ pm_runtime_get_sync(dev);
+- mutex_lock(&cs35l41->fw_mutex);
+- cs35l41_hda_play_start(dev);
+- mutex_unlock(&cs35l41->fw_mutex);
+ break;
+ case HDA_GEN_PCM_ACT_PREPARE:
+ mutex_lock(&cs35l41->fw_mutex);
+- cs35l41_hda_play_done(dev);
++ cs35l41_hda_play_start(dev);
+ mutex_unlock(&cs35l41->fw_mutex);
+ break;
+ case HDA_GEN_PCM_ACT_CLEANUP:
+ mutex_lock(&cs35l41->fw_mutex);
+- cs35l41_hda_pause_start(dev);
++ cs35l41_hda_pause_done(dev);
+ mutex_unlock(&cs35l41->fw_mutex);
+ break;
+ case HDA_GEN_PCM_ACT_CLOSE:
+- mutex_lock(&cs35l41->fw_mutex);
+- cs35l41_hda_pause_done(dev);
+- mutex_unlock(&cs35l41->fw_mutex);
+-
++ /*
++ * Playback must be finished for all amps before we start runtime suspend.
++ * This ensures no amps are playing back when we start putting them to sleep.
++ */
+ pm_runtime_mark_last_busy(dev);
+ pm_runtime_put_autosuspend(dev);
+ break;
+ default:
+- dev_warn(cs35l41->dev, "Playback action not supported: %d\n", action);
++ break;
++ }
++}
++
++static void cs35l41_hda_post_playback_hook(struct device *dev, int action)
++{
++ struct cs35l41_hda *cs35l41 = dev_get_drvdata(dev);
++
++ switch (action) {
++ case HDA_GEN_PCM_ACT_PREPARE:
++ mutex_lock(&cs35l41->fw_mutex);
++ cs35l41_hda_play_done(dev);
++ mutex_unlock(&cs35l41->fw_mutex);
++ break;
++ default:
+ break;
+ }
+ }
+@@ -1037,6 +1068,8 @@ static int cs35l41_hda_bind(struct device *dev, struct device *master, void *mas
+ ret = cs35l41_create_controls(cs35l41);
+
+ comps->playback_hook = cs35l41_hda_playback_hook;
++ comps->pre_playback_hook = cs35l41_hda_pre_playback_hook;
++ comps->post_playback_hook = cs35l41_hda_post_playback_hook;
+
+ mutex_unlock(&cs35l41->fw_mutex);
+
+--
+2.41.0
+
diff --git a/0009-ALSA-hda-cs35l41-Rework-System-Suspend-to-ensure-cor.patch b/0009-ALSA-hda-cs35l41-Rework-System-Suspend-to-ensure-cor.patch
new file mode 100644
index 000000000000..02d98e408b9f
--- /dev/null
+++ b/0009-ALSA-hda-cs35l41-Rework-System-Suspend-to-ensure-cor.patch
@@ -0,0 +1,114 @@
+From 5091ba7ad9ea6a88db464b84b4993cc9e5033a84 Mon Sep 17 00:00:00 2001
+From: Stefan Binding <sbinding@opensource.cirrus.com>
+Date: Fri, 21 Jul 2023 16:18:14 +0100
+Subject: [PATCH 09/11] ALSA: hda: cs35l41: Rework System Suspend to ensure
+ correct call separation
+
+In order to correctly pause audio on suspend, amps using external boost
+require parts of the pause sequence to be called for all amps before moving
+on to the next steps.
+For example, as part of pausing the audio, the VSPK GPIO must be disabled,
+but since this GPIO is controlled by one amp, but controls the boost for
+all amps, it is required to separate the calls.
+During playback this is achieved by using the pre and post playback hooks,
+however during system suspend, this is not possible, so to separate the
+calls, we use both the .prepare and .suspend calls to pause the audio.
+
+Currently, for this reason, we do not restart audio on system resume.
+However, we can support this by relying on the playback hook to resume
+playback after system suspend.
+
+Signed-off-by: Stefan Binding <sbinding@opensource.cirrus.com>
+---
+ sound/pci/hda/cs35l41_hda.c | 40 ++++++++++++++++++++++++++++++++-----
+ 1 file changed, 35 insertions(+), 5 deletions(-)
+
+diff --git a/sound/pci/hda/cs35l41_hda.c b/sound/pci/hda/cs35l41_hda.c
+index a482d4752b3f..70aa819cfbd6 100644
+--- a/sound/pci/hda/cs35l41_hda.c
++++ b/sound/pci/hda/cs35l41_hda.c
+@@ -595,6 +595,15 @@ static void cs35l41_hda_playback_hook(struct device *dev, int action)
+ mutex_unlock(&cs35l41->fw_mutex);
+ break;
+ case HDA_GEN_PCM_ACT_CLOSE:
++ mutex_lock(&cs35l41->fw_mutex);
++ if (!cs35l41->firmware_running && cs35l41->request_fw_load &&
++ !cs35l41->fw_request_ongoing) {
++ dev_info(dev, "Requesting Firmware Load after HDA_GEN_PCM_ACT_CLOSE\n");
++ cs35l41->fw_request_ongoing = true;
++ schedule_work(&cs35l41->fw_load_work);
++ }
++ mutex_unlock(&cs35l41->fw_mutex);
++
+ /*
+ * Playback must be finished for all amps before we start runtime suspend.
+ * This ensures no amps are playing back when we start putting them to sleep.
+@@ -681,6 +690,25 @@ static int cs35l41_ready_for_reset(struct cs35l41_hda *cs35l41)
+ return ret;
+ }
+
++static int cs35l41_system_suspend_prep(struct device *dev)
++{
++ struct cs35l41_hda *cs35l41 = dev_get_drvdata(dev);
++
++ dev_dbg(cs35l41->dev, "System Suspend Prepare\n");
++
++ if (cs35l41->hw_cfg.bst_type == CS35L41_EXT_BOOST_NO_VSPK_SWITCH) {
++ dev_err_once(cs35l41->dev, "System Suspend not supported\n");
++ return 0; /* don't block the whole system suspend */
++ }
++
++ mutex_lock(&cs35l41->fw_mutex);
++ if (cs35l41->playback_started)
++ cs35l41_hda_pause_start(dev);
++ mutex_unlock(&cs35l41->fw_mutex);
++
++ return 0;
++}
++
+ static int cs35l41_system_suspend(struct device *dev)
+ {
+ struct cs35l41_hda *cs35l41 = dev_get_drvdata(dev);
+@@ -693,6 +721,11 @@ static int cs35l41_system_suspend(struct device *dev)
+ return 0; /* don't block the whole system suspend */
+ }
+
++ mutex_lock(&cs35l41->fw_mutex);
++ if (cs35l41->playback_started)
++ cs35l41_hda_pause_done(dev);
++ mutex_unlock(&cs35l41->fw_mutex);
++
+ ret = pm_runtime_force_suspend(dev);
+ if (ret) {
+ dev_err(dev, "System Suspend Failed, unable to runtime suspend: %d\n", ret);
+@@ -738,6 +771,7 @@ static int cs35l41_system_resume(struct device *dev)
+ }
+
+ mutex_lock(&cs35l41->fw_mutex);
++
+ if (cs35l41->request_fw_load && !cs35l41->fw_request_ongoing) {
+ cs35l41->fw_request_ongoing = true;
+ schedule_work(&cs35l41->fw_load_work);
+@@ -770,11 +804,6 @@ static int cs35l41_runtime_suspend(struct device *dev)
+
+ mutex_lock(&cs35l41->fw_mutex);
+
+- if (cs35l41->playback_started) {
+- cs35l41_hda_pause_start(dev);
+- cs35l41_hda_pause_done(dev);
+- }
+-
+ if (cs35l41->firmware_running) {
+ ret = cs35l41_enter_hibernate(cs35l41->dev, cs35l41->regmap,
+ cs35l41->hw_cfg.bst_type);
+@@ -1641,6 +1670,7 @@ EXPORT_SYMBOL_NS_GPL(cs35l41_hda_remove, SND_HDA_SCODEC_CS35L41);
+ const struct dev_pm_ops cs35l41_hda_pm_ops = {
+ RUNTIME_PM_OPS(cs35l41_runtime_suspend, cs35l41_runtime_resume,
+ cs35l41_runtime_idle)
++ .prepare = cs35l41_system_suspend_prep,
+ SYSTEM_SLEEP_PM_OPS(cs35l41_system_suspend, cs35l41_system_resume)
+ };
+ EXPORT_SYMBOL_NS_GPL(cs35l41_hda_pm_ops, SND_HDA_SCODEC_CS35L41);
+--
+2.41.0
+
diff --git a/0010-ALSA-hda-cs35l41-Add-device_link-between-HDA-and-cs3.patch b/0010-ALSA-hda-cs35l41-Add-device_link-between-HDA-and-cs3.patch
new file mode 100644
index 000000000000..ca5244fdbe4c
--- /dev/null
+++ b/0010-ALSA-hda-cs35l41-Add-device_link-between-HDA-and-cs3.patch
@@ -0,0 +1,60 @@
+From 74c165859e33b62888b93891d82680350b9a615f Mon Sep 17 00:00:00 2001
+From: Stefan Binding <sbinding@opensource.cirrus.com>
+Date: Fri, 21 Jul 2023 16:18:15 +0100
+Subject: [PATCH 10/11] ALSA: hda: cs35l41: Add device_link between HDA and
+ cs35l41_hda
+
+To ensure consistency between the HDA core and the CS35L41 HDA
+driver, add a device_link between them. This ensures that the
+HDA core will suspend first, and resume second, meaning the
+amp driver will not miss any events from the playback hook from
+the HDA core during system suspend and resume.
+
+Signed-off-by: Stefan Binding <sbinding@opensource.cirrus.com>
+---
+ sound/pci/hda/cs35l41_hda.c | 13 ++++++++++++-
+ 1 file changed, 12 insertions(+), 1 deletion(-)
+
+diff --git a/sound/pci/hda/cs35l41_hda.c b/sound/pci/hda/cs35l41_hda.c
+index 70aa819cfbd6..175378cdf9df 100644
+--- a/sound/pci/hda/cs35l41_hda.c
++++ b/sound/pci/hda/cs35l41_hda.c
+@@ -1063,6 +1063,7 @@ static int cs35l41_hda_bind(struct device *dev, struct device *master, void *mas
+ {
+ struct cs35l41_hda *cs35l41 = dev_get_drvdata(dev);
+ struct hda_component *comps = master_data;
++ unsigned int sleep_flags;
+ int ret = 0;
+
+ if (!comps || cs35l41->index < 0 || cs35l41->index >= HDA_MAX_COMPONENTS)
+@@ -1102,6 +1103,11 @@ static int cs35l41_hda_bind(struct device *dev, struct device *master, void *mas
+
+ mutex_unlock(&cs35l41->fw_mutex);
+
++ sleep_flags = lock_system_sleep();
++ if (!device_link_add(&comps->codec->core.dev, cs35l41->dev, DL_FLAG_STATELESS))
++ dev_warn(dev, "Unable to create device link\n");
++ unlock_system_sleep(sleep_flags);
++
+ pm_runtime_mark_last_busy(dev);
+ pm_runtime_put_autosuspend(dev);
+
+@@ -1112,9 +1118,14 @@ static void cs35l41_hda_unbind(struct device *dev, struct device *master, void *
+ {
+ struct cs35l41_hda *cs35l41 = dev_get_drvdata(dev);
+ struct hda_component *comps = master_data;
++ unsigned int sleep_flags;
+
+- if (comps[cs35l41->index].dev == dev)
++ if (comps[cs35l41->index].dev == dev) {
+ memset(&comps[cs35l41->index], 0, sizeof(*comps));
++ sleep_flags = lock_system_sleep();
++ device_link_remove(&comps->codec->core.dev, cs35l41->dev);
++ unlock_system_sleep(sleep_flags);
++ }
+ }
+
+ static const struct component_ops cs35l41_hda_comp_ops = {
+--
+2.41.0
+
diff --git a/0011-ALSA-hda-cs35l41-Ensure-amp-is-only-unmuted-during-p.patch b/0011-ALSA-hda-cs35l41-Ensure-amp-is-only-unmuted-during-p.patch
new file mode 100644
index 000000000000..5049e3963a51
--- /dev/null
+++ b/0011-ALSA-hda-cs35l41-Ensure-amp-is-only-unmuted-during-p.patch
@@ -0,0 +1,73 @@
+From 6f1a7b41a626a567fcfe915e9dbe3aea34b6c3ec Mon Sep 17 00:00:00 2001
+From: Stefan Binding <sbinding@opensource.cirrus.com>
+Date: Fri, 21 Jul 2023 16:18:16 +0100
+Subject: [PATCH 11/11] ALSA: hda: cs35l41: Ensure amp is only unmuted during
+ playback
+
+Currently we only mute after playback has finished, and unmute
+prior to setting global enable. To prevent any possible pops
+and clicks, mute at probe, and then only unmute after global
+enable is set.
+
+Signed-off-by: Stefan Binding <sbinding@opensource.cirrus.com>
+---
+ sound/pci/hda/cs35l41_hda.c | 22 ++++++++++++++++++++--
+ 1 file changed, 20 insertions(+), 2 deletions(-)
+
+diff --git a/sound/pci/hda/cs35l41_hda.c b/sound/pci/hda/cs35l41_hda.c
+index 175378cdf9df..98feb5ccd586 100644
+--- a/sound/pci/hda/cs35l41_hda.c
++++ b/sound/pci/hda/cs35l41_hda.c
+@@ -58,8 +58,6 @@ static const struct reg_sequence cs35l41_hda_config[] = {
+ { CS35L41_DSP1_RX3_SRC, 0x00000018 }, // DSP1RX3 SRC = VMON
+ { CS35L41_DSP1_RX4_SRC, 0x00000019 }, // DSP1RX4 SRC = IMON
+ { CS35L41_DSP1_RX5_SRC, 0x00000020 }, // DSP1RX5 SRC = ERRVOL
+- { CS35L41_AMP_DIG_VOL_CTRL, 0x00008000 }, // AMP_HPF_PCM_EN = 1, AMP_VOL_PCM 0.0 dB
+- { CS35L41_AMP_GAIN_CTRL, 0x00000084 }, // AMP_GAIN_PCM 4.5 dB
+ };
+
+ static const struct reg_sequence cs35l41_hda_config_dsp[] = {
+@@ -82,6 +80,14 @@ static const struct reg_sequence cs35l41_hda_config_dsp[] = {
+ { CS35L41_DSP1_RX3_SRC, 0x00000018 }, // DSP1RX3 SRC = VMON
+ { CS35L41_DSP1_RX4_SRC, 0x00000019 }, // DSP1RX4 SRC = IMON
+ { CS35L41_DSP1_RX5_SRC, 0x00000029 }, // DSP1RX5 SRC = VBSTMON
++};
++
++static const struct reg_sequence cs35l41_hda_unmute[] = {
++ { CS35L41_AMP_DIG_VOL_CTRL, 0x00008000 }, // AMP_HPF_PCM_EN = 1, AMP_VOL_PCM 0.0 dB
++ { CS35L41_AMP_GAIN_CTRL, 0x00000084 }, // AMP_GAIN_PCM 4.5 dB
++};
++
++static const struct reg_sequence cs35l41_hda_unmute_dsp[] = {
+ { CS35L41_AMP_DIG_VOL_CTRL, 0x00008000 }, // AMP_HPF_PCM_EN = 1, AMP_VOL_PCM 0.0 dB
+ { CS35L41_AMP_GAIN_CTRL, 0x00000233 }, // AMP_GAIN_PCM = 17.5dB AMP_GAIN_PDM = 19.5dB
+ };
+@@ -522,6 +528,13 @@ static void cs35l41_hda_play_done(struct device *dev)
+
+ cs35l41_global_enable(dev, reg, cs35l41->hw_cfg.bst_type, 1, NULL,
+ cs35l41->firmware_running);
++ if (cs35l41->firmware_running) {
++ regmap_multi_reg_write(reg, cs35l41_hda_unmute_dsp,
++ ARRAY_SIZE(cs35l41_hda_unmute_dsp));
++ } else {
++ regmap_multi_reg_write(reg, cs35l41_hda_unmute,
++ ARRAY_SIZE(cs35l41_hda_unmute));
++ }
+ }
+
+ static void cs35l41_hda_pause_start(struct device *dev)
+@@ -1616,6 +1629,11 @@ int cs35l41_hda_probe(struct device *dev, const char *device_name, int id, int i
+ if (ret)
+ goto err;
+
++ ret = regmap_multi_reg_write(cs35l41->regmap, cs35l41_hda_mute,
++ ARRAY_SIZE(cs35l41_hda_mute));
++ if (ret)
++ goto err;
++
+ INIT_WORK(&cs35l41->fw_load_work, cs35l41_fw_load_work);
+ mutex_init(&cs35l41->fw_mutex);
+
+--
+2.41.0
+
diff --git a/0998-patch_realtek.patch b/0998-patch_realtek.patch
new file mode 100644
index 000000000000..2513ec48db10
--- /dev/null
+++ b/0998-patch_realtek.patch
@@ -0,0 +1,10 @@
+--- a/sound/pci/hda/patch_realtek.c 2023-04-23 14:02:52.000000000 -0500
++++ b/sound/pci/hda/patch_realtek.c 2023-05-07 14:28:08.979524705 -0500
+@@ -9409,6 +9409,7 @@
+ SND_PCI_QUIRK(0x103c, 0x87f5, "HP", ALC287_FIXUP_HP_GPIO_LED),
+ SND_PCI_QUIRK(0x103c, 0x87f6, "HP Spectre x360 14", ALC245_FIXUP_HP_X360_AMP),
+ SND_PCI_QUIRK(0x103c, 0x87f7, "HP Spectre x360 14", ALC245_FIXUP_HP_X360_AMP),
++ SND_PCI_QUIRK(0x103c, 0x89da, "HP Spectre x360 14", ALC245_FIXUP_HP_X360_AMP),
+ SND_PCI_QUIRK(0x103c, 0x8805, "HP ProBook 650 G8 Notebook PC", ALC236_FIXUP_HP_GPIO_LED),
+ SND_PCI_QUIRK(0x103c, 0x880d, "HP EliteBook 830 G8 Notebook PC", ALC285_FIXUP_HP_GPIO_LED),
+ SND_PCI_QUIRK(0x103c, 0x8811, "HP Spectre x360 15-eb1xxx", ALC285_FIXUP_HP_SPECTRE_X360_EB1),
diff --git a/PKGBUILD b/PKGBUILD
index 1e4f1f7bfbeb..4df59f7b3653 100644
--- a/PKGBUILD
+++ b/PKGBUILD
@@ -12,7 +12,7 @@ pkgbase=linux-jcore
pkgname=('linux-jcore' 'linux-jcore-headers')
_kernelname=-jcore
_hostname=jcore
-pkgver=6.5
+pkgver=6.5.3
pkgrel=1
pkgdesc="Kernel for Manjaro/EndeavourOS/Arch (ACS override patch include)"
arch=('x86_64')
@@ -30,14 +30,48 @@ source=("https://cdn.kernel.org/pub/linux/kernel/v6.x/linux-$pkgver.tar.xz"
# MANJARO Patches
'0201-asus-ally-asus-hid-6.5.patch'
'0202-mt7921e_Perform_FLR_to_recovery_the_device.patch'
+ # GPU reset through sysfs
+ 0001-GPU-reset.patch
+ # No overrides ROG ally
+ 0001-Cirrus-no-dsdt.patch
+ 0001-ALSA-hda-cs35l41-Support-ASUS-2023-laptops-with-miss.patch
+ # Fixup sleep cs35l41
+ 0001-ALSA-cs35l41-Use-mbox-command-to-enable-speaker-outp.patch
+ 0002-ALSA-cs35l41-Poll-for-Power-Up-Down-rather-than-wait.patch
+ 0003-ALSA-hda-cs35l41-Check-mailbox-status-of-pause-comma.patch
+ 0004-ALSA-hda-cs35l41-Ensure-we-correctly-re-sync-regmap-.patch
+ 0005-ALSA-hda-cs35l41-Ensure-we-pass-up-any-errors-during.patch
+ 0006-ALSA-hda-cs35l41-Move-Play-and-Pause-into-separate-f.patch
+ 0007-ALSA-hda-hda_component-Add-pre-and-post-playback-hoo.patch
+ 0008-ALSA-hda-cs35l41-Use-pre-and-post-playback-hooks.patch
+ 0009-ALSA-hda-cs35l41-Rework-System-Suspend-to-ensure-cor.patch
+ 0010-ALSA-hda-cs35l41-Add-device_link-between-HDA-and-cs3.patch
+ 0011-ALSA-hda-cs35l41-Ensure-amp-is-only-unmuted-during-p.patch
+ # Realtek patch
+ 0998-patch_realtek.patch
# ACS override patch
'0999-acs.gitpatch')
-sha256sums=('7a574bbc20802ea76b52ca7faf07267f72045e861b18915c5272a98c27abf884'
- 'b528ea0ad54598bcea0fa64fd846b62b5164ffa1abf1594070515aae772d58c1'
+sha256sums=('4cac13f7b17bd8dcf9032ad68f9123ab5313d698c9f59416043165150763eb4f'
+ 'fdfa0d96f3c11d4d52da67d4b0b1ddacdb8347daae88546eba72187d43d558b0'
'05f04019d4a2ee072238c32860fa80d673687d84d78ef436ae9332b6fb788467'
'6541760a7b0513ce52c7b2d67810135b1bd172849f52765e74a5ec0c7584dd56'
'd673d034fbcd80426fd8d9c6af56537c5fe5b55fe49d74e313474d7fc285ecc1'
+ '11ff8e0119e1bd33a572e18a10dfb94f521b4e38ee5948d3c0508faf07835a78'
+ 'ec6f9f062e94a62ecbec3a9e30bb6fc7ffd33e279eeb621674bfe4e4c398836a'
+ '6536e2f6bcb881d412f99d6bf940487c0a79cc432a0ef7e6e60a24e6a445a8f2'
+ '27aaf7e14c7f5e127f5b658352ca5c3650477a92462139557aefb73bcea2b418'
+ '74da118887929f06afb57eaee716ff433ee5972c9dc91166fc08e66f44edb8e8'
+ 'c5ac510677e58ac6b189939ac853e64bf9ad026a614a47f4cb535ad62bf41163'
+ '88f0d69dad01ccfef899b6b08abe162fc7743d40571232dff9a7d9093890d0a8'
+ '826bfa21b613d9c198d375d902958c90bb30171aee602c1806aaf99212abbb40'
+ '0dae5e24249b712f1501ead600c8ef4a5df21484e39e06a1dbafb57929c4999f'
+ '8dddf5537e3feedbf9f9c67f3c19fa7412d9e01b4f78023262b8fa340d3f47b2'
+ '3774b4eba753eb5f3768a28a68eb1a17557c0347275c19b8133f9f74d64a80df'
+ 'a5daf210a6f72dde5b477d4b6d38a162b2698cac6c5fcfd4e4fd606274f34cec'
+ 'b9298bde48a9f6c5d028150d627c05c71880e2693933ef2fe070f090e80876a5'
+ '4d53a6853b63c0f01b60b408bee61fa729656f925e50fa55ae3cba309668242a'
+ '3aa9f1ca47bb078f3c9a52fe61897cf4fe989068cd7e66bfa6644fd605fa40d2'
'458d7e024d33d4965b14b9b987f01a2884ff28761cff5da7c6a54132a95e9f36')
prepare() {
diff --git a/config b/config
index 07188fe47b12..8223e5b6fbd9 100644
--- a/config
+++ b/config
@@ -1,15 +1,15 @@
#
# Automatically generated file; DO NOT EDIT.
-# Linux/x86 6.5.0-1 Kernel Configuration
+# Linux/x86 6.5.3-1 Kernel Configuration
#
-CONFIG_CC_VERSION_TEXT="gcc (GCC) 13.1.1 20230429"
+CONFIG_CC_VERSION_TEXT="gcc (GCC) 13.2.1 20230801"
CONFIG_CC_IS_GCC=y
-CONFIG_GCC_VERSION=130101
+CONFIG_GCC_VERSION=130201
CONFIG_CLANG_VERSION=0
CONFIG_AS_IS_GNU=y
-CONFIG_AS_VERSION=24000
+CONFIG_AS_VERSION=24100
CONFIG_LD_IS_BFD=y
-CONFIG_LD_VERSION=24000
+CONFIG_LD_VERSION=24100
CONFIG_LLD_VERSION=0
CONFIG_CC_CAN_LINK=y
CONFIG_CC_CAN_LINK_STATIC=y
@@ -183,7 +183,7 @@ CONFIG_RCU_NOCB_CPU=y
# CONFIG_RCU_NOCB_CPU_CB_BOOST is not set
# CONFIG_TASKS_TRACE_RCU_READ_MB is not set
CONFIG_RCU_LAZY=y
-# CONFIG_RCU_DOUBLE_CHECK_CB_TIME is not set
+CONFIG_RCU_DOUBLE_CHECK_CB_TIME=y
# end of RCU Subsystem
CONFIG_IKCONFIG=y
@@ -543,7 +543,9 @@ CONFIG_CALL_DEPTH_TRACKING=y
# CONFIG_CALL_THUNKS_DEBUG is not set
CONFIG_CPU_IBPB_ENTRY=y
CONFIG_CPU_IBRS_ENTRY=y
+CONFIG_CPU_SRSO=y
CONFIG_SLS=y
+# CONFIG_GDS_FORCE_MITIGATION is not set
CONFIG_ARCH_HAS_ADD_PAGES=y
CONFIG_ARCH_MHP_MEMMAP_ON_MEMORY_ENABLE=y
@@ -2343,7 +2345,7 @@ CONFIG_ISCSI_IBFT=m
CONFIG_FW_CFG_SYSFS=m
# CONFIG_FW_CFG_SYSFS_CMDLINE is not set
CONFIG_SYSFB=y
-# CONFIG_SYSFB_SIMPLEFB is not set
+CONFIG_SYSFB_SIMPLEFB=y
CONFIG_FW_CS_DSP=m
CONFIG_GOOGLE_FIRMWARE=y
# CONFIG_GOOGLE_SMI is not set
@@ -2637,6 +2639,8 @@ CONFIG_DW_XDATA_PCIE=m
CONFIG_PCI_ENDPOINT_TEST=m
CONFIG_XILINX_SDFEC=m
CONFIG_MISC_RTSX=m
+CONFIG_TPS6594_ESM=m
+CONFIG_TPS6594_PFSM=m
CONFIG_C2PORT=m
CONFIG_C2PORT_DURAMAR_2150=m
@@ -2671,7 +2675,7 @@ CONFIG_INTEL_MEI_TXE=m
CONFIG_INTEL_MEI_GSC=m
CONFIG_INTEL_MEI_HDCP=m
CONFIG_INTEL_MEI_PXP=m
-# CONFIG_INTEL_MEI_GSC_PROXY is not set
+CONFIG_INTEL_MEI_GSC_PROXY=m
CONFIG_VMWARE_VMCI=m
CONFIG_GENWQE=m
CONFIG_GENWQE_PLATFORM_ERROR_RECOVERY=0
@@ -3633,7 +3637,7 @@ CONFIG_CAN_8DEV_USB=m
CONFIG_CAN_EMS_USB=m
CONFIG_CAN_ESD_USB=m
CONFIG_CAN_ETAS_ES58X=m
-# CONFIG_CAN_F81604 is not set
+CONFIG_CAN_F81604=m
CONFIG_CAN_GS_USB=m
CONFIG_CAN_KVASER_USB=m
CONFIG_CAN_MCBA_USB=m
@@ -4039,7 +4043,7 @@ CONFIG_RTW88_8822CE=m
CONFIG_RTW88_8822CS=m
CONFIG_RTW88_8822CU=m
CONFIG_RTW88_8723DE=m
-# CONFIG_RTW88_8723DS is not set
+CONFIG_RTW88_8723DS=m
CONFIG_RTW88_8723DU=m
CONFIG_RTW88_8821CE=m
CONFIG_RTW88_8821CS=m
@@ -4049,10 +4053,11 @@ CONFIG_RTW88_DEBUGFS=y
CONFIG_RTW89=m
CONFIG_RTW89_CORE=m
CONFIG_RTW89_PCI=m
+CONFIG_RTW89_8851B=m
CONFIG_RTW89_8852A=m
CONFIG_RTW89_8852B=m
CONFIG_RTW89_8852C=m
-# CONFIG_RTW89_8851BE is not set
+CONFIG_RTW89_8851BE=m
CONFIG_RTW89_8852AE=m
CONFIG_RTW89_8852BE=m
CONFIG_RTW89_8852CE=m
@@ -5124,7 +5129,7 @@ CONFIG_CHARGER_TPS65090=m
CONFIG_BATTERY_GAUGE_LTC2941=m
CONFIG_BATTERY_GOLDFISH=m
CONFIG_BATTERY_RT5033=m
-# CONFIG_CHARGER_RT5033 is not set
+CONFIG_CHARGER_RT5033=m
CONFIG_CHARGER_RT9455=m
CONFIG_CHARGER_RT9467=m
CONFIG_CHARGER_RT9471=m
@@ -5223,7 +5228,7 @@ CONFIG_SENSORS_MAX197=m
CONFIG_SENSORS_MAX31722=m
CONFIG_SENSORS_MAX31730=m
CONFIG_SENSORS_MAX31760=m
-# CONFIG_MAX31827 is not set
+CONFIG_MAX31827=m
CONFIG_SENSORS_MAX6620=m
CONFIG_SENSORS_MAX6621=m
CONFIG_SENSORS_MAX6639=m
@@ -5391,7 +5396,7 @@ CONFIG_SENSORS_ACPI_POWER=m
CONFIG_SENSORS_ATK0110=m
CONFIG_SENSORS_ASUS_WMI=m
CONFIG_SENSORS_ASUS_EC=m
-# CONFIG_SENSORS_HP_WMI is not set
+CONFIG_SENSORS_HP_WMI=m
CONFIG_THERMAL=y
CONFIG_THERMAL_NETLINK=y
# CONFIG_THERMAL_STATISTICS is not set
@@ -5611,7 +5616,7 @@ CONFIG_MFD_88PM800=m
CONFIG_MFD_88PM805=m
CONFIG_MFD_88PM860X=y
CONFIG_MFD_MAX14577=m
-# CONFIG_MFD_MAX77541 is not set
+CONFIG_MFD_MAX77541=m
CONFIG_MFD_MAX77693=m
CONFIG_MFD_MAX77843=y
CONFIG_MFD_MAX8907=m
@@ -5657,8 +5662,9 @@ CONFIG_MFD_TPS65910=y
CONFIG_MFD_TPS65912=m
CONFIG_MFD_TPS65912_I2C=m
CONFIG_MFD_TPS65912_SPI=m
-# CONFIG_MFD_TPS6594_I2C is not set
-# CONFIG_MFD_TPS6594_SPI is not set
+CONFIG_MFD_TPS6594=m
+CONFIG_MFD_TPS6594_I2C=m
+CONFIG_MFD_TPS6594_SPI=m
CONFIG_TWL4030_CORE=y
CONFIG_MFD_TWL4030_AUDIO=y
CONFIG_TWL6040_CORE=y
@@ -5728,6 +5734,7 @@ CONFIG_REGULATOR_LTC3589=m
CONFIG_REGULATOR_LTC3676=m
CONFIG_REGULATOR_MAX14577=m
CONFIG_REGULATOR_MAX1586=m
+CONFIG_REGULATOR_MAX77541=m
CONFIG_REGULATOR_MAX8649=m
CONFIG_REGULATOR_MAX8660=m
CONFIG_REGULATOR_MAX8893=m
@@ -5762,7 +5769,7 @@ CONFIG_REGULATOR_PV88060=m
CONFIG_REGULATOR_PV88080=m
CONFIG_REGULATOR_PV88090=m
CONFIG_REGULATOR_PWM=m
-# CONFIG_REGULATOR_RAA215300 is not set
+CONFIG_REGULATOR_RAA215300=m
CONFIG_REGULATOR_RC5T583=m
CONFIG_REGULATOR_RT4801=m
CONFIG_REGULATOR_RT4803=m
@@ -6347,7 +6354,7 @@ CONFIG_VIDEO_MT9V011=m
CONFIG_VIDEO_MT9V032=m
CONFIG_VIDEO_MT9V111=m
CONFIG_VIDEO_OG01A1B=m
-# CONFIG_VIDEO_OV01A10 is not set
+CONFIG_VIDEO_OV01A10=m
CONFIG_VIDEO_OV02A10=m
CONFIG_VIDEO_OV08D10=m
CONFIG_VIDEO_OV08X40=m
@@ -6971,6 +6978,8 @@ CONFIG_SND_DMAENGINE_PCM=m
CONFIG_SND_HWDEP=m
CONFIG_SND_SEQ_DEVICE=m
CONFIG_SND_RAWMIDI=m
+CONFIG_SND_UMP=m
+# CONFIG_SND_UMP_LEGACY_RAWMIDI is not set
CONFIG_SND_COMPRESS_OFFLOAD=m
CONFIG_SND_JACK=y
CONFIG_SND_JACK_INPUT_DEV=y
@@ -7004,7 +7013,8 @@ CONFIG_SND_SEQ_MIDI_EVENT=m
CONFIG_SND_SEQ_MIDI=m
CONFIG_SND_SEQ_MIDI_EMUL=m
CONFIG_SND_SEQ_VIRMIDI=m
-# CONFIG_SND_SEQ_UMP is not set
+CONFIG_SND_SEQ_UMP=y
+CONFIG_SND_SEQ_UMP_CLIENT=m
CONFIG_SND_MPU401_UART=m
CONFIG_SND_OPL3_LIB=m
CONFIG_SND_OPL3_LIB_SEQ=m
@@ -7014,7 +7024,7 @@ CONFIG_SND_DRIVERS=y
# CONFIG_SND_PCSP is not set
CONFIG_SND_DUMMY=m
CONFIG_SND_ALOOP=m
-# CONFIG_SND_PCMTEST is not set
+CONFIG_SND_PCMTEST=m
CONFIG_SND_VIRMIDI=m
CONFIG_SND_MTPAV=m
CONFIG_SND_MTS64=m
@@ -7145,7 +7155,7 @@ CONFIG_SND_INTEL_SOUNDWIRE_ACPI=m
CONFIG_SND_SPI=y
CONFIG_SND_USB=y
CONFIG_SND_USB_AUDIO=m
-# CONFIG_SND_USB_AUDIO_MIDI_V2 is not set
+CONFIG_SND_USB_AUDIO_MIDI_V2=y
CONFIG_SND_USB_AUDIO_USE_MEDIA_CONTROLLER=y
CONFIG_SND_USB_UA101=m
CONFIG_SND_USB_USX2Y=m
@@ -7233,7 +7243,7 @@ CONFIG_SND_SOC_FSL_RPMSG=m
# CONFIG_SND_SOC_IMX_AUDMUX is not set
# end of SoC Audio for Freescale CPUs
-# CONFIG_SND_SOC_CHV3_I2S is not set
+CONFIG_SND_SOC_CHV3_I2S=m
CONFIG_SND_I2S_HI6210_I2S=m
CONFIG_SND_SOC_IMG=y
CONFIG_SND_SOC_IMG_I2S_IN=m
@@ -7432,7 +7442,7 @@ CONFIG_SND_SOC_AW88395_LIB=m
CONFIG_SND_SOC_AW88395=m
CONFIG_SND_SOC_BD28623=m
# CONFIG_SND_SOC_BT_SCO is not set
-# CONFIG_SND_SOC_CHV3_CODEC is not set
+CONFIG_SND_SOC_CHV3_CODEC=m
CONFIG_SND_SOC_CROS_EC_CODEC=m
CONFIG_SND_SOC_CS35L32=m
CONFIG_SND_SOC_CS35L33=m
@@ -7502,7 +7512,7 @@ CONFIG_SND_SOC_MAX98363=m
CONFIG_SND_SOC_MAX98373=m
CONFIG_SND_SOC_MAX98373_I2C=m
CONFIG_SND_SOC_MAX98373_SDW=m
-# CONFIG_SND_SOC_MAX98388 is not set
+CONFIG_SND_SOC_MAX98388=m
CONFIG_SND_SOC_MAX98390=m
CONFIG_SND_SOC_MAX98396=m
CONFIG_SND_SOC_MAX9860=m
@@ -7565,7 +7575,7 @@ CONFIG_SND_SOC_RT711_SDW=m
CONFIG_SND_SOC_RT711_SDCA_SDW=m
CONFIG_SND_SOC_RT712_SDCA_SDW=m
CONFIG_SND_SOC_RT712_SDCA_DMIC_SDW=m
-# CONFIG_SND_SOC_RT722_SDCA_SDW is not set
+CONFIG_SND_SOC_RT722_SDCA_SDW=m
CONFIG_SND_SOC_RT715=m
CONFIG_SND_SOC_RT715_SDW=m
CONFIG_SND_SOC_RT715_SDCA_SDW=m
@@ -7596,7 +7606,9 @@ CONFIG_SND_SOC_TAS2562=m
CONFIG_SND_SOC_TAS2764=m
CONFIG_SND_SOC_TAS2770=m
CONFIG_SND_SOC_TAS2780=m
-# CONFIG_SND_SOC_TAS2781_I2C is not set
+CONFIG_SND_SOC_TAS2781_COMLIB=m
+CONFIG_SND_SOC_TAS2781_FMWLIB=m
+CONFIG_SND_SOC_TAS2781_I2C=m
CONFIG_SND_SOC_TAS5086=m
CONFIG_SND_SOC_TAS571X=m
CONFIG_SND_SOC_TAS5720=m
@@ -7657,7 +7669,7 @@ CONFIG_SND_SOC_WM8978=m
CONFIG_SND_SOC_WM8985=m
CONFIG_SND_SOC_WSA881X=m
CONFIG_SND_SOC_WSA883X=m
-# CONFIG_SND_SOC_WSA884X is not set
+CONFIG_SND_SOC_WSA884X=m
CONFIG_SND_SOC_ZL38060=m
CONFIG_SND_SOC_MAX9759=m
CONFIG_SND_SOC_MT6351=m
@@ -7771,7 +7783,8 @@ CONFIG_HID_NINTENDO=m
CONFIG_NINTENDO_FF=y
CONFIG_HID_NTI=m
CONFIG_HID_NTRIG=m
-# CONFIG_HID_NVIDIA_SHIELD is not set
+CONFIG_HID_NVIDIA_SHIELD=m
+CONFIG_NVIDIA_SHIELD_FF=y
CONFIG_HID_ORTEK=m
CONFIG_HID_PANTHERLORD=m
CONFIG_PANTHERLORD_FF=y
@@ -8161,7 +8174,7 @@ CONFIG_USB_NET2280=m
CONFIG_USB_GOKU=m
CONFIG_USB_EG20T=m
CONFIG_USB_MAX3420_UDC=m
-# CONFIG_USB_CDNS2_UDC is not set
+CONFIG_USB_CDNS2_UDC=m
CONFIG_USB_DUMMY_HCD=m
# end of USB Peripheral Controller
@@ -8272,7 +8285,7 @@ CONFIG_TYPEC_MUX_FSA4480=m
CONFIG_TYPEC_MUX_GPIO_SBU=m
CONFIG_TYPEC_MUX_PI3USB30532=m
CONFIG_TYPEC_MUX_INTEL_PMC=m
-# CONFIG_TYPEC_MUX_NB7VPQ904M is not set
+CONFIG_TYPEC_MUX_NB7VPQ904M=m
# end of USB Type-C Multiplexer/DeMultiplexer Switch support
#
@@ -8357,8 +8370,8 @@ CONFIG_LEDS_BRIGHTNESS_HW_CHANGED=y
#
CONFIG_LEDS_88PM860X=m
CONFIG_LEDS_APU=m
-# CONFIG_LEDS_AW200XX is not set
-# CONFIG_LEDS_CHT_WCOVE is not set
+CONFIG_LEDS_AW200XX=m
+CONFIG_LEDS_CHT_WCOVE=m
CONFIG_LEDS_LM3530=m
CONFIG_LEDS_LM3532=m
CONFIG_LEDS_LM3533=m
@@ -8798,7 +8811,7 @@ CONFIG_MLX5_VDPA_NET=m
CONFIG_VP_VDPA=m
CONFIG_ALIBABA_ENI_VDPA=m
CONFIG_SNET_VDPA=m
-# CONFIG_PDS_VDPA is not set
+CONFIG_PDS_VDPA=m
CONFIG_VHOST_IOTLB=m
CONFIG_VHOST_RING=m
CONFIG_VHOST_TASK=y
@@ -8998,7 +9011,7 @@ CONFIG_MXM_WMI=m
CONFIG_NVIDIA_WMI_EC_BACKLIGHT=m
CONFIG_XIAOMI_WMI=m
CONFIG_GIGABYTE_WMI=m
-# CONFIG_YOGABOOK is not set
+CONFIG_YOGABOOK=m
CONFIG_ACERHDF=m
CONFIG_ACER_WIRELESS=m
CONFIG_ACER_WMI=m
@@ -9441,6 +9454,7 @@ CONFIG_MAX11205=m
CONFIG_MAX11410=m
CONFIG_MAX1241=m
CONFIG_MAX1363=m
+CONFIG_MAX77541_ADC=m
CONFIG_MAX9611=m
CONFIG_MCP320X=m
CONFIG_MCP3422=m
@@ -9757,7 +9771,7 @@ CONFIG_ISL29125=m
CONFIG_HID_SENSOR_ALS=m
CONFIG_HID_SENSOR_PROX=m
CONFIG_JSA1212=m
-# CONFIG_ROHM_BU27008 is not set
+CONFIG_ROHM_BU27008=m
CONFIG_ROHM_BU27034=m
CONFIG_RPR0521=m
CONFIG_SENSORS_LM3533=m
@@ -9768,7 +9782,7 @@ CONFIG_MAX44000=m
CONFIG_MAX44009=m
CONFIG_NOA1305=m
CONFIG_OPT3001=m
-# CONFIG_OPT4001 is not set
+CONFIG_OPT4001=m
CONFIG_PA12203001=m
CONFIG_SI1133=m
CONFIG_SI1145=m
@@ -9860,7 +9874,7 @@ CONFIG_MCP4131=m
CONFIG_MCP4531=m
CONFIG_MCP41010=m
CONFIG_TPL0102=m
-# CONFIG_X9250 is not set
+CONFIG_X9250=m
# end of Digital potentiometers
#
@@ -9886,7 +9900,7 @@ CONFIG_MPL115=m
CONFIG_MPL115_I2C=m
CONFIG_MPL115_SPI=m
CONFIG_MPL3115=m
-# CONFIG_MPRLS0025PA is not set
+CONFIG_MPRLS0025PA=m
CONFIG_MS5611=m
CONFIG_MS5611_I2C=m
CONFIG_MS5611_SPI=m
@@ -10020,7 +10034,7 @@ CONFIG_PHY_INTEL_LGM_EMMC=m
CONFIG_POWERCAP=y
CONFIG_INTEL_RAPL_CORE=m
CONFIG_INTEL_RAPL=m
-# CONFIG_INTEL_RAPL_TPMI is not set
+CONFIG_INTEL_RAPL_TPMI=m
CONFIG_IDLE_INJECT=y
CONFIG_MCB=m
CONFIG_MCB_PCI=m
@@ -10240,7 +10254,6 @@ CONFIG_QUOTA_TREE=m
CONFIG_QFMT_V1=m
CONFIG_QFMT_V2=m
CONFIG_QUOTACTL=y
-CONFIG_AUTOFS4_FS=y
CONFIG_AUTOFS_FS=y
CONFIG_FUSE_FS=m
CONFIG_CUSE=m
@@ -11385,7 +11398,7 @@ CONFIG_FTRACE=y
CONFIG_BOOTTIME_TRACING=y
CONFIG_FUNCTION_TRACER=y
CONFIG_FUNCTION_GRAPH_TRACER=y
-# CONFIG_FUNCTION_GRAPH_RETVAL is not set
+CONFIG_FUNCTION_GRAPH_RETVAL=y
CONFIG_DYNAMIC_FTRACE=y
CONFIG_DYNAMIC_FTRACE_WITH_REGS=y
CONFIG_DYNAMIC_FTRACE_WITH_DIRECT_CALLS=y