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
of.h
Go to the documentation of this file.
1
#ifndef _LINUX_OF_H
2
#define _LINUX_OF_H
3
/*
4
* Definitions for talking to the Open Firmware PROM on
5
* Power Macintosh and other computers.
6
*
7
* Copyright (C) 1996-2005 Paul Mackerras.
8
*
9
* Updates for PPC64 by Peter Bergner & David Engebretsen, IBM Corp.
10
* Updates for SPARC64 by David S. Miller
11
* Derived from PowerPC and Sparc prom.h files by Stephen Rothwell, IBM Corp.
12
*
13
* This program is free software; you can redistribute it and/or
14
* modify it under the terms of the GNU General Public License
15
* as published by the Free Software Foundation; either version
16
* 2 of the License, or (at your option) any later version.
17
*/
18
#include <linux/types.h>
19
#include <linux/bitops.h>
20
#include <linux/errno.h>
21
#include <
linux/kref.h
>
22
#include <
linux/mod_devicetable.h
>
23
#include <
linux/spinlock.h
>
24
#include <
linux/topology.h
>
25
26
#include <asm/byteorder.h>
27
#include <asm/errno.h>
28
29
typedef
u32
phandle
;
30
typedef
u32
ihandle
;
31
32
struct
property
{
33
char
*
name
;
34
int
length
;
35
void
*
value
;
36
struct
property
*
next
;
37
unsigned
long
_flags
;
38
unsigned
int
unique_id
;
39
};
40
41
#if defined(CONFIG_SPARC)
42
struct
of_irq_controller;
43
#endif
44
45
struct
device_node
{
46
const
char
*
name
;
47
const
char
*
type
;
48
phandle
phandle
;
49
char
*
full_name
;
50
51
struct
property
*
properties
;
52
struct
property
*
deadprops
;
/* removed properties */
53
struct
device_node
*
parent
;
54
struct
device_node
*
child
;
55
struct
device_node
*
sibling
;
56
struct
device_node
*
next
;
/* next device of same type */
57
struct
device_node
*
allnext
;
/* next in list of all nodes */
58
struct
proc_dir_entry
*
pde
;
/* this node's proc directory */
59
struct
kref
kref
;
60
unsigned
long
_flags
;
61
void
*
data
;
62
#if defined(CONFIG_SPARC)
63
char
*path_component_name;
64
unsigned
int
unique_id
;
65
struct
of_irq_controller *
irq_trans
;
66
#endif
67
};
68
69
#define MAX_PHANDLE_ARGS 8
70
struct
of_phandle_args
{
71
struct
device_node
*
np
;
72
int
args_count
;
73
uint32_t
args
[
MAX_PHANDLE_ARGS
];
74
};
75
76
#ifdef CONFIG_OF_DYNAMIC
77
extern
struct
device_node
*of_node_get(
struct
device_node
*
node
);
78
extern
void
of_node_put(
struct
device_node
*
node
);
79
#else
/* CONFIG_OF_DYNAMIC */
80
/* Dummy ref counting routines - to be implemented later */
81
static
inline
struct
device_node
*of_node_get(
struct
device_node
*
node
)
82
{
83
return
node
;
84
}
85
static
inline
void
of_node_put(
struct
device_node
*
node
) { }
86
#endif
/* !CONFIG_OF_DYNAMIC */
87
88
#ifdef CONFIG_OF
89
90
/* Pointer for first entry in chain of all nodes. */
91
extern
struct
device_node
*
allnodes
;
92
extern
struct
device_node
*
of_chosen
;
93
extern
struct
device_node
*
of_aliases
;
94
extern
rwlock_t
devtree_lock;
95
96
static
inline
bool
of_have_populated_dt(
void
)
97
{
98
return
allnodes !=
NULL
;
99
}
100
101
static
inline
bool
of_node_is_root(
const
struct
device_node
*
node
)
102
{
103
return
node && (node->
parent
==
NULL
);
104
}
105
106
static
inline
int
of_node_check_flag(
struct
device_node
*
n
,
unsigned
long
flag
)
107
{
108
return
test_bit
(flag, &n->
_flags
);
109
}
110
111
static
inline
void
of_node_set_flag(
struct
device_node
*
n
,
unsigned
long
flag
)
112
{
113
set_bit
(flag, &n->
_flags
);
114
}
115
116
extern
struct
device_node
*
of_find_all_nodes
(
struct
device_node
*
prev
);
117
118
/*
119
* OF address retrieval & translation
120
*/
121
122
/* Helper to read a big number; size is in cells (not bytes) */
123
static
inline
u64
of_read_number(
const
__be32
*cell,
int
size
)
124
{
125
u64
r
= 0;
126
while
(size--)
127
r = (r << 32) |
be32_to_cpu
(*(cell++));
128
return
r
;
129
}
130
131
/* Like of_read_number, but we want an unsigned long result */
132
static
inline
unsigned
long
of_read_ulong(
const
__be32
*cell,
int
size)
133
{
134
/* toss away upper bits if unsigned long is smaller than u64 */
135
return
of_read_number(cell, size);
136
}
137
138
#include <asm/prom.h>
139
140
/* Default #address and #size cells. Allow arch asm/prom.h to override */
141
#if !defined(OF_ROOT_NODE_ADDR_CELLS_DEFAULT)
142
#define OF_ROOT_NODE_ADDR_CELLS_DEFAULT 1
143
#define OF_ROOT_NODE_SIZE_CELLS_DEFAULT 1
144
#endif
145
146
/* Default string compare functions, Allow arch asm/prom.h to override */
147
#if !defined(of_compat_cmp)
148
#define of_compat_cmp(s1, s2, l) strcasecmp((s1), (s2))
149
#define of_prop_cmp(s1, s2) strcmp((s1), (s2))
150
#define of_node_cmp(s1, s2) strcasecmp((s1), (s2))
151
#endif
152
153
/* flag descriptions */
154
#define OF_DYNAMIC 1
/* node and properties were allocated via kmalloc */
155
#define OF_DETACHED 2
/* node has been detached from the device tree */
156
157
#define OF_IS_DYNAMIC(x) test_bit(OF_DYNAMIC, &x->_flags)
158
#define OF_MARK_DYNAMIC(x) set_bit(OF_DYNAMIC, &x->_flags)
159
160
#define OF_BAD_ADDR ((u64)-1)
161
162
static
inline
const
char
* of_node_full_name(
struct
device_node
*np)
163
{
164
return
np ? np->
full_name
:
"<no-node>"
;
165
}
166
167
extern
struct
device_node
*
of_find_node_by_name
(
struct
device_node
*
from
,
168
const
char
*
name
);
169
#define for_each_node_by_name(dn, name) \
170
for (dn = of_find_node_by_name(NULL, name); dn; \
171
dn = of_find_node_by_name(dn, name))
172
extern
struct
device_node
*
of_find_node_by_type
(
struct
device_node
*
from
,
173
const
char
*
type
);
174
#define for_each_node_by_type(dn, type) \
175
for (dn = of_find_node_by_type(NULL, type); dn; \
176
dn = of_find_node_by_type(dn, type))
177
extern
struct
device_node
*
of_find_compatible_node
(
struct
device_node
*
from
,
178
const
char
*
type
,
const
char
*compat);
179
#define for_each_compatible_node(dn, type, compatible) \
180
for (dn = of_find_compatible_node(NULL, type, compatible); dn; \
181
dn = of_find_compatible_node(dn, type, compatible))
182
extern
struct
device_node
*
of_find_matching_node
(
struct
device_node
*
from
,
183
const
struct
of_device_id
*matches);
184
#define for_each_matching_node(dn, matches) \
185
for (dn = of_find_matching_node(NULL, matches); dn; \
186
dn = of_find_matching_node(dn, matches))
187
extern
struct
device_node
*
of_find_node_by_path
(
const
char
*
path
);
188
extern
struct
device_node
*
of_find_node_by_phandle
(
phandle
handle
);
189
extern
struct
device_node
*
of_get_parent
(
const
struct
device_node
*
node
);
190
extern
struct
device_node
*
of_get_next_parent
(
struct
device_node
*
node
);
191
extern
struct
device_node
*
of_get_next_child
(
const
struct
device_node
*
node
,
192
struct
device_node
*
prev
);
193
extern
struct
device_node
*
of_get_next_available_child
(
194
const
struct
device_node
*
node
,
struct
device_node
*
prev
);
195
196
extern
struct
device_node
*
of_get_child_by_name
(
const
struct
device_node
*
node
,
197
const
char
*
name
);
198
#define for_each_child_of_node(parent, child) \
199
for (child = of_get_next_child(parent, NULL); child != NULL; \
200
child = of_get_next_child(parent, child))
201
202
#define for_each_available_child_of_node(parent, child) \
203
for (child = of_get_next_available_child(parent, NULL); child != NULL; \
204
child = of_get_next_available_child(parent, child))
205
206
static
inline
int
of_get_child_count(
const
struct
device_node
*np)
207
{
208
struct
device_node
*
child
;
209
int
num
= 0;
210
211
for_each_child_of_node
(np, child)
212
num++;
213
214
return
num;
215
}
216
217
extern
struct
device_node
*
of_find_node_with_property
(
218
struct
device_node
*
from
,
const
char
*prop_name);
219
#define for_each_node_with_property(dn, prop_name) \
220
for (dn = of_find_node_with_property(NULL, prop_name); dn; \
221
dn = of_find_node_with_property(dn, prop_name))
222
223
extern
struct
property
*
of_find_property
(
const
struct
device_node
*np,
224
const
char
*
name
,
225
int
*lenp);
226
extern
int
of_property_read_u32_array
(
const
struct
device_node
*np,
227
const
char
*propname,
228
u32
*out_values,
229
size_t
sz);
230
extern
int
of_property_read_u64
(
const
struct
device_node
*np,
231
const
char
*propname,
u64
*out_value);
232
233
extern
int
of_property_read_string
(
struct
device_node
*np,
234
const
char
*propname,
235
const
char
**out_string);
236
extern
int
of_property_read_string_index
(
struct
device_node
*np,
237
const
char
*propname,
238
int
index
,
const
char
**output);
239
extern
int
of_property_match_string
(
struct
device_node
*np,
240
const
char
*propname,
241
const
char
*
string
);
242
extern
int
of_property_count_strings
(
struct
device_node
*np,
243
const
char
*propname);
244
extern
int
of_device_is_compatible
(
const
struct
device_node
*
device
,
245
const
char
*);
246
extern
int
of_device_is_available
(
const
struct
device_node
*
device
);
247
extern
const
void
*
of_get_property
(
const
struct
device_node
*
node
,
248
const
char
*
name
,
249
int
*lenp);
250
#define for_each_property_of_node(dn, pp) \
251
for (pp = dn->properties; pp != NULL; pp = pp->next)
252
253
extern
int
of_n_addr_cells
(
struct
device_node
*np);
254
extern
int
of_n_size_cells
(
struct
device_node
*np);
255
extern
const
struct
of_device_id
*
of_match_node
(
256
const
struct
of_device_id
*matches,
const
struct
device_node
*
node
);
257
extern
int
of_modalias_node
(
struct
device_node
*
node
,
char
*modalias,
int
len);
258
extern
struct
device_node
*
of_parse_phandle
(
struct
device_node
*np,
259
const
char
*phandle_name,
260
int
index
);
261
extern
int
of_parse_phandle_with_args
(
struct
device_node
*np,
262
const
char
*list_name,
const
char
*cells_name,
int
index
,
263
struct
of_phandle_args
*out_args);
264
265
extern
void
of_alias_scan
(
void
* (*dt_alloc)(
u64
size,
u64
align
));
266
extern
int
of_alias_get_id
(
struct
device_node
*np,
const
char
*stem);
267
268
extern
int
of_machine_is_compatible
(
const
char
*compat);
269
270
extern
int
prom_add_property
(
struct
device_node
* np,
struct
property
* prop);
271
extern
int
prom_remove_property
(
struct
device_node
*np,
struct
property
*prop);
272
extern
int
prom_update_property
(
struct
device_node
*np,
273
struct
property
*newprop);
274
275
#if defined(CONFIG_OF_DYNAMIC)
276
/* For updating the device tree at runtime */
277
extern
void
of_attach_node(
struct
device_node
*);
278
extern
void
of_detach_node(
struct
device_node
*);
279
#endif
280
281
#define of_match_ptr(_ptr) (_ptr)
282
283
/*
284
* struct property *prop;
285
* const __be32 *p;
286
* u32 u;
287
*
288
* of_property_for_each_u32(np, "propname", prop, p, u)
289
* printk("U32 value: %x\n", u);
290
*/
291
const
__be32
*
of_prop_next_u32
(
struct
property
*prop,
const
__be32
*
cur
,
292
u32
*pu);
293
#define of_property_for_each_u32(np, propname, prop, p, u) \
294
for (prop = of_find_property(np, propname, NULL), \
295
p = of_prop_next_u32(prop, NULL, &u); \
296
p; \
297
p = of_prop_next_u32(prop, p, &u))
298
299
/*
300
* struct property *prop;
301
* const char *s;
302
*
303
* of_property_for_each_string(np, "propname", prop, s)
304
* printk("String value: %s\n", s);
305
*/
306
const
char
*
of_prop_next_string
(
struct
property
*prop,
const
char
*
cur
);
307
#define of_property_for_each_string(np, propname, prop, s) \
308
for (prop = of_find_property(np, propname, NULL), \
309
s = of_prop_next_string(prop, NULL); \
310
s; \
311
s = of_prop_next_string(prop, s))
312
313
#else
/* CONFIG_OF */
314
315
static
inline
const
char
* of_node_full_name(
struct
device_node
*np)
316
{
317
return
"<no-node>"
;
318
}
319
320
static
inline
struct
device_node
*
of_find_node_by_name
(
struct
device_node
*from,
321
const
char
*
name
)
322
{
323
return
NULL
;
324
}
325
326
static
inline
bool
of_have_populated_dt(
void
)
327
{
328
return
false
;
329
}
330
331
#define for_each_child_of_node(parent, child) \
332
while (0)
333
334
static
inline
struct
device_node
*
of_get_child_by_name
(
335
const
struct
device_node
*
node
,
336
const
char
*
name
)
337
{
338
return
NULL
;
339
}
340
341
static
inline
int
of_get_child_count(
const
struct
device_node
*np)
342
{
343
return
0;
344
}
345
346
static
inline
int
of_device_is_compatible
(
const
struct
device_node
*
device
,
347
const
char
*
name
)
348
{
349
return
0;
350
}
351
352
static
inline
struct
property
*
of_find_property
(
const
struct
device_node
*np,
353
const
char
*
name
,
354
int
*lenp)
355
{
356
return
NULL
;
357
}
358
359
static
inline
struct
device_node
*
of_find_compatible_node
(
360
struct
device_node
*from,
361
const
char
*
type
,
362
const
char
*compat)
363
{
364
return
NULL
;
365
}
366
367
static
inline
int
of_property_read_u32_array
(
const
struct
device_node
*np,
368
const
char
*propname,
369
u32
*out_values,
size_t
sz)
370
{
371
return
-
ENOSYS
;
372
}
373
374
static
inline
int
of_property_read_string
(
struct
device_node
*np,
375
const
char
*propname,
376
const
char
**out_string)
377
{
378
return
-
ENOSYS
;
379
}
380
381
static
inline
int
of_property_read_string_index
(
struct
device_node
*np,
382
const
char
*propname,
int
index
,
383
const
char
**out_string)
384
{
385
return
-
ENOSYS
;
386
}
387
388
static
inline
int
of_property_count_strings
(
struct
device_node
*np,
389
const
char
*propname)
390
{
391
return
-
ENOSYS
;
392
}
393
394
static
inline
const
void
*
of_get_property
(
const
struct
device_node
*
node
,
395
const
char
*
name
,
396
int
*lenp)
397
{
398
return
NULL
;
399
}
400
401
static
inline
int
of_property_read_u64
(
const
struct
device_node
*np,
402
const
char
*propname,
u64
*out_value)
403
{
404
return
-
ENOSYS
;
405
}
406
407
static
inline
int
of_property_match_string
(
struct
device_node
*np,
408
const
char
*propname,
409
const
char
*
string
)
410
{
411
return
-
ENOSYS
;
412
}
413
414
static
inline
struct
device_node
*
of_parse_phandle
(
struct
device_node
*np,
415
const
char
*phandle_name,
416
int
index
)
417
{
418
return
NULL
;
419
}
420
421
static
inline
int
of_parse_phandle_with_args
(
struct
device_node
*np,
422
const
char
*list_name,
423
const
char
*cells_name,
424
int
index
,
425
struct
of_phandle_args
*out_args)
426
{
427
return
-
ENOSYS
;
428
}
429
430
static
inline
int
of_alias_get_id
(
struct
device_node
*np,
const
char
*stem)
431
{
432
return
-
ENOSYS
;
433
}
434
435
static
inline
int
of_machine_is_compatible
(
const
char
*compat)
436
{
437
return
0;
438
}
439
440
#define of_match_ptr(_ptr) NULL
441
#define of_match_node(_matches, _node) NULL
442
#define of_property_for_each_u32(np, propname, prop, p, u) \
443
while (0)
444
#define of_property_for_each_string(np, propname, prop, s) \
445
while (0)
446
#endif
/* CONFIG_OF */
447
448
#ifndef of_node_to_nid
449
static
inline
int
of_node_to_nid
(
struct
device_node
*np)
450
{
451
return
numa_node_id
();
452
}
453
454
#define of_node_to_nid of_node_to_nid
455
#endif
456
465
static
inline
bool
of_property_read_bool(
const
struct
device_node
*np,
466
const
char
*propname)
467
{
468
struct
property
*prop =
of_find_property
(np, propname,
NULL
);
469
470
return
prop ?
true
:
false
;
471
}
472
473
static
inline
int
of_property_read_u32(
const
struct
device_node
*np,
474
const
char
*propname,
475
u32
*out_value)
476
{
477
return
of_property_read_u32_array
(np, propname, out_value, 1);
478
}
479
480
#endif
/* _LINUX_OF_H */
Generated on Thu Jan 10 2013 13:13:11 for Linux Kernel by
1.8.2