ASoC: Move WM9090 device identification and reset to I2C probe
authorMark Brown <broonie@opensource.wolfsonmicro.com>
Tue, 13 Dec 2011 13:43:01 +0000 (21:43 +0800)
committerMark Brown <broonie@opensource.wolfsonmicro.com>
Fri, 20 Jan 2012 13:58:20 +0000 (13:58 +0000)
Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
sound/soc/codecs/wm9090.c

index 4be5551f06a0708bc610dc533355946034d7e81f..a2b9208a08f0c1cfb2d387686e650b6cd5514e3d 100644 (file)
@@ -532,18 +532,6 @@ static int wm9090_probe(struct snd_soc_codec *codec)
                return ret;
        }
 
-       ret = snd_soc_read(codec, WM9090_SOFTWARE_RESET);
-       if (ret < 0)
-               return ret;
-       if (ret != 0x9093) {
-               dev_err(codec->dev, "Device is not a WM9090, ID=%x\n", ret);
-               return -EINVAL;
-       }
-
-       ret = snd_soc_write(codec, WM9090_SOFTWARE_RESET, 0);
-       if (ret < 0)
-               return ret;
-
        /* Configure some defaults; they will be written out when we
         * bring the bias up.
         */
@@ -631,6 +619,7 @@ static int wm9090_i2c_probe(struct i2c_client *i2c,
                            const struct i2c_device_id *id)
 {
        struct wm9090_priv *wm9090;
+       unsigned int reg;
        int ret;
 
        wm9090 = devm_kzalloc(&i2c->dev, sizeof(*wm9090), GFP_KERNEL);
@@ -646,6 +635,19 @@ static int wm9090_i2c_probe(struct i2c_client *i2c,
                return ret;
        }
 
+       ret = regmap_read(wm9090->regmap, WM9090_SOFTWARE_RESET, &reg);
+       if (ret < 0)
+               goto err;
+       if (reg != 0x9093) {
+               dev_err(&i2c->dev, "Device is not a WM9090, ID=%x\n", ret);
+               ret = -ENODEV;
+               goto err;
+       }
+
+       ret = regmap_write(wm9090->regmap, WM9090_SOFTWARE_RESET, 0);
+       if (ret < 0)
+               goto err;
+
        if (i2c->dev.platform_data)
                memcpy(&wm9090->pdata, i2c->dev.platform_data,
                       sizeof(wm9090->pdata));