2 * $Id: irq_control.h,v 1.8 1999/09/15 23:58:48 cort Exp $
4 * Copyright (C) 1999 Cort Dougan <cort@cs.nmt.edu>
6 #ifndef _PPC_IRQ_CONTROL_H
7 #define _PPC_IRQ_CONTROL_H
10 #include <asm/atomic.h>
12 /* Structure describing interrupts */
13 struct hw_interrupt_type
{
14 const char * typename
;
15 void (*startup
)(unsigned int irq
);
16 void (*shutdown
)(unsigned int irq
);
17 void (*enable
)(unsigned int irq
);
18 void (*disable
)(unsigned int irq
);
19 void (*mask_and_ack
)(unsigned int irq
);
24 struct irqaction
*action
;
25 struct hw_interrupt_type
*ctl
;
28 extern struct irqdesc irq_desc
[NR_IRQS
];
30 struct int_control_struct
32 void (*int_cli
)(void);
33 void (*int_sti
)(void);
34 void (*int_restore_flags
)(unsigned long);
35 void (*int_save_flags
)(unsigned long *);
37 extern struct int_control_struct int_control
;
38 extern unsigned long timer_interrupt_intercept
;
39 extern unsigned long do_IRQ_intercept
;
40 void timer_interrupt(struct pt_regs
*);
42 extern void __no_use_sti(void);
43 extern void __no_use_cli(void);
44 extern void __no_use_restore_flags(unsigned long);
45 extern void __no_use_save_flags(unsigned long *);
47 #define __cli() int_control.int_cli()
48 #define __sti() int_control.int_sti()
49 #define __save_flags(flags) int_control.int_save_flags(&flags)
50 #define __restore_flags(flags) int_control.int_restore_flags(flags)
51 #define __save_and_cli(flags) ({__save_flags(flags);__cli();})
53 extern void do_lost_interrupts(unsigned long);
54 extern atomic_t ppc_n_lost_interrupts
;
56 #define mask_irq(irq) ({if (irq_desc[irq].ctl && irq_desc[irq].ctl->disable) irq_desc[irq].ctl->disable(irq);})
57 #define unmask_irq(irq) ({if (irq_desc[irq].ctl && irq_desc[irq].ctl->enable) irq_desc[irq].ctl->enable(irq);})
58 #define mask_and_ack_irq(irq) ({if (irq_desc[irq].ctl && irq_desc[irq].ctl->mask_and_ack) irq_desc[irq].ctl->mask_and_ack(irq);})
60 #endif /* _PPC_IRQ_CONTROL_H */