Zephyr Project API  3.1.0
A Scalable Open Source RTOS
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 *
6 * Not a generated file. Feel free to modify.
7 */
8
16#ifndef DEVICETREE_H
17#define DEVICETREE_H
18
19#include <devicetree_unfixed.h>
20#include <devicetree_fixups.h>
21
22#include <zephyr/sys/util.h>
23
31/*
32 * Property suffixes
33 * -----------------
34 *
35 * These are the optional parts that come after the _P_<property>
36 * part in DT_N_<path-id>_P_<property-id> macros, or the "prop-suf"
37 * nonterminal in the DT guide's macros.bnf file.
38 *
39 * Before adding new ones, check this list to avoid conflicts. If any
40 * are missing from this list, please add them. It should be complete.
41 *
42 * _ENUM_IDX: property's value as an index into bindings enum
43 * _ENUM_TOKEN: property's value as a token into bindings enum (string
44 * enum values are identifiers) [deprecated, use _STRING_TOKEN]
45 * _ENUM_UPPER_TOKEN: like _ENUM_TOKEN, but uppercased [deprecated, use
46 * _STRING_UPPER_TOKEN]
47 * _EXISTS: property is defined
48 * _FOREACH_PROP_ELEM: helper for "iterating" over values in the property
49 * _FOREACH_PROP_ELEM_VARGS: foreach functions with variable number of arguments
50 * _IDX_<i>: logical index into property
51 * _IDX_<i>_EXISTS: logical index into property is defined
52 * _IDX_<i>_PH: phandle array's phandle by index (or phandle, phandles)
53 * _IDX_<i>_VAL_<val>: phandle array's specifier value by index
54 * _IDX_<i>_VAL_<val>_EXISTS: cell value exists, by index
55 * _LEN: property logical length
56 * _NAME_<name>_PH: phandle array's phandle by name
57 * _NAME_<name>_VAL_<val>: phandle array's property specifier by name
58 * _NAME_<name>_VAL_<val>_EXISTS: cell value exists, by name
59 * _STRING_TOKEN: string property's value as a token
60 * _STRING_UPPER_TOKEN: like _STRING_TOKEN, but uppercased
61 */
62
76#define DT_INVALID_NODE _
77
81#define DT_ROOT DT_N
82
129#define DT_PATH(...) DT_PATH_INTERNAL(__VA_ARGS__)
130
177#define DT_NODELABEL(label) DT_CAT(DT_N_NODELABEL_, label)
178
213#define DT_ALIAS(alias) DT_CAT(DT_N_ALIAS_, alias)
214
305#define DT_INST(inst, compat) UTIL_CAT(DT_N_INST, DT_DASH(inst, compat))
306
326#define DT_PARENT(node_id) UTIL_CAT(node_id, _PARENT)
327
333#define DT_INST_PARENT(inst) DT_PARENT(DT_DRV_INST(inst))
334
354#define DT_GPARENT(node_id) DT_PARENT(DT_PARENT(node_id))
355
387#define DT_CHILD(node_id, child) UTIL_CAT(node_id, DT_S_PREFIX(child))
388
425#define DT_COMPAT_GET_ANY_STATUS_OKAY(compat) \
426 COND_CODE_1(DT_HAS_COMPAT_STATUS_OKAY(compat), \
427 (DT_INST(0, compat)), \
428 (DT_INVALID_NODE))
429
453#define DT_NODE_PATH(node_id) DT_CAT(node_id, _PATH)
454
475#define DT_NODE_FULL_NAME(node_id) DT_CAT(node_id, _FULL_NAME)
476
499#define DT_NODE_CHILD_IDX(node_id) DT_CAT(node_id, _CHILD_IDX)
500
516#define DT_SAME_NODE(node_id1, node_id2) \
517 (DT_DEP_ORD(node_id1) == (DT_DEP_ORD(node_id2)))
518
519/* Implementation note: distinct nodes have distinct node identifiers.
520 * See include/devicetree/ordinals.h. */
521
562#define DT_PROP(node_id, prop) DT_CAT(node_id, _P_##prop)
563
592#define DT_PROP_LEN(node_id, prop) DT_PROP(node_id, prop##_LEN)
593
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))
611
632#define DT_PROP_HAS_IDX(node_id, prop, idx) \
633 IS_ENABLED(DT_CAT6(node_id, _P_, prop, _IDX_, idx, _EXISTS))
634
663#define DT_PROP_HAS_NAME(node_id, prop, name) \
664 IS_ENABLED(DT_CAT6(node_id, _P_, prop, _NAME_, name, _EXISTS))
665
688#define DT_PROP_BY_IDX(node_id, prop, idx) DT_PROP(node_id, prop##_IDX_##idx)
689
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))
706
715#define DT_LABEL(node_id) DT_PROP(node_id, label)
716
751#define DT_ENUM_IDX(node_id, prop) DT_PROP(node_id, prop##_ENUM_IDX)
752
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))
770
823#define DT_STRING_TOKEN(node_id, prop) \
824 DT_CAT4(node_id, _P_, prop, _STRING_TOKEN)
825
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))
842
892#define DT_STRING_UPPER_TOKEN(node_id, prop) \
893 DT_CAT4(node_id, _P_, prop, _STRING_UPPER_TOKEN)
894
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))
913
914/*
915 * phandle properties
916 *
917 * These are special-cased to manage the impedance mismatch between
918 * phandles, which are just uint32_t node properties that only make sense
919 * within the tree itself, and C values.
920 */
921
961#define DT_PROP_BY_PHANDLE_IDX(node_id, phs, idx, prop) \
962 DT_PROP(DT_PHANDLE_BY_IDX(node_id, phs, idx), prop)
963
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)
985
997#define DT_PROP_BY_PHANDLE(node_id, ph, prop) \
998 DT_PROP_BY_PHANDLE_IDX(node_id, ph, 0, prop)
999
1048#define DT_PHA_BY_IDX(node_id, pha, idx, cell) \
1049 DT_PROP(node_id, pha##_IDX_##idx##_VAL_##cell)
1050
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)
1070/* Implementation note: the _IDX_##idx##_VAL_##cell##_EXISTS
1071 * macros are defined, so it's safe to use DT_PROP_OR() here, because
1072 * that uses an IS_ENABLED() on the _EXISTS macro.
1073 */
1074
1082#define DT_PHA(node_id, pha, cell) DT_PHA_BY_IDX(node_id, pha, 0, cell)
1083
1098#define DT_PHA_OR(node_id, pha, cell, default_value) \
1099 DT_PHA_BY_IDX_OR(node_id, pha, 0, cell, default_value)
1100
1135#define DT_PHA_BY_NAME(node_id, pha, name, cell) \
1136 DT_PROP(node_id, pha##_NAME_##name##_VAL_##cell)
1137
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)
1155/* Implementation note: the _NAME_##name##_VAL_##cell##_EXISTS
1156 * macros are defined, so it's safe to use DT_PROP_OR() here, because
1157 * that uses an IS_ENABLED() on the _EXISTS macro.
1158 */
1159
1203#define DT_PHANDLE_BY_NAME(node_id, pha, name) \
1204 DT_PROP(node_id, pha##_NAME_##name##_PH)
1205
1245#define DT_PHANDLE_BY_IDX(node_id, prop, idx) \
1246 DT_CAT6(node_id, _P_, prop, _IDX_, idx, _PH)
1247/*
1248 * Implementation note: using DT_CAT6 above defers concatenation until
1249 * after expansion of each parameter. This is important when 'idx' is
1250 * expandable to a number, but it isn't one "yet".
1251 */
1252
1264#define DT_PHANDLE(node_id, prop) DT_PHANDLE_BY_IDX(node_id, prop, 0)
1265
1308#define DT_NUM_RANGES(node_id) DT_CAT(node_id, _RANGES_NUM)
1309
1359#define DT_RANGES_HAS_IDX(node_id, idx) \
1360 IS_ENABLED(DT_CAT4(node_id, _RANGES_IDX_, idx, _EXISTS))
1361
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))
1412
1446#define DT_RANGES_CHILD_BUS_FLAGS_BY_IDX(node_id, idx) \
1447 DT_CAT4(node_id, _RANGES_IDX_, idx, _VAL_CHILD_BUS_FLAGS)
1448
1491#define DT_RANGES_CHILD_BUS_ADDRESS_BY_IDX(node_id, idx) \
1492 DT_CAT4(node_id, _RANGES_IDX_, idx, _VAL_CHILD_BUS_ADDRESS)
1493
1536#define DT_RANGES_PARENT_BUS_ADDRESS_BY_IDX(node_id, idx) \
1537 DT_CAT4(node_id, _RANGES_IDX_, idx, _VAL_PARENT_BUS_ADDRESS)
1538
1581#define DT_RANGES_LENGTH_BY_IDX(node_id, idx) \
1582 DT_CAT4(node_id, _RANGES_IDX_, idx, _VAL_LENGTH)
1583
1617#define DT_FOREACH_RANGE(node_id, fn) \
1618 DT_CAT(node_id, _FOREACH_RANGE)(fn)
1619
1637#define DT_NUM_REGS(node_id) DT_CAT(node_id, _REG_NUM)
1638
1650#define DT_REG_HAS_IDX(node_id, idx) \
1651 IS_ENABLED(DT_CAT(node_id, _REG_IDX_##idx##_EXISTS))
1652
1659#define DT_REG_ADDR_BY_IDX(node_id, idx) \
1660 DT_CAT(node_id, _REG_IDX_##idx##_VAL_ADDRESS)
1661
1673#define DT_REG_SIZE_BY_IDX(node_id, idx) \
1674 DT_CAT(node_id, _REG_IDX_##idx##_VAL_SIZE)
1675
1683#define DT_REG_ADDR(node_id) DT_REG_ADDR_BY_IDX(node_id, 0)
1684
1692#define DT_REG_SIZE(node_id) DT_REG_SIZE_BY_IDX(node_id, 0)
1693
1700#define DT_REG_ADDR_BY_NAME(node_id, name) \
1701 DT_CAT(node_id, _REG_NAME_##name##_VAL_ADDRESS)
1702
1709#define DT_REG_SIZE_BY_NAME(node_id, name) \
1710 DT_CAT(node_id, _REG_NAME_##name##_VAL_SIZE)
1711
1730#define DT_NUM_IRQS(node_id) DT_CAT(node_id, _IRQ_NUM)
1731
1742#define DT_IRQ_HAS_IDX(node_id, idx) \
1743 IS_ENABLED(DT_CAT(node_id, _IRQ_IDX_##idx##_EXISTS))
1744
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))
1757
1765#define DT_IRQ_HAS_CELL(node_id, cell) DT_IRQ_HAS_CELL_AT_IDX(node_id, 0, cell)
1766
1776#define DT_IRQ_HAS_NAME(node_id, name) \
1777 IS_ENABLED(DT_CAT(node_id, _IRQ_NAME_##name##_VAL_irq_EXISTS))
1778
1812#define DT_IRQ_BY_IDX(node_id, idx, cell) \
1813 DT_CAT(node_id, _IRQ_IDX_##idx##_VAL_##cell)
1814
1830#define DT_IRQ_BY_NAME(node_id, name, cell) \
1831 DT_CAT(node_id, _IRQ_NAME_##name##_VAL_##cell)
1832
1840#define DT_IRQ(node_id, cell) DT_IRQ_BY_IDX(node_id, 0, cell)
1841
1852#define DT_IRQN(node_id) DT_IRQ(node_id, irq)
1853
1872#define DT_CHOSEN(prop) DT_CAT(DT_CHOSEN_, prop)
1873
1880#define DT_HAS_CHOSEN(prop) IS_ENABLED(DT_CHOSEN_##prop##_EXISTS)
1881
1926#define DT_FOREACH_CHILD(node_id, fn) \
1927 DT_CAT(node_id, _FOREACH_CHILD)(fn)
1928
1941#define DT_FOREACH_CHILD_VARGS(node_id, fn, ...) \
1942 DT_CAT(node_id, _FOREACH_CHILD_VARGS)(fn, __VA_ARGS__)
1943
1956#define DT_FOREACH_CHILD_STATUS_OKAY(node_id, fn) \
1957 DT_CAT(node_id, _FOREACH_CHILD_STATUS_OKAY)(fn)
1958
1975#define DT_FOREACH_CHILD_STATUS_OKAY_VARGS(node_id, fn, ...) \
1976 DT_CAT(node_id, _FOREACH_CHILD_STATUS_OKAY_VARGS)(fn, __VA_ARGS__)
1977
2022#define DT_FOREACH_PROP_ELEM(node_id, prop, fn) \
2023 DT_CAT4(node_id, _P_, prop, _FOREACH_PROP_ELEM)(fn)
2024
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__)
2044
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)), \
2097 ())
2098
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__)), \
2141 ())
2142
2167#define DT_NODE_EXISTS(node_id) IS_ENABLED(DT_CAT(node_id, _EXISTS))
2168
2188#define DT_NODE_HAS_STATUS(node_id, status) \
2189 DT_NODE_HAS_STATUS_INTERNAL(node_id, status)
2190
2208#define DT_HAS_COMPAT_STATUS_OKAY(compat) \
2209 IS_ENABLED(DT_CAT(DT_COMPAT_HAS_OKAY_, compat))
2210
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)))
2220
2244#define DT_NODE_HAS_COMPAT(node_id, compat) \
2245 IS_ENABLED(DT_CAT(node_id, _COMPAT_MATCHES_##compat))
2246
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)
2261
2275#define DT_NODE_HAS_PROP(node_id, prop) \
2276 IS_ENABLED(DT_CAT(node_id, _P_##prop##_EXISTS))
2277
2278
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))
2298
2308#define DT_PHA_HAS_CELL(node_id, pha, cell) \
2309 DT_PHA_HAS_CELL_AT_IDX(node_id, pha, 0, cell)
2310
2349#define DT_BUS(node_id) DT_CAT(node_id, _BUS)
2350
2356#define DT_BUS_LABEL(node_id) DT_PROP(DT_BUS(node_id), label)
2357
2382#define DT_ON_BUS(node_id, bus) IS_ENABLED(DT_CAT(node_id, _BUS_##bus))
2383
2400#define DT_DRV_INST(inst) DT_INST(inst, DT_DRV_COMPAT)
2401
2413#define DT_INST_FOREACH_CHILD(inst, fn) \
2414 DT_FOREACH_CHILD(DT_DRV_INST(inst), fn)
2415
2428#define DT_INST_FOREACH_CHILD_VARGS(inst, fn, ...) \
2429 DT_FOREACH_CHILD_VARGS(DT_DRV_INST(inst), fn, __VA_ARGS__)
2430
2437#define DT_INST_ENUM_IDX(inst, prop) \
2438 DT_ENUM_IDX(DT_DRV_INST(inst), prop)
2439
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)
2450
2457#define DT_INST_PROP(inst, prop) DT_PROP(DT_DRV_INST(inst), prop)
2458
2465#define DT_INST_PROP_LEN(inst, prop) DT_PROP_LEN(DT_DRV_INST(inst), prop)
2466
2476#define DT_INST_PROP_HAS_IDX(inst, prop, idx) \
2477 DT_PROP_HAS_IDX(DT_DRV_INST(inst), prop, idx)
2478
2487#define DT_INST_PROP_HAS_NAME(inst, prop, name) \
2488 DT_PROP_HAS_NAME(DT_DRV_INST(inst), prop, name)
2489
2497#define DT_INST_PROP_BY_IDX(inst, prop, idx) \
2498 DT_PROP_BY_IDX(DT_DRV_INST(inst), prop, idx)
2499
2507#define DT_INST_PROP_OR(inst, prop, default_value) \
2508 DT_PROP_OR(DT_DRV_INST(inst), prop, default_value)
2509
2515#define DT_INST_LABEL(inst) DT_INST_PROP(inst, label)
2516
2524#define DT_INST_STRING_TOKEN(inst, prop) \
2525 DT_STRING_TOKEN(DT_DRV_INST(inst), prop)
2526
2534#define DT_INST_STRING_UPPER_TOKEN(inst, prop) \
2535 DT_STRING_UPPER_TOKEN(DT_DRV_INST(inst), prop)
2536
2545#define DT_INST_PROP_BY_PHANDLE(inst, ph, prop) \
2546 DT_INST_PROP_BY_PHANDLE_IDX(inst, ph, 0, prop)
2547
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)
2561
2570#define DT_INST_PHA_BY_IDX(inst, pha, idx, cell) \
2571 DT_PHA_BY_IDX(DT_DRV_INST(inst), pha, idx, cell)
2572
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)
2584
2593#define DT_INST_PHA(inst, pha, cell) DT_INST_PHA_BY_IDX(inst, pha, 0, cell)
2594
2603#define DT_INST_PHA_OR(inst, pha, cell, default_value) \
2604 DT_INST_PHA_BY_IDX_OR(inst, pha, 0, cell, default_value)
2605
2615#define DT_INST_PHA_BY_NAME(inst, pha, name, cell) \
2616 DT_PHA_BY_NAME(DT_DRV_INST(inst), pha, name, cell)
2617
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)
2629
2638#define DT_INST_PHANDLE_BY_NAME(inst, pha, name) \
2639 DT_PHANDLE_BY_NAME(DT_DRV_INST(inst), pha, name) \
2640
2650#define DT_INST_PHANDLE_BY_IDX(inst, prop, idx) \
2651 DT_PHANDLE_BY_IDX(DT_DRV_INST(inst), prop, idx)
2652
2661#define DT_INST_PHANDLE(inst, prop) DT_INST_PHANDLE_BY_IDX(inst, prop, 0)
2662
2670#define DT_INST_REG_HAS_IDX(inst, idx) DT_REG_HAS_IDX(DT_DRV_INST(inst), idx)
2671
2678#define DT_INST_REG_ADDR_BY_IDX(inst, idx) DT_REG_ADDR_BY_IDX(DT_DRV_INST(inst), idx)
2679
2686#define DT_INST_REG_SIZE_BY_IDX(inst, idx) \
2687 DT_REG_SIZE_BY_IDX(DT_DRV_INST(inst), idx)
2688
2695#define DT_INST_REG_ADDR_BY_NAME(inst, name) \
2696 DT_REG_ADDR_BY_NAME(DT_DRV_INST(inst), name)
2697
2704#define DT_INST_REG_SIZE_BY_NAME(inst, name) \
2705 DT_REG_SIZE_BY_NAME(DT_DRV_INST(inst), name)
2706
2712#define DT_INST_REG_ADDR(inst) DT_INST_REG_ADDR_BY_IDX(inst, 0)
2713
2719#define DT_INST_REG_SIZE(inst) DT_INST_REG_SIZE_BY_IDX(inst, 0)
2720
2728#define DT_INST_IRQ_BY_IDX(inst, idx, cell) \
2729 DT_IRQ_BY_IDX(DT_DRV_INST(inst), idx, cell)
2730
2738#define DT_INST_IRQ_BY_NAME(inst, name, cell) \
2739 DT_IRQ_BY_NAME(DT_DRV_INST(inst), name, cell)
2740
2747#define DT_INST_IRQ(inst, cell) DT_INST_IRQ_BY_IDX(inst, 0, cell)
2748
2754#define DT_INST_IRQN(inst) DT_INST_IRQ(inst, irq)
2755
2761#define DT_INST_BUS(inst) DT_BUS(DT_DRV_INST(inst))
2762
2768#define DT_INST_BUS_LABEL(inst) DT_BUS_LABEL(DT_DRV_INST(inst))
2769
2777#define DT_INST_ON_BUS(inst, bus) DT_ON_BUS(DT_DRV_INST(inst), bus)
2778
2788#define DT_INST_STRING_TOKEN_OR(inst, name, default_value) \
2789 DT_STRING_TOKEN_OR(DT_DRV_INST(inst), name, default_value)
2790
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)
2802
2831#define DT_ANY_INST_ON_BUS_STATUS_OKAY(bus) \
2832 DT_COMPAT_ON_BUS_INTERNAL(DT_DRV_COMPAT, bus)
2833
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)), \
2897 ())
2898
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__)), \
2914 ())
2915
2926#define DT_INST_FOREACH_PROP_ELEM(inst, prop, fn) \
2927 DT_FOREACH_PROP_ELEM(DT_DRV_INST(inst), prop, fn)
2928
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__)
2945
2952#define DT_INST_NODE_HAS_PROP(inst, prop) \
2953 DT_NODE_HAS_PROP(DT_DRV_INST(inst), prop)
2954
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)
2967
2977#define DT_INST_PHA_HAS_CELL(inst, pha, cell) \
2978 DT_INST_PHA_HAS_CELL_AT_IDX(inst, pha, 0, cell)
2979
2987#define DT_INST_IRQ_HAS_IDX(inst, idx) DT_IRQ_HAS_IDX(DT_DRV_INST(inst), idx)
2988
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)
2999
3007#define DT_INST_IRQ_HAS_CELL(inst, cell) \
3008 DT_INST_IRQ_HAS_CELL_AT_IDX(inst, 0, cell)
3009
3016#define DT_INST_IRQ_HAS_NAME(inst, name) \
3017 DT_IRQ_HAS_NAME(DT_DRV_INST(inst), name)
3018
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
3028
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
3052/*
3053 * If you need to define a bigger DT_CATN(), do so here. Don't leave
3054 * any "holes" of undefined macros, please.
3055 */
3056
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))
3067
3068/* have these last so they have access to all previously defined macros */
3071#include <zephyr/devicetree/gpio.h>
3072#include <zephyr/devicetree/spi.h>
3073#include <zephyr/devicetree/dma.h>
3074#include <zephyr/devicetree/pwms.h>
3079#include <zephyr/devicetree/can.h>
3081#include <zephyr/devicetree/mbox.h>
3082
3083#endif /* DEVICETREE_H */
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.
Misc utilities.