summaryrefslogtreecommitdiff
path: root/rust
diff options
context:
space:
mode:
authorJonas Gorski <jonas.gorski@bisdn.de>2026-07-17 10:55:07 +0200
committerAndi Shyti <andi.shyti@kernel.org>2026-07-28 22:44:48 +0200
commit98f2e9e6d6f91a6abb43f166b244b428ba85fa2b (patch)
tree5c3a1eeb46be2a565c97de0a4a95516d86a8688a /rust
parent00d86dd5c2034e0e139e4806137b3b43e07ddd83 (diff)
i2c: iproc: reset bus after timeout if START_BUSY is stuck
If a transaction times out, the START_BUSY signal can stay up, and subsequent transactaction attempts will fail as the bus is still considered busy. I can easily trigger this by attempting to read from an address with no device, e.g. when running i2cdetect. After the first read times out, all subsequent read attempts return busy. To get to a working state again, the controller needs to be reset to clear the START_BUSY signal. So check for START_BUSY still asserted on a timeout, and do reset in case it is, This is also done by the original non-upstream iproc-smbus driver implementation [1]. Works around situations like: bcm-iproc-2c 1803b000.i2c: transaction timed out bcm-iproc-2c 1803b000.i2c: bus is busy bcm-iproc-2c 1803b000.i2c: bus is busy bcm-iproc-2c 1803b000.i2c: bus is busy bcm-iproc-2c 1803b000.i2c: bus is busy bcm-iproc-2c 1803b000.i2c: bus is busy ... where the bus never recovers after a timeout. [1] https://github.com/opencomputeproject/onie/blob/master/patches/kernel/3.2.69/driver-iproc-smbus.patch Fixes: e6e5dd3566e0 ("i2c: iproc: Add Broadcom iProc I2C Driver") Signed-off-by: Jonas Gorski <jonas.gorski@bisdn.de> Cc: <stable@vger.kernel.org> # v4.0+ Acked-by: Ray Jui <ray.jui@broadcom.com> Signed-off-by: Andi Shyti <andi.shyti@kernel.org> Link: https://lore.kernel.org/r/20260717085507.34209-1-jonas.gorski@bisdn.de
Diffstat (limited to 'rust')
0 files changed, 0 insertions, 0 deletions