|
@@ -1209,6 +1209,9 @@ static void snd_hda_codec_free(struct hda_codec *codec)
|
|
|
kfree(codec);
|
|
|
}
|
|
|
|
|
|
+static bool snd_hda_codec_get_supported_ps(struct hda_codec *codec,
|
|
|
+ hda_nid_t fg, unsigned int power_state);
|
|
|
+
|
|
|
static void hda_set_power_state(struct hda_codec *codec, hda_nid_t fg,
|
|
|
unsigned int power_state);
|
|
|
|
|
@@ -1317,6 +1320,10 @@ int /*__devinit*/ snd_hda_codec_new(struct hda_bus *bus,
|
|
|
AC_VERB_GET_SUBSYSTEM_ID, 0);
|
|
|
}
|
|
|
|
|
|
+ codec->epss = snd_hda_codec_get_supported_ps(codec,
|
|
|
+ codec->afg ? codec->afg : codec->mfg,
|
|
|
+ AC_PWRST_EPSS);
|
|
|
+
|
|
|
/* power-up all before initialization */
|
|
|
hda_set_power_state(codec,
|
|
|
codec->afg ? codec->afg : codec->mfg,
|
|
@@ -3543,8 +3550,7 @@ static void hda_set_power_state(struct hda_codec *codec, hda_nid_t fg,
|
|
|
/* this delay seems necessary to avoid click noise at power-down */
|
|
|
if (power_state == AC_PWRST_D3) {
|
|
|
/* transition time less than 10ms for power down */
|
|
|
- bool epss = snd_hda_codec_get_supported_ps(codec, fg, AC_PWRST_EPSS);
|
|
|
- msleep(epss ? 10 : 100);
|
|
|
+ msleep(codec->epss ? 10 : 100);
|
|
|
}
|
|
|
|
|
|
/* repeat power states setting at most 10 times*/
|