Commit 911a0f0b authored by Peter Ujfalusi's avatar Peter Ujfalusi Committed by Liam Girdwood

ASoC: tlv320dac33: Error handling for broken chip

Correct/Implement handling of broken chip.
Fail the soc_prope if the communication with the chip
fails (can not read chip ID).
Signed-off-by: default avatarPeter Ujfalusi <peter.ujfalusi@nokia.com>
Acked-by: default avatarMark Brown <broonie@opensource.wolfsonmicro.com>
Signed-off-by: default avatarLiam Girdwood <lrg@slimlogic.co.uk>
parent 84eae18c
...@@ -200,7 +200,7 @@ static int dac33_read(struct snd_soc_codec *codec, unsigned int reg, ...@@ -200,7 +200,7 @@ static int dac33_read(struct snd_soc_codec *codec, unsigned int reg,
u8 *value) u8 *value)
{ {
struct tlv320dac33_priv *dac33 = snd_soc_codec_get_drvdata(codec); struct tlv320dac33_priv *dac33 = snd_soc_codec_get_drvdata(codec);
int val; int val, ret = 0;
*value = reg & 0xff; *value = reg & 0xff;
...@@ -210,6 +210,7 @@ static int dac33_read(struct snd_soc_codec *codec, unsigned int reg, ...@@ -210,6 +210,7 @@ static int dac33_read(struct snd_soc_codec *codec, unsigned int reg,
if (val < 0) { if (val < 0) {
dev_err(codec->dev, "Read failed (%d)\n", val); dev_err(codec->dev, "Read failed (%d)\n", val);
value[0] = dac33_read_reg_cache(codec, reg); value[0] = dac33_read_reg_cache(codec, reg);
ret = val;
} else { } else {
value[0] = val; value[0] = val;
dac33_write_reg_cache(codec, reg, val); dac33_write_reg_cache(codec, reg, val);
...@@ -218,7 +219,7 @@ static int dac33_read(struct snd_soc_codec *codec, unsigned int reg, ...@@ -218,7 +219,7 @@ static int dac33_read(struct snd_soc_codec *codec, unsigned int reg,
value[0] = dac33_read_reg_cache(codec, reg); value[0] = dac33_read_reg_cache(codec, reg);
} }
return 0; return ret;
} }
static int dac33_write(struct snd_soc_codec *codec, unsigned int reg, static int dac33_write(struct snd_soc_codec *codec, unsigned int reg,
...@@ -329,13 +330,18 @@ static void dac33_init_chip(struct snd_soc_codec *codec) ...@@ -329,13 +330,18 @@ static void dac33_init_chip(struct snd_soc_codec *codec)
dac33_read_reg_cache(codec, DAC33_LINER_TO_RLO_VOL)); dac33_read_reg_cache(codec, DAC33_LINER_TO_RLO_VOL));
} }
static inline void dac33_read_id(struct snd_soc_codec *codec) static inline int dac33_read_id(struct snd_soc_codec *codec)
{ {
int i, ret = 0;
u8 reg; u8 reg;
dac33_read(codec, DAC33_DEVICE_ID_MSB, &reg); for (i = 0; i < 3; i++) {
dac33_read(codec, DAC33_DEVICE_ID_LSB, &reg); ret = dac33_read(codec, DAC33_DEVICE_ID_MSB + i, &reg);
dac33_read(codec, DAC33_DEVICE_REV_ID, &reg); if (ret < 0)
break;
}
return ret;
} }
static inline void dac33_soft_power(struct snd_soc_codec *codec, int power) static inline void dac33_soft_power(struct snd_soc_codec *codec, int power)
...@@ -1414,9 +1420,15 @@ static int dac33_soc_probe(struct snd_soc_codec *codec) ...@@ -1414,9 +1420,15 @@ static int dac33_soc_probe(struct snd_soc_codec *codec)
dev_err(codec->dev, "Failed to power up codec: %d\n", ret); dev_err(codec->dev, "Failed to power up codec: %d\n", ret);
goto err_power; goto err_power;
} }
dac33_read_id(codec); ret = dac33_read_id(codec);
dac33_hard_power(codec, 0); dac33_hard_power(codec, 0);
if (ret < 0) {
dev_err(codec->dev, "Failed to read chip ID: %d\n", ret);
ret = -ENODEV;
goto err_power;
}
/* Check if the IRQ number is valid and request it */ /* Check if the IRQ number is valid and request it */
if (dac33->irq >= 0) { if (dac33->irq >= 0) {
ret = request_irq(dac33->irq, dac33_interrupt_handler, ret = request_irq(dac33->irq, dac33_interrupt_handler,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment