Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 182879
b: refs/heads/master
c: c133421
h: refs/heads/master
i:
  182877: 5eef7e5
  182875: 1991d60
  182871: c23985f
  182863: 14d64a6
  182847: d1a1c04
v: v3
  • Loading branch information
Mark Brown committed Feb 4, 2010
1 parent 0be3f9f commit 7a0fc33
Show file tree
Hide file tree
Showing 2 changed files with 40 additions and 14 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: cf56f62746c3e2f70bfad3d6fd051427a0022368
refs/heads/master: c133421800d9d1dfec0c98de6c9da0a7a99e0573
52 changes: 39 additions & 13 deletions trunk/sound/soc/codecs/wm8904.c
Original file line number Diff line number Diff line change
Expand Up @@ -2033,11 +2033,37 @@ static int wm8904_digital_mute(struct snd_soc_dai *codec_dai, int mute)
return 0;
}

static void wm8904_sync_cache(struct snd_soc_codec *codec)
{
struct wm8904_priv *wm8904 = codec->private_data;
int i;

if (!codec->cache_sync)
return;

codec->cache_only = 0;

/* Sync back cached values if they're different from the
* hardware default.
*/
for (i = 1; i < ARRAY_SIZE(wm8904->reg_cache); i++) {
if (!wm8904_access[i].writable)
continue;

if (wm8904->reg_cache[i] == wm8904_reg[i])
continue;

snd_soc_write(codec, i, wm8904->reg_cache[i]);
}

codec->cache_sync = 0;
}

static int wm8904_set_bias_level(struct snd_soc_codec *codec,
enum snd_soc_bias_level level)
{
struct wm8904_priv *wm8904 = codec->private_data;
int ret, i;
int ret;

switch (level) {
case SND_SOC_BIAS_ON:
Expand Down Expand Up @@ -2065,18 +2091,7 @@ static int wm8904_set_bias_level(struct snd_soc_codec *codec,
return ret;
}

/* Sync back cached values if they're
* different from the hardware default.
*/
for (i = 1; i < ARRAY_SIZE(wm8904->reg_cache); i++) {
if (!wm8904_access[i].writable)
continue;

if (wm8904->reg_cache[i] == wm8904_reg[i])
continue;

snd_soc_write(codec, i, wm8904->reg_cache[i]);
}
wm8904_sync_cache(codec);

/* Enable bias */
snd_soc_update_bits(codec, WM8904_BIAS_CONTROL_0,
Expand Down Expand Up @@ -2112,6 +2127,15 @@ static int wm8904_set_bias_level(struct snd_soc_codec *codec,
snd_soc_update_bits(codec, WM8904_BIAS_CONTROL_0,
WM8904_BIAS_ENA, 0);

#ifdef CONFIG_REGULATOR
/* Post 2.6.34 we will be able to get a callback when
* the regulators are disabled which we can use but
* for now just assume that the power will be cut if
* the regulator API is in use.
*/
codec->cache_sync = 1;
#endif

regulator_bulk_disable(ARRAY_SIZE(wm8904->supplies),
wm8904->supplies);
break;
Expand Down Expand Up @@ -2365,6 +2389,8 @@ static int wm8904_register(struct wm8904_priv *wm8904,
codec->reg_cache_size = WM8904_MAX_REGISTER;
codec->reg_cache = &wm8904->reg_cache;
codec->volatile_register = wm8904_volatile_register;
codec->cache_sync = 1;
codec->idle_bias_off = 1;

memcpy(codec->reg_cache, wm8904_reg, sizeof(wm8904_reg));

Expand Down

0 comments on commit 7a0fc33

Please sign in to comment.