Zephyr API Documentation 4.4.0-rc1
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 * Copyright (c) 2025 The Zephyr Project Contributors
6 *
7 * Not a generated file. Feel free to modify.
8 */
9
16
17#ifndef ZEPHYR_INCLUDE_DEVICETREE_H_
18#define ZEPHYR_INCLUDE_DEVICETREE_H_
19
20#include <zephyr/devicetree_generated.h>
22
23#if !defined(_LINKER) && !defined(_ASMLANGUAGE)
24#include <stdint.h>
25#endif
26
27#include <zephyr/sys/util.h>
28
37
38/*
39 * Property suffixes
40 * -----------------
41 *
42 * These are the optional parts that come after the _P_<property>
43 * part in DT_N_<path-id>_P_<property-id> macros, or the "prop-suf"
44 * nonterminal in the DT guide's macros.bnf file.
45 *
46 * Before adding new ones, check this list to avoid conflicts. If any
47 * are missing from this list, please add them. It should be complete.
48 *
49 * _ENUM_IDX: property's value as an index into bindings enum
50 * _ENUM_VAL_<val>_EXISTS property's value as a token exists
51 * _EXISTS: property is defined
52 * _FOREACH_PROP_ELEM: helper for "iterating" over values in the property
53 * _FOREACH_PROP_ELEM_VARGS: foreach functions with variable number of arguments
54 * _IDX_<i>: logical index into property
55 * _IDX_<i>_EXISTS: logical index into property is defined
56 * _IDX_<i>_PH: phandle array's phandle by index (or phandle, phandles)
57 * _IDX_<i>_STRING_TOKEN: string array element value as a token
58 * _IDX_<i>_STRING_UPPER_TOKEN: string array element value as a uppercased token
59 * _IDX <i>_STRING_UNQUOTED: string array element value as a sequence of tokens, with no quotes
60 * _IDX_<i>_VAL_<val>: phandle array's specifier value by index
61 * _IDX_<i>_VAL_<val>_EXISTS: cell value exists, by index
62 * _LEN: property logical length
63 * _NAME_<name>_PH: phandle array's phandle by name
64 * _NAME_<name>_VAL_<val>: phandle array's property specifier by name
65 * _NAME_<name>_VAL_<val>_EXISTS: cell value exists, by name
66 * _STRING_TOKEN: string property's value as a token
67 * _STRING_UPPER_TOKEN: like _STRING_TOKEN, but uppercased
68 * _STRING_UNQUOTED: string property's value as a sequence of tokens, with no quotes
69 */
70
76
84#define DT_INVALID_NODE _
85
89#define DT_ROOT DT_N
90
141#define DT_PATH(...) DT_PATH_INTERNAL(__VA_ARGS__)
142
197#define DT_NODELABEL(label) DT_CAT(DT_N_NODELABEL_, label)
198
237#define DT_ALIAS(alias) DT_CAT(DT_N_ALIAS_, alias)
238
244#define DT_HAS_ALIAS(alias_name) DT_NODE_EXISTS(DT_ALIAS(alias_name))
245
254#define DT_NODE_HASH(node_id) DT_CAT(node_id, _HASH)
255
350#define DT_INST(inst, compat) UTIL_CAT(DT_N_INST, DT_DASH(inst, compat))
351
375#define DT_PARENT(node_id) DT_CAT(node_id, _PARENT)
376
400#define DT_GPARENT(node_id) DT_PARENT(DT_PARENT(node_id))
401
437#define DT_CHILD(node_id, child) UTIL_CAT(node_id, DT_S_PREFIX(child))
438
471#define DT_CHILD_BY_UNIT_ADDR_INT(node_id, addr) \
472 DT_CAT3(node_id, _CHILD_UNIT_ADDR_INT_, addr)
473
515#define DT_COMPAT_GET_ANY_STATUS_OKAY(compat) \
516 COND_CODE_1(DT_HAS_COMPAT_STATUS_OKAY(compat), \
517 (DT_INST(0, compat)), \
518 (DT_INVALID_NODE))
519
547#define DT_NODE_PATH(node_id) DT_CAT(node_id, _PATH)
548
573#define DT_NODE_FULL_NAME(node_id) DT_CAT(node_id, _FULL_NAME)
574
601#define DT_NODE_FULL_NAME_UNQUOTED(node_id) DT_CAT(node_id, _FULL_NAME_UNQUOTED)
602
629#define DT_NODE_FULL_NAME_TOKEN(node_id) DT_CAT(node_id, _FULL_NAME_TOKEN)
630
659#define DT_NODE_FULL_NAME_UPPER_TOKEN(node_id) DT_CAT(node_id, _FULL_NAME_UPPER_TOKEN)
660
687#define DT_NODE_CHILD_IDX(node_id) DT_CAT(node_id, _CHILD_IDX)
688
695#define DT_CHILD_NUM(node_id) DT_CAT(node_id, _CHILD_NUM)
696
697
705#define DT_CHILD_NUM_STATUS_OKAY(node_id) \
706 DT_CAT(node_id, _CHILD_NUM_STATUS_OKAY)
707
728#define DT_SAME_NODE(node_id1, node_id2) \
729 IS_EQ(DT_DEP_ORD(node_id1), DT_DEP_ORD(node_id2))
730
755#define DT_NODELABEL_STRING_ARRAY(node_id) \
756 { DT_FOREACH_NODELABEL(node_id, DT_NODELABEL_STRING_ARRAY_ENTRY_INTERNAL) }
757
761
767
798#define DT_PROP(node_id, prop) DT_CAT3(node_id, _P_, prop)
799
832#define DT_PROP_LEN(node_id, prop) DT_CAT4(node_id, _P_, prop, _LEN)
833
848#define DT_PROP_LEN_OR(node_id, prop, default_value) \
849 COND_CODE_1(DT_NODE_HAS_PROP(node_id, prop), \
850 (DT_PROP_LEN(node_id, prop)), (default_value))
851
872#define DT_PROP_HAS_IDX(node_id, prop, idx) \
873 IS_ENABLED(DT_CAT6(node_id, _P_, prop, _IDX_, idx, _EXISTS))
874
907#define DT_PROP_HAS_NAME(node_id, prop, name) \
908 IS_ENABLED(DT_CAT6(node_id, _P_, prop, _NAME_, name, _EXISTS))
909
944#define DT_PROP_BY_IDX(node_id, prop, idx) \
945 DT_CAT5(node_id, _P_, prop, _IDX_, idx)
946
955#define DT_PROP_LAST(node_id, prop) \
956 DT_PROP_BY_IDX(node_id, prop, UTIL_DEC(DT_PROP_LEN(node_id, prop)))
957
971#define DT_PROP_OR(node_id, prop, default_value) \
972 COND_CODE_1(DT_NODE_HAS_PROP(node_id, prop), \
973 (DT_PROP(node_id, prop)), (default_value))
974
1030#define DT_ENUM_IDX_BY_IDX(node_id, prop, idx) \
1031 DT_CAT6(node_id, _P_, prop, _IDX_, idx, _ENUM_IDX)
1032
1039#define DT_ENUM_IDX(node_id, prop) DT_ENUM_IDX_BY_IDX(node_id, prop, 0)
1040
1056#define DT_ENUM_IDX_BY_IDX_OR(node_id, prop, idx, default_idx_value) \
1057 COND_CODE_1(DT_PROP_HAS_IDX(node_id, prop, idx), \
1058 (DT_ENUM_IDX_BY_IDX(node_id, prop, idx)), (default_idx_value))
1059
1068#define DT_ENUM_IDX_OR(node_id, prop, default_idx_value) \
1069 DT_ENUM_IDX_BY_IDX_OR(node_id, prop, 0, default_idx_value)
1070
1080#define DT_ENUM_HAS_VALUE_BY_IDX(node_id, prop, idx, value) \
1081 IS_ENABLED(DT_CAT8(node_id, _P_, prop, _IDX_, idx, _ENUM_VAL_, value, _EXISTS))
1082
1090#define DT_ENUM_HAS_VALUE(node_id, prop, value) \
1091 IS_ENABLED(DT_CAT6(node_id, _P_, prop, _ENUM_VAL_, value, _EXISTS))
1092
1152#define DT_STRING_TOKEN(node_id, prop) \
1153 DT_CAT4(node_id, _P_, prop, _STRING_TOKEN)
1154
1168#define DT_STRING_TOKEN_OR(node_id, prop, default_value) \
1169 COND_CODE_1(DT_NODE_HAS_PROP(node_id, prop), \
1170 (DT_STRING_TOKEN(node_id, prop)), (default_value))
1171
1229#define DT_STRING_UPPER_TOKEN(node_id, prop) \
1230 DT_CAT4(node_id, _P_, prop, _STRING_UPPER_TOKEN)
1231
1246#define DT_STRING_UPPER_TOKEN_OR(node_id, prop, default_value) \
1247 COND_CODE_1(DT_NODE_HAS_PROP(node_id, prop), \
1248 (DT_STRING_UPPER_TOKEN(node_id, prop)), (default_value))
1249
1290#define DT_STRING_UNQUOTED(node_id, prop) \
1291 DT_CAT4(node_id, _P_, prop, _STRING_UNQUOTED)
1292
1307#define DT_STRING_UNQUOTED_OR(node_id, prop, default_value) \
1308 COND_CODE_1(DT_NODE_HAS_PROP(node_id, prop), \
1309 (DT_STRING_UNQUOTED(node_id, prop)), (default_value))
1310
1358#define DT_STRING_TOKEN_BY_IDX(node_id, prop, idx) \
1359 DT_CAT6(node_id, _P_, prop, _IDX_, idx, _STRING_TOKEN)
1360
1369#define DT_STRING_TOKEN_BY_IDX_OR(node_id, prop, idx, default_value) \
1370 COND_CODE_1(DT_PROP_HAS_IDX(node_id, prop, idx), \
1371 (DT_STRING_TOKEN_BY_IDX(node_id, prop, idx)), (default_value))
1372
1420#define DT_STRING_UPPER_TOKEN_BY_IDX(node_id, prop, idx) \
1421 DT_CAT6(node_id, _P_, prop, _IDX_, idx, _STRING_UPPER_TOKEN)
1422
1463#define DT_STRING_UNQUOTED_BY_IDX(node_id, prop, idx) \
1464 DT_CAT6(node_id, _P_, prop, _IDX_, idx, _STRING_UNQUOTED)
1465
1466/*
1467 * phandle properties
1468 *
1469 * These are special-cased to manage the impedance mismatch between
1470 * phandles, which are just uint32_t node properties that only make sense
1471 * within the tree itself, and C values.
1472 */
1473
1519#define DT_PROP_BY_PHANDLE_IDX(node_id, phs, idx, prop) \
1520 DT_PROP(DT_PHANDLE_BY_IDX(node_id, phs, idx), prop)
1521
1541#define DT_PROP_BY_PHANDLE_IDX_OR(node_id, phs, idx, prop, default_value) \
1542 DT_PROP_OR(DT_PHANDLE_BY_IDX(node_id, phs, idx), prop, default_value)
1543
1555#define DT_PROP_BY_PHANDLE(node_id, ph, prop) \
1556 DT_PROP_BY_PHANDLE_IDX(node_id, ph, 0, prop)
1557
1612#define DT_PHA_BY_IDX(node_id, pha, idx, cell) \
1613 DT_CAT7(node_id, _P_, pha, _IDX_, idx, _VAL_, cell)
1614
1638#define DT_PHA_BY_IDX_OR(node_id, pha, idx, cell, default_value) \
1639 DT_PROP_OR(node_id, DT_CAT5(pha, _IDX_, idx, _VAL_, cell), default_value)
1640
1648#define DT_PHA(node_id, pha, cell) DT_PHA_BY_IDX(node_id, pha, 0, cell)
1649
1664#define DT_PHA_OR(node_id, pha, cell, default_value) \
1665 DT_PHA_BY_IDX_OR(node_id, pha, 0, cell, default_value)
1666
1707#define DT_PHA_BY_NAME(node_id, pha, name, cell) \
1708 DT_CAT7(node_id, _P_, pha, _NAME_, name, _VAL_, cell)
1709
1731#define DT_PHA_BY_NAME_OR(node_id, pha, name, cell, default_value) \
1732 DT_PROP_OR(node_id, DT_CAT5(pha, _NAME_, name, _VAL_, cell), default_value)
1733
1781#define DT_PHANDLE_BY_NAME(node_id, pha, name) \
1782 DT_CAT6(node_id, _P_, pha, _NAME_, name, _PH)
1783
1833#define DT_PHANDLE_BY_IDX(node_id, prop, idx) \
1834 DT_CAT6(node_id, _P_, prop, _IDX_, idx, _PH)
1835
1847#define DT_PHANDLE(node_id, prop) DT_PHANDLE_BY_IDX(node_id, prop, 0)
1848
1852
1858
1895#define DT_NUM_RANGES(node_id) DT_CAT(node_id, _RANGES_NUM)
1896
1949#define DT_RANGES_HAS_IDX(node_id, idx) \
1950 IS_ENABLED(DT_CAT4(node_id, _RANGES_IDX_, idx, _EXISTS))
1951
2004#define DT_RANGES_HAS_CHILD_BUS_FLAGS_AT_IDX(node_id, idx) \
2005 IS_ENABLED(DT_CAT4(node_id, _RANGES_IDX_, idx, _VAL_CHILD_BUS_FLAGS_EXISTS))
2006
2044#define DT_RANGES_CHILD_BUS_FLAGS_BY_IDX(node_id, idx) \
2045 DT_CAT4(node_id, _RANGES_IDX_, idx, _VAL_CHILD_BUS_FLAGS)
2046
2093#define DT_RANGES_CHILD_BUS_ADDRESS_BY_IDX(node_id, idx) \
2094 DT_CAT4(node_id, _RANGES_IDX_, idx, _VAL_CHILD_BUS_ADDRESS)
2095
2142#define DT_RANGES_PARENT_BUS_ADDRESS_BY_IDX(node_id, idx) \
2143 DT_CAT4(node_id, _RANGES_IDX_, idx, _VAL_PARENT_BUS_ADDRESS)
2144
2191#define DT_RANGES_LENGTH_BY_IDX(node_id, idx) \
2192 DT_CAT4(node_id, _RANGES_IDX_, idx, _VAL_LENGTH)
2193
2233#define DT_FOREACH_RANGE(node_id, fn) \
2234 DT_CAT(node_id, _FOREACH_RANGE)(fn)
2235
2239
2245
2281#define DT_NODE_VENDOR_BY_IDX(node_id, idx) \
2282 DT_CAT3(node_id, _COMPAT_VENDOR_IDX_, idx)
2283
2296#define DT_NODE_VENDOR_HAS_IDX(node_id, idx) \
2297 IS_ENABLED(DT_CAT4(node_id, _COMPAT_VENDOR_IDX_, idx, _EXISTS))
2298
2313#define DT_NODE_VENDOR_BY_IDX_OR(node_id, idx, default_value) \
2314 COND_CODE_1(DT_NODE_VENDOR_HAS_IDX(node_id, idx), \
2315 (DT_NODE_VENDOR_BY_IDX(node_id, idx)), (default_value))
2316
2325#define DT_NODE_VENDOR_OR(node_id, default_value) \
2326 DT_NODE_VENDOR_BY_IDX_OR(node_id, 0, default_value)
2327
2357#define DT_NODE_MODEL_BY_IDX(node_id, idx) \
2358 DT_CAT3(node_id, _COMPAT_MODEL_IDX_, idx)
2359
2372#define DT_NODE_MODEL_HAS_IDX(node_id, idx) \
2373 IS_ENABLED(DT_CAT4(node_id, _COMPAT_MODEL_IDX_, idx, _EXISTS))
2374
2389#define DT_NODE_MODEL_BY_IDX_OR(node_id, idx, default_value) \
2390 COND_CODE_1(DT_NODE_MODEL_HAS_IDX(node_id, idx), \
2391 (DT_NODE_MODEL_BY_IDX(node_id, idx)), (default_value))
2392
2401#define DT_NODE_MODEL_OR(node_id, default_value) \
2402 DT_NODE_MODEL_BY_IDX_OR(node_id, 0, default_value)
2403
2407
2413
2421#define DT_NUM_REGS(node_id) DT_CAT(node_id, _REG_NUM)
2422
2434#define DT_REG_HAS_IDX(node_id, idx) \
2435 IS_ENABLED(DT_CAT4(node_id, _REG_IDX_, idx, _EXISTS))
2436
2448#define DT_REG_HAS_NAME(node_id, name) \
2449 IS_ENABLED(DT_CAT4(node_id, _REG_NAME_, name, _EXISTS))
2450
2462#define DT_REG_ADDR_BY_IDX_RAW(node_id, idx) \
2463 DT_CAT4(node_id, _REG_IDX_, idx, _VAL_ADDRESS)
2464
2476#define DT_REG_ADDR_RAW(node_id) \
2477 DT_REG_ADDR_BY_IDX_RAW(node_id, 0)
2478
2485#define DT_REG_ADDR_BY_IDX(node_id, idx) \
2486 DT_U32_C(DT_REG_ADDR_BY_IDX_RAW(node_id, idx))
2487
2499#define DT_REG_SIZE_BY_IDX(node_id, idx) \
2500 DT_U32_C(DT_CAT4(node_id, _REG_IDX_, idx, _VAL_SIZE))
2501
2509#define DT_REG_ADDR(node_id) DT_REG_ADDR_BY_IDX(node_id, 0)
2510
2521#define DT_REG_ADDR_U64(node_id) DT_U64_C(DT_REG_ADDR_BY_IDX_RAW(node_id, 0))
2522
2530#define DT_REG_SIZE(node_id) DT_REG_SIZE_BY_IDX(node_id, 0)
2531
2538#define DT_REG_ADDR_BY_NAME(node_id, name) \
2539 DT_U32_C(DT_CAT4(node_id, _REG_NAME_, name, _VAL_ADDRESS))
2540
2549#define DT_REG_ADDR_BY_NAME_OR(node_id, name, default_value) \
2550 COND_CODE_1(DT_REG_HAS_NAME(node_id, name), \
2551 (DT_REG_ADDR_BY_NAME(node_id, name)), (default_value))
2552
2565#define DT_REG_ADDR_BY_NAME_U64(node_id, name) \
2566 DT_U64_C(DT_CAT4(node_id, _REG_NAME_, name, _VAL_ADDRESS))
2567
2574#define DT_REG_SIZE_BY_NAME(node_id, name) \
2575 DT_U32_C(DT_CAT4(node_id, _REG_NAME_, name, _VAL_SIZE))
2576
2585#define DT_REG_SIZE_BY_NAME_OR(node_id, name, default_value) \
2586 COND_CODE_1(DT_REG_HAS_NAME(node_id, name), \
2587 (DT_REG_SIZE_BY_NAME(node_id, name)), (default_value))
2588
2589
2637#define DT_FOREACH_REG(node_id, fn) \
2638 DT_CAT(node_id, _FOREACH_REG)(fn)
2639
2688#define DT_FOREACH_REG_SEP(node_id, fn, sep) \
2689 DT_CAT(node_id, _FOREACH_REG_SEP)(fn, sep)
2690
2704
2705#define DT_FOREACH_REG_VARGS(node_id, fn, ...) \
2706 DT_CAT(node_id, _FOREACH_REG_VARGS)(fn, __VA_ARGS__)
2707
2724#define DT_FOREACH_REG_SEP_VARGS(node_id, fn, sep, ...) \
2725 DT_CAT(node_id, _FOREACH_REG_SEP_VARGS)(fn, sep, __VA_ARGS__)
2726
2730
2736
2745#define DT_NUM_IRQS(node_id) DT_CAT(node_id, _IRQ_NUM)
2746
2771#define DT_NUM_NODELABELS(node_id) DT_CAT(node_id, _NODELABEL_NUM)
2772
2779#define DT_IRQ_LEVEL(node_id) DT_CAT(node_id, _IRQ_LEVEL)
2780
2791#define DT_IRQ_HAS_IDX(node_id, idx) \
2792 IS_ENABLED(DT_CAT4(node_id, _IRQ_IDX_, idx, _EXISTS))
2793
2804#define DT_IRQ_HAS_CELL_AT_IDX(node_id, idx, cell) \
2805 IS_ENABLED(DT_CAT6(node_id, _IRQ_IDX_, idx, _VAL_, cell, _EXISTS))
2806
2814#define DT_IRQ_HAS_CELL(node_id, cell) DT_IRQ_HAS_CELL_AT_IDX(node_id, 0, cell)
2815
2825#define DT_IRQ_HAS_NAME(node_id, name) \
2826 IS_ENABLED(DT_CAT4(node_id, _IRQ_NAME_, name, _VAL_irq_EXISTS))
2827
2863#define DT_IRQ_BY_IDX(node_id, idx, cell) \
2864 DT_CAT5(node_id, _IRQ_IDX_, idx, _VAL_, cell)
2865
2881#define DT_IRQ_BY_NAME(node_id, name, cell) \
2882 DT_CAT5(node_id, _IRQ_NAME_, name, _VAL_, cell)
2883
2891#define DT_IRQ(node_id, cell) DT_IRQ_BY_IDX(node_id, 0, cell)
2892
2935#define DT_IRQ_INTC_BY_IDX(node_id, idx) \
2936 DT_CAT4(node_id, _IRQ_IDX_, idx, _CONTROLLER)
2937
2982#define DT_IRQ_INTC_BY_NAME(node_id, name) \
2983 DT_CAT4(node_id, _IRQ_NAME_, name, _CONTROLLER)
2984
3024#define DT_IRQ_INTC(node_id) \
3025 DT_IRQ_INTC_BY_IDX(node_id, 0)
3026
3030
3031/* DT helper macro to encode a node's IRQN to level 1 according to the multi-level scheme */
3032#define DT_IRQN_L1_INTERNAL(node_id, idx) DT_IRQ_BY_IDX(node_id, idx, irq)
3033/* DT helper macro to encode a node's IRQN to level 2 according to the multi-level scheme */
3034#define DT_IRQN_L2_INTERNAL(node_id, idx) \
3035 (IRQ_TO_L2(DT_IRQN_L1_INTERNAL(node_id, idx)) | \
3036 DT_IRQ(DT_IRQ_INTC_BY_IDX(node_id, idx), irq))
3037/* DT helper macro to encode a node's IRQN to level 3 according to the multi-level scheme */
3038#define DT_IRQN_L3_INTERNAL(node_id, idx) \
3039 (IRQ_TO_L3(DT_IRQN_L1_INTERNAL(node_id, idx)) | \
3040 IRQ_TO_L2(DT_IRQ(DT_IRQ_INTC_BY_IDX(node_id, idx), irq)) | \
3041 DT_IRQ(DT_IRQ_INTC(DT_IRQ_INTC_BY_IDX(node_id, idx)), irq))
3042/* DT helper macro for the macros above */
3043#define DT_IRQN_LVL_INTERNAL(node_id, idx, level) DT_CAT3(DT_IRQN_L, level, _INTERNAL)(node_id, idx)
3044
3049#define DT_MULTI_LEVEL_IRQN_INTERNAL(node_id, idx) \
3050 DT_IRQN_LVL_INTERNAL(node_id, idx, DT_IRQ_LEVEL(node_id))
3051
3055
3064#define DT_IRQN_BY_IDX(node_id, idx) \
3065 COND_CODE_1(IS_ENABLED(CONFIG_MULTI_LEVEL_INTERRUPTS), \
3066 (DT_MULTI_LEVEL_IRQN_INTERNAL(node_id, idx)), \
3067 (DT_IRQ_BY_IDX(node_id, idx, irq)))
3068
3079#define DT_IRQN(node_id) DT_IRQN_BY_IDX(node_id, 0)
3080
3084
3090
3099#define DT_CHOSEN(prop) DT_CAT(DT_CHOSEN_, prop)
3100
3107#define DT_HAS_CHOSEN(prop) IS_ENABLED(DT_CAT3(DT_CHOSEN_, prop, _EXISTS))
3108
3112
3148
3158#define DT_FOREACH_NODE(fn) DT_FOREACH_HELPER(fn)
3159
3172#define DT_FOREACH_NODE_VARGS(fn, ...) DT_FOREACH_VARGS_HELPER(fn, __VA_ARGS__)
3173
3185#define DT_FOREACH_STATUS_OKAY_NODE(fn) DT_FOREACH_OKAY_HELPER(fn)
3186
3201#define DT_FOREACH_STATUS_OKAY_NODE_VARGS(fn, ...) DT_FOREACH_OKAY_VARGS_HELPER(fn, __VA_ARGS__)
3202
3249#define DT_FOREACH_ANCESTOR(node_id, fn) \
3250 DT_CAT(node_id, _FOREACH_ANCESTOR)(fn)
3251
3295#define DT_FOREACH_CHILD(node_id, fn) \
3296 DT_CAT(node_id, _FOREACH_CHILD)(fn)
3297
3338#define DT_FOREACH_CHILD_SEP(node_id, fn, sep) \
3339 DT_CAT(node_id, _FOREACH_CHILD_SEP)(fn, sep)
3340
3356#define DT_FOREACH_CHILD_VARGS(node_id, fn, ...) \
3357 DT_CAT(node_id, _FOREACH_CHILD_VARGS)(fn, __VA_ARGS__)
3358
3374#define DT_FOREACH_CHILD_SEP_VARGS(node_id, fn, sep, ...) \
3375 DT_CAT(node_id, _FOREACH_CHILD_SEP_VARGS)(fn, sep, __VA_ARGS__)
3376
3392#define DT_FOREACH_CHILD_STATUS_OKAY(node_id, fn) \
3393 DT_CAT(node_id, _FOREACH_CHILD_STATUS_OKAY)(fn)
3394
3411#define DT_FOREACH_CHILD_STATUS_OKAY_SEP(node_id, fn, sep) \
3412 DT_CAT(node_id, _FOREACH_CHILD_STATUS_OKAY_SEP)(fn, sep)
3413
3433#define DT_FOREACH_CHILD_STATUS_OKAY_VARGS(node_id, fn, ...) \
3434 DT_CAT(node_id, _FOREACH_CHILD_STATUS_OKAY_VARGS)(fn, __VA_ARGS__)
3435
3454#define DT_FOREACH_CHILD_STATUS_OKAY_SEP_VARGS(node_id, fn, sep, ...) \
3455 DT_CAT(node_id, _FOREACH_CHILD_STATUS_OKAY_SEP_VARGS)(fn, sep, __VA_ARGS__)
3456
3507#define DT_FOREACH_PROP_ELEM(node_id, prop, fn) \
3508 DT_CAT4(node_id, _P_, prop, _FOREACH_PROP_ELEM)(fn)
3509
3552#define DT_FOREACH_PROP_ELEM_SEP(node_id, prop, fn, sep) \
3553 DT_CAT4(node_id, _P_, prop, _FOREACH_PROP_ELEM_SEP)(fn, sep)
3554
3575#define DT_FOREACH_PROP_ELEM_VARGS(node_id, prop, fn, ...) \
3576 DT_CAT4(node_id, _P_, prop, _FOREACH_PROP_ELEM_VARGS)(fn, __VA_ARGS__)
3577
3594#define DT_FOREACH_PROP_ELEM_SEP_VARGS(node_id, prop, fn, sep, ...) \
3595 DT_CAT4(node_id, _P_, prop, _FOREACH_PROP_ELEM_SEP_VARGS)( \
3596 fn, sep, __VA_ARGS__)
3597
3651#define DT_FOREACH_STATUS_OKAY(compat, fn) \
3652 COND_CODE_1(DT_HAS_COMPAT_STATUS_OKAY(compat), \
3653 (UTIL_CAT(DT_FOREACH_OKAY_, compat)(fn)), \
3654 ())
3655
3700#define DT_FOREACH_STATUS_OKAY_VARGS(compat, fn, ...) \
3701 COND_CODE_1(DT_HAS_COMPAT_STATUS_OKAY(compat), \
3702 (DT_CAT(DT_FOREACH_OKAY_VARGS_, \
3703 compat)(fn, __VA_ARGS__)), \
3704 ())
3705
3718#define DT_COMPAT_FOREACH_STATUS_OKAY_VARGS(compat, fn, ...) \
3719 COND_CODE_1(DT_HAS_COMPAT_STATUS_OKAY(compat), \
3720 (UTIL_CAT(DT_FOREACH_OKAY_INST_VARGS_, \
3721 compat)(fn, compat, __VA_ARGS__)), \
3722 ())
3723
3724
3763#define DT_FOREACH_NODELABEL(node_id, fn) DT_CAT(node_id, _FOREACH_NODELABEL)(fn)
3764
3802#define DT_FOREACH_NODELABEL_VARGS(node_id, fn, ...) \
3803 DT_CAT(node_id, _FOREACH_NODELABEL_VARGS)(fn, __VA_ARGS__)
3804
3808
3814
3829#define DT_NODE_EXISTS(node_id) IS_ENABLED(DT_CAT(node_id, _EXISTS))
3830
3852#define DT_NODE_HAS_STATUS(node_id, status) \
3853 DT_NODE_HAS_STATUS_INTERNAL(node_id, status)
3854
3875#define DT_NODE_HAS_STATUS_OKAY(node_id) DT_NODE_HAS_STATUS(node_id, okay)
3876
3896#define DT_HAS_COMPAT_STATUS_OKAY(compat) \
3897 IS_ENABLED(DT_CAT(DT_COMPAT_HAS_OKAY_, compat))
3898
3905#define DT_NUM_INST_STATUS_OKAY(compat) \
3906 UTIL_AND(DT_HAS_COMPAT_STATUS_OKAY(compat), \
3907 UTIL_CAT(DT_N_INST, DT_DASH(compat, NUM_OKAY)))
3908
3936#define DT_NODE_HAS_COMPAT(node_id, compat) \
3937 IS_ENABLED(DT_CAT3(node_id, _COMPAT_MATCHES_, compat))
3938
3953#define DT_NODE_HAS_COMPAT_STATUS(node_id, compat, status) \
3954 UTIL_AND(DT_NODE_HAS_COMPAT(node_id, compat), DT_NODE_HAS_STATUS(node_id, status))
3955
3969#define DT_NODE_HAS_PROP(node_id, prop) \
3970 IS_ENABLED(DT_CAT4(node_id, _P_, prop, _EXISTS))
3971
3972
3989#define DT_PHA_HAS_CELL_AT_IDX(node_id, pha, idx, cell) \
3990 IS_ENABLED(DT_CAT8(node_id, _P_, pha, \
3991 _IDX_, idx, _VAL_, cell, _EXISTS))
3992
4002#define DT_PHA_HAS_CELL(node_id, pha, cell) \
4003 DT_PHA_HAS_CELL_AT_IDX(node_id, pha, 0, cell)
4004
4025#define DT_FOREACH_PHA_CELL_BY_IDX(node_id, pha, idx, fn) \
4026 DT_CAT6(node_id, _P_, pha, _IDX_, idx, _FOREACH_CELL)(fn)
4027
4040#define DT_FOREACH_PHA_CELL_BY_IDX_SEP(node_id, pha, idx, fn, sep) \
4041 DT_CAT6(node_id, _P_, pha, _IDX_, idx, _FOREACH_CELL_SEP)(fn, sep)
4042
4051#define DT_PHA_NUM_CELLS_BY_IDX(node_id, pha, idx) \
4052 DT_CAT6(node_id, _P_, pha, _IDX_, idx, _NUM_CELLS)
4053
4065#define DT_PHA_ELEM_NAME_BY_IDX(node_id, pha, idx) \
4066 DT_CAT6(node_id, _P_, pha, _IDX_, idx, _NAME)
4067
4089#define DT_FOREACH_PHA_CELL_BY_NAME(node_id, pha, name, fn) \
4090 DT_CAT6(node_id, _P_, pha, _NAME_, name, _FOREACH_CELL)(fn)
4091
4104#define DT_FOREACH_PHA_CELL_BY_NAME_SEP(node_id, pha, name, fn, sep) \
4105 DT_CAT6(node_id, _P_, pha, _NAME_, name, _FOREACH_CELL_SEP)(fn, sep)
4106
4115#define DT_PHA_NUM_CELLS_BY_NAME(node_id, pha, name) \
4116 DT_CAT6(node_id, _P_, pha, _NAME_, name, _NUM_CELLS)
4117
4129#define DT_PHA_ELEM_IDX_BY_NAME(node_id, pha, name) \
4130 DT_CAT6(node_id, _P_, pha, _NAME_, name, _IDX)
4131
4132
4136
4142
4174#define DT_BUS(node_id) DT_CAT(node_id, _BUS)
4175
4204#define DT_ON_BUS(node_id, bus) IS_ENABLED(DT_CAT3(node_id, _BUS_, bus))
4205
4209
4215
4222#define DT_DRV_INST(inst) DT_INST(inst, DT_DRV_COMPAT)
4223
4231#define DT_INST_PARENT(inst) DT_PARENT(DT_DRV_INST(inst))
4232
4240#define DT_INST_GPARENT(inst) DT_GPARENT(DT_DRV_INST(inst))
4241
4251#define DT_INST_CHILD(inst, child) \
4252 DT_CHILD(DT_DRV_INST(inst), child)
4253
4266#define DT_INST_CHILD_BY_UNIT_ADDR_INT(inst, addr) \
4267 DT_CHILD_BY_UNIT_ADDR_INT(DT_DRV_INST(inst), addr)
4268
4278#define DT_INST_CHILD_NUM(inst) DT_CHILD_NUM(DT_DRV_INST(inst))
4279
4289#define DT_INST_CHILD_NUM_STATUS_OKAY(inst) \
4290 DT_CHILD_NUM_STATUS_OKAY(DT_DRV_INST(inst))
4291
4300#define DT_INST_NODELABEL_STRING_ARRAY(inst) DT_NODELABEL_STRING_ARRAY(DT_DRV_INST(inst))
4301
4310#define DT_INST_NUM_NODELABELS(inst) DT_NUM_NODELABELS(DT_DRV_INST(inst))
4311
4326#define DT_INST_FOREACH_CHILD(inst, fn) \
4327 DT_FOREACH_CHILD(DT_DRV_INST(inst), fn)
4328
4342#define DT_INST_FOREACH_CHILD_SEP(inst, fn, sep) \
4343 DT_FOREACH_CHILD_SEP(DT_DRV_INST(inst), fn, sep)
4344
4360#define DT_INST_FOREACH_CHILD_VARGS(inst, fn, ...) \
4361 DT_FOREACH_CHILD_VARGS(DT_DRV_INST(inst), fn, __VA_ARGS__)
4362
4377#define DT_INST_FOREACH_CHILD_SEP_VARGS(inst, fn, sep, ...) \
4378 DT_FOREACH_CHILD_SEP_VARGS(DT_DRV_INST(inst), fn, sep, __VA_ARGS__)
4379
4391#define DT_INST_FOREACH_CHILD_STATUS_OKAY(inst, fn) \
4392 DT_FOREACH_CHILD_STATUS_OKAY(DT_DRV_INST(inst), fn)
4393
4408#define DT_INST_FOREACH_CHILD_STATUS_OKAY_SEP(inst, fn, sep) \
4409 DT_FOREACH_CHILD_STATUS_OKAY_SEP(DT_DRV_INST(inst), fn, sep)
4410
4424#define DT_INST_FOREACH_CHILD_STATUS_OKAY_VARGS(inst, fn, ...) \
4425 DT_FOREACH_CHILD_STATUS_OKAY_VARGS(DT_DRV_INST(inst), fn, __VA_ARGS__)
4426
4442#define DT_INST_FOREACH_CHILD_STATUS_OKAY_SEP_VARGS(inst, fn, sep, ...) \
4443 DT_FOREACH_CHILD_STATUS_OKAY_SEP_VARGS(DT_DRV_INST(inst), fn, sep, __VA_ARGS__)
4444
4459#define DT_INST_FOREACH_REG(inst, fn) \
4460 DT_FOREACH_REG(DT_DRV_INST(inst), fn)
4461
4478#define DT_INST_FOREACH_REG_SEP(inst, fn, sep) \
4479 DT_FOREACH_REG_SEP(DT_DRV_INST(inst), fn, sep)
4480
4497#define DT_INST_FOREACH_REG_VARGS(inst, fn, ...) \
4498 DT_FOREACH_REG_VARGS(DT_DRV_INST(inst), fn, __VA_ARGS__)
4499
4518#define DT_INST_FOREACH_REG_SEP_VARGS(inst, fn, sep, ...) \
4519 DT_FOREACH_REG_SEP_VARGS(DT_DRV_INST(inst), fn, sep, __VA_ARGS__)
4520
4528#define DT_INST_ENUM_IDX_BY_IDX(inst, prop, idx) \
4529 DT_ENUM_IDX_BY_IDX(DT_DRV_INST(inst), prop, idx)
4530
4537#define DT_INST_ENUM_IDX(inst, prop) \
4538 DT_ENUM_IDX(DT_DRV_INST(inst), prop)
4539
4549#define DT_INST_ENUM_IDX_BY_IDX_OR(inst, prop, idx, default_idx_value) \
4550 DT_ENUM_IDX_BY_IDX_OR(DT_DRV_INST(inst), prop, idx, default_idx_value)
4551
4560#define DT_INST_ENUM_IDX_OR(inst, prop, default_idx_value) \
4561 DT_ENUM_IDX_OR(DT_DRV_INST(inst), prop, default_idx_value)
4562
4571#define DT_INST_ENUM_HAS_VALUE_BY_IDX(inst, prop, idx, value) \
4572 DT_ENUM_HAS_VALUE_BY_IDX(DT_DRV_INST(inst), prop, idx, value)
4573
4582#define DT_INST_ENUM_HAS_VALUE(inst, prop, value) \
4583 DT_ENUM_HAS_VALUE(DT_DRV_INST(inst), prop, value)
4584
4591#define DT_INST_PROP(inst, prop) DT_PROP(DT_DRV_INST(inst), prop)
4592
4599#define DT_INST_PROP_LEN(inst, prop) DT_PROP_LEN(DT_DRV_INST(inst), prop)
4600
4610#define DT_INST_PROP_HAS_IDX(inst, prop, idx) \
4611 DT_PROP_HAS_IDX(DT_DRV_INST(inst), prop, idx)
4612
4621#define DT_INST_PROP_HAS_NAME(inst, prop, name) \
4622 DT_PROP_HAS_NAME(DT_DRV_INST(inst), prop, name)
4623
4631#define DT_INST_PROP_BY_IDX(inst, prop, idx) \
4632 DT_PROP_BY_IDX(DT_DRV_INST(inst), prop, idx)
4633
4641#define DT_INST_PROP_OR(inst, prop, default_value) \
4642 DT_PROP_OR(DT_DRV_INST(inst), prop, default_value)
4643
4651#define DT_INST_PROP_LEN_OR(inst, prop, default_value) \
4652 DT_PROP_LEN_OR(DT_DRV_INST(inst), prop, default_value)
4653
4663#define DT_INST_STRING_TOKEN(inst, prop) \
4664 DT_STRING_TOKEN(DT_DRV_INST(inst), prop)
4665
4673#define DT_INST_STRING_UPPER_TOKEN(inst, prop) \
4674 DT_STRING_UPPER_TOKEN(DT_DRV_INST(inst), prop)
4675
4684#define DT_INST_STRING_UNQUOTED(inst, prop) \
4685 DT_STRING_UNQUOTED(DT_DRV_INST(inst), prop)
4686
4694#define DT_INST_STRING_TOKEN_BY_IDX(inst, prop, idx) \
4695 DT_STRING_TOKEN_BY_IDX(DT_DRV_INST(inst), prop, idx)
4696
4705#define DT_INST_STRING_TOKEN_BY_IDX_OR(inst, prop, idx, default_value) \
4706 DT_STRING_TOKEN_BY_IDX_OR(DT_DRV_INST(inst), prop, idx, default_value)
4707
4715#define DT_INST_STRING_UPPER_TOKEN_BY_IDX(inst, prop, idx) \
4716 DT_STRING_UPPER_TOKEN_BY_IDX(DT_DRV_INST(inst), prop, idx)
4717
4725#define DT_INST_STRING_UNQUOTED_BY_IDX(inst, prop, idx) \
4726 DT_STRING_UNQUOTED_BY_IDX(DT_DRV_INST(inst), prop, idx)
4727
4736#define DT_INST_PROP_BY_PHANDLE(inst, ph, prop) \
4737 DT_INST_PROP_BY_PHANDLE_IDX(inst, ph, 0, prop)
4738
4750#define DT_INST_PROP_BY_PHANDLE_IDX(inst, phs, idx, prop) \
4751 DT_PROP_BY_PHANDLE_IDX(DT_DRV_INST(inst), phs, idx, prop)
4752
4761#define DT_INST_PHA_BY_IDX(inst, pha, idx, cell) \
4762 DT_PHA_BY_IDX(DT_DRV_INST(inst), pha, idx, cell)
4763
4773#define DT_INST_PHA_BY_IDX_OR(inst, pha, idx, cell, default_value) \
4774 DT_PHA_BY_IDX_OR(DT_DRV_INST(inst), pha, idx, cell, default_value)
4775
4784#define DT_INST_PHA(inst, pha, cell) DT_INST_PHA_BY_IDX(inst, pha, 0, cell)
4785
4794#define DT_INST_PHA_OR(inst, pha, cell, default_value) \
4795 DT_INST_PHA_BY_IDX_OR(inst, pha, 0, cell, default_value)
4796
4806#define DT_INST_PHA_BY_NAME(inst, pha, name, cell) \
4807 DT_PHA_BY_NAME(DT_DRV_INST(inst), pha, name, cell)
4808
4818#define DT_INST_PHA_BY_NAME_OR(inst, pha, name, cell, default_value) \
4819 DT_PHA_BY_NAME_OR(DT_DRV_INST(inst), pha, name, cell, default_value)
4820
4829#define DT_INST_PHANDLE_BY_NAME(inst, pha, name) \
4830 DT_PHANDLE_BY_NAME(DT_DRV_INST(inst), pha, name) \
4831
4832
4841#define DT_INST_PHANDLE_BY_IDX(inst, prop, idx) \
4842 DT_PHANDLE_BY_IDX(DT_DRV_INST(inst), prop, idx)
4843
4852#define DT_INST_PHANDLE(inst, prop) DT_INST_PHANDLE_BY_IDX(inst, prop, 0)
4853
4861#define DT_INST_REG_HAS_IDX(inst, idx) DT_REG_HAS_IDX(DT_DRV_INST(inst), idx)
4862
4870#define DT_INST_REG_HAS_NAME(inst, name) DT_REG_HAS_NAME(DT_DRV_INST(inst), name)
4871
4878#define DT_INST_REG_ADDR_BY_IDX_RAW(inst, idx) DT_REG_ADDR_BY_IDX_RAW(DT_DRV_INST(inst), idx)
4879
4886#define DT_INST_REG_ADDR_BY_IDX(inst, idx) DT_REG_ADDR_BY_IDX(DT_DRV_INST(inst), idx)
4887
4894#define DT_INST_REG_SIZE_BY_IDX(inst, idx) \
4895 DT_REG_SIZE_BY_IDX(DT_DRV_INST(inst), idx)
4896
4903#define DT_INST_REG_ADDR_BY_NAME(inst, name) \
4904 DT_REG_ADDR_BY_NAME(DT_DRV_INST(inst), name)
4905
4914#define DT_INST_REG_ADDR_BY_NAME_OR(inst, name, default_value) \
4915 DT_REG_ADDR_BY_NAME_OR(DT_DRV_INST(inst), name, default_value)
4916
4929#define DT_INST_REG_ADDR_BY_NAME_U64(inst, name) \
4930 DT_REG_ADDR_BY_NAME_U64(DT_DRV_INST(inst), name)
4931
4938#define DT_INST_REG_SIZE_BY_NAME(inst, name) \
4939 DT_REG_SIZE_BY_NAME(DT_DRV_INST(inst), name)
4940
4949#define DT_INST_REG_SIZE_BY_NAME_OR(inst, name, default_value) \
4950 DT_REG_SIZE_BY_NAME_OR(DT_DRV_INST(inst), name, default_value)
4951
4957#define DT_INST_REG_ADDR_RAW(inst) DT_INST_REG_ADDR_BY_IDX_RAW(inst, 0)
4958
4964#define DT_INST_REG_ADDR(inst) DT_INST_REG_ADDR_BY_IDX(inst, 0)
4965
4977#define DT_INST_REG_ADDR_U64(inst) DT_REG_ADDR_U64(DT_DRV_INST(inst))
4978
4984#define DT_INST_REG_SIZE(inst) DT_INST_REG_SIZE_BY_IDX(inst, 0)
4985
4992#define DT_INST_NUM_IRQS(inst) DT_NUM_IRQS(DT_DRV_INST(inst))
4993
5000#define DT_INST_IRQ_LEVEL(inst) DT_IRQ_LEVEL(DT_DRV_INST(inst))
5001
5009#define DT_INST_IRQ_BY_IDX(inst, idx, cell) \
5010 DT_IRQ_BY_IDX(DT_DRV_INST(inst), idx, cell)
5011
5018#define DT_INST_IRQ_INTC_BY_IDX(inst, idx) \
5019 DT_IRQ_INTC_BY_IDX(DT_DRV_INST(inst), idx)
5020
5027#define DT_INST_IRQ_INTC_BY_NAME(inst, name) \
5028 DT_IRQ_INTC_BY_NAME(DT_DRV_INST(inst), name)
5029
5037#define DT_INST_IRQ_INTC(inst) \
5038 DT_INST_IRQ_INTC_BY_IDX(inst, 0)
5039
5047#define DT_INST_IRQ_BY_NAME(inst, name, cell) \
5048 DT_IRQ_BY_NAME(DT_DRV_INST(inst), name, cell)
5049
5056#define DT_INST_IRQ(inst, cell) DT_INST_IRQ_BY_IDX(inst, 0, cell)
5057
5063#define DT_INST_IRQN(inst) DT_IRQN(DT_DRV_INST(inst))
5064
5071#define DT_INST_IRQN_BY_IDX(inst, idx) DT_IRQN_BY_IDX(DT_DRV_INST(inst), idx)
5072
5078#define DT_INST_BUS(inst) DT_BUS(DT_DRV_INST(inst))
5079
5087#define DT_INST_ON_BUS(inst, bus) DT_ON_BUS(DT_DRV_INST(inst), bus)
5088
5098#define DT_INST_STRING_TOKEN_OR(inst, name, default_value) \
5099 DT_STRING_TOKEN_OR(DT_DRV_INST(inst), name, default_value)
5100
5109#define DT_INST_STRING_UPPER_TOKEN_OR(inst, name, default_value) \
5110 DT_STRING_UPPER_TOKEN_OR(DT_DRV_INST(inst), name, default_value)
5111
5120#define DT_INST_STRING_UNQUOTED_OR(inst, name, default_value) \
5121 DT_STRING_UNQUOTED_OR(DT_DRV_INST(inst), name, default_value)
5122
5153#define DT_HAS_COMPAT_ON_BUS_STATUS_OKAY(compat, bus) \
5154 IS_ENABLED(DT_CAT4(DT_COMPAT_, compat, _BUS_, bus))
5155
5188#define DT_ANY_INST_ON_BUS_STATUS_OKAY(bus) \
5189 DT_HAS_COMPAT_ON_BUS_STATUS_OKAY(DT_DRV_COMPAT, bus)
5190
5235#define DT_ANY_INST_HAS_PROP_STATUS_OKAY(prop) \
5236 UTIL_NOT(IS_EMPTY( \
5237 DT_INST_FOREACH_STATUS_OKAY_VARGS(DT_ANY_INST_HAS_PROP_STATUS_OKAY_, prop)))
5238
5283#define DT_ALL_INST_HAS_PROP_STATUS_OKAY(prop) \
5284 IS_EMPTY(DT_INST_FOREACH_STATUS_OKAY_VARGS(DT_ALL_INST_HAS_PROP_STATUS_OKAY_, prop))
5285
5330#define DT_ANY_COMPAT_HAS_PROP_STATUS_OKAY(compat, prop) \
5331 (DT_COMPAT_FOREACH_STATUS_OKAY_VARGS(compat, DT_COMPAT_NODE_HAS_PROP_AND_OR, prop) 0)
5332
5380#define DT_ANY_INST_HAS_BOOL_STATUS_OKAY(prop) \
5381 UTIL_NOT(IS_EMPTY( \
5382 DT_INST_FOREACH_STATUS_OKAY_VARGS(DT_ANY_INST_HAS_BOOL_STATUS_OKAY_, prop)))
5383
5429#define DT_ALL_INST_HAS_BOOL_STATUS_OKAY(prop) \
5430 IS_EMPTY(DT_INST_FOREACH_STATUS_OKAY_VARGS(DT_ALL_INST_HAS_BOOL_STATUS_OKAY_, prop))
5431
5438#define DT_ANY_INST_REG_HAS_NAME_STATUS_OKAY(name) \
5439 UTIL_NOT(IS_EMPTY( \
5440 DT_INST_FOREACH_STATUS_OKAY_VARGS(DT_ANY_INST_REG_HAS_NAME_STATUS_OKAY_, name)))
5441
5448#define DT_ALL_INST_REG_HAS_NAME_STATUS_OKAY(name) \
5449 IS_EMPTY(DT_INST_FOREACH_STATUS_OKAY_VARGS(DT_ALL_INST_REG_HAS_NAME_STATUS_OKAY_, name))
5450
5516#define DT_INST_FOREACH_STATUS_OKAY(fn) \
5517 COND_CODE_1(DT_HAS_COMPAT_STATUS_OKAY(DT_DRV_COMPAT), \
5518 (UTIL_CAT(DT_FOREACH_OKAY_INST_, \
5519 DT_DRV_COMPAT)(fn)), \
5520 ())
5521
5534#define DT_INST_FOREACH_STATUS_OKAY_VARGS(fn, ...) \
5535 COND_CODE_1(DT_HAS_COMPAT_STATUS_OKAY(DT_DRV_COMPAT), \
5536 (UTIL_CAT(DT_FOREACH_OKAY_INST_VARGS_, \
5537 DT_DRV_COMPAT)(fn, __VA_ARGS__)), \
5538 ())
5539
5549#define DT_INST_FOREACH_NODELABEL(inst, fn) \
5550 DT_FOREACH_NODELABEL(DT_DRV_INST(inst), fn)
5551
5563#define DT_INST_FOREACH_NODELABEL_VARGS(inst, fn, ...) \
5564 DT_FOREACH_NODELABEL_VARGS(DT_DRV_INST(inst), fn, __VA_ARGS__)
5565
5576#define DT_INST_FOREACH_PROP_ELEM(inst, prop, fn) \
5577 DT_FOREACH_PROP_ELEM(DT_DRV_INST(inst), prop, fn)
5578
5591#define DT_INST_FOREACH_PROP_ELEM_SEP(inst, prop, fn, sep) \
5592 DT_FOREACH_PROP_ELEM_SEP(DT_DRV_INST(inst), prop, fn, sep)
5593
5608#define DT_INST_FOREACH_PROP_ELEM_VARGS(inst, prop, fn, ...) \
5609 DT_FOREACH_PROP_ELEM_VARGS(DT_DRV_INST(inst), prop, fn, __VA_ARGS__)
5610
5628#define DT_INST_FOREACH_PROP_ELEM_SEP_VARGS(inst, prop, fn, sep, ...) \
5629 DT_FOREACH_PROP_ELEM_SEP_VARGS(DT_DRV_INST(inst), prop, fn, sep, \
5630 __VA_ARGS__)
5631
5638#define DT_INST_NODE_HAS_PROP(inst, prop) \
5639 DT_NODE_HAS_PROP(DT_DRV_INST(inst), prop)
5640
5647#define DT_INST_NODE_HAS_COMPAT(inst, compat) \
5648 DT_NODE_HAS_COMPAT(DT_DRV_INST(inst), compat)
5649
5660#define DT_INST_PHA_HAS_CELL_AT_IDX(inst, pha, idx, cell) \
5661 DT_PHA_HAS_CELL_AT_IDX(DT_DRV_INST(inst), pha, idx, cell)
5662
5672#define DT_INST_PHA_HAS_CELL(inst, pha, cell) \
5673 DT_INST_PHA_HAS_CELL_AT_IDX(inst, pha, 0, cell)
5674
5682#define DT_INST_IRQ_HAS_IDX(inst, idx) DT_IRQ_HAS_IDX(DT_DRV_INST(inst), idx)
5683
5692#define DT_INST_IRQ_HAS_CELL_AT_IDX(inst, idx, cell) \
5693 DT_IRQ_HAS_CELL_AT_IDX(DT_DRV_INST(inst), idx, cell)
5694
5702#define DT_INST_IRQ_HAS_CELL(inst, cell) \
5703 DT_INST_IRQ_HAS_CELL_AT_IDX(inst, 0, cell)
5704
5711#define DT_INST_IRQ_HAS_NAME(inst, name) \
5712 DT_IRQ_HAS_NAME(DT_DRV_INST(inst), name)
5713
5717
5719
5731#define DT_ANY_INST_HAS_PROP_STATUS_OKAY_(inst, prop) \
5732 IF_ENABLED(DT_INST_NODE_HAS_PROP(inst, prop), (1,))
5733
5746#define DT_ANY_INST_HAS_BOOL_STATUS_OKAY_(inst, prop) \
5747 IF_ENABLED(DT_INST_PROP(inst, prop), (1,))
5748
5761#define DT_ANY_INST_REG_HAS_NAME_STATUS_OKAY_(inst, name) \
5762 IF_ENABLED(DT_INST_REG_HAS_NAME(inst, name), (1,))
5763
5775#define DT_ALL_INST_HAS_PROP_STATUS_OKAY_(inst, prop) \
5776 IF_DISABLED(DT_INST_NODE_HAS_PROP(inst, prop), (1,))
5777
5790#define DT_ALL_INST_HAS_BOOL_STATUS_OKAY_(inst, prop) \
5791 IF_DISABLED(DT_INST_PROP(inst, prop), (1,))
5792
5805#define DT_ALL_INST_REG_HAS_NAME_STATUS_OKAY_(inst, name) \
5806 IF_DISABLED(DT_INST_REG_HAS_NAME(inst, name), (1,))
5807
5808#define DT_PATH_INTERNAL(...) \
5809 UTIL_CAT(DT_ROOT, MACRO_MAP_CAT(DT_S_PREFIX, __VA_ARGS__))
5815#define DT_S_PREFIX(name) _S_##name
5816
5831#define DT_CAT(a1, a2) a1 ## a2
5833#define DT_CAT3(a1, a2, a3) a1 ## a2 ## a3
5835#define DT_CAT4(a1, a2, a3, a4) a1 ## a2 ## a3 ## a4
5837#define DT_CAT5(a1, a2, a3, a4, a5) a1 ## a2 ## a3 ## a4 ## a5
5839#define DT_CAT6(a1, a2, a3, a4, a5, a6) a1 ## a2 ## a3 ## a4 ## a5 ## a6
5841#define DT_CAT7(a1, a2, a3, a4, a5, a6, a7) \
5842 a1 ## a2 ## a3 ## a4 ## a5 ## a6 ## a7
5844#define DT_CAT8(a1, a2, a3, a4, a5, a6, a7, a8) \
5845 a1 ## a2 ## a3 ## a4 ## a5 ## a6 ## a7 ## a8
5846/*
5847 * If you need to define a bigger DT_CATN(), do so here. Don't leave
5848 * any "holes" of undefined macros, please.
5849 */
5850
5852#define DT_DASH(...) MACRO_MAP_CAT(DT_DASH_PREFIX, __VA_ARGS__)
5854#define DT_DASH_PREFIX(name) _##name
5856#define DT_NODE_HAS_STATUS_INTERNAL(node_id, status) \
5857 IS_ENABLED(DT_CAT3(node_id, _STATUS_, status))
5858
5862#define DT_COMPAT_NODE_HAS_PROP_AND_OR(inst, compat, prop) \
5863 DT_NODE_HAS_PROP(DT_INST(inst, compat), prop) ||
5864
5869#if defined(_LINKER) || defined(_ASMLANGUAGE)
5870#define DT_U32_C(_v) (_v)
5871#else
5872#define DT_U32_C(_v) UINT32_C(_v)
5873#endif
5874
5879#if defined(_LINKER) || defined(_ASMLANGUAGE)
5880#define DT_U64_C(_v) (_v)
5881#else
5882#define DT_U64_C(_v) UINT64_C(_v)
5883#endif
5884
5885/* Helpers for DT_NODELABEL_STRING_ARRAY. We define our own stringify
5886 * in order to avoid adding a dependency on toolchain.h..
5887 */
5888#define DT_NODELABEL_STRING_ARRAY_ENTRY_INTERNAL(nodelabel) DT_STRINGIFY_INTERNAL(nodelabel),
5889#define DT_STRINGIFY_INTERNAL(arg) DT_STRINGIFY_INTERNAL_HELPER(arg)
5890#define DT_STRINGIFY_INTERNAL_HELPER(arg) #arg
5891
5893
5894/* have these last so they have access to all previously defined macros */
5897#include <zephyr/devicetree/gpio.h>
5898#include <zephyr/devicetree/spi.h>
5899#include <zephyr/devicetree/dma.h>
5900#include <zephyr/devicetree/pwms.h>
5904#include <zephyr/devicetree/can.h>
5906#include <zephyr/devicetree/mbox.h>
5910#include <zephyr/devicetree/map.h>
5911#include <zephyr/devicetree/wuc.h>
5914
5915#endif /* ZEPHYR_INCLUDE_DEVICETREE_H_ */
Clocks Devicetree macro public API header file.
CAN devicetree macro public API header file.
Display Devicetree macro public API header file.
DMA Devicetree macro public API header file.
GPIO Devicetree macro public API header file.
HW spinlock Devicetree macro public API header file.
MBOX Devicetree macro public API header file.
Flash Devicetree macro public API header file, for partitions.
Devicetree pin control helpers.
Reset Controller Devicetree macro public API header file.
SPI Devicetree macro public API header file.
Wakeup Controller 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.
Map devicetree macro public API header file.
Flash Devicetree macro public API header file, for memory-mapped partitions.
Devicetree node dependency ordinals.
Port / Endpoint Devicetree macro public API header file.
PWMs Devicetree macro public API header file.
Misc utilities.