On Fri, Jan 1, 2021 at 4:07 PM Takashi Iwai tiwai@suse.de wrote:
On Thu, 31 Dec 2020 19:06:43 +0100, Kai-Heng Feng wrote:
On Thu, Dec 31, 2020 at 6:55 PM Takashi Iwai tiwai@suse.de wrote:
On Tue, 29 Dec 2020 14:38:15 +0100, Kai-Heng Feng wrote:
System takes a very long time to suspend after commit 215a22ed31a1 ("ALSA: hda: Refactor codec PM to use direct-complete optimization"): [ 90.065964] PM: suspend entry (s2idle) [ 90.067337] Filesystems sync: 0.001 seconds [ 90.185758] Freezing user space processes ... (elapsed 0.002 seconds) done. [ 90.188713] OOM killer disabled. [ 90.188714] Freezing remaining freezable tasks ... (elapsed 0.001 seconds) done. [ 90.190024] printk: Suspending console(s) (use no_console_suspend to debug) [ 90.904912] intel_pch_thermal 0000:00:12.0: CPU-PCH is cool [49C], continue to suspend [ 321.262505] snd_hda_codec_realtek ehdaudio0D0: Unable to sync register 0x2b8000. -5 [ 328.426919] snd_hda_codec_realtek ehdaudio0D0: Unable to sync register 0x2b8000. -5 [ 329.490933] ACPI: EC: interrupt blocked
That commit keeps codec suspended during the system suspend. However, SOF driver's runtime resume, which is for system suspend, calls hda_codec_jack_check() and schedules jackpoll_work. The jackpoll work uses snd_hda_power_up_pm() which tries to resume the codec in system suspend path, hence blocking the suspend process.
So only check jack status if it's not in system PM process.
After your previous patch set, the legacy HDA does queue the jackpoll_work only if jackpoll_interval is set. I suppose rather the same rule would be applied?
It's queued in hda_codec_pm_complete(), which happens at the end of PM process. This one is queued in the middle of PM suspend, so it's not the same here.
But why do we need the jack status check explicitly there if hda_codec_pm_complete() already does it (via re-queuing the resume)?
Because hda_resume() is called for both system and runtime resume, but hda_codec_pm_complete() only gets called for system resume. So we still need to cover the runtime resume case.
However, we can use pm_request_resume() to wakeup the codec and do the jack detection, instead of queueing jackpoll_work directly. I'll do the change in v2.
Kai-Heng
thanks,
Takashi
Kai-Heng
thanks,
Takashi
Fixes: 215a22ed31a1 ("ALSA: hda: Refactor codec PM to use direct-complete optimization") Signed-off-by: Kai-Heng Feng kai.heng.feng@canonical.com
sound/soc/sof/intel/hda-dsp.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/sound/soc/sof/intel/hda-dsp.c b/sound/soc/sof/intel/hda-dsp.c index 7d00107cf3b2..1c5e05b88a90 100644 --- a/sound/soc/sof/intel/hda-dsp.c +++ b/sound/soc/sof/intel/hda-dsp.c @@ -685,7 +685,8 @@ static int hda_resume(struct snd_sof_dev *sdev, bool runtime_resume) /* check jack status */ if (runtime_resume) { hda_codec_jack_wake_enable(sdev, false);
hda_codec_jack_check(sdev);
if (sdev->system_suspend_target == SOF_SUSPEND_NONE)
hda_codec_jack_check(sdev); } /* turn off the links that were off before suspend */
-- 2.29.2