• Lucas Stach's avatar
    i2c: mxs: remove races in PIO code · 535ebd21
    Lucas Stach authored
    This commit fixes the three following races in PIO code:
    
    - The CTRL0 register is racy in itself, when programming transfer state and
      run bit in the same cycle the hardware sometimes ends up using the state
      from the last transfer. Fix this by programming state in one cycle, make
      sure the write is flushed down APBX bus by reading back the reg and only
      then trigger the run bit.
    
    - Only clear the DMAREQ bit in DEBUG0 after the read/write to the data reg
      happened. Otherwise we are racing with the hardware about who touches
      the data reg first.
    
    - When checking for completion of a transfer it's not sufficient to check
      if the data engine finished, but also a check for i2c bus idle is needed.
      In PIO mode we are really fast to program the next transfer after a finished
      one, so the controller possibly tries to start a new transfer while the
      clkgen engine is still busy writing the NAK/STOP from the last transfer to
      the bus.
    Signed-off-by: default avatarLucas Stach <l.stach@pengutronix.de>
    Signed-off-by: default avatarWolfram Sang <wsa@the-dreams.de>
    535ebd21
i2c-mxs.c 19.3 KB