Skip to content

Commit

Permalink
ASoC: cs4270: Move regulator acquisition to I2C probe()
Browse files Browse the repository at this point in the history
This is better style since it has us obtaining all resources before we
try the ASoC probe. This change also fixes a potential issue where we
don't enable the regulators before trying to confirm the device ID which
could cause a failure during probe in some system configurations.

Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
Acked-by: Timur Tabi <timur@freescale.com>
  • Loading branch information
Mark Brown committed Sep 11, 2012
1 parent 19ace0e commit b61d6d4
Showing 1 changed file with 19 additions and 27 deletions.
46 changes: 19 additions & 27 deletions sound/soc/codecs/cs4270.c
Original file line number Diff line number Diff line change
Expand Up @@ -487,7 +487,7 @@ static struct snd_soc_dai_driver cs4270_dai = {
static int cs4270_probe(struct snd_soc_codec *codec)
{
struct cs4270_private *cs4270 = snd_soc_codec_get_drvdata(codec);
int i, ret;
int ret;

/* Tell ASoC what kind of I/O to use to read the registers. ASoC will
* then do the I2C transactions itself.
Expand Down Expand Up @@ -521,25 +521,8 @@ static int cs4270_probe(struct snd_soc_codec *codec)
return ret;
}

/* get the power supply regulators */
for (i = 0; i < ARRAY_SIZE(supply_names); i++)
cs4270->supplies[i].supply = supply_names[i];

ret = regulator_bulk_get(codec->dev, ARRAY_SIZE(cs4270->supplies),
cs4270->supplies);
if (ret < 0)
return ret;

ret = regulator_bulk_enable(ARRAY_SIZE(cs4270->supplies),
cs4270->supplies);
if (ret < 0)
goto error_free_regulators;

return 0;

error_free_regulators:
regulator_bulk_free(ARRAY_SIZE(cs4270->supplies),
cs4270->supplies);

return ret;
}
Expand All @@ -555,7 +538,6 @@ static int cs4270_remove(struct snd_soc_codec *codec)
struct cs4270_private *cs4270 = snd_soc_codec_get_drvdata(codec);

regulator_bulk_disable(ARRAY_SIZE(cs4270->supplies), cs4270->supplies);
regulator_bulk_free(ARRAY_SIZE(cs4270->supplies), cs4270->supplies);

return 0;
};
Expand Down Expand Up @@ -658,7 +640,24 @@ static int cs4270_i2c_probe(struct i2c_client *i2c_client,
{
struct device_node *np = i2c_client->dev.of_node;
struct cs4270_private *cs4270;
int ret;
int ret, i;

cs4270 = devm_kzalloc(&i2c_client->dev, sizeof(struct cs4270_private),
GFP_KERNEL);
if (!cs4270) {
dev_err(&i2c_client->dev, "could not allocate codec\n");
return -ENOMEM;
}

/* get the power supply regulators */
for (i = 0; i < ARRAY_SIZE(supply_names); i++)
cs4270->supplies[i].supply = supply_names[i];

ret = devm_regulator_bulk_get(&i2c_client->dev,
ARRAY_SIZE(cs4270->supplies),
cs4270->supplies);
if (ret < 0)
return ret;

/* See if we have a way to bring the codec out of reset */
if (np) {
Expand Down Expand Up @@ -694,13 +693,6 @@ static int cs4270_i2c_probe(struct i2c_client *i2c_client,
i2c_client->addr);
dev_info(&i2c_client->dev, "hardware revision %X\n", ret & 0xF);

cs4270 = devm_kzalloc(&i2c_client->dev, sizeof(struct cs4270_private),
GFP_KERNEL);
if (!cs4270) {
dev_err(&i2c_client->dev, "could not allocate codec\n");
return -ENOMEM;
}

i2c_set_clientdata(i2c_client, cs4270);
cs4270->control_type = SND_SOC_I2C;

Expand Down

0 comments on commit b61d6d4

Please sign in to comment.