diff options
| -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); |
