ASoC: sgtl5000: Read SGTL5000_CHIP_ID in i2c_probe()

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>
This commit is contained in:
Fabio Estevam 2013-05-09 21:15:46 -03:00 committed by Mark Brown
parent 24279dcee5
commit b871f1ad3c
1 changed files with 24 additions and 15 deletions

View 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) static int sgtl5000_enable_regulators(struct snd_soc_codec *codec)
{ {
u16 reg; int reg;
int ret; int ret;
int rev; int rev;
int i; int i;
@ -1303,23 +1303,17 @@ static int sgtl5000_enable_regulators(struct snd_soc_codec *codec)
/* wait for all power rails bring up */ /* wait for all power rails bring up */
udelay(10); 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, * workaround for revision 0x11 and later,
* roll back to use internal LDO * 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) { if (external_vddd && rev >= 0x11) {
/* disable all regulator first */ /* disable all regulator first */
regulator_bulk_disable(ARRAY_SIZE(sgtl5000->supplies), 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) const struct i2c_device_id *id)
{ {
struct sgtl5000_priv *sgtl5000; struct sgtl5000_priv *sgtl5000;
int ret; int ret, reg, rev;
sgtl5000 = devm_kzalloc(&client->dev, sizeof(struct sgtl5000_priv), sgtl5000 = devm_kzalloc(&client->dev, sizeof(struct sgtl5000_priv),
GFP_KERNEL); GFP_KERNEL);
@ -1492,6 +1486,21 @@ static int sgtl5000_i2c_probe(struct i2c_client *client,
return ret; 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); i2c_set_clientdata(client, sgtl5000);
ret = snd_soc_register_codec(&client->dev, ret = snd_soc_register_codec(&client->dev,