@@ -430,6 +430,10 @@ static irqreturn_t cdns_i2c_master_isr(void *ptr)
((isr_status & CDNS_I2C_IXR_COMP) ||
(isr_status & CDNS_I2C_IXR_DATA))) {
unsigned char *p = id->p_recv_buf;
+ int check_hold = 0;
+
+ if ((id->recv_count <= 2*CDNS_I2C_FIFO_DEPTH) && !id->bus_hold_flag)
+ check_hold = cdns_i2c_readreg(CDNS_I2C_CR_OFFSET) & CDNS_I2C_CR_HOLD;
/* Read data if receive data valid is set */
while (cdns_i2c_readreg(CDNS_I2C_SR_OFFSET) &
CDNS_I2C_SR_RXDV) {
@@ -438,9 +442,6 @@ static irqreturn_t cdns_i2c_master_isr(void *ptr)
* RX data left is less than FIFO depth, unless
* repeated start is selected.
*/
- if ((id->recv_count < CDNS_I2C_FIFO_DEPTH) &&
- !id->bus_hold_flag)
- cdns_i2c_clear_bus_hold(id);
if (id->recv_count == 0) {
pr_notice("%s: i2c receive buffer filled : %u aborting transfer %p - %p\n",
@@ -450,6 +451,8 @@ static irqreturn_t cdns_i2c_master_isr(void *ptr)
*(id->p_recv_buf)++ =
cdns_i2c_readreg(CDNS_I2C_DATA_OFFSET);
+ if (check_hold && id->recv_count == CDNS_I2C_FIFO_DEPTH + 1)
+ cdns_i2c_clear_bus_hold(id);
id->recv_count--;
id->curr_recv_count--;