Skip to content

Commit

Permalink
i2c: aspeed: Reset the i2c controller when timeout occurs
Browse files Browse the repository at this point in the history
commit fee4651 upstream.

Reset the i2c controller when an i2c transfer timeout occurs.
The remaining interrupts and device should be reset to avoid
unpredictable controller behavior.

Fixes: 2e57b7c ("i2c: aspeed: Add multi-master use case support")
Cc: <stable@vger.kernel.org> # v5.1+
Signed-off-by: Tommy Huang <tommy_huang@aspeedtech.com>
Reviewed-by: Andi Shyti <andi.shyti@kernel.org>
Signed-off-by: Wolfram Sang <wsa@kernel.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
  • Loading branch information
TommyHuang0527 authored and gregkh committed Sep 23, 2023
1 parent 2ec4d50 commit 494fb25
Showing 1 changed file with 5 additions and 2 deletions.
7 changes: 5 additions & 2 deletions drivers/i2c/busses/i2c-aspeed.c
Expand Up @@ -698,13 +698,16 @@ static int aspeed_i2c_master_xfer(struct i2c_adapter *adap,

if (time_left == 0) {
/*
* If timed out and bus is still busy in a multi master
* environment, attempt recovery at here.
* In a multi-master setup, if a timeout occurs, attempt
* recovery. But if the bus is idle, we still need to reset the
* i2c controller to clear the remaining interrupts.
*/
if (bus->multi_master &&
(readl(bus->base + ASPEED_I2C_CMD_REG) &
ASPEED_I2CD_BUS_BUSY_STS))
aspeed_i2c_recover_bus(bus);
else
aspeed_i2c_reset(bus);

/*
* If timed out and the state is still pending, drop the pending
Expand Down

0 comments on commit 494fb25

Please sign in to comment.