ASoC: core: Fix check before setting default I/O up try regmap
authorXiubo Li <Li.Xiubo@freescale.com>
Tue, 11 Mar 2014 04:43:22 +0000 (12:43 +0800)
committerMark Brown <broonie@linaro.org>
Tue, 11 Mar 2014 09:59:06 +0000 (09:59 +0000)
Since the CODEC driver could specify its own I/O(read and write)
while registering the CODEC for some reason, maybe the MFDs is
used, etc.

So just do check it, if they are not specified by CODEC driver
then try to set up the default regmap I/O if regmap is used.

Signed-off-by: Xiubo Li <Li.Xiubo@freescale.com>
Signed-off-by: Mark Brown <broonie@linaro.org>
sound/soc/soc-core.c

index 6510a8e4a5af817dec2fcc8c91a0b19002728501..cbddbd595213ec2ffd66cc6d07474ce79c27fdbd 100644 (file)
@@ -1137,9 +1137,15 @@ static int soc_probe_codec(struct snd_soc_card *card,
 
        codec->dapm.idle_bias_off = driver->idle_bias_off;
 
-       /* Set the default I/O up try regmap */
-       if (dev_get_regmap(codec->dev, NULL))
-               snd_soc_codec_set_cache_io(codec, NULL);
+       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);