summaryrefslogtreecommitdiffstats
path: root/drivers/i2c/i2c-core.h
diff options
context:
space:
mode:
authorWolfram Sang2019-04-03 14:40:10 +0200
committerWolfram Sang2019-04-16 13:08:11 +0200
commit63b96983a5ddfedd7daea72dbbc08ea873c54f27 (patch)
treedcb74bf00cfff708620b95b6e0d1e7328f8d2106 /drivers/i2c/i2c-core.h
parenti2c: core: use I2C locking behaviour also for SMBUS (diff)
downloadkernel-qcow2-linux-63b96983a5ddfedd7daea72dbbc08ea873c54f27.tar.gz
kernel-qcow2-linux-63b96983a5ddfedd7daea72dbbc08ea873c54f27.tar.xz
kernel-qcow2-linux-63b96983a5ddfedd7daea72dbbc08ea873c54f27.zip
i2c: core: introduce callbacks for atomic transfers
We had the request to access devices very late when interrupts are not available anymore multiple times now. Mostly to prepare shutdown or reboot. Allow adapters to specify a specific callback for this case. Note that we fall back to the generic {master|smbus}_xfer callback if this new atomic one is not present. This is intentional to preserve the previous behaviour and avoid regressions. Because there are drivers not using interrupts or because it might have worked "accidently" before. Signed-off-by: Wolfram Sang <wsa+renesas@sang-engineering.com> Reviewed-by Andy Shevchenko <andriy.shevchenko@linux.intel.com> Tested-by: Stefan Lengfeld <contact@stefanchrist.eu> Signed-off-by: Wolfram Sang <wsa@the-dreams.de>
Diffstat (limited to 'drivers/i2c/i2c-core.h')
-rw-r--r--drivers/i2c/i2c-core.h7
1 files changed, 5 insertions, 2 deletions
diff --git a/drivers/i2c/i2c-core.h b/drivers/i2c/i2c-core.h
index deea47c576e5..f9d0c417b5a5 100644
--- a/drivers/i2c/i2c-core.h
+++ b/drivers/i2c/i2c-core.h
@@ -43,10 +43,13 @@ static inline int __i2c_lock_bus_helper(struct i2c_adapter *adap)
{
int ret = 0;
- if (i2c_in_atomic_xfer_mode())
+ if (i2c_in_atomic_xfer_mode()) {
+ WARN(!adap->algo->master_xfer_atomic && !adap->algo->smbus_xfer_atomic,
+ "No atomic I2C transfer handler for '%s'\n", dev_name(&adap->dev));
ret = i2c_trylock_bus(adap, I2C_LOCK_SEGMENT) ? 0 : -EAGAIN;
- else
+ } else {
i2c_lock_bus(adap, I2C_LOCK_SEGMENT);
+ }
return ret;
}