Compare commits

...

2 commits

Author SHA1 Message Date
Aidan MacDonald
c9d468d924 stm32h7: use nvic_disable_irq_sync for usb interrupt
Change-Id: I583b860f4b1696d4be84b0bf858a8b857d891aea
2026-02-22 20:54:06 -05:00
Aidan MacDonald
02d317a3f4 arm: add nvic_disable_irq_sync()
Disabling an IRQ in the NVIC may not take effect right away;
if the IRQ is being disabled to implement a critical section
it's necessary to follow up with dsb + isb to serialize the
NVIC update. Add a helper function for doing this.

Change-Id: Iaaa238ad39997cc3c6d62867d265cf9e9e0e5c4b
2026-02-22 20:53:53 -05:00
2 changed files with 8 additions and 2 deletions

View file

@ -43,6 +43,13 @@ static inline void nvic_disable_irq(int nr)
reg_var(CM_NVIC_ICER(reg)) = BIT_N(bit); reg_var(CM_NVIC_ICER(reg)) = BIT_N(bit);
} }
static inline void nvic_disable_irq_sync(int nr)
{
nvic_disable_irq(nr);
arm_dsb();
arm_isb();
}
static inline void nvic_set_pending_irq(int nr) static inline void nvic_set_pending_irq(int nr)
{ {
int reg = nr / 32; int reg = nr / 32;

View file

@ -172,8 +172,7 @@ void usb_dw_target_enable_irq(void)
void usb_dw_target_disable_irq(void) void usb_dw_target_disable_irq(void)
{ {
nvic_disable_irq(IRQN_USB); nvic_disable_irq_sync(IRQN_USB);
arm_dsb();
} }
void usb_dw_target_clear_irq(void) void usb_dw_target_clear_irq(void)