[U-Boot] [PATCH 03/12] microblaze: intc: Clear interrupt code
Simon Glass
sjg at chromium.org
Mon Jul 9 23:21:28 CEST 2012
Hi Michal,
On Mon, Jul 9, 2012 at 2:20 AM, Michal Simek <monstr at monstr.eu> wrote:
> 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 at monstr.eu>
>
I'm not really qualified to review this, but it seems reasonable.
Acked-by: Simon Glass <sjg at chromium.org>
> ---
> arch/microblaze/cpu/interrupts.c | 88
> ++++++++++++++-----------
> arch/microblaze/cpu/start.S | 2 -
> arch/microblaze/cpu/timer.c | 2 -
> arch/microblaze/include/asm/microblaze_intc.h | 3 +
> arch/microblaze/lib/board.c | 6 +--
> include/configs/microblaze-generic.h | 1 -
> 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);
>
This is fine, since I assume it is called after memalloc_init(), but you
could set an arbitrary maximum limit if you prefer.
> + 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 1952804..ae4ffe0 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
> microblaze_timer_t *tmr = (microblaze_timer_t *)
> (CONFIG_SYS_TIMER_0_ADDR);
>
> @@ -61,7 +60,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 1cf895b..8cf4266 100644
> --- a/arch/microblaze/lib/board.c
> +++ b/arch/microblaze/lib/board.c
> @@ -32,6 +32,7 @@
> #include <stdio_dev.h>
> #include <net.h>
> #include <asm/processor.h>
> +#include <asm/microblaze_intc.h>
> #include <fdtdec.h>
>
> DECLARE_GLOBAL_DATA_PTR;
> @@ -39,9 +40,6 @@ 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
> @@ -73,9 +71,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 e20eb08..44934eb 100644
> --- a/include/configs/microblaze-generic.h
> +++ b/include/configs/microblaze-generic.h
> @@ -97,7 +97,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
> --
> 1.7.0.4
>
> Regards,
Simon
More information about the U-Boot
mailing list