diff options
| author | Magnus Damm <damm@opensource.se> | 2010-12-28 08:27:01 +0000 | 
|---|---|---|
| committer | Paul Mundt <lethal@linux-sh.org> | 2011-01-07 10:42:50 +0900 | 
| commit | 863b171952dba1a3ce9d345cfe4e93c9fdd42f49 (patch) | |
| tree | 8181acaff12a0040ca6e86cfec380f54e4a2fd51 | |
| parent | 60f1435c3bab8b88712a4f96806e5ac9396aa49c (diff) | |
ARM: mach-shmobile: Run-time IRQ handler for INTCA
Break-out INTC specific IRQ demux code from the file
entry-macro-intc.S and register during run-time.
Covers sh7367, sh7377 and sh7372.
Signed-off-by: Magnus Damm <damm@opensource.se>
Signed-off-by: Paul Mundt <lethal@linux-sh.org>
| -rw-r--r-- | arch/arm/mach-shmobile/Makefile | 5 | ||||
| -rw-r--r-- | arch/arm/mach-shmobile/board-ap4evb.c | 1 | ||||
| -rw-r--r-- | arch/arm/mach-shmobile/board-g3evm.c | 1 | ||||
| -rw-r--r-- | arch/arm/mach-shmobile/board-g4evm.c | 1 | ||||
| -rw-r--r-- | arch/arm/mach-shmobile/board-mackerel.c | 1 | ||||
| -rw-r--r-- | arch/arm/mach-shmobile/entry-intc.S | 57 | ||||
| -rw-r--r-- | arch/arm/mach-shmobile/include/mach/common.h | 1 | 
7 files changed, 67 insertions, 0 deletions
| diff --git a/arch/arm/mach-shmobile/Makefile b/arch/arm/mach-shmobile/Makefile index ab100e4bddd6..e385ef03d5bd 100644 --- a/arch/arm/mach-shmobile/Makefile +++ b/arch/arm/mach-shmobile/Makefile @@ -18,6 +18,11 @@ pfc-$(CONFIG_ARCH_SH7377)	+= pfc-sh7377.o  pfc-$(CONFIG_ARCH_SH7372)	+= pfc-sh7372.o  pfc-$(CONFIG_ARCH_SH73A0)	+= pfc-sh73a0.o +# IRQ objects +obj-$(CONFIG_ARCH_SH7367)	+= entry-intc.o +obj-$(CONFIG_ARCH_SH7377)	+= entry-intc.o +obj-$(CONFIG_ARCH_SH7372)	+= entry-intc.o +  # Board objects  obj-$(CONFIG_MACH_G3EVM)	+= board-g3evm.o  obj-$(CONFIG_MACH_G4EVM)	+= board-g4evm.o diff --git a/arch/arm/mach-shmobile/board-ap4evb.c b/arch/arm/mach-shmobile/board-ap4evb.c index 86edc772f82a..cd79d7c1ba0d 100644 --- a/arch/arm/mach-shmobile/board-ap4evb.c +++ b/arch/arm/mach-shmobile/board-ap4evb.c @@ -1361,6 +1361,7 @@ static struct sys_timer ap4evb_timer = {  MACHINE_START(AP4EVB, "ap4evb")  	.map_io		= ap4evb_map_io,  	.init_irq	= sh7372_init_irq, +	.handle_irq	= shmobile_handle_irq_intc,  	.init_machine	= ap4evb_init,  	.timer		= &ap4evb_timer,  MACHINE_END diff --git a/arch/arm/mach-shmobile/board-g3evm.c b/arch/arm/mach-shmobile/board-g3evm.c index 3b83d6320bec..686b304a7708 100644 --- a/arch/arm/mach-shmobile/board-g3evm.c +++ b/arch/arm/mach-shmobile/board-g3evm.c @@ -367,6 +367,7 @@ static struct sys_timer g3evm_timer = {  MACHINE_START(G3EVM, "g3evm")  	.map_io		= g3evm_map_io,  	.init_irq	= sh7367_init_irq, +	.handle_irq	= shmobile_handle_irq_intc,  	.init_machine	= g3evm_init,  	.timer		= &g3evm_timer,  MACHINE_END diff --git a/arch/arm/mach-shmobile/board-g4evm.c b/arch/arm/mach-shmobile/board-g4evm.c index 5b3b582ef3f2..c13f01280b7e 100644 --- a/arch/arm/mach-shmobile/board-g4evm.c +++ b/arch/arm/mach-shmobile/board-g4evm.c @@ -394,6 +394,7 @@ static struct sys_timer g4evm_timer = {  MACHINE_START(G4EVM, "g4evm")  	.map_io		= g4evm_map_io,  	.init_irq	= sh7377_init_irq, +	.handle_irq	= shmobile_handle_irq_intc,  	.init_machine	= g4evm_init,  	.timer		= &g4evm_timer,  MACHINE_END diff --git a/arch/arm/mach-shmobile/board-mackerel.c b/arch/arm/mach-shmobile/board-mackerel.c index 6a5ce9a0dcf3..5bcf5c1e1399 100644 --- a/arch/arm/mach-shmobile/board-mackerel.c +++ b/arch/arm/mach-shmobile/board-mackerel.c @@ -1194,6 +1194,7 @@ static struct sys_timer mackerel_timer = {  MACHINE_START(MACKEREL, "mackerel")  	.map_io		= mackerel_map_io,  	.init_irq	= sh7372_init_irq, +	.handle_irq	= shmobile_handle_irq_intc,  	.init_machine	= mackerel_init,  	.timer		= &mackerel_timer,  MACHINE_END diff --git a/arch/arm/mach-shmobile/entry-intc.S b/arch/arm/mach-shmobile/entry-intc.S new file mode 100644 index 000000000000..cac0a7ae2084 --- /dev/null +++ b/arch/arm/mach-shmobile/entry-intc.S @@ -0,0 +1,57 @@ +/* + * ARM Interrupt demux handler using INTC + * + * Copyright (C) 2010 Magnus Damm + * Copyright (C) 2008 Renesas Solutions Corp. + * + * This file is licensed under  the terms of the GNU General Public + * License version 2. This program is licensed "as is" without any + * warranty of any kind, whether express or implied. + */ + +#include <asm/entry-macro-multi.S> + +#define INTCA_BASE	0xe6980000 +#define INTFLGA_OFFS	0x00000018 /* accept pending interrupt */ +#define INTEVTA_OFFS	0x00000020 /* vector number of accepted interrupt */ +#define INTLVLA_OFFS	0x00000030 /* priority level of accepted interrupt */ +#define INTLVLB_OFFS	0x00000034 /* previous priority level */ + +	.macro  get_irqnr_preamble, base, tmp +	ldr     \base, =INTCA_BASE +	.endm + +	.macro  get_irqnr_and_base, irqnr, irqstat, base, tmp +	/* The single INTFLGA read access below results in the following: +	 * +	 * 1. INTLVLB is updated with old priority value from INTLVLA +	 * 2. Highest priority interrupt is accepted +	 * 3. INTLVLA is updated to contain priority of accepted interrupt +	 * 4. Accepted interrupt vector is stored in INTFLGA and INTEVTA +	 */ +	ldr     \irqnr, [\base, #INTFLGA_OFFS] + +	/* Restore INTLVLA with the value saved in INTLVLB. +	 * This is required to support interrupt priorities properly. +	 */ +	ldrb	\tmp, [\base, #INTLVLB_OFFS] +	strb    \tmp, [\base, #INTLVLA_OFFS] + +	/* Handle invalid vector number case */ +	cmp	\irqnr, #0 +	beq	1000f + +	/* Convert vector to irq number, same as the evt2irq() macro */ +	lsr	\irqnr, \irqnr, #0x5 +	subs	\irqnr, \irqnr, #16 + +1000: +	.endm + +	.macro  test_for_ipi, irqnr, irqstat, base, tmp +	.endm + +	.macro  test_for_ltirq, irqnr, irqstat, base, tmp +	.endm + +	arch_irq_handler shmobile_handle_irq_intc diff --git a/arch/arm/mach-shmobile/include/mach/common.h b/arch/arm/mach-shmobile/include/mach/common.h index 49ac8ebdc184..ab75183bfd76 100644 --- a/arch/arm/mach-shmobile/include/mach/common.h +++ b/arch/arm/mach-shmobile/include/mach/common.h @@ -5,6 +5,7 @@ extern struct sys_timer shmobile_timer;  extern void shmobile_setup_console(void);  struct clk;  extern int clk_init(void); +extern void shmobile_handle_irq_intc(struct pt_regs *);  extern void sh7367_init_irq(void);  extern void sh7367_add_early_devices(void); | 
