Linux I2C development
 help / color / mirror / Atom feed
From: Alexander Stein <alexander.stein@ew.tq-group.com>
To: Dong Aisheng <aisheng.dong@nxp.com>,
	Shawn Guo <shawnguo@kernel.org>,
	Sascha Hauer <s.hauer@pengutronix.de>,
	Fabio Estevam <festevam@gmail.com>,
	NXP Linux Team <linux-imx@nxp.com>
Cc: Alexander Stein <alexander.stein@ew.tq-group.com>,
	Pengutronix Kernel Team <kernel@pengutronix.de>,
	linux-i2c@vger.kernel.org, linux-arm-kernel@lists.infradead.org
Subject: [PATCH 2/2] i2c: imx-lpi2c: check only for enabled interrupt flags
Date: Mon, 30 Jan 2023 16:32:47 +0100	[thread overview]
Message-ID: <20230130153247.445027-2-alexander.stein@ew.tq-group.com> (raw)
In-Reply-To: <20230130153247.445027-1-alexander.stein@ew.tq-group.com>

When reading from I2C, the Tx watermark is set to 0. Unfortunately the
TDF (transmit data flag) is enabled when Tx FIFO entries is equal or less
than watermark. So it is set in every case, hence the reset default of 1.
This results in the MSR_RDF _and_ MSR_TDF flags to be set thus trying
to send Tx data on a read message.
Mask the IRQ status to filter for wanted flags only.

Fixes: a55fa9d0e42e ("i2c: imx-lpi2c: add low power i2c bus driver")
Signed-off-by: Alexander Stein <alexander.stein@ew.tq-group.com>
---
To be honest I'm wondering why this didn't occur to somebody else before.
The behaviour also matches the downstream kernel which does

> if (temp & MSR_RDF)
>	lpi2c_imx_read_rxfifo(lpi2c_imx);
> else if (temp & MSR_TDF)
>	lpi2c_imx_write_txfifo(lpi2c_imx);

avoiding handling both Rx and Tx events.

 drivers/i2c/busses/i2c-imx-lpi2c.c | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/drivers/i2c/busses/i2c-imx-lpi2c.c b/drivers/i2c/busses/i2c-imx-lpi2c.c
index c6d0225246e6..a49b14d52a98 100644
--- a/drivers/i2c/busses/i2c-imx-lpi2c.c
+++ b/drivers/i2c/busses/i2c-imx-lpi2c.c
@@ -505,10 +505,14 @@ static int lpi2c_imx_xfer(struct i2c_adapter *adapter,
 static irqreturn_t lpi2c_imx_isr(int irq, void *dev_id)
 {
 	struct lpi2c_imx_struct *lpi2c_imx = dev_id;
+	unsigned int enabled;
 	unsigned int temp;
 
+	enabled = readl(lpi2c_imx->base + LPI2C_MIER);
+
 	lpi2c_imx_intctrl(lpi2c_imx, 0);
 	temp = readl(lpi2c_imx->base + LPI2C_MSR);
+	temp &= enabled;
 
 	if (temp & MSR_RDF)
 		lpi2c_imx_read_rxfifo(lpi2c_imx);
-- 
2.34.1


  reply	other threads:[~2023-01-30 15:33 UTC|newest]

Thread overview: 11+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-01-30 15:32 [PATCH 1/2] i2c: imx-lpi2c: clean rx/tx buffers upon new message Alexander Stein
2023-01-30 15:32 ` Alexander Stein [this message]
2023-03-16 19:36   ` [PATCH 2/2] i2c: imx-lpi2c: check only for enabled interrupt flags Wolfram Sang
2023-02-14  6:53 ` [PATCH 1/2] i2c: imx-lpi2c: clean rx/tx buffers upon new message Alexander Stein
2023-03-02 11:06 ` Emanuele Ghidoli
2023-03-02 11:15   ` Alexander Stein
2023-03-02 11:50     ` Emanuele Ghidoli
2023-03-03  7:21   ` Emanuele Ghidoli
2023-03-09 21:19 ` Wolfram Sang
2023-03-16 19:37   ` Wolfram Sang
2023-03-16 19:36 ` Wolfram Sang

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20230130153247.445027-2-alexander.stein@ew.tq-group.com \
    --to=alexander.stein@ew.tq-group.com \
    --cc=aisheng.dong@nxp.com \
    --cc=festevam@gmail.com \
    --cc=kernel@pengutronix.de \
    --cc=linux-arm-kernel@lists.infradead.org \
    --cc=linux-i2c@vger.kernel.org \
    --cc=linux-imx@nxp.com \
    --cc=s.hauer@pengutronix.de \
    --cc=shawnguo@kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox