OSDN Git Service

ASoC: SOF: restore kcontrols for widget during set up
authorRanjani Sridharan <ranjani.sridharan@linux.intel.com>
Mon, 27 Sep 2021 12:05:12 +0000 (15:05 +0300)
committerMark Brown <broonie@kernel.org>
Fri, 1 Oct 2021 19:48:26 +0000 (20:48 +0100)
Restore kcontrols for each widget after it has been set up
successfully.

Signed-off-by: Ranjani Sridharan <ranjani.sridharan@linux.intel.com>
Signed-off-by: Kai Vehmanen <kai.vehmanen@linux.intel.com>
Reviewed-by: Guennadi Liakhovetski <guennadi.liakhovetski@linux.intel.com>
Reviewed-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
Reviewed-by: Seppo Ingalsuo <seppo.ingalsuo@intel.com>
Signed-off-by: Daniel Baluta <daniel.baluta@nxp.com>
Signed-off-by: Peter Ujfalusi <peter.ujfalusi@linux.intel.com>
Link: https://lore.kernel.org/r/20210927120517.20505-8-peter.ujfalusi@linux.intel.com
Signed-off-by: Mark Brown <broonie@kernel.org>
sound/soc/sof/sof-audio.c

index b52a453..b277602 100644 (file)
@@ -64,6 +64,25 @@ static int sof_dai_config_setup(struct snd_sof_dev *sdev, struct snd_sof_dai *da
        return ret;
 }
 
+static int sof_widget_kcontrol_setup(struct snd_sof_dev *sdev, struct snd_sof_widget *swidget)
+{
+       struct snd_sof_control *scontrol;
+       int ret;
+
+       /* set up all controls for the widget */
+       list_for_each_entry(scontrol, &sdev->kcontrol_list, list)
+               if (scontrol->comp_id == swidget->comp_id) {
+                       ret = sof_kcontrol_setup(sdev, scontrol);
+                       if (ret < 0) {
+                               dev_err(sdev->dev, "error: fail to set up kcontrols for widget %s\n",
+                                       swidget->widget->name);
+                               return ret;
+                       }
+               }
+
+       return 0;
+}
+
 static int sof_widget_setup(struct snd_sof_dev *sdev, struct snd_sof_widget *swidget)
 {
        struct sof_ipc_pipe_new *pipeline;
@@ -113,10 +132,20 @@ static int sof_widget_setup(struct snd_sof_dev *sdev, struct snd_sof_widget *swi
                                         &r, sizeof(r));
                break;
        }
-       if (ret < 0)
+       if (ret < 0) {
                dev_err(sdev->dev, "error: failed to load widget %s\n", swidget->widget->name);
-       else
-               dev_dbg(sdev->dev, "widget %s setup complete\n", swidget->widget->name);
+               return ret;
+       }
+
+       /* restore kcontrols for widget */
+       ret = sof_widget_kcontrol_setup(sdev, swidget);
+       if (ret < 0) {
+               dev_err(sdev->dev, "error: failed to restore kcontrols for widget %s\n",
+                       swidget->widget->name);
+               return ret;
+       }
+
+       dev_dbg(sdev->dev, "widget %s setup complete\n", swidget->widget->name);
 
        return ret;
 }
@@ -203,22 +232,6 @@ int sof_set_hw_params_upon_resume(struct device *dev)
        return snd_sof_dsp_hw_params_upon_resume(sdev);
 }
 
-static int sof_restore_kcontrols(struct device *dev)
-{
-       struct snd_sof_dev *sdev = dev_get_drvdata(dev);
-       struct snd_sof_control *scontrol;
-       int ret = 0;
-
-       /* restore kcontrol values */
-       list_for_each_entry(scontrol, &sdev->kcontrol_list, list) {
-               ret = sof_kcontrol_setup(sdev, scontrol);
-               if (ret < 0)
-                       return ret;
-       }
-
-       return 0;
-}
-
 const struct sof_ipc_pipe_new *snd_sof_pipeline_find(struct snd_sof_dev *sdev,
                                                     int pipeline_id)
 {
@@ -309,13 +322,7 @@ int sof_restore_pipelines(struct device *dev)
                }
        }
 
-       /* restore pipeline kcontrols */
-       ret = sof_restore_kcontrols(dev);
-       if (ret < 0)
-               dev_err(dev,
-                       "error: restoring kcontrols after resume\n");
-
-       return ret;
+       return 0;
 }
 
 /* This function doesn't free widgets. It only resets the set up status for all routes */