We can make the device D3 for saving more power during the runtime suspend. Meanwhile, I observed that Haswell HDMI codecs gets corrupted ELD bytes when woken up from runtime suspend with D3. As a quick workaround, exclude these chips from D3.
Signed-off-by: Takashi Iwai tiwai@suse.de --- sound/pci/hda/hda_intel.c | 12 ++++++++++++ 1 file changed, 12 insertions(+)
diff --git a/sound/pci/hda/hda_intel.c b/sound/pci/hda/hda_intel.c index b001aa6da3bc..c0b2c9079607 100644 --- a/sound/pci/hda/hda_intel.c +++ b/sound/pci/hda/hda_intel.c @@ -2997,6 +2997,13 @@ static int azx_runtime_suspend(struct device *dev) if (!chip->bus->avoid_link_reset) azx_enter_link_reset(chip); azx_clear_irq_pending(chip); + + /* Haswell HDMI/DP shows the broken ELD read after runtime PM */ + if (chip->driver_type != AZX_DRIVER_HDMI) { + pci_save_state(chip->pci); + pci_set_power_state(chip->pci, PCI_D3hot); + } + if (chip->driver_caps & AZX_DCAPS_I915_POWERWELL) hda_display_power(false); return 0; @@ -3019,6 +3026,11 @@ static int azx_runtime_resume(struct device *dev) if (chip->driver_caps & AZX_DCAPS_I915_POWERWELL) hda_display_power(true);
+ if (chip->driver_type != AZX_DRIVER_HDMI) { + pci_set_power_state(chip->pci, PCI_D0); + pci_restore_state(chip->pci); + } + /* Read STATESTS before controller reset */ status = azx_readw(chip, STATESTS);