Skip to content

Commit e365422

Browse files
warp5twAndi Shyti
authored andcommitted
i2c: npcm: correct the read/write operation procedure
Originally the driver uses the XMIT bit in SMBnST register to decide the upcoming i2c transaction. If XMIT bit is 1, then it will be an i2c write operation. If it's 0, then a read operation will be executed. In slave mode the XMIT bit can simply be used directly to set the state. XMIT bit can be used as an indication to the current state of the state machine during slave operation. (meaning XMIT = 1 during writing and XMIT = 0 during reading). In master operation XMIT is valid only if there are no bus errors. For example: in a multi master where the same module is switching from master to slave at runtime, and there are collisions, the XMIT bit cannot be trusted. However the maser already "knows" what the bus state is, so this bit is not needed and the driver can just track what it is currently doing. Signed-off-by: Tyrone Ting <kfting@nuvoton.com> Reviewed-by: Tali Perry <tali.perry1@gmail.com> Signed-off-by: Andi Shyti <andi.shyti@kernel.org>
1 parent a5089cd commit e365422

1 file changed

Lines changed: 2 additions & 5 deletions

File tree

drivers/i2c/busses/i2c-npcm7xx.c

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1628,13 +1628,10 @@ static void npcm_i2c_irq_handle_sda(struct npcm_i2c *bus, u8 i2cst)
16281628
npcm_i2c_wr_byte(bus, bus->dest_addr | BIT(0));
16291629
/* SDA interrupt, after start\restart */
16301630
} else {
1631-
if (NPCM_I2CST_XMIT & i2cst) {
1632-
bus->operation = I2C_WRITE_OPER;
1631+
if (bus->operation == I2C_WRITE_OPER)
16331632
npcm_i2c_irq_master_handler_write(bus);
1634-
} else {
1635-
bus->operation = I2C_READ_OPER;
1633+
else if (bus->operation == I2C_READ_OPER)
16361634
npcm_i2c_irq_master_handler_read(bus);
1637-
}
16381635
}
16391636
}
16401637

0 commit comments

Comments
 (0)