aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/of
diff options
context:
space:
mode:
authorGrant Likely <grant.likely@secretlab.ca>2013-02-13 04:59:13 -0500
committerGrant Likely <grant.likely@secretlab.ca>2013-02-13 04:59:13 -0500
commitbfc4a58986ba3934bb256ef3567aeeab262aa959 (patch)
treebd26e4a6a10e19b510cec9674448bdb18633630a /drivers/of
parent09495dda6a62c74b13412a63528093910ef80edd (diff)
parent1421954bf9b967d819db23c911f950a2ccd60eff (diff)
Merge branch 'for-next' from git://sources.calxeda.com/kernel/linux.git
Signed-off-by: Grant Likely <grant.likely@secretlab.ca>
Diffstat (limited to 'drivers/of')
-rw-r--r--drivers/of/base.c100
1 files changed, 56 insertions, 44 deletions
diff --git a/drivers/of/base.c b/drivers/of/base.c
index 8b9fa83dc77b..e8d65aff8639 100644
--- a/drivers/of/base.c
+++ b/drivers/of/base.c
@@ -38,7 +38,7 @@ DEFINE_MUTEX(of_aliases_mutex);
38/* use when traversing tree through the allnext, child, sibling, 38/* use when traversing tree through the allnext, child, sibling,
39 * or parent members of struct device_node. 39 * or parent members of struct device_node.
40 */ 40 */
41DEFINE_RWLOCK(devtree_lock); 41DEFINE_RAW_SPINLOCK(devtree_lock);
42 42
43int of_n_addr_cells(struct device_node *np) 43int of_n_addr_cells(struct device_node *np)
44{ 44{
@@ -171,10 +171,11 @@ struct property *of_find_property(const struct device_node *np,
171 int *lenp) 171 int *lenp)
172{ 172{
173 struct property *pp; 173 struct property *pp;
174 unsigned long flags;
174 175
175 read_lock(&devtree_lock); 176 raw_spin_lock_irqsave(&devtree_lock, flags);
176 pp = __of_find_property(np, name, lenp); 177 pp = __of_find_property(np, name, lenp);
177 read_unlock(&devtree_lock); 178 raw_spin_unlock_irqrestore(&devtree_lock, flags);
178 179
179 return pp; 180 return pp;
180} 181}
@@ -192,13 +193,13 @@ struct device_node *of_find_all_nodes(struct device_node *prev)
192{ 193{
193 struct device_node *np; 194 struct device_node *np;
194 195
195 read_lock(&devtree_lock); 196 raw_spin_lock(&devtree_lock);
196 np = prev ? prev->allnext : of_allnodes; 197 np = prev ? prev->allnext : of_allnodes;
197 for (; np != NULL; np = np->allnext) 198 for (; np != NULL; np = np->allnext)
198 if (of_node_get(np)) 199 if (of_node_get(np))
199 break; 200 break;
200 of_node_put(prev); 201 of_node_put(prev);
201 read_unlock(&devtree_lock); 202 raw_spin_unlock(&devtree_lock);
202 return np; 203 return np;
203} 204}
204EXPORT_SYMBOL(of_find_all_nodes); 205EXPORT_SYMBOL(of_find_all_nodes);
@@ -257,11 +258,12 @@ static int __of_device_is_compatible(const struct device_node *device,
257int of_device_is_compatible(const struct device_node *device, 258int of_device_is_compatible(const struct device_node *device,
258 const char *compat) 259 const char *compat)
259{ 260{
261 unsigned long flags;
260 int res; 262 int res;
261 263
262 read_lock(&devtree_lock); 264 raw_spin_lock_irqsave(&devtree_lock, flags);
263 res = __of_device_is_compatible(device, compat); 265 res = __of_device_is_compatible(device, compat);
264 read_unlock(&devtree_lock); 266 raw_spin_unlock_irqrestore(&devtree_lock, flags);
265 return res; 267 return res;
266} 268}
267EXPORT_SYMBOL(of_device_is_compatible); 269EXPORT_SYMBOL(of_device_is_compatible);
@@ -323,13 +325,14 @@ EXPORT_SYMBOL(of_device_is_available);
323struct device_node *of_get_parent(const struct device_node *node) 325struct device_node *of_get_parent(const struct device_node *node)
324{ 326{
325 struct device_node *np; 327 struct device_node *np;
328 unsigned long flags;
326 329
327 if (!node) 330 if (!node)
328 return NULL; 331 return NULL;
329 332
330 read_lock(&devtree_lock); 333 raw_spin_lock_irqsave(&devtree_lock, flags);
331 np = of_node_get(node->parent); 334 np = of_node_get(node->parent);
332 read_unlock(&devtree_lock); 335 raw_spin_unlock_irqrestore(&devtree_lock, flags);
333 return np; 336 return np;
334} 337}
335EXPORT_SYMBOL(of_get_parent); 338EXPORT_SYMBOL(of_get_parent);
@@ -348,14 +351,15 @@ EXPORT_SYMBOL(of_get_parent);
348struct device_node *of_get_next_parent(struct device_node *node) 351struct device_node *of_get_next_parent(struct device_node *node)
349{ 352{
350 struct device_node *parent; 353 struct device_node *parent;
354 unsigned long flags;
351 355
352 if (!node) 356 if (!node)
353 return NULL; 357 return NULL;
354 358
355 read_lock(&devtree_lock); 359 raw_spin_lock_irqsave(&devtree_lock, flags);
356 parent = of_node_get(node->parent); 360 parent = of_node_get(node->parent);
357 of_node_put(node); 361 of_node_put(node);
358 read_unlock(&devtree_lock); 362 raw_spin_unlock_irqrestore(&devtree_lock, flags);
359 return parent; 363 return parent;
360} 364}
361 365
@@ -371,14 +375,15 @@ struct device_node *of_get_next_child(const struct device_node *node,
371 struct device_node *prev) 375 struct device_node *prev)
372{ 376{
373 struct device_node *next; 377 struct device_node *next;
378 unsigned long flags;
374 379
375 read_lock(&devtree_lock); 380 raw_spin_lock_irqsave(&devtree_lock, flags);
376 next = prev ? prev->sibling : node->child; 381 next = prev ? prev->sibling : node->child;
377 for (; next; next = next->sibling) 382 for (; next; next = next->sibling)
378 if (of_node_get(next)) 383 if (of_node_get(next))
379 break; 384 break;
380 of_node_put(prev); 385 of_node_put(prev);
381 read_unlock(&devtree_lock); 386 raw_spin_unlock_irqrestore(&devtree_lock, flags);
382 return next; 387 return next;
383} 388}
384EXPORT_SYMBOL(of_get_next_child); 389EXPORT_SYMBOL(of_get_next_child);
@@ -396,7 +401,7 @@ struct device_node *of_get_next_available_child(const struct device_node *node,
396{ 401{
397 struct device_node *next; 402 struct device_node *next;
398 403
399 read_lock(&devtree_lock); 404 raw_spin_lock(&devtree_lock);
400 next = prev ? prev->sibling : node->child; 405 next = prev ? prev->sibling : node->child;
401 for (; next; next = next->sibling) { 406 for (; next; next = next->sibling) {
402 if (!of_device_is_available(next)) 407 if (!of_device_is_available(next))
@@ -405,7 +410,7 @@ struct device_node *of_get_next_available_child(const struct device_node *node,
405 break; 410 break;
406 } 411 }
407 of_node_put(prev); 412 of_node_put(prev);
408 read_unlock(&devtree_lock); 413 raw_spin_unlock(&devtree_lock);
409 return next; 414 return next;
410} 415}
411EXPORT_SYMBOL(of_get_next_available_child); 416EXPORT_SYMBOL(of_get_next_available_child);
@@ -443,14 +448,15 @@ EXPORT_SYMBOL(of_get_child_by_name);
443struct device_node *of_find_node_by_path(const char *path) 448struct device_node *of_find_node_by_path(const char *path)
444{ 449{
445 struct device_node *np = of_allnodes; 450 struct device_node *np = of_allnodes;
451 unsigned long flags;
446 452
447 read_lock(&devtree_lock); 453 raw_spin_lock_irqsave(&devtree_lock, flags);
448 for (; np; np = np->allnext) { 454 for (; np; np = np->allnext) {
449 if (np->full_name && (of_node_cmp(np->full_name, path) == 0) 455 if (np->full_name && (of_node_cmp(np->full_name, path) == 0)
450 && of_node_get(np)) 456 && of_node_get(np))
451 break; 457 break;
452 } 458 }
453 read_unlock(&devtree_lock); 459 raw_spin_unlock_irqrestore(&devtree_lock, flags);
454 return np; 460 return np;
455} 461}
456EXPORT_SYMBOL(of_find_node_by_path); 462EXPORT_SYMBOL(of_find_node_by_path);
@@ -470,15 +476,16 @@ struct device_node *of_find_node_by_name(struct device_node *from,
470 const char *name) 476 const char *name)
471{ 477{
472 struct device_node *np; 478 struct device_node *np;
479 unsigned long flags;
473 480
474 read_lock(&devtree_lock); 481 raw_spin_lock_irqsave(&devtree_lock, flags);
475 np = from ? from->allnext : of_allnodes; 482 np = from ? from->allnext : of_allnodes;
476 for (; np; np = np->allnext) 483 for (; np; np = np->allnext)
477 if (np->name && (of_node_cmp(np->name, name) == 0) 484 if (np->name && (of_node_cmp(np->name, name) == 0)
478 && of_node_get(np)) 485 && of_node_get(np))
479 break; 486 break;
480 of_node_put(from); 487 of_node_put(from);
481 read_unlock(&devtree_lock); 488 raw_spin_unlock_irqrestore(&devtree_lock, flags);
482 return np; 489 return np;
483} 490}
484EXPORT_SYMBOL(of_find_node_by_name); 491EXPORT_SYMBOL(of_find_node_by_name);
@@ -499,15 +506,16 @@ struct device_node *of_find_node_by_type(struct device_node *from,
499 const char *type) 506 const char *type)
500{ 507{
501 struct device_node *np; 508 struct device_node *np;
509 unsigned long flags;
502 510
503 read_lock(&devtree_lock); 511 raw_spin_lock_irqsave(&devtree_lock, flags);
504 np = from ? from->allnext : of_allnodes; 512 np = from ? from->allnext : of_allnodes;
505 for (; np; np = np->allnext) 513 for (; np; np = np->allnext)
506 if (np->type && (of_node_cmp(np->type, type) == 0) 514 if (np->type && (of_node_cmp(np->type, type) == 0)
507 && of_node_get(np)) 515 && of_node_get(np))
508 break; 516 break;
509 of_node_put(from); 517 of_node_put(from);
510 read_unlock(&devtree_lock); 518 raw_spin_unlock_irqrestore(&devtree_lock, flags);
511 return np; 519 return np;
512} 520}
513EXPORT_SYMBOL(of_find_node_by_type); 521EXPORT_SYMBOL(of_find_node_by_type);
@@ -530,8 +538,9 @@ struct device_node *of_find_compatible_node(struct device_node *from,
530 const char *type, const char *compatible) 538 const char *type, const char *compatible)
531{ 539{
532 struct device_node *np; 540 struct device_node *np;
541 unsigned long flags;
533 542
534 read_lock(&devtree_lock); 543 raw_spin_lock_irqsave(&devtree_lock, flags);
535 np = from ? from->allnext : of_allnodes; 544 np = from ? from->allnext : of_allnodes;
536 for (; np; np = np->allnext) { 545 for (; np; np = np->allnext) {
537 if (type 546 if (type
@@ -542,7 +551,7 @@ struct device_node *of_find_compatible_node(struct device_node *from,
542 break; 551 break;
543 } 552 }
544 of_node_put(from); 553 of_node_put(from);
545 read_unlock(&devtree_lock); 554 raw_spin_unlock_irqrestore(&devtree_lock, flags);
546 return np; 555 return np;
547} 556}
548EXPORT_SYMBOL(of_find_compatible_node); 557EXPORT_SYMBOL(of_find_compatible_node);
@@ -564,8 +573,9 @@ struct device_node *of_find_node_with_property(struct device_node *from,
564{ 573{
565 struct device_node *np; 574 struct device_node *np;
566 struct property *pp; 575 struct property *pp;
576 unsigned long flags;
567 577
568 read_lock(&devtree_lock); 578 raw_spin_lock_irqsave(&devtree_lock, flags);
569 np = from ? from->allnext : of_allnodes; 579 np = from ? from->allnext : of_allnodes;
570 for (; np; np = np->allnext) { 580 for (; np; np = np->allnext) {
571 for (pp = np->properties; pp; pp = pp->next) { 581 for (pp = np->properties; pp; pp = pp->next) {
@@ -577,7 +587,7 @@ struct device_node *of_find_node_with_property(struct device_node *from,
577 } 587 }
578out: 588out:
579 of_node_put(from); 589 of_node_put(from);
580 read_unlock(&devtree_lock); 590 raw_spin_unlock_irqrestore(&devtree_lock, flags);
581 return np; 591 return np;
582} 592}
583EXPORT_SYMBOL(of_find_node_with_property); 593EXPORT_SYMBOL(of_find_node_with_property);
@@ -618,10 +628,11 @@ const struct of_device_id *of_match_node(const struct of_device_id *matches,
618 const struct device_node *node) 628 const struct device_node *node)
619{ 629{
620 const struct of_device_id *match; 630 const struct of_device_id *match;
631 unsigned long flags;
621 632
622 read_lock(&devtree_lock); 633 raw_spin_lock_irqsave(&devtree_lock, flags);
623 match = __of_match_node(matches, node); 634 match = __of_match_node(matches, node);
624 read_unlock(&devtree_lock); 635 raw_spin_unlock_irqrestore(&devtree_lock, flags);
625 return match; 636 return match;
626} 637}
627EXPORT_SYMBOL(of_match_node); 638EXPORT_SYMBOL(of_match_node);
@@ -645,11 +656,12 @@ struct device_node *of_find_matching_node_and_match(struct device_node *from,
645{ 656{
646 struct device_node *np; 657 struct device_node *np;
647 const struct of_device_id *m; 658 const struct of_device_id *m;
659 unsigned long flags;
648 660
649 if (match) 661 if (match)
650 *match = NULL; 662 *match = NULL;
651 663
652 read_lock(&devtree_lock); 664 raw_spin_lock_irqsave(&devtree_lock, flags);
653 np = from ? from->allnext : of_allnodes; 665 np = from ? from->allnext : of_allnodes;
654 for (; np; np = np->allnext) { 666 for (; np; np = np->allnext) {
655 m = __of_match_node(matches, np); 667 m = __of_match_node(matches, np);
@@ -660,7 +672,7 @@ struct device_node *of_find_matching_node_and_match(struct device_node *from,
660 } 672 }
661 } 673 }
662 of_node_put(from); 674 of_node_put(from);
663 read_unlock(&devtree_lock); 675 raw_spin_unlock_irqrestore(&devtree_lock, flags);
664 return np; 676 return np;
665} 677}
666EXPORT_SYMBOL(of_find_matching_node_and_match); 678EXPORT_SYMBOL(of_find_matching_node_and_match);
@@ -703,12 +715,12 @@ struct device_node *of_find_node_by_phandle(phandle handle)
703{ 715{
704 struct device_node *np; 716 struct device_node *np;
705 717
706 read_lock(&devtree_lock); 718 raw_spin_lock(&devtree_lock);
707 for (np = of_allnodes; np; np = np->allnext) 719 for (np = of_allnodes; np; np = np->allnext)
708 if (np->phandle == handle) 720 if (np->phandle == handle)
709 break; 721 break;
710 of_node_get(np); 722 of_node_get(np);
711 read_unlock(&devtree_lock); 723 raw_spin_unlock(&devtree_lock);
712 return np; 724 return np;
713} 725}
714EXPORT_SYMBOL(of_find_node_by_phandle); 726EXPORT_SYMBOL(of_find_node_by_phandle);
@@ -1180,18 +1192,18 @@ int of_add_property(struct device_node *np, struct property *prop)
1180 return rc; 1192 return rc;
1181 1193
1182 prop->next = NULL; 1194 prop->next = NULL;
1183 write_lock_irqsave(&devtree_lock, flags); 1195 raw_spin_lock_irqsave(&devtree_lock, flags);
1184 next = &np->properties; 1196 next = &np->properties;
1185 while (*next) { 1197 while (*next) {
1186 if (strcmp(prop->name, (*next)->name) == 0) { 1198 if (strcmp(prop->name, (*next)->name) == 0) {
1187 /* duplicate ! don't insert it */ 1199 /* duplicate ! don't insert it */
1188 write_unlock_irqrestore(&devtree_lock, flags); 1200 raw_spin_unlock_irqrestore(&devtree_lock, flags);
1189 return -1; 1201 return -1;
1190 } 1202 }
1191 next = &(*next)->next; 1203 next = &(*next)->next;
1192 } 1204 }
1193 *next = prop; 1205 *next = prop;
1194 write_unlock_irqrestore(&devtree_lock, flags); 1206 raw_spin_unlock_irqrestore(&devtree_lock, flags);
1195 1207
1196#ifdef CONFIG_PROC_DEVICETREE 1208#ifdef CONFIG_PROC_DEVICETREE
1197 /* try to add to proc as well if it was initialized */ 1209 /* try to add to proc as well if it was initialized */
@@ -1221,7 +1233,7 @@ int of_remove_property(struct device_node *np, struct property *prop)
1221 if (rc) 1233 if (rc)
1222 return rc; 1234 return rc;
1223 1235
1224 write_lock_irqsave(&devtree_lock, flags); 1236 raw_spin_lock_irqsave(&devtree_lock, flags);
1225 next = &np->properties; 1237 next = &np->properties;
1226 while (*next) { 1238 while (*next) {
1227 if (*next == prop) { 1239 if (*next == prop) {
@@ -1234,7 +1246,7 @@ int of_remove_property(struct device_node *np, struct property *prop)
1234 } 1246 }
1235 next = &(*next)->next; 1247 next = &(*next)->next;
1236 } 1248 }
1237 write_unlock_irqrestore(&devtree_lock, flags); 1249 raw_spin_unlock_irqrestore(&devtree_lock, flags);
1238 1250
1239 if (!found) 1251 if (!found)
1240 return -ENODEV; 1252 return -ENODEV;
@@ -1274,7 +1286,7 @@ int of_update_property(struct device_node *np, struct property *newprop)
1274 if (!oldprop) 1286 if (!oldprop)
1275 return of_add_property(np, newprop); 1287 return of_add_property(np, newprop);
1276 1288
1277 write_lock_irqsave(&devtree_lock, flags); 1289 raw_spin_lock_irqsave(&devtree_lock, flags);
1278 next = &np->properties; 1290 next = &np->properties;
1279 while (*next) { 1291 while (*next) {
1280 if (*next == oldprop) { 1292 if (*next == oldprop) {
@@ -1288,7 +1300,7 @@ int of_update_property(struct device_node *np, struct property *newprop)
1288 } 1300 }
1289 next = &(*next)->next; 1301 next = &(*next)->next;
1290 } 1302 }
1291 write_unlock_irqrestore(&devtree_lock, flags); 1303 raw_spin_unlock_irqrestore(&devtree_lock, flags);
1292 1304
1293 if (!found) 1305 if (!found)
1294 return -ENODEV; 1306 return -ENODEV;
@@ -1361,12 +1373,12 @@ int of_attach_node(struct device_node *np)
1361 if (rc) 1373 if (rc)
1362 return rc; 1374 return rc;
1363 1375
1364 write_lock_irqsave(&devtree_lock, flags); 1376 raw_spin_lock_irqsave(&devtree_lock, flags);
1365 np->sibling = np->parent->child; 1377 np->sibling = np->parent->child;
1366 np->allnext = of_allnodes; 1378 np->allnext = of_allnodes;
1367 np->parent->child = np; 1379 np->parent->child = np;
1368 of_allnodes = np; 1380 of_allnodes = np;
1369 write_unlock_irqrestore(&devtree_lock, flags); 1381 raw_spin_unlock_irqrestore(&devtree_lock, flags);
1370 1382
1371 of_add_proc_dt_entry(np); 1383 of_add_proc_dt_entry(np);
1372 return 0; 1384 return 0;
@@ -1409,17 +1421,17 @@ int of_detach_node(struct device_node *np)
1409 if (rc) 1421 if (rc)
1410 return rc; 1422 return rc;
1411 1423
1412 write_lock_irqsave(&devtree_lock, flags); 1424 raw_spin_lock_irqsave(&devtree_lock, flags);
1413 1425
1414 if (of_node_check_flag(np, OF_DETACHED)) { 1426 if (of_node_check_flag(np, OF_DETACHED)) {
1415 /* someone already detached it */ 1427 /* someone already detached it */
1416 write_unlock_irqrestore(&devtree_lock, flags); 1428 raw_spin_unlock_irqrestore(&devtree_lock, flags);
1417 return rc; 1429 return rc;
1418 } 1430 }
1419 1431
1420 parent = np->parent; 1432 parent = np->parent;
1421 if (!parent) { 1433 if (!parent) {
1422 write_unlock_irqrestore(&devtree_lock, flags); 1434 raw_spin_unlock_irqrestore(&devtree_lock, flags);
1423 return rc; 1435 return rc;
1424 } 1436 }
1425 1437
@@ -1446,7 +1458,7 @@ int of_detach_node(struct device_node *np)
1446 } 1458 }
1447 1459
1448 of_node_set_flag(np, OF_DETACHED); 1460 of_node_set_flag(np, OF_DETACHED);
1449 write_unlock_irqrestore(&devtree_lock, flags); 1461 raw_spin_unlock_irqrestore(&devtree_lock, flags);
1450 1462
1451 of_remove_proc_dt_entry(np); 1463 of_remove_proc_dt_entry(np);
1452 return rc; 1464 return rc;