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