[PATCH] dm: i2c-gpio: add support for clock stretching
Heiko Schocher
hs at denx.de
Mon Jan 27 08:00:47 CET 2020
Hello Michael,
Am 23.01.2020 um 23:30 schrieb Michael Auchter:
> This adds support for clock stretching to the i2c-gpio driver. This is
> accomplished by switching the GPIO used for the SCL line to an input
> when it should be driven high, and polling on the SCL line value until
> it goes high (indicating that the I2C slave is no longer pulling it
> low).
>
> Signed-off-by: Michael Auchter <michael.auchter at ni.com>
> Cc: Heiko Schocher <hs at denx.de>
> ---
> drivers/i2c/i2c-gpio.c | 15 +++++++++++----
> 1 file changed, 11 insertions(+), 4 deletions(-)
>
> diff --git a/drivers/i2c/i2c-gpio.c b/drivers/i2c/i2c-gpio.c
> index 4e8fa21473..80ac26e583 100644
> --- a/drivers/i2c/i2c-gpio.c
> +++ b/drivers/i2c/i2c-gpio.c
> @@ -49,11 +49,18 @@ static void i2c_gpio_sda_set(struct gpio_desc *sda, int bit)
>
> static void i2c_gpio_scl_set(struct gpio_desc *scl, int bit)
> {
> - ulong flags = GPIOD_IS_OUT;
> + int count = 0;
>
> - if (bit)
> - flags |= GPIOD_IS_OUT_ACTIVE;
> - dm_gpio_set_dir_flags(scl, flags);
> + if (bit) {
> + dm_gpio_set_dir_flags(scl, GPIOD_IS_IN);
> + while (!dm_gpio_get_value(scl) && count++ < 100000)
> + udelay(1);
> +
> + if (!dm_gpio_get_value(scl))
> + pr_err("timeout waiting on slave to release scl\n");
> + } else {
> + dm_gpio_set_dir_flags(scl, GPIOD_IS_OUT);
> + }
> }
>
> static void i2c_gpio_write_bit(struct gpio_desc *scl, struct gpio_desc *sda,
>
In principle I would say Ok, but your patch changes behaviour for
all boards which use this driver currently ...
May they cannot reread the gpio ... we have no scl_get() yet!
So please, make this change dependend on linux property "i2c-gpio,scl-output-only"
see:
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/Documentation/devicetree/bindings/i2c/i2c-gpio.yaml#n36
As an example in linux:
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/drivers/i2c/busses/i2c-gpio.c#n317
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/drivers/i2c/algos/i2c-algo-bit.c#n75
So at least, we have the chance to switch back to old behaviour by adding
this (new for U-Boot) property.
Thanks!
bye,
Heiko
--
DENX Software Engineering GmbH, Managing Director: Wolfgang Denk
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
Phone: +49-8142-66989-52 Fax: +49-8142-66989-80 Email: hs at denx.de
More information about the U-Boot
mailing list