Zephyr API Documentation 4.3.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 * Copyright (c) 2025 The Zephyr Project Contributors
6 *
7 * Not a generated file. Feel free to modify.
8 */
9
16
17#ifndef ZEPHYR_INCLUDE_DEVICETREE_H_
18#define ZEPHYR_INCLUDE_DEVICETREE_H_
19
20#include <zephyr/devicetree_generated.h>
22
23#if !defined(_LINKER) && !defined(_ASMLANGUAGE)
24#include <stdint.h>
25#endif
26
27#include <zephyr/sys/util.h>
28
37
38/*
39 * Property suffixes
40 * -----------------
41 *
42 * These are the optional parts that come after the _P_<property>
43 * part in DT_N_<path-id>_P_<property-id> macros, or the "prop-suf"
44 * nonterminal in the DT guide's macros.bnf file.
45 *
46 * Before adding new ones, check this list to avoid conflicts. If any
47 * are missing from this list, please add them. It should be complete.
48 *
49 * _ENUM_IDX: property's value as an index into bindings enum
50 * _ENUM_VAL_<val>_EXISTS property's value as a token exists
51 * _EXISTS: property is defined
52 * _FOREACH_PROP_ELEM: helper for "iterating" over values in the property
53 * _FOREACH_PROP_ELEM_VARGS: foreach functions with variable number of arguments
54 * _IDX_<i>: logical index into property
55 * _IDX_<i>_EXISTS: logical index into property is defined
56 * _IDX_<i>_PH: phandle array's phandle by index (or phandle, phandles)
57 * _IDX_<i>_STRING_TOKEN: string array element value as a token
58 * _IDX_<i>_STRING_UPPER_TOKEN: string array element value as a uppercased token
59 * _IDX <i>_STRING_UNQUOTED: string array element value as a sequence of tokens, with no quotes
60 * _IDX_<i>_VAL_<val>: phandle array's specifier value by index
61 * _IDX_<i>_VAL_<val>_EXISTS: cell value exists, by index
62 * _LEN: property logical length
63 * _NAME_<name>_PH: phandle array's phandle by name
64 * _NAME_<name>_VAL_<val>: phandle array's property specifier by name
65 * _NAME_<name>_VAL_<val>_EXISTS: cell value exists, by name
66 * _STRING_TOKEN: string property's value as a token
67 * _STRING_UPPER_TOKEN: like _STRING_TOKEN, but uppercased
68 * _STRING_UNQUOTED: string property's value as a sequence of tokens, with no quotes
69 */
70
76
84#define DT_INVALID_NODE _
85
89#define DT_ROOT DT_N
90
141#define DT_PATH(...) DT_PATH_INTERNAL(__VA_ARGS__)
142
197#define DT_NODELABEL(label) DT_CAT(DT_N_NODELABEL_, label)
198
237#define DT_ALIAS(alias) DT_CAT(DT_N_ALIAS_, alias)
238
244#define DT_HAS_ALIAS(alias_name) DT_NODE_EXISTS(DT_ALIAS(alias_name))
245
254#define DT_NODE_HASH(node_id) DT_CAT(node_id, _HASH)
255
350#define DT_INST(inst, compat) UTIL_CAT(DT_N_INST, DT_DASH(inst, compat))
351
375#define DT_PARENT(node_id) DT_CAT(node_id, _PARENT)
376
400#define DT_GPARENT(node_id) DT_PARENT(DT_PARENT(node_id))
401
437#define DT_CHILD(node_id, child) UTIL_CAT(node_id, DT_S_PREFIX(child))
438
471#define DT_CHILD_BY_UNIT_ADDR_INT(node_id, addr) \
472 DT_CAT3(node_id, _CHILD_UNIT_ADDR_INT_, addr)
473
515#define DT_COMPAT_GET_ANY_STATUS_OKAY(compat) \
516 COND_CODE_1(DT_HAS_COMPAT_STATUS_OKAY(compat), \
517 (DT_INST(0, compat)), \
518 (DT_INVALID_NODE))
519
547#define DT_NODE_PATH(node_id) DT_CAT(node_id, _PATH)
548
573#define DT_NODE_FULL_NAME(node_id) DT_CAT(node_id, _FULL_NAME)
574
601#define DT_NODE_FULL_NAME_UNQUOTED(node_id) DT_CAT(node_id, _FULL_NAME_UNQUOTED)
602
629#define DT_NODE_FULL_NAME_TOKEN(node_id) DT_CAT(node_id, _FULL_NAME_TOKEN)
630
659#define DT_NODE_FULL_NAME_UPPER_TOKEN(node_id) DT_CAT(node_id, _FULL_NAME_UPPER_TOKEN)
660
687#define DT_NODE_CHILD_IDX(node_id) DT_CAT(node_id, _CHILD_IDX)
688
695#define DT_CHILD_NUM(node_id) DT_CAT(node_id, _CHILD_NUM)
696
697
705#define DT_CHILD_NUM_STATUS_OKAY(node_id) \
706 DT_CAT(node_id, _CHILD_NUM_STATUS_OKAY)
707
728#define DT_SAME_NODE(node_id1, node_id2) \
729 IS_EQ(DT_DEP_ORD(node_id1), DT_DEP_ORD(node_id2))
730
755#define DT_NODELABEL_STRING_ARRAY(node_id) \
756 { DT_FOREACH_NODELABEL(node_id, DT_NODELABEL_STRING_ARRAY_ENTRY_INTERNAL) }
757
761
767
798#define DT_PROP(node_id, prop) DT_CAT3(node_id, _P_, prop)
799
832#define DT_PROP_LEN(node_id, prop) DT_CAT4(node_id, _P_, prop, _LEN)
833
848#define DT_PROP_LEN_OR(node_id, prop, default_value) \
849 COND_CODE_1(DT_NODE_HAS_PROP(node_id, prop), \
850 (DT_PROP_LEN(node_id, prop)), (default_value))
851
872#define DT_PROP_HAS_IDX(node_id, prop, idx) \
873 IS_ENABLED(DT_CAT6(node_id, _P_, prop, _IDX_, idx, _EXISTS))
874
907#define DT_PROP_HAS_NAME(node_id, prop, name) \
908 IS_ENABLED(DT_CAT6(node_id, _P_, prop, _NAME_, name, _EXISTS))
909
944#define DT_PROP_BY_IDX(node_id, prop, idx) \
945 DT_CAT5(node_id, _P_, prop, _IDX_, idx)
946
955#define DT_PROP_LAST(node_id, prop) \
956 DT_PROP_BY_IDX(node_id, prop, UTIL_DEC(DT_PROP_LEN(node_id, prop)))
957
971#define DT_PROP_OR(node_id, prop, default_value) \
972 COND_CODE_1(DT_NODE_HAS_PROP(node_id, prop), \
973 (DT_PROP(node_id, prop)), (default_value))
974
1030#define DT_ENUM_IDX_BY_IDX(node_id, prop, idx) \
1031 DT_CAT6(node_id, _P_, prop, _IDX_, idx, _ENUM_IDX)
1032
1039#define DT_ENUM_IDX(node_id, prop) DT_ENUM_IDX_BY_IDX(node_id, prop, 0)
1040
1056#define DT_ENUM_IDX_BY_IDX_OR(node_id, prop, idx, default_idx_value) \
1057 COND_CODE_1(DT_PROP_HAS_IDX(node_id, prop, idx), \
1058 (DT_ENUM_IDX_BY_IDX(node_id, prop, idx)), (default_idx_value))
1059
1068#define DT_ENUM_IDX_OR(node_id, prop, default_idx_value) \
1069 DT_ENUM_IDX_BY_IDX_OR(node_id, prop, 0, default_idx_value)
1070
1080#define DT_ENUM_HAS_VALUE_BY_IDX(node_id, prop, idx, value) \
1081 IS_ENABLED(DT_CAT8(node_id, _P_, prop, _IDX_, idx, _ENUM_VAL_, value, _EXISTS))
1082
1090#define DT_ENUM_HAS_VALUE(node_id, prop, value) \
1091 IS_ENABLED(DT_CAT6(node_id, _P_, prop, _ENUM_VAL_, value, _EXISTS))
1092
1152#define DT_STRING_TOKEN(node_id, prop) \
1153 DT_CAT4(node_id, _P_, prop, _STRING_TOKEN)
1154
1168#define DT_STRING_TOKEN_OR(node_id, prop, default_value) \
1169 COND_CODE_1(DT_NODE_HAS_PROP(node_id, prop), \
1170 (DT_STRING_TOKEN(node_id, prop)), (default_value))
1171
1229#define DT_STRING_UPPER_TOKEN(node_id, prop) \
1230 DT_CAT4(node_id, _P_, prop, _STRING_UPPER_TOKEN)
1231
1246#define DT_STRING_UPPER_TOKEN_OR(node_id, prop, default_value) \
1247 COND_CODE_1(DT_NODE_HAS_PROP(node_id, prop), \
1248 (DT_STRING_UPPER_TOKEN(node_id, prop)), (default_value))
1249
1290#define DT_STRING_UNQUOTED(node_id, prop) \
1291 DT_CAT4(node_id, _P_, prop, _STRING_UNQUOTED)
1292
1307#define DT_STRING_UNQUOTED_OR(node_id, prop, default_value) \
1308 COND_CODE_1(DT_NODE_HAS_PROP(node_id, prop), \
1309 (DT_STRING_UNQUOTED(node_id, prop)), (default_value))
1310
1358#define DT_STRING_TOKEN_BY_IDX(node_id, prop, idx) \
1359 DT_CAT6(node_id, _P_, prop, _IDX_, idx, _STRING_TOKEN)
1360
1369#define DT_STRING_TOKEN_BY_IDX_OR(node_id, prop, idx, default_value) \
1370 COND_CODE_1(DT_PROP_HAS_IDX(node_id, prop, idx), \
1371 (DT_STRING_TOKEN_BY_IDX(node_id, prop, idx)), (default_value))
1372
1420#define DT_STRING_UPPER_TOKEN_BY_IDX(node_id, prop, idx) \
1421 DT_CAT6(node_id, _P_, prop, _IDX_, idx, _STRING_UPPER_TOKEN)
1422
1463#define DT_STRING_UNQUOTED_BY_IDX(node_id, prop, idx) \
1464 DT_CAT6(node_id, _P_, prop, _IDX_, idx, _STRING_UNQUOTED)
1465
1466/*
1467 * phandle properties
1468 *
1469 * These are special-cased to manage the impedance mismatch between
1470 * phandles, which are just uint32_t node properties that only make sense
1471 * within the tree itself, and C values.
1472 */
1473
1519#define DT_PROP_BY_PHANDLE_IDX(node_id, phs, idx, prop) \
1520 DT_PROP(DT_PHANDLE_BY_IDX(node_id, phs, idx), prop)
1521
1541#define DT_PROP_BY_PHANDLE_IDX_OR(node_id, phs, idx, prop, default_value) \
1542 DT_PROP_OR(DT_PHANDLE_BY_IDX(node_id, phs, idx), prop, default_value)
1543
1555#define DT_PROP_BY_PHANDLE(node_id, ph, prop) \
1556 DT_PROP_BY_PHANDLE_IDX(node_id, ph, 0, prop)
1557
1612#define DT_PHA_BY_IDX(node_id, pha, idx, cell) \
1613 DT_CAT7(node_id, _P_, pha, _IDX_, idx, _VAL_, cell)
1614
1638#define DT_PHA_BY_IDX_OR(node_id, pha, idx, cell, default_value) \
1639 DT_PROP_OR(node_id, DT_CAT5(pha, _IDX_, idx, _VAL_, cell), default_value)
1640
1648#define DT_PHA(node_id, pha, cell) DT_PHA_BY_IDX(node_id, pha, 0, cell)
1649
1664#define DT_PHA_OR(node_id, pha, cell, default_value) \
1665 DT_PHA_BY_IDX_OR(node_id, pha, 0, cell, default_value)
1666
1707#define DT_PHA_BY_NAME(node_id, pha, name, cell) \
1708 DT_CAT7(node_id, _P_, pha, _NAME_, name, _VAL_, cell)
1709
1731#define DT_PHA_BY_NAME_OR(node_id, pha, name, cell, default_value) \
1732 DT_PROP_OR(node_id, DT_CAT5(pha, _NAME_, name, _VAL_, cell), default_value)
1733
1781#define DT_PHANDLE_BY_NAME(node_id, pha, name) \
1782 DT_CAT6(node_id, _P_, pha, _NAME_, name, _PH)
1783
1833#define DT_PHANDLE_BY_IDX(node_id, prop, idx) \
1834 DT_CAT6(node_id, _P_, prop, _IDX_, idx, _PH)
1835
1847#define DT_PHANDLE(node_id, prop) DT_PHANDLE_BY_IDX(node_id, prop, 0)
1848
1852
1858
1895#define DT_NUM_RANGES(node_id) DT_CAT(node_id, _RANGES_NUM)
1896
1949#define DT_RANGES_HAS_IDX(node_id, idx) \
1950 IS_ENABLED(DT_CAT4(node_id, _RANGES_IDX_, idx, _EXISTS))
1951
2004#define DT_RANGES_HAS_CHILD_BUS_FLAGS_AT_IDX(node_id, idx) \
2005 IS_ENABLED(DT_CAT4(node_id, _RANGES_IDX_, idx, _VAL_CHILD_BUS_FLAGS_EXISTS))
2006
2044#define DT_RANGES_CHILD_BUS_FLAGS_BY_IDX(node_id, idx) \
2045 DT_CAT4(node_id, _RANGES_IDX_, idx, _VAL_CHILD_BUS_FLAGS)
2046
2093#define DT_RANGES_CHILD_BUS_ADDRESS_BY_IDX(node_id, idx) \
2094 DT_CAT4(node_id, _RANGES_IDX_, idx, _VAL_CHILD_BUS_ADDRESS)
2095
2142#define DT_RANGES_PARENT_BUS_ADDRESS_BY_IDX(node_id, idx) \
2143 DT_CAT4(node_id, _RANGES_IDX_, idx, _VAL_PARENT_BUS_ADDRESS)
2144
2191#define DT_RANGES_LENGTH_BY_IDX(node_id, idx) \
2192 DT_CAT4(node_id, _RANGES_IDX_, idx, _VAL_LENGTH)
2193
2233#define DT_FOREACH_RANGE(node_id, fn) \
2234 DT_CAT(node_id, _FOREACH_RANGE)(fn)
2235
2239
2245
2281#define DT_NODE_VENDOR_BY_IDX(node_id, idx) \
2282 DT_CAT3(node_id, _COMPAT_VENDOR_IDX_, idx)
2283
2296#define DT_NODE_VENDOR_HAS_IDX(node_id, idx) \
2297 IS_ENABLED(DT_CAT4(node_id, _COMPAT_VENDOR_IDX_, idx, _EXISTS))
2298
2313#define DT_NODE_VENDOR_BY_IDX_OR(node_id, idx, default_value) \
2314 COND_CODE_1(DT_NODE_VENDOR_HAS_IDX(node_id, idx), \
2315 (DT_NODE_VENDOR_BY_IDX(node_id, idx)), (default_value))
2316
2325#define DT_NODE_VENDOR_OR(node_id, default_value) \
2326 DT_NODE_VENDOR_BY_IDX_OR(node_id, 0, default_value)
2327
2357#define DT_NODE_MODEL_BY_IDX(node_id, idx) \
2358 DT_CAT3(node_id, _COMPAT_MODEL_IDX_, idx)
2359
2372#define DT_NODE_MODEL_HAS_IDX(node_id, idx) \
2373 IS_ENABLED(DT_CAT4(node_id, _COMPAT_MODEL_IDX_, idx, _EXISTS))
2374
2389#define DT_NODE_MODEL_BY_IDX_OR(node_id, idx, default_value) \
2390 COND_CODE_1(DT_NODE_MODEL_HAS_IDX(node_id, idx), \
2391 (DT_NODE_MODEL_BY_IDX(node_id, idx)), (default_value))
2392
2401#define DT_NODE_MODEL_OR(node_id, default_value) \
2402 DT_NODE_MODEL_BY_IDX_OR(node_id, 0, default_value)
2403
2407
2413
2421#define DT_NUM_REGS(node_id) DT_CAT(node_id, _REG_NUM)
2422
2434#define DT_REG_HAS_IDX(node_id, idx) \
2435 IS_ENABLED(DT_CAT4(node_id, _REG_IDX_, idx, _EXISTS))
2436
2448#define DT_REG_HAS_NAME(node_id, name) \
2449 IS_ENABLED(DT_CAT4(node_id, _REG_NAME_, name, _EXISTS))
2450
2462#define DT_REG_ADDR_BY_IDX_RAW(node_id, idx) \
2463 DT_CAT4(node_id, _REG_IDX_, idx, _VAL_ADDRESS)
2464
2476#define DT_REG_ADDR_RAW(node_id) \
2477 DT_REG_ADDR_BY_IDX_RAW(node_id, 0)
2478
2485#define DT_REG_ADDR_BY_IDX(node_id, idx) \
2486 DT_U32_C(DT_REG_ADDR_BY_IDX_RAW(node_id, idx))
2487
2499#define DT_REG_SIZE_BY_IDX(node_id, idx) \
2500 DT_U32_C(DT_CAT4(node_id, _REG_IDX_, idx, _VAL_SIZE))
2501
2509#define DT_REG_ADDR(node_id) DT_REG_ADDR_BY_IDX(node_id, 0)
2510
2521#define DT_REG_ADDR_U64(node_id) DT_U64_C(DT_REG_ADDR_BY_IDX_RAW(node_id, 0))
2522
2530#define DT_REG_SIZE(node_id) DT_REG_SIZE_BY_IDX(node_id, 0)
2531
2538#define DT_REG_ADDR_BY_NAME(node_id, name) \
2539 DT_U32_C(DT_CAT4(node_id, _REG_NAME_, name, _VAL_ADDRESS))
2540
2549#define DT_REG_ADDR_BY_NAME_OR(node_id, name, default_value) \
2550 COND_CODE_1(DT_REG_HAS_NAME(node_id, name), \
2551 (DT_REG_ADDR_BY_NAME(node_id, name)), (default_value))
2552
2565#define DT_REG_ADDR_BY_NAME_U64(node_id, name) \
2566 DT_U64_C(DT_CAT4(node_id, _REG_NAME_, name, _VAL_ADDRESS))
2567
2574#define DT_REG_SIZE_BY_NAME(node_id, name) \
2575 DT_U32_C(DT_CAT4(node_id, _REG_NAME_, name, _VAL_SIZE))
2576
2585#define DT_REG_SIZE_BY_NAME_OR(node_id, name, default_value) \
2586 COND_CODE_1(DT_REG_HAS_NAME(node_id, name), \
2587 (DT_REG_SIZE_BY_NAME(node_id, name)), (default_value))
2588
2589
2593
2599
2608#define DT_NUM_IRQS(node_id) DT_CAT(node_id, _IRQ_NUM)
2609
2634#define DT_NUM_NODELABELS(node_id) DT_CAT(node_id, _NODELABEL_NUM)
2635
2642#define DT_IRQ_LEVEL(node_id) DT_CAT(node_id, _IRQ_LEVEL)
2643
2654#define DT_IRQ_HAS_IDX(node_id, idx) \
2655 IS_ENABLED(DT_CAT4(node_id, _IRQ_IDX_, idx, _EXISTS))
2656
2667#define DT_IRQ_HAS_CELL_AT_IDX(node_id, idx, cell) \
2668 IS_ENABLED(DT_CAT6(node_id, _IRQ_IDX_, idx, _VAL_, cell, _EXISTS))
2669
2677#define DT_IRQ_HAS_CELL(node_id, cell) DT_IRQ_HAS_CELL_AT_IDX(node_id, 0, cell)
2678
2688#define DT_IRQ_HAS_NAME(node_id, name) \
2689 IS_ENABLED(DT_CAT4(node_id, _IRQ_NAME_, name, _VAL_irq_EXISTS))
2690
2726#define DT_IRQ_BY_IDX(node_id, idx, cell) \
2727 DT_CAT5(node_id, _IRQ_IDX_, idx, _VAL_, cell)
2728
2744#define DT_IRQ_BY_NAME(node_id, name, cell) \
2745 DT_CAT5(node_id, _IRQ_NAME_, name, _VAL_, cell)
2746
2754#define DT_IRQ(node_id, cell) DT_IRQ_BY_IDX(node_id, 0, cell)
2755
2798#define DT_IRQ_INTC_BY_IDX(node_id, idx) \
2799 DT_CAT4(node_id, _IRQ_IDX_, idx, _CONTROLLER)
2800
2845#define DT_IRQ_INTC_BY_NAME(node_id, name) \
2846 DT_CAT4(node_id, _IRQ_NAME_, name, _CONTROLLER)
2847
2887#define DT_IRQ_INTC(node_id) \
2888 DT_IRQ_INTC_BY_IDX(node_id, 0)
2889
2893
2894/* DT helper macro to encode a node's IRQN to level 1 according to the multi-level scheme */
2895#define DT_IRQN_L1_INTERNAL(node_id, idx) DT_IRQ_BY_IDX(node_id, idx, irq)
2896/* DT helper macro to encode a node's IRQN to level 2 according to the multi-level scheme */
2897#define DT_IRQN_L2_INTERNAL(node_id, idx) \
2898 (IRQ_TO_L2(DT_IRQN_L1_INTERNAL(node_id, idx)) | \
2899 DT_IRQ(DT_IRQ_INTC_BY_IDX(node_id, idx), irq))
2900/* DT helper macro to encode a node's IRQN to level 3 according to the multi-level scheme */
2901#define DT_IRQN_L3_INTERNAL(node_id, idx) \
2902 (IRQ_TO_L3(DT_IRQN_L1_INTERNAL(node_id, idx)) | \
2903 IRQ_TO_L2(DT_IRQ(DT_IRQ_INTC_BY_IDX(node_id, idx), irq)) | \
2904 DT_IRQ(DT_IRQ_INTC(DT_IRQ_INTC_BY_IDX(node_id, idx)), irq))
2905/* DT helper macro for the macros above */
2906#define DT_IRQN_LVL_INTERNAL(node_id, idx, level) DT_CAT3(DT_IRQN_L, level, _INTERNAL)(node_id, idx)
2907
2912#define DT_MULTI_LEVEL_IRQN_INTERNAL(node_id, idx) \
2913 DT_IRQN_LVL_INTERNAL(node_id, idx, DT_IRQ_LEVEL(node_id))
2914
2918
2927#define DT_IRQN_BY_IDX(node_id, idx) \
2928 COND_CODE_1(IS_ENABLED(CONFIG_MULTI_LEVEL_INTERRUPTS), \
2929 (DT_MULTI_LEVEL_IRQN_INTERNAL(node_id, idx)), \
2930 (DT_IRQ_BY_IDX(node_id, idx, irq)))
2931
2942#define DT_IRQN(node_id) DT_IRQN_BY_IDX(node_id, 0)
2943
2947
2953
2962#define DT_CHOSEN(prop) DT_CAT(DT_CHOSEN_, prop)
2963
2970#define DT_HAS_CHOSEN(prop) IS_ENABLED(DT_CAT3(DT_CHOSEN_, prop, _EXISTS))
2971
2975
3011
3021#define DT_FOREACH_NODE(fn) DT_FOREACH_HELPER(fn)
3022
3035#define DT_FOREACH_NODE_VARGS(fn, ...) DT_FOREACH_VARGS_HELPER(fn, __VA_ARGS__)
3036
3048#define DT_FOREACH_STATUS_OKAY_NODE(fn) DT_FOREACH_OKAY_HELPER(fn)
3049
3064#define DT_FOREACH_STATUS_OKAY_NODE_VARGS(fn, ...) DT_FOREACH_OKAY_VARGS_HELPER(fn, __VA_ARGS__)
3065
3112#define DT_FOREACH_ANCESTOR(node_id, fn) \
3113 DT_CAT(node_id, _FOREACH_ANCESTOR)(fn)
3114
3158#define DT_FOREACH_CHILD(node_id, fn) \
3159 DT_CAT(node_id, _FOREACH_CHILD)(fn)
3160
3201#define DT_FOREACH_CHILD_SEP(node_id, fn, sep) \
3202 DT_CAT(node_id, _FOREACH_CHILD_SEP)(fn, sep)
3203
3219#define DT_FOREACH_CHILD_VARGS(node_id, fn, ...) \
3220 DT_CAT(node_id, _FOREACH_CHILD_VARGS)(fn, __VA_ARGS__)
3221
3237#define DT_FOREACH_CHILD_SEP_VARGS(node_id, fn, sep, ...) \
3238 DT_CAT(node_id, _FOREACH_CHILD_SEP_VARGS)(fn, sep, __VA_ARGS__)
3239
3255#define DT_FOREACH_CHILD_STATUS_OKAY(node_id, fn) \
3256 DT_CAT(node_id, _FOREACH_CHILD_STATUS_OKAY)(fn)
3257
3274#define DT_FOREACH_CHILD_STATUS_OKAY_SEP(node_id, fn, sep) \
3275 DT_CAT(node_id, _FOREACH_CHILD_STATUS_OKAY_SEP)(fn, sep)
3276
3296#define DT_FOREACH_CHILD_STATUS_OKAY_VARGS(node_id, fn, ...) \
3297 DT_CAT(node_id, _FOREACH_CHILD_STATUS_OKAY_VARGS)(fn, __VA_ARGS__)
3298
3317#define DT_FOREACH_CHILD_STATUS_OKAY_SEP_VARGS(node_id, fn, sep, ...) \
3318 DT_CAT(node_id, _FOREACH_CHILD_STATUS_OKAY_SEP_VARGS)(fn, sep, __VA_ARGS__)
3319
3370#define DT_FOREACH_PROP_ELEM(node_id, prop, fn) \
3371 DT_CAT4(node_id, _P_, prop, _FOREACH_PROP_ELEM)(fn)
3372
3415#define DT_FOREACH_PROP_ELEM_SEP(node_id, prop, fn, sep) \
3416 DT_CAT4(node_id, _P_, prop, _FOREACH_PROP_ELEM_SEP)(fn, sep)
3417
3438#define DT_FOREACH_PROP_ELEM_VARGS(node_id, prop, fn, ...) \
3439 DT_CAT4(node_id, _P_, prop, _FOREACH_PROP_ELEM_VARGS)(fn, __VA_ARGS__)
3440
3457#define DT_FOREACH_PROP_ELEM_SEP_VARGS(node_id, prop, fn, sep, ...) \
3458 DT_CAT4(node_id, _P_, prop, _FOREACH_PROP_ELEM_SEP_VARGS)( \
3459 fn, sep, __VA_ARGS__)
3460
3514#define DT_FOREACH_STATUS_OKAY(compat, fn) \
3515 COND_CODE_1(DT_HAS_COMPAT_STATUS_OKAY(compat), \
3516 (UTIL_CAT(DT_FOREACH_OKAY_, compat)(fn)), \
3517 ())
3518
3563#define DT_FOREACH_STATUS_OKAY_VARGS(compat, fn, ...) \
3564 COND_CODE_1(DT_HAS_COMPAT_STATUS_OKAY(compat), \
3565 (DT_CAT(DT_FOREACH_OKAY_VARGS_, \
3566 compat)(fn, __VA_ARGS__)), \
3567 ())
3568
3581#define DT_COMPAT_FOREACH_STATUS_OKAY_VARGS(compat, fn, ...) \
3582 COND_CODE_1(DT_HAS_COMPAT_STATUS_OKAY(compat), \
3583 (UTIL_CAT(DT_FOREACH_OKAY_INST_VARGS_, \
3584 compat)(fn, compat, __VA_ARGS__)), \
3585 ())
3586
3587
3626#define DT_FOREACH_NODELABEL(node_id, fn) DT_CAT(node_id, _FOREACH_NODELABEL)(fn)
3627
3665#define DT_FOREACH_NODELABEL_VARGS(node_id, fn, ...) \
3666 DT_CAT(node_id, _FOREACH_NODELABEL_VARGS)(fn, __VA_ARGS__)
3667
3671
3677
3692#define DT_NODE_EXISTS(node_id) IS_ENABLED(DT_CAT(node_id, _EXISTS))
3693
3715#define DT_NODE_HAS_STATUS(node_id, status) \
3716 DT_NODE_HAS_STATUS_INTERNAL(node_id, status)
3717
3738#define DT_NODE_HAS_STATUS_OKAY(node_id) DT_NODE_HAS_STATUS(node_id, okay)
3739
3759#define DT_HAS_COMPAT_STATUS_OKAY(compat) \
3760 IS_ENABLED(DT_CAT(DT_COMPAT_HAS_OKAY_, compat))
3761
3768#define DT_NUM_INST_STATUS_OKAY(compat) \
3769 UTIL_AND(DT_HAS_COMPAT_STATUS_OKAY(compat), \
3770 UTIL_CAT(DT_N_INST, DT_DASH(compat, NUM_OKAY)))
3771
3799#define DT_NODE_HAS_COMPAT(node_id, compat) \
3800 IS_ENABLED(DT_CAT3(node_id, _COMPAT_MATCHES_, compat))
3801
3816#define DT_NODE_HAS_COMPAT_STATUS(node_id, compat, status) \
3817 UTIL_AND(DT_NODE_HAS_COMPAT(node_id, compat), DT_NODE_HAS_STATUS(node_id, status))
3818
3832#define DT_NODE_HAS_PROP(node_id, prop) \
3833 IS_ENABLED(DT_CAT4(node_id, _P_, prop, _EXISTS))
3834
3835
3852#define DT_PHA_HAS_CELL_AT_IDX(node_id, pha, idx, cell) \
3853 IS_ENABLED(DT_CAT8(node_id, _P_, pha, \
3854 _IDX_, idx, _VAL_, cell, _EXISTS))
3855
3865#define DT_PHA_HAS_CELL(node_id, pha, cell) \
3866 DT_PHA_HAS_CELL_AT_IDX(node_id, pha, 0, cell)
3867
3888#define DT_FOREACH_PHA_CELL_BY_IDX(node_id, pha, idx, fn) \
3889 DT_CAT6(node_id, _P_, pha, _IDX_, idx, _FOREACH_CELL)(fn)
3890
3903#define DT_FOREACH_PHA_CELL_BY_IDX_SEP(node_id, pha, idx, fn, sep) \
3904 DT_CAT6(node_id, _P_, pha, _IDX_, idx, _FOREACH_CELL_SEP)(fn, sep)
3905
3914#define DT_PHA_NUM_CELLS_BY_IDX(node_id, pha, idx) \
3915 DT_CAT6(node_id, _P_, pha, _IDX_, idx, _NUM_CELLS)
3916
3928#define DT_PHA_ELEM_NAME_BY_IDX(node_id, pha, idx) \
3929 DT_CAT6(node_id, _P_, pha, _IDX_, idx, _NAME)
3930
3952#define DT_FOREACH_PHA_CELL_BY_NAME(node_id, pha, name, fn) \
3953 DT_CAT6(node_id, _P_, pha, _NAME_, name, _FOREACH_CELL)(fn)
3954
3967#define DT_FOREACH_PHA_CELL_BY_NAME_SEP(node_id, pha, name, fn, sep) \
3968 DT_CAT6(node_id, _P_, pha, _NAME_, name, _FOREACH_CELL_SEP)(fn, sep)
3969
3978#define DT_PHA_NUM_CELLS_BY_NAME(node_id, pha, name) \
3979 DT_CAT6(node_id, _P_, pha, _NAME_, name, _NUM_CELLS)
3980
3992#define DT_PHA_ELEM_IDX_BY_NAME(node_id, pha, name) \
3993 DT_CAT6(node_id, _P_, pha, _NAME_, name, _IDX)
3994
3995
3999
4005
4037#define DT_BUS(node_id) DT_CAT(node_id, _BUS)
4038
4067#define DT_ON_BUS(node_id, bus) IS_ENABLED(DT_CAT3(node_id, _BUS_, bus))
4068
4072
4078
4085#define DT_DRV_INST(inst) DT_INST(inst, DT_DRV_COMPAT)
4086
4094#define DT_INST_PARENT(inst) DT_PARENT(DT_DRV_INST(inst))
4095
4103#define DT_INST_GPARENT(inst) DT_GPARENT(DT_DRV_INST(inst))
4104
4114#define DT_INST_CHILD(inst, child) \
4115 DT_CHILD(DT_DRV_INST(inst), child)
4116
4129#define DT_INST_CHILD_BY_UNIT_ADDR_INT(inst, addr) \
4130 DT_CHILD_BY_UNIT_ADDR_INT(DT_DRV_INST(inst), addr)
4131
4141#define DT_INST_CHILD_NUM(inst) DT_CHILD_NUM(DT_DRV_INST(inst))
4142
4152#define DT_INST_CHILD_NUM_STATUS_OKAY(inst) \
4153 DT_CHILD_NUM_STATUS_OKAY(DT_DRV_INST(inst))
4154
4163#define DT_INST_NODELABEL_STRING_ARRAY(inst) DT_NODELABEL_STRING_ARRAY(DT_DRV_INST(inst))
4164
4173#define DT_INST_NUM_NODELABELS(inst) DT_NUM_NODELABELS(DT_DRV_INST(inst))
4174
4189#define DT_INST_FOREACH_CHILD(inst, fn) \
4190 DT_FOREACH_CHILD(DT_DRV_INST(inst), fn)
4191
4205#define DT_INST_FOREACH_CHILD_SEP(inst, fn, sep) \
4206 DT_FOREACH_CHILD_SEP(DT_DRV_INST(inst), fn, sep)
4207
4223#define DT_INST_FOREACH_CHILD_VARGS(inst, fn, ...) \
4224 DT_FOREACH_CHILD_VARGS(DT_DRV_INST(inst), fn, __VA_ARGS__)
4225
4240#define DT_INST_FOREACH_CHILD_SEP_VARGS(inst, fn, sep, ...) \
4241 DT_FOREACH_CHILD_SEP_VARGS(DT_DRV_INST(inst), fn, sep, __VA_ARGS__)
4242
4254#define DT_INST_FOREACH_CHILD_STATUS_OKAY(inst, fn) \
4255 DT_FOREACH_CHILD_STATUS_OKAY(DT_DRV_INST(inst), fn)
4256
4271#define DT_INST_FOREACH_CHILD_STATUS_OKAY_SEP(inst, fn, sep) \
4272 DT_FOREACH_CHILD_STATUS_OKAY_SEP(DT_DRV_INST(inst), fn, sep)
4273
4287#define DT_INST_FOREACH_CHILD_STATUS_OKAY_VARGS(inst, fn, ...) \
4288 DT_FOREACH_CHILD_STATUS_OKAY_VARGS(DT_DRV_INST(inst), fn, __VA_ARGS__)
4289
4305#define DT_INST_FOREACH_CHILD_STATUS_OKAY_SEP_VARGS(inst, fn, sep, ...) \
4306 DT_FOREACH_CHILD_STATUS_OKAY_SEP_VARGS(DT_DRV_INST(inst), fn, sep, __VA_ARGS__)
4307
4315#define DT_INST_ENUM_IDX_BY_IDX(inst, prop, idx) \
4316 DT_ENUM_IDX_BY_IDX(DT_DRV_INST(inst), prop, idx)
4317
4324#define DT_INST_ENUM_IDX(inst, prop) \
4325 DT_ENUM_IDX(DT_DRV_INST(inst), prop)
4326
4336#define DT_INST_ENUM_IDX_BY_IDX_OR(inst, prop, idx, default_idx_value) \
4337 DT_ENUM_IDX_BY_IDX_OR(DT_DRV_INST(inst), prop, idx, default_idx_value)
4338
4347#define DT_INST_ENUM_IDX_OR(inst, prop, default_idx_value) \
4348 DT_ENUM_IDX_OR(DT_DRV_INST(inst), prop, default_idx_value)
4349
4358#define DT_INST_ENUM_HAS_VALUE_BY_IDX(inst, prop, idx, value) \
4359 DT_ENUM_HAS_VALUE_BY_IDX(DT_DRV_INST(inst), prop, idx, value)
4360
4369#define DT_INST_ENUM_HAS_VALUE(inst, prop, value) \
4370 DT_ENUM_HAS_VALUE(DT_DRV_INST(inst), prop, value)
4371
4378#define DT_INST_PROP(inst, prop) DT_PROP(DT_DRV_INST(inst), prop)
4379
4386#define DT_INST_PROP_LEN(inst, prop) DT_PROP_LEN(DT_DRV_INST(inst), prop)
4387
4397#define DT_INST_PROP_HAS_IDX(inst, prop, idx) \
4398 DT_PROP_HAS_IDX(DT_DRV_INST(inst), prop, idx)
4399
4408#define DT_INST_PROP_HAS_NAME(inst, prop, name) \
4409 DT_PROP_HAS_NAME(DT_DRV_INST(inst), prop, name)
4410
4418#define DT_INST_PROP_BY_IDX(inst, prop, idx) \
4419 DT_PROP_BY_IDX(DT_DRV_INST(inst), prop, idx)
4420
4428#define DT_INST_PROP_OR(inst, prop, default_value) \
4429 DT_PROP_OR(DT_DRV_INST(inst), prop, default_value)
4430
4438#define DT_INST_PROP_LEN_OR(inst, prop, default_value) \
4439 DT_PROP_LEN_OR(DT_DRV_INST(inst), prop, default_value)
4440
4450#define DT_INST_STRING_TOKEN(inst, prop) \
4451 DT_STRING_TOKEN(DT_DRV_INST(inst), prop)
4452
4460#define DT_INST_STRING_UPPER_TOKEN(inst, prop) \
4461 DT_STRING_UPPER_TOKEN(DT_DRV_INST(inst), prop)
4462
4471#define DT_INST_STRING_UNQUOTED(inst, prop) \
4472 DT_STRING_UNQUOTED(DT_DRV_INST(inst), prop)
4473
4481#define DT_INST_STRING_TOKEN_BY_IDX(inst, prop, idx) \
4482 DT_STRING_TOKEN_BY_IDX(DT_DRV_INST(inst), prop, idx)
4483
4492#define DT_INST_STRING_TOKEN_BY_IDX_OR(inst, prop, idx, default_value) \
4493 DT_STRING_TOKEN_BY_IDX_OR(DT_DRV_INST(inst), prop, idx, default_value)
4494
4502#define DT_INST_STRING_UPPER_TOKEN_BY_IDX(inst, prop, idx) \
4503 DT_STRING_UPPER_TOKEN_BY_IDX(DT_DRV_INST(inst), prop, idx)
4504
4512#define DT_INST_STRING_UNQUOTED_BY_IDX(inst, prop, idx) \
4513 DT_STRING_UNQUOTED_BY_IDX(DT_DRV_INST(inst), prop, idx)
4514
4523#define DT_INST_PROP_BY_PHANDLE(inst, ph, prop) \
4524 DT_INST_PROP_BY_PHANDLE_IDX(inst, ph, 0, prop)
4525
4537#define DT_INST_PROP_BY_PHANDLE_IDX(inst, phs, idx, prop) \
4538 DT_PROP_BY_PHANDLE_IDX(DT_DRV_INST(inst), phs, idx, prop)
4539
4548#define DT_INST_PHA_BY_IDX(inst, pha, idx, cell) \
4549 DT_PHA_BY_IDX(DT_DRV_INST(inst), pha, idx, cell)
4550
4560#define DT_INST_PHA_BY_IDX_OR(inst, pha, idx, cell, default_value) \
4561 DT_PHA_BY_IDX_OR(DT_DRV_INST(inst), pha, idx, cell, default_value)
4562
4571#define DT_INST_PHA(inst, pha, cell) DT_INST_PHA_BY_IDX(inst, pha, 0, cell)
4572
4581#define DT_INST_PHA_OR(inst, pha, cell, default_value) \
4582 DT_INST_PHA_BY_IDX_OR(inst, pha, 0, cell, default_value)
4583
4593#define DT_INST_PHA_BY_NAME(inst, pha, name, cell) \
4594 DT_PHA_BY_NAME(DT_DRV_INST(inst), pha, name, cell)
4595
4605#define DT_INST_PHA_BY_NAME_OR(inst, pha, name, cell, default_value) \
4606 DT_PHA_BY_NAME_OR(DT_DRV_INST(inst), pha, name, cell, default_value)
4607
4616#define DT_INST_PHANDLE_BY_NAME(inst, pha, name) \
4617 DT_PHANDLE_BY_NAME(DT_DRV_INST(inst), pha, name) \
4618
4619
4628#define DT_INST_PHANDLE_BY_IDX(inst, prop, idx) \
4629 DT_PHANDLE_BY_IDX(DT_DRV_INST(inst), prop, idx)
4630
4639#define DT_INST_PHANDLE(inst, prop) DT_INST_PHANDLE_BY_IDX(inst, prop, 0)
4640
4648#define DT_INST_REG_HAS_IDX(inst, idx) DT_REG_HAS_IDX(DT_DRV_INST(inst), idx)
4649
4657#define DT_INST_REG_HAS_NAME(inst, name) DT_REG_HAS_NAME(DT_DRV_INST(inst), name)
4658
4665#define DT_INST_REG_ADDR_BY_IDX_RAW(inst, idx) DT_REG_ADDR_BY_IDX_RAW(DT_DRV_INST(inst), idx)
4666
4673#define DT_INST_REG_ADDR_BY_IDX(inst, idx) DT_REG_ADDR_BY_IDX(DT_DRV_INST(inst), idx)
4674
4681#define DT_INST_REG_SIZE_BY_IDX(inst, idx) \
4682 DT_REG_SIZE_BY_IDX(DT_DRV_INST(inst), idx)
4683
4690#define DT_INST_REG_ADDR_BY_NAME(inst, name) \
4691 DT_REG_ADDR_BY_NAME(DT_DRV_INST(inst), name)
4692
4701#define DT_INST_REG_ADDR_BY_NAME_OR(inst, name, default_value) \
4702 DT_REG_ADDR_BY_NAME_OR(DT_DRV_INST(inst), name, default_value)
4703
4716#define DT_INST_REG_ADDR_BY_NAME_U64(inst, name) \
4717 DT_REG_ADDR_BY_NAME_U64(DT_DRV_INST(inst), name)
4718
4725#define DT_INST_REG_SIZE_BY_NAME(inst, name) \
4726 DT_REG_SIZE_BY_NAME(DT_DRV_INST(inst), name)
4727
4736#define DT_INST_REG_SIZE_BY_NAME_OR(inst, name, default_value) \
4737 DT_REG_SIZE_BY_NAME_OR(DT_DRV_INST(inst), name, default_value)
4738
4744#define DT_INST_REG_ADDR_RAW(inst) DT_INST_REG_ADDR_BY_IDX_RAW(inst, 0)
4745
4751#define DT_INST_REG_ADDR(inst) DT_INST_REG_ADDR_BY_IDX(inst, 0)
4752
4764#define DT_INST_REG_ADDR_U64(inst) DT_REG_ADDR_U64(DT_DRV_INST(inst))
4765
4771#define DT_INST_REG_SIZE(inst) DT_INST_REG_SIZE_BY_IDX(inst, 0)
4772
4779#define DT_INST_NUM_IRQS(inst) DT_NUM_IRQS(DT_DRV_INST(inst))
4780
4787#define DT_INST_IRQ_LEVEL(inst) DT_IRQ_LEVEL(DT_DRV_INST(inst))
4788
4796#define DT_INST_IRQ_BY_IDX(inst, idx, cell) \
4797 DT_IRQ_BY_IDX(DT_DRV_INST(inst), idx, cell)
4798
4805#define DT_INST_IRQ_INTC_BY_IDX(inst, idx) \
4806 DT_IRQ_INTC_BY_IDX(DT_DRV_INST(inst), idx)
4807
4814#define DT_INST_IRQ_INTC_BY_NAME(inst, name) \
4815 DT_IRQ_INTC_BY_NAME(DT_DRV_INST(inst), name)
4816
4824#define DT_INST_IRQ_INTC(inst) \
4825 DT_INST_IRQ_INTC_BY_IDX(inst, 0)
4826
4834#define DT_INST_IRQ_BY_NAME(inst, name, cell) \
4835 DT_IRQ_BY_NAME(DT_DRV_INST(inst), name, cell)
4836
4843#define DT_INST_IRQ(inst, cell) DT_INST_IRQ_BY_IDX(inst, 0, cell)
4844
4850#define DT_INST_IRQN(inst) DT_IRQN(DT_DRV_INST(inst))
4851
4858#define DT_INST_IRQN_BY_IDX(inst, idx) DT_IRQN_BY_IDX(DT_DRV_INST(inst), idx)
4859
4865#define DT_INST_BUS(inst) DT_BUS(DT_DRV_INST(inst))
4866
4874#define DT_INST_ON_BUS(inst, bus) DT_ON_BUS(DT_DRV_INST(inst), bus)
4875
4885#define DT_INST_STRING_TOKEN_OR(inst, name, default_value) \
4886 DT_STRING_TOKEN_OR(DT_DRV_INST(inst), name, default_value)
4887
4896#define DT_INST_STRING_UPPER_TOKEN_OR(inst, name, default_value) \
4897 DT_STRING_UPPER_TOKEN_OR(DT_DRV_INST(inst), name, default_value)
4898
4907#define DT_INST_STRING_UNQUOTED_OR(inst, name, default_value) \
4908 DT_STRING_UNQUOTED_OR(DT_DRV_INST(inst), name, default_value)
4909
4940#define DT_HAS_COMPAT_ON_BUS_STATUS_OKAY(compat, bus) \
4941 IS_ENABLED(DT_CAT4(DT_COMPAT_, compat, _BUS_, bus))
4942
4975#define DT_ANY_INST_ON_BUS_STATUS_OKAY(bus) \
4976 DT_HAS_COMPAT_ON_BUS_STATUS_OKAY(DT_DRV_COMPAT, bus)
4977
5022#define DT_ANY_INST_HAS_PROP_STATUS_OKAY(prop) \
5023 UTIL_NOT(IS_EMPTY( \
5024 DT_INST_FOREACH_STATUS_OKAY_VARGS(DT_ANY_INST_HAS_PROP_STATUS_OKAY_, prop)))
5025
5070#define DT_ALL_INST_HAS_PROP_STATUS_OKAY(prop) \
5071 IS_EMPTY(DT_INST_FOREACH_STATUS_OKAY_VARGS(DT_ALL_INST_HAS_PROP_STATUS_OKAY_, prop))
5072
5117#define DT_ANY_COMPAT_HAS_PROP_STATUS_OKAY(compat, prop) \
5118 (DT_COMPAT_FOREACH_STATUS_OKAY_VARGS(compat, DT_COMPAT_NODE_HAS_PROP_AND_OR, prop) 0)
5119
5167#define DT_ANY_INST_HAS_BOOL_STATUS_OKAY(prop) \
5168 UTIL_NOT(IS_EMPTY( \
5169 DT_INST_FOREACH_STATUS_OKAY_VARGS(DT_ANY_INST_HAS_BOOL_STATUS_OKAY_, prop)))
5170
5216#define DT_ALL_INST_HAS_BOOL_STATUS_OKAY(prop) \
5217 IS_EMPTY(DT_INST_FOREACH_STATUS_OKAY_VARGS(DT_ALL_INST_HAS_BOOL_STATUS_OKAY_, prop))
5218
5284#define DT_INST_FOREACH_STATUS_OKAY(fn) \
5285 COND_CODE_1(DT_HAS_COMPAT_STATUS_OKAY(DT_DRV_COMPAT), \
5286 (UTIL_CAT(DT_FOREACH_OKAY_INST_, \
5287 DT_DRV_COMPAT)(fn)), \
5288 ())
5289
5302#define DT_INST_FOREACH_STATUS_OKAY_VARGS(fn, ...) \
5303 COND_CODE_1(DT_HAS_COMPAT_STATUS_OKAY(DT_DRV_COMPAT), \
5304 (UTIL_CAT(DT_FOREACH_OKAY_INST_VARGS_, \
5305 DT_DRV_COMPAT)(fn, __VA_ARGS__)), \
5306 ())
5307
5317#define DT_INST_FOREACH_NODELABEL(inst, fn) \
5318 DT_FOREACH_NODELABEL(DT_DRV_INST(inst), fn)
5319
5331#define DT_INST_FOREACH_NODELABEL_VARGS(inst, fn, ...) \
5332 DT_FOREACH_NODELABEL_VARGS(DT_DRV_INST(inst), fn, __VA_ARGS__)
5333
5344#define DT_INST_FOREACH_PROP_ELEM(inst, prop, fn) \
5345 DT_FOREACH_PROP_ELEM(DT_DRV_INST(inst), prop, fn)
5346
5359#define DT_INST_FOREACH_PROP_ELEM_SEP(inst, prop, fn, sep) \
5360 DT_FOREACH_PROP_ELEM_SEP(DT_DRV_INST(inst), prop, fn, sep)
5361
5376#define DT_INST_FOREACH_PROP_ELEM_VARGS(inst, prop, fn, ...) \
5377 DT_FOREACH_PROP_ELEM_VARGS(DT_DRV_INST(inst), prop, fn, __VA_ARGS__)
5378
5396#define DT_INST_FOREACH_PROP_ELEM_SEP_VARGS(inst, prop, fn, sep, ...) \
5397 DT_FOREACH_PROP_ELEM_SEP_VARGS(DT_DRV_INST(inst), prop, fn, sep, \
5398 __VA_ARGS__)
5399
5406#define DT_INST_NODE_HAS_PROP(inst, prop) \
5407 DT_NODE_HAS_PROP(DT_DRV_INST(inst), prop)
5408
5415#define DT_INST_NODE_HAS_COMPAT(inst, compat) \
5416 DT_NODE_HAS_COMPAT(DT_DRV_INST(inst), compat)
5417
5428#define DT_INST_PHA_HAS_CELL_AT_IDX(inst, pha, idx, cell) \
5429 DT_PHA_HAS_CELL_AT_IDX(DT_DRV_INST(inst), pha, idx, cell)
5430
5440#define DT_INST_PHA_HAS_CELL(inst, pha, cell) \
5441 DT_INST_PHA_HAS_CELL_AT_IDX(inst, pha, 0, cell)
5442
5450#define DT_INST_IRQ_HAS_IDX(inst, idx) DT_IRQ_HAS_IDX(DT_DRV_INST(inst), idx)
5451
5460#define DT_INST_IRQ_HAS_CELL_AT_IDX(inst, idx, cell) \
5461 DT_IRQ_HAS_CELL_AT_IDX(DT_DRV_INST(inst), idx, cell)
5462
5470#define DT_INST_IRQ_HAS_CELL(inst, cell) \
5471 DT_INST_IRQ_HAS_CELL_AT_IDX(inst, 0, cell)
5472
5479#define DT_INST_IRQ_HAS_NAME(inst, name) \
5480 DT_IRQ_HAS_NAME(DT_DRV_INST(inst), name)
5481
5485
5487
5499#define DT_ANY_INST_HAS_PROP_STATUS_OKAY_(idx, prop) \
5500 IF_ENABLED(DT_INST_NODE_HAS_PROP(idx, prop), (1,))
5501
5514#define DT_ANY_INST_HAS_BOOL_STATUS_OKAY_(idx, prop) \
5515 IF_ENABLED(DT_INST_PROP(idx, prop), (1,))
5516
5528#define DT_ALL_INST_HAS_PROP_STATUS_OKAY_(idx, prop) \
5529 IF_DISABLED(DT_INST_NODE_HAS_PROP(idx, prop), (1,))
5530
5543#define DT_ALL_INST_HAS_BOOL_STATUS_OKAY_(idx, prop) \
5544 IF_DISABLED(DT_INST_PROP(idx, prop), (1,))
5545
5546#define DT_PATH_INTERNAL(...) \
5547 UTIL_CAT(DT_ROOT, MACRO_MAP_CAT(DT_S_PREFIX, __VA_ARGS__))
5553#define DT_S_PREFIX(name) _S_##name
5554
5569#define DT_CAT(a1, a2) a1 ## a2
5571#define DT_CAT3(a1, a2, a3) a1 ## a2 ## a3
5573#define DT_CAT4(a1, a2, a3, a4) a1 ## a2 ## a3 ## a4
5575#define DT_CAT5(a1, a2, a3, a4, a5) a1 ## a2 ## a3 ## a4 ## a5
5577#define DT_CAT6(a1, a2, a3, a4, a5, a6) a1 ## a2 ## a3 ## a4 ## a5 ## a6
5579#define DT_CAT7(a1, a2, a3, a4, a5, a6, a7) \
5580 a1 ## a2 ## a3 ## a4 ## a5 ## a6 ## a7
5582#define DT_CAT8(a1, a2, a3, a4, a5, a6, a7, a8) \
5583 a1 ## a2 ## a3 ## a4 ## a5 ## a6 ## a7 ## a8
5584/*
5585 * If you need to define a bigger DT_CATN(), do so here. Don't leave
5586 * any "holes" of undefined macros, please.
5587 */
5588
5590#define DT_DASH(...) MACRO_MAP_CAT(DT_DASH_PREFIX, __VA_ARGS__)
5592#define DT_DASH_PREFIX(name) _##name
5594#define DT_NODE_HAS_STATUS_INTERNAL(node_id, status) \
5595 IS_ENABLED(DT_CAT3(node_id, _STATUS_, status))
5596
5600#define DT_COMPAT_NODE_HAS_PROP_AND_OR(inst, compat, prop) \
5601 DT_NODE_HAS_PROP(DT_INST(inst, compat), prop) ||
5602
5607#if defined(_LINKER) || defined(_ASMLANGUAGE)
5608#define DT_U32_C(_v) (_v)
5609#else
5610#define DT_U32_C(_v) UINT32_C(_v)
5611#endif
5612
5617#if defined(_LINKER) || defined(_ASMLANGUAGE)
5618#define DT_U64_C(_v) (_v)
5619#else
5620#define DT_U64_C(_v) UINT64_C(_v)
5621#endif
5622
5623/* Helpers for DT_NODELABEL_STRING_ARRAY. We define our own stringify
5624 * in order to avoid adding a dependency on toolchain.h..
5625 */
5626#define DT_NODELABEL_STRING_ARRAY_ENTRY_INTERNAL(nodelabel) DT_STRINGIFY_INTERNAL(nodelabel),
5627#define DT_STRINGIFY_INTERNAL(arg) DT_STRINGIFY_INTERNAL_HELPER(arg)
5628#define DT_STRINGIFY_INTERNAL_HELPER(arg) #arg
5629
5631
5632/* have these last so they have access to all previously defined macros */
5635#include <zephyr/devicetree/gpio.h>
5636#include <zephyr/devicetree/spi.h>
5637#include <zephyr/devicetree/dma.h>
5638#include <zephyr/devicetree/pwms.h>
5642#include <zephyr/devicetree/can.h>
5644#include <zephyr/devicetree/mbox.h>
5648
5649#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.
HW spinlock 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.