diff options
author | Mark Brown <broonie@opensource.wolfsonmicro.com> | 2010-02-01 13:48:03 -0500 |
---|---|---|
committer | Mark Brown <broonie@opensource.wolfsonmicro.com> | 2010-02-04 05:40:45 -0500 |
commit | a3032b47c46920ed3f2fd58e64f484e3dab49f23 (patch) | |
tree | cdc6099c15a31c6fa2bae26e38da7fde7a1a3aa1 /sound | |
parent | 8c961bcca1d10be4f2c06375eb561679167653a0 (diff) |
ASoC: Add a cache_sync bit to the CODEC structure
Add a bit to the CODEC structure indicating if a cache sync is required.
By default this will be set if a cache only write is done to a soc-cache
register cache. This allows us to avoid syncing the cache back after
using cache only writes if there were no changes.
Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
Acked-by: Liam Girdwood <lrg@slimlogic.co.uk>
Diffstat (limited to 'sound')
-rw-r--r-- | sound/soc/soc-cache.c | 20 |
1 files changed, 15 insertions, 5 deletions
diff --git a/sound/soc/soc-cache.c b/sound/soc/soc-cache.c index 84b6916db87d..5869dc3be781 100644 --- a/sound/soc/soc-cache.c +++ b/sound/soc/soc-cache.c | |||
@@ -39,8 +39,10 @@ static int snd_soc_4_12_write(struct snd_soc_codec *codec, unsigned int reg, | |||
39 | if (reg < codec->reg_cache_size) | 39 | if (reg < codec->reg_cache_size) |
40 | cache[reg] = value; | 40 | cache[reg] = value; |
41 | 41 | ||
42 | if (codec->cache_only) | 42 | if (codec->cache_only) { |
43 | codec->cache_sync = 1; | ||
43 | return 0; | 44 | return 0; |
45 | } | ||
44 | 46 | ||
45 | ret = codec->hw_write(codec->control_data, data, 2); | 47 | ret = codec->hw_write(codec->control_data, data, 2); |
46 | if (ret == 2) | 48 | if (ret == 2) |
@@ -105,8 +107,10 @@ static int snd_soc_7_9_write(struct snd_soc_codec *codec, unsigned int reg, | |||
105 | if (reg < codec->reg_cache_size) | 107 | if (reg < codec->reg_cache_size) |
106 | cache[reg] = value; | 108 | cache[reg] = value; |
107 | 109 | ||
108 | if (codec->cache_only) | 110 | if (codec->cache_only) { |
111 | codec->cache_sync = 1; | ||
109 | return 0; | 112 | return 0; |
113 | } | ||
110 | 114 | ||
111 | ret = codec->hw_write(codec->control_data, data, 2); | 115 | ret = codec->hw_write(codec->control_data, data, 2); |
112 | if (ret == 2) | 116 | if (ret == 2) |
@@ -161,8 +165,10 @@ static int snd_soc_8_8_write(struct snd_soc_codec *codec, unsigned int reg, | |||
161 | if (reg < codec->reg_cache_size) | 165 | if (reg < codec->reg_cache_size) |
162 | cache[reg] = value; | 166 | cache[reg] = value; |
163 | 167 | ||
164 | if (codec->cache_only) | 168 | if (codec->cache_only) { |
169 | codec->cache_sync = 1; | ||
165 | return 0; | 170 | return 0; |
171 | } | ||
166 | 172 | ||
167 | if (codec->hw_write(codec->control_data, data, 2) == 2) | 173 | if (codec->hw_write(codec->control_data, data, 2) == 2) |
168 | return 0; | 174 | return 0; |
@@ -192,8 +198,10 @@ static int snd_soc_8_16_write(struct snd_soc_codec *codec, unsigned int reg, | |||
192 | if (!snd_soc_codec_volatile_register(codec, reg)) | 198 | if (!snd_soc_codec_volatile_register(codec, reg)) |
193 | reg_cache[reg] = value; | 199 | reg_cache[reg] = value; |
194 | 200 | ||
195 | if (codec->cache_only) | 201 | if (codec->cache_only) { |
202 | codec->cache_sync = 1; | ||
196 | return 0; | 203 | return 0; |
204 | } | ||
197 | 205 | ||
198 | if (codec->hw_write(codec->control_data, data, 3) == 3) | 206 | if (codec->hw_write(codec->control_data, data, 3) == 3) |
199 | return 0; | 207 | return 0; |
@@ -313,8 +321,10 @@ static int snd_soc_16_8_write(struct snd_soc_codec *codec, unsigned int reg, | |||
313 | if (reg < codec->reg_cache_size) | 321 | if (reg < codec->reg_cache_size) |
314 | cache[reg] = value; | 322 | cache[reg] = value; |
315 | 323 | ||
316 | if (codec->cache_only) | 324 | if (codec->cache_only) { |
325 | codec->cache_sync = 1; | ||
317 | return 0; | 326 | return 0; |
327 | } | ||
318 | 328 | ||
319 | ret = codec->hw_write(codec->control_data, data, 3); | 329 | ret = codec->hw_write(codec->control_data, data, 3); |
320 | if (ret == 3) | 330 | if (ret == 3) |