|
@@ -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, ®);
|
|
|
+ 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, ®);
|
|
|
+ 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,
|