summaryrefslogtreecommitdiff
path: root/drivers/i2c
diff options
context:
space:
mode:
authorSang-Hun Lee <sanlee@nvidia.com>2014-05-17 18:32:13 -0700
committerMandar Padmawar <mpadmawar@nvidia.com>2014-05-28 05:13:16 -0700
commit940ba3f873878d0ac1cd5b73052058f7f57dcf04 (patch)
tree07e1d6298d19c82c72d9683ce0f378a70858f160 /drivers/i2c
parent5045ce20afca4a6bd6f56b1999ffd933bb78bd22 (diff)
i2c: tegra: protect i2c state variables
- i2c state variables cancel_xfer_on_shutdown and atomic_xfer_only are accessed without any locking, which could lead to a race - lock the adapter when accessing these variables Bug 1510778 Change-Id: If4a69b1e85e3801616cf8f3da6938fca4b0ab816 Signed-off-by: Sang-Hun Lee <sanlee@nvidia.com> Reviewed-on: http://git-master/r/411129 Reviewed-by: Mandar Padmawar <mpadmawar@nvidia.com> Tested-by: Mandar Padmawar <mpadmawar@nvidia.com>
Diffstat (limited to 'drivers/i2c')
-rw-r--r--drivers/i2c/busses/i2c-tegra.c2
-rw-r--r--drivers/i2c/i2c-core.c6
2 files changed, 6 insertions, 2 deletions
diff --git a/drivers/i2c/busses/i2c-tegra.c b/drivers/i2c/busses/i2c-tegra.c
index 4081496bec24..fc0a0b11e09e 100644
--- a/drivers/i2c/busses/i2c-tegra.c
+++ b/drivers/i2c/busses/i2c-tegra.c
@@ -1236,7 +1236,7 @@ static int tegra_i2c_xfer(struct i2c_adapter *adap, struct i2c_msg msgs[],
struct tegra_i2c_dev *i2c_dev = i2c_get_adapdata(adap);
int i;
int ret = 0;
-
+ BUG_ON(!rt_mutex_is_locked(&(adap->bus_lock)));
if (i2c_dev->is_suspended)
return -EBUSY;
diff --git a/drivers/i2c/i2c-core.c b/drivers/i2c/i2c-core.c
index a2940fa428f2..620690c97ece 100644
--- a/drivers/i2c/i2c-core.c
+++ b/drivers/i2c/i2c-core.c
@@ -619,8 +619,10 @@ EXPORT_SYMBOL_GPL(i2c_shutdown_adapter);
void i2c_shutdown_clear_adapter(struct i2c_adapter *adapter)
{
+ i2c_lock_adapter(adapter);
adapter->cancel_xfer_on_shutdown = false;
adapter->atomic_xfer_only = true;
+ i2c_unlock_adapter(adapter);
}
EXPORT_SYMBOL_GPL(i2c_shutdown_clear_adapter);
@@ -1574,8 +1576,10 @@ int i2c_transfer(struct i2c_adapter *adap, struct i2c_msg *msgs, int num)
if (!adap->cancel_xfer_on_shutdown)
ret = __i2c_transfer(adap, msgs, num);
- else
+ else {
+ WARN_ON(1);
ret = -EPERM;
+ }
i2c_unlock_adapter(adap);
return ret;