Zephyr API Documentation  3.6.0
A Scalable Open Source RTOS
3.6.0
All Data Structures Files Functions Variables Typedefs Enumerations Enumerator Macros Modules Pages
devicetree.h
Go to the documentation of this file.
1/*
2 * SPDX-License-Identifier: Apache-2.0
3 * Copyright (c) 2020 Nordic Semiconductor
4 * Copyright (c) 2020, Linaro Ltd.
5 *
6 * Not a generated file. Feel free to modify.
7 */
8
16#ifndef DEVICETREE_H
17#define DEVICETREE_H
18
19#include <devicetree_generated.h>
21
22#if !defined(_LINKER) && !defined(_ASMLANGUAGE)
23#include <stdint.h>
24#endif
25
26#include <zephyr/sys/util.h>
27
35/*
36 * Property suffixes
37 * -----------------
38 *
39 * These are the optional parts that come after the _P_<property>
40 * part in DT_N_<path-id>_P_<property-id> macros, or the "prop-suf"
41 * nonterminal in the DT guide's macros.bnf file.
42 *
43 * Before adding new ones, check this list to avoid conflicts. If any
44 * are missing from this list, please add them. It should be complete.
45 *
46 * _ENUM_IDX: property's value as an index into bindings enum
47 * _ENUM_VAL_<val>_EXISTS property's value as a token exists
48 * _ENUM_TOKEN: property's value as a token into bindings enum (string
49 * enum values are identifiers) [deprecated, use _STRING_TOKEN]
50 * _ENUM_UPPER_TOKEN: like _ENUM_TOKEN, but uppercased [deprecated, use
51 * _STRING_UPPER_TOKEN]
52 * _EXISTS: property is defined
53 * _FOREACH_PROP_ELEM: helper for "iterating" over values in the property
54 * _FOREACH_PROP_ELEM_VARGS: foreach functions with variable number of arguments
55 * _IDX_<i>: logical index into property
56 * _IDX_<i>_EXISTS: logical index into property is defined
57 * _IDX_<i>_PH: phandle array's phandle by index (or phandle, phandles)
58 * _IDX_<i>_STRING_TOKEN: string array element value as a token
59 * _IDX_<i>_STRING_UPPER_TOKEN: string array element value as a uppercased token
60 * _IDX <i>_STRING_UNQUOTED: string array element value as a sequence of tokens, with no quotes
61 * _IDX_<i>_VAL_<val>: phandle array's specifier value by index
62 * _IDX_<i>_VAL_<val>_EXISTS: cell value exists, by index
63 * _LEN: property logical length
64 * _NAME_<name>_PH: phandle array's phandle by name
65 * _NAME_<name>_VAL_<val>: phandle array's property specifier by name
66 * _NAME_<name>_VAL_<val>_EXISTS: cell value exists, by name
67 * _STRING_TOKEN: string property's value as a token
68 * _STRING_UPPER_TOKEN: like _STRING_TOKEN, but uppercased
69 * _STRING_UNQUOTED: string property's value as a sequence of tokens, with no quotes
70 */
71
85#define DT_INVALID_NODE _
86
90#define DT_ROOT DT_N
91
142#define DT_PATH(...) DT_PATH_INTERNAL(__VA_ARGS__)
143
198#define DT_NODELABEL(label) DT_CAT(DT_N_NODELABEL_, label)
199
238#define DT_ALIAS(alias) DT_CAT(DT_N_ALIAS_, alias)
239
334#define DT_INST(inst, compat) UTIL_CAT(DT_N_INST, DT_DASH(inst, compat))
335
359#define DT_PARENT(node_id) DT_CAT(node_id, _PARENT)
360
384#define DT_GPARENT(node_id) DT_PARENT(DT_PARENT(node_id))
385
421#define DT_CHILD(node_id, child) UTIL_CAT(node_id, DT_S_PREFIX(child))
422
464#define DT_COMPAT_GET_ANY_STATUS_OKAY(compat) \
465 COND_CODE_1(DT_HAS_COMPAT_STATUS_OKAY(compat), \
466 (DT_INST(0, compat)), \
467 (DT_INVALID_NODE))
468
496#define DT_NODE_PATH(node_id) DT_CAT(node_id, _PATH)
497
522#define DT_NODE_FULL_NAME(node_id) DT_CAT(node_id, _FULL_NAME)
523
550#define DT_NODE_CHILD_IDX(node_id) DT_CAT(node_id, _CHILD_IDX)
551
572#define DT_SAME_NODE(node_id1, node_id2) \
573 (DT_DEP_ORD(node_id1) == (DT_DEP_ORD(node_id2)))
574
615#define DT_PROP(node_id, prop) DT_CAT3(node_id, _P_, prop)
616
649#define DT_PROP_LEN(node_id, prop) DT_CAT4(node_id, _P_, prop, _LEN)
650
665#define DT_PROP_LEN_OR(node_id, prop, default_value) \
666 COND_CODE_1(DT_NODE_HAS_PROP(node_id, prop), \
667 (DT_PROP_LEN(node_id, prop)), (default_value))
668
689#define DT_PROP_HAS_IDX(node_id, prop, idx) \
690 IS_ENABLED(DT_CAT6(node_id, _P_, prop, _IDX_, idx, _EXISTS))
691
724#define DT_PROP_HAS_NAME(node_id, prop, name) \
725 IS_ENABLED(DT_CAT6(node_id, _P_, prop, _NAME_, name, _EXISTS))
726
761#define DT_PROP_BY_IDX(node_id, prop, idx) \
762 DT_CAT5(node_id, _P_, prop, _IDX_, idx)
763
777#define DT_PROP_OR(node_id, prop, default_value) \
778 COND_CODE_1(DT_NODE_HAS_PROP(node_id, prop), \
779 (DT_PROP(node_id, prop)), (default_value))
780
821#define DT_ENUM_IDX(node_id, prop) DT_CAT4(node_id, _P_, prop, _ENUM_IDX)
822
837#define DT_ENUM_IDX_OR(node_id, prop, default_idx_value) \
838 COND_CODE_1(DT_NODE_HAS_PROP(node_id, prop), \
839 (DT_ENUM_IDX(node_id, prop)), (default_idx_value))
840
849#define DT_ENUM_HAS_VALUE(node_id, prop, value) \
850 IS_ENABLED(DT_CAT6(node_id, _P_, prop, _ENUM_VAL_, value, _EXISTS))
851
911#define DT_STRING_TOKEN(node_id, prop) \
912 DT_CAT4(node_id, _P_, prop, _STRING_TOKEN)
913
927#define DT_STRING_TOKEN_OR(node_id, prop, default_value) \
928 COND_CODE_1(DT_NODE_HAS_PROP(node_id, prop), \
929 (DT_STRING_TOKEN(node_id, prop)), (default_value))
930
988#define DT_STRING_UPPER_TOKEN(node_id, prop) \
989 DT_CAT4(node_id, _P_, prop, _STRING_UPPER_TOKEN)
990
1005#define DT_STRING_UPPER_TOKEN_OR(node_id, prop, default_value) \
1006 COND_CODE_1(DT_NODE_HAS_PROP(node_id, prop), \
1007 (DT_STRING_UPPER_TOKEN(node_id, prop)), (default_value))
1008
1049#define DT_STRING_UNQUOTED(node_id, prop) \
1050 DT_CAT4(node_id, _P_, prop, _STRING_UNQUOTED)
1051
1066#define DT_STRING_UNQUOTED_OR(node_id, prop, default_value) \
1067 COND_CODE_1(DT_NODE_HAS_PROP(node_id, prop), \
1068 (DT_STRING_UNQUOTED(node_id, prop)), (default_value))
1069
1117#define DT_STRING_TOKEN_BY_IDX(node_id, prop, idx) \
1118 DT_CAT6(node_id, _P_, prop, _IDX_, idx, _STRING_TOKEN)
1119
1167#define DT_STRING_UPPER_TOKEN_BY_IDX(node_id, prop, idx) \
1168 DT_CAT6(node_id, _P_, prop, _IDX_, idx, _STRING_UPPER_TOKEN)
1169
1210#define DT_STRING_UNQUOTED_BY_IDX(node_id, prop, idx) \
1211 DT_CAT6(node_id, _P_, prop, _IDX_, idx, _STRING_UNQUOTED)
1212
1213/*
1214 * phandle properties
1215 *
1216 * These are special-cased to manage the impedance mismatch between
1217 * phandles, which are just uint32_t node properties that only make sense
1218 * within the tree itself, and C values.
1219 */
1220
1266#define DT_PROP_BY_PHANDLE_IDX(node_id, phs, idx, prop) \
1267 DT_PROP(DT_PHANDLE_BY_IDX(node_id, phs, idx), prop)
1268
1288#define DT_PROP_BY_PHANDLE_IDX_OR(node_id, phs, idx, prop, default_value) \
1289 DT_PROP_OR(DT_PHANDLE_BY_IDX(node_id, phs, idx), prop, default_value)
1290
1302#define DT_PROP_BY_PHANDLE(node_id, ph, prop) \
1303 DT_PROP_BY_PHANDLE_IDX(node_id, ph, 0, prop)
1304
1359#define DT_PHA_BY_IDX(node_id, pha, idx, cell) \
1360 DT_CAT7(node_id, _P_, pha, _IDX_, idx, _VAL_, cell)
1361
1385#define DT_PHA_BY_IDX_OR(node_id, pha, idx, cell, default_value) \
1386 DT_PROP_OR(node_id, DT_CAT5(pha, _IDX_, idx, _VAL_, cell), default_value)
1387
1395#define DT_PHA(node_id, pha, cell) DT_PHA_BY_IDX(node_id, pha, 0, cell)
1396
1411#define DT_PHA_OR(node_id, pha, cell, default_value) \
1412 DT_PHA_BY_IDX_OR(node_id, pha, 0, cell, default_value)
1413
1454#define DT_PHA_BY_NAME(node_id, pha, name, cell) \
1455 DT_CAT7(node_id, _P_, pha, _NAME_, name, _VAL_, cell)
1456
1478#define DT_PHA_BY_NAME_OR(node_id, pha, name, cell, default_value) \
1479 DT_PROP_OR(node_id, DT_CAT5(pha, _NAME_, name, _VAL_, cell), default_value)
1480
1528#define DT_PHANDLE_BY_NAME(node_id, pha, name) \
1529 DT_CAT6(node_id, _P_, pha, _NAME_, name, _PH)
1530
1580#define DT_PHANDLE_BY_IDX(node_id, prop, idx) \
1581 DT_CAT6(node_id, _P_, prop, _IDX_, idx, _PH)
1582
1594#define DT_PHANDLE(node_id, prop) DT_PHANDLE_BY_IDX(node_id, prop, 0)
1595
1642#define DT_NUM_RANGES(node_id) DT_CAT(node_id, _RANGES_NUM)
1643
1696#define DT_RANGES_HAS_IDX(node_id, idx) \
1697 IS_ENABLED(DT_CAT4(node_id, _RANGES_IDX_, idx, _EXISTS))
1698
1751#define DT_RANGES_HAS_CHILD_BUS_FLAGS_AT_IDX(node_id, idx) \
1752 IS_ENABLED(DT_CAT4(node_id, _RANGES_IDX_, idx, _VAL_CHILD_BUS_FLAGS_EXISTS))
1753
1791#define DT_RANGES_CHILD_BUS_FLAGS_BY_IDX(node_id, idx) \
1792 DT_CAT4(node_id, _RANGES_IDX_, idx, _VAL_CHILD_BUS_FLAGS)
1793
1840#define DT_RANGES_CHILD_BUS_ADDRESS_BY_IDX(node_id, idx) \
1841 DT_CAT4(node_id, _RANGES_IDX_, idx, _VAL_CHILD_BUS_ADDRESS)
1842
1889#define DT_RANGES_PARENT_BUS_ADDRESS_BY_IDX(node_id, idx) \
1890 DT_CAT4(node_id, _RANGES_IDX_, idx, _VAL_PARENT_BUS_ADDRESS)
1891
1938#define DT_RANGES_LENGTH_BY_IDX(node_id, idx) \
1939 DT_CAT4(node_id, _RANGES_IDX_, idx, _VAL_LENGTH)
1940
1980#define DT_FOREACH_RANGE(node_id, fn) \
1981 DT_CAT(node_id, _FOREACH_RANGE)(fn)
1982
2028#define DT_NODE_VENDOR_BY_IDX(node_id, idx) \
2029 DT_CAT3(node_id, _COMPAT_VENDOR_IDX_, idx)
2030
2043#define DT_NODE_VENDOR_HAS_IDX(node_id, idx) \
2044 IS_ENABLED(DT_CAT4(node_id, _COMPAT_VENDOR_IDX_, idx, _EXISTS))
2045
2060#define DT_NODE_VENDOR_BY_IDX_OR(node_id, idx, default_value) \
2061 COND_CODE_1(DT_NODE_VENDOR_HAS_IDX(node_id, idx), \
2062 (DT_NODE_VENDOR_BY_IDX(node_id, idx)), (default_value))
2063
2072#define DT_NODE_VENDOR_OR(node_id, default_value) \
2073 DT_NODE_VENDOR_BY_IDX_OR(node_id, 0, default_value)
2074
2104#define DT_NODE_MODEL_BY_IDX(node_id, idx) \
2105 DT_CAT3(node_id, _COMPAT_MODEL_IDX_, idx)
2106
2119#define DT_NODE_MODEL_HAS_IDX(node_id, idx) \
2120 IS_ENABLED(DT_CAT4(node_id, _COMPAT_MODEL_IDX_, idx, _EXISTS))
2121
2136#define DT_NODE_MODEL_BY_IDX_OR(node_id, idx, default_value) \
2137 COND_CODE_1(DT_NODE_MODEL_HAS_IDX(node_id, idx), \
2138 (DT_NODE_MODEL_BY_IDX(node_id, idx)), (default_value))
2139
2148#define DT_NODE_MODEL_OR(node_id, default_value) \
2149 DT_NODE_MODEL_BY_IDX_OR(node_id, 0, default_value)
2150
2168#define DT_NUM_REGS(node_id) DT_CAT(node_id, _REG_NUM)
2169
2181#define DT_REG_HAS_IDX(node_id, idx) \
2182 IS_ENABLED(DT_CAT4(node_id, _REG_IDX_, idx, _EXISTS))
2183
2190#define DT_REG_ADDR_BY_IDX(node_id, idx) \
2191 DT_CAT4(node_id, _REG_IDX_, idx, _VAL_ADDRESS)
2192
2204#define DT_REG_SIZE_BY_IDX(node_id, idx) \
2205 DT_CAT4(node_id, _REG_IDX_, idx, _VAL_SIZE)
2206
2214#define DT_REG_ADDR(node_id) DT_REG_ADDR_BY_IDX(node_id, 0)
2215
2226#define DT_REG_ADDR_U64(node_id) DT_U64_C(DT_REG_ADDR(node_id))
2227
2235#define DT_REG_SIZE(node_id) DT_REG_SIZE_BY_IDX(node_id, 0)
2236
2243#define DT_REG_ADDR_BY_NAME(node_id, name) \
2244 DT_CAT4(node_id, _REG_NAME_, name, _VAL_ADDRESS)
2245
2258#define DT_REG_ADDR_BY_NAME_U64(node_id, name) \
2259 DT_U64_C(DT_REG_ADDR_BY_NAME(node_id, name))
2260
2267#define DT_REG_SIZE_BY_NAME(node_id, name) \
2268 DT_CAT4(node_id, _REG_NAME_, name, _VAL_SIZE)
2269
2288#define DT_NUM_IRQS(node_id) DT_CAT(node_id, _IRQ_NUM)
2289
2296#define DT_IRQ_LEVEL(node_id) DT_CAT(node_id, _IRQ_LEVEL)
2297
2308#define DT_IRQ_HAS_IDX(node_id, idx) \
2309 IS_ENABLED(DT_CAT4(node_id, _IRQ_IDX_, idx, _EXISTS))
2310
2321#define DT_IRQ_HAS_CELL_AT_IDX(node_id, idx, cell) \
2322 IS_ENABLED(DT_CAT6(node_id, _IRQ_IDX_, idx, _VAL_, cell, _EXISTS))
2323
2331#define DT_IRQ_HAS_CELL(node_id, cell) DT_IRQ_HAS_CELL_AT_IDX(node_id, 0, cell)
2332
2342#define DT_IRQ_HAS_NAME(node_id, name) \
2343 IS_ENABLED(DT_CAT4(node_id, _IRQ_NAME_, name, _VAL_irq_EXISTS))
2344
2380#define DT_IRQ_BY_IDX(node_id, idx, cell) \
2381 DT_CAT5(node_id, _IRQ_IDX_, idx, _VAL_, cell)
2382
2398#define DT_IRQ_BY_NAME(node_id, name, cell) \
2399 DT_CAT5(node_id, _IRQ_NAME_, name, _VAL_, cell)
2400
2408#define DT_IRQ(node_id, cell) DT_IRQ_BY_IDX(node_id, 0, cell)
2409
2452#define DT_IRQ_INTC_BY_IDX(node_id, idx) \
2453 DT_CAT4(node_id, _IRQ_IDX_, idx, _CONTROLLER)
2454
2499#define DT_IRQ_INTC_BY_NAME(node_id, name) \
2500 DT_CAT4(node_id, _IRQ_NAME_, name, _CONTROLLER)
2501
2541#define DT_IRQ_INTC(node_id) \
2542 DT_IRQ_INTC_BY_IDX(node_id, 0)
2543
2548/* DT helper macro to encode a node's IRQN to level 1 according to the multi-level scheme */
2549#define DT_IRQN_L1_INTERNAL(node_id, idx) DT_IRQ_BY_IDX(node_id, idx, irq)
2550/* DT helper macro to encode a node's IRQN to level 2 according to the multi-level scheme */
2551#define DT_IRQN_L2_INTERNAL(node_id, idx) \
2552 (IRQ_TO_L2(DT_IRQN_L1_INTERNAL(node_id, idx)) | DT_IRQ(DT_IRQ_INTC(node_id), irq))
2553/* DT helper macro to encode a node's IRQN to level 3 according to the multi-level scheme */
2554#define DT_IRQN_L3_INTERNAL(node_id, idx) \
2555 (IRQ_TO_L3(DT_IRQN_L1_INTERNAL(node_id, idx)) | \
2556 IRQ_TO_L2(DT_IRQ(DT_IRQ_INTC(node_id), irq)) | \
2557 DT_IRQ(DT_IRQ_INTC(DT_IRQ_INTC(node_id)), irq))
2558/* DT helper macro for the macros above */
2559#define DT_IRQN_LVL_INTERNAL(node_id, idx, level) DT_CAT3(DT_IRQN_L, level, _INTERNAL)(node_id, idx)
2560
2565#define DT_MULTI_LEVEL_IRQN_INTERNAL(node_id, idx) \
2566 DT_IRQN_LVL_INTERNAL(node_id, idx, DT_IRQ_LEVEL(node_id))
2567
2580#define DT_IRQN_BY_IDX(node_id, idx) \
2581 COND_CODE_1(IS_ENABLED(CONFIG_MULTI_LEVEL_INTERRUPTS), \
2582 (DT_MULTI_LEVEL_IRQN_INTERNAL(node_id, idx)), \
2583 (DT_IRQ_BY_IDX(node_id, idx, irq)))
2584
2595#define DT_IRQN(node_id) DT_IRQN_BY_IDX(node_id, 0)
2596
2615#define DT_CHOSEN(prop) DT_CAT(DT_CHOSEN_, prop)
2616
2623#define DT_HAS_CHOSEN(prop) IS_ENABLED(DT_CAT3(DT_CHOSEN_, prop, _EXISTS))
2624
2644#define DT_FOREACH_NODE(fn) DT_FOREACH_HELPER(fn)
2645
2658#define DT_FOREACH_NODE_VARGS(fn, ...) DT_FOREACH_VARGS_HELPER(fn, __VA_ARGS__)
2659
2671#define DT_FOREACH_STATUS_OKAY_NODE(fn) DT_FOREACH_OKAY_HELPER(fn)
2672
2687#define DT_FOREACH_STATUS_OKAY_NODE_VARGS(fn, ...) DT_FOREACH_OKAY_VARGS_HELPER(fn, __VA_ARGS__)
2688
2732#define DT_FOREACH_CHILD(node_id, fn) \
2733 DT_CAT(node_id, _FOREACH_CHILD)(fn)
2734
2775#define DT_FOREACH_CHILD_SEP(node_id, fn, sep) \
2776 DT_CAT(node_id, _FOREACH_CHILD_SEP)(fn, sep)
2777
2793#define DT_FOREACH_CHILD_VARGS(node_id, fn, ...) \
2794 DT_CAT(node_id, _FOREACH_CHILD_VARGS)(fn, __VA_ARGS__)
2795
2811#define DT_FOREACH_CHILD_SEP_VARGS(node_id, fn, sep, ...) \
2812 DT_CAT(node_id, _FOREACH_CHILD_SEP_VARGS)(fn, sep, __VA_ARGS__)
2813
2829#define DT_FOREACH_CHILD_STATUS_OKAY(node_id, fn) \
2830 DT_CAT(node_id, _FOREACH_CHILD_STATUS_OKAY)(fn)
2831
2848#define DT_FOREACH_CHILD_STATUS_OKAY_SEP(node_id, fn, sep) \
2849 DT_CAT(node_id, _FOREACH_CHILD_STATUS_OKAY_SEP)(fn, sep)
2850
2870#define DT_FOREACH_CHILD_STATUS_OKAY_VARGS(node_id, fn, ...) \
2871 DT_CAT(node_id, _FOREACH_CHILD_STATUS_OKAY_VARGS)(fn, __VA_ARGS__)
2872
2891#define DT_FOREACH_CHILD_STATUS_OKAY_SEP_VARGS(node_id, fn, sep, ...) \
2892 DT_CAT(node_id, _FOREACH_CHILD_STATUS_OKAY_SEP_VARGS)(fn, sep, __VA_ARGS__)
2893
2944#define DT_FOREACH_PROP_ELEM(node_id, prop, fn) \
2945 DT_CAT4(node_id, _P_, prop, _FOREACH_PROP_ELEM)(fn)
2946
2989#define DT_FOREACH_PROP_ELEM_SEP(node_id, prop, fn, sep) \
2990 DT_CAT4(node_id, _P_, prop, _FOREACH_PROP_ELEM_SEP)(fn, sep)
2991
3012#define DT_FOREACH_PROP_ELEM_VARGS(node_id, prop, fn, ...) \
3013 DT_CAT4(node_id, _P_, prop, _FOREACH_PROP_ELEM_VARGS)(fn, __VA_ARGS__)
3014
3031#define DT_FOREACH_PROP_ELEM_SEP_VARGS(node_id, prop, fn, sep, ...) \
3032 DT_CAT4(node_id, _P_, prop, _FOREACH_PROP_ELEM_SEP_VARGS)( \
3033 fn, sep, __VA_ARGS__)
3034
3088#define DT_FOREACH_STATUS_OKAY(compat, fn) \
3089 COND_CODE_1(DT_HAS_COMPAT_STATUS_OKAY(compat), \
3090 (DT_CAT(DT_FOREACH_OKAY_, compat)(fn)), \
3091 ())
3092
3137#define DT_FOREACH_STATUS_OKAY_VARGS(compat, fn, ...) \
3138 COND_CODE_1(DT_HAS_COMPAT_STATUS_OKAY(compat), \
3139 (DT_CAT(DT_FOREACH_OKAY_VARGS_, \
3140 compat)(fn, __VA_ARGS__)), \
3141 ())
3142
3167#define DT_NODE_EXISTS(node_id) IS_ENABLED(DT_CAT(node_id, _EXISTS))
3168
3190#define DT_NODE_HAS_STATUS(node_id, status) \
3191 DT_NODE_HAS_STATUS_INTERNAL(node_id, status)
3192
3212#define DT_HAS_COMPAT_STATUS_OKAY(compat) \
3213 IS_ENABLED(DT_CAT(DT_COMPAT_HAS_OKAY_, compat))
3214
3221#define DT_NUM_INST_STATUS_OKAY(compat) \
3222 UTIL_AND(DT_HAS_COMPAT_STATUS_OKAY(compat), \
3223 UTIL_CAT(DT_N_INST, DT_DASH(compat, NUM_OKAY)))
3224
3252#define DT_NODE_HAS_COMPAT(node_id, compat) \
3253 IS_ENABLED(DT_CAT3(node_id, _COMPAT_MATCHES_, compat))
3254
3269#define DT_NODE_HAS_COMPAT_STATUS(node_id, compat, status) \
3270 DT_NODE_HAS_COMPAT(node_id, compat) && DT_NODE_HAS_STATUS(node_id, status)
3271
3285#define DT_NODE_HAS_PROP(node_id, prop) \
3286 IS_ENABLED(DT_CAT4(node_id, _P_, prop, _EXISTS))
3287
3288
3305#define DT_PHA_HAS_CELL_AT_IDX(node_id, pha, idx, cell) \
3306 IS_ENABLED(DT_CAT8(node_id, _P_, pha, \
3307 _IDX_, idx, _VAL_, cell, _EXISTS))
3308
3318#define DT_PHA_HAS_CELL(node_id, pha, cell) \
3319 DT_PHA_HAS_CELL_AT_IDX(node_id, pha, 0, cell)
3320
3362#define DT_BUS(node_id) DT_CAT(node_id, _BUS)
3363
3392#define DT_ON_BUS(node_id, bus) IS_ENABLED(DT_CAT3(node_id, _BUS_, bus))
3393
3410#define DT_DRV_INST(inst) DT_INST(inst, DT_DRV_COMPAT)
3411
3419#define DT_INST_PARENT(inst) DT_PARENT(DT_DRV_INST(inst))
3420
3428#define DT_INST_GPARENT(inst) DT_GPARENT(DT_DRV_INST(inst))
3429
3439#define DT_INST_CHILD(inst, child) \
3440 DT_CHILD(DT_DRV_INST(inst), child)
3441
3456#define DT_INST_FOREACH_CHILD(inst, fn) \
3457 DT_FOREACH_CHILD(DT_DRV_INST(inst), fn)
3458
3472#define DT_INST_FOREACH_CHILD_SEP(inst, fn, sep) \
3473 DT_FOREACH_CHILD_SEP(DT_DRV_INST(inst), fn, sep)
3474
3490#define DT_INST_FOREACH_CHILD_VARGS(inst, fn, ...) \
3491 DT_FOREACH_CHILD_VARGS(DT_DRV_INST(inst), fn, __VA_ARGS__)
3492
3507#define DT_INST_FOREACH_CHILD_SEP_VARGS(inst, fn, sep, ...) \
3508 DT_FOREACH_CHILD_SEP_VARGS(DT_DRV_INST(inst), fn, sep, __VA_ARGS__)
3509
3521#define DT_INST_FOREACH_CHILD_STATUS_OKAY(inst, fn) \
3522 DT_FOREACH_CHILD_STATUS_OKAY(DT_DRV_INST(inst), fn)
3523
3538#define DT_INST_FOREACH_CHILD_STATUS_OKAY_SEP(inst, fn, sep) \
3539 DT_FOREACH_CHILD_STATUS_OKAY_SEP(DT_DRV_INST(inst), fn, sep)
3540
3554#define DT_INST_FOREACH_CHILD_STATUS_OKAY_VARGS(inst, fn, ...) \
3555 DT_FOREACH_CHILD_STATUS_OKAY_VARGS(DT_DRV_INST(inst), fn, __VA_ARGS__)
3556
3572#define DT_INST_FOREACH_CHILD_STATUS_OKAY_SEP_VARGS(inst, fn, sep, ...) \
3573 DT_FOREACH_CHILD_STATUS_OKAY_SEP_VARGS(DT_DRV_INST(inst), fn, sep, __VA_ARGS__)
3574
3581#define DT_INST_ENUM_IDX(inst, prop) \
3582 DT_ENUM_IDX(DT_DRV_INST(inst), prop)
3583
3592#define DT_INST_ENUM_IDX_OR(inst, prop, default_idx_value) \
3593 DT_ENUM_IDX_OR(DT_DRV_INST(inst), prop, default_idx_value)
3594
3603#define DT_INST_ENUM_HAS_VALUE(inst, prop, value) \
3604 DT_ENUM_HAS_VALUE(DT_DRV_INST(inst), prop, value)
3605
3612#define DT_INST_PROP(inst, prop) DT_PROP(DT_DRV_INST(inst), prop)
3613
3620#define DT_INST_PROP_LEN(inst, prop) DT_PROP_LEN(DT_DRV_INST(inst), prop)
3621
3631#define DT_INST_PROP_HAS_IDX(inst, prop, idx) \
3632 DT_PROP_HAS_IDX(DT_DRV_INST(inst), prop, idx)
3633
3642#define DT_INST_PROP_HAS_NAME(inst, prop, name) \
3643 DT_PROP_HAS_NAME(DT_DRV_INST(inst), prop, name)
3644
3652#define DT_INST_PROP_BY_IDX(inst, prop, idx) \
3653 DT_PROP_BY_IDX(DT_DRV_INST(inst), prop, idx)
3654
3662#define DT_INST_PROP_OR(inst, prop, default_value) \
3663 DT_PROP_OR(DT_DRV_INST(inst), prop, default_value)
3664
3672#define DT_INST_PROP_LEN_OR(inst, prop, default_value) \
3673 DT_PROP_LEN_OR(DT_DRV_INST(inst), prop, default_value)
3674
3684#define DT_INST_STRING_TOKEN(inst, prop) \
3685 DT_STRING_TOKEN(DT_DRV_INST(inst), prop)
3686
3694#define DT_INST_STRING_UPPER_TOKEN(inst, prop) \
3695 DT_STRING_UPPER_TOKEN(DT_DRV_INST(inst), prop)
3696
3705#define DT_INST_STRING_UNQUOTED(inst, prop) \
3706 DT_STRING_UNQUOTED(DT_DRV_INST(inst), prop)
3707
3715#define DT_INST_STRING_TOKEN_BY_IDX(inst, prop, idx) \
3716 DT_STRING_TOKEN_BY_IDX(DT_DRV_INST(inst), prop, idx)
3717
3725#define DT_INST_STRING_UPPER_TOKEN_BY_IDX(inst, prop, idx) \
3726 DT_STRING_UPPER_TOKEN_BY_IDX(DT_DRV_INST(inst), prop, idx)
3727
3735#define DT_INST_STRING_UNQUOTED_BY_IDX(inst, prop, idx) \
3736 DT_STRING_UNQUOTED_BY_IDX(DT_DRV_INST(inst), prop, idx)
3737
3746#define DT_INST_PROP_BY_PHANDLE(inst, ph, prop) \
3747 DT_INST_PROP_BY_PHANDLE_IDX(inst, ph, 0, prop)
3748
3760#define DT_INST_PROP_BY_PHANDLE_IDX(inst, phs, idx, prop) \
3761 DT_PROP_BY_PHANDLE_IDX(DT_DRV_INST(inst), phs, idx, prop)
3762
3771#define DT_INST_PHA_BY_IDX(inst, pha, idx, cell) \
3772 DT_PHA_BY_IDX(DT_DRV_INST(inst), pha, idx, cell)
3773
3783#define DT_INST_PHA_BY_IDX_OR(inst, pha, idx, cell, default_value) \
3784 DT_PHA_BY_IDX_OR(DT_DRV_INST(inst), pha, idx, cell, default_value)
3785
3794#define DT_INST_PHA(inst, pha, cell) DT_INST_PHA_BY_IDX(inst, pha, 0, cell)
3795
3804#define DT_INST_PHA_OR(inst, pha, cell, default_value) \
3805 DT_INST_PHA_BY_IDX_OR(inst, pha, 0, cell, default_value)
3806
3816#define DT_INST_PHA_BY_NAME(inst, pha, name, cell) \
3817 DT_PHA_BY_NAME(DT_DRV_INST(inst), pha, name, cell)
3818
3828#define DT_INST_PHA_BY_NAME_OR(inst, pha, name, cell, default_value) \
3829 DT_PHA_BY_NAME_OR(DT_DRV_INST(inst), pha, name, cell, default_value)
3830
3839#define DT_INST_PHANDLE_BY_NAME(inst, pha, name) \
3840 DT_PHANDLE_BY_NAME(DT_DRV_INST(inst), pha, name) \
3841
3851#define DT_INST_PHANDLE_BY_IDX(inst, prop, idx) \
3852 DT_PHANDLE_BY_IDX(DT_DRV_INST(inst), prop, idx)
3853
3862#define DT_INST_PHANDLE(inst, prop) DT_INST_PHANDLE_BY_IDX(inst, prop, 0)
3863
3871#define DT_INST_REG_HAS_IDX(inst, idx) DT_REG_HAS_IDX(DT_DRV_INST(inst), idx)
3872
3879#define DT_INST_REG_ADDR_BY_IDX(inst, idx) DT_REG_ADDR_BY_IDX(DT_DRV_INST(inst), idx)
3880
3887#define DT_INST_REG_SIZE_BY_IDX(inst, idx) \
3888 DT_REG_SIZE_BY_IDX(DT_DRV_INST(inst), idx)
3889
3896#define DT_INST_REG_ADDR_BY_NAME(inst, name) \
3897 DT_REG_ADDR_BY_NAME(DT_DRV_INST(inst), name)
3898
3911#define DT_INST_REG_ADDR_BY_NAME_U64(inst, name) \
3912 DT_U64_C(DT_INST_REG_ADDR_BY_NAME(inst, name))
3913
3920#define DT_INST_REG_SIZE_BY_NAME(inst, name) \
3921 DT_REG_SIZE_BY_NAME(DT_DRV_INST(inst), name)
3922
3928#define DT_INST_REG_ADDR(inst) DT_INST_REG_ADDR_BY_IDX(inst, 0)
3929
3941#define DT_INST_REG_ADDR_U64(inst) DT_U64_C(DT_INST_REG_ADDR(inst))
3942
3948#define DT_INST_REG_SIZE(inst) DT_INST_REG_SIZE_BY_IDX(inst, 0)
3949
3956#define DT_INST_IRQ_LEVEL(inst) DT_IRQ_LEVEL(DT_DRV_INST(inst))
3957
3965#define DT_INST_IRQ_BY_IDX(inst, idx, cell) \
3966 DT_IRQ_BY_IDX(DT_DRV_INST(inst), idx, cell)
3967
3974#define DT_INST_IRQ_INTC_BY_IDX(inst, idx) \
3975 DT_IRQ_INTC_BY_IDX(DT_DRV_INST(inst), idx)
3976
3983#define DT_INST_IRQ_INTC_BY_NAME(inst, name) \
3984 DT_IRQ_INTC_BY_NAME(DT_DRV_INST(inst), name)
3985
3993#define DT_INST_IRQ_INTC(inst) \
3994 DT_INST_IRQ_INTC_BY_IDX(inst, 0)
3995
4003#define DT_INST_IRQ_BY_NAME(inst, name, cell) \
4004 DT_IRQ_BY_NAME(DT_DRV_INST(inst), name, cell)
4005
4012#define DT_INST_IRQ(inst, cell) DT_INST_IRQ_BY_IDX(inst, 0, cell)
4013
4019#define DT_INST_IRQN(inst) DT_IRQN(DT_DRV_INST(inst))
4020
4027#define DT_INST_IRQN_BY_IDX(inst, idx) DT_IRQN_BY_IDX(DT_DRV_INST(inst), idx)
4028
4034#define DT_INST_BUS(inst) DT_BUS(DT_DRV_INST(inst))
4035
4043#define DT_INST_ON_BUS(inst, bus) DT_ON_BUS(DT_DRV_INST(inst), bus)
4044
4054#define DT_INST_STRING_TOKEN_OR(inst, name, default_value) \
4055 DT_STRING_TOKEN_OR(DT_DRV_INST(inst), name, default_value)
4056
4065#define DT_INST_STRING_UPPER_TOKEN_OR(inst, name, default_value) \
4066 DT_STRING_UPPER_TOKEN_OR(DT_DRV_INST(inst), name, default_value)
4067
4076#define DT_INST_STRING_UNQUOTED_OR(inst, name, default_value) \
4077 DT_STRING_UNQUOTED_OR(DT_DRV_INST(inst), name, default_value)
4078
4079/*
4080 * @brief Test if any enabled node with the given compatible is on
4081 * the given bus type
4082 *
4083 * This is like DT_ANY_INST_ON_BUS_STATUS_OKAY(), except it can also
4084 * be useful for handling multiple compatibles in single source file.
4085 *
4086 * Example devicetree overlay:
4087 *
4088 * @code{.dts}
4089 * &i2c0 {
4090 * temp: temperature-sensor@76 {
4091 * compatible = "vnd,some-sensor";
4092 * reg = <0x76>;
4093 * };
4094 * };
4095 * @endcode
4096 *
4097 * Example usage, assuming `i2c0` is an I2C bus controller node, and
4098 * therefore `temp` is on an I2C bus:
4099 *
4100 * @code{.c}
4101 * DT_HAS_COMPAT_ON_BUS_STATUS_OKAY(vnd_some_sensor, i2c) // 1
4102 * @endcode
4103 *
4104 * @param compat lowercase-and-underscores compatible, without quotes
4105 * @param bus a binding's bus type as a C token, lowercased and without quotes
4106 * @return 1 if any enabled node with that compatible is on that bus type,
4107 * 0 otherwise
4108 */
4109#define DT_HAS_COMPAT_ON_BUS_STATUS_OKAY(compat, bus) \
4110 IS_ENABLED(DT_CAT4(DT_COMPAT_, compat, _BUS_, bus))
4111
4144#define DT_ANY_INST_ON_BUS_STATUS_OKAY(bus) \
4145 DT_HAS_COMPAT_ON_BUS_STATUS_OKAY(DT_DRV_COMPAT, bus)
4146
4191#define DT_ANY_INST_HAS_PROP_STATUS_OKAY(prop) \
4192 (DT_INST_FOREACH_STATUS_OKAY_VARGS(DT_INST_NODE_HAS_PROP_AND_OR, prop) 0)
4193
4259#define DT_INST_FOREACH_STATUS_OKAY(fn) \
4260 COND_CODE_1(DT_HAS_COMPAT_STATUS_OKAY(DT_DRV_COMPAT), \
4261 (UTIL_CAT(DT_FOREACH_OKAY_INST_, \
4262 DT_DRV_COMPAT)(fn)), \
4263 ())
4264
4276#define DT_INST_FOREACH_STATUS_OKAY_VARGS(fn, ...) \
4277 COND_CODE_1(DT_HAS_COMPAT_STATUS_OKAY(DT_DRV_COMPAT), \
4278 (UTIL_CAT(DT_FOREACH_OKAY_INST_VARGS_, \
4279 DT_DRV_COMPAT)(fn, __VA_ARGS__)), \
4280 ())
4281
4292#define DT_INST_FOREACH_PROP_ELEM(inst, prop, fn) \
4293 DT_FOREACH_PROP_ELEM(DT_DRV_INST(inst), prop, fn)
4294
4307#define DT_INST_FOREACH_PROP_ELEM_SEP(inst, prop, fn, sep) \
4308 DT_FOREACH_PROP_ELEM_SEP(DT_DRV_INST(inst), prop, fn, sep)
4309
4324#define DT_INST_FOREACH_PROP_ELEM_VARGS(inst, prop, fn, ...) \
4325 DT_FOREACH_PROP_ELEM_VARGS(DT_DRV_INST(inst), prop, fn, __VA_ARGS__)
4326
4344#define DT_INST_FOREACH_PROP_ELEM_SEP_VARGS(inst, prop, fn, sep, ...) \
4345 DT_FOREACH_PROP_ELEM_SEP_VARGS(DT_DRV_INST(inst), prop, fn, sep, \
4346 __VA_ARGS__)
4347
4354#define DT_INST_NODE_HAS_PROP(inst, prop) \
4355 DT_NODE_HAS_PROP(DT_DRV_INST(inst), prop)
4356
4367#define DT_INST_PHA_HAS_CELL_AT_IDX(inst, pha, idx, cell) \
4368 DT_PHA_HAS_CELL_AT_IDX(DT_DRV_INST(inst), pha, idx, cell)
4369
4379#define DT_INST_PHA_HAS_CELL(inst, pha, cell) \
4380 DT_INST_PHA_HAS_CELL_AT_IDX(inst, pha, 0, cell)
4381
4389#define DT_INST_IRQ_HAS_IDX(inst, idx) DT_IRQ_HAS_IDX(DT_DRV_INST(inst), idx)
4390
4399#define DT_INST_IRQ_HAS_CELL_AT_IDX(inst, idx, cell) \
4400 DT_IRQ_HAS_CELL_AT_IDX(DT_DRV_INST(inst), idx, cell)
4401
4409#define DT_INST_IRQ_HAS_CELL(inst, cell) \
4410 DT_INST_IRQ_HAS_CELL_AT_IDX(inst, 0, cell)
4411
4418#define DT_INST_IRQ_HAS_NAME(inst, name) \
4419 DT_IRQ_HAS_NAME(DT_DRV_INST(inst), name)
4420
4427#define DT_PATH_INTERNAL(...) \
4428 UTIL_CAT(DT_ROOT, MACRO_MAP_CAT(DT_S_PREFIX, __VA_ARGS__))
4434#define DT_S_PREFIX(name) _S_##name
4435
4450#define DT_CAT(a1, a2) a1 ## a2
4452#define DT_CAT3(a1, a2, a3) a1 ## a2 ## a3
4454#define DT_CAT4(a1, a2, a3, a4) a1 ## a2 ## a3 ## a4
4456#define DT_CAT5(a1, a2, a3, a4, a5) a1 ## a2 ## a3 ## a4 ## a5
4458#define DT_CAT6(a1, a2, a3, a4, a5, a6) a1 ## a2 ## a3 ## a4 ## a5 ## a6
4460#define DT_CAT7(a1, a2, a3, a4, a5, a6, a7) \
4461 a1 ## a2 ## a3 ## a4 ## a5 ## a6 ## a7
4463#define DT_CAT8(a1, a2, a3, a4, a5, a6, a7, a8) \
4464 a1 ## a2 ## a3 ## a4 ## a5 ## a6 ## a7 ## a8
4465/*
4466 * If you need to define a bigger DT_CATN(), do so here. Don't leave
4467 * any "holes" of undefined macros, please.
4468 */
4469
4471#define DT_DASH(...) MACRO_MAP_CAT(DT_DASH_PREFIX, __VA_ARGS__)
4473#define DT_DASH_PREFIX(name) _##name
4475#define DT_NODE_HAS_STATUS_INTERNAL(node_id, status) \
4476 IS_ENABLED(DT_CAT3(node_id, _STATUS_, status))
4477
4479#define DT_INST_NODE_HAS_PROP_AND_OR(inst, prop) \
4480 DT_INST_NODE_HAS_PROP(inst, prop) ||
4481
4486#if defined(_LINKER) || defined(_ASMLANGUAGE)
4487#define DT_U64_C(_v) (_v)
4488#else
4489#define DT_U64_C(_v) UINT64_C(_v)
4490#endif
4491
4494/* have these last so they have access to all previously defined macros */
4497#include <zephyr/devicetree/gpio.h>
4498#include <zephyr/devicetree/spi.h>
4499#include <zephyr/devicetree/dma.h>
4500#include <zephyr/devicetree/pwms.h>
4504#include <zephyr/devicetree/can.h>
4506#include <zephyr/devicetree/mbox.h>
4507
4508#endif /* DEVICETREE_H */
Clocks Devicetree macro public API header file.
CAN devicetree macro public API header file.
DMA Devicetree macro public API header file.
GPIO Devicetree macro public API header file.
MBOX Devicetree macro public API header file.
Devicetree pin control helpers.
Reset Controller Devicetree macro public API header file.
SPI Devicetree macro public API header file.
Flash Devicetree macro public API header file.
IO channels devicetree macro public API header file.
Public interface for multi-level interrupts.
Devicetree node dependency ordinals.
PWMs Devicetree macro public API header file.
Misc utilities.