1 /* 2 * Procedures for creating, accessing and interpreting the device tree. 3 * 4 * Paul Mackerras August 1996. 5 * Copyright (C) 1996-2005 Paul Mackerras. 6 * 7 * Adapted for 64bit PowerPC by Dave Engebretsen and Peter Bergner. 8 * {engebret|bergner}@us.ibm.com 9 * 10 * Adapted for sparc and sparc64 by David S. Miller davem@davemloft.net 11 * 12 * Reconsolidated from arch/x/kernel/prom.c by Stephen Rothwell and 13 * Grant Likely. 14 * 15 * This program is free software; you can redistribute it and/or 16 * modify it under the terms of the GNU General Public License 17 * as published by the Free Software Foundation; either version 18 * 2 of the License, or (at your option) any later version. 19 */ 20 #include <linux/ctype.h> 21 #include <linux/module.h> 22 #include <linux/of.h> 23 #include <linux/spinlock.h> 24 #include <linux/slab.h> 25 #include <linux/proc_fs.h> 26 27 /** 28 * struct alias_prop - Alias property in 'aliases' node 29 * @link: List node to link the structure in aliases_lookup list 30 * @alias: Alias property name 31 * @np: Pointer to device_node that the alias stands for 32 * @id: Index value from end of alias name 33 * @stem: Alias string without the index 34 * 35 * The structure represents one alias property of 'aliases' node as 36 * an entry in aliases_lookup list. 37 */ 38 struct alias_prop { 39 struct list_head link; 40 const char *alias; 41 struct device_node *np; 42 int id; 43 char stem[0]; 44 }; 45 46 static LIST_HEAD(aliases_lookup); 47 48 struct device_node *allnodes; 49 struct device_node *of_chosen; 50 struct device_node *of_aliases; 51 52 static DEFINE_MUTEX(of_aliases_mutex); 53 54 /* use when traversing tree through the allnext, child, sibling, 55 * or parent members of struct device_node. 56 */ 57 DEFINE_RWLOCK(devtree_lock); 58 59 int of_n_addr_cells(struct device_node *np) 60 { 61 const __be32 *ip; 62 63 do { 64 if (np->parent) 65 np = np->parent; 66 ip = of_get_property(np, "#address-cells", NULL); 67 if (ip) 68 return be32_to_cpup(ip); 69 } while (np->parent); 70 /* No #address-cells property for the root node */ 71 return OF_ROOT_NODE_ADDR_CELLS_DEFAULT; 72 } 73 EXPORT_SYMBOL(of_n_addr_cells); 74 75 int of_n_size_cells(struct device_node *np) 76 { 77 const __be32 *ip; 78 79 do { 80 if (np->parent) 81 np = np->parent; 82 ip = of_get_property(np, "#size-cells", NULL); 83 if (ip) 84 return be32_to_cpup(ip); 85 } while (np->parent); 86 /* No #size-cells property for the root node */ 87 return OF_ROOT_NODE_SIZE_CELLS_DEFAULT; 88 } 89 EXPORT_SYMBOL(of_n_size_cells); 90 91 #if !defined(CONFIG_SPARC) /* SPARC doesn't do ref counting (yet) */ 92 /** 93 * of_node_get - Increment refcount of a node 94 * @node: Node to inc refcount, NULL is supported to 95 * simplify writing of callers 96 * 97 * Returns node. 98 */ 99 struct device_node *of_node_get(struct device_node *node) 100 { 101 if (node) 102 kref_get(&node->kref); 103 return node; 104 } 105 EXPORT_SYMBOL(of_node_get); 106 107 static inline struct device_node *kref_to_device_node(struct kref *kref) 108 { 109 return container_of(kref, struct device_node, kref); 110 } 111 112 /** 113 * of_node_release - release a dynamically allocated node 114 * @kref: kref element of the node to be released 115 * 116 * In of_node_put() this function is passed to kref_put() 117 * as the destructor. 118 */ 119 static void of_node_release(struct kref *kref) 120 { 121 struct device_node *node = kref_to_device_node(kref); 122 struct property *prop = node->properties; 123 124 /* We should never be releasing nodes that haven't been detached. */ 125 if (!of_node_check_flag(node, OF_DETACHED)) { 126 pr_err("ERROR: Bad of_node_put() on %s\n", node->full_name); 127 dump_stack(); 128 kref_init(&node->kref); 129 return; 130 } 131 132 if (!of_node_check_flag(node, OF_DYNAMIC)) 133 return; 134 135 while (prop) { 136 struct property *next = prop->next; 137 kfree(prop->name); 138 kfree(prop->value); 139 kfree(prop); 140 prop = next; 141 142 if (!prop) { 143 prop = node->deadprops; 144 node->deadprops = NULL; 145 } 146 } 147 kfree(node->full_name); 148 kfree(node->data); 149 kfree(node); 150 } 151 152 /** 153 * of_node_put - Decrement refcount of a node 154 * @node: Node to dec refcount, NULL is supported to 155 * simplify writing of callers 156 * 157 */ 158 void of_node_put(struct device_node *node) 159 { 160 if (node) 161 kref_put(&node->kref, of_node_release); 162 } 163 EXPORT_SYMBOL(of_node_put); 164 #endif /* !CONFIG_SPARC */ 165 166 struct property *of_find_property(const struct device_node *np, 167 const char *name, 168 int *lenp) 169 { 170 struct property *pp; 171 172 if (!np) 173 return NULL; 174 175 read_lock(&devtree_lock); 176 for (pp = np->properties; pp != 0; pp = pp->next) { 177 if (of_prop_cmp(pp->name, name) == 0) { 178 if (lenp != 0) 179 *lenp = pp->length; 180 break; 181 } 182 } 183 read_unlock(&devtree_lock); 184 185 return pp; 186 } 187 EXPORT_SYMBOL(of_find_property); 188 189 /** 190 * of_find_all_nodes - Get next node in global list 191 * @prev: Previous node or NULL to start iteration 192 * of_node_put() will be called on it 193 * 194 * Returns a node pointer with refcount incremented, use 195 * of_node_put() on it when done. 196 */ 197 struct device_node *of_find_all_nodes(struct device_node *prev) 198 { 199 struct device_node *np; 200 201 read_lock(&devtree_lock); 202 np = prev ? prev->allnext : allnodes; 203 for (; np != NULL; np = np->allnext) 204 if (of_node_get(np)) 205 break; 206 of_node_put(prev); 207 read_unlock(&devtree_lock); 208 return np; 209 } 210 EXPORT_SYMBOL(of_find_all_nodes); 211 212 /* 213 * Find a property with a given name for a given node 214 * and return the value. 215 */ 216 const void *of_get_property(const struct device_node *np, const char *name, 217 int *lenp) 218 { 219 struct property *pp = of_find_property(np, name, lenp); 220 221 return pp ? pp->value : NULL; 222 } 223 EXPORT_SYMBOL(of_get_property); 224 225 /** Checks if the given "compat" string matches one of the strings in 226 * the device's "compatible" property 227 */ 228 int of_device_is_compatible(const struct device_node *device, 229 const char *compat) 230 { 231 const char* cp; 232 int cplen, l; 233 234 cp = of_get_property(device, "compatible", &cplen); 235 if (cp == NULL) 236 return 0; 237 while (cplen > 0) { 238 if (of_compat_cmp(cp, compat, strlen(compat)) == 0) 239 return 1; 240 l = strlen(cp) + 1; 241 cp += l; 242 cplen -= l; 243 } 244 245 return 0; 246 } 247 EXPORT_SYMBOL(of_device_is_compatible); 248 249 /** 250 * of_machine_is_compatible - Test root of device tree for a given compatible value 251 * @compat: compatible string to look for in root node's compatible property. 252 * 253 * Returns true if the root node has the given value in its 254 * compatible property. 255 */ 256 int of_machine_is_compatible(const char *compat) 257 { 258 struct device_node *root; 259 int rc = 0; 260 261 root = of_find_node_by_path("/"); 262 if (root) { 263 rc = of_device_is_compatible(root, compat); 264 of_node_put(root); 265 } 266 return rc; 267 } 268 EXPORT_SYMBOL(of_machine_is_compatible); 269 270 /** 271 * of_device_is_available - check if a device is available for use 272 * 273 * @device: Node to check for availability 274 * 275 * Returns 1 if the status property is absent or set to "okay" or "ok", 276 * 0 otherwise 277 */ 278 int of_device_is_available(const struct device_node *device) 279 { 280 const char *status; 281 int statlen; 282 283 status = of_get_property(device, "status", &statlen); 284 if (status == NULL) 285 return 1; 286 287 if (statlen > 0) { 288 if (!strcmp(status, "okay") || !strcmp(status, "ok")) 289 return 1; 290 } 291 292 return 0; 293 } 294 EXPORT_SYMBOL(of_device_is_available); 295 296 /** 297 * of_get_parent - Get a node's parent if any 298 * @node: Node to get parent 299 * 300 * Returns a node pointer with refcount incremented, use 301 * of_node_put() on it when done. 302 */ 303 struct device_node *of_get_parent(const struct device_node *node) 304 { 305 struct device_node *np; 306 307 if (!node) 308 return NULL; 309 310 read_lock(&devtree_lock); 311 np = of_node_get(node->parent); 312 read_unlock(&devtree_lock); 313 return np; 314 } 315 EXPORT_SYMBOL(of_get_parent); 316 317 /** 318 * of_get_next_parent - Iterate to a node's parent 319 * @node: Node to get parent of 320 * 321 * This is like of_get_parent() except that it drops the 322 * refcount on the passed node, making it suitable for iterating 323 * through a node's parents. 324 * 325 * Returns a node pointer with refcount incremented, use 326 * of_node_put() on it when done. 327 */ 328 struct device_node *of_get_next_parent(struct device_node *node) 329 { 330 struct device_node *parent; 331 332 if (!node) 333 return NULL; 334 335 read_lock(&devtree_lock); 336 parent = of_node_get(node->parent); 337 of_node_put(node); 338 read_unlock(&devtree_lock); 339 return parent; 340 } 341 342 /** 343 * of_get_next_child - Iterate a node childs 344 * @node: parent node 345 * @prev: previous child of the parent node, or NULL to get first 346 * 347 * Returns a node pointer with refcount incremented, use 348 * of_node_put() on it when done. 349 */ 350 struct device_node *of_get_next_child(const struct device_node *node, 351 struct device_node *prev) 352 { 353 struct device_node *next; 354 355 read_lock(&devtree_lock); 356 next = prev ? prev->sibling : node->child; 357 for (; next; next = next->sibling) 358 if (of_node_get(next)) 359 break; 360 of_node_put(prev); 361 read_unlock(&devtree_lock); 362 return next; 363 } 364 EXPORT_SYMBOL(of_get_next_child); 365 366 /** 367 * of_find_node_by_path - Find a node matching a full OF path 368 * @path: The full path to match 369 * 370 * Returns a node pointer with refcount incremented, use 371 * of_node_put() on it when done. 372 */ 373 struct device_node *of_find_node_by_path(const char *path) 374 { 375 struct device_node *np = allnodes; 376 377 read_lock(&devtree_lock); 378 for (; np; np = np->allnext) { 379 if (np->full_name && (of_node_cmp(np->full_name, path) == 0) 380 && of_node_get(np)) 381 break; 382 } 383 read_unlock(&devtree_lock); 384 return np; 385 } 386 EXPORT_SYMBOL(of_find_node_by_path); 387 388 /** 389 * of_find_node_by_name - Find a node by its "name" property 390 * @from: The node to start searching from or NULL, the node 391 * you pass will not be searched, only the next one 392 * will; typically, you pass what the previous call 393 * returned. of_node_put() will be called on it 394 * @name: The name string to match against 395 * 396 * Returns a node pointer with refcount incremented, use 397 * of_node_put() on it when done. 398 */ 399 struct device_node *of_find_node_by_name(struct device_node *from, 400 const char *name) 401 { 402 struct device_node *np; 403 404 read_lock(&devtree_lock); 405 np = from ? from->allnext : allnodes; 406 for (; np; np = np->allnext) 407 if (np->name && (of_node_cmp(np->name, name) == 0) 408 && of_node_get(np)) 409 break; 410 of_node_put(from); 411 read_unlock(&devtree_lock); 412 return np; 413 } 414 EXPORT_SYMBOL(of_find_node_by_name); 415 416 /** 417 * of_find_node_by_type - Find a node by its "device_type" property 418 * @from: The node to start searching from, or NULL to start searching 419 * the entire device tree. The node you pass will not be 420 * searched, only the next one will; typically, you pass 421 * what the previous call returned. of_node_put() will be 422 * called on from for you. 423 * @type: The type string to match against 424 * 425 * Returns a node pointer with refcount incremented, use 426 * of_node_put() on it when done. 427 */ 428 struct device_node *of_find_node_by_type(struct device_node *from, 429 const char *type) 430 { 431 struct device_node *np; 432 433 read_lock(&devtree_lock); 434 np = from ? from->allnext : allnodes; 435 for (; np; np = np->allnext) 436 if (np->type && (of_node_cmp(np->type, type) == 0) 437 && of_node_get(np)) 438 break; 439 of_node_put(from); 440 read_unlock(&devtree_lock); 441 return np; 442 } 443 EXPORT_SYMBOL(of_find_node_by_type); 444 445 /** 446 * of_find_compatible_node - Find a node based on type and one of the 447 * tokens in its "compatible" property 448 * @from: The node to start searching from or NULL, the node 449 * you pass will not be searched, only the next one 450 * will; typically, you pass what the previous call 451 * returned. of_node_put() will be called on it 452 * @type: The type string to match "device_type" or NULL to ignore 453 * @compatible: The string to match to one of the tokens in the device 454 * "compatible" list. 455 * 456 * Returns a node pointer with refcount incremented, use 457 * of_node_put() on it when done. 458 */ 459 struct device_node *of_find_compatible_node(struct device_node *from, 460 const char *type, const char *compatible) 461 { 462 struct device_node *np; 463 464 read_lock(&devtree_lock); 465 np = from ? from->allnext : allnodes; 466 for (; np; np = np->allnext) { 467 if (type 468 && !(np->type && (of_node_cmp(np->type, type) == 0))) 469 continue; 470 if (of_device_is_compatible(np, compatible) && of_node_get(np)) 471 break; 472 } 473 of_node_put(from); 474 read_unlock(&devtree_lock); 475 return np; 476 } 477 EXPORT_SYMBOL(of_find_compatible_node); 478 479 /** 480 * of_find_node_with_property - Find a node which has a property with 481 * the given name. 482 * @from: The node to start searching from or NULL, the node 483 * you pass will not be searched, only the next one 484 * will; typically, you pass what the previous call 485 * returned. of_node_put() will be called on it 486 * @prop_name: The name of the property to look for. 487 * 488 * Returns a node pointer with refcount incremented, use 489 * of_node_put() on it when done. 490 */ 491 struct device_node *of_find_node_with_property(struct device_node *from, 492 const char *prop_name) 493 { 494 struct device_node *np; 495 struct property *pp; 496 497 read_lock(&devtree_lock); 498 np = from ? from->allnext : allnodes; 499 for (; np; np = np->allnext) { 500 for (pp = np->properties; pp != 0; pp = pp->next) { 501 if (of_prop_cmp(pp->name, prop_name) == 0) { 502 of_node_get(np); 503 goto out; 504 } 505 } 506 } 507 out: 508 of_node_put(from); 509 read_unlock(&devtree_lock); 510 return np; 511 } 512 EXPORT_SYMBOL(of_find_node_with_property); 513 514 /** 515 * of_match_node - Tell if an device_node has a matching of_match structure 516 * @matches: array of of device match structures to search in 517 * @node: the of device structure to match against 518 * 519 * Low level utility function used by device matching. 520 */ 521 const struct of_device_id *of_match_node(const struct of_device_id *matches, 522 const struct device_node *node) 523 { 524 if (!matches) 525 return NULL; 526 527 while (matches->name[0] || matches->type[0] || matches->compatible[0]) { 528 int match = 1; 529 if (matches->name[0]) 530 match &= node->name 531 && !strcmp(matches->name, node->name); 532 if (matches->type[0]) 533 match &= node->type 534 && !strcmp(matches->type, node->type); 535 if (matches->compatible[0]) 536 match &= of_device_is_compatible(node, 537 matches->compatible); 538 if (match) 539 return matches; 540 matches++; 541 } 542 return NULL; 543 } 544 EXPORT_SYMBOL(of_match_node); 545 546 /** 547 * of_find_matching_node - Find a node based on an of_device_id match 548 * table. 549 * @from: The node to start searching from or NULL, the node 550 * you pass will not be searched, only the next one 551 * will; typically, you pass what the previous call 552 * returned. of_node_put() will be called on it 553 * @matches: array of of device match structures to search in 554 * 555 * Returns a node pointer with refcount incremented, use 556 * of_node_put() on it when done. 557 */ 558 struct device_node *of_find_matching_node(struct device_node *from, 559 const struct of_device_id *matches) 560 { 561 struct device_node *np; 562 563 read_lock(&devtree_lock); 564 np = from ? from->allnext : allnodes; 565 for (; np; np = np->allnext) { 566 if (of_match_node(matches, np) && of_node_get(np)) 567 break; 568 } 569 of_node_put(from); 570 read_unlock(&devtree_lock); 571 return np; 572 } 573 EXPORT_SYMBOL(of_find_matching_node); 574 575 /** 576 * of_modalias_node - Lookup appropriate modalias for a device node 577 * @node: pointer to a device tree node 578 * @modalias: Pointer to buffer that modalias value will be copied into 579 * @len: Length of modalias value 580 * 581 * Based on the value of the compatible property, this routine will attempt 582 * to choose an appropriate modalias value for a particular device tree node. 583 * It does this by stripping the manufacturer prefix (as delimited by a ',') 584 * from the first entry in the compatible list property. 585 * 586 * This routine returns 0 on success, <0 on failure. 587 */ 588 int of_modalias_node(struct device_node *node, char *modalias, int len) 589 { 590 const char *compatible, *p; 591 int cplen; 592 593 compatible = of_get_property(node, "compatible", &cplen); 594 if (!compatible || strlen(compatible) > cplen) 595 return -ENODEV; 596 p = strchr(compatible, ','); 597 strlcpy(modalias, p ? p + 1 : compatible, len); 598 return 0; 599 } 600 EXPORT_SYMBOL_GPL(of_modalias_node); 601 602 /** 603 * of_find_node_by_phandle - Find a node given a phandle 604 * @handle: phandle of the node to find 605 * 606 * Returns a node pointer with refcount incremented, use 607 * of_node_put() on it when done. 608 */ 609 struct device_node *of_find_node_by_phandle(phandle handle) 610 { 611 struct device_node *np; 612 613 read_lock(&devtree_lock); 614 for (np = allnodes; np; np = np->allnext) 615 if (np->phandle == handle) 616 break; 617 of_node_get(np); 618 read_unlock(&devtree_lock); 619 return np; 620 } 621 EXPORT_SYMBOL(of_find_node_by_phandle); 622 623 /** 624 * of_property_read_u32_array - Find and read an array of 32 bit integers 625 * from a property. 626 * 627 * @np: device node from which the property value is to be read. 628 * @propname: name of the property to be searched. 629 * @out_value: pointer to return value, modified only if return value is 0. 630 * 631 * Search for a property in a device node and read 32-bit value(s) from 632 * it. Returns 0 on success, -EINVAL if the property does not exist, 633 * -ENODATA if property does not have a value, and -EOVERFLOW if the 634 * property data isn't large enough. 635 * 636 * The out_value is modified only if a valid u32 value can be decoded. 637 */ 638 int of_property_read_u32_array(const struct device_node *np, 639 const char *propname, u32 *out_values, 640 size_t sz) 641 { 642 struct property *prop = of_find_property(np, propname, NULL); 643 const __be32 *val; 644 645 if (!prop) 646 return -EINVAL; 647 if (!prop->value) 648 return -ENODATA; 649 if ((sz * sizeof(*out_values)) > prop->length) 650 return -EOVERFLOW; 651 652 val = prop->value; 653 while (sz--) 654 *out_values++ = be32_to_cpup(val++); 655 return 0; 656 } 657 EXPORT_SYMBOL_GPL(of_property_read_u32_array); 658 659 /** 660 * of_property_read_u64 - Find and read a 64 bit integer from a property 661 * @np: device node from which the property value is to be read. 662 * @propname: name of the property to be searched. 663 * @out_value: pointer to return value, modified only if return value is 0. 664 * 665 * Search for a property in a device node and read a 64-bit value from 666 * it. Returns 0 on success, -EINVAL if the property does not exist, 667 * -ENODATA if property does not have a value, and -EOVERFLOW if the 668 * property data isn't large enough. 669 * 670 * The out_value is modified only if a valid u64 value can be decoded. 671 */ 672 int of_property_read_u64(const struct device_node *np, const char *propname, 673 u64 *out_value) 674 { 675 struct property *prop = of_find_property(np, propname, NULL); 676 677 if (!prop) 678 return -EINVAL; 679 if (!prop->value) 680 return -ENODATA; 681 if (sizeof(*out_value) > prop->length) 682 return -EOVERFLOW; 683 *out_value = of_read_number(prop->value, 2); 684 return 0; 685 } 686 EXPORT_SYMBOL_GPL(of_property_read_u64); 687 688 /** 689 * of_property_read_string - Find and read a string from a property 690 * @np: device node from which the property value is to be read. 691 * @propname: name of the property to be searched. 692 * @out_string: pointer to null terminated return string, modified only if 693 * return value is 0. 694 * 695 * Search for a property in a device tree node and retrieve a null 696 * terminated string value (pointer to data, not a copy). Returns 0 on 697 * success, -EINVAL if the property does not exist, -ENODATA if property 698 * does not have a value, and -EILSEQ if the string is not null-terminated 699 * within the length of the property data. 700 * 701 * The out_string pointer is modified only if a valid string can be decoded. 702 */ 703 int of_property_read_string(struct device_node *np, const char *propname, 704 const char **out_string) 705 { 706 struct property *prop = of_find_property(np, propname, NULL); 707 if (!prop) 708 return -EINVAL; 709 if (!prop->value) 710 return -ENODATA; 711 if (strnlen(prop->value, prop->length) >= prop->length) 712 return -EILSEQ; 713 *out_string = prop->value; 714 return 0; 715 } 716 EXPORT_SYMBOL_GPL(of_property_read_string); 717 718 /** 719 * of_parse_phandle - Resolve a phandle property to a device_node pointer 720 * @np: Pointer to device node holding phandle property 721 * @phandle_name: Name of property holding a phandle value 722 * @index: For properties holding a table of phandles, this is the index into 723 * the table 724 * 725 * Returns the device_node pointer with refcount incremented. Use 726 * of_node_put() on it when done. 727 */ 728 struct device_node * 729 of_parse_phandle(struct device_node *np, const char *phandle_name, int index) 730 { 731 const __be32 *phandle; 732 int size; 733 734 phandle = of_get_property(np, phandle_name, &size); 735 if ((!phandle) || (size < sizeof(*phandle) * (index + 1))) 736 return NULL; 737 738 return of_find_node_by_phandle(be32_to_cpup(phandle + index)); 739 } 740 EXPORT_SYMBOL(of_parse_phandle); 741 742 /** 743 * of_parse_phandles_with_args - Find a node pointed by phandle in a list 744 * @np: pointer to a device tree node containing a list 745 * @list_name: property name that contains a list 746 * @cells_name: property name that specifies phandles' arguments count 747 * @index: index of a phandle to parse out 748 * @out_node: optional pointer to device_node struct pointer (will be filled) 749 * @out_args: optional pointer to arguments pointer (will be filled) 750 * 751 * This function is useful to parse lists of phandles and their arguments. 752 * Returns 0 on success and fills out_node and out_args, on error returns 753 * appropriate errno value. 754 * 755 * Example: 756 * 757 * phandle1: node1 { 758 * #list-cells = <2>; 759 * } 760 * 761 * phandle2: node2 { 762 * #list-cells = <1>; 763 * } 764 * 765 * node3 { 766 * list = <&phandle1 1 2 &phandle2 3>; 767 * } 768 * 769 * To get a device_node of the `node2' node you may call this: 770 * of_parse_phandles_with_args(node3, "list", "#list-cells", 2, &node2, &args); 771 */ 772 int of_parse_phandles_with_args(struct device_node *np, const char *list_name, 773 const char *cells_name, int index, 774 struct device_node **out_node, 775 const void **out_args) 776 { 777 int ret = -EINVAL; 778 const __be32 *list; 779 const __be32 *list_end; 780 int size; 781 int cur_index = 0; 782 struct device_node *node = NULL; 783 const void *args = NULL; 784 785 list = of_get_property(np, list_name, &size); 786 if (!list) { 787 ret = -ENOENT; 788 goto err0; 789 } 790 list_end = list + size / sizeof(*list); 791 792 while (list < list_end) { 793 const __be32 *cells; 794 phandle phandle; 795 796 phandle = be32_to_cpup(list++); 797 args = list; 798 799 /* one cell hole in the list = <>; */ 800 if (!phandle) 801 goto next; 802 803 node = of_find_node_by_phandle(phandle); 804 if (!node) { 805 pr_debug("%s: could not find phandle\n", 806 np->full_name); 807 goto err0; 808 } 809 810 cells = of_get_property(node, cells_name, &size); 811 if (!cells || size != sizeof(*cells)) { 812 pr_debug("%s: could not get %s for %s\n", 813 np->full_name, cells_name, node->full_name); 814 goto err1; 815 } 816 817 list += be32_to_cpup(cells); 818 if (list > list_end) { 819 pr_debug("%s: insufficient arguments length\n", 820 np->full_name); 821 goto err1; 822 } 823 next: 824 if (cur_index == index) 825 break; 826 827 of_node_put(node); 828 node = NULL; 829 args = NULL; 830 cur_index++; 831 } 832 833 if (!node) { 834 /* 835 * args w/o node indicates that the loop above has stopped at 836 * the 'hole' cell. Report this differently. 837 */ 838 if (args) 839 ret = -EEXIST; 840 else 841 ret = -ENOENT; 842 goto err0; 843 } 844 845 if (out_node) 846 *out_node = node; 847 if (out_args) 848 *out_args = args; 849 850 return 0; 851 err1: 852 of_node_put(node); 853 err0: 854 pr_debug("%s failed with status %d\n", __func__, ret); 855 return ret; 856 } 857 EXPORT_SYMBOL(of_parse_phandles_with_args); 858 859 /** 860 * prom_add_property - Add a property to a node 861 */ 862 int prom_add_property(struct device_node *np, struct property *prop) 863 { 864 struct property **next; 865 unsigned long flags; 866 867 prop->next = NULL; 868 write_lock_irqsave(&devtree_lock, flags); 869 next = &np->properties; 870 while (*next) { 871 if (strcmp(prop->name, (*next)->name) == 0) { 872 /* duplicate ! don't insert it */ 873 write_unlock_irqrestore(&devtree_lock, flags); 874 return -1; 875 } 876 next = &(*next)->next; 877 } 878 *next = prop; 879 write_unlock_irqrestore(&devtree_lock, flags); 880 881 #ifdef CONFIG_PROC_DEVICETREE 882 /* try to add to proc as well if it was initialized */ 883 if (np->pde) 884 proc_device_tree_add_prop(np->pde, prop); 885 #endif /* CONFIG_PROC_DEVICETREE */ 886 887 return 0; 888 } 889 890 /** 891 * prom_remove_property - Remove a property from a node. 892 * 893 * Note that we don't actually remove it, since we have given out 894 * who-knows-how-many pointers to the data using get-property. 895 * Instead we just move the property to the "dead properties" 896 * list, so it won't be found any more. 897 */ 898 int prom_remove_property(struct device_node *np, struct property *prop) 899 { 900 struct property **next; 901 unsigned long flags; 902 int found = 0; 903 904 write_lock_irqsave(&devtree_lock, flags); 905 next = &np->properties; 906 while (*next) { 907 if (*next == prop) { 908 /* found the node */ 909 *next = prop->next; 910 prop->next = np->deadprops; 911 np->deadprops = prop; 912 found = 1; 913 break; 914 } 915 next = &(*next)->next; 916 } 917 write_unlock_irqrestore(&devtree_lock, flags); 918 919 if (!found) 920 return -ENODEV; 921 922 #ifdef CONFIG_PROC_DEVICETREE 923 /* try to remove the proc node as well */ 924 if (np->pde) 925 proc_device_tree_remove_prop(np->pde, prop); 926 #endif /* CONFIG_PROC_DEVICETREE */ 927 928 return 0; 929 } 930 931 /* 932 * prom_update_property - Update a property in a node. 933 * 934 * Note that we don't actually remove it, since we have given out 935 * who-knows-how-many pointers to the data using get-property. 936 * Instead we just move the property to the "dead properties" list, 937 * and add the new property to the property list 938 */ 939 int prom_update_property(struct device_node *np, 940 struct property *newprop, 941 struct property *oldprop) 942 { 943 struct property **next; 944 unsigned long flags; 945 int found = 0; 946 947 write_lock_irqsave(&devtree_lock, flags); 948 next = &np->properties; 949 while (*next) { 950 if (*next == oldprop) { 951 /* found the node */ 952 newprop->next = oldprop->next; 953 *next = newprop; 954 oldprop->next = np->deadprops; 955 np->deadprops = oldprop; 956 found = 1; 957 break; 958 } 959 next = &(*next)->next; 960 } 961 write_unlock_irqrestore(&devtree_lock, flags); 962 963 if (!found) 964 return -ENODEV; 965 966 #ifdef CONFIG_PROC_DEVICETREE 967 /* try to add to proc as well if it was initialized */ 968 if (np->pde) 969 proc_device_tree_update_prop(np->pde, newprop, oldprop); 970 #endif /* CONFIG_PROC_DEVICETREE */ 971 972 return 0; 973 } 974 975 #if defined(CONFIG_OF_DYNAMIC) 976 /* 977 * Support for dynamic device trees. 978 * 979 * On some platforms, the device tree can be manipulated at runtime. 980 * The routines in this section support adding, removing and changing 981 * device tree nodes. 982 */ 983 984 /** 985 * of_attach_node - Plug a device node into the tree and global list. 986 */ 987 void of_attach_node(struct device_node *np) 988 { 989 unsigned long flags; 990 991 write_lock_irqsave(&devtree_lock, flags); 992 np->sibling = np->parent->child; 993 np->allnext = allnodes; 994 np->parent->child = np; 995 allnodes = np; 996 write_unlock_irqrestore(&devtree_lock, flags); 997 } 998 999 /** 1000 * of_detach_node - "Unplug" a node from the device tree. 1001 * 1002 * The caller must hold a reference to the node. The memory associated with 1003 * the node is not freed until its refcount goes to zero. 1004 */ 1005 void of_detach_node(struct device_node *np) 1006 { 1007 struct device_node *parent; 1008 unsigned long flags; 1009 1010 write_lock_irqsave(&devtree_lock, flags); 1011 1012 parent = np->parent; 1013 if (!parent) 1014 goto out_unlock; 1015 1016 if (allnodes == np) 1017 allnodes = np->allnext; 1018 else { 1019 struct device_node *prev; 1020 for (prev = allnodes; 1021 prev->allnext != np; 1022 prev = prev->allnext) 1023 ; 1024 prev->allnext = np->allnext; 1025 } 1026 1027 if (parent->child == np) 1028 parent->child = np->sibling; 1029 else { 1030 struct device_node *prevsib; 1031 for (prevsib = np->parent->child; 1032 prevsib->sibling != np; 1033 prevsib = prevsib->sibling) 1034 ; 1035 prevsib->sibling = np->sibling; 1036 } 1037 1038 of_node_set_flag(np, OF_DETACHED); 1039 1040 out_unlock: 1041 write_unlock_irqrestore(&devtree_lock, flags); 1042 } 1043 #endif /* defined(CONFIG_OF_DYNAMIC) */ 1044 1045 static void of_alias_add(struct alias_prop *ap, struct device_node *np, 1046 int id, const char *stem, int stem_len) 1047 { 1048 ap->np = np; 1049 ap->id = id; 1050 strncpy(ap->stem, stem, stem_len); 1051 ap->stem[stem_len] = 0; 1052 list_add_tail(&ap->link, &aliases_lookup); 1053 pr_debug("adding DT alias:%s: stem=%s id=%i node=%s\n", 1054 ap->alias, ap->stem, ap->id, np ? np->full_name : NULL); 1055 } 1056 1057 /** 1058 * of_alias_scan - Scan all properties of 'aliases' node 1059 * 1060 * The function scans all the properties of 'aliases' node and populate 1061 * the the global lookup table with the properties. It returns the 1062 * number of alias_prop found, or error code in error case. 1063 * 1064 * @dt_alloc: An allocator that provides a virtual address to memory 1065 * for the resulting tree 1066 */ 1067 void of_alias_scan(void * (*dt_alloc)(u64 size, u64 align)) 1068 { 1069 struct property *pp; 1070 1071 of_chosen = of_find_node_by_path("/chosen"); 1072 if (of_chosen == NULL) 1073 of_chosen = of_find_node_by_path("/chosen@0"); 1074 of_aliases = of_find_node_by_path("/aliases"); 1075 if (!of_aliases) 1076 return; 1077 1078 for_each_property(pp, of_aliases->properties) { 1079 const char *start = pp->name; 1080 const char *end = start + strlen(start); 1081 struct device_node *np; 1082 struct alias_prop *ap; 1083 int id, len; 1084 1085 /* Skip those we do not want to proceed */ 1086 if (!strcmp(pp->name, "name") || 1087 !strcmp(pp->name, "phandle") || 1088 !strcmp(pp->name, "linux,phandle")) 1089 continue; 1090 1091 np = of_find_node_by_path(pp->value); 1092 if (!np) 1093 continue; 1094 1095 /* walk the alias backwards to extract the id and work out 1096 * the 'stem' string */ 1097 while (isdigit(*(end-1)) && end > start) 1098 end--; 1099 len = end - start; 1100 1101 if (kstrtoint(end, 10, &id) < 0) 1102 continue; 1103 1104 /* Allocate an alias_prop with enough space for the stem */ 1105 ap = dt_alloc(sizeof(*ap) + len + 1, 4); 1106 if (!ap) 1107 continue; 1108 ap->alias = start; 1109 of_alias_add(ap, np, id, start, len); 1110 } 1111 } 1112 1113 /** 1114 * of_alias_get_id - Get alias id for the given device_node 1115 * @np: Pointer to the given device_node 1116 * @stem: Alias stem of the given device_node 1117 * 1118 * The function travels the lookup table to get alias id for the given 1119 * device_node and alias stem. It returns the alias id if find it. 1120 */ 1121 int of_alias_get_id(struct device_node *np, const char *stem) 1122 { 1123 struct alias_prop *app; 1124 int id = -ENODEV; 1125 1126 mutex_lock(&of_aliases_mutex); 1127 list_for_each_entry(app, &aliases_lookup, link) { 1128 if (strcmp(app->stem, stem) != 0) 1129 continue; 1130 1131 if (np == app->np) { 1132 id = app->id; 1133 break; 1134 } 1135 } 1136 mutex_unlock(&of_aliases_mutex); 1137 1138 return id; 1139 } 1140 EXPORT_SYMBOL_GPL(of_alias_get_id); 1141