|
@@ -504,9 +504,10 @@ static int i2c_gpio_get_pin(struct gpio_desc *pin)
|
|
|
int i2c_deblock_gpio_loop(struct gpio_desc *sda_pin,
|
|
|
struct gpio_desc *scl_pin,
|
|
|
unsigned int scl_count,
|
|
|
+ unsigned int start_count,
|
|
|
unsigned int delay)
|
|
|
{
|
|
|
- int ret = 0;
|
|
|
+ int i, ret = -EREMOTEIO;
|
|
|
|
|
|
i2c_gpio_set_pin(sda_pin, 1);
|
|
|
i2c_gpio_set_pin(scl_pin, 1);
|
|
@@ -518,8 +519,24 @@ int i2c_deblock_gpio_loop(struct gpio_desc *sda_pin,
|
|
|
udelay(delay);
|
|
|
i2c_gpio_set_pin(scl_pin, 0);
|
|
|
udelay(delay);
|
|
|
- if (i2c_gpio_get_pin(sda_pin))
|
|
|
+ if (i2c_gpio_get_pin(sda_pin)) {
|
|
|
+ ret = 0;
|
|
|
break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if (!ret && start_count) {
|
|
|
+ for (i = 0; i < start_count; i++) {
|
|
|
+ /* Send start condition */
|
|
|
+ udelay(delay);
|
|
|
+ i2c_gpio_set_pin(sda_pin, 1);
|
|
|
+ udelay(delay);
|
|
|
+ i2c_gpio_set_pin(scl_pin, 1);
|
|
|
+ udelay(delay);
|
|
|
+ i2c_gpio_set_pin(sda_pin, 0);
|
|
|
+ udelay(delay);
|
|
|
+ i2c_gpio_set_pin(scl_pin, 0);
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
/* Then, send I2C stop */
|
|
@@ -562,7 +579,7 @@ static int i2c_deblock_gpio(struct udevice *bus)
|
|
|
goto out_no_pinctrl;
|
|
|
}
|
|
|
|
|
|
- ret0 = i2c_deblock_gpio_loop(&gpios[PIN_SDA], &gpios[PIN_SCL], 9, 5);
|
|
|
+ ret0 = i2c_deblock_gpio_loop(&gpios[PIN_SDA], &gpios[PIN_SCL], 9, 0, 5);
|
|
|
|
|
|
ret = pinctrl_select_state(bus, "default");
|
|
|
if (ret) {
|