ASoC: core: Move the default regmap I/O setting to snd_soc_register_codec()
authorXiubo Li <Li.Xiubo@freescale.com>
Wed, 26 Mar 2014 05:40:23 +0000 (13:40 +0800)
committerMark Brown <broonie@linaro.org>
Mon, 14 Apr 2014 16:22:18 +0000 (17:22 +0100)
Add the default regmap I/O setting to snd_soc_register_codec() while
the CODEC is initialising, which will be called by CODEC driver device
probe(), and then we can make XXX_set_cache_io() go away entirely from each
CODEC ASoC probe.

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

index 0b83168d8ff45a2ff394057ef0d172ab783f84d8..2f62436026d2abb5efa98f0cfd16aa06deb454fa 100644 (file)
@@ -754,6 +754,7 @@ struct snd_soc_codec_driver {
                unsigned int freq_in, unsigned int freq_out);
 
        /* codec IO */
+       struct regmap *(*get_regmap)(struct device *);
        unsigned int (*read)(struct snd_soc_codec *, unsigned int);
        int (*write)(struct snd_soc_codec *, unsigned int, unsigned int);
        int (*display_register)(struct snd_soc_codec *, char *,
index 051c006281f5c2c003583f7104c9ec02dc886dfc..5071a3a0ac8368d3a6e7e313fc5bacfab7a26577 100644 (file)
@@ -1137,16 +1137,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) {
@@ -4263,6 +4253,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));
@@ -4294,6 +4285,23 @@ int snd_soc_register_codec(struct device *dev,
        codec->num_dai = num_dai;
        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);
index 260efc8466fc352cf70d08663799c7fde0758a2e..6480e8f293101ba7cf72f28ccbe923ac81d7ad46 100644 (file)
@@ -60,14 +60,11 @@ int snd_soc_codec_set_cache_io(struct snd_soc_codec *codec,
 {
        int ret;
 
-       /* Device has made its own regmap arrangements */
        if (!regmap)
-               codec->control_data = dev_get_regmap(codec->dev, NULL);
-       else
-               codec->control_data = regmap;
+               return -EINVAL;
 
-       if (IS_ERR(codec->control_data))
-               return PTR_ERR(codec->control_data);
+       /* Device has made its own regmap arrangements */
+       codec->control_data = regmap;
 
        codec->write = hw_write;
        codec->read = hw_read;