OSDN Git Service

ASoC: sgtl5000: Read SGTL5000_CHIP_ID in i2c_probe()
authorFabio Estevam <fabio.estevam@freescale.com>
Fri, 10 May 2013 00:15:46 +0000 (21:15 -0300)
committerMark Brown <broonie@opensource.wolfsonmicro.com>
Sun, 12 May 2013 16:50:02 +0000 (20:50 +0400)
The usual place for reading chip ID is inside i2c_probe, so move it there and
also convert it to regmap.

sgtl5000_enable_regulators() needs to read the chip revision, so keep the
revision check there.

Signed-off-by: Fabio Estevam <fabio.estevam@freescale.com>
Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
sound/soc/codecs/sgtl5000.c

index 327b443..1ab356a 100644 (file)
@@ -1275,7 +1275,7 @@ static int sgtl5000_replace_vddd_with_ldo(struct snd_soc_codec *codec)
 
 static int sgtl5000_enable_regulators(struct snd_soc_codec *codec)
 {
-       u16 reg;
+       int reg;
        int ret;
        int rev;
        int i;
@@ -1303,23 +1303,17 @@ static int sgtl5000_enable_regulators(struct snd_soc_codec *codec)
        /* wait for all power rails bring up */
        udelay(10);
 
-       /* read chip information */
-       reg = snd_soc_read(codec, SGTL5000_CHIP_ID);
-       if (((reg & SGTL5000_PARTID_MASK) >> SGTL5000_PARTID_SHIFT) !=
-           SGTL5000_PARTID_PART_ID) {
-               dev_err(codec->dev,
-                       "Device with ID register %x is not a sgtl5000\n", reg);
-               ret = -ENODEV;
-               goto err_regulator_disable;
-       }
-
-       rev = (reg & SGTL5000_REVID_MASK) >> SGTL5000_REVID_SHIFT;
-       dev_info(codec->dev, "sgtl5000 revision 0x%x\n", rev);
-
        /*
         * workaround for revision 0x11 and later,
         * roll back to use internal LDO
         */
+
+       ret = regmap_read(sgtl5000->regmap, SGTL5000_CHIP_ID, &reg);
+       if (ret)
+               goto err_regulator_disable;
+
+       rev = (reg & SGTL5000_REVID_MASK) >> SGTL5000_REVID_SHIFT;
+
        if (external_vddd && rev >= 0x11) {
                /* disable all regulator first */
                regulator_bulk_disable(ARRAY_SIZE(sgtl5000->supplies),
@@ -1478,7 +1472,7 @@ static int sgtl5000_i2c_probe(struct i2c_client *client,
                              const struct i2c_device_id *id)
 {
        struct sgtl5000_priv *sgtl5000;
-       int ret;
+       int ret, reg, rev;
 
        sgtl5000 = devm_kzalloc(&client->dev, sizeof(struct sgtl5000_priv),
                                                                GFP_KERNEL);
@@ -1492,6 +1486,21 @@ static int sgtl5000_i2c_probe(struct i2c_client *client,
                return ret;
        }
 
+       /* read chip information */
+       ret = regmap_read(sgtl5000->regmap, SGTL5000_CHIP_ID, &reg);
+       if (ret)
+               return ret;
+
+       if (((reg & SGTL5000_PARTID_MASK) >> SGTL5000_PARTID_SHIFT) !=
+           SGTL5000_PARTID_PART_ID) {
+               dev_err(&client->dev,
+                       "Device with ID register %x is not a sgtl5000\n", reg);
+               return -ENODEV;
+       }
+
+       rev = (reg & SGTL5000_REVID_MASK) >> SGTL5000_REVID_SHIFT;
+       dev_info(&client->dev, "sgtl5000 revision 0x%x\n", rev);
+
        i2c_set_clientdata(client, sgtl5000);
 
        ret = snd_soc_register_codec(&client->dev,