linux/include/linux/of.h
<<
>>
Prefs
   1#ifndef _LINUX_OF_H
   2#define _LINUX_OF_H
   3/*
   4 * Definitions for talking to the Open Firmware PROM on
   5 * Power Macintosh and other computers.
   6 *
   7 * Copyright (C) 1996-2005 Paul Mackerras.
   8 *
   9 * Updates for PPC64 by Peter Bergner & David Engebretsen, IBM Corp.
  10 * Updates for SPARC64 by David S. Miller
  11 * Derived from PowerPC and Sparc prom.h files by Stephen Rothwell, IBM Corp.
  12 *
  13 * This program is free software; you can redistribute it and/or
  14 * modify it under the terms of the GNU General Public License
  15 * as published by the Free Software Foundation; either version
  16 * 2 of the License, or (at your option) any later version.
  17 */
  18#include <linux/types.h>
  19#include <linux/bitops.h>
  20#include <linux/errno.h>
  21#include <linux/kref.h>
  22#include <linux/mod_devicetable.h>
  23#include <linux/spinlock.h>
  24#include <linux/topology.h>
  25#include <linux/notifier.h>
  26
  27#include <asm/byteorder.h>
  28#include <asm/errno.h>
  29
  30typedef u32 phandle;
  31typedef u32 ihandle;
  32
  33struct property {
  34        char    *name;
  35        int     length;
  36        void    *value;
  37        struct property *next;
  38        unsigned long _flags;
  39        unsigned int unique_id;
  40};
  41
  42#if defined(CONFIG_SPARC)
  43struct of_irq_controller;
  44#endif
  45
  46struct device_node {
  47        const char *name;
  48        const char *type;
  49        phandle phandle;
  50        const char *full_name;
  51
  52        struct  property *properties;
  53        struct  property *deadprops;    /* removed properties */
  54        struct  device_node *parent;
  55        struct  device_node *child;
  56        struct  device_node *sibling;
  57        struct  device_node *next;      /* next device of same type */
  58        struct  device_node *allnext;   /* next in list of all nodes */
  59        struct  proc_dir_entry *pde;    /* this node's proc directory */
  60        struct  kref kref;
  61        unsigned long _flags;
  62        void    *data;
  63#if defined(CONFIG_SPARC)
  64        const char *path_component_name;
  65        unsigned int unique_id;
  66        struct of_irq_controller *irq_trans;
  67#endif
  68};
  69
  70#define MAX_PHANDLE_ARGS 8
  71struct of_phandle_args {
  72        struct device_node *np;
  73        int args_count;
  74        uint32_t args[MAX_PHANDLE_ARGS];
  75};
  76
  77#ifdef CONFIG_OF_DYNAMIC
  78extern struct device_node *of_node_get(struct device_node *node);
  79extern void of_node_put(struct device_node *node);
  80#else /* CONFIG_OF_DYNAMIC */
  81/* Dummy ref counting routines - to be implemented later */
  82static inline struct device_node *of_node_get(struct device_node *node)
  83{
  84        return node;
  85}
  86static inline void of_node_put(struct device_node *node) { }
  87#endif /* !CONFIG_OF_DYNAMIC */
  88
  89#ifdef CONFIG_OF
  90
  91/* Pointer for first entry in chain of all nodes. */
  92extern struct device_node *of_allnodes;
  93extern struct device_node *of_chosen;
  94extern struct device_node *of_aliases;
  95extern raw_spinlock_t devtree_lock;
  96
  97static inline bool of_have_populated_dt(void)
  98{
  99        return of_allnodes != NULL;
 100}
 101
 102static inline bool of_node_is_root(const struct device_node *node)
 103{
 104        return node && (node->parent == NULL);
 105}
 106
 107static inline int of_node_check_flag(struct device_node *n, unsigned long flag)
 108{
 109        return test_bit(flag, &n->_flags);
 110}
 111
 112static inline void of_node_set_flag(struct device_node *n, unsigned long flag)
 113{
 114        set_bit(flag, &n->_flags);
 115}
 116
 117extern struct device_node *of_find_all_nodes(struct device_node *prev);
 118
 119/*
 120 * OF address retrieval & translation
 121 */
 122
 123/* Helper to read a big number; size is in cells (not bytes) */
 124static inline u64 of_read_number(const __be32 *cell, int size)
 125{
 126        u64 r = 0;
 127        while (size--)
 128                r = (r << 32) | be32_to_cpu(*(cell++));
 129        return r;
 130}
 131
 132/* Like of_read_number, but we want an unsigned long result */
 133static inline unsigned long of_read_ulong(const __be32 *cell, int size)
 134{
 135        /* toss away upper bits if unsigned long is smaller than u64 */
 136        return of_read_number(cell, size);
 137}
 138
 139#if defined(CONFIG_SPARC)
 140#include <asm/prom.h>
 141#endif
 142
 143/* Default #address and #size cells.  Allow arch asm/prom.h to override */
 144#if !defined(OF_ROOT_NODE_ADDR_CELLS_DEFAULT)
 145#define OF_ROOT_NODE_ADDR_CELLS_DEFAULT 1
 146#define OF_ROOT_NODE_SIZE_CELLS_DEFAULT 1
 147#endif
 148
 149/* Default string compare functions, Allow arch asm/prom.h to override */
 150#if !defined(of_compat_cmp)
 151#define of_compat_cmp(s1, s2, l)        strcasecmp((s1), (s2))
 152#define of_prop_cmp(s1, s2)             strcmp((s1), (s2))
 153#define of_node_cmp(s1, s2)             strcasecmp((s1), (s2))
 154#endif
 155
 156/* flag descriptions */
 157#define OF_DYNAMIC      1 /* node and properties were allocated via kmalloc */
 158#define OF_DETACHED     2 /* node has been detached from the device tree */
 159
 160#define OF_IS_DYNAMIC(x) test_bit(OF_DYNAMIC, &x->_flags)
 161#define OF_MARK_DYNAMIC(x) set_bit(OF_DYNAMIC, &x->_flags)
 162
 163#define OF_BAD_ADDR     ((u64)-1)
 164
 165static inline const char *of_node_full_name(const struct device_node *np)
 166{
 167        return np ? np->full_name : "<no-node>";
 168}
 169
 170extern struct device_node *of_find_node_by_name(struct device_node *from,
 171        const char *name);
 172extern struct device_node *of_find_node_by_type(struct device_node *from,
 173        const char *type);
 174extern struct device_node *of_find_compatible_node(struct device_node *from,
 175        const char *type, const char *compat);
 176extern struct device_node *of_find_matching_node_and_match(
 177        struct device_node *from,
 178        const struct of_device_id *matches,
 179        const struct of_device_id **match);
 180
 181extern struct device_node *of_find_node_by_path(const char *path);
 182extern struct device_node *of_find_node_by_phandle(phandle handle);
 183extern struct device_node *of_get_parent(const struct device_node *node);
 184extern struct device_node *of_get_next_parent(struct device_node *node);
 185extern struct device_node *of_get_next_child(const struct device_node *node,
 186                                             struct device_node *prev);
 187extern struct device_node *of_get_next_available_child(
 188        const struct device_node *node, struct device_node *prev);
 189
 190extern struct device_node *of_get_child_by_name(const struct device_node *node,
 191                                        const char *name);
 192
 193/* cache lookup */
 194extern struct device_node *of_find_next_cache_node(const struct device_node *);
 195extern struct device_node *of_find_node_with_property(
 196        struct device_node *from, const char *prop_name);
 197
 198extern struct property *of_find_property(const struct device_node *np,
 199                                         const char *name,
 200                                         int *lenp);
 201extern int of_property_read_u32_index(const struct device_node *np,
 202                                       const char *propname,
 203                                       u32 index, u32 *out_value);
 204extern int of_property_read_u8_array(const struct device_node *np,
 205                        const char *propname, u8 *out_values, size_t sz);
 206extern int of_property_read_u16_array(const struct device_node *np,
 207                        const char *propname, u16 *out_values, size_t sz);
 208extern int of_property_read_u32_array(const struct device_node *np,
 209                                      const char *propname,
 210                                      u32 *out_values,
 211                                      size_t sz);
 212extern int of_property_read_u64(const struct device_node *np,
 213                                const char *propname, u64 *out_value);
 214
 215extern int of_property_read_string(struct device_node *np,
 216                                   const char *propname,
 217                                   const char **out_string);
 218extern int of_property_read_string_index(struct device_node *np,
 219                                         const char *propname,
 220                                         int index, const char **output);
 221extern int of_property_match_string(struct device_node *np,
 222                                    const char *propname,
 223                                    const char *string);
 224extern int of_property_count_strings(struct device_node *np,
 225                                     const char *propname);
 226extern int of_device_is_compatible(const struct device_node *device,
 227                                   const char *);
 228extern int of_device_is_available(const struct device_node *device);
 229extern const void *of_get_property(const struct device_node *node,
 230                                const char *name,
 231                                int *lenp);
 232extern struct device_node *of_get_cpu_node(int cpu, unsigned int *thread);
 233#define for_each_property_of_node(dn, pp) \
 234        for (pp = dn->properties; pp != NULL; pp = pp->next)
 235
 236extern int of_n_addr_cells(struct device_node *np);
 237extern int of_n_size_cells(struct device_node *np);
 238extern const struct of_device_id *of_match_node(
 239        const struct of_device_id *matches, const struct device_node *node);
 240extern int of_modalias_node(struct device_node *node, char *modalias, int len);
 241extern void of_print_phandle_args(const char *msg, const struct of_phandle_args *args);
 242extern struct device_node *of_parse_phandle(const struct device_node *np,
 243                                            const char *phandle_name,
 244                                            int index);
 245extern int of_parse_phandle_with_args(const struct device_node *np,
 246        const char *list_name, const char *cells_name, int index,
 247        struct of_phandle_args *out_args);
 248extern int of_parse_phandle_with_fixed_args(const struct device_node *np,
 249        const char *list_name, int cells_count, int index,
 250        struct of_phandle_args *out_args);
 251extern int of_count_phandle_with_args(const struct device_node *np,
 252        const char *list_name, const char *cells_name);
 253
 254extern void of_alias_scan(void * (*dt_alloc)(u64 size, u64 align));
 255extern int of_alias_get_id(struct device_node *np, const char *stem);
 256
 257extern int of_machine_is_compatible(const char *compat);
 258
 259extern int of_add_property(struct device_node *np, struct property *prop);
 260extern int of_remove_property(struct device_node *np, struct property *prop);
 261extern int of_update_property(struct device_node *np, struct property *newprop);
 262
 263/* For updating the device tree at runtime */
 264#define OF_RECONFIG_ATTACH_NODE         0x0001
 265#define OF_RECONFIG_DETACH_NODE         0x0002
 266#define OF_RECONFIG_ADD_PROPERTY        0x0003
 267#define OF_RECONFIG_REMOVE_PROPERTY     0x0004
 268#define OF_RECONFIG_UPDATE_PROPERTY     0x0005
 269
 270struct of_prop_reconfig {
 271        struct device_node      *dn;
 272        struct property         *prop;
 273};
 274
 275extern int of_reconfig_notifier_register(struct notifier_block *);
 276extern int of_reconfig_notifier_unregister(struct notifier_block *);
 277extern int of_reconfig_notify(unsigned long, void *);
 278
 279extern int of_attach_node(struct device_node *);
 280extern int of_detach_node(struct device_node *);
 281
 282#define of_match_ptr(_ptr)      (_ptr)
 283
 284/*
 285 * struct property *prop;
 286 * const __be32 *p;
 287 * u32 u;
 288 *
 289 * of_property_for_each_u32(np, "propname", prop, p, u)
 290 *         printk("U32 value: %x\n", u);
 291 */
 292const __be32 *of_prop_next_u32(struct property *prop, const __be32 *cur,
 293                               u32 *pu);
 294/*
 295 * struct property *prop;
 296 * const char *s;
 297 *
 298 * of_property_for_each_string(np, "propname", prop, s)
 299 *         printk("String value: %s\n", s);
 300 */
 301const char *of_prop_next_string(struct property *prop, const char *cur);
 302
 303int of_device_is_stdout_path(struct device_node *dn);
 304
 305#else /* CONFIG_OF */
 306
 307static inline const char* of_node_full_name(struct device_node *np)
 308{
 309        return "<no-node>";
 310}
 311
 312static inline struct device_node *of_find_node_by_name(struct device_node *from,
 313        const char *name)
 314{
 315        return NULL;
 316}
 317
 318static inline struct device_node *of_find_node_by_type(struct device_node *from,
 319        const char *type)
 320{
 321        return NULL;
 322}
 323
 324static inline struct device_node *of_find_matching_node_and_match(
 325        struct device_node *from,
 326        const struct of_device_id *matches,
 327        const struct of_device_id **match)
 328{
 329        return NULL;
 330}
 331
 332static inline struct device_node *of_get_parent(const struct device_node *node)
 333{
 334        return NULL;
 335}
 336
 337static inline struct device_node *of_get_next_child(
 338        const struct device_node *node, struct device_node *prev)
 339{
 340        return NULL;
 341}
 342
 343static inline struct device_node *of_get_next_available_child(
 344        const struct device_node *node, struct device_node *prev)
 345{
 346        return NULL;
 347}
 348
 349static inline struct device_node *of_find_node_with_property(
 350        struct device_node *from, const char *prop_name)
 351{
 352        return NULL;
 353}
 354
 355static inline bool of_have_populated_dt(void)
 356{
 357        return false;
 358}
 359
 360static inline struct device_node *of_get_child_by_name(
 361                                        const struct device_node *node,
 362                                        const char *name)
 363{
 364        return NULL;
 365}
 366
 367static inline int of_device_is_compatible(const struct device_node *device,
 368                                          const char *name)
 369{
 370        return 0;
 371}
 372
 373static inline int of_device_is_available(const struct device_node *device)
 374{
 375        return 0;
 376}
 377
 378static inline struct property *of_find_property(const struct device_node *np,
 379                                                const char *name,
 380                                                int *lenp)
 381{
 382        return NULL;
 383}
 384
 385static inline struct device_node *of_find_compatible_node(
 386                                                struct device_node *from,
 387                                                const char *type,
 388                                                const char *compat)
 389{
 390        return NULL;
 391}
 392
 393static inline int of_property_read_u32_index(const struct device_node *np,
 394                        const char *propname, u32 index, u32 *out_value)
 395{
 396        return -ENOSYS;
 397}
 398
 399static inline int of_property_read_u8_array(const struct device_node *np,
 400                        const char *propname, u8 *out_values, size_t sz)
 401{
 402        return -ENOSYS;
 403}
 404
 405static inline int of_property_read_u16_array(const struct device_node *np,
 406                        const char *propname, u16 *out_values, size_t sz)
 407{
 408        return -ENOSYS;
 409}
 410
 411static inline int of_property_read_u32_array(const struct device_node *np,
 412                                             const char *propname,
 413                                             u32 *out_values, size_t sz)
 414{
 415        return -ENOSYS;
 416}
 417
 418static inline int of_property_read_string(struct device_node *np,
 419                                          const char *propname,
 420                                          const char **out_string)
 421{
 422        return -ENOSYS;
 423}
 424
 425static inline int of_property_read_string_index(struct device_node *np,
 426                                                const char *propname, int index,
 427                                                const char **out_string)
 428{
 429        return -ENOSYS;
 430}
 431
 432static inline int of_property_count_strings(struct device_node *np,
 433                                            const char *propname)
 434{
 435        return -ENOSYS;
 436}
 437
 438static inline const void *of_get_property(const struct device_node *node,
 439                                const char *name,
 440                                int *lenp)
 441{
 442        return NULL;
 443}
 444
 445static inline struct device_node *of_get_cpu_node(int cpu,
 446                                        unsigned int *thread)
 447{
 448        return NULL;
 449}
 450
 451static inline int of_property_read_u64(const struct device_node *np,
 452                                       const char *propname, u64 *out_value)
 453{
 454        return -ENOSYS;
 455}
 456
 457static inline int of_property_match_string(struct device_node *np,
 458                                           const char *propname,
 459                                           const char *string)
 460{
 461        return -ENOSYS;
 462}
 463
 464static inline struct device_node *of_parse_phandle(const struct device_node *np,
 465                                                   const char *phandle_name,
 466                                                   int index)
 467{
 468        return NULL;
 469}
 470
 471static inline int of_parse_phandle_with_args(struct device_node *np,
 472                                             const char *list_name,
 473                                             const char *cells_name,
 474                                             int index,
 475                                             struct of_phandle_args *out_args)
 476{
 477        return -ENOSYS;
 478}
 479
 480static inline int of_parse_phandle_with_fixed_args(const struct device_node *np,
 481        const char *list_name, int cells_count, int index,
 482        struct of_phandle_args *out_args)
 483{
 484        return -ENOSYS;
 485}
 486
 487static inline int of_count_phandle_with_args(struct device_node *np,
 488                                             const char *list_name,
 489                                             const char *cells_name)
 490{
 491        return -ENOSYS;
 492}
 493
 494static inline int of_alias_get_id(struct device_node *np, const char *stem)
 495{
 496        return -ENOSYS;
 497}
 498
 499static inline int of_machine_is_compatible(const char *compat)
 500{
 501        return 0;
 502}
 503
 504static inline int of_device_is_stdout_path(struct device_node *dn)
 505{
 506        return 0;
 507}
 508
 509static inline const __be32 *of_prop_next_u32(struct property *prop,
 510                const __be32 *cur, u32 *pu)
 511{
 512        return NULL;
 513}
 514
 515static inline const char *of_prop_next_string(struct property *prop,
 516                const char *cur)
 517{
 518        return NULL;
 519}
 520
 521#define of_match_ptr(_ptr)      NULL
 522#define of_match_node(_matches, _node)  NULL
 523#endif /* CONFIG_OF */
 524
 525#if defined(CONFIG_OF) && defined(CONFIG_NUMA)
 526extern int of_node_to_nid(struct device_node *np);
 527#else
 528static inline int of_node_to_nid(struct device_node *device) { return 0; }
 529#endif
 530
 531static inline struct device_node *of_find_matching_node(
 532        struct device_node *from,
 533        const struct of_device_id *matches)
 534{
 535        return of_find_matching_node_and_match(from, matches, NULL);
 536}
 537
 538/**
 539 * of_property_read_bool - Findfrom a property
 540 * @np:         device node from which the property value is to be read.
 541 * @propname:   name of the property to be searched.
 542 *
 543 * Search for a property in a device node.
 544 * Returns true if the property exist false otherwise.
 545 */
 546static inline bool of_property_read_bool(const struct device_node *np,
 547                                         const char *propname)
 548{
 549        struct property *prop = of_find_property(np, propname, NULL);
 550
 551        return prop ? true : false;
 552}
 553
 554static inline int of_property_read_u8(const struct device_node *np,
 555                                       const char *propname,
 556                                       u8 *out_value)
 557{
 558        return of_property_read_u8_array(np, propname, out_value, 1);
 559}
 560
 561static inline int of_property_read_u16(const struct device_node *np,
 562                                       const char *propname,
 563                                       u16 *out_value)
 564{
 565        return of_property_read_u16_array(np, propname, out_value, 1);
 566}
 567
 568static inline int of_property_read_u32(const struct device_node *np,
 569                                       const char *propname,
 570                                       u32 *out_value)
 571{
 572        return of_property_read_u32_array(np, propname, out_value, 1);
 573}
 574
 575#define of_property_for_each_u32(np, propname, prop, p, u)      \
 576        for (prop = of_find_property(np, propname, NULL),       \
 577                p = of_prop_next_u32(prop, NULL, &u);           \
 578                p;                                              \
 579                p = of_prop_next_u32(prop, p, &u))
 580
 581#define of_property_for_each_string(np, propname, prop, s)      \
 582        for (prop = of_find_property(np, propname, NULL),       \
 583                s = of_prop_next_string(prop, NULL);            \
 584                s;                                              \
 585                s = of_prop_next_string(prop, s))
 586
 587#define for_each_node_by_name(dn, name) \
 588        for (dn = of_find_node_by_name(NULL, name); dn; \
 589             dn = of_find_node_by_name(dn, name))
 590#define for_each_node_by_type(dn, type) \
 591        for (dn = of_find_node_by_type(NULL, type); dn; \
 592             dn = of_find_node_by_type(dn, type))
 593#define for_each_compatible_node(dn, type, compatible) \
 594        for (dn = of_find_compatible_node(NULL, type, compatible); dn; \
 595             dn = of_find_compatible_node(dn, type, compatible))
 596#define for_each_matching_node(dn, matches) \
 597        for (dn = of_find_matching_node(NULL, matches); dn; \
 598             dn = of_find_matching_node(dn, matches))
 599#define for_each_matching_node_and_match(dn, matches, match) \
 600        for (dn = of_find_matching_node_and_match(NULL, matches, match); \
 601             dn; dn = of_find_matching_node_and_match(dn, matches, match))
 602
 603#define for_each_child_of_node(parent, child) \
 604        for (child = of_get_next_child(parent, NULL); child != NULL; \
 605             child = of_get_next_child(parent, child))
 606#define for_each_available_child_of_node(parent, child) \
 607        for (child = of_get_next_available_child(parent, NULL); child != NULL; \
 608             child = of_get_next_available_child(parent, child))
 609
 610#define for_each_node_with_property(dn, prop_name) \
 611        for (dn = of_find_node_with_property(NULL, prop_name); dn; \
 612             dn = of_find_node_with_property(dn, prop_name))
 613
 614static inline int of_get_child_count(const struct device_node *np)
 615{
 616        struct device_node *child;
 617        int num = 0;
 618
 619        for_each_child_of_node(np, child)
 620                num++;
 621
 622        return num;
 623}
 624
 625static inline int of_get_available_child_count(const struct device_node *np)
 626{
 627        struct device_node *child;
 628        int num = 0;
 629
 630        for_each_available_child_of_node(np, child)
 631                num++;
 632
 633        return num;
 634}
 635
 636#if defined(CONFIG_PROC_FS) && defined(CONFIG_PROC_DEVICETREE)
 637extern void proc_device_tree_add_node(struct device_node *, struct proc_dir_entry *);
 638extern void proc_device_tree_add_prop(struct proc_dir_entry *pde, struct property *prop);
 639extern void proc_device_tree_remove_prop(struct proc_dir_entry *pde,
 640                                         struct property *prop);
 641extern void proc_device_tree_update_prop(struct proc_dir_entry *pde,
 642                                         struct property *newprop,
 643                                         struct property *oldprop);
 644#endif
 645
 646#endif /* _LINUX_OF_H */
 647