aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/of/fdt.c
diff options
context:
space:
mode:
authorStephen Neuendorffer <stephen.neuendorffer@xilinx.com>2010-11-18 18:55:01 -0500
committerGrant Likely <grant.likely@secretlab.ca>2010-12-29 19:00:26 -0500
commit57d00ecf90cc9854973da2960012b734acc26e51 (patch)
tree6f1f3ce92b5e21646f4ec75766e3a2f5cba11fde /drivers/of/fdt.c
parenta40d6c4cf12d87980c10b230df435d0f56adc40b (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.c218
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. */
101int __initdata dt_root_addr_cells;
102int __initdata dt_root_size_cells;
103
104struct 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 */
117int __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 */
175unsigned 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 */
193void *__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 */
204int __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
209static void *unflatten_dt_alloc(unsigned long *mem, unsigned long size, 100static 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. */
316int __initdata dt_root_addr_cells;
317int __initdata dt_root_size_cells;
318
319struct 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 */
332int __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 */
390unsigned 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 */
408void *__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 */
419int __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