ASoC: Intel: Skylake: Fix to fill all sink/source pipe params
authorSubhransu S. Prusty <subhransu.s.prusty@intel.com>
Thu, 22 Oct 2015 17:52:37 +0000 (23:22 +0530)
committerMark Brown <broonie@kernel.org>
Fri, 23 Oct 2015 16:31:34 +0000 (01:31 +0900)
Currently params only for first copier widget identified in the
source/sink path is queried from NHLT. In the dapm route the
playback/capture widget may be connected to more than one copier
widget. This patch adds return check to return only for any error
case.

Signed-off-by: Subhransu S. Prusty <subhransu.s.prusty@intel.com>
Signed-off-by: Jeeja KP <jeeja.kp@intel.com>
Signed-off-by: Vinod Koul <vinod.koul@intel.com>
Signed-off-by: Mark Brown <broonie@kernel.org>
sound/soc/intel/skylake/skl-topology.c

index 0fba39dcb2ab96baf75282f091c5b68c18a43ed4..68e1b00ce7ed7347d0445958e68861804e2a7e08 100644 (file)
@@ -944,48 +944,60 @@ static int skl_tplg_be_set_src_pipe_params(struct snd_soc_dai *dai,
                                struct skl_pipe_params *params)
 {
        struct snd_soc_dapm_path *p;
+       int ret = -EIO;
 
        snd_soc_dapm_widget_for_each_source_path(w, p) {
                if (p->connect && is_skl_dsp_widget_type(p->source) &&
                                                p->source->priv) {
 
-                       if (!p->source->power)
-                               return skl_tplg_be_fill_pipe_params(
+                       if (!p->source->power) {
+                               ret = skl_tplg_be_fill_pipe_params(
                                                dai, p->source->priv,
                                                params);
-                       else
+                               if (ret < 0)
+                                       return ret;
+                       } else {
                                return -EBUSY;
+                       }
                } else {
-                       return skl_tplg_be_set_src_pipe_params(
+                       ret = skl_tplg_be_set_src_pipe_params(
                                                dai, p->source, params);
+                       if (ret < 0)
+                               return ret;
                }
        }
 
-       return -EIO;
+       return ret;
 }
 
 static int skl_tplg_be_set_sink_pipe_params(struct snd_soc_dai *dai,
        struct snd_soc_dapm_widget *w, struct skl_pipe_params *params)
 {
        struct snd_soc_dapm_path *p = NULL;
+       int ret = -EIO;
 
        snd_soc_dapm_widget_for_each_sink_path(w, p) {
                if (p->connect && is_skl_dsp_widget_type(p->sink) &&
                                                p->sink->priv) {
 
-                       if (!p->sink->power)
-                               return skl_tplg_be_fill_pipe_params(
+                       if (!p->sink->power) {
+                               ret = skl_tplg_be_fill_pipe_params(
                                                dai, p->sink->priv, params);
-                       else
+                               if (ret < 0)
+                                       return ret;
+                       } else {
                                return -EBUSY;
+                       }
 
                } else {
-                       return skl_tplg_be_set_sink_pipe_params(
+                       ret = skl_tplg_be_set_sink_pipe_params(
                                                dai, p->sink, params);
+                       if (ret < 0)
+                               return ret;
                }
        }
 
-       return -EIO;
+       return ret;
 }
 
 /*