|
@@ -3500,6 +3500,10 @@ static void hda_call_codec_suspend(struct hda_codec *codec)
|
|
|
*/
|
|
|
static void hda_call_codec_resume(struct hda_codec *codec)
|
|
|
{
|
|
|
+ /* set as if powered on for avoiding re-entering the resume
|
|
|
+ * in the resume / power-save sequence
|
|
|
+ */
|
|
|
+ hda_keep_power_on(codec);
|
|
|
hda_set_power_state(codec,
|
|
|
codec->afg ? codec->afg : codec->mfg,
|
|
|
AC_PWRST_D0);
|
|
@@ -3515,6 +3519,7 @@ static void hda_call_codec_resume(struct hda_codec *codec)
|
|
|
snd_hda_codec_resume_amp(codec);
|
|
|
snd_hda_codec_resume_cache(codec);
|
|
|
}
|
|
|
+ snd_hda_power_down(codec); /* flag down before returning */
|
|
|
}
|
|
|
#endif /* CONFIG_PM */
|
|
|
|
|
@@ -4332,6 +4337,7 @@ void snd_hda_power_up(struct hda_codec *codec)
|
|
|
snd_hda_update_power_acct(codec);
|
|
|
codec->power_on = 1;
|
|
|
codec->power_jiffies = jiffies;
|
|
|
+ codec->power_transition = 1; /* avoid reentrance */
|
|
|
if (bus->ops.pm_notify)
|
|
|
bus->ops.pm_notify(bus);
|
|
|
hda_call_codec_resume(codec);
|
|
@@ -5521,8 +5527,7 @@ int snd_hda_resume(struct hda_bus *bus)
|
|
|
list_for_each_entry(codec, &bus->codec_list, list) {
|
|
|
if (codec->patch_ops.pre_resume)
|
|
|
codec->patch_ops.pre_resume(codec);
|
|
|
- if (snd_hda_codec_needs_resume(codec))
|
|
|
- hda_call_codec_resume(codec);
|
|
|
+ hda_call_codec_resume(codec);
|
|
|
}
|
|
|
return 0;
|
|
|
}
|