aboutsummaryrefslogtreecommitdiffstats
path: root/sound/soc/soc-dapm.c
diff options
context:
space:
mode:
authorMark Brown <broonie@opensource.wolfsonmicro.com>2011-10-04 17:15:59 -0400
committerMark Brown <broonie@opensource.wolfsonmicro.com>2011-10-05 06:22:22 -0400
commit9b8a83b205bd07b06784028effd94515fe9278c3 (patch)
tree82e015462cf5e36769c2da61d3bf49f6d2873e63 /sound/soc/soc-dapm.c
parent75c1f891b4c394c607532fdcea294c2556e410c4 (diff)
ASoC: Only run power_check() on a widget once per run
Some widgets will get power_check() run on them more than once during a DAPM run, most commonly due to supply widgets checking to see if their consumers are powered up. It's wasteful to do this so cache the result of power_check() during a run. For one system I tested this on I got an improvement of: Power Path Neighbour Before: 106 970 1186 After: 69 727 905 from this. Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
Diffstat (limited to 'sound/soc/soc-dapm.c')
-rw-r--r--sound/soc/soc-dapm.c15
1 files changed, 13 insertions, 2 deletions
diff --git a/sound/soc/soc-dapm.c b/sound/soc/soc-dapm.c
index e6a08822227e..c39146d435e2 100644
--- a/sound/soc/soc-dapm.c
+++ b/sound/soc/soc-dapm.c
@@ -787,10 +787,17 @@ EXPORT_SYMBOL_GPL(dapm_reg_event);
787 787
788static int dapm_widget_power_check(struct snd_soc_dapm_widget *w) 788static int dapm_widget_power_check(struct snd_soc_dapm_widget *w)
789{ 789{
790 if (w->power_checked)
791 return w->new_power;
792
790 if (w->force) 793 if (w->force)
791 return 1; 794 w->new_power = 1;
792 else 795 else
793 return w->power_check(w); 796 w->new_power = w->power_check(w);
797
798 w->power_checked = true;
799
800 return w->new_power;
794} 801}
795 802
796/* Generic check to see if a widget should be powered. 803/* Generic check to see if a widget should be powered.
@@ -1322,6 +1329,10 @@ static int dapm_power_widgets(struct snd_soc_dapm_context *dapm, int event)
1322 1329
1323 memset(&card->dapm_stats, 0, sizeof(card->dapm_stats)); 1330 memset(&card->dapm_stats, 0, sizeof(card->dapm_stats));
1324 1331
1332 list_for_each_entry(w, &card->widgets, list) {
1333 w->power_checked = false;
1334 }
1335
1325 /* Check which widgets we need to power and store them in 1336 /* Check which widgets we need to power and store them in
1326 * lists indicating if they should be powered up or down. We 1337 * lists indicating if they should be powered up or down. We
1327 * only check widgets that have been flagged as dirty but note 1338 * only check widgets that have been flagged as dirty but note