summaryrefslogtreecommitdiffstats
path: root/bsps/m68k/genmcf548x/irq/irq.c
diff options
context:
space:
mode:
Diffstat (limited to 'bsps/m68k/genmcf548x/irq/irq.c')
-rw-r--r--bsps/m68k/genmcf548x/irq/irq.c140
1 files changed, 10 insertions, 130 deletions
diff --git a/bsps/m68k/genmcf548x/irq/irq.c b/bsps/m68k/genmcf548x/irq/irq.c
index cd38b3e153..4a9fefee33 100644
--- a/bsps/m68k/genmcf548x/irq/irq.c
+++ b/bsps/m68k/genmcf548x/irq/irq.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2013 embedded brains GmbH. All rights reserved.
+ * Copyright (c) 2013, 2021 embedded brains GmbH. All rights reserved.
*
* embedded brains GmbH
* Dornierstr. 4
@@ -20,14 +20,6 @@ void asm_default_interrupt(void);
typedef void (*void_func)(void);
-typedef struct {
- rtems_interrupt_handler handler;
- void *arg;
- const char *info;
-} interrupt_control;
-
-static interrupt_control interrupt_controls[BSP_INTERRUPT_VECTOR_COUNT];
-
static uint32_t vector_to_reg(rtems_vector_number vector)
{
return ((vector + 32U) >> 5) & 0x1;
@@ -131,18 +123,6 @@ rtems_status_code bsp_interrupt_vector_disable(rtems_vector_number vector)
return RTEMS_SUCCESSFUL;
}
-static void_func get_exception_handler(rtems_vector_number vector)
-{
- void **vbr;
- void_func *exception_table;
-
- m68k_get_vbr(vbr);
-
- exception_table = (void_func *)vbr;
-
- return exception_table[vector_to_exception_vector(vector)];
-}
-
static void set_exception_handler(rtems_vector_number vector, void_func handler)
{
void **vbr;
@@ -157,119 +137,19 @@ static void set_exception_handler(rtems_vector_number vector, void_func handler)
static void dispatch_handler(rtems_vector_number exception_vector)
{
- const interrupt_control *ic =
- &interrupt_controls[exception_vector_to_vector(exception_vector)];
-
- (*ic->handler)(ic->arg);
+ bsp_interrupt_handler_dispatch_unchecked(
+ exception_vector_to_vector(exception_vector)
+ );
}
-static uint8_t get_intc_icr(rtems_vector_number vector)
+void mcf548x_interrupt_vector_install(rtems_vector_number vector)
{
- volatile uint8_t *icr = &MCF548X_INTC_ICR0;
-
- return icr[vector];
+ _ISR_Vector_table[vector_to_exception_vector(vector)]
+ = dispatch_handler;
+ set_exception_handler(vector, _ISR_Handler);
}
-rtems_status_code rtems_interrupt_handler_install(
- rtems_vector_number vector,
- const char *info,
- rtems_option options,
- rtems_interrupt_handler handler,
- void *arg
-)
+void mcf548x_interrupt_vector_remove(rtems_vector_number vector)
{
- rtems_status_code sc = RTEMS_SUCCESSFUL;
-
- if (bsp_interrupt_is_valid_vector(vector)) {
- rtems_interrupt_level level;
-
- rtems_interrupt_disable(level);
-
- if (
- get_exception_handler(vector) == asm_default_interrupt
- && get_intc_icr(vector) != 0
- ) {
- interrupt_control *ic = &interrupt_controls[vector];
-
- ic->handler = handler;
- ic->arg = arg;
- ic->info = info;
-
- _ISR_Vector_table[vector_to_exception_vector(vector)]
- = dispatch_handler;
- set_exception_handler(vector, _ISR_Handler);
- bsp_interrupt_vector_enable(vector);
- } else {
- sc = RTEMS_RESOURCE_IN_USE;
- }
-
- rtems_interrupt_enable(level);
- } else {
- sc = RTEMS_INVALID_ID;
- }
-
- return sc;
-}
-
-static bool is_occupied_by_us(rtems_vector_number vector)
-{
- return get_exception_handler(vector) == _ISR_Handler
- && _ISR_Vector_table[vector_to_exception_vector(vector)]
- == dispatch_handler;
-}
-
-rtems_status_code rtems_interrupt_handler_remove(
- rtems_vector_number vector,
- rtems_interrupt_handler handler,
- void *arg
-)
-{
- rtems_status_code sc = RTEMS_SUCCESSFUL;
-
- if (bsp_interrupt_is_valid_vector(vector)) {
- rtems_interrupt_level level;
- interrupt_control *ic = &interrupt_controls[vector];
-
- rtems_interrupt_disable(level);
-
- if (
- is_occupied_by_us(vector)
- && ic->handler == handler
- && ic->arg == arg
- ) {
- bsp_interrupt_vector_disable(vector);
- set_exception_handler(vector, asm_default_interrupt);
-
- memset(ic, 0, sizeof(*ic));
- } else {
- sc = RTEMS_UNSATISFIED;
- }
-
- rtems_interrupt_enable(level);
- } else {
- sc = RTEMS_INVALID_ID;
- }
-
- return sc;
-}
-
-rtems_status_code rtems_interrupt_handler_iterate(
- rtems_vector_number vector,
- rtems_interrupt_per_handler_routine routine,
- void *arg
-)
-{
- rtems_status_code sc = RTEMS_SUCCESSFUL;
-
- if (bsp_interrupt_is_valid_vector(vector)) {
- if (is_occupied_by_us(vector)) {
- const interrupt_control *ic = &interrupt_controls[vector];
-
- (*routine)(arg, ic->info, RTEMS_INTERRUPT_UNIQUE, ic->handler, ic->arg);
- }
- } else {
- sc = RTEMS_INVALID_ID;
- }
-
- return sc;
+ set_exception_handler(vector, asm_default_interrupt);
}