| From 1cf216006d6a72dfd6cb7c047a7411fb0790bcd7 Mon Sep 17 00:00:00 2001 |
| From: Wolfram Sang <wsa+renesas@sang-engineering.com> |
| Date: Wed, 11 Jul 2018 00:24:23 +0200 |
| Subject: [PATCH 1628/1795] i2c: rcar: use the new get_bus_free callback |
| |
| To break out of recovery as early as possible, feed back the bus_free |
| logic state. |
| |
| Signed-off-by: Wolfram Sang <wsa+renesas@sang-engineering.com> |
| Signed-off-by: Wolfram Sang <wsa@the-dreams.de> |
| (cherry picked from commit 4fe10de535ead365351d49e0ff625769b08f6eca) |
| Signed-off-by: Simon Horman <horms+renesas@verge.net.au> |
| Signed-off-by: Geert Uytterhoeven <geert+renesas@glider.be> |
| --- |
| drivers/i2c/busses/i2c-rcar.c | 21 +++++++++++---------- |
| 1 file changed, 11 insertions(+), 10 deletions(-) |
| |
| diff --git a/drivers/i2c/busses/i2c-rcar.c b/drivers/i2c/busses/i2c-rcar.c |
| index 41159ac2a320..e9fa7cdb83f0 100644 |
| --- a/drivers/i2c/busses/i2c-rcar.c |
| +++ b/drivers/i2c/busses/i2c-rcar.c |
| @@ -183,8 +183,6 @@ static void rcar_i2c_set_scl(struct i2c_adapter *adap, int val) |
| rcar_i2c_write(priv, ICMCR, priv->recovery_icmcr); |
| }; |
| |
| -/* No get_sda, because the HW only reports its bus free logic, not SDA itself */ |
| - |
| static void rcar_i2c_set_sda(struct i2c_adapter *adap, int val) |
| { |
| struct rcar_i2c_priv *priv = i2c_get_adapdata(adap); |
| @@ -197,10 +195,19 @@ static void rcar_i2c_set_sda(struct i2c_adapter *adap, int val) |
| rcar_i2c_write(priv, ICMCR, priv->recovery_icmcr); |
| }; |
| |
| +static int rcar_i2c_get_bus_free(struct i2c_adapter *adap) |
| +{ |
| + struct rcar_i2c_priv *priv = i2c_get_adapdata(adap); |
| + |
| + return !(rcar_i2c_read(priv, ICMCR) & FSDA); |
| + |
| +}; |
| + |
| static struct i2c_bus_recovery_info rcar_i2c_bri = { |
| .get_scl = rcar_i2c_get_scl, |
| .set_scl = rcar_i2c_set_scl, |
| .set_sda = rcar_i2c_set_sda, |
| + .get_bus_free = rcar_i2c_get_bus_free, |
| .recover_bus = i2c_generic_scl_recovery, |
| }; |
| static void rcar_i2c_init(struct rcar_i2c_priv *priv) |
| @@ -215,7 +222,7 @@ static void rcar_i2c_init(struct rcar_i2c_priv *priv) |
| |
| static int rcar_i2c_bus_barrier(struct rcar_i2c_priv *priv) |
| { |
| - int i, ret; |
| + int i; |
| |
| for (i = 0; i < LOOP_TIMEOUT; i++) { |
| /* make sure that bus is not busy */ |
| @@ -226,13 +233,7 @@ static int rcar_i2c_bus_barrier(struct rcar_i2c_priv *priv) |
| |
| /* Waiting did not help, try to recover */ |
| priv->recovery_icmcr = MDBS | OBPC | FSDA | FSCL; |
| - ret = i2c_recover_bus(&priv->adap); |
| - |
| - /* No failure when recovering, so check bus busy bit again */ |
| - if (ret == 0) |
| - ret = (rcar_i2c_read(priv, ICMCR) & FSDA) ? -EBUSY : 0; |
| - |
| - return ret; |
| + return i2c_recover_bus(&priv->adap); |
| } |
| |
| static int rcar_i2c_clock_calculate(struct rcar_i2c_priv *priv, struct i2c_timings *t) |
| -- |
| 2.19.0 |
| |