| From 314139f9f0abdba61ed9a8463bbcb0bf900ac5a2 Mon Sep 17 00:00:00 2001 |
| From: Wolfram Sang <wsa+renesas@sang-engineering.com> |
| Date: Mon, 29 Jun 2020 17:38:07 +0200 |
| Subject: [PATCH] i2c: rcar: slave: only send STOP event when we have been |
| addressed |
| |
| commit 314139f9f0abdba61ed9a8463bbcb0bf900ac5a2 upstream. |
| |
| 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> |
| |
| diff --git a/drivers/i2c/busses/i2c-rcar.c b/drivers/i2c/busses/i2c-rcar.c |
| index a45c4bf1ec01..c2921e1d8c4c 100644 |
| --- a/drivers/i2c/busses/i2c-rcar.c |
| +++ b/drivers/i2c/busses/i2c-rcar.c |
| @@ -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; |
| -- |
| 2.27.0 |
| |