From 8ecfa825b194294eb4e0c2b305c7e013097bf950 Mon Sep 17 00:00:00 2001 From: Joonyoung Shim Date: Wed, 31 Aug 2016 18:17:48 +0900 Subject: [PATCH] drm: bridge: sii8620: retry hw reset with i2c failure With specific targets, sometimes(almost) i2c read is failed when hdmi cable is plugged. [ 341.285875] sii8620 7-0039: I2C read of [0x0000] failed with code -6. [ 341.286149] sii8620 7-0039: Error accessing I2C bus, -6. Retry hw reset operation of sii8620 mhl if i2c read is failed then can do normal i2c operation. This solution came from android kernel. Change-Id: Icf9f54eb941e3ac5a8728fb9552b51928578d508 Signed-off-by: Joonyoung Shim --- drivers/gpu/drm/bridge/sii8620.c | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/drivers/gpu/drm/bridge/sii8620.c b/drivers/gpu/drm/bridge/sii8620.c index 90d93af..08d8e2e 100644 --- a/drivers/gpu/drm/bridge/sii8620.c +++ b/drivers/gpu/drm/bridge/sii8620.c @@ -1411,12 +1411,20 @@ static void sii8620_cable_in(struct sii8620 *ctx) sii8620_hw_on(ctx); clk_prepare_enable(ctx->clk_xtal); sii8620_hw_reset(ctx); + msleep(100); sii8620_read_buf(ctx, REG_VND_IDL, ver, ARRAY_SIZE(ver)); ret = sii8620_clear_error(ctx); if (ret) { - dev_err(dev, "Error accessing I2C bus, %d.\n", ret); - return; + dev_err(dev, "Error 1st accessing I2C bus, %d.\n", ret); + sii8620_hw_reset(ctx); + msleep(20); + sii8620_read_buf(ctx, REG_VND_IDL, ver, ARRAY_SIZE(ver)); + ret = sii8620_clear_error(ctx); + if (ret) { + dev_err(dev, "Error 2nd accessing I2C bus, %d.\n", ret); + return; + } } dev_info(dev, "ChipID %02x%02x:%02x%02x rev %02x.\n", ver[1], ver[0], -- 2.7.4