• Noralf Trønnes's avatar
    i2c: bcm2835: Protect against unexpected TXW/RXR interrupts · d4030d75
    Noralf Trønnes authored
    If an unexpected TXW or RXR interrupt occurs (msg_buf_remaining == 0),
    the driver has no way to fill/drain the FIFO to stop the interrupts.
    In this case the controller has to be disabled and the transfer
    completed to avoid hang.
    
    (CLKT | ERR) and DONE interrupts are completed in their own paths, and
    the controller is disabled in the transfer function after completion.
    Unite the code paths and do disabling inside the interrupt routine.
    
    Clear interrupt status bits in the united completion path instead of
    trying to do it on every interrupt which isn't necessary.
    Only CLKT, ERR and DONE can be cleared that way.
    
    Add the status value to the error value in case of TXW/RXR errors to
    distinguish them from the other S_LEN error.
    Signed-off-by: default avatarNoralf Trønnes <noralf@tronnes.org>
    Reviewed-by: default avatarEric Anholt <eric@anholt.net>
    Signed-off-by: default avatarWolfram Sang <wsa@the-dreams.de>
    d4030d75
i2c-bcm2835.c 9.59 KB