> On Wed, 2022-10-26 at 08:49 +0100, Conor Dooley wrote: > "Master receive mode" was not correctly sending ACKs/NACKs in the > interrupt handler. Bring the handling of M_SLAR_ACK, M_RX_DATA_ACKED > & > M_RX_DATA_NACKED in line with the Linux driver. > > Fixes: 0dc0d1e094 ("i2c: Add Microchip PolarFire SoC I2C driver") > Reported-by: Shravan Chippa <shravan.chi...@microchip.com> > Signed-off-by: Conor Dooley <conor.doo...@microchip.com> > --- > drivers/i2c/i2c-microchip.c | 23 +++++++++++++++++------ > 1 file changed, 17 insertions(+), 6 deletions(-) > > diff --git a/drivers/i2c/i2c-microchip.c b/drivers/i2c/i2c- > microchip.c > index 12f65d0af7..3a27459386 100644 > --- a/drivers/i2c/i2c-microchip.c > +++ b/drivers/i2c/i2c-microchip.c > @@ -2,8 +2,9 @@ > /* > * Microchip I2C controller driver > * > - * Copyright (C) 2021 Microchip Technology Inc. > + * Copyright (C) 2021-2022 Microchip Technology Inc. > * Padmarao Begari <padmarao.beg...@microchip.com> > + * Conor Dooley <conor.doo...@microchip.com> > */ > #include <common.h> > #include <clk.h> > @@ -265,16 +266,27 @@ static int mpfs_i2c_service_handler(struct > mpfs_i2c_bus *bus) > } > break; > case STATUS_M_SLAR_ACK: > - ctrl = readl(bus->base + MPFS_I2C_CTRL); > - ctrl |= CTRL_AA; > - writel(ctrl, bus->base + MPFS_I2C_CTRL); > - if (bus->msg_len == 0) { > + if (bus->msg_len > 1u) { > + ctrl = readl(bus->base + MPFS_I2C_CTRL); > + ctrl |= CTRL_AA; > + writel(ctrl, bus->base + MPFS_I2C_CTRL); > + } else if (bus->msg_len == 1u) { > + ctrl = readl(bus->base + MPFS_I2C_CTRL); > + ctrl &= ~CTRL_AA; > + writel(ctrl, bus->base + MPFS_I2C_CTRL); > + } else { > + ctrl = readl(bus->base + MPFS_I2C_CTRL); > + ctrl |= CTRL_AA; > + writel(ctrl, bus->base + MPFS_I2C_CTRL); > /* On the last byte to be transmitted, send > STOP */ > mpfs_i2c_stop(bus); > finish = true; > } > break; > case STATUS_M_RX_DATA_ACKED: > + mpfs_i2c_empty_rx(bus); > + break; > + case STATUS_M_RX_DATA_NACKED: > mpfs_i2c_empty_rx(bus); > if (bus->msg_len == 0) { > /* On the last byte to be transmitted, send > STOP */ > @@ -283,7 +295,6 @@ static int mpfs_i2c_service_handler(struct > mpfs_i2c_bus *bus) > } > break; > case STATUS_M_TX_DATA_NACK: > - case STATUS_M_RX_DATA_NACKED: > case STATUS_M_SLAR_NACK: > case STATUS_M_SLAW_NACK: > bus->msg_err = -ENXIO;
Reviewed-by: Padmarao Begari <padmarao.beg...@microchip.com>