From 23bda885cb67d04a4a13cf3654e9dc88c09339e3 Mon Sep 17 00:00:00 2001 From: William Vinnicombe Date: Fri, 22 Aug 2025 12:37:13 +0100 Subject: [PATCH] Fix race in gpio_set_irq_enabled_with_callback The order depends on whether you're enabling or disabling --- src/rp2_common/hardware_gpio/gpio.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/rp2_common/hardware_gpio/gpio.c b/src/rp2_common/hardware_gpio/gpio.c index 292041a1..a5560bbb 100644 --- a/src/rp2_common/hardware_gpio/gpio.c +++ b/src/rp2_common/hardware_gpio/gpio.c @@ -196,9 +196,11 @@ void gpio_set_irq_enabled(uint gpio, uint32_t events, bool enabled) { } void gpio_set_irq_enabled_with_callback(uint gpio, uint32_t events, bool enabled, gpio_irq_callback_t callback) { - // first set callback, then enable the interrupt - gpio_set_irq_callback(callback); + // when enabling, first set callback, then enable the interrupt + // when disabling, first disable the interrupt, then clear callback + if (enabled) gpio_set_irq_callback(callback); gpio_set_irq_enabled(gpio, events, enabled); + if (!enabled) gpio_set_irq_callback(callback); if (enabled) irq_set_enabled(IO_IRQ_BANK0, true); }