aboutsummaryrefslogtreecommitdiffstats
path: root/arch/mips/sni
diff options
context:
space:
mode:
authorGlenn Elliott <gelliott@cs.unc.edu>2012-03-04 19:47:13 -0500
committerGlenn Elliott <gelliott@cs.unc.edu>2012-03-04 19:47:13 -0500
commitc71c03bda1e86c9d5198c5d83f712e695c4f2a1e (patch)
treeecb166cb3e2b7e2adb3b5e292245fefd23381ac8 /arch/mips/sni
parentea53c912f8a86a8567697115b6a0d8152beee5c8 (diff)
parent6a00f206debf8a5c8899055726ad127dbeeed098 (diff)
Merge branch 'mpi-master' into wip-k-fmlpwip-k-fmlp
Conflicts: litmus/sched_cedf.c
Diffstat (limited to 'arch/mips/sni')
-rw-r--r--arch/mips/sni/a20r.c26
-rw-r--r--arch/mips/sni/pcimt.c24
-rw-r--r--arch/mips/sni/pcit.c26
-rw-r--r--arch/mips/sni/rm200.c47
-rw-r--r--arch/mips/sni/time.c5
5 files changed, 46 insertions, 82 deletions
diff --git a/arch/mips/sni/a20r.c b/arch/mips/sni/a20r.c
index e6980892834a..c48194c3073b 100644
--- a/arch/mips/sni/a20r.c
+++ b/arch/mips/sni/a20r.c
@@ -10,6 +10,7 @@
10 10
11#include <linux/init.h> 11#include <linux/init.h>
12#include <linux/interrupt.h> 12#include <linux/interrupt.h>
13#include <linux/irq.h>
13#include <linux/platform_device.h> 14#include <linux/platform_device.h>
14#include <linux/serial_8250.h> 15#include <linux/serial_8250.h>
15 16
@@ -167,33 +168,22 @@ static u32 a20r_ack_hwint(void)
167 return status; 168 return status;
168} 169}
169 170
170static inline void unmask_a20r_irq(unsigned int irq) 171static inline void unmask_a20r_irq(struct irq_data *d)
171{ 172{
172 set_c0_status(0x100 << (irq - SNI_A20R_IRQ_BASE)); 173 set_c0_status(0x100 << (d->irq - SNI_A20R_IRQ_BASE));
173 irq_enable_hazard(); 174 irq_enable_hazard();
174} 175}
175 176
176static inline void mask_a20r_irq(unsigned int irq) 177static inline void mask_a20r_irq(struct irq_data *d)
177{ 178{
178 clear_c0_status(0x100 << (irq - SNI_A20R_IRQ_BASE)); 179 clear_c0_status(0x100 << (d->irq - SNI_A20R_IRQ_BASE));
179 irq_disable_hazard(); 180 irq_disable_hazard();
180} 181}
181 182
182static void end_a20r_irq(unsigned int irq)
183{
184 if (!(irq_desc[irq].status & (IRQ_DISABLED | IRQ_INPROGRESS))) {
185 a20r_ack_hwint();
186 unmask_a20r_irq(irq);
187 }
188}
189
190static struct irq_chip a20r_irq_type = { 183static struct irq_chip a20r_irq_type = {
191 .name = "A20R", 184 .name = "A20R",
192 .ack = mask_a20r_irq, 185 .irq_mask = mask_a20r_irq,
193 .mask = mask_a20r_irq, 186 .irq_unmask = unmask_a20r_irq,
194 .mask_ack = mask_a20r_irq,
195 .unmask = unmask_a20r_irq,
196 .end = end_a20r_irq,
197}; 187};
198 188
199/* 189/*
@@ -219,7 +209,7 @@ void __init sni_a20r_irq_init(void)
219 int i; 209 int i;
220 210
221 for (i = SNI_A20R_IRQ_BASE + 2 ; i < SNI_A20R_IRQ_BASE + 8; i++) 211 for (i = SNI_A20R_IRQ_BASE + 2 ; i < SNI_A20R_IRQ_BASE + 8; i++)
222 set_irq_chip_and_handler(i, &a20r_irq_type, handle_level_irq); 212 irq_set_chip_and_handler(i, &a20r_irq_type, handle_level_irq);
223 sni_hwint = a20r_hwint; 213 sni_hwint = a20r_hwint;
224 change_c0_status(ST0_IM, IE_IRQ0); 214 change_c0_status(ST0_IM, IE_IRQ0);
225 setup_irq(SNI_A20R_IRQ_BASE + 3, &sni_isa_irq); 215 setup_irq(SNI_A20R_IRQ_BASE + 3, &sni_isa_irq);
diff --git a/arch/mips/sni/pcimt.c b/arch/mips/sni/pcimt.c
index 51e62bbaa23b..ed3b3d317358 100644
--- a/arch/mips/sni/pcimt.c
+++ b/arch/mips/sni/pcimt.c
@@ -11,6 +11,7 @@
11 11
12#include <linux/init.h> 12#include <linux/init.h>
13#include <linux/interrupt.h> 13#include <linux/interrupt.h>
14#include <linux/irq.h>
14#include <linux/pci.h> 15#include <linux/pci.h>
15#include <linux/serial_8250.h> 16#include <linux/serial_8250.h>
16 17
@@ -193,33 +194,24 @@ static struct pci_controller sni_controller = {
193 .io_map_base = SNI_PORT_BASE 194 .io_map_base = SNI_PORT_BASE
194}; 195};
195 196
196static void enable_pcimt_irq(unsigned int irq) 197static void enable_pcimt_irq(struct irq_data *d)
197{ 198{
198 unsigned int mask = 1 << (irq - PCIMT_IRQ_INT2); 199 unsigned int mask = 1 << (d->irq - PCIMT_IRQ_INT2);
199 200
200 *(volatile u8 *) PCIMT_IRQSEL |= mask; 201 *(volatile u8 *) PCIMT_IRQSEL |= mask;
201} 202}
202 203
203void disable_pcimt_irq(unsigned int irq) 204void disable_pcimt_irq(struct irq_data *d)
204{ 205{
205 unsigned int mask = ~(1 << (irq - PCIMT_IRQ_INT2)); 206 unsigned int mask = ~(1 << (d->irq - PCIMT_IRQ_INT2));
206 207
207 *(volatile u8 *) PCIMT_IRQSEL &= mask; 208 *(volatile u8 *) PCIMT_IRQSEL &= mask;
208} 209}
209 210
210static void end_pcimt_irq(unsigned int irq)
211{
212 if (!(irq_desc[irq].status & (IRQ_DISABLED|IRQ_INPROGRESS)))
213 enable_pcimt_irq(irq);
214}
215
216static struct irq_chip pcimt_irq_type = { 211static struct irq_chip pcimt_irq_type = {
217 .name = "PCIMT", 212 .name = "PCIMT",
218 .ack = disable_pcimt_irq, 213 .irq_mask = disable_pcimt_irq,
219 .mask = disable_pcimt_irq, 214 .irq_unmask = enable_pcimt_irq,
220 .mask_ack = disable_pcimt_irq,
221 .unmask = enable_pcimt_irq,
222 .end = end_pcimt_irq,
223}; 215};
224 216
225/* 217/*
@@ -304,7 +296,7 @@ void __init sni_pcimt_irq_init(void)
304 mips_cpu_irq_init(); 296 mips_cpu_irq_init();
305 /* Actually we've got more interrupts to handle ... */ 297 /* Actually we've got more interrupts to handle ... */
306 for (i = PCIMT_IRQ_INT2; i <= PCIMT_IRQ_SCSI; i++) 298 for (i = PCIMT_IRQ_INT2; i <= PCIMT_IRQ_SCSI; i++)
307 set_irq_chip_and_handler(i, &pcimt_irq_type, handle_level_irq); 299 irq_set_chip_and_handler(i, &pcimt_irq_type, handle_level_irq);
308 sni_hwint = sni_pcimt_hwint; 300 sni_hwint = sni_pcimt_hwint;
309 change_c0_status(ST0_IM, IE_IRQ1|IE_IRQ3); 301 change_c0_status(ST0_IM, IE_IRQ1|IE_IRQ3);
310} 302}
diff --git a/arch/mips/sni/pcit.c b/arch/mips/sni/pcit.c
index f4699d35858b..b5246373d16b 100644
--- a/arch/mips/sni/pcit.c
+++ b/arch/mips/sni/pcit.c
@@ -10,6 +10,7 @@
10 10
11#include <linux/init.h> 11#include <linux/init.h>
12#include <linux/interrupt.h> 12#include <linux/interrupt.h>
13#include <linux/irq.h>
13#include <linux/pci.h> 14#include <linux/pci.h>
14#include <linux/serial_8250.h> 15#include <linux/serial_8250.h>
15 16
@@ -155,33 +156,24 @@ static struct pci_controller sni_pcit_controller = {
155 .io_map_base = SNI_PORT_BASE 156 .io_map_base = SNI_PORT_BASE
156}; 157};
157 158
158static void enable_pcit_irq(unsigned int irq) 159static void enable_pcit_irq(struct irq_data *d)
159{ 160{
160 u32 mask = 1 << (irq - SNI_PCIT_INT_START + 24); 161 u32 mask = 1 << (d->irq - SNI_PCIT_INT_START + 24);
161 162
162 *(volatile u32 *)SNI_PCIT_INT_REG |= mask; 163 *(volatile u32 *)SNI_PCIT_INT_REG |= mask;
163} 164}
164 165
165void disable_pcit_irq(unsigned int irq) 166void disable_pcit_irq(struct irq_data *d)
166{ 167{
167 u32 mask = 1 << (irq - SNI_PCIT_INT_START + 24); 168 u32 mask = 1 << (d->irq - SNI_PCIT_INT_START + 24);
168 169
169 *(volatile u32 *)SNI_PCIT_INT_REG &= ~mask; 170 *(volatile u32 *)SNI_PCIT_INT_REG &= ~mask;
170} 171}
171 172
172void end_pcit_irq(unsigned int irq)
173{
174 if (!(irq_desc[irq].status & (IRQ_DISABLED|IRQ_INPROGRESS)))
175 enable_pcit_irq(irq);
176}
177
178static struct irq_chip pcit_irq_type = { 173static struct irq_chip pcit_irq_type = {
179 .name = "PCIT", 174 .name = "PCIT",
180 .ack = disable_pcit_irq, 175 .irq_mask = disable_pcit_irq,
181 .mask = disable_pcit_irq, 176 .irq_unmask = enable_pcit_irq,
182 .mask_ack = disable_pcit_irq,
183 .unmask = enable_pcit_irq,
184 .end = end_pcit_irq,
185}; 177};
186 178
187static void pcit_hwint1(void) 179static void pcit_hwint1(void)
@@ -246,7 +238,7 @@ void __init sni_pcit_irq_init(void)
246 238
247 mips_cpu_irq_init(); 239 mips_cpu_irq_init();
248 for (i = SNI_PCIT_INT_START; i <= SNI_PCIT_INT_END; i++) 240 for (i = SNI_PCIT_INT_START; i <= SNI_PCIT_INT_END; i++)
249 set_irq_chip_and_handler(i, &pcit_irq_type, handle_level_irq); 241 irq_set_chip_and_handler(i, &pcit_irq_type, handle_level_irq);
250 *(volatile u32 *)SNI_PCIT_INT_REG = 0; 242 *(volatile u32 *)SNI_PCIT_INT_REG = 0;
251 sni_hwint = sni_pcit_hwint; 243 sni_hwint = sni_pcit_hwint;
252 change_c0_status(ST0_IM, IE_IRQ1); 244 change_c0_status(ST0_IM, IE_IRQ1);
@@ -259,7 +251,7 @@ void __init sni_pcit_cplus_irq_init(void)
259 251
260 mips_cpu_irq_init(); 252 mips_cpu_irq_init();
261 for (i = SNI_PCIT_INT_START; i <= SNI_PCIT_INT_END; i++) 253 for (i = SNI_PCIT_INT_START; i <= SNI_PCIT_INT_END; i++)
262 set_irq_chip_and_handler(i, &pcit_irq_type, handle_level_irq); 254 irq_set_chip_and_handler(i, &pcit_irq_type, handle_level_irq);
263 *(volatile u32 *)SNI_PCIT_INT_REG = 0x40000000; 255 *(volatile u32 *)SNI_PCIT_INT_REG = 0x40000000;
264 sni_hwint = sni_pcit_hwint_cplus; 256 sni_hwint = sni_pcit_hwint_cplus;
265 change_c0_status(ST0_IM, IE_IRQ0); 257 change_c0_status(ST0_IM, IE_IRQ0);
diff --git a/arch/mips/sni/rm200.c b/arch/mips/sni/rm200.c
index 90c558f7c0fa..a7e5a6d917b1 100644
--- a/arch/mips/sni/rm200.c
+++ b/arch/mips/sni/rm200.c
@@ -13,6 +13,7 @@
13#include <linux/delay.h> 13#include <linux/delay.h>
14#include <linux/init.h> 14#include <linux/init.h>
15#include <linux/interrupt.h> 15#include <linux/interrupt.h>
16#include <linux/irq.h>
16#include <linux/platform_device.h> 17#include <linux/platform_device.h>
17#include <linux/serial_8250.h> 18#include <linux/serial_8250.h>
18#include <linux/io.h> 19#include <linux/io.h>
@@ -154,12 +155,11 @@ static __iomem u8 *rm200_pic_slave;
154#define cached_master_mask (rm200_cached_irq_mask) 155#define cached_master_mask (rm200_cached_irq_mask)
155#define cached_slave_mask (rm200_cached_irq_mask >> 8) 156#define cached_slave_mask (rm200_cached_irq_mask >> 8)
156 157
157static void sni_rm200_disable_8259A_irq(unsigned int irq) 158static void sni_rm200_disable_8259A_irq(struct irq_data *d)
158{ 159{
159 unsigned int mask; 160 unsigned int mask, irq = d->irq - RM200_I8259A_IRQ_BASE;
160 unsigned long flags; 161 unsigned long flags;
161 162
162 irq -= RM200_I8259A_IRQ_BASE;
163 mask = 1 << irq; 163 mask = 1 << irq;
164 raw_spin_lock_irqsave(&sni_rm200_i8259A_lock, flags); 164 raw_spin_lock_irqsave(&sni_rm200_i8259A_lock, flags);
165 rm200_cached_irq_mask |= mask; 165 rm200_cached_irq_mask |= mask;
@@ -170,12 +170,11 @@ static void sni_rm200_disable_8259A_irq(unsigned int irq)
170 raw_spin_unlock_irqrestore(&sni_rm200_i8259A_lock, flags); 170 raw_spin_unlock_irqrestore(&sni_rm200_i8259A_lock, flags);
171} 171}
172 172
173static void sni_rm200_enable_8259A_irq(unsigned int irq) 173static void sni_rm200_enable_8259A_irq(struct irq_data *d)
174{ 174{
175 unsigned int mask; 175 unsigned int mask, irq = d->irq - RM200_I8259A_IRQ_BASE;
176 unsigned long flags; 176 unsigned long flags;
177 177
178 irq -= RM200_I8259A_IRQ_BASE;
179 mask = ~(1 << irq); 178 mask = ~(1 << irq);
180 raw_spin_lock_irqsave(&sni_rm200_i8259A_lock, flags); 179 raw_spin_lock_irqsave(&sni_rm200_i8259A_lock, flags);
181 rm200_cached_irq_mask &= mask; 180 rm200_cached_irq_mask &= mask;
@@ -209,12 +208,11 @@ static inline int sni_rm200_i8259A_irq_real(unsigned int irq)
209 * first, _then_ send the EOI, and the order of EOI 208 * first, _then_ send the EOI, and the order of EOI
210 * to the two 8259s is important! 209 * to the two 8259s is important!
211 */ 210 */
212void sni_rm200_mask_and_ack_8259A(unsigned int irq) 211void sni_rm200_mask_and_ack_8259A(struct irq_data *d)
213{ 212{
214 unsigned int irqmask; 213 unsigned int irqmask, irq = d->irq - RM200_I8259A_IRQ_BASE;
215 unsigned long flags; 214 unsigned long flags;
216 215
217 irq -= RM200_I8259A_IRQ_BASE;
218 irqmask = 1 << irq; 216 irqmask = 1 << irq;
219 raw_spin_lock_irqsave(&sni_rm200_i8259A_lock, flags); 217 raw_spin_lock_irqsave(&sni_rm200_i8259A_lock, flags);
220 /* 218 /*
@@ -284,9 +282,9 @@ spurious_8259A_irq:
284 282
285static struct irq_chip sni_rm200_i8259A_chip = { 283static struct irq_chip sni_rm200_i8259A_chip = {
286 .name = "RM200-XT-PIC", 284 .name = "RM200-XT-PIC",
287 .mask = sni_rm200_disable_8259A_irq, 285 .irq_mask = sni_rm200_disable_8259A_irq,
288 .unmask = sni_rm200_enable_8259A_irq, 286 .irq_unmask = sni_rm200_enable_8259A_irq,
289 .mask_ack = sni_rm200_mask_and_ack_8259A, 287 .irq_mask_ack = sni_rm200_mask_and_ack_8259A,
290}; 288};
291 289
292/* 290/*
@@ -415,7 +413,7 @@ void __init sni_rm200_i8259_irqs(void)
415 sni_rm200_init_8259A(); 413 sni_rm200_init_8259A();
416 414
417 for (i = RM200_I8259A_IRQ_BASE; i < RM200_I8259A_IRQ_BASE + 16; i++) 415 for (i = RM200_I8259A_IRQ_BASE; i < RM200_I8259A_IRQ_BASE + 16; i++)
418 set_irq_chip_and_handler(i, &sni_rm200_i8259A_chip, 416 irq_set_chip_and_handler(i, &sni_rm200_i8259A_chip,
419 handle_level_irq); 417 handle_level_irq);
420 418
421 setup_irq(RM200_I8259A_IRQ_BASE + PIC_CASCADE_IR, &sni_rm200_irq2); 419 setup_irq(RM200_I8259A_IRQ_BASE + PIC_CASCADE_IR, &sni_rm200_irq2);
@@ -428,33 +426,24 @@ void __init sni_rm200_i8259_irqs(void)
428#define SNI_RM200_INT_START 24 426#define SNI_RM200_INT_START 24
429#define SNI_RM200_INT_END 28 427#define SNI_RM200_INT_END 28
430 428
431static void enable_rm200_irq(unsigned int irq) 429static void enable_rm200_irq(struct irq_data *d)
432{ 430{
433 unsigned int mask = 1 << (irq - SNI_RM200_INT_START); 431 unsigned int mask = 1 << (d->irq - SNI_RM200_INT_START);
434 432
435 *(volatile u8 *)SNI_RM200_INT_ENA_REG &= ~mask; 433 *(volatile u8 *)SNI_RM200_INT_ENA_REG &= ~mask;
436} 434}
437 435
438void disable_rm200_irq(unsigned int irq) 436void disable_rm200_irq(struct irq_data *d)
439{ 437{
440 unsigned int mask = 1 << (irq - SNI_RM200_INT_START); 438 unsigned int mask = 1 << (d->irq - SNI_RM200_INT_START);
441 439
442 *(volatile u8 *)SNI_RM200_INT_ENA_REG |= mask; 440 *(volatile u8 *)SNI_RM200_INT_ENA_REG |= mask;
443} 441}
444 442
445void end_rm200_irq(unsigned int irq)
446{
447 if (!(irq_desc[irq].status & (IRQ_DISABLED|IRQ_INPROGRESS)))
448 enable_rm200_irq(irq);
449}
450
451static struct irq_chip rm200_irq_type = { 443static struct irq_chip rm200_irq_type = {
452 .name = "RM200", 444 .name = "RM200",
453 .ack = disable_rm200_irq, 445 .irq_mask = disable_rm200_irq,
454 .mask = disable_rm200_irq, 446 .irq_unmask = enable_rm200_irq,
455 .mask_ack = disable_rm200_irq,
456 .unmask = enable_rm200_irq,
457 .end = end_rm200_irq,
458}; 447};
459 448
460static void sni_rm200_hwint(void) 449static void sni_rm200_hwint(void)
@@ -488,7 +477,7 @@ void __init sni_rm200_irq_init(void)
488 mips_cpu_irq_init(); 477 mips_cpu_irq_init();
489 /* Actually we've got more interrupts to handle ... */ 478 /* Actually we've got more interrupts to handle ... */
490 for (i = SNI_RM200_INT_START; i <= SNI_RM200_INT_END; i++) 479 for (i = SNI_RM200_INT_START; i <= SNI_RM200_INT_END; i++)
491 set_irq_chip_and_handler(i, &rm200_irq_type, handle_level_irq); 480 irq_set_chip_and_handler(i, &rm200_irq_type, handle_level_irq);
492 sni_hwint = sni_rm200_hwint; 481 sni_hwint = sni_rm200_hwint;
493 change_c0_status(ST0_IM, IE_IRQ0); 482 change_c0_status(ST0_IM, IE_IRQ0);
494 setup_irq(SNI_RM200_INT_START + 0, &sni_rm200_i8259A_irq); 483 setup_irq(SNI_RM200_INT_START + 0, &sni_rm200_i8259A_irq);
diff --git a/arch/mips/sni/time.c b/arch/mips/sni/time.c
index f3b60e671207..0904d4d30cb3 100644
--- a/arch/mips/sni/time.c
+++ b/arch/mips/sni/time.c
@@ -1,5 +1,6 @@
1#include <linux/types.h> 1#include <linux/types.h>
2#include <linux/interrupt.h> 2#include <linux/interrupt.h>
3#include <linux/irq.h>
3#include <linux/smp.h> 4#include <linux/smp.h>
4#include <linux/time.h> 5#include <linux/time.h>
5#include <linux/clockchips.h> 6#include <linux/clockchips.h>
@@ -94,7 +95,7 @@ static void __init sni_a20r_timer_setup(void)
94static __init unsigned long dosample(void) 95static __init unsigned long dosample(void)
95{ 96{
96 u32 ct0, ct1; 97 u32 ct0, ct1;
97 volatile u8 msb, lsb; 98 volatile u8 msb;
98 99
99 /* Start the counter. */ 100 /* Start the counter. */
100 outb_p(0x34, 0x43); 101 outb_p(0x34, 0x43);
@@ -107,7 +108,7 @@ static __init unsigned long dosample(void)
107 /* Latch and spin until top byte of counter0 is zero */ 108 /* Latch and spin until top byte of counter0 is zero */
108 do { 109 do {
109 outb(0x00, 0x43); 110 outb(0x00, 0x43);
110 lsb = inb(0x40); 111 (void) inb(0x40);
111 msb = inb(0x40); 112 msb = inb(0x40);
112 ct1 = read_c0_count(); 113 ct1 = read_c0_count();
113 } while (msb); 114 } while (msb);