ASoC: dapm: Ensure bypass paths are suspended and resumed
Since bypass paths aren't part of DAPM streams and we may not have any DAPM streams there may not be anything that triggers a DAPM sync for them. Mark all input and output widgets as dirty and then sync to do so at the end of suspend and resume. Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com> Acked-by: Liam Girdwood <lrg@ti.com>
This commit is contained in:
parent
e5ec69da24
commit
e2d32ff6ce
|
@ -412,6 +412,7 @@ void snd_soc_dapm_auto_nc_codec_pins(struct snd_soc_codec *codec);
|
|||
|
||||
/* Mostly internal - should not normally be used */
|
||||
void dapm_mark_dirty(struct snd_soc_dapm_widget *w, const char *reason);
|
||||
void dapm_mark_io_dirty(struct snd_soc_dapm_context *dapm);
|
||||
|
||||
/* dapm path query */
|
||||
int snd_soc_dapm_dai_get_connected_widgets(struct snd_soc_dai *dai, int stream,
|
||||
|
|
|
@ -609,6 +609,10 @@ int snd_soc_suspend(struct device *dev)
|
|||
SND_SOC_DAPM_STREAM_SUSPEND);
|
||||
}
|
||||
|
||||
/* Recheck all analogue paths too */
|
||||
dapm_mark_io_dirty(&card->dapm);
|
||||
snd_soc_dapm_sync(&card->dapm);
|
||||
|
||||
/* suspend all CODECs */
|
||||
list_for_each_entry(codec, &card->codec_dev_list, card_list) {
|
||||
/* If there are paths active then the CODEC will be held with
|
||||
|
@ -756,6 +760,10 @@ static void soc_resume_deferred(struct work_struct *work)
|
|||
|
||||
/* userspace can access us now we are back as we were before */
|
||||
snd_power_change_state(card->snd_card, SNDRV_CTL_POWER_D0);
|
||||
|
||||
/* Recheck all analogue paths too */
|
||||
dapm_mark_io_dirty(&card->dapm);
|
||||
snd_soc_dapm_sync(&card->dapm);
|
||||
}
|
||||
|
||||
/* powers up audio subsystem after a suspend */
|
||||
|
|
|
@ -141,6 +141,28 @@ void dapm_mark_dirty(struct snd_soc_dapm_widget *w, const char *reason)
|
|||
}
|
||||
EXPORT_SYMBOL_GPL(dapm_mark_dirty);
|
||||
|
||||
void dapm_mark_io_dirty(struct snd_soc_dapm_context *dapm)
|
||||
{
|
||||
struct snd_soc_card *card = dapm->card;
|
||||
struct snd_soc_dapm_widget *w;
|
||||
|
||||
mutex_lock(&card->dapm_mutex);
|
||||
|
||||
list_for_each_entry(w, &card->widgets, list) {
|
||||
switch (w->id) {
|
||||
case snd_soc_dapm_input:
|
||||
case snd_soc_dapm_output:
|
||||
dapm_mark_dirty(w, "Rechecking inputs and outputs");
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
mutex_unlock(&card->dapm_mutex);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(dapm_mark_io_dirty);
|
||||
|
||||
/* create a new dapm widget */
|
||||
static inline struct snd_soc_dapm_widget *dapm_cnew_widget(
|
||||
const struct snd_soc_dapm_widget *_widget)
|
||||
|
|
Loading…
Reference in New Issue