]>
Commit | Line | Data |
---|---|---|
1da177e4 LT |
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 */ |