All of lore.kernel.org
 help / color / mirror / Atom feed
From: Simon Glass <sjg@chromium.org>
To: u-boot@lists.denx.de
Subject: [U-Boot] [PATCH 03/12] microblaze: intc: Clear interrupt code
Date: Mon, 9 Jul 2012 14:21:28 -0700	[thread overview]
Message-ID: <CAPnjgZ35OFpiVzaieZh8xRvTXWCB_7JSbFZOmR5T==u7XVzB0Q@mail.gmail.com> (raw)
In-Reply-To: <1341825639-23475-3-git-send-email-monstr@monstr.eu>

Hi Michal,

On Mon, Jul 9, 2012 at 2:20 AM, Michal Simek <monstr@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@monstr.eu>
>

I'm not really qualified to review this, but it seems reasonable.

Acked-by: Simon Glass <sjg@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

  reply	other threads:[~2012-07-09 21:21 UTC|newest]

Thread overview: 43+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2012-07-09  9:20 [U-Boot] [PATCH 01/12] microblaze: board: Remove compilation warning Michal Simek
2012-07-09  9:20 ` [U-Boot] [PATCH 02/12] microblaze: Remove extern from board.c Michal Simek
2012-07-09 21:10   ` Simon Glass
2012-07-10  8:24     ` Michal Simek
2012-07-09  9:20 ` [U-Boot] [PATCH 03/12] microblaze: intc: Clear interrupt code Michal Simek
2012-07-09 21:21   ` Simon Glass [this message]
2012-07-10  8:34     ` Michal Simek
2012-07-09  9:20 ` [U-Boot] [PATCH 04/12] microblaze: intc: Registering interrupt should return value Michal Simek
2012-07-09 21:22   ` Simon Glass
2012-07-10  8:52     ` Michal Simek
2012-07-09  9:20 ` [U-Boot] [PATCH 05/12] microblaze: intc: Coding style cleanup Michal Simek
2012-07-09 21:23   ` Simon Glass
2012-07-10  8:55     ` Michal Simek
2012-07-09  9:20 ` [U-Boot] [PATCH 06/12] microblaze: intc: Add device-tree driver configuration Michal Simek
2012-07-09 21:26   ` Simon Glass
2012-07-10  9:07     ` Michal Simek
2012-07-10 21:02       ` Simon Glass
2012-07-11  5:32         ` Michal Simek
2012-07-09  9:20 ` [U-Boot] [PATCH 07/12] microblaze: Move __udelay implementation Michal Simek
2012-07-09 21:28   ` Simon Glass
2012-07-10  8:25     ` Michal Simek
2012-07-09  9:20 ` [U-Boot] [PATCH 08/12] microblaze: timer: Prepare for device-tree initialization Michal Simek
2012-07-09 18:26   ` Stephan Linz
2012-07-10  8:11     ` Michal Simek
2012-07-09 19:06   ` Stephan Linz
2012-07-10  8:16     ` Michal Simek
2012-07-10 18:36       ` Stephan Linz
2012-07-11  6:07         ` Michal Simek
2012-07-09  9:20 ` [U-Boot] [PATCH 09/12] microblaze: timer: Add device-tree driver configuration Michal Simek
2012-07-09 18:25   ` Stephan Linz
2012-07-09 21:32   ` Simon Glass
2012-07-10  9:23     ` Michal Simek
2012-07-10  9:34     ` Michal Simek
2012-07-10 21:04       ` Simon Glass
2012-07-11  6:18         ` Michal Simek
2012-07-11  9:53           ` Simon Glass
2012-07-09  9:20 ` [U-Boot] [PATCH 10/12] microblaze: Call serial multi initialization Michal Simek
2012-07-09 21:32   ` Simon Glass
2012-07-10  8:27     ` Michal Simek
2012-07-09  9:20 ` [U-Boot] [PATCH 11/12] microblaze: Clean microblaze initialization Michal Simek
2012-07-09  9:20 ` [U-Boot] [PATCH 12/12] microblaze: board: Use bi_flashstart instead of CONFIG_SYS_FLASH_BASE Michal Simek
2012-07-09 21:08 ` [U-Boot] [PATCH 01/12] microblaze: board: Remove compilation warning Simon Glass
2012-07-10  8:17   ` Michal Simek

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to='CAPnjgZ35OFpiVzaieZh8xRvTXWCB_7JSbFZOmR5T==u7XVzB0Q@mail.gmail.com' \
    --to=sjg@chromium.org \
    --cc=u-boot@lists.denx.de \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.