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)
committerWolfram Sang <wsa@kernel.org>
Sun, 26 Jul 2020 12:32:46 +0000 (14:32 +0200)
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>
drivers/i2c/busses/i2c-rcar.c

index a45c4bf1ec014e84b314c042edc365294a6de027..c2921e1d8c4c3e1c4906eb1e1c209dcf6fd7f251 100644 (file)
@@ -583,13 +583,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);
        }
 
@@ -853,7 +854,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;