Skip to content

Commit aa5fc04

Browse files
drivers: gpio
integrate reworked interrut controller Signed-off-by: Alexander Kozhinov <[email protected]>
1 parent f2fb005 commit aa5fc04

File tree

2 files changed

+26
-149
lines changed

2 files changed

+26
-149
lines changed

drivers/gpio/gpio_stm32.c

+26-29
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>
@@ -39,7 +39,7 @@ LOG_MODULE_REGISTER(stm32, CONFIG_GPIO_LOG_LEVEL);
3939
/**
4040
* @brief EXTI interrupt callback
4141
*/
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)
4343
{
4444
struct gpio_stm32_data *data = arg;
4545

@@ -219,16 +219,15 @@ __maybe_unused static inline uint32_t ll_gpio_get_pin_pull(GPIO_TypeDef *GPIOx,
219219
static inline void gpio_stm32_disable_pin_irqs(uint32_t port, gpio_pin_t pin)
220220
{
221221
#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 */
224228
return;
225229
}
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 */
232231
}
233232

234233
/**
@@ -585,19 +584,18 @@ static int gpio_stm32_pin_interrupt_configure(const struct device *dev,
585584
{
586585
const struct gpio_stm32_config *cfg = dev->config;
587586
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);
589587
uint32_t irq_trigger = 0;
590588
int err = 0;
591589

592-
#ifdef CONFIG_GPIO_ENABLE_DISABLE_INTERRUPT
590+
#if defined(CONFIG_GPIO_ENABLE_DISABLE_INTERRUPT) && defined(CONFIG_EXTI_STM32)
593591
if (mode == GPIO_INT_MODE_DISABLE_ONLY) {
594-
stm32_gpio_intc_disable_line(irq_line);
592+
stm32_exti_disable_irq(pin);
595593
goto exit;
596594
} else if (mode == GPIO_INT_MODE_ENABLE_ONLY) {
597-
stm32_gpio_intc_enable_line(irq_line);
595+
stm32_exti_enable_irq(pin);
598596
goto exit;
599597
}
600-
#endif /* CONFIG_GPIO_ENABLE_DISABLE_INTERRUPT */
598+
#endif /* CONFIG_GPIO_ENABLE_DISABLE_INTERRUPT && CONFIG_EXTI_STM32*/
601599

602600
if (mode == GPIO_INT_MODE_DISABLED) {
603601
gpio_stm32_disable_pin_irqs(cfg->port, pin);
@@ -612,10 +610,10 @@ static int gpio_stm32_pin_interrupt_configure(const struct device *dev,
612610
} else {
613611
switch (trig) {
614612
case GPIO_INT_TRIG_LOW:
615-
irq_trigger = STM32_GPIO_IRQ_TRIG_LOW_LEVEL;
613+
irq_trigger = STM32_EXTI_TRIG_LOW_LEVEL;
616614
break;
617615
case GPIO_INT_TRIG_HIGH:
618-
irq_trigger = STM32_GPIO_IRQ_TRIG_HIGH_LEVEL;
616+
irq_trigger = STM32_EXTI_TRIG_HIGH_LEVEL;
619617
break;
620618
default:
621619
err = -EINVAL;
@@ -625,32 +623,31 @@ static int gpio_stm32_pin_interrupt_configure(const struct device *dev,
625623
} else {
626624
switch (trig) {
627625
case GPIO_INT_TRIG_LOW:
628-
irq_trigger = STM32_GPIO_IRQ_TRIG_FALLING;
626+
irq_trigger = STM32_EXTI_TRIG_FALLING;
629627
break;
630628
case GPIO_INT_TRIG_HIGH:
631-
irq_trigger = STM32_GPIO_IRQ_TRIG_RISING;
629+
irq_trigger = STM32_EXTI_TRIG_RISING;
632630
break;
633631
case GPIO_INT_TRIG_BOTH:
634-
irq_trigger = STM32_GPIO_IRQ_TRIG_BOTH;
632+
irq_trigger = STM32_EXTI_TRIG_BOTH;
635633
break;
636634
default:
637635
err = -EINVAL;
638636
goto exit;
639637
}
640638
}
641639

642-
if (stm32_gpio_intc_set_irq_callback(irq_line, gpio_stm32_isr, data) != 0) {
643-
err = -EBUSY;
644-
goto exit;
645-
}
646-
647640
#if defined(CONFIG_EXTI_STM32)
648641
stm32_exti_set_line_src_port(pin, cfg->port);
649-
#endif
650-
651-
stm32_gpio_intc_select_line_trigger(irq_line, irq_trigger);
652642

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 */
654651

655652
exit:
656653
return err;

include/zephyr/drivers/interrupt_controller/gpio_intc_stm32.h

-120
This file was deleted.

0 commit comments

Comments
 (0)