Commit c470fc3f authored by Keyon Jie's avatar Keyon Jie Committed by Mark Brown

ASoC: SOF: PM: Add support for DSP D0i3 state when entering S0ix

When system is entering into S0ix, the PCI device may transition to the
D0i3 substate instead of D3. In D0i3, some always-on functionality can
be enabled, such as acoustic event detection, voice activity detection
or hotwording. When an event is detected, the DSP firmware can wake-up
the device for a transition to D0 with an interrupt.
Signed-off-by: default avatarKeyon Jie <yang.jie@linux.intel.com>
Signed-off-by: default avatarPierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
Link: https://lore.kernel.org/r/20191025224122.7718-26-pierre-louis.bossart@linux.intel.comSigned-off-by: default avatarMark Brown <broonie@kernel.org>
parent 5655ce66
...@@ -430,12 +430,58 @@ EXPORT_SYMBOL(snd_sof_set_d0_substate); ...@@ -430,12 +430,58 @@ EXPORT_SYMBOL(snd_sof_set_d0_substate);
int snd_sof_resume(struct device *dev) int snd_sof_resume(struct device *dev)
{ {
struct snd_sof_dev *sdev = dev_get_drvdata(dev);
int ret;
if (sdev->s0_suspend) {
/* resume from D0I3 */
dev_dbg(sdev->dev, "DSP will exit from D0i3...\n");
ret = snd_sof_set_d0_substate(sdev, SOF_DSP_D0I0);
if (ret == -ENOTSUPP) {
/* fallback to resume from D3 */
dev_dbg(sdev->dev, "D0i3 not supported, fall back to resume from D3...\n");
goto d3_resume;
} else if (ret < 0) {
dev_err(sdev->dev, "error: failed to exit from D0I3 %d\n",
ret);
return ret;
}
/* platform-specific resume from D0i3 */
return snd_sof_dsp_resume(sdev);
}
d3_resume:
/* resume from D3 */
return sof_resume(dev, false); return sof_resume(dev, false);
} }
EXPORT_SYMBOL(snd_sof_resume); EXPORT_SYMBOL(snd_sof_resume);
int snd_sof_suspend(struct device *dev) int snd_sof_suspend(struct device *dev)
{ {
struct snd_sof_dev *sdev = dev_get_drvdata(dev);
int ret;
if (sdev->s0_suspend) {
/* suspend to D0i3 */
dev_dbg(sdev->dev, "DSP is trying to enter D0i3...\n");
ret = snd_sof_set_d0_substate(sdev, SOF_DSP_D0I3);
if (ret == -ENOTSUPP) {
/* fallback to D3 suspend */
dev_dbg(sdev->dev, "D0i3 not supported, fall back to D3...\n");
goto d3_suspend;
} else if (ret < 0) {
dev_err(sdev->dev, "error: failed to enter D0I3, %d\n",
ret);
return ret;
}
/* platform-specific suspend to D0i3 */
return snd_sof_dsp_suspend(sdev);
}
d3_suspend:
/* suspend to D3 */
return sof_suspend(dev, false); return sof_suspend(dev, false);
} }
EXPORT_SYMBOL(snd_sof_suspend); EXPORT_SYMBOL(snd_sof_suspend);
......
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