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

ASoC: dapm: Delay w->power update until the changes are written

Wait with updating the widgets power field until the changes are actually
written to the hardware in dapm_seq_run_coalesced(). This will allow us to query
the current hardware state between calling dapm_power_one_widget() and actually
writing the new power state to hardware.
Signed-off-by: default avatarLars-Peter Clausen <lars@metafoo.de>
Signed-off-by: default avatarMark Brown <broonie@linaro.org>
parent 2553628e
...@@ -293,6 +293,7 @@ static void dapm_reset(struct snd_soc_card *card) ...@@ -293,6 +293,7 @@ static void dapm_reset(struct snd_soc_card *card)
memset(&card->dapm_stats, 0, sizeof(card->dapm_stats)); memset(&card->dapm_stats, 0, sizeof(card->dapm_stats));
list_for_each_entry(w, &card->widgets, list) { list_for_each_entry(w, &card->widgets, list) {
w->new_power = w->power;
w->power_checked = false; w->power_checked = false;
w->inputs = -1; w->inputs = -1;
w->outputs = -1; w->outputs = -1;
...@@ -1340,7 +1341,7 @@ static void dapm_seq_check_event(struct snd_soc_card *card, ...@@ -1340,7 +1341,7 @@ static void dapm_seq_check_event(struct snd_soc_card *card,
return; return;
} }
if (w->power != power) if (w->new_power != power)
return; return;
if (w->event && (w->event_flags & event)) { if (w->event && (w->event_flags & event)) {
...@@ -1369,6 +1370,7 @@ static void dapm_seq_run_coalesced(struct snd_soc_card *card, ...@@ -1369,6 +1370,7 @@ static void dapm_seq_run_coalesced(struct snd_soc_card *card,
list_for_each_entry(w, pending, power_list) { list_for_each_entry(w, pending, power_list) {
BUG_ON(reg != w->reg); BUG_ON(reg != w->reg);
w->power = w->new_power;
mask |= w->mask << w->shift; mask |= w->mask << w->shift;
if (w->power) if (w->power)
...@@ -1676,8 +1678,6 @@ static void dapm_widget_set_power(struct snd_soc_dapm_widget *w, bool power, ...@@ -1676,8 +1678,6 @@ static void dapm_widget_set_power(struct snd_soc_dapm_widget *w, bool power,
dapm_seq_insert(w, up_list, true); dapm_seq_insert(w, up_list, true);
else else
dapm_seq_insert(w, down_list, false); dapm_seq_insert(w, down_list, false);
w->power = power;
} }
static void dapm_power_one_widget(struct snd_soc_dapm_widget *w, static void dapm_power_one_widget(struct snd_soc_dapm_widget *w,
...@@ -1752,7 +1752,7 @@ static int dapm_power_widgets(struct snd_soc_card *card, int event) ...@@ -1752,7 +1752,7 @@ static int dapm_power_widgets(struct snd_soc_card *card, int event)
break; break;
} }
if (w->power) { if (w->new_power) {
d = w->dapm; d = w->dapm;
/* Supplies and micbiases only bring the /* Supplies and micbiases only bring the
......
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