Commit ba223b3a authored by Ranjani Sridharan's avatar Ranjani Sridharan Committed by Mark Brown

ASoC: SOF: ipc4-pcm: Define pcm_setup/free ops

Define the pcm_setup/pcm_free ops for IPC4. Define a new struct
snd_sof_pcm_stream_trigger_info and add a new field trigger_info of this
type to struct snd_sof_pcm_stream. This will be used to save the list of
pipelines that need to be triggered.
Signed-off-by: default avatarRanjani Sridharan <ranjani.sridharan@linux.intel.com>
Reviewed-by: default avatarLibin Yang <libin.yang@intel.com>
Reviewed-by: default avatarPierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
Reviewed-by: default avatarPéter Ujfalusi <peter.ujfalusi@linux.intel.com>
Signed-off-by: default avatarPeter Ujfalusi <peter.ujfalusi@linux.intel.com>
Link: https://lore.kernel.org/r/20230127120031.10709-9-peter.ujfalusi@linux.intel.comSigned-off-by: default avatarMark Brown <broonie@kernel.org>
parent 7201a3d4
...@@ -215,8 +215,44 @@ static int sof_ipc4_pcm_dai_link_fixup(struct snd_soc_pcm_runtime *rtd, ...@@ -215,8 +215,44 @@ static int sof_ipc4_pcm_dai_link_fixup(struct snd_soc_pcm_runtime *rtd,
return 0; return 0;
} }
static void sof_ipc4_pcm_free(struct snd_sof_dev *sdev, struct snd_sof_pcm *spcm)
{
struct snd_sof_pcm_stream_pipeline_list *pipeline_list;
int stream;
for_each_pcm_streams(stream) {
pipeline_list = &spcm->stream[stream].pipeline_list;
kfree(pipeline_list->pipe_widgets);
pipeline_list->pipe_widgets = NULL;
}
}
static int sof_ipc4_pcm_setup(struct snd_sof_dev *sdev, struct snd_sof_pcm *spcm)
{
struct snd_sof_pcm_stream_pipeline_list *pipeline_list;
struct sof_ipc4_fw_data *ipc4_data = sdev->private;
int stream;
for_each_pcm_streams(stream) {
pipeline_list = &spcm->stream[stream].pipeline_list;
/* allocate memory for max number of pipeline IDs */
pipeline_list->pipe_widgets = kcalloc(ipc4_data->max_num_pipelines,
sizeof(struct snd_sof_widget *),
GFP_KERNEL);
if (!pipeline_list->pipe_widgets) {
sof_ipc4_pcm_free(sdev, spcm);
return -ENOMEM;
}
}
return 0;
}
const struct sof_ipc_pcm_ops ipc4_pcm_ops = { const struct sof_ipc_pcm_ops ipc4_pcm_ops = {
.trigger = sof_ipc4_pcm_trigger, .trigger = sof_ipc4_pcm_trigger,
.hw_free = sof_ipc4_pcm_hw_free, .hw_free = sof_ipc4_pcm_hw_free,
.dai_link_fixup = sof_ipc4_pcm_dai_link_fixup, .dai_link_fixup = sof_ipc4_pcm_dai_link_fixup,
.pcm_setup = sof_ipc4_pcm_setup,
.pcm_free = sof_ipc4_pcm_free,
}; };
...@@ -285,6 +285,16 @@ struct sof_token_info { ...@@ -285,6 +285,16 @@ struct sof_token_info {
int count; int count;
}; };
/**
* struct snd_sof_pcm_stream_pipeline_list - List of pipelines associated with a PCM stream
* @count: number of pipeline widgets in the @pipe_widgets array
* @pipe_widgets: array of pipeline widgets
*/
struct snd_sof_pcm_stream_pipeline_list {
u32 count;
struct snd_sof_widget **pipe_widgets;
};
/* PCM stream, mapped to FW component */ /* PCM stream, mapped to FW component */
struct snd_sof_pcm_stream { struct snd_sof_pcm_stream {
u32 comp_id; u32 comp_id;
...@@ -300,6 +310,7 @@ struct snd_sof_pcm_stream { ...@@ -300,6 +310,7 @@ struct snd_sof_pcm_stream {
* active or not while suspending the stream * active or not while suspending the stream
*/ */
bool suspend_ignored; bool suspend_ignored;
struct snd_sof_pcm_stream_pipeline_list pipeline_list;
}; };
/* ALSA SOF PCM device */ /* ALSA SOF PCM device */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment