| /* SPDX-License-Identifier: GPL-2.0+ */ | |
| /* | |
| * Copyright (c) 2017 Google, Inc | |
| * Written by Simon Glass <sjg@chromium.org> | |
| */ | |
| #ifndef _DM_OF_H | |
| #define _DM_OF_H | |
| #include <asm/global_data.h> | |
| /* integer value within a device tree property which references another node */ | |
| typedef u32 phandle; | |
| /** | |
| * struct property: Device tree property | |
| * | |
| * @name: Property name | |
| * @length: Length of property in bytes | |
| * @value: Pointer to property value | |
| * @next: Pointer to next property, or NULL if none | |
| */ | |
| struct property { | |
| char *name; | |
| int length; | |
| void *value; | |
| struct property *next; | |
| }; | |
| /** | |
| * struct device_node: Device tree node | |
| * | |
| * The top of this tree is typically gd->of_root which points to the root node. | |
| * | |
| * The head of the list of children for the root node (and any other node) is | |
| * in @child, with @sibling providing a link to the next child. | |
| * | |
| * Each child has a pointer to its parent in @parent. | |
| * | |
| * A node may have properties in which case the head of the list of properties | |
| * @properties pointers to the first one, with struct property->@next pointing | |
| * to the next one. | |
| * | |
| * @name: Node name, "" for the root node | |
| * @type: Node type (value of device_type property) or "<NULL>" if none | |
| * @phandle: Phandle value of this none, or 0 if none | |
| * @full_name: Full path to node, e.g. "/bus@1/spi@1100" ("/" for the root node) | |
| * @properties: Pointer to head of list of properties, or NULL if none | |
| * @parent: Pointer to parent node, or NULL if this is the root node | |
| * @child: Pointer to head of child node list, or NULL if no children | |
| * @sibling: Pointer to the next sibling node, or NULL if this is the last | |
| */ | |
| struct device_node { | |
| const char *name; | |
| const char *type; | |
| phandle phandle; | |
| const char *full_name; | |
| struct property *properties; | |
| struct device_node *parent; | |
| struct device_node *child; | |
| struct device_node *sibling; | |
| }; | |
| #define BAD_OF_ROOT 0xdead11e3 | |
| #define OF_MAX_PHANDLE_ARGS 16 | |
| /** | |
| * struct of_phandle_args - structure to hold phandle and arguments | |
| * | |
| * This is used when decoding a phandle in a device tree property. Typically | |
| * these look like this:: | |
| * | |
| * wibble { | |
| * phandle = <5>; | |
| * }; | |
| * ... | |
| * some-prop = <&wibble 1 2 3> | |
| * | |
| * Here &node is the phandle of the node 'wibble', i.e. 5. There are three | |
| * arguments: 1, 2, 3. | |
| * | |
| * So when decoding the phandle in some-prop, np will point to wibble, | |
| * args_count will be 3 and the three arguments will be in args. | |
| * | |
| * @np: Node that the phandle refers to | |
| * @args_count: Number of arguments | |
| * @args: Argument values | |
| */ | |
| struct of_phandle_args { | |
| struct device_node *np; | |
| int args_count; | |
| uint32_t args[OF_MAX_PHANDLE_ARGS]; | |
| }; | |
| DECLARE_GLOBAL_DATA_PTR; | |
| /** | |
| * of_live_active() - check if livetree is active | |
| * | |
| * @returns true if livetree is active, false it not | |
| */ | |
| static inline bool of_live_active(void) | |
| { | |
| return gd_of_root() != NULL; | |
| } | |
| #define OF_BAD_ADDR ((u64)-1) | |
| static inline const char *of_node_full_name(const struct device_node *np) | |
| { | |
| return np ? np->full_name : "<no-node>"; | |
| } | |
| /* Default #address and #size cells */ | |
| #if !defined(OF_ROOT_NODE_ADDR_CELLS_DEFAULT) | |
| #define OF_ROOT_NODE_ADDR_CELLS_DEFAULT 2 | |
| #define OF_ROOT_NODE_SIZE_CELLS_DEFAULT 1 | |
| #endif | |
| /* Default string compare functions */ | |
| #if !defined(of_compat_cmp) | |
| #define of_compat_cmp(s1, s2, l) strcasecmp((s1), (s2)) | |
| #define of_prop_cmp(s1, s2) strcmp((s1), (s2)) | |
| #define of_node_cmp(s1, s2) strcasecmp((s1), (s2)) | |
| #endif | |
| /* Helper to read a big number; size is in cells (not bytes) */ | |
| static inline u64 of_read_number(const __be32 *cell, int size) | |
| { | |
| u64 r = 0; | |
| while (size--) | |
| r = (r << 32) | be32_to_cpu(*(cell++)); | |
| return r; | |
| } | |
| /* Like of_read_number, but we want an unsigned long result */ | |
| static inline unsigned long of_read_ulong(const __be32 *cell, int size) | |
| { | |
| /* toss away upper bits if unsigned long is smaller than u64 */ | |
| return of_read_number(cell, size); | |
| } | |
| #endif |