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

Commit 09617ce4 authored by Wang Xingchao's avatar Wang Xingchao Committed by Takashi Iwai
Browse files

ALSA: hda - power setting error check



codec may reject power state transition requests(reporting PS-ERROR set),
in that case we re-issue a power state setting and check error bit again.

Signed-off-by: default avatarWang Xingchao <xingchao.wang@intel.com>
Signed-off-by: default avatarTakashi Iwai <tiwai@suse.de>
parent e076eb5c
Loading
Loading
Loading
Loading
+14 −3
Original line number Diff line number Diff line
@@ -3526,6 +3526,9 @@ static bool snd_hda_codec_get_supported_ps(struct hda_codec *codec, hda_nid_t fg
static void hda_set_power_state(struct hda_codec *codec, hda_nid_t fg,
				unsigned int power_state)
{
	int count;
	unsigned int state;

	if (codec->patch_ops.set_power_state) {
		codec->patch_ops.set_power_state(codec, fg, power_state);
		return;
@@ -3537,9 +3540,17 @@ static void hda_set_power_state(struct hda_codec *codec, hda_nid_t fg,
		bool epss = snd_hda_codec_get_supported_ps(codec, fg, AC_PWRST_EPSS);
		msleep(epss ? 10 : 100);
	}

	/* repeat power states setting at most 10 times*/
	for (count = 0; count < 10; count++) {
		snd_hda_codec_read(codec, fg, 0, AC_VERB_SET_POWER_STATE,
				    power_state);
		snd_hda_codec_set_power_to_all(codec, fg, power_state, true);
		state = snd_hda_codec_read(codec, fg, 0,
					   AC_VERB_GET_POWER_STATE, 0);
		if (!(state & AC_PWRST_ERROR))
			break;
	}
}

#ifdef CONFIG_SND_HDA_HWDEP