[U-Boot] [PATCH 1/4] arm: unify interrupt init

all arm init the IRQ stack the same way so unify it in lib_arm/interrupts.c and then call arch specific interrupt init
Signed-off-by: Jean-Christophe PLAGNIOL-VILLARD plagnioj@jcrosoft.com --- cpu/arm1136/cpu.c | 11 ----------- cpu/arm720t/cpu.c | 7 ------- cpu/arm720t/interrupts.c | 2 +- cpu/arm920t/cpu.c | 11 ----------- cpu/arm925t/cpu.c | 11 ----------- cpu/arm926ejs/cpu.c | 11 ----------- cpu/arm946es/cpu.c | 11 ----------- cpu/arm_cortexa8/cpu.c | 12 ------------ cpu/arm_intcm/cpu.c | 11 ----------- cpu/ixp/cpu.c | 12 ------------ cpu/ixp/interrupts.c | 2 +- cpu/lh7a40x/cpu.c | 11 ----------- cpu/pxa/cpu.c | 11 ----------- cpu/sa1100/cpu.c | 7 ------- include/asm-arm/u-boot-arm.h | 1 + lib_arm/interrupts.c | 13 +++++++++++++ 16 files changed, 16 insertions(+), 128 deletions(-)
diff --git a/cpu/arm1136/cpu.c b/cpu/arm1136/cpu.c index e03a765..f467b7a 100644 --- a/cpu/arm1136/cpu.c +++ b/cpu/arm1136/cpu.c @@ -35,21 +35,10 @@ #include <command.h> #include <asm/system.h>
-#ifdef CONFIG_USE_IRQ -DECLARE_GLOBAL_DATA_PTR; -#endif - static void cache_flush(void);
int cpu_init (void) { - /* - * setup up stacks if necessary - */ -#ifdef CONFIG_USE_IRQ - IRQ_STACK_START = _armboot_start - CONFIG_SYS_MALLOC_LEN - CONFIG_SYS_GBL_DATA_SIZE - 4; - FIQ_STACK_START = IRQ_STACK_START - CONFIG_STACKSIZE_IRQ; -#endif return 0; }
diff --git a/cpu/arm720t/cpu.c b/cpu/arm720t/cpu.c index 6c40903..7a2b9c3 100644 --- a/cpu/arm720t/cpu.c +++ b/cpu/arm720t/cpu.c @@ -42,13 +42,6 @@ static void cache_flush(void);
int cpu_init (void) { - /* - * setup up stacks if necessary - */ -#ifdef CONFIG_USE_IRQ - IRQ_STACK_START = _armboot_start - CONFIG_SYS_MALLOC_LEN - CONFIG_SYS_GBL_DATA_SIZE - 4; - FIQ_STACK_START = IRQ_STACK_START - CONFIG_STACKSIZE_IRQ; -#endif return 0; }
diff --git a/cpu/arm720t/interrupts.c b/cpu/arm720t/interrupts.c index ff21314..91d552c 100644 --- a/cpu/arm720t/interrupts.c +++ b/cpu/arm720t/interrupts.c @@ -111,7 +111,7 @@ static ulong timestamp; static ulong lastdec;
#if defined(CONFIG_USE_IRQ) && defined(CONFIG_S3C4510B) -int interrupt_init (void) +int arch_interrupt_init (void) { int i;
diff --git a/cpu/arm920t/cpu.c b/cpu/arm920t/cpu.c index 87c1adc..8c4b57f 100644 --- a/cpu/arm920t/cpu.c +++ b/cpu/arm920t/cpu.c @@ -34,21 +34,10 @@ #include <arm920t.h> #include <asm/system.h>
-#ifdef CONFIG_USE_IRQ -DECLARE_GLOBAL_DATA_PTR; -#endif - static void cache_flush(void);
int cpu_init (void) { - /* - * setup up stacks if necessary - */ -#ifdef CONFIG_USE_IRQ - IRQ_STACK_START = _armboot_start - CONFIG_SYS_MALLOC_LEN - CONFIG_SYS_GBL_DATA_SIZE - 4; - FIQ_STACK_START = IRQ_STACK_START - CONFIG_STACKSIZE_IRQ; -#endif return 0; }
diff --git a/cpu/arm925t/cpu.c b/cpu/arm925t/cpu.c index cf6a489..c8edadf 100644 --- a/cpu/arm925t/cpu.c +++ b/cpu/arm925t/cpu.c @@ -34,21 +34,10 @@ #include <arm925t.h> #include <asm/system.h>
-#ifdef CONFIG_USE_IRQ -DECLARE_GLOBAL_DATA_PTR; -#endif - static void cache_flush(void);
int cpu_init (void) { - /* - * setup up stacks if necessary - */ -#ifdef CONFIG_USE_IRQ - IRQ_STACK_START = _armboot_start - CONFIG_SYS_MALLOC_LEN - CONFIG_SYS_GBL_DATA_SIZE - 4; - FIQ_STACK_START = IRQ_STACK_START - CONFIG_STACKSIZE_IRQ; -#endif return 0; }
diff --git a/cpu/arm926ejs/cpu.c b/cpu/arm926ejs/cpu.c index 6307e33..75b62d3 100644 --- a/cpu/arm926ejs/cpu.c +++ b/cpu/arm926ejs/cpu.c @@ -34,21 +34,10 @@ #include <arm926ejs.h> #include <asm/system.h>
-#ifdef CONFIG_USE_IRQ -DECLARE_GLOBAL_DATA_PTR; -#endif - static void cache_flush(void);
int cpu_init (void) { - /* - * setup up stacks if necessary - */ -#ifdef CONFIG_USE_IRQ - IRQ_STACK_START = _armboot_start - CONFIG_SYS_MALLOC_LEN - CONFIG_SYS_GBL_DATA_SIZE - 4; - FIQ_STACK_START = IRQ_STACK_START - CONFIG_STACKSIZE_IRQ; -#endif return 0; }
diff --git a/cpu/arm946es/cpu.c b/cpu/arm946es/cpu.c index ef7995d..620f7ed 100644 --- a/cpu/arm946es/cpu.c +++ b/cpu/arm946es/cpu.c @@ -34,21 +34,10 @@ #include <arm946es.h> #include <asm/system.h>
-#ifdef CONFIG_USE_IRQ -DECLARE_GLOBAL_DATA_PTR; -#endif - static void cache_flush(void);
int cpu_init (void) { - /* - * setup up stacks if necessary - */ -#ifdef CONFIG_USE_IRQ - IRQ_STACK_START = _armboot_start - CONFIG_SYS_MALLOC_LEN - CONFIG_SYS_GBL_DATA_SIZE - 4; - FIQ_STACK_START = IRQ_STACK_START - CONFIG_STACKSIZE_IRQ; -#endif return 0; }
diff --git a/cpu/arm_cortexa8/cpu.c b/cpu/arm_cortexa8/cpu.c index 3e1780b..e911206 100644 --- a/cpu/arm_cortexa8/cpu.c +++ b/cpu/arm_cortexa8/cpu.c @@ -36,10 +36,6 @@ #include <asm/arch/sys_proto.h> #include <asm/system.h>
-#ifdef CONFIG_USE_IRQ -DECLARE_GLOBAL_DATA_PTR; -#endif - #ifndef CONFIG_L2_OFF void l2cache_disable(void); #endif @@ -48,14 +44,6 @@ static void cache_flush(void);
int cpu_init(void) { - /* - * setup up stacks if necessary - */ -#ifdef CONFIG_USE_IRQ - IRQ_STACK_START = - _armboot_start - CONFIG_SYS_MALLOC_LEN - CONFIG_SYS_GBL_DATA_SIZE - 4; - FIQ_STACK_START = IRQ_STACK_START - CONFIG_STACKSIZE_IRQ; -#endif return 0; }
diff --git a/cpu/arm_intcm/cpu.c b/cpu/arm_intcm/cpu.c index 1636ffb..9ce17f2 100644 --- a/cpu/arm_intcm/cpu.c +++ b/cpu/arm_intcm/cpu.c @@ -33,19 +33,8 @@ #include <common.h> #include <command.h>
-#ifdef CONFIG_USE_IRQ -DECLARE_GLOBAL_DATA_PTR; -#endif - int cpu_init (void) { - /* - * setup up stacks if necessary - */ -#ifdef CONFIG_USE_IRQ - IRQ_STACK_START = _armboot_start - CONFIG_SYS_MALLOC_LEN - CONFIG_SYS_GBL_DATA_SIZE - 4; - FIQ_STACK_START = IRQ_STACK_START - CONFIG_STACKSIZE_IRQ; -#endif return 0; }
diff --git a/cpu/ixp/cpu.c b/cpu/ixp/cpu.c index 42c62f6..5cfc39d 100644 --- a/cpu/ixp/cpu.c +++ b/cpu/ixp/cpu.c @@ -38,10 +38,6 @@
ulong loops_per_jiffy;
-#ifdef CONFIG_USE_IRQ -DECLARE_GLOBAL_DATA_PTR; -#endif - static void cache_flush(void);
#if defined(CONFIG_DISPLAY_CPUINFO) @@ -81,14 +77,6 @@ int print_cpuinfo (void)
int cpu_init (void) { - /* - * setup up stacks if necessary - */ -#ifdef CONFIG_USE_IRQ - IRQ_STACK_START = _armboot_start - CONFIG_SYS_MALLOC_LEN - CONFIG_SYS_GBL_DATA_SIZE - 4; - FIQ_STACK_START = IRQ_STACK_START - CONFIG_STACKSIZE_IRQ; -#endif - return 0; }
diff --git a/cpu/ixp/interrupts.c b/cpu/ixp/interrupts.c index a05e439..06a826a 100644 --- a/cpu/ixp/interrupts.c +++ b/cpu/ixp/interrupts.c @@ -67,7 +67,7 @@ void irq_install_handler (int irq, interrupt_handler_t handle_irq, void *data) IRQ_HANDLER[irq].m_func = handle_irq; }
-int interrupt_init (void) +int arch_interrupt_init (void) { int i;
diff --git a/cpu/lh7a40x/cpu.c b/cpu/lh7a40x/cpu.c index 93ebd13..8e08773 100644 --- a/cpu/lh7a40x/cpu.c +++ b/cpu/lh7a40x/cpu.c @@ -34,21 +34,10 @@ #include <arm920t.h> #include <asm/system.h>
-#ifdef CONFIG_USE_IRQ -DECLARE_GLOBAL_DATA_PTR; -#endif - static void cache_flush(void);
int cpu_init (void) { - /* - * setup up stacks if necessary - */ -#ifdef CONFIG_USE_IRQ - IRQ_STACK_START = _armboot_start - CONFIG_SYS_MALLOC_LEN - CONFIG_SYS_GBL_DATA_SIZE - 4; - FIQ_STACK_START = IRQ_STACK_START - CONFIG_STACKSIZE_IRQ; -#endif return 0; }
diff --git a/cpu/pxa/cpu.c b/cpu/pxa/cpu.c index 3a1be57..8edb44e 100644 --- a/cpu/pxa/cpu.c +++ b/cpu/pxa/cpu.c @@ -35,21 +35,10 @@ #include <asm/arch/pxa-regs.h> #include <asm/system.h>
-#ifdef CONFIG_USE_IRQ -DECLARE_GLOBAL_DATA_PTR; -#endif - static void cache_flush(void);
int cpu_init (void) { - /* - * setup up stacks if necessary - */ -#ifdef CONFIG_USE_IRQ - IRQ_STACK_START = _armboot_start - CONFIG_SYS_MALLOC_LEN - CONFIG_SYS_GBL_DATA_SIZE - 4; - FIQ_STACK_START = IRQ_STACK_START - CONFIG_STACKSIZE_IRQ; -#endif return 0; }
diff --git a/cpu/sa1100/cpu.c b/cpu/sa1100/cpu.c index ed1a6f7..39285a0 100644 --- a/cpu/sa1100/cpu.c +++ b/cpu/sa1100/cpu.c @@ -42,13 +42,6 @@ static void cache_flush(void);
int cpu_init (void) { - /* - * setup up stacks if necessary - */ -#ifdef CONFIG_USE_IRQ - IRQ_STACK_START = _armboot_start - CONFIG_SYS_MALLOC_LEN - CONFIG_SYS_GBL_DATA_SIZE - 4; - FIQ_STACK_START = IRQ_STACK_START - CONFIG_STACKSIZE_IRQ; -#endif return 0; }
diff --git a/include/asm-arm/u-boot-arm.h b/include/asm-arm/u-boot-arm.h index 238d408..76f1ffa 100644 --- a/include/asm-arm/u-boot-arm.h +++ b/include/asm-arm/u-boot-arm.h @@ -58,6 +58,7 @@ void setup_revision_tag (struct tag **params); int setenv (char *, char *);
/* cpu/.../interrupt.c */ +int arch_interrupt_init (void); void reset_timer_masked (void); ulong get_timer_masked (void); void udelay_masked (unsigned long usec); diff --git a/lib_arm/interrupts.c b/lib_arm/interrupts.c index 4dafbfa..d26b724 100644 --- a/lib_arm/interrupts.c +++ b/lib_arm/interrupts.c @@ -39,6 +39,19 @@ #include <asm/proc-armv/ptrace.h>
#ifdef CONFIG_USE_IRQ +DECLARE_GLOBAL_DATA_PTR; + +int interrupt_init (void) +{ + /* + * setup up stacks if necessary + */ + IRQ_STACK_START = _armboot_start - CONFIG_SYS_MALLOC_LEN - CONFIG_SYS_GBL_DATA_SIZE - 4; + FIQ_STACK_START = IRQ_STACK_START - CONFIG_STACKSIZE_IRQ; + + return arch_interrupt_init(); +} + /* enable IRQ interrupts */ void enable_interrupts (void) {

move s3c44b0 to arch_cpu_init and as noone use cpu_init remove it
Signed-off-by: Jean-Christophe PLAGNIOL-VILLARD plagnioj@jcrosoft.com --- cpu/arm1136/cpu.c | 5 ----- cpu/arm1176/cpu.c | 5 ----- cpu/arm720t/cpu.c | 5 ----- cpu/arm920t/cpu.c | 5 ----- cpu/arm925t/cpu.c | 5 ----- cpu/arm926ejs/cpu.c | 5 ----- cpu/arm946es/cpu.c | 5 ----- cpu/arm_cortexa8/cpu.c | 5 ----- cpu/arm_intcm/cpu.c | 5 ----- cpu/ixp/cpu.c | 5 ----- cpu/lh7a40x/cpu.c | 5 ----- cpu/pxa/cpu.c | 5 ----- cpu/s3c44b0/cpu.c | 2 +- cpu/sa1100/cpu.c | 5 ----- include/configs/B2.h | 1 + lib_arm/board.c | 1 - 16 files changed, 2 insertions(+), 67 deletions(-)
diff --git a/cpu/arm1136/cpu.c b/cpu/arm1136/cpu.c index f467b7a..c2110c9 100644 --- a/cpu/arm1136/cpu.c +++ b/cpu/arm1136/cpu.c @@ -37,11 +37,6 @@
static void cache_flush(void);
-int cpu_init (void) -{ - return 0; -} - int cleanup_before_linux (void) { /* diff --git a/cpu/arm1176/cpu.c b/cpu/arm1176/cpu.c index bfa4378..bd1e4dd 100644 --- a/cpu/arm1176/cpu.c +++ b/cpu/arm1176/cpu.c @@ -38,11 +38,6 @@
static void cache_flush (void);
-int cpu_init (void) -{ - return 0; -} - int cleanup_before_linux (void) { /* diff --git a/cpu/arm720t/cpu.c b/cpu/arm720t/cpu.c index 7a2b9c3..88c71bf 100644 --- a/cpu/arm720t/cpu.c +++ b/cpu/arm720t/cpu.c @@ -40,11 +40,6 @@ static void cache_flush(void); #endif
-int cpu_init (void) -{ - return 0; -} - int cleanup_before_linux (void) { /* diff --git a/cpu/arm920t/cpu.c b/cpu/arm920t/cpu.c index 8c4b57f..5a3822b 100644 --- a/cpu/arm920t/cpu.c +++ b/cpu/arm920t/cpu.c @@ -36,11 +36,6 @@
static void cache_flush(void);
-int cpu_init (void) -{ - return 0; -} - int cleanup_before_linux (void) { /* diff --git a/cpu/arm925t/cpu.c b/cpu/arm925t/cpu.c index c8edadf..877d057 100644 --- a/cpu/arm925t/cpu.c +++ b/cpu/arm925t/cpu.c @@ -36,11 +36,6 @@
static void cache_flush(void);
-int cpu_init (void) -{ - return 0; -} - int cleanup_before_linux (void) { /* diff --git a/cpu/arm926ejs/cpu.c b/cpu/arm926ejs/cpu.c index 75b62d3..2670038 100644 --- a/cpu/arm926ejs/cpu.c +++ b/cpu/arm926ejs/cpu.c @@ -36,11 +36,6 @@
static void cache_flush(void);
-int cpu_init (void) -{ - return 0; -} - int cleanup_before_linux (void) { /* diff --git a/cpu/arm946es/cpu.c b/cpu/arm946es/cpu.c index 620f7ed..fcefa59 100644 --- a/cpu/arm946es/cpu.c +++ b/cpu/arm946es/cpu.c @@ -36,11 +36,6 @@
static void cache_flush(void);
-int cpu_init (void) -{ - return 0; -} - int cleanup_before_linux (void) { /* diff --git a/cpu/arm_cortexa8/cpu.c b/cpu/arm_cortexa8/cpu.c index e911206..9c2d5da 100644 --- a/cpu/arm_cortexa8/cpu.c +++ b/cpu/arm_cortexa8/cpu.c @@ -42,11 +42,6 @@ void l2cache_disable(void);
static void cache_flush(void);
-int cpu_init(void) -{ - return 0; -} - int cleanup_before_linux(void) { unsigned int i; diff --git a/cpu/arm_intcm/cpu.c b/cpu/arm_intcm/cpu.c index 9ce17f2..1310604 100644 --- a/cpu/arm_intcm/cpu.c +++ b/cpu/arm_intcm/cpu.c @@ -33,11 +33,6 @@ #include <common.h> #include <command.h>
-int cpu_init (void) -{ - return 0; -} - int cleanup_before_linux (void) { /* diff --git a/cpu/ixp/cpu.c b/cpu/ixp/cpu.c index 5cfc39d..ce275e5 100644 --- a/cpu/ixp/cpu.c +++ b/cpu/ixp/cpu.c @@ -75,11 +75,6 @@ int print_cpuinfo (void) } #endif /* CONFIG_DISPLAY_CPUINFO */
-int cpu_init (void) -{ - return 0; -} - int cleanup_before_linux (void) { /* diff --git a/cpu/lh7a40x/cpu.c b/cpu/lh7a40x/cpu.c index 8e08773..7af16b9 100644 --- a/cpu/lh7a40x/cpu.c +++ b/cpu/lh7a40x/cpu.c @@ -36,11 +36,6 @@
static void cache_flush(void);
-int cpu_init (void) -{ - return 0; -} - int cleanup_before_linux (void) { /* diff --git a/cpu/pxa/cpu.c b/cpu/pxa/cpu.c index 8edb44e..800d120 100644 --- a/cpu/pxa/cpu.c +++ b/cpu/pxa/cpu.c @@ -37,11 +37,6 @@
static void cache_flush(void);
-int cpu_init (void) -{ - return 0; -} - int cleanup_before_linux (void) { /* diff --git a/cpu/s3c44b0/cpu.c b/cpu/s3c44b0/cpu.c index 7ef4a1f..bca38f8 100644 --- a/cpu/s3c44b0/cpu.c +++ b/cpu/s3c44b0/cpu.c @@ -32,7 +32,7 @@ #include <command.h> #include <asm/hardware.h>
-int cpu_init (void) +int arch_cpu_init (void) { icache_enable();
diff --git a/cpu/sa1100/cpu.c b/cpu/sa1100/cpu.c index 39285a0..58e90dc 100644 --- a/cpu/sa1100/cpu.c +++ b/cpu/sa1100/cpu.c @@ -40,11 +40,6 @@ DECLARE_GLOBAL_DATA_PTR;
static void cache_flush(void);
-int cpu_init (void) -{ - return 0; -} - int cleanup_before_linux (void) { /* diff --git a/include/configs/B2.h b/include/configs/B2.h index 35fad5c..e5439f3 100644 --- a/include/configs/B2.h +++ b/include/configs/B2.h @@ -39,6 +39,7 @@ #define CONFIG_ARM_THUMB 1 /* this is an ARM7TDMI */ #undef CONFIG_ARM7_REVD /* disable ARM720 REV.D Workarounds */ #define CONFIG_SYS_NO_CP15_CACHE +#define CONFIG_ARCH_CPU_INIT
#define CONFIG_S3C44B0_CLOCK_SPEED 75 /* we have a 75Mhz S3C44B0*/
diff --git a/lib_arm/board.c b/lib_arm/board.c index a5fab9a..9fbb4bf 100644 --- a/lib_arm/board.c +++ b/lib_arm/board.c @@ -265,7 +265,6 @@ typedef int (init_fnc_t) (void); int print_cpuinfo (void);
init_fnc_t *init_sequence[] = { - cpu_init, /* basic cpu dependent setup */ #if defined(CONFIG_ARCH_CPU_INIT) arch_cpu_init, /* basic arch cpu dependent setup */ #endif

Signed-off-by: Jean-Christophe PLAGNIOL-VILLARD plagnioj@jcrosoft.com --- cpu/arm720t/Makefile | 4 +- cpu/arm720t/s3c4510b/Makefile | 1 + cpu/arm720t/s3c4510b/interrupts.c | 85 +++++++++++++++++++++++++++++++++ cpu/arm720t/{interrupts.c => timer.c} | 74 ++++------------------------- 4 files changed, 98 insertions(+), 66 deletions(-) create mode 100644 cpu/arm720t/s3c4510b/interrupts.c rename cpu/arm720t/{interrupts.c => timer.c} (78%)
diff --git a/cpu/arm720t/Makefile b/cpu/arm720t/Makefile index d5ac7d3..3e9b45a 100644 --- a/cpu/arm720t/Makefile +++ b/cpu/arm720t/Makefile @@ -26,7 +26,9 @@ include $(TOPDIR)/config.mk LIB = $(obj)lib$(CPU).a
START = start.o -COBJS = interrupts.o cpu.o + +COBJS += cpu.o +COBJS += timer.o
SRCS := $(START:.o=.S) $(SOBJS:.o=.S) $(COBJS:.o=.c) OBJS := $(addprefix $(obj),$(COBJS) $(SOBJS)) diff --git a/cpu/arm720t/s3c4510b/Makefile b/cpu/arm720t/s3c4510b/Makefile index c099036..91e27fd 100644 --- a/cpu/arm720t/s3c4510b/Makefile +++ b/cpu/arm720t/s3c4510b/Makefile @@ -26,6 +26,7 @@ include $(TOPDIR)/config.mk LIB = $(obj)lib$(SOC).a
COBJS-y += cache.o +COBJS-y += interrupts.o
SRCS := $(SOBJS:.o=.S) $(COBJS-y:.o=.c) OBJS := $(addprefix $(obj),$(SOBJS) $(COBJS-y)) diff --git a/cpu/arm720t/s3c4510b/interrupts.c b/cpu/arm720t/s3c4510b/interrupts.c new file mode 100644 index 0000000..f543569 --- /dev/null +++ b/cpu/arm720t/s3c4510b/interrupts.c @@ -0,0 +1,85 @@ +/* + * (C) Copyright 2002 + * Sysgo Real-Time Solutions, GmbH <www.elinos.com> + * Marius Groeger mgroeger@sysgo.de + * + * (C) Copyright 2002 + * Sysgo Real-Time Solutions, GmbH <www.elinos.com> + * Alex Zuepke azu@sysgo.de + * + * See file CREDITS for list of people who contributed to this + * project. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of + * the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + */ + +#include <common.h> +#include <clps7111.h> +#include <asm/proc-armv/ptrace.h> +#include <asm/hardware.h> + +# ifndef CONFIG_USE_IRQ +# error CONFIG_USE_IRQ _must_ be defined when using CONFIG_S3C4510B +# endif + +static struct _irq_handler IRQ_HANDLER[N_IRQS]; + +void do_irq (struct pt_regs *pt_regs) +{ + unsigned int pending; + + while ( (pending = GET_REG( REG_INTOFFSET)) != 0x54) { /* sentinal value for no pending interrutps */ + IRQ_HANDLER[pending>>2].m_func( IRQ_HANDLER[pending>>2].m_data); + + /* clear pending interrupt */ + PUT_REG( REG_INTPEND, (1<<(pending>>2))); + } +} + +static void default_isr( void *data) { + printf ("default_isr(): called for IRQ %d\n", (int)data); +} + +void irq_install_handler (int irq, interrupt_handler_t handle_irq, void *data) +{ + if (irq >= N_IRQS || !handle_irq) + return; + + IRQ_HANDLER[irq].m_data = data; + IRQ_HANDLER[irq].m_func = handle_irq; +} + +int arch_interrupt_init (void) +{ + int i; + + /* install default interrupt handlers */ + for (i = 0; i < N_IRQS; i++) + irq_install_handler(i, default_isr, (void *)i); + + /* configure interrupts for IRQ mode */ + PUT_REG( REG_INTMODE, 0x0); + /* clear any pending interrupts */ + PUT_REG( REG_INTPEND, 0x1FFFFF); + + /* + * Enable global interrupt + * Enable timer0 interrupt + */ + CLR_REG( REG_INTMASK, ((1<<INT_GLOBAL) | (1<<INT_TIMER0))); + + return 0; +} diff --git a/cpu/arm720t/interrupts.c b/cpu/arm720t/timer.c similarity index 78% rename from cpu/arm720t/interrupts.c rename to cpu/arm720t/timer.c index 91d552c..98588af 100644 --- a/cpu/arm720t/interrupts.c +++ b/cpu/arm720t/timer.c @@ -50,47 +50,22 @@ #define READ_TIMER (TM2STAT & NETARM_GEN_TSTAT_CTC_MASK) #endif
-#ifdef CONFIG_S3C4510B -/* require interrupts for the S3C4510B */ -# ifndef CONFIG_USE_IRQ -# error CONFIG_USE_IRQ _must_ be defined when using CONFIG_S3C4510B -# else -static struct _irq_handler IRQ_HANDLER[N_IRQS]; -# endif -#endif /* CONFIG_S3C4510B */ - -#ifdef CONFIG_USE_IRQ +#if defined(CONFIG_USE_IRQ) && defined(CONFIG_LPC2292) void do_irq (struct pt_regs *pt_regs) { -#if defined(CONFIG_S3C4510B) - unsigned int pending; - - while ( (pending = GET_REG( REG_INTOFFSET)) != 0x54) { /* sentinal value for no pending interrutps */ - IRQ_HANDLER[pending>>2].m_func( IRQ_HANDLER[pending>>2].m_data); - - /* clear pending interrupt */ - PUT_REG( REG_INTPEND, (1<<(pending>>2))); - } -#elif defined(CONFIG_INTEGRATOR) && defined(CONFIG_ARCH_INTEGRATOR) - /* No do_irq() for IntegratorAP/CM720T as yet */ -#elif defined(CONFIG_LPC2292) - void (*pfnct)(void);
pfnct = (void (*)(void))VICVectAddr;
(*pfnct)(); -#else -#error do_irq() not defined for this CPU type -#endif } #endif
-#ifdef CONFIG_S3C4510B -static void default_isr( void *data) { - printf ("default_isr(): called for IRQ %d\n", (int)data); -} +#if defined(CONFIG_INTEGRATOR) && defined(CONFIG_ARCH_INTEGRATOR) + /* Use IntegratorAP routines in board/integratorap.c */ +#else
+#if defined(CONFIG_S3C4510B) static void timer_isr( void *data) { unsigned int *pTime = (unsigned int *)data;
@@ -103,39 +78,9 @@ static void timer_isr( void *data) { } #endif
-#if defined(CONFIG_INTEGRATOR) && defined(CONFIG_ARCH_INTEGRATOR) - /* Use IntegratorAP routines in board/integratorap.c */ -#else - static ulong timestamp; static ulong lastdec;
-#if defined(CONFIG_USE_IRQ) && defined(CONFIG_S3C4510B) -int arch_interrupt_init (void) -{ - int i; - - /* install default interrupt handlers */ - for ( i = 0; i < N_IRQS; i++) { - IRQ_HANDLER[i].m_data = (void *)i; - IRQ_HANDLER[i].m_func = default_isr; - } - - /* configure interrupts for IRQ mode */ - PUT_REG( REG_INTMODE, 0x0); - /* clear any pending interrupts */ - PUT_REG( REG_INTPEND, 0x1FFFFF); - - lastdec = 0; - - /* install interrupt handler for timer */ - IRQ_HANDLER[INT_TIMER0].m_data = (void *)×tamp; - IRQ_HANDLER[INT_TIMER0].m_func = timer_isr; - - return 0; -} -#endif - int timer_init (void) { #if defined(CONFIG_NETARM) @@ -176,11 +121,10 @@ int timer_init (void) */ PUT_REG( REG_TDATA0, (CONFIG_SYS_SYS_CLK_FREQ / CONFIG_SYS_HZ));
- /* - * Enable global interrupt - * Enable timer0 interrupt - */ - CLR_REG( REG_INTMASK, ((1<<INT_GLOBAL) | (1<<INT_TIMER0))); + /* install interrupt data handler for timer */ + irq_install_handler(INT_TIMER0, timer_isr, (void *)×tamp); + + lastdec = 0;
/* Start timer */ SET_REG( REG_TMOD, TM0_RUN);

Signed-off-by: Jean-Christophe PLAGNIOL-VILLARD plagnioj@jcrosoft.com --- cpu/arm720t/lpc2292/Makefile | 15 +++++++++---- cpu/arm720t/lpc2292/interrupts.c | 41 ++++++++++++++++++++++++++++++++++++++ cpu/arm720t/timer.c | 12 ----------- 3 files changed, 51 insertions(+), 17 deletions(-) create mode 100644 cpu/arm720t/lpc2292/interrupts.c
diff --git a/cpu/arm720t/lpc2292/Makefile b/cpu/arm720t/lpc2292/Makefile index 240f1e3..296f53f 100644 --- a/cpu/arm720t/lpc2292/Makefile +++ b/cpu/arm720t/lpc2292/Makefile @@ -25,16 +25,21 @@ include $(TOPDIR)/config.mk
LIB = $(obj)lib$(SOC).a
-COBJS = flash.o mmc.o mmc_hw.o spi.o SOBJS = $(obj)iap_entry.o
-SRCS := $(COBJS:.o=.c) -OBJS := $(addprefix $(obj),$(COBJS)) +COBJS-y += flash.o +COBJS-$(CONFIG_USE_IRQ) += interrupts.o +COBJS-y += mmc.o +COBJS-y += mmc_hw.o spi.o +COBJS-y += spi.o + +SRCS := $(COBJS-y:.o=.c) +COBJS := $(addprefix $(obj),$(COBJS-y))
all: $(obj).depend $(LIB)
-$(LIB): $(OBJS) $(SOBJS) - $(AR) $(ARFLAGS) $@ $(OBJS) $(SOBJS) +$(LIB): $(COBJS) $(SOBJS) + $(AR) $(ARFLAGS) $@ $(COBJS) $(SOBJS)
# this MUST be compiled as thumb code! $(SOBJS): diff --git a/cpu/arm720t/lpc2292/interrupts.c b/cpu/arm720t/lpc2292/interrupts.c new file mode 100644 index 0000000..4183f77 --- /dev/null +++ b/cpu/arm720t/lpc2292/interrupts.c @@ -0,0 +1,41 @@ +/* + * (C) Copyright 2002 + * Sysgo Real-Time Solutions, GmbH <www.elinos.com> + * Marius Groeger mgroeger@sysgo.de + * + * (C) Copyright 2002 + * Sysgo Real-Time Solutions, GmbH <www.elinos.com> + * Alex Zuepke azu@sysgo.de + * + * See file CREDITS for list of people who contributed to this + * project. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of + * the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + */ + +#include <common.h> +#include <clps7111.h> +#include <asm/proc-armv/ptrace.h> +#include <asm/hardware.h> + +void do_irq (struct pt_regs *pt_regs) +{ + void (*pfnct)(void); + + pfnct = (void (*)(void))VICVectAddr; + + (*pfnct)(); +} diff --git a/cpu/arm720t/timer.c b/cpu/arm720t/timer.c index 98588af..5352c79 100644 --- a/cpu/arm720t/timer.c +++ b/cpu/arm720t/timer.c @@ -28,7 +28,6 @@
#include <common.h> #include <clps7111.h> -#include <asm/proc-armv/ptrace.h> #include <asm/hardware.h>
#ifndef CONFIG_NETARM @@ -50,17 +49,6 @@ #define READ_TIMER (TM2STAT & NETARM_GEN_TSTAT_CTC_MASK) #endif
-#if defined(CONFIG_USE_IRQ) && defined(CONFIG_LPC2292) -void do_irq (struct pt_regs *pt_regs) -{ - void (*pfnct)(void); - - pfnct = (void (*)(void))VICVectAddr; - - (*pfnct)(); -} -#endif - #if defined(CONFIG_INTEGRATOR) && defined(CONFIG_ARCH_INTEGRATOR) /* Use IntegratorAP routines in board/integratorap.c */ #else
participants (1)
-
Jean-Christophe PLAGNIOL-VILLARD