diff options
author | Alexandre Courbot <acourbot@nvidia.com> | 2011-12-16 15:10:47 +0900 |
---|---|---|
committer | Varun Colbert <vcolbert@nvidia.com> | 2012-01-30 12:24:37 -0800 |
commit | 1658352e80ca385ccf188f7f5cfe1b3534c09fd0 (patch) | |
tree | a0739e77592872cfa5124d803440d5c92e46b914 /drivers/i2c | |
parent | 221816f472f26810a28872ad28d6807907f5ad96 (diff) |
tegra: i2c: mutex-protect access to is_suspended
Before making a transfer, is_suspended is checked to make sure the
device is alive. However this check is done without holding the lock
that the suspend and resume functions hold to change the suspend state,
creating the possibility of a race condition.
Bug 916336
Reviewed-on: http://git-master/r/70488
Change-Id: I7b4e52f686b0b372f3fc8ba7c7a4e4fdcdb6ba10
Signed-off-by: Alexandre Courbot <acourbot@nvidia.com>
Signed-off-by: Varun Wadekar <vwadekar@nvidia.com>
Reviewed-on: http://git-master/r/77740
Reviewed-by: Automatic_Commit_Validation_User
Diffstat (limited to 'drivers/i2c')
-rw-r--r-- | drivers/i2c/busses/i2c-tegra.c | 8 |
1 files changed, 5 insertions, 3 deletions
diff --git a/drivers/i2c/busses/i2c-tegra.c b/drivers/i2c/busses/i2c-tegra.c index d28cd4e9d3d0..55cbfb39d17f 100644 --- a/drivers/i2c/busses/i2c-tegra.c +++ b/drivers/i2c/busses/i2c-tegra.c @@ -693,11 +693,13 @@ static int tegra_i2c_xfer(struct i2c_adapter *adap, struct i2c_msg msgs[], int ret = 0; unsigned long flags; - if (i2c_dev->is_suspended) - return -EBUSY; - rt_mutex_lock(&i2c_dev->dev_lock); + if (i2c_dev->is_suspended) { + rt_mutex_unlock(&i2c_dev->dev_lock); + return -EBUSY; + } + if (i2c_dev->last_mux != i2c_bus->mux) { tegra_pinmux_set_safe_pinmux_table(i2c_dev->last_mux, i2c_dev->last_mux_len); |