i2c: i2c_cdns: Fix clearing of all interrupts
authorSiva Durga Prasad Paladugu <siva.durga.paladugu@xilinx.com>
Thu, 7 Mar 2019 10:52:48 +0000 (11:52 +0100)
committerHeiko Schocher <hs@denx.de>
Fri, 8 Mar 2019 04:52:30 +0000 (05:52 +0100)
The arbitration lost interrupt was not getting cleared
while clearing interrupts. This patch fixes this by adding
arbitration lost interrupt as well during clear. This patch
also removes hardcoded value and defined a macro for it.

Signed-off-by: Siva Durga Prasad Paladugu <siva.durga.paladugu@xilinx.com>
Signed-off-by: Michal Simek <michal.simek@xilinx.com>
Reviewed-by: Heiko Schocher <hs@denx.de>
drivers/i2c/i2c-cdns.c

index 4330d28c2b0dfbf5512e0bb4e2a8d1e81033565f..b391c0ba49b852f337cc8d58f1192ea95ca1420e 100644 (file)
@@ -64,6 +64,16 @@ struct cdns_i2c_regs {
 #define CDNS_I2C_INTERRUPT_RXUNF       0x00000080
 #define CDNS_I2C_INTERRUPT_ARBLOST     0x00000200
 
+#define CDNS_I2C_INTERRUPTS_MASK       (CDNS_I2C_INTERRUPT_COMP | \
+                                       CDNS_I2C_INTERRUPT_DATA | \
+                                       CDNS_I2C_INTERRUPT_NACK | \
+                                       CDNS_I2C_INTERRUPT_TO | \
+                                       CDNS_I2C_INTERRUPT_SLVRDY | \
+                                       CDNS_I2C_INTERRUPT_RXOVF | \
+                                       CDNS_I2C_INTERRUPT_TXOVF | \
+                                       CDNS_I2C_INTERRUPT_RXUNF | \
+                                       CDNS_I2C_INTERRUPT_ARBLOST)
+
 #define CDNS_I2C_FIFO_DEPTH            16
 #define CDNS_I2C_TRANSFER_SIZE_MAX     255 /* Controller transfer limit */
 #define CDNS_I2C_TRANSFER_SIZE         (CDNS_I2C_TRANSFER_SIZE_MAX - 3)
@@ -241,7 +251,7 @@ static int cdns_i2c_write_data(struct i2c_cdns_bus *i2c_bus, u32 addr, u8 *data,
                setbits_le32(&regs->control, CDNS_I2C_CONTROL_HOLD);
 
        /* Clear the interrupts in status register */
-       writel(0xFF, &regs->interrupt_status);
+       writel(CDNS_I2C_INTERRUPTS_MASK, &regs->interrupt_status);
 
        writel(addr, &regs->address);