Merge master.kernel.org:/pub/scm/linux/kernel/git/airlied/drm-2.6
[linux-2.6] / include / asm-arm26 / irqchip.h
1 /*
2  *  linux/include/asm-arm/mach/irq.h
3  *
4  *  Copyright (C) 1995-2000 Russell King.
5  *
6  * This program is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License version 2 as
8  * published by the Free Software Foundation.
9  */
10 #ifndef __ASM_ARM_MACH_IRQ_H
11 #define __ASM_ARM_MACH_IRQ_H
12
13 struct irqdesc;
14 struct pt_regs;
15 struct seq_file;
16
17 typedef void (*irq_handler_t)(unsigned int, struct irqdesc *, struct pt_regs *);
18 typedef void (*irq_control_t)(unsigned int);
19
20 struct irqchip {
21         /*
22          * Acknowledge the IRQ.
23          * If this is a level-based IRQ, then it is expected to mask the IRQ
24          * as well.
25          */
26         void (*ack)(unsigned int);
27         /*
28          * Mask the IRQ in hardware.
29          */
30         void (*mask)(unsigned int);
31         /*
32          * Unmask the IRQ in hardware.
33          */
34         void (*unmask)(unsigned int);
35         /*
36          * Re-run the IRQ
37          */
38         void (*rerun)(unsigned int);
39         /*
40          * Set the type of the IRQ.
41          */
42         int (*type)(unsigned int, unsigned int);
43 };
44
45 struct irqdesc {
46         irq_handler_t   handle;
47         struct irqchip  *chip;
48         struct irqaction *action;
49
50         unsigned int    enabled  : 1;           /* IRQ is currently enabled   */
51         unsigned int    triggered: 1;           /* IRQ has occurred           */
52         unsigned int    running  : 1;           /* IRQ is running             */
53         unsigned int    pending  : 1;           /* IRQ is pending             */
54         unsigned int    probing  : 1;           /* IRQ in use for a probe     */
55         unsigned int    probe_ok : 1;           /* IRQ can be used for probe  */
56         unsigned int    valid    : 1;           /* IRQ claimable              */
57         unsigned int    noautoenable : 1;       /* don't automatically enable IRQ */
58         unsigned int    unused   :23;
59         unsigned int    depth;                  /* disable depth              */
60
61         /*
62          * IRQ lock detection
63          */
64         unsigned int    lck_cnt;
65         unsigned int    lck_pc;
66         unsigned int    lck_jif;
67 };
68
69 extern struct irqdesc irq_desc[];
70
71 /*
72  * This is internal.  Do not use it.
73  */
74 extern void (*init_arch_irq)(void);
75 extern void init_FIQ(void);
76 extern int show_fiq_list(struct seq_file *, void *);
77 void __set_irq_handler(unsigned int irq, irq_handler_t, int);
78
79 /*
80  * External stuff.
81  */
82 #define set_irq_handler(irq,handler)            __set_irq_handler(irq,handler,0)
83 #define set_irq_chained_handler(irq,handler)    __set_irq_handler(irq,handler,1)
84
85 void set_irq_chip(unsigned int irq, struct irqchip *);
86 void set_irq_flags(unsigned int irq, unsigned int flags);
87
88 #define IRQF_VALID      (1 << 0)
89 #define IRQF_PROBE      (1 << 1)
90 #define IRQF_NOAUTOEN   (1 << 2)
91
92 /*
93  * Built-in IRQ handlers.
94  */
95 void do_level_IRQ(unsigned int irq, struct irqdesc *desc, struct pt_regs *regs);
96 void do_edge_IRQ(unsigned int irq, struct irqdesc *desc, struct pt_regs *regs);
97 void do_simple_IRQ(unsigned int irq, struct irqdesc *desc, struct pt_regs *regs);
98 void do_bad_IRQ(unsigned int irq, struct irqdesc *desc, struct pt_regs *regs);
99 void dummy_mask_unmask_irq(unsigned int irq);
100
101 #endif