diff options
author | Wolfram Sang <wsa+renesas@sang-engineering.com> | 2019-04-03 15:40:10 +0300 |
---|---|---|
committer | Wolfram Sang <wsa@the-dreams.de> | 2019-04-16 14:08:11 +0300 |
commit | 63b96983a5ddfedd7daea72dbbc08ea873c54f27 (patch) | |
tree | dcb74bf00cfff708620b95b6e0d1e7328f8d2106 /drivers/i2c/i2c-core-base.c | |
parent | 83c42212d2544625b85f44a07d0ad96323e69250 (diff) | |
download | linux-63b96983a5ddfedd7daea72dbbc08ea873c54f27.tar.xz |
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-base.c')
-rw-r--r-- | drivers/i2c/i2c-core-base.c | 6 |
1 files changed, 5 insertions, 1 deletions
diff --git a/drivers/i2c/i2c-core-base.c b/drivers/i2c/i2c-core-base.c index ad14f38a67e4..4e6300dc2c4e 100644 --- a/drivers/i2c/i2c-core-base.c +++ b/drivers/i2c/i2c-core-base.c @@ -1890,7 +1890,11 @@ int __i2c_transfer(struct i2c_adapter *adap, struct i2c_msg *msgs, int num) /* Retry automatically on arbitration loss */ orig_jiffies = jiffies; for (ret = 0, try = 0; try <= adap->retries; try++) { - ret = adap->algo->master_xfer(adap, msgs, num); + if (i2c_in_atomic_xfer_mode() && adap->algo->master_xfer_atomic) + ret = adap->algo->master_xfer_atomic(adap, msgs, num); + else + ret = adap->algo->master_xfer(adap, msgs, num); + if (ret != -EAGAIN) break; if (time_after(jiffies, orig_jiffies + adap->timeout)) |