Skip to content
  • Michael Auchter's avatar
    i2c: i2c_cdns: fix write timeout on fifo boundary · 3104162a
    Michael Auchter authored
    
    
    This fixes an issue that would cause I2C writes to timeout when the
    number of bytes is a multiple of the FIFO depth (i.e. 16 bytes).
    
    Within the transfer loop, after writing the data register with a new
    byte to transfer, if the transfer size equals the FIFO depth, the loop
    pauses until the INTERRUPT_COMP bit asserts to indicate data has been
    sent. This same check is performed after the loop as well to ensure data
    has been transferred prior to returning.
    
    In the case where the amount of data to be written is a multiple of the
    FIFO depth, the transfer loop would wait for the INTERRUPT_COMP bit to
    assert after writing the final byte, and then wait for this bit to
    assert once more. However, since the transfer has finished at this
    point, no new data has been written to the data register, and hence
    INTERRUPT_COMP will never assert.
    
    Fix this by only waiting for INTERRUPT_COMP in the transfer loop if
    there's still data to be written.
    
    Signed-off-by: default avatarMichael Auchter <michael.auchter@ni.com>
    Reviewed-by: default avatarSimon Glass <sjg@chromium.org>
    3104162a