Skip to content

Commit

Permalink
ASoC: Allow CODECs to ask soc-cache to suppress physical writes
Browse files Browse the repository at this point in the history
Currently the soc-cache code will always write to the device, meaning
that we need the device to be powered and active at pretty much all
times the system is active.  Allowing cache only writes lays some
groundwork for future enhancements to allow devices to be put into a
full off state when the audio subsystem is idle.

Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
Acked-by: Liam Girdwood <lrg@slimlogic.co.uk>
  • Loading branch information
Mark Brown committed Feb 3, 2010
1 parent 0f69d97 commit 8c961bc
Show file tree
Hide file tree
Showing 2 changed files with 25 additions and 2 deletions.
1 change: 1 addition & 0 deletions include/sound/soc.h
Original file line number Diff line number Diff line change
Expand Up @@ -423,6 +423,7 @@ struct snd_soc_codec {
short reg_cache_step;

unsigned int idle_bias_off:1; /* Use BIAS_OFF instead of STANDBY */
unsigned int cache_only:1; /* Suppress writes to hardware */

/* dapm */
u32 pop_time;
Expand Down
26 changes: 24 additions & 2 deletions sound/soc/soc-cache.c
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,10 @@ static int snd_soc_4_12_write(struct snd_soc_codec *codec, unsigned int reg,

if (reg < codec->reg_cache_size)
cache[reg] = value;

if (codec->cache_only)
return 0;

ret = codec->hw_write(codec->control_data, data, 2);
if (ret == 2)
return 0;
Expand Down Expand Up @@ -100,6 +104,10 @@ static int snd_soc_7_9_write(struct snd_soc_codec *codec, unsigned int reg,

if (reg < codec->reg_cache_size)
cache[reg] = value;

if (codec->cache_only)
return 0;

ret = codec->hw_write(codec->control_data, data, 2);
if (ret == 2)
return 0;
Expand Down Expand Up @@ -153,6 +161,9 @@ static int snd_soc_8_8_write(struct snd_soc_codec *codec, unsigned int reg,
if (reg < codec->reg_cache_size)
cache[reg] = value;

if (codec->cache_only)
return 0;

if (codec->hw_write(codec->control_data, data, 2) == 2)
return 0;
else
Expand Down Expand Up @@ -181,6 +192,9 @@ static int snd_soc_8_16_write(struct snd_soc_codec *codec, unsigned int reg,
if (!snd_soc_codec_volatile_register(codec, reg))
reg_cache[reg] = value;

if (codec->cache_only)
return 0;

if (codec->hw_write(codec->control_data, data, 3) == 3)
return 0;
else
Expand All @@ -193,10 +207,14 @@ static unsigned int snd_soc_8_16_read(struct snd_soc_codec *codec,
u16 *cache = codec->reg_cache;

if (reg >= codec->reg_cache_size ||
snd_soc_codec_volatile_register(codec, reg))
snd_soc_codec_volatile_register(codec, reg)) {
if (codec->cache_only)
return -EINVAL;

return codec->hw_read(codec, reg);
else
} else {
return cache[reg];
}
}

#if defined(CONFIG_I2C) || (defined(CONFIG_I2C_MODULE) && defined(MODULE))
Expand Down Expand Up @@ -294,6 +312,10 @@ static int snd_soc_16_8_write(struct snd_soc_codec *codec, unsigned int reg,
reg &= 0xff;
if (reg < codec->reg_cache_size)
cache[reg] = value;

if (codec->cache_only)
return 0;

ret = codec->hw_write(codec->control_data, data, 3);
if (ret == 3)
return 0;
Expand Down

0 comments on commit 8c961bc

Please sign in to comment.