diff options
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.patch | 61 |
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 @@ +From ed4250725ac617b420d25e2b4ca0958818a7cde9 Mon Sep 17 00:00:00 2001 +From: Lars-Peter Clausen <lars@metafoo.de> +Date: Tue, 28 Dec 2010 21:37:58 +0100 +Subject: [PATCH 20/65] ASoC: codecs: wm8741: 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 wm8741 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 wm8741 driver to use the +generic register cache in its private functions. + +Signed-off-by: Lars-Peter Clausen <lars@metafoo.de> +Cc: Ian Lartey <ian@opensource.wolfsonmicro.com> +Cc: Dimitris Papastamos <dp@opensource.wolfsonmicro.com> +Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com> +Cc: stable@kernel.org (for 2.6.37 only) +--- + sound/soc/codecs/wm8741.c | 10 +++++----- + 1 files changed, 5 insertions(+), 5 deletions(-) + +diff --git a/sound/soc/codecs/wm8741.c b/sound/soc/codecs/wm8741.c +index 90e31e9..aea60ef 100644 +--- a/sound/soc/codecs/wm8741.c ++++ b/sound/soc/codecs/wm8741.c +@@ -41,7 +41,6 @@ static const char *wm8741_supply_names[WM8741_NUM_SUPPLIES] = { + /* codec private data */ + struct wm8741_priv { + enum snd_soc_control_type control_type; +- u16 reg_cache[WM8741_REGISTER_COUNT]; + struct regulator_bulk_data supplies[WM8741_NUM_SUPPLIES]; + unsigned int sysclk; + struct snd_pcm_hw_constraint_list *sysclk_constraints; +@@ -422,6 +421,7 @@ static int wm8741_resume(struct snd_soc_codec *codec) + static int wm8741_probe(struct snd_soc_codec *codec) + { + struct wm8741_priv *wm8741 = snd_soc_codec_get_drvdata(codec); ++ u16 *reg_cache = codec->reg_cache; + int ret = 0; + + ret = snd_soc_codec_set_cache_io(codec, 7, 9, wm8741->control_type); +@@ -437,10 +437,10 @@ static int wm8741_probe(struct snd_soc_codec *codec) + } + + /* Change some default settings - latch VU */ +- wm8741->reg_cache[WM8741_DACLLSB_ATTENUATION] |= WM8741_UPDATELL; +- wm8741->reg_cache[WM8741_DACLMSB_ATTENUATION] |= WM8741_UPDATELM; +- wm8741->reg_cache[WM8741_DACRLSB_ATTENUATION] |= WM8741_UPDATERL; +- wm8741->reg_cache[WM8741_DACRLSB_ATTENUATION] |= WM8741_UPDATERM; ++ reg_cache[WM8741_DACLLSB_ATTENUATION] |= WM8741_UPDATELL; ++ reg_cache[WM8741_DACLMSB_ATTENUATION] |= WM8741_UPDATELM; ++ reg_cache[WM8741_DACRLSB_ATTENUATION] |= WM8741_UPDATERL; ++ reg_cache[WM8741_DACRLSB_ATTENUATION] |= WM8741_UPDATERM; + + snd_soc_add_controls(codec, wm8741_snd_controls, + ARRAY_SIZE(wm8741_snd_controls)); +-- +1.6.6.1 + |