ASoC: wm8994: Prevent double lock of accdet_lock mutex on wm1811
Subsystems (3)
PATCH 1/1 ASoC: wm8994: Prevent double lock of accdet_lock mutex on wm1811
wm1811_micd_stop takes the accdet_lock mutex, and is called from two places, one of which is already holding the accdet_lock. This obviously causes a lock up.
This patch fixes this issue by removing the lock from wm1811_micd_stop and ensuring that it is always locked externally.
Signed-off-by Charles Keepax <[email protected]>
--- sound/soc/codecs/wm8994.c | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-)
sound/soc/codecs/wm8994.c +3 -6
@@ -3505,6 +3505,7 @@ static irqreturn_t wm8994_mic_irq(int irq, void *data)return IRQ_HANDLED ; } +/* Should be called with accdet_lock held */ static void wm1811_micd_stop (struct snd_soc_codec *codec) {struct wm8994_priv *wm8994 =snd_soc_codec_get_drvdata (codec);
@@ -3512,14 +3513,10 @@ static void wm1811_micd_stop(struct snd_soc_codec *codec)if (!wm8994->jackdet)return ; -mutex_lock (&wm8994->accdet_lock); -snd_soc_update_bits (codec,WM8958_MIC_DETECT_1 ,WM8958_MICD_ENA ,0 );wm1811_jackdet_set_mode (codec,WM1811_JACKDET_MODE_JACK ); -mutex_unlock (&wm8994->accdet_lock); -if (wm8994->wm8994->pdata.jd_ext_cap)snd_soc_dapm_disable_pin (&codec->dapm,"MICBIAS2" );
@@ -3560,10 +3557,10 @@ static void wm8958_open_circuit_work(struct work_struct *work) open_circuit_work.work);struct device *dev = wm8994->wm8994->dev; -wm1811_micd_stop (wm8994->hubs.codec); -mutex_lock (&wm8994->accdet_lock); +wm1811_micd_stop (wm8994->hubs.codec); +dev_dbg (dev,"Reporting open circuit\n" ); wm8994->jack_mic = false;
Signature · 1 line
1.7.9.5
Quoted 3 lines · Charles Keepax
wm1811_micd_stoptakes theaccdet_lockmutex, and is called from two places, one of which is already holding theaccdet_lock. This obviously causes a lock up.
Applied, thanks.