ASoC: dapm: Reduce number of checked paths in dapm_widget_in_card_paths()

Each widget has a list of all the paths that it is connected to. There is no
need to iterate over all paths when we are only interested in the paths of a
specific widget.

Signed-off-by: Lars-Peter Clausen <lars@metafoo.de>
Signed-off-by: Mark Brown <broonie@kernel.org>
This commit is contained in:
Lars-Peter Clausen 2014-10-20 19:36:33 +02:00 committed by Mark Brown
parent 98ad73c995
commit cdc4508b4d
1 changed files with 42 additions and 23 deletions

View File

@ -3788,35 +3788,54 @@ int snd_soc_dapm_ignore_suspend(struct snd_soc_dapm_context *dapm,
}
EXPORT_SYMBOL_GPL(snd_soc_dapm_ignore_suspend);
/**
* dapm_is_external_path() - Checks if a path is a external path
* @card: The card the path belongs to
* @path: The path to check
*
* Returns true if the path is either between two different DAPM contexts or
* between two external pins of the same DAPM context. Otherwise returns
* false.
*/
static bool dapm_is_external_path(struct snd_soc_card *card,
struct snd_soc_dapm_path *path)
{
dev_dbg(card->dev,
"... Path %s(id:%d dapm:%p) - %s(id:%d dapm:%p)\n",
path->source->name, path->source->id, path->source->dapm,
path->sink->name, path->sink->id, path->sink->dapm);
/* Connection between two different DAPM contexts */
if (path->source->dapm != path->sink->dapm)
return true;
/* Loopback connection from external pin to external pin */
if (path->sink->id == snd_soc_dapm_input) {
switch (path->source->id) {
case snd_soc_dapm_output:
case snd_soc_dapm_micbias:
return true;
default:
break;
}
}
return false;
}
static bool snd_soc_dapm_widget_in_card_paths(struct snd_soc_card *card,
struct snd_soc_dapm_widget *w)
{
struct snd_soc_dapm_path *p;
list_for_each_entry(p, &card->paths, list) {
if ((p->source == w) || (p->sink == w)) {
dev_dbg(card->dev,
"... Path %s(id:%d dapm:%p) - %s(id:%d dapm:%p)\n",
p->source->name, p->source->id, p->source->dapm,
p->sink->name, p->sink->id, p->sink->dapm);
list_for_each_entry(p, &w->sources, list_sink) {
if (dapm_is_external_path(card, p))
return true;
}
/* Connected to something other than the codec */
if (p->source->dapm != p->sink->dapm)
return true;
/*
* Loopback connection from codec external pin to
* codec external pin
*/
if (p->sink->id == snd_soc_dapm_input) {
switch (p->source->id) {
case snd_soc_dapm_output:
case snd_soc_dapm_micbias:
return true;
default:
break;
}
}
}
list_for_each_entry(p, &w->sinks, list_source) {
if (dapm_is_external_path(card, p))
return true;
}
return false;