diff options
author | Tali Perry <tali.perry1@gmail.com> | 2022-05-25 11:23:39 +0800 |
---|---|---|
committer | Wolfram Sang <wsa@kernel.org> | 2022-06-08 22:01:12 +0200 |
commit | d7aa1b149b8fc04d802879cf4662010aa4a42deb (patch) | |
tree | c6ee626c0af1962e22d50231a8cc46eb7a5b4434 /drivers | |
parent | 47d506d1a28fd10a9fb1f33df5622d88fae72095 (diff) | |
download | linux-d7aa1b149b8fc04d802879cf4662010aa4a42deb.tar.gz linux-d7aa1b149b8fc04d802879cf4662010aa4a42deb.tar.bz2 linux-d7aa1b149b8fc04d802879cf4662010aa4a42deb.zip |
i2c: npcm: Correct slave role behavior
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>
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/i2c/busses/i2c-npcm7xx.c | 9 |
1 files changed, 6 insertions, 3 deletions
diff --git a/drivers/i2c/busses/i2c-npcm7xx.c b/drivers/i2c/busses/i2c-npcm7xx.c index b5cc83e51029..b4d218c6c8fb 100644 --- a/drivers/i2c/busses/i2c-npcm7xx.c +++ b/drivers/i2c/busses/i2c-npcm7xx.c @@ -915,11 +915,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; } @@ -967,7 +971,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 */ |