diff mbox series

[SRU,OEM-B-OSP1,3/4] ALSA: sof: refine stop-start sequence for driver and FW

Message ID 20190930060103.7125-4-hui.wang@canonical.com
State New
Headers show
Series alsa/sof: fix the hang issue on Dell Nebula MP platforms | expand

Commit Message

Hui Wang Sept. 30, 2019, 6:01 a.m. UTC
From: Pan Xiuli <xiuli.pan@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@linux.intel.com>
Signed-off-by: Rander Wang <rander.wang@linux.intel.com>
(cherry picked from commit 2424b716fd1df0518f07ce9f205b20c3289a99be
git://github.com/thesofproject/linux.git)
Signed-off-by: Hui Wang <hui.wang@canonical.com>
---
 sound/soc/sof/pcm.c | 9 ++++++++-
 1 file changed, 8 insertions(+), 1 deletion(-)
diff mbox series

Patch

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;