ALSA: hda/sigmatel: Keep power up while beep is enabled
authorTakashi Iwai <tiwai@suse.de>
Sun, 4 Sep 2022 07:27:50 +0000 (09:27 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Fri, 23 Sep 2022 12:15:50 +0000 (14:15 +0200)
[ Upstream commit 414d38ba871092aeac4ed097ac4ced89486646f7 ]

It seems that the beep playback doesn't work well on IDT codec devices
when the codec auto-pm is enabled.  Keep the power on while the beep
switch is enabled.

Link: https://bugzilla.suse.com/show_bug.cgi?id=1200544
Link: https://lore.kernel.org/r/20220904072750.26164-1-tiwai@suse.de
Signed-off-by: Takashi Iwai <tiwai@suse.de>
Signed-off-by: Sasha Levin <sashal@kernel.org>
sound/pci/hda/patch_sigmatel.c

index 61df4d33c48ffa95dc5e6adb11e48ff364984c1f..066bfccd25877ec99ac08e93c3198f474a49385d 100644 (file)
@@ -209,6 +209,7 @@ struct sigmatel_spec {
 
        /* beep widgets */
        hda_nid_t anabeep_nid;
+       bool beep_power_on;
 
        /* SPDIF-out mux */
        const char * const *spdif_labels;
@@ -4443,6 +4444,26 @@ static int stac_suspend(struct hda_codec *codec)
 
        return 0;
 }
+
+static int stac_check_power_status(struct hda_codec *codec, hda_nid_t nid)
+{
+       struct sigmatel_spec *spec = codec->spec;
+       int ret = snd_hda_gen_check_power_status(codec, nid);
+
+#ifdef CONFIG_SND_HDA_INPUT_BEEP
+       if (nid == spec->gen.beep_nid && codec->beep) {
+               if (codec->beep->enabled != spec->beep_power_on) {
+                       spec->beep_power_on = codec->beep->enabled;
+                       if (spec->beep_power_on)
+                               snd_hda_power_up_pm(codec);
+                       else
+                               snd_hda_power_down_pm(codec);
+               }
+               ret |= spec->beep_power_on;
+       }
+#endif
+       return ret;
+}
 #else
 #define stac_suspend           NULL
 #endif /* CONFIG_PM */
@@ -4455,6 +4476,7 @@ static const struct hda_codec_ops stac_patch_ops = {
        .unsol_event = snd_hda_jack_unsol_event,
 #ifdef CONFIG_PM
        .suspend = stac_suspend,
+       .check_power_status = stac_check_power_status,
 #endif
 };