Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit b871f1ad authored by Fabio Estevam's avatar Fabio Estevam Committed by Mark Brown
Browse files

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: default avatarFabio Estevam <fabio.estevam@freescale.com>
Signed-off-by: default avatarMark Brown <broonie@opensource.wolfsonmicro.com>
parent 24279dce
Loading
Loading
Loading
Loading
+24 −15
Original line number Diff line number Diff line
@@ -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,