diff options
author | Liam Girdwood <lrg@ti.com> | 2012-07-06 11:57:05 -0400 |
---|---|---|
committer | Mark Brown <broonie@opensource.wolfsonmicro.com> | 2012-07-06 13:58:46 -0400 |
commit | 01005a729a17ab419f61a366e22f3419e7a2c3fe (patch) | |
tree | b20e2b99c10fa7cf8670974fb823ecf5aca4c040 /sound | |
parent | 32fee7afe763344ef53bbd4e737aa6168a9308aa (diff) |
ASoC: dapm: Fix locking during codec shutdown
Codec shutdown performs a DAPM power sequence that might cause conflicts
and/or race conditions if another stream power event is running simultaneously.
Use card's dapm mutex to protect any potential race condition between them.
Signed-off-by: Misael Lopez Cruz <misael.lopez@ti.com>
Signed-off-by: Liam Girdwood <lrg@ti.com>
Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
Cc: stable@vger.kernel.org
Diffstat (limited to 'sound')
-rw-r--r-- | sound/soc/soc-dapm.c | 5 |
1 files changed, 5 insertions, 0 deletions
diff --git a/sound/soc/soc-dapm.c b/sound/soc/soc-dapm.c index 5be4f9a2edb8..114f2af5f304 100644 --- a/sound/soc/soc-dapm.c +++ b/sound/soc/soc-dapm.c | |||
@@ -3537,10 +3537,13 @@ EXPORT_SYMBOL_GPL(snd_soc_dapm_free); | |||
3537 | 3537 | ||
3538 | static void soc_dapm_shutdown_codec(struct snd_soc_dapm_context *dapm) | 3538 | static void soc_dapm_shutdown_codec(struct snd_soc_dapm_context *dapm) |
3539 | { | 3539 | { |
3540 | struct snd_soc_card *card = dapm->card; | ||
3540 | struct snd_soc_dapm_widget *w; | 3541 | struct snd_soc_dapm_widget *w; |
3541 | LIST_HEAD(down_list); | 3542 | LIST_HEAD(down_list); |
3542 | int powerdown = 0; | 3543 | int powerdown = 0; |
3543 | 3544 | ||
3545 | mutex_lock(&card->dapm_mutex); | ||
3546 | |||
3544 | list_for_each_entry(w, &dapm->card->widgets, list) { | 3547 | list_for_each_entry(w, &dapm->card->widgets, list) { |
3545 | if (w->dapm != dapm) | 3548 | if (w->dapm != dapm) |
3546 | continue; | 3549 | continue; |
@@ -3563,6 +3566,8 @@ static void soc_dapm_shutdown_codec(struct snd_soc_dapm_context *dapm) | |||
3563 | snd_soc_dapm_set_bias_level(dapm, | 3566 | snd_soc_dapm_set_bias_level(dapm, |
3564 | SND_SOC_BIAS_STANDBY); | 3567 | SND_SOC_BIAS_STANDBY); |
3565 | } | 3568 | } |
3569 | |||
3570 | mutex_unlock(&card->dapm_mutex); | ||
3566 | } | 3571 | } |
3567 | 3572 | ||
3568 | /* | 3573 | /* |