Merge master.kernel.org:/home/rmk/linux-2.6-serial
[linux-2.6] / include / asm-frv / irq-routing.h
1 /* irq-routing.h: multiplexed IRQ routing
2  *
3  * Copyright (C) 2004 Red Hat, Inc. All Rights Reserved.
4  * Written by David Howells (dhowells@redhat.com)
5  *
6  * This program is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU General Public License
8  * as published by the Free Software Foundation; either version
9  * 2 of the License, or (at your option) any later version.
10  */
11
12 #ifndef _ASM_IRQ_ROUTING_H
13 #define _ASM_IRQ_ROUTING_H
14
15 #ifndef __ASSEMBLY__
16
17 #include <linux/spinlock.h>
18 #include <asm/irq.h>
19
20 struct irq_source;
21 struct irq_level;
22
23 /*
24  * IRQ action distribution sets
25  */
26 struct irq_group {
27         int                     first_irq;      /* first IRQ distributed here */
28         void (*control)(struct irq_group *group, int index, int on);
29
30         struct irqaction        *actions[NR_IRQ_ACTIONS_PER_GROUP];     /* IRQ action chains */
31         struct irq_source       *sources[NR_IRQ_ACTIONS_PER_GROUP];     /* IRQ sources */
32         int                     disable_cnt[NR_IRQ_ACTIONS_PER_GROUP];  /* disable counts */
33 };
34
35 /*
36  * IRQ source manager
37  */
38 struct irq_source {
39         struct irq_source       *next;
40         struct irq_level        *level;
41         const char              *muxname;
42         volatile void __iomem   *muxdata;
43         unsigned long           irqmask;
44
45         void (*doirq)(struct irq_source *source);
46 };
47
48 /*
49  * IRQ level management (per CPU IRQ priority / entry vector)
50  */
51 struct irq_level {
52         int                     usage;
53         int                     disable_count;
54         unsigned long           flags;          /* current SA_INTERRUPT and SA_SHIRQ settings */
55         spinlock_t              lock;
56         struct irq_source       *sources;
57 };
58
59 extern struct irq_level frv_irq_levels[16];
60 extern struct irq_group *irq_groups[NR_IRQ_GROUPS];
61
62 extern void frv_irq_route(struct irq_source *source, int irqlevel);
63 extern void frv_irq_route_external(struct irq_source *source, int irq);
64 extern void frv_irq_set_group(struct irq_group *group);
65 extern void distribute_irqs(struct irq_group *group, unsigned long irqmask);
66 extern void route_cpu_irqs(void);
67
68 #endif /* !__ASSEMBLY__ */
69
70 #endif /* _ASM_IRQ_ROUTING_H */