summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichal Simek <monstr@monstr.eu>2012-07-10 10:31:31 +0200
committerMichal Simek <monstr@monstr.eu>2012-07-10 11:54:06 +0200
commit575a3d21f6d7cbb653e48a957d0b2db944f2b9b3 (patch)
treef9135962ff321281df6a22b56a2a6b005ac94a21
parente0bb305df88c98215da6d16af3709863d59ee256 (diff)
downloadu-boot-imx-575a3d21f6d7cbb653e48a957d0b2db944f2b9b3.zip
u-boot-imx-575a3d21f6d7cbb653e48a957d0b2db944f2b9b3.tar.gz
u-boot-imx-575a3d21f6d7cbb653e48a957d0b2db944f2b9b3.tar.bz2
microblaze: intc: Clear interrupt code
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>
-rw-r--r--arch/microblaze/cpu/interrupts.c88
-rw-r--r--arch/microblaze/cpu/start.S2
-rw-r--r--arch/microblaze/cpu/timer.c2
-rw-r--r--arch/microblaze/include/asm/microblaze_intc.h3
-rw-r--r--arch/microblaze/lib/board.c6
-rw-r--r--include/configs/microblaze-generic.h1
6 files changed, 54 insertions, 48 deletions
diff --git a/arch/microblaze/cpu/interrupts.c b/arch/microblaze/cpu/interrupts.c
index e7ca859..ee67082 100644
--- a/arch/microblaze/cpu/interrupts.c
+++ b/arch/microblaze/cpu/interrupts.c
@@ -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
diff --git a/arch/microblaze/cpu/start.S b/arch/microblaze/cpu/start.S
index 9077f74..8a2f634 100644
--- a/arch/microblaze/cpu/start.S
+++ b/arch/microblaze/cpu/start.S
@@ -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 */
diff --git a/arch/microblaze/cpu/timer.c b/arch/microblaze/cpu/timer.c
index fdcd9e3..cc6b897 100644
--- a/arch/microblaze/cpu/timer.c
+++ b/arch/microblaze/cpu/timer.c
@@ -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).
diff --git a/arch/microblaze/include/asm/microblaze_intc.h b/arch/microblaze/include/asm/microblaze_intc.h
index 4c385aa..6142b9c 100644
--- a/arch/microblaze/include/asm/microblaze_intc.h
+++ b/arch/microblaze/include/asm/microblaze_intc.h
@@ -41,3 +41,6 @@ struct irq_action {
void install_interrupt_handler (int irq, interrupt_handler_t * hdlr,
void *arg);
+
+int interrupts_init(void);
+
diff --git a/arch/microblaze/lib/board.c b/arch/microblaze/lib/board.c
index d3f2595..b80250a 100644
--- a/arch/microblaze/lib/board.c
+++ b/arch/microblaze/lib/board.c
@@ -33,15 +33,13 @@
#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
diff --git a/include/configs/microblaze-generic.h b/include/configs/microblaze-generic.h
index 9a0f9a1..56dcc02 100644
--- a/include/configs/microblaze-generic.h
+++ b/include/configs/microblaze-generic.h
@@ -102,7 +102,6 @@
/* 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