diff options
Diffstat (limited to 'bsps/m68k/genmcf548x/irq/irq.c')
-rw-r--r-- | bsps/m68k/genmcf548x/irq/irq.c | 140 |
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); } |