diff --git a/arch/Kconfig b/arch/Kconfig index 65d730dc7f0..e07458d70db 100644 --- a/arch/Kconfig +++ b/arch/Kconfig @@ -210,6 +210,10 @@ config ARCH_HAVE_RTC_SUBSECONDS bool default n +config ARCH_GLOBAL_IRQDISABLE + bool + defautl n + config ARCH_USE_MMU bool "Enable MMU" default n diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig index 642325162df..337f9910c21 100644 --- a/arch/arm/Kconfig +++ b/arch/arm/Kconfig @@ -107,6 +107,7 @@ config ARCH_CHIP_LC823450 select ARCH_HAVE_HEAPCHECK select ARCH_HAVE_MULTICPU select ARCH_HAVE_I2CRESET + select ARCH_GLOBAL_IRQDISABLE ---help--- ON Semiconductor LC823450 architectures (ARM dual Cortex-M3) diff --git a/include/nuttx/irq.h b/include/nuttx/irq.h index e5674d81c09..56f24ff897d 100644 --- a/include/nuttx/irq.h +++ b/include/nuttx/irq.h @@ -247,7 +247,8 @@ void leave_critical_section(irqstate_t flags); * ****************************************************************************/ -#if defined (CONFIG_SMP) && defined (CONFIG_SPINLOCK_IRQ) +#if defined(CONFIG_SMP) && defined(CONFIG_SPINLOCK_IRQ) && \ + defined(CONFIG_ARCH_GLOBAL_IRQDISABLE) irqstate_t spin_lock_irqsave(void); #else # define spin_lock_irqsave(f) enter_critical_section(f) @@ -275,7 +276,8 @@ irqstate_t spin_lock_irqsave(void); * ****************************************************************************/ -#if defined (CONFIG_SMP) && defined (CONFIG_SPINLOCK_IRQ) +#if defined(CONFIG_SMP) && defined(CONFIG_SPINLOCK_IRQ) && \ + defined(CONFIG_ARCH_GLOBAL_IRQDISABLE) void spin_unlock_irqrestore(irqstate_t flags); #else # define spin_unlock_irqrestore(f) leave_critical_section(f) diff --git a/sched/irq/Make.defs b/sched/irq/Make.defs index 8ae2fde5c3e..a7223c9d299 100644 --- a/sched/irq/Make.defs +++ b/sched/irq/Make.defs @@ -38,8 +38,10 @@ CSRCS += irq_initialize.c irq_attach.c irq_dispatch.c irq_unexpectedisr.c ifeq ($(CONFIG_SMP),y) CSRCS += irq_csection.c ifeq ($(CONFIG_SPINLOCK_IRQ),y) +ifeq ($(CONFIG_ARCH_GLOBAL_IRQDISABLE),y) CSRCS += irq_spinlock.c endif +endif else ifeq ($(CONFIG_SCHED_INSTRUMENTATION_CSECTION),y) CSRCS += irq_csection.c endif diff --git a/sched/irq/irq_spinlock.c b/sched/irq/irq_spinlock.c index a6f1ee97d18..c0303be1198 100644 --- a/sched/irq/irq_spinlock.c +++ b/sched/irq/irq_spinlock.c @@ -45,6 +45,9 @@ #include "sched/sched.h" +#if defined(CONFIG_SMP) && defined (CONFIG_SPINLOCK_IRQ) && \ + defined(CONFIG_ARCH_GLOBAL_IRQDISABLE) + /**************************************************************************** * Public Data ****************************************************************************/ @@ -138,3 +141,5 @@ void spin_unlock_irqrestore(irqstate_t flags) up_irq_restore(flags); } + +#endif /* CONFIG_SMP && CONFIG_SPINLOCK_IRQ && CONFIG_ARCH_GLOBAL_IRQDISABLE */