From: Greg Kroah-Hartman Date: Sat, 28 Nov 2020 14:56:17 +0000 (+0100) Subject: 4.4-stable patches X-Git-Tag: v4.4.247~28 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=d39b938cfe9d38ba6e29bbccf44cadd4a201c20f;p=thirdparty%2Fkernel%2Fstable-queue.git 4.4-stable patches added patches: i2c-imx-fix-reset-of-i2sr_ial-flag.patch --- diff --git a/queue-4.4/i2c-imx-fix-reset-of-i2sr_ial-flag.patch b/queue-4.4/i2c-imx-fix-reset-of-i2sr_ial-flag.patch new file mode 100644 index 00000000000..e9ea86b275f --- /dev/null +++ b/queue-4.4/i2c-imx-fix-reset-of-i2sr_ial-flag.patch @@ -0,0 +1,69 @@ +From foo@baz Sat Nov 28 03:53:42 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 +@@ -420,6 +420,19 @@ static void i2c_imx_dma_free(struct imx_ + /** Functions for IMX I2C adapter driver *************************************** + *******************************************************************************/ + ++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; +@@ -432,8 +445,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; + } + +@@ -595,9 +607,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-4.4/series b/queue-4.4/series index 518838dcbb3..19bd91d3ffc 100644 --- a/queue-4.4/series +++ b/queue-4.4/series @@ -1,3 +1,4 @@ btrfs-tree-checker-enhance-chunk-checker-to-validate-chunk-profile.patch btrfs-inode-verify-inode-mode-to-avoid-null-pointer-dereference.patch kvm-x86-fix-split-irqchip-vs-interrupt-injection-window-request.patch +i2c-imx-fix-reset-of-i2sr_ial-flag.patch