i2c: rcar: refactor and shorten timeout when resetting
authorWolfram Sang <wsa+renesas@sang-engineering.com>
Sat, 29 Aug 2020 20:38:10 +0000 (22:38 +0200)
committerWolfram Sang <wsa@kernel.org>
Fri, 18 Sep 2020 21:02:02 +0000 (23:02 +0200)
LOOP_TIMEOUT was only used back then because we didn't want to introduce
another constant. The timeout value can easily be a magnitude shorter
because the typical range is 3us - 8us. Refactor the code to use the
poll_timeout helper, use a specific timeout value and get rid of the
ugly LOOP_TIMEOUT constant.

Signed-off-by: Wolfram Sang <wsa+renesas@sang-engineering.com>
Reviewed-by: Niklas Söderlund <niklas.soderlund+renesas@ragnatech.se>
Signed-off-by: Wolfram Sang <wsa@kernel.org>
drivers/i2c/busses/i2c-rcar.c

index c5ba018..bab90d3 100644 (file)
@@ -146,9 +146,6 @@ struct rcar_i2c_priv {
 #define rcar_i2c_priv_to_dev(p)                ((p)->adap.dev.parent)
 #define rcar_i2c_is_recv(p)            ((p)->msg->flags & I2C_M_RD)
 
-#define LOOP_TIMEOUT   1024
-
-
 static void rcar_i2c_write(struct rcar_i2c_priv *priv, int reg, u32 val)
 {
        writel(val, priv->io + reg);
@@ -760,20 +757,14 @@ static void rcar_i2c_release_dma(struct rcar_i2c_priv *priv)
 /* I2C is a special case, we need to poll the status of a reset */
 static int rcar_i2c_do_reset(struct rcar_i2c_priv *priv)
 {
-       int i, ret;
+       int ret;
 
        ret = reset_control_reset(priv->rstc);
        if (ret)
                return ret;
 
-       for (i = 0; i < LOOP_TIMEOUT; i++) {
-               ret = reset_control_status(priv->rstc);
-               if (ret == 0)
-                       return 0;
-               udelay(1);
-       }
-
-       return -ETIMEDOUT;
+       return read_poll_timeout_atomic(reset_control_status, ret, ret == 0, 1,
+                                       100, false, priv->rstc);
 }
 
 static int rcar_i2c_master_xfer(struct i2c_adapter *adap,