18
18
#include <zephyr/drivers/gpio.h>
19
19
#include <zephyr/drivers/clock_control/stm32_clock_control.h>
20
20
#include <zephyr/sys/util.h>
21
- #include <zephyr/drivers/interrupt_controller/gpio_intc_stm32 .h>
21
+ #include <zephyr/drivers/interrupt_controller/intc_exti_stm32 .h>
22
22
#include <zephyr/pm/device.h>
23
23
#include <zephyr/pm/device_runtime.h>
24
24
#include <zephyr/drivers/misc/stm32_wkup_pins/stm32_wkup_pins.h>
@@ -39,7 +39,7 @@ LOG_MODULE_REGISTER(stm32, CONFIG_GPIO_LOG_LEVEL);
39
39
/**
40
40
* @brief EXTI interrupt callback
41
41
*/
42
- static void gpio_stm32_isr (gpio_port_pins_t pin , void * arg )
42
+ __maybe_unused static void gpio_stm32_isr (gpio_port_pins_t pin , void * arg )
43
43
{
44
44
struct gpio_stm32_data * data = arg ;
45
45
@@ -219,16 +219,15 @@ __maybe_unused static inline uint32_t ll_gpio_get_pin_pull(GPIO_TypeDef *GPIOx,
219
219
static inline void gpio_stm32_disable_pin_irqs (uint32_t port , gpio_pin_t pin )
220
220
{
221
221
#if defined(CONFIG_EXTI_STM32 )
222
- if (port != stm32_exti_get_line_src_port (pin )) {
223
- /* EXTI line not owned by this port - do nothing */
222
+ /**
223
+ * GPIO pins are connected to EXTI lines 0 to 15 and directly represent EXTI
224
+ * line number
225
+ */
226
+ if (stm32_exti_disable (pin ) != 0 ) {
227
+ /* pin number is not valid */
224
228
return ;
225
229
}
226
- #endif
227
- stm32_gpio_irq_line_t irq_line = stm32_gpio_intc_get_pin_irq_line (port , pin );
228
-
229
- stm32_gpio_intc_disable_line (irq_line );
230
- stm32_gpio_intc_remove_irq_callback (irq_line );
231
- stm32_gpio_intc_select_line_trigger (irq_line , STM32_GPIO_IRQ_TRIG_NONE );
230
+ #endif /* CONFIG_EXTI_STM32 */
232
231
}
233
232
234
233
/**
@@ -585,19 +584,18 @@ static int gpio_stm32_pin_interrupt_configure(const struct device *dev,
585
584
{
586
585
const struct gpio_stm32_config * cfg = dev -> config ;
587
586
struct gpio_stm32_data * data = dev -> data ;
588
- const stm32_gpio_irq_line_t irq_line = stm32_gpio_intc_get_pin_irq_line (cfg -> port , pin );
589
587
uint32_t irq_trigger = 0 ;
590
588
int err = 0 ;
591
589
592
- #ifdef CONFIG_GPIO_ENABLE_DISABLE_INTERRUPT
590
+ #if defined( CONFIG_GPIO_ENABLE_DISABLE_INTERRUPT ) && defined( CONFIG_EXTI_STM32 )
593
591
if (mode == GPIO_INT_MODE_DISABLE_ONLY ) {
594
- stm32_gpio_intc_disable_line ( irq_line );
592
+ stm32_exti_disable_irq ( pin );
595
593
goto exit ;
596
594
} else if (mode == GPIO_INT_MODE_ENABLE_ONLY ) {
597
- stm32_gpio_intc_enable_line ( irq_line );
595
+ stm32_exti_enable_irq ( pin );
598
596
goto exit ;
599
597
}
600
- #endif /* CONFIG_GPIO_ENABLE_DISABLE_INTERRUPT */
598
+ #endif /* CONFIG_GPIO_ENABLE_DISABLE_INTERRUPT && CONFIG_EXTI_STM32 */
601
599
602
600
if (mode == GPIO_INT_MODE_DISABLED ) {
603
601
gpio_stm32_disable_pin_irqs (cfg -> port , pin );
@@ -612,10 +610,10 @@ static int gpio_stm32_pin_interrupt_configure(const struct device *dev,
612
610
} else {
613
611
switch (trig ) {
614
612
case GPIO_INT_TRIG_LOW :
615
- irq_trigger = STM32_GPIO_IRQ_TRIG_LOW_LEVEL ;
613
+ irq_trigger = STM32_EXTI_TRIG_LOW_LEVEL ;
616
614
break ;
617
615
case GPIO_INT_TRIG_HIGH :
618
- irq_trigger = STM32_GPIO_IRQ_TRIG_HIGH_LEVEL ;
616
+ irq_trigger = STM32_EXTI_TRIG_HIGH_LEVEL ;
619
617
break ;
620
618
default :
621
619
err = - EINVAL ;
@@ -625,32 +623,31 @@ static int gpio_stm32_pin_interrupt_configure(const struct device *dev,
625
623
} else {
626
624
switch (trig ) {
627
625
case GPIO_INT_TRIG_LOW :
628
- irq_trigger = STM32_GPIO_IRQ_TRIG_FALLING ;
626
+ irq_trigger = STM32_EXTI_TRIG_FALLING ;
629
627
break ;
630
628
case GPIO_INT_TRIG_HIGH :
631
- irq_trigger = STM32_GPIO_IRQ_TRIG_RISING ;
629
+ irq_trigger = STM32_EXTI_TRIG_RISING ;
632
630
break ;
633
631
case GPIO_INT_TRIG_BOTH :
634
- irq_trigger = STM32_GPIO_IRQ_TRIG_BOTH ;
632
+ irq_trigger = STM32_EXTI_TRIG_BOTH ;
635
633
break ;
636
634
default :
637
635
err = - EINVAL ;
638
636
goto exit ;
639
637
}
640
638
}
641
639
642
- if (stm32_gpio_intc_set_irq_callback (irq_line , gpio_stm32_isr , data ) != 0 ) {
643
- err = - EBUSY ;
644
- goto exit ;
645
- }
646
-
647
640
#if defined(CONFIG_EXTI_STM32 )
648
641
stm32_exti_set_line_src_port (pin , cfg -> port );
649
- #endif
650
-
651
- stm32_gpio_intc_select_line_trigger (irq_line , irq_trigger );
652
642
653
- stm32_gpio_intc_enable_line (irq_line );
643
+ err = stm32_exti_enable (pin , irq_trigger , STM32_EXTI_MODE_IT , gpio_stm32_isr ,
644
+ data );
645
+ if (err != 0 ) {
646
+ err = - EBUSY ;
647
+ }
648
+ #else /* CONFIG_EXTI_STM32 */
649
+ ARG_UNUSED (data );
650
+ #endif /* CONFIG_EXTI_STM32 */
654
651
655
652
exit :
656
653
return err ;
0 commit comments