blob: 0ce6ca588d8c0b89b43a765d35b294cf0cdad9f4 [file] [log] [blame]
Linus Torvalds1da177e2005-04-16 15:20:36 -07001/*
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
13struct irqdesc;
14struct pt_regs;
15struct seq_file;
16
17typedef void (*irq_handler_t)(unsigned int, struct irqdesc *, struct pt_regs *);
18typedef void (*irq_control_t)(unsigned int);
19
20struct 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 * Ask the hardware to re-trigger the IRQ.
37 * Note: This method _must_ _not_ call the interrupt handler.
38 * If you are unable to retrigger the interrupt, do not
39 * provide a function, or if you do, return non-zero.
40 */
41 int (*retrigger)(unsigned int);
42 /*
43 * Set the type of the IRQ.
44 */
Russell King78019072005-09-04 19:43:13 +010045 int (*set_type)(unsigned int, unsigned int);
Linus Torvalds1da177e2005-04-16 15:20:36 -070046 /*
47 * Set wakeup-enable on the selected IRQ
48 */
Russell King78019072005-09-04 19:43:13 +010049 int (*set_wake)(unsigned int, unsigned int);
Linus Torvalds1da177e2005-04-16 15:20:36 -070050
51#ifdef CONFIG_SMP
52 /*
53 * Route an interrupt to a CPU
54 */
55 void (*set_cpu)(struct irqdesc *desc, unsigned int irq, unsigned int cpu);
56#endif
57};
58
59struct irqdesc {
60 irq_handler_t handle;
61 struct irqchip *chip;
62 struct irqaction *action;
63 struct list_head pend;
64 void *chipdata;
65 void *data;
66 unsigned int disable_depth;
67
68 unsigned int triggered: 1; /* IRQ has occurred */
69 unsigned int running : 1; /* IRQ is running */
70 unsigned int pending : 1; /* IRQ is pending */
71 unsigned int probing : 1; /* IRQ in use for a probe */
72 unsigned int probe_ok : 1; /* IRQ can be used for probe */
73 unsigned int valid : 1; /* IRQ claimable */
74 unsigned int noautoenable : 1; /* don't automatically enable IRQ */
75 unsigned int unused :25;
76
77 struct proc_dir_entry *procdir;
78
79#ifdef CONFIG_SMP
80 cpumask_t affinity;
81 unsigned int cpu;
82#endif
83
84 /*
85 * IRQ lock detection
86 */
87 unsigned int lck_cnt;
88 unsigned int lck_pc;
89 unsigned int lck_jif;
90};
91
92extern struct irqdesc irq_desc[];
93
94/*
Russell King664399e2005-09-04 19:45:00 +010095 * Helpful inline function for calling irq descriptor handlers.
96 */
97static inline void desc_handle_irq(unsigned int irq, struct irqdesc *desc, struct pt_regs *regs)
98{
99 desc->handle(irq, desc, regs);
100}
101
102/*
Linus Torvalds1da177e2005-04-16 15:20:36 -0700103 * This is internal. Do not use it.
104 */
105extern void (*init_arch_irq)(void);
106extern void init_FIQ(void);
107extern int show_fiq_list(struct seq_file *, void *);
108void __set_irq_handler(unsigned int irq, irq_handler_t, int);
109
110/*
111 * External stuff.
112 */
113#define set_irq_handler(irq,handler) __set_irq_handler(irq,handler,0)
114#define set_irq_chained_handler(irq,handler) __set_irq_handler(irq,handler,1)
115#define set_irq_data(irq,d) do { irq_desc[irq].data = d; } while (0)
116#define set_irq_chipdata(irq,d) do { irq_desc[irq].chipdata = d; } while (0)
117#define get_irq_chipdata(irq) (irq_desc[irq].chipdata)
118
119void set_irq_chip(unsigned int irq, struct irqchip *);
120void set_irq_flags(unsigned int irq, unsigned int flags);
121
122#define IRQF_VALID (1 << 0)
123#define IRQF_PROBE (1 << 1)
124#define IRQF_NOAUTOEN (1 << 2)
125
126/*
127 * Built-in IRQ handlers.
128 */
129void do_level_IRQ(unsigned int irq, struct irqdesc *desc, struct pt_regs *regs);
130void do_edge_IRQ(unsigned int irq, struct irqdesc *desc, struct pt_regs *regs);
131void do_simple_IRQ(unsigned int irq, struct irqdesc *desc, struct pt_regs *regs);
132void do_bad_IRQ(unsigned int irq, struct irqdesc *desc, struct pt_regs *regs);
133void dummy_mask_unmask_irq(unsigned int irq);
134
135#endif