[PATCH 3/4] i2c: Add option to send start condition after deblocking
Marek Vasut
marex at denx.de
Tue Feb 18 18:21:48 CET 2020
On 2/18/20 8:07 AM, Heiko Schocher wrote:
> Hello Marek,
Hi,
> Am 07.02.2020 um 16:57 schrieb Marek Vasut:
>> Add option to send start condition after deblocking SDA.
>>
>> Signed-off-by: Marek Vasut <marex at denx.de>
>> ---
>> drivers/i2c/i2c-uclass.c | 23 ++++++++++++++++++++---
>> include/i2c.h | 4 +++-
>> 2 files changed, 23 insertions(+), 4 deletions(-)
>
> Reviewed-by: Heiko Schocher <hs at denx.de>
>
>> diff --git a/drivers/i2c/i2c-uclass.c b/drivers/i2c/i2c-uclass.c
>> index 86f529241f..e9ec388576 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) {
>> diff --git a/include/i2c.h b/include/i2c.h
>> index 7c92042c58..059200115a 100644
>> --- a/include/i2c.h
>> +++ b/include/i2c.h
>> @@ -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
>
> Is there a tab missing? If so I can add it, when applying this patch.
Nope, if you add tab, the formatting starts to look real awful.
You can add a space if you feel very inclined to do so, but it would
still look ugly.
More information about the U-Boot
mailing list