[alsa-devel] [PATCH 5/5] ALSA: hda - Make device D3 during runtime suspend

Lin, Mengdong mengdong.lin at intel.com
Tue Nov 26 14:32:11 CET 2013


> -----Original Message-----
> From: alsa-devel-bounces at alsa-project.org
> [mailto:alsa-devel-bounces at alsa-project.org] On Behalf Of Takashi Iwai
> Sent: Tuesday, November 26, 2013 8:34 PM
> To: alsa-devel at alsa-project.org
> Subject: Re: [alsa-devel] [PATCH 5/5] ALSA: hda - Make device D3 during
> runtime suspend
> 
> At Tue, 26 Nov 2013 09:29:13 +0100,
> Takashi Iwai wrote:
> >
> > 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.
> 
> Scratch this.  After reading the PCI core code, I found this patch is just a
> nonsense.

Could you share more info here?

On Haswell, the HDMI audio controller (PCI device 3) and codec are in display power well, so the power saving is achieved by releasing and turning off the display power well.

But at least for legacy audio, we need the controller (PCI device 1b) to enter D3 at runtime so PCI driver will call ACPI and BIOS can know the legacy audio controller is in D3 and power down the on-board codec.

Thanks
Mengdong

> >
> > Signed-off-by: Takashi Iwai <tiwai at 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);
> >
> > --
> > 1.8.4.3
> >
> > _______________________________________________
> > Alsa-devel mailing list
> > Alsa-devel at alsa-project.org
> > http://mailman.alsa-project.org/mailman/listinfo/alsa-devel
> >
> _______________________________________________
> Alsa-devel mailing list
> Alsa-devel at alsa-project.org
> http://mailman.alsa-project.org/mailman/listinfo/alsa-devel


More information about the Alsa-devel mailing list