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)
492#define DT_SAME_NODE(node_id1, node_id2) \
493 (DT_DEP_ORD(node_id1) == (DT_DEP_ORD(node_id2)))
538#define DT_PROP(node_id, prop) DT_CAT(node_id, _P_##prop)
568#define DT_PROP_LEN(node_id, prop) DT_PROP(node_id, prop##_LEN)
584#define DT_PROP_LEN_OR(node_id, prop, default_value) \
585 COND_CODE_1(DT_NODE_HAS_PROP(node_id, prop), \
586 (DT_PROP_LEN(node_id, prop)), (default_value))
608#define DT_PROP_HAS_IDX(node_id, prop, idx) \
609 IS_ENABLED(DT_CAT6(node_id, _P_, prop, _IDX_, idx, _EXISTS))
633#define DT_PROP_BY_IDX(node_id, prop, idx) DT_PROP(node_id, prop##_IDX_##idx)
648#define DT_PROP_OR(node_id, prop, default_value) \
649 COND_CODE_1(DT_NODE_HAS_PROP(node_id, prop), \
650 (DT_PROP(node_id, prop)), (default_value))
660#define DT_LABEL(node_id) DT_PROP(node_id, label)
696#define DT_ENUM_IDX(node_id, prop) DT_PROP(node_id, prop##_ENUM_IDX)
712#define DT_ENUM_IDX_OR(node_id, prop, default_idx_value) \
713 COND_CODE_1(DT_NODE_HAS_PROP(node_id, prop), \
714 (DT_ENUM_IDX(node_id, prop)), (default_idx_value))
768#define DT_STRING_TOKEN(node_id, prop) \
769 DT_CAT4(node_id, _P_, prop, _STRING_TOKEN)
820#define DT_STRING_UPPER_TOKEN(node_id, prop) \
821 DT_CAT4(node_id, _P_, prop, _STRING_UPPER_TOKEN)
870#define DT_PROP_BY_PHANDLE_IDX(node_id, phs, idx, prop) \
871 DT_PROP(DT_PHANDLE_BY_IDX(node_id, phs, idx), prop)
892#define DT_PROP_BY_PHANDLE_IDX_OR(node_id, phs, idx, prop, default_value) \
893 DT_PROP_OR(DT_PHANDLE_BY_IDX(node_id, phs, idx), prop, default_value)
906#define DT_PROP_BY_PHANDLE(node_id, ph, prop) \
907 DT_PROP_BY_PHANDLE_IDX(node_id, ph, 0, prop)
957#define DT_PHA_BY_IDX(node_id, pha, idx, cell) \
958 DT_PROP(node_id, pha##_IDX_##idx##_VAL_##cell)
977#define DT_PHA_BY_IDX_OR(node_id, pha, idx, cell, default_value) \
978 DT_PROP_OR(node_id, pha##_IDX_##idx##_VAL_##cell, default_value)
991#define DT_PHA(node_id, pha, cell) DT_PHA_BY_IDX(node_id, pha, 0, cell)
1007#define DT_PHA_OR(node_id, pha, cell, default_value) \
1008 DT_PHA_BY_IDX_OR(node_id, pha, 0, cell, default_value)
1044#define DT_PHA_BY_NAME(node_id, pha, name, cell) \
1045 DT_PROP(node_id, pha##_NAME_##name##_VAL_##cell)
1062#define DT_PHA_BY_NAME_OR(node_id, pha, name, cell, default_value) \
1063 DT_PROP_OR(node_id, pha##_NAME_##name##_VAL_##cell, default_value)
1112#define DT_PHANDLE_BY_NAME(node_id, pha, name) \
1113 DT_PROP(node_id, pha##_NAME_##name##_PH)
1154#define DT_PHANDLE_BY_IDX(node_id, prop, idx) \
1155 DT_CAT6(node_id, _P_, prop, _IDX_, idx, _PH)
1173#define DT_PHANDLE(node_id, prop) DT_PHANDLE_BY_IDX(node_id, prop, 0)
1217#define DT_NUM_RANGES(node_id) DT_CAT(node_id, _RANGES_NUM)
1268#define DT_RANGES_HAS_IDX(node_id, idx) \
1269 IS_ENABLED(DT_CAT4(node_id, _RANGES_IDX_, idx, _EXISTS))
1319#define DT_RANGES_HAS_CHILD_BUS_FLAGS_AT_IDX(node_id, idx) \
1320 IS_ENABLED(DT_CAT4(node_id, _RANGES_IDX_, idx, _VAL_CHILD_BUS_FLAGS_EXISTS))
1355#define DT_RANGES_CHILD_BUS_FLAGS_BY_IDX(node_id, idx) \
1356 DT_CAT4(node_id, _RANGES_IDX_, idx, _VAL_CHILD_BUS_FLAGS)
1400#define DT_RANGES_CHILD_BUS_ADDRESS_BY_IDX(node_id, idx) \
1401 DT_CAT4(node_id, _RANGES_IDX_, idx, _VAL_CHILD_BUS_ADDRESS)
1445#define DT_RANGES_PARENT_BUS_ADDRESS_BY_IDX(node_id, idx) \
1446 DT_CAT4(node_id, _RANGES_IDX_, idx, _VAL_PARENT_BUS_ADDRESS)
1490#define DT_RANGES_LENGTH_BY_IDX(node_id, idx) \
1491 DT_CAT4(node_id, _RANGES_IDX_, idx, _VAL_LENGTH)
1526#define DT_FOREACH_RANGE(node_id, fn) \
1527 DT_CAT(node_id, _FOREACH_RANGE)(fn)
1546#define DT_NUM_REGS(node_id) DT_CAT(node_id, _REG_NUM)
1559#define DT_REG_HAS_IDX(node_id, idx) \
1560 IS_ENABLED(DT_CAT(node_id, _REG_IDX_##idx##_EXISTS))
1568#define DT_REG_ADDR_BY_IDX(node_id, idx) \
1569 DT_CAT(node_id, _REG_IDX_##idx##_VAL_ADDRESS)
1582#define DT_REG_SIZE_BY_IDX(node_id, idx) \
1583 DT_CAT(node_id, _REG_IDX_##idx##_VAL_SIZE)
1592#define DT_REG_ADDR(node_id) DT_REG_ADDR_BY_IDX(node_id, 0)
1601#define DT_REG_SIZE(node_id) DT_REG_SIZE_BY_IDX(node_id, 0)
1609#define DT_REG_ADDR_BY_NAME(node_id, name) \
1610 DT_CAT(node_id, _REG_NAME_##name##_VAL_ADDRESS)
1618#define DT_REG_SIZE_BY_NAME(node_id, name) \
1619 DT_CAT(node_id, _REG_NAME_##name##_VAL_SIZE)
1639#define DT_NUM_IRQS(node_id) DT_CAT(node_id, _IRQ_NUM)
1651#define DT_IRQ_HAS_IDX(node_id, idx) \
1652 IS_ENABLED(DT_CAT(node_id, _IRQ_IDX_##idx##_EXISTS))
1664#define DT_IRQ_HAS_CELL_AT_IDX(node_id, idx, cell) \
1665 IS_ENABLED(DT_CAT(node_id, _IRQ_IDX_##idx##_VAL_##cell##_EXISTS))
1674#define DT_IRQ_HAS_CELL(node_id, cell) DT_IRQ_HAS_CELL_AT_IDX(node_id, 0, cell)
1685#define DT_IRQ_HAS_NAME(node_id, name) \
1686 IS_ENABLED(DT_CAT(node_id, _IRQ_NAME_##name##_VAL_irq_EXISTS))
1721#define DT_IRQ_BY_IDX(node_id, idx, cell) \
1722 DT_CAT(node_id, _IRQ_IDX_##idx##_VAL_##cell)
1739#define DT_IRQ_BY_NAME(node_id, name, cell) \
1740 DT_CAT(node_id, _IRQ_NAME_##name##_VAL_##cell)
1749#define DT_IRQ(node_id, cell) DT_IRQ_BY_IDX(node_id, 0, cell)
1761#define DT_IRQN(node_id) DT_IRQ(node_id, irq)
1781#define DT_CHOSEN(prop) DT_CAT(DT_CHOSEN_, prop)
1789#define DT_HAS_CHOSEN(prop) IS_ENABLED(DT_CHOSEN_##prop##_EXISTS)
1835#define DT_FOREACH_CHILD(node_id, fn) \
1836 DT_CAT(node_id, _FOREACH_CHILD)(fn)
1850#define DT_FOREACH_CHILD_VARGS(node_id, fn, ...) \
1851 DT_CAT(node_id, _FOREACH_CHILD_VARGS)(fn, __VA_ARGS__)
1865#define DT_FOREACH_CHILD_STATUS_OKAY(node_id, fn) \
1866 DT_CAT(node_id, _FOREACH_CHILD_STATUS_OKAY)(fn)
1884#define DT_FOREACH_CHILD_STATUS_OKAY_VARGS(node_id, fn, ...) \
1885 DT_CAT(node_id, _FOREACH_CHILD_STATUS_OKAY_VARGS)(fn, __VA_ARGS__)
1931#define DT_FOREACH_PROP_ELEM(node_id, prop, fn) \
1932 DT_CAT4(node_id, _P_, prop, _FOREACH_PROP_ELEM)(fn)
1951#define DT_FOREACH_PROP_ELEM_VARGS(node_id, prop, fn, ...) \
1952 DT_CAT4(node_id, _P_, prop, _FOREACH_PROP_ELEM_VARGS)(fn, __VA_ARGS__)
2003#define DT_FOREACH_STATUS_OKAY(compat, fn) \
2004 COND_CODE_1(DT_HAS_COMPAT_STATUS_OKAY(compat), \
2005 (UTIL_CAT(DT_FOREACH_OKAY_, compat)(fn)), \
2046#define DT_FOREACH_STATUS_OKAY_VARGS(compat, fn, ...) \
2047 COND_CODE_1(DT_HAS_COMPAT_STATUS_OKAY(compat), \
2048 (UTIL_CAT(DT_FOREACH_OKAY_VARGS_, \
2049 compat)(fn, __VA_ARGS__)), \
2076#define DT_NODE_EXISTS(node_id) IS_ENABLED(DT_CAT(node_id, _EXISTS))
2097#define DT_NODE_HAS_STATUS(node_id, status) \
2098 DT_NODE_HAS_STATUS_INTERNAL(node_id, status)
2117#define DT_HAS_COMPAT_STATUS_OKAY(compat) \
2118 IS_ENABLED(DT_CAT(DT_COMPAT_HAS_OKAY_, compat))
2126#define DT_NUM_INST_STATUS_OKAY(compat) \
2127 UTIL_AND(DT_HAS_COMPAT_STATUS_OKAY(compat), \
2128 UTIL_CAT(DT_N_INST, DT_DASH(compat, NUM_OKAY)))
2153#define DT_NODE_HAS_COMPAT(node_id, compat) \
2154 IS_ENABLED(DT_CAT(node_id, _COMPAT_MATCHES_##compat))
2168#define DT_NODE_HAS_COMPAT_STATUS(node_id, compat, status) \
2169 DT_NODE_HAS_COMPAT(node_id, compat) && DT_NODE_HAS_STATUS(node_id, status)
2184#define DT_NODE_HAS_PROP(node_id, prop) \
2185 IS_ENABLED(DT_CAT(node_id, _P_##prop##_EXISTS))
2204#define DT_PHA_HAS_CELL_AT_IDX(node_id, pha, idx, cell) \
2205 IS_ENABLED(DT_PROP(node_id, \
2206 pha##_IDX_##idx##_VAL_##cell##_EXISTS))
2217#define DT_PHA_HAS_CELL(node_id, pha, cell) \
2218 DT_PHA_HAS_CELL_AT_IDX(node_id, pha, 0, cell)
2258#define DT_BUS(node_id) DT_CAT(node_id, _BUS)
2265#define DT_BUS_LABEL(node_id) DT_PROP(DT_BUS(node_id), label)
2291#define DT_ON_BUS(node_id, bus) IS_ENABLED(DT_CAT(node_id, _BUS_##bus))
2309#define DT_DRV_INST(inst) DT_INST(inst, DT_DRV_COMPAT)
2322#define DT_INST_FOREACH_CHILD(inst, fn) \
2323 DT_FOREACH_CHILD(DT_DRV_INST(inst), fn)
2337#define DT_INST_FOREACH_CHILD_VARGS(inst, fn, ...) \
2338 DT_FOREACH_CHILD_VARGS(DT_DRV_INST(inst), fn, __VA_ARGS__)
2346#define DT_INST_ENUM_IDX(inst, prop) \
2347 DT_ENUM_IDX(DT_DRV_INST(inst), prop)
2357#define DT_INST_ENUM_IDX_OR(inst, prop, default_idx_value) \
2358 DT_ENUM_IDX_OR(DT_DRV_INST(inst), prop, default_idx_value)
2366#define DT_INST_PROP(inst, prop) DT_PROP(DT_DRV_INST(inst), prop)
2374#define DT_INST_PROP_LEN(inst, prop) DT_PROP_LEN(DT_DRV_INST(inst), prop)
2385#define DT_INST_PROP_HAS_IDX(inst, prop, idx) \
2386 DT_PROP_HAS_IDX(DT_DRV_INST(inst), prop, idx)
2395#define DT_INST_PROP_BY_IDX(inst, prop, idx) \
2396 DT_PROP_BY_IDX(DT_DRV_INST(inst), prop, idx)
2405#define DT_INST_PROP_OR(inst, prop, default_value) \
2406 DT_PROP_OR(DT_DRV_INST(inst), prop, default_value)
2413#define DT_INST_LABEL(inst) DT_INST_PROP(inst, label)
2423#define DT_INST_PROP_BY_PHANDLE(inst, ph, prop) \
2424 DT_INST_PROP_BY_PHANDLE_IDX(inst, ph, 0, prop)
2437#define DT_INST_PROP_BY_PHANDLE_IDX(inst, phs, idx, prop) \
2438 DT_PROP_BY_PHANDLE_IDX(DT_DRV_INST(inst), phs, idx, prop)
2448#define DT_INST_PHA_BY_IDX(inst, pha, idx, cell) \
2449 DT_PHA_BY_IDX(DT_DRV_INST(inst), pha, idx, cell)
2460#define DT_INST_PHA_BY_IDX_OR(inst, pha, idx, cell, default_value) \
2461 DT_PHA_BY_IDX_OR(DT_DRV_INST(inst), pha, idx, cell, default_value)
2471#define DT_INST_PHA(inst, pha, cell) DT_INST_PHA_BY_IDX(inst, pha, 0, cell)
2481#define DT_INST_PHA_OR(inst, pha, cell, default_value) \
2482 DT_INST_PHA_BY_IDX_OR(inst, pha, 0, cell, default_value)
2493#define DT_INST_PHA_BY_NAME(inst, pha, name, cell) \
2494 DT_PHA_BY_NAME(DT_DRV_INST(inst), pha, name, cell)
2505#define DT_INST_PHA_BY_NAME_OR(inst, pha, name, cell, default_value) \
2506 DT_PHA_BY_NAME_OR(DT_DRV_INST(inst), pha, name, cell, default_value)
2516#define DT_INST_PHANDLE_BY_NAME(inst, pha, name) \
2517 DT_PHANDLE_BY_NAME(DT_DRV_INST(inst), pha, name) \
2528#define DT_INST_PHANDLE_BY_IDX(inst, prop, idx) \
2529 DT_PHANDLE_BY_IDX(DT_DRV_INST(inst), prop, idx)
2539#define DT_INST_PHANDLE(inst, prop) DT_INST_PHANDLE_BY_IDX(inst, prop, 0)
2548#define DT_INST_REG_HAS_IDX(inst, idx) DT_REG_HAS_IDX(DT_DRV_INST(inst), idx)
2556#define DT_INST_REG_ADDR_BY_IDX(inst, idx) DT_REG_ADDR_BY_IDX(DT_DRV_INST(inst), idx)
2564#define DT_INST_REG_SIZE_BY_IDX(inst, idx) \
2565 DT_REG_SIZE_BY_IDX(DT_DRV_INST(inst), idx)
2573#define DT_INST_REG_ADDR_BY_NAME(inst, name) \
2574 DT_REG_ADDR_BY_NAME(DT_DRV_INST(inst), name)
2582#define DT_INST_REG_SIZE_BY_NAME(inst, name) \
2583 DT_REG_SIZE_BY_NAME(DT_DRV_INST(inst), name)
2590#define DT_INST_REG_ADDR(inst) DT_INST_REG_ADDR_BY_IDX(inst, 0)
2597#define DT_INST_REG_SIZE(inst) DT_INST_REG_SIZE_BY_IDX(inst, 0)
2606#define DT_INST_IRQ_BY_IDX(inst, idx, cell) \
2607 DT_IRQ_BY_IDX(DT_DRV_INST(inst), idx, cell)
2616#define DT_INST_IRQ_BY_NAME(inst, name, cell) \
2617 DT_IRQ_BY_NAME(DT_DRV_INST(inst), name, cell)
2625#define DT_INST_IRQ(inst, cell) DT_INST_IRQ_BY_IDX(inst, 0, cell)
2632#define DT_INST_IRQN(inst) DT_INST_IRQ(inst, irq)
2639#define DT_INST_BUS(inst) DT_BUS(DT_DRV_INST(inst))
2646#define DT_INST_BUS_LABEL(inst) DT_BUS_LABEL(DT_DRV_INST(inst))
2655#define DT_INST_ON_BUS(inst, bus) DT_ON_BUS(DT_DRV_INST(inst), bus)
2685#define DT_ANY_INST_ON_BUS_STATUS_OKAY(bus) \
2686 DT_COMPAT_ON_BUS_INTERNAL(DT_DRV_COMPAT, bus)
2747#define DT_INST_FOREACH_STATUS_OKAY(fn) \
2748 COND_CODE_1(DT_HAS_COMPAT_STATUS_OKAY(DT_DRV_COMPAT), \
2749 (UTIL_CAT(DT_FOREACH_OKAY_INST_, \
2750 DT_DRV_COMPAT)(fn)), \
2764#define DT_INST_FOREACH_STATUS_OKAY_VARGS(fn, ...) \
2765 COND_CODE_1(DT_HAS_COMPAT_STATUS_OKAY(DT_DRV_COMPAT), \
2766 (UTIL_CAT(DT_FOREACH_OKAY_INST_VARGS_, \
2767 DT_DRV_COMPAT)(fn, __VA_ARGS__)), \
2780#define DT_INST_FOREACH_PROP_ELEM(inst, prop, fn) \
2781 DT_FOREACH_PROP_ELEM(DT_DRV_INST(inst), prop, fn)
2797#define DT_INST_FOREACH_PROP_ELEM_VARGS(inst, prop, fn, ...) \
2798 DT_FOREACH_PROP_ELEM_VARGS(DT_DRV_INST(inst), prop, fn, __VA_ARGS__)
2806#define DT_INST_NODE_HAS_PROP(inst, prop) \
2807 DT_NODE_HAS_PROP(DT_DRV_INST(inst), prop)
2819#define DT_INST_PHA_HAS_CELL_AT_IDX(inst, pha, idx, cell) \
2820 DT_PHA_HAS_CELL_AT_IDX(DT_DRV_INST(inst), pha, idx, cell)
2831#define DT_INST_PHA_HAS_CELL(inst, pha, cell) \
2832 DT_INST_PHA_HAS_CELL_AT_IDX(inst, pha, 0, cell)
2841#define DT_INST_IRQ_HAS_IDX(inst, idx) DT_IRQ_HAS_IDX(DT_DRV_INST(inst), idx)
2851#define DT_INST_IRQ_HAS_CELL_AT_IDX(inst, idx, cell) \
2852 DT_IRQ_HAS_CELL_AT_IDX(DT_DRV_INST(inst), idx, cell)
2861#define DT_INST_IRQ_HAS_CELL(inst, cell) \
2862 DT_INST_IRQ_HAS_CELL_AT_IDX(inst, 0, cell)
2870#define DT_INST_IRQ_HAS_NAME(inst, name) \
2871 DT_IRQ_HAS_NAME(DT_DRV_INST(inst), name)
2878#define DT_PATH_INTERNAL(...) \
2879 UTIL_CAT(DT_ROOT, MACRO_MAP_CAT(DT_S_PREFIX, __VA_ARGS__))
2881#define DT_S_PREFIX(name) _S_##name
2897#define DT_CAT(a1, a2) a1 ## a2
2899#define DT_CAT3(a1, a2, a3) a1 ## a2 ## a3
2901#define DT_CAT4(a1, a2, a3, a4) a1 ## a2 ## a3 ## a4
2903#define DT_CAT5(a1, a2, a3, a4, a5) a1 ## a2 ## a3 ## a4 ## a5
2905#define DT_CAT6(a1, a2, a3, a4, a5, a6) a1 ## a2 ## a3 ## a4 ## a5 ## a6
2912#define DT_DASH(...) MACRO_MAP_CAT(DT_DASH_PREFIX, __VA_ARGS__)
2914#define DT_DASH_PREFIX(name) _##name
2916#define DT_NODE_HAS_STATUS_INTERNAL(node_id, status) \
2917 IS_ENABLED(DT_CAT(node_id, _STATUS_ ## status))
2919#define DT_COMPAT_ON_BUS_INTERNAL(compat, bus) \
2920 IS_ENABLED(UTIL_CAT(DT_CAT(DT_COMPAT_, compat), _BUS_##bus))
Clocks Devicetree macro public API header file.
DMA Devicetree macro public API header file.
GPIO Devicetree macro public API header file.
Devicetree pin control helpers.
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.