diff mbox

[v2] i2c: exynos5: disable fifo-almost-empty irq signal when necessary

Message ID 1487758280-22801-1-git-send-email-a.hajda@samsung.com
State Accepted
Headers show

Commit Message

Andrzej Hajda Feb. 22, 2017, 10:11 a.m. UTC
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>
---
v2:
    - removed doubled conditional

 drivers/i2c/busses/i2c-exynos5.c | 7 ++++++-
 1 file changed, 6 insertions(+), 1 deletion(-)

Comments

Marek Szyprowski Feb. 22, 2017, 11:10 a.m. UTC | #1
Hi,

On 2017-02-22 11:11, Andrzej Hajda wrote:
> 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>

With this patch TM2 board boots fine on linux-next from 21st Feb 2017
and maxcpus=1 in kernel command line.

Tested-by: Marek Szyprowski <m.szyprowski@samsung.com>

> ---
> v2:
>      - removed doubled conditional
>
>   drivers/i2c/busses/i2c-exynos5.c | 7 ++++++-
>   1 file changed, 6 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/i2c/busses/i2c-exynos5.c b/drivers/i2c/busses/i2c-exynos5.c
> index bea6071..00e81e3 100644
> --- a/drivers/i2c/busses/i2c-exynos5.c
> +++ b/drivers/i2c/busses/i2c-exynos5.c
> @@ -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++];

Best regards
Andi Shyti Feb. 23, 2017, 6:31 a.m. UTC | #2
Hi Andrzej,

On Wed, Feb 22, 2017 at 11:11:20AM +0100, Andrzej Hajda wrote:
> 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>

Looks good,

Tested-by: Andi Shyti <andi.shyti@samsung.com>
Reviewed-by: Andi Shyti <andi.shyti@samsung.com>

Thanks,
Andi
--
To unsubscribe from this list: send the line "unsubscribe linux-i2c" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Wolfram Sang Feb. 23, 2017, 12:03 p.m. UTC | #3
On Wed, Feb 22, 2017 at 11:11:20AM +0100, Andrzej Hajda wrote:
> 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>

Applied to for-next (will be in this merge window), thanks!
diff mbox

Patch

diff --git a/drivers/i2c/busses/i2c-exynos5.c b/drivers/i2c/busses/i2c-exynos5.c
index bea6071..00e81e3 100644
--- a/drivers/i2c/busses/i2c-exynos5.c
+++ b/drivers/i2c/busses/i2c-exynos5.c
@@ -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++];