Skip to content

Commit 54f1840

Browse files
zhangjian3032wsakernel
authored andcommitted
i2c: aspeed: Fix i2c bus hang in slave read
When the `CONFIG_I2C_SLAVE` option is enabled and the device operates as a slave, a situation arises where the master sends a START signal without the accompanying STOP signal. This action results in a persistent I2C bus timeout. The core issue stems from the fact that the i2c controller remains in a slave read state without a timeout mechanism. As a consequence, the bus perpetually experiences timeouts. In this case, the i2c bus will be reset, but the slave_state reset is missing. Fixes: fee4651 ("i2c: aspeed: Reset the i2c controller when timeout occurs") Signed-off-by: Jian Zhang <[email protected]> Acked-by: Andi Shyti <[email protected]> Tested-by: Andrew Jeffery <[email protected]> Reviewed-by: Andrew Jeffery <[email protected]> Signed-off-by: Wolfram Sang <[email protected]>
1 parent 94f6f05 commit 54f1840

File tree

1 file changed

+2
-1
lines changed

1 file changed

+2
-1
lines changed

drivers/i2c/busses/i2c-aspeed.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -749,6 +749,8 @@ static void __aspeed_i2c_reg_slave(struct aspeed_i2c_bus *bus, u16 slave_addr)
749749
func_ctrl_reg_val = readl(bus->base + ASPEED_I2C_FUN_CTRL_REG);
750750
func_ctrl_reg_val |= ASPEED_I2CD_SLAVE_EN;
751751
writel(func_ctrl_reg_val, bus->base + ASPEED_I2C_FUN_CTRL_REG);
752+
753+
bus->slave_state = ASPEED_I2C_SLAVE_INACTIVE;
752754
}
753755

754756
static int aspeed_i2c_reg_slave(struct i2c_client *client)
@@ -765,7 +767,6 @@ static int aspeed_i2c_reg_slave(struct i2c_client *client)
765767
__aspeed_i2c_reg_slave(bus, client->addr);
766768

767769
bus->slave = client;
768-
bus->slave_state = ASPEED_I2C_SLAVE_INACTIVE;
769770
spin_unlock_irqrestore(&bus->lock, flags);
770771

771772
return 0;

0 commit comments

Comments
 (0)