OSDN Git Service

ASoC: SOF: set swidget's core for scheduler widget
authorRanjani Sridharan <ranjani.sridharan@linux.intel.com>
Mon, 7 Mar 2022 18:10:56 +0000 (10:10 -0800)
committerMark Brown <broonie@kernel.org>
Tue, 8 Mar 2022 12:27:41 +0000 (12:27 +0000)
Set the swidget's core for scheduler type widgets to match that of the
pipeline core. This simplifies the flow for core get/put during widget
setup/free.

Signed-off-by: Ranjani Sridharan <ranjani.sridharan@linux.intel.com>
Reviewed-by: Bard Liao <yung-chuan.liao@linux.intel.com>
Reviewed-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
Link: https://lore.kernel.org/r/20220307181111.49392-4-ranjani.sridharan@linux.intel.com
Signed-off-by: Mark Brown <broonie@kernel.org>
sound/soc/sof/sof-audio.c
sound/soc/sof/topology.c

index ac1edb4..4816473 100644 (file)
@@ -103,7 +103,7 @@ int sof_widget_free(struct snd_sof_dev *sdev, struct snd_sof_widget *swidget)
                .id = swidget->comp_id,
        };
        struct sof_ipc_reply reply;
-       int ret, ret1, core;
+       int ret, ret1;
 
        if (!swidget->private)
                return 0;
@@ -112,14 +112,9 @@ int sof_widget_free(struct snd_sof_dev *sdev, struct snd_sof_widget *swidget)
        if (--swidget->use_count)
                return 0;
 
-       core = swidget->core;
-
        switch (swidget->id) {
        case snd_soc_dapm_scheduler:
        {
-               const struct sof_ipc_pipe_new *pipeline = swidget->private;
-
-               core = pipeline->core;
                ipc_free.hdr.cmd |= SOF_IPC_TPLG_PIPE_FREE;
                break;
        }
@@ -149,10 +144,10 @@ int sof_widget_free(struct snd_sof_dev *sdev, struct snd_sof_widget *swidget)
         * disable widget core. continue to route setup status and complete flag
         * even if this fails and return the appropriate error
         */
-       ret1 = snd_sof_dsp_core_put(sdev, core);
+       ret1 = snd_sof_dsp_core_put(sdev, swidget->core);
        if (ret1 < 0) {
                dev_err(sdev->dev, "error: failed to disable target core: %d for widget %s\n",
-                       core, swidget->widget->name);
+                       swidget->core, swidget->widget->name);
                if (!ret)
                        ret = ret1;
        }
@@ -177,7 +172,6 @@ int sof_widget_setup(struct snd_sof_dev *sdev, struct snd_sof_widget *swidget)
        struct snd_sof_dai *dai;
        size_t ipc_size;
        int ret;
-       int core;
 
        /* skip if there is no private data */
        if (!swidget->private)
@@ -187,15 +181,8 @@ int sof_widget_setup(struct snd_sof_dev *sdev, struct snd_sof_widget *swidget)
        if (++swidget->use_count > 1)
                return 0;
 
-       /* set core ID */
-       core = swidget->core;
-       if (swidget->id == snd_soc_dapm_scheduler) {
-               pipeline = swidget->private;
-               core = pipeline->core;
-       }
-
        /* enable widget core */
-       ret = snd_sof_dsp_core_get(sdev, core);
+       ret = snd_sof_dsp_core_get(sdev, swidget->core);
        if (ret < 0) {
                dev_err(sdev->dev, "error: failed to enable target core for widget %s\n",
                        swidget->widget->name);
@@ -275,7 +262,7 @@ int sof_widget_setup(struct snd_sof_dev *sdev, struct snd_sof_widget *swidget)
        return 0;
 
 core_put:
-       snd_sof_dsp_core_put(sdev, core);
+       snd_sof_dsp_core_put(sdev, swidget->core);
 use_count_dec:
        swidget->use_count--;
        return ret;
index 1d119d1..add0b30 100644 (file)
@@ -1707,6 +1707,7 @@ static int sof_widget_load_pipeline(struct snd_soc_component *scomp, int index,
                pipeline->period_mips, pipeline->core, pipeline->frames_per_sched,
                swidget->dynamic_pipeline_widget);
 
+       swidget->core = pipeline->core;
        swidget->private = pipeline;
 
        return 0;