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
4126#define DT_COMPAT_FOREACH_STATUS_OKAY_VARGS(compat, fn, ...) \
4127 COND_CODE_1(DT_HAS_COMPAT_STATUS_OKAY(compat), \
4128 (UTIL_CAT(DT_FOREACH_OKAY_INST_VARGS_, \
4129 compat)(fn, compat, __VA_ARGS__)), \
4130 ())
4131
4132
4171#define DT_FOREACH_NODELABEL(node_id, fn) DT_CAT(node_id, _FOREACH_NODELABEL)(fn)
4172
4210#define DT_FOREACH_NODELABEL_VARGS(node_id, fn, ...) \
4211 DT_CAT(node_id, _FOREACH_NODELABEL_VARGS)(fn, __VA_ARGS__)
4212
4216
4222
4237#define DT_NODE_EXISTS(node_id) IS_ENABLED(DT_CAT(node_id, _EXISTS))
4238
4260#define DT_NODE_HAS_STATUS(node_id, status) \
4261 DT_NODE_HAS_STATUS_INTERNAL(node_id, status)
4262
4283#define DT_NODE_HAS_STATUS_OKAY(node_id) DT_NODE_HAS_STATUS(node_id, okay)
4284
4304#define DT_HAS_COMPAT_STATUS_OKAY(compat) \
4305 IS_ENABLED(DT_CAT(DT_COMPAT_HAS_OKAY_, compat))
4306
4313#define DT_NUM_INST_STATUS_OKAY(compat) \
4314 UTIL_AND(DT_HAS_COMPAT_STATUS_OKAY(compat), \
4315 UTIL_CAT(DT_N_INST, DT_DASH(compat, NUM_OKAY)))
4316
4344#define DT_NODE_HAS_COMPAT(node_id, compat) \
4345 IS_ENABLED(DT_CAT3(node_id, _COMPAT_MATCHES_, compat))
4346
4364#define DT_BINDING_COMPAT_TOKEN(node_id) DT_CAT(node_id, _BINDING_COMPAT_TOKEN)
4365
4380#define DT_BINDING_COMPAT_UPPER_TOKEN(node_id) DT_CAT(node_id, _BINDING_COMPAT_UPPER_TOKEN)
4381
4398#define DT_BINDING_COMPAT_UNQUOTED(node_id) DT_CAT(node_id, _BINDING_COMPAT_UNQUOTED)
4399
4414#define DT_NODE_HAS_COMPAT_STATUS(node_id, compat, status) \
4415 UTIL_AND(DT_NODE_HAS_COMPAT(node_id, compat), DT_NODE_HAS_STATUS(node_id, status))
4416
4430#define DT_NODE_HAS_PROP(node_id, prop) \
4431 IS_ENABLED(DT_CAT4(node_id, _P_, prop, _EXISTS))
4432
4433
4450#define DT_PHA_HAS_CELL_AT_IDX(node_id, pha, idx, cell) \
4451 IS_ENABLED(DT_CAT8(node_id, _P_, pha, \
4452 _IDX_, idx, _VAL_, cell, _EXISTS))
4453
4463#define DT_PHA_HAS_CELL(node_id, pha, cell) \
4464 DT_PHA_HAS_CELL_AT_IDX(node_id, pha, 0, cell)
4465
4486#define DT_FOREACH_PHA_CELL_BY_IDX(node_id, pha, idx, fn) \
4487 DT_CAT6(node_id, _P_, pha, _IDX_, idx, _FOREACH_CELL)(fn)
4488
4501#define DT_FOREACH_PHA_CELL_BY_IDX_SEP(node_id, pha, idx, fn, sep) \
4502 DT_CAT6(node_id, _P_, pha, _IDX_, idx, _FOREACH_CELL_SEP)(fn, sep)
4503
4512#define DT_PHA_NUM_CELLS_BY_IDX(node_id, pha, idx) \
4513 DT_CAT6(node_id, _P_, pha, _IDX_, idx, _NUM_CELLS)
4514
4526#define DT_PHA_ELEM_NAME_BY_IDX(node_id, pha, idx) \
4527 DT_CAT6(node_id, _P_, pha, _IDX_, idx, _NAME)
4528
4550#define DT_FOREACH_PHA_CELL_BY_NAME(node_id, pha, name, fn) \
4551 DT_CAT6(node_id, _P_, pha, _NAME_, name, _FOREACH_CELL)(fn)
4552
4565#define DT_FOREACH_PHA_CELL_BY_NAME_SEP(node_id, pha, name, fn, sep) \
4566 DT_CAT6(node_id, _P_, pha, _NAME_, name, _FOREACH_CELL_SEP)(fn, sep)
4567
4576#define DT_PHA_NUM_CELLS_BY_NAME(node_id, pha, name) \
4577 DT_CAT6(node_id, _P_, pha, _NAME_, name, _NUM_CELLS)
4578
4590#define DT_PHA_ELEM_IDX_BY_NAME(node_id, pha, name) \
4591 DT_CAT6(node_id, _P_, pha, _NAME_, name, _IDX)
4592
4593
4597
4603
4635#define DT_BUS(node_id) DT_CAT(node_id, _BUS)
4636
4665#define DT_ON_BUS(node_id, bus) IS_ENABLED(DT_CAT3(node_id, _BUS_, bus))
4666
4670
4676
4683#define DT_DRV_INST(inst) DT_INST(inst, DT_DRV_COMPAT)
4684
4692#define DT_INST_PARENT(inst) DT_PARENT(DT_DRV_INST(inst))
4693
4701#define DT_INST_GPARENT(inst) DT_GPARENT(DT_DRV_INST(inst))
4702
4712#define DT_INST_CHILD(inst, child) \
4713 DT_CHILD(DT_DRV_INST(inst), child)
4714
4727#define DT_INST_CHILD_BY_UNIT_ADDR_INT(inst, addr) \
4728 DT_CHILD_BY_UNIT_ADDR_INT(DT_DRV_INST(inst), addr)
4729
4739#define DT_INST_CHILD_NUM(inst) DT_CHILD_NUM(DT_DRV_INST(inst))
4740
4751#define DT_INST_CHILD_NUM_STATUS_OKAY(inst) \
4752 DT_CHILD_NUM_STATUS_OKAY(DT_DRV_INST(inst))
4753
4766#define DT_INST_DESCENDANT_NUM_ON_BUS(inst, bus) \
4767 DT_DESCENDANT_NUM_ON_BUS(DT_DRV_INST(inst), bus)
4768
4782#define DT_INST_DESCENDANT_NUM_ON_BUS_STATUS_OKAY(inst, bus) \
4783 DT_DESCENDANT_NUM_ON_BUS_STATUS_OKAY(DT_DRV_INST(inst), bus)
4784
4793#define DT_INST_NODELABEL_STRING_ARRAY(inst) DT_NODELABEL_STRING_ARRAY(DT_DRV_INST(inst))
4794
4803#define DT_INST_NUM_NODELABELS(inst) DT_NUM_NODELABELS(DT_DRV_INST(inst))
4804
4819#define DT_INST_FOREACH_CHILD(inst, fn) \
4820 DT_FOREACH_CHILD(DT_DRV_INST(inst), fn)
4821
4835#define DT_INST_FOREACH_CHILD_SEP(inst, fn, sep) \
4836 DT_FOREACH_CHILD_SEP(DT_DRV_INST(inst), fn, sep)
4837
4853#define DT_INST_FOREACH_CHILD_VARGS(inst, fn, ...) \
4854 DT_FOREACH_CHILD_VARGS(DT_DRV_INST(inst), fn, __VA_ARGS__)
4855
4870#define DT_INST_FOREACH_CHILD_SEP_VARGS(inst, fn, sep, ...) \
4871 DT_FOREACH_CHILD_SEP_VARGS(DT_DRV_INST(inst), fn, sep, __VA_ARGS__)
4872
4884#define DT_INST_FOREACH_CHILD_STATUS_OKAY(inst, fn) \
4885 DT_FOREACH_CHILD_STATUS_OKAY(DT_DRV_INST(inst), fn)
4886
4901#define DT_INST_FOREACH_CHILD_STATUS_OKAY_SEP(inst, fn, sep) \
4902 DT_FOREACH_CHILD_STATUS_OKAY_SEP(DT_DRV_INST(inst), fn, sep)
4903
4917#define DT_INST_FOREACH_CHILD_STATUS_OKAY_VARGS(inst, fn, ...) \
4918 DT_FOREACH_CHILD_STATUS_OKAY_VARGS(DT_DRV_INST(inst), fn, __VA_ARGS__)
4919
4935#define DT_INST_FOREACH_CHILD_STATUS_OKAY_SEP_VARGS(inst, fn, sep, ...) \
4936 DT_FOREACH_CHILD_STATUS_OKAY_SEP_VARGS(DT_DRV_INST(inst), fn, sep, __VA_ARGS__)
4937
4952#define DT_INST_FOREACH_REG(inst, fn) \
4953 DT_FOREACH_REG(DT_DRV_INST(inst), fn)
4954
4971#define DT_INST_FOREACH_REG_SEP(inst, fn, sep) \
4972 DT_FOREACH_REG_SEP(DT_DRV_INST(inst), fn, sep)
4973
4990#define DT_INST_FOREACH_REG_VARGS(inst, fn, ...) \
4991 DT_FOREACH_REG_VARGS(DT_DRV_INST(inst), fn, __VA_ARGS__)
4992
5011#define DT_INST_FOREACH_REG_SEP_VARGS(inst, fn, sep, ...) \
5012 DT_FOREACH_REG_SEP_VARGS(DT_DRV_INST(inst), fn, sep, __VA_ARGS__)
5013
5021#define DT_INST_ENUM_IDX_BY_IDX(inst, prop, idx) \
5022 DT_ENUM_IDX_BY_IDX(DT_DRV_INST(inst), prop, idx)
5023
5030#define DT_INST_ENUM_IDX(inst, prop) \
5031 DT_ENUM_IDX(DT_DRV_INST(inst), prop)
5032
5042#define DT_INST_ENUM_IDX_BY_IDX_OR(inst, prop, idx, default_idx_value) \
5043 DT_ENUM_IDX_BY_IDX_OR(DT_DRV_INST(inst), prop, idx, default_idx_value)
5044
5053#define DT_INST_ENUM_IDX_OR(inst, prop, default_idx_value) \
5054 DT_ENUM_IDX_OR(DT_DRV_INST(inst), prop, default_idx_value)
5055
5064#define DT_INST_ENUM_HAS_VALUE_BY_IDX(inst, prop, idx, value) \
5065 DT_ENUM_HAS_VALUE_BY_IDX(DT_DRV_INST(inst), prop, idx, value)
5066
5075#define DT_INST_ENUM_HAS_VALUE(inst, prop, value) \
5076 DT_ENUM_HAS_VALUE(DT_DRV_INST(inst), prop, value)
5077
5084#define DT_INST_PROP(inst, prop) DT_PROP(DT_DRV_INST(inst), prop)
5085
5092#define DT_INST_PROP_LEN(inst, prop) DT_PROP_LEN(DT_DRV_INST(inst), prop)
5093
5103#define DT_INST_PROP_HAS_IDX(inst, prop, idx) \
5104 DT_PROP_HAS_IDX(DT_DRV_INST(inst), prop, idx)
5105
5114#define DT_INST_PROP_HAS_NAME(inst, prop, name) \
5115 DT_PROP_HAS_NAME(DT_DRV_INST(inst), prop, name)
5116
5124#define DT_INST_PROP_BY_IDX(inst, prop, idx) \
5125 DT_PROP_BY_IDX(DT_DRV_INST(inst), prop, idx)
5126
5134#define DT_INST_PROP_OR(inst, prop, default_value) \
5135 DT_PROP_OR(DT_DRV_INST(inst), prop, default_value)
5136
5144#define DT_INST_PROP_LEN_OR(inst, prop, default_value) \
5145 DT_PROP_LEN_OR(DT_DRV_INST(inst), prop, default_value)
5146
5156#define DT_INST_STRING_TOKEN(inst, prop) \
5157 DT_STRING_TOKEN(DT_DRV_INST(inst), prop)
5158
5166#define DT_INST_STRING_UPPER_TOKEN(inst, prop) \
5167 DT_STRING_UPPER_TOKEN(DT_DRV_INST(inst), prop)
5168
5177#define DT_INST_STRING_UNQUOTED(inst, prop) \
5178 DT_STRING_UNQUOTED(DT_DRV_INST(inst), prop)
5179
5187#define DT_INST_STRING_TOKEN_BY_IDX(inst, prop, idx) \
5188 DT_STRING_TOKEN_BY_IDX(DT_DRV_INST(inst), prop, idx)
5189
5198#define DT_INST_STRING_TOKEN_BY_IDX_OR(inst, prop, idx, default_value) \
5199 DT_STRING_TOKEN_BY_IDX_OR(DT_DRV_INST(inst), prop, idx, default_value)
5200
5208#define DT_INST_STRING_UPPER_TOKEN_BY_IDX(inst, prop, idx) \
5209 DT_STRING_UPPER_TOKEN_BY_IDX(DT_DRV_INST(inst), prop, idx)
5210
5218#define DT_INST_STRING_UNQUOTED_BY_IDX(inst, prop, idx) \
5219 DT_STRING_UNQUOTED_BY_IDX(DT_DRV_INST(inst), prop, idx)
5220
5229#define DT_INST_PROP_BY_PHANDLE(inst, ph, prop) \
5230 DT_INST_PROP_BY_PHANDLE_IDX(inst, ph, 0, prop)
5231
5243#define DT_INST_PROP_BY_PHANDLE_IDX(inst, phs, idx, prop) \
5244 DT_PROP_BY_PHANDLE_IDX(DT_DRV_INST(inst), phs, idx, prop)
5245
5254#define DT_INST_PHA_BY_IDX(inst, pha, idx, cell) \
5255 DT_PHA_BY_IDX(DT_DRV_INST(inst), pha, idx, cell)
5256
5266#define DT_INST_PHA_BY_IDX_OR(inst, pha, idx, cell, default_value) \
5267 DT_PHA_BY_IDX_OR(DT_DRV_INST(inst), pha, idx, cell, default_value)
5268
5277#define DT_INST_PHA(inst, pha, cell) DT_INST_PHA_BY_IDX(inst, pha, 0, cell)
5278
5287#define DT_INST_PHA_OR(inst, pha, cell, default_value) \
5288 DT_INST_PHA_BY_IDX_OR(inst, pha, 0, cell, default_value)
5289
5299#define DT_INST_PHA_BY_NAME(inst, pha, name, cell) \
5300 DT_PHA_BY_NAME(DT_DRV_INST(inst), pha, name, cell)
5301
5311#define DT_INST_PHA_BY_NAME_OR(inst, pha, name, cell, default_value) \
5312 DT_PHA_BY_NAME_OR(DT_DRV_INST(inst), pha, name, cell, default_value)
5313
5322#define DT_INST_PHANDLE_BY_NAME(inst, pha, name) \
5323 DT_PHANDLE_BY_NAME(DT_DRV_INST(inst), pha, name) \
5324
5325
5334#define DT_INST_PHANDLE_BY_IDX(inst, prop, idx) \
5335 DT_PHANDLE_BY_IDX(DT_DRV_INST(inst), prop, idx)
5336
5345#define DT_INST_PHANDLE(inst, prop) DT_INST_PHANDLE_BY_IDX(inst, prop, 0)
5346
5354#define DT_INST_REG_HAS_IDX(inst, idx) DT_REG_HAS_IDX(DT_DRV_INST(inst), idx)
5355
5363#define DT_INST_REG_HAS_NAME(inst, name) DT_REG_HAS_NAME(DT_DRV_INST(inst), name)
5364
5371#define DT_INST_REG_ADDR_BY_IDX_RAW(inst, idx) DT_REG_ADDR_BY_IDX_RAW(DT_DRV_INST(inst), idx)
5372
5379#define DT_INST_REG_ADDR_BY_IDX(inst, idx) DT_REG_ADDR_BY_IDX(DT_DRV_INST(inst), idx)
5380
5387#define DT_INST_REG_SIZE_BY_IDX(inst, idx) \
5388 DT_REG_SIZE_BY_IDX(DT_DRV_INST(inst), idx)
5389
5396#define DT_INST_REG_ADDR_BY_NAME(inst, name) \
5397 DT_REG_ADDR_BY_NAME(DT_DRV_INST(inst), name)
5398
5407#define DT_INST_REG_ADDR_BY_NAME_OR(inst, name, default_value) \
5408 DT_REG_ADDR_BY_NAME_OR(DT_DRV_INST(inst), name, default_value)
5409
5422#define DT_INST_REG_ADDR_BY_NAME_U64(inst, name) \
5423 DT_REG_ADDR_BY_NAME_U64(DT_DRV_INST(inst), name)
5424
5431#define DT_INST_REG_SIZE_BY_NAME(inst, name) \
5432 DT_REG_SIZE_BY_NAME(DT_DRV_INST(inst), name)
5433
5442#define DT_INST_REG_SIZE_BY_NAME_OR(inst, name, default_value) \
5443 DT_REG_SIZE_BY_NAME_OR(DT_DRV_INST(inst), name, default_value)
5444
5450#define DT_INST_REG_ADDR_RAW(inst) DT_INST_REG_ADDR_BY_IDX_RAW(inst, 0)
5451
5457#define DT_INST_REG_ADDR(inst) DT_INST_REG_ADDR_BY_IDX(inst, 0)
5458
5470#define DT_INST_REG_ADDR_U64(inst) DT_REG_ADDR_U64(DT_DRV_INST(inst))
5471
5477#define DT_INST_REG_SIZE(inst) DT_INST_REG_SIZE_BY_IDX(inst, 0)
5478
5485#define DT_INST_NUM_IRQS(inst) DT_NUM_IRQS(DT_DRV_INST(inst))
5486
5493#define DT_INST_IRQ_LEVEL(inst) DT_IRQ_LEVEL(DT_DRV_INST(inst))
5494
5502#define DT_INST_IRQ_BY_IDX(inst, idx, cell) \
5503 DT_IRQ_BY_IDX(DT_DRV_INST(inst), idx, cell)
5504
5511#define DT_INST_IRQ_INTC_BY_IDX(inst, idx) \
5512 DT_IRQ_INTC_BY_IDX(DT_DRV_INST(inst), idx)
5513
5520#define DT_INST_IRQ_INTC_BY_NAME(inst, name) \
5521 DT_IRQ_INTC_BY_NAME(DT_DRV_INST(inst), name)
5522
5530#define DT_INST_IRQ_INTC(inst) \
5531 DT_INST_IRQ_INTC_BY_IDX(inst, 0)
5532
5540#define DT_INST_IRQ_BY_NAME(inst, name, cell) \
5541 DT_IRQ_BY_NAME(DT_DRV_INST(inst), name, cell)
5542
5549#define DT_INST_IRQ(inst, cell) DT_INST_IRQ_BY_IDX(inst, 0, cell)
5550
5556#define DT_INST_IRQN(inst) DT_IRQN(DT_DRV_INST(inst))
5557
5564#define DT_INST_IRQN_BY_IDX(inst, idx) DT_IRQN_BY_IDX(DT_DRV_INST(inst), idx)
5565
5572#define DT_INST_IRQN_BY_NAME(inst, name) \
5573 DT_IRQN_BY_NAME(DT_DRV_INST(inst), name)
5574
5580#define DT_INST_BUS(inst) DT_BUS(DT_DRV_INST(inst))
5581
5589#define DT_INST_ON_BUS(inst, bus) DT_ON_BUS(DT_DRV_INST(inst), bus)
5590
5600#define DT_INST_STRING_TOKEN_OR(inst, name, default_value) \
5601 DT_STRING_TOKEN_OR(DT_DRV_INST(inst), name, default_value)
5602
5611#define DT_INST_STRING_UPPER_TOKEN_OR(inst, name, default_value) \
5612 DT_STRING_UPPER_TOKEN_OR(DT_DRV_INST(inst), name, default_value)
5613
5622#define DT_INST_STRING_UNQUOTED_OR(inst, name, default_value) \
5623 DT_STRING_UNQUOTED_OR(DT_DRV_INST(inst), name, default_value)
5624
5655#define DT_HAS_COMPAT_ON_BUS_STATUS_OKAY(compat, bus) \
5656 IS_ENABLED(DT_CAT4(DT_COMPAT_, compat, _BUS_, bus))
5657
5690#define DT_ANY_INST_ON_BUS_STATUS_OKAY(bus) \
5691 DT_HAS_COMPAT_ON_BUS_STATUS_OKAY(DT_DRV_COMPAT, bus)
5692
5741#define DT_ANY_INST_HAS_PROP_STATUS_OKAY(prop) \
5742 DT_ANY_COMPAT_HAS_PROP_STATUS_OKAY(DT_DRV_COMPAT, prop)
5743
5792#define DT_ALL_INST_HAS_PROP_STATUS_OKAY(prop) \
5793 DT_ALL_COMPAT_HAS_PROP_STATUS_OKAY(DT_DRV_COMPAT, prop)
5794
5843#define DT_ANY_COMPAT_HAS_PROP_STATUS_OKAY(compat, prop) \
5844 UTIL_NOT(IS_EMPTY(DT_COMPAT_FOREACH_STATUS_OKAY_VARGS( \
5845 compat, DT_ANY_COMPAT_HAS_PROP_STATUS_OKAY_INTERNAL, prop)))
5846
5858#define DT_ALL_COMPAT_HAS_PROP_STATUS_OKAY(compat, prop) \
5859 IS_EMPTY(DT_COMPAT_FOREACH_STATUS_OKAY_VARGS( \
5860 compat, DT_ALL_COMPAT_HAS_PROP_STATUS_OKAY_INTERNAL, prop))
5861
5873#define DT_ANY_COMPAT_HAS_BOOL_STATUS_OKAY(compat, prop) \
5874 UTIL_NOT(IS_EMPTY(DT_COMPAT_FOREACH_STATUS_OKAY_VARGS( \
5875 compat, DT_ANY_COMPAT_HAS_BOOL_STATUS_OKAY_INTERNAL, prop)))
5876
5889#define DT_ALL_COMPAT_HAS_BOOL_STATUS_OKAY(compat, prop) \
5890 IS_EMPTY(DT_COMPAT_FOREACH_STATUS_OKAY_VARGS( \
5891 compat, DT_ALL_COMPAT_HAS_BOOL_STATUS_OKAY_INTERNAL, prop))
5892
5940#define DT_ANY_INST_HAS_BOOL_STATUS_OKAY(prop) \
5941 DT_ANY_COMPAT_HAS_BOOL_STATUS_OKAY(DT_DRV_COMPAT, prop)
5942
5988#define DT_ALL_INST_HAS_BOOL_STATUS_OKAY(prop) \
5989 DT_ALL_COMPAT_HAS_BOOL_STATUS_OKAY(DT_DRV_COMPAT, prop)
5990
5998#define DT_ANY_COMPAT_REG_HAS_NAME_STATUS_OKAY(compat, name) \
5999 UTIL_NOT(IS_EMPTY(DT_COMPAT_FOREACH_STATUS_OKAY_VARGS( \
6000 compat, DT_ANY_COMPAT_REG_HAS_NAME_STATUS_OKAY_INTERNAL, name)))
6001
6009#define DT_ALL_COMPAT_REG_HAS_NAME_STATUS_OKAY(compat, name) \
6010 IS_EMPTY(DT_COMPAT_FOREACH_STATUS_OKAY_VARGS( \
6011 compat, DT_ALL_COMPAT_REG_HAS_NAME_STATUS_OKAY_INTERNAL, name))
6012
6019#define DT_ANY_INST_REG_HAS_NAME_STATUS_OKAY(name) \
6020 DT_ANY_COMPAT_REG_HAS_NAME_STATUS_OKAY(DT_DRV_COMPAT, name)
6021
6028#define DT_ALL_INST_REG_HAS_NAME_STATUS_OKAY(name) \
6029 DT_ALL_COMPAT_REG_HAS_NAME_STATUS_OKAY(DT_DRV_COMPAT, name)
6030
6096#define DT_INST_FOREACH_STATUS_OKAY(fn) \
6097 COND_CODE_1(DT_HAS_COMPAT_STATUS_OKAY(DT_DRV_COMPAT), \
6098 (UTIL_CAT(DT_FOREACH_OKAY_INST_, \
6099 DT_DRV_COMPAT)(fn)), \
6100 ())
6101
6114#define DT_INST_FOREACH_STATUS_OKAY_VARGS(fn, ...) \
6115 COND_CODE_1(DT_HAS_COMPAT_STATUS_OKAY(DT_DRV_COMPAT), \
6116 (UTIL_CAT(DT_FOREACH_OKAY_INST_VARGS_, \
6117 DT_DRV_COMPAT)(fn, __VA_ARGS__)), \
6118 ())
6119
6129#define DT_INST_FOREACH_NODELABEL(inst, fn) \
6130 DT_FOREACH_NODELABEL(DT_DRV_INST(inst), fn)
6131
6143#define DT_INST_FOREACH_NODELABEL_VARGS(inst, fn, ...) \
6144 DT_FOREACH_NODELABEL_VARGS(DT_DRV_INST(inst), fn, __VA_ARGS__)
6145
6156#define DT_INST_FOREACH_PROP_ELEM(inst, prop, fn) \
6157 DT_FOREACH_PROP_ELEM(DT_DRV_INST(inst), prop, fn)
6158
6171#define DT_INST_FOREACH_PROP_ELEM_SEP(inst, prop, fn, sep) \
6172 DT_FOREACH_PROP_ELEM_SEP(DT_DRV_INST(inst), prop, fn, sep)
6173
6188#define DT_INST_FOREACH_PROP_ELEM_VARGS(inst, prop, fn, ...) \
6189 DT_FOREACH_PROP_ELEM_VARGS(DT_DRV_INST(inst), prop, fn, __VA_ARGS__)
6190
6208#define DT_INST_FOREACH_PROP_ELEM_SEP_VARGS(inst, prop, fn, sep, ...) \
6209 DT_FOREACH_PROP_ELEM_SEP_VARGS(DT_DRV_INST(inst), prop, fn, sep, \
6210 __VA_ARGS__)
6211
6218#define DT_INST_NODE_HAS_PROP(inst, prop) \
6219 DT_NODE_HAS_PROP(DT_DRV_INST(inst), prop)
6220
6227#define DT_INST_NODE_HAS_COMPAT(inst, compat) \
6228 DT_NODE_HAS_COMPAT(DT_DRV_INST(inst), compat)
6229
6240#define DT_INST_PHA_HAS_CELL_AT_IDX(inst, pha, idx, cell) \
6241 DT_PHA_HAS_CELL_AT_IDX(DT_DRV_INST(inst), pha, idx, cell)
6242
6252#define DT_INST_PHA_HAS_CELL(inst, pha, cell) \
6253 DT_INST_PHA_HAS_CELL_AT_IDX(inst, pha, 0, cell)
6254
6262#define DT_INST_IRQ_HAS_IDX(inst, idx) DT_IRQ_HAS_IDX(DT_DRV_INST(inst), idx)
6263
6272#define DT_INST_IRQ_HAS_CELL_AT_IDX(inst, idx, cell) \
6273 DT_IRQ_HAS_CELL_AT_IDX(DT_DRV_INST(inst), idx, cell)
6274
6282#define DT_INST_IRQ_HAS_CELL(inst, cell) \
6283 DT_INST_IRQ_HAS_CELL_AT_IDX(inst, 0, cell)
6284
6291#define DT_INST_IRQ_HAS_NAME(inst, name) \
6292 DT_IRQ_HAS_NAME(DT_DRV_INST(inst), name)
6293
6297
6299
6301#define DT_ANY_COMPAT_HAS_PROP_STATUS_OKAY_INTERNAL(inst, compat, prop) \
6302 IF_ENABLED(DT_NODE_HAS_PROP(DT_INST(inst, compat), prop), (1,))
6303
6305#define DT_ANY_COMPAT_HAS_BOOL_STATUS_OKAY_INTERNAL(inst, compat, prop) \
6306 IF_ENABLED(DT_PROP(DT_INST(inst, compat), prop), (1,))
6307
6309#define DT_ANY_COMPAT_REG_HAS_NAME_STATUS_OKAY_INTERNAL(inst, compat, name) \
6310 IF_ENABLED(DT_REG_HAS_NAME(DT_INST(inst, compat), name), (1,))
6311
6313#define DT_ALL_COMPAT_HAS_PROP_STATUS_OKAY_INTERNAL(inst, compat, prop) \
6314 IF_DISABLED(DT_NODE_HAS_PROP(DT_INST(inst, compat), prop), (1,))
6315
6317#define DT_ALL_COMPAT_HAS_BOOL_STATUS_OKAY_INTERNAL(inst, compat, prop) \
6318 IF_DISABLED(DT_PROP(DT_INST(inst, compat), prop), (1,))
6319
6321#define DT_ALL_COMPAT_REG_HAS_NAME_STATUS_OKAY_INTERNAL(inst, compat, name) \
6322 IF_DISABLED(DT_REG_HAS_NAME(DT_INST(inst, compat), name), (1,))
6323
6324#define DT_PATH_INTERNAL(...) \
6325 UTIL_CAT(DT_ROOT, MACRO_MAP_CAT(DT_S_PREFIX, __VA_ARGS__))
6331#define DT_S_PREFIX(name) _S_##name
6332
6347#define DT_CAT(a1, a2) a1 ## a2
6349#define DT_CAT3(a1, a2, a3) a1 ## a2 ## a3
6351#define DT_CAT4(a1, a2, a3, a4) a1 ## a2 ## a3 ## a4
6353#define DT_CAT5(a1, a2, a3, a4, a5) a1 ## a2 ## a3 ## a4 ## a5
6355#define DT_CAT6(a1, a2, a3, a4, a5, a6) a1 ## a2 ## a3 ## a4 ## a5 ## a6
6357#define DT_CAT7(a1, a2, a3, a4, a5, a6, a7) \
6358 a1 ## a2 ## a3 ## a4 ## a5 ## a6 ## a7
6360#define DT_CAT8(a1, a2, a3, a4, a5, a6, a7, a8) \
6361 a1 ## a2 ## a3 ## a4 ## a5 ## a6 ## a7 ## a8
6362/*
6363 * If you need to define a bigger DT_CATN(), do so here. Don't leave
6364 * any "holes" of undefined macros, please.
6365 */
6366
6368#define DT_DASH(...) MACRO_MAP_CAT(DT_DASH_PREFIX, __VA_ARGS__)
6370#define DT_DASH_PREFIX(name) _##name
6372#define DT_NODE_HAS_STATUS_INTERNAL(node_id, status) \
6373 IS_ENABLED(DT_CAT3(node_id, _STATUS_, status))
6374
6378#define DT_COMPAT_NODE_HAS_PROP_AND_OR(inst, compat, prop) \
6379 DT_NODE_HAS_PROP(DT_INST(inst, compat), prop) ||
6380
6385#if defined(_LINKER) || defined(_ASMLANGUAGE)
6386#define DT_U32_C(_v) (_v)
6387#else
6388#define DT_U32_C(_v) UINT32_C(_v)
6389#endif
6390
6395#if defined(_LINKER) || defined(_ASMLANGUAGE)
6396#define DT_U64_C(_v) (_v)
6397#else
6398#define DT_U64_C(_v) UINT64_C(_v)
6399#endif
6400
6401/* Helpers for DT_NODELABEL_STRING_ARRAY. We define our own stringify
6402 * in order to avoid adding a dependency on toolchain.h..
6403 */
6404#define DT_NODELABEL_STRING_ARRAY_ENTRY_INTERNAL(nodelabel) DT_STRINGIFY_INTERNAL(nodelabel),
6405#define DT_STRINGIFY_INTERNAL(arg) DT_STRINGIFY_INTERNAL_HELPER(arg)
6406#define DT_STRINGIFY_INTERNAL_HELPER(arg) #arg
6407
6409
6410/* have these last so they have access to all previously defined macros */
6413#include <zephyr/devicetree/gpio.h>
6414#include <zephyr/devicetree/spi.h>
6415#include <zephyr/devicetree/dma.h>
6416#include <zephyr/devicetree/pwms.h>
6420#include <zephyr/devicetree/can.h>
6422#include <zephyr/devicetree/mbox.h>
6426#include <zephyr/devicetree/map.h>
6427#include <zephyr/devicetree/wuc.h>
6430#include <zephyr/devicetree/sram.h>
6431#include <zephyr/devicetree/cpu.h>
6432
6433#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.