i2c: Make deblock delay and SCL clock configurable
authorMarek Vasut <marex@denx.de>
Fri, 7 Feb 2020 15:57:49 +0000 (16:57 +0100)
committerHeiko Schocher <hs@denx.de>
Mon, 16 Mar 2020 06:45:53 +0000 (07:45 +0100)
Make the delay between SCL line changes and the number of SCL clock
changes configurable as a parameter of the deblock function. No
functional change.

Signed-off-by: Marek Vasut <marex@denx.de>
Reviewed-by: Heiko Schocher <hs@denx.de>
drivers/i2c/i2c-uclass.c

index 2aa3efe8aaa01e7fa8f1b86109e917fd32056535..25af1fabdbcbed8d422fd5aa1886bdd5e39dd84e 100644 (file)
@@ -502,34 +502,35 @@ static int i2c_gpio_get_pin(struct gpio_desc *pin)
 }
 
 static int i2c_deblock_gpio_loop(struct gpio_desc *sda_pin,
-                                struct gpio_desc *scl_pin)
+                                struct gpio_desc *scl_pin,
+                                unsigned int scl_count,
+                                unsigned int delay)
 {
-       int counter = 9;
        int ret = 0;
 
        i2c_gpio_set_pin(sda_pin, 1);
        i2c_gpio_set_pin(scl_pin, 1);
-       udelay(5);
+       udelay(delay);
 
        /*  Toggle SCL until slave release SDA */
-       while (counter-- >= 0) {
+       while (scl_count-- >= 0) {
                i2c_gpio_set_pin(scl_pin, 1);
-               udelay(5);
+               udelay(delay);
                i2c_gpio_set_pin(scl_pin, 0);
-               udelay(5);
+               udelay(delay);
                if (i2c_gpio_get_pin(sda_pin))
                        break;
        }
 
        /* Then, send I2C stop */
        i2c_gpio_set_pin(sda_pin, 0);
-       udelay(5);
+       udelay(delay);
 
        i2c_gpio_set_pin(scl_pin, 1);
-       udelay(5);
+       udelay(delay);
 
        i2c_gpio_set_pin(sda_pin, 1);
-       udelay(5);
+       udelay(delay);
 
        if (!i2c_gpio_get_pin(sda_pin) || !i2c_gpio_get_pin(scl_pin))
                ret = -EREMOTEIO;
@@ -561,7 +562,7 @@ static int i2c_deblock_gpio(struct udevice *bus)
                goto out_no_pinctrl;
        }
 
-       ret0 = i2c_deblock_gpio_loop(&gpios[PIN_SDA], &gpios[PIN_SCL]);
+       ret0 = i2c_deblock_gpio_loop(&gpios[PIN_SDA], &gpios[PIN_SCL], 9, 5);
 
        ret = pinctrl_select_state(bus, "default");
        if (ret) {