diff options
Diffstat (limited to 'drivers/i2c')
| -rw-r--r-- | drivers/i2c/i2c-uclass.c | 23 | 
1 files changed, 20 insertions, 3 deletions
| diff --git a/drivers/i2c/i2c-uclass.c b/drivers/i2c/i2c-uclass.c index 86f529241f4..e9ec3885767 100644 --- a/drivers/i2c/i2c-uclass.c +++ b/drivers/i2c/i2c-uclass.c @@ -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) { | 
