diff options
author | Mark A. Greer <mgreer@mvista.com> | 2009-04-15 15:41:40 -0400 |
---|---|---|
committer | Kevin Hilman <khilman@deeprootsystems.com> | 2009-05-28 18:17:47 -0400 |
commit | 0b0c4c2a6974eae7b96066cb0da35b526fe58468 (patch) | |
tree | b5b037b86d3a08a220b6c31a67fe0005e1fa3a60 /arch/arm/mach-davinci | |
parent | b14dc0f9942a9c318c6c49f29511d88b3642e2d0 (diff) |
davinci: Integrate cp_intc support into low-level irq code
Integrate the Common Platform Interrupt Controller (cp_intc)
support into the low-level irq handling for davinci and similar
platforms. Do it such that support for cp_intc and the original
aintc can coexist in the same kernel binary.
Signed-off-by: Mark A. Greer <mgreer@mvista.com>
Signed-off-by: Kevin Hilman <khilman@deeprootsystems.com>
Diffstat (limited to 'arch/arm/mach-davinci')
-rw-r--r-- | arch/arm/mach-davinci/Kconfig | 6 | ||||
-rw-r--r-- | arch/arm/mach-davinci/Makefile | 6 | ||||
-rw-r--r-- | arch/arm/mach-davinci/common.c | 2 | ||||
-rw-r--r-- | arch/arm/mach-davinci/include/mach/common.h | 1 | ||||
-rw-r--r-- | arch/arm/mach-davinci/include/mach/entry-macro.S | 19 |
5 files changed, 32 insertions, 2 deletions
diff --git a/arch/arm/mach-davinci/Kconfig b/arch/arm/mach-davinci/Kconfig index d7614a0ab2f4..76408670554d 100644 --- a/arch/arm/mach-davinci/Kconfig +++ b/arch/arm/mach-davinci/Kconfig | |||
@@ -1,5 +1,8 @@ | |||
1 | if ARCH_DAVINCI | 1 | if ARCH_DAVINCI |
2 | 2 | ||
3 | config AINTC | ||
4 | bool | ||
5 | |||
3 | config CP_INTC | 6 | config CP_INTC |
4 | bool | 7 | bool |
5 | 8 | ||
@@ -9,12 +12,15 @@ comment "DaVinci Core Type" | |||
9 | 12 | ||
10 | config ARCH_DAVINCI_DM644x | 13 | config ARCH_DAVINCI_DM644x |
11 | bool "DaVinci 644x based system" | 14 | bool "DaVinci 644x based system" |
15 | select AINTC | ||
12 | 16 | ||
13 | config ARCH_DAVINCI_DM355 | 17 | config ARCH_DAVINCI_DM355 |
14 | bool "DaVinci 355 based system" | 18 | bool "DaVinci 355 based system" |
19 | select AINTC | ||
15 | 20 | ||
16 | config ARCH_DAVINCI_DM646x | 21 | config ARCH_DAVINCI_DM646x |
17 | bool "DaVinci 646x based system" | 22 | bool "DaVinci 646x based system" |
23 | select AINTC | ||
18 | 24 | ||
19 | comment "DaVinci Board Type" | 25 | comment "DaVinci Board Type" |
20 | 26 | ||
diff --git a/arch/arm/mach-davinci/Makefile b/arch/arm/mach-davinci/Makefile index a65d03bb4679..5b62d8a4b180 100644 --- a/arch/arm/mach-davinci/Makefile +++ b/arch/arm/mach-davinci/Makefile | |||
@@ -4,17 +4,19 @@ | |||
4 | # | 4 | # |
5 | 5 | ||
6 | # Common objects | 6 | # Common objects |
7 | obj-y := time.o irq.o clock.o serial.o io.o psc.o \ | 7 | obj-y := time.o clock.o serial.o io.o psc.o \ |
8 | gpio.o devices.o dma.o usb.o common.o | 8 | gpio.o devices.o dma.o usb.o common.o |
9 | 9 | ||
10 | obj-$(CONFIG_DAVINCI_MUX) += mux.o | 10 | obj-$(CONFIG_DAVINCI_MUX) += mux.o |
11 | obj-$(CONFIG_CP_INTC) += cp_intc.o | ||
12 | 11 | ||
13 | # Chip specific | 12 | # Chip specific |
14 | obj-$(CONFIG_ARCH_DAVINCI_DM644x) += dm644x.o | 13 | obj-$(CONFIG_ARCH_DAVINCI_DM644x) += dm644x.o |
15 | obj-$(CONFIG_ARCH_DAVINCI_DM355) += dm355.o | 14 | obj-$(CONFIG_ARCH_DAVINCI_DM355) += dm355.o |
16 | obj-$(CONFIG_ARCH_DAVINCI_DM646x) += dm646x.o | 15 | obj-$(CONFIG_ARCH_DAVINCI_DM646x) += dm646x.o |
17 | 16 | ||
17 | obj-$(CONFIG_AINTC) += irq.o | ||
18 | obj-$(CONFIG_CP_INTC) += cp_intc.o | ||
19 | |||
18 | # Board specific | 20 | # Board specific |
19 | obj-$(CONFIG_MACH_DAVINCI_EVM) += board-dm644x-evm.o | 21 | obj-$(CONFIG_MACH_DAVINCI_EVM) += board-dm644x-evm.o |
20 | obj-$(CONFIG_MACH_SFFSDR) += board-sffsdr.o | 22 | obj-$(CONFIG_MACH_SFFSDR) += board-sffsdr.o |
diff --git a/arch/arm/mach-davinci/common.c b/arch/arm/mach-davinci/common.c index 169ec73f8d76..61ede19c6b54 100644 --- a/arch/arm/mach-davinci/common.c +++ b/arch/arm/mach-davinci/common.c | |||
@@ -25,6 +25,7 @@ struct davinci_soc_info davinci_soc_info; | |||
25 | EXPORT_SYMBOL(davinci_soc_info); | 25 | EXPORT_SYMBOL(davinci_soc_info); |
26 | 26 | ||
27 | void __iomem *davinci_intc_base; | 27 | void __iomem *davinci_intc_base; |
28 | int davinci_intc_type; | ||
28 | 29 | ||
29 | void davinci_get_mac_addr(struct memory_accessor *mem_acc, void *context) | 30 | void davinci_get_mac_addr(struct memory_accessor *mem_acc, void *context) |
30 | { | 31 | { |
@@ -99,6 +100,7 @@ void __init davinci_common_init(struct davinci_soc_info *soc_info) | |||
99 | } | 100 | } |
100 | 101 | ||
101 | davinci_intc_base = davinci_soc_info.intc_base; | 102 | davinci_intc_base = davinci_soc_info.intc_base; |
103 | davinci_intc_type = davinci_soc_info.intc_type; | ||
102 | return; | 104 | return; |
103 | 105 | ||
104 | err: | 106 | err: |
diff --git a/arch/arm/mach-davinci/include/mach/common.h b/arch/arm/mach-davinci/include/mach/common.h index b773d92e7379..22db67744875 100644 --- a/arch/arm/mach-davinci/include/mach/common.h +++ b/arch/arm/mach-davinci/include/mach/common.h | |||
@@ -18,6 +18,7 @@ extern struct sys_timer davinci_timer; | |||
18 | 18 | ||
19 | extern void davinci_irq_init(void); | 19 | extern void davinci_irq_init(void); |
20 | extern void __iomem *davinci_intc_base; | 20 | extern void __iomem *davinci_intc_base; |
21 | extern int davinci_intc_type; | ||
21 | 22 | ||
22 | /* parameters describe VBUS sourcing for host mode */ | 23 | /* parameters describe VBUS sourcing for host mode */ |
23 | extern void setup_usb(unsigned mA, unsigned potpgt_msec); | 24 | extern void setup_usb(unsigned mA, unsigned potpgt_msec); |
diff --git a/arch/arm/mach-davinci/include/mach/entry-macro.S b/arch/arm/mach-davinci/include/mach/entry-macro.S index ed78851fe4ae..fbdebc7cb409 100644 --- a/arch/arm/mach-davinci/include/mach/entry-macro.S +++ b/arch/arm/mach-davinci/include/mach/entry-macro.S | |||
@@ -23,9 +23,28 @@ | |||
23 | .endm | 23 | .endm |
24 | 24 | ||
25 | .macro get_irqnr_and_base, irqnr, irqstat, base, tmp | 25 | .macro get_irqnr_and_base, irqnr, irqstat, base, tmp |
26 | #if defined(CONFIG_AINTC) && defined(CONFIG_CP_INTC) | ||
27 | ldr \tmp, =davinci_intc_type | ||
28 | ldr \tmp, [\tmp] | ||
29 | cmp \tmp, #DAVINCI_INTC_TYPE_CP_INTC | ||
30 | beq 1001f | ||
31 | #endif | ||
32 | #if defined(CONFIG_AINTC) | ||
26 | ldr \tmp, [\base, #0x14] | 33 | ldr \tmp, [\base, #0x14] |
27 | movs \tmp, \tmp, lsr #2 | 34 | movs \tmp, \tmp, lsr #2 |
28 | sub \irqnr, \tmp, #1 | 35 | sub \irqnr, \tmp, #1 |
36 | b 1002f | ||
37 | #endif | ||
38 | #if defined(CONFIG_CP_INTC) | ||
39 | 1001: ldr \irqnr, [\base, #0x80] /* get irq number */ | ||
40 | and \irqnr, \irqnr, #0xff /* irq is in bits 0-9 */ | ||
41 | mov \tmp, \irqnr, lsr #3 | ||
42 | and \tmp, \tmp, #0xfc | ||
43 | add \tmp, \tmp, #0x280 /* get the register offset */ | ||
44 | ldr \irqstat, [\base, \tmp] /* get the intc status */ | ||
45 | cmp \irqstat, #0x0 | ||
46 | #endif | ||
47 | 1002: | ||
29 | .endm | 48 | .endm |
30 | 49 | ||
31 | .macro irq_prio_table | 50 | .macro irq_prio_table |