Skip to content

Commit 49f0acc

Browse files
drivers: interrupt_controller
rework STM32 EXTI interrupt controller to support other peripherals than only GPIO integrate new EXTI driver to RTC Signed-off-by: Alexander Kozhinov <[email protected]>
1 parent b5de23a commit 49f0acc

File tree

10 files changed

+606
-419
lines changed

10 files changed

+606
-419
lines changed

drivers/gpio/gpio_stm32.c

+18-22
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818
#include <zephyr/drivers/gpio.h>
1919
#include <zephyr/drivers/clock_control/stm32_clock_control.h>
2020
#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>
2222
#include <zephyr/pm/device.h>
2323
#include <zephyr/pm/device_runtime.h>
2424
#include <zephyr/drivers/misc/stm32_wkup_pins/stm32_wkup_pins.h>
@@ -224,11 +224,11 @@ static inline void gpio_stm32_disable_pin_irqs(uint32_t port, gpio_pin_t pin)
224224
return;
225225
}
226226
#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);
227+
/**
228+
* GPIO pins are connected to EXTI lines 0 to 15 and directly represent EXTI
229+
* line number
230+
*/
231+
stm32_exti_disable(pin);
232232
}
233233

234234
/**
@@ -585,16 +585,15 @@ static int gpio_stm32_pin_interrupt_configure(const struct device *dev,
585585
{
586586
const struct gpio_stm32_config *cfg = dev->config;
587587
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);
589588
uint32_t irq_trigger = 0;
590589
int err = 0;
591590

592591
#ifdef CONFIG_GPIO_ENABLE_DISABLE_INTERRUPT
593592
if (mode == GPIO_INT_MODE_DISABLE_ONLY) {
594-
stm32_gpio_intc_disable_line(irq_line);
593+
stm32_exti_disable_irq(pin);
595594
goto exit;
596595
} else if (mode == GPIO_INT_MODE_ENABLE_ONLY) {
597-
stm32_gpio_intc_enable_line(irq_line);
596+
stm32_exti_enable_irq(pin);
598597
goto exit;
599598
}
600599
#endif /* CONFIG_GPIO_ENABLE_DISABLE_INTERRUPT */
@@ -612,10 +611,10 @@ static int gpio_stm32_pin_interrupt_configure(const struct device *dev,
612611
} else {
613612
switch (trig) {
614613
case GPIO_INT_TRIG_LOW:
615-
irq_trigger = STM32_GPIO_IRQ_TRIG_LOW_LEVEL;
614+
irq_trigger = STM32_EXTI_TRIG_LOW_LEVEL;
616615
break;
617616
case GPIO_INT_TRIG_HIGH:
618-
irq_trigger = STM32_GPIO_IRQ_TRIG_HIGH_LEVEL;
617+
irq_trigger = STM32_EXTI_TRIG_HIGH_LEVEL;
619618
break;
620619
default:
621620
err = -EINVAL;
@@ -625,32 +624,29 @@ static int gpio_stm32_pin_interrupt_configure(const struct device *dev,
625624
} else {
626625
switch (trig) {
627626
case GPIO_INT_TRIG_LOW:
628-
irq_trigger = STM32_GPIO_IRQ_TRIG_FALLING;
627+
irq_trigger = STM32_EXTI_TRIG_FALLING;
629628
break;
630629
case GPIO_INT_TRIG_HIGH:
631-
irq_trigger = STM32_GPIO_IRQ_TRIG_RISING;
630+
irq_trigger = STM32_EXTI_TRIG_RISING;
632631
break;
633632
case GPIO_INT_TRIG_BOTH:
634-
irq_trigger = STM32_GPIO_IRQ_TRIG_BOTH;
633+
irq_trigger = STM32_EXTI_TRIG_BOTH;
635634
break;
636635
default:
637636
err = -EINVAL;
638637
goto exit;
639638
}
640639
}
641640

642-
if (stm32_gpio_intc_set_irq_callback(irq_line, gpio_stm32_isr, data) != 0) {
643-
err = -EBUSY;
644-
goto exit;
645-
}
646-
647641
#if defined(CONFIG_EXTI_STM32)
648642
stm32_exti_set_line_src_port(pin, cfg->port);
649643
#endif
650644

651-
stm32_gpio_intc_select_line_trigger(irq_line, irq_trigger);
652-
653-
stm32_gpio_intc_enable_line(irq_line);
645+
err = stm32_exti_enable(pin, irq_trigger, STM32_EXTI_MODE_IT, gpio_stm32_isr,
646+
data);
647+
if (err != 0) {
648+
err = -EBUSY;
649+
}
654650

655651
exit:
656652
return err;

0 commit comments

Comments
 (0)