diff options
author | Daniel Hellstrom <daniel@gaisler.com> | 2014-06-13 10:18:01 +0200 |
---|---|---|
committer | Daniel Hellstrom <daniel@gaisler.com> | 2014-10-09 13:19:40 +0200 |
commit | a387e944f82f41597cebc258b5cab312afb525cd (patch) | |
tree | db122727c656421af32baa760006ad4e96c2cd43 | |
parent | SPARC BSPs: irq-shared.c code style clean-up (diff) | |
download | rtems-a387e944f82f41597cebc258b5cab312afb525cd.tar.bz2 |
LEON3: use interrupt layer in clock driver
Manupilating the interrupt control registers directly instead
of going through the interrupt layer can be deceiving.
-rw-r--r-- | c/src/lib/libbsp/shared/include/fatal.h | 1 | ||||
-rw-r--r-- | c/src/lib/libbsp/sparc/leon3/clock/ckinit.c | 23 |
2 files changed, 21 insertions, 3 deletions
diff --git a/c/src/lib/libbsp/shared/include/fatal.h b/c/src/lib/libbsp/shared/include/fatal.h index b57fbaa136..5098c6d5dd 100644 --- a/c/src/lib/libbsp/shared/include/fatal.h +++ b/c/src/lib/libbsp/shared/include/fatal.h @@ -51,6 +51,7 @@ typedef enum { /* LEON3 fatal codes */ LEON3_FATAL_NO_IRQMP_CONTROLLER = BSP_FATAL_CODE_BLOCK(2), LEON3_FATAL_CONSOLE_REGISTER_DEV, + LEON3_FATAL_CLOCK_INITIALIZATION, /* LPC24XX fatal codes */ LPC24XX_FATAL_PL111_SET_UP = BSP_FATAL_CODE_BLOCK(3), diff --git a/c/src/lib/libbsp/sparc/leon3/clock/ckinit.c b/c/src/lib/libbsp/sparc/leon3/clock/ckinit.c index 5faf72d77d..f382f1abc6 100644 --- a/c/src/lib/libbsp/sparc/leon3/clock/ckinit.c +++ b/c/src/lib/libbsp/sparc/leon3/clock/ckinit.c @@ -20,6 +20,8 @@ #include <bsp.h> #include <bspopts.h> +#include <bsp/fatal.h> +#include <rtems/rtems/intr.h> #include <ambapp.h> #include <rtems/score/profiling.h> @@ -34,8 +36,6 @@ volatile struct gptimer_regs *LEON3_Timer_Regs = 0; static int clkirq; -#define CLOCK_VECTOR LEON_TRAP_TYPE( clkirq ) - static void leon3_clock_profiling_interrupt_delay(void) { #ifdef RTEMS_PROFILING @@ -104,9 +104,26 @@ static void leon3_clock_profiling_interrupt_delay(void) #define Clock_driver_support_install_isr( _new, _old ) \ do { \ - _old = set_vector( _new, CLOCK_VECTOR, 1 ); \ + (_old) = NULL; \ + bsp_clock_handler_install(_new); \ } while(0) +static void bsp_clock_handler_install(rtems_isr *new) +{ + rtems_status_code sc; + + sc = rtems_interrupt_handler_install( + clkirq, + "Clock", + RTEMS_INTERRUPT_UNIQUE, + new, + NULL + ); + if (sc != RTEMS_SUCCESSFUL) { + rtems_fatal(RTEMS_FATAL_SOURCE_BSP, LEON3_FATAL_CLOCK_INITIALIZATION); + } +} + #define Clock_driver_support_initialize_hardware() \ do { \ LEON3_Timer_Regs->timer[LEON3_CLOCK_INDEX].reload = \ |