1*5e060d8bSSimon Glass /* 2*5e060d8bSSimon Glass * Copyright (c) 2017 Google, Inc 3*5e060d8bSSimon Glass * Written by Simon Glass <sjg@chromium.org> 4*5e060d8bSSimon Glass * 5*5e060d8bSSimon Glass * SPDX-License-Identifier: GPL-2.0+ 6*5e060d8bSSimon Glass */ 7*5e060d8bSSimon Glass 8*5e060d8bSSimon Glass #ifndef _DM_OF_H 9*5e060d8bSSimon Glass #define _DM_OF_H 10*5e060d8bSSimon Glass 11*5e060d8bSSimon Glass #include <asm/u-boot.h> 12*5e060d8bSSimon Glass #include <asm/global_data.h> 13*5e060d8bSSimon Glass 14*5e060d8bSSimon Glass /* integer value within a device tree property which references another node */ 15*5e060d8bSSimon Glass typedef u32 phandle; 16*5e060d8bSSimon Glass 17*5e060d8bSSimon Glass /** 18*5e060d8bSSimon Glass * struct property: Device tree property 19*5e060d8bSSimon Glass * 20*5e060d8bSSimon Glass * @name: Property name 21*5e060d8bSSimon Glass * @length: Length of property in bytes 22*5e060d8bSSimon Glass * @value: Pointer to property value 23*5e060d8bSSimon Glass * @next: Pointer to next property, or NULL if none 24*5e060d8bSSimon Glass */ 25*5e060d8bSSimon Glass struct property { 26*5e060d8bSSimon Glass char *name; 27*5e060d8bSSimon Glass int length; 28*5e060d8bSSimon Glass void *value; 29*5e060d8bSSimon Glass struct property *next; 30*5e060d8bSSimon Glass }; 31*5e060d8bSSimon Glass 32*5e060d8bSSimon Glass /** 33*5e060d8bSSimon Glass * struct device_node: Device tree node 34*5e060d8bSSimon Glass * 35*5e060d8bSSimon Glass * @name: Node name 36*5e060d8bSSimon Glass * @type: Node type (value of device_type property) or "<NULL>" if none 37*5e060d8bSSimon Glass * @phandle: Phandle value of this none, or 0 if none 38*5e060d8bSSimon Glass * @full_name: Full path to node, e.g. "/bus@1/spi@1100" 39*5e060d8bSSimon Glass * @properties: Pointer to head of list of properties, or NULL if none 40*5e060d8bSSimon Glass * @parent: Pointer to parent node, or NULL if this is the root node 41*5e060d8bSSimon Glass * @child: Pointer to head of child node list, or NULL if no children 42*5e060d8bSSimon Glass * @sibling: Pointer to the next sibling node, or NULL if this is the last 43*5e060d8bSSimon Glass */ 44*5e060d8bSSimon Glass struct device_node { 45*5e060d8bSSimon Glass const char *name; 46*5e060d8bSSimon Glass const char *type; 47*5e060d8bSSimon Glass phandle phandle; 48*5e060d8bSSimon Glass const char *full_name; 49*5e060d8bSSimon Glass 50*5e060d8bSSimon Glass struct property *properties; 51*5e060d8bSSimon Glass struct device_node *parent; 52*5e060d8bSSimon Glass struct device_node *child; 53*5e060d8bSSimon Glass struct device_node *sibling; 54*5e060d8bSSimon Glass }; 55*5e060d8bSSimon Glass 56*5e060d8bSSimon Glass #define OF_MAX_PHANDLE_ARGS 16 57*5e060d8bSSimon Glass 58*5e060d8bSSimon Glass /** 59*5e060d8bSSimon Glass * struct of_phandle_args - structure to hold phandle and arguments 60*5e060d8bSSimon Glass * 61*5e060d8bSSimon Glass * This is used when decoding a phandle in a device tree property. Typically 62*5e060d8bSSimon Glass * these look like this: 63*5e060d8bSSimon Glass * 64*5e060d8bSSimon Glass * wibble { 65*5e060d8bSSimon Glass * phandle = <5>; 66*5e060d8bSSimon Glass * }; 67*5e060d8bSSimon Glass * 68*5e060d8bSSimon Glass * ... 69*5e060d8bSSimon Glass * some-prop = <&wibble 1 2 3> 70*5e060d8bSSimon Glass * 71*5e060d8bSSimon Glass * Here &node is the phandle of the node 'wibble', i.e. 5. There are three 72*5e060d8bSSimon Glass * arguments: 1, 2, 3. 73*5e060d8bSSimon Glass * 74*5e060d8bSSimon Glass * So when decoding the phandle in some-prop, np will point to wibble, 75*5e060d8bSSimon Glass * args_count will be 3 and the three arguments will be in args. 76*5e060d8bSSimon Glass * 77*5e060d8bSSimon Glass * @np: Node that the phandle refers to 78*5e060d8bSSimon Glass * @args_count: Number of arguments 79*5e060d8bSSimon Glass * @args: Argument values 80*5e060d8bSSimon Glass */ 81*5e060d8bSSimon Glass struct of_phandle_args { 82*5e060d8bSSimon Glass struct device_node *np; 83*5e060d8bSSimon Glass int args_count; 84*5e060d8bSSimon Glass uint32_t args[OF_MAX_PHANDLE_ARGS]; 85*5e060d8bSSimon Glass }; 86*5e060d8bSSimon Glass 87*5e060d8bSSimon Glass DECLARE_GLOBAL_DATA_PTR; 88*5e060d8bSSimon Glass 89*5e060d8bSSimon Glass /** 90*5e060d8bSSimon Glass * of_live_active() - check if livetree is active 91*5e060d8bSSimon Glass * 92*5e060d8bSSimon Glass * @returns true if livetree is active, false it not 93*5e060d8bSSimon Glass */ 94*5e060d8bSSimon Glass #ifdef CONFIG_OF_LIVE 95*5e060d8bSSimon Glass static inline bool of_live_active(void) 96*5e060d8bSSimon Glass { 97*5e060d8bSSimon Glass return gd->of_root != NULL; 98*5e060d8bSSimon Glass } 99*5e060d8bSSimon Glass #else 100*5e060d8bSSimon Glass static inline bool of_live_active(void) 101*5e060d8bSSimon Glass { 102*5e060d8bSSimon Glass return false; 103*5e060d8bSSimon Glass } 104*5e060d8bSSimon Glass #endif 105*5e060d8bSSimon Glass 106*5e060d8bSSimon Glass #endif 107