FAILED: patch "[PATCH] i2c: imx: Fix reset of I2SR_IAL flag" failed to apply to 4.14-stable tree
Subsystems (4)
[email protected]
maintainerThe patch below does not apply to the 4.14-stable tree.
If someone wants it applied there, or to any other stable or longterm tree, then please email the backport, including the original git commit id to <[email protected]>.
thanks,
greg k-h
------------------ original commit in Linus's tree ------------------
From fa4d30556883f2eaab425b88ba9904865a4d00f3 Mon Sep 17 00:00:00 2001
From: Christian Eggers <[email protected]>
Date: Wed, 7 Oct 2020 10:45:22 +0200
Subject: [PATCH] i2c: imx: Fix reset of I2SR_IAL flag
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
According to the "VFxxx Controller Reference Manual" (and the comment block starting at line 97), Vybrid requires writing a one for clearing an interrupt flag. Syncing the method for clearing I2SR_IIF in i2c_imx_isr().
drivers/i2c/busses/i2c-imx.c +15 -5
@@ -412,6 +412,19 @@ static void i2c_imx_dma_free(struct imx_i2c_struct *i2c_imx) dma->chan_using =NULL ; } +static void i2c_imx_clear_irq (struct imx_i2c_struct *i2c_imx,unsigned int bits) +{ +unsigned int temp; + +/* +* i2sr_clr_opcode is the value to clear all interrupts. Here we want to +* clear only <bits>, so we write ~i2sr_clr_opcode with just <bits> +* toggled. This is required because i.MX needs W1C and Vybrid uses W0C. +*/ + temp = ~i2c_imx->hwdata->i2sr_clr_opcode ^ bits; +imx_i2c_write_reg (temp, i2c_imx,IMX_I2C_I2SR ); +} +static int i2c_imx_bus_busy (struct imx_i2c_struct *i2c_imx,int for_busy,bool atomic) {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/* check for arbitration lost */ if (temp &I2SR_IAL ) { - temp &= ~I2SR_IAL ; -imx_i2c_write_reg (temp, i2c_imx,IMX_I2C_I2SR ); +i2c_imx_clear_irq (i2c_imx,I2SR_IAL );return -EAGAIN ; }
@@ -623,9 +635,7 @@ static irqreturn_t i2c_imx_isr(int irq, void *dev_id)if (temp &I2SR_IIF ) {/* save status register */ i2c_imx->i2csr = temp; - temp &= ~I2SR_IIF ; - temp |= (i2c_imx->hwdata->i2sr_clr_opcode &I2SR_IIF ); -imx_i2c_write_reg (temp, i2c_imx,IMX_I2C_I2SR ); +i2c_imx_clear_irq (i2c_imx,I2SR_IIF );wake_up (&i2c_imx->queue);return IRQ_HANDLED ; }