da0fa940adb3606d4d83612d3fa665133831613f
[linux-2.6.git] / include / asm-ppc / hw_irq.h
1 /*
2  * Copyright (C) 1999 Cort Dougan <cort@cs.nmt.edu>
3  */
4 #ifdef __KERNEL__
5 #ifndef _PPC_HW_IRQ_H
6 #define _PPC_HW_IRQ_H
7
8 #include <asm/ptrace.h>
9 #include <asm/reg.h>
10 #include <asm/irq.h>
11
12 extern void timer_interrupt(struct pt_regs *);
13
14 #define irqs_disabled() ((mfmsr() & MSR_EE) == 0)
15
16 static inline void local_irq_disable(void)
17 {
18         unsigned long msr;
19         msr = mfmsr();
20         mtmsr(msr & ~MSR_EE);
21         __asm__ __volatile__("": : :"memory");
22 }
23
24 static inline void local_irq_enable(void)
25 {
26         unsigned long msr;
27         __asm__ __volatile__("": : :"memory");
28         msr = mfmsr();
29         mtmsr(msr | MSR_EE);
30 }
31
32 static inline void local_irq_save_ptr(unsigned long *flags)
33 {
34         unsigned long msr;
35         msr = mfmsr();
36         *flags = msr;
37         mtmsr(msr & ~MSR_EE);
38         __asm__ __volatile__("": : :"memory");
39 }
40
41 #define local_save_flags(flags)         ((flags) = mfmsr())
42 #define local_irq_save(flags)           local_irq_save_ptr(&flags)
43 #define local_irq_restore(flags)        mtmsr(flags)
44
45 extern void do_lost_interrupts(unsigned long);
46
47 #define mask_irq(irq) ({if (irq_desc[irq].handler && irq_desc[irq].handler->disable) irq_desc[irq].handler->disable(irq);})
48 #define unmask_irq(irq) ({if (irq_desc[irq].handler && irq_desc[irq].handler->enable) irq_desc[irq].handler->enable(irq);})
49 #define ack_irq(irq) ({if (irq_desc[irq].handler && irq_desc[irq].handler->ack) irq_desc[irq].handler->ack(irq);})
50
51 /* Should we handle this via lost interrupts and IPIs or should we don't care like
52  * we do now ? --BenH.
53  */
54 struct hw_interrupt_type;
55 static inline void hw_resend_irq(struct hw_interrupt_type *h, unsigned int i) {}
56
57
58 #endif /* _PPC_HW_IRQ_H */
59 #endif /* __KERNEL__ */