diff options
author | Stephen Neuendorffer <stephen.neuendorffer@xilinx.com> | 2010-11-18 18:55:01 -0500 |
---|---|---|
committer | Grant Likely <grant.likely@secretlab.ca> | 2010-12-29 19:00:26 -0500 |
commit | 57d00ecf90cc9854973da2960012b734acc26e51 (patch) | |
tree | 6f1f3ce92b5e21646f4ec75766e3a2f5cba11fde /drivers/of/fdt.c | |
parent | a40d6c4cf12d87980c10b230df435d0f56adc40b (diff) |
of/flattree: Reorder unflatten_dt_node
Move unflatten_dt_node to be grouped with non-__init functions.
Signed-off-by: Stephen Neuendorffer <stephen.neuendorffer@xilinx.com>
Signed-off-by: Grant Likely <grant.likely@secretlab.ca>
Diffstat (limited to 'drivers/of/fdt.c')
-rw-r--r-- | drivers/of/fdt.c | 218 |
1 files changed, 109 insertions, 109 deletions
diff --git a/drivers/of/fdt.c b/drivers/of/fdt.c index cf74e546faf2..71edc9cecd62 100644 --- a/drivers/of/fdt.c +++ b/drivers/of/fdt.c | |||
@@ -97,115 +97,6 @@ int of_fdt_is_compatible(struct boot_param_header *blob, | |||
97 | return 0; | 97 | return 0; |
98 | } | 98 | } |
99 | 99 | ||
100 | /* Everything below here references initial_boot_params directly. */ | ||
101 | int __initdata dt_root_addr_cells; | ||
102 | int __initdata dt_root_size_cells; | ||
103 | |||
104 | struct boot_param_header *initial_boot_params; | ||
105 | |||
106 | #ifdef CONFIG_OF_EARLY_FLATTREE | ||
107 | |||
108 | /** | ||
109 | * of_scan_flat_dt - scan flattened tree blob and call callback on each. | ||
110 | * @it: callback function | ||
111 | * @data: context data pointer | ||
112 | * | ||
113 | * This function is used to scan the flattened device-tree, it is | ||
114 | * used to extract the memory information at boot before we can | ||
115 | * unflatten the tree | ||
116 | */ | ||
117 | int __init of_scan_flat_dt(int (*it)(unsigned long node, | ||
118 | const char *uname, int depth, | ||
119 | void *data), | ||
120 | void *data) | ||
121 | { | ||
122 | unsigned long p = ((unsigned long)initial_boot_params) + | ||
123 | be32_to_cpu(initial_boot_params->off_dt_struct); | ||
124 | int rc = 0; | ||
125 | int depth = -1; | ||
126 | |||
127 | do { | ||
128 | u32 tag = be32_to_cpup((__be32 *)p); | ||
129 | char *pathp; | ||
130 | |||
131 | p += 4; | ||
132 | if (tag == OF_DT_END_NODE) { | ||
133 | depth--; | ||
134 | continue; | ||
135 | } | ||
136 | if (tag == OF_DT_NOP) | ||
137 | continue; | ||
138 | if (tag == OF_DT_END) | ||
139 | break; | ||
140 | if (tag == OF_DT_PROP) { | ||
141 | u32 sz = be32_to_cpup((__be32 *)p); | ||
142 | p += 8; | ||
143 | if (be32_to_cpu(initial_boot_params->version) < 0x10) | ||
144 | p = ALIGN(p, sz >= 8 ? 8 : 4); | ||
145 | p += sz; | ||
146 | p = ALIGN(p, 4); | ||
147 | continue; | ||
148 | } | ||
149 | if (tag != OF_DT_BEGIN_NODE) { | ||
150 | pr_err("Invalid tag %x in flat device tree!\n", tag); | ||
151 | return -EINVAL; | ||
152 | } | ||
153 | depth++; | ||
154 | pathp = (char *)p; | ||
155 | p = ALIGN(p + strlen(pathp) + 1, 4); | ||
156 | if ((*pathp) == '/') { | ||
157 | char *lp, *np; | ||
158 | for (lp = NULL, np = pathp; *np; np++) | ||
159 | if ((*np) == '/') | ||
160 | lp = np+1; | ||
161 | if (lp != NULL) | ||
162 | pathp = lp; | ||
163 | } | ||
164 | rc = it(p, pathp, depth, data); | ||
165 | if (rc != 0) | ||
166 | break; | ||
167 | } while (1); | ||
168 | |||
169 | return rc; | ||
170 | } | ||
171 | |||
172 | /** | ||
173 | * of_get_flat_dt_root - find the root node in the flat blob | ||
174 | */ | ||
175 | unsigned long __init of_get_flat_dt_root(void) | ||
176 | { | ||
177 | unsigned long p = ((unsigned long)initial_boot_params) + | ||
178 | be32_to_cpu(initial_boot_params->off_dt_struct); | ||
179 | |||
180 | while (be32_to_cpup((__be32 *)p) == OF_DT_NOP) | ||
181 | p += 4; | ||
182 | BUG_ON(be32_to_cpup((__be32 *)p) != OF_DT_BEGIN_NODE); | ||
183 | p += 4; | ||
184 | return ALIGN(p + strlen((char *)p) + 1, 4); | ||
185 | } | ||
186 | |||
187 | /** | ||
188 | * of_get_flat_dt_prop - Given a node in the flat blob, return the property ptr | ||
189 | * | ||
190 | * This function can be used within scan_flattened_dt callback to get | ||
191 | * access to properties | ||
192 | */ | ||
193 | void *__init of_get_flat_dt_prop(unsigned long node, const char *name, | ||
194 | unsigned long *size) | ||
195 | { | ||
196 | return of_fdt_get_property(initial_boot_params, node, name, size); | ||
197 | } | ||
198 | |||
199 | /** | ||
200 | * of_flat_dt_is_compatible - Return true if given node has compat in compatible list | ||
201 | * @node: node to test | ||
202 | * @compat: compatible string to compare with compatible list. | ||
203 | */ | ||
204 | int __init of_flat_dt_is_compatible(unsigned long node, const char *compat) | ||
205 | { | ||
206 | return of_fdt_is_compatible(initial_boot_params, node, compat); | ||
207 | } | ||
208 | |||
209 | static void *unflatten_dt_alloc(unsigned long *mem, unsigned long size, | 100 | static void *unflatten_dt_alloc(unsigned long *mem, unsigned long size, |
210 | unsigned long align) | 101 | unsigned long align) |
211 | { | 102 | { |
@@ -421,6 +312,115 @@ unsigned long unflatten_dt_node(struct boot_param_header *blob, | |||
421 | return mem; | 312 | return mem; |
422 | } | 313 | } |
423 | 314 | ||
315 | /* Everything below here references initial_boot_params directly. */ | ||
316 | int __initdata dt_root_addr_cells; | ||
317 | int __initdata dt_root_size_cells; | ||
318 | |||
319 | struct boot_param_header *initial_boot_params; | ||
320 | |||
321 | #ifdef CONFIG_OF_EARLY_FLATTREE | ||
322 | |||
323 | /** | ||
324 | * of_scan_flat_dt - scan flattened tree blob and call callback on each. | ||
325 | * @it: callback function | ||
326 | * @data: context data pointer | ||
327 | * | ||
328 | * This function is used to scan the flattened device-tree, it is | ||
329 | * used to extract the memory information at boot before we can | ||
330 | * unflatten the tree | ||
331 | */ | ||
332 | int __init of_scan_flat_dt(int (*it)(unsigned long node, | ||
333 | const char *uname, int depth, | ||
334 | void *data), | ||
335 | void *data) | ||
336 | { | ||
337 | unsigned long p = ((unsigned long)initial_boot_params) + | ||
338 | be32_to_cpu(initial_boot_params->off_dt_struct); | ||
339 | int rc = 0; | ||
340 | int depth = -1; | ||
341 | |||
342 | do { | ||
343 | u32 tag = be32_to_cpup((__be32 *)p); | ||
344 | char *pathp; | ||
345 | |||
346 | p += 4; | ||
347 | if (tag == OF_DT_END_NODE) { | ||
348 | depth--; | ||
349 | continue; | ||
350 | } | ||
351 | if (tag == OF_DT_NOP) | ||
352 | continue; | ||
353 | if (tag == OF_DT_END) | ||
354 | break; | ||
355 | if (tag == OF_DT_PROP) { | ||
356 | u32 sz = be32_to_cpup((__be32 *)p); | ||
357 | p += 8; | ||
358 | if (be32_to_cpu(initial_boot_params->version) < 0x10) | ||
359 | p = ALIGN(p, sz >= 8 ? 8 : 4); | ||
360 | p += sz; | ||
361 | p = ALIGN(p, 4); | ||
362 | continue; | ||
363 | } | ||
364 | if (tag != OF_DT_BEGIN_NODE) { | ||
365 | pr_err("Invalid tag %x in flat device tree!\n", tag); | ||
366 | return -EINVAL; | ||
367 | } | ||
368 | depth++; | ||
369 | pathp = (char *)p; | ||
370 | p = ALIGN(p + strlen(pathp) + 1, 4); | ||
371 | if ((*pathp) == '/') { | ||
372 | char *lp, *np; | ||
373 | for (lp = NULL, np = pathp; *np; np++) | ||
374 | if ((*np) == '/') | ||
375 | lp = np+1; | ||
376 | if (lp != NULL) | ||
377 | pathp = lp; | ||
378 | } | ||
379 | rc = it(p, pathp, depth, data); | ||
380 | if (rc != 0) | ||
381 | break; | ||
382 | } while (1); | ||
383 | |||
384 | return rc; | ||
385 | } | ||
386 | |||
387 | /** | ||
388 | * of_get_flat_dt_root - find the root node in the flat blob | ||
389 | */ | ||
390 | unsigned long __init of_get_flat_dt_root(void) | ||
391 | { | ||
392 | unsigned long p = ((unsigned long)initial_boot_params) + | ||
393 | be32_to_cpu(initial_boot_params->off_dt_struct); | ||
394 | |||
395 | while (be32_to_cpup((__be32 *)p) == OF_DT_NOP) | ||
396 | p += 4; | ||
397 | BUG_ON(be32_to_cpup((__be32 *)p) != OF_DT_BEGIN_NODE); | ||
398 | p += 4; | ||
399 | return ALIGN(p + strlen((char *)p) + 1, 4); | ||
400 | } | ||
401 | |||
402 | /** | ||
403 | * of_get_flat_dt_prop - Given a node in the flat blob, return the property ptr | ||
404 | * | ||
405 | * This function can be used within scan_flattened_dt callback to get | ||
406 | * access to properties | ||
407 | */ | ||
408 | void *__init of_get_flat_dt_prop(unsigned long node, const char *name, | ||
409 | unsigned long *size) | ||
410 | { | ||
411 | return of_fdt_get_property(initial_boot_params, node, name, size); | ||
412 | } | ||
413 | |||
414 | /** | ||
415 | * of_flat_dt_is_compatible - Return true if given node has compat in compatible list | ||
416 | * @node: node to test | ||
417 | * @compat: compatible string to compare with compatible list. | ||
418 | */ | ||
419 | int __init of_flat_dt_is_compatible(unsigned long node, const char *compat) | ||
420 | { | ||
421 | return of_fdt_is_compatible(initial_boot_params, node, compat); | ||
422 | } | ||
423 | |||
424 | #ifdef CONFIG_BLK_DEV_INITRD | 424 | #ifdef CONFIG_BLK_DEV_INITRD |
425 | /** | 425 | /** |
426 | * early_init_dt_check_for_initrd - Decode initrd location from flat tree | 426 | * early_init_dt_check_for_initrd - Decode initrd location from flat tree |