diff options
author | Jeka | 2023-09-14 22:57:31 +0300 |
---|---|---|
committer | Jeka | 2023-09-14 22:57:31 +0300 |
commit | d6c4b9298dbe30331764702bd49f6ed1c057c341 (patch) | |
tree | 6cff64030b63415e174c9cb5ee067538307b565a | |
parent | d1d0ce6f3e085d43ba887a19d0907c24ce9e9c5f (diff) | |
download | aur-d6c4b9298dbe30331764702bd49f6ed1c057c341.tar.gz |
kernel release 6.5.3
18 files changed, 1937 insertions, 49 deletions
@@ -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), @@ -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() { @@ -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 |