diff options
author | Shawn Nematbakhsh <shawnn@chromium.org> | 2015-08-21 13:09:34 -0700 |
---|---|---|
committer | ChromeOS bot <3su6n15k.default@developer.gserviceaccount.com> | 2015-09-16 23:48:36 +0000 |
commit | d2a679469044127073c065c4c3e151fdcdfa2892 (patch) | |
tree | 572d7af13b0b30e959c9f2732660828764e891c9 | |
parent | b2f5a9a77c5492352a723c1fd50a2b85462466e8 (diff) | |
download | chrome-ec-d2a679469044127073c065c4c3e151fdcdfa2892.tar.gz |
i2c: Fix i2c_lock deadlock on sysjump
On sysjump we attempt to lock all i2c ports in use, but locking is
by-controller. This leads to a deadlock if two ports from the same
controller are in use. Fix this by directly locking all controllers
present in the system.
BUG=chrome-os-partner:44214
TEST=`sysjump rw` and then `sysjump ro` on Strago
BRANCH=None
Change-Id: I21d65cd4455769414216016a5c97ad118a712117
Signed-off-by: Shawn Nematbakhsh <shawnn@chromium.org>
Reviewed-on: https://chromium-review.googlesource.com/294959
Reviewed-by: Aaron Durbin <adurbin@chromium.org>
(cherry picked from commit 9312676ab37de0be031d79629177c5590e83cc65)
Signed-off-by: Divagar Mohandass <divagar.mohandass@intel.com>
Reviewed-on: https://chromium-review.googlesource.com/299685
-rw-r--r-- | common/i2c.c | 6 |
1 files changed, 3 insertions, 3 deletions
diff --git a/common/i2c.c b/common/i2c.c index 3f9b586bb4..53e9598af9 100644 --- a/common/i2c.c +++ b/common/i2c.c @@ -72,9 +72,9 @@ void i2c_prepare_sysjump(void) { int i; - /* Lock all I2C port to prepare for sysjump */ - for (i = 0; i < i2c_ports_used; i++) - i2c_lock(i2c_ports[i].port, 1); + /* Lock all i2c controllers */ + for (i = 0; i < I2C_CONTROLLER_COUNT; ++i) + mutex_lock(port_mutex + i); } int i2c_read32(int port, int slave_addr, int offset, int *data) |