aboutsummaryrefslogtreecommitdiffstats
path: root/extras/recipes-kernel/linux/linux-omap/linus/0022-ASoC-codecs-wm8955-Fix-register-cache-incoherency.patch
diff options
context:
space:
mode:
Diffstat (limited to 'extras/recipes-kernel/linux/linux-omap/linus/0022-ASoC-codecs-wm8955-Fix-register-cache-incoherency.patch')
-rw-r--r--extras/recipes-kernel/linux/linux-omap/linus/0022-ASoC-codecs-wm8955-Fix-register-cache-incoherency.patch107
1 files changed, 107 insertions, 0 deletions
diff --git a/extras/recipes-kernel/linux/linux-omap/linus/0022-ASoC-codecs-wm8955-Fix-register-cache-incoherency.patch b/extras/recipes-kernel/linux/linux-omap/linus/0022-ASoC-codecs-wm8955-Fix-register-cache-incoherency.patch
new file mode 100644
index 00000000..420b4cc2
--- /dev/null
+++ b/extras/recipes-kernel/linux/linux-omap/linus/0022-ASoC-codecs-wm8955-Fix-register-cache-incoherency.patch
@@ -0,0 +1,107 @@
+From 8febc5cbe3b8d4a4a056df364e4a82958a6eb1df Mon Sep 17 00:00:00 2001
+From: Lars-Peter Clausen <lars@metafoo.de>
+Date: Tue, 28 Dec 2010 21:38:00 +0100
+Subject: [PATCH 22/65] ASoC: codecs: wm8955: Fix register cache incoherency
+
+The multi-component patch(commit f0fba2ad1) moved the allocation of the
+register cache from the driver to the ASoC core. Most drivers where adjusted to
+this, but the wm8955 driver still uses its own register cache for its
+private functions, while functions from the ASoC core use the generic cache.
+Thus we end up with two from each other incoherent caches, which can lead to
+undefined behaviour.
+This patch fixes the issue by changing the wm8955 driver to use the
+generic register cache in its private functions.
+
+Signed-off-by: Lars-Peter Clausen <lars@metafoo.de>
+Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
+Cc: stable@kernel.org (for 2.6.37 only)
+---
+ sound/soc/codecs/wm8955.c | 30 +++++++++++++++---------------
+ 1 files changed, 15 insertions(+), 15 deletions(-)
+
+diff --git a/sound/soc/codecs/wm8955.c b/sound/soc/codecs/wm8955.c
+index a2ad91d..2ac35b0 100644
+--- a/sound/soc/codecs/wm8955.c
++++ b/sound/soc/codecs/wm8955.c
+@@ -42,8 +42,6 @@ static const char *wm8955_supply_names[WM8955_NUM_SUPPLIES] = {
+ struct wm8955_priv {
+ enum snd_soc_control_type control_type;
+
+- u16 reg_cache[WM8955_MAX_REGISTER + 1];
+-
+ unsigned int mclk_rate;
+
+ int deemph;
+@@ -768,6 +766,7 @@ static int wm8955_set_bias_level(struct snd_soc_codec *codec,
+ enum snd_soc_bias_level level)
+ {
+ struct wm8955_priv *wm8955 = snd_soc_codec_get_drvdata(codec);
++ u16 *reg_cache = codec->reg_cache;
+ int ret, i;
+
+ switch (level) {
+@@ -800,14 +799,14 @@ static int wm8955_set_bias_level(struct snd_soc_codec *codec,
+ /* Sync back cached values if they're
+ * different from the hardware default.
+ */
+- for (i = 0; i < ARRAY_SIZE(wm8955->reg_cache); i++) {
++ for (i = 0; i < codec->driver->reg_cache_size; i++) {
+ if (i == WM8955_RESET)
+ continue;
+
+- if (wm8955->reg_cache[i] == wm8955_reg[i])
++ if (reg_cache[i] == wm8955_reg[i])
+ continue;
+
+- snd_soc_write(codec, i, wm8955->reg_cache[i]);
++ snd_soc_write(codec, i, reg_cache[i]);
+ }
+
+ /* Enable VREF and VMID */
+@@ -902,6 +901,7 @@ static int wm8955_probe(struct snd_soc_codec *codec)
+ {
+ struct wm8955_priv *wm8955 = snd_soc_codec_get_drvdata(codec);
+ struct wm8955_pdata *pdata = dev_get_platdata(codec->dev);
++ u16 *reg_cache = codec->reg_cache;
+ int ret, i;
+
+ ret = snd_soc_codec_set_cache_io(codec, 7, 9, wm8955->control_type);
+@@ -934,25 +934,25 @@ static int wm8955_probe(struct snd_soc_codec *codec)
+ }
+
+ /* Change some default settings - latch VU and enable ZC */
+- wm8955->reg_cache[WM8955_LEFT_DAC_VOLUME] |= WM8955_LDVU;
+- wm8955->reg_cache[WM8955_RIGHT_DAC_VOLUME] |= WM8955_RDVU;
+- wm8955->reg_cache[WM8955_LOUT1_VOLUME] |= WM8955_LO1VU | WM8955_LO1ZC;
+- wm8955->reg_cache[WM8955_ROUT1_VOLUME] |= WM8955_RO1VU | WM8955_RO1ZC;
+- wm8955->reg_cache[WM8955_LOUT2_VOLUME] |= WM8955_LO2VU | WM8955_LO2ZC;
+- wm8955->reg_cache[WM8955_ROUT2_VOLUME] |= WM8955_RO2VU | WM8955_RO2ZC;
+- wm8955->reg_cache[WM8955_MONOOUT_VOLUME] |= WM8955_MOZC;
++ reg_cache[WM8955_LEFT_DAC_VOLUME] |= WM8955_LDVU;
++ reg_cache[WM8955_RIGHT_DAC_VOLUME] |= WM8955_RDVU;
++ reg_cache[WM8955_LOUT1_VOLUME] |= WM8955_LO1VU | WM8955_LO1ZC;
++ reg_cache[WM8955_ROUT1_VOLUME] |= WM8955_RO1VU | WM8955_RO1ZC;
++ reg_cache[WM8955_LOUT2_VOLUME] |= WM8955_LO2VU | WM8955_LO2ZC;
++ reg_cache[WM8955_ROUT2_VOLUME] |= WM8955_RO2VU | WM8955_RO2ZC;
++ reg_cache[WM8955_MONOOUT_VOLUME] |= WM8955_MOZC;
+
+ /* Also enable adaptive bass boost by default */
+- wm8955->reg_cache[WM8955_BASS_CONTROL] |= WM8955_BB;
++ reg_cache[WM8955_BASS_CONTROL] |= WM8955_BB;
+
+ /* Set platform data values */
+ if (pdata) {
+ if (pdata->out2_speaker)
+- wm8955->reg_cache[WM8955_ADDITIONAL_CONTROL_2]
++ reg_cache[WM8955_ADDITIONAL_CONTROL_2]
+ |= WM8955_ROUT2INV;
+
+ if (pdata->monoin_diff)
+- wm8955->reg_cache[WM8955_MONO_OUT_MIX_1]
++ reg_cache[WM8955_MONO_OUT_MIX_1]
+ |= WM8955_DMEN;
+ }
+
+--
+1.6.6.1
+