ASoC: wm8990: Convert to snd_soc_cache_sync for sync reg_cache with the hardware
Subsystems (3)
RFC PATCH 1/1 ASoC: wm8990: Convert to snd_soc_cache_sync for sync reg_cache with the hardware
Signed-off-by Axel Lin <[email protected]>
---
I don't have this hardware, this patch is UNTESTED!! ( But current code is broken anyway )
I'd appreciate if someone can test it.
Axel
sound/soc/codecs/wm8990.c | 32 +++++++++++++++++++------------- 1 files changed, 19 insertions(+), 13 deletions(-)
sound/soc/codecs/wm8990.c +19 -13
@@ -36,6 +36,17 @@ struct wm8990_priv {unsigned int pcmclk; }; +static int wm8990_volatile_register (struct snd_soc_codec *codec, +unsigned int reg) +{ +switch (reg) { +case WM8990_RESET : +return 1 ; +default : +return 0 ; + } +} +/* * wm8990 register cache. Note that register 0 is not included in the * cache.
@@ -1156,6 +1167,7 @@ static int wm8990_mute(struct snd_soc_dai *dai, int mute)static int wm8990_set_bias_level (struct snd_soc_codec *codec,enum snd_soc_bias_level level) { +int ret;u16 val;switch (level) {
@@ -1171,6 +1183,12 @@ static int wm8990_set_bias_level(struct snd_soc_codec *codec,case SND_SOC_BIAS_STANDBY :if (codec->dapm.bias_level ==SND_SOC_BIAS_OFF ) { + ret =snd_soc_cache_sync (codec); +if (ret <0 ) { +dev_err (codec->dev,"Failed to sync cache: %d\n" , ret); +return ret; + } +/* Enable all output discharge bits */ snd_soc_write(codec, WM8990_ANTIPOP1, WM8990_DIS_LLINE | WM8990_DIS_RLINE | WM8990_DIS_OUT3 |
@@ -1319,19 +1337,6 @@ static int wm8990_suspend(struct snd_soc_codec *codec, pm_message_t state)static int wm8990_resume (struct snd_soc_codec *codec) { -int i; -u8 data[2 ]; -u16 *cache = codec->reg_cache; - -/* Sync reg_cache with the hardware */ -for (i =0 ; i <ARRAY_SIZE (wm8990_reg); i++) { -if (i +1 ==WM8990_RESET ) -continue ; - data[0 ] = ((i +1 ) <<1 ) | ((cache[i] >>8 ) &0x0001 ); - data[1 ] = cache[i] &0x00ff ; - codec->hw_write (codec->control_data, data,2 ); - } -wm8990_set_bias_level (codec,SND_SOC_BIAS_STANDBY );return 0 ; }
@@ -1392,6 +1397,7 @@ static struct snd_soc_codec_driver soc_codec_dev_wm8990 = { .reg_cache_size = ARRAY_SIZE(wm8990_reg), .reg_word_size = sizeof(u16), .reg_cache_default = wm8990_reg, + .volatile_register = wm8990_volatile_register, };#if defined(CONFIG_I2C ) || defined(CONFIG_I2C_MODULE )
Signature · 1 line
1.7.4.1
PATCH 1/1 ASoC: wm8990: Remove incorrect comments
Signed-off-by Axel Lin <[email protected]>
--- sound/soc/codecs/wm8990.c | 4 ---- 1 files changed, 0 insertions(+), 4 deletions(-)
sound/soc/codecs/wm8990.c +0 -4
@@ -47,10 +47,6 @@ static int wm8990_volatile_register(struct snd_soc_codec *codec, } } -/* -* wm8990 register cache. Note that register 0 is not included in the -* cache. -*/ static const u16 wm8990_reg[] = {0x8990 ,/* R0 - Reset */ 0x0000 ,/* R1 - Power Management (1) */
Signature · 1 line
1.7.4.1