Zephyr API Documentation 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
2314
2320
2356#define DT_NODE_VENDOR_BY_IDX(node_id, idx) \
2357 DT_CAT3(node_id, _COMPAT_VENDOR_IDX_, idx)
2358
2371#define DT_NODE_VENDOR_HAS_IDX(node_id, idx) \
2372 IS_ENABLED(DT_CAT4(node_id, _COMPAT_VENDOR_IDX_, idx, _EXISTS))
2373
2388#define DT_NODE_VENDOR_BY_IDX_OR(node_id, idx, default_value) \
2389 COND_CODE_1(DT_NODE_VENDOR_HAS_IDX(node_id, idx), \
2390 (DT_NODE_VENDOR_BY_IDX(node_id, idx)), (default_value))
2391
2400#define DT_NODE_VENDOR_OR(node_id, default_value) \
2401 DT_NODE_VENDOR_BY_IDX_OR(node_id, 0, default_value)
2402
2432#define DT_NODE_MODEL_BY_IDX(node_id, idx) \
2433 DT_CAT3(node_id, _COMPAT_MODEL_IDX_, idx)
2434
2447#define DT_NODE_MODEL_HAS_IDX(node_id, idx) \
2448 IS_ENABLED(DT_CAT4(node_id, _COMPAT_MODEL_IDX_, idx, _EXISTS))
2449
2464#define DT_NODE_MODEL_BY_IDX_OR(node_id, idx, default_value) \
2465 COND_CODE_1(DT_NODE_MODEL_HAS_IDX(node_id, idx), \
2466 (DT_NODE_MODEL_BY_IDX(node_id, idx)), (default_value))
2467
2476#define DT_NODE_MODEL_OR(node_id, default_value) \
2477 DT_NODE_MODEL_BY_IDX_OR(node_id, 0, default_value)
2478
2482
2488
2496#define DT_NUM_REGS(node_id) DT_CAT(node_id, _REG_NUM)
2497
2509#define DT_REG_HAS_IDX(node_id, idx) \
2510 IS_ENABLED(DT_CAT4(node_id, _REG_IDX_, idx, _EXISTS))
2511
2523#define DT_REG_HAS_NAME(node_id, name) \
2524 IS_ENABLED(DT_CAT4(node_id, _REG_NAME_, name, _EXISTS))
2525
2537#define DT_REG_ADDR_BY_IDX_RAW(node_id, idx) \
2538 DT_CAT4(node_id, _REG_IDX_, idx, _VAL_ADDRESS)
2539
2551#define DT_REG_ADDR_RAW(node_id) \
2552 DT_REG_ADDR_BY_IDX_RAW(node_id, 0)
2553
2560#define DT_REG_ADDR_BY_IDX(node_id, idx) \
2561 DT_U32_C(DT_REG_ADDR_BY_IDX_RAW(node_id, idx))
2562
2574#define DT_REG_SIZE_BY_IDX(node_id, idx) \
2575 DT_U32_C(DT_CAT4(node_id, _REG_IDX_, idx, _VAL_SIZE))
2576
2584#define DT_REG_ADDR(node_id) DT_REG_ADDR_BY_IDX(node_id, 0)
2585
2596#define DT_REG_ADDR_U64(node_id) DT_U64_C(DT_REG_ADDR_BY_IDX_RAW(node_id, 0))
2597
2605#define DT_REG_SIZE(node_id) DT_REG_SIZE_BY_IDX(node_id, 0)
2606
2613#define DT_REG_ADDR_BY_NAME(node_id, name) \
2614 DT_U32_C(DT_CAT4(node_id, _REG_NAME_, name, _VAL_ADDRESS))
2615
2624#define DT_REG_ADDR_BY_NAME_OR(node_id, name, default_value) \
2625 COND_CODE_1(DT_REG_HAS_NAME(node_id, name), \
2626 (DT_REG_ADDR_BY_NAME(node_id, name)), (default_value))
2627
2640#define DT_REG_ADDR_BY_NAME_U64(node_id, name) \
2641 DT_U64_C(DT_CAT4(node_id, _REG_NAME_, name, _VAL_ADDRESS))
2642
2649#define DT_REG_SIZE_BY_NAME(node_id, name) \
2650 DT_U32_C(DT_CAT4(node_id, _REG_NAME_, name, _VAL_SIZE))
2651
2660#define DT_REG_SIZE_BY_NAME_OR(node_id, name, default_value) \
2661 COND_CODE_1(DT_REG_HAS_NAME(node_id, name), \
2662 (DT_REG_SIZE_BY_NAME(node_id, name)), (default_value))
2663
2664
2712#define DT_FOREACH_REG(node_id, fn) \
2713 DT_CAT(node_id, _FOREACH_REG)(fn)
2714
2763#define DT_FOREACH_REG_SEP(node_id, fn, sep) \
2764 DT_CAT(node_id, _FOREACH_REG_SEP)(fn, sep)
2765
2779
2780#define DT_FOREACH_REG_VARGS(node_id, fn, ...) \
2781 DT_CAT(node_id, _FOREACH_REG_VARGS)(fn, __VA_ARGS__)
2782
2799#define DT_FOREACH_REG_SEP_VARGS(node_id, fn, sep, ...) \
2800 DT_CAT(node_id, _FOREACH_REG_SEP_VARGS)(fn, sep, __VA_ARGS__)
2801
2805
2811
2820#define DT_NUM_IRQS(node_id) DT_CAT(node_id, _IRQ_NUM)
2821
2846#define DT_NUM_NODELABELS(node_id) DT_CAT(node_id, _NODELABEL_NUM)
2847
2854#define DT_IRQ_LEVEL(node_id) DT_CAT(node_id, _IRQ_LEVEL)
2855
2866#define DT_IRQ_HAS_IDX(node_id, idx) \
2867 IS_ENABLED(DT_CAT4(node_id, _IRQ_IDX_, idx, _EXISTS))
2868
2879#define DT_IRQ_HAS_CELL_AT_IDX(node_id, idx, cell) \
2880 IS_ENABLED(DT_CAT6(node_id, _IRQ_IDX_, idx, _VAL_, cell, _EXISTS))
2881
2889#define DT_IRQ_HAS_CELL(node_id, cell) DT_IRQ_HAS_CELL_AT_IDX(node_id, 0, cell)
2890
2900#define DT_IRQ_HAS_NAME(node_id, name) \
2901 IS_ENABLED(DT_CAT4(node_id, _IRQ_NAME_, name, _VAL_irq_EXISTS))
2902
2938#define DT_IRQ_BY_IDX(node_id, idx, cell) \
2939 DT_CAT5(node_id, _IRQ_IDX_, idx, _VAL_, cell)
2940
2956#define DT_IRQ_BY_NAME(node_id, name, cell) \
2957 DT_CAT5(node_id, _IRQ_NAME_, name, _VAL_, cell)
2958
2966#define DT_IRQ(node_id, cell) DT_IRQ_BY_IDX(node_id, 0, cell)
2967
3010#define DT_IRQ_INTC_BY_IDX(node_id, idx) \
3011 DT_CAT4(node_id, _IRQ_IDX_, idx, _CONTROLLER)
3012
3057#define DT_IRQ_INTC_BY_NAME(node_id, name) \
3058 DT_CAT4(node_id, _IRQ_NAME_, name, _CONTROLLER)
3059
3099#define DT_IRQ_INTC(node_id) \
3100 DT_IRQ_INTC_BY_IDX(node_id, 0)
3101
3105
3106/* DT helper macro to encode a node's IRQN to level 1 according to the multi-level scheme */
3107#define DT_IRQN_L1_INTERNAL(node_id, idx) DT_IRQ_BY_IDX(node_id, idx, irq)
3108/* DT helper macro to encode a node's IRQN to level 2 according to the multi-level scheme */
3109#define DT_IRQN_L2_INTERNAL(node_id, idx) \
3110 (IRQ_TO_L2(DT_IRQN_L1_INTERNAL(node_id, idx)) | \
3111 DT_IRQ(DT_IRQ_INTC_BY_IDX(node_id, idx), irq))
3112/* DT helper macro to encode a node's IRQN to level 3 according to the multi-level scheme */
3113#define DT_IRQN_L3_INTERNAL(node_id, idx) \
3114 (IRQ_TO_L3(DT_IRQN_L1_INTERNAL(node_id, idx)) | \
3115 IRQ_TO_L2(DT_IRQ(DT_IRQ_INTC_BY_IDX(node_id, idx), irq)) | \
3116 DT_IRQ(DT_IRQ_INTC(DT_IRQ_INTC_BY_IDX(node_id, idx)), irq))
3117/* DT helper macro for the macros above */
3118#define DT_IRQN_LVL_INTERNAL(node_id, idx, level) DT_CAT3(DT_IRQN_L, level, _INTERNAL)(node_id, idx)
3119
3124#define DT_MULTI_LEVEL_IRQN_INTERNAL(node_id, idx) \
3125 DT_IRQN_LVL_INTERNAL(node_id, idx, DT_IRQ_LEVEL(node_id))
3126
3130
3139#define DT_IRQN_BY_IDX(node_id, idx) \
3140 COND_CODE_1(IS_ENABLED(CONFIG_MULTI_LEVEL_INTERRUPTS), \
3141 (DT_MULTI_LEVEL_IRQN_INTERNAL(node_id, idx)), \
3142 (DT_IRQ_BY_IDX(node_id, idx, irq)))
3143
3154#define DT_IRQN(node_id) DT_IRQN_BY_IDX(node_id, 0)
3155
3159
3165
3174#define DT_CHOSEN(prop) DT_CAT(DT_CHOSEN_, prop)
3175
3182#define DT_HAS_CHOSEN(prop) IS_ENABLED(DT_CAT3(DT_CHOSEN_, prop, _EXISTS))
3183
3187
3223
3233#define DT_FOREACH_NODE(fn) DT_FOREACH_HELPER(fn)
3234
3247#define DT_FOREACH_NODE_VARGS(fn, ...) DT_FOREACH_VARGS_HELPER(fn, __VA_ARGS__)
3248
3260#define DT_FOREACH_STATUS_OKAY_NODE(fn) DT_FOREACH_OKAY_HELPER(fn)
3261
3276#define DT_FOREACH_STATUS_OKAY_NODE_VARGS(fn, ...) DT_FOREACH_OKAY_VARGS_HELPER(fn, __VA_ARGS__)
3277
3324#define DT_FOREACH_ANCESTOR(node_id, fn) \
3325 DT_CAT(node_id, _FOREACH_ANCESTOR)(fn)
3326
3370#define DT_FOREACH_CHILD(node_id, fn) \
3371 DT_CAT(node_id, _FOREACH_CHILD)(fn)
3372
3413#define DT_FOREACH_CHILD_SEP(node_id, fn, sep) \
3414 DT_CAT(node_id, _FOREACH_CHILD_SEP)(fn, sep)
3415
3431#define DT_FOREACH_CHILD_VARGS(node_id, fn, ...) \
3432 DT_CAT(node_id, _FOREACH_CHILD_VARGS)(fn, __VA_ARGS__)
3433
3449#define DT_FOREACH_CHILD_SEP_VARGS(node_id, fn, sep, ...) \
3450 DT_CAT(node_id, _FOREACH_CHILD_SEP_VARGS)(fn, sep, __VA_ARGS__)
3451
3467#define DT_FOREACH_CHILD_STATUS_OKAY(node_id, fn) \
3468 DT_CAT(node_id, _FOREACH_CHILD_STATUS_OKAY)(fn)
3469
3486#define DT_FOREACH_CHILD_STATUS_OKAY_SEP(node_id, fn, sep) \
3487 DT_CAT(node_id, _FOREACH_CHILD_STATUS_OKAY_SEP)(fn, sep)
3488
3508#define DT_FOREACH_CHILD_STATUS_OKAY_VARGS(node_id, fn, ...) \
3509 DT_CAT(node_id, _FOREACH_CHILD_STATUS_OKAY_VARGS)(fn, __VA_ARGS__)
3510
3529#define DT_FOREACH_CHILD_STATUS_OKAY_SEP_VARGS(node_id, fn, sep, ...) \
3530 DT_CAT(node_id, _FOREACH_CHILD_STATUS_OKAY_SEP_VARGS)(fn, sep, __VA_ARGS__)
3531
3582#define DT_FOREACH_PROP_ELEM(node_id, prop, fn) \
3583 DT_CAT4(node_id, _P_, prop, _FOREACH_PROP_ELEM)(fn)
3584
3627#define DT_FOREACH_PROP_ELEM_SEP(node_id, prop, fn, sep) \
3628 DT_CAT4(node_id, _P_, prop, _FOREACH_PROP_ELEM_SEP)(fn, sep)
3629
3650#define DT_FOREACH_PROP_ELEM_VARGS(node_id, prop, fn, ...) \
3651 DT_CAT4(node_id, _P_, prop, _FOREACH_PROP_ELEM_VARGS)(fn, __VA_ARGS__)
3652
3669#define DT_FOREACH_PROP_ELEM_SEP_VARGS(node_id, prop, fn, sep, ...) \
3670 DT_CAT4(node_id, _P_, prop, _FOREACH_PROP_ELEM_SEP_VARGS)( \
3671 fn, sep, __VA_ARGS__)
3672
3726#define DT_FOREACH_STATUS_OKAY(compat, fn) \
3727 COND_CODE_1(DT_HAS_COMPAT_STATUS_OKAY(compat), \
3728 (UTIL_CAT(DT_FOREACH_OKAY_, compat)(fn)), \
3729 ())
3730
3775#define DT_FOREACH_STATUS_OKAY_VARGS(compat, fn, ...) \
3776 COND_CODE_1(DT_HAS_COMPAT_STATUS_OKAY(compat), \
3777 (DT_CAT(DT_FOREACH_OKAY_VARGS_, \
3778 compat)(fn, __VA_ARGS__)), \
3779 ())
3780
3793#define DT_COMPAT_FOREACH_STATUS_OKAY_VARGS(compat, fn, ...) \
3794 COND_CODE_1(DT_HAS_COMPAT_STATUS_OKAY(compat), \
3795 (UTIL_CAT(DT_FOREACH_OKAY_INST_VARGS_, \
3796 compat)(fn, compat, __VA_ARGS__)), \
3797 ())
3798
3799
3838#define DT_FOREACH_NODELABEL(node_id, fn) DT_CAT(node_id, _FOREACH_NODELABEL)(fn)
3839
3877#define DT_FOREACH_NODELABEL_VARGS(node_id, fn, ...) \
3878 DT_CAT(node_id, _FOREACH_NODELABEL_VARGS)(fn, __VA_ARGS__)
3879
3883
3889
3904#define DT_NODE_EXISTS(node_id) IS_ENABLED(DT_CAT(node_id, _EXISTS))
3905
3927#define DT_NODE_HAS_STATUS(node_id, status) \
3928 DT_NODE_HAS_STATUS_INTERNAL(node_id, status)
3929
3950#define DT_NODE_HAS_STATUS_OKAY(node_id) DT_NODE_HAS_STATUS(node_id, okay)
3951
3971#define DT_HAS_COMPAT_STATUS_OKAY(compat) \
3972 IS_ENABLED(DT_CAT(DT_COMPAT_HAS_OKAY_, compat))
3973
3980#define DT_NUM_INST_STATUS_OKAY(compat) \
3981 UTIL_AND(DT_HAS_COMPAT_STATUS_OKAY(compat), \
3982 UTIL_CAT(DT_N_INST, DT_DASH(compat, NUM_OKAY)))
3983
4011#define DT_NODE_HAS_COMPAT(node_id, compat) \
4012 IS_ENABLED(DT_CAT3(node_id, _COMPAT_MATCHES_, compat))
4013
4028#define DT_NODE_HAS_COMPAT_STATUS(node_id, compat, status) \
4029 UTIL_AND(DT_NODE_HAS_COMPAT(node_id, compat), DT_NODE_HAS_STATUS(node_id, status))
4030
4044#define DT_NODE_HAS_PROP(node_id, prop) \
4045 IS_ENABLED(DT_CAT4(node_id, _P_, prop, _EXISTS))
4046
4047
4064#define DT_PHA_HAS_CELL_AT_IDX(node_id, pha, idx, cell) \
4065 IS_ENABLED(DT_CAT8(node_id, _P_, pha, \
4066 _IDX_, idx, _VAL_, cell, _EXISTS))
4067
4077#define DT_PHA_HAS_CELL(node_id, pha, cell) \
4078 DT_PHA_HAS_CELL_AT_IDX(node_id, pha, 0, cell)
4079
4100#define DT_FOREACH_PHA_CELL_BY_IDX(node_id, pha, idx, fn) \
4101 DT_CAT6(node_id, _P_, pha, _IDX_, idx, _FOREACH_CELL)(fn)
4102
4115#define DT_FOREACH_PHA_CELL_BY_IDX_SEP(node_id, pha, idx, fn, sep) \
4116 DT_CAT6(node_id, _P_, pha, _IDX_, idx, _FOREACH_CELL_SEP)(fn, sep)
4117
4126#define DT_PHA_NUM_CELLS_BY_IDX(node_id, pha, idx) \
4127 DT_CAT6(node_id, _P_, pha, _IDX_, idx, _NUM_CELLS)
4128
4140#define DT_PHA_ELEM_NAME_BY_IDX(node_id, pha, idx) \
4141 DT_CAT6(node_id, _P_, pha, _IDX_, idx, _NAME)
4142
4164#define DT_FOREACH_PHA_CELL_BY_NAME(node_id, pha, name, fn) \
4165 DT_CAT6(node_id, _P_, pha, _NAME_, name, _FOREACH_CELL)(fn)
4166
4179#define DT_FOREACH_PHA_CELL_BY_NAME_SEP(node_id, pha, name, fn, sep) \
4180 DT_CAT6(node_id, _P_, pha, _NAME_, name, _FOREACH_CELL_SEP)(fn, sep)
4181
4190#define DT_PHA_NUM_CELLS_BY_NAME(node_id, pha, name) \
4191 DT_CAT6(node_id, _P_, pha, _NAME_, name, _NUM_CELLS)
4192
4204#define DT_PHA_ELEM_IDX_BY_NAME(node_id, pha, name) \
4205 DT_CAT6(node_id, _P_, pha, _NAME_, name, _IDX)
4206
4207
4211
4217
4249#define DT_BUS(node_id) DT_CAT(node_id, _BUS)
4250
4279#define DT_ON_BUS(node_id, bus) IS_ENABLED(DT_CAT3(node_id, _BUS_, bus))
4280
4284
4290
4297#define DT_DRV_INST(inst) DT_INST(inst, DT_DRV_COMPAT)
4298
4306#define DT_INST_PARENT(inst) DT_PARENT(DT_DRV_INST(inst))
4307
4315#define DT_INST_GPARENT(inst) DT_GPARENT(DT_DRV_INST(inst))
4316
4326#define DT_INST_CHILD(inst, child) \
4327 DT_CHILD(DT_DRV_INST(inst), child)
4328
4341#define DT_INST_CHILD_BY_UNIT_ADDR_INT(inst, addr) \
4342 DT_CHILD_BY_UNIT_ADDR_INT(DT_DRV_INST(inst), addr)
4343
4353#define DT_INST_CHILD_NUM(inst) DT_CHILD_NUM(DT_DRV_INST(inst))
4354
4365#define DT_INST_CHILD_NUM_STATUS_OKAY(inst) \
4366 DT_CHILD_NUM_STATUS_OKAY(DT_DRV_INST(inst))
4367
4380#define DT_INST_DESCENDANT_NUM_ON_BUS(inst, bus) \
4381 DT_DESCENDANT_NUM_ON_BUS(DT_DRV_INST(inst), bus)
4382
4396#define DT_INST_DESCENDANT_NUM_ON_BUS_STATUS_OKAY(inst, bus) \
4397 DT_DESCENDANT_NUM_ON_BUS_STATUS_OKAY(DT_DRV_INST(inst), bus)
4398
4407#define DT_INST_NODELABEL_STRING_ARRAY(inst) DT_NODELABEL_STRING_ARRAY(DT_DRV_INST(inst))
4408
4417#define DT_INST_NUM_NODELABELS(inst) DT_NUM_NODELABELS(DT_DRV_INST(inst))
4418
4433#define DT_INST_FOREACH_CHILD(inst, fn) \
4434 DT_FOREACH_CHILD(DT_DRV_INST(inst), fn)
4435
4449#define DT_INST_FOREACH_CHILD_SEP(inst, fn, sep) \
4450 DT_FOREACH_CHILD_SEP(DT_DRV_INST(inst), fn, sep)
4451
4467#define DT_INST_FOREACH_CHILD_VARGS(inst, fn, ...) \
4468 DT_FOREACH_CHILD_VARGS(DT_DRV_INST(inst), fn, __VA_ARGS__)
4469
4484#define DT_INST_FOREACH_CHILD_SEP_VARGS(inst, fn, sep, ...) \
4485 DT_FOREACH_CHILD_SEP_VARGS(DT_DRV_INST(inst), fn, sep, __VA_ARGS__)
4486
4498#define DT_INST_FOREACH_CHILD_STATUS_OKAY(inst, fn) \
4499 DT_FOREACH_CHILD_STATUS_OKAY(DT_DRV_INST(inst), fn)
4500
4515#define DT_INST_FOREACH_CHILD_STATUS_OKAY_SEP(inst, fn, sep) \
4516 DT_FOREACH_CHILD_STATUS_OKAY_SEP(DT_DRV_INST(inst), fn, sep)
4517
4531#define DT_INST_FOREACH_CHILD_STATUS_OKAY_VARGS(inst, fn, ...) \
4532 DT_FOREACH_CHILD_STATUS_OKAY_VARGS(DT_DRV_INST(inst), fn, __VA_ARGS__)
4533
4549#define DT_INST_FOREACH_CHILD_STATUS_OKAY_SEP_VARGS(inst, fn, sep, ...) \
4550 DT_FOREACH_CHILD_STATUS_OKAY_SEP_VARGS(DT_DRV_INST(inst), fn, sep, __VA_ARGS__)
4551
4566#define DT_INST_FOREACH_REG(inst, fn) \
4567 DT_FOREACH_REG(DT_DRV_INST(inst), fn)
4568
4585#define DT_INST_FOREACH_REG_SEP(inst, fn, sep) \
4586 DT_FOREACH_REG_SEP(DT_DRV_INST(inst), fn, sep)
4587
4604#define DT_INST_FOREACH_REG_VARGS(inst, fn, ...) \
4605 DT_FOREACH_REG_VARGS(DT_DRV_INST(inst), fn, __VA_ARGS__)
4606
4625#define DT_INST_FOREACH_REG_SEP_VARGS(inst, fn, sep, ...) \
4626 DT_FOREACH_REG_SEP_VARGS(DT_DRV_INST(inst), fn, sep, __VA_ARGS__)
4627
4635#define DT_INST_ENUM_IDX_BY_IDX(inst, prop, idx) \
4636 DT_ENUM_IDX_BY_IDX(DT_DRV_INST(inst), prop, idx)
4637
4644#define DT_INST_ENUM_IDX(inst, prop) \
4645 DT_ENUM_IDX(DT_DRV_INST(inst), prop)
4646
4656#define DT_INST_ENUM_IDX_BY_IDX_OR(inst, prop, idx, default_idx_value) \
4657 DT_ENUM_IDX_BY_IDX_OR(DT_DRV_INST(inst), prop, idx, default_idx_value)
4658
4667#define DT_INST_ENUM_IDX_OR(inst, prop, default_idx_value) \
4668 DT_ENUM_IDX_OR(DT_DRV_INST(inst), prop, default_idx_value)
4669
4678#define DT_INST_ENUM_HAS_VALUE_BY_IDX(inst, prop, idx, value) \
4679 DT_ENUM_HAS_VALUE_BY_IDX(DT_DRV_INST(inst), prop, idx, value)
4680
4689#define DT_INST_ENUM_HAS_VALUE(inst, prop, value) \
4690 DT_ENUM_HAS_VALUE(DT_DRV_INST(inst), prop, value)
4691
4698#define DT_INST_PROP(inst, prop) DT_PROP(DT_DRV_INST(inst), prop)
4699
4706#define DT_INST_PROP_LEN(inst, prop) DT_PROP_LEN(DT_DRV_INST(inst), prop)
4707
4717#define DT_INST_PROP_HAS_IDX(inst, prop, idx) \
4718 DT_PROP_HAS_IDX(DT_DRV_INST(inst), prop, idx)
4719
4728#define DT_INST_PROP_HAS_NAME(inst, prop, name) \
4729 DT_PROP_HAS_NAME(DT_DRV_INST(inst), prop, name)
4730
4738#define DT_INST_PROP_BY_IDX(inst, prop, idx) \
4739 DT_PROP_BY_IDX(DT_DRV_INST(inst), prop, idx)
4740
4748#define DT_INST_PROP_OR(inst, prop, default_value) \
4749 DT_PROP_OR(DT_DRV_INST(inst), prop, default_value)
4750
4758#define DT_INST_PROP_LEN_OR(inst, prop, default_value) \
4759 DT_PROP_LEN_OR(DT_DRV_INST(inst), prop, default_value)
4760
4770#define DT_INST_STRING_TOKEN(inst, prop) \
4771 DT_STRING_TOKEN(DT_DRV_INST(inst), prop)
4772
4780#define DT_INST_STRING_UPPER_TOKEN(inst, prop) \
4781 DT_STRING_UPPER_TOKEN(DT_DRV_INST(inst), prop)
4782
4791#define DT_INST_STRING_UNQUOTED(inst, prop) \
4792 DT_STRING_UNQUOTED(DT_DRV_INST(inst), prop)
4793
4801#define DT_INST_STRING_TOKEN_BY_IDX(inst, prop, idx) \
4802 DT_STRING_TOKEN_BY_IDX(DT_DRV_INST(inst), prop, idx)
4803
4812#define DT_INST_STRING_TOKEN_BY_IDX_OR(inst, prop, idx, default_value) \
4813 DT_STRING_TOKEN_BY_IDX_OR(DT_DRV_INST(inst), prop, idx, default_value)
4814
4822#define DT_INST_STRING_UPPER_TOKEN_BY_IDX(inst, prop, idx) \
4823 DT_STRING_UPPER_TOKEN_BY_IDX(DT_DRV_INST(inst), prop, idx)
4824
4832#define DT_INST_STRING_UNQUOTED_BY_IDX(inst, prop, idx) \
4833 DT_STRING_UNQUOTED_BY_IDX(DT_DRV_INST(inst), prop, idx)
4834
4843#define DT_INST_PROP_BY_PHANDLE(inst, ph, prop) \
4844 DT_INST_PROP_BY_PHANDLE_IDX(inst, ph, 0, prop)
4845
4857#define DT_INST_PROP_BY_PHANDLE_IDX(inst, phs, idx, prop) \
4858 DT_PROP_BY_PHANDLE_IDX(DT_DRV_INST(inst), phs, idx, prop)
4859
4868#define DT_INST_PHA_BY_IDX(inst, pha, idx, cell) \
4869 DT_PHA_BY_IDX(DT_DRV_INST(inst), pha, idx, cell)
4870
4880#define DT_INST_PHA_BY_IDX_OR(inst, pha, idx, cell, default_value) \
4881 DT_PHA_BY_IDX_OR(DT_DRV_INST(inst), pha, idx, cell, default_value)
4882
4891#define DT_INST_PHA(inst, pha, cell) DT_INST_PHA_BY_IDX(inst, pha, 0, cell)
4892
4901#define DT_INST_PHA_OR(inst, pha, cell, default_value) \
4902 DT_INST_PHA_BY_IDX_OR(inst, pha, 0, cell, default_value)
4903
4913#define DT_INST_PHA_BY_NAME(inst, pha, name, cell) \
4914 DT_PHA_BY_NAME(DT_DRV_INST(inst), pha, name, cell)
4915
4925#define DT_INST_PHA_BY_NAME_OR(inst, pha, name, cell, default_value) \
4926 DT_PHA_BY_NAME_OR(DT_DRV_INST(inst), pha, name, cell, default_value)
4927
4936#define DT_INST_PHANDLE_BY_NAME(inst, pha, name) \
4937 DT_PHANDLE_BY_NAME(DT_DRV_INST(inst), pha, name) \
4938
4939
4948#define DT_INST_PHANDLE_BY_IDX(inst, prop, idx) \
4949 DT_PHANDLE_BY_IDX(DT_DRV_INST(inst), prop, idx)
4950
4959#define DT_INST_PHANDLE(inst, prop) DT_INST_PHANDLE_BY_IDX(inst, prop, 0)
4960
4968#define DT_INST_REG_HAS_IDX(inst, idx) DT_REG_HAS_IDX(DT_DRV_INST(inst), idx)
4969
4977#define DT_INST_REG_HAS_NAME(inst, name) DT_REG_HAS_NAME(DT_DRV_INST(inst), name)
4978
4985#define DT_INST_REG_ADDR_BY_IDX_RAW(inst, idx) DT_REG_ADDR_BY_IDX_RAW(DT_DRV_INST(inst), idx)
4986
4993#define DT_INST_REG_ADDR_BY_IDX(inst, idx) DT_REG_ADDR_BY_IDX(DT_DRV_INST(inst), idx)
4994
5001#define DT_INST_REG_SIZE_BY_IDX(inst, idx) \
5002 DT_REG_SIZE_BY_IDX(DT_DRV_INST(inst), idx)
5003
5010#define DT_INST_REG_ADDR_BY_NAME(inst, name) \
5011 DT_REG_ADDR_BY_NAME(DT_DRV_INST(inst), name)
5012
5021#define DT_INST_REG_ADDR_BY_NAME_OR(inst, name, default_value) \
5022 DT_REG_ADDR_BY_NAME_OR(DT_DRV_INST(inst), name, default_value)
5023
5036#define DT_INST_REG_ADDR_BY_NAME_U64(inst, name) \
5037 DT_REG_ADDR_BY_NAME_U64(DT_DRV_INST(inst), name)
5038
5045#define DT_INST_REG_SIZE_BY_NAME(inst, name) \
5046 DT_REG_SIZE_BY_NAME(DT_DRV_INST(inst), name)
5047
5056#define DT_INST_REG_SIZE_BY_NAME_OR(inst, name, default_value) \
5057 DT_REG_SIZE_BY_NAME_OR(DT_DRV_INST(inst), name, default_value)
5058
5064#define DT_INST_REG_ADDR_RAW(inst) DT_INST_REG_ADDR_BY_IDX_RAW(inst, 0)
5065
5071#define DT_INST_REG_ADDR(inst) DT_INST_REG_ADDR_BY_IDX(inst, 0)
5072
5084#define DT_INST_REG_ADDR_U64(inst) DT_REG_ADDR_U64(DT_DRV_INST(inst))
5085
5091#define DT_INST_REG_SIZE(inst) DT_INST_REG_SIZE_BY_IDX(inst, 0)
5092
5099#define DT_INST_NUM_IRQS(inst) DT_NUM_IRQS(DT_DRV_INST(inst))
5100
5107#define DT_INST_IRQ_LEVEL(inst) DT_IRQ_LEVEL(DT_DRV_INST(inst))
5108
5116#define DT_INST_IRQ_BY_IDX(inst, idx, cell) \
5117 DT_IRQ_BY_IDX(DT_DRV_INST(inst), idx, cell)
5118
5125#define DT_INST_IRQ_INTC_BY_IDX(inst, idx) \
5126 DT_IRQ_INTC_BY_IDX(DT_DRV_INST(inst), idx)
5127
5134#define DT_INST_IRQ_INTC_BY_NAME(inst, name) \
5135 DT_IRQ_INTC_BY_NAME(DT_DRV_INST(inst), name)
5136
5144#define DT_INST_IRQ_INTC(inst) \
5145 DT_INST_IRQ_INTC_BY_IDX(inst, 0)
5146
5154#define DT_INST_IRQ_BY_NAME(inst, name, cell) \
5155 DT_IRQ_BY_NAME(DT_DRV_INST(inst), name, cell)
5156
5163#define DT_INST_IRQ(inst, cell) DT_INST_IRQ_BY_IDX(inst, 0, cell)
5164
5170#define DT_INST_IRQN(inst) DT_IRQN(DT_DRV_INST(inst))
5171
5178#define DT_INST_IRQN_BY_IDX(inst, idx) DT_IRQN_BY_IDX(DT_DRV_INST(inst), idx)
5179
5185#define DT_INST_BUS(inst) DT_BUS(DT_DRV_INST(inst))
5186
5194#define DT_INST_ON_BUS(inst, bus) DT_ON_BUS(DT_DRV_INST(inst), bus)
5195
5205#define DT_INST_STRING_TOKEN_OR(inst, name, default_value) \
5206 DT_STRING_TOKEN_OR(DT_DRV_INST(inst), name, default_value)
5207
5216#define DT_INST_STRING_UPPER_TOKEN_OR(inst, name, default_value) \
5217 DT_STRING_UPPER_TOKEN_OR(DT_DRV_INST(inst), name, default_value)
5218
5227#define DT_INST_STRING_UNQUOTED_OR(inst, name, default_value) \
5228 DT_STRING_UNQUOTED_OR(DT_DRV_INST(inst), name, default_value)
5229
5260#define DT_HAS_COMPAT_ON_BUS_STATUS_OKAY(compat, bus) \
5261 IS_ENABLED(DT_CAT4(DT_COMPAT_, compat, _BUS_, bus))
5262
5295#define DT_ANY_INST_ON_BUS_STATUS_OKAY(bus) \
5296 DT_HAS_COMPAT_ON_BUS_STATUS_OKAY(DT_DRV_COMPAT, bus)
5297
5342#define DT_ANY_INST_HAS_PROP_STATUS_OKAY(prop) \
5343 UTIL_NOT(IS_EMPTY( \
5344 DT_INST_FOREACH_STATUS_OKAY_VARGS(DT_ANY_INST_HAS_PROP_STATUS_OKAY_, prop)))
5345
5390#define DT_ALL_INST_HAS_PROP_STATUS_OKAY(prop) \
5391 IS_EMPTY(DT_INST_FOREACH_STATUS_OKAY_VARGS(DT_ALL_INST_HAS_PROP_STATUS_OKAY_, prop))
5392
5437#define DT_ANY_COMPAT_HAS_PROP_STATUS_OKAY(compat, prop) \
5438 (DT_COMPAT_FOREACH_STATUS_OKAY_VARGS(compat, DT_COMPAT_NODE_HAS_PROP_AND_OR, prop) 0)
5439
5487#define DT_ANY_INST_HAS_BOOL_STATUS_OKAY(prop) \
5488 UTIL_NOT(IS_EMPTY( \
5489 DT_INST_FOREACH_STATUS_OKAY_VARGS(DT_ANY_INST_HAS_BOOL_STATUS_OKAY_, prop)))
5490
5536#define DT_ALL_INST_HAS_BOOL_STATUS_OKAY(prop) \
5537 IS_EMPTY(DT_INST_FOREACH_STATUS_OKAY_VARGS(DT_ALL_INST_HAS_BOOL_STATUS_OKAY_, prop))
5538
5545#define DT_ANY_INST_REG_HAS_NAME_STATUS_OKAY(name) \
5546 UTIL_NOT(IS_EMPTY( \
5547 DT_INST_FOREACH_STATUS_OKAY_VARGS(DT_ANY_INST_REG_HAS_NAME_STATUS_OKAY_, name)))
5548
5555#define DT_ALL_INST_REG_HAS_NAME_STATUS_OKAY(name) \
5556 IS_EMPTY(DT_INST_FOREACH_STATUS_OKAY_VARGS(DT_ALL_INST_REG_HAS_NAME_STATUS_OKAY_, name))
5557
5623#define DT_INST_FOREACH_STATUS_OKAY(fn) \
5624 COND_CODE_1(DT_HAS_COMPAT_STATUS_OKAY(DT_DRV_COMPAT), \
5625 (UTIL_CAT(DT_FOREACH_OKAY_INST_, \
5626 DT_DRV_COMPAT)(fn)), \
5627 ())
5628
5641#define DT_INST_FOREACH_STATUS_OKAY_VARGS(fn, ...) \
5642 COND_CODE_1(DT_HAS_COMPAT_STATUS_OKAY(DT_DRV_COMPAT), \
5643 (UTIL_CAT(DT_FOREACH_OKAY_INST_VARGS_, \
5644 DT_DRV_COMPAT)(fn, __VA_ARGS__)), \
5645 ())
5646
5656#define DT_INST_FOREACH_NODELABEL(inst, fn) \
5657 DT_FOREACH_NODELABEL(DT_DRV_INST(inst), fn)
5658
5670#define DT_INST_FOREACH_NODELABEL_VARGS(inst, fn, ...) \
5671 DT_FOREACH_NODELABEL_VARGS(DT_DRV_INST(inst), fn, __VA_ARGS__)
5672
5683#define DT_INST_FOREACH_PROP_ELEM(inst, prop, fn) \
5684 DT_FOREACH_PROP_ELEM(DT_DRV_INST(inst), prop, fn)
5685
5698#define DT_INST_FOREACH_PROP_ELEM_SEP(inst, prop, fn, sep) \
5699 DT_FOREACH_PROP_ELEM_SEP(DT_DRV_INST(inst), prop, fn, sep)
5700
5715#define DT_INST_FOREACH_PROP_ELEM_VARGS(inst, prop, fn, ...) \
5716 DT_FOREACH_PROP_ELEM_VARGS(DT_DRV_INST(inst), prop, fn, __VA_ARGS__)
5717
5735#define DT_INST_FOREACH_PROP_ELEM_SEP_VARGS(inst, prop, fn, sep, ...) \
5736 DT_FOREACH_PROP_ELEM_SEP_VARGS(DT_DRV_INST(inst), prop, fn, sep, \
5737 __VA_ARGS__)
5738
5745#define DT_INST_NODE_HAS_PROP(inst, prop) \
5746 DT_NODE_HAS_PROP(DT_DRV_INST(inst), prop)
5747
5754#define DT_INST_NODE_HAS_COMPAT(inst, compat) \
5755 DT_NODE_HAS_COMPAT(DT_DRV_INST(inst), compat)
5756
5767#define DT_INST_PHA_HAS_CELL_AT_IDX(inst, pha, idx, cell) \
5768 DT_PHA_HAS_CELL_AT_IDX(DT_DRV_INST(inst), pha, idx, cell)
5769
5779#define DT_INST_PHA_HAS_CELL(inst, pha, cell) \
5780 DT_INST_PHA_HAS_CELL_AT_IDX(inst, pha, 0, cell)
5781
5789#define DT_INST_IRQ_HAS_IDX(inst, idx) DT_IRQ_HAS_IDX(DT_DRV_INST(inst), idx)
5790
5799#define DT_INST_IRQ_HAS_CELL_AT_IDX(inst, idx, cell) \
5800 DT_IRQ_HAS_CELL_AT_IDX(DT_DRV_INST(inst), idx, cell)
5801
5809#define DT_INST_IRQ_HAS_CELL(inst, cell) \
5810 DT_INST_IRQ_HAS_CELL_AT_IDX(inst, 0, cell)
5811
5818#define DT_INST_IRQ_HAS_NAME(inst, name) \
5819 DT_IRQ_HAS_NAME(DT_DRV_INST(inst), name)
5820
5824
5826
5838#define DT_ANY_INST_HAS_PROP_STATUS_OKAY_(inst, prop) \
5839 IF_ENABLED(DT_INST_NODE_HAS_PROP(inst, prop), (1,))
5840
5853#define DT_ANY_INST_HAS_BOOL_STATUS_OKAY_(inst, prop) \
5854 IF_ENABLED(DT_INST_PROP(inst, prop), (1,))
5855
5868#define DT_ANY_INST_REG_HAS_NAME_STATUS_OKAY_(inst, name) \
5869 IF_ENABLED(DT_INST_REG_HAS_NAME(inst, name), (1,))
5870
5882#define DT_ALL_INST_HAS_PROP_STATUS_OKAY_(inst, prop) \
5883 IF_DISABLED(DT_INST_NODE_HAS_PROP(inst, prop), (1,))
5884
5897#define DT_ALL_INST_HAS_BOOL_STATUS_OKAY_(inst, prop) \
5898 IF_DISABLED(DT_INST_PROP(inst, prop), (1,))
5899
5912#define DT_ALL_INST_REG_HAS_NAME_STATUS_OKAY_(inst, name) \
5913 IF_DISABLED(DT_INST_REG_HAS_NAME(inst, name), (1,))
5914
5915#define DT_PATH_INTERNAL(...) \
5916 UTIL_CAT(DT_ROOT, MACRO_MAP_CAT(DT_S_PREFIX, __VA_ARGS__))
5922#define DT_S_PREFIX(name) _S_##name
5923
5938#define DT_CAT(a1, a2) a1 ## a2
5940#define DT_CAT3(a1, a2, a3) a1 ## a2 ## a3
5942#define DT_CAT4(a1, a2, a3, a4) a1 ## a2 ## a3 ## a4
5944#define DT_CAT5(a1, a2, a3, a4, a5) a1 ## a2 ## a3 ## a4 ## a5
5946#define DT_CAT6(a1, a2, a3, a4, a5, a6) a1 ## a2 ## a3 ## a4 ## a5 ## a6
5948#define DT_CAT7(a1, a2, a3, a4, a5, a6, a7) \
5949 a1 ## a2 ## a3 ## a4 ## a5 ## a6 ## a7
5951#define DT_CAT8(a1, a2, a3, a4, a5, a6, a7, a8) \
5952 a1 ## a2 ## a3 ## a4 ## a5 ## a6 ## a7 ## a8
5953/*
5954 * If you need to define a bigger DT_CATN(), do so here. Don't leave
5955 * any "holes" of undefined macros, please.
5956 */
5957
5959#define DT_DASH(...) MACRO_MAP_CAT(DT_DASH_PREFIX, __VA_ARGS__)
5961#define DT_DASH_PREFIX(name) _##name
5963#define DT_NODE_HAS_STATUS_INTERNAL(node_id, status) \
5964 IS_ENABLED(DT_CAT3(node_id, _STATUS_, status))
5965
5969#define DT_COMPAT_NODE_HAS_PROP_AND_OR(inst, compat, prop) \
5970 DT_NODE_HAS_PROP(DT_INST(inst, compat), prop) ||
5971
5976#if defined(_LINKER) || defined(_ASMLANGUAGE)
5977#define DT_U32_C(_v) (_v)
5978#else
5979#define DT_U32_C(_v) UINT32_C(_v)
5980#endif
5981
5986#if defined(_LINKER) || defined(_ASMLANGUAGE)
5987#define DT_U64_C(_v) (_v)
5988#else
5989#define DT_U64_C(_v) UINT64_C(_v)
5990#endif
5991
5992/* Helpers for DT_NODELABEL_STRING_ARRAY. We define our own stringify
5993 * in order to avoid adding a dependency on toolchain.h..
5994 */
5995#define DT_NODELABEL_STRING_ARRAY_ENTRY_INTERNAL(nodelabel) DT_STRINGIFY_INTERNAL(nodelabel),
5996#define DT_STRINGIFY_INTERNAL(arg) DT_STRINGIFY_INTERNAL_HELPER(arg)
5997#define DT_STRINGIFY_INTERNAL_HELPER(arg) #arg
5998
6000
6001/* have these last so they have access to all previously defined macros */
6004#include <zephyr/devicetree/gpio.h>
6005#include <zephyr/devicetree/spi.h>
6006#include <zephyr/devicetree/dma.h>
6007#include <zephyr/devicetree/pwms.h>
6011#include <zephyr/devicetree/can.h>
6013#include <zephyr/devicetree/mbox.h>
6017#include <zephyr/devicetree/map.h>
6018#include <zephyr/devicetree/wuc.h>
6021#include <zephyr/devicetree/sram.h>
6022
6023#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.
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.