linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH] i2c: mpc: Restore reread of I2C status register
@ 2021-07-02  3:27 Chris Packham
  2021-07-02  7:53 ` Wolfram Sang
  2021-07-08  2:03 ` Chris Packham
  0 siblings, 2 replies; 3+ messages in thread
From: Chris Packham @ 2021-07-02  3:27 UTC (permalink / raw)
  To: wsa; +Cc: linux-i2c, linux-kernel, Chris Packham

Prior to commit 1538d82f4647 ("i2c: mpc: Interrupt driven transfer") the
old interrupt handler would reread MPC_I2C_SR after checking the CSR_MIF
bit. When the driver was re-written this was removed as it seemed
unnecessary. However as it turns out this is necessary for i2c devices
which do clock stretching otherwise we end up thinking the bus is still
busy when processing the interrupt.

Fixes: 1538d82f4647 ("i2c: mpc: Interrupt driven transfer")
Signed-off-by: Chris Packham <chris.packham@alliedtelesis.co.nz>
---
 drivers/i2c/busses/i2c-mpc.c | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/drivers/i2c/busses/i2c-mpc.c b/drivers/i2c/busses/i2c-mpc.c
index dcca9c2396db..6d5014ebaab5 100644
--- a/drivers/i2c/busses/i2c-mpc.c
+++ b/drivers/i2c/busses/i2c-mpc.c
@@ -635,6 +635,8 @@ static irqreturn_t mpc_i2c_isr(int irq, void *dev_id)
 
 	status = readb(i2c->base + MPC_I2C_SR);
 	if (status & CSR_MIF) {
+		/* Read again to allow register to stabilise */
+		status = readb(i2c->base + MPC_I2C_SR);
 		writeb(0, i2c->base + MPC_I2C_SR);
 		mpc_i2c_do_intr(i2c, status);
 		return IRQ_HANDLED;
-- 
2.32.0


^ permalink raw reply related	[flat|nested] 3+ messages in thread

* Re: [PATCH] i2c: mpc: Restore reread of I2C status register
  2021-07-02  3:27 [PATCH] i2c: mpc: Restore reread of I2C status register Chris Packham
@ 2021-07-02  7:53 ` Wolfram Sang
  2021-07-08  2:03 ` Chris Packham
  1 sibling, 0 replies; 3+ messages in thread
From: Wolfram Sang @ 2021-07-02  7:53 UTC (permalink / raw)
  To: Chris Packham; +Cc: linux-i2c, linux-kernel

[-- Attachment #1: Type: text/plain, Size: 645 bytes --]

On Fri, Jul 02, 2021 at 03:27:24PM +1200, Chris Packham wrote:
> Prior to commit 1538d82f4647 ("i2c: mpc: Interrupt driven transfer") the
> old interrupt handler would reread MPC_I2C_SR after checking the CSR_MIF
> bit. When the driver was re-written this was removed as it seemed
> unnecessary. However as it turns out this is necessary for i2c devices
> which do clock stretching otherwise we end up thinking the bus is still
> busy when processing the interrupt.
> 
> Fixes: 1538d82f4647 ("i2c: mpc: Interrupt driven transfer")
> Signed-off-by: Chris Packham <chris.packham@alliedtelesis.co.nz>

Applied to for-current, thanks!


[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 833 bytes --]

^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: [PATCH] i2c: mpc: Restore reread of I2C status register
  2021-07-02  3:27 [PATCH] i2c: mpc: Restore reread of I2C status register Chris Packham
  2021-07-02  7:53 ` Wolfram Sang
@ 2021-07-08  2:03 ` Chris Packham
  1 sibling, 0 replies; 3+ messages in thread
From: Chris Packham @ 2021-07-08  2:03 UTC (permalink / raw)
  To: wsa, Hamish Martin; +Cc: linux-i2c, linux-kernel


On 2/07/21 3:27 pm, Chris Packham wrote:
> Prior to commit 1538d82f4647 ("i2c: mpc: Interrupt driven transfer") the
> old interrupt handler would reread MPC_I2C_SR after checking the CSR_MIF
> bit. When the driver was re-written this was removed as it seemed
> unnecessary. However as it turns out this is necessary for i2c devices
> which do clock stretching otherwise we end up thinking the bus is still
> busy when processing the interrupt.
>
> Fixes: 1538d82f4647 ("i2c: mpc: Interrupt driven transfer")
> Signed-off-by: Chris Packham <chris.packham@alliedtelesis.co.nz>

Just a heads up that this hasn't totally fixed the issue. Just made it 
less likely to occur. I'm now wondering if we should be treating MCF as 
a busy bit and waiting for it to clear (with approrpriate timeouts) 
instead of just flagging an error immediately.

> ---
>   drivers/i2c/busses/i2c-mpc.c | 2 ++
>   1 file changed, 2 insertions(+)
>
> diff --git a/drivers/i2c/busses/i2c-mpc.c b/drivers/i2c/busses/i2c-mpc.c
> index dcca9c2396db..6d5014ebaab5 100644
> --- a/drivers/i2c/busses/i2c-mpc.c
> +++ b/drivers/i2c/busses/i2c-mpc.c
> @@ -635,6 +635,8 @@ static irqreturn_t mpc_i2c_isr(int irq, void *dev_id)
>   
>   	status = readb(i2c->base + MPC_I2C_SR);
>   	if (status & CSR_MIF) {
> +		/* Read again to allow register to stabilise */
> +		status = readb(i2c->base + MPC_I2C_SR);
>   		writeb(0, i2c->base + MPC_I2C_SR);
>   		mpc_i2c_do_intr(i2c, status);
>   		return IRQ_HANDLED;

^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2021-07-08  2:04 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-07-02  3:27 [PATCH] i2c: mpc: Restore reread of I2C status register Chris Packham
2021-07-02  7:53 ` Wolfram Sang
2021-07-08  2:03 ` Chris Packham

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).