Zephyr Project API 4.4.99
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
236#define DT_NODELABEL_C_TOKEN_BY_IDX(node_id, idx) \
237 DT_CAT5(DT_N_NODELABEL_, node_id, _IDX_, idx, _C_TOKEN)
238
247#define DT_NODELABEL_C_TOKEN(node_id) \
248 DT_NODELABEL_C_TOKEN_BY_IDX(node_id, 0)
249
288#define DT_ALIAS(alias) DT_CAT(DT_N_ALIAS_, alias)
289
295#define DT_HAS_ALIAS(alias_name) DT_NODE_EXISTS(DT_ALIAS(alias_name))
296
305#define DT_NODE_HASH(node_id) DT_CAT(node_id, _HASH)
306
401#define DT_INST(inst, compat) UTIL_CAT(DT_N_INST, DT_DASH(inst, compat))
402
426#define DT_PARENT(node_id) DT_CAT(node_id, _PARENT)
427
451#define DT_GPARENT(node_id) DT_PARENT(DT_PARENT(node_id))
452
488#define DT_CHILD(node_id, child) UTIL_CAT(node_id, DT_S_PREFIX(child))
489
522#define DT_CHILD_BY_UNIT_ADDR_INT(node_id, addr) \
523 DT_CAT3(node_id, _CHILD_UNIT_ADDR_INT_, addr)
524
566#define DT_COMPAT_GET_ANY_STATUS_OKAY(compat) \
567 COND_CODE_1(DT_HAS_COMPAT_STATUS_OKAY(compat), \
568 (DT_INST(0, compat)), \
569 (DT_INVALID_NODE))
570
598#define DT_NODE_PATH(node_id) DT_CAT(node_id, _PATH)
599
624#define DT_NODE_FULL_NAME(node_id) DT_CAT(node_id, _FULL_NAME)
625
652#define DT_NODE_FULL_NAME_UNQUOTED(node_id) DT_CAT(node_id, _FULL_NAME_UNQUOTED)
653
680#define DT_NODE_FULL_NAME_TOKEN(node_id) DT_CAT(node_id, _FULL_NAME_TOKEN)
681
710#define DT_NODE_FULL_NAME_UPPER_TOKEN(node_id) DT_CAT(node_id, _FULL_NAME_UPPER_TOKEN)
711
738#define DT_NODE_CHILD_IDX(node_id) DT_CAT(node_id, _CHILD_IDX)
739
746#define DT_CHILD_NUM(node_id) DT_CAT(node_id, _CHILD_NUM)
747
755#define DT_CHILD_NUM_STATUS_OKAY(node_id) \
756 DT_CAT(node_id, _CHILD_NUM_STATUS_OKAY)
757
767#define DT_DESCENDANT_NUM_ON_BUS(node_id, bus) \
768 DT_CAT3(node_id, _DESCENDANT_NUM_ON_BUS_, bus)
769
780#define DT_DESCENDANT_NUM_ON_BUS_STATUS_OKAY(node_id, bus) \
781 DT_CAT4(node_id, _DESCENDANT_NUM_ON_BUS_, bus, _STATUS_OKAY)
782
803#define DT_SAME_NODE(node_id1, node_id2) \
804 IS_EQ(DT_DEP_ORD(node_id1), DT_DEP_ORD(node_id2))
805
830#define DT_NODELABEL_STRING_ARRAY(node_id) \
831 { DT_FOREACH_NODELABEL(node_id, DT_NODELABEL_STRING_ARRAY_ENTRY_INTERNAL) }
832
836
842
873#define DT_PROP(node_id, prop) DT_CAT3(node_id, _P_, prop)
874
907#define DT_PROP_LEN(node_id, prop) DT_CAT4(node_id, _P_, prop, _LEN)
908
923#define DT_PROP_LEN_OR(node_id, prop, default_value) \
924 COND_CODE_1(DT_NODE_HAS_PROP(node_id, prop), \
925 (DT_PROP_LEN(node_id, prop)), (default_value))
926
947#define DT_PROP_HAS_IDX(node_id, prop, idx) \
948 IS_ENABLED(DT_CAT6(node_id, _P_, prop, _IDX_, idx, _EXISTS))
949
982#define DT_PROP_HAS_NAME(node_id, prop, name) \
983 IS_ENABLED(DT_CAT6(node_id, _P_, prop, _NAME_, name, _EXISTS))
984
1019#define DT_PROP_BY_IDX(node_id, prop, idx) \
1020 DT_CAT5(node_id, _P_, prop, _IDX_, idx)
1021
1030#define DT_PROP_LAST(node_id, prop) \
1031 DT_PROP_BY_IDX(node_id, prop, UTIL_DEC(DT_PROP_LEN(node_id, prop)))
1032
1046#define DT_PROP_OR(node_id, prop, default_value) \
1047 COND_CODE_1(DT_NODE_HAS_PROP(node_id, prop), \
1048 (DT_PROP(node_id, prop)), (default_value))
1049
1105#define DT_ENUM_IDX_BY_IDX(node_id, prop, idx) \
1106 DT_CAT6(node_id, _P_, prop, _IDX_, idx, _ENUM_IDX)
1107
1114#define DT_ENUM_IDX(node_id, prop) DT_ENUM_IDX_BY_IDX(node_id, prop, 0)
1115
1131#define DT_ENUM_IDX_BY_IDX_OR(node_id, prop, idx, default_idx_value) \
1132 COND_CODE_1(DT_PROP_HAS_IDX(node_id, prop, idx), \
1133 (DT_ENUM_IDX_BY_IDX(node_id, prop, idx)), (default_idx_value))
1134
1143#define DT_ENUM_IDX_OR(node_id, prop, default_idx_value) \
1144 DT_ENUM_IDX_BY_IDX_OR(node_id, prop, 0, default_idx_value)
1145
1155#define DT_ENUM_HAS_VALUE_BY_IDX(node_id, prop, idx, value) \
1156 IS_ENABLED(DT_CAT8(node_id, _P_, prop, _IDX_, idx, _ENUM_VAL_, value, _EXISTS))
1157
1165#define DT_ENUM_HAS_VALUE(node_id, prop, value) \
1166 IS_ENABLED(DT_CAT6(node_id, _P_, prop, _ENUM_VAL_, value, _EXISTS))
1167
1227#define DT_STRING_TOKEN(node_id, prop) \
1228 DT_CAT4(node_id, _P_, prop, _STRING_TOKEN)
1229
1243#define DT_STRING_TOKEN_OR(node_id, prop, default_value) \
1244 COND_CODE_1(DT_NODE_HAS_PROP(node_id, prop), \
1245 (DT_STRING_TOKEN(node_id, prop)), (default_value))
1246
1304#define DT_STRING_UPPER_TOKEN(node_id, prop) \
1305 DT_CAT4(node_id, _P_, prop, _STRING_UPPER_TOKEN)
1306
1321#define DT_STRING_UPPER_TOKEN_OR(node_id, prop, default_value) \
1322 COND_CODE_1(DT_NODE_HAS_PROP(node_id, prop), \
1323 (DT_STRING_UPPER_TOKEN(node_id, prop)), (default_value))
1324
1365#define DT_STRING_UNQUOTED(node_id, prop) \
1366 DT_CAT4(node_id, _P_, prop, _STRING_UNQUOTED)
1367
1382#define DT_STRING_UNQUOTED_OR(node_id, prop, default_value) \
1383 COND_CODE_1(DT_NODE_HAS_PROP(node_id, prop), \
1384 (DT_STRING_UNQUOTED(node_id, prop)), (default_value))
1385
1433#define DT_STRING_TOKEN_BY_IDX(node_id, prop, idx) \
1434 DT_CAT6(node_id, _P_, prop, _IDX_, idx, _STRING_TOKEN)
1435
1444#define DT_STRING_TOKEN_BY_IDX_OR(node_id, prop, idx, default_value) \
1445 COND_CODE_1(DT_PROP_HAS_IDX(node_id, prop, idx), \
1446 (DT_STRING_TOKEN_BY_IDX(node_id, prop, idx)), (default_value))
1447
1495#define DT_STRING_UPPER_TOKEN_BY_IDX(node_id, prop, idx) \
1496 DT_CAT6(node_id, _P_, prop, _IDX_, idx, _STRING_UPPER_TOKEN)
1497
1538#define DT_STRING_UNQUOTED_BY_IDX(node_id, prop, idx) \
1539 DT_CAT6(node_id, _P_, prop, _IDX_, idx, _STRING_UNQUOTED)
1540
1541/*
1542 * phandle properties
1543 *
1544 * These are special-cased to manage the impedance mismatch between
1545 * phandles, which are just uint32_t node properties that only make sense
1546 * within the tree itself, and C values.
1547 */
1548
1594#define DT_PROP_BY_PHANDLE_IDX(node_id, phs, idx, prop) \
1595 DT_PROP(DT_PHANDLE_BY_IDX(node_id, phs, idx), prop)
1596
1616#define DT_PROP_BY_PHANDLE_IDX_OR(node_id, phs, idx, prop, default_value) \
1617 DT_PROP_OR(DT_PHANDLE_BY_IDX(node_id, phs, idx), prop, default_value)
1618
1630#define DT_PROP_BY_PHANDLE(node_id, ph, prop) \
1631 DT_PROP_BY_PHANDLE_IDX(node_id, ph, 0, prop)
1632
1687#define DT_PHA_BY_IDX(node_id, pha, idx, cell) \
1688 DT_CAT7(node_id, _P_, pha, _IDX_, idx, _VAL_, cell)
1689
1713#define DT_PHA_BY_IDX_OR(node_id, pha, idx, cell, default_value) \
1714 DT_PROP_OR(node_id, DT_CAT5(pha, _IDX_, idx, _VAL_, cell), default_value)
1715
1723#define DT_PHA(node_id, pha, cell) DT_PHA_BY_IDX(node_id, pha, 0, cell)
1724
1739#define DT_PHA_OR(node_id, pha, cell, default_value) \
1740 DT_PHA_BY_IDX_OR(node_id, pha, 0, cell, default_value)
1741
1782#define DT_PHA_BY_NAME(node_id, pha, name, cell) \
1783 DT_CAT7(node_id, _P_, pha, _NAME_, name, _VAL_, cell)
1784
1806#define DT_PHA_BY_NAME_OR(node_id, pha, name, cell, default_value) \
1807 DT_PROP_OR(node_id, DT_CAT5(pha, _NAME_, name, _VAL_, cell), default_value)
1808
1856#define DT_PHANDLE_BY_NAME(node_id, pha, name) \
1857 DT_CAT6(node_id, _P_, pha, _NAME_, name, _PH)
1858
1908#define DT_PHANDLE_BY_IDX(node_id, prop, idx) \
1909 DT_CAT6(node_id, _P_, prop, _IDX_, idx, _PH)
1910
1922#define DT_PHANDLE(node_id, prop) DT_PHANDLE_BY_IDX(node_id, prop, 0)
1923
1927
1933
1970#define DT_NUM_RANGES(node_id) DT_CAT(node_id, _RANGES_NUM)
1971
2024#define DT_RANGES_HAS_IDX(node_id, idx) \
2025 IS_ENABLED(DT_CAT4(node_id, _RANGES_IDX_, idx, _EXISTS))
2026
2079#define DT_RANGES_HAS_CHILD_BUS_FLAGS_AT_IDX(node_id, idx) \
2080 IS_ENABLED(DT_CAT4(node_id, _RANGES_IDX_, idx, _VAL_CHILD_BUS_FLAGS_EXISTS))
2081
2119#define DT_RANGES_CHILD_BUS_FLAGS_BY_IDX(node_id, idx) \
2120 DT_CAT4(node_id, _RANGES_IDX_, idx, _VAL_CHILD_BUS_FLAGS)
2121
2168#define DT_RANGES_CHILD_BUS_ADDRESS_BY_IDX(node_id, idx) \
2169 DT_CAT4(node_id, _RANGES_IDX_, idx, _VAL_CHILD_BUS_ADDRESS)
2170
2217#define DT_RANGES_PARENT_BUS_ADDRESS_BY_IDX(node_id, idx) \
2218 DT_CAT4(node_id, _RANGES_IDX_, idx, _VAL_PARENT_BUS_ADDRESS)
2219
2266#define DT_RANGES_LENGTH_BY_IDX(node_id, idx) \
2267 DT_CAT4(node_id, _RANGES_IDX_, idx, _VAL_LENGTH)
2268
2308#define DT_FOREACH_RANGE(node_id, fn) \
2309 DT_CAT(node_id, _FOREACH_RANGE)(fn)
2310
2363#define DT_DMA_RANGES_HAS_IDX(node_id, idx) \
2364 IS_ENABLED(DT_CAT4(node_id, _DMA_RANGES_IDX_, idx, _EXISTS))
2365
2413#define DT_DMA_RANGES_CHILD_BUS_ADDRESS_BY_IDX(node_id, idx) \
2414 DT_CAT4(node_id, _DMA_RANGES_IDX_, idx, _VAL_CHILD_BUS_ADDRESS)
2415
2463#define DT_DMA_RANGES_PARENT_BUS_ADDRESS_BY_IDX(node_id, idx) \
2464 DT_CAT4(node_id, _DMA_RANGES_IDX_, idx, _VAL_PARENT_BUS_ADDRESS)
2465
2513#define DT_DMA_RANGES_LENGTH_BY_IDX(node_id, idx) \
2514 DT_CAT4(node_id, _DMA_RANGES_IDX_, idx, _VAL_LENGTH)
2515
2557#define DT_NUM_DMA_RANGES(node_id) DT_CAT(node_id, _NUM_DMA_RANGES)
2558
2605#define DT_FOREACH_DMA_RANGE(node_id, fn) \
2606 DT_CAT(node_id, _FOREACH_DMA_RANGE)(fn)
2607
2611
2617
2653#define DT_NODE_VENDOR_BY_IDX(node_id, idx) \
2654 DT_CAT3(node_id, _COMPAT_VENDOR_IDX_, idx)
2655
2668#define DT_NODE_VENDOR_HAS_IDX(node_id, idx) \
2669 IS_ENABLED(DT_CAT4(node_id, _COMPAT_VENDOR_IDX_, idx, _EXISTS))
2670
2685#define DT_NODE_VENDOR_BY_IDX_OR(node_id, idx, default_value) \
2686 COND_CODE_1(DT_NODE_VENDOR_HAS_IDX(node_id, idx), \
2687 (DT_NODE_VENDOR_BY_IDX(node_id, idx)), (default_value))
2688
2697#define DT_NODE_VENDOR_OR(node_id, default_value) \
2698 DT_NODE_VENDOR_BY_IDX_OR(node_id, 0, default_value)
2699
2729#define DT_NODE_MODEL_BY_IDX(node_id, idx) \
2730 DT_CAT3(node_id, _COMPAT_MODEL_IDX_, idx)
2731
2744#define DT_NODE_MODEL_HAS_IDX(node_id, idx) \
2745 IS_ENABLED(DT_CAT4(node_id, _COMPAT_MODEL_IDX_, idx, _EXISTS))
2746
2761#define DT_NODE_MODEL_BY_IDX_OR(node_id, idx, default_value) \
2762 COND_CODE_1(DT_NODE_MODEL_HAS_IDX(node_id, idx), \
2763 (DT_NODE_MODEL_BY_IDX(node_id, idx)), (default_value))
2764
2773#define DT_NODE_MODEL_OR(node_id, default_value) \
2774 DT_NODE_MODEL_BY_IDX_OR(node_id, 0, default_value)
2775
2779
2785
2793#define DT_NUM_REGS(node_id) DT_CAT(node_id, _REG_NUM)
2794
2806#define DT_REG_HAS_IDX(node_id, idx) \
2807 IS_ENABLED(DT_CAT4(node_id, _REG_IDX_, idx, _EXISTS))
2808
2820#define DT_REG_HAS_NAME(node_id, name) \
2821 IS_ENABLED(DT_CAT4(node_id, _REG_NAME_, name, _EXISTS))
2822
2834#define DT_REG_ADDR_BY_IDX_RAW(node_id, idx) \
2835 DT_CAT4(node_id, _REG_IDX_, idx, _VAL_ADDRESS)
2836
2848#define DT_REG_ADDR_RAW(node_id) \
2849 DT_REG_ADDR_BY_IDX_RAW(node_id, 0)
2850
2857#define DT_REG_ADDR_BY_IDX(node_id, idx) \
2858 DT_U32_C(DT_REG_ADDR_BY_IDX_RAW(node_id, idx))
2859
2871#define DT_REG_SIZE_BY_IDX(node_id, idx) \
2872 DT_U32_C(DT_CAT4(node_id, _REG_IDX_, idx, _VAL_SIZE))
2873
2881#define DT_REG_ADDR(node_id) DT_REG_ADDR_BY_IDX(node_id, 0)
2882
2893#define DT_REG_ADDR_U64(node_id) DT_U64_C(DT_REG_ADDR_BY_IDX_RAW(node_id, 0))
2894
2902#define DT_REG_SIZE(node_id) DT_REG_SIZE_BY_IDX(node_id, 0)
2903
2910#define DT_REG_ADDR_BY_NAME(node_id, name) \
2911 DT_U32_C(DT_CAT4(node_id, _REG_NAME_, name, _VAL_ADDRESS))
2912
2921#define DT_REG_ADDR_BY_NAME_OR(node_id, name, default_value) \
2922 COND_CODE_1(DT_REG_HAS_NAME(node_id, name), \
2923 (DT_REG_ADDR_BY_NAME(node_id, name)), (default_value))
2924
2937#define DT_REG_ADDR_BY_NAME_U64(node_id, name) \
2938 DT_U64_C(DT_CAT4(node_id, _REG_NAME_, name, _VAL_ADDRESS))
2939
2946#define DT_REG_SIZE_BY_NAME(node_id, name) \
2947 DT_U32_C(DT_CAT4(node_id, _REG_NAME_, name, _VAL_SIZE))
2948
2957#define DT_REG_SIZE_BY_NAME_OR(node_id, name, default_value) \
2958 COND_CODE_1(DT_REG_HAS_NAME(node_id, name), \
2959 (DT_REG_SIZE_BY_NAME(node_id, name)), (default_value))
2960
2961
3009#define DT_FOREACH_REG(node_id, fn) \
3010 DT_CAT(node_id, _FOREACH_REG)(fn)
3011
3060#define DT_FOREACH_REG_SEP(node_id, fn, sep) \
3061 DT_CAT(node_id, _FOREACH_REG_SEP)(fn, sep)
3062
3076
3077#define DT_FOREACH_REG_VARGS(node_id, fn, ...) \
3078 DT_CAT(node_id, _FOREACH_REG_VARGS)(fn, __VA_ARGS__)
3079
3096#define DT_FOREACH_REG_SEP_VARGS(node_id, fn, sep, ...) \
3097 DT_CAT(node_id, _FOREACH_REG_SEP_VARGS)(fn, sep, __VA_ARGS__)
3098
3102
3108
3117#define DT_NUM_IRQS(node_id) DT_CAT(node_id, _IRQ_NUM)
3118
3143#define DT_NUM_NODELABELS(node_id) DT_CAT(node_id, _NODELABEL_NUM)
3144
3151#define DT_IRQ_LEVEL(node_id) DT_CAT(node_id, _IRQ_LEVEL)
3152
3163#define DT_IRQ_HAS_IDX(node_id, idx) \
3164 IS_ENABLED(DT_CAT4(node_id, _IRQ_IDX_, idx, _EXISTS))
3165
3176#define DT_IRQ_HAS_CELL_AT_IDX(node_id, idx, cell) \
3177 IS_ENABLED(DT_CAT6(node_id, _IRQ_IDX_, idx, _VAL_, cell, _EXISTS))
3178
3186#define DT_IRQ_HAS_CELL(node_id, cell) DT_IRQ_HAS_CELL_AT_IDX(node_id, 0, cell)
3187
3197#define DT_IRQ_HAS_NAME(node_id, name) \
3198 IS_ENABLED(DT_CAT4(node_id, _IRQ_NAME_, name, _VAL_irq_EXISTS))
3199
3235#define DT_IRQ_BY_IDX(node_id, idx, cell) \
3236 DT_CAT5(node_id, _IRQ_IDX_, idx, _VAL_, cell)
3237
3253#define DT_IRQ_BY_NAME(node_id, name, cell) \
3254 DT_CAT5(node_id, _IRQ_NAME_, name, _VAL_, cell)
3255
3263#define DT_IRQ(node_id, cell) DT_IRQ_BY_IDX(node_id, 0, cell)
3264
3307#define DT_IRQ_INTC_BY_IDX(node_id, idx) \
3308 DT_CAT4(node_id, _IRQ_IDX_, idx, _CONTROLLER)
3309
3354#define DT_IRQ_INTC_BY_NAME(node_id, name) \
3355 DT_CAT4(node_id, _IRQ_NAME_, name, _CONTROLLER)
3356
3396#define DT_IRQ_INTC(node_id) \
3397 DT_IRQ_INTC_BY_IDX(node_id, 0)
3398
3402
3403/* DT helper macro to encode a node's IRQN to level 1 according to the multi-level scheme */
3404#define DT_IRQN_L1_INTERNAL(node_id, idx) DT_IRQ_BY_IDX(node_id, idx, irq)
3405/* DT helper macro to encode a node's IRQN to level 2 according to the multi-level scheme */
3406#define DT_IRQN_L2_INTERNAL(node_id, idx) \
3407 (IRQ_TO_L2(DT_IRQN_L1_INTERNAL(node_id, idx)) | \
3408 DT_IRQ(DT_IRQ_INTC_BY_IDX(node_id, idx), irq))
3409/* DT helper macro to encode a node's IRQN to level 3 according to the multi-level scheme */
3410#define DT_IRQN_L3_INTERNAL(node_id, idx) \
3411 (IRQ_TO_L3(DT_IRQN_L1_INTERNAL(node_id, idx)) | \
3412 IRQ_TO_L2(DT_IRQ(DT_IRQ_INTC_BY_IDX(node_id, idx), irq)) | \
3413 DT_IRQ(DT_IRQ_INTC(DT_IRQ_INTC_BY_IDX(node_id, idx)), irq))
3414/* DT helper macro for the macros above */
3415#define DT_IRQN_LVL_INTERNAL(node_id, idx, level) DT_CAT3(DT_IRQN_L, level, _INTERNAL)(node_id, idx)
3416
3421#define DT_MULTI_LEVEL_IRQN_INTERNAL(node_id, idx) \
3422 DT_IRQN_LVL_INTERNAL(node_id, idx, DT_IRQ_LEVEL(node_id))
3423
3424
3425/* DT helper macro to encode a node's IRQN to level 1 according to the multi-level scheme */
3426#define DT_IRQN_NAME_L1_INTERNAL(node_id, name) DT_IRQ_BY_NAME(node_id, name, irq)
3427/* DT helper macro to encode a node's IRQN to level 2 according to the multi-level scheme */
3428#define DT_IRQN_NAME_L2_INTERNAL(node_id, name) \
3429 (IRQ_TO_L2(DT_IRQN_NAME_L1_INTERNAL(node_id, name)) | \
3430 DT_IRQ(DT_IRQ_INTC_BY_NAME(node_id, name), irq))
3431/* DT helper macro to encode a node's IRQN to level 3 according to the multi-level scheme */
3432#define DT_IRQN_NAME_L3_INTERNAL(node_id, name) \
3433 (IRQ_TO_L3(DT_IRQN_NAME_L1_INTERNAL(node_id, name)) | \
3434 IRQ_TO_L2(DT_IRQ(DT_IRQ_INTC_BY_NAME(node_id, name), irq)) | \
3435 DT_IRQ(DT_IRQ_INTC(DT_IRQ_INTC_BY_NAME(node_id, name)), irq))
3436/* DT helper macro for the macros above */
3437#define DT_IRQN_NAME_LVL_INTERNAL(node_id, name, level) \
3438 DT_CAT3(DT_IRQN_NAME_L, level, _INTERNAL)(node_id, name)
3439
3444#define DT_MULTI_LEVEL_IRQN_NAME_INTERNAL(node_id, name) \
3445 DT_IRQN_NAME_LVL_INTERNAL(node_id, name, DT_IRQ_LEVEL(node_id))
3446
3450
3459#define DT_IRQN_BY_IDX(node_id, idx) \
3460 COND_CODE_1(IS_ENABLED(CONFIG_MULTI_LEVEL_INTERRUPTS), \
3461 (DT_MULTI_LEVEL_IRQN_INTERNAL(node_id, idx)), \
3462 (DT_IRQ_BY_IDX(node_id, idx, irq)))
3463
3472#define DT_IRQN_BY_NAME(node_id, name) \
3473 COND_CODE_1(IS_ENABLED(CONFIG_MULTI_LEVEL_INTERRUPTS), \
3474 (DT_MULTI_LEVEL_IRQN_NAME_INTERNAL(node_id, name)), \
3475 (DT_IRQ_BY_NAME(node_id, name, irq)))
3476
3487#define DT_IRQN(node_id) DT_IRQN_BY_IDX(node_id, 0)
3488
3492
3498
3507#define DT_CHOSEN(prop) DT_CAT(DT_CHOSEN_, prop)
3508
3515#define DT_HAS_CHOSEN(prop) IS_ENABLED(DT_CAT3(DT_CHOSEN_, prop, _EXISTS))
3516
3520
3556
3566#define DT_FOREACH_NODE(fn) DT_FOREACH_HELPER(fn)
3567
3580#define DT_FOREACH_NODE_VARGS(fn, ...) DT_FOREACH_VARGS_HELPER(fn, __VA_ARGS__)
3581
3593#define DT_FOREACH_STATUS_OKAY_NODE(fn) DT_FOREACH_OKAY_HELPER(fn)
3594
3609#define DT_FOREACH_STATUS_OKAY_NODE_VARGS(fn, ...) DT_FOREACH_OKAY_VARGS_HELPER(fn, __VA_ARGS__)
3610
3657#define DT_FOREACH_ANCESTOR(node_id, fn) \
3658 DT_CAT(node_id, _FOREACH_ANCESTOR)(fn)
3659
3703#define DT_FOREACH_CHILD(node_id, fn) \
3704 DT_CAT(node_id, _FOREACH_CHILD)(fn)
3705
3746#define DT_FOREACH_CHILD_SEP(node_id, fn, sep) \
3747 DT_CAT(node_id, _FOREACH_CHILD_SEP)(fn, sep)
3748
3764#define DT_FOREACH_CHILD_VARGS(node_id, fn, ...) \
3765 DT_CAT(node_id, _FOREACH_CHILD_VARGS)(fn, __VA_ARGS__)
3766
3782#define DT_FOREACH_CHILD_SEP_VARGS(node_id, fn, sep, ...) \
3783 DT_CAT(node_id, _FOREACH_CHILD_SEP_VARGS)(fn, sep, __VA_ARGS__)
3784
3800#define DT_FOREACH_CHILD_STATUS_OKAY(node_id, fn) \
3801 DT_CAT(node_id, _FOREACH_CHILD_STATUS_OKAY)(fn)
3802
3819#define DT_FOREACH_CHILD_STATUS_OKAY_SEP(node_id, fn, sep) \
3820 DT_CAT(node_id, _FOREACH_CHILD_STATUS_OKAY_SEP)(fn, sep)
3821
3841#define DT_FOREACH_CHILD_STATUS_OKAY_VARGS(node_id, fn, ...) \
3842 DT_CAT(node_id, _FOREACH_CHILD_STATUS_OKAY_VARGS)(fn, __VA_ARGS__)
3843
3862#define DT_FOREACH_CHILD_STATUS_OKAY_SEP_VARGS(node_id, fn, sep, ...) \
3863 DT_CAT(node_id, _FOREACH_CHILD_STATUS_OKAY_SEP_VARGS)(fn, sep, __VA_ARGS__)
3864
3915#define DT_FOREACH_PROP_ELEM(node_id, prop, fn) \
3916 DT_CAT4(node_id, _P_, prop, _FOREACH_PROP_ELEM)(fn)
3917
3960#define DT_FOREACH_PROP_ELEM_SEP(node_id, prop, fn, sep) \
3961 DT_CAT4(node_id, _P_, prop, _FOREACH_PROP_ELEM_SEP)(fn, sep)
3962
3983#define DT_FOREACH_PROP_ELEM_VARGS(node_id, prop, fn, ...) \
3984 DT_CAT4(node_id, _P_, prop, _FOREACH_PROP_ELEM_VARGS)(fn, __VA_ARGS__)
3985
4002#define DT_FOREACH_PROP_ELEM_SEP_VARGS(node_id, prop, fn, sep, ...) \
4003 DT_CAT4(node_id, _P_, prop, _FOREACH_PROP_ELEM_SEP_VARGS)( \
4004 fn, sep, __VA_ARGS__)
4005
4059#define DT_FOREACH_STATUS_OKAY(compat, fn) \
4060 COND_CODE_1(DT_HAS_COMPAT_STATUS_OKAY(compat), \
4061 (UTIL_CAT(DT_FOREACH_OKAY_, compat)(fn)), \
4062 ())
4063
4108#define DT_FOREACH_STATUS_OKAY_VARGS(compat, fn, ...) \
4109 COND_CODE_1(DT_HAS_COMPAT_STATUS_OKAY(compat), \
4110 (DT_CAT(DT_FOREACH_OKAY_VARGS_, \
4111 compat)(fn, __VA_ARGS__)), \
4112 ())
4113
4131#define DT_FOREACH_CLASS_STATUS_OKAY(_class, fn) \
4132 COND_CODE_1(DT_HAS_CLASS_STATUS_OKAY(_class), \
4133 (UTIL_CAT(DT_FOREACH_OKAY_CLASS_, _class)(fn)), \
4134 ())
4135
4148#define DT_FOREACH_CLASS_STATUS_OKAY_VARGS(_class, fn, ...) \
4149 COND_CODE_1(DT_HAS_CLASS_STATUS_OKAY(_class), \
4150 (DT_CAT(DT_FOREACH_OKAY_VARGS_CLASS_, \
4151 _class)(fn, __VA_ARGS__)), \
4152 ())
4153
4166#define DT_COMPAT_FOREACH_STATUS_OKAY_VARGS(compat, fn, ...) \
4167 COND_CODE_1(DT_HAS_COMPAT_STATUS_OKAY(compat), \
4168 (UTIL_CAT(DT_FOREACH_OKAY_INST_VARGS_, \
4169 compat)(fn, compat, __VA_ARGS__)), \
4170 ())
4171
4172
4211#define DT_FOREACH_NODELABEL(node_id, fn) DT_CAT(node_id, _FOREACH_NODELABEL)(fn)
4212
4250#define DT_FOREACH_NODELABEL_VARGS(node_id, fn, ...) \
4251 DT_CAT(node_id, _FOREACH_NODELABEL_VARGS)(fn, __VA_ARGS__)
4252
4256
4262
4277#define DT_NODE_EXISTS(node_id) IS_ENABLED(DT_CAT(node_id, _EXISTS))
4278
4300#define DT_NODE_HAS_STATUS(node_id, status) \
4301 DT_NODE_HAS_STATUS_INTERNAL(node_id, status)
4302
4323#define DT_NODE_HAS_STATUS_OKAY(node_id) DT_NODE_HAS_STATUS(node_id, okay)
4324
4344#define DT_HAS_COMPAT_STATUS_OKAY(compat) \
4345 IS_ENABLED(DT_CAT(DT_COMPAT_HAS_OKAY_, compat))
4346
4353#define DT_NUM_INST_STATUS_OKAY(compat) \
4354 UTIL_AND(DT_HAS_COMPAT_STATUS_OKAY(compat), \
4355 UTIL_CAT(DT_N_INST, DT_DASH(compat, NUM_OKAY)))
4356
4368#define DT_HAS_CLASS_STATUS_OKAY(_class) \
4369 IS_ENABLED(DT_CAT(DT_CLASS_HAS_OKAY_, _class))
4370
4376#define DT_NUM_CLASS_STATUS_OKAY(_class) \
4377 UTIL_AND(DT_HAS_CLASS_STATUS_OKAY(_class), \
4378 UTIL_CAT(DT_N_CLASS, DT_DASH(_class, NUM_OKAY)))
4379
4407#define DT_NODE_HAS_COMPAT(node_id, compat) \
4408 IS_ENABLED(DT_CAT3(node_id, _COMPAT_MATCHES_, compat))
4409
4426#define DT_NODE_HAS_CLASS(node_id, _class) \
4427 IS_ENABLED(DT_CAT3(node_id, _CLASS_, _class))
4428
4446#define DT_BINDING_COMPAT_TOKEN(node_id) DT_CAT(node_id, _BINDING_COMPAT_TOKEN)
4447
4462#define DT_BINDING_COMPAT_UPPER_TOKEN(node_id) DT_CAT(node_id, _BINDING_COMPAT_UPPER_TOKEN)
4463
4480#define DT_BINDING_COMPAT_UNQUOTED(node_id) DT_CAT(node_id, _BINDING_COMPAT_UNQUOTED)
4481
4496#define DT_NODE_HAS_COMPAT_STATUS(node_id, compat, status) \
4497 UTIL_AND(DT_NODE_HAS_COMPAT(node_id, compat), DT_NODE_HAS_STATUS(node_id, status))
4498
4512#define DT_NODE_HAS_PROP(node_id, prop) \
4513 IS_ENABLED(DT_CAT4(node_id, _P_, prop, _EXISTS))
4514
4515
4532#define DT_PHA_HAS_CELL_AT_IDX(node_id, pha, idx, cell) \
4533 IS_ENABLED(DT_CAT8(node_id, _P_, pha, \
4534 _IDX_, idx, _VAL_, cell, _EXISTS))
4535
4545#define DT_PHA_HAS_CELL(node_id, pha, cell) \
4546 DT_PHA_HAS_CELL_AT_IDX(node_id, pha, 0, cell)
4547
4568#define DT_FOREACH_PHA_CELL_BY_IDX(node_id, pha, idx, fn) \
4569 DT_CAT6(node_id, _P_, pha, _IDX_, idx, _FOREACH_CELL)(fn)
4570
4583#define DT_FOREACH_PHA_CELL_BY_IDX_SEP(node_id, pha, idx, fn, sep) \
4584 DT_CAT6(node_id, _P_, pha, _IDX_, idx, _FOREACH_CELL_SEP)(fn, sep)
4585
4594#define DT_PHA_NUM_CELLS_BY_IDX(node_id, pha, idx) \
4595 DT_CAT6(node_id, _P_, pha, _IDX_, idx, _NUM_CELLS)
4596
4608#define DT_PHA_ELEM_NAME_BY_IDX(node_id, pha, idx) \
4609 DT_CAT6(node_id, _P_, pha, _IDX_, idx, _NAME)
4610
4632#define DT_FOREACH_PHA_CELL_BY_NAME(node_id, pha, name, fn) \
4633 DT_CAT6(node_id, _P_, pha, _NAME_, name, _FOREACH_CELL)(fn)
4634
4647#define DT_FOREACH_PHA_CELL_BY_NAME_SEP(node_id, pha, name, fn, sep) \
4648 DT_CAT6(node_id, _P_, pha, _NAME_, name, _FOREACH_CELL_SEP)(fn, sep)
4649
4658#define DT_PHA_NUM_CELLS_BY_NAME(node_id, pha, name) \
4659 DT_CAT6(node_id, _P_, pha, _NAME_, name, _NUM_CELLS)
4660
4672#define DT_PHA_ELEM_IDX_BY_NAME(node_id, pha, name) \
4673 DT_CAT6(node_id, _P_, pha, _NAME_, name, _IDX)
4674
4675
4679
4685
4717#define DT_BUS(node_id) DT_CAT(node_id, _BUS)
4718
4747#define DT_ON_BUS(node_id, bus) IS_ENABLED(DT_CAT3(node_id, _BUS_, bus))
4748
4752
4758
4765#define DT_DRV_INST(inst) DT_INST(inst, DT_DRV_COMPAT)
4766
4774#define DT_INST_PARENT(inst) DT_PARENT(DT_DRV_INST(inst))
4775
4783#define DT_INST_GPARENT(inst) DT_GPARENT(DT_DRV_INST(inst))
4784
4794#define DT_INST_CHILD(inst, child) \
4795 DT_CHILD(DT_DRV_INST(inst), child)
4796
4809#define DT_INST_CHILD_BY_UNIT_ADDR_INT(inst, addr) \
4810 DT_CHILD_BY_UNIT_ADDR_INT(DT_DRV_INST(inst), addr)
4811
4821#define DT_INST_CHILD_NUM(inst) DT_CHILD_NUM(DT_DRV_INST(inst))
4822
4833#define DT_INST_CHILD_NUM_STATUS_OKAY(inst) \
4834 DT_CHILD_NUM_STATUS_OKAY(DT_DRV_INST(inst))
4835
4848#define DT_INST_DESCENDANT_NUM_ON_BUS(inst, bus) \
4849 DT_DESCENDANT_NUM_ON_BUS(DT_DRV_INST(inst), bus)
4850
4864#define DT_INST_DESCENDANT_NUM_ON_BUS_STATUS_OKAY(inst, bus) \
4865 DT_DESCENDANT_NUM_ON_BUS_STATUS_OKAY(DT_DRV_INST(inst), bus)
4866
4875#define DT_INST_NODELABEL_STRING_ARRAY(inst) DT_NODELABEL_STRING_ARRAY(DT_DRV_INST(inst))
4876
4885#define DT_INST_NUM_NODELABELS(inst) DT_NUM_NODELABELS(DT_DRV_INST(inst))
4886
4901#define DT_INST_FOREACH_CHILD(inst, fn) \
4902 DT_FOREACH_CHILD(DT_DRV_INST(inst), fn)
4903
4917#define DT_INST_FOREACH_CHILD_SEP(inst, fn, sep) \
4918 DT_FOREACH_CHILD_SEP(DT_DRV_INST(inst), fn, sep)
4919
4935#define DT_INST_FOREACH_CHILD_VARGS(inst, fn, ...) \
4936 DT_FOREACH_CHILD_VARGS(DT_DRV_INST(inst), fn, __VA_ARGS__)
4937
4952#define DT_INST_FOREACH_CHILD_SEP_VARGS(inst, fn, sep, ...) \
4953 DT_FOREACH_CHILD_SEP_VARGS(DT_DRV_INST(inst), fn, sep, __VA_ARGS__)
4954
4966#define DT_INST_FOREACH_CHILD_STATUS_OKAY(inst, fn) \
4967 DT_FOREACH_CHILD_STATUS_OKAY(DT_DRV_INST(inst), fn)
4968
4983#define DT_INST_FOREACH_CHILD_STATUS_OKAY_SEP(inst, fn, sep) \
4984 DT_FOREACH_CHILD_STATUS_OKAY_SEP(DT_DRV_INST(inst), fn, sep)
4985
4999#define DT_INST_FOREACH_CHILD_STATUS_OKAY_VARGS(inst, fn, ...) \
5000 DT_FOREACH_CHILD_STATUS_OKAY_VARGS(DT_DRV_INST(inst), fn, __VA_ARGS__)
5001
5017#define DT_INST_FOREACH_CHILD_STATUS_OKAY_SEP_VARGS(inst, fn, sep, ...) \
5018 DT_FOREACH_CHILD_STATUS_OKAY_SEP_VARGS(DT_DRV_INST(inst), fn, sep, __VA_ARGS__)
5019
5034#define DT_INST_FOREACH_REG(inst, fn) \
5035 DT_FOREACH_REG(DT_DRV_INST(inst), fn)
5036
5053#define DT_INST_FOREACH_REG_SEP(inst, fn, sep) \
5054 DT_FOREACH_REG_SEP(DT_DRV_INST(inst), fn, sep)
5055
5072#define DT_INST_FOREACH_REG_VARGS(inst, fn, ...) \
5073 DT_FOREACH_REG_VARGS(DT_DRV_INST(inst), fn, __VA_ARGS__)
5074
5093#define DT_INST_FOREACH_REG_SEP_VARGS(inst, fn, sep, ...) \
5094 DT_FOREACH_REG_SEP_VARGS(DT_DRV_INST(inst), fn, sep, __VA_ARGS__)
5095
5103#define DT_INST_ENUM_IDX_BY_IDX(inst, prop, idx) \
5104 DT_ENUM_IDX_BY_IDX(DT_DRV_INST(inst), prop, idx)
5105
5112#define DT_INST_ENUM_IDX(inst, prop) \
5113 DT_ENUM_IDX(DT_DRV_INST(inst), prop)
5114
5124#define DT_INST_ENUM_IDX_BY_IDX_OR(inst, prop, idx, default_idx_value) \
5125 DT_ENUM_IDX_BY_IDX_OR(DT_DRV_INST(inst), prop, idx, default_idx_value)
5126
5135#define DT_INST_ENUM_IDX_OR(inst, prop, default_idx_value) \
5136 DT_ENUM_IDX_OR(DT_DRV_INST(inst), prop, default_idx_value)
5137
5146#define DT_INST_ENUM_HAS_VALUE_BY_IDX(inst, prop, idx, value) \
5147 DT_ENUM_HAS_VALUE_BY_IDX(DT_DRV_INST(inst), prop, idx, value)
5148
5157#define DT_INST_ENUM_HAS_VALUE(inst, prop, value) \
5158 DT_ENUM_HAS_VALUE(DT_DRV_INST(inst), prop, value)
5159
5166#define DT_INST_PROP(inst, prop) DT_PROP(DT_DRV_INST(inst), prop)
5167
5174#define DT_INST_PROP_LEN(inst, prop) DT_PROP_LEN(DT_DRV_INST(inst), prop)
5175
5185#define DT_INST_PROP_HAS_IDX(inst, prop, idx) \
5186 DT_PROP_HAS_IDX(DT_DRV_INST(inst), prop, idx)
5187
5196#define DT_INST_PROP_HAS_NAME(inst, prop, name) \
5197 DT_PROP_HAS_NAME(DT_DRV_INST(inst), prop, name)
5198
5206#define DT_INST_PROP_BY_IDX(inst, prop, idx) \
5207 DT_PROP_BY_IDX(DT_DRV_INST(inst), prop, idx)
5208
5216#define DT_INST_PROP_OR(inst, prop, default_value) \
5217 DT_PROP_OR(DT_DRV_INST(inst), prop, default_value)
5218
5226#define DT_INST_PROP_LEN_OR(inst, prop, default_value) \
5227 DT_PROP_LEN_OR(DT_DRV_INST(inst), prop, default_value)
5228
5238#define DT_INST_STRING_TOKEN(inst, prop) \
5239 DT_STRING_TOKEN(DT_DRV_INST(inst), prop)
5240
5248#define DT_INST_STRING_UPPER_TOKEN(inst, prop) \
5249 DT_STRING_UPPER_TOKEN(DT_DRV_INST(inst), prop)
5250
5259#define DT_INST_STRING_UNQUOTED(inst, prop) \
5260 DT_STRING_UNQUOTED(DT_DRV_INST(inst), prop)
5261
5269#define DT_INST_STRING_TOKEN_BY_IDX(inst, prop, idx) \
5270 DT_STRING_TOKEN_BY_IDX(DT_DRV_INST(inst), prop, idx)
5271
5280#define DT_INST_STRING_TOKEN_BY_IDX_OR(inst, prop, idx, default_value) \
5281 DT_STRING_TOKEN_BY_IDX_OR(DT_DRV_INST(inst), prop, idx, default_value)
5282
5290#define DT_INST_STRING_UPPER_TOKEN_BY_IDX(inst, prop, idx) \
5291 DT_STRING_UPPER_TOKEN_BY_IDX(DT_DRV_INST(inst), prop, idx)
5292
5300#define DT_INST_STRING_UNQUOTED_BY_IDX(inst, prop, idx) \
5301 DT_STRING_UNQUOTED_BY_IDX(DT_DRV_INST(inst), prop, idx)
5302
5311#define DT_INST_PROP_BY_PHANDLE(inst, ph, prop) \
5312 DT_INST_PROP_BY_PHANDLE_IDX(inst, ph, 0, prop)
5313
5325#define DT_INST_PROP_BY_PHANDLE_IDX(inst, phs, idx, prop) \
5326 DT_PROP_BY_PHANDLE_IDX(DT_DRV_INST(inst), phs, idx, prop)
5327
5336#define DT_INST_PHA_BY_IDX(inst, pha, idx, cell) \
5337 DT_PHA_BY_IDX(DT_DRV_INST(inst), pha, idx, cell)
5338
5348#define DT_INST_PHA_BY_IDX_OR(inst, pha, idx, cell, default_value) \
5349 DT_PHA_BY_IDX_OR(DT_DRV_INST(inst), pha, idx, cell, default_value)
5350
5359#define DT_INST_PHA(inst, pha, cell) DT_INST_PHA_BY_IDX(inst, pha, 0, cell)
5360
5369#define DT_INST_PHA_OR(inst, pha, cell, default_value) \
5370 DT_INST_PHA_BY_IDX_OR(inst, pha, 0, cell, default_value)
5371
5381#define DT_INST_PHA_BY_NAME(inst, pha, name, cell) \
5382 DT_PHA_BY_NAME(DT_DRV_INST(inst), pha, name, cell)
5383
5393#define DT_INST_PHA_BY_NAME_OR(inst, pha, name, cell, default_value) \
5394 DT_PHA_BY_NAME_OR(DT_DRV_INST(inst), pha, name, cell, default_value)
5395
5404#define DT_INST_PHANDLE_BY_NAME(inst, pha, name) \
5405 DT_PHANDLE_BY_NAME(DT_DRV_INST(inst), pha, name) \
5406
5407
5416#define DT_INST_PHANDLE_BY_IDX(inst, prop, idx) \
5417 DT_PHANDLE_BY_IDX(DT_DRV_INST(inst), prop, idx)
5418
5427#define DT_INST_PHANDLE(inst, prop) DT_INST_PHANDLE_BY_IDX(inst, prop, 0)
5428
5436#define DT_INST_REG_HAS_IDX(inst, idx) DT_REG_HAS_IDX(DT_DRV_INST(inst), idx)
5437
5445#define DT_INST_REG_HAS_NAME(inst, name) DT_REG_HAS_NAME(DT_DRV_INST(inst), name)
5446
5453#define DT_INST_REG_ADDR_BY_IDX_RAW(inst, idx) DT_REG_ADDR_BY_IDX_RAW(DT_DRV_INST(inst), idx)
5454
5461#define DT_INST_REG_ADDR_BY_IDX(inst, idx) DT_REG_ADDR_BY_IDX(DT_DRV_INST(inst), idx)
5462
5469#define DT_INST_REG_SIZE_BY_IDX(inst, idx) \
5470 DT_REG_SIZE_BY_IDX(DT_DRV_INST(inst), idx)
5471
5478#define DT_INST_REG_ADDR_BY_NAME(inst, name) \
5479 DT_REG_ADDR_BY_NAME(DT_DRV_INST(inst), name)
5480
5489#define DT_INST_REG_ADDR_BY_NAME_OR(inst, name, default_value) \
5490 DT_REG_ADDR_BY_NAME_OR(DT_DRV_INST(inst), name, default_value)
5491
5504#define DT_INST_REG_ADDR_BY_NAME_U64(inst, name) \
5505 DT_REG_ADDR_BY_NAME_U64(DT_DRV_INST(inst), name)
5506
5513#define DT_INST_REG_SIZE_BY_NAME(inst, name) \
5514 DT_REG_SIZE_BY_NAME(DT_DRV_INST(inst), name)
5515
5524#define DT_INST_REG_SIZE_BY_NAME_OR(inst, name, default_value) \
5525 DT_REG_SIZE_BY_NAME_OR(DT_DRV_INST(inst), name, default_value)
5526
5532#define DT_INST_REG_ADDR_RAW(inst) DT_INST_REG_ADDR_BY_IDX_RAW(inst, 0)
5533
5539#define DT_INST_REG_ADDR(inst) DT_INST_REG_ADDR_BY_IDX(inst, 0)
5540
5552#define DT_INST_REG_ADDR_U64(inst) DT_REG_ADDR_U64(DT_DRV_INST(inst))
5553
5559#define DT_INST_REG_SIZE(inst) DT_INST_REG_SIZE_BY_IDX(inst, 0)
5560
5567#define DT_INST_NUM_IRQS(inst) DT_NUM_IRQS(DT_DRV_INST(inst))
5568
5575#define DT_INST_IRQ_LEVEL(inst) DT_IRQ_LEVEL(DT_DRV_INST(inst))
5576
5584#define DT_INST_IRQ_BY_IDX(inst, idx, cell) \
5585 DT_IRQ_BY_IDX(DT_DRV_INST(inst), idx, cell)
5586
5593#define DT_INST_IRQ_INTC_BY_IDX(inst, idx) \
5594 DT_IRQ_INTC_BY_IDX(DT_DRV_INST(inst), idx)
5595
5602#define DT_INST_IRQ_INTC_BY_NAME(inst, name) \
5603 DT_IRQ_INTC_BY_NAME(DT_DRV_INST(inst), name)
5604
5612#define DT_INST_IRQ_INTC(inst) \
5613 DT_INST_IRQ_INTC_BY_IDX(inst, 0)
5614
5622#define DT_INST_IRQ_BY_NAME(inst, name, cell) \
5623 DT_IRQ_BY_NAME(DT_DRV_INST(inst), name, cell)
5624
5631#define DT_INST_IRQ(inst, cell) DT_INST_IRQ_BY_IDX(inst, 0, cell)
5632
5638#define DT_INST_IRQN(inst) DT_IRQN(DT_DRV_INST(inst))
5639
5646#define DT_INST_IRQN_BY_IDX(inst, idx) DT_IRQN_BY_IDX(DT_DRV_INST(inst), idx)
5647
5654#define DT_INST_IRQN_BY_NAME(inst, name) \
5655 DT_IRQN_BY_NAME(DT_DRV_INST(inst), name)
5656
5662#define DT_INST_BUS(inst) DT_BUS(DT_DRV_INST(inst))
5663
5671#define DT_INST_ON_BUS(inst, bus) DT_ON_BUS(DT_DRV_INST(inst), bus)
5672
5682#define DT_INST_STRING_TOKEN_OR(inst, name, default_value) \
5683 DT_STRING_TOKEN_OR(DT_DRV_INST(inst), name, default_value)
5684
5693#define DT_INST_STRING_UPPER_TOKEN_OR(inst, name, default_value) \
5694 DT_STRING_UPPER_TOKEN_OR(DT_DRV_INST(inst), name, default_value)
5695
5704#define DT_INST_STRING_UNQUOTED_OR(inst, name, default_value) \
5705 DT_STRING_UNQUOTED_OR(DT_DRV_INST(inst), name, default_value)
5706
5737#define DT_HAS_COMPAT_ON_BUS_STATUS_OKAY(compat, bus) \
5738 IS_ENABLED(DT_CAT4(DT_COMPAT_, compat, _BUS_, bus))
5739
5772#define DT_ANY_INST_ON_BUS_STATUS_OKAY(bus) \
5773 DT_HAS_COMPAT_ON_BUS_STATUS_OKAY(DT_DRV_COMPAT, bus)
5774
5823#define DT_ANY_INST_HAS_PROP_STATUS_OKAY(prop) \
5824 DT_ANY_COMPAT_HAS_PROP_STATUS_OKAY(DT_DRV_COMPAT, prop)
5825
5874#define DT_ALL_INST_HAS_PROP_STATUS_OKAY(prop) \
5875 DT_ALL_COMPAT_HAS_PROP_STATUS_OKAY(DT_DRV_COMPAT, prop)
5876
5925#define DT_ANY_COMPAT_HAS_PROP_STATUS_OKAY(compat, prop) \
5926 UTIL_NOT(IS_EMPTY(DT_COMPAT_FOREACH_STATUS_OKAY_VARGS( \
5927 compat, DT_ANY_COMPAT_HAS_PROP_STATUS_OKAY_INTERNAL, prop)))
5928
5940#define DT_ALL_COMPAT_HAS_PROP_STATUS_OKAY(compat, prop) \
5941 IS_EMPTY(DT_COMPAT_FOREACH_STATUS_OKAY_VARGS( \
5942 compat, DT_ALL_COMPAT_HAS_PROP_STATUS_OKAY_INTERNAL, prop))
5943
5955#define DT_ANY_COMPAT_HAS_BOOL_STATUS_OKAY(compat, prop) \
5956 UTIL_NOT(IS_EMPTY(DT_COMPAT_FOREACH_STATUS_OKAY_VARGS( \
5957 compat, DT_ANY_COMPAT_HAS_BOOL_STATUS_OKAY_INTERNAL, prop)))
5958
5971#define DT_ALL_COMPAT_HAS_BOOL_STATUS_OKAY(compat, prop) \
5972 IS_EMPTY(DT_COMPAT_FOREACH_STATUS_OKAY_VARGS( \
5973 compat, DT_ALL_COMPAT_HAS_BOOL_STATUS_OKAY_INTERNAL, prop))
5974
6022#define DT_ANY_INST_HAS_BOOL_STATUS_OKAY(prop) \
6023 DT_ANY_COMPAT_HAS_BOOL_STATUS_OKAY(DT_DRV_COMPAT, prop)
6024
6070#define DT_ALL_INST_HAS_BOOL_STATUS_OKAY(prop) \
6071 DT_ALL_COMPAT_HAS_BOOL_STATUS_OKAY(DT_DRV_COMPAT, prop)
6072
6080#define DT_ANY_COMPAT_REG_HAS_NAME_STATUS_OKAY(compat, name) \
6081 UTIL_NOT(IS_EMPTY(DT_COMPAT_FOREACH_STATUS_OKAY_VARGS( \
6082 compat, DT_ANY_COMPAT_REG_HAS_NAME_STATUS_OKAY_INTERNAL, name)))
6083
6091#define DT_ALL_COMPAT_REG_HAS_NAME_STATUS_OKAY(compat, name) \
6092 IS_EMPTY(DT_COMPAT_FOREACH_STATUS_OKAY_VARGS( \
6093 compat, DT_ALL_COMPAT_REG_HAS_NAME_STATUS_OKAY_INTERNAL, name))
6094
6101#define DT_ANY_INST_REG_HAS_NAME_STATUS_OKAY(name) \
6102 DT_ANY_COMPAT_REG_HAS_NAME_STATUS_OKAY(DT_DRV_COMPAT, name)
6103
6110#define DT_ALL_INST_REG_HAS_NAME_STATUS_OKAY(name) \
6111 DT_ALL_COMPAT_REG_HAS_NAME_STATUS_OKAY(DT_DRV_COMPAT, name)
6112
6178#define DT_INST_FOREACH_STATUS_OKAY(fn) \
6179 COND_CODE_1(DT_HAS_COMPAT_STATUS_OKAY(DT_DRV_COMPAT), \
6180 (UTIL_CAT(DT_FOREACH_OKAY_INST_, \
6181 DT_DRV_COMPAT)(fn)), \
6182 ())
6183
6196#define DT_INST_FOREACH_STATUS_OKAY_VARGS(fn, ...) \
6197 COND_CODE_1(DT_HAS_COMPAT_STATUS_OKAY(DT_DRV_COMPAT), \
6198 (UTIL_CAT(DT_FOREACH_OKAY_INST_VARGS_, \
6199 DT_DRV_COMPAT)(fn, __VA_ARGS__)), \
6200 ())
6201
6211#define DT_INST_FOREACH_NODELABEL(inst, fn) \
6212 DT_FOREACH_NODELABEL(DT_DRV_INST(inst), fn)
6213
6225#define DT_INST_FOREACH_NODELABEL_VARGS(inst, fn, ...) \
6226 DT_FOREACH_NODELABEL_VARGS(DT_DRV_INST(inst), fn, __VA_ARGS__)
6227
6238#define DT_INST_FOREACH_PROP_ELEM(inst, prop, fn) \
6239 DT_FOREACH_PROP_ELEM(DT_DRV_INST(inst), prop, fn)
6240
6253#define DT_INST_FOREACH_PROP_ELEM_SEP(inst, prop, fn, sep) \
6254 DT_FOREACH_PROP_ELEM_SEP(DT_DRV_INST(inst), prop, fn, sep)
6255
6270#define DT_INST_FOREACH_PROP_ELEM_VARGS(inst, prop, fn, ...) \
6271 DT_FOREACH_PROP_ELEM_VARGS(DT_DRV_INST(inst), prop, fn, __VA_ARGS__)
6272
6290#define DT_INST_FOREACH_PROP_ELEM_SEP_VARGS(inst, prop, fn, sep, ...) \
6291 DT_FOREACH_PROP_ELEM_SEP_VARGS(DT_DRV_INST(inst), prop, fn, sep, \
6292 __VA_ARGS__)
6293
6300#define DT_INST_NODE_HAS_PROP(inst, prop) \
6301 DT_NODE_HAS_PROP(DT_DRV_INST(inst), prop)
6302
6309#define DT_INST_NODE_HAS_COMPAT(inst, compat) \
6310 DT_NODE_HAS_COMPAT(DT_DRV_INST(inst), compat)
6311
6322#define DT_INST_PHA_HAS_CELL_AT_IDX(inst, pha, idx, cell) \
6323 DT_PHA_HAS_CELL_AT_IDX(DT_DRV_INST(inst), pha, idx, cell)
6324
6334#define DT_INST_PHA_HAS_CELL(inst, pha, cell) \
6335 DT_INST_PHA_HAS_CELL_AT_IDX(inst, pha, 0, cell)
6336
6344#define DT_INST_IRQ_HAS_IDX(inst, idx) DT_IRQ_HAS_IDX(DT_DRV_INST(inst), idx)
6345
6354#define DT_INST_IRQ_HAS_CELL_AT_IDX(inst, idx, cell) \
6355 DT_IRQ_HAS_CELL_AT_IDX(DT_DRV_INST(inst), idx, cell)
6356
6364#define DT_INST_IRQ_HAS_CELL(inst, cell) \
6365 DT_INST_IRQ_HAS_CELL_AT_IDX(inst, 0, cell)
6366
6373#define DT_INST_IRQ_HAS_NAME(inst, name) \
6374 DT_IRQ_HAS_NAME(DT_DRV_INST(inst), name)
6375
6379
6381
6383#define DT_ANY_COMPAT_HAS_PROP_STATUS_OKAY_INTERNAL(inst, compat, prop) \
6384 IF_ENABLED(DT_NODE_HAS_PROP(DT_INST(inst, compat), prop), (1,))
6385
6387#define DT_ANY_COMPAT_HAS_BOOL_STATUS_OKAY_INTERNAL(inst, compat, prop) \
6388 IF_ENABLED(DT_PROP(DT_INST(inst, compat), prop), (1,))
6389
6391#define DT_ANY_COMPAT_REG_HAS_NAME_STATUS_OKAY_INTERNAL(inst, compat, name) \
6392 IF_ENABLED(DT_REG_HAS_NAME(DT_INST(inst, compat), name), (1,))
6393
6395#define DT_ALL_COMPAT_HAS_PROP_STATUS_OKAY_INTERNAL(inst, compat, prop) \
6396 IF_DISABLED(DT_NODE_HAS_PROP(DT_INST(inst, compat), prop), (1,))
6397
6399#define DT_ALL_COMPAT_HAS_BOOL_STATUS_OKAY_INTERNAL(inst, compat, prop) \
6400 IF_DISABLED(DT_PROP(DT_INST(inst, compat), prop), (1,))
6401
6403#define DT_ALL_COMPAT_REG_HAS_NAME_STATUS_OKAY_INTERNAL(inst, compat, name) \
6404 IF_DISABLED(DT_REG_HAS_NAME(DT_INST(inst, compat), name), (1,))
6405
6406#define DT_PATH_INTERNAL(...) \
6407 UTIL_CAT(DT_ROOT, MACRO_MAP_CAT(DT_S_PREFIX, __VA_ARGS__))
6413#define DT_S_PREFIX(name) _S_##name
6414
6429#define DT_CAT(a1, a2) a1 ## a2
6431#define DT_CAT3(a1, a2, a3) a1 ## a2 ## a3
6433#define DT_CAT4(a1, a2, a3, a4) a1 ## a2 ## a3 ## a4
6435#define DT_CAT5(a1, a2, a3, a4, a5) a1 ## a2 ## a3 ## a4 ## a5
6437#define DT_CAT6(a1, a2, a3, a4, a5, a6) a1 ## a2 ## a3 ## a4 ## a5 ## a6
6439#define DT_CAT7(a1, a2, a3, a4, a5, a6, a7) \
6440 a1 ## a2 ## a3 ## a4 ## a5 ## a6 ## a7
6442#define DT_CAT8(a1, a2, a3, a4, a5, a6, a7, a8) \
6443 a1 ## a2 ## a3 ## a4 ## a5 ## a6 ## a7 ## a8
6444/*
6445 * If you need to define a bigger DT_CATN(), do so here. Don't leave
6446 * any "holes" of undefined macros, please.
6447 */
6448
6450#define DT_DASH(...) MACRO_MAP_CAT(DT_DASH_PREFIX, __VA_ARGS__)
6452#define DT_DASH_PREFIX(name) _##name
6454#define DT_NODE_HAS_STATUS_INTERNAL(node_id, status) \
6455 IS_ENABLED(DT_CAT3(node_id, _STATUS_, status))
6456
6460#define DT_COMPAT_NODE_HAS_PROP_AND_OR(inst, compat, prop) \
6461 DT_NODE_HAS_PROP(DT_INST(inst, compat), prop) ||
6462
6467#if defined(_LINKER) || defined(_ASMLANGUAGE)
6468#define DT_U32_C(_v) (_v)
6469#else
6470#define DT_U32_C(_v) UINT32_C(_v)
6471#endif
6472
6477#if defined(_LINKER) || defined(_ASMLANGUAGE)
6478#define DT_U64_C(_v) (_v)
6479#else
6480#define DT_U64_C(_v) UINT64_C(_v)
6481#endif
6482
6483/* Helpers for DT_NODELABEL_STRING_ARRAY. We define our own stringify
6484 * in order to avoid adding a dependency on toolchain.h..
6485 */
6486#define DT_NODELABEL_STRING_ARRAY_ENTRY_INTERNAL(nodelabel) DT_STRINGIFY_INTERNAL(nodelabel),
6487#define DT_STRINGIFY_INTERNAL(arg) DT_STRINGIFY_INTERNAL_HELPER(arg)
6488#define DT_STRINGIFY_INTERNAL_HELPER(arg) #arg
6489
6491
6492/* have these last so they have access to all previously defined macros */
6495#include <zephyr/devicetree/gpio.h>
6496#include <zephyr/devicetree/spi.h>
6497#include <zephyr/devicetree/dma.h>
6498#include <zephyr/devicetree/pwms.h>
6502#include <zephyr/devicetree/can.h>
6504#include <zephyr/devicetree/mbox.h>
6508#include <zephyr/devicetree/map.h>
6509#include <zephyr/devicetree/wuc.h>
6512#include <zephyr/devicetree/sram.h>
6513#include <zephyr/devicetree/cpu.h>
6514
6515#endif /* ZEPHYR_INCLUDE_DEVICETREE_H_ */
Clocks Devicetree macro public API header file.
CAN devicetree macro public API header file.
CPU 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.
Map 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.
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.
Chosen SRAM Devicetree macro public API header file.
Misc utilities.