From 7f6a2e6e0f7694bf9557683db1d6ef2fc75ef1c8 Mon Sep 17 00:00:00 2001 From: Haibo Chen Date: Mon, 27 Mar 2023 19:21:43 +0800 Subject: [PATCH] i2c: correct I2C deblock logic Current code use dm_gpio_get_value() to get SDA and SCL value, and the value depends on whether DTS file config the GPIO_ACTIVE_LOW. In ususal case for i2c GPIO, DTS need to set GPIO_ACTIVE_LOW for SCL/SDA pins. So here the logic is not correct. And we must not use GPIOD_ACTIVE_LOW in client code include the dm_gpio_set_dir_flags(), it is DTS's responsibility for this flag. So remove GPIOD_ACTIVE_LOW here. Fixes: aa54192d4a87 ("dm: i2c: implement gpio-based I2C deblock") Signed-off-by: Haibo Chen Reviewed-by: Alexander Kochetkov > --- drivers/i2c/i2c-uclass.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/drivers/i2c/i2c-uclass.c b/drivers/i2c/i2c-uclass.c index 8d9a89ed89..8867a560bd 100644 --- a/drivers/i2c/i2c-uclass.c +++ b/drivers/i2c/i2c-uclass.c @@ -508,13 +508,13 @@ static void i2c_gpio_set_pin(struct gpio_desc *pin, int bit) dm_gpio_set_dir_flags(pin, GPIOD_IS_IN); else dm_gpio_set_dir_flags(pin, GPIOD_IS_OUT | - GPIOD_ACTIVE_LOW | GPIOD_IS_OUT_ACTIVE); } static int i2c_gpio_get_pin(struct gpio_desc *pin) { - return dm_gpio_get_value(pin); + /* DTS need config GPIO_ACTIVE_LOW */ + return !dm_gpio_get_value(pin); } int i2c_deblock_gpio_loop(struct gpio_desc *sda_pin, -- 2.39.5