OpenCloudOS-Kernel/sound/soc/sof
Kai-Heng Feng ef4d764c99
ASoC: SOF: Intel: hda: Avoid checking jack on system suspend
System takes a very long time to suspend after commit 215a22ed31
("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 the codec suspended during the system suspend. However,
mute/micmute LED will clear codec's direct-complete flag by
dpm_clear_superiors_direct_complete().

This doesn't play well with SOF driver. When its runtime resume is
called for system suspend, hda_codec_jack_check() schedules
jackpoll_work which uses snd_hdac_is_power_on() to check whether codec
is suspended. Because the direct-complete path isn't taken,
pm_runtime_disable() isn't called so snd_hdac_is_power_on() returns
false and jackpoll continues to run, and snd_hda_power_up_pm() cannot
power up an already suspended codec in multiple attempts, causes the
long delay on system suspend:

if (dev->power.direct_complete) {
	if (pm_runtime_status_suspended(dev)) {
		pm_runtime_disable(dev);
		if (pm_runtime_status_suspended(dev)) {
			pm_dev_dbg(dev, state, "direct-complete ");
			goto Complete;
		}

		pm_runtime_enable(dev);
	}
	dev->power.direct_complete = false;
}

When direct-complete path is taken, snd_hdac_is_power_on() returns true
and hda_jackpoll_work() is skipped by accident. So this is still not
correct.

If we were to use snd_hdac_is_power_on() in system PM path,
pm_runtime_status_suspended() should be used instead of
pm_runtime_suspended(), otherwise pm_runtime_{enable,disable}() may
change the outcome of snd_hdac_is_power_on().

Because devices suspend in reverse order (i.e. child first), it doesn't
make much sense to resume an already suspended codec from audio
controller. So avoid the issue by making sure jackpoll isn't used in
system PM process.

Fixes: 215a22ed31 ("ALSA: hda: Refactor codec PM to use direct-complete optimization")
Signed-off-by: Kai-Heng Feng <kai.heng.feng@canonical.com>
Reviewed-by: Kai Vehmanen <kai.vehmanen@linux.intel.com>
Link: https://lore.kernel.org/r/20210112181128.1229827-3-kai.heng.feng@canonical.com
Signed-off-by: Mark Brown <broonie@kernel.org>
2021-01-13 15:24:07 +00:00
..
imx ASoC: SOF: imx: update kernel-doc description 2020-12-11 13:23:03 +00:00
intel ASoC: SOF: Intel: hda: Avoid checking jack on system suspend 2021-01-13 15:24:07 +00:00
xtensa ASoC: SOF/Intel: clarify SPDX license with GPL-2.0-only 2020-05-01 17:45:24 +01:00
Kconfig ASoC: SOF: Fix spelling mistake in Kconfig "ond" -> "and" 2020-12-16 13:53:51 +00:00
Makefile ASoC: SOF/Intel: clarify SPDX license with GPL-2.0-only 2020-05-01 17:45:24 +01:00
compress.c ASoC: SOF/Intel: clarify SPDX license with GPL-2.0-only 2020-05-01 17:45:24 +01:00
compress.h ASoC: SOF/Intel: clarify SPDX license with GPL-2.0-only 2020-05-01 17:45:24 +01:00
control.c ASoC: SOF: control: override volume info callback 2020-11-20 13:49:05 +00:00
core.c ASoC: SOF: core: fix null-ptr-deref bug during device removal 2020-07-08 15:02:02 +01:00
debug.c ASoC: SOF: modify the SOF_DBG flags 2020-12-11 13:22:57 +00:00
ipc.c ASoC: SOF: Add `memory_info` file to debugfs 2020-11-25 11:07:17 +00:00
loader.c ASoC: SOF: Intel: hda: fix the condition passed to sof_dev_dbg_or_err 2020-12-11 13:22:58 +00:00
nocodec.c ASoC: SOF: nocodec: modify DAI link definitions 2020-11-20 16:42:14 +00:00
ops.c ASoC: SOF: modify the SOF_DBG flags 2020-12-11 13:22:57 +00:00
ops.h ASoC: SOF: ops: modify the signature of stall op 2020-11-27 17:23:06 +00:00
pcm.c ASoC: SOF: nocodec: modify DAI link definitions 2020-11-20 16:42:14 +00:00
pm.c ASoC: SOF: pm: Fix prepare callback behavior for OF usecase 2020-09-21 17:28:10 +01:00
probe.c ASoC: SOF/Intel: clarify SPDX license with GPL-2.0-only 2020-05-01 17:45:24 +01:00
probe.h ASoC: SOF: Replace zero-length array with flexible-array 2020-06-15 23:08:32 -05:00
sof-acpi-dev.c ASoC: SOF: acpi: add dynamic selection of DSP driver 2020-11-19 18:24:39 +00:00
sof-audio.c ASoC: SOF: nocodec: modify DAI link definitions 2020-11-20 16:42:14 +00:00
sof-audio.h ASoC: SOF: control: fix cppcheck warning in snd_sof_volume_info() 2020-12-04 23:26:32 +00:00
sof-of-dev.c ASoC: SOF: Add .prepare/.complete callbacks 2020-09-25 18:53:12 +01:00
sof-pci-dev.c ASoC: SOF: Intel: add SoundWire support for ADL-S 2020-12-09 16:52:05 +00:00
sof-priv.h ASoC: SOF: Intel: hda: fix the condition passed to sof_dev_dbg_or_err 2020-12-11 13:22:58 +00:00
topology.c ASoC: SOF: control: override volume info callback 2020-11-20 13:49:05 +00:00
trace.c ASoC: SOF: trace: Add runtime trace filtering mechanism 2020-12-07 14:22:05 +00:00
utils.c ASoC: SOF/Intel: clarify SPDX license with GPL-2.0-only 2020-05-01 17:45:24 +01:00