]> git.karo-electronics.de Git - karo-tx-linux.git/blobdiff - sound/soc/soc-core.c
Merge branches 'topic/sta350', 'topic/core', 'topic/dapm' and 'topic/cache' of git...
[karo-tx-linux.git] / sound / soc / soc-core.c
index 7f8efea5c5b11726f2a58ce80aaaf86bbf66b6d9..db577e4cdf497a1fa79f4d3138af45a841dd179d 100644 (file)
@@ -1145,16 +1145,6 @@ static int soc_probe_codec(struct snd_soc_card *card,
 
        codec->dapm.idle_bias_off = driver->idle_bias_off;
 
-       if (!codec->write && dev_get_regmap(codec->dev, NULL)) {
-               /* Set the default I/O up try regmap */
-               ret = snd_soc_codec_set_cache_io(codec, NULL);
-               if (ret < 0) {
-                       dev_err(codec->dev,
-                               "Failed to set cache I/O: %d\n", ret);
-                       goto err_probe;
-               }
-       }
-
        if (driver->probe) {
                ret = driver->probe(codec);
                if (ret < 0) {
@@ -4088,6 +4078,7 @@ int snd_soc_register_codec(struct device *dev,
                           int num_dai)
 {
        struct snd_soc_codec *codec;
+       struct regmap *regmap;
        int ret, i;
 
        dev_dbg(dev, "codec register %s\n", dev_name(dev));
@@ -4117,6 +4108,23 @@ int snd_soc_register_codec(struct device *dev,
        codec->val_bytes = codec_drv->reg_word_size;
        mutex_init(&codec->mutex);
 
+       if (!codec->write) {
+               if (codec_drv->get_regmap)
+                       regmap = codec_drv->get_regmap(dev);
+               else
+                       regmap = dev_get_regmap(dev, NULL);
+
+               if (regmap) {
+                       ret = snd_soc_codec_set_cache_io(codec, regmap);
+                       if (ret && ret != -ENOTSUPP) {
+                               dev_err(codec->dev,
+                                               "Failed to set cache I/O:%d\n",
+                                               ret);
+                               return ret;
+                       }
+               }
+       }
+
        for (i = 0; i < num_dai; i++) {
                fixup_codec_formats(&dai_drv[i].playback);
                fixup_codec_formats(&dai_drv[i].capture);