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>
This commit is contained in:
parent
e0bb305df8
commit
575a3d21f6
@ -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
|
||||
|
@ -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 */
|
||||
|
@ -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).
|
||||
|
@ -41,3 +41,6 @@ struct irq_action {
|
||||
|
||||
void install_interrupt_handler (int irq, interrupt_handler_t * hdlr,
|
||||
void *arg);
|
||||
|
||||
int interrupts_init(void);
|
||||
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user