• Abhishek Sahu's avatar
    i2c: qup: proper error handling for i2c error in BAM mode · 3f450d3e
    Abhishek Sahu authored
    Currently the i2c error handling in BAM mode is not working
    properly in stress condition.
    
    1. After an error, the FIFO are being written with FLUSH and
       EOT tags which should not be required since already these tags
       have been written in BAM descriptor itself.
    
    2. QUP state is being moved to RESET in IRQ handler in case
       of error. When QUP HW encounters an error in BAM mode then it
       moves the QUP STATE to PAUSE state. In this case, I2C_FLUSH
       command needs to be executed while moving to RUN_STATE by writing
       to the QUP_STATE register with the I2C_FLUSH bit set to 1.
    
    3. In Error case, sometimes, QUP generates more than one
       interrupt which will trigger the complete again. After an error,
       the flush operation will be scheduled after doing
       reinit_completion which should be triggered by BAM IRQ callback.
       If the second QUP IRQ comes during this time then it will call
       the complete and the transfer function will assume the all the
       BAM HW descriptors have been completed.
    
    4. The release DMA is being called after each error which
       will free the DMA tx and rx channels. The error like NACK is very
       common in I2C transfer and every time this will be overhead. Now,
       since the error handling is proper so this release channel can be
       completely avoided.
    Signed-off-by: default avatarAbhishek Sahu <absahu@codeaurora.org>
    Reviewed-by: default avatarSricharan R <sricharan@codeaurora.org>
    Reviewed-by: default avatarAustin Christ <austinwc@codeaurora.org>
    Signed-off-by: default avatarWolfram Sang <wsa@the-dreams.de>
    3f450d3e
i2c-qup.c 38.3 KB