• Raviteja Narayanam's avatar
    i2c: cadence: Clear HOLD bit at correct time in Rx path · 12d4d9ec
    Raviteja Narayanam authored
    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: default avatarRaviteja Narayanam <raviteja.narayanam@xilinx.com>
    Acked-by: default avatarMichal Simek <michal.simek@xilinx.com>
    Signed-off-by: default avatarWolfram Sang <wsa@kernel.org>
    12d4d9ec
i2c-cadence.c 36.8 KB