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_OF_DYNAMIC) 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_OF_DYNAMIC */ 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; pp = pp->next) { 177 if (of_prop_cmp(pp->name, name) == 0) { 178 if (lenp) 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_get_next_available_child - Find the next available child node 368 * @node: parent node 369 * @prev: previous child of the parent node, or NULL to get first 370 * 371 * This function is like of_get_next_child(), except that it 372 * automatically skips any disabled nodes (i.e. status = "disabled"). 373 */ 374 struct device_node *of_get_next_available_child(const struct device_node *node, 375 struct device_node *prev) 376 { 377 struct device_node *next; 378 379 read_lock(&devtree_lock); 380 next = prev ? prev->sibling : node->child; 381 for (; next; next = next->sibling) { 382 if (!of_device_is_available(next)) 383 continue; 384 if (of_node_get(next)) 385 break; 386 } 387 of_node_put(prev); 388 read_unlock(&devtree_lock); 389 return next; 390 } 391 EXPORT_SYMBOL(of_get_next_available_child); 392 393 /** 394 * of_find_node_by_path - Find a node matching a full OF path 395 * @path: The full path to match 396 * 397 * Returns a node pointer with refcount incremented, use 398 * of_node_put() on it when done. 399 */ 400 struct device_node *of_find_node_by_path(const char *path) 401 { 402 struct device_node *np = allnodes; 403 404 read_lock(&devtree_lock); 405 for (; np; np = np->allnext) { 406 if (np->full_name && (of_node_cmp(np->full_name, path) == 0) 407 && of_node_get(np)) 408 break; 409 } 410 read_unlock(&devtree_lock); 411 return np; 412 } 413 EXPORT_SYMBOL(of_find_node_by_path); 414 415 /** 416 * of_find_node_by_name - Find a node by its "name" property 417 * @from: The node to start searching from or NULL, the node 418 * you pass will not be searched, only the next one 419 * will; typically, you pass what the previous call 420 * returned. of_node_put() will be called on it 421 * @name: The name string to match against 422 * 423 * Returns a node pointer with refcount incremented, use 424 * of_node_put() on it when done. 425 */ 426 struct device_node *of_find_node_by_name(struct device_node *from, 427 const char *name) 428 { 429 struct device_node *np; 430 431 read_lock(&devtree_lock); 432 np = from ? from->allnext : allnodes; 433 for (; np; np = np->allnext) 434 if (np->name && (of_node_cmp(np->name, name) == 0) 435 && of_node_get(np)) 436 break; 437 of_node_put(from); 438 read_unlock(&devtree_lock); 439 return np; 440 } 441 EXPORT_SYMBOL(of_find_node_by_name); 442 443 /** 444 * of_find_node_by_type - Find a node by its "device_type" property 445 * @from: The node to start searching from, or NULL to start searching 446 * the entire device tree. The node you pass will not be 447 * searched, only the next one will; typically, you pass 448 * what the previous call returned. of_node_put() will be 449 * called on from for you. 450 * @type: The type string to match against 451 * 452 * Returns a node pointer with refcount incremented, use 453 * of_node_put() on it when done. 454 */ 455 struct device_node *of_find_node_by_type(struct device_node *from, 456 const char *type) 457 { 458 struct device_node *np; 459 460 read_lock(&devtree_lock); 461 np = from ? from->allnext : allnodes; 462 for (; np; np = np->allnext) 463 if (np->type && (of_node_cmp(np->type, type) == 0) 464 && of_node_get(np)) 465 break; 466 of_node_put(from); 467 read_unlock(&devtree_lock); 468 return np; 469 } 470 EXPORT_SYMBOL(of_find_node_by_type); 471 472 /** 473 * of_find_compatible_node - Find a node based on type and one of the 474 * tokens in its "compatible" property 475 * @from: The node to start searching from or NULL, the node 476 * you pass will not be searched, only the next one 477 * will; typically, you pass what the previous call 478 * returned. of_node_put() will be called on it 479 * @type: The type string to match "device_type" or NULL to ignore 480 * @compatible: The string to match to one of the tokens in the device 481 * "compatible" list. 482 * 483 * Returns a node pointer with refcount incremented, use 484 * of_node_put() on it when done. 485 */ 486 struct device_node *of_find_compatible_node(struct device_node *from, 487 const char *type, const char *compatible) 488 { 489 struct device_node *np; 490 491 read_lock(&devtree_lock); 492 np = from ? from->allnext : allnodes; 493 for (; np; np = np->allnext) { 494 if (type 495 && !(np->type && (of_node_cmp(np->type, type) == 0))) 496 continue; 497 if (of_device_is_compatible(np, compatible) && of_node_get(np)) 498 break; 499 } 500 of_node_put(from); 501 read_unlock(&devtree_lock); 502 return np; 503 } 504 EXPORT_SYMBOL(of_find_compatible_node); 505 506 /** 507 * of_find_node_with_property - Find a node which has a property with 508 * the given name. 509 * @from: The node to start searching from or NULL, the node 510 * you pass will not be searched, only the next one 511 * will; typically, you pass what the previous call 512 * returned. of_node_put() will be called on it 513 * @prop_name: The name of the property to look for. 514 * 515 * Returns a node pointer with refcount incremented, use 516 * of_node_put() on it when done. 517 */ 518 struct device_node *of_find_node_with_property(struct device_node *from, 519 const char *prop_name) 520 { 521 struct device_node *np; 522 struct property *pp; 523 524 read_lock(&devtree_lock); 525 np = from ? from->allnext : allnodes; 526 for (; np; np = np->allnext) { 527 for (pp = np->properties; pp; pp = pp->next) { 528 if (of_prop_cmp(pp->name, prop_name) == 0) { 529 of_node_get(np); 530 goto out; 531 } 532 } 533 } 534 out: 535 of_node_put(from); 536 read_unlock(&devtree_lock); 537 return np; 538 } 539 EXPORT_SYMBOL(of_find_node_with_property); 540 541 /** 542 * of_match_node - Tell if an device_node has a matching of_match structure 543 * @matches: array of of device match structures to search in 544 * @node: the of device structure to match against 545 * 546 * Low level utility function used by device matching. 547 */ 548 const struct of_device_id *of_match_node(const struct of_device_id *matches, 549 const struct device_node *node) 550 { 551 if (!matches) 552 return NULL; 553 554 while (matches->name[0] || matches->type[0] || matches->compatible[0]) { 555 int match = 1; 556 if (matches->name[0]) 557 match &= node->name 558 && !strcmp(matches->name, node->name); 559 if (matches->type[0]) 560 match &= node->type 561 && !strcmp(matches->type, node->type); 562 if (matches->compatible[0]) 563 match &= of_device_is_compatible(node, 564 matches->compatible); 565 if (match) 566 return matches; 567 matches++; 568 } 569 return NULL; 570 } 571 EXPORT_SYMBOL(of_match_node); 572 573 /** 574 * of_find_matching_node - Find a node based on an of_device_id match 575 * table. 576 * @from: The node to start searching from or NULL, the node 577 * you pass will not be searched, only the next one 578 * will; typically, you pass what the previous call 579 * returned. of_node_put() will be called on it 580 * @matches: array of of device match structures to search in 581 * 582 * Returns a node pointer with refcount incremented, use 583 * of_node_put() on it when done. 584 */ 585 struct device_node *of_find_matching_node(struct device_node *from, 586 const struct of_device_id *matches) 587 { 588 struct device_node *np; 589 590 read_lock(&devtree_lock); 591 np = from ? from->allnext : allnodes; 592 for (; np; np = np->allnext) { 593 if (of_match_node(matches, np) && of_node_get(np)) 594 break; 595 } 596 of_node_put(from); 597 read_unlock(&devtree_lock); 598 return np; 599 } 600 EXPORT_SYMBOL(of_find_matching_node); 601 602 /** 603 * of_modalias_node - Lookup appropriate modalias for a device node 604 * @node: pointer to a device tree node 605 * @modalias: Pointer to buffer that modalias value will be copied into 606 * @len: Length of modalias value 607 * 608 * Based on the value of the compatible property, this routine will attempt 609 * to choose an appropriate modalias value for a particular device tree node. 610 * It does this by stripping the manufacturer prefix (as delimited by a ',') 611 * from the first entry in the compatible list property. 612 * 613 * This routine returns 0 on success, <0 on failure. 614 */ 615 int of_modalias_node(struct device_node *node, char *modalias, int len) 616 { 617 const char *compatible, *p; 618 int cplen; 619 620 compatible = of_get_property(node, "compatible", &cplen); 621 if (!compatible || strlen(compatible) > cplen) 622 return -ENODEV; 623 p = strchr(compatible, ','); 624 strlcpy(modalias, p ? p + 1 : compatible, len); 625 return 0; 626 } 627 EXPORT_SYMBOL_GPL(of_modalias_node); 628 629 /** 630 * of_find_node_by_phandle - Find a node given a phandle 631 * @handle: phandle of the node to find 632 * 633 * Returns a node pointer with refcount incremented, use 634 * of_node_put() on it when done. 635 */ 636 struct device_node *of_find_node_by_phandle(phandle handle) 637 { 638 struct device_node *np; 639 640 read_lock(&devtree_lock); 641 for (np = allnodes; np; np = np->allnext) 642 if (np->phandle == handle) 643 break; 644 of_node_get(np); 645 read_unlock(&devtree_lock); 646 return np; 647 } 648 EXPORT_SYMBOL(of_find_node_by_phandle); 649 650 /** 651 * of_property_read_u32_array - Find and read an array of 32 bit integers 652 * from a property. 653 * 654 * @np: device node from which the property value is to be read. 655 * @propname: name of the property to be searched. 656 * @out_value: pointer to return value, modified only if return value is 0. 657 * 658 * Search for a property in a device node and read 32-bit value(s) from 659 * it. Returns 0 on success, -EINVAL if the property does not exist, 660 * -ENODATA if property does not have a value, and -EOVERFLOW if the 661 * property data isn't large enough. 662 * 663 * The out_value is modified only if a valid u32 value can be decoded. 664 */ 665 int of_property_read_u32_array(const struct device_node *np, 666 const char *propname, u32 *out_values, 667 size_t sz) 668 { 669 struct property *prop = of_find_property(np, propname, NULL); 670 const __be32 *val; 671 672 if (!prop) 673 return -EINVAL; 674 if (!prop->value) 675 return -ENODATA; 676 if ((sz * sizeof(*out_values)) > prop->length) 677 return -EOVERFLOW; 678 679 val = prop->value; 680 while (sz--) 681 *out_values++ = be32_to_cpup(val++); 682 return 0; 683 } 684 EXPORT_SYMBOL_GPL(of_property_read_u32_array); 685 686 /** 687 * of_property_read_u64 - Find and read a 64 bit integer from a property 688 * @np: device node from which the property value is to be read. 689 * @propname: name of the property to be searched. 690 * @out_value: pointer to return value, modified only if return value is 0. 691 * 692 * Search for a property in a device node and read a 64-bit value from 693 * it. Returns 0 on success, -EINVAL if the property does not exist, 694 * -ENODATA if property does not have a value, and -EOVERFLOW if the 695 * property data isn't large enough. 696 * 697 * The out_value is modified only if a valid u64 value can be decoded. 698 */ 699 int of_property_read_u64(const struct device_node *np, const char *propname, 700 u64 *out_value) 701 { 702 struct property *prop = of_find_property(np, propname, NULL); 703 704 if (!prop) 705 return -EINVAL; 706 if (!prop->value) 707 return -ENODATA; 708 if (sizeof(*out_value) > prop->length) 709 return -EOVERFLOW; 710 *out_value = of_read_number(prop->value, 2); 711 return 0; 712 } 713 EXPORT_SYMBOL_GPL(of_property_read_u64); 714 715 /** 716 * of_property_read_string - Find and read a string from a property 717 * @np: device node from which the property value is to be read. 718 * @propname: name of the property to be searched. 719 * @out_string: pointer to null terminated return string, modified only if 720 * return value is 0. 721 * 722 * Search for a property in a device tree node and retrieve a null 723 * terminated string value (pointer to data, not a copy). Returns 0 on 724 * success, -EINVAL if the property does not exist, -ENODATA if property 725 * does not have a value, and -EILSEQ if the string is not null-terminated 726 * within the length of the property data. 727 * 728 * The out_string pointer is modified only if a valid string can be decoded. 729 */ 730 int of_property_read_string(struct device_node *np, const char *propname, 731 const char **out_string) 732 { 733 struct property *prop = of_find_property(np, propname, NULL); 734 if (!prop) 735 return -EINVAL; 736 if (!prop->value) 737 return -ENODATA; 738 if (strnlen(prop->value, prop->length) >= prop->length) 739 return -EILSEQ; 740 *out_string = prop->value; 741 return 0; 742 } 743 EXPORT_SYMBOL_GPL(of_property_read_string); 744 745 /** 746 * of_property_read_string_index - Find and read a string from a multiple 747 * strings property. 748 * @np: device node from which the property value is to be read. 749 * @propname: name of the property to be searched. 750 * @index: index of the string in the list of strings 751 * @out_string: pointer to null terminated return string, modified only if 752 * return value is 0. 753 * 754 * Search for a property in a device tree node and retrieve a null 755 * terminated string value (pointer to data, not a copy) in the list of strings 756 * contained in that property. 757 * Returns 0 on success, -EINVAL if the property does not exist, -ENODATA if 758 * property does not have a value, and -EILSEQ if the string is not 759 * null-terminated within the length of the property data. 760 * 761 * The out_string pointer is modified only if a valid string can be decoded. 762 */ 763 int of_property_read_string_index(struct device_node *np, const char *propname, 764 int index, const char **output) 765 { 766 struct property *prop = of_find_property(np, propname, NULL); 767 int i = 0; 768 size_t l = 0, total = 0; 769 const char *p; 770 771 if (!prop) 772 return -EINVAL; 773 if (!prop->value) 774 return -ENODATA; 775 if (strnlen(prop->value, prop->length) >= prop->length) 776 return -EILSEQ; 777 778 p = prop->value; 779 780 for (i = 0; total < prop->length; total += l, p += l) { 781 l = strlen(p) + 1; 782 if (i++ == index) { 783 *output = p; 784 return 0; 785 } 786 } 787 return -ENODATA; 788 } 789 EXPORT_SYMBOL_GPL(of_property_read_string_index); 790 791 /** 792 * of_property_match_string() - Find string in a list and return index 793 * @np: pointer to node containing string list property 794 * @propname: string list property name 795 * @string: pointer to string to search for in string list 796 * 797 * This function searches a string list property and returns the index 798 * of a specific string value. 799 */ 800 int of_property_match_string(struct device_node *np, const char *propname, 801 const char *string) 802 { 803 struct property *prop = of_find_property(np, propname, NULL); 804 size_t l; 805 int i; 806 const char *p, *end; 807 808 if (!prop) 809 return -EINVAL; 810 if (!prop->value) 811 return -ENODATA; 812 813 p = prop->value; 814 end = p + prop->length; 815 816 for (i = 0; p < end; i++, p += l) { 817 l = strlen(p) + 1; 818 if (p + l > end) 819 return -EILSEQ; 820 pr_debug("comparing %s with %s\n", string, p); 821 if (strcmp(string, p) == 0) 822 return i; /* Found it; return index */ 823 } 824 return -ENODATA; 825 } 826 EXPORT_SYMBOL_GPL(of_property_match_string); 827 828 /** 829 * of_property_count_strings - Find and return the number of strings from a 830 * multiple strings property. 831 * @np: device node from which the property value is to be read. 832 * @propname: name of the property to be searched. 833 * 834 * Search for a property in a device tree node and retrieve the number of null 835 * terminated string contain in it. Returns the number of strings on 836 * success, -EINVAL if the property does not exist, -ENODATA if property 837 * does not have a value, and -EILSEQ if the string is not null-terminated 838 * within the length of the property data. 839 */ 840 int of_property_count_strings(struct device_node *np, const char *propname) 841 { 842 struct property *prop = of_find_property(np, propname, NULL); 843 int i = 0; 844 size_t l = 0, total = 0; 845 const char *p; 846 847 if (!prop) 848 return -EINVAL; 849 if (!prop->value) 850 return -ENODATA; 851 if (strnlen(prop->value, prop->length) >= prop->length) 852 return -EILSEQ; 853 854 p = prop->value; 855 856 for (i = 0; total < prop->length; total += l, p += l, i++) 857 l = strlen(p) + 1; 858 859 return i; 860 } 861 EXPORT_SYMBOL_GPL(of_property_count_strings); 862 863 /** 864 * of_parse_phandle - Resolve a phandle property to a device_node pointer 865 * @np: Pointer to device node holding phandle property 866 * @phandle_name: Name of property holding a phandle value 867 * @index: For properties holding a table of phandles, this is the index into 868 * the table 869 * 870 * Returns the device_node pointer with refcount incremented. Use 871 * of_node_put() on it when done. 872 */ 873 struct device_node * 874 of_parse_phandle(struct device_node *np, const char *phandle_name, int index) 875 { 876 const __be32 *phandle; 877 int size; 878 879 phandle = of_get_property(np, phandle_name, &size); 880 if ((!phandle) || (size < sizeof(*phandle) * (index + 1))) 881 return NULL; 882 883 return of_find_node_by_phandle(be32_to_cpup(phandle + index)); 884 } 885 EXPORT_SYMBOL(of_parse_phandle); 886 887 /** 888 * of_parse_phandle_with_args() - Find a node pointed by phandle in a list 889 * @np: pointer to a device tree node containing a list 890 * @list_name: property name that contains a list 891 * @cells_name: property name that specifies phandles' arguments count 892 * @index: index of a phandle to parse out 893 * @out_args: optional pointer to output arguments structure (will be filled) 894 * 895 * This function is useful to parse lists of phandles and their arguments. 896 * Returns 0 on success and fills out_args, on error returns appropriate 897 * errno value. 898 * 899 * Caller is responsible to call of_node_put() on the returned out_args->node 900 * pointer. 901 * 902 * Example: 903 * 904 * phandle1: node1 { 905 * #list-cells = <2>; 906 * } 907 * 908 * phandle2: node2 { 909 * #list-cells = <1>; 910 * } 911 * 912 * node3 { 913 * list = <&phandle1 1 2 &phandle2 3>; 914 * } 915 * 916 * To get a device_node of the `node2' node you may call this: 917 * of_parse_phandle_with_args(node3, "list", "#list-cells", 1, &args); 918 */ 919 int of_parse_phandle_with_args(struct device_node *np, const char *list_name, 920 const char *cells_name, int index, 921 struct of_phandle_args *out_args) 922 { 923 const __be32 *list, *list_end; 924 int size, cur_index = 0; 925 uint32_t count = 0; 926 struct device_node *node = NULL; 927 phandle phandle; 928 929 /* Retrieve the phandle list property */ 930 list = of_get_property(np, list_name, &size); 931 if (!list) 932 return -ENOENT; 933 list_end = list + size / sizeof(*list); 934 935 /* Loop over the phandles until all the requested entry is found */ 936 while (list < list_end) { 937 count = 0; 938 939 /* 940 * If phandle is 0, then it is an empty entry with no 941 * arguments. Skip forward to the next entry. 942 */ 943 phandle = be32_to_cpup(list++); 944 if (phandle) { 945 /* 946 * Find the provider node and parse the #*-cells 947 * property to determine the argument length 948 */ 949 node = of_find_node_by_phandle(phandle); 950 if (!node) { 951 pr_err("%s: could not find phandle\n", 952 np->full_name); 953 break; 954 } 955 if (of_property_read_u32(node, cells_name, &count)) { 956 pr_err("%s: could not get %s for %s\n", 957 np->full_name, cells_name, 958 node->full_name); 959 break; 960 } 961 962 /* 963 * Make sure that the arguments actually fit in the 964 * remaining property data length 965 */ 966 if (list + count > list_end) { 967 pr_err("%s: arguments longer than property\n", 968 np->full_name); 969 break; 970 } 971 } 972 973 /* 974 * All of the error cases above bail out of the loop, so at 975 * this point, the parsing is successful. If the requested 976 * index matches, then fill the out_args structure and return, 977 * or return -ENOENT for an empty entry. 978 */ 979 if (cur_index == index) { 980 if (!phandle) 981 return -ENOENT; 982 983 if (out_args) { 984 int i; 985 if (WARN_ON(count > MAX_PHANDLE_ARGS)) 986 count = MAX_PHANDLE_ARGS; 987 out_args->np = node; 988 out_args->args_count = count; 989 for (i = 0; i < count; i++) 990 out_args->args[i] = be32_to_cpup(list++); 991 } 992 return 0; 993 } 994 995 of_node_put(node); 996 node = NULL; 997 list += count; 998 cur_index++; 999 } 1000 1001 /* Loop exited without finding a valid entry; return an error */ 1002 if (node) 1003 of_node_put(node); 1004 return -EINVAL; 1005 } 1006 EXPORT_SYMBOL(of_parse_phandle_with_args); 1007 1008 /** 1009 * prom_add_property - Add a property to a node 1010 */ 1011 int prom_add_property(struct device_node *np, struct property *prop) 1012 { 1013 struct property **next; 1014 unsigned long flags; 1015 1016 prop->next = NULL; 1017 write_lock_irqsave(&devtree_lock, flags); 1018 next = &np->properties; 1019 while (*next) { 1020 if (strcmp(prop->name, (*next)->name) == 0) { 1021 /* duplicate ! don't insert it */ 1022 write_unlock_irqrestore(&devtree_lock, flags); 1023 return -1; 1024 } 1025 next = &(*next)->next; 1026 } 1027 *next = prop; 1028 write_unlock_irqrestore(&devtree_lock, flags); 1029 1030 #ifdef CONFIG_PROC_DEVICETREE 1031 /* try to add to proc as well if it was initialized */ 1032 if (np->pde) 1033 proc_device_tree_add_prop(np->pde, prop); 1034 #endif /* CONFIG_PROC_DEVICETREE */ 1035 1036 return 0; 1037 } 1038 1039 /** 1040 * prom_remove_property - Remove a property from a node. 1041 * 1042 * Note that we don't actually remove it, since we have given out 1043 * who-knows-how-many pointers to the data using get-property. 1044 * Instead we just move the property to the "dead properties" 1045 * list, so it won't be found any more. 1046 */ 1047 int prom_remove_property(struct device_node *np, struct property *prop) 1048 { 1049 struct property **next; 1050 unsigned long flags; 1051 int found = 0; 1052 1053 write_lock_irqsave(&devtree_lock, flags); 1054 next = &np->properties; 1055 while (*next) { 1056 if (*next == prop) { 1057 /* found the node */ 1058 *next = prop->next; 1059 prop->next = np->deadprops; 1060 np->deadprops = prop; 1061 found = 1; 1062 break; 1063 } 1064 next = &(*next)->next; 1065 } 1066 write_unlock_irqrestore(&devtree_lock, flags); 1067 1068 if (!found) 1069 return -ENODEV; 1070 1071 #ifdef CONFIG_PROC_DEVICETREE 1072 /* try to remove the proc node as well */ 1073 if (np->pde) 1074 proc_device_tree_remove_prop(np->pde, prop); 1075 #endif /* CONFIG_PROC_DEVICETREE */ 1076 1077 return 0; 1078 } 1079 1080 /* 1081 * prom_update_property - Update a property in a node, if the property does 1082 * not exist, add it. 1083 * 1084 * Note that we don't actually remove it, since we have given out 1085 * who-knows-how-many pointers to the data using get-property. 1086 * Instead we just move the property to the "dead properties" list, 1087 * and add the new property to the property list 1088 */ 1089 int prom_update_property(struct device_node *np, 1090 struct property *newprop) 1091 { 1092 struct property **next, *oldprop; 1093 unsigned long flags; 1094 int found = 0; 1095 1096 if (!newprop->name) 1097 return -EINVAL; 1098 1099 oldprop = of_find_property(np, newprop->name, NULL); 1100 if (!oldprop) 1101 return prom_add_property(np, newprop); 1102 1103 write_lock_irqsave(&devtree_lock, flags); 1104 next = &np->properties; 1105 while (*next) { 1106 if (*next == oldprop) { 1107 /* found the node */ 1108 newprop->next = oldprop->next; 1109 *next = newprop; 1110 oldprop->next = np->deadprops; 1111 np->deadprops = oldprop; 1112 found = 1; 1113 break; 1114 } 1115 next = &(*next)->next; 1116 } 1117 write_unlock_irqrestore(&devtree_lock, flags); 1118 1119 if (!found) 1120 return -ENODEV; 1121 1122 #ifdef CONFIG_PROC_DEVICETREE 1123 /* try to add to proc as well if it was initialized */ 1124 if (np->pde) 1125 proc_device_tree_update_prop(np->pde, newprop, oldprop); 1126 #endif /* CONFIG_PROC_DEVICETREE */ 1127 1128 return 0; 1129 } 1130 1131 #if defined(CONFIG_OF_DYNAMIC) 1132 /* 1133 * Support for dynamic device trees. 1134 * 1135 * On some platforms, the device tree can be manipulated at runtime. 1136 * The routines in this section support adding, removing and changing 1137 * device tree nodes. 1138 */ 1139 1140 /** 1141 * of_attach_node - Plug a device node into the tree and global list. 1142 */ 1143 void of_attach_node(struct device_node *np) 1144 { 1145 unsigned long flags; 1146 1147 write_lock_irqsave(&devtree_lock, flags); 1148 np->sibling = np->parent->child; 1149 np->allnext = allnodes; 1150 np->parent->child = np; 1151 allnodes = np; 1152 write_unlock_irqrestore(&devtree_lock, flags); 1153 } 1154 1155 /** 1156 * of_detach_node - "Unplug" a node from the device tree. 1157 * 1158 * The caller must hold a reference to the node. The memory associated with 1159 * the node is not freed until its refcount goes to zero. 1160 */ 1161 void of_detach_node(struct device_node *np) 1162 { 1163 struct device_node *parent; 1164 unsigned long flags; 1165 1166 write_lock_irqsave(&devtree_lock, flags); 1167 1168 parent = np->parent; 1169 if (!parent) 1170 goto out_unlock; 1171 1172 if (allnodes == np) 1173 allnodes = np->allnext; 1174 else { 1175 struct device_node *prev; 1176 for (prev = allnodes; 1177 prev->allnext != np; 1178 prev = prev->allnext) 1179 ; 1180 prev->allnext = np->allnext; 1181 } 1182 1183 if (parent->child == np) 1184 parent->child = np->sibling; 1185 else { 1186 struct device_node *prevsib; 1187 for (prevsib = np->parent->child; 1188 prevsib->sibling != np; 1189 prevsib = prevsib->sibling) 1190 ; 1191 prevsib->sibling = np->sibling; 1192 } 1193 1194 of_node_set_flag(np, OF_DETACHED); 1195 1196 out_unlock: 1197 write_unlock_irqrestore(&devtree_lock, flags); 1198 } 1199 #endif /* defined(CONFIG_OF_DYNAMIC) */ 1200 1201 static void of_alias_add(struct alias_prop *ap, struct device_node *np, 1202 int id, const char *stem, int stem_len) 1203 { 1204 ap->np = np; 1205 ap->id = id; 1206 strncpy(ap->stem, stem, stem_len); 1207 ap->stem[stem_len] = 0; 1208 list_add_tail(&ap->link, &aliases_lookup); 1209 pr_debug("adding DT alias:%s: stem=%s id=%i node=%s\n", 1210 ap->alias, ap->stem, ap->id, of_node_full_name(np)); 1211 } 1212 1213 /** 1214 * of_alias_scan - Scan all properties of 'aliases' node 1215 * 1216 * The function scans all the properties of 'aliases' node and populate 1217 * the the global lookup table with the properties. It returns the 1218 * number of alias_prop found, or error code in error case. 1219 * 1220 * @dt_alloc: An allocator that provides a virtual address to memory 1221 * for the resulting tree 1222 */ 1223 void of_alias_scan(void * (*dt_alloc)(u64 size, u64 align)) 1224 { 1225 struct property *pp; 1226 1227 of_chosen = of_find_node_by_path("/chosen"); 1228 if (of_chosen == NULL) 1229 of_chosen = of_find_node_by_path("/chosen@0"); 1230 of_aliases = of_find_node_by_path("/aliases"); 1231 if (!of_aliases) 1232 return; 1233 1234 for_each_property_of_node(of_aliases, pp) { 1235 const char *start = pp->name; 1236 const char *end = start + strlen(start); 1237 struct device_node *np; 1238 struct alias_prop *ap; 1239 int id, len; 1240 1241 /* Skip those we do not want to proceed */ 1242 if (!strcmp(pp->name, "name") || 1243 !strcmp(pp->name, "phandle") || 1244 !strcmp(pp->name, "linux,phandle")) 1245 continue; 1246 1247 np = of_find_node_by_path(pp->value); 1248 if (!np) 1249 continue; 1250 1251 /* walk the alias backwards to extract the id and work out 1252 * the 'stem' string */ 1253 while (isdigit(*(end-1)) && end > start) 1254 end--; 1255 len = end - start; 1256 1257 if (kstrtoint(end, 10, &id) < 0) 1258 continue; 1259 1260 /* Allocate an alias_prop with enough space for the stem */ 1261 ap = dt_alloc(sizeof(*ap) + len + 1, 4); 1262 if (!ap) 1263 continue; 1264 ap->alias = start; 1265 of_alias_add(ap, np, id, start, len); 1266 } 1267 } 1268 1269 /** 1270 * of_alias_get_id - Get alias id for the given device_node 1271 * @np: Pointer to the given device_node 1272 * @stem: Alias stem of the given device_node 1273 * 1274 * The function travels the lookup table to get alias id for the given 1275 * device_node and alias stem. It returns the alias id if find it. 1276 */ 1277 int of_alias_get_id(struct device_node *np, const char *stem) 1278 { 1279 struct alias_prop *app; 1280 int id = -ENODEV; 1281 1282 mutex_lock(&of_aliases_mutex); 1283 list_for_each_entry(app, &aliases_lookup, link) { 1284 if (strcmp(app->stem, stem) != 0) 1285 continue; 1286 1287 if (np == app->np) { 1288 id = app->id; 1289 break; 1290 } 1291 } 1292 mutex_unlock(&of_aliases_mutex); 1293 1294 return id; 1295 } 1296 EXPORT_SYMBOL_GPL(of_alias_get_id); 1297 1298 const __be32 *of_prop_next_u32(struct property *prop, const __be32 *cur, 1299 u32 *pu) 1300 { 1301 const void *curv = cur; 1302 1303 if (!prop) 1304 return NULL; 1305 1306 if (!cur) { 1307 curv = prop->value; 1308 goto out_val; 1309 } 1310 1311 curv += sizeof(*cur); 1312 if (curv >= prop->value + prop->length) 1313 return NULL; 1314 1315 out_val: 1316 *pu = be32_to_cpup(curv); 1317 return curv; 1318 } 1319 EXPORT_SYMBOL_GPL(of_prop_next_u32); 1320 1321 const char *of_prop_next_string(struct property *prop, const char *cur) 1322 { 1323 const void *curv = cur; 1324 1325 if (!prop) 1326 return NULL; 1327 1328 if (!cur) 1329 return prop->value; 1330 1331 curv += strlen(cur) + 1; 1332 if (curv >= prop->value + prop->length) 1333 return NULL; 1334 1335 return curv; 1336 } 1337 EXPORT_SYMBOL_GPL(of_prop_next_string); 1338