From ba9cd4c3e087824d6129eb70950b687057aada51 Mon Sep 17 00:00:00 2001 From: Mike Rapoport Date: Sun, 27 Jan 2008 18:14:50 +0100 Subject: [PATCH] --- yaml --- r: 77341 b: refs/heads/master c: cea443a81c9c6257bf2d00f1392f7d1d4ce03b75 h: refs/heads/master i: 77339: 1ef1a47ba3350a4d212c5abd6e7ecdc50c32d2a8 v: v3 --- [refs] | 2 +- trunk/drivers/i2c/i2c-core.c | 12 +++++++++++- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/[refs] b/[refs] index 2d9f626abcdf..bcabf3ccde37 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 5271071b20dee56c01b6b9d8e275611403d3d383 +refs/heads/master: cea443a81c9c6257bf2d00f1392f7d1d4ce03b75 diff --git a/trunk/drivers/i2c/i2c-core.c b/trunk/drivers/i2c/i2c-core.c index 7161f913de14..ddd1b83f44d4 100644 --- a/trunk/drivers/i2c/i2c-core.c +++ b/trunk/drivers/i2c/i2c-core.c @@ -33,6 +33,8 @@ #include #include #include +#include +#include #include #include @@ -861,7 +863,15 @@ int i2c_transfer(struct i2c_adapter * adap, struct i2c_msg *msgs, int num) } #endif - mutex_lock_nested(&adap->bus_lock, adap->level); + if (in_atomic() || irqs_disabled()) { + ret = mutex_trylock(&adap->bus_lock); + if (!ret) + /* I2C activity is ongoing. */ + return -EAGAIN; + } else { + mutex_lock_nested(&adap->bus_lock, adap->level); + } + ret = adap->algo->master_xfer(adap,msgs,num); mutex_unlock(&adap->bus_lock);