summaryrefslogtreecommitdiff
path: root/drivers/i2c
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 /drivers/i2c
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
Diffstat (limited to 'drivers/i2c')
-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);