From 486b78e2459a9c27c9cbed1594e17d641ea24abc Mon Sep 17 00:00:00 2001 From: will-v-pi <108662275+will-v-pi@users.noreply.github.com> Date: Wed, 10 Sep 2025 16:15:58 +0100 Subject: [PATCH] Fix race in gpio_set_irq_enabled_with_callback (#2635) 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); }