16#ifndef ZEPHYR_INCLUDE_DEVICETREE_H_
17#define ZEPHYR_INCLUDE_DEVICETREE_H_
19#include <zephyr/devicetree_generated.h>
22#if !defined(_LINKER) && !defined(_ASMLANGUAGE)
83#define DT_INVALID_NODE _
140#define DT_PATH(...) DT_PATH_INTERNAL(__VA_ARGS__)
196#define DT_NODELABEL(label) DT_CAT(DT_N_NODELABEL_, label)
236#define DT_ALIAS(alias) DT_CAT(DT_N_ALIAS_, alias)
243#define DT_HAS_ALIAS(alias_name) DT_NODE_EXISTS(DT_ALIAS(alias_name))
253#define DT_NODE_HASH(node_id) DT_CAT(node_id, _HASH)
349#define DT_INST(inst, compat) UTIL_CAT(DT_N_INST, DT_DASH(inst, compat))
374#define DT_PARENT(node_id) DT_CAT(node_id, _PARENT)
399#define DT_GPARENT(node_id) DT_PARENT(DT_PARENT(node_id))
436#define DT_CHILD(node_id, child) UTIL_CAT(node_id, DT_S_PREFIX(child))
479#define DT_COMPAT_GET_ANY_STATUS_OKAY(compat) \
480 COND_CODE_1(DT_HAS_COMPAT_STATUS_OKAY(compat), \
481 (DT_INST(0, compat)), \
511#define DT_NODE_PATH(node_id) DT_CAT(node_id, _PATH)
537#define DT_NODE_FULL_NAME(node_id) DT_CAT(node_id, _FULL_NAME)
565#define DT_NODE_FULL_NAME_UNQUOTED(node_id) DT_CAT(node_id, _FULL_NAME_UNQUOTED)
593#define DT_NODE_FULL_NAME_TOKEN(node_id) DT_CAT(node_id, _FULL_NAME_TOKEN)
623#define DT_NODE_FULL_NAME_UPPER_TOKEN(node_id) DT_CAT(node_id, _FULL_NAME_UPPER_TOKEN)
651#define DT_NODE_CHILD_IDX(node_id) DT_CAT(node_id, _CHILD_IDX)
659#define DT_CHILD_NUM(node_id) DT_CAT(node_id, _CHILD_NUM)
669#define DT_CHILD_NUM_STATUS_OKAY(node_id) \
670 DT_CAT(node_id, _CHILD_NUM_STATUS_OKAY)
692#define DT_SAME_NODE(node_id1, node_id2) \
693 (DT_DEP_ORD(node_id1) == (DT_DEP_ORD(node_id2)))
719#define DT_NODELABEL_STRING_ARRAY(node_id) \
720 { DT_FOREACH_NODELABEL(node_id, DT_NODELABEL_STRING_ARRAY_ENTRY_INTERNAL) }
762#define DT_PROP(node_id, prop) DT_CAT3(node_id, _P_, prop)
796#define DT_PROP_LEN(node_id, prop) DT_CAT4(node_id, _P_, prop, _LEN)
812#define DT_PROP_LEN_OR(node_id, prop, default_value) \
813 COND_CODE_1(DT_NODE_HAS_PROP(node_id, prop), \
814 (DT_PROP_LEN(node_id, prop)), (default_value))
836#define DT_PROP_HAS_IDX(node_id, prop, idx) \
837 IS_ENABLED(DT_CAT6(node_id, _P_, prop, _IDX_, idx, _EXISTS))
871#define DT_PROP_HAS_NAME(node_id, prop, name) \
872 IS_ENABLED(DT_CAT6(node_id, _P_, prop, _NAME_, name, _EXISTS))
908#define DT_PROP_BY_IDX(node_id, prop, idx) \
909 DT_CAT5(node_id, _P_, prop, _IDX_, idx)
919#define DT_PROP_LAST(node_id, prop) \
920 DT_PROP_BY_IDX(node_id, prop, UTIL_DEC(DT_PROP_LEN(node_id, prop)))
935#define DT_PROP_OR(node_id, prop, default_value) \
936 COND_CODE_1(DT_NODE_HAS_PROP(node_id, prop), \
937 (DT_PROP(node_id, prop)), (default_value))
994#define DT_ENUM_IDX_BY_IDX(node_id, prop, idx) \
995 DT_CAT6(node_id, _P_, prop, _IDX_, idx, _ENUM_IDX)
1003#define DT_ENUM_IDX(node_id, prop) DT_ENUM_IDX_BY_IDX(node_id, prop, 0)
1020#define DT_ENUM_IDX_BY_IDX_OR(node_id, prop, idx, default_idx_value) \
1021 COND_CODE_1(DT_PROP_HAS_IDX(node_id, prop, idx), \
1022 (DT_ENUM_IDX_BY_IDX(node_id, prop, idx)), (default_idx_value))
1032#define DT_ENUM_IDX_OR(node_id, prop, default_idx_value) \
1033 DT_ENUM_IDX_BY_IDX_OR(node_id, prop, 0, default_idx_value)
1044#define DT_ENUM_HAS_VALUE_BY_IDX(node_id, prop, idx, value) \
1045 IS_ENABLED(DT_CAT8(node_id, _P_, prop, _IDX_, idx, _ENUM_VAL_, value, _EXISTS))
1054#define DT_ENUM_HAS_VALUE(node_id, prop, value) \
1055 DT_ENUM_HAS_VALUE_BY_IDX(node_id, prop, 0, value)
1116#define DT_STRING_TOKEN(node_id, prop) \
1117 DT_CAT4(node_id, _P_, prop, _STRING_TOKEN)
1132#define DT_STRING_TOKEN_OR(node_id, prop, default_value) \
1133 COND_CODE_1(DT_NODE_HAS_PROP(node_id, prop), \
1134 (DT_STRING_TOKEN(node_id, prop)), (default_value))
1193#define DT_STRING_UPPER_TOKEN(node_id, prop) \
1194 DT_CAT4(node_id, _P_, prop, _STRING_UPPER_TOKEN)
1210#define DT_STRING_UPPER_TOKEN_OR(node_id, prop, default_value) \
1211 COND_CODE_1(DT_NODE_HAS_PROP(node_id, prop), \
1212 (DT_STRING_UPPER_TOKEN(node_id, prop)), (default_value))
1254#define DT_STRING_UNQUOTED(node_id, prop) \
1255 DT_CAT4(node_id, _P_, prop, _STRING_UNQUOTED)
1271#define DT_STRING_UNQUOTED_OR(node_id, prop, default_value) \
1272 COND_CODE_1(DT_NODE_HAS_PROP(node_id, prop), \
1273 (DT_STRING_UNQUOTED(node_id, prop)), (default_value))
1322#define DT_STRING_TOKEN_BY_IDX(node_id, prop, idx) \
1323 DT_CAT6(node_id, _P_, prop, _IDX_, idx, _STRING_TOKEN)
1372#define DT_STRING_UPPER_TOKEN_BY_IDX(node_id, prop, idx) \
1373 DT_CAT6(node_id, _P_, prop, _IDX_, idx, _STRING_UPPER_TOKEN)
1415#define DT_STRING_UNQUOTED_BY_IDX(node_id, prop, idx) \
1416 DT_CAT6(node_id, _P_, prop, _IDX_, idx, _STRING_UNQUOTED)
1471#define DT_PROP_BY_PHANDLE_IDX(node_id, phs, idx, prop) \
1472 DT_PROP(DT_PHANDLE_BY_IDX(node_id, phs, idx), prop)
1493#define DT_PROP_BY_PHANDLE_IDX_OR(node_id, phs, idx, prop, default_value) \
1494 DT_PROP_OR(DT_PHANDLE_BY_IDX(node_id, phs, idx), prop, default_value)
1507#define DT_PROP_BY_PHANDLE(node_id, ph, prop) \
1508 DT_PROP_BY_PHANDLE_IDX(node_id, ph, 0, prop)
1564#define DT_PHA_BY_IDX(node_id, pha, idx, cell) \
1565 DT_CAT7(node_id, _P_, pha, _IDX_, idx, _VAL_, cell)
1590#define DT_PHA_BY_IDX_OR(node_id, pha, idx, cell, default_value) \
1591 DT_PROP_OR(node_id, DT_CAT5(pha, _IDX_, idx, _VAL_, cell), default_value)
1600#define DT_PHA(node_id, pha, cell) DT_PHA_BY_IDX(node_id, pha, 0, cell)
1616#define DT_PHA_OR(node_id, pha, cell, default_value) \
1617 DT_PHA_BY_IDX_OR(node_id, pha, 0, cell, default_value)
1659#define DT_PHA_BY_NAME(node_id, pha, name, cell) \
1660 DT_CAT7(node_id, _P_, pha, _NAME_, name, _VAL_, cell)
1683#define DT_PHA_BY_NAME_OR(node_id, pha, name, cell, default_value) \
1684 DT_PROP_OR(node_id, DT_CAT5(pha, _NAME_, name, _VAL_, cell), default_value)
1733#define DT_PHANDLE_BY_NAME(node_id, pha, name) \
1734 DT_CAT6(node_id, _P_, pha, _NAME_, name, _PH)
1785#define DT_PHANDLE_BY_IDX(node_id, prop, idx) \
1786 DT_CAT6(node_id, _P_, prop, _IDX_, idx, _PH)
1799#define DT_PHANDLE(node_id, prop) DT_PHANDLE_BY_IDX(node_id, prop, 0)
1847#define DT_NUM_RANGES(node_id) DT_CAT(node_id, _RANGES_NUM)
1901#define DT_RANGES_HAS_IDX(node_id, idx) \
1902 IS_ENABLED(DT_CAT4(node_id, _RANGES_IDX_, idx, _EXISTS))
1956#define DT_RANGES_HAS_CHILD_BUS_FLAGS_AT_IDX(node_id, idx) \
1957 IS_ENABLED(DT_CAT4(node_id, _RANGES_IDX_, idx, _VAL_CHILD_BUS_FLAGS_EXISTS))
1996#define DT_RANGES_CHILD_BUS_FLAGS_BY_IDX(node_id, idx) \
1997 DT_CAT4(node_id, _RANGES_IDX_, idx, _VAL_CHILD_BUS_FLAGS)
2045#define DT_RANGES_CHILD_BUS_ADDRESS_BY_IDX(node_id, idx) \
2046 DT_CAT4(node_id, _RANGES_IDX_, idx, _VAL_CHILD_BUS_ADDRESS)
2094#define DT_RANGES_PARENT_BUS_ADDRESS_BY_IDX(node_id, idx) \
2095 DT_CAT4(node_id, _RANGES_IDX_, idx, _VAL_PARENT_BUS_ADDRESS)
2143#define DT_RANGES_LENGTH_BY_IDX(node_id, idx) \
2144 DT_CAT4(node_id, _RANGES_IDX_, idx, _VAL_LENGTH)
2185#define DT_FOREACH_RANGE(node_id, fn) \
2186 DT_CAT(node_id, _FOREACH_RANGE)(fn)
2233#define DT_NODE_VENDOR_BY_IDX(node_id, idx) \
2234 DT_CAT3(node_id, _COMPAT_VENDOR_IDX_, idx)
2248#define DT_NODE_VENDOR_HAS_IDX(node_id, idx) \
2249 IS_ENABLED(DT_CAT4(node_id, _COMPAT_VENDOR_IDX_, idx, _EXISTS))
2265#define DT_NODE_VENDOR_BY_IDX_OR(node_id, idx, default_value) \
2266 COND_CODE_1(DT_NODE_VENDOR_HAS_IDX(node_id, idx), \
2267 (DT_NODE_VENDOR_BY_IDX(node_id, idx)), (default_value))
2277#define DT_NODE_VENDOR_OR(node_id, default_value) \
2278 DT_NODE_VENDOR_BY_IDX_OR(node_id, 0, default_value)
2309#define DT_NODE_MODEL_BY_IDX(node_id, idx) \
2310 DT_CAT3(node_id, _COMPAT_MODEL_IDX_, idx)
2324#define DT_NODE_MODEL_HAS_IDX(node_id, idx) \
2325 IS_ENABLED(DT_CAT4(node_id, _COMPAT_MODEL_IDX_, idx, _EXISTS))
2341#define DT_NODE_MODEL_BY_IDX_OR(node_id, idx, default_value) \
2342 COND_CODE_1(DT_NODE_MODEL_HAS_IDX(node_id, idx), \
2343 (DT_NODE_MODEL_BY_IDX(node_id, idx)), (default_value))
2353#define DT_NODE_MODEL_OR(node_id, default_value) \
2354 DT_NODE_MODEL_BY_IDX_OR(node_id, 0, default_value)
2373#define DT_NUM_REGS(node_id) DT_CAT(node_id, _REG_NUM)
2386#define DT_REG_HAS_IDX(node_id, idx) \
2387 IS_ENABLED(DT_CAT4(node_id, _REG_IDX_, idx, _EXISTS))
2400#define DT_REG_HAS_NAME(node_id, name) \
2401 IS_ENABLED(DT_CAT4(node_id, _REG_NAME_, name, _EXISTS))
2414#define DT_REG_ADDR_BY_IDX_RAW(node_id, idx) \
2415 DT_CAT4(node_id, _REG_IDX_, idx, _VAL_ADDRESS)
2428#define DT_REG_ADDR_RAW(node_id) \
2429 DT_REG_ADDR_BY_IDX_RAW(node_id, 0)
2437#define DT_REG_ADDR_BY_IDX(node_id, idx) \
2438 DT_U32_C(DT_REG_ADDR_BY_IDX_RAW(node_id, idx))
2451#define DT_REG_SIZE_BY_IDX(node_id, idx) \
2452 DT_U32_C(DT_CAT4(node_id, _REG_IDX_, idx, _VAL_SIZE))
2461#define DT_REG_ADDR(node_id) DT_REG_ADDR_BY_IDX(node_id, 0)
2473#define DT_REG_ADDR_U64(node_id) DT_U64_C(DT_REG_ADDR_BY_IDX_RAW(node_id, 0))
2482#define DT_REG_SIZE(node_id) DT_REG_SIZE_BY_IDX(node_id, 0)
2490#define DT_REG_ADDR_BY_NAME(node_id, name) \
2491 DT_U32_C(DT_CAT4(node_id, _REG_NAME_, name, _VAL_ADDRESS))
2501#define DT_REG_ADDR_BY_NAME_OR(node_id, name, default_value) \
2502 COND_CODE_1(DT_REG_HAS_NAME(node_id, name), \
2503 (DT_REG_ADDR_BY_NAME(node_id, name)), (default_value))
2517#define DT_REG_ADDR_BY_NAME_U64(node_id, name) \
2518 DT_U64_C(DT_CAT4(node_id, _REG_NAME_, name, _VAL_ADDRESS))
2526#define DT_REG_SIZE_BY_NAME(node_id, name) \
2527 DT_U32_C(DT_CAT4(node_id, _REG_NAME_, name, _VAL_SIZE))
2537#define DT_REG_SIZE_BY_NAME_OR(node_id, name, default_value) \
2538 COND_CODE_1(DT_REG_HAS_NAME(node_id, name), \
2539 (DT_REG_SIZE_BY_NAME(node_id, name)), (default_value))
2560#define DT_NUM_IRQS(node_id) DT_CAT(node_id, _IRQ_NUM)
2586#define DT_NUM_NODELABELS(node_id) DT_CAT(node_id, _NODELABEL_NUM)
2594#define DT_IRQ_LEVEL(node_id) DT_CAT(node_id, _IRQ_LEVEL)
2606#define DT_IRQ_HAS_IDX(node_id, idx) \
2607 IS_ENABLED(DT_CAT4(node_id, _IRQ_IDX_, idx, _EXISTS))
2619#define DT_IRQ_HAS_CELL_AT_IDX(node_id, idx, cell) \
2620 IS_ENABLED(DT_CAT6(node_id, _IRQ_IDX_, idx, _VAL_, cell, _EXISTS))
2629#define DT_IRQ_HAS_CELL(node_id, cell) DT_IRQ_HAS_CELL_AT_IDX(node_id, 0, cell)
2640#define DT_IRQ_HAS_NAME(node_id, name) \
2641 IS_ENABLED(DT_CAT4(node_id, _IRQ_NAME_, name, _VAL_irq_EXISTS))
2678#define DT_IRQ_BY_IDX(node_id, idx, cell) \
2679 DT_CAT5(node_id, _IRQ_IDX_, idx, _VAL_, cell)
2696#define DT_IRQ_BY_NAME(node_id, name, cell) \
2697 DT_CAT5(node_id, _IRQ_NAME_, name, _VAL_, cell)
2706#define DT_IRQ(node_id, cell) DT_IRQ_BY_IDX(node_id, 0, cell)
2750#define DT_IRQ_INTC_BY_IDX(node_id, idx) \
2751 DT_CAT4(node_id, _IRQ_IDX_, idx, _CONTROLLER)
2797#define DT_IRQ_INTC_BY_NAME(node_id, name) \
2798 DT_CAT4(node_id, _IRQ_NAME_, name, _CONTROLLER)
2839#define DT_IRQ_INTC(node_id) \
2840 DT_IRQ_INTC_BY_IDX(node_id, 0)
2847#define DT_IRQN_L1_INTERNAL(node_id, idx) DT_IRQ_BY_IDX(node_id, idx, irq)
2849#define DT_IRQN_L2_INTERNAL(node_id, idx) \
2850 (IRQ_TO_L2(DT_IRQN_L1_INTERNAL(node_id, idx)) | \
2851 DT_IRQ(DT_IRQ_INTC_BY_IDX(node_id, idx), irq))
2853#define DT_IRQN_L3_INTERNAL(node_id, idx) \
2854 (IRQ_TO_L3(DT_IRQN_L1_INTERNAL(node_id, idx)) | \
2855 IRQ_TO_L2(DT_IRQ(DT_IRQ_INTC_BY_IDX(node_id, idx), irq)) | \
2856 DT_IRQ(DT_IRQ_INTC(DT_IRQ_INTC_BY_IDX(node_id, idx)), irq))
2858#define DT_IRQN_LVL_INTERNAL(node_id, idx, level) DT_CAT3(DT_IRQN_L, level, _INTERNAL)(node_id, idx)
2864#define DT_MULTI_LEVEL_IRQN_INTERNAL(node_id, idx) \
2865 DT_IRQN_LVL_INTERNAL(node_id, idx, DT_IRQ_LEVEL(node_id))
2879#define DT_IRQN_BY_IDX(node_id, idx) \
2880 COND_CODE_1(IS_ENABLED(CONFIG_MULTI_LEVEL_INTERRUPTS), \
2881 (DT_MULTI_LEVEL_IRQN_INTERNAL(node_id, idx)), \
2882 (DT_IRQ_BY_IDX(node_id, idx, irq)))
2894#define DT_IRQN(node_id) DT_IRQN_BY_IDX(node_id, 0)
2914#define DT_CHOSEN(prop) DT_CAT(DT_CHOSEN_, prop)
2922#define DT_HAS_CHOSEN(prop) IS_ENABLED(DT_CAT3(DT_CHOSEN_, prop, _EXISTS))
2973#define DT_FOREACH_NODE(fn) DT_FOREACH_HELPER(fn)
2987#define DT_FOREACH_NODE_VARGS(fn, ...) DT_FOREACH_VARGS_HELPER(fn, __VA_ARGS__)
3000#define DT_FOREACH_STATUS_OKAY_NODE(fn) DT_FOREACH_OKAY_HELPER(fn)
3016#define DT_FOREACH_STATUS_OKAY_NODE_VARGS(fn, ...) DT_FOREACH_OKAY_VARGS_HELPER(fn, __VA_ARGS__)
3064#define DT_FOREACH_ANCESTOR(node_id, fn) \
3065 DT_CAT(node_id, _FOREACH_ANCESTOR)(fn)
3110#define DT_FOREACH_CHILD(node_id, fn) \
3111 DT_CAT(node_id, _FOREACH_CHILD)(fn)
3153#define DT_FOREACH_CHILD_SEP(node_id, fn, sep) \
3154 DT_CAT(node_id, _FOREACH_CHILD_SEP)(fn, sep)
3171#define DT_FOREACH_CHILD_VARGS(node_id, fn, ...) \
3172 DT_CAT(node_id, _FOREACH_CHILD_VARGS)(fn, __VA_ARGS__)
3189#define DT_FOREACH_CHILD_SEP_VARGS(node_id, fn, sep, ...) \
3190 DT_CAT(node_id, _FOREACH_CHILD_SEP_VARGS)(fn, sep, __VA_ARGS__)
3207#define DT_FOREACH_CHILD_STATUS_OKAY(node_id, fn) \
3208 DT_CAT(node_id, _FOREACH_CHILD_STATUS_OKAY)(fn)
3226#define DT_FOREACH_CHILD_STATUS_OKAY_SEP(node_id, fn, sep) \
3227 DT_CAT(node_id, _FOREACH_CHILD_STATUS_OKAY_SEP)(fn, sep)
3248#define DT_FOREACH_CHILD_STATUS_OKAY_VARGS(node_id, fn, ...) \
3249 DT_CAT(node_id, _FOREACH_CHILD_STATUS_OKAY_VARGS)(fn, __VA_ARGS__)
3269#define DT_FOREACH_CHILD_STATUS_OKAY_SEP_VARGS(node_id, fn, sep, ...) \
3270 DT_CAT(node_id, _FOREACH_CHILD_STATUS_OKAY_SEP_VARGS)(fn, sep, __VA_ARGS__)
3322#define DT_FOREACH_PROP_ELEM(node_id, prop, fn) \
3323 DT_CAT4(node_id, _P_, prop, _FOREACH_PROP_ELEM)(fn)
3367#define DT_FOREACH_PROP_ELEM_SEP(node_id, prop, fn, sep) \
3368 DT_CAT4(node_id, _P_, prop, _FOREACH_PROP_ELEM_SEP)(fn, sep)
3390#define DT_FOREACH_PROP_ELEM_VARGS(node_id, prop, fn, ...) \
3391 DT_CAT4(node_id, _P_, prop, _FOREACH_PROP_ELEM_VARGS)(fn, __VA_ARGS__)
3409#define DT_FOREACH_PROP_ELEM_SEP_VARGS(node_id, prop, fn, sep, ...) \
3410 DT_CAT4(node_id, _P_, prop, _FOREACH_PROP_ELEM_SEP_VARGS)( \
3411 fn, sep, __VA_ARGS__)
3466#define DT_FOREACH_STATUS_OKAY(compat, fn) \
3467 COND_CODE_1(DT_HAS_COMPAT_STATUS_OKAY(compat), \
3468 (UTIL_CAT(DT_FOREACH_OKAY_, compat)(fn)), \
3515#define DT_FOREACH_STATUS_OKAY_VARGS(compat, fn, ...) \
3516 COND_CODE_1(DT_HAS_COMPAT_STATUS_OKAY(compat), \
3517 (DT_CAT(DT_FOREACH_OKAY_VARGS_, \
3518 compat)(fn, __VA_ARGS__)), \
3533#define DT_COMPAT_FOREACH_STATUS_OKAY_VARGS(compat, fn, ...) \
3534 COND_CODE_1(DT_HAS_COMPAT_STATUS_OKAY(compat), \
3535 (UTIL_CAT(DT_FOREACH_OKAY_INST_VARGS_, \
3536 compat)(fn, compat, __VA_ARGS__)), \
3578#define DT_FOREACH_NODELABEL(node_id, fn) DT_CAT(node_id, _FOREACH_NODELABEL)(fn)
3617#define DT_FOREACH_NODELABEL_VARGS(node_id, fn, ...) \
3618 DT_CAT(node_id, _FOREACH_NODELABEL_VARGS)(fn, __VA_ARGS__)
3644#define DT_NODE_EXISTS(node_id) IS_ENABLED(DT_CAT(node_id, _EXISTS))
3667#define DT_NODE_HAS_STATUS(node_id, status) \
3668 DT_NODE_HAS_STATUS_INTERNAL(node_id, status)
3690#define DT_NODE_HAS_STATUS_OKAY(node_id) DT_NODE_HAS_STATUS(node_id, okay)
3711#define DT_HAS_COMPAT_STATUS_OKAY(compat) \
3712 IS_ENABLED(DT_CAT(DT_COMPAT_HAS_OKAY_, compat))
3720#define DT_NUM_INST_STATUS_OKAY(compat) \
3721 UTIL_AND(DT_HAS_COMPAT_STATUS_OKAY(compat), \
3722 UTIL_CAT(DT_N_INST, DT_DASH(compat, NUM_OKAY)))
3751#define DT_NODE_HAS_COMPAT(node_id, compat) \
3752 IS_ENABLED(DT_CAT3(node_id, _COMPAT_MATCHES_, compat))
3768#define DT_NODE_HAS_COMPAT_STATUS(node_id, compat, status) \
3769 UTIL_AND(DT_NODE_HAS_COMPAT(node_id, compat), DT_NODE_HAS_STATUS(node_id, status))
3784#define DT_NODE_HAS_PROP(node_id, prop) \
3785 IS_ENABLED(DT_CAT4(node_id, _P_, prop, _EXISTS))
3804#define DT_PHA_HAS_CELL_AT_IDX(node_id, pha, idx, cell) \
3805 IS_ENABLED(DT_CAT8(node_id, _P_, pha, \
3806 _IDX_, idx, _VAL_, cell, _EXISTS))
3817#define DT_PHA_HAS_CELL(node_id, pha, cell) \
3818 DT_PHA_HAS_CELL_AT_IDX(node_id, pha, 0, cell)
3861#define DT_BUS(node_id) DT_CAT(node_id, _BUS)
3891#define DT_ON_BUS(node_id, bus) IS_ENABLED(DT_CAT3(node_id, _BUS_, bus))
3909#define DT_DRV_INST(inst) DT_INST(inst, DT_DRV_COMPAT)
3918#define DT_INST_PARENT(inst) DT_PARENT(DT_DRV_INST(inst))
3927#define DT_INST_GPARENT(inst) DT_GPARENT(DT_DRV_INST(inst))
3938#define DT_INST_CHILD(inst, child) \
3939 DT_CHILD(DT_DRV_INST(inst), child)
3950#define DT_INST_CHILD_NUM(inst) DT_CHILD_NUM(DT_DRV_INST(inst))
3961#define DT_INST_CHILD_NUM_STATUS_OKAY(inst) \
3962 DT_CHILD_NUM_STATUS_OKAY(DT_DRV_INST(inst))
3972#define DT_INST_NODELABEL_STRING_ARRAY(inst) DT_NODELABEL_STRING_ARRAY(DT_DRV_INST(inst))
3982#define DT_INST_NUM_NODELABELS(inst) DT_NUM_NODELABELS(DT_DRV_INST(inst))
3998#define DT_INST_FOREACH_CHILD(inst, fn) \
3999 DT_FOREACH_CHILD(DT_DRV_INST(inst), fn)
4014#define DT_INST_FOREACH_CHILD_SEP(inst, fn, sep) \
4015 DT_FOREACH_CHILD_SEP(DT_DRV_INST(inst), fn, sep)
4032#define DT_INST_FOREACH_CHILD_VARGS(inst, fn, ...) \
4033 DT_FOREACH_CHILD_VARGS(DT_DRV_INST(inst), fn, __VA_ARGS__)
4049#define DT_INST_FOREACH_CHILD_SEP_VARGS(inst, fn, sep, ...) \
4050 DT_FOREACH_CHILD_SEP_VARGS(DT_DRV_INST(inst), fn, sep, __VA_ARGS__)
4063#define DT_INST_FOREACH_CHILD_STATUS_OKAY(inst, fn) \
4064 DT_FOREACH_CHILD_STATUS_OKAY(DT_DRV_INST(inst), fn)
4080#define DT_INST_FOREACH_CHILD_STATUS_OKAY_SEP(inst, fn, sep) \
4081 DT_FOREACH_CHILD_STATUS_OKAY_SEP(DT_DRV_INST(inst), fn, sep)
4096#define DT_INST_FOREACH_CHILD_STATUS_OKAY_VARGS(inst, fn, ...) \
4097 DT_FOREACH_CHILD_STATUS_OKAY_VARGS(DT_DRV_INST(inst), fn, __VA_ARGS__)
4114#define DT_INST_FOREACH_CHILD_STATUS_OKAY_SEP_VARGS(inst, fn, sep, ...) \
4115 DT_FOREACH_CHILD_STATUS_OKAY_SEP_VARGS(DT_DRV_INST(inst), fn, sep, __VA_ARGS__)
4124#define DT_INST_ENUM_IDX_BY_IDX(inst, prop, idx) \
4125 DT_ENUM_IDX_BY_IDX(DT_DRV_INST(inst), prop, idx)
4133#define DT_INST_ENUM_IDX(inst, prop) \
4134 DT_ENUM_IDX(DT_DRV_INST(inst), prop)
4145#define DT_INST_ENUM_IDX_BY_IDX_OR(inst, prop, idx, default_idx_value) \
4146 DT_ENUM_IDX_BY_IDX_OR(DT_DRV_INST(inst), prop, idx, default_idx_value)
4156#define DT_INST_ENUM_IDX_OR(inst, prop, default_idx_value) \
4157 DT_ENUM_IDX_OR(DT_DRV_INST(inst), prop, default_idx_value)
4167#define DT_INST_ENUM_HAS_VALUE_BY_IDX(inst, prop, idx, value) \
4168 DT_ENUM_HAS_VALUE_BY_IDX(DT_DRV_INST(inst), prop, idx, value)
4178#define DT_INST_ENUM_HAS_VALUE(inst, prop, value) \
4179 DT_ENUM_HAS_VALUE(DT_DRV_INST(inst), prop, value)
4187#define DT_INST_PROP(inst, prop) DT_PROP(DT_DRV_INST(inst), prop)
4195#define DT_INST_PROP_LEN(inst, prop) DT_PROP_LEN(DT_DRV_INST(inst), prop)
4206#define DT_INST_PROP_HAS_IDX(inst, prop, idx) \
4207 DT_PROP_HAS_IDX(DT_DRV_INST(inst), prop, idx)
4217#define DT_INST_PROP_HAS_NAME(inst, prop, name) \
4218 DT_PROP_HAS_NAME(DT_DRV_INST(inst), prop, name)
4227#define DT_INST_PROP_BY_IDX(inst, prop, idx) \
4228 DT_PROP_BY_IDX(DT_DRV_INST(inst), prop, idx)
4237#define DT_INST_PROP_OR(inst, prop, default_value) \
4238 DT_PROP_OR(DT_DRV_INST(inst), prop, default_value)
4247#define DT_INST_PROP_LEN_OR(inst, prop, default_value) \
4248 DT_PROP_LEN_OR(DT_DRV_INST(inst), prop, default_value)
4259#define DT_INST_STRING_TOKEN(inst, prop) \
4260 DT_STRING_TOKEN(DT_DRV_INST(inst), prop)
4269#define DT_INST_STRING_UPPER_TOKEN(inst, prop) \
4270 DT_STRING_UPPER_TOKEN(DT_DRV_INST(inst), prop)
4280#define DT_INST_STRING_UNQUOTED(inst, prop) \
4281 DT_STRING_UNQUOTED(DT_DRV_INST(inst), prop)
4290#define DT_INST_STRING_TOKEN_BY_IDX(inst, prop, idx) \
4291 DT_STRING_TOKEN_BY_IDX(DT_DRV_INST(inst), prop, idx)
4300#define DT_INST_STRING_UPPER_TOKEN_BY_IDX(inst, prop, idx) \
4301 DT_STRING_UPPER_TOKEN_BY_IDX(DT_DRV_INST(inst), prop, idx)
4310#define DT_INST_STRING_UNQUOTED_BY_IDX(inst, prop, idx) \
4311 DT_STRING_UNQUOTED_BY_IDX(DT_DRV_INST(inst), prop, idx)
4321#define DT_INST_PROP_BY_PHANDLE(inst, ph, prop) \
4322 DT_INST_PROP_BY_PHANDLE_IDX(inst, ph, 0, prop)
4335#define DT_INST_PROP_BY_PHANDLE_IDX(inst, phs, idx, prop) \
4336 DT_PROP_BY_PHANDLE_IDX(DT_DRV_INST(inst), phs, idx, prop)
4346#define DT_INST_PHA_BY_IDX(inst, pha, idx, cell) \
4347 DT_PHA_BY_IDX(DT_DRV_INST(inst), pha, idx, cell)
4358#define DT_INST_PHA_BY_IDX_OR(inst, pha, idx, cell, default_value) \
4359 DT_PHA_BY_IDX_OR(DT_DRV_INST(inst), pha, idx, cell, default_value)
4369#define DT_INST_PHA(inst, pha, cell) DT_INST_PHA_BY_IDX(inst, pha, 0, cell)
4379#define DT_INST_PHA_OR(inst, pha, cell, default_value) \
4380 DT_INST_PHA_BY_IDX_OR(inst, pha, 0, cell, default_value)
4391#define DT_INST_PHA_BY_NAME(inst, pha, name, cell) \
4392 DT_PHA_BY_NAME(DT_DRV_INST(inst), pha, name, cell)
4403#define DT_INST_PHA_BY_NAME_OR(inst, pha, name, cell, default_value) \
4404 DT_PHA_BY_NAME_OR(DT_DRV_INST(inst), pha, name, cell, default_value)
4414#define DT_INST_PHANDLE_BY_NAME(inst, pha, name) \
4415 DT_PHANDLE_BY_NAME(DT_DRV_INST(inst), pha, name) \
4426#define DT_INST_PHANDLE_BY_IDX(inst, prop, idx) \
4427 DT_PHANDLE_BY_IDX(DT_DRV_INST(inst), prop, idx)
4437#define DT_INST_PHANDLE(inst, prop) DT_INST_PHANDLE_BY_IDX(inst, prop, 0)
4446#define DT_INST_REG_HAS_IDX(inst, idx) DT_REG_HAS_IDX(DT_DRV_INST(inst), idx)
4455#define DT_INST_REG_HAS_NAME(inst, name) DT_REG_HAS_NAME(DT_DRV_INST(inst), name)
4463#define DT_INST_REG_ADDR_BY_IDX_RAW(inst, idx) DT_REG_ADDR_BY_IDX_RAW(DT_DRV_INST(inst), idx)
4471#define DT_INST_REG_ADDR_BY_IDX(inst, idx) DT_REG_ADDR_BY_IDX(DT_DRV_INST(inst), idx)
4479#define DT_INST_REG_SIZE_BY_IDX(inst, idx) \
4480 DT_REG_SIZE_BY_IDX(DT_DRV_INST(inst), idx)
4488#define DT_INST_REG_ADDR_BY_NAME(inst, name) \
4489 DT_REG_ADDR_BY_NAME(DT_DRV_INST(inst), name)
4499#define DT_INST_REG_ADDR_BY_NAME_OR(inst, name, default_value) \
4500 DT_REG_ADDR_BY_NAME_OR(DT_DRV_INST(inst), name, default_value)
4514#define DT_INST_REG_ADDR_BY_NAME_U64(inst, name) \
4515 DT_REG_ADDR_BY_NAME_U64(DT_DRV_INST(inst), name)
4523#define DT_INST_REG_SIZE_BY_NAME(inst, name) \
4524 DT_REG_SIZE_BY_NAME(DT_DRV_INST(inst), name)
4534#define DT_INST_REG_SIZE_BY_NAME_OR(inst, name, default_value) \
4535 DT_REG_SIZE_BY_NAME_OR(DT_DRV_INST(inst), name, default_value)
4542#define DT_INST_REG_ADDR_RAW(inst) DT_INST_REG_ADDR_BY_IDX_RAW(inst, 0)
4549#define DT_INST_REG_ADDR(inst) DT_INST_REG_ADDR_BY_IDX(inst, 0)
4562#define DT_INST_REG_ADDR_U64(inst) DT_REG_ADDR_U64(DT_DRV_INST(inst))
4569#define DT_INST_REG_SIZE(inst) DT_INST_REG_SIZE_BY_IDX(inst, 0)
4577#define DT_INST_NUM_IRQS(inst) DT_NUM_IRQS(DT_DRV_INST(inst))
4585#define DT_INST_IRQ_LEVEL(inst) DT_IRQ_LEVEL(DT_DRV_INST(inst))
4594#define DT_INST_IRQ_BY_IDX(inst, idx, cell) \
4595 DT_IRQ_BY_IDX(DT_DRV_INST(inst), idx, cell)
4603#define DT_INST_IRQ_INTC_BY_IDX(inst, idx) \
4604 DT_IRQ_INTC_BY_IDX(DT_DRV_INST(inst), idx)
4612#define DT_INST_IRQ_INTC_BY_NAME(inst, name) \
4613 DT_IRQ_INTC_BY_NAME(DT_DRV_INST(inst), name)
4622#define DT_INST_IRQ_INTC(inst) \
4623 DT_INST_IRQ_INTC_BY_IDX(inst, 0)
4632#define DT_INST_IRQ_BY_NAME(inst, name, cell) \
4633 DT_IRQ_BY_NAME(DT_DRV_INST(inst), name, cell)
4641#define DT_INST_IRQ(inst, cell) DT_INST_IRQ_BY_IDX(inst, 0, cell)
4648#define DT_INST_IRQN(inst) DT_IRQN(DT_DRV_INST(inst))
4656#define DT_INST_IRQN_BY_IDX(inst, idx) DT_IRQN_BY_IDX(DT_DRV_INST(inst), idx)
4663#define DT_INST_BUS(inst) DT_BUS(DT_DRV_INST(inst))
4672#define DT_INST_ON_BUS(inst, bus) DT_ON_BUS(DT_DRV_INST(inst), bus)
4683#define DT_INST_STRING_TOKEN_OR(inst, name, default_value) \
4684 DT_STRING_TOKEN_OR(DT_DRV_INST(inst), name, default_value)
4694#define DT_INST_STRING_UPPER_TOKEN_OR(inst, name, default_value) \
4695 DT_STRING_UPPER_TOKEN_OR(DT_DRV_INST(inst), name, default_value)
4705#define DT_INST_STRING_UNQUOTED_OR(inst, name, default_value) \
4706 DT_STRING_UNQUOTED_OR(DT_DRV_INST(inst), name, default_value)
4738#define DT_HAS_COMPAT_ON_BUS_STATUS_OKAY(compat, bus) \
4739 IS_ENABLED(DT_CAT4(DT_COMPAT_, compat, _BUS_, bus))
4773#define DT_ANY_INST_ON_BUS_STATUS_OKAY(bus) \
4774 DT_HAS_COMPAT_ON_BUS_STATUS_OKAY(DT_DRV_COMPAT, bus)
4820#define DT_ANY_INST_HAS_PROP_STATUS_OKAY(prop) \
4821 COND_CODE_1(IS_EMPTY(DT_ANY_INST_HAS_PROP_STATUS_OKAY_(prop)), (0), (1))
4867#define DT_ANY_COMPAT_HAS_PROP_STATUS_OKAY(compat, prop) \
4868 (DT_COMPAT_FOREACH_STATUS_OKAY_VARGS(compat, DT_COMPAT_NODE_HAS_PROP_AND_OR, prop) 0)
4917#define DT_ANY_INST_HAS_BOOL_STATUS_OKAY(prop) \
4918 COND_CODE_1(IS_EMPTY(DT_ANY_INST_HAS_BOOL_STATUS_OKAY_(prop)), (0), (1))
4985#define DT_INST_FOREACH_STATUS_OKAY(fn) \
4986 COND_CODE_1(DT_HAS_COMPAT_STATUS_OKAY(DT_DRV_COMPAT), \
4987 (UTIL_CAT(DT_FOREACH_OKAY_INST_, \
4988 DT_DRV_COMPAT)(fn)), \
5003#define DT_INST_FOREACH_STATUS_OKAY_VARGS(fn, ...) \
5004 COND_CODE_1(DT_HAS_COMPAT_STATUS_OKAY(DT_DRV_COMPAT), \
5005 (UTIL_CAT(DT_FOREACH_OKAY_INST_VARGS_, \
5006 DT_DRV_COMPAT)(fn, __VA_ARGS__)), \
5018#define DT_INST_FOREACH_NODELABEL(inst, fn) \
5019 DT_FOREACH_NODELABEL(DT_DRV_INST(inst), fn)
5032#define DT_INST_FOREACH_NODELABEL_VARGS(inst, fn, ...) \
5033 DT_FOREACH_NODELABEL_VARGS(DT_DRV_INST(inst), fn, __VA_ARGS__)
5045#define DT_INST_FOREACH_PROP_ELEM(inst, prop, fn) \
5046 DT_FOREACH_PROP_ELEM(DT_DRV_INST(inst), prop, fn)
5060#define DT_INST_FOREACH_PROP_ELEM_SEP(inst, prop, fn, sep) \
5061 DT_FOREACH_PROP_ELEM_SEP(DT_DRV_INST(inst), prop, fn, sep)
5077#define DT_INST_FOREACH_PROP_ELEM_VARGS(inst, prop, fn, ...) \
5078 DT_FOREACH_PROP_ELEM_VARGS(DT_DRV_INST(inst), prop, fn, __VA_ARGS__)
5097#define DT_INST_FOREACH_PROP_ELEM_SEP_VARGS(inst, prop, fn, sep, ...) \
5098 DT_FOREACH_PROP_ELEM_SEP_VARGS(DT_DRV_INST(inst), prop, fn, sep, \
5107#define DT_INST_NODE_HAS_PROP(inst, prop) \
5108 DT_NODE_HAS_PROP(DT_DRV_INST(inst), prop)
5116#define DT_INST_NODE_HAS_COMPAT(inst, compat) \
5117 DT_NODE_HAS_COMPAT(DT_DRV_INST(inst), compat)
5129#define DT_INST_PHA_HAS_CELL_AT_IDX(inst, pha, idx, cell) \
5130 DT_PHA_HAS_CELL_AT_IDX(DT_DRV_INST(inst), pha, idx, cell)
5141#define DT_INST_PHA_HAS_CELL(inst, pha, cell) \
5142 DT_INST_PHA_HAS_CELL_AT_IDX(inst, pha, 0, cell)
5151#define DT_INST_IRQ_HAS_IDX(inst, idx) DT_IRQ_HAS_IDX(DT_DRV_INST(inst), idx)
5161#define DT_INST_IRQ_HAS_CELL_AT_IDX(inst, idx, cell) \
5162 DT_IRQ_HAS_CELL_AT_IDX(DT_DRV_INST(inst), idx, cell)
5171#define DT_INST_IRQ_HAS_CELL(inst, cell) \
5172 DT_INST_IRQ_HAS_CELL_AT_IDX(inst, 0, cell)
5180#define DT_INST_IRQ_HAS_NAME(inst, name) \
5181 DT_IRQ_HAS_NAME(DT_DRV_INST(inst), name)
5200#define DT_ANY_INST_HAS_PROP_STATUS_OKAY__(idx, prop) \
5201 COND_CODE_1(DT_INST_NODE_HAS_PROP(idx, prop), (1,), ())
5214#define DT_ANY_INST_HAS_PROP_STATUS_OKAY_(prop) \
5215 DT_INST_FOREACH_STATUS_OKAY_VARGS(DT_ANY_INST_HAS_PROP_STATUS_OKAY__, prop)
5229#define DT_ANY_INST_HAS_BOOL_STATUS_OKAY__(idx, prop) \
5230 COND_CODE_1(DT_INST_PROP(idx, prop), (1,), ())
5243#define DT_ANY_INST_HAS_BOOL_STATUS_OKAY_(prop) \
5244 DT_INST_FOREACH_STATUS_OKAY_VARGS(DT_ANY_INST_HAS_BOOL_STATUS_OKAY__, prop)
5246#define DT_PATH_INTERNAL(...) \
5247 UTIL_CAT(DT_ROOT, MACRO_MAP_CAT(DT_S_PREFIX, __VA_ARGS__))
5253#define DT_S_PREFIX(name) _S_##name
5269#define DT_CAT(a1, a2) a1 ## a2
5271#define DT_CAT3(a1, a2, a3) a1 ## a2 ## a3
5273#define DT_CAT4(a1, a2, a3, a4) a1 ## a2 ## a3 ## a4
5275#define DT_CAT5(a1, a2, a3, a4, a5) a1 ## a2 ## a3 ## a4 ## a5
5277#define DT_CAT6(a1, a2, a3, a4, a5, a6) a1 ## a2 ## a3 ## a4 ## a5 ## a6
5279#define DT_CAT7(a1, a2, a3, a4, a5, a6, a7) \
5280 a1 ## a2 ## a3 ## a4 ## a5 ## a6 ## a7
5282#define DT_CAT8(a1, a2, a3, a4, a5, a6, a7, a8) \
5283 a1 ## a2 ## a3 ## a4 ## a5 ## a6 ## a7 ## a8
5290#define DT_DASH(...) MACRO_MAP_CAT(DT_DASH_PREFIX, __VA_ARGS__)
5292#define DT_DASH_PREFIX(name) _##name
5294#define DT_NODE_HAS_STATUS_INTERNAL(node_id, status) \
5295 IS_ENABLED(DT_CAT3(node_id, _STATUS_, status))
5300#define DT_COMPAT_NODE_HAS_PROP_AND_OR(inst, compat, prop) \
5301 DT_NODE_HAS_PROP(DT_INST(inst, compat), prop) ||
5307#if defined(_LINKER) || defined(_ASMLANGUAGE)
5308#define DT_U32_C(_v) (_v)
5310#define DT_U32_C(_v) UINT32_C(_v)
5317#if defined(_LINKER) || defined(_ASMLANGUAGE)
5318#define DT_U64_C(_v) (_v)
5320#define DT_U64_C(_v) UINT64_C(_v)
5326#define DT_NODELABEL_STRING_ARRAY_ENTRY_INTERNAL(nodelabel) DT_STRINGIFY_INTERNAL(nodelabel),
5327#define DT_STRINGIFY_INTERNAL(arg) DT_STRINGIFY_INTERNAL_HELPER(arg)
5328#define DT_STRINGIFY_INTERNAL_HELPER(arg) #arg
Clocks Devicetree macro public API header file.
CAN devicetree macro public API header file.
DMA Devicetree macro public API header file.
GPIO Devicetree macro public API header file.
MBOX Devicetree macro public API header file.
Devicetree pin control helpers.
Reset Controller Devicetree macro public API header file.
SPI Devicetree macro public API header file.
Flash Devicetree macro public API header file.
IO channels devicetree macro public API header file.
Public interface for multi-level interrupts.
Devicetree node dependency ordinals.
Port / Endpoint Devicetree macro public API header file.
PWMs Devicetree macro public API header file.