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. 13 * 14 * This program is free software; you can redistribute it and/or 15 * modify it under the terms of the GNU General Public License 16 * as published by the Free Software Foundation; either version 17 * 2 of the License, or (at your option) any later version. 18 */ 19 #include <linux/module.h> 20 #include <linux/of.h> 21 #include <linux/spinlock.h> 22 23 struct device_node *allnodes; 24 25 /* use when traversing tree through the allnext, child, sibling, 26 * or parent members of struct device_node. 27 */ 28 DEFINE_RWLOCK(devtree_lock); 29 30 int of_n_addr_cells(struct device_node *np) 31 { 32 const int *ip; 33 34 do { 35 if (np->parent) 36 np = np->parent; 37 ip = of_get_property(np, "#address-cells", NULL); 38 if (ip) 39 return *ip; 40 } while (np->parent); 41 /* No #address-cells property for the root node */ 42 return OF_ROOT_NODE_ADDR_CELLS_DEFAULT; 43 } 44 EXPORT_SYMBOL(of_n_addr_cells); 45 46 int of_n_size_cells(struct device_node *np) 47 { 48 const int *ip; 49 50 do { 51 if (np->parent) 52 np = np->parent; 53 ip = of_get_property(np, "#size-cells", NULL); 54 if (ip) 55 return *ip; 56 } while (np->parent); 57 /* No #size-cells property for the root node */ 58 return OF_ROOT_NODE_SIZE_CELLS_DEFAULT; 59 } 60 EXPORT_SYMBOL(of_n_size_cells); 61 62 struct property *of_find_property(const struct device_node *np, 63 const char *name, 64 int *lenp) 65 { 66 struct property *pp; 67 68 if (!np) 69 return NULL; 70 71 read_lock(&devtree_lock); 72 for (pp = np->properties; pp != 0; pp = pp->next) { 73 if (of_prop_cmp(pp->name, name) == 0) { 74 if (lenp != 0) 75 *lenp = pp->length; 76 break; 77 } 78 } 79 read_unlock(&devtree_lock); 80 81 return pp; 82 } 83 EXPORT_SYMBOL(of_find_property); 84 85 /* 86 * Find a property with a given name for a given node 87 * and return the value. 88 */ 89 const void *of_get_property(const struct device_node *np, const char *name, 90 int *lenp) 91 { 92 struct property *pp = of_find_property(np, name, lenp); 93 94 return pp ? pp->value : NULL; 95 } 96 EXPORT_SYMBOL(of_get_property); 97 98 /** Checks if the given "compat" string matches one of the strings in 99 * the device's "compatible" property 100 */ 101 int of_device_is_compatible(const struct device_node *device, 102 const char *compat) 103 { 104 const char* cp; 105 int cplen, l; 106 107 cp = of_get_property(device, "compatible", &cplen); 108 if (cp == NULL) 109 return 0; 110 while (cplen > 0) { 111 if (of_compat_cmp(cp, compat, strlen(compat)) == 0) 112 return 1; 113 l = strlen(cp) + 1; 114 cp += l; 115 cplen -= l; 116 } 117 118 return 0; 119 } 120 EXPORT_SYMBOL(of_device_is_compatible); 121 122 /** 123 * of_device_is_available - check if a device is available for use 124 * 125 * @device: Node to check for availability 126 * 127 * Returns 1 if the status property is absent or set to "okay" or "ok", 128 * 0 otherwise 129 */ 130 int of_device_is_available(const struct device_node *device) 131 { 132 const char *status; 133 int statlen; 134 135 status = of_get_property(device, "status", &statlen); 136 if (status == NULL) 137 return 1; 138 139 if (statlen > 0) { 140 if (!strcmp(status, "okay") || !strcmp(status, "ok")) 141 return 1; 142 } 143 144 return 0; 145 } 146 EXPORT_SYMBOL(of_device_is_available); 147 148 /** 149 * of_get_parent - Get a node's parent if any 150 * @node: Node to get parent 151 * 152 * Returns a node pointer with refcount incremented, use 153 * of_node_put() on it when done. 154 */ 155 struct device_node *of_get_parent(const struct device_node *node) 156 { 157 struct device_node *np; 158 159 if (!node) 160 return NULL; 161 162 read_lock(&devtree_lock); 163 np = of_node_get(node->parent); 164 read_unlock(&devtree_lock); 165 return np; 166 } 167 EXPORT_SYMBOL(of_get_parent); 168 169 /** 170 * of_get_next_parent - Iterate to a node's parent 171 * @node: Node to get parent of 172 * 173 * This is like of_get_parent() except that it drops the 174 * refcount on the passed node, making it suitable for iterating 175 * through a node's parents. 176 * 177 * Returns a node pointer with refcount incremented, use 178 * of_node_put() on it when done. 179 */ 180 struct device_node *of_get_next_parent(struct device_node *node) 181 { 182 struct device_node *parent; 183 184 if (!node) 185 return NULL; 186 187 read_lock(&devtree_lock); 188 parent = of_node_get(node->parent); 189 of_node_put(node); 190 read_unlock(&devtree_lock); 191 return parent; 192 } 193 194 /** 195 * of_get_next_child - Iterate a node childs 196 * @node: parent node 197 * @prev: previous child of the parent node, or NULL to get first 198 * 199 * Returns a node pointer with refcount incremented, use 200 * of_node_put() on it when done. 201 */ 202 struct device_node *of_get_next_child(const struct device_node *node, 203 struct device_node *prev) 204 { 205 struct device_node *next; 206 207 read_lock(&devtree_lock); 208 next = prev ? prev->sibling : node->child; 209 for (; next; next = next->sibling) 210 if (of_node_get(next)) 211 break; 212 of_node_put(prev); 213 read_unlock(&devtree_lock); 214 return next; 215 } 216 EXPORT_SYMBOL(of_get_next_child); 217 218 /** 219 * of_find_node_by_path - Find a node matching a full OF path 220 * @path: The full path to match 221 * 222 * Returns a node pointer with refcount incremented, use 223 * of_node_put() on it when done. 224 */ 225 struct device_node *of_find_node_by_path(const char *path) 226 { 227 struct device_node *np = allnodes; 228 229 read_lock(&devtree_lock); 230 for (; np; np = np->allnext) { 231 if (np->full_name && (of_node_cmp(np->full_name, path) == 0) 232 && of_node_get(np)) 233 break; 234 } 235 read_unlock(&devtree_lock); 236 return np; 237 } 238 EXPORT_SYMBOL(of_find_node_by_path); 239 240 /** 241 * of_find_node_by_name - Find a node by its "name" property 242 * @from: The node to start searching from or NULL, the node 243 * you pass will not be searched, only the next one 244 * will; typically, you pass what the previous call 245 * returned. of_node_put() will be called on it 246 * @name: The name string to match against 247 * 248 * Returns a node pointer with refcount incremented, use 249 * of_node_put() on it when done. 250 */ 251 struct device_node *of_find_node_by_name(struct device_node *from, 252 const char *name) 253 { 254 struct device_node *np; 255 256 read_lock(&devtree_lock); 257 np = from ? from->allnext : allnodes; 258 for (; np; np = np->allnext) 259 if (np->name && (of_node_cmp(np->name, name) == 0) 260 && of_node_get(np)) 261 break; 262 of_node_put(from); 263 read_unlock(&devtree_lock); 264 return np; 265 } 266 EXPORT_SYMBOL(of_find_node_by_name); 267 268 /** 269 * of_find_node_by_type - Find a node by its "device_type" property 270 * @from: The node to start searching from, or NULL to start searching 271 * the entire device tree. The node you pass will not be 272 * searched, only the next one will; typically, you pass 273 * what the previous call returned. of_node_put() will be 274 * called on from for you. 275 * @type: The type string to match against 276 * 277 * Returns a node pointer with refcount incremented, use 278 * of_node_put() on it when done. 279 */ 280 struct device_node *of_find_node_by_type(struct device_node *from, 281 const char *type) 282 { 283 struct device_node *np; 284 285 read_lock(&devtree_lock); 286 np = from ? from->allnext : allnodes; 287 for (; np; np = np->allnext) 288 if (np->type && (of_node_cmp(np->type, type) == 0) 289 && of_node_get(np)) 290 break; 291 of_node_put(from); 292 read_unlock(&devtree_lock); 293 return np; 294 } 295 EXPORT_SYMBOL(of_find_node_by_type); 296 297 /** 298 * of_find_compatible_node - Find a node based on type and one of the 299 * tokens in its "compatible" property 300 * @from: The node to start searching from or NULL, the node 301 * you pass will not be searched, only the next one 302 * will; typically, you pass what the previous call 303 * returned. of_node_put() will be called on it 304 * @type: The type string to match "device_type" or NULL to ignore 305 * @compatible: The string to match to one of the tokens in the device 306 * "compatible" list. 307 * 308 * Returns a node pointer with refcount incremented, use 309 * of_node_put() on it when done. 310 */ 311 struct device_node *of_find_compatible_node(struct device_node *from, 312 const char *type, const char *compatible) 313 { 314 struct device_node *np; 315 316 read_lock(&devtree_lock); 317 np = from ? from->allnext : allnodes; 318 for (; np; np = np->allnext) { 319 if (type 320 && !(np->type && (of_node_cmp(np->type, type) == 0))) 321 continue; 322 if (of_device_is_compatible(np, compatible) && of_node_get(np)) 323 break; 324 } 325 of_node_put(from); 326 read_unlock(&devtree_lock); 327 return np; 328 } 329 EXPORT_SYMBOL(of_find_compatible_node); 330 331 /** 332 * of_match_node - Tell if an device_node has a matching of_match structure 333 * @matches: array of of device match structures to search in 334 * @node: the of device structure to match against 335 * 336 * Low level utility function used by device matching. 337 */ 338 const struct of_device_id *of_match_node(const struct of_device_id *matches, 339 const struct device_node *node) 340 { 341 while (matches->name[0] || matches->type[0] || matches->compatible[0]) { 342 int match = 1; 343 if (matches->name[0]) 344 match &= node->name 345 && !strcmp(matches->name, node->name); 346 if (matches->type[0]) 347 match &= node->type 348 && !strcmp(matches->type, node->type); 349 if (matches->compatible[0]) 350 match &= of_device_is_compatible(node, 351 matches->compatible); 352 if (match) 353 return matches; 354 matches++; 355 } 356 return NULL; 357 } 358 EXPORT_SYMBOL(of_match_node); 359 360 /** 361 * of_find_matching_node - Find a node based on an of_device_id match 362 * table. 363 * @from: The node to start searching from or NULL, the node 364 * you pass will not be searched, only the next one 365 * will; typically, you pass what the previous call 366 * returned. of_node_put() will be called on it 367 * @matches: array of of device match structures to search in 368 * 369 * Returns a node pointer with refcount incremented, use 370 * of_node_put() on it when done. 371 */ 372 struct device_node *of_find_matching_node(struct device_node *from, 373 const struct of_device_id *matches) 374 { 375 struct device_node *np; 376 377 read_lock(&devtree_lock); 378 np = from ? from->allnext : allnodes; 379 for (; np; np = np->allnext) { 380 if (of_match_node(matches, np) && of_node_get(np)) 381 break; 382 } 383 of_node_put(from); 384 read_unlock(&devtree_lock); 385 return np; 386 } 387 EXPORT_SYMBOL(of_find_matching_node); 388 389 /** 390 * of_modalias_table: Table of explicit compatible ==> modalias mappings 391 * 392 * This table allows particulare compatible property values to be mapped 393 * to modalias strings. This is useful for busses which do not directly 394 * understand the OF device tree but are populated based on data contained 395 * within the device tree. SPI and I2C are the two current users of this 396 * table. 397 * 398 * In most cases, devices do not need to be listed in this table because 399 * the modalias value can be derived directly from the compatible table. 400 * However, if for any reason a value cannot be derived, then this table 401 * provides a method to override the implicit derivation. 402 * 403 * At the moment, a single table is used for all bus types because it is 404 * assumed that the data size is small and that the compatible values 405 * should already be distinct enough to differentiate between SPI, I2C 406 * and other devices. 407 */ 408 struct of_modalias_table { 409 char *of_device; 410 char *modalias; 411 }; 412 static struct of_modalias_table of_modalias_table[] = { 413 { "fsl,mcu-mpc8349emitx", "mcu-mpc8349emitx" }, 414 }; 415 416 /** 417 * of_modalias_node - Lookup appropriate modalias for a device node 418 * @node: pointer to a device tree node 419 * @modalias: Pointer to buffer that modalias value will be copied into 420 * @len: Length of modalias value 421 * 422 * Based on the value of the compatible property, this routine will determine 423 * an appropriate modalias value for a particular device tree node. Two 424 * separate methods are attempted to derive a modalias value. 425 * 426 * First method is to lookup the compatible value in of_modalias_table. 427 * Second is to strip off the manufacturer prefix from the first 428 * compatible entry and use the remainder as modalias 429 * 430 * This routine returns 0 on success 431 */ 432 int of_modalias_node(struct device_node *node, char *modalias, int len) 433 { 434 int i, cplen; 435 const char *compatible; 436 const char *p; 437 438 /* 1. search for exception list entry */ 439 for (i = 0; i < ARRAY_SIZE(of_modalias_table); i++) { 440 compatible = of_modalias_table[i].of_device; 441 if (!of_device_is_compatible(node, compatible)) 442 continue; 443 strlcpy(modalias, of_modalias_table[i].modalias, len); 444 return 0; 445 } 446 447 compatible = of_get_property(node, "compatible", &cplen); 448 if (!compatible) 449 return -ENODEV; 450 451 /* 2. take first compatible entry and strip manufacturer */ 452 p = strchr(compatible, ','); 453 if (!p) 454 return -ENODEV; 455 p++; 456 strlcpy(modalias, p, len); 457 return 0; 458 } 459 EXPORT_SYMBOL_GPL(of_modalias_node); 460 461 /** 462 * of_parse_phandles_with_args - Find a node pointed by phandle in a list 463 * @np: pointer to a device tree node containing a list 464 * @list_name: property name that contains a list 465 * @cells_name: property name that specifies phandles' arguments count 466 * @index: index of a phandle to parse out 467 * @out_node: pointer to device_node struct pointer (will be filled) 468 * @out_args: pointer to arguments pointer (will be filled) 469 * 470 * This function is useful to parse lists of phandles and their arguments. 471 * Returns 0 on success and fills out_node and out_args, on error returns 472 * appropriate errno value. 473 * 474 * Example: 475 * 476 * phandle1: node1 { 477 * #list-cells = <2>; 478 * } 479 * 480 * phandle2: node2 { 481 * #list-cells = <1>; 482 * } 483 * 484 * node3 { 485 * list = <&phandle1 1 2 &phandle2 3>; 486 * } 487 * 488 * To get a device_node of the `node2' node you may call this: 489 * of_parse_phandles_with_args(node3, "list", "#list-cells", 2, &node2, &args); 490 */ 491 int of_parse_phandles_with_args(struct device_node *np, const char *list_name, 492 const char *cells_name, int index, 493 struct device_node **out_node, 494 const void **out_args) 495 { 496 int ret = -EINVAL; 497 const u32 *list; 498 const u32 *list_end; 499 int size; 500 int cur_index = 0; 501 struct device_node *node = NULL; 502 const void *args; 503 504 list = of_get_property(np, list_name, &size); 505 if (!list) { 506 ret = -ENOENT; 507 goto err0; 508 } 509 list_end = list + size / sizeof(*list); 510 511 while (list < list_end) { 512 const u32 *cells; 513 const phandle *phandle; 514 515 phandle = list; 516 args = list + 1; 517 518 /* one cell hole in the list = <>; */ 519 if (!*phandle) { 520 list++; 521 goto next; 522 } 523 524 node = of_find_node_by_phandle(*phandle); 525 if (!node) { 526 pr_debug("%s: could not find phandle\n", 527 np->full_name); 528 goto err0; 529 } 530 531 cells = of_get_property(node, cells_name, &size); 532 if (!cells || size != sizeof(*cells)) { 533 pr_debug("%s: could not get %s for %s\n", 534 np->full_name, cells_name, node->full_name); 535 goto err1; 536 } 537 538 /* Next phandle is at offset of one phandle cell + #cells */ 539 list += 1 + *cells; 540 if (list > list_end) { 541 pr_debug("%s: insufficient arguments length\n", 542 np->full_name); 543 goto err1; 544 } 545 next: 546 if (cur_index == index) 547 break; 548 549 of_node_put(node); 550 node = NULL; 551 cur_index++; 552 } 553 554 if (!node) { 555 ret = -ENOENT; 556 goto err0; 557 } 558 559 *out_node = node; 560 *out_args = args; 561 562 return 0; 563 err1: 564 of_node_put(node); 565 err0: 566 pr_debug("%s failed with status %d\n", __func__, ret); 567 return ret; 568 } 569 EXPORT_SYMBOL(of_parse_phandles_with_args); 570