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 <erwan.gouriou@linaro.org> fixup exti
This commit is contained in:
parent
eecc384b22
commit
e88cdffcd6
3 changed files with 26 additions and 16 deletions
|
@ -517,8 +517,7 @@ static int gpio_stm32_pin_interrupt_configure(struct device *dev,
|
||||||
edge = STM32_EXTI_TRIG_RISING;
|
edge = STM32_EXTI_TRIG_RISING;
|
||||||
break;
|
break;
|
||||||
case GPIO_INT_TRIG_BOTH:
|
case GPIO_INT_TRIG_BOTH:
|
||||||
edge = STM32_EXTI_TRIG_RISING |
|
edge = STM32_EXTI_TRIG_BOTH;
|
||||||
STM32_EXTI_TRIG_FALLING;
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -120,9 +120,7 @@ void stm32_exti_disable(int line)
|
||||||
if (line < 32) {
|
if (line < 32) {
|
||||||
LL_EXTI_DisableIT_0_31(1 << line);
|
LL_EXTI_DisableIT_0_31(1 << line);
|
||||||
} else {
|
} else {
|
||||||
|
|
||||||
__ASSERT_NO_MSG(line);
|
__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)
|
void stm32_exti_trigger(int line, int trigger)
|
||||||
{
|
{
|
||||||
if (trigger & STM32_EXTI_TRIG_RISING) {
|
|
||||||
if (line < 32) {
|
if (line >= 32) {
|
||||||
LL_EXTI_EnableRisingTrig_0_31(1 << line);
|
__ASSERT_NO_MSG(line);
|
||||||
} else {
|
|
||||||
__ASSERT_NO_MSG(line);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (trigger & STM32_EXTI_TRIG_FALLING) {
|
switch (trigger) {
|
||||||
if (line < 32) {
|
case STM32_EXTI_TRIG_NONE:
|
||||||
LL_EXTI_EnableFallingTrig_0_31(1 << line);
|
LL_EXTI_DisableRisingTrig_0_31(1 << line);
|
||||||
} else {
|
LL_EXTI_DisableFallingTrig_0_31(1 << line);
|
||||||
__ASSERT_NO_MSG(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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -44,10 +44,14 @@ void stm32_exti_disable(int line);
|
||||||
* @brief EXTI trigger flags
|
* @brief EXTI trigger flags
|
||||||
*/
|
*/
|
||||||
enum stm32_exti_trigger {
|
enum stm32_exti_trigger {
|
||||||
|
/* clear trigger */
|
||||||
|
STM32_EXTI_TRIG_NONE = 0x0,
|
||||||
/* trigger on rising edge */
|
/* trigger on rising edge */
|
||||||
STM32_EXTI_TRIG_RISING = 0x1,
|
STM32_EXTI_TRIG_RISING = 0x1,
|
||||||
/* trigger on falling endge */
|
/* trigger on falling endge */
|
||||||
STM32_EXTI_TRIG_FALLING = 0x2,
|
STM32_EXTI_TRIG_FALLING = 0x2,
|
||||||
|
/* trigger on falling endge */
|
||||||
|
STM32_EXTI_TRIG_BOTH = 0x3,
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue