OSDN Git Service

ASoC: SOF: sof-audio: Use the widget_kcontrol_setup ops for kcontrol set up
authorPeter Ujfalusi <peter.ujfalusi@linux.intel.com>
Tue, 5 Apr 2022 17:27:07 +0000 (10:27 -0700)
committerMark Brown <broonie@kernel.org>
Mon, 11 Apr 2022 18:18:01 +0000 (19:18 +0100)
Remove the local implementation and switch to the IPC neutral ops to
set up the kcontrols associated with the swidget.

The set up call uses snd_sof_ipc_set_get_comp_data() which is largely an
IPC3 parsing function.

Signed-off-by: Peter Ujfalusi <peter.ujfalusi@linux.intel.com>
Reviewed-by: Daniel Baluta <daniel.baluta@nxp.com>
Reviewed-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
Signed-off-by: Ranjani Sridharan <ranjani.sridharan@linux.intel.com>
Link: https://lore.kernel.org/r/20220405172708.122168-15-ranjani.sridharan@linux.intel.com
Signed-off-by: Mark Brown <broonie@kernel.org>
sound/soc/sof/sof-audio.c

index 49fdfe0..c0a4422 100644 (file)
 #include "sof-audio.h"
 #include "ops.h"
 
-static int sof_kcontrol_setup(struct snd_sof_dev *sdev, struct snd_sof_control *scontrol)
-{
-       int ret;
-
-       ret = snd_sof_ipc_set_get_comp_data(scontrol, true);
-       if (ret < 0)
-               dev_err(sdev->dev, "error: failed kcontrol value set for widget: %d\n",
-                       scontrol->comp_id);
-
-       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) {
-                       /* set kcontrol data in DSP */
-                       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;
-                       }
-
-                       /*
-                        * Read back the data from the DSP for static widgets. This is particularly
-                        * useful for binary kcontrols associated with static pipeline widgets to
-                        * initialize the data size to match that in the DSP.
-                        */
-                       if (swidget->dynamic_pipeline_widget)
-                               continue;
-
-                       ret = snd_sof_ipc_set_get_comp_data(scontrol, false);
-                       if (ret < 0)
-                               dev_warn(sdev->dev, "Failed kcontrol get for control in widget %s\n",
-                                        swidget->widget->name);
-               }
-
-       return 0;
-}
-
 static void sof_reset_route_setup_status(struct snd_sof_dev *sdev, struct snd_sof_widget *widget)
 {
        struct snd_sof_route *sroute;
@@ -176,11 +131,10 @@ int sof_widget_setup(struct snd_sof_dev *sdev, struct snd_sof_widget *swidget)
        }
 
        /* 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);
-               goto widget_free;
+       if (tplg_ops->control->widget_kcontrol_setup) {
+               ret = tplg_ops->control->widget_kcontrol_setup(sdev, swidget);
+               if (ret < 0)
+                       goto widget_free;
        }
 
        dev_dbg(sdev->dev, "widget %s setup complete\n", swidget->widget->name);