OSDN Git Service

ASoC: SOF: topology: remove snd_sof_complete_pipeline()
authorRanjani Sridharan <ranjani.sridharan@linux.intel.com>
Mon, 14 Mar 2022 20:05:20 +0000 (13:05 -0700)
committerMark Brown <broonie@kernel.org>
Wed, 16 Mar 2022 16:39:14 +0000 (16:39 +0000)
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>
sound/soc/sof/ipc3-topology.c
sound/soc/sof/sof-audio.c
sound/soc/sof/sof-audio.h
sound/soc/sof/topology.c

index ea13111..fe1d5a5 100644 (file)
@@ -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,
 };
 
index c02dcad..683c290 100644 (file)
@@ -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;
index a14b872..622d437 100644 (file)
@@ -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
index 70677a3..367fbe2 100644 (file)
@@ -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