Commit 81628103 authored by Mark Brown's avatar Mark Brown

ASoC: Coalesce power updates for DAPM widgets with events

Signed-off-by: default avatarMark Brown <broonie@opensource.wolfsonmicro.com>
parent e3d4dabd
...@@ -740,7 +740,7 @@ static void dapm_seq_run_coalesced(struct snd_soc_codec *codec, ...@@ -740,7 +740,7 @@ static void dapm_seq_run_coalesced(struct snd_soc_codec *codec,
struct list_head *pending) struct list_head *pending)
{ {
struct snd_soc_dapm_widget *w; struct snd_soc_dapm_widget *w;
int reg, power; int reg, power, ret;
unsigned int value = 0; unsigned int value = 0;
unsigned int mask = 0; unsigned int mask = 0;
unsigned int cur_mask; unsigned int cur_mask;
...@@ -764,13 +764,62 @@ static void dapm_seq_run_coalesced(struct snd_soc_codec *codec, ...@@ -764,13 +764,62 @@ static void dapm_seq_run_coalesced(struct snd_soc_codec *codec,
pop_dbg(codec->pop_time, pop_dbg(codec->pop_time,
"pop test : Queue %s: reg=0x%x, 0x%x/0x%x\n", "pop test : Queue %s: reg=0x%x, 0x%x/0x%x\n",
w->name, reg, value, mask); w->name, reg, value, mask);
/* power up pre event */
if (w->power && w->event &&
(w->event_flags & SND_SOC_DAPM_PRE_PMU)) {
pop_dbg(codec->pop_time, "pop test : %s PRE_PMU\n",
w->name);
ret = w->event(w, NULL, SND_SOC_DAPM_PRE_PMU);
if (ret < 0)
pr_err("%s: pre event failed: %d\n",
w->name, ret);
}
/* power down pre event */
if (!w->power && w->event &&
(w->event_flags & SND_SOC_DAPM_PRE_PMD)) {
pop_dbg(codec->pop_time, "pop test : %s PRE_PMD\n",
w->name);
ret = w->event(w, NULL, SND_SOC_DAPM_PRE_PMD);
if (ret < 0)
pr_err("%s: pre event failed: %d\n",
w->name, ret);
}
} }
if (reg >= 0) {
pop_dbg(codec->pop_time, pop_dbg(codec->pop_time,
"pop test : Applying 0x%x/0x%x to %x in %dms\n", "pop test : Applying 0x%x/0x%x to %x in %dms\n",
value, mask, reg, codec->pop_time); value, mask, reg, codec->pop_time);
pop_wait(codec->pop_time); pop_wait(codec->pop_time);
snd_soc_update_bits(codec, reg, mask, value); snd_soc_update_bits(codec, reg, mask, value);
}
list_for_each_entry(w, pending, power_list) {
/* power up post event */
if (w->power && w->event &&
(w->event_flags & SND_SOC_DAPM_POST_PMU)) {
pop_dbg(codec->pop_time, "pop test : %s POST_PMU\n",
w->name);
ret = w->event(w,
NULL, SND_SOC_DAPM_POST_PMU);
if (ret < 0)
pr_err("%s: post event failed: %d\n",
w->name, ret);
}
/* power down post event */
if (!w->power && w->event &&
(w->event_flags & SND_SOC_DAPM_POST_PMD)) {
pop_dbg(codec->pop_time, "pop test : %s POST_PMD\n",
w->name);
ret = w->event(w, NULL, SND_SOC_DAPM_POST_PMD);
if (ret < 0)
pr_err("%s: post event failed: %d\n",
w->name, ret);
}
}
} }
/* Apply a DAPM power sequence. /* Apply a DAPM power sequence.
...@@ -843,16 +892,11 @@ static void dapm_seq_run(struct snd_soc_codec *codec, struct list_head *list, ...@@ -843,16 +892,11 @@ static void dapm_seq_run(struct snd_soc_codec *codec, struct list_head *list,
break; break;
default: default:
/* If there's an event or an invalid register /* Queue it up for application */
* then run immediately, otherwise store the
* updates so that we can coalesce. */
if (w->reg >= 0 && !w->event) {
cur_sort = sort[w->id]; cur_sort = sort[w->id];
cur_reg = w->reg; cur_reg = w->reg;
list_move(&w->power_list, &pending); list_move(&w->power_list, &pending);
} else { break;
ret = dapm_generic_apply_power(w);
}
} }
if (ret < 0) if (ret < 0)
......
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