Commit b97e2698 authored by Lars-Peter Clausen's avatar Lars-Peter Clausen Committed by Mark Brown

ASoC: dapm: Add helper function to free a widget

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: default avatarLars-Peter Clausen <lars@metafoo.de>
Signed-off-by: default avatarMark Brown <broonie@kernel.org>
parent 62d8f237
...@@ -397,6 +397,7 @@ int snd_soc_dapm_del_routes(struct snd_soc_dapm_context *dapm, ...@@ -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); const struct snd_soc_dapm_route *route, int num);
int snd_soc_dapm_weak_routes(struct snd_soc_dapm_context *dapm, int snd_soc_dapm_weak_routes(struct snd_soc_dapm_context *dapm,
const struct snd_soc_dapm_route *route, int num); const struct snd_soc_dapm_route *route, int num);
void snd_soc_dapm_free_widget(struct snd_soc_dapm_widget *w);
/* dapm events */ /* dapm events */
void snd_soc_dapm_stream_event(struct snd_soc_pcm_runtime *rtd, int stream, void snd_soc_dapm_stream_event(struct snd_soc_pcm_runtime *rtd, int stream,
......
...@@ -2312,30 +2312,36 @@ static void dapm_free_path(struct snd_soc_dapm_path *path) ...@@ -2312,30 +2312,36 @@ static void dapm_free_path(struct snd_soc_dapm_path *path)
kfree(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 */ /* free all dapm widgets and resources */
static void dapm_free_widgets(struct snd_soc_dapm_context *dapm) static void dapm_free_widgets(struct snd_soc_dapm_context *dapm)
{ {
struct snd_soc_dapm_widget *w, *next_w; 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) { list_for_each_entry_safe(w, next_w, &dapm->card->widgets, list) {
if (w->dapm != dapm) if (w->dapm != dapm)
continue; continue;
list_del(&w->list); snd_soc_dapm_free_widget(w);
/*
* 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);
} }
} }
......
...@@ -1734,7 +1734,6 @@ void snd_soc_tplg_widget_remove_all(struct snd_soc_dapm_context *dapm, ...@@ -1734,7 +1734,6 @@ void snd_soc_tplg_widget_remove_all(struct snd_soc_dapm_context *dapm,
u32 index) u32 index)
{ {
struct snd_soc_dapm_widget *w, *next_w; 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) { 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, ...@@ -1746,31 +1745,9 @@ void snd_soc_tplg_widget_remove_all(struct snd_soc_dapm_context *dapm,
if (w->dobj.index != index && if (w->dobj.index != index &&
w->dobj.index != SND_SOC_TPLG_INDEX_ALL) w->dobj.index != SND_SOC_TPLG_INDEX_ALL)
continue; 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 */ /* check and free and dynamic widget kcontrols */
snd_soc_tplg_widget_remove(w); snd_soc_tplg_widget_remove(w);
kfree(w->kcontrols); snd_soc_dapm_free_widget(w);
kfree(w->name);
kfree(w);
} }
} }
EXPORT_SYMBOL_GPL(snd_soc_tplg_widget_remove_all); EXPORT_SYMBOL_GPL(snd_soc_tplg_widget_remove_all);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment