From: Ajay Kumar Nandam <ajay.nandam@oss.qualcomm.com>
To: Pengpeng Hou <hppiscas@163.com>,
Liam Girdwood <lgirdwood@gmail.com>,
Mark Brown <broonie@kernel.org>
Cc: Oder Chiou <oder_chiou@realtek.com>,
Jaroslav Kysela <perex@perex.cz>, Takashi Iwai <tiwai@suse.com>,
linux-sound@vger.kernel.org, linux-kernel@vger.kernel.org,
Charles Keepax <ckeepax@opensource.cirrus.com>,
ajay.nandam@oss.qualcomm.com
Subject: Re: [PATCH v2 9/9] ASoC: rt5677: restore safe state after resume errors
Date: Thu, 15 Oct 2026 00:13:50 +0530 [thread overview]
Message-ID: <a6332273-045b-4a72-a6c4-a0c6d584532d@oss.qualcomm.com> (raw)
In-Reply-To: <20261014032452.13456-10-hppiscas@163.com>
On 10/14/2026 8:54 AM, Pengpeng Hou wrote:
> rt5677_resume() ignores regcache_sync() failure before continuing
> dependent resume operations. Restore cache-only mode, leave the cache
> dirty, and return the replay error before those operations.
>
> First return physical regmap write errors from the normal-mode write
> wrapper, which currently discards them, so cache replay can observe bus
> failures. Restore reset and the optional LDO GPIO on replay failure.
> Remember that cache restoration is still pending independently of the
> requested DSP VAD mode: DAPM or controls can change that mode after
> failed resume. Suppress DSP work while restoration is pending and
> require replay on the next resume even if VAD has since been requested.
> After successful replay, preserve the existing MCLK settling delay
> before restarting requested DSP work. The already-running, retained VAD
> path and DSP-mode transport are unchanged.
>
> ASoC still marks the component resumed when the callback reports failure.
> Track the suspend-owned IRQ disable so another suspend does not increment
> the disable depth again after a failed resume. A later successful resume
> releases that one disable reference. This does not add automatic retry or
> change the framework's best-effort card resume policy.
>
> The issue was found by our static-analysis tool and manually reviewed.
>
> Fixes: 0e826e867264 ("ASoC: add RT5677 CODEC driver")
> Assisted-by: gpt 5
> Signed-off-by: Pengpeng Hou <hppiscas@163.com>
> ---
> Changes since v1:
> - restore cache-only mode and dirty state on replay failure
> - keep suspend-owned IRQ disables balanced across failed resume cycles
> - propagate the normal-mode transport write result to cache replay
> - preserve pending cache restoration across changes to the VAD request
> - keep DSP work paused until replay succeeds, retaining the MCLK delay
> - send as one correctly threaded series, as Mark requested
>
> Previous series:
> https://lore.kernel.org/all/20260906034321.86080-1-hppiscas@163.com/
>
> sound/soc/codecs/rt5677.c | 37 ++++++++++++++++++++++++++++++++-----
> sound/soc/codecs/rt5677.h | 2 ++
> 2 files changed, 34 insertions(+), 5 deletions(-)
>
> diff --git a/sound/soc/codecs/rt5677.c b/sound/soc/codecs/rt5677.c
> index 7b80922236e5818e846d9ecc6e23793e6ae40714..fd1f840d6794ea95b47d803ba4977fdb81e184a9 100644
> --- a/sound/soc/codecs/rt5677.c
> +++ b/sound/soc/codecs/rt5677.c
> @@ -885,6 +885,9 @@ static void rt5677_dsp_work(struct work_struct *work)
> bool enable = rt5677->dsp_vad_en;
> int i, val;
>
> + /* DAPM may request VAD even after component resume has failed. */
> + if (READ_ONCE(rt5677->cache_restore_pending))
> + return;
>
> dev_info(rt5677->component->dev, "DSP VAD: enable=%d, activity=%d\n",
> enable, activity);
> @@ -4939,10 +4942,14 @@ static int rt5677_suspend(struct snd_soc_component *component)
>
> if (rt5677->irq) {
> cancel_delayed_work_sync(&rt5677->resume_irq_check);
> - disable_irq(rt5677->irq);
> + if (!rt5677->suspend_irq_disabled) {
> + disable_irq(rt5677->irq);
> + rt5677->suspend_irq_disabled = true;
> + }
Similar to the nau8825 case, should this new suspend_irq_disabled
tracking be based on whether the IRQ was successfully requested?
rt5677_init_irq() still sets rt5677->irq = i2c->irq even when
devm_request_threaded_irq() fails, and probe continues after only
logging that error.
Thanks
Ajay Kumar Nandam
> }
>
> if (!rt5677->dsp_vad_en) {
> + WRITE_ONCE(rt5677->cache_restore_pending, true);
> regcache_cache_only(rt5677->regmap, true);
> regcache_mark_dirty(rt5677->regmap);
>
> @@ -4956,8 +4963,11 @@ static int rt5677_suspend(struct snd_soc_component *component)
> static int rt5677_resume(struct snd_soc_component *component)
> {
> struct rt5677_priv *rt5677 = snd_soc_component_get_drvdata(component);
> + bool restore_cache = !rt5677->dsp_vad_en ||
> + READ_ONCE(rt5677->cache_restore_pending);
> + int ret;
>
> - if (!rt5677->dsp_vad_en) {
> + if (restore_cache) {
> rt5677->pll_src = 0;
> rt5677->pll_in = 0;
> rt5677->pll_out = 0;
> @@ -4967,11 +4977,28 @@ static int rt5677_resume(struct snd_soc_component *component)
> msleep(10);
>
> regcache_cache_only(rt5677->regmap, false);
> - regcache_sync(rt5677->regmap);
> + ret = regcache_sync(rt5677->regmap);
> + if (ret) {
> + WRITE_ONCE(rt5677->cache_restore_pending, true);
> + regcache_cache_only(rt5677->regmap, true);
> + regcache_mark_dirty(rt5677->regmap);
> + gpiod_set_value_cansleep(rt5677->reset_pin, 1);
> + gpiod_set_value_cansleep(rt5677->pow_ldo2, 0);
> + return ret;
> + }
> + WRITE_ONCE(rt5677->cache_restore_pending, false);
> + if (rt5677->dsp_vad_en) {
> + /* Allow MCLK to settle, as when leaving bias OFF. */
> + schedule_delayed_work(&rt5677->dsp_work,
> + msecs_to_jiffies(1000));
> + }
> }
>
> if (rt5677->irq) {
> - enable_irq(rt5677->irq);
> + if (rt5677->suspend_irq_disabled) {
> + rt5677->suspend_irq_disabled = false;
> + enable_irq(rt5677->irq);
> + }
> schedule_delayed_work(&rt5677->resume_irq_check, 0);
> }
>
> @@ -5021,7 +5048,7 @@ static int rt5677_write(void *context, unsigned int reg, unsigned int val)
> rt5677_dsp_mode_i2c_write(rt5677, reg, val);
> }
> } else {
> - regmap_write(rt5677->regmap_physical, reg, val);
> + return regmap_write(rt5677->regmap_physical, reg, val);
> }
>
> return 0;
> diff --git a/sound/soc/codecs/rt5677.h b/sound/soc/codecs/rt5677.h
> index 876f7674015c2c0a5421feb25a8c80313b18310a..e6e915453f2efbe78c9d2dd3e909397d9ad715ca 100644
> --- a/sound/soc/codecs/rt5677.h
> +++ b/sound/soc/codecs/rt5677.h
> @@ -1788,6 +1788,7 @@ struct rt5677_priv {
> #endif
> bool dsp_vad_en_request; /* DSP VAD enable/disable request */
> bool dsp_vad_en; /* dsp_work parameter */
> + bool cache_restore_pending;
> bool is_dsp_mode;
> bool is_vref_slow;
> struct delayed_work dsp_work;
> @@ -1798,6 +1799,7 @@ struct rt5677_priv {
> unsigned int irq_en;
> struct delayed_work resume_irq_check;
> int irq;
> + bool suspend_irq_disabled;
>
> int (*set_dsp_vad)(struct snd_soc_component *component, bool on);
> };
>
> base-commit: 8ef28aef33f2d5da6959ad6b579ec3cfccc009f6
>
>
prev parent reply other threads:[~2026-10-14 18:43 UTC|newest]
Thread overview: 13+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-10-14 3:24 [PATCH v2 0/9] ASoC: stop dependent resume work after restore failures Pengpeng Hou
2026-10-14 3:24 ` [PATCH v2 1/9] ASoC: nau8821: restore safe state after resume errors Pengpeng Hou
2026-10-14 3:24 ` [PATCH v2 2/9] ASoC: nau8824: " Pengpeng Hou
2026-10-14 3:24 ` [PATCH v2 3/9] ASoC: nau8825: " Pengpeng Hou
2026-10-14 18:18 ` Ajay Kumar Nandam
2026-10-14 3:24 ` [PATCH v2 4/9] ASoC: rt5663: " Pengpeng Hou
2026-10-14 3:24 ` [PATCH v2 5/9] ASoC: rt5682s: " Pengpeng Hou
2026-10-14 3:24 ` [PATCH v2 6/9] ASoC: rt5682: " Pengpeng Hou
2026-10-14 3:24 ` [PATCH v2 7/9] ASoC: wm8978: " Pengpeng Hou
2026-10-14 9:20 ` Charles Keepax
2026-10-14 3:24 ` [PATCH v2 8/9] ASoC: rt5640: " Pengpeng Hou
2026-10-14 3:24 ` [PATCH v2 9/9] ASoC: rt5677: " Pengpeng Hou
2026-10-14 18:43 ` Ajay Kumar Nandam [this message]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=a6332273-045b-4a72-a6c4-a0c6d584532d@oss.qualcomm.com \
--to=ajay.nandam@oss.qualcomm.com \
--cc=broonie@kernel.org \
--cc=ckeepax@opensource.cirrus.com \
--cc=hppiscas@163.com \
--cc=lgirdwood@gmail.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-sound@vger.kernel.org \
--cc=oder_chiou@realtek.com \
--cc=perex@perex.cz \
--cc=tiwai@suse.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®