From e88cdffcd65d8cba0dc1e0c2a38ff7082700ecdb Mon Sep 17 00:00:00 2001 From: Erwan Gouriou Date: Tue, 8 Oct 2019 16:39:01 +0200 Subject: [PATCH] drivers/gpio: stm32: exti: Clear triggers when not requested Since it is now possible to disable/re-enable interrupts and also to reconfigure an already configured interrupt, it is now required to clear non requested triggers. While it is not strictly requested, triggers are also cleared when interrupt is disabled (assuming trigger should be configured when interrupt is enabled). Signed-off-by: Erwan Gouriou fixup exti --- drivers/gpio/gpio_stm32.c | 3 +- .../interrupt_controller/intc_exti_stm32.c | 35 +++++++++++-------- .../drivers/interrupt_controller/exti_stm32.h | 4 +++ 3 files changed, 26 insertions(+), 16 deletions(-) diff --git a/drivers/gpio/gpio_stm32.c b/drivers/gpio/gpio_stm32.c index 9ecedfefa2f..54de75f3192 100644 --- a/drivers/gpio/gpio_stm32.c +++ b/drivers/gpio/gpio_stm32.c @@ -517,8 +517,7 @@ static int gpio_stm32_pin_interrupt_configure(struct device *dev, edge = STM32_EXTI_TRIG_RISING; break; case GPIO_INT_TRIG_BOTH: - edge = STM32_EXTI_TRIG_RISING | - STM32_EXTI_TRIG_FALLING; + edge = STM32_EXTI_TRIG_BOTH; break; } diff --git a/drivers/interrupt_controller/intc_exti_stm32.c b/drivers/interrupt_controller/intc_exti_stm32.c index 3279ae6c9ce..43c672b57b6 100644 --- a/drivers/interrupt_controller/intc_exti_stm32.c +++ b/drivers/interrupt_controller/intc_exti_stm32.c @@ -120,9 +120,7 @@ void stm32_exti_disable(int line) if (line < 32) { LL_EXTI_DisableIT_0_31(1 << line); } else { - __ASSERT_NO_MSG(line); - } } @@ -167,20 +165,29 @@ static inline void stm32_exti_clear_pending(int line) void stm32_exti_trigger(int line, int trigger) { - if (trigger & STM32_EXTI_TRIG_RISING) { - if (line < 32) { - LL_EXTI_EnableRisingTrig_0_31(1 << line); - } else { - __ASSERT_NO_MSG(line); - } + + if (line >= 32) { + __ASSERT_NO_MSG(line); } - if (trigger & STM32_EXTI_TRIG_FALLING) { - if (line < 32) { - LL_EXTI_EnableFallingTrig_0_31(1 << line); - } else { - __ASSERT_NO_MSG(line); - } + switch (trigger) { + case STM32_EXTI_TRIG_NONE: + LL_EXTI_DisableRisingTrig_0_31(1 << line); + LL_EXTI_DisableFallingTrig_0_31(1 << line); + break; + case STM32_EXTI_TRIG_RISING: + LL_EXTI_EnableRisingTrig_0_31(1 << line); + LL_EXTI_DisableFallingTrig_0_31(1 << line); + break; + case STM32_EXTI_TRIG_FALLING: + LL_EXTI_EnableFallingTrig_0_31(1 << line); + LL_EXTI_DisableRisingTrig_0_31(1 << line); + break; + case STM32_EXTI_TRIG_BOTH: + LL_EXTI_EnableRisingTrig_0_31(1 << line); + LL_EXTI_EnableFallingTrig_0_31(1 << line); + default: + __ASSERT_NO_MSG(trigger); } } diff --git a/include/drivers/interrupt_controller/exti_stm32.h b/include/drivers/interrupt_controller/exti_stm32.h index 0646f9a8f32..12d556c9b00 100644 --- a/include/drivers/interrupt_controller/exti_stm32.h +++ b/include/drivers/interrupt_controller/exti_stm32.h @@ -44,10 +44,14 @@ void stm32_exti_disable(int line); * @brief EXTI trigger flags */ enum stm32_exti_trigger { + /* clear trigger */ + STM32_EXTI_TRIG_NONE = 0x0, /* trigger on rising edge */ STM32_EXTI_TRIG_RISING = 0x1, /* trigger on falling endge */ STM32_EXTI_TRIG_FALLING = 0x2, + /* trigger on falling endge */ + STM32_EXTI_TRIG_BOTH = 0x3, }; /**