19#include <devicetree_unfixed.h>
20#include <devicetree_fixups.h>
76#define DT_INVALID_NODE _
129#define DT_PATH(...) DT_PATH_INTERNAL(__VA_ARGS__)
177#define DT_NODELABEL(label) DT_CAT(DT_N_NODELABEL_, label)
213#define DT_ALIAS(alias) DT_CAT(DT_N_ALIAS_, alias)
305#define DT_INST(inst, compat) UTIL_CAT(DT_N_INST, DT_DASH(inst, compat))
326#define DT_PARENT(node_id) UTIL_CAT(node_id, _PARENT)
333#define DT_INST_PARENT(inst) DT_PARENT(DT_DRV_INST(inst))
354#define DT_GPARENT(node_id) DT_PARENT(DT_PARENT(node_id))
387#define DT_CHILD(node_id, child) UTIL_CAT(node_id, DT_S_PREFIX(child))
425#define DT_COMPAT_GET_ANY_STATUS_OKAY(compat) \
426 COND_CODE_1(DT_HAS_COMPAT_STATUS_OKAY(compat), \
427 (DT_INST(0, compat)), \
453#define DT_NODE_PATH(node_id) DT_CAT(node_id, _PATH)
475#define DT_NODE_FULL_NAME(node_id) DT_CAT(node_id, _FULL_NAME)
499#define DT_NODE_CHILD_IDX(node_id) DT_CAT(node_id, _CHILD_IDX)
516#define DT_SAME_NODE(node_id1, node_id2) \
517 (DT_DEP_ORD(node_id1) == (DT_DEP_ORD(node_id2)))
562#define DT_PROP(node_id, prop) DT_CAT(node_id, _P_##prop)
592#define DT_PROP_LEN(node_id, prop) DT_PROP(node_id, prop##_LEN)
608#define DT_PROP_LEN_OR(node_id, prop, default_value) \
609 COND_CODE_1(DT_NODE_HAS_PROP(node_id, prop), \
610 (DT_PROP_LEN(node_id, prop)), (default_value))
632#define DT_PROP_HAS_IDX(node_id, prop, idx) \
633 IS_ENABLED(DT_CAT6(node_id, _P_, prop, _IDX_, idx, _EXISTS))
663#define DT_PROP_HAS_NAME(node_id, prop, name) \
664 IS_ENABLED(DT_CAT6(node_id, _P_, prop, _NAME_, name, _EXISTS))
688#define DT_PROP_BY_IDX(node_id, prop, idx) DT_PROP(node_id, prop##_IDX_##idx)
703#define DT_PROP_OR(node_id, prop, default_value) \
704 COND_CODE_1(DT_NODE_HAS_PROP(node_id, prop), \
705 (DT_PROP(node_id, prop)), (default_value))
715#define DT_LABEL(node_id) DT_PROP(node_id, label)
751#define DT_ENUM_IDX(node_id, prop) DT_PROP(node_id, prop##_ENUM_IDX)
767#define DT_ENUM_IDX_OR(node_id, prop, default_idx_value) \
768 COND_CODE_1(DT_NODE_HAS_PROP(node_id, prop), \
769 (DT_ENUM_IDX(node_id, prop)), (default_idx_value))
823#define DT_STRING_TOKEN(node_id, prop) \
824 DT_CAT4(node_id, _P_, prop, _STRING_TOKEN)
839#define DT_STRING_TOKEN_OR(node_id, prop, default_value) \
840 COND_CODE_1(DT_NODE_HAS_PROP(node_id, prop), \
841 (DT_STRING_TOKEN(node_id, prop)), (default_value))
892#define DT_STRING_UPPER_TOKEN(node_id, prop) \
893 DT_CAT4(node_id, _P_, prop, _STRING_UPPER_TOKEN)
910#define DT_STRING_UPPER_TOKEN_OR(node_id, prop, default_value) \
911 COND_CODE_1(DT_NODE_HAS_PROP(node_id, prop), \
912 (DT_STRING_UPPER_TOKEN(node_id, prop)), (default_value))
961#define DT_PROP_BY_PHANDLE_IDX(node_id, phs, idx, prop) \
962 DT_PROP(DT_PHANDLE_BY_IDX(node_id, phs, idx), prop)
983#define DT_PROP_BY_PHANDLE_IDX_OR(node_id, phs, idx, prop, default_value) \
984 DT_PROP_OR(DT_PHANDLE_BY_IDX(node_id, phs, idx), prop, default_value)
997#define DT_PROP_BY_PHANDLE(node_id, ph, prop) \
998 DT_PROP_BY_PHANDLE_IDX(node_id, ph, 0, prop)
1048#define DT_PHA_BY_IDX(node_id, pha, idx, cell) \
1049 DT_PROP(node_id, pha##_IDX_##idx##_VAL_##cell)
1068#define DT_PHA_BY_IDX_OR(node_id, pha, idx, cell, default_value) \
1069 DT_PROP_OR(node_id, pha##_IDX_##idx##_VAL_##cell, default_value)
1082#define DT_PHA(node_id, pha, cell) DT_PHA_BY_IDX(node_id, pha, 0, cell)
1098#define DT_PHA_OR(node_id, pha, cell, default_value) \
1099 DT_PHA_BY_IDX_OR(node_id, pha, 0, cell, default_value)
1135#define DT_PHA_BY_NAME(node_id, pha, name, cell) \
1136 DT_PROP(node_id, pha##_NAME_##name##_VAL_##cell)
1153#define DT_PHA_BY_NAME_OR(node_id, pha, name, cell, default_value) \
1154 DT_PROP_OR(node_id, pha##_NAME_##name##_VAL_##cell, default_value)
1203#define DT_PHANDLE_BY_NAME(node_id, pha, name) \
1204 DT_PROP(node_id, pha##_NAME_##name##_PH)
1245#define DT_PHANDLE_BY_IDX(node_id, prop, idx) \
1246 DT_CAT6(node_id, _P_, prop, _IDX_, idx, _PH)
1264#define DT_PHANDLE(node_id, prop) DT_PHANDLE_BY_IDX(node_id, prop, 0)
1308#define DT_NUM_RANGES(node_id) DT_CAT(node_id, _RANGES_NUM)
1359#define DT_RANGES_HAS_IDX(node_id, idx) \
1360 IS_ENABLED(DT_CAT4(node_id, _RANGES_IDX_, idx, _EXISTS))
1410#define DT_RANGES_HAS_CHILD_BUS_FLAGS_AT_IDX(node_id, idx) \
1411 IS_ENABLED(DT_CAT4(node_id, _RANGES_IDX_, idx, _VAL_CHILD_BUS_FLAGS_EXISTS))
1446#define DT_RANGES_CHILD_BUS_FLAGS_BY_IDX(node_id, idx) \
1447 DT_CAT4(node_id, _RANGES_IDX_, idx, _VAL_CHILD_BUS_FLAGS)
1491#define DT_RANGES_CHILD_BUS_ADDRESS_BY_IDX(node_id, idx) \
1492 DT_CAT4(node_id, _RANGES_IDX_, idx, _VAL_CHILD_BUS_ADDRESS)
1536#define DT_RANGES_PARENT_BUS_ADDRESS_BY_IDX(node_id, idx) \
1537 DT_CAT4(node_id, _RANGES_IDX_, idx, _VAL_PARENT_BUS_ADDRESS)
1581#define DT_RANGES_LENGTH_BY_IDX(node_id, idx) \
1582 DT_CAT4(node_id, _RANGES_IDX_, idx, _VAL_LENGTH)
1617#define DT_FOREACH_RANGE(node_id, fn) \
1618 DT_CAT(node_id, _FOREACH_RANGE)(fn)
1637#define DT_NUM_REGS(node_id) DT_CAT(node_id, _REG_NUM)
1650#define DT_REG_HAS_IDX(node_id, idx) \
1651 IS_ENABLED(DT_CAT(node_id, _REG_IDX_##idx##_EXISTS))
1659#define DT_REG_ADDR_BY_IDX(node_id, idx) \
1660 DT_CAT(node_id, _REG_IDX_##idx##_VAL_ADDRESS)
1673#define DT_REG_SIZE_BY_IDX(node_id, idx) \
1674 DT_CAT(node_id, _REG_IDX_##idx##_VAL_SIZE)
1683#define DT_REG_ADDR(node_id) DT_REG_ADDR_BY_IDX(node_id, 0)
1692#define DT_REG_SIZE(node_id) DT_REG_SIZE_BY_IDX(node_id, 0)
1700#define DT_REG_ADDR_BY_NAME(node_id, name) \
1701 DT_CAT(node_id, _REG_NAME_##name##_VAL_ADDRESS)
1709#define DT_REG_SIZE_BY_NAME(node_id, name) \
1710 DT_CAT(node_id, _REG_NAME_##name##_VAL_SIZE)
1730#define DT_NUM_IRQS(node_id) DT_CAT(node_id, _IRQ_NUM)
1742#define DT_IRQ_HAS_IDX(node_id, idx) \
1743 IS_ENABLED(DT_CAT(node_id, _IRQ_IDX_##idx##_EXISTS))
1755#define DT_IRQ_HAS_CELL_AT_IDX(node_id, idx, cell) \
1756 IS_ENABLED(DT_CAT(node_id, _IRQ_IDX_##idx##_VAL_##cell##_EXISTS))
1765#define DT_IRQ_HAS_CELL(node_id, cell) DT_IRQ_HAS_CELL_AT_IDX(node_id, 0, cell)
1776#define DT_IRQ_HAS_NAME(node_id, name) \
1777 IS_ENABLED(DT_CAT(node_id, _IRQ_NAME_##name##_VAL_irq_EXISTS))
1812#define DT_IRQ_BY_IDX(node_id, idx, cell) \
1813 DT_CAT(node_id, _IRQ_IDX_##idx##_VAL_##cell)
1830#define DT_IRQ_BY_NAME(node_id, name, cell) \
1831 DT_CAT(node_id, _IRQ_NAME_##name##_VAL_##cell)
1840#define DT_IRQ(node_id, cell) DT_IRQ_BY_IDX(node_id, 0, cell)
1852#define DT_IRQN(node_id) DT_IRQ(node_id, irq)
1872#define DT_CHOSEN(prop) DT_CAT(DT_CHOSEN_, prop)
1880#define DT_HAS_CHOSEN(prop) IS_ENABLED(DT_CHOSEN_##prop##_EXISTS)
1926#define DT_FOREACH_CHILD(node_id, fn) \
1927 DT_CAT(node_id, _FOREACH_CHILD)(fn)
1941#define DT_FOREACH_CHILD_VARGS(node_id, fn, ...) \
1942 DT_CAT(node_id, _FOREACH_CHILD_VARGS)(fn, __VA_ARGS__)
1956#define DT_FOREACH_CHILD_STATUS_OKAY(node_id, fn) \
1957 DT_CAT(node_id, _FOREACH_CHILD_STATUS_OKAY)(fn)
1975#define DT_FOREACH_CHILD_STATUS_OKAY_VARGS(node_id, fn, ...) \
1976 DT_CAT(node_id, _FOREACH_CHILD_STATUS_OKAY_VARGS)(fn, __VA_ARGS__)
2022#define DT_FOREACH_PROP_ELEM(node_id, prop, fn) \
2023 DT_CAT4(node_id, _P_, prop, _FOREACH_PROP_ELEM)(fn)
2042#define DT_FOREACH_PROP_ELEM_VARGS(node_id, prop, fn, ...) \
2043 DT_CAT4(node_id, _P_, prop, _FOREACH_PROP_ELEM_VARGS)(fn, __VA_ARGS__)
2094#define DT_FOREACH_STATUS_OKAY(compat, fn) \
2095 COND_CODE_1(DT_HAS_COMPAT_STATUS_OKAY(compat), \
2096 (UTIL_CAT(DT_FOREACH_OKAY_, compat)(fn)), \
2137#define DT_FOREACH_STATUS_OKAY_VARGS(compat, fn, ...) \
2138 COND_CODE_1(DT_HAS_COMPAT_STATUS_OKAY(compat), \
2139 (UTIL_CAT(DT_FOREACH_OKAY_VARGS_, \
2140 compat)(fn, __VA_ARGS__)), \
2167#define DT_NODE_EXISTS(node_id) IS_ENABLED(DT_CAT(node_id, _EXISTS))
2188#define DT_NODE_HAS_STATUS(node_id, status) \
2189 DT_NODE_HAS_STATUS_INTERNAL(node_id, status)
2208#define DT_HAS_COMPAT_STATUS_OKAY(compat) \
2209 IS_ENABLED(DT_CAT(DT_COMPAT_HAS_OKAY_, compat))
2217#define DT_NUM_INST_STATUS_OKAY(compat) \
2218 UTIL_AND(DT_HAS_COMPAT_STATUS_OKAY(compat), \
2219 UTIL_CAT(DT_N_INST, DT_DASH(compat, NUM_OKAY)))
2244#define DT_NODE_HAS_COMPAT(node_id, compat) \
2245 IS_ENABLED(DT_CAT(node_id, _COMPAT_MATCHES_##compat))
2259#define DT_NODE_HAS_COMPAT_STATUS(node_id, compat, status) \
2260 DT_NODE_HAS_COMPAT(node_id, compat) && DT_NODE_HAS_STATUS(node_id, status)
2275#define DT_NODE_HAS_PROP(node_id, prop) \
2276 IS_ENABLED(DT_CAT(node_id, _P_##prop##_EXISTS))
2295#define DT_PHA_HAS_CELL_AT_IDX(node_id, pha, idx, cell) \
2296 IS_ENABLED(DT_PROP(node_id, \
2297 pha##_IDX_##idx##_VAL_##cell##_EXISTS))
2308#define DT_PHA_HAS_CELL(node_id, pha, cell) \
2309 DT_PHA_HAS_CELL_AT_IDX(node_id, pha, 0, cell)
2349#define DT_BUS(node_id) DT_CAT(node_id, _BUS)
2356#define DT_BUS_LABEL(node_id) DT_PROP(DT_BUS(node_id), label)
2382#define DT_ON_BUS(node_id, bus) IS_ENABLED(DT_CAT(node_id, _BUS_##bus))
2400#define DT_DRV_INST(inst) DT_INST(inst, DT_DRV_COMPAT)
2413#define DT_INST_FOREACH_CHILD(inst, fn) \
2414 DT_FOREACH_CHILD(DT_DRV_INST(inst), fn)
2428#define DT_INST_FOREACH_CHILD_VARGS(inst, fn, ...) \
2429 DT_FOREACH_CHILD_VARGS(DT_DRV_INST(inst), fn, __VA_ARGS__)
2437#define DT_INST_ENUM_IDX(inst, prop) \
2438 DT_ENUM_IDX(DT_DRV_INST(inst), prop)
2448#define DT_INST_ENUM_IDX_OR(inst, prop, default_idx_value) \
2449 DT_ENUM_IDX_OR(DT_DRV_INST(inst), prop, default_idx_value)
2457#define DT_INST_PROP(inst, prop) DT_PROP(DT_DRV_INST(inst), prop)
2465#define DT_INST_PROP_LEN(inst, prop) DT_PROP_LEN(DT_DRV_INST(inst), prop)
2476#define DT_INST_PROP_HAS_IDX(inst, prop, idx) \
2477 DT_PROP_HAS_IDX(DT_DRV_INST(inst), prop, idx)
2487#define DT_INST_PROP_HAS_NAME(inst, prop, name) \
2488 DT_PROP_HAS_NAME(DT_DRV_INST(inst), prop, name)
2497#define DT_INST_PROP_BY_IDX(inst, prop, idx) \
2498 DT_PROP_BY_IDX(DT_DRV_INST(inst), prop, idx)
2507#define DT_INST_PROP_OR(inst, prop, default_value) \
2508 DT_PROP_OR(DT_DRV_INST(inst), prop, default_value)
2515#define DT_INST_LABEL(inst) DT_INST_PROP(inst, label)
2524#define DT_INST_STRING_TOKEN(inst, prop) \
2525 DT_STRING_TOKEN(DT_DRV_INST(inst), prop)
2534#define DT_INST_STRING_UPPER_TOKEN(inst, prop) \
2535 DT_STRING_UPPER_TOKEN(DT_DRV_INST(inst), prop)
2545#define DT_INST_PROP_BY_PHANDLE(inst, ph, prop) \
2546 DT_INST_PROP_BY_PHANDLE_IDX(inst, ph, 0, prop)
2559#define DT_INST_PROP_BY_PHANDLE_IDX(inst, phs, idx, prop) \
2560 DT_PROP_BY_PHANDLE_IDX(DT_DRV_INST(inst), phs, idx, prop)
2570#define DT_INST_PHA_BY_IDX(inst, pha, idx, cell) \
2571 DT_PHA_BY_IDX(DT_DRV_INST(inst), pha, idx, cell)
2582#define DT_INST_PHA_BY_IDX_OR(inst, pha, idx, cell, default_value) \
2583 DT_PHA_BY_IDX_OR(DT_DRV_INST(inst), pha, idx, cell, default_value)
2593#define DT_INST_PHA(inst, pha, cell) DT_INST_PHA_BY_IDX(inst, pha, 0, cell)
2603#define DT_INST_PHA_OR(inst, pha, cell, default_value) \
2604 DT_INST_PHA_BY_IDX_OR(inst, pha, 0, cell, default_value)
2615#define DT_INST_PHA_BY_NAME(inst, pha, name, cell) \
2616 DT_PHA_BY_NAME(DT_DRV_INST(inst), pha, name, cell)
2627#define DT_INST_PHA_BY_NAME_OR(inst, pha, name, cell, default_value) \
2628 DT_PHA_BY_NAME_OR(DT_DRV_INST(inst), pha, name, cell, default_value)
2638#define DT_INST_PHANDLE_BY_NAME(inst, pha, name) \
2639 DT_PHANDLE_BY_NAME(DT_DRV_INST(inst), pha, name) \
2650#define DT_INST_PHANDLE_BY_IDX(inst, prop, idx) \
2651 DT_PHANDLE_BY_IDX(DT_DRV_INST(inst), prop, idx)
2661#define DT_INST_PHANDLE(inst, prop) DT_INST_PHANDLE_BY_IDX(inst, prop, 0)
2670#define DT_INST_REG_HAS_IDX(inst, idx) DT_REG_HAS_IDX(DT_DRV_INST(inst), idx)
2678#define DT_INST_REG_ADDR_BY_IDX(inst, idx) DT_REG_ADDR_BY_IDX(DT_DRV_INST(inst), idx)
2686#define DT_INST_REG_SIZE_BY_IDX(inst, idx) \
2687 DT_REG_SIZE_BY_IDX(DT_DRV_INST(inst), idx)
2695#define DT_INST_REG_ADDR_BY_NAME(inst, name) \
2696 DT_REG_ADDR_BY_NAME(DT_DRV_INST(inst), name)
2704#define DT_INST_REG_SIZE_BY_NAME(inst, name) \
2705 DT_REG_SIZE_BY_NAME(DT_DRV_INST(inst), name)
2712#define DT_INST_REG_ADDR(inst) DT_INST_REG_ADDR_BY_IDX(inst, 0)
2719#define DT_INST_REG_SIZE(inst) DT_INST_REG_SIZE_BY_IDX(inst, 0)
2728#define DT_INST_IRQ_BY_IDX(inst, idx, cell) \
2729 DT_IRQ_BY_IDX(DT_DRV_INST(inst), idx, cell)
2738#define DT_INST_IRQ_BY_NAME(inst, name, cell) \
2739 DT_IRQ_BY_NAME(DT_DRV_INST(inst), name, cell)
2747#define DT_INST_IRQ(inst, cell) DT_INST_IRQ_BY_IDX(inst, 0, cell)
2754#define DT_INST_IRQN(inst) DT_INST_IRQ(inst, irq)
2761#define DT_INST_BUS(inst) DT_BUS(DT_DRV_INST(inst))
2768#define DT_INST_BUS_LABEL(inst) DT_BUS_LABEL(DT_DRV_INST(inst))
2777#define DT_INST_ON_BUS(inst, bus) DT_ON_BUS(DT_DRV_INST(inst), bus)
2788#define DT_INST_STRING_TOKEN_OR(inst, name, default_value) \
2789 DT_STRING_TOKEN_OR(DT_DRV_INST(inst), name, default_value)
2800#define DT_INST_STRING_UPPER_TOKEN_OR(inst, name, default_value) \
2801 DT_STRING_UPPER_TOKEN_OR(DT_DRV_INST(inst), name, default_value)
2831#define DT_ANY_INST_ON_BUS_STATUS_OKAY(bus) \
2832 DT_COMPAT_ON_BUS_INTERNAL(DT_DRV_COMPAT, bus)
2893#define DT_INST_FOREACH_STATUS_OKAY(fn) \
2894 COND_CODE_1(DT_HAS_COMPAT_STATUS_OKAY(DT_DRV_COMPAT), \
2895 (UTIL_CAT(DT_FOREACH_OKAY_INST_, \
2896 DT_DRV_COMPAT)(fn)), \
2910#define DT_INST_FOREACH_STATUS_OKAY_VARGS(fn, ...) \
2911 COND_CODE_1(DT_HAS_COMPAT_STATUS_OKAY(DT_DRV_COMPAT), \
2912 (UTIL_CAT(DT_FOREACH_OKAY_INST_VARGS_, \
2913 DT_DRV_COMPAT)(fn, __VA_ARGS__)), \
2926#define DT_INST_FOREACH_PROP_ELEM(inst, prop, fn) \
2927 DT_FOREACH_PROP_ELEM(DT_DRV_INST(inst), prop, fn)
2943#define DT_INST_FOREACH_PROP_ELEM_VARGS(inst, prop, fn, ...) \
2944 DT_FOREACH_PROP_ELEM_VARGS(DT_DRV_INST(inst), prop, fn, __VA_ARGS__)
2952#define DT_INST_NODE_HAS_PROP(inst, prop) \
2953 DT_NODE_HAS_PROP(DT_DRV_INST(inst), prop)
2965#define DT_INST_PHA_HAS_CELL_AT_IDX(inst, pha, idx, cell) \
2966 DT_PHA_HAS_CELL_AT_IDX(DT_DRV_INST(inst), pha, idx, cell)
2977#define DT_INST_PHA_HAS_CELL(inst, pha, cell) \
2978 DT_INST_PHA_HAS_CELL_AT_IDX(inst, pha, 0, cell)
2987#define DT_INST_IRQ_HAS_IDX(inst, idx) DT_IRQ_HAS_IDX(DT_DRV_INST(inst), idx)
2997#define DT_INST_IRQ_HAS_CELL_AT_IDX(inst, idx, cell) \
2998 DT_IRQ_HAS_CELL_AT_IDX(DT_DRV_INST(inst), idx, cell)
3007#define DT_INST_IRQ_HAS_CELL(inst, cell) \
3008 DT_INST_IRQ_HAS_CELL_AT_IDX(inst, 0, cell)
3016#define DT_INST_IRQ_HAS_NAME(inst, name) \
3017 DT_IRQ_HAS_NAME(DT_DRV_INST(inst), name)
3024#define DT_PATH_INTERNAL(...) \
3025 UTIL_CAT(DT_ROOT, MACRO_MAP_CAT(DT_S_PREFIX, __VA_ARGS__))
3027#define DT_S_PREFIX(name) _S_##name
3043#define DT_CAT(a1, a2) a1 ## a2
3045#define DT_CAT3(a1, a2, a3) a1 ## a2 ## a3
3047#define DT_CAT4(a1, a2, a3, a4) a1 ## a2 ## a3 ## a4
3049#define DT_CAT5(a1, a2, a3, a4, a5) a1 ## a2 ## a3 ## a4 ## a5
3051#define DT_CAT6(a1, a2, a3, a4, a5, a6) a1 ## a2 ## a3 ## a4 ## a5 ## a6
3058#define DT_DASH(...) MACRO_MAP_CAT(DT_DASH_PREFIX, __VA_ARGS__)
3060#define DT_DASH_PREFIX(name) _##name
3062#define DT_NODE_HAS_STATUS_INTERNAL(node_id, status) \
3063 IS_ENABLED(DT_CAT(node_id, _STATUS_ ## status))
3065#define DT_COMPAT_ON_BUS_INTERNAL(compat, bus) \
3066 IS_ENABLED(UTIL_CAT(DT_CAT(DT_COMPAT_, compat), _BUS_##bus))
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.
Zephyr-specific devicetree /chosen properties.
Flash Devicetree macro public API header file.
IO channels devicetree macro public API header file.
Devicetree node dependency ordinals.
PWMs Devicetree macro public API header file.