diff options
author | Keyon Jie <yang.jie@linux.intel.com> | 2019-10-26 00:41:19 +0200 |
---|---|---|
committer | Mark Brown <broonie@kernel.org> | 2019-10-28 15:46:12 +0100 |
commit | 66e40876ddc325d892c493a6d83574bbba5770ce (patch) | |
tree | 77db70fc08e4dd4050ae034f45ff6f8ff6ec794d /sound/soc/sof/intel/hda-dsp.c | |
parent | ASoC: SOF: ignore suspend/resume for D0ix compatible streams (diff) | |
download | linux-66e40876ddc325d892c493a6d83574bbba5770ce.tar.xz linux-66e40876ddc325d892c493a6d83574bbba5770ce.zip |
ASoC: SOF: Intel: hda-dsp: implement suspend/resume for S0ix<->S0 transition
Enable system wake up via IPC interrupt from DSP when the system is
suspending to the S0ix state, and disable it in the corresponding
resuming.
Signed-off-by: Keyon Jie <yang.jie@linux.intel.com>
Signed-off-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
Link: https://lore.kernel.org/r/20191025224122.7718-24-pierre-louis.bossart@linux.intel.com
Signed-off-by: Mark Brown <broonie@kernel.org>
Diffstat (limited to '')
-rw-r--r-- | sound/soc/sof/intel/hda-dsp.c | 17 |
1 files changed, 17 insertions, 0 deletions
diff --git a/sound/soc/sof/intel/hda-dsp.c b/sound/soc/sof/intel/hda-dsp.c index b5070409a5e3..d23573d9e9c4 100644 --- a/sound/soc/sof/intel/hda-dsp.c +++ b/sound/soc/sof/intel/hda-dsp.c @@ -477,6 +477,15 @@ static int hda_resume(struct snd_sof_dev *sdev, bool runtime_resume) int hda_dsp_resume(struct snd_sof_dev *sdev) { + struct pci_dev *pci = to_pci_dev(sdev->dev); + + if (sdev->s0_suspend) { + /* restore and disable the system wakeup */ + pci_restore_state(pci); + disable_irq_wake(pci->irq); + return 0; + } + /* init hda controller. DSP cores will be powered up during fw boot */ return hda_resume(sdev, false); } @@ -509,8 +518,16 @@ int hda_dsp_runtime_suspend(struct snd_sof_dev *sdev) int hda_dsp_suspend(struct snd_sof_dev *sdev) { struct hdac_bus *bus = sof_to_bus(sdev); + struct pci_dev *pci = to_pci_dev(sdev->dev); int ret; + if (sdev->s0_suspend) { + /* enable the system waking up via IPC IRQ */ + enable_irq_wake(pci->irq); + pci_save_state(pci); + return 0; + } + /* stop hda controller and power dsp off */ ret = hda_suspend(sdev, false); if (ret < 0) { |