diff options
Diffstat (limited to 'recipes/linux/linux-omap-2.6.37/linus/0019-ASoC-codecs-wm8523-Fix-register-cache-incoherency.patch')
-rw-r--r-- | recipes/linux/linux-omap-2.6.37/linus/0019-ASoC-codecs-wm8523-Fix-register-cache-incoherency.patch | 74 |
1 files changed, 74 insertions, 0 deletions
diff --git a/recipes/linux/linux-omap-2.6.37/linus/0019-ASoC-codecs-wm8523-Fix-register-cache-incoherency.patch b/recipes/linux/linux-omap-2.6.37/linus/0019-ASoC-codecs-wm8523-Fix-register-cache-incoherency.patch new file mode 100644 index 0000000000..6d40a00458 --- /dev/null +++ b/recipes/linux/linux-omap-2.6.37/linus/0019-ASoC-codecs-wm8523-Fix-register-cache-incoherency.patch @@ -0,0 +1,74 @@ +From beebca312009e9567d5e0229ea6b82bdf9a864cf Mon Sep 17 00:00:00 2001 +From: Lars-Peter Clausen <lars@metafoo.de> +Date: Tue, 28 Dec 2010 21:37:57 +0100 +Subject: [PATCH 19/66] ASoC: codecs: wm8523: 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 wm8523 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 wm8523 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/wm8523.c | 9 +++++---- + 1 files changed, 5 insertions(+), 4 deletions(-) + +diff --git a/sound/soc/codecs/wm8523.c b/sound/soc/codecs/wm8523.c +index 9a433a5..deca79e 100644 +--- a/sound/soc/codecs/wm8523.c ++++ b/sound/soc/codecs/wm8523.c +@@ -41,7 +41,6 @@ static const char *wm8523_supply_names[WM8523_NUM_SUPPLIES] = { + /* codec private data */ + struct wm8523_priv { + enum snd_soc_control_type control_type; +- u16 reg_cache[WM8523_REGISTER_COUNT]; + struct regulator_bulk_data supplies[WM8523_NUM_SUPPLIES]; + unsigned int sysclk; + unsigned int rate_constraint_list[WM8523_NUM_RATES]; +@@ -314,6 +313,7 @@ static int wm8523_set_bias_level(struct snd_soc_codec *codec, + enum snd_soc_bias_level level) + { + struct wm8523_priv *wm8523 = snd_soc_codec_get_drvdata(codec); ++ u16 *reg_cache = codec->reg_cache; + int ret, i; + + switch (level) { +@@ -344,7 +344,7 @@ static int wm8523_set_bias_level(struct snd_soc_codec *codec, + /* Sync back default/cached values */ + for (i = WM8523_AIF_CTRL1; + i < WM8523_MAX_REGISTER; i++) +- snd_soc_write(codec, i, wm8523->reg_cache[i]); ++ snd_soc_write(codec, i, reg_cache[i]); + + + msleep(100); +@@ -414,6 +414,7 @@ static int wm8523_resume(struct snd_soc_codec *codec) + static int wm8523_probe(struct snd_soc_codec *codec) + { + struct wm8523_priv *wm8523 = snd_soc_codec_get_drvdata(codec); ++ u16 *reg_cache = codec->reg_cache; + int ret, i; + + codec->hw_write = (hw_write_t)i2c_master_send; +@@ -470,8 +471,8 @@ static int wm8523_probe(struct snd_soc_codec *codec) + } + + /* Change some default settings - latch VU and enable ZC */ +- wm8523->reg_cache[WM8523_DAC_GAINR] |= WM8523_DACR_VU; +- wm8523->reg_cache[WM8523_DAC_CTRL3] |= WM8523_ZC; ++ reg_cache[WM8523_DAC_GAINR] |= WM8523_DACR_VU; ++ reg_cache[WM8523_DAC_CTRL3] |= WM8523_ZC; + + wm8523_set_bias_level(codec, SND_SOC_BIAS_STANDBY); + +-- +1.6.6.1 + |