Re: [PATCH] ALSA: hda: cs35l41: Fix errors caused by software reset
From: Stefan Binding
Date: Mon Mar 02 2026 - 11:11:48 EST
Hi,
I don't think this is necessarily the correct solution to this issue.
The software resets were added intentionally, so making them conditional may cause issues.
I've commented on the original BugZilla to get more information.
Thanks,
Stefan
On 02/03/2026 12:11, Zhang Heng wrote:
> Performing software reset again after hardware reset is redundant
> and may result in errors. Software reset should be performed when
> hardware reset is not possible.
>
> [ +0.013038] cs35l41-hda spi1-CSC3551:00-cs35l41-hda.0: Calibration applied: R0=10476
> [ +0.010741] cs35l41-hda spi1-CSC3551:00-cs35l41-hda.0: Firmware Loaded - Type: spk-prot, Gain: 19
> [ +0.012471] cs35l41-hda spi1-CSC3551:00-cs35l41-hda.1: Failed waiting for OTP_BOOT_DONE
> [ +0.000002] cs35l41-hda spi1-CSC3551:00-cs35l41-hda.1: PM: dpm_run_callback(): cs35l41_system_resume [snd_hda_scodec_cs35l41] returns -110
> [ +0.000011] cs35l41-hda spi1-CSC3551:00-cs35l41-hda.1: PM: failed to restore: error -110
>
> Link: https://bugzilla.kernel.org/show_bug.cgi?id=221161
> Fixes: 2ee06ff5d7cf ("ALSA: hda: cs35l41: Force a software reset after hardware reset")
> Cc: stable@xxxxxxxxxxxxxxx
> Signed-off-by: Zhang Heng <zhangheng@xxxxxxxxxx>
> ---
> sound/hda/codecs/side-codecs/cs35l41_hda.c | 18 ++++++++----------
> 1 file changed, 8 insertions(+), 10 deletions(-)
>
> diff --git a/sound/hda/codecs/side-codecs/cs35l41_hda.c b/sound/hda/codecs/side-codecs/cs35l41_hda.c
> index b64890006bb7..c546a42754bb 100644
> --- a/sound/hda/codecs/side-codecs/cs35l41_hda.c
> +++ b/sound/hda/codecs/side-codecs/cs35l41_hda.c
> @@ -1023,15 +1023,13 @@ static int cs35l41_system_resume(struct device *dev)
> gpiod_set_value_cansleep(cs35l41->reset_gpio, 0);
> usleep_range(2000, 2100);
> gpiod_set_value_cansleep(cs35l41->reset_gpio, 1);
> + usleep_range(2000, 2100);
> + } else {
> + regmap_write(cs35l41->regmap, CS35L41_SFT_RESET, CS35L41_SOFTWARE_RESET);
> + usleep_range(2000, 2100);
> }
> -
> - usleep_range(2000, 2100);
> -
> regcache_cache_only(cs35l41->regmap, false);
>
> - regmap_write(cs35l41->regmap, CS35L41_SFT_RESET, CS35L41_SOFTWARE_RESET);
> - usleep_range(2000, 2100);
> -
> ret = cs35l41_wait_boot_done(cs35l41);
> if (ret)
> return ret;
> @@ -1973,12 +1971,12 @@ int cs35l41_hda_probe(struct device *dev, const char *device_name, int id, int i
> gpiod_set_value_cansleep(cs35l41->reset_gpio, 0);
> usleep_range(2000, 2100);
> gpiod_set_value_cansleep(cs35l41->reset_gpio, 1);
> + usleep_range(2000, 2100);
> + } else {
> + regmap_write(cs35l41->regmap, CS35L41_SFT_RESET, CS35L41_SOFTWARE_RESET);
> + usleep_range(2000, 2100);
> }
>
> - usleep_range(2000, 2100);
> - regmap_write(cs35l41->regmap, CS35L41_SFT_RESET, CS35L41_SOFTWARE_RESET);
> - usleep_range(2000, 2100);
> -
> ret = cs35l41_wait_boot_done(cs35l41);
> if (ret)
> goto err;