Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit a221e287 authored by Takashi Iwai's avatar Takashi Iwai Committed by Jaroslav Kysela
Browse files

[ALSA] hda-intel - Avoid unnecessary work scheduling



Avoid unnecessary work scheduling for power-off.

Signed-off-by: default avatarTakashi Iwai <tiwai@suse.de>
Signed-off-by: default avatarJaroslav Kysela <perex@suse.cz>
parent 676a9b53
Loading
Loading
Loading
Loading
+7 −3
Original line number Diff line number Diff line
@@ -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,17 +2220,20 @@ 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,
				 struct hda_loopback_check *check,
+2 −1
Original line number Diff line number Diff line
@@ -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