summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorShawn Nematbakhsh <shawnn@chromium.org>2015-08-21 13:09:34 -0700
committerChromeOS bot <3su6n15k.default@developer.gserviceaccount.com>2015-09-16 23:48:36 +0000
commitd2a679469044127073c065c4c3e151fdcdfa2892 (patch)
tree572d7af13b0b30e959c9f2732660828764e891c9
parentb2f5a9a77c5492352a723c1fd50a2b85462466e8 (diff)
downloadchrome-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.c6
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)