Commit 033ea349 authored by David Henningsson's avatar David Henningsson Committed by Takashi Iwai

ALSA: hda - Fix Skylake codec timeout

When the controller is powered up but the HDMI codec is powered down
on Skylake, the power well is turned off. When the codec is then
powered up again, we need to poke the codec a little extra to make
sure it wakes up. Otherwise we'll get sad "no response from codec"
messages and broken audio.

This also changes azx_runtime_resume to actually call
snd_hdac_set_codec_wakeup for Skylake (before STATETS read).
(Otherwise it would only have been called for Haswell and Broadwell,
which both do not need it, so this probably was not the author's
intention.)
Signed-off-by: default avatarDavid Henningsson <david.henningsson@canonical.com>
Reviewed-by: default avatarLibin Yang <libin.yang@intel.com>
Signed-off-by: default avatarTakashi Iwai <tiwai@suse.de>
parent 0420694d
...@@ -56,8 +56,11 @@ int snd_hdac_display_power(struct hdac_bus *bus, bool enable) ...@@ -56,8 +56,11 @@ int snd_hdac_display_power(struct hdac_bus *bus, bool enable)
enable ? "enable" : "disable"); enable ? "enable" : "disable");
if (enable) { if (enable) {
if (!bus->i915_power_refcount++) if (!bus->i915_power_refcount++) {
acomp->ops->get_power(acomp->dev); acomp->ops->get_power(acomp->dev);
snd_hdac_set_codec_wakeup(bus, true);
snd_hdac_set_codec_wakeup(bus, false);
}
} else { } else {
WARN_ON(!bus->i915_power_refcount); WARN_ON(!bus->i915_power_refcount);
if (!--bus->i915_power_refcount) if (!--bus->i915_power_refcount)
......
...@@ -979,14 +979,16 @@ static int azx_runtime_resume(struct device *dev) ...@@ -979,14 +979,16 @@ static int azx_runtime_resume(struct device *dev)
if (!azx_has_pm_runtime(chip)) if (!azx_has_pm_runtime(chip))
return 0; return 0;
if (chip->driver_caps & AZX_DCAPS_I915_POWERWELL if (chip->driver_caps & AZX_DCAPS_I915_POWERWELL) {
&& hda->need_i915_power) { bus = azx_bus(chip);
bus = azx_bus(chip); if (hda->need_i915_power) {
snd_hdac_display_power(bus, true); snd_hdac_display_power(bus, true);
haswell_set_bclk(hda); haswell_set_bclk(hda);
/* toggle codec wakeup bit for STATESTS read */ } else {
snd_hdac_set_codec_wakeup(bus, true); /* toggle codec wakeup bit for STATESTS read */
snd_hdac_set_codec_wakeup(bus, false); snd_hdac_set_codec_wakeup(bus, true);
snd_hdac_set_codec_wakeup(bus, false);
}
} }
/* Read STATESTS before controller reset */ /* Read STATESTS before controller reset */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment