ASoC: tlv320aic3x: Remove deadlock from snd_soc_dapm_put_volsw_aic3x()
authorAndreas Irestål <Andreas.Irestal@axis.com>
Wed, 5 Jun 2013 06:49:47 +0000 (08:49 +0200)
committerMark Brown <broonie@linaro.org>
Fri, 7 Jun 2013 16:57:16 +0000 (17:57 +0100)
When calling snd_soc_dapm_sync(), it eventually tries to lock the same mutex
already locked in snd_soc_dapm_put_volsw_aic3x() and a deadlock occurs. By
moving the mutex unlock to just before snd_soc_dapm_sync(), this deadlock is
prevented. This problem was introduced in Linux 3.5

Signed-off-by: Andreas Irestål <Andreas.Irestal@axis.com>
Signed-off-by: Mark Brown <broonie@linaro.org>
sound/soc/codecs/tlv320aic3x.c

index 65d09d6..1514bf8 100644 (file)
@@ -187,14 +187,14 @@ static int snd_soc_dapm_put_volsw_aic3x(struct snd_kcontrol *kcontrol,
 
                        break;
                }
-
-               if (found)
-                       snd_soc_dapm_sync(widget->dapm);
        }
 
-       ret = snd_soc_update_bits(widget->codec, reg, val_mask, val);
-
        mutex_unlock(&widget->codec->mutex);
+
+       if (found)
+               snd_soc_dapm_sync(widget->dapm);
+
+       ret = snd_soc_update_bits_locked(widget->codec, reg, val_mask, val);
        return ret;
 }