diff options
Diffstat (limited to 'arch/mips/dec')
-rw-r--r-- | arch/mips/dec/ecc-berr.c | 7 | ||||
-rw-r--r-- | arch/mips/dec/int-handler.S | 2 | ||||
-rw-r--r-- | arch/mips/dec/ioasic-irq.c | 74 | ||||
-rw-r--r-- | arch/mips/dec/kn01-berr.c | 2 | ||||
-rw-r--r-- | arch/mips/dec/kn02-irq.c | 58 | ||||
-rw-r--r-- | arch/mips/dec/setup.c | 6 | ||||
-rw-r--r-- | arch/mips/dec/time.c | 13 |
7 files changed, 33 insertions, 129 deletions
diff --git a/arch/mips/dec/ecc-berr.c b/arch/mips/dec/ecc-berr.c index 3e374d05978f..6d55e8aab668 100644 --- a/arch/mips/dec/ecc-berr.c +++ b/arch/mips/dec/ecc-berr.c | |||
@@ -18,7 +18,6 @@ | |||
18 | #include <linux/interrupt.h> | 18 | #include <linux/interrupt.h> |
19 | #include <linux/kernel.h> | 19 | #include <linux/kernel.h> |
20 | #include <linux/sched.h> | 20 | #include <linux/sched.h> |
21 | #include <linux/spinlock.h> | ||
22 | #include <linux/types.h> | 21 | #include <linux/types.h> |
23 | 22 | ||
24 | #include <asm/addrspace.h> | 23 | #include <asm/addrspace.h> |
@@ -26,6 +25,7 @@ | |||
26 | #include <asm/cpu.h> | 25 | #include <asm/cpu.h> |
27 | #include <asm/irq_regs.h> | 26 | #include <asm/irq_regs.h> |
28 | #include <asm/processor.h> | 27 | #include <asm/processor.h> |
28 | #include <asm/ptrace.h> | ||
29 | #include <asm/system.h> | 29 | #include <asm/system.h> |
30 | #include <asm/traps.h> | 30 | #include <asm/traps.h> |
31 | 31 | ||
@@ -231,13 +231,10 @@ irqreturn_t dec_ecc_be_interrupt(int irq, void *dev_id) | |||
231 | static inline void dec_kn02_be_init(void) | 231 | static inline void dec_kn02_be_init(void) |
232 | { | 232 | { |
233 | volatile u32 *csr = (void *)CKSEG1ADDR(KN02_SLOT_BASE + KN02_CSR); | 233 | volatile u32 *csr = (void *)CKSEG1ADDR(KN02_SLOT_BASE + KN02_CSR); |
234 | unsigned long flags; | ||
235 | 234 | ||
236 | kn0x_erraddr = (void *)CKSEG1ADDR(KN02_SLOT_BASE + KN02_ERRADDR); | 235 | kn0x_erraddr = (void *)CKSEG1ADDR(KN02_SLOT_BASE + KN02_ERRADDR); |
237 | kn0x_chksyn = (void *)CKSEG1ADDR(KN02_SLOT_BASE + KN02_CHKSYN); | 236 | kn0x_chksyn = (void *)CKSEG1ADDR(KN02_SLOT_BASE + KN02_CHKSYN); |
238 | 237 | ||
239 | spin_lock_irqsave(&kn02_lock, flags); | ||
240 | |||
241 | /* Preset write-only bits of the Control Register cache. */ | 238 | /* Preset write-only bits of the Control Register cache. */ |
242 | cached_kn02_csr = *csr | KN02_CSR_LEDS; | 239 | cached_kn02_csr = *csr | KN02_CSR_LEDS; |
243 | 240 | ||
@@ -247,8 +244,6 @@ static inline void dec_kn02_be_init(void) | |||
247 | cached_kn02_csr |= KN02_CSR_CORRECT; | 244 | cached_kn02_csr |= KN02_CSR_CORRECT; |
248 | *csr = cached_kn02_csr; | 245 | *csr = cached_kn02_csr; |
249 | iob(); | 246 | iob(); |
250 | |||
251 | spin_unlock_irqrestore(&kn02_lock, flags); | ||
252 | } | 247 | } |
253 | 248 | ||
254 | static inline void dec_kn03_be_init(void) | 249 | static inline void dec_kn03_be_init(void) |
diff --git a/arch/mips/dec/int-handler.S b/arch/mips/dec/int-handler.S index 31dd47d1002d..b251ef864c33 100644 --- a/arch/mips/dec/int-handler.S +++ b/arch/mips/dec/int-handler.S | |||
@@ -267,7 +267,7 @@ handle_it: | |||
267 | LONG_L s0, TI_REGS($28) | 267 | LONG_L s0, TI_REGS($28) |
268 | LONG_S sp, TI_REGS($28) | 268 | LONG_S sp, TI_REGS($28) |
269 | PTR_LA ra, ret_from_irq | 269 | PTR_LA ra, ret_from_irq |
270 | j do_IRQ | 270 | j dec_irq_dispatch |
271 | nop | 271 | nop |
272 | 272 | ||
273 | #ifdef CONFIG_32BIT | 273 | #ifdef CONFIG_32BIT |
diff --git a/arch/mips/dec/ioasic-irq.c b/arch/mips/dec/ioasic-irq.c index 41cd2a96148b..4c7cb4048d35 100644 --- a/arch/mips/dec/ioasic-irq.c +++ b/arch/mips/dec/ioasic-irq.c | |||
@@ -13,7 +13,6 @@ | |||
13 | 13 | ||
14 | #include <linux/init.h> | 14 | #include <linux/init.h> |
15 | #include <linux/irq.h> | 15 | #include <linux/irq.h> |
16 | #include <linux/spinlock.h> | ||
17 | #include <linux/types.h> | 16 | #include <linux/types.h> |
18 | 17 | ||
19 | #include <asm/dec/ioasic.h> | 18 | #include <asm/dec/ioasic.h> |
@@ -21,8 +20,6 @@ | |||
21 | #include <asm/dec/ioasic_ints.h> | 20 | #include <asm/dec/ioasic_ints.h> |
22 | 21 | ||
23 | 22 | ||
24 | static DEFINE_SPINLOCK(ioasic_lock); | ||
25 | |||
26 | static int ioasic_irq_base; | 23 | static int ioasic_irq_base; |
27 | 24 | ||
28 | 25 | ||
@@ -52,65 +49,30 @@ static inline void clear_ioasic_irq(unsigned int irq) | |||
52 | ioasic_write(IO_REG_SIR, sir); | 49 | ioasic_write(IO_REG_SIR, sir); |
53 | } | 50 | } |
54 | 51 | ||
55 | static inline void enable_ioasic_irq(unsigned int irq) | ||
56 | { | ||
57 | unsigned long flags; | ||
58 | |||
59 | spin_lock_irqsave(&ioasic_lock, flags); | ||
60 | unmask_ioasic_irq(irq); | ||
61 | spin_unlock_irqrestore(&ioasic_lock, flags); | ||
62 | } | ||
63 | |||
64 | static inline void disable_ioasic_irq(unsigned int irq) | ||
65 | { | ||
66 | unsigned long flags; | ||
67 | |||
68 | spin_lock_irqsave(&ioasic_lock, flags); | ||
69 | mask_ioasic_irq(irq); | ||
70 | spin_unlock_irqrestore(&ioasic_lock, flags); | ||
71 | } | ||
72 | |||
73 | |||
74 | static inline unsigned int startup_ioasic_irq(unsigned int irq) | ||
75 | { | ||
76 | enable_ioasic_irq(irq); | ||
77 | return 0; | ||
78 | } | ||
79 | |||
80 | #define shutdown_ioasic_irq disable_ioasic_irq | ||
81 | |||
82 | static inline void ack_ioasic_irq(unsigned int irq) | 52 | static inline void ack_ioasic_irq(unsigned int irq) |
83 | { | 53 | { |
84 | spin_lock(&ioasic_lock); | ||
85 | mask_ioasic_irq(irq); | 54 | mask_ioasic_irq(irq); |
86 | spin_unlock(&ioasic_lock); | ||
87 | fast_iob(); | 55 | fast_iob(); |
88 | } | 56 | } |
89 | 57 | ||
90 | static inline void end_ioasic_irq(unsigned int irq) | 58 | static inline void end_ioasic_irq(unsigned int irq) |
91 | { | 59 | { |
92 | if (!(irq_desc[irq].status & (IRQ_DISABLED | IRQ_INPROGRESS))) | 60 | if (!(irq_desc[irq].status & (IRQ_DISABLED | IRQ_INPROGRESS))) |
93 | enable_ioasic_irq(irq); | 61 | unmask_ioasic_irq(irq); |
94 | } | 62 | } |
95 | 63 | ||
96 | static struct irq_chip ioasic_irq_type = { | 64 | static struct irq_chip ioasic_irq_type = { |
97 | .typename = "IO-ASIC", | 65 | .typename = "IO-ASIC", |
98 | .startup = startup_ioasic_irq, | ||
99 | .shutdown = shutdown_ioasic_irq, | ||
100 | .enable = enable_ioasic_irq, | ||
101 | .disable = disable_ioasic_irq, | ||
102 | .ack = ack_ioasic_irq, | 66 | .ack = ack_ioasic_irq, |
103 | .end = end_ioasic_irq, | 67 | .mask = mask_ioasic_irq, |
68 | .mask_ack = ack_ioasic_irq, | ||
69 | .unmask = unmask_ioasic_irq, | ||
104 | }; | 70 | }; |
105 | 71 | ||
106 | 72 | ||
107 | #define startup_ioasic_dma_irq startup_ioasic_irq | 73 | #define unmask_ioasic_dma_irq unmask_ioasic_irq |
108 | |||
109 | #define shutdown_ioasic_dma_irq shutdown_ioasic_irq | ||
110 | |||
111 | #define enable_ioasic_dma_irq enable_ioasic_irq | ||
112 | 74 | ||
113 | #define disable_ioasic_dma_irq disable_ioasic_irq | 75 | #define mask_ioasic_dma_irq mask_ioasic_irq |
114 | 76 | ||
115 | #define ack_ioasic_dma_irq ack_ioasic_irq | 77 | #define ack_ioasic_dma_irq ack_ioasic_irq |
116 | 78 | ||
@@ -123,11 +85,10 @@ static inline void end_ioasic_dma_irq(unsigned int irq) | |||
123 | 85 | ||
124 | static struct irq_chip ioasic_dma_irq_type = { | 86 | static struct irq_chip ioasic_dma_irq_type = { |
125 | .typename = "IO-ASIC-DMA", | 87 | .typename = "IO-ASIC-DMA", |
126 | .startup = startup_ioasic_dma_irq, | ||
127 | .shutdown = shutdown_ioasic_dma_irq, | ||
128 | .enable = enable_ioasic_dma_irq, | ||
129 | .disable = disable_ioasic_dma_irq, | ||
130 | .ack = ack_ioasic_dma_irq, | 88 | .ack = ack_ioasic_dma_irq, |
89 | .mask = mask_ioasic_dma_irq, | ||
90 | .mask_ack = ack_ioasic_dma_irq, | ||
91 | .unmask = unmask_ioasic_dma_irq, | ||
131 | .end = end_ioasic_dma_irq, | 92 | .end = end_ioasic_dma_irq, |
132 | }; | 93 | }; |
133 | 94 | ||
@@ -140,18 +101,11 @@ void __init init_ioasic_irqs(int base) | |||
140 | ioasic_write(IO_REG_SIMR, 0); | 101 | ioasic_write(IO_REG_SIMR, 0); |
141 | fast_iob(); | 102 | fast_iob(); |
142 | 103 | ||
143 | for (i = base; i < base + IO_INR_DMA; i++) { | 104 | for (i = base; i < base + IO_INR_DMA; i++) |
144 | irq_desc[i].status = IRQ_DISABLED; | 105 | set_irq_chip_and_handler(i, &ioasic_irq_type, |
145 | irq_desc[i].action = 0; | 106 | handle_level_irq); |
146 | irq_desc[i].depth = 1; | 107 | for (; i < base + IO_IRQ_LINES; i++) |
147 | irq_desc[i].chip = &ioasic_irq_type; | 108 | set_irq_chip(i, &ioasic_dma_irq_type); |
148 | } | ||
149 | for (; i < base + IO_IRQ_LINES; i++) { | ||
150 | irq_desc[i].status = IRQ_DISABLED; | ||
151 | irq_desc[i].action = 0; | ||
152 | irq_desc[i].depth = 1; | ||
153 | irq_desc[i].chip = &ioasic_dma_irq_type; | ||
154 | } | ||
155 | 109 | ||
156 | ioasic_irq_base = base; | 110 | ioasic_irq_base = base; |
157 | } | 111 | } |
diff --git a/arch/mips/dec/kn01-berr.c b/arch/mips/dec/kn01-berr.c index f19b4617a0a6..d3b8002bf1e7 100644 --- a/arch/mips/dec/kn01-berr.c +++ b/arch/mips/dec/kn01-berr.c | |||
@@ -20,8 +20,10 @@ | |||
20 | #include <linux/types.h> | 20 | #include <linux/types.h> |
21 | 21 | ||
22 | #include <asm/inst.h> | 22 | #include <asm/inst.h> |
23 | #include <asm/irq_regs.h> | ||
23 | #include <asm/mipsregs.h> | 24 | #include <asm/mipsregs.h> |
24 | #include <asm/page.h> | 25 | #include <asm/page.h> |
26 | #include <asm/ptrace.h> | ||
25 | #include <asm/system.h> | 27 | #include <asm/system.h> |
26 | #include <asm/traps.h> | 28 | #include <asm/traps.h> |
27 | #include <asm/uaccess.h> | 29 | #include <asm/uaccess.h> |
diff --git a/arch/mips/dec/kn02-irq.c b/arch/mips/dec/kn02-irq.c index 04a367a60a57..916e46b8ccd8 100644 --- a/arch/mips/dec/kn02-irq.c +++ b/arch/mips/dec/kn02-irq.c | |||
@@ -14,7 +14,6 @@ | |||
14 | 14 | ||
15 | #include <linux/init.h> | 15 | #include <linux/init.h> |
16 | #include <linux/irq.h> | 16 | #include <linux/irq.h> |
17 | #include <linux/spinlock.h> | ||
18 | #include <linux/types.h> | 17 | #include <linux/types.h> |
19 | 18 | ||
20 | #include <asm/dec/kn02.h> | 19 | #include <asm/dec/kn02.h> |
@@ -29,7 +28,6 @@ | |||
29 | * There is no default value -- it has to be initialized. | 28 | * There is no default value -- it has to be initialized. |
30 | */ | 29 | */ |
31 | u32 cached_kn02_csr; | 30 | u32 cached_kn02_csr; |
32 | DEFINE_SPINLOCK(kn02_lock); | ||
33 | 31 | ||
34 | 32 | ||
35 | static int kn02_irq_base; | 33 | static int kn02_irq_base; |
@@ -53,55 +51,18 @@ static inline void mask_kn02_irq(unsigned int irq) | |||
53 | *csr = cached_kn02_csr; | 51 | *csr = cached_kn02_csr; |
54 | } | 52 | } |
55 | 53 | ||
56 | static inline void enable_kn02_irq(unsigned int irq) | ||
57 | { | ||
58 | unsigned long flags; | ||
59 | |||
60 | spin_lock_irqsave(&kn02_lock, flags); | ||
61 | unmask_kn02_irq(irq); | ||
62 | spin_unlock_irqrestore(&kn02_lock, flags); | ||
63 | } | ||
64 | |||
65 | static inline void disable_kn02_irq(unsigned int irq) | ||
66 | { | ||
67 | unsigned long flags; | ||
68 | |||
69 | spin_lock_irqsave(&kn02_lock, flags); | ||
70 | mask_kn02_irq(irq); | ||
71 | spin_unlock_irqrestore(&kn02_lock, flags); | ||
72 | } | ||
73 | |||
74 | |||
75 | static unsigned int startup_kn02_irq(unsigned int irq) | ||
76 | { | ||
77 | enable_kn02_irq(irq); | ||
78 | return 0; | ||
79 | } | ||
80 | |||
81 | #define shutdown_kn02_irq disable_kn02_irq | ||
82 | |||
83 | static void ack_kn02_irq(unsigned int irq) | 54 | static void ack_kn02_irq(unsigned int irq) |
84 | { | 55 | { |
85 | spin_lock(&kn02_lock); | ||
86 | mask_kn02_irq(irq); | 56 | mask_kn02_irq(irq); |
87 | spin_unlock(&kn02_lock); | ||
88 | iob(); | 57 | iob(); |
89 | } | 58 | } |
90 | 59 | ||
91 | static void end_kn02_irq(unsigned int irq) | ||
92 | { | ||
93 | if (!(irq_desc[irq].status & (IRQ_DISABLED | IRQ_INPROGRESS))) | ||
94 | enable_kn02_irq(irq); | ||
95 | } | ||
96 | |||
97 | static struct irq_chip kn02_irq_type = { | 60 | static struct irq_chip kn02_irq_type = { |
98 | .typename = "KN02-CSR", | 61 | .typename = "KN02-CSR", |
99 | .startup = startup_kn02_irq, | ||
100 | .shutdown = shutdown_kn02_irq, | ||
101 | .enable = enable_kn02_irq, | ||
102 | .disable = disable_kn02_irq, | ||
103 | .ack = ack_kn02_irq, | 62 | .ack = ack_kn02_irq, |
104 | .end = end_kn02_irq, | 63 | .mask = mask_kn02_irq, |
64 | .mask_ack = ack_kn02_irq, | ||
65 | .unmask = unmask_kn02_irq, | ||
105 | }; | 66 | }; |
106 | 67 | ||
107 | 68 | ||
@@ -109,22 +70,15 @@ void __init init_kn02_irqs(int base) | |||
109 | { | 70 | { |
110 | volatile u32 *csr = (volatile u32 *)CKSEG1ADDR(KN02_SLOT_BASE + | 71 | volatile u32 *csr = (volatile u32 *)CKSEG1ADDR(KN02_SLOT_BASE + |
111 | KN02_CSR); | 72 | KN02_CSR); |
112 | unsigned long flags; | ||
113 | int i; | 73 | int i; |
114 | 74 | ||
115 | /* Mask interrupts. */ | 75 | /* Mask interrupts. */ |
116 | spin_lock_irqsave(&kn02_lock, flags); | ||
117 | cached_kn02_csr &= ~KN02_CSR_IOINTEN; | 76 | cached_kn02_csr &= ~KN02_CSR_IOINTEN; |
118 | *csr = cached_kn02_csr; | 77 | *csr = cached_kn02_csr; |
119 | iob(); | 78 | iob(); |
120 | spin_unlock_irqrestore(&kn02_lock, flags); | 79 | |
121 | 80 | for (i = base; i < base + KN02_IRQ_LINES; i++) | |
122 | for (i = base; i < base + KN02_IRQ_LINES; i++) { | 81 | set_irq_chip_and_handler(i, &kn02_irq_type, handle_level_irq); |
123 | irq_desc[i].status = IRQ_DISABLED; | ||
124 | irq_desc[i].action = 0; | ||
125 | irq_desc[i].depth = 1; | ||
126 | irq_desc[i].chip = &kn02_irq_type; | ||
127 | } | ||
128 | 82 | ||
129 | kn02_irq_base = base; | 83 | kn02_irq_base = base; |
130 | } | 84 | } |
diff --git a/arch/mips/dec/setup.c b/arch/mips/dec/setup.c index 6b7481e97bec..d34032ac492a 100644 --- a/arch/mips/dec/setup.c +++ b/arch/mips/dec/setup.c | |||
@@ -761,3 +761,9 @@ void __init arch_init_irq(void) | |||
761 | if (dec_interrupt[DEC_IRQ_HALT] >= 0) | 761 | if (dec_interrupt[DEC_IRQ_HALT] >= 0) |
762 | setup_irq(dec_interrupt[DEC_IRQ_HALT], &haltirq); | 762 | setup_irq(dec_interrupt[DEC_IRQ_HALT], &haltirq); |
763 | } | 763 | } |
764 | |||
765 | asmlinkage unsigned int dec_irq_dispatch(unsigned int irq) | ||
766 | { | ||
767 | do_IRQ(irq); | ||
768 | return 0; | ||
769 | } | ||
diff --git a/arch/mips/dec/time.c b/arch/mips/dec/time.c index 4cf0c06e2414..8b7e0c17ac35 100644 --- a/arch/mips/dec/time.c +++ b/arch/mips/dec/time.c | |||
@@ -151,7 +151,7 @@ static void dec_timer_ack(void) | |||
151 | CMOS_READ(RTC_REG_C); /* Ack the RTC interrupt. */ | 151 | CMOS_READ(RTC_REG_C); /* Ack the RTC interrupt. */ |
152 | } | 152 | } |
153 | 153 | ||
154 | static unsigned int dec_ioasic_hpt_read(void) | 154 | static cycle_t dec_ioasic_hpt_read(void) |
155 | { | 155 | { |
156 | /* | 156 | /* |
157 | * The free-running counter is 32-bit which is good for about | 157 | * The free-running counter is 32-bit which is good for about |
@@ -160,11 +160,6 @@ static unsigned int dec_ioasic_hpt_read(void) | |||
160 | return ioasic_read(IO_REG_FCTR); | 160 | return ioasic_read(IO_REG_FCTR); |
161 | } | 161 | } |
162 | 162 | ||
163 | static void dec_ioasic_hpt_init(unsigned int count) | ||
164 | { | ||
165 | ioasic_write(IO_REG_FCTR, ioasic_read(IO_REG_FCTR) - count); | ||
166 | } | ||
167 | |||
168 | 163 | ||
169 | void __init dec_time_init(void) | 164 | void __init dec_time_init(void) |
170 | { | 165 | { |
@@ -174,11 +169,9 @@ void __init dec_time_init(void) | |||
174 | mips_timer_state = dec_timer_state; | 169 | mips_timer_state = dec_timer_state; |
175 | mips_timer_ack = dec_timer_ack; | 170 | mips_timer_ack = dec_timer_ack; |
176 | 171 | ||
177 | if (!cpu_has_counter && IOASIC) { | 172 | if (!cpu_has_counter && IOASIC) |
178 | /* For pre-R4k systems we use the I/O ASIC's counter. */ | 173 | /* For pre-R4k systems we use the I/O ASIC's counter. */ |
179 | mips_hpt_read = dec_ioasic_hpt_read; | 174 | clocksource_mips.read = dec_ioasic_hpt_read; |
180 | mips_hpt_init = dec_ioasic_hpt_init; | ||
181 | } | ||
182 | 175 | ||
183 | /* Set up the rate of periodic DS1287 interrupts. */ | 176 | /* Set up the rate of periodic DS1287 interrupts. */ |
184 | CMOS_WRITE(RTC_REF_CLCK_32KHZ | (16 - __ffs(HZ)), RTC_REG_A); | 177 | CMOS_WRITE(RTC_REF_CLCK_32KHZ | (16 - __ffs(HZ)), RTC_REG_A); |