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