]> git.baikalelectronics.ru Git - kernel.git/commitdiff
ALSA: hda: beep: Simplify keep-power-at-enable behavior
authorTakashi Iwai <tiwai@suse.de>
Tue, 6 Sep 2022 09:23:06 +0000 (11:23 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 26 Oct 2022 11:22:29 +0000 (13:22 +0200)
[ Upstream commit 73312ca1c27c582d3a33a321a2c7dbb42725f792 ]

The recent fix for IDT codecs to keep the power up while the beep is
enabled can be better integrated into the beep helper code.
This patch cleans up the code with refactoring.

Fixes: c25ca73d3991 ("ALSA: hda/sigmatel: Keep power up while beep is enabled")
Link: https://lore.kernel.org/r/20220906092306.26183-1-tiwai@suse.de
Signed-off-by: Takashi Iwai <tiwai@suse.de>
Signed-off-by: Sasha Levin <sashal@kernel.org>
sound/pci/hda/hda_beep.c
sound/pci/hda/hda_beep.h
sound/pci/hda/patch_sigmatel.c

index c6e1e03a5e4daa15a94e8c9545ec7903203cd72a..5a50b6c1d6049b38c630e8229dd6901a30137539 100644 (file)
@@ -118,6 +118,12 @@ static int snd_hda_beep_event(struct input_dev *dev, unsigned int type,
        return 0;
 }
 
+static void turn_on_beep(struct hda_beep *beep)
+{
+       if (beep->keep_power_at_enable)
+               snd_hda_power_up_pm(beep->codec);
+}
+
 static void turn_off_beep(struct hda_beep *beep)
 {
        cancel_work_sync(&beep->beep_work);
@@ -125,6 +131,8 @@ static void turn_off_beep(struct hda_beep *beep)
                /* turn off beep */
                generate_tone(beep, 0);
        }
+       if (beep->keep_power_at_enable)
+               snd_hda_power_down_pm(beep->codec);
 }
 
 /**
@@ -140,7 +148,9 @@ int snd_hda_enable_beep_device(struct hda_codec *codec, int enable)
        enable = !!enable;
        if (beep->enabled != enable) {
                beep->enabled = enable;
-               if (!enable)
+               if (enable)
+                       turn_on_beep(beep);
+               else
                        turn_off_beep(beep);
                return 1;
        }
@@ -167,7 +177,8 @@ static int beep_dev_disconnect(struct snd_device *device)
                input_unregister_device(beep->dev);
        else
                input_free_device(beep->dev);
-       turn_off_beep(beep);
+       if (beep->enabled)
+               turn_off_beep(beep);
        return 0;
 }
 
index a25358a4807abfbc581e352b8ce63811da4f172b..db76e3ddba65445bc8e47257436d6f6cb51df142 100644 (file)
@@ -25,6 +25,7 @@ struct hda_beep {
        unsigned int enabled:1;
        unsigned int linear_tone:1;     /* linear tone for IDT/STAC codec */
        unsigned int playing:1;
+       unsigned int keep_power_at_enable:1;    /* set by driver */
        struct work_struct beep_work; /* scheduled task for beep event */
        struct mutex mutex;
        void (*power_hook)(struct hda_beep *beep, bool on);
index 04a89171327dc6e3eff00e37e30be3ef96e8e244..e42a6c5c1ba3e3c3dc202bcfe9744bd26d538669 100644 (file)
@@ -4302,6 +4302,8 @@ static int stac_parse_auto_config(struct hda_codec *codec)
                if (codec->beep) {
                        /* IDT/STAC codecs have linear beep tone parameter */
                        codec->beep->linear_tone = spec->linear_tone_beep;
+                       /* keep power up while beep is enabled */
+                       codec->beep->keep_power_at_enable = 1;
                        /* if no beep switch is available, make its own one */
                        caps = query_amp_caps(codec, nid, HDA_OUTPUT);
                        if (!(caps & AC_AMPCAP_MUTE)) {
@@ -4442,28 +4444,6 @@ static int stac_suspend(struct hda_codec *codec)
        stac_shutup(codec);
        return 0;
 }
-
-static int stac_check_power_status(struct hda_codec *codec, hda_nid_t nid)
-{
-#ifdef CONFIG_SND_HDA_INPUT_BEEP
-       struct sigmatel_spec *spec = codec->spec;
-#endif
-       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 */
@@ -4476,7 +4456,6 @@ 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
        .reboot_notify = stac_shutup,
 };