ASoC: Factor out DAPM sequence execution
Lump the list walk into a single function, and pull in the power application too so we can do some further refactoring. Pure code motion. Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
This commit is contained in:
Родитель
38357ab2c8
Коммит
163cac061c
|
@ -707,55 +707,6 @@ static int dapm_supply_check_power(struct snd_soc_dapm_widget *w)
|
||||||
return power;
|
return power;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
* Scan a single DAPM widget for a complete audio path and update the
|
|
||||||
* power status appropriately.
|
|
||||||
*/
|
|
||||||
static int dapm_power_widget(struct snd_soc_codec *codec, int event,
|
|
||||||
struct snd_soc_dapm_widget *w)
|
|
||||||
{
|
|
||||||
int ret;
|
|
||||||
|
|
||||||
switch (w->id) {
|
|
||||||
case snd_soc_dapm_pre:
|
|
||||||
if (!w->event)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
if (event == SND_SOC_DAPM_STREAM_START) {
|
|
||||||
ret = w->event(w,
|
|
||||||
NULL, SND_SOC_DAPM_PRE_PMU);
|
|
||||||
if (ret < 0)
|
|
||||||
return ret;
|
|
||||||
} else if (event == SND_SOC_DAPM_STREAM_STOP) {
|
|
||||||
ret = w->event(w,
|
|
||||||
NULL, SND_SOC_DAPM_PRE_PMD);
|
|
||||||
if (ret < 0)
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
case snd_soc_dapm_post:
|
|
||||||
if (!w->event)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
if (event == SND_SOC_DAPM_STREAM_START) {
|
|
||||||
ret = w->event(w,
|
|
||||||
NULL, SND_SOC_DAPM_POST_PMU);
|
|
||||||
if (ret < 0)
|
|
||||||
return ret;
|
|
||||||
} else if (event == SND_SOC_DAPM_STREAM_STOP) {
|
|
||||||
ret = w->event(w,
|
|
||||||
NULL, SND_SOC_DAPM_POST_PMD);
|
|
||||||
if (ret < 0)
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
default:
|
|
||||||
return dapm_generic_apply_power(w);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static int dapm_seq_compare(struct snd_soc_dapm_widget *a,
|
static int dapm_seq_compare(struct snd_soc_dapm_widget *a,
|
||||||
struct snd_soc_dapm_widget *b,
|
struct snd_soc_dapm_widget *b,
|
||||||
int sort[])
|
int sort[])
|
||||||
|
@ -782,6 +733,65 @@ static void dapm_seq_insert(struct snd_soc_dapm_widget *new_widget,
|
||||||
list_add_tail(&new_widget->power_list, list);
|
list_add_tail(&new_widget->power_list, list);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Apply a DAPM power sequence */
|
||||||
|
static void dapm_seq_run(struct snd_soc_codec *codec, struct list_head *list,
|
||||||
|
int event)
|
||||||
|
{
|
||||||
|
struct snd_soc_dapm_widget *w;
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
list_for_each_entry(w, list, power_list) {
|
||||||
|
switch (w->id) {
|
||||||
|
case snd_soc_dapm_pre:
|
||||||
|
if (!w->event)
|
||||||
|
list_for_each_entry_continue(w, list,
|
||||||
|
power_list);
|
||||||
|
|
||||||
|
if (event == SND_SOC_DAPM_STREAM_START) {
|
||||||
|
ret = w->event(w,
|
||||||
|
NULL, SND_SOC_DAPM_PRE_PMU);
|
||||||
|
if (ret < 0)
|
||||||
|
pr_err("PRE widget failed: %d\n",
|
||||||
|
ret);
|
||||||
|
} else if (event == SND_SOC_DAPM_STREAM_STOP) {
|
||||||
|
ret = w->event(w,
|
||||||
|
NULL, SND_SOC_DAPM_PRE_PMD);
|
||||||
|
if (ret < 0)
|
||||||
|
pr_err("PRE widget failed: %d\n",
|
||||||
|
ret);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case snd_soc_dapm_post:
|
||||||
|
if (!w->event)
|
||||||
|
list_for_each_entry_continue(w, list,
|
||||||
|
power_list);
|
||||||
|
|
||||||
|
if (event == SND_SOC_DAPM_STREAM_START) {
|
||||||
|
ret = w->event(w,
|
||||||
|
NULL, SND_SOC_DAPM_POST_PMU);
|
||||||
|
if (ret < 0)
|
||||||
|
pr_err("POST widget failed: %d\n",
|
||||||
|
ret);
|
||||||
|
} else if (event == SND_SOC_DAPM_STREAM_STOP) {
|
||||||
|
ret = w->event(w,
|
||||||
|
NULL, SND_SOC_DAPM_POST_PMD);
|
||||||
|
if (ret < 0)
|
||||||
|
pr_err("POST widget failed: %d\n",
|
||||||
|
ret);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
ret = dapm_generic_apply_power(w);
|
||||||
|
if (ret < 0)
|
||||||
|
pr_err("Failed to apply widget power: %d\n",
|
||||||
|
ret);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Scan each dapm widget for complete audio path.
|
* Scan each dapm widget for complete audio path.
|
||||||
* A complete path is a route that has valid endpoints i.e.:-
|
* A complete path is a route that has valid endpoints i.e.:-
|
||||||
|
@ -847,20 +857,10 @@ static int dapm_power_widgets(struct snd_soc_codec *codec, int event)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Power down widgets first; try to avoid amplifying pops. */
|
/* Power down widgets first; try to avoid amplifying pops. */
|
||||||
list_for_each_entry(w, &codec->down_list, power_list) {
|
dapm_seq_run(codec, &codec->down_list, event);
|
||||||
ret = dapm_power_widget(codec, event, w);
|
|
||||||
if (ret != 0)
|
|
||||||
pr_err("Failed to power down %s: %d\n",
|
|
||||||
w->name, ret);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Now power up. */
|
/* Now power up. */
|
||||||
list_for_each_entry(w, &codec->up_list, power_list) {
|
dapm_seq_run(codec, &codec->up_list, event);
|
||||||
ret = dapm_power_widget(codec, event, w);
|
|
||||||
if (ret != 0)
|
|
||||||
pr_err("Failed to power up %s: %d\n",
|
|
||||||
w->name, ret);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* If we just powered the last thing off drop to standby bias */
|
/* If we just powered the last thing off drop to standby bias */
|
||||||
if (codec->bias_level == SND_SOC_BIAS_PREPARE && !sys_power) {
|
if (codec->bias_level == SND_SOC_BIAS_PREPARE && !sys_power) {
|
||||||
|
|
Загрузка…
Ссылка в новой задаче