| From e9f106d1e2f4711e39b8ed05859ef4c206601e39 Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Mon, 17 Aug 2020 14:19:30 +0200 |
| Subject: i2c: rcar: in slave mode, clear NACK earlier |
| |
| From: Wolfram Sang <wsa+renesas@sang-engineering.com> |
| |
| [ Upstream commit 914a7b3563b8fb92f976619bbd0fa3a4a708baae ] |
| |
| Currently, a NACK in slave mode is set/cleared when SCL is held low by |
| the IP core right before the bit is about to be pushed out. This is too |
| late for clearing and then a NACK from the previous byte is still used |
| for the current one. Now, let's clear the NACK right after we detected |
| the STOP condition following the NACK. |
| |
| 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 | 1 + |
| 1 file changed, 1 insertion(+) |
| |
| diff --git a/drivers/i2c/busses/i2c-rcar.c b/drivers/i2c/busses/i2c-rcar.c |
| index 4231673435e7b..6be02da2ccc46 100644 |
| --- a/drivers/i2c/busses/i2c-rcar.c |
| +++ b/drivers/i2c/busses/i2c-rcar.c |
| @@ -534,6 +534,7 @@ static bool rcar_i2c_slave_irq(struct rcar_i2c_priv *priv) |
| /* master sent stop */ |
| if (ssr_filtered & SSR) { |
| i2c_slave_event(priv->slave, I2C_SLAVE_STOP, &value); |
| + rcar_i2c_write(priv, ICSCR, SIE | SDBS); /* clear our NACK */ |
| rcar_i2c_write(priv, ICSIER, SAR); |
| rcar_i2c_write(priv, ICSSR, ~SSR & 0xff); |
| } |
| -- |
| 2.25.1 |
| |