@@ -412,6 +412,19 @@ static void i2c_imx_dma_free(struct imx_i2c_struct *i2c_imx)
412412 dma -> chan_using = NULL ;
413413}
414414
415+ static void i2c_imx_clear_irq (struct imx_i2c_struct * i2c_imx , unsigned int bits )
416+ {
417+ unsigned int temp ;
418+
419+ /*
420+ * i2sr_clr_opcode is the value to clear all interrupts. Here we want to
421+ * clear only <bits>, so we write ~i2sr_clr_opcode with just <bits>
422+ * toggled. This is required because i.MX needs W0C and Vybrid uses W1C.
423+ */
424+ temp = ~i2c_imx -> hwdata -> i2sr_clr_opcode ^ bits ;
425+ imx_i2c_write_reg (temp , i2c_imx , IMX_I2C_I2SR );
426+ }
427+
415428static int i2c_imx_bus_busy (struct imx_i2c_struct * i2c_imx , int for_busy , bool atomic )
416429{
417430 unsigned long orig_jiffies = jiffies ;
@@ -424,8 +437,7 @@ static int i2c_imx_bus_busy(struct imx_i2c_struct *i2c_imx, int for_busy, bool a
424437
425438 /* check for arbitration lost */
426439 if (temp & I2SR_IAL ) {
427- temp &= ~I2SR_IAL ;
428- imx_i2c_write_reg (temp , i2c_imx , IMX_I2C_I2SR );
440+ i2c_imx_clear_irq (i2c_imx , I2SR_IAL );
429441 return - EAGAIN ;
430442 }
431443
@@ -469,7 +481,7 @@ static int i2c_imx_trx_complete(struct imx_i2c_struct *i2c_imx, bool atomic)
469481 */
470482 readb_poll_timeout_atomic (addr , regval , regval & I2SR_IIF , 5 , 1000 + 100 );
471483 i2c_imx -> i2csr = regval ;
472- imx_i2c_write_reg ( 0 , i2c_imx , IMX_I2C_I2SR );
484+ i2c_imx_clear_irq ( i2c_imx , I2SR_IIF | I2SR_IAL );
473485 } else {
474486 wait_event_timeout (i2c_imx -> queue , i2c_imx -> i2csr & I2SR_IIF , HZ / 10 );
475487 }
@@ -478,6 +490,16 @@ static int i2c_imx_trx_complete(struct imx_i2c_struct *i2c_imx, bool atomic)
478490 dev_dbg (& i2c_imx -> adapter .dev , "<%s> Timeout\n" , __func__ );
479491 return - ETIMEDOUT ;
480492 }
493+
494+ /* check for arbitration lost */
495+ if (i2c_imx -> i2csr & I2SR_IAL ) {
496+ dev_dbg (& i2c_imx -> adapter .dev , "<%s> Arbitration lost\n" , __func__ );
497+ i2c_imx_clear_irq (i2c_imx , I2SR_IAL );
498+
499+ i2c_imx -> i2csr = 0 ;
500+ return - EAGAIN ;
501+ }
502+
481503 dev_dbg (& i2c_imx -> adapter .dev , "<%s> TRX complete\n" , __func__ );
482504 i2c_imx -> i2csr = 0 ;
483505 return 0 ;
@@ -593,6 +615,8 @@ static void i2c_imx_stop(struct imx_i2c_struct *i2c_imx, bool atomic)
593615 /* Stop I2C transaction */
594616 dev_dbg (& i2c_imx -> adapter .dev , "<%s>\n" , __func__ );
595617 temp = imx_i2c_read_reg (i2c_imx , IMX_I2C_I2CR );
618+ if (!(temp & I2CR_MSTA ))
619+ i2c_imx -> stopped = 1 ;
596620 temp &= ~(I2CR_MSTA | I2CR_MTX );
597621 if (i2c_imx -> dma )
598622 temp &= ~I2CR_DMAEN ;
@@ -623,9 +647,7 @@ static irqreturn_t i2c_imx_isr(int irq, void *dev_id)
623647 if (temp & I2SR_IIF ) {
624648 /* save status register */
625649 i2c_imx -> i2csr = temp ;
626- temp &= ~I2SR_IIF ;
627- temp |= (i2c_imx -> hwdata -> i2sr_clr_opcode & I2SR_IIF );
628- imx_i2c_write_reg (temp , i2c_imx , IMX_I2C_I2SR );
650+ i2c_imx_clear_irq (i2c_imx , I2SR_IIF );
629651 wake_up (& i2c_imx -> queue );
630652 return IRQ_HANDLED ;
631653 }
@@ -758,9 +780,12 @@ static int i2c_imx_dma_read(struct imx_i2c_struct *i2c_imx,
758780 */
759781 dev_dbg (dev , "<%s> clear MSTA\n" , __func__ );
760782 temp = imx_i2c_read_reg (i2c_imx , IMX_I2C_I2CR );
783+ if (!(temp & I2CR_MSTA ))
784+ i2c_imx -> stopped = 1 ;
761785 temp &= ~(I2CR_MSTA | I2CR_MTX );
762786 imx_i2c_write_reg (temp , i2c_imx , IMX_I2C_I2CR );
763- i2c_imx_bus_busy (i2c_imx , 0 , false);
787+ if (!i2c_imx -> stopped )
788+ i2c_imx_bus_busy (i2c_imx , 0 , false);
764789 } else {
765790 /*
766791 * For i2c master receiver repeat restart operation like:
@@ -885,9 +910,12 @@ static int i2c_imx_read(struct imx_i2c_struct *i2c_imx, struct i2c_msg *msgs,
885910 dev_dbg (& i2c_imx -> adapter .dev ,
886911 "<%s> clear MSTA\n" , __func__ );
887912 temp = imx_i2c_read_reg (i2c_imx , IMX_I2C_I2CR );
913+ if (!(temp & I2CR_MSTA ))
914+ i2c_imx -> stopped = 1 ;
888915 temp &= ~(I2CR_MSTA | I2CR_MTX );
889916 imx_i2c_write_reg (temp , i2c_imx , IMX_I2C_I2CR );
890- i2c_imx_bus_busy (i2c_imx , 0 , atomic );
917+ if (!i2c_imx -> stopped )
918+ i2c_imx_bus_busy (i2c_imx , 0 , atomic );
891919 } else {
892920 /*
893921 * For i2c master receiver repeat restart operation like:
0 commit comments