提交 575a3d21 编写于 作者: M Michal Simek

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: NMichal Simek <monstr@monstr.eu>
Acked-by: NSimon Glass <sjg@chromium.org>
上级 e0bb305d
......@@ -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
......@@ -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
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册