diff mbox series

[v4,1/3] i2c: imx: Fix reset of I2SR_IAL flag

Message ID 20201006160814.22047-2-ceggers@arri.de (mailing list archive)
State New, archived
Headers show
Series i2c: imx: Fix handling of arbitration loss | expand

Commit Message

Christian Eggers Oct. 6, 2020, 4:08 p.m. UTC
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 <ceggers@arri.de>
Cc: stable@vger.kernel.org
---
 drivers/i2c/busses/i2c-imx.c | 20 +++++++++++++++-----
 1 file changed, 15 insertions(+), 5 deletions(-)

Comments

Uwe Kleine-König Oct. 6, 2020, 6:46 p.m. UTC | #1
On Tue, Oct 06, 2020 at 06:08:12PM +0200, Christian Eggers wrote:
> 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 <ceggers@arri.de>
> Cc: stable@vger.kernel.org

Fixes: 4b775022f6fd ("i2c: imx: add struct to hold more configurable quirks")
Reviewed-by: Uwe Kleine-König <u.kleine-koenig@pengutronix.de>

Best regards and thanks
Uwe
Krzysztof Kozlowski Oct. 7, 2020, 7:50 a.m. UTC | #2
On Tue, 6 Oct 2020 at 18:10, Christian Eggers <ceggers@arri.de> wrote:
>
> 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 <ceggers@arri.de>
> Cc: stable@vger.kernel.org
> ---
>  drivers/i2c/busses/i2c-imx.c | 20 +++++++++++++++-----
>  1 file changed, 15 insertions(+), 5 deletions(-)

I replied to your v2 with testing, so what happened with all my tested tags?

Best regards,
Krzysztof
Christian Eggers Oct. 7, 2020, 8:17 a.m. UTC | #3
On Wednesday, 7 October 2020, 09:50:23 CEST, Krzysztof Kozlowski wrote:
> I replied to your v2 with testing, so what happened with all my tested tags?

I am quite new to the kernel development process. Seems that I should 
integrate all "Tested-by" tags into following version of my patches.

In which cases shall the tested tags be kept and in which cases they become 
invalid?

Best regards
Christian
Krzysztof Kozlowski Oct. 7, 2020, 8:27 a.m. UTC | #4
On Wed, 7 Oct 2020 at 10:17, Christian Eggers <ceggers@arri.de> wrote:
>
> On Wednesday, 7 October 2020, 09:50:23 CEST, Krzysztof Kozlowski wrote:
> > I replied to your v2 with testing, so what happened with all my tested tags?
>
> I am quite new to the kernel development process. Seems that I should
> integrate all "Tested-by" tags into following version of my patches.
>
> In which cases shall the tested tags be kept and in which cases they become
> invalid?

https://elixir.bootlin.com/linux/latest/source/Documentation/process/submitting-patches.rst#L584

Your v3 touched only one patch, so all tags for all other patches
should be added and preserved. If the patch changed significantly that
review or testing is not appropriate, you could remove someone's tag
but then you should ask for testing again. And you did not send it for
testing.

Your v4 only extended a comment which does not affect testing. All
tags, review, ack and tested by should be added/preserved.

Otherwise you ask for testing (or reviewing) and then do not credit
this person. Neither maintainers know that patches were tested.

Best regards,
Krzysztof
diff mbox series

Patch

diff --git a/drivers/i2c/busses/i2c-imx.c b/drivers/i2c/busses/i2c-imx.c
index 0ab5381aa012..cbdcab73a055 100644
--- a/drivers/i2c/busses/i2c-imx.c
+++ b/drivers/i2c/busses/i2c-imx.c
@@ -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;
 	}