• Adamski, Krzysztof (Nokia - PL/Wroclaw)'s avatar
    i2c: axxia: support sequence command mode · 3035a669
    In order to comply with SMBus specification, the Axxia I²C module will
    abort the multi message transfer if the delay between finishing sending
    one message and starting another is longer than 25ms. Unfortunately it
    isn't that hard to trigger this situation on a busy system. In order to
    fix this problem, we should make sure hardware does whole transaction
    without waiting for software to fill some data.
    
    Fortunately, in addition to Manual mode that is currently used by the
    driver to perform I²C transfers, the module supports also so called
    Sequence mode. In this mode, the module automatically performs
    predefined sequence of operations - it sends a slave address, transmits
    specified number of bytes from the FIFO, changes transfer direction,
    resends the slave address and then reads specified number of bytes to
    FIFO. While very inflexible, this does fit a most common case of multi
    message transfer - the one where you first write a register number you
    want to read and then read it.
    
    To use this mode effectively, a number of conditions must be met to
    ensure the transaction does fit the predefined sequence. In case this is
    not the case, a fallback to manual mode is used.
    
    The initialization of this mode is very similar to Manual mode. The most
    notable difference is different bit in the Master Interrupt Status
    designating finishing of transaction. Also some of the errors, like TSS,
    cannot happen in this mode.
    
    While it is possible to support transactions requesting a read of any
    size (RFL interrupt will be generated when FIFO size is not enough) the
    TFL interrupt is not available in this mode, thus the write part of the
    transaction cannot exceed FIFO_SIZE (8).
    
    Note that in case of a NAK during transaction, the NA/ND status bits
    will be set before STOP command is generated, triggering an interrupt
    while the controller is still busy. Current solution for this problem is
    to actively wait for this command to stop before leaving xfer callback.
    Signed-off-by: default avatarKrzysztof Adamski <krzysztof.adamski@nokia.com>
    Reviewed-by: default avatarAlexander Sverdlin <alexander.sverdlin@nokia.com>
    [wsa: added braces around else branch spotted by checkpatch]
    Signed-off-by: default avatarWolfram Sang <wsa@the-dreams.de>
    3035a669
i2c-axxia.c 19 KB