summaryrefslogtreecommitdiff
path: root/sound/soc/soc-core.c
diff options
context:
space:
mode:
authorDimitris Papastamos <dp@opensource.wolfsonmicro.com>2010-11-11 10:04:57 +0000
committerMark Brown <broonie@opensource.wolfsonmicro.com>2010-11-11 15:58:41 +0000
commit7a30a3db34cc7b2180a1a6c4a51d19d93c8a8b80 (patch)
tree0a5effd9cc63055d49f837ba4751573f2cb70ef7 /sound/soc/soc-core.c
parent84e909303dbd3c8d882f152c17d1319f2873e147 (diff)
downloadlwn-7a30a3db34cc7b2180a1a6c4a51d19d93c8a8b80.tar.gz
lwn-7a30a3db34cc7b2180a1a6c4a51d19d93c8a8b80.zip
ASoC: soc-cache: Add support for flat register caching
This patch introduces the new caching API and migrates the old caching interface into the new one. The flat register caching technique does not use compression at all and it is equivalent to the old caching technique. One can still access codec->reg_cache directly but this is not advised as that will not be portable across different caching strategies. None of the existing drivers need to be changed to adapt to this caching technique. There should be no noticeable overhead associated with using the new caching API. 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>
Diffstat (limited to 'sound/soc/soc-core.c')
-rw-r--r--sound/soc/soc-core.c37
1 files changed, 14 insertions, 23 deletions
diff --git a/sound/soc/soc-core.c b/sound/soc/soc-core.c
index 700a6d5b9721..3d70ce58d03c 100644
--- a/sound/soc/soc-core.c
+++ b/sound/soc/soc-core.c
@@ -3279,29 +3279,21 @@ int snd_soc_register_codec(struct device *dev,
codec->dapm.bias_level = SND_SOC_BIAS_OFF;
codec->dapm.dev = dev;
codec->dapm.codec = codec;
+ codec->dev = dev;
+ codec->driver = codec_drv;
+ codec->num_dai = num_dai;
+ mutex_init(&codec->mutex);
/* allocate CODEC register cache */
if (codec_drv->reg_cache_size && codec_drv->reg_word_size) {
-
- if (codec_drv->reg_cache_default)
- codec->reg_cache = kmemdup(codec_drv->reg_cache_default,
- codec_drv->reg_cache_size * codec_drv->reg_word_size, GFP_KERNEL);
- else
- codec->reg_cache = kzalloc(codec_drv->reg_cache_size *
- codec_drv->reg_word_size, GFP_KERNEL);
-
- if (codec->reg_cache == NULL) {
- kfree(codec->name);
- kfree(codec);
- return -ENOMEM;
+ ret = snd_soc_cache_init(codec);
+ if (ret < 0) {
+ dev_err(codec->dev, "Failed to set cache compression type: %d\n",
+ ret);
+ goto error_cache;
}
}
- codec->dev = dev;
- codec->driver = codec_drv;
- codec->num_dai = num_dai;
- mutex_init(&codec->mutex);
-
for (i = 0; i < num_dai; i++) {
fixup_codec_formats(&dai_drv[i].playback);
fixup_codec_formats(&dai_drv[i].capture);
@@ -3311,7 +3303,7 @@ int snd_soc_register_codec(struct device *dev,
if (num_dai) {
ret = snd_soc_register_dais(dev, dai_drv, num_dai);
if (ret < 0)
- goto error;
+ goto error_dais;
}
mutex_lock(&client_mutex);
@@ -3322,9 +3314,9 @@ int snd_soc_register_codec(struct device *dev,
pr_debug("Registered codec '%s'\n", codec->name);
return 0;
-error:
- if (codec->reg_cache)
- kfree(codec->reg_cache);
+error_dais:
+ snd_soc_cache_exit(codec);
+error_cache:
kfree(codec->name);
kfree(codec);
return ret;
@@ -3358,8 +3350,7 @@ found:
pr_debug("Unregistered codec '%s'\n", codec->name);
- if (codec->reg_cache)
- kfree(codec->reg_cache);
+ snd_soc_cache_exit(codec);
kfree(codec->name);
kfree(codec);
}