aboutsummaryrefslogtreecommitdiffstats
path: root/sound/pci/hda/hda_codec.c
diff options
context:
space:
mode:
authorTakashi Iwai <tiwai@suse.de>2021-08-13 10:12:29 +0200
committerTakashi Iwai <tiwai@suse.de>2021-08-14 08:39:27 +0200
commitb98444ed597dc42be620bcac241c93da50933e69 (patch)
treeb4e00504895725dd1b693de9a894dfb36d2ada68 /sound/pci/hda/hda_codec.c
parentALSA: hda: conexant: Turn off EAPD at suspend, too (diff)
downloadlinux-dev-b98444ed597dc42be620bcac241c93da50933e69.tar.xz
linux-dev-b98444ed597dc42be620bcac241c93da50933e69.zip
ALSA: hda: Suspend codec at shutdown
So far we have a few workarounds at shutdown for each codec, e.g. turning off the display power and setting the codec to D3. But all those are basically a part of the suspend procedure. Moreover, the streams are still active after that call, hence it might hit the update on the codec that has been already put to D3. In this patch, instead of calling each reboot_notify callback, simply put the codec into the runtime-suspended state after the manual suspend of all PCM streams. It makes the code and the behavior more consistent. The reboot_notify callback is no longer used after this patch, and will be cleaned up later. BugLink: https://bugzilla.kernel.org/show_bug.cgi?id=214045 Link: https://lore.kernel.org/r/20210813081230.4268-3-tiwai@suse.de Signed-off-by: Takashi Iwai <tiwai@suse.de>
Diffstat (limited to 'sound/pci/hda/hda_codec.c')
-rw-r--r--sound/pci/hda/hda_codec.c14
1 files changed, 14 insertions, 0 deletions
diff --git a/sound/pci/hda/hda_codec.c b/sound/pci/hda/hda_codec.c
index 7a717e151156..2c91c92c9ab2 100644
--- a/sound/pci/hda/hda_codec.c
+++ b/sound/pci/hda/hda_codec.c
@@ -2981,6 +2981,20 @@ const struct dev_pm_ops hda_codec_driver_pm = {
NULL)
};
+/* suspend the codec at shutdown; called from driver's shutdown callback */
+void snd_hda_codec_shutdown(struct hda_codec *codec)
+{
+ struct hda_pcm *cpcm;
+
+ if (pm_runtime_suspended(hda_codec_dev(codec)))
+ return;
+
+ list_for_each_entry(cpcm, &codec->pcm_list_head, list)
+ snd_pcm_suspend_all(cpcm->pcm);
+
+ pm_runtime_suspend(hda_codec_dev(codec));
+}
+
/*
* add standard channel maps if not specified
*/