Zephyr Project API 4.2.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 *
6 * Not a generated file. Feel free to modify.
7 */
8
16#ifndef ZEPHYR_INCLUDE_DEVICETREE_H_
17#define ZEPHYR_INCLUDE_DEVICETREE_H_
18
19#include <zephyr/devicetree_generated.h>
21
22#if !defined(_LINKER) && !defined(_ASMLANGUAGE)
23#include <stdint.h>
24#endif
25
26#include <zephyr/sys/util.h>
27
37/*
38 * Property suffixes
39 * -----------------
40 *
41 * These are the optional parts that come after the _P_<property>
42 * part in DT_N_<path-id>_P_<property-id> macros, or the "prop-suf"
43 * nonterminal in the DT guide's macros.bnf file.
44 *
45 * Before adding new ones, check this list to avoid conflicts. If any
46 * are missing from this list, please add them. It should be complete.
47 *
48 * _ENUM_IDX: property's value as an index into bindings enum
49 * _ENUM_VAL_<val>_EXISTS property's value as a token exists
50 * _EXISTS: property is defined
51 * _FOREACH_PROP_ELEM: helper for "iterating" over values in the property
52 * _FOREACH_PROP_ELEM_VARGS: foreach functions with variable number of arguments
53 * _IDX_<i>: logical index into property
54 * _IDX_<i>_EXISTS: logical index into property is defined
55 * _IDX_<i>_PH: phandle array's phandle by index (or phandle, phandles)
56 * _IDX_<i>_STRING_TOKEN: string array element value as a token
57 * _IDX_<i>_STRING_UPPER_TOKEN: string array element value as a uppercased token
58 * _IDX <i>_STRING_UNQUOTED: string array element value as a sequence of tokens, with no quotes
59 * _IDX_<i>_VAL_<val>: phandle array's specifier value by index
60 * _IDX_<i>_VAL_<val>_EXISTS: cell value exists, by index
61 * _LEN: property logical length
62 * _NAME_<name>_PH: phandle array's phandle by name
63 * _NAME_<name>_VAL_<val>: phandle array's property specifier by name
64 * _NAME_<name>_VAL_<val>_EXISTS: cell value exists, by name
65 * _STRING_TOKEN: string property's value as a token
66 * _STRING_UPPER_TOKEN: like _STRING_TOKEN, but uppercased
67 * _STRING_UNQUOTED: string property's value as a sequence of tokens, with no quotes
68 */
69
83#define DT_INVALID_NODE _
84
88#define DT_ROOT DT_N
89
140#define DT_PATH(...) DT_PATH_INTERNAL(__VA_ARGS__)
141
196#define DT_NODELABEL(label) DT_CAT(DT_N_NODELABEL_, label)
197
236#define DT_ALIAS(alias) DT_CAT(DT_N_ALIAS_, alias)
237
243#define DT_HAS_ALIAS(alias_name) DT_NODE_EXISTS(DT_ALIAS(alias_name))
244
253#define DT_NODE_HASH(node_id) DT_CAT(node_id, _HASH)
254
349#define DT_INST(inst, compat) UTIL_CAT(DT_N_INST, DT_DASH(inst, compat))
350
374#define DT_PARENT(node_id) DT_CAT(node_id, _PARENT)
375
399#define DT_GPARENT(node_id) DT_PARENT(DT_PARENT(node_id))
400
436#define DT_CHILD(node_id, child) UTIL_CAT(node_id, DT_S_PREFIX(child))
437
479#define DT_COMPAT_GET_ANY_STATUS_OKAY(compat) \
480 COND_CODE_1(DT_HAS_COMPAT_STATUS_OKAY(compat), \
481 (DT_INST(0, compat)), \
482 (DT_INVALID_NODE))
483
511#define DT_NODE_PATH(node_id) DT_CAT(node_id, _PATH)
512
537#define DT_NODE_FULL_NAME(node_id) DT_CAT(node_id, _FULL_NAME)
538
565#define DT_NODE_FULL_NAME_UNQUOTED(node_id) DT_CAT(node_id, _FULL_NAME_UNQUOTED)
566
593#define DT_NODE_FULL_NAME_TOKEN(node_id) DT_CAT(node_id, _FULL_NAME_TOKEN)
594
623#define DT_NODE_FULL_NAME_UPPER_TOKEN(node_id) DT_CAT(node_id, _FULL_NAME_UPPER_TOKEN)
624
651#define DT_NODE_CHILD_IDX(node_id) DT_CAT(node_id, _CHILD_IDX)
652
659#define DT_CHILD_NUM(node_id) DT_CAT(node_id, _CHILD_NUM)
660
661
669#define DT_CHILD_NUM_STATUS_OKAY(node_id) \
670 DT_CAT(node_id, _CHILD_NUM_STATUS_OKAY)
671
692#define DT_SAME_NODE(node_id1, node_id2) \
693 IS_EQ(DT_DEP_ORD(node_id1), DT_DEP_ORD(node_id2))
694
719#define DT_NODELABEL_STRING_ARRAY(node_id) \
720 { DT_FOREACH_NODELABEL(node_id, DT_NODELABEL_STRING_ARRAY_ENTRY_INTERNAL) }
721
762#define DT_PROP(node_id, prop) DT_CAT3(node_id, _P_, prop)
763
796#define DT_PROP_LEN(node_id, prop) DT_CAT4(node_id, _P_, prop, _LEN)
797
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))
815
836#define DT_PROP_HAS_IDX(node_id, prop, idx) \
837 IS_ENABLED(DT_CAT6(node_id, _P_, prop, _IDX_, idx, _EXISTS))
838
871#define DT_PROP_HAS_NAME(node_id, prop, name) \
872 IS_ENABLED(DT_CAT6(node_id, _P_, prop, _NAME_, name, _EXISTS))
873
908#define DT_PROP_BY_IDX(node_id, prop, idx) \
909 DT_CAT5(node_id, _P_, prop, _IDX_, idx)
910
919#define DT_PROP_LAST(node_id, prop) \
920 DT_PROP_BY_IDX(node_id, prop, UTIL_DEC(DT_PROP_LEN(node_id, prop)))
921
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))
938
994#define DT_ENUM_IDX_BY_IDX(node_id, prop, idx) \
995 DT_CAT6(node_id, _P_, prop, _IDX_, idx, _ENUM_IDX)
996
1003#define DT_ENUM_IDX(node_id, prop) DT_ENUM_IDX_BY_IDX(node_id, prop, 0)
1004
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))
1023
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)
1034
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))
1046
1054#define DT_ENUM_HAS_VALUE(node_id, prop, value) \
1055 IS_ENABLED(DT_CAT6(node_id, _P_, prop, _ENUM_VAL_, value, _EXISTS))
1056
1116#define DT_STRING_TOKEN(node_id, prop) \
1117 DT_CAT4(node_id, _P_, prop, _STRING_TOKEN)
1118
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))
1135
1193#define DT_STRING_UPPER_TOKEN(node_id, prop) \
1194 DT_CAT4(node_id, _P_, prop, _STRING_UPPER_TOKEN)
1195
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))
1213
1254#define DT_STRING_UNQUOTED(node_id, prop) \
1255 DT_CAT4(node_id, _P_, prop, _STRING_UNQUOTED)
1256
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))
1274
1322#define DT_STRING_TOKEN_BY_IDX(node_id, prop, idx) \
1323 DT_CAT6(node_id, _P_, prop, _IDX_, idx, _STRING_TOKEN)
1324
1372#define DT_STRING_UPPER_TOKEN_BY_IDX(node_id, prop, idx) \
1373 DT_CAT6(node_id, _P_, prop, _IDX_, idx, _STRING_UPPER_TOKEN)
1374
1415#define DT_STRING_UNQUOTED_BY_IDX(node_id, prop, idx) \
1416 DT_CAT6(node_id, _P_, prop, _IDX_, idx, _STRING_UNQUOTED)
1417
1418/*
1419 * phandle properties
1420 *
1421 * These are special-cased to manage the impedance mismatch between
1422 * phandles, which are just uint32_t node properties that only make sense
1423 * within the tree itself, and C values.
1424 */
1425
1471#define DT_PROP_BY_PHANDLE_IDX(node_id, phs, idx, prop) \
1472 DT_PROP(DT_PHANDLE_BY_IDX(node_id, phs, idx), prop)
1473
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)
1495
1507#define DT_PROP_BY_PHANDLE(node_id, ph, prop) \
1508 DT_PROP_BY_PHANDLE_IDX(node_id, ph, 0, prop)
1509
1564#define DT_PHA_BY_IDX(node_id, pha, idx, cell) \
1565 DT_CAT7(node_id, _P_, pha, _IDX_, idx, _VAL_, cell)
1566
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)
1592
1600#define DT_PHA(node_id, pha, cell) DT_PHA_BY_IDX(node_id, pha, 0, cell)
1601
1616#define DT_PHA_OR(node_id, pha, cell, default_value) \
1617 DT_PHA_BY_IDX_OR(node_id, pha, 0, cell, default_value)
1618
1659#define DT_PHA_BY_NAME(node_id, pha, name, cell) \
1660 DT_CAT7(node_id, _P_, pha, _NAME_, name, _VAL_, cell)
1661
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)
1685
1733#define DT_PHANDLE_BY_NAME(node_id, pha, name) \
1734 DT_CAT6(node_id, _P_, pha, _NAME_, name, _PH)
1735
1785#define DT_PHANDLE_BY_IDX(node_id, prop, idx) \
1786 DT_CAT6(node_id, _P_, prop, _IDX_, idx, _PH)
1787
1799#define DT_PHANDLE(node_id, prop) DT_PHANDLE_BY_IDX(node_id, prop, 0)
1800
1847#define DT_NUM_RANGES(node_id) DT_CAT(node_id, _RANGES_NUM)
1848
1901#define DT_RANGES_HAS_IDX(node_id, idx) \
1902 IS_ENABLED(DT_CAT4(node_id, _RANGES_IDX_, idx, _EXISTS))
1903
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))
1958
1996#define DT_RANGES_CHILD_BUS_FLAGS_BY_IDX(node_id, idx) \
1997 DT_CAT4(node_id, _RANGES_IDX_, idx, _VAL_CHILD_BUS_FLAGS)
1998
2045#define DT_RANGES_CHILD_BUS_ADDRESS_BY_IDX(node_id, idx) \
2046 DT_CAT4(node_id, _RANGES_IDX_, idx, _VAL_CHILD_BUS_ADDRESS)
2047
2094#define DT_RANGES_PARENT_BUS_ADDRESS_BY_IDX(node_id, idx) \
2095 DT_CAT4(node_id, _RANGES_IDX_, idx, _VAL_PARENT_BUS_ADDRESS)
2096
2143#define DT_RANGES_LENGTH_BY_IDX(node_id, idx) \
2144 DT_CAT4(node_id, _RANGES_IDX_, idx, _VAL_LENGTH)
2145
2185#define DT_FOREACH_RANGE(node_id, fn) \
2186 DT_CAT(node_id, _FOREACH_RANGE)(fn)
2187
2233#define DT_NODE_VENDOR_BY_IDX(node_id, idx) \
2234 DT_CAT3(node_id, _COMPAT_VENDOR_IDX_, idx)
2235
2248#define DT_NODE_VENDOR_HAS_IDX(node_id, idx) \
2249 IS_ENABLED(DT_CAT4(node_id, _COMPAT_VENDOR_IDX_, idx, _EXISTS))
2250
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))
2268
2277#define DT_NODE_VENDOR_OR(node_id, default_value) \
2278 DT_NODE_VENDOR_BY_IDX_OR(node_id, 0, default_value)
2279
2309#define DT_NODE_MODEL_BY_IDX(node_id, idx) \
2310 DT_CAT3(node_id, _COMPAT_MODEL_IDX_, idx)
2311
2324#define DT_NODE_MODEL_HAS_IDX(node_id, idx) \
2325 IS_ENABLED(DT_CAT4(node_id, _COMPAT_MODEL_IDX_, idx, _EXISTS))
2326
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))
2344
2353#define DT_NODE_MODEL_OR(node_id, default_value) \
2354 DT_NODE_MODEL_BY_IDX_OR(node_id, 0, default_value)
2355
2373#define DT_NUM_REGS(node_id) DT_CAT(node_id, _REG_NUM)
2374
2386#define DT_REG_HAS_IDX(node_id, idx) \
2387 IS_ENABLED(DT_CAT4(node_id, _REG_IDX_, idx, _EXISTS))
2388
2400#define DT_REG_HAS_NAME(node_id, name) \
2401 IS_ENABLED(DT_CAT4(node_id, _REG_NAME_, name, _EXISTS))
2402
2414#define DT_REG_ADDR_BY_IDX_RAW(node_id, idx) \
2415 DT_CAT4(node_id, _REG_IDX_, idx, _VAL_ADDRESS)
2416
2428#define DT_REG_ADDR_RAW(node_id) \
2429 DT_REG_ADDR_BY_IDX_RAW(node_id, 0)
2430
2437#define DT_REG_ADDR_BY_IDX(node_id, idx) \
2438 DT_U32_C(DT_REG_ADDR_BY_IDX_RAW(node_id, idx))
2439
2451#define DT_REG_SIZE_BY_IDX(node_id, idx) \
2452 DT_U32_C(DT_CAT4(node_id, _REG_IDX_, idx, _VAL_SIZE))
2453
2461#define DT_REG_ADDR(node_id) DT_REG_ADDR_BY_IDX(node_id, 0)
2462
2473#define DT_REG_ADDR_U64(node_id) DT_U64_C(DT_REG_ADDR_BY_IDX_RAW(node_id, 0))
2474
2482#define DT_REG_SIZE(node_id) DT_REG_SIZE_BY_IDX(node_id, 0)
2483
2490#define DT_REG_ADDR_BY_NAME(node_id, name) \
2491 DT_U32_C(DT_CAT4(node_id, _REG_NAME_, name, _VAL_ADDRESS))
2492
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))
2504
2517#define DT_REG_ADDR_BY_NAME_U64(node_id, name) \
2518 DT_U64_C(DT_CAT4(node_id, _REG_NAME_, name, _VAL_ADDRESS))
2519
2526#define DT_REG_SIZE_BY_NAME(node_id, name) \
2527 DT_U32_C(DT_CAT4(node_id, _REG_NAME_, name, _VAL_SIZE))
2528
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))
2540
2541
2560#define DT_NUM_IRQS(node_id) DT_CAT(node_id, _IRQ_NUM)
2561
2586#define DT_NUM_NODELABELS(node_id) DT_CAT(node_id, _NODELABEL_NUM)
2587
2594#define DT_IRQ_LEVEL(node_id) DT_CAT(node_id, _IRQ_LEVEL)
2595
2606#define DT_IRQ_HAS_IDX(node_id, idx) \
2607 IS_ENABLED(DT_CAT4(node_id, _IRQ_IDX_, idx, _EXISTS))
2608
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))
2621
2629#define DT_IRQ_HAS_CELL(node_id, cell) DT_IRQ_HAS_CELL_AT_IDX(node_id, 0, cell)
2630
2640#define DT_IRQ_HAS_NAME(node_id, name) \
2641 IS_ENABLED(DT_CAT4(node_id, _IRQ_NAME_, name, _VAL_irq_EXISTS))
2642
2678#define DT_IRQ_BY_IDX(node_id, idx, cell) \
2679 DT_CAT5(node_id, _IRQ_IDX_, idx, _VAL_, cell)
2680
2696#define DT_IRQ_BY_NAME(node_id, name, cell) \
2697 DT_CAT5(node_id, _IRQ_NAME_, name, _VAL_, cell)
2698
2706#define DT_IRQ(node_id, cell) DT_IRQ_BY_IDX(node_id, 0, cell)
2707
2750#define DT_IRQ_INTC_BY_IDX(node_id, idx) \
2751 DT_CAT4(node_id, _IRQ_IDX_, idx, _CONTROLLER)
2752
2797#define DT_IRQ_INTC_BY_NAME(node_id, name) \
2798 DT_CAT4(node_id, _IRQ_NAME_, name, _CONTROLLER)
2799
2839#define DT_IRQ_INTC(node_id) \
2840 DT_IRQ_INTC_BY_IDX(node_id, 0)
2841
2846/* DT helper macro to encode a node's IRQN to level 1 according to the multi-level scheme */
2847#define DT_IRQN_L1_INTERNAL(node_id, idx) DT_IRQ_BY_IDX(node_id, idx, irq)
2848/* DT helper macro to encode a node's IRQN to level 2 according to the multi-level scheme */
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))
2852/* DT helper macro to encode a node's IRQN to level 3 according to the multi-level scheme */
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))
2857/* DT helper macro for the macros above */
2858#define DT_IRQN_LVL_INTERNAL(node_id, idx, level) DT_CAT3(DT_IRQN_L, level, _INTERNAL)(node_id, idx)
2859
2864#define DT_MULTI_LEVEL_IRQN_INTERNAL(node_id, idx) \
2865 DT_IRQN_LVL_INTERNAL(node_id, idx, DT_IRQ_LEVEL(node_id))
2866
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)))
2883
2894#define DT_IRQN(node_id) DT_IRQN_BY_IDX(node_id, 0)
2895
2914#define DT_CHOSEN(prop) DT_CAT(DT_CHOSEN_, prop)
2915
2922#define DT_HAS_CHOSEN(prop) IS_ENABLED(DT_CAT3(DT_CHOSEN_, prop, _EXISTS))
2923
2973#define DT_FOREACH_NODE(fn) DT_FOREACH_HELPER(fn)
2974
2987#define DT_FOREACH_NODE_VARGS(fn, ...) DT_FOREACH_VARGS_HELPER(fn, __VA_ARGS__)
2988
3000#define DT_FOREACH_STATUS_OKAY_NODE(fn) DT_FOREACH_OKAY_HELPER(fn)
3001
3016#define DT_FOREACH_STATUS_OKAY_NODE_VARGS(fn, ...) DT_FOREACH_OKAY_VARGS_HELPER(fn, __VA_ARGS__)
3017
3064#define DT_FOREACH_ANCESTOR(node_id, fn) \
3065 DT_CAT(node_id, _FOREACH_ANCESTOR)(fn)
3066
3110#define DT_FOREACH_CHILD(node_id, fn) \
3111 DT_CAT(node_id, _FOREACH_CHILD)(fn)
3112
3153#define DT_FOREACH_CHILD_SEP(node_id, fn, sep) \
3154 DT_CAT(node_id, _FOREACH_CHILD_SEP)(fn, sep)
3155
3171#define DT_FOREACH_CHILD_VARGS(node_id, fn, ...) \
3172 DT_CAT(node_id, _FOREACH_CHILD_VARGS)(fn, __VA_ARGS__)
3173
3189#define DT_FOREACH_CHILD_SEP_VARGS(node_id, fn, sep, ...) \
3190 DT_CAT(node_id, _FOREACH_CHILD_SEP_VARGS)(fn, sep, __VA_ARGS__)
3191
3207#define DT_FOREACH_CHILD_STATUS_OKAY(node_id, fn) \
3208 DT_CAT(node_id, _FOREACH_CHILD_STATUS_OKAY)(fn)
3209
3226#define DT_FOREACH_CHILD_STATUS_OKAY_SEP(node_id, fn, sep) \
3227 DT_CAT(node_id, _FOREACH_CHILD_STATUS_OKAY_SEP)(fn, sep)
3228
3248#define DT_FOREACH_CHILD_STATUS_OKAY_VARGS(node_id, fn, ...) \
3249 DT_CAT(node_id, _FOREACH_CHILD_STATUS_OKAY_VARGS)(fn, __VA_ARGS__)
3250
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__)
3271
3322#define DT_FOREACH_PROP_ELEM(node_id, prop, fn) \
3323 DT_CAT4(node_id, _P_, prop, _FOREACH_PROP_ELEM)(fn)
3324
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)
3369
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__)
3392
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__)
3412
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)), \
3469 ())
3470
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__)), \
3519 ())
3520
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__)), \
3537 ())
3538
3539
3578#define DT_FOREACH_NODELABEL(node_id, fn) DT_CAT(node_id, _FOREACH_NODELABEL)(fn)
3579
3617#define DT_FOREACH_NODELABEL_VARGS(node_id, fn, ...) \
3618 DT_CAT(node_id, _FOREACH_NODELABEL_VARGS)(fn, __VA_ARGS__)
3619
3644#define DT_NODE_EXISTS(node_id) IS_ENABLED(DT_CAT(node_id, _EXISTS))
3645
3667#define DT_NODE_HAS_STATUS(node_id, status) \
3668 DT_NODE_HAS_STATUS_INTERNAL(node_id, status)
3669
3690#define DT_NODE_HAS_STATUS_OKAY(node_id) DT_NODE_HAS_STATUS(node_id, okay)
3691
3711#define DT_HAS_COMPAT_STATUS_OKAY(compat) \
3712 IS_ENABLED(DT_CAT(DT_COMPAT_HAS_OKAY_, compat))
3713
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)))
3723
3751#define DT_NODE_HAS_COMPAT(node_id, compat) \
3752 IS_ENABLED(DT_CAT3(node_id, _COMPAT_MATCHES_, compat))
3753
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))
3770
3784#define DT_NODE_HAS_PROP(node_id, prop) \
3785 IS_ENABLED(DT_CAT4(node_id, _P_, prop, _EXISTS))
3786
3787
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))
3807
3817#define DT_PHA_HAS_CELL(node_id, pha, cell) \
3818 DT_PHA_HAS_CELL_AT_IDX(node_id, pha, 0, cell)
3819
3840#define DT_FOREACH_PHA_CELL_BY_IDX(node_id, pha, idx, fn) \
3841 DT_CAT6(node_id, _P_, pha, _IDX_, idx, _FOREACH_CELL)(fn)
3842
3855#define DT_FOREACH_PHA_CELL_BY_IDX_SEP(node_id, pha, idx, fn, sep) \
3856 DT_CAT6(node_id, _P_, pha, _IDX_, idx, _FOREACH_CELL_SEP)(fn, sep)
3857
3866#define DT_PHA_NUM_CELLS_BY_IDX(node_id, pha, idx) \
3867 DT_CAT6(node_id, _P_, pha, _IDX_, idx, _NUM_CELLS)
3868
3880#define DT_PHA_ELEM_NAME_BY_IDX(node_id, pha, idx) \
3881 DT_CAT6(node_id, _P_, pha, _IDX_, idx, _NAME)
3882
3904#define DT_FOREACH_PHA_CELL_BY_NAME(node_id, pha, name, fn) \
3905 DT_CAT6(node_id, _P_, pha, _NAME_, name, _FOREACH_CELL)(fn)
3906
3919#define DT_FOREACH_PHA_CELL_BY_NAME_SEP(node_id, pha, name, fn, sep) \
3920 DT_CAT6(node_id, _P_, pha, _NAME_, name, _FOREACH_CELL_SEP)(fn, sep)
3921
3930#define DT_PHA_NUM_CELLS_BY_NAME(node_id, pha, name) \
3931 DT_CAT6(node_id, _P_, pha, _NAME_, name, _NUM_CELLS)
3932
3944#define DT_PHA_ELEM_IDX_BY_NAME(node_id, pha, name) \
3945 DT_CAT6(node_id, _P_, pha, _NAME_, name, _IDX)
3946
3947
3989#define DT_BUS(node_id) DT_CAT(node_id, _BUS)
3990
4019#define DT_ON_BUS(node_id, bus) IS_ENABLED(DT_CAT3(node_id, _BUS_, bus))
4020
4037#define DT_DRV_INST(inst) DT_INST(inst, DT_DRV_COMPAT)
4038
4046#define DT_INST_PARENT(inst) DT_PARENT(DT_DRV_INST(inst))
4047
4055#define DT_INST_GPARENT(inst) DT_GPARENT(DT_DRV_INST(inst))
4056
4066#define DT_INST_CHILD(inst, child) \
4067 DT_CHILD(DT_DRV_INST(inst), child)
4068
4078#define DT_INST_CHILD_NUM(inst) DT_CHILD_NUM(DT_DRV_INST(inst))
4079
4089#define DT_INST_CHILD_NUM_STATUS_OKAY(inst) \
4090 DT_CHILD_NUM_STATUS_OKAY(DT_DRV_INST(inst))
4091
4100#define DT_INST_NODELABEL_STRING_ARRAY(inst) DT_NODELABEL_STRING_ARRAY(DT_DRV_INST(inst))
4101
4110#define DT_INST_NUM_NODELABELS(inst) DT_NUM_NODELABELS(DT_DRV_INST(inst))
4111
4126#define DT_INST_FOREACH_CHILD(inst, fn) \
4127 DT_FOREACH_CHILD(DT_DRV_INST(inst), fn)
4128
4142#define DT_INST_FOREACH_CHILD_SEP(inst, fn, sep) \
4143 DT_FOREACH_CHILD_SEP(DT_DRV_INST(inst), fn, sep)
4144
4160#define DT_INST_FOREACH_CHILD_VARGS(inst, fn, ...) \
4161 DT_FOREACH_CHILD_VARGS(DT_DRV_INST(inst), fn, __VA_ARGS__)
4162
4177#define DT_INST_FOREACH_CHILD_SEP_VARGS(inst, fn, sep, ...) \
4178 DT_FOREACH_CHILD_SEP_VARGS(DT_DRV_INST(inst), fn, sep, __VA_ARGS__)
4179
4191#define DT_INST_FOREACH_CHILD_STATUS_OKAY(inst, fn) \
4192 DT_FOREACH_CHILD_STATUS_OKAY(DT_DRV_INST(inst), fn)
4193
4208#define DT_INST_FOREACH_CHILD_STATUS_OKAY_SEP(inst, fn, sep) \
4209 DT_FOREACH_CHILD_STATUS_OKAY_SEP(DT_DRV_INST(inst), fn, sep)
4210
4224#define DT_INST_FOREACH_CHILD_STATUS_OKAY_VARGS(inst, fn, ...) \
4225 DT_FOREACH_CHILD_STATUS_OKAY_VARGS(DT_DRV_INST(inst), fn, __VA_ARGS__)
4226
4242#define DT_INST_FOREACH_CHILD_STATUS_OKAY_SEP_VARGS(inst, fn, sep, ...) \
4243 DT_FOREACH_CHILD_STATUS_OKAY_SEP_VARGS(DT_DRV_INST(inst), fn, sep, __VA_ARGS__)
4244
4252#define DT_INST_ENUM_IDX_BY_IDX(inst, prop, idx) \
4253 DT_ENUM_IDX_BY_IDX(DT_DRV_INST(inst), prop, idx)
4254
4261#define DT_INST_ENUM_IDX(inst, prop) \
4262 DT_ENUM_IDX(DT_DRV_INST(inst), prop)
4263
4273#define DT_INST_ENUM_IDX_BY_IDX_OR(inst, prop, idx, default_idx_value) \
4274 DT_ENUM_IDX_BY_IDX_OR(DT_DRV_INST(inst), prop, idx, default_idx_value)
4275
4284#define DT_INST_ENUM_IDX_OR(inst, prop, default_idx_value) \
4285 DT_ENUM_IDX_OR(DT_DRV_INST(inst), prop, default_idx_value)
4286
4295#define DT_INST_ENUM_HAS_VALUE_BY_IDX(inst, prop, idx, value) \
4296 DT_ENUM_HAS_VALUE_BY_IDX(DT_DRV_INST(inst), prop, idx, value)
4297
4306#define DT_INST_ENUM_HAS_VALUE(inst, prop, value) \
4307 DT_ENUM_HAS_VALUE(DT_DRV_INST(inst), prop, value)
4308
4315#define DT_INST_PROP(inst, prop) DT_PROP(DT_DRV_INST(inst), prop)
4316
4323#define DT_INST_PROP_LEN(inst, prop) DT_PROP_LEN(DT_DRV_INST(inst), prop)
4324
4334#define DT_INST_PROP_HAS_IDX(inst, prop, idx) \
4335 DT_PROP_HAS_IDX(DT_DRV_INST(inst), prop, idx)
4336
4345#define DT_INST_PROP_HAS_NAME(inst, prop, name) \
4346 DT_PROP_HAS_NAME(DT_DRV_INST(inst), prop, name)
4347
4355#define DT_INST_PROP_BY_IDX(inst, prop, idx) \
4356 DT_PROP_BY_IDX(DT_DRV_INST(inst), prop, idx)
4357
4365#define DT_INST_PROP_OR(inst, prop, default_value) \
4366 DT_PROP_OR(DT_DRV_INST(inst), prop, default_value)
4367
4375#define DT_INST_PROP_LEN_OR(inst, prop, default_value) \
4376 DT_PROP_LEN_OR(DT_DRV_INST(inst), prop, default_value)
4377
4387#define DT_INST_STRING_TOKEN(inst, prop) \
4388 DT_STRING_TOKEN(DT_DRV_INST(inst), prop)
4389
4397#define DT_INST_STRING_UPPER_TOKEN(inst, prop) \
4398 DT_STRING_UPPER_TOKEN(DT_DRV_INST(inst), prop)
4399
4408#define DT_INST_STRING_UNQUOTED(inst, prop) \
4409 DT_STRING_UNQUOTED(DT_DRV_INST(inst), prop)
4410
4418#define DT_INST_STRING_TOKEN_BY_IDX(inst, prop, idx) \
4419 DT_STRING_TOKEN_BY_IDX(DT_DRV_INST(inst), prop, idx)
4420
4428#define DT_INST_STRING_UPPER_TOKEN_BY_IDX(inst, prop, idx) \
4429 DT_STRING_UPPER_TOKEN_BY_IDX(DT_DRV_INST(inst), prop, idx)
4430
4438#define DT_INST_STRING_UNQUOTED_BY_IDX(inst, prop, idx) \
4439 DT_STRING_UNQUOTED_BY_IDX(DT_DRV_INST(inst), prop, idx)
4440
4449#define DT_INST_PROP_BY_PHANDLE(inst, ph, prop) \
4450 DT_INST_PROP_BY_PHANDLE_IDX(inst, ph, 0, prop)
4451
4463#define DT_INST_PROP_BY_PHANDLE_IDX(inst, phs, idx, prop) \
4464 DT_PROP_BY_PHANDLE_IDX(DT_DRV_INST(inst), phs, idx, prop)
4465
4474#define DT_INST_PHA_BY_IDX(inst, pha, idx, cell) \
4475 DT_PHA_BY_IDX(DT_DRV_INST(inst), pha, idx, cell)
4476
4486#define DT_INST_PHA_BY_IDX_OR(inst, pha, idx, cell, default_value) \
4487 DT_PHA_BY_IDX_OR(DT_DRV_INST(inst), pha, idx, cell, default_value)
4488
4497#define DT_INST_PHA(inst, pha, cell) DT_INST_PHA_BY_IDX(inst, pha, 0, cell)
4498
4507#define DT_INST_PHA_OR(inst, pha, cell, default_value) \
4508 DT_INST_PHA_BY_IDX_OR(inst, pha, 0, cell, default_value)
4509
4519#define DT_INST_PHA_BY_NAME(inst, pha, name, cell) \
4520 DT_PHA_BY_NAME(DT_DRV_INST(inst), pha, name, cell)
4521
4531#define DT_INST_PHA_BY_NAME_OR(inst, pha, name, cell, default_value) \
4532 DT_PHA_BY_NAME_OR(DT_DRV_INST(inst), pha, name, cell, default_value)
4533
4542#define DT_INST_PHANDLE_BY_NAME(inst, pha, name) \
4543 DT_PHANDLE_BY_NAME(DT_DRV_INST(inst), pha, name) \
4544
4554#define DT_INST_PHANDLE_BY_IDX(inst, prop, idx) \
4555 DT_PHANDLE_BY_IDX(DT_DRV_INST(inst), prop, idx)
4556
4565#define DT_INST_PHANDLE(inst, prop) DT_INST_PHANDLE_BY_IDX(inst, prop, 0)
4566
4574#define DT_INST_REG_HAS_IDX(inst, idx) DT_REG_HAS_IDX(DT_DRV_INST(inst), idx)
4575
4583#define DT_INST_REG_HAS_NAME(inst, name) DT_REG_HAS_NAME(DT_DRV_INST(inst), name)
4584
4591#define DT_INST_REG_ADDR_BY_IDX_RAW(inst, idx) DT_REG_ADDR_BY_IDX_RAW(DT_DRV_INST(inst), idx)
4592
4599#define DT_INST_REG_ADDR_BY_IDX(inst, idx) DT_REG_ADDR_BY_IDX(DT_DRV_INST(inst), idx)
4600
4607#define DT_INST_REG_SIZE_BY_IDX(inst, idx) \
4608 DT_REG_SIZE_BY_IDX(DT_DRV_INST(inst), idx)
4609
4616#define DT_INST_REG_ADDR_BY_NAME(inst, name) \
4617 DT_REG_ADDR_BY_NAME(DT_DRV_INST(inst), name)
4618
4627#define DT_INST_REG_ADDR_BY_NAME_OR(inst, name, default_value) \
4628 DT_REG_ADDR_BY_NAME_OR(DT_DRV_INST(inst), name, default_value)
4629
4642#define DT_INST_REG_ADDR_BY_NAME_U64(inst, name) \
4643 DT_REG_ADDR_BY_NAME_U64(DT_DRV_INST(inst), name)
4644
4651#define DT_INST_REG_SIZE_BY_NAME(inst, name) \
4652 DT_REG_SIZE_BY_NAME(DT_DRV_INST(inst), name)
4653
4662#define DT_INST_REG_SIZE_BY_NAME_OR(inst, name, default_value) \
4663 DT_REG_SIZE_BY_NAME_OR(DT_DRV_INST(inst), name, default_value)
4664
4670#define DT_INST_REG_ADDR_RAW(inst) DT_INST_REG_ADDR_BY_IDX_RAW(inst, 0)
4671
4677#define DT_INST_REG_ADDR(inst) DT_INST_REG_ADDR_BY_IDX(inst, 0)
4678
4690#define DT_INST_REG_ADDR_U64(inst) DT_REG_ADDR_U64(DT_DRV_INST(inst))
4691
4697#define DT_INST_REG_SIZE(inst) DT_INST_REG_SIZE_BY_IDX(inst, 0)
4698
4705#define DT_INST_NUM_IRQS(inst) DT_NUM_IRQS(DT_DRV_INST(inst))
4706
4713#define DT_INST_IRQ_LEVEL(inst) DT_IRQ_LEVEL(DT_DRV_INST(inst))
4714
4722#define DT_INST_IRQ_BY_IDX(inst, idx, cell) \
4723 DT_IRQ_BY_IDX(DT_DRV_INST(inst), idx, cell)
4724
4731#define DT_INST_IRQ_INTC_BY_IDX(inst, idx) \
4732 DT_IRQ_INTC_BY_IDX(DT_DRV_INST(inst), idx)
4733
4740#define DT_INST_IRQ_INTC_BY_NAME(inst, name) \
4741 DT_IRQ_INTC_BY_NAME(DT_DRV_INST(inst), name)
4742
4750#define DT_INST_IRQ_INTC(inst) \
4751 DT_INST_IRQ_INTC_BY_IDX(inst, 0)
4752
4760#define DT_INST_IRQ_BY_NAME(inst, name, cell) \
4761 DT_IRQ_BY_NAME(DT_DRV_INST(inst), name, cell)
4762
4769#define DT_INST_IRQ(inst, cell) DT_INST_IRQ_BY_IDX(inst, 0, cell)
4770
4776#define DT_INST_IRQN(inst) DT_IRQN(DT_DRV_INST(inst))
4777
4784#define DT_INST_IRQN_BY_IDX(inst, idx) DT_IRQN_BY_IDX(DT_DRV_INST(inst), idx)
4785
4791#define DT_INST_BUS(inst) DT_BUS(DT_DRV_INST(inst))
4792
4800#define DT_INST_ON_BUS(inst, bus) DT_ON_BUS(DT_DRV_INST(inst), bus)
4801
4811#define DT_INST_STRING_TOKEN_OR(inst, name, default_value) \
4812 DT_STRING_TOKEN_OR(DT_DRV_INST(inst), name, default_value)
4813
4822#define DT_INST_STRING_UPPER_TOKEN_OR(inst, name, default_value) \
4823 DT_STRING_UPPER_TOKEN_OR(DT_DRV_INST(inst), name, default_value)
4824
4833#define DT_INST_STRING_UNQUOTED_OR(inst, name, default_value) \
4834 DT_STRING_UNQUOTED_OR(DT_DRV_INST(inst), name, default_value)
4835
4866#define DT_HAS_COMPAT_ON_BUS_STATUS_OKAY(compat, bus) \
4867 IS_ENABLED(DT_CAT4(DT_COMPAT_, compat, _BUS_, bus))
4868
4901#define DT_ANY_INST_ON_BUS_STATUS_OKAY(bus) \
4902 DT_HAS_COMPAT_ON_BUS_STATUS_OKAY(DT_DRV_COMPAT, bus)
4903
4948#define DT_ANY_INST_HAS_PROP_STATUS_OKAY(prop) \
4949 UTIL_NOT(IS_EMPTY( \
4950 DT_INST_FOREACH_STATUS_OKAY_VARGS(DT_ANY_INST_HAS_PROP_STATUS_OKAY_, prop)))
4951
4996#define DT_ALL_INST_HAS_PROP_STATUS_OKAY(prop) \
4997 IS_EMPTY(DT_INST_FOREACH_STATUS_OKAY_VARGS(DT_ALL_INST_HAS_PROP_STATUS_OKAY_, prop))
4998
5043#define DT_ANY_COMPAT_HAS_PROP_STATUS_OKAY(compat, prop) \
5044 (DT_COMPAT_FOREACH_STATUS_OKAY_VARGS(compat, DT_COMPAT_NODE_HAS_PROP_AND_OR, prop) 0)
5045
5093#define DT_ANY_INST_HAS_BOOL_STATUS_OKAY(prop) \
5094 UTIL_NOT(IS_EMPTY( \
5095 DT_INST_FOREACH_STATUS_OKAY_VARGS(DT_ANY_INST_HAS_BOOL_STATUS_OKAY_, prop)))
5096
5142#define DT_ALL_INST_HAS_BOOL_STATUS_OKAY(prop) \
5143 IS_EMPTY(DT_INST_FOREACH_STATUS_OKAY_VARGS(DT_ALL_INST_HAS_BOOL_STATUS_OKAY_, prop))
5144
5210#define DT_INST_FOREACH_STATUS_OKAY(fn) \
5211 COND_CODE_1(DT_HAS_COMPAT_STATUS_OKAY(DT_DRV_COMPAT), \
5212 (UTIL_CAT(DT_FOREACH_OKAY_INST_, \
5213 DT_DRV_COMPAT)(fn)), \
5214 ())
5215
5228#define DT_INST_FOREACH_STATUS_OKAY_VARGS(fn, ...) \
5229 COND_CODE_1(DT_HAS_COMPAT_STATUS_OKAY(DT_DRV_COMPAT), \
5230 (UTIL_CAT(DT_FOREACH_OKAY_INST_VARGS_, \
5231 DT_DRV_COMPAT)(fn, __VA_ARGS__)), \
5232 ())
5233
5243#define DT_INST_FOREACH_NODELABEL(inst, fn) \
5244 DT_FOREACH_NODELABEL(DT_DRV_INST(inst), fn)
5245
5257#define DT_INST_FOREACH_NODELABEL_VARGS(inst, fn, ...) \
5258 DT_FOREACH_NODELABEL_VARGS(DT_DRV_INST(inst), fn, __VA_ARGS__)
5259
5270#define DT_INST_FOREACH_PROP_ELEM(inst, prop, fn) \
5271 DT_FOREACH_PROP_ELEM(DT_DRV_INST(inst), prop, fn)
5272
5285#define DT_INST_FOREACH_PROP_ELEM_SEP(inst, prop, fn, sep) \
5286 DT_FOREACH_PROP_ELEM_SEP(DT_DRV_INST(inst), prop, fn, sep)
5287
5302#define DT_INST_FOREACH_PROP_ELEM_VARGS(inst, prop, fn, ...) \
5303 DT_FOREACH_PROP_ELEM_VARGS(DT_DRV_INST(inst), prop, fn, __VA_ARGS__)
5304
5322#define DT_INST_FOREACH_PROP_ELEM_SEP_VARGS(inst, prop, fn, sep, ...) \
5323 DT_FOREACH_PROP_ELEM_SEP_VARGS(DT_DRV_INST(inst), prop, fn, sep, \
5324 __VA_ARGS__)
5325
5332#define DT_INST_NODE_HAS_PROP(inst, prop) \
5333 DT_NODE_HAS_PROP(DT_DRV_INST(inst), prop)
5334
5341#define DT_INST_NODE_HAS_COMPAT(inst, compat) \
5342 DT_NODE_HAS_COMPAT(DT_DRV_INST(inst), compat)
5343
5354#define DT_INST_PHA_HAS_CELL_AT_IDX(inst, pha, idx, cell) \
5355 DT_PHA_HAS_CELL_AT_IDX(DT_DRV_INST(inst), pha, idx, cell)
5356
5366#define DT_INST_PHA_HAS_CELL(inst, pha, cell) \
5367 DT_INST_PHA_HAS_CELL_AT_IDX(inst, pha, 0, cell)
5368
5376#define DT_INST_IRQ_HAS_IDX(inst, idx) DT_IRQ_HAS_IDX(DT_DRV_INST(inst), idx)
5377
5386#define DT_INST_IRQ_HAS_CELL_AT_IDX(inst, idx, cell) \
5387 DT_IRQ_HAS_CELL_AT_IDX(DT_DRV_INST(inst), idx, cell)
5388
5396#define DT_INST_IRQ_HAS_CELL(inst, cell) \
5397 DT_INST_IRQ_HAS_CELL_AT_IDX(inst, 0, cell)
5398
5405#define DT_INST_IRQ_HAS_NAME(inst, name) \
5406 DT_IRQ_HAS_NAME(DT_DRV_INST(inst), name)
5407
5425#define DT_ANY_INST_HAS_PROP_STATUS_OKAY_(idx, prop) \
5426 IF_ENABLED(DT_INST_NODE_HAS_PROP(idx, prop), (1,))
5427
5440#define DT_ANY_INST_HAS_BOOL_STATUS_OKAY_(idx, prop) \
5441 IF_ENABLED(DT_INST_PROP(idx, prop), (1,))
5442
5454#define DT_ALL_INST_HAS_PROP_STATUS_OKAY_(idx, prop) \
5455 IF_DISABLED(DT_INST_NODE_HAS_PROP(idx, prop), (1,))
5456
5469#define DT_ALL_INST_HAS_BOOL_STATUS_OKAY_(idx, prop) \
5470 IF_DISABLED(DT_INST_PROP(idx, prop), (1,))
5471
5472#define DT_PATH_INTERNAL(...) \
5473 UTIL_CAT(DT_ROOT, MACRO_MAP_CAT(DT_S_PREFIX, __VA_ARGS__))
5479#define DT_S_PREFIX(name) _S_##name
5480
5495#define DT_CAT(a1, a2) a1 ## a2
5497#define DT_CAT3(a1, a2, a3) a1 ## a2 ## a3
5499#define DT_CAT4(a1, a2, a3, a4) a1 ## a2 ## a3 ## a4
5501#define DT_CAT5(a1, a2, a3, a4, a5) a1 ## a2 ## a3 ## a4 ## a5
5503#define DT_CAT6(a1, a2, a3, a4, a5, a6) a1 ## a2 ## a3 ## a4 ## a5 ## a6
5505#define DT_CAT7(a1, a2, a3, a4, a5, a6, a7) \
5506 a1 ## a2 ## a3 ## a4 ## a5 ## a6 ## a7
5508#define DT_CAT8(a1, a2, a3, a4, a5, a6, a7, a8) \
5509 a1 ## a2 ## a3 ## a4 ## a5 ## a6 ## a7 ## a8
5510/*
5511 * If you need to define a bigger DT_CATN(), do so here. Don't leave
5512 * any "holes" of undefined macros, please.
5513 */
5514
5516#define DT_DASH(...) MACRO_MAP_CAT(DT_DASH_PREFIX, __VA_ARGS__)
5518#define DT_DASH_PREFIX(name) _##name
5520#define DT_NODE_HAS_STATUS_INTERNAL(node_id, status) \
5521 IS_ENABLED(DT_CAT3(node_id, _STATUS_, status))
5522
5526#define DT_COMPAT_NODE_HAS_PROP_AND_OR(inst, compat, prop) \
5527 DT_NODE_HAS_PROP(DT_INST(inst, compat), prop) ||
5528
5533#if defined(_LINKER) || defined(_ASMLANGUAGE)
5534#define DT_U32_C(_v) (_v)
5535#else
5536#define DT_U32_C(_v) UINT32_C(_v)
5537#endif
5538
5543#if defined(_LINKER) || defined(_ASMLANGUAGE)
5544#define DT_U64_C(_v) (_v)
5545#else
5546#define DT_U64_C(_v) UINT64_C(_v)
5547#endif
5548
5549/* Helpers for DT_NODELABEL_STRING_ARRAY. We define our own stringify
5550 * in order to avoid adding a dependency on toolchain.h..
5551 */
5552#define DT_NODELABEL_STRING_ARRAY_ENTRY_INTERNAL(nodelabel) DT_STRINGIFY_INTERNAL(nodelabel),
5553#define DT_STRINGIFY_INTERNAL(arg) DT_STRINGIFY_INTERNAL_HELPER(arg)
5554#define DT_STRINGIFY_INTERNAL_HELPER(arg) #arg
5555
5558/* have these last so they have access to all previously defined macros */
5561#include <zephyr/devicetree/gpio.h>
5562#include <zephyr/devicetree/spi.h>
5563#include <zephyr/devicetree/dma.h>
5564#include <zephyr/devicetree/pwms.h>
5568#include <zephyr/devicetree/can.h>
5570#include <zephyr/devicetree/mbox.h>
5573
5574#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.
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.
Misc utilities.