summaryrefslogtreecommitdiff
path: root/drivers
diff options
context:
space:
mode:
authorHaibo Chen <haibo.chen@nxp.com>2023-03-27 19:21:43 +0800
committerHeiko Schocher <hs@denx.de>2023-04-11 06:44:39 +0200
commit7f6a2e6e0f7694bf9557683db1d6ef2fc75ef1c8 (patch)
tree778c314948de12bd99adf009bde5c10fb90e2fd9 /drivers
parentd600b0fcbbfe877f67fb8b89e4d09aeb376c01d1 (diff)
downloadu-boot-7f6a2e6e0f7694bf9557683db1d6ef2fc75ef1c8.tar.gz
u-boot-7f6a2e6e0f7694bf9557683db1d6ef2fc75ef1c8.tar.bz2
u-boot-7f6a2e6e0f7694bf9557683db1d6ef2fc75ef1c8.zip
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 <haibo.chen@nxp.com> Reviewed-by: Alexander Kochetkov <al.kochet@gmail.com <mailto:al.kochet@gmail.com>>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/i2c/i2c-uclass.c4
1 files 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,