[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