aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDimitris Papastamos <dp@opensource.wolfsonmicro.com>2011-01-13 07:20:38 -0500
committerMark Brown <broonie@opensource.wolfsonmicro.com>2011-01-13 09:17:53 -0500
commit1500b7b5ffaacb8199e0a61162f5d349fb19acbe (patch)
tree7e8ed00274943950bc5dfd34f0fb9edf1d3f2199
parentd4754ec91c7b094298f0b2ba02327e6887671edc (diff)
ASoC: Automatically assign the default readable()/volatile() functions
Ensure that all calls to readable_register()/volatile_register() go via the snd_soc_codec function pointers. If the default register access table has been given but no functions for handling readable()/volatile() registers, use the default ones provided by soc-cache. Signed-off-by: Dimitris Papastamos <dp@opensource.wolfsonmicro.com> Acked-by: Liam Girdwood <lrg@slimlogic.co.uk> Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
-rw-r--r--include/sound/soc.h2
-rw-r--r--sound/soc/soc-core.c15
2 files changed, 14 insertions, 3 deletions
diff --git a/include/sound/soc.h b/include/sound/soc.h
index 97d1832bb9df..accb8a16c165 100644
--- a/include/sound/soc.h
+++ b/include/sound/soc.h
@@ -480,6 +480,8 @@ struct snd_soc_codec {
480 int num_dai; 480 int num_dai;
481 enum snd_soc_compress_type compress_type; 481 enum snd_soc_compress_type compress_type;
482 size_t reg_size; /* reg_cache_size * reg_word_size */ 482 size_t reg_size; /* reg_cache_size * reg_word_size */
483 int (*volatile_register)(struct snd_soc_codec *, unsigned int);
484 int (*readable_register)(struct snd_soc_codec *, unsigned int);
483 485
484 /* runtime */ 486 /* runtime */
485 struct snd_ac97 *ac97; /* for ad-hoc ac97 devices */ 487 struct snd_ac97 *ac97; /* for ad-hoc ac97 devices */
diff --git a/sound/soc/soc-core.c b/sound/soc/soc-core.c
index b5e5758456bd..30d76e8bc9df 100644
--- a/sound/soc/soc-core.c
+++ b/sound/soc/soc-core.c
@@ -84,7 +84,7 @@ static ssize_t soc_codec_reg_show(struct snd_soc_codec *codec, char *buf)
84 84
85 count += sprintf(buf, "%s registers\n", codec->name); 85 count += sprintf(buf, "%s registers\n", codec->name);
86 for (i = 0; i < codec->driver->reg_cache_size; i += step) { 86 for (i = 0; i < codec->driver->reg_cache_size; i += step) {
87 if (codec->driver->readable_register && !codec->driver->readable_register(codec, i)) 87 if (codec->readable_register && !codec->readable_register(codec, i))
88 continue; 88 continue;
89 89
90 count += sprintf(buf + count, "%2x: ", i); 90 count += sprintf(buf + count, "%2x: ", i);
@@ -2029,8 +2029,8 @@ static int soc_new_pcm(struct snd_soc_pcm_runtime *rtd, int num)
2029 */ 2029 */
2030int snd_soc_codec_volatile_register(struct snd_soc_codec *codec, int reg) 2030int snd_soc_codec_volatile_register(struct snd_soc_codec *codec, int reg)
2031{ 2031{
2032 if (codec->driver->volatile_register) 2032 if (codec->volatile_register)
2033 return codec->driver->volatile_register(codec, reg); 2033 return codec->volatile_register(codec, reg);
2034 else 2034 else
2035 return 0; 2035 return 0;
2036} 2036}
@@ -3489,6 +3489,8 @@ int snd_soc_register_codec(struct device *dev,
3489 3489
3490 codec->write = codec_drv->write; 3490 codec->write = codec_drv->write;
3491 codec->read = codec_drv->read; 3491 codec->read = codec_drv->read;
3492 codec->volatile_register = codec_drv->volatile_register;
3493 codec->readable_register = codec_drv->readable_register;
3492 codec->dapm.bias_level = SND_SOC_BIAS_OFF; 3494 codec->dapm.bias_level = SND_SOC_BIAS_OFF;
3493 codec->dapm.dev = dev; 3495 codec->dapm.dev = dev;
3494 codec->dapm.codec = codec; 3496 codec->dapm.codec = codec;
@@ -3517,6 +3519,13 @@ int snd_soc_register_codec(struct device *dev,
3517 } 3519 }
3518 } 3520 }
3519 3521
3522 if (codec_drv->reg_access_size && codec_drv->reg_access_default) {
3523 if (!codec->volatile_register)
3524 codec->volatile_register = snd_soc_default_volatile_register;
3525 if (!codec->readable_register)
3526 codec->readable_register = snd_soc_default_readable_register;
3527 }
3528
3520 for (i = 0; i < num_dai; i++) { 3529 for (i = 0; i < num_dai; i++) {
3521 fixup_codec_formats(&dai_drv[i].playback); 3530 fixup_codec_formats(&dai_drv[i].playback);
3522 fixup_codec_formats(&dai_drv[i].capture); 3531 fixup_codec_formats(&dai_drv[i].capture);