Split test suite in new file.
[bertos.git] / cpu / arm / drv / sysirq_at91.c
index a942c0957dd964adaaf7da75a7e5f30f35834cab..281c7963f8afdbee1fb0fc472ca961a3171cd921 100644 (file)
  * \see sysirq_setEnable
  */
 
-#include "sysirq.h"
-#include "at91sam7s.h"
-#include <cfg/cpu.h>
+#include "sysirq_at91.h"
+#include <io/arm.h>
+#include <cpu/irq.h>
+#include <cpu/types.h>
 #include <cfg/module.h>
 #include <cfg/macros.h>
 
@@ -86,26 +87,6 @@ static SysIrq sysirq_tab[] =
 
 STATIC_ASSERT(countof(sysirq_tab) == SYSIRQ_CNT);
 
-/*!
- * \brief Interrupt entry.
- */
-#define IRQ_ENTRY() \
-    asm volatile("sub   lr, lr,#4"          "\n\t"  /* Adjust LR */ \
-                 "stmfd sp!,{r0-r12,lr}"    "\n\t"  /* Save registers on IRQ stack. */ \
-                 "mrs   r1, spsr"           "\n\t"  /* Save SPSR */ \
-                 "stmfd sp!,{r1}"           "\n\t")     /* */
-
-/*!
- * \brief Interrupt exit.
- */
-#define IRQ_EXIT() \
-    asm volatile("ldmfd sp!, {r1}"          "\n\t"  /* Restore SPSR */ \
-                 "msr   spsr_c, r1"         "\n\t"  /* */ \
-                 "ldr   r0, =0xFFFFF000"    "\n\t"  /* End of interrupt. */ \
-                 "str   r0, [r0, #0x130]"   "\n\t"  /* */ \
-                 "ldmfd sp!, {r0-r12, pc}^" "\n\t")     /* Restore registers and return. */
-
-
 /**
  * System IRQ dispatcher.
  * This is the entry point for all system IRQs in AT91.
@@ -113,10 +94,9 @@ STATIC_ASSERT(countof(sysirq_tab) == SYSIRQ_CNT);
  * various sources (system timer, etc..) and calls
  * the corresponding handler.
  */
-static void sysirq_dispatcher(void) __attribute__ ((naked));
+static void sysirq_dispatcher(void) __attribute__ ((interrupt));
 static void sysirq_dispatcher(void)
 {
-       IRQ_ENTRY();
        for (unsigned i = 0; i < countof(sysirq_tab); i++)
        {
                if (sysirq_tab[i].enabled
@@ -124,7 +104,8 @@ static void sysirq_dispatcher(void)
                        sysirq_tab[i].handler();
        }
 
-       IRQ_EXIT();
+       /* Inform hw that we have served the IRQ */
+       AIC_EOICR = 0;
 }
 
 #define SYSIRQ_PRIORITY 0 ///< default priority for system irqs.
@@ -164,7 +145,6 @@ void sysirq_init(void)
  */
 void sysirq_setHandler(sysirq_t irq, sysirq_handler_t handler)
 {
-       ASSERT(irq >= 0);
        ASSERT(irq < SYSIRQ_CNT);
        sysirq_tab[irq].handler = handler;
 }
@@ -174,7 +154,6 @@ void sysirq_setHandler(sysirq_t irq, sysirq_handler_t handler)
  */
 void sysirq_setEnable(sysirq_t irq, bool enable)
 {
-       ASSERT(irq >= 0);
        ASSERT(irq < SYSIRQ_CNT);
 
        sysirq_tab[irq].setEnable(enable);
@@ -186,7 +165,6 @@ void sysirq_setEnable(sysirq_t irq, bool enable)
  */
 bool sysirq_enabled(sysirq_t irq)
 {
-       ASSERT(irq >= 0);
        ASSERT(irq < SYSIRQ_CNT);
 
        return sysirq_tab[irq].enabled;