summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlexandre Courbot <acourbot@nvidia.com>2011-12-16 15:10:47 +0900
committerVarun Colbert <vcolbert@nvidia.com>2012-01-30 12:24:37 -0800
commit1658352e80ca385ccf188f7f5cfe1b3534c09fd0 (patch)
treea0739e77592872cfa5124d803440d5c92e46b914
parent221816f472f26810a28872ad28d6807907f5ad96 (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
-rw-r--r--drivers/i2c/busses/i2c-tegra.c8
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);