From: Greg Kroah-Hartman Date: Sat, 28 Nov 2020 14:57:18 +0000 (+0100) Subject: 5.4-stable patches X-Git-Tag: v4.4.247~24 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=301f08ca469760d6dfa2780a9fd28c15ffd38f70;p=thirdparty%2Fkernel%2Fstable-queue.git 5.4-stable patches added patches: i2c-imx-fix-reset-of-i2sr_ial-flag.patch --- diff --git a/queue-5.4/i2c-imx-fix-reset-of-i2sr_ial-flag.patch b/queue-5.4/i2c-imx-fix-reset-of-i2sr_ial-flag.patch new file mode 100644 index 00000000000..b1ad42cbc37 --- /dev/null +++ b/queue-5.4/i2c-imx-fix-reset-of-i2sr_ial-flag.patch @@ -0,0 +1,69 @@ +From foo@baz Sat Nov 28 03:52:58 PM CET 2020 +From: Christian Eggers +Date: Wed, 7 Oct 2020 10:45:22 +0200 +Subject: i2c: imx: Fix reset of I2SR_IAL flag + +From: Christian Eggers + +commit fa4d30556883f2eaab425b88ba9904865a4d00f3 upstream + +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(). + +Signed-off-by: Christian Eggers +Fixes: 4b775022f6fd ("i2c: imx: add struct to hold more configurable quirks") +Reviewed-by: Uwe Kleine-König +Cc: stable@vger.kernel.org +Signed-off-by: Wolfram Sang +[sudip: adjust context] +Signed-off-by: Sudip Mukherjee +Signed-off-by: Greg Kroah-Hartman +--- + drivers/i2c/busses/i2c-imx.c | 20 +++++++++++++++----- + 1 file changed, 15 insertions(+), 5 deletions(-) + +--- a/drivers/i2c/busses/i2c-imx.c ++++ b/drivers/i2c/busses/i2c-imx.c +@@ -414,6 +414,19 @@ static void i2c_imx_dma_free(struct 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 , so we write ~i2sr_clr_opcode with just ++ * 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) + { + unsigned long orig_jiffies = jiffies; +@@ -426,8 +439,7 @@ static int i2c_imx_bus_busy(struct imx_i + + /* 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; + } + +@@ -597,9 +609,7 @@ static irqreturn_t i2c_imx_isr(int irq, + 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; + } diff --git a/queue-5.4/series b/queue-5.4/series index 701d7526471..f43f1653721 100644 --- a/queue-5.4/series +++ b/queue-5.4/series @@ -18,3 +18,4 @@ kvm-x86-fix-split-irqchip-vs-interrupt-injection-window-request.patch trace-fix-potenial-dangerous-pointer.patch arm64-pgtable-fix-pte_accessible.patch arm64-pgtable-ensure-dirty-bit-is-preserved-across-pte_wrprotect.patch +i2c-imx-fix-reset-of-i2sr_ial-flag.patch