Sfoglia il codice sorgente

[ALSA] hda-intel - Avoid unnecessary work scheduling

Avoid unnecessary work scheduling for power-off.

Signed-off-by: Takashi Iwai <tiwai@suse.de>
Signed-off-by: Jaroslav Kysela <perex@suse.cz>
Takashi Iwai 18 anni fa
parent
commit
a221e287ab
2 ha cambiato i file con 9 aggiunte e 4 eliminazioni
  1. 7 3
      sound/pci/hda/hda_codec.c
  2. 2 1
      sound/pci/hda/hda_codec.h

+ 7 - 3
sound/pci/hda/hda_codec.c

@@ -1664,6 +1664,7 @@ static void hda_call_codec_suspend(struct hda_codec *codec)
 #ifdef CONFIG_SND_HDA_POWER_SAVE
 	cancel_delayed_work(&codec->power_work);
 	codec->power_on = 0;
+	codec->power_transition = 0;
 #endif
 }
 
@@ -2211,7 +2212,7 @@ static void hda_keep_power_on(struct hda_codec *codec)
 void snd_hda_power_up(struct hda_codec *codec)
 {
 	codec->power_count++;
-	if (codec->power_on)
+	if (codec->power_on || codec->power_transition)
 		return;
 
 	codec->power_on = 1;
@@ -2219,16 +2220,19 @@ void snd_hda_power_up(struct hda_codec *codec)
 		codec->bus->ops.pm_notify(codec);
 	hda_call_codec_resume(codec);
 	cancel_delayed_work(&codec->power_work);
+	codec->power_transition = 0;
 }
 
 void snd_hda_power_down(struct hda_codec *codec)
 {
 	--codec->power_count;
-	if (!codec->power_on || codec->power_count)
+	if (!codec->power_on || codec->power_count || codec->power_transition)
 		return;
-	if (power_save)
+	if (power_save) {
+		codec->power_transition = 1; /* avoid reentrance */
 		schedule_delayed_work(&codec->power_work,
 				      msecs_to_jiffies(power_save * 1000));
+	}
 }
 
 int snd_hda_check_amp_list_power(struct hda_codec *codec,

+ 2 - 1
sound/pci/hda/hda_codec.h

@@ -586,7 +586,8 @@ struct hda_codec {
 	struct snd_hwdep *hwdep;	/* assigned hwdep device */
 
 #ifdef CONFIG_SND_HDA_POWER_SAVE
-	int power_on;		/* current (global) power-state */
+	unsigned int power_on :1;	/* current (global) power-state */
+	unsigned int power_transition :1; /* power-state in transition */
 	int power_count;	/* current (global) power refcount */
 	struct delayed_work power_work; /* delayed task for powerdown */
 #endif