diff options
| -rw-r--r-- | arch/microblaze/cpu/interrupts.c | 86 | ||||
| -rw-r--r-- | arch/microblaze/cpu/start.S | 2 | ||||
| -rw-r--r-- | arch/microblaze/cpu/timer.c | 2 | ||||
| -rw-r--r-- | arch/microblaze/include/asm/microblaze_intc.h | 3 | ||||
| -rw-r--r-- | arch/microblaze/lib/board.c | 6 | ||||
| -rw-r--r-- | include/configs/microblaze-generic.h | 1 | 
6 files changed, 53 insertions, 47 deletions
| diff --git a/arch/microblaze/cpu/interrupts.c b/arch/microblaze/cpu/interrupts.c index e7ca859bf..ee6708218 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"); +	if (irq_no) { +		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); +		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 9077f742c..8a2f634a9 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 fdcd9e3bc..cc6b897fb 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 4c385aa24..6142b9c99 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 d3f259535..b80250a6b 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 9a0f9a180..56dcc02c9 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 |