From 56162a48eba7452fdbea2fb2aaee90a2e888fd2b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andrzej=20G=C5=82=C4=85bek?= Date: Thu, 14 Oct 2021 11:15:15 +0200 Subject: [PATCH] drivers: i2c: nrfx: Add implementation of i2c_recover_bus API function MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Both nRF I2C drivers (i2c_nrfx_twi and i2c_nrfx_twim) perform the bus recovery procedure in reaction to timeout (500 ms) of any requested message transfer. Add implementation of the I2C API recovery function in both these drivers so that it is also possible to execute this procedure directly. Signed-off-by: Andrzej Głąbek --- drivers/i2c/i2c_nrfx_twi.c | 13 +++++++++++-- drivers/i2c/i2c_nrfx_twim.c | 13 +++++++++++-- 2 files changed, 22 insertions(+), 4 deletions(-) diff --git a/drivers/i2c/i2c_nrfx_twi.c b/drivers/i2c/i2c_nrfx_twi.c index 21c1bc72f07..64ac076c47e 100644 --- a/drivers/i2c/i2c_nrfx_twi.c +++ b/drivers/i2c/i2c_nrfx_twi.c @@ -195,9 +195,18 @@ static int i2c_nrfx_twi_configure(const struct device *dev, return 0; } +static int i2c_nrfx_twi_recover_bus(const struct device *dev) +{ + nrfx_err_t err = nrfx_twi_bus_recover(get_dev_config(dev)->config.scl, + get_dev_config(dev)->config.sda); + + return (err == NRFX_SUCCESS ? 0 : -EBUSY); +} + static const struct i2c_driver_api i2c_nrfx_twi_driver_api = { - .configure = i2c_nrfx_twi_configure, - .transfer = i2c_nrfx_twi_transfer, + .configure = i2c_nrfx_twi_configure, + .transfer = i2c_nrfx_twi_transfer, + .recover_bus = i2c_nrfx_twi_recover_bus, }; static int init_twi(const struct device *dev) diff --git a/drivers/i2c/i2c_nrfx_twim.c b/drivers/i2c/i2c_nrfx_twim.c index a00d9fad005..1d181d489f0 100644 --- a/drivers/i2c/i2c_nrfx_twim.c +++ b/drivers/i2c/i2c_nrfx_twim.c @@ -259,9 +259,18 @@ static int i2c_nrfx_twim_configure(const struct device *dev, return 0; } +static int i2c_nrfx_twim_recover_bus(const struct device *dev) +{ + nrfx_err_t err = nrfx_twim_bus_recover(get_dev_config(dev)->config.scl, + get_dev_config(dev)->config.sda); + + return (err == NRFX_SUCCESS ? 0 : -EBUSY); +} + static const struct i2c_driver_api i2c_nrfx_twim_driver_api = { - .configure = i2c_nrfx_twim_configure, - .transfer = i2c_nrfx_twim_transfer, + .configure = i2c_nrfx_twim_configure, + .transfer = i2c_nrfx_twim_transfer, + .recover_bus = i2c_nrfx_twim_recover_bus, }; static int init_twim(const struct device *dev)