• Michael Wu's avatar
    i2c: designware: slave should do WRITE_REQUESTED before WRITE_RECEIVED · 3b5f7f10
    Michael Wu authored
    Sometimes we would get the following flow when doing an i2cset:
    
    0x1 STATUS SLAVE_ACTIVITY=0x1 : RAW_INTR_STAT=0x514 : INTR_STAT=0x4
    I2C_SLAVE_WRITE_RECEIVED
    0x1 STATUS SLAVE_ACTIVITY=0x0 : RAW_INTR_STAT=0x714 : INTR_STAT=0x204
    I2C_SLAVE_WRITE_REQUESTED
    I2C_SLAVE_WRITE_RECEIVED
    
    Documentation/i2c/slave-interface.rst says that I2C_SLAVE_WRITE_REQUESTED,
    which is mandatory, should be sent while the data did not arrive yet. It
    means in a write-request I2C_SLAVE_WRITE_REQUESTED should be reported
    before any I2C_SLAVE_WRITE_RECEIVED.
    
    By the way, I2C_SLAVE_STOP didn't be reported in the above case because
    DW_IC_INTR_STAT was not 0x200.
    
    dev->status can be used to record the current state, especially Designware
    I2C controller has no interrupts to identify a write-request. This patch
    makes not only I2C_SLAVE_WRITE_REQUESTED been reported first when
    IC_INTR_RX_FULL is rising and dev->status isn't STATUS_WRITE_IN_PROGRESS
    but also I2C_SLAVE_STOP been reported when a STOP condition is received.
    Signed-off-by: default avatarMichael Wu <michael.wu@vatics.com>
    Acked-by: default avatarJarkko Nikula <jarkko.nikula@linux.intel.com>
    Signed-off-by: default avatarWolfram Sang <wsa@kernel.org>
    3b5f7f10
i2c-designware-slave.c 7.3 KB