i2c: exynos5: disable fifo-almost-empty irq signal when necessary
authorAndrzej Hajda <a.hajda@samsung.com>
Wed, 22 Feb 2017 10:11:20 +0000 (11:11 +0100)
committerWolfram Sang <wsa@the-dreams.de>
Thu, 23 Feb 2017 11:59:48 +0000 (12:59 +0100)
Fifo-almost-empty irq signal should be disabled as soon as possible,
to avoid unnecessary interrupt storm. The best moment is when there is
no more data to feed fifo.
This patch fixes system stalls caused by IRQ storm.

Signed-off-by: Andrzej Hajda <a.hajda@samsung.com>
Tested-by: Marek Szyprowski <m.szyprowski@samsung.com>
Tested-by: Andi Shyti <andi.shyti@samsung.com>
Reviewed-by: Andi Shyti <andi.shyti@samsung.com>
Signed-off-by: Wolfram Sang <wsa@the-dreams.de>
drivers/i2c/busses/i2c-exynos5.c

index bea607149972d4c3e7f412ff0cd28a1d0df9c6e7..00e81e3564ff5901be3de4aef24de963c8efe8c3 100644 (file)
@@ -502,8 +502,13 @@ static irqreturn_t exynos5_i2c_irq(int irqno, void *dev_id)
                fifo_level = HSI2C_TX_FIFO_LVL(fifo_status);
 
                len = i2c->variant->fifo_depth - fifo_level;
-               if (len > (i2c->msg->len - i2c->msg_ptr))
+               if (len > (i2c->msg->len - i2c->msg_ptr)) {
+                       u32 int_en = readl(i2c->regs + HSI2C_INT_ENABLE);
+
+                       int_en &= ~HSI2C_INT_TX_ALMOSTEMPTY_EN;
+                       writel(int_en, i2c->regs + HSI2C_INT_ENABLE);
                        len = i2c->msg->len - i2c->msg_ptr;
+               }
 
                while (len > 0) {
                        byte = i2c->msg->buf[i2c->msg_ptr++];