mirror of
https://github.com/Telecominfraproject/OpenCellular.git
synced 2026-01-11 18:35:28 +00:00
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:
committed by
ChromeOS Commit Bot
parent
70951c9b75
commit
d43ced8c8d
@@ -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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user