Message ID | 20210104140853.228448-3-kai.heng.feng@canonical.com (mailing list archive) |
---|---|
State | Superseded |
Headers | show |
Series | [v2,1/3] ASoC: SOF: Intel: hda: Resume codec to do jack detection | expand |
Hey, On Mon, 4 Jan 2021, 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) the patch itself looks good, but can you explain a bit more in what conditions you hit the delay? I tried to reproduce the delay on multiple systems (with tip of tiwai/master), but with no luck. I can see hda_jackpoll_work() called, but at this point runtime pm has been disabled already (via __device_suspend()) and snd_hdac_is_power_on() will return true even when pm_runtime_suspended() is true as well (which is expected as runtime-pm is disabled at this point for system suspend). End result is codec is not powered up in hda_jackpoll_work() and suspend is not delayed. The patch still seems correct. You would hit the problem you describe if jackpoll_interval was set to a non-zero value (not the case on most systems supported by SOF, but still a possibility). I'm still curious how you hit the problem. At minimum, we are missing a scenario in our testing. Br, Kai
On Tue, Jan 5, 2021 at 8:28 PM Kai Vehmanen <kai.vehmanen@linux.intel.com> wrote: > > Hey, > > On Mon, 4 Jan 2021, 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) > > the patch itself looks good, but can you explain a bit more in what > conditions you hit the delay? If both controller and codec are suspended, I can 100% reproduce the issue. > > I tried to reproduce the delay on multiple systems (with tip of > tiwai/master), but with no luck. I can see hda_jackpoll_work() called, but > at this point runtime pm has been disabled already (via > __device_suspend()) and snd_hdac_is_power_on() will return true even when > pm_runtime_suspended() is true as well (which is expected as runtime-pm is > disabled at this point for system suspend). End result is codec is not > powered up in hda_jackpoll_work() and suspend is not delayed. On my system snd_hdac_is_power_on() calls hda_set_power_state() which takes long time to write to (suspended) codec. I am not sure why it doesn't power up codec on your system. > > The patch still seems correct. You would hit the problem you describe if > jackpoll_interval was set to a non-zero value (not the case on most > systems supported by SOF, but still a possibility). I'm still curious how > you hit the problem. At minimum, we are missing a scenario in our testing. The issue happens with zero jackpoll_interval. Kai-Heng > > Br, Kai
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 */
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. Fixes: 215a22ed31a1 ("ALSA: hda: Refactor codec PM to use direct-complete optimization") Signed-off-by: Kai-Heng Feng <kai.heng.feng@canonical.com> --- v2: No change. sound/soc/sof/intel/hda-dsp.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)