aboutsummaryrefslogtreecommitdiffstats
path: root/arch/m68knommu
diff options
context:
space:
mode:
authorGreg Ungerer <gerg@uclinux.org>2009-05-19 00:38:08 -0400
committerGreg Ungerer <gerg@uclinux.org>2009-09-15 19:43:50 -0400
commitf2154bef817ac3d0ea67b52526fd8e88898b66f9 (patch)
tree3ffa5cf5c3ec82a59f75728a580bd9332a32ebee /arch/m68knommu
parent5187995f0a9253e915dfee83684eae7b692213e6 (diff)
m68knommu: merge old ColdFire interrupt controller masking macros
Currently the code that supports setting the old style ColdFire interrupt controller mask registers is macros in the include files of each of the CPU types. Merge all these into a set of real masking functions in the old Coldfire interrupt controller code proper. All the macros are basically the same (excepting a register size difference on really early parts). Signed-off-by: Greg Ungerer <gerg@uclinux.org>
Diffstat (limited to 'arch/m68knommu')
-rw-r--r--arch/m68knommu/platform/5206/config.c11
-rw-r--r--arch/m68knommu/platform/5206e/config.c12
-rw-r--r--arch/m68knommu/platform/5249/config.c11
-rw-r--r--arch/m68knommu/platform/5307/config.c12
-rw-r--r--arch/m68knommu/platform/5407/config.c12
-rw-r--r--arch/m68knommu/platform/coldfire/intc.c59
6 files changed, 83 insertions, 34 deletions
diff --git a/arch/m68knommu/platform/5206/config.c b/arch/m68knommu/platform/5206/config.c
index 481617a23d09..0dce2383320d 100644
--- a/arch/m68knommu/platform/5206/config.c
+++ b/arch/m68knommu/platform/5206/config.c
@@ -49,11 +49,11 @@ static void __init m5206_uart_init_line(int line, int irq)
49 if (line == 0) { 49 if (line == 0) {
50 writel(MCFSIM_ICR_LEVEL6 | MCFSIM_ICR_PRI1, MCF_MBAR + MCFSIM_UART1ICR); 50 writel(MCFSIM_ICR_LEVEL6 | MCFSIM_ICR_PRI1, MCF_MBAR + MCFSIM_UART1ICR);
51 writeb(irq, MCFUART_BASE1 + MCFUART_UIVR); 51 writeb(irq, MCFUART_BASE1 + MCFUART_UIVR);
52 mcf_setimr(mcf_getimr() & ~MCFSIM_IMR_UART1); 52 mcf_clrimr(MCFINTC_UART0);
53 } else if (line == 1) { 53 } else if (line == 1) {
54 writel(MCFSIM_ICR_LEVEL6 | MCFSIM_ICR_PRI2, MCF_MBAR + MCFSIM_UART2ICR); 54 writel(MCFSIM_ICR_LEVEL6 | MCFSIM_ICR_PRI2, MCF_MBAR + MCFSIM_UART2ICR);
55 writeb(irq, MCFUART_BASE2 + MCFUART_UIVR); 55 writeb(irq, MCFUART_BASE2 + MCFUART_UIVR);
56 mcf_setimr(mcf_getimr() & ~MCFSIM_IMR_UART2); 56 mcf_clrimr(MCFINTC_UART1);
57 } 57 }
58} 58}
59 59
@@ -75,13 +75,13 @@ void mcf_settimericr(unsigned int timer, unsigned int level)
75 75
76 if (timer <= 2) { 76 if (timer <= 2) {
77 switch (timer) { 77 switch (timer) {
78 case 2: icr = MCFSIM_TIMER2ICR; imr = MCFSIM_IMR_TIMER2; break; 78 case 2: icr = MCFSIM_TIMER2ICR; imr = MCFINTC_TIMER2; break;
79 default: icr = MCFSIM_TIMER1ICR; imr = MCFSIM_IMR_TIMER1; break; 79 default: icr = MCFSIM_TIMER1ICR; imr = MCFINTC_TIMER1; break;
80 } 80 }
81 81
82 icrp = (volatile unsigned char *) (MCF_MBAR + icr); 82 icrp = (volatile unsigned char *) (MCF_MBAR + icr);
83 *icrp = MCFSIM_ICR_AUTOVEC | (level << 2) | MCFSIM_ICR_PRI3; 83 *icrp = MCFSIM_ICR_AUTOVEC | (level << 2) | MCFSIM_ICR_PRI3;
84 mcf_setimr(mcf_getimr() & ~imr); 84 mcf_clrimr(imr);
85 } 85 }
86} 86}
87 87
@@ -100,7 +100,6 @@ void m5206_cpu_reset(void)
100 100
101void __init config_BSP(char *commandp, int size) 101void __init config_BSP(char *commandp, int size)
102{ 102{
103 mcf_setimr(MCFSIM_IMR_MASKALL);
104 mach_reset = m5206_cpu_reset; 103 mach_reset = m5206_cpu_reset;
105} 104}
106 105
diff --git a/arch/m68knommu/platform/5206e/config.c b/arch/m68knommu/platform/5206e/config.c
index 29e565a44431..08ef7e268989 100644
--- a/arch/m68knommu/platform/5206e/config.c
+++ b/arch/m68knommu/platform/5206e/config.c
@@ -50,11 +50,11 @@ static void __init m5206e_uart_init_line(int line, int irq)
50 if (line == 0) { 50 if (line == 0) {
51 writel(MCFSIM_ICR_LEVEL6 | MCFSIM_ICR_PRI1, MCF_MBAR + MCFSIM_UART1ICR); 51 writel(MCFSIM_ICR_LEVEL6 | MCFSIM_ICR_PRI1, MCF_MBAR + MCFSIM_UART1ICR);
52 writeb(irq, MCFUART_BASE1 + MCFUART_UIVR); 52 writeb(irq, MCFUART_BASE1 + MCFUART_UIVR);
53 mcf_setimr(mcf_getimr() & ~MCFSIM_IMR_UART1); 53 mcf_clrimr(MCFINTC_UART0);
54 } else if (line == 1) { 54 } else if (line == 1) {
55 writel(MCFSIM_ICR_LEVEL6 | MCFSIM_ICR_PRI2, MCF_MBAR + MCFSIM_UART2ICR); 55 writel(MCFSIM_ICR_LEVEL6 | MCFSIM_ICR_PRI2, MCF_MBAR + MCFSIM_UART2ICR);
56 writeb(irq, MCFUART_BASE2 + MCFUART_UIVR); 56 writeb(irq, MCFUART_BASE2 + MCFUART_UIVR);
57 mcf_setimr(mcf_getimr() & ~MCFSIM_IMR_UART2); 57 mcf_clrimr(MCFINTC_UART1);
58 } 58 }
59} 59}
60 60
@@ -76,13 +76,13 @@ void mcf_settimericr(unsigned int timer, unsigned int level)
76 76
77 if (timer <= 2) { 77 if (timer <= 2) {
78 switch (timer) { 78 switch (timer) {
79 case 2: icr = MCFSIM_TIMER2ICR; imr = MCFSIM_IMR_TIMER2; break; 79 case 2: icr = MCFSIM_TIMER2ICR; imr = MCFINTC_TIMER2; break;
80 default: icr = MCFSIM_TIMER1ICR; imr = MCFSIM_IMR_TIMER1; break; 80 default: icr = MCFSIM_TIMER1ICR; imr = MCFINTC_TIMER1; break;
81 } 81 }
82 82
83 icrp = (volatile unsigned char *) (MCF_MBAR + icr); 83 icrp = (volatile unsigned char *) (MCF_MBAR + icr);
84 *icrp = MCFSIM_ICR_AUTOVEC | (level << 2) | MCFSIM_ICR_PRI3; 84 *icrp = MCFSIM_ICR_AUTOVEC | (level << 2) | MCFSIM_ICR_PRI3;
85 mcf_setimr(mcf_getimr() & ~imr); 85 mcf_clrimr(imr);
86 } 86 }
87} 87}
88 88
@@ -101,8 +101,6 @@ void m5206e_cpu_reset(void)
101 101
102void __init config_BSP(char *commandp, int size) 102void __init config_BSP(char *commandp, int size)
103{ 103{
104 mcf_setimr(MCFSIM_IMR_MASKALL);
105
106#if defined(CONFIG_NETtel) 104#if defined(CONFIG_NETtel)
107 /* Copy command line from FLASH to local buffer... */ 105 /* Copy command line from FLASH to local buffer... */
108 memcpy(commandp, (char *) 0xf0004000, size); 106 memcpy(commandp, (char *) 0xf0004000, size);
diff --git a/arch/m68knommu/platform/5249/config.c b/arch/m68knommu/platform/5249/config.c
index 365fb6c52700..7261a3d28adc 100644
--- a/arch/m68knommu/platform/5249/config.c
+++ b/arch/m68knommu/platform/5249/config.c
@@ -48,11 +48,11 @@ static void __init m5249_uart_init_line(int line, int irq)
48 if (line == 0) { 48 if (line == 0) {
49 writeb(MCFSIM_ICR_LEVEL6 | MCFSIM_ICR_PRI1, MCF_MBAR + MCFSIM_UART1ICR); 49 writeb(MCFSIM_ICR_LEVEL6 | MCFSIM_ICR_PRI1, MCF_MBAR + MCFSIM_UART1ICR);
50 writeb(irq, MCF_MBAR + MCFUART_BASE1 + MCFUART_UIVR); 50 writeb(irq, MCF_MBAR + MCFUART_BASE1 + MCFUART_UIVR);
51 mcf_setimr(mcf_getimr() & ~MCFSIM_IMR_UART1); 51 mcf_clrimr(MCFINTC_UART0);
52 } else if (line == 1) { 52 } else if (line == 1) {
53 writeb(MCFSIM_ICR_LEVEL6 | MCFSIM_ICR_PRI2, MCF_MBAR + MCFSIM_UART2ICR); 53 writeb(MCFSIM_ICR_LEVEL6 | MCFSIM_ICR_PRI2, MCF_MBAR + MCFSIM_UART2ICR);
54 writeb(irq, MCF_MBAR + MCFUART_BASE2 + MCFUART_UIVR); 54 writeb(irq, MCF_MBAR + MCFUART_BASE2 + MCFUART_UIVR);
55 mcf_setimr(mcf_getimr() & ~MCFSIM_IMR_UART2); 55 mcf_clrimr(MCFINTC_UART1);
56 } 56 }
57} 57}
58 58
@@ -75,13 +75,13 @@ void mcf_settimericr(unsigned int timer, unsigned int level)
75 75
76 if (timer <= 2) { 76 if (timer <= 2) {
77 switch (timer) { 77 switch (timer) {
78 case 2: icr = MCFSIM_TIMER2ICR; imr = MCFSIM_IMR_TIMER2; break; 78 case 2: icr = MCFSIM_TIMER2ICR; imr = MCFINTC_TIMER2; break;
79 default: icr = MCFSIM_TIMER1ICR; imr = MCFSIM_IMR_TIMER1; break; 79 default: icr = MCFSIM_TIMER1ICR; imr = MCFINTC_TIMER1; break;
80 } 80 }
81 81
82 icrp = (volatile unsigned char *) (MCF_MBAR + icr); 82 icrp = (volatile unsigned char *) (MCF_MBAR + icr);
83 *icrp = MCFSIM_ICR_AUTOVEC | (level << 2) | MCFSIM_ICR_PRI3; 83 *icrp = MCFSIM_ICR_AUTOVEC | (level << 2) | MCFSIM_ICR_PRI3;
84 mcf_setimr(mcf_getimr() & ~imr); 84 mcf_clrimr(imr);
85 } 85 }
86} 86}
87 87
@@ -100,7 +100,6 @@ void m5249_cpu_reset(void)
100 100
101void __init config_BSP(char *commandp, int size) 101void __init config_BSP(char *commandp, int size)
102{ 102{
103 mcf_setimr(MCFSIM_IMR_MASKALL);
104 mach_reset = m5249_cpu_reset; 103 mach_reset = m5249_cpu_reset;
105} 104}
106 105
diff --git a/arch/m68knommu/platform/5307/config.c b/arch/m68knommu/platform/5307/config.c
index 60fe45d51391..3e27d2ec03f0 100644
--- a/arch/m68knommu/platform/5307/config.c
+++ b/arch/m68knommu/platform/5307/config.c
@@ -64,11 +64,11 @@ static void __init m5307_uart_init_line(int line, int irq)
64 if (line == 0) { 64 if (line == 0) {
65 writeb(MCFSIM_ICR_LEVEL6 | MCFSIM_ICR_PRI1, MCF_MBAR + MCFSIM_UART1ICR); 65 writeb(MCFSIM_ICR_LEVEL6 | MCFSIM_ICR_PRI1, MCF_MBAR + MCFSIM_UART1ICR);
66 writeb(irq, MCF_MBAR + MCFUART_BASE1 + MCFUART_UIVR); 66 writeb(irq, MCF_MBAR + MCFUART_BASE1 + MCFUART_UIVR);
67 mcf_setimr(mcf_getimr() & ~MCFSIM_IMR_UART1); 67 mcf_clrimr(MCFINTC_UART0);
68 } else if (line == 1) { 68 } else if (line == 1) {
69 writeb(MCFSIM_ICR_LEVEL6 | MCFSIM_ICR_PRI2, MCF_MBAR + MCFSIM_UART2ICR); 69 writeb(MCFSIM_ICR_LEVEL6 | MCFSIM_ICR_PRI2, MCF_MBAR + MCFSIM_UART2ICR);
70 writeb(irq, MCF_MBAR + MCFUART_BASE2 + MCFUART_UIVR); 70 writeb(irq, MCF_MBAR + MCFUART_BASE2 + MCFUART_UIVR);
71 mcf_setimr(mcf_getimr() & ~MCFSIM_IMR_UART2); 71 mcf_clrimr(MCFINTC_UART1);
72 } 72 }
73} 73}
74 74
@@ -90,13 +90,13 @@ void mcf_settimericr(unsigned int timer, unsigned int level)
90 90
91 if (timer <= 2) { 91 if (timer <= 2) {
92 switch (timer) { 92 switch (timer) {
93 case 2: icr = MCFSIM_TIMER2ICR; imr = MCFSIM_IMR_TIMER2; break; 93 case 2: icr = MCFSIM_TIMER2ICR; imr = MCFINTC_TIMER2; break;
94 default: icr = MCFSIM_TIMER1ICR; imr = MCFSIM_IMR_TIMER1; break; 94 default: icr = MCFSIM_TIMER1ICR; imr = MCFINTC_TIMER1; break;
95 } 95 }
96 96
97 icrp = (volatile unsigned char *) (MCF_MBAR + icr); 97 icrp = (volatile unsigned char *) (MCF_MBAR + icr);
98 *icrp = MCFSIM_ICR_AUTOVEC | (level << 2) | MCFSIM_ICR_PRI3; 98 *icrp = MCFSIM_ICR_AUTOVEC | (level << 2) | MCFSIM_ICR_PRI3;
99 mcf_setimr(mcf_getimr() & ~imr); 99 mcf_clrimr(imr);
100 } 100 }
101} 101}
102 102
@@ -115,8 +115,6 @@ void m5307_cpu_reset(void)
115 115
116void __init config_BSP(char *commandp, int size) 116void __init config_BSP(char *commandp, int size)
117{ 117{
118 mcf_setimr(MCFSIM_IMR_MASKALL);
119
120#if defined(CONFIG_NETtel) || \ 118#if defined(CONFIG_NETtel) || \
121 defined(CONFIG_SECUREEDGEMP3) || defined(CONFIG_CLEOPATRA) 119 defined(CONFIG_SECUREEDGEMP3) || defined(CONFIG_CLEOPATRA)
122 /* Copy command line from FLASH to local buffer... */ 120 /* Copy command line from FLASH to local buffer... */
diff --git a/arch/m68knommu/platform/5407/config.c b/arch/m68knommu/platform/5407/config.c
index 1e8ef74ea156..8aa94837bbc3 100644
--- a/arch/m68knommu/platform/5407/config.c
+++ b/arch/m68knommu/platform/5407/config.c
@@ -55,11 +55,11 @@ static void __init m5407_uart_init_line(int line, int irq)
55 if (line == 0) { 55 if (line == 0) {
56 writeb(MCFSIM_ICR_LEVEL6 | MCFSIM_ICR_PRI1, MCF_MBAR + MCFSIM_UART1ICR); 56 writeb(MCFSIM_ICR_LEVEL6 | MCFSIM_ICR_PRI1, MCF_MBAR + MCFSIM_UART1ICR);
57 writeb(irq, MCF_MBAR + MCFUART_BASE1 + MCFUART_UIVR); 57 writeb(irq, MCF_MBAR + MCFUART_BASE1 + MCFUART_UIVR);
58 mcf_setimr(mcf_getimr() & ~MCFSIM_IMR_UART1); 58 mcf_clrimr(MCFINTC_UART0);
59 } else if (line == 1) { 59 } else if (line == 1) {
60 writeb(MCFSIM_ICR_LEVEL6 | MCFSIM_ICR_PRI2, MCF_MBAR + MCFSIM_UART2ICR); 60 writeb(MCFSIM_ICR_LEVEL6 | MCFSIM_ICR_PRI2, MCF_MBAR + MCFSIM_UART2ICR);
61 writeb(irq, MCF_MBAR + MCFUART_BASE2 + MCFUART_UIVR); 61 writeb(irq, MCF_MBAR + MCFUART_BASE2 + MCFUART_UIVR);
62 mcf_setimr(mcf_getimr() & ~MCFSIM_IMR_UART2); 62 mcf_clrimr(MCFINTC_UART1);
63 } 63 }
64} 64}
65 65
@@ -81,13 +81,13 @@ void mcf_settimericr(unsigned int timer, unsigned int level)
81 81
82 if (timer <= 2) { 82 if (timer <= 2) {
83 switch (timer) { 83 switch (timer) {
84 case 2: icr = MCFSIM_TIMER2ICR; imr = MCFSIM_IMR_TIMER2; break; 84 case 2: icr = MCFSIM_TIMER2ICR; imr = MCFINTC_TIMER2; break;
85 default: icr = MCFSIM_TIMER1ICR; imr = MCFSIM_IMR_TIMER1; break; 85 default: icr = MCFSIM_TIMER1ICR; imr = MCFINTC_TIMER1; break;
86 } 86 }
87 87
88 icrp = (volatile unsigned char *) (MCF_MBAR + icr); 88 icrp = (volatile unsigned char *) (MCF_MBAR + icr);
89 *icrp = MCFSIM_ICR_AUTOVEC | (level << 2) | MCFSIM_ICR_PRI3; 89 *icrp = MCFSIM_ICR_AUTOVEC | (level << 2) | MCFSIM_ICR_PRI3;
90 mcf_setimr(mcf_getimr() & ~imr); 90 mcf_clrimr(imr);
91 } 91 }
92} 92}
93 93
@@ -106,8 +106,6 @@ void m5407_cpu_reset(void)
106 106
107void __init config_BSP(char *commandp, int size) 107void __init config_BSP(char *commandp, int size)
108{ 108{
109 mcf_setimr(MCFSIM_IMR_MASKALL);
110
111#if defined(CONFIG_CLEOPATRA) 109#if defined(CONFIG_CLEOPATRA)
112 /* Different timer setup - to prevent device clash */ 110 /* Different timer setup - to prevent device clash */
113 mcf_timervector = 30; 111 mcf_timervector = 30;
diff --git a/arch/m68knommu/platform/coldfire/intc.c b/arch/m68knommu/platform/coldfire/intc.c
index f7a61346ee25..88bffac50c67 100644
--- a/arch/m68knommu/platform/coldfire/intc.c
+++ b/arch/m68knommu/platform/coldfire/intc.c
@@ -1,5 +1,5 @@
1/* 1/*
2 * intc.c 2 * intc.c -- support for the old ColdFire interrupt controller
3 * 3 *
4 * (C) Copyright 2009, Greg Ungerer <gerg@snapgear.com> 4 * (C) Copyright 2009, Greg Ungerer <gerg@snapgear.com>
5 * 5 *
@@ -27,6 +27,62 @@
27#define EIRQ7 31 27#define EIRQ7 31
28 28
29/* 29/*
30 * In the early version 2 core ColdFire parts the IMR register was 16 bits
31 * in size. Version 3 (and later version 2) core parts have a 32 bit
32 * sized IMR register. Provide some size independant methods to access the
33 * IMR register.
34 */
35#ifdef MCFSIM_IMR_IS_16BITS
36
37void mcf_setimr(int index)
38{
39 u16 imr;
40 imr = __raw_readw(MCF_MBAR + MCFSIM_IMR);
41 __raw_writew(imr | (0x1 << index), MCF_MBAR + MCFSIM_IMR);
42}
43
44void mcf_clrimr(int index)
45{
46 u16 imr;
47 imr = __raw_readw(MCF_MBAR + MCFSIM_IMR);
48 __raw_writew(imr & ~(0x1 << index), MCF_MBAR + MCFSIM_IMR);
49}
50
51void mcf_maskimr(unsigned int mask)
52{
53 u16 imr;
54 imr = __raw_readw(MCF_MBAR + MCFSIM_IMR);
55 imr |= mask;
56 __raw_writew(imr, MCF_MBAR + MCFSIM_IMR);
57}
58
59#else
60
61void mcf_setimr(int index)
62{
63 u32 imr;
64 imr = __raw_readl(MCF_MBAR + MCFSIM_IMR);
65 __raw_writel(imr | (0x1 << index), MCF_MBAR + MCFSIM_IMR);
66}
67
68void mcf_clrimr(int index)
69{
70 u32 imr;
71 imr = __raw_readl(MCF_MBAR + MCFSIM_IMR);
72 __raw_writel(imr & ~(0x1 << index), MCF_MBAR + MCFSIM_IMR);
73}
74
75void mcf_maskimr(unsigned int mask)
76{
77 u32 imr;
78 imr = __raw_readl(MCF_MBAR + MCFSIM_IMR);
79 imr |= mask;
80 __raw_writel(imr, MCF_MBAR + MCFSIM_IMR);
81}
82
83#endif
84
85/*
30 * Interrupts can be "vectored" on the ColdFire cores that support this old 86 * Interrupts can be "vectored" on the ColdFire cores that support this old
31 * interrupt controller. That is, the device raising the interrupt can also 87 * interrupt controller. That is, the device raising the interrupt can also
32 * supply the vector number to interrupt through. The AVR register of the 88 * supply the vector number to interrupt through. The AVR register of the
@@ -70,6 +126,7 @@ void __init init_IRQ(void)
70 int irq; 126 int irq;
71 127
72 init_vectors(); 128 init_vectors();
129 mcf_maskimr(0xffffffff);
73 130
74 for (irq = 0; (irq < NR_IRQS); irq++) { 131 for (irq = 0; (irq < NR_IRQS); irq++) {
75 irq_desc[irq].status = IRQ_DISABLED; 132 irq_desc[irq].status = IRQ_DISABLED;