summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJulius Werner <jwerner@chromium.org>2020-09-30 15:23:46 -0700
committerJulius Werner <jwerner@chromium.org>2020-10-01 21:48:55 +0000
commit411e7607d677f7679cfe307d4de5de0315f68038 (patch)
treed6529eae8329fc8e363804fa6504a9ee04fdb829
parent768f59a32ff4a6dc1c8db0e03bb06ece02d20b72 (diff)
drivers: sn65dsi86: Retry link training up to 10 times
The kernel guys have found that automatic link training from this bridge can occasionally fail and needs to be retried. They have added up to 10 retries just to be sure, so let's do the same in coreboot. BUG=b:169535092 Signed-off-by: Julius Werner <jwerner@chromium.org> Change-Id: I713b6851bd51d3527ed4c6e6407dee6b42d09955 Reviewed-on: https://review.coreboot.org/c/coreboot/+/45882 Reviewed-by: Douglas Anderson <dianders@chromium.org> Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
-rw-r--r--src/drivers/ti/sn65dsi86bridge/sn65dsi86bridge.c19
1 files changed, 12 insertions, 7 deletions
diff --git a/src/drivers/ti/sn65dsi86bridge/sn65dsi86bridge.c b/src/drivers/ti/sn65dsi86bridge/sn65dsi86bridge.c
index e0058c4fe7..effa841690 100644
--- a/src/drivers/ti/sn65dsi86bridge/sn65dsi86bridge.c
+++ b/src/drivers/ti/sn65dsi86bridge/sn65dsi86bridge.c
@@ -415,15 +415,20 @@ static void sn65dsi86_bridge_link_training(uint8_t bus, uint8_t chip)
sn65dsi86_bridge_dpcd_request(bus, chip,
DP_BRIDGE_CONFIGURATION_SET, 1, DPCD_WRITE, &buf);
- /* semi auto link training mode */
- i2c_writeb(bus, chip, SN_ML_TX_MODE_REG, 0xa);
-
- if (!wait_ms(500,
- !(i2c_readb(bus, chip, SN_ML_TX_MODE_REG, &buf)) &&
- (buf & NORMAL_MODE))) {
- printk(BIOS_ERR, "ERROR: Link training failed");
+ int i; /* Kernel driver suggests to retry this up to 10 times if it fails. */
+ for (i = 0; i < 10; i++) {
+ i2c_writeb(bus, chip, SN_ML_TX_MODE_REG, SEMI_AUTO_LINK_TRAINING);
+
+ if (!wait_ms(500, !(i2c_readb(bus, chip, SN_ML_TX_MODE_REG, &buf)) &&
+ (buf == NORMAL_MODE || buf == MAIN_LINK_OFF))) {
+ printk(BIOS_ERR, "ERROR: unexpected link training state: %#x\n", buf);
+ return;
+ }
+ if (buf == NORMAL_MODE)
+ return;
}
+ printk(BIOS_ERR, "ERROR: Link training failed 10 times\n");
}
static enum cb_err sn65dsi86_bridge_get_plug_in_status(uint8_t bus, uint8_t chip)