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