diff options
author | Dimitris Papastamos <dp@opensource.wolfsonmicro.com> | 2011-01-13 07:20:38 -0500 |
---|---|---|
committer | Mark Brown <broonie@opensource.wolfsonmicro.com> | 2011-01-13 09:17:53 -0500 |
commit | 1500b7b5ffaacb8199e0a61162f5d349fb19acbe (patch) | |
tree | 7e8ed00274943950bc5dfd34f0fb9edf1d3f2199 | |
parent | d4754ec91c7b094298f0b2ba02327e6887671edc (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.h | 2 | ||||
-rw-r--r-- | sound/soc/soc-core.c | 15 |
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 | */ |
2030 | int snd_soc_codec_volatile_register(struct snd_soc_codec *codec, int reg) | 2030 | int 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); |