i2c: npcm: Correct slave role behavior
authorTali Perry <tali.perry1@gmail.com>
Wed, 25 May 2022 03:23:39 +0000 (11:23 +0800)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 17 Aug 2022 12:23:18 +0000 (14:23 +0200)
[ Upstream commit d7aa1b149b8fc04d802879cf4662010aa4a42deb ]

Correct the slave transaction logic to be compatible with the generic
slave backend driver.

Fixes: 56a1485b102e ("i2c: npcm7xx: Add Nuvoton NPCM I2C controller driver")
Signed-off-by: Tali Perry <tali.perry1@gmail.com>
Signed-off-by: Tyrone Ting <kfting@nuvoton.com>
Reviewed-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
Signed-off-by: Wolfram Sang <wsa@kernel.org>
Signed-off-by: Sasha Levin <sashal@kernel.org>
drivers/i2c/busses/i2c-npcm7xx.c

index ab31e7f..31e3d2c 100644 (file)
@@ -912,11 +912,15 @@ static int npcm_i2c_slave_get_wr_buf(struct npcm_i2c *bus)
        for (i = 0; i < I2C_HW_FIFO_SIZE; i++) {
                if (bus->slv_wr_size >= I2C_HW_FIFO_SIZE)
                        break;
-               i2c_slave_event(bus->slave, I2C_SLAVE_READ_REQUESTED, &value);
+               if (bus->state == I2C_SLAVE_MATCH) {
+                       i2c_slave_event(bus->slave, I2C_SLAVE_READ_REQUESTED, &value);
+                       bus->state = I2C_OPER_STARTED;
+               } else {
+                       i2c_slave_event(bus->slave, I2C_SLAVE_READ_PROCESSED, &value);
+               }
                ind = (bus->slv_wr_ind + bus->slv_wr_size) % I2C_HW_FIFO_SIZE;
                bus->slv_wr_buf[ind] = value;
                bus->slv_wr_size++;
-               i2c_slave_event(bus->slave, I2C_SLAVE_READ_PROCESSED, &value);
        }
        return I2C_HW_FIFO_SIZE - ret;
 }
@@ -964,7 +968,6 @@ static void npcm_i2c_slave_xmit(struct npcm_i2c *bus, u16 nwrite,
        if (nwrite == 0)
                return;
 
-       bus->state = I2C_OPER_STARTED;
        bus->operation = I2C_WRITE_OPER;
 
        /* get the next buffer */