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 <shawnn@chromium.org>
Reviewed-on: https://chromium-review.googlesource.com/295404
Reviewed-by: Aaron Durbin <adurbin@chromium.org>
This commit is contained in:
Shawn Nematbakhsh
2015-08-24 16:39:56 -07:00
committed by ChromeOS Commit Bot
parent 70951c9b75
commit d43ced8c8d

View File

@@ -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;
}