From f2e0f787bf83da84cd8f31d86ca214ef290c8d70 Mon Sep 17 00:00:00 2001 From: Wei-Tai Lee Date: Thu, 8 Jun 2023 10:40:10 +0800 Subject: [PATCH] drivers: i2c: add error handling Return errors when failing at consecutive transactions and missing targets. Signed-off-by: Wei-Tai Lee --- drivers/i2c/i2c_andes_atciic100.c | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/drivers/i2c/i2c_andes_atciic100.c b/drivers/i2c/i2c_andes_atciic100.c index 17ced4dd0d..918048ee98 100644 --- a/drivers/i2c/i2c_andes_atciic100.c +++ b/drivers/i2c/i2c_andes_atciic100.c @@ -185,6 +185,10 @@ static int i2c_atciic100_transfer(const struct device *dev, ret = i2c_atciic100_controller_receive(dev, addr, msgs[i].buf, msgs[i].len, msgs[i].flags); } + + if (ret < 0) { + goto exit; + } } exit: @@ -296,6 +300,11 @@ static int i2c_atciic100_controller_send(const struct device *dev, sys_write32(reg, I2C_CMD(dev)); k_sem_take(&dev_data->device_sync_sem, K_FOREVER); + + if (dev_data->status.target_ack != 1) { + return -EIO; + } + dev_data->status.target_ack = 0; return 0; } @@ -388,6 +397,10 @@ static int i2c_atciic100_controller_receive(const struct device *dev, sys_write32(reg, I2C_CMD(dev)); k_sem_take(&dev_data->device_sync_sem, K_FOREVER); + if (dev_data->status.target_ack != 1) { + return -EIO; + } + dev_data->status.target_ack = 0; return 0; }