]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
i2c: rcar: slave: only send STOP event when we have been addressed
authorWolfram Sang <wsa+renesas@sang-engineering.com>
Mon, 29 Jun 2020 15:38:07 +0000 (17:38 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Fri, 21 Aug 2020 08:53:06 +0000 (10:53 +0200)
[ Upstream commit 314139f9f0abdba61ed9a8463bbcb0bf900ac5a2 ]

When the SSR interrupt is activated, it will detect every STOP condition
on the bus, not only the ones after we have been addressed. So, enable
this interrupt only after we have been addressed, and disable it
otherwise.

Fixes: de20d1857dd6 ("i2c: rcar: add slave support")
Signed-off-by: Wolfram Sang <wsa+renesas@sang-engineering.com>
Signed-off-by: Wolfram Sang <wsa@kernel.org>
Signed-off-by: Sasha Levin <sashal@kernel.org>
drivers/i2c/busses/i2c-rcar.c

index dfe1a53ce4ad35cfb787fa3d190b71f5e20df8ba..ddfb08a3e6c20590aadde5c042931163cda86469 100644 (file)
@@ -386,13 +386,14 @@ static bool rcar_i2c_slave_irq(struct rcar_i2c_priv *priv)
                        rcar_i2c_write(priv, ICSIER, SDR | SSR | SAR);
                }
 
-               rcar_i2c_write(priv, ICSSR, ~SAR & 0xff);
+               /* Clear SSR, too, because of old STOPs to other clients than us */
+               rcar_i2c_write(priv, ICSSR, ~(SAR | SSR) & 0xff);
        }
 
        /* master sent stop */
        if (ssr_filtered & SSR) {
                i2c_slave_event(priv->slave, I2C_SLAVE_STOP, &value);
-               rcar_i2c_write(priv, ICSIER, SAR | SSR);
+               rcar_i2c_write(priv, ICSIER, SAR);
                rcar_i2c_write(priv, ICSSR, ~SSR & 0xff);
        }
 
@@ -541,7 +542,7 @@ static int rcar_reg_slave(struct i2c_client *slave)
        priv->slave = slave;
        rcar_i2c_write(priv, ICSAR, slave->addr);
        rcar_i2c_write(priv, ICSSR, 0);
-       rcar_i2c_write(priv, ICSIER, SAR | SSR);
+       rcar_i2c_write(priv, ICSIER, SAR);
        rcar_i2c_write(priv, ICSCR, SIE | SDBS);
 
        return 0;