From: Peter Ujfalusi <peter.ujfalusi@linux.intel.com>
To: vkoul@kernel.org, perex@perex.cz, tiwai@suse.com,
lgirdwood@gmail.com, broonie@kernel.org,
srinivas.kandagatla@oss.qualcomm.com
Cc: linux-sound@vger.kernel.org, kai.vehmanen@linux.intel.com,
yung-chuan.liao@linux.intel.com, pierre-louis.bossart@linux.dev,
daniel.baluta@nxp.com, Vijendar.Mukunda@amd.com
Subject: [PATCH 10/23] ASoC: SOF: pcm: Modify the signature of a couple of PCM IPC ops
Date: Fri, 4 Sep 2026 10:31:21 +0300 [thread overview]
Message-ID: <20260904073134.29648-11-peter.ujfalusi@linux.intel.com> (raw)
In-Reply-To: <20260904073134.29648-1-peter.ujfalusi@linux.intel.com>
From: Ranjani Sridharan <ranjani.sridharan@linux.intel.com>
In order to reuse the pipeline triggering logic for compressed support
with IPC4, modify the signature of the trigger and hw_free PCM IPC ops
so that they can be reused.
Signed-off-by: Ranjani Sridharan <ranjani.sridharan@linux.intel.com>
Signed-off-by: Peter Ujfalusi <peter.ujfalusi@linux.intel.com>
Reviewed-by: Liam Girdwood <liam.r.girdwood@intel.com>
---
sound/soc/sof/ipc3-pcm.c | 26 +++++++---------------
sound/soc/sof/ipc4-pcm.c | 45 ++++++++++++++++++++-------------------
sound/soc/sof/pcm.c | 7 +++---
sound/soc/sof/sof-audio.h | 7 +++---
4 files changed, 39 insertions(+), 46 deletions(-)
diff --git a/sound/soc/sof/ipc3-pcm.c b/sound/soc/sof/ipc3-pcm.c
index 1d0c80466f6a..42f93e596598 100644
--- a/sound/soc/sof/ipc3-pcm.c
+++ b/sound/soc/sof/ipc3-pcm.c
@@ -14,23 +14,18 @@
#include "sof-audio.h"
static int sof_ipc3_pcm_hw_free(struct snd_soc_component *component,
- struct snd_pcm_substream *substream)
+ struct snd_pcm_substream *substream,
+ struct snd_sof_pcm *spcm, int dir)
{
struct snd_sof_dev *sdev = snd_soc_component_get_drvdata(component);
- struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream);
struct sof_ipc_stream stream;
- struct snd_sof_pcm *spcm;
-
- spcm = snd_sof_find_spcm_dai(component, rtd);
- if (!spcm)
- return -EINVAL;
- if (!spcm->prepared[substream->stream])
+ if (!spcm->prepared[dir])
return 0;
stream.hdr.size = sizeof(stream);
stream.hdr.cmd = SOF_IPC_GLB_STREAM_MSG | SOF_IPC_STREAM_PCM_FREE;
- stream.comp_id = spcm->stream[substream->stream].comp_id;
+ stream.comp_id = spcm->stream[dir].comp_id;
/* send IPC to the DSP */
return sof_ipc_tx_message_no_reply(sdev->ipc, &stream, sizeof(stream));
@@ -141,20 +136,15 @@ static int sof_ipc3_pcm_hw_params(struct snd_soc_component *component,
}
static int sof_ipc3_pcm_trigger(struct snd_soc_component *component,
- struct snd_pcm_substream *substream, int cmd)
+ struct snd_pcm_substream *substream,
+ struct snd_sof_pcm *spcm, int cmd, int dir)
{
- struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream);
struct snd_sof_dev *sdev = snd_soc_component_get_drvdata(component);
struct sof_ipc_stream stream;
- struct snd_sof_pcm *spcm;
-
- spcm = snd_sof_find_spcm_dai(component, rtd);
- if (!spcm)
- return -EINVAL;
stream.hdr.size = sizeof(stream);
stream.hdr.cmd = SOF_IPC_GLB_STREAM_MSG;
- stream.comp_id = spcm->stream[substream->stream].comp_id;
+ stream.comp_id = spcm->stream[dir].comp_id;
switch (cmd) {
case SNDRV_PCM_TRIGGER_PAUSE_PUSH:
@@ -172,7 +162,7 @@ static int sof_ipc3_pcm_trigger(struct snd_soc_component *component,
stream.hdr.cmd |= SOF_IPC_STREAM_TRIG_STOP;
break;
default:
- spcm_err(spcm, substream->stream, "Unhandled trigger cmd %d\n", cmd);
+ spcm_err(spcm, dir, "Unhandled trigger cmd %d\n", cmd);
return -EINVAL;
}
diff --git a/sound/soc/sof/ipc4-pcm.c b/sound/soc/sof/ipc4-pcm.c
index 9d4be9ef4403..6e8522d03a2b 100644
--- a/sound/soc/sof/ipc4-pcm.c
+++ b/sound/soc/sof/ipc4-pcm.c
@@ -412,28 +412,23 @@ static int sof_ipc4_chain_dma_trigger(struct snd_sof_dev *sdev,
}
static int sof_ipc4_trigger_pipelines(struct snd_soc_component *component,
- struct snd_pcm_substream *substream, int state, int cmd)
+ struct snd_pcm_substream *substream, int state, int cmd,
+ struct snd_sof_pcm *spcm, int dir)
{
struct snd_sof_dev *sdev = snd_soc_component_get_drvdata(component);
- struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream);
struct snd_sof_pcm_stream_pipeline_list *pipeline_list;
struct sof_ipc4_fw_data *ipc4_data = sdev->private;
struct ipc4_pipeline_set_state_data *trigger_list;
struct snd_sof_widget *pipe_widget;
struct sof_ipc4_pipeline *pipeline;
struct snd_sof_pipeline *spipe;
- struct snd_sof_pcm *spcm;
u8 *pipe_priority;
int ret;
int i;
- spcm = snd_sof_find_spcm_dai(component, rtd);
- if (!spcm)
- return -EINVAL;
+ spcm_dbg(spcm, dir, "cmd: %d, state: %d\n", cmd, state);
- spcm_dbg(spcm, substream->stream, "cmd: %d, state: %d\n", cmd, state);
-
- pipeline_list = &spcm->stream[substream->stream].pipeline_list;
+ pipeline_list = &spcm->stream[dir].pipeline_list;
guard(mutex)(&ipc4_data->pipeline_state_mutex);
/* nothing to trigger if the list is empty */
@@ -454,9 +449,9 @@ static int sof_ipc4_trigger_pipelines(struct snd_soc_component *component,
if (pipeline->use_chain_dma) {
struct sof_ipc4_timestamp_info *time_info;
- time_info = sof_ipc4_sps_to_time_info(&spcm->stream[substream->stream]);
+ time_info = sof_ipc4_sps_to_time_info(&spcm->stream[dir]);
- ret = sof_ipc4_chain_dma_trigger(sdev, spcm, substream->stream,
+ ret = sof_ipc4_chain_dma_trigger(sdev, spcm, dir,
pipeline_list, state, cmd);
if (ret || !time_info)
return ret;
@@ -465,12 +460,16 @@ static int sof_ipc4_trigger_pipelines(struct snd_soc_component *component,
/*
* Record the DAI position for delay reporting
* To handle multiple pause/resume/xrun we need to add
- * the positions to simulate how the firmware behaves
+ * the positions to simulate how the firmware behaves.
+ * Chained DMA does not support compress streams. We should
+ * never get here with compress.
*/
- u64 pos = snd_sof_pcm_get_dai_frame_counter(sdev, component,
- substream);
+ if (substream) {
+ u64 pos = snd_sof_pcm_get_dai_frame_counter(sdev, component,
+ substream);
- time_info->stream_end_offset += pos;
+ time_info->stream_end_offset += pos;
+ }
} else if (state == SOF_IPC4_PIPE_RESET) {
/* Reset the end offset as the stream is stopped */
time_info->stream_end_offset = 0;
@@ -533,7 +532,7 @@ static int sof_ipc4_trigger_pipelines(struct snd_soc_component *component,
*/
ret = sof_ipc4_set_multi_pipeline_state(sdev, SOF_IPC4_PIPE_PAUSED, trigger_list);
if (ret < 0) {
- spcm_err(spcm, substream->stream, "failed to pause all pipelines\n");
+ spcm_err(spcm, dir, "failed to pause all pipelines\n");
/*
* workaround: if the firmware is crashed or the IPC timed out
* while setting the pipeline state we must ignore the error
@@ -566,7 +565,7 @@ static int sof_ipc4_trigger_pipelines(struct snd_soc_component *component,
* Invalidate the stream_start_offset to make sure that it is
* going to be updated if the stream resumes
*/
- time_info = sof_ipc4_sps_to_time_info(&spcm->stream[substream->stream]);
+ time_info = sof_ipc4_sps_to_time_info(&spcm->stream[dir]);
if (time_info)
time_info->stream_start_offset = SOF_IPC4_INVALID_STREAM_POSITION;
@@ -576,7 +575,7 @@ static int sof_ipc4_trigger_pipelines(struct snd_soc_component *component,
/* else set the RUNNING/RESET state in the DSP */
ret = sof_ipc4_set_multi_pipeline_state(sdev, state, trigger_list);
if (ret < 0) {
- spcm_err(spcm, substream->stream,
+ spcm_err(spcm, dir,
"failed to set final state %d for all pipelines\n",
state);
/*
@@ -609,7 +608,8 @@ static int sof_ipc4_trigger_pipelines(struct snd_soc_component *component,
}
static int sof_ipc4_pcm_trigger(struct snd_soc_component *component,
- struct snd_pcm_substream *substream, int cmd)
+ struct snd_pcm_substream *substream,
+ struct snd_sof_pcm *spcm, int cmd, int dir)
{
int state;
@@ -631,14 +631,15 @@ static int sof_ipc4_pcm_trigger(struct snd_soc_component *component,
}
/* set the pipeline state */
- return sof_ipc4_trigger_pipelines(component, substream, state, cmd);
+ return sof_ipc4_trigger_pipelines(component, substream, state, cmd, spcm, dir);
}
static int sof_ipc4_pcm_hw_free(struct snd_soc_component *component,
- struct snd_pcm_substream *substream)
+ struct snd_pcm_substream *substream,
+ struct snd_sof_pcm *spcm, int dir)
{
/* command is not relevant with RESET, so just pass 0 */
- return sof_ipc4_trigger_pipelines(component, substream, SOF_IPC4_PIPE_RESET, 0);
+ return sof_ipc4_trigger_pipelines(component, substream, SOF_IPC4_PIPE_RESET, 0, spcm, dir);
}
static int ipc4_ssp_dai_config_pcm_params_match(struct snd_sof_dev *sdev,
diff --git a/sound/soc/sof/pcm.c b/sound/soc/sof/pcm.c
index 8f59c200b8ec..42738f12fa33 100644
--- a/sound/soc/sof/pcm.c
+++ b/sound/soc/sof/pcm.c
@@ -152,7 +152,7 @@ static int sof_pcm_hw_params(struct snd_soc_component *component,
* between. At least ALSA OSS emulation depends on this.
*/
if (spcm->prepared[substream->stream] && pcm_ops && pcm_ops->hw_free) {
- ret = pcm_ops->hw_free(component, substream);
+ ret = pcm_ops->hw_free(component, substream, spcm, substream->stream);
if (ret < 0)
return ret;
@@ -223,7 +223,8 @@ static int sof_pcm_stream_free(struct snd_sof_dev *sdev,
/* free PCM in the DSP */
if (pcm_ops && pcm_ops->hw_free) {
- ret = pcm_ops->hw_free(sdev->component, substream);
+ ret = pcm_ops->hw_free(sdev->component, substream, spcm,
+ substream->stream);
if (ret < 0) {
spcm_err(spcm, substream->stream,
"pcm_ops->hw_free failed %d\n", ret);
@@ -458,7 +459,7 @@ static int sof_pcm_trigger(struct snd_soc_component *component,
snd_sof_pcm_platform_trigger(sdev, substream, cmd);
if (pcm_ops && pcm_ops->trigger)
- ret = pcm_ops->trigger(component, substream, cmd);
+ ret = pcm_ops->trigger(component, substream, spcm, cmd, substream->stream);
switch (cmd) {
case SNDRV_PCM_TRIGGER_PAUSE_RELEASE:
diff --git a/sound/soc/sof/sof-audio.h b/sound/soc/sof/sof-audio.h
index 1b3e66037584..0610f2ab844d 100644
--- a/sound/soc/sof/sof-audio.h
+++ b/sound/soc/sof/sof-audio.h
@@ -125,9 +125,10 @@ struct sof_ipc_pcm_ops {
int (*hw_params)(struct snd_soc_component *component, struct snd_pcm_substream *substream,
struct snd_pcm_hw_params *params,
struct snd_sof_platform_stream_params *platform_params);
- int (*hw_free)(struct snd_soc_component *component, struct snd_pcm_substream *substream);
- int (*trigger)(struct snd_soc_component *component, struct snd_pcm_substream *substream,
- int cmd);
+ int (*hw_free)(struct snd_soc_component *component, struct snd_pcm_substream *substream,
+ struct snd_sof_pcm *spcm, int dir);
+ int (*trigger)(struct snd_soc_component *component, struct snd_pcm_substream *substream,
+ struct snd_sof_pcm *spcm, int cmd, int dir);
int (*dai_link_fixup)(struct snd_soc_pcm_runtime *rtd, struct snd_pcm_hw_params *params);
int (*pcm_setup)(struct snd_sof_dev *sdev, struct snd_sof_pcm *spcm);
void (*pcm_free)(struct snd_sof_dev *sdev, struct snd_sof_pcm *spcm);
--
2.55.0
next prev parent reply other threads:[~2026-09-04 7:31 UTC|newest]
Thread overview: 49+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-09-04 7:31 [PATCH 00/23] ALSA compress / ASoC compress / SOF: Compressed audio support with IPC4 Peter Ujfalusi
2026-09-04 7:31 ` [PATCH 01/23] ALSA: compress: pin card module while stream is open Peter Ujfalusi
2026-09-04 7:50 ` Takashi Iwai
2026-09-04 8:03 ` Péter Ujfalusi
2026-09-04 7:31 ` [PATCH 02/23] ALSA: compress: stop active streams on disconnect Peter Ujfalusi
2026-09-04 7:51 ` Takashi Iwai
2026-09-04 7:31 ` [PATCH 03/23] ASoC: soc-compress: Provide a runtime for the compressed FE substream Peter Ujfalusi
2026-09-04 7:31 ` [PATCH 04/23] ASoC: soc-compress: Implement trigger FE-BE sequencing as with normal PCMs Peter Ujfalusi
2026-09-04 19:45 ` Mark Brown
2026-09-07 5:25 ` Péter Ujfalusi
2026-09-07 11:26 ` Pierre-Louis Bossart
2026-09-07 14:03 ` Péter Ujfalusi
2026-09-07 16:53 ` Vinod Koul
2026-09-07 19:55 ` Pierre-Louis Bossart
2026-09-08 6:37 ` Péter Ujfalusi
2026-09-08 6:58 ` Vinod Koul
2026-09-08 8:41 ` Péter Ujfalusi
2026-09-08 12:06 ` Pierre-Louis Bossart
2026-09-08 14:04 ` Péter Ujfalusi
2026-09-08 12:37 ` Vinod Koul
2026-09-08 14:13 ` Péter Ujfalusi
2026-09-08 14:54 ` Pierre-Louis Bossart
2026-09-09 13:53 ` Péter Ujfalusi
2026-09-09 20:22 ` Pierre-Louis Bossart
2026-09-08 17:12 ` Vinod Koul
2026-09-09 14:09 ` Péter Ujfalusi
2026-09-08 6:52 ` Vinod Koul
2026-09-04 7:31 ` [PATCH 05/23] ASoC: soc-compress: Stop running dpcm on free Peter Ujfalusi
2026-09-04 7:31 ` [PATCH 06/23] ASoC: SOF: compress: Rename compress ops with ipc3 prefix Peter Ujfalusi
2026-09-04 7:31 ` [PATCH 07/23] ASoC: SOF: ipc4-pcm: harden pipeline teardown races Peter Ujfalusi
2026-09-04 7:31 ` [PATCH 08/23] ASoC: SOF: sof-audio: do not dereference swidget->spipe unconditionally on free Peter Ujfalusi
2026-09-04 7:31 ` [PATCH 09/23] ASoC: SOF: sof-audio: Expose a couple of functions Peter Ujfalusi
2026-09-04 7:31 ` Peter Ujfalusi [this message]
2026-09-04 7:31 ` [PATCH 11/23] ASoC: SOF: intel: hda-stream: Clear the current position when releasing stream Peter Ujfalusi
2026-09-04 7:31 ` [PATCH 12/23] ASoC: SOF: ops: Add new platform-specific ops for compress Peter Ujfalusi
2026-09-04 7:31 ` [PATCH 13/23] ASoC: SOF: ipc4: Add definition of module data in init_ext object type Peter Ujfalusi
2026-09-04 7:31 ` [PATCH 14/23] ASoC: SOF: ipc4-topology: Support init_ext_module_data for process modules Peter Ujfalusi
2026-09-04 7:31 ` [PATCH 15/23] ASoC: SOF: ipc4-pcm: Make the timestamp info usable outside of ipc4-pcm.c Peter Ujfalusi
2026-09-04 7:31 ` [PATCH 16/23] ASoC: SOF: ipc4/ipc4-loader: Add SOF_INFO and CODEC_INFO to fw_config_params Peter Ujfalusi
2026-09-04 7:31 ` [PATCH 17/23] ASoC: SOF: ipc4-pcm: Handle COMPR DRAIN triggers as EOS pipeline state Peter Ujfalusi
2026-09-04 7:31 ` [PATCH 18/23] ASoC: SOF: ipc4-topology: Set FAST_MODE for host copier in compr mode Peter Ujfalusi
2026-09-04 7:31 ` [PATCH 19/23] ASoC: SOF: Add support for IPC4 compressed Peter Ujfalusi
2026-09-04 20:08 ` Mark Brown
2026-09-07 5:15 ` Péter Ujfalusi
2026-09-09 6:48 ` Péter Ujfalusi
2026-09-04 7:31 ` [PATCH 20/23] ASoC: SOF: ipc4: Handle compressed drain done notification from firmware Peter Ujfalusi
2026-09-04 7:31 ` [PATCH 21/23] ASoC: SOF: Intel: Kconfig: Remove redundant IPC version selects Peter Ujfalusi
2026-09-04 7:31 ` [PATCH 22/23] ASoC: SOF: Intel: Kconfig: Select compress support for TGL+ platforms Peter Ujfalusi
2026-09-04 7:31 ` [PATCH 23/23] ASoC: SOF: topology: Add support for decoder and encoder widgets Peter Ujfalusi
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20260904073134.29648-11-peter.ujfalusi@linux.intel.com \
--to=peter.ujfalusi@linux.intel.com \
--cc=Vijendar.Mukunda@amd.com \
--cc=broonie@kernel.org \
--cc=daniel.baluta@nxp.com \
--cc=kai.vehmanen@linux.intel.com \
--cc=lgirdwood@gmail.com \
--cc=linux-sound@vger.kernel.org \
--cc=perex@perex.cz \
--cc=pierre-louis.bossart@linux.dev \
--cc=srinivas.kandagatla@oss.qualcomm.com \
--cc=tiwai@suse.com \
--cc=vkoul@kernel.org \
--cc=yung-chuan.liao@linux.intel.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox