2019-09-19 14:43:19 +00:00
|
|
|
From 26001d54a7f803258b161f25f457ce11523695d7 Mon Sep 17 00:00:00 2001
|
2019-07-09 18:32:28 +00:00
|
|
|
From: Dan Carpenter <dan.carpenter@oracle.com>
|
|
|
|
Date: Fri, 21 Dec 2018 12:11:20 +0300
|
2019-12-23 12:42:55 +00:00
|
|
|
Subject: [PATCH] ASoC: pcm512x: Fix a double unlock in
|
2019-07-09 18:32:28 +00:00
|
|
|
pcm512x_digital_mute()
|
|
|
|
|
|
|
|
[ Upstream commit 28b698b7342c7d5300cfe217cd77ff7d2a55e03d ]
|
|
|
|
|
|
|
|
We accidentally call mutex_unlock(&pcm512x->mutex); twice in a row.
|
|
|
|
|
|
|
|
I re-wrote the error handling to use "goto unlock;" instead of returning
|
|
|
|
directly. Hopefully, it makes the code a little simpler.
|
|
|
|
|
|
|
|
Fixes: 3500f1c589e9 ("ASoC: pcm512x: Implement the digital_mute interface")
|
|
|
|
Signed-off-by: Dan Carpenter <dan.carpenter@oracle.com>
|
|
|
|
Reviwed-by: Dimitris Papavasiliou <dpapavas@gmail.com>
|
|
|
|
Signed-off-by: Mark Brown <broonie@kernel.org>
|
|
|
|
---
|
|
|
|
sound/soc/codecs/pcm512x.c | 11 ++++-------
|
|
|
|
1 file changed, 4 insertions(+), 7 deletions(-)
|
|
|
|
|
|
|
|
--- a/sound/soc/codecs/pcm512x.c
|
|
|
|
+++ b/sound/soc/codecs/pcm512x.c
|
|
|
|
@@ -1404,24 +1404,20 @@ static int pcm512x_digital_mute(struct s
|
|
|
|
if (ret != 0) {
|
|
|
|
dev_err(component->dev,
|
|
|
|
"Failed to set digital mute: %d\n", ret);
|
|
|
|
- mutex_unlock(&pcm512x->mutex);
|
|
|
|
- return ret;
|
|
|
|
+ goto unlock;
|
|
|
|
}
|
|
|
|
|
|
|
|
regmap_read_poll_timeout(pcm512x->regmap,
|
|
|
|
PCM512x_ANALOG_MUTE_DET,
|
|
|
|
mute_det, (mute_det & 0x3) == 0,
|
|
|
|
200, 10000);
|
|
|
|
-
|
|
|
|
- mutex_unlock(&pcm512x->mutex);
|
|
|
|
} else {
|
|
|
|
pcm512x->mute &= ~0x1;
|
|
|
|
ret = pcm512x_update_mute(pcm512x);
|
|
|
|
if (ret != 0) {
|
|
|
|
dev_err(component->dev,
|
|
|
|
"Failed to update digital mute: %d\n", ret);
|
|
|
|
- mutex_unlock(&pcm512x->mutex);
|
|
|
|
- return ret;
|
|
|
|
+ goto unlock;
|
|
|
|
}
|
|
|
|
|
|
|
|
regmap_read_poll_timeout(pcm512x->regmap,
|
|
|
|
@@ -1432,9 +1428,10 @@ static int pcm512x_digital_mute(struct s
|
|
|
|
200, 10000);
|
|
|
|
}
|
|
|
|
|
|
|
|
+unlock:
|
|
|
|
mutex_unlock(&pcm512x->mutex);
|
|
|
|
|
|
|
|
- return 0;
|
|
|
|
+ return ret;
|
|
|
|
}
|
|
|
|
|
|
|
|
static int pcm512x_set_tdm_slot(struct snd_soc_dai *dai,
|