]> git.dujemihanovic.xyz Git - u-boot.git/commit
i2c: mvtwsi: reset controller if stuck in "bus error" state
authorSam Edwards <cfsworks@gmail.com>
Tue, 25 Jul 2023 22:13:05 +0000 (16:13 -0600)
committerHeiko Schocher <hs@denx.de>
Tue, 15 Aug 2023 04:52:04 +0000 (06:52 +0200)
commit250454c59b1b056d47cbb0c6d8d09a68416c9776
treed32de20b74b9a5c3fa28e813a056d44989cb0aad
parent832148f675e427060be074c276956962fa9b5cb6
i2c: mvtwsi: reset controller if stuck in "bus error" state

The MVTWSI controller can act either as a master or slave device. When
acting as a master, the FSM is driven by the CPU. As a slave, the FSM is
driven by the bus directly. In what is (apparently) a safety mechanism,
if the bus transitions our FSM in any improper way, the FSM goes to a
"bus error" state (0x00). I could find no documented or experimental way
to get the FSM out of this state, except for a controller reset.

Since U-Boot only uses the MVTWSI controller as a bus master, this
feature only gets in the way: we do not care what happened on the bus
previously as long as the bus is ready for a new transaction. So, when
trying to start a new transaction, check for this state and reset the
controller if necessary.

Note that this should not be confused with the "deblocking" technique
(used by the `i2c reset` command), which involves pulsing SCL repeatedly
if SDA is found to be held low, in an attempt to force the bus back to
an idle state. This patch only resets the controller in case something
else had previously upset it, and (in principle) results in no
externally-observable change in behavior.

Signed-off-by: Sam Edwards <CFSworks@gmail.com>
Reviewed-by: Stefan Roese <sr@denx.de>
Reviewed-by: Heiko Schocher <hs@denx.de>
drivers/i2c/mvtwsi.c