Zephyr Project API 3.6.0
A Scalable Open Source RTOS
Loading...
Searching...
No Matches
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)) | \
2553 DT_IRQ(DT_IRQ_INTC_BY_IDX(node_id, idx), irq))
2554/* DT helper macro to encode a node's IRQN to level 3 according to the multi-level scheme */
2555#define DT_IRQN_L3_INTERNAL(node_id, idx) \
2556 (IRQ_TO_L3(DT_IRQN_L1_INTERNAL(node_id, idx)) | \
2557 IRQ_TO_L2(DT_IRQ(DT_IRQ_INTC_BY_IDX(node_id, idx), irq)) | \
2558 DT_IRQ(DT_IRQ_INTC(DT_IRQ_INTC_BY_IDX(node_id, idx)), irq))
2559/* DT helper macro for the macros above */
2560#define DT_IRQN_LVL_INTERNAL(node_id, idx, level) DT_CAT3(DT_IRQN_L, level, _INTERNAL)(node_id, idx)
2561
2566#define DT_MULTI_LEVEL_IRQN_INTERNAL(node_id, idx) \
2567 DT_IRQN_LVL_INTERNAL(node_id, idx, DT_IRQ_LEVEL(node_id))
2568
2581#define DT_IRQN_BY_IDX(node_id, idx) \
2582 COND_CODE_1(IS_ENABLED(CONFIG_MULTI_LEVEL_INTERRUPTS), \
2583 (DT_MULTI_LEVEL_IRQN_INTERNAL(node_id, idx)), \
2584 (DT_IRQ_BY_IDX(node_id, idx, irq)))
2585
2596#define DT_IRQN(node_id) DT_IRQN_BY_IDX(node_id, 0)
2597
2616#define DT_CHOSEN(prop) DT_CAT(DT_CHOSEN_, prop)
2617
2624#define DT_HAS_CHOSEN(prop) IS_ENABLED(DT_CAT3(DT_CHOSEN_, prop, _EXISTS))
2625
2645#define DT_FOREACH_NODE(fn) DT_FOREACH_HELPER(fn)
2646
2659#define DT_FOREACH_NODE_VARGS(fn, ...) DT_FOREACH_VARGS_HELPER(fn, __VA_ARGS__)
2660
2672#define DT_FOREACH_STATUS_OKAY_NODE(fn) DT_FOREACH_OKAY_HELPER(fn)
2673
2688#define DT_FOREACH_STATUS_OKAY_NODE_VARGS(fn, ...) DT_FOREACH_OKAY_VARGS_HELPER(fn, __VA_ARGS__)
2689
2733#define DT_FOREACH_CHILD(node_id, fn) \
2734 DT_CAT(node_id, _FOREACH_CHILD)(fn)
2735
2776#define DT_FOREACH_CHILD_SEP(node_id, fn, sep) \
2777 DT_CAT(node_id, _FOREACH_CHILD_SEP)(fn, sep)
2778
2794#define DT_FOREACH_CHILD_VARGS(node_id, fn, ...) \
2795 DT_CAT(node_id, _FOREACH_CHILD_VARGS)(fn, __VA_ARGS__)
2796
2812#define DT_FOREACH_CHILD_SEP_VARGS(node_id, fn, sep, ...) \
2813 DT_CAT(node_id, _FOREACH_CHILD_SEP_VARGS)(fn, sep, __VA_ARGS__)
2814
2830#define DT_FOREACH_CHILD_STATUS_OKAY(node_id, fn) \
2831 DT_CAT(node_id, _FOREACH_CHILD_STATUS_OKAY)(fn)
2832
2849#define DT_FOREACH_CHILD_STATUS_OKAY_SEP(node_id, fn, sep) \
2850 DT_CAT(node_id, _FOREACH_CHILD_STATUS_OKAY_SEP)(fn, sep)
2851
2871#define DT_FOREACH_CHILD_STATUS_OKAY_VARGS(node_id, fn, ...) \
2872 DT_CAT(node_id, _FOREACH_CHILD_STATUS_OKAY_VARGS)(fn, __VA_ARGS__)
2873
2892#define DT_FOREACH_CHILD_STATUS_OKAY_SEP_VARGS(node_id, fn, sep, ...) \
2893 DT_CAT(node_id, _FOREACH_CHILD_STATUS_OKAY_SEP_VARGS)(fn, sep, __VA_ARGS__)
2894
2945#define DT_FOREACH_PROP_ELEM(node_id, prop, fn) \
2946 DT_CAT4(node_id, _P_, prop, _FOREACH_PROP_ELEM)(fn)
2947
2990#define DT_FOREACH_PROP_ELEM_SEP(node_id, prop, fn, sep) \
2991 DT_CAT4(node_id, _P_, prop, _FOREACH_PROP_ELEM_SEP)(fn, sep)
2992
3013#define DT_FOREACH_PROP_ELEM_VARGS(node_id, prop, fn, ...) \
3014 DT_CAT4(node_id, _P_, prop, _FOREACH_PROP_ELEM_VARGS)(fn, __VA_ARGS__)
3015
3032#define DT_FOREACH_PROP_ELEM_SEP_VARGS(node_id, prop, fn, sep, ...) \
3033 DT_CAT4(node_id, _P_, prop, _FOREACH_PROP_ELEM_SEP_VARGS)( \
3034 fn, sep, __VA_ARGS__)
3035
3089#define DT_FOREACH_STATUS_OKAY(compat, fn) \
3090 COND_CODE_1(DT_HAS_COMPAT_STATUS_OKAY(compat), \
3091 (DT_CAT(DT_FOREACH_OKAY_, compat)(fn)), \
3092 ())
3093
3138#define DT_FOREACH_STATUS_OKAY_VARGS(compat, fn, ...) \
3139 COND_CODE_1(DT_HAS_COMPAT_STATUS_OKAY(compat), \
3140 (DT_CAT(DT_FOREACH_OKAY_VARGS_, \
3141 compat)(fn, __VA_ARGS__)), \
3142 ())
3143
3168#define DT_NODE_EXISTS(node_id) IS_ENABLED(DT_CAT(node_id, _EXISTS))
3169
3191#define DT_NODE_HAS_STATUS(node_id, status) \
3192 DT_NODE_HAS_STATUS_INTERNAL(node_id, status)
3193
3213#define DT_HAS_COMPAT_STATUS_OKAY(compat) \
3214 IS_ENABLED(DT_CAT(DT_COMPAT_HAS_OKAY_, compat))
3215
3222#define DT_NUM_INST_STATUS_OKAY(compat) \
3223 UTIL_AND(DT_HAS_COMPAT_STATUS_OKAY(compat), \
3224 UTIL_CAT(DT_N_INST, DT_DASH(compat, NUM_OKAY)))
3225
3253#define DT_NODE_HAS_COMPAT(node_id, compat) \
3254 IS_ENABLED(DT_CAT3(node_id, _COMPAT_MATCHES_, compat))
3255
3270#define DT_NODE_HAS_COMPAT_STATUS(node_id, compat, status) \
3271 DT_NODE_HAS_COMPAT(node_id, compat) && DT_NODE_HAS_STATUS(node_id, status)
3272
3286#define DT_NODE_HAS_PROP(node_id, prop) \
3287 IS_ENABLED(DT_CAT4(node_id, _P_, prop, _EXISTS))
3288
3289
3306#define DT_PHA_HAS_CELL_AT_IDX(node_id, pha, idx, cell) \
3307 IS_ENABLED(DT_CAT8(node_id, _P_, pha, \
3308 _IDX_, idx, _VAL_, cell, _EXISTS))
3309
3319#define DT_PHA_HAS_CELL(node_id, pha, cell) \
3320 DT_PHA_HAS_CELL_AT_IDX(node_id, pha, 0, cell)
3321
3363#define DT_BUS(node_id) DT_CAT(node_id, _BUS)
3364
3393#define DT_ON_BUS(node_id, bus) IS_ENABLED(DT_CAT3(node_id, _BUS_, bus))
3394
3411#define DT_DRV_INST(inst) DT_INST(inst, DT_DRV_COMPAT)
3412
3420#define DT_INST_PARENT(inst) DT_PARENT(DT_DRV_INST(inst))
3421
3429#define DT_INST_GPARENT(inst) DT_GPARENT(DT_DRV_INST(inst))
3430
3440#define DT_INST_CHILD(inst, child) \
3441 DT_CHILD(DT_DRV_INST(inst), child)
3442
3457#define DT_INST_FOREACH_CHILD(inst, fn) \
3458 DT_FOREACH_CHILD(DT_DRV_INST(inst), fn)
3459
3473#define DT_INST_FOREACH_CHILD_SEP(inst, fn, sep) \
3474 DT_FOREACH_CHILD_SEP(DT_DRV_INST(inst), fn, sep)
3475
3491#define DT_INST_FOREACH_CHILD_VARGS(inst, fn, ...) \
3492 DT_FOREACH_CHILD_VARGS(DT_DRV_INST(inst), fn, __VA_ARGS__)
3493
3508#define DT_INST_FOREACH_CHILD_SEP_VARGS(inst, fn, sep, ...) \
3509 DT_FOREACH_CHILD_SEP_VARGS(DT_DRV_INST(inst), fn, sep, __VA_ARGS__)
3510
3522#define DT_INST_FOREACH_CHILD_STATUS_OKAY(inst, fn) \
3523 DT_FOREACH_CHILD_STATUS_OKAY(DT_DRV_INST(inst), fn)
3524
3539#define DT_INST_FOREACH_CHILD_STATUS_OKAY_SEP(inst, fn, sep) \
3540 DT_FOREACH_CHILD_STATUS_OKAY_SEP(DT_DRV_INST(inst), fn, sep)
3541
3555#define DT_INST_FOREACH_CHILD_STATUS_OKAY_VARGS(inst, fn, ...) \
3556 DT_FOREACH_CHILD_STATUS_OKAY_VARGS(DT_DRV_INST(inst), fn, __VA_ARGS__)
3557
3573#define DT_INST_FOREACH_CHILD_STATUS_OKAY_SEP_VARGS(inst, fn, sep, ...) \
3574 DT_FOREACH_CHILD_STATUS_OKAY_SEP_VARGS(DT_DRV_INST(inst), fn, sep, __VA_ARGS__)
3575
3582#define DT_INST_ENUM_IDX(inst, prop) \
3583 DT_ENUM_IDX(DT_DRV_INST(inst), prop)
3584
3593#define DT_INST_ENUM_IDX_OR(inst, prop, default_idx_value) \
3594 DT_ENUM_IDX_OR(DT_DRV_INST(inst), prop, default_idx_value)
3595
3604#define DT_INST_ENUM_HAS_VALUE(inst, prop, value) \
3605 DT_ENUM_HAS_VALUE(DT_DRV_INST(inst), prop, value)
3606
3613#define DT_INST_PROP(inst, prop) DT_PROP(DT_DRV_INST(inst), prop)
3614
3621#define DT_INST_PROP_LEN(inst, prop) DT_PROP_LEN(DT_DRV_INST(inst), prop)
3622
3632#define DT_INST_PROP_HAS_IDX(inst, prop, idx) \
3633 DT_PROP_HAS_IDX(DT_DRV_INST(inst), prop, idx)
3634
3643#define DT_INST_PROP_HAS_NAME(inst, prop, name) \
3644 DT_PROP_HAS_NAME(DT_DRV_INST(inst), prop, name)
3645
3653#define DT_INST_PROP_BY_IDX(inst, prop, idx) \
3654 DT_PROP_BY_IDX(DT_DRV_INST(inst), prop, idx)
3655
3663#define DT_INST_PROP_OR(inst, prop, default_value) \
3664 DT_PROP_OR(DT_DRV_INST(inst), prop, default_value)
3665
3673#define DT_INST_PROP_LEN_OR(inst, prop, default_value) \
3674 DT_PROP_LEN_OR(DT_DRV_INST(inst), prop, default_value)
3675
3685#define DT_INST_STRING_TOKEN(inst, prop) \
3686 DT_STRING_TOKEN(DT_DRV_INST(inst), prop)
3687
3695#define DT_INST_STRING_UPPER_TOKEN(inst, prop) \
3696 DT_STRING_UPPER_TOKEN(DT_DRV_INST(inst), prop)
3697
3706#define DT_INST_STRING_UNQUOTED(inst, prop) \
3707 DT_STRING_UNQUOTED(DT_DRV_INST(inst), prop)
3708
3716#define DT_INST_STRING_TOKEN_BY_IDX(inst, prop, idx) \
3717 DT_STRING_TOKEN_BY_IDX(DT_DRV_INST(inst), prop, idx)
3718
3726#define DT_INST_STRING_UPPER_TOKEN_BY_IDX(inst, prop, idx) \
3727 DT_STRING_UPPER_TOKEN_BY_IDX(DT_DRV_INST(inst), prop, idx)
3728
3736#define DT_INST_STRING_UNQUOTED_BY_IDX(inst, prop, idx) \
3737 DT_STRING_UNQUOTED_BY_IDX(DT_DRV_INST(inst), prop, idx)
3738
3747#define DT_INST_PROP_BY_PHANDLE(inst, ph, prop) \
3748 DT_INST_PROP_BY_PHANDLE_IDX(inst, ph, 0, prop)
3749
3761#define DT_INST_PROP_BY_PHANDLE_IDX(inst, phs, idx, prop) \
3762 DT_PROP_BY_PHANDLE_IDX(DT_DRV_INST(inst), phs, idx, prop)
3763
3772#define DT_INST_PHA_BY_IDX(inst, pha, idx, cell) \
3773 DT_PHA_BY_IDX(DT_DRV_INST(inst), pha, idx, cell)
3774
3784#define DT_INST_PHA_BY_IDX_OR(inst, pha, idx, cell, default_value) \
3785 DT_PHA_BY_IDX_OR(DT_DRV_INST(inst), pha, idx, cell, default_value)
3786
3795#define DT_INST_PHA(inst, pha, cell) DT_INST_PHA_BY_IDX(inst, pha, 0, cell)
3796
3805#define DT_INST_PHA_OR(inst, pha, cell, default_value) \
3806 DT_INST_PHA_BY_IDX_OR(inst, pha, 0, cell, default_value)
3807
3817#define DT_INST_PHA_BY_NAME(inst, pha, name, cell) \
3818 DT_PHA_BY_NAME(DT_DRV_INST(inst), pha, name, cell)
3819
3829#define DT_INST_PHA_BY_NAME_OR(inst, pha, name, cell, default_value) \
3830 DT_PHA_BY_NAME_OR(DT_DRV_INST(inst), pha, name, cell, default_value)
3831
3840#define DT_INST_PHANDLE_BY_NAME(inst, pha, name) \
3841 DT_PHANDLE_BY_NAME(DT_DRV_INST(inst), pha, name) \
3842
3852#define DT_INST_PHANDLE_BY_IDX(inst, prop, idx) \
3853 DT_PHANDLE_BY_IDX(DT_DRV_INST(inst), prop, idx)
3854
3863#define DT_INST_PHANDLE(inst, prop) DT_INST_PHANDLE_BY_IDX(inst, prop, 0)
3864
3872#define DT_INST_REG_HAS_IDX(inst, idx) DT_REG_HAS_IDX(DT_DRV_INST(inst), idx)
3873
3880#define DT_INST_REG_ADDR_BY_IDX(inst, idx) DT_REG_ADDR_BY_IDX(DT_DRV_INST(inst), idx)
3881
3888#define DT_INST_REG_SIZE_BY_IDX(inst, idx) \
3889 DT_REG_SIZE_BY_IDX(DT_DRV_INST(inst), idx)
3890
3897#define DT_INST_REG_ADDR_BY_NAME(inst, name) \
3898 DT_REG_ADDR_BY_NAME(DT_DRV_INST(inst), name)
3899
3912#define DT_INST_REG_ADDR_BY_NAME_U64(inst, name) \
3913 DT_U64_C(DT_INST_REG_ADDR_BY_NAME(inst, name))
3914
3921#define DT_INST_REG_SIZE_BY_NAME(inst, name) \
3922 DT_REG_SIZE_BY_NAME(DT_DRV_INST(inst), name)
3923
3929#define DT_INST_REG_ADDR(inst) DT_INST_REG_ADDR_BY_IDX(inst, 0)
3930
3942#define DT_INST_REG_ADDR_U64(inst) DT_U64_C(DT_INST_REG_ADDR(inst))
3943
3949#define DT_INST_REG_SIZE(inst) DT_INST_REG_SIZE_BY_IDX(inst, 0)
3950
3957#define DT_INST_IRQ_LEVEL(inst) DT_IRQ_LEVEL(DT_DRV_INST(inst))
3958
3966#define DT_INST_IRQ_BY_IDX(inst, idx, cell) \
3967 DT_IRQ_BY_IDX(DT_DRV_INST(inst), idx, cell)
3968
3975#define DT_INST_IRQ_INTC_BY_IDX(inst, idx) \
3976 DT_IRQ_INTC_BY_IDX(DT_DRV_INST(inst), idx)
3977
3984#define DT_INST_IRQ_INTC_BY_NAME(inst, name) \
3985 DT_IRQ_INTC_BY_NAME(DT_DRV_INST(inst), name)
3986
3994#define DT_INST_IRQ_INTC(inst) \
3995 DT_INST_IRQ_INTC_BY_IDX(inst, 0)
3996
4004#define DT_INST_IRQ_BY_NAME(inst, name, cell) \
4005 DT_IRQ_BY_NAME(DT_DRV_INST(inst), name, cell)
4006
4013#define DT_INST_IRQ(inst, cell) DT_INST_IRQ_BY_IDX(inst, 0, cell)
4014
4020#define DT_INST_IRQN(inst) DT_IRQN(DT_DRV_INST(inst))
4021
4028#define DT_INST_IRQN_BY_IDX(inst, idx) DT_IRQN_BY_IDX(DT_DRV_INST(inst), idx)
4029
4035#define DT_INST_BUS(inst) DT_BUS(DT_DRV_INST(inst))
4036
4044#define DT_INST_ON_BUS(inst, bus) DT_ON_BUS(DT_DRV_INST(inst), bus)
4045
4055#define DT_INST_STRING_TOKEN_OR(inst, name, default_value) \
4056 DT_STRING_TOKEN_OR(DT_DRV_INST(inst), name, default_value)
4057
4066#define DT_INST_STRING_UPPER_TOKEN_OR(inst, name, default_value) \
4067 DT_STRING_UPPER_TOKEN_OR(DT_DRV_INST(inst), name, default_value)
4068
4077#define DT_INST_STRING_UNQUOTED_OR(inst, name, default_value) \
4078 DT_STRING_UNQUOTED_OR(DT_DRV_INST(inst), name, default_value)
4079
4080/*
4081 * @brief Test if any enabled node with the given compatible is on
4082 * the given bus type
4083 *
4084 * This is like DT_ANY_INST_ON_BUS_STATUS_OKAY(), except it can also
4085 * be useful for handling multiple compatibles in single source file.
4086 *
4087 * Example devicetree overlay:
4088 *
4089 * @code{.dts}
4090 * &i2c0 {
4091 * temp: temperature-sensor@76 {
4092 * compatible = "vnd,some-sensor";
4093 * reg = <0x76>;
4094 * };
4095 * };
4096 * @endcode
4097 *
4098 * Example usage, assuming `i2c0` is an I2C bus controller node, and
4099 * therefore `temp` is on an I2C bus:
4100 *
4101 * @code{.c}
4102 * DT_HAS_COMPAT_ON_BUS_STATUS_OKAY(vnd_some_sensor, i2c) // 1
4103 * @endcode
4104 *
4105 * @param compat lowercase-and-underscores compatible, without quotes
4106 * @param bus a binding's bus type as a C token, lowercased and without quotes
4107 * @return 1 if any enabled node with that compatible is on that bus type,
4108 * 0 otherwise
4109 */
4110#define DT_HAS_COMPAT_ON_BUS_STATUS_OKAY(compat, bus) \
4111 IS_ENABLED(DT_CAT4(DT_COMPAT_, compat, _BUS_, bus))
4112
4145#define DT_ANY_INST_ON_BUS_STATUS_OKAY(bus) \
4146 DT_HAS_COMPAT_ON_BUS_STATUS_OKAY(DT_DRV_COMPAT, bus)
4147
4192#define DT_ANY_INST_HAS_PROP_STATUS_OKAY(prop) \
4193 (DT_INST_FOREACH_STATUS_OKAY_VARGS(DT_INST_NODE_HAS_PROP_AND_OR, prop) 0)
4194
4260#define DT_INST_FOREACH_STATUS_OKAY(fn) \
4261 COND_CODE_1(DT_HAS_COMPAT_STATUS_OKAY(DT_DRV_COMPAT), \
4262 (UTIL_CAT(DT_FOREACH_OKAY_INST_, \
4263 DT_DRV_COMPAT)(fn)), \
4264 ())
4265
4277#define DT_INST_FOREACH_STATUS_OKAY_VARGS(fn, ...) \
4278 COND_CODE_1(DT_HAS_COMPAT_STATUS_OKAY(DT_DRV_COMPAT), \
4279 (UTIL_CAT(DT_FOREACH_OKAY_INST_VARGS_, \
4280 DT_DRV_COMPAT)(fn, __VA_ARGS__)), \
4281 ())
4282
4293#define DT_INST_FOREACH_PROP_ELEM(inst, prop, fn) \
4294 DT_FOREACH_PROP_ELEM(DT_DRV_INST(inst), prop, fn)
4295
4308#define DT_INST_FOREACH_PROP_ELEM_SEP(inst, prop, fn, sep) \
4309 DT_FOREACH_PROP_ELEM_SEP(DT_DRV_INST(inst), prop, fn, sep)
4310
4325#define DT_INST_FOREACH_PROP_ELEM_VARGS(inst, prop, fn, ...) \
4326 DT_FOREACH_PROP_ELEM_VARGS(DT_DRV_INST(inst), prop, fn, __VA_ARGS__)
4327
4345#define DT_INST_FOREACH_PROP_ELEM_SEP_VARGS(inst, prop, fn, sep, ...) \
4346 DT_FOREACH_PROP_ELEM_SEP_VARGS(DT_DRV_INST(inst), prop, fn, sep, \
4347 __VA_ARGS__)
4348
4355#define DT_INST_NODE_HAS_PROP(inst, prop) \
4356 DT_NODE_HAS_PROP(DT_DRV_INST(inst), prop)
4357
4368#define DT_INST_PHA_HAS_CELL_AT_IDX(inst, pha, idx, cell) \
4369 DT_PHA_HAS_CELL_AT_IDX(DT_DRV_INST(inst), pha, idx, cell)
4370
4380#define DT_INST_PHA_HAS_CELL(inst, pha, cell) \
4381 DT_INST_PHA_HAS_CELL_AT_IDX(inst, pha, 0, cell)
4382
4390#define DT_INST_IRQ_HAS_IDX(inst, idx) DT_IRQ_HAS_IDX(DT_DRV_INST(inst), idx)
4391
4400#define DT_INST_IRQ_HAS_CELL_AT_IDX(inst, idx, cell) \
4401 DT_IRQ_HAS_CELL_AT_IDX(DT_DRV_INST(inst), idx, cell)
4402
4410#define DT_INST_IRQ_HAS_CELL(inst, cell) \
4411 DT_INST_IRQ_HAS_CELL_AT_IDX(inst, 0, cell)
4412
4419#define DT_INST_IRQ_HAS_NAME(inst, name) \
4420 DT_IRQ_HAS_NAME(DT_DRV_INST(inst), name)
4421
4428#define DT_PATH_INTERNAL(...) \
4429 UTIL_CAT(DT_ROOT, MACRO_MAP_CAT(DT_S_PREFIX, __VA_ARGS__))
4435#define DT_S_PREFIX(name) _S_##name
4436
4451#define DT_CAT(a1, a2) a1 ## a2
4453#define DT_CAT3(a1, a2, a3) a1 ## a2 ## a3
4455#define DT_CAT4(a1, a2, a3, a4) a1 ## a2 ## a3 ## a4
4457#define DT_CAT5(a1, a2, a3, a4, a5) a1 ## a2 ## a3 ## a4 ## a5
4459#define DT_CAT6(a1, a2, a3, a4, a5, a6) a1 ## a2 ## a3 ## a4 ## a5 ## a6
4461#define DT_CAT7(a1, a2, a3, a4, a5, a6, a7) \
4462 a1 ## a2 ## a3 ## a4 ## a5 ## a6 ## a7
4464#define DT_CAT8(a1, a2, a3, a4, a5, a6, a7, a8) \
4465 a1 ## a2 ## a3 ## a4 ## a5 ## a6 ## a7 ## a8
4466/*
4467 * If you need to define a bigger DT_CATN(), do so here. Don't leave
4468 * any "holes" of undefined macros, please.
4469 */
4470
4472#define DT_DASH(...) MACRO_MAP_CAT(DT_DASH_PREFIX, __VA_ARGS__)
4474#define DT_DASH_PREFIX(name) _##name
4476#define DT_NODE_HAS_STATUS_INTERNAL(node_id, status) \
4477 IS_ENABLED(DT_CAT3(node_id, _STATUS_, status))
4478
4480#define DT_INST_NODE_HAS_PROP_AND_OR(inst, prop) \
4481 DT_INST_NODE_HAS_PROP(inst, prop) ||
4482
4487#if defined(_LINKER) || defined(_ASMLANGUAGE)
4488#define DT_U64_C(_v) (_v)
4489#else
4490#define DT_U64_C(_v) UINT64_C(_v)
4491#endif
4492
4495/* have these last so they have access to all previously defined macros */
4498#include <zephyr/devicetree/gpio.h>
4499#include <zephyr/devicetree/spi.h>
4500#include <zephyr/devicetree/dma.h>
4501#include <zephyr/devicetree/pwms.h>
4505#include <zephyr/devicetree/can.h>
4507#include <zephyr/devicetree/mbox.h>
4508
4509#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.