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_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 */
 400struct 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}
 413EXPORT_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 */
 426struct 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}
 441EXPORT_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 */
 455struct 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}
 470EXPORT_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 */
 486struct 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}
 504EXPORT_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 */
 518struct 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        }
 534out:
 535        of_node_put(from);
 536        read_unlock(&devtree_lock);
 537        return np;
 538}
 539EXPORT_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 */
 548const 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}
 571EXPORT_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 */
 585struct 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}
 600EXPORT_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 */
 615int 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}
 627EXPORT_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 */
 636struct 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}
 648EXPORT_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 */
 665int 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}
 684EXPORT_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 */
 699int 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}
 713EXPORT_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 */
 730int 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}
 743EXPORT_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 */
 763int 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}
 789EXPORT_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 */
 800int 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}
 826EXPORT_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 */
 840int 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}
 861EXPORT_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 */
 873struct device_node *
 874of_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}
 885EXPORT_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 */
 919int 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}
1006EXPORT_SYMBOL(of_parse_phandle_with_args);
1007
1008/**
1009 * prom_add_property - Add a property to a node
1010 */
1011int 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 */
1047int 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 */
1089int 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 */
1143void 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 */
1161void 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
1196out_unlock:
1197        write_unlock_irqrestore(&devtree_lock, flags);
1198}
1199#endif /* defined(CONFIG_OF_DYNAMIC) */
1200
1201static 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 */
1223void 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 */
1277int 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}
1296EXPORT_SYMBOL_GPL(of_alias_get_id);
1297
1298const __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
1315out_val:
1316        *pu = be32_to_cpup(curv);
1317        return curv;
1318}
1319EXPORT_SYMBOL_GPL(of_prop_next_u32);
1320
1321const 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}
1337EXPORT_SYMBOL_GPL(of_prop_next_string);
1338
lxr.linux.no kindly hosted by Redpill Linpro AS, provider of Linux consulting and operations services since 1995.