summaryrefslogtreecommitdiffstats
path: root/c/src/lib/libbsp/sparc/shared/irq/irq-shared.c
diff options
context:
space:
mode:
Diffstat (limited to 'c/src/lib/libbsp/sparc/shared/irq/irq-shared.c')
-rw-r--r--c/src/lib/libbsp/sparc/shared/irq/irq-shared.c83
1 files changed, 83 insertions, 0 deletions
diff --git a/c/src/lib/libbsp/sparc/shared/irq/irq-shared.c b/c/src/lib/libbsp/sparc/shared/irq/irq-shared.c
new file mode 100644
index 0000000000..22f2564723
--- /dev/null
+++ b/c/src/lib/libbsp/sparc/shared/irq/irq-shared.c
@@ -0,0 +1,83 @@
+#include <rtems.h>
+#include <bsp.h>
+#include <bsp/irq-generic.h>
+
+static inline void bsp_dispatch_irq(int irq)
+{
+ bsp_interrupt_handler_entry *e =
+ &bsp_interrupt_handler_table[bsp_interrupt_handler_index(irq)];
+
+ while (e != NULL) {
+ (*e->handler)(e->arg);
+ e = e->next;
+ }
+}
+
+/* Called directly from IRQ trap handler TRAP[0x10..0x1F] = IRQ[0..15] */
+static void BSP_ISR_handler(rtems_vector_number vector)
+{
+ int irq = vector - 0x10;
+
+ /* Let BSP fixup and/or handle incomming IRQ */
+ irq = bsp_irq_fixup(irq);
+
+ bsp_dispatch_irq(irq);
+}
+
+/* Initialize interrupts */
+int BSP_shared_interrupt_init(void)
+{
+ rtems_vector_number vector;
+ rtems_isr_entry previous_isr;
+ int sc, i;
+
+ for (i=0; i <= BSP_INTERRUPT_VECTOR_MAX_STD; i++) {
+ vector = SPARC_ASYNCHRONOUS_TRAP(i) + 0x10;
+ rtems_interrupt_catch(BSP_ISR_handler, vector, &previous_isr);
+ }
+
+ /* Initalize interrupt support */
+ sc = bsp_interrupt_initialize();
+ if (sc != RTEMS_SUCCESSFUL)
+ return -1;
+
+ return 0;
+}
+
+/* Callback from bsp_interrupt_initialize() */
+rtems_status_code bsp_interrupt_facility_initialize(void)
+{
+ return RTEMS_SUCCESSFUL;
+}
+
+rtems_status_code bsp_interrupt_vector_enable(rtems_vector_number vector)
+{
+ BSP_Unmask_interrupt((int)vector);
+
+ return RTEMS_SUCCESSFUL;
+}
+
+rtems_status_code bsp_interrupt_vector_disable(rtems_vector_number vector)
+{
+ BSP_Mask_interrupt((int)vector);
+
+ return RTEMS_SUCCESSFUL;
+}
+
+void BSP_shared_interrupt_mask(int irq)
+{
+ BSP_Mask_interrupt(irq);
+}
+
+void BSP_shared_interrupt_unmask(int irq)
+{
+ BSP_Unmask_interrupt(irq);
+}
+
+void BSP_shared_interrupt_clear(int irq)
+{
+ /* We don't have to interrupt lock here, because the register is only
+ * written and self clearing
+ */
+ BSP_Clear_interrupt(irq);
+}