• Shinya Kuribayashi's avatar
    i2c-designware: Divide i2c_dw_xfer_msg into two functions · 81e798b7
    Shinya Kuribayashi authored
    We have some steps at the top of i2c_dw_xfer_msg() to set up a slave
    address and enable DW I2C core.  And it's executed only when we don't
    have STATUS_WRITE_IN_PROGRESS.
    
    But we need to make sure that STATUS_WRITE_IN_PROGRESS only indicates
    that we have a pending i2c_msg to process.  In other words, even if
    STATUS_WRITE_IN_PROGRESS is not set, that doesn't mean we're at initial
    state in the I2C transaction.
    
    Since i2c_dw_xfer_msg() will be invoked again and again during a
    transaction, those init steps have a possibility to be re-processed
    needlessly.  For example, this issue easily takes place when processing
    a combined transaction with a certain condition (the number of tx bytes
    in the first i2c_msg, equals to the Tx FIFO depth).
    
    Consequently we should not use STATUS_WRITE_IN_PROGRESS to determine
    where we're at in an I2C transaction.  It would be better to separate
    those initialization steps from i2c_dw_xfer_msg().
    Signed-off-by: default avatarShinya Kuribayashi <shinya.kuribayashi@necel.com>
    Acked-by: default avatarBaruch Siach <baruch@tkos.co.il>
    Signed-off-by: default avatarBen Dooks <ben-linux@fluff.org>
    81e798b7
i2c-designware.c 20.1 KB