aboutsummaryrefslogtreecommitdiffstats
path: root/arch
diff options
context:
space:
mode:
authorGreg Ungerer <gerg@uclinux.org>2009-04-28 22:07:13 -0400
committerGreg Ungerer <gerg@uclinux.org>2009-09-15 19:43:42 -0400
commit277c5e3e26cac45010f57a581c56476639b2cfa0 (patch)
treefbc4465582bba19a2045eb72c870cde044a5f558 /arch
parent1f946533bb562f5144752ea583cac45e9410fdaa (diff)
m68knommu: general interrupt controller for ColdFire 532x parts
The ColdFire 532x family of parts uses 2 of the same INTC interrupt controlers used in the ColdFire 520x family. So modify the code to support both parts. The extra code for the second INTC controler in the case of the 520x is easily optimized away to nothing. Signed-off-by: Greg Ungerer <gerg@uclinux.org>
Diffstat (limited to 'arch')
-rw-r--r--arch/m68k/include/asm/m520xsim.h15
-rw-r--r--arch/m68k/include/asm/m532xsim.h18
-rw-r--r--arch/m68knommu/kernel/irq.c3
-rw-r--r--arch/m68knommu/platform/coldfire/Makefile2
-rw-r--r--arch/m68knommu/platform/coldfire/intc-simr.c24
5 files changed, 44 insertions, 18 deletions
diff --git a/arch/m68k/include/asm/m520xsim.h b/arch/m68k/include/asm/m520xsim.h
index e79b9bc76a12..91de39c8d865 100644
--- a/arch/m68k/include/asm/m520xsim.h
+++ b/arch/m68k/include/asm/m520xsim.h
@@ -11,9 +11,8 @@
11#define m520xsim_h 11#define m520xsim_h
12/****************************************************************************/ 12/****************************************************************************/
13 13
14
15/* 14/*
16 * Define the 5282 SIM register set addresses. 15 * Define the 520x SIM register set addresses.
17 */ 16 */
18#define MCFICM_INTC0 0x48000 /* Base for Interrupt Ctrl 0 */ 17#define MCFICM_INTC0 0x48000 /* Base for Interrupt Ctrl 0 */
19#define MCFINTC_IPRH 0x00 /* Interrupt pending 32-63 */ 18#define MCFINTC_IPRH 0x00 /* Interrupt pending 32-63 */
@@ -26,6 +25,18 @@
26#define MCFINTC_CIMR 0x1d /* Clear interrupt mask 0-63 */ 25#define MCFINTC_CIMR 0x1d /* Clear interrupt mask 0-63 */
27#define MCFINTC_ICR0 0x40 /* Base ICR register */ 26#define MCFINTC_ICR0 0x40 /* Base ICR register */
28 27
28/*
29 * The common interrupt controller code just wants to know the absolute
30 * address to the SIMR and CIMR registers (not offsets into IPSBAR).
31 * The 520x family only has a single INTC unit.
32 */
33#define MCFINTC0_SIMR (MCF_IPSBAR + MCFICM_INTC0 + MCFINTC_SIMR)
34#define MCFINTC0_CIMR (MCF_IPSBAR + MCFICM_INTC0 + MCFINTC_CIMR)
35#define MCFINTC0_ICR0 (MCF_IPSBAR + MCFICM_INTC0 + MCFINTC_ICR0)
36#define MCFINTC1_SIMR (0)
37#define MCFINTC1_CIMR (0)
38#define MCFINTC1_ICR0 (0)
39
29#define MCFINT_VECBASE 64 40#define MCFINT_VECBASE 64
30#define MCFINT_UART0 26 /* Interrupt number for UART0 */ 41#define MCFINT_UART0 26 /* Interrupt number for UART0 */
31#define MCFINT_UART1 27 /* Interrupt number for UART1 */ 42#define MCFINT_UART1 27 /* Interrupt number for UART1 */
diff --git a/arch/m68k/include/asm/m532xsim.h b/arch/m68k/include/asm/m532xsim.h
index 3e80810b3784..41c57e0f445a 100644
--- a/arch/m68k/include/asm/m532xsim.h
+++ b/arch/m68k/include/asm/m532xsim.h
@@ -58,10 +58,12 @@
58 58
59#define MCFSIM_IMR_MASKALL 0xFFFFFFFF /* All SIM intr sources */ 59#define MCFSIM_IMR_MASKALL 0xFFFFFFFF /* All SIM intr sources */
60 60
61#define MCFSIM_IMR_SIMR0 0xFC04801C 61#define MCFINTC0_SIMR 0xFC04801C
62#define MCFSIM_IMR_SIMR1 0xFC04C01C 62#define MCFINTC0_CIMR 0xFC04801D
63#define MCFSIM_IMR_CIMR0 0xFC04801D 63#define MCFINTC0_ICR0 0xFC048040
64#define MCFSIM_IMR_CIMR1 0xFC04C01D 64#define MCFINTC1_SIMR 0xFC04C01C
65#define MCFINTC1_CIMR 0xFC04C01D
66#define MCFINTC1_ICR0 0xFC04C040
65 67
66#define MCFSIM_ICR_TIMER1 (0xFC048040+32) 68#define MCFSIM_ICR_TIMER1 (0xFC048040+32)
67#define MCFSIM_ICR_TIMER2 (0xFC048040+33) 69#define MCFSIM_ICR_TIMER2 (0xFC048040+33)
@@ -87,16 +89,16 @@
87 89
88 90
89#define mcf_enable_irq0(irq) \ 91#define mcf_enable_irq0(irq) \
90 *((volatile unsigned char*) (MCFSIM_IMR_CIMR0)) = (irq); 92 *((volatile unsigned char *) (MCFINTC0_CIMR)) = (irq);
91 93
92#define mcf_enable_irq1(irq) \ 94#define mcf_enable_irq1(irq) \
93 *((volatile unsigned char*) (MCFSIM_IMR_CIMR1)) = (irq); 95 *((volatile unsigned char *) (MCFINTC1_CIMR)) = (irq);
94 96
95#define mcf_disable_irq0(irq) \ 97#define mcf_disable_irq0(irq) \
96 *((volatile unsigned char*) (MCFSIM_IMR_SIMR0)) = (irq); 98 *((volatile unsigned char *) (MCFINTC0_SIMR)) = (irq);
97 99
98#define mcf_disable_irq1(irq) \ 100#define mcf_disable_irq1(irq) \
99 *((volatile unsigned char*) (MCFSIM_IMR_SIMR1)) = (irq); 101 *((volatile unsigned char *) (MCFINTC1_SIMR)) = (irq);
100 102
101/* 103/*
102 * Define the Cache register flags. 104 * Define the Cache register flags.
diff --git a/arch/m68knommu/kernel/irq.c b/arch/m68knommu/kernel/irq.c
index f9965d7ee7c5..93d567bbf33d 100644
--- a/arch/m68knommu/kernel/irq.c
+++ b/arch/m68knommu/kernel/irq.c
@@ -30,7 +30,8 @@ asmlinkage void do_IRQ(int irq, struct pt_regs *regs)
30} 30}
31 31
32#if !defined(CONFIG_M520x) && !defined(CONFIG_M523x) && \ 32#if !defined(CONFIG_M520x) && !defined(CONFIG_M523x) && \
33 !defined(CONFIG_M527x) && !defined(CONFIG_M528x) 33 !defined(CONFIG_M527x) && !defined(CONFIG_M528x) && \
34 !defined(CONFIG_M532x)
34 35
35static struct irq_chip m_irq_chip = { 36static struct irq_chip m_irq_chip = {
36 .name = "M68K-INTC", 37 .name = "M68K-INTC",
diff --git a/arch/m68knommu/platform/coldfire/Makefile b/arch/m68knommu/platform/coldfire/Makefile
index bce9a62d3a13..6c5f699cf145 100644
--- a/arch/m68knommu/platform/coldfire/Makefile
+++ b/arch/m68knommu/platform/coldfire/Makefile
@@ -24,7 +24,7 @@ obj-$(CONFIG_M527x) += pit.o intc-2.o
24obj-$(CONFIG_M5272) += timers.o 24obj-$(CONFIG_M5272) += timers.o
25obj-$(CONFIG_M528x) += pit.o intc-2.o 25obj-$(CONFIG_M528x) += pit.o intc-2.o
26obj-$(CONFIG_M5307) += timers.o 26obj-$(CONFIG_M5307) += timers.o
27obj-$(CONFIG_M532x) += timers.o 27obj-$(CONFIG_M532x) += timers.o intc-simr.o
28obj-$(CONFIG_M5407) += timers.o 28obj-$(CONFIG_M5407) += timers.o
29 29
30obj-y += pinmux.o gpio.o 30obj-y += pinmux.o gpio.o
diff --git a/arch/m68knommu/platform/coldfire/intc-simr.c b/arch/m68knommu/platform/coldfire/intc-simr.c
index 3b614a3508fc..86fc2047d7ac 100644
--- a/arch/m68knommu/platform/coldfire/intc-simr.c
+++ b/arch/m68knommu/platform/coldfire/intc-simr.c
@@ -20,20 +20,32 @@
20 20
21static void intc_irq_mask(unsigned int irq) 21static void intc_irq_mask(unsigned int irq)
22{ 22{
23 if ((irq >= MCFINT_VECBASE) && (irq <= MCFINT_VECBASE + 63)) 23 if (irq >= MCFINT_VECBASE) {
24 __raw_writeb(irq - MCFINT_VECBASE, MCF_IPSBAR + MCFICM_INTC0 + MCFINTC_SIMR); 24 if (irq < MCFINT_VECBASE + 64)
25 __raw_writeb(irq - MCFINT_VECBASE, MCFINTC0_SIMR);
26 else if ((irq < MCFINT_VECBASE + 128) && MCFINTC1_SIMR)
27 __raw_writeb(irq - MCFINT_VECBASE - 64, MCFINTC1_SIMR);
28 }
25} 29}
26 30
27static void intc_irq_unmask(unsigned int irq) 31static void intc_irq_unmask(unsigned int irq)
28{ 32{
29 if ((irq >= MCFINT_VECBASE) && (irq <= MCFINT_VECBASE + 63)) 33 if (irq >= MCFINT_VECBASE) {
30 __raw_writeb(irq - MCFINT_VECBASE, MCF_IPSBAR + MCFICM_INTC0 + MCFINTC_CIMR); 34 if (irq < MCFINT_VECBASE + 64)
35 __raw_writeb(irq - MCFINT_VECBASE, MCFINTC0_CIMR);
36 else if ((irq < MCFINT_VECBASE + 128) && MCFINTC1_CIMR)
37 __raw_writeb(irq - MCFINT_VECBASE - 64, MCFINTC1_CIMR);
38 }
31} 39}
32 40
33static int intc_irq_set_type(unsigned int irq, unsigned int type) 41static int intc_irq_set_type(unsigned int irq, unsigned int type)
34{ 42{
35 if ((irq >= MCFINT_VECBASE) && (irq <= MCFINT_VECBASE + 63)) 43 if (irq >= MCFINT_VECBASE) {
36 __raw_writeb(5, MCF_IPSBAR + MCFICM_INTC0 + MCFINTC_ICR0 + irq - MCFINT_VECBASE); 44 if (irq < MCFINT_VECBASE + 64)
45 __raw_writeb(5, MCFINTC0_ICR0 + irq - MCFINT_VECBASE);
46 else if ((irq < MCFINT_VECBASE) && MCFINTC1_ICR0)
47 __raw_writeb(5, MCFINTC1_ICR0 + irq - MCFINT_VECBASE - 64);
48 }
37 return 0; 49 return 0;
38} 50}
39 51