On Wed, 2019-05-08 at 10:32 +0800, libin.yang@intel.com wrote:
From: Libin Yang libin.yang@intel.com
If playback/capture is paused and system enters S3, after system returns from suspend, BE dai needs to call prepare() callback when playback/capture is released from pause if RESUME_INFO flag is not set.
Hi Takashi,
This is a question for you. We've run into the problem of not being able to do a pause-release after the system resumes from S3 after we removed INFO_RESUME from the SOF driver.
Apparently, with this flag removed, when the user does a pause release after resuming from S3, the prepare() callback gets invoked for the FE but doesnt happen for the the BE. Could you please guide us on whether this is the right approach and if not, suggest an alternative?
Thanks, Ranjani
Currently, the dpcm_be_dai_prepare() function will block calling prepare() if the pcm is in SND_SOC_DPCM_STATE_PAUSED state. This will cause the following test case fail if the pcm uses BE:
playback -> pause -> S3 suspend -> S3 resume -> pause release
The playback may exit abnormally when pause is released because the BE dai prepare() is not called.
This patch allows dpcm_be_dai_prepare() to call dai prepare() callback in SND_SOC_DPCM_STATE_PAUSED state.
Signed-off-by: Libin Yang libin.yang@intel.com
sound/soc/soc-pcm.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/sound/soc/soc-pcm.c b/sound/soc/soc-pcm.c index d2aa560..0888995 100644 --- a/sound/soc/soc-pcm.c +++ b/sound/soc/soc-pcm.c @@ -2471,7 +2471,8 @@ int dpcm_be_dai_prepare(struct snd_soc_pcm_runtime *fe, int stream)
if ((be->dpcm[stream].state !=
SND_SOC_DPCM_STATE_HW_PARAMS) && (be->dpcm[stream].state != SND_SOC_DPCM_STATE_STOP) &&
(be->dpcm[stream].state !=
SND_SOC_DPCM_STATE_SUSPEND))
(be->dpcm[stream].state !=
SND_SOC_DPCM_STATE_SUSPEND) &&
(be->dpcm[stream].state !=
SND_SOC_DPCM_STATE_PAUSED)) continue;
dev_dbg(be->dev, "ASoC: prepare BE %s\n",