summaryrefslogtreecommitdiff
path: root/drivers
diff options
context:
space:
mode:
authorSai Pavan Boddu <sai.pavan.boddu@xilinx.com>2022-03-01 09:16:50 +0100
committerMichal Simek <michal.simek@xilinx.com>2022-03-09 12:36:37 +0100
commit1bc2a79a4cde5f703b33342f2fcea8af208614ed (patch)
tree931db23f94d07d33bd204e677a436c2eeecad855 /drivers
parentd926695cc5680edfff9cfef36a14933ee3585fbf (diff)
i2c: i2c-cdns: Start read transaction after write to transfer_size reg
Avoid a race condition where read transaction is started keeping expected bytes as 0. Which sometimes would result in sending STOP signal as no data is expected. Observed on QEMU platform. Signed-off-by: Sai Pavan Boddu <sai.pavan.boddu@xilinx.com> Reviewed-by: Ashok Reddy Soma <ashok.reddy.soma@xilinx.com> Signed-off-by: Michal Simek <michal.simek@xilinx.com> Link: https://lore.kernel.org/r/487c8026791bfd60719403a2df2c54bb0ae99232.1646122610.git.michal.simek@xilinx.com
Diffstat (limited to 'drivers')
-rw-r--r--drivers/i2c/i2c-cdns.c2
1 files changed, 1 insertions, 1 deletions
diff --git a/drivers/i2c/i2c-cdns.c b/drivers/i2c/i2c-cdns.c
index a650dd69b8..5736afb451 100644
--- a/drivers/i2c/i2c-cdns.c
+++ b/drivers/i2c/i2c-cdns.c
@@ -375,7 +375,6 @@ static int cdns_i2c_read_data(struct i2c_cdns_bus *i2c_bus, u32 addr, u8 *data,
curr_recv_count = recv_count;
}
} else if (recv_count && !hold_quirk && !curr_recv_count) {
- writel(addr, &regs->address);
if (recv_count > CDNS_I2C_TRANSFER_SIZE) {
writel(CDNS_I2C_TRANSFER_SIZE,
&regs->transfer_size);
@@ -384,6 +383,7 @@ static int cdns_i2c_read_data(struct i2c_cdns_bus *i2c_bus, u32 addr, u8 *data,
writel(recv_count, &regs->transfer_size);
curr_recv_count = recv_count;
}
+ writel(addr, &regs->address);
}
}