]> git.baikalelectronics.ru Git - kernel.git/commit
i2c: cadence: Clear HOLD bit at correct time in Rx path
authorRaviteja Narayanam <raviteja.narayanam@xilinx.com>
Fri, 3 Jul 2020 13:56:12 +0000 (19:26 +0530)
committerWolfram Sang <wsa@kernel.org>
Wed, 22 Jul 2020 10:28:07 +0000 (12:28 +0200)
commita2e2078114f2915f62a573002ce8365f8207607d
tree1803736a48d538cbd0c42e74b6331db8a6fde6c0
parent1c5150e0a415cf3c6885939059a537900223d8b8
i2c: cadence: Clear HOLD bit at correct time in Rx path

There are few issues on Zynq SOC observed in the stress tests causing
timeout errors. Even though all the data is received, timeout error
is thrown. This is due to an IP bug in which the COMP bit in ISR is
not set at end of transfer and completion interrupt is not generated.

This bug is seen on Zynq platforms when the following condition occurs:
Master read & HOLD bit set & Transfer size register reaches '0'.

One workaround is to clear the HOLD bit before the transfer size
register reaches '0'. The current implementation checks for this at
the start of the loop and also only for less than FIFO DEPTH case
(ignoring the equal to case).

So clear the HOLD bit when the data yet to receive is less than or
equal to the FIFO DEPTH. This avoids the IP bug condition.

Signed-off-by: Raviteja Narayanam <raviteja.narayanam@xilinx.com>
Acked-by: Michal Simek <michal.simek@xilinx.com>
Signed-off-by: Wolfram Sang <wsa@kernel.org>
drivers/i2c/busses/i2c-cadence.c