ASoC: Samsung: Rename from s3c24xx to samsung
[deliverable/linux.git] / sound / soc / soc-core.c
index f030521c48d16b85a50b8358c6db31e583a198c8..c8d8dde7f4dde22db733245e7e6a0a6f0cb8befb 100644 (file)
 #include <sound/pcm.h>
 #include <sound/pcm_params.h>
 #include <sound/soc.h>
-#include <sound/soc-dapm.h>
 #include <sound/initval.h>
 
+#define CREATE_TRACE_POINTS
+#include <trace/events/asoc.h>
+
 #define NAME_SIZE      32
 
 static DEFINE_MUTEX(pcm_mutex);
@@ -401,6 +403,14 @@ static inline void soc_init_codec_debugfs(struct snd_soc_codec *codec)
 static inline void soc_cleanup_codec_debugfs(struct snd_soc_codec *codec)
 {
 }
+
+static inline void soc_init_card_debugfs(struct snd_soc_card *card)
+{
+}
+
+static inline void soc_cleanup_card_debugfs(struct snd_soc_card *card)
+{
+}
 #endif
 
 #ifdef CONFIG_SND_SOC_AC97_BUS
@@ -1386,6 +1396,23 @@ static void soc_remove_dai_link(struct snd_soc_card *card, int num)
        }
 }
 
+static void soc_set_name_prefix(struct snd_soc_card *card,
+                               struct snd_soc_codec *codec)
+{
+       int i;
+
+       if (card->prefix_map == NULL)
+               return;
+
+       for (i = 0; i < card->num_prefixes; i++) {
+               struct snd_soc_prefix_map *map = &card->prefix_map[i];
+               if (map->dev_name && !strcmp(codec->name, map->dev_name)) {
+                       codec->name_prefix = map->name_prefix;
+                       break;
+               }
+       }
+}
+
 static void rtd_release(struct device *dev) {}
 
 static int soc_probe_dai_link(struct snd_soc_card *card, int num)
@@ -1395,6 +1422,7 @@ static int soc_probe_dai_link(struct snd_soc_card *card, int num)
        struct snd_soc_codec *codec = rtd->codec;
        struct snd_soc_platform *platform = rtd->platform;
        struct snd_soc_dai *codec_dai = rtd->codec_dai, *cpu_dai = rtd->cpu_dai;
+       const char *temp;
        int ret;
 
        dev_dbg(card->dev, "probe %s dai link %d\n", card->name, num);
@@ -1429,6 +1457,7 @@ static int soc_probe_dai_link(struct snd_soc_card *card, int num)
        /* probe the CODEC */
        if (!codec->probed) {
                codec->dapm.card = card;
+               soc_set_name_prefix(card, codec);
                if (codec->driver->probe) {
                        ret = codec->driver->probe(codec);
                        if (ret < 0) {
@@ -1481,11 +1510,15 @@ static int soc_probe_dai_link(struct snd_soc_card *card, int num)
 
        /* now that all clients have probed, initialise the DAI link */
        if (dai_link->init) {
+               /* machine controls, routes and widgets are not prefixed */
+               temp = rtd->codec->name_prefix;
+               rtd->codec->name_prefix = NULL;
                ret = dai_link->init(rtd);
                if (ret < 0) {
                        printk(KERN_ERR "asoc: failed to init %s\n", dai_link->stream_name);
                        return ret;
                }
+               rtd->codec->name_prefix = temp;
        }
 
        /* Make sure all DAPM widgets are instantiated */
@@ -1906,6 +1939,7 @@ unsigned int snd_soc_read(struct snd_soc_codec *codec, unsigned int reg)
 
        ret = codec->driver->read(codec, reg);
        dev_dbg(codec->dev, "read %x => %x\n", reg, ret);
+       trace_snd_soc_reg_read(codec, reg, ret);
 
        return ret;
 }
@@ -1915,6 +1949,7 @@ unsigned int snd_soc_write(struct snd_soc_codec *codec,
                           unsigned int reg, unsigned int val)
 {
        dev_dbg(codec->dev, "write %x = %x\n", reg, val);
+       trace_snd_soc_reg_write(codec, reg, val);
        return codec->driver->write(codec, reg, val);
 }
 EXPORT_SYMBOL_GPL(snd_soc_write);
@@ -2059,14 +2094,22 @@ int snd_soc_add_controls(struct snd_soc_codec *codec,
        const struct snd_kcontrol_new *controls, int num_controls)
 {
        struct snd_card *card = codec->card->snd_card;
+       char prefixed_name[44], *name;
        int err, i;
 
        for (i = 0; i < num_controls; i++) {
                const struct snd_kcontrol_new *control = &controls[i];
-               err = snd_ctl_add(card, snd_soc_cnew(control, codec, NULL));
+               if (codec->name_prefix) {
+                       snprintf(prefixed_name, sizeof(prefixed_name), "%s %s",
+                                codec->name_prefix, control->name);
+                       name = prefixed_name;
+               } else {
+                       name = control->name;
+               }
+               err = snd_ctl_add(card, snd_soc_cnew(control, codec, name));
                if (err < 0) {
                        dev_err(codec->dev, "%s: Failed to add %s: %d\n",
-                               codec->name, control->name, err);
+                               codec->name, name, err);
                        return err;
                }
        }
@@ -3266,29 +3309,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);
@@ -3298,7 +3333,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);
@@ -3309,9 +3344,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;
@@ -3345,8 +3380,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);
 }
This page took 0.048264 seconds and 5 git commands to generate.