From 5467b2ef8c876fb1a83affffe870447a6517b3f5 Mon Sep 17 00:00:00 2001 From: Andrey Smirnov Date: Fri, 24 May 2024 14:52:21 -0700 Subject: [PATCH] lsm6dsv16x: Switch the driver to use level triggered IRQ The benefit of using edge triggered interrupt is that they allow one to write handlers that don't require disabling/enabling of the interrupts. This driver donesn't leverage that and, in fact, by using edge trigger it opens up a race condition window between the read of the status register and re-enablement of the IRQ. During that window and IRQ can arrive and be lost stalling the data fetching completely. Signed-off-by: Andrey Smirnov --- drivers/sensor/st/lsm6dsv16x/lsm6dsv16x_trigger.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/drivers/sensor/st/lsm6dsv16x/lsm6dsv16x_trigger.c b/drivers/sensor/st/lsm6dsv16x/lsm6dsv16x_trigger.c index bc18aa588b162..4285835fedf02 100644 --- a/drivers/sensor/st/lsm6dsv16x/lsm6dsv16x_trigger.c +++ b/drivers/sensor/st/lsm6dsv16x/lsm6dsv16x_trigger.c @@ -273,7 +273,7 @@ static void lsm6dsv16x_handle_interrupt(const struct device *dev) if (!ON_I3C_BUS(cfg) || (I3C_INT_PIN(cfg))) { ret = gpio_pin_interrupt_configure_dt(lsm6dsv16x->drdy_gpio, - GPIO_INT_EDGE_TO_ACTIVE); + GPIO_INT_LEVEL_ACTIVE); if (ret < 0) { LOG_ERR("%s: Not able to configure pin_int", dev->name); } @@ -488,5 +488,5 @@ int lsm6dsv16x_init_interrupt(const struct device *dev) #endif return gpio_pin_interrupt_configure_dt(lsm6dsv16x->drdy_gpio, - GPIO_INT_EDGE_TO_ACTIVE); + GPIO_INT_LEVEL_ACTIVE); }