microblaze: intc: Clear interrupt code
authorMichal Simek <monstr@monstr.eu>
Tue, 10 Jul 2012 08:31:31 +0000 (10:31 +0200)
committerMichal Simek <monstr@monstr.eu>
Tue, 10 Jul 2012 09:54:06 +0000 (11:54 +0200)
Clear and prepare for device-tree driven configuration.
Remove CONFIG_SYS_INTC_0 definition
Use dynamic allocation instead of static.

Signed-off-by: Michal Simek <monstr@monstr.eu>
Acked-by: Simon Glass <sjg@chromium.org>
arch/microblaze/cpu/interrupts.c
arch/microblaze/cpu/start.S
arch/microblaze/cpu/timer.c
arch/microblaze/include/asm/microblaze_intc.h
arch/microblaze/lib/board.c
include/configs/microblaze-generic.h

index e7ca859..ee67082 100644 (file)
@@ -26,6 +26,7 @@
 
 #include <common.h>
 #include <command.h>
+#include <malloc.h>
 #include <asm/microblaze_intc.h>
 #include <asm/asm.h>
 
@@ -48,20 +49,19 @@ int disable_interrupts (void)
        return (msr & 0x2) != 0;
 }
 
-#ifdef CONFIG_SYS_INTC_0
-
-static struct irq_action vecs[CONFIG_SYS_INTC_0_NUM];
+static struct irq_action *vecs;
+static u32 irq_no;
 
 /* mapping structure to interrupt controller */
-microblaze_intc_t *intc = (microblaze_intc_t *) (CONFIG_SYS_INTC_0_ADDR);
+microblaze_intc_t *intc;
 
 /* default handler */
-void def_hdlr (void)
+static void def_hdlr(void)
 {
        puts ("def_hdlr\n");
 }
 
-void enable_one_interrupt (int irq)
+static void enable_one_interrupt(int irq)
 {
        int mask;
        int offset = 1;
@@ -76,7 +76,7 @@ void enable_one_interrupt (int irq)
 #endif
 }
 
-void disable_one_interrupt (int irq)
+static void disable_one_interrupt(int irq)
 {
        int mask;
        int offset = 1;
@@ -96,7 +96,7 @@ void install_interrupt_handler (int irq, interrupt_handler_t * hdlr, void *arg)
 {
        struct irq_action *act;
        /* irq out of range */
-       if ((irq < 0) || (irq > CONFIG_SYS_INTC_0_NUM)) {
+       if ((irq < 0) || (irq > irq_no)) {
                puts ("IRQ out of range\n");
                return;
        }
@@ -114,7 +114,7 @@ void install_interrupt_handler (int irq, interrupt_handler_t * hdlr, void *arg)
 }
 
 /* initialization interrupt controller - hardware */
-void intc_init (void)
+static void intc_init(void)
 {
        intc->mer = 0;
        intc->ier = 0;
@@ -127,18 +127,33 @@ void intc_init (void)
 #endif
 }
 
-int interrupts_init (void)
+int interrupts_init(void)
 {
        int i;
-       /* initialize irq list */
-       for (i = 0; i < CONFIG_SYS_INTC_0_NUM; i++) {
-               vecs[i].handler = (interrupt_handler_t *) def_hdlr;
-               vecs[i].arg = (void *)i;
-               vecs[i].count = 0;
+
+#if defined(CONFIG_SYS_INTC_0_ADDR) && defined(CONFIG_SYS_INTC_0_NUM)
+       intc = (microblaze_intc_t *) (CONFIG_SYS_INTC_0_ADDR);
+       irq_no = CONFIG_SYS_INTC_0_NUM;
+#endif
+       if (irq_no) {
+               vecs = calloc(1, sizeof(struct irq_action) * irq_no);
+               if (vecs == NULL) {
+                       puts("Interrupt vector allocation failed\n");
+                       return -1;
+               }
+
+               /* initialize irq list */
+               for (i = 0; i < irq_no; i++) {
+                       vecs[i].handler = (interrupt_handler_t *) def_hdlr;
+                       vecs[i].arg = (void *)i;
+                       vecs[i].count = 0;
+               }
+               /* initialize intc controller */
+               intc_init();
+               enable_interrupts();
+       } else {
+               puts("Undefined interrupt controller\n");
        }
-       /* initialize intc controller */
-       intc_init ();
-       enable_interrupts ();
        return 0;
 }
 
@@ -172,33 +187,30 @@ void interrupt_handler (void)
        printf ("Interrupt handler on %x line, r14 %x\n", irqs, value);
 #endif
 }
-#endif
 
 #if defined(CONFIG_CMD_IRQ)
-#ifdef CONFIG_SYS_INTC_0
-int do_irqinfo (cmd_tbl_t * cmdtp, int flag, int argc, char * const argv[])
+int do_irqinfo(cmd_tbl_t *cmdtp, int flag, int argc, const char *argv[])
 {
        int i;
        struct irq_action *act = vecs;
 
-       puts ("\nInterrupt-Information:\n\n"
-             "Nr  Routine   Arg       Count\n"
-             "-----------------------------\n");
-
-       for (i = 0; i < CONFIG_SYS_INTC_0_NUM; i++) {
-               if (act->handler != (interrupt_handler_t*) def_hdlr) {
-                       printf ("%02d  %08x  %08x  %d\n", i,
-                               (int)act->handler, (int)act->arg, act->count);
+       if (irq_no) {
+               puts("\nInterrupt-Information:\n\n"
+                     "Nr  Routine   Arg       Count\n"
+                     "-----------------------------\n");
+
+               for (i = 0; i < irq_no; i++) {
+                       if (act->handler != (interrupt_handler_t *) def_hdlr) {
+                               printf("%02d  %08x  %08x  %d\n", i,
+                                       (int)act->handler, (int)act->arg,
+                                                               act->count);
+                       }
+                       act++;
                }
-               act++;
+               puts("\n");
+       } else {
+               puts("Undefined interrupt controller\n");
        }
-       puts ("\n");
-       return (0);
-}
-#else
-int do_irqinfo (cmd_tbl_t * cmdtp, int flag, int argc, char * const argv[])
-{
-       puts ("Undefined interrupt controller\n");
+       return 0;
 }
 #endif
-#endif
index 9077f74..8a2f634 100644 (file)
@@ -108,7 +108,6 @@ _start:
        sh      r6, r0, r8
 #endif
 
-#ifdef CONFIG_SYS_INTC_0
        /* interrupt_handler */
        swi     r2, r0, 0x10    /* interrupt - imm opcode */
        swi     r3, r0, 0x14    /* interrupt - brai opcode */
@@ -120,7 +119,6 @@ _start:
        sh      r7, r0, r8
        rsubi   r8, r10, 0x16
        sh      r6, r0, r8
-#endif
 
        /* hardware exception */
        swi     r2, r0, 0x20    /* hardware exception - imm opcode */
index fdcd9e3..cc6b897 100644 (file)
@@ -40,7 +40,6 @@ ulong get_timer (ulong base)
 }
 #endif
 
-#ifdef CONFIG_SYS_INTC_0
 #ifdef CONFIG_SYS_TIMER_0
 void __udelay(unsigned long usec)
 {
@@ -80,7 +79,6 @@ int timer_init (void)
        return 0;
 }
 #endif
-#endif
 
 /*
  * This function is derived from PowerPC code (read timebase as long long).
index 4c385aa..6142b9c 100644 (file)
@@ -41,3 +41,6 @@ struct irq_action {
 
 void install_interrupt_handler (int irq, interrupt_handler_t * hdlr,
                                       void *arg);
+
+int interrupts_init(void);
+
index d3f2595..b80250a 100644 (file)
 #include <serial.h>
 #include <net.h>
 #include <asm/processor.h>
+#include <asm/microblaze_intc.h>
 
 DECLARE_GLOBAL_DATA_PTR;
 
 #ifdef CONFIG_SYS_GPIO_0
 extern int gpio_init (void);
 #endif
-#ifdef CONFIG_SYS_INTC_0
-extern int interrupts_init (void);
-#endif
 #ifdef CONFIG_SYS_TIMER_0
 extern int timer_init (void);
 #endif
@@ -70,9 +68,7 @@ init_fnc_t *init_sequence[] = {
 #ifdef CONFIG_SYS_GPIO_0
        gpio_init,
 #endif
-#ifdef CONFIG_SYS_INTC_0
        interrupts_init,
-#endif
 #ifdef CONFIG_SYS_TIMER_0
        timer_init,
 #endif
index 9a0f9a1..56dcc02 100644 (file)
 
 /* interrupt controller */
 #ifdef XILINX_INTC_BASEADDR
-# define CONFIG_SYS_INTC_0             1
 # define CONFIG_SYS_INTC_0_ADDR                XILINX_INTC_BASEADDR
 # define CONFIG_SYS_INTC_0_NUM         XILINX_INTC_NUM_INTR_INPUTS
 #endif