[SRU][OEM-B-OSP1][PATCH 3/4] ALSA: sof: refine stop-start sequence for driver and FW
Hui Wang
hui.wang at canonical.com
Mon Sep 30 06:01:02 UTC 2019
From: Pan Xiuli <xiuli.pan at linux.intel.com>
BugLink: https://bugs.launchpad.net/bugs/1845904
Stop FW first, then stop HDA controller
Start HDA contorller first, then start FW
Signed-off-by: Pan Xiuli <xiuli.pan at linux.intel.com>
Signed-off-by: Rander Wang <rander.wang at linux.intel.com>
(cherry picked from commit 2424b716fd1df0518f07ce9f205b20c3289a99be
git://github.com/thesofproject/linux.git)
Signed-off-by: Hui Wang <hui.wang at canonical.com>
---
sound/soc/sof/pcm.c | 9 ++++++++-
1 file changed, 8 insertions(+), 1 deletion(-)
diff --git a/sound/soc/sof/pcm.c b/sound/soc/sof/pcm.c
index c0f29eb8645d..38cc7eeb4476 100644
--- a/sound/soc/sof/pcm.c
+++ b/sound/soc/sof/pcm.c
@@ -314,6 +314,7 @@ static int sof_pcm_trigger(struct snd_pcm_substream *substream, int cmd)
struct snd_sof_pcm *spcm;
struct sof_ipc_stream stream;
struct sof_ipc_reply reply;
+ bool ipc_first = false;
int ret;
/* nothing to do for BE */
@@ -334,6 +335,7 @@ static int sof_pcm_trigger(struct snd_pcm_substream *substream, int cmd)
switch (cmd) {
case SNDRV_PCM_TRIGGER_PAUSE_PUSH:
stream.hdr.cmd |= SOF_IPC_STREAM_TRIG_PAUSE;
+ ipc_first = true;
break;
case SNDRV_PCM_TRIGGER_PAUSE_RELEASE:
stream.hdr.cmd |= SOF_IPC_STREAM_TRIG_RELEASE;
@@ -354,18 +356,23 @@ static int sof_pcm_trigger(struct snd_pcm_substream *substream, int cmd)
case SNDRV_PCM_TRIGGER_SUSPEND:
case SNDRV_PCM_TRIGGER_STOP:
stream.hdr.cmd |= SOF_IPC_STREAM_TRIG_STOP;
+ ipc_first = true;
break;
default:
dev_err(sdev->dev, "error: unhandled trigger cmd %d\n", cmd);
return -EINVAL;
}
- snd_sof_pcm_platform_trigger(sdev, substream, cmd);
+ if (!ipc_first)
+ snd_sof_pcm_platform_trigger(sdev, substream, cmd);
/* send IPC to the DSP */
ret = sof_ipc_tx_message(sdev->ipc, stream.hdr.cmd, &stream,
sizeof(stream), &reply, sizeof(reply));
+ if (ipc_first)
+ snd_sof_pcm_platform_trigger(sdev, substream, cmd);
+
if (ret < 0 || cmd != SNDRV_PCM_TRIGGER_SUSPEND)
return ret;
--
2.17.1
More information about the kernel-team
mailing list