| From 01005a729a17ab419f61a366e22f3419e7a2c3fe Mon Sep 17 00:00:00 2001 |
| From: Liam Girdwood <lrg@ti.com> |
| Date: Fri, 6 Jul 2012 16:57:05 +0100 |
| Subject: ASoC: dapm: Fix locking during codec shutdown |
| |
| From: Liam Girdwood <lrg@ti.com> |
| |
| commit 01005a729a17ab419f61a366e22f3419e7a2c3fe upstream. |
| |
| 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> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| sound/soc/soc-dapm.c | 5 +++++ |
| 1 file changed, 5 insertions(+) |
| |
| --- a/sound/soc/soc-dapm.c |
| +++ b/sound/soc/soc-dapm.c |
| @@ -3538,10 +3538,13 @@ EXPORT_SYMBOL_GPL(snd_soc_dapm_free); |
| |
| static void soc_dapm_shutdown_codec(struct snd_soc_dapm_context *dapm) |
| { |
| + struct snd_soc_card *card = dapm->card; |
| struct snd_soc_dapm_widget *w; |
| LIST_HEAD(down_list); |
| int powerdown = 0; |
| |
| + mutex_lock(&card->dapm_mutex); |
| + |
| list_for_each_entry(w, &dapm->card->widgets, list) { |
| if (w->dapm != dapm) |
| continue; |
| @@ -3564,6 +3567,8 @@ static void soc_dapm_shutdown_codec(stru |
| snd_soc_dapm_set_bias_level(dapm, |
| SND_SOC_BIAS_STANDBY); |
| } |
| + |
| + mutex_unlock(&card->dapm_mutex); |
| } |
| |
| /* |