Linux Kernel
3.7.1
Main Page
Related Pages
Modules
Namespaces
Data Structures
Files
File List
Globals
•
All
Data Structures
Namespaces
Files
Functions
Variables
Typedefs
Enumerations
Enumerator
Macros
Groups
Pages
include
linux
irqdomain.h
Go to the documentation of this file.
1
/*
2
* irq_domain - IRQ translation domains
3
*
4
* Translation infrastructure between hw and linux irq numbers. This is
5
* helpful for interrupt controllers to implement mapping between hardware
6
* irq numbers and the Linux irq number space.
7
*
8
* irq_domains also have a hook for translating device tree interrupt
9
* representation into a hardware irq number that can be mapped back to a
10
* Linux irq number without any extra platform support code.
11
*
12
* Interrupt controller "domain" data structure. This could be defined as a
13
* irq domain controller. That is, it handles the mapping between hardware
14
* and virtual interrupt numbers for a given interrupt domain. The domain
15
* structure is generally created by the PIC code for a given PIC instance
16
* (though a domain can cover more than one PIC if they have a flat number
17
* model). It's the domain callbacks that are responsible for setting the
18
* irq_chip on a given irq_desc after it's been mapped.
19
*
20
* The host code and data structures are agnostic to whether or not
21
* we use an open firmware device-tree. We do have references to struct
22
* device_node in two places: in irq_find_host() to find the host matching
23
* a given interrupt controller node, and of course as an argument to its
24
* counterpart domain->ops->match() callback. However, those are treated as
25
* generic pointers by the core and the fact that it's actually a device-node
26
* pointer is purely a convention between callers and implementation. This
27
* code could thus be used on other architectures by replacing those two
28
* by some sort of arch-specific void * "token" used to identify interrupt
29
* controllers.
30
*/
31
32
#ifndef _LINUX_IRQDOMAIN_H
33
#define _LINUX_IRQDOMAIN_H
34
35
#include <linux/types.h>
36
#include <
linux/radix-tree.h
>
37
38
struct
device_node
;
39
struct
irq_domain
;
40
struct
of_device_id
;
41
42
/* Number of irqs reserved for a legacy isa controller */
43
#define NUM_ISA_INTERRUPTS 16
44
60
struct
irq_domain_ops
{
61
int
(*
match
)(
struct
irq_domain
*
d
,
struct
device_node
*
node
);
62
int
(*
map
)(
struct
irq_domain
*
d
,
unsigned
int
virq,
irq_hw_number_t
hw
);
63
void
(*
unmap
)(
struct
irq_domain
*
d
,
unsigned
int
virq);
64
int
(*
xlate
)(
struct
irq_domain
*
d
,
struct
device_node
*
node
,
65
const
u32
*intspec,
unsigned
int
intsize,
66
unsigned
long
*out_hwirq,
unsigned
int
*out_type);
67
};
68
86
struct
irq_domain
{
87
struct
list_head
link
;
88
89
/* type of reverse mapping_technique */
90
unsigned
int
revmap_type
;
91
union
{
92
struct
{
93
unsigned
int
size
;
94
unsigned
int
first_irq
;
95
irq_hw_number_t
first_hwirq
;
96
}
legacy
;
97
struct
{
98
unsigned
int
size
;
99
unsigned
int
*
revmap
;
100
}
linear
;
101
struct
{
102
unsigned
int
max_irq
;
103
}
nomap
;
104
struct
radix_tree_root
tree
;
105
}
revmap_data
;
106
const
struct
irq_domain_ops
*
ops
;
107
void
*
host_data
;
108
irq_hw_number_t
inval_irq
;
109
110
/* Optional device node pointer */
111
struct
device_node
*
of_node
;
112
};
113
114
#ifdef CONFIG_IRQ_DOMAIN
115
struct
irq_domain
*
irq_domain_add_simple
(
struct
device_node
*
of_node
,
116
unsigned
int
size
,
117
unsigned
int
first_irq
,
118
const
struct
irq_domain_ops
*
ops
,
119
void
*
host_data
);
120
struct
irq_domain
*
irq_domain_add_legacy
(
struct
device_node
*
of_node
,
121
unsigned
int
size
,
122
unsigned
int
first_irq
,
123
irq_hw_number_t
first_hwirq
,
124
const
struct
irq_domain_ops
*
ops
,
125
void
*
host_data
);
126
struct
irq_domain
*
irq_domain_add_linear
(
struct
device_node
*
of_node
,
127
unsigned
int
size
,
128
const
struct
irq_domain_ops
*
ops
,
129
void
*
host_data
);
130
struct
irq_domain
*
irq_domain_add_nomap
(
struct
device_node
*
of_node
,
131
unsigned
int
max_irq
,
132
const
struct
irq_domain_ops
*
ops
,
133
void
*
host_data
);
134
struct
irq_domain
*
irq_domain_add_tree
(
struct
device_node
*
of_node
,
135
const
struct
irq_domain_ops
*
ops
,
136
void
*
host_data
);
137
138
extern
struct
irq_domain
*
irq_find_host
(
struct
device_node
*
node
);
139
extern
void
irq_set_default_host
(
struct
irq_domain
*
host
);
140
141
static
inline
struct
irq_domain
*irq_domain_add_legacy_isa(
142
struct
device_node
*
of_node
,
143
const
struct
irq_domain_ops
*
ops
,
144
void
*
host_data
)
145
{
146
return
irq_domain_add_legacy
(of_node,
NUM_ISA_INTERRUPTS
, 0, 0, ops,
147
host_data);
148
}
149
150
extern
void
irq_domain_remove
(
struct
irq_domain
*
host
);
151
152
extern
int
irq_domain_associate_many
(
struct
irq_domain
*domain,
153
unsigned
int
irq_base,
154
irq_hw_number_t
hwirq_base,
int
count
);
155
static
inline
int
irq_domain_associate(
struct
irq_domain
*domain,
unsigned
int
irq,
156
irq_hw_number_t
hwirq)
157
{
158
return
irq_domain_associate_many
(domain, irq, hwirq, 1);
159
}
160
161
extern
unsigned
int
irq_create_mapping
(
struct
irq_domain
*
host
,
162
irq_hw_number_t
hwirq);
163
extern
void
irq_dispose_mapping
(
unsigned
int
virq);
164
extern
unsigned
int
irq_find_mapping
(
struct
irq_domain
*
host
,
165
irq_hw_number_t
hwirq);
166
extern
unsigned
int
irq_create_direct_mapping
(
struct
irq_domain
*
host
);
167
extern
int
irq_create_strict_mappings
(
struct
irq_domain
*domain,
168
unsigned
int
irq_base,
169
irq_hw_number_t
hwirq_base,
int
count
);
170
171
static
inline
int
irq_create_identity_mapping(
struct
irq_domain
*
host
,
172
irq_hw_number_t
hwirq)
173
{
174
return
irq_create_strict_mappings
(host, hwirq, hwirq, 1);
175
}
176
177
extern
unsigned
int
irq_linear_revmap
(
struct
irq_domain
*
host
,
178
irq_hw_number_t
hwirq);
179
180
extern
const
struct
irq_domain_ops
irq_domain_simple_ops
;
181
182
/* stock xlate functions */
183
int
irq_domain_xlate_onecell
(
struct
irq_domain
*
d
,
struct
device_node
*ctrlr,
184
const
u32
*intspec,
unsigned
int
intsize,
185
irq_hw_number_t
*out_hwirq,
unsigned
int
*out_type);
186
int
irq_domain_xlate_twocell
(
struct
irq_domain
*
d
,
struct
device_node
*ctrlr,
187
const
u32
*intspec,
unsigned
int
intsize,
188
irq_hw_number_t
*out_hwirq,
unsigned
int
*out_type);
189
int
irq_domain_xlate_onetwocell
(
struct
irq_domain
*
d
,
struct
device_node
*ctrlr,
190
const
u32
*intspec,
unsigned
int
intsize,
191
irq_hw_number_t
*out_hwirq,
unsigned
int
*out_type);
192
193
#if defined(CONFIG_OF_IRQ)
194
extern
void
irq_domain_generate_simple(
const
struct
of_device_id
*
match
,
195
u64
phys_base,
unsigned
int
irq_start);
196
#else
/* CONFIG_OF_IRQ */
197
static
inline
void
irq_domain_generate_simple(
const
struct
of_device_id
*
match
,
198
u64
phys_base,
unsigned
int
irq_start) { }
199
#endif
/* !CONFIG_OF_IRQ */
200
201
#else
/* CONFIG_IRQ_DOMAIN */
202
static
inline
void
irq_dispose_mapping
(
unsigned
int
virq) { }
203
#endif
/* !CONFIG_IRQ_DOMAIN */
204
205
#endif
/* _LINUX_IRQDOMAIN_H */
Generated on Thu Jan 10 2013 14:51:41 for Linux Kernel by
1.8.2