forked from Minki/linux
ASoC: SOF: topology: remove snd_sof_complete_pipeline()
Add a new topology IPC op, pipeline_complete in struct ipc_tplg_ops and set the op for IPC3. Replace the calls to snd_sof_complete_pipeline() with the calls to the topology IPC pipeline_complete op. Signed-off-by: Ranjani Sridharan <ranjani.sridharan@linux.intel.com> Reviewed-by: Bard Liao <yung-chuan.liao@linux.intel.com> Reviewed-by: Péter Ujfalusi <peter.ujfalusi@linux.intel.com> Reviewed-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com> Link: https://lore.kernel.org/r/20220314200520.1233427-20-ranjani.sridharan@linux.intel.com Signed-off-by: Mark Brown <broonie@kernel.org>
This commit is contained in:
parent
8ef1439c51
commit
61ad28ff6c
@ -1887,6 +1887,28 @@ static int sof_ipc3_widget_bind_event(struct snd_soc_component *scomp,
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
static int sof_ipc3_complete_pipeline(struct snd_sof_dev *sdev, struct snd_sof_widget *swidget)
|
||||
{
|
||||
struct sof_ipc_pipe_ready ready;
|
||||
struct sof_ipc_reply reply;
|
||||
int ret;
|
||||
|
||||
dev_dbg(sdev->dev, "tplg: complete pipeline %s id %d\n",
|
||||
swidget->widget->name, swidget->comp_id);
|
||||
|
||||
memset(&ready, 0, sizeof(ready));
|
||||
ready.hdr.size = sizeof(ready);
|
||||
ready.hdr.cmd = SOF_IPC_GLB_TPLG_MSG | SOF_IPC_TPLG_PIPE_COMPLETE;
|
||||
ready.comp_id = swidget->comp_id;
|
||||
|
||||
ret = sof_ipc_tx_message(sdev->ipc, ready.hdr.cmd, &ready, sizeof(ready), &reply,
|
||||
sizeof(reply));
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
/* token list for each topology object */
|
||||
static enum sof_tokens host_token_list[] = {
|
||||
SOF_CORE_TOKENS,
|
||||
@ -1988,6 +2010,7 @@ static const struct sof_ipc_tplg_ops ipc3_tplg_ops = {
|
||||
.route_setup = sof_ipc3_route_setup,
|
||||
.control_setup = sof_ipc3_control_setup,
|
||||
.control_free = sof_ipc3_control_free,
|
||||
.pipeline_complete = sof_ipc3_complete_pipeline,
|
||||
.token_list = ipc3_token_list,
|
||||
};
|
||||
|
||||
|
@ -362,6 +362,7 @@ static int sof_setup_pipeline_connections(struct snd_sof_dev *sdev,
|
||||
|
||||
int sof_widget_list_setup(struct snd_sof_dev *sdev, struct snd_sof_pcm *spcm, int dir)
|
||||
{
|
||||
const struct sof_ipc_tplg_ops *ipc_tplg_ops = sdev->ipc->ops->tplg;
|
||||
struct snd_soc_dapm_widget_list *list = spcm->stream[dir].list;
|
||||
struct snd_soc_dapm_widget *widget;
|
||||
int i, ret, num_widgets;
|
||||
@ -432,10 +433,12 @@ int sof_widget_list_setup(struct snd_sof_dev *sdev, struct snd_sof_pcm *spcm, in
|
||||
if (pipe_widget->complete)
|
||||
continue;
|
||||
|
||||
pipe_widget->complete = snd_sof_complete_pipeline(sdev, pipe_widget);
|
||||
if (pipe_widget->complete < 0) {
|
||||
ret = pipe_widget->complete;
|
||||
goto widget_free;
|
||||
if (ipc_tplg_ops->pipeline_complete) {
|
||||
pipe_widget->complete = ipc_tplg_ops->pipeline_complete(sdev, pipe_widget);
|
||||
if (pipe_widget->complete < 0) {
|
||||
ret = pipe_widget->complete;
|
||||
goto widget_free;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -657,8 +660,11 @@ int sof_set_up_pipelines(struct snd_sof_dev *sdev, bool verify)
|
||||
return ret;
|
||||
}
|
||||
|
||||
swidget->complete =
|
||||
snd_sof_complete_pipeline(sdev, swidget);
|
||||
if (ipc_tplg_ops->pipeline_complete) {
|
||||
swidget->complete = ipc_tplg_ops->pipeline_complete(sdev, swidget);
|
||||
if (swidget->complete < 0)
|
||||
return swidget->complete;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
|
@ -68,6 +68,7 @@ struct sof_ipc_tplg_widget_ops {
|
||||
* initialized to 0.
|
||||
* @control_setup: Function pointer for setting up kcontrol IPC-specific data
|
||||
* @control_free: Function pointer for freeing kcontrol IPC-specific data
|
||||
* @pipeline_complete: Function pointer for pipeline complete IPC
|
||||
*/
|
||||
struct sof_ipc_tplg_ops {
|
||||
const struct sof_ipc_tplg_widget_ops *widget;
|
||||
@ -75,6 +76,7 @@ struct sof_ipc_tplg_ops {
|
||||
const struct sof_token_info *token_list;
|
||||
int (*control_setup)(struct snd_sof_dev *sdev, struct snd_sof_control *scontrol);
|
||||
int (*control_free)(struct snd_sof_dev *sdev, struct snd_sof_control *scontrol);
|
||||
int (*pipeline_complete)(struct snd_sof_dev *sdev, struct snd_sof_widget *swidget);
|
||||
};
|
||||
|
||||
/** struct snd_sof_tuple - Tuple info
|
||||
@ -318,8 +320,6 @@ void snd_sof_control_notify(struct snd_sof_dev *sdev,
|
||||
* be freed by snd_soc_unregister_component,
|
||||
*/
|
||||
int snd_sof_load_topology(struct snd_soc_component *scomp, const char *file);
|
||||
int snd_sof_complete_pipeline(struct snd_sof_dev *sdev,
|
||||
struct snd_sof_widget *swidget);
|
||||
|
||||
/*
|
||||
* Stream IPC
|
||||
|
@ -1825,29 +1825,6 @@ err:
|
||||
return ret;
|
||||
}
|
||||
|
||||
int snd_sof_complete_pipeline(struct snd_sof_dev *sdev,
|
||||
struct snd_sof_widget *swidget)
|
||||
{
|
||||
struct sof_ipc_pipe_ready ready;
|
||||
struct sof_ipc_reply reply;
|
||||
int ret;
|
||||
|
||||
dev_dbg(sdev->dev, "tplg: complete pipeline %s id %d\n",
|
||||
swidget->widget->name, swidget->comp_id);
|
||||
|
||||
memset(&ready, 0, sizeof(ready));
|
||||
ready.hdr.size = sizeof(ready);
|
||||
ready.hdr.cmd = SOF_IPC_GLB_TPLG_MSG | SOF_IPC_TPLG_PIPE_COMPLETE;
|
||||
ready.comp_id = swidget->comp_id;
|
||||
|
||||
ret = sof_ipc_tx_message(sdev->ipc,
|
||||
ready.hdr.cmd, &ready, sizeof(ready), &reply,
|
||||
sizeof(reply));
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
return 1;
|
||||
}
|
||||
|
||||
/**
|
||||
* sof_set_pipe_widget - Set pipe_widget for a component
|
||||
* @sdev: pointer to struct snd_sof_dev
|
||||
|
Loading…
Reference in New Issue
Block a user