summaryrefslogtreecommitdiffstats
path: root/extras/recipes-kernel/linux/linux-omap/linus/0020-ASoC-codecs-wm8741-Fix-register-cache-incoherency.patch
diff options
context:
space:
mode:
Diffstat (limited to 'extras/recipes-kernel/linux/linux-omap/linus/0020-ASoC-codecs-wm8741-Fix-register-cache-incoherency.patch')
-rw-r--r--extras/recipes-kernel/linux/linux-omap/linus/0020-ASoC-codecs-wm8741-Fix-register-cache-incoherency.patch61
1 files changed, 61 insertions, 0 deletions
diff --git a/extras/recipes-kernel/linux/linux-omap/linus/0020-ASoC-codecs-wm8741-Fix-register-cache-incoherency.patch b/extras/recipes-kernel/linux/linux-omap/linus/0020-ASoC-codecs-wm8741-Fix-register-cache-incoherency.patch
new file mode 100644
index 00000000..f4ee49eb
--- /dev/null
+++ b/extras/recipes-kernel/linux/linux-omap/linus/0020-ASoC-codecs-wm8741-Fix-register-cache-incoherency.patch
@@ -0,0 +1,61 @@
1From ed4250725ac617b420d25e2b4ca0958818a7cde9 Mon Sep 17 00:00:00 2001
2From: Lars-Peter Clausen <lars@metafoo.de>
3Date: Tue, 28 Dec 2010 21:37:58 +0100
4Subject: [PATCH 20/65] ASoC: codecs: wm8741: Fix register cache incoherency
5
6The multi-component patch(commit f0fba2ad1) moved the allocation of the
7register cache from the driver to the ASoC core. Most drivers where adjusted to
8this, but the wm8741 driver still uses its own register cache for its
9private functions, while functions from the ASoC core use the generic cache.
10Thus we end up with two from each other incoherent caches, which can lead to
11undefined behaviour.
12This patch fixes the issue by changing the wm8741 driver to use the
13generic register cache in its private functions.
14
15Signed-off-by: Lars-Peter Clausen <lars@metafoo.de>
16Cc: Ian Lartey <ian@opensource.wolfsonmicro.com>
17Cc: Dimitris Papastamos <dp@opensource.wolfsonmicro.com>
18Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
19Cc: stable@kernel.org (for 2.6.37 only)
20---
21 sound/soc/codecs/wm8741.c | 10 +++++-----
22 1 files changed, 5 insertions(+), 5 deletions(-)
23
24diff --git a/sound/soc/codecs/wm8741.c b/sound/soc/codecs/wm8741.c
25index 90e31e9..aea60ef 100644
26--- a/sound/soc/codecs/wm8741.c
27+++ b/sound/soc/codecs/wm8741.c
28@@ -41,7 +41,6 @@ static const char *wm8741_supply_names[WM8741_NUM_SUPPLIES] = {
29 /* codec private data */
30 struct wm8741_priv {
31 enum snd_soc_control_type control_type;
32- u16 reg_cache[WM8741_REGISTER_COUNT];
33 struct regulator_bulk_data supplies[WM8741_NUM_SUPPLIES];
34 unsigned int sysclk;
35 struct snd_pcm_hw_constraint_list *sysclk_constraints;
36@@ -422,6 +421,7 @@ static int wm8741_resume(struct snd_soc_codec *codec)
37 static int wm8741_probe(struct snd_soc_codec *codec)
38 {
39 struct wm8741_priv *wm8741 = snd_soc_codec_get_drvdata(codec);
40+ u16 *reg_cache = codec->reg_cache;
41 int ret = 0;
42
43 ret = snd_soc_codec_set_cache_io(codec, 7, 9, wm8741->control_type);
44@@ -437,10 +437,10 @@ static int wm8741_probe(struct snd_soc_codec *codec)
45 }
46
47 /* Change some default settings - latch VU */
48- wm8741->reg_cache[WM8741_DACLLSB_ATTENUATION] |= WM8741_UPDATELL;
49- wm8741->reg_cache[WM8741_DACLMSB_ATTENUATION] |= WM8741_UPDATELM;
50- wm8741->reg_cache[WM8741_DACRLSB_ATTENUATION] |= WM8741_UPDATERL;
51- wm8741->reg_cache[WM8741_DACRLSB_ATTENUATION] |= WM8741_UPDATERM;
52+ reg_cache[WM8741_DACLLSB_ATTENUATION] |= WM8741_UPDATELL;
53+ reg_cache[WM8741_DACLMSB_ATTENUATION] |= WM8741_UPDATELM;
54+ reg_cache[WM8741_DACRLSB_ATTENUATION] |= WM8741_UPDATERL;
55+ reg_cache[WM8741_DACRLSB_ATTENUATION] |= WM8741_UPDATERM;
56
57 snd_soc_add_controls(codec, wm8741_snd_controls,
58 ARRAY_SIZE(wm8741_snd_controls));
59--
601.6.6.1
61