brcm2708: update to latest patches from RPi foundation
[openwrt/staging/chunkeey.git] / target / linux / brcm2708 / patches-4.19 / 950-0293-ASoC-pcm512x-Fix-a-double-unlock-in-pcm512x_digital_.patch
diff --git a/target/linux/brcm2708/patches-4.19/950-0293-ASoC-pcm512x-Fix-a-double-unlock-in-pcm512x_digital_.patch b/target/linux/brcm2708/patches-4.19/950-0293-ASoC-pcm512x-Fix-a-double-unlock-in-pcm512x_digital_.patch
new file mode 100644 (file)
index 0000000..f1a09c4
--- /dev/null
@@ -0,0 +1,62 @@
+From 26001d54a7f803258b161f25f457ce11523695d7 Mon Sep 17 00:00:00 2001
+From: Dan Carpenter <dan.carpenter@oracle.com>
+Date: Fri, 21 Dec 2018 12:11:20 +0300
+Subject: [PATCH] ASoC: pcm512x: Fix a double unlock in
+ 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,