i2c: Add option to send start condition after deblocking
Add option to send start condition after deblocking SDA. Signed-off-by: Marek Vasut <marex@denx.de> Reviewed-by: Heiko Schocher <hs@denx.de>
This commit is contained in:
parent
7231522a5e
commit
a191728633
@ -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) {
|
||||
|
@ -339,12 +339,14 @@ int i2c_deblock(struct udevice *bus);
|
||||
* @sda_pin: SDA GPIO
|
||||
* @scl_pin: SCL GPIO
|
||||
* @scl_count: Number of SCL clock cycles generated to deblock SDA
|
||||
* @start_count:Number of I2C start conditions sent after deblocking SDA
|
||||
* @delay: Delay between SCL clock line changes
|
||||
* @return 0 if OK, -ve on error
|
||||
*/
|
||||
struct gpio_desc;
|
||||
int i2c_deblock_gpio_loop(struct gpio_desc *sda_pin, struct gpio_desc *scl_pin,
|
||||
unsigned int scl_count, unsigned int delay);
|
||||
unsigned int scl_count, unsigned int start_count,
|
||||
unsigned int delay);
|
||||
|
||||
/**
|
||||
* struct dm_i2c_ops - driver operations for I2C uclass
|
||||
|
Loading…
Reference in New Issue
Block a user