diff mbox

ASoC: rt5663: Delay and retry reading rt5663 ID register

Message ID 1509949082-21443-1-git-send-email-oder_chiou@realtek.com (mailing list archive)
State New, archived
Headers show

Commit Message

Oder Chiou Nov. 6, 2017, 6:18 a.m. UTC
In the probe, the codec may not be ready for I2C reading. So if the value
is not correct, it will read again after delay.

Signed-off-by: Oder Chiou <oder_chiou@realtek.com>
---
 sound/soc/codecs/rt5663.c | 11 ++++++++++-
 1 file changed, 10 insertions(+), 1 deletion(-)

Comments

Mark Brown Nov. 6, 2017, 11:30 a.m. UTC | #1
On Mon, Nov 06, 2017 at 02:18:02PM +0800, Oder Chiou wrote:
> In the probe, the codec may not be ready for I2C reading. So if the value
> is not correct, it will read again after delay.

Why might this happen?  This sounds like papering over some other
problem.
Mark Brown Nov. 8, 2017, 9:20 p.m. UTC | #2
On Tue, Nov 07, 2017 at 02:21:21AM +0000, Oder Chiou wrote:

> The issue is similar the patch https://patchwork.kernel.org/patch/9681421/.
> And in current project, these 2 devices were connected to the same i2c host,
> and they meet the same problem.

OK...  can you resend with the log message all on one line please?  That
makes it easier for people to grep the kernel source to find where the
error came from, it's more important than 80 columns.
diff mbox

Patch

diff --git a/sound/soc/codecs/rt5663.c b/sound/soc/codecs/rt5663.c
index fcd1643..5985d8e 100644
--- a/sound/soc/codecs/rt5663.c
+++ b/sound/soc/codecs/rt5663.c
@@ -3429,7 +3429,16 @@  static int rt5663_i2c_probe(struct i2c_client *i2c,
 			ret);
 		return ret;
 	}
-	regmap_read(regmap, RT5663_VENDOR_ID_2, &val);
+
+	ret = regmap_read(regmap, RT5663_VENDOR_ID_2, &val);
+	if (ret || (val != RT5663_DEVICE_ID_2 && val != RT5663_DEVICE_ID_1)) {
+		dev_err(&i2c->dev,
+			"Device with ID register %#x is not rt5663,"
+			" retry one time.\n", val);
+		msleep(100);
+		regmap_read(regmap, RT5663_VENDOR_ID_2, &val);
+	}
+
 	switch (val) {
 	case RT5663_DEVICE_ID_2:
 		rt5663->regmap = devm_regmap_init_i2c(i2c, &rt5663_v2_regmap);