From d43ced8c8de8eecc4850b6c346b43774ff3e3ba9 Mon Sep 17 00:00:00 2001 From: Shawn Nematbakhsh Date: Mon, 24 Aug 2015 16:39:56 -0700 Subject: [PATCH] mec1322: i2c: Unwedge controller on transaction timeout If clk or dat aren't pulled up for an extended period, the i2c controller may get into a wedged state that requires a controller reset to recover from. There are no outward signs of the controller being in such a state, other than transaction timeouts. Therefore, on a transaction timeout, reset the controller. BUG=chrome-os-partner:43270 TEST=Manual on glados: - Run `gpioset PP3300_USB_PD_EN 0` on PD console and wait several seconds - Run `gpioset PP3300_USB_PD_EN 1` on PD console - Run `i2cscan` and verify all ports / devices ack - Repeat above several times BRANCH=None Change-Id: I2ae42762ee6c961224ff50309a448475b67854b5 Signed-off-by: Shawn Nematbakhsh Reviewed-on: https://chromium-review.googlesource.com/295404 Reviewed-by: Aaron Durbin --- chip/mec1322/i2c.c | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/chip/mec1322/i2c.c b/chip/mec1322/i2c.c index bf44659ce9..19b65e0c55 100644 --- a/chip/mec1322/i2c.c +++ b/chip/mec1322/i2c.c @@ -362,8 +362,16 @@ err_chip_i2c_xfer: CTRL_STO | CTRL_ACK; if (ret_done == STS_LRB) return EC_ERROR_BUSY; - else if (ret_done == EC_ERROR_TIMEOUT) + else if (ret_done == EC_ERROR_TIMEOUT) { + /* + * If our transaction timed out then our i2c controller + * may be wedged without showing any other outward signs + * of failure. Reset the controller so that future + * transactions have a chance of success. + */ + reset_controller(controller); return EC_ERROR_TIMEOUT; + } else return EC_ERROR_UNKNOWN; }