]> git.proxmox.com Git - mirror_ubuntu-zesty-kernel.git/commitdiff
ASoC: dapm: Add helper function to free a widget
authorLars-Peter Clausen <lars@metafoo.de>
Tue, 21 Jul 2015 16:11:07 +0000 (18:11 +0200)
committerMark Brown <broonie@kernel.org>
Tue, 21 Jul 2015 17:08:53 +0000 (18:08 +0100)
snd_soc_tplg_widget_remove_all() has a verbatim copy of an older version of
the widget freeing code from dapm_free_widgets(). Add a new helper function
that takes care of freeing a widget and use it in both places.

This removes the duplicated code and also makes sure that future changes to
the widget freeing code only have to be made in one location.

Signed-off-by: Lars-Peter Clausen <lars@metafoo.de>
Signed-off-by: Mark Brown <broonie@kernel.org>
include/sound/soc-dapm.h
sound/soc/soc-dapm.c
sound/soc/soc-topology.c

index 37d95a89827595f8099bd72ebec02891c15bf6d1..cadc7fc5d72776e27ef510c29c4efab86b41333a 100644 (file)
@@ -397,6 +397,7 @@ int snd_soc_dapm_del_routes(struct snd_soc_dapm_context *dapm,
                            const struct snd_soc_dapm_route *route, int num);
 int snd_soc_dapm_weak_routes(struct snd_soc_dapm_context *dapm,
                             const struct snd_soc_dapm_route *route, int num);
+void snd_soc_dapm_free_widget(struct snd_soc_dapm_widget *w);
 
 /* dapm events */
 void snd_soc_dapm_stream_event(struct snd_soc_pcm_runtime *rtd, int stream,
index e0de8072c5144e92fce3ec9518787a4db526d726..24ea692bd49ee442f26d65fdca794071c3419b39 100644 (file)
@@ -2312,30 +2312,36 @@ static void dapm_free_path(struct snd_soc_dapm_path *path)
        kfree(path);
 }
 
+void snd_soc_dapm_free_widget(struct snd_soc_dapm_widget *w)
+{
+       struct snd_soc_dapm_path *p, *next_p;
+
+       list_del(&w->list);
+       /*
+        * remove source and sink paths associated to this widget.
+        * While removing the path, remove reference to it from both
+        * source and sink widgets so that path is removed only once.
+        */
+       list_for_each_entry_safe(p, next_p, &w->sources, list_sink)
+               dapm_free_path(p);
+
+       list_for_each_entry_safe(p, next_p, &w->sinks, list_source)
+               dapm_free_path(p);
+
+       kfree(w->kcontrols);
+       kfree(w->name);
+       kfree(w);
+}
+
 /* free all dapm widgets and resources */
 static void dapm_free_widgets(struct snd_soc_dapm_context *dapm)
 {
        struct snd_soc_dapm_widget *w, *next_w;
-       struct snd_soc_dapm_path *p, *next_p;
 
        list_for_each_entry_safe(w, next_w, &dapm->card->widgets, list) {
                if (w->dapm != dapm)
                        continue;
-               list_del(&w->list);
-               /*
-                * remove source and sink paths associated to this widget.
-                * While removing the path, remove reference to it from both
-                * source and sink widgets so that path is removed only once.
-                */
-               list_for_each_entry_safe(p, next_p, &w->sources, list_sink)
-                       dapm_free_path(p);
-
-               list_for_each_entry_safe(p, next_p, &w->sinks, list_source)
-                       dapm_free_path(p);
-
-               kfree(w->kcontrols);
-               kfree(w->name);
-               kfree(w);
+               snd_soc_dapm_free_widget(w);
        }
 }
 
index d0960683c4093c4303743b1e7e4f93190e11a3a5..56dd108d6f5fc410afc4108a070738b64a39bbc6 100644 (file)
@@ -1734,7 +1734,6 @@ void snd_soc_tplg_widget_remove_all(struct snd_soc_dapm_context *dapm,
        u32 index)
 {
        struct snd_soc_dapm_widget *w, *next_w;
-       struct snd_soc_dapm_path *p, *next_p;
 
        list_for_each_entry_safe(w, next_w, &dapm->card->widgets, list) {
 
@@ -1746,31 +1745,9 @@ void snd_soc_tplg_widget_remove_all(struct snd_soc_dapm_context *dapm,
                if (w->dobj.index != index &&
                        w->dobj.index != SND_SOC_TPLG_INDEX_ALL)
                        continue;
-
-               list_del(&w->list);
-
-               /*
-                * remove source and sink paths associated to this widget.
-                * While removing the path, remove reference to it from both
-                * source and sink widgets so that path is removed only once.
-                */
-               list_for_each_entry_safe(p, next_p, &w->sources, list_sink) {
-                       list_del(&p->list_sink);
-                       list_del(&p->list_source);
-                       list_del(&p->list);
-                       kfree(p);
-               }
-               list_for_each_entry_safe(p, next_p, &w->sinks, list_source) {
-                       list_del(&p->list_sink);
-                       list_del(&p->list_source);
-                       list_del(&p->list);
-                       kfree(p);
-               }
                /* check and free and dynamic widget kcontrols */
                snd_soc_tplg_widget_remove(w);
-               kfree(w->kcontrols);
-               kfree(w->name);
-               kfree(w);
+               snd_soc_dapm_free_widget(w);
        }
 }
 EXPORT_SYMBOL_GPL(snd_soc_tplg_widget_remove_all);