Zephyr Project API 4.4.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
704#define DT_CHILD_NUM_STATUS_OKAY(node_id) \
705 DT_CAT(node_id, _CHILD_NUM_STATUS_OKAY)
706
716#define DT_DESCENDANT_NUM_ON_BUS(node_id, bus) \
717 DT_CAT3(node_id, _DESCENDANT_NUM_ON_BUS_, bus)
718
729#define DT_DESCENDANT_NUM_ON_BUS_STATUS_OKAY(node_id, bus) \
730 DT_CAT4(node_id, _DESCENDANT_NUM_ON_BUS_, bus, _STATUS_OKAY)
731
752#define DT_SAME_NODE(node_id1, node_id2) \
753 IS_EQ(DT_DEP_ORD(node_id1), DT_DEP_ORD(node_id2))
754
779#define DT_NODELABEL_STRING_ARRAY(node_id) \
780 { DT_FOREACH_NODELABEL(node_id, DT_NODELABEL_STRING_ARRAY_ENTRY_INTERNAL) }
781
785
791
822#define DT_PROP(node_id, prop) DT_CAT3(node_id, _P_, prop)
823
856#define DT_PROP_LEN(node_id, prop) DT_CAT4(node_id, _P_, prop, _LEN)
857
872#define DT_PROP_LEN_OR(node_id, prop, default_value) \
873 COND_CODE_1(DT_NODE_HAS_PROP(node_id, prop), \
874 (DT_PROP_LEN(node_id, prop)), (default_value))
875
896#define DT_PROP_HAS_IDX(node_id, prop, idx) \
897 IS_ENABLED(DT_CAT6(node_id, _P_, prop, _IDX_, idx, _EXISTS))
898
931#define DT_PROP_HAS_NAME(node_id, prop, name) \
932 IS_ENABLED(DT_CAT6(node_id, _P_, prop, _NAME_, name, _EXISTS))
933
968#define DT_PROP_BY_IDX(node_id, prop, idx) \
969 DT_CAT5(node_id, _P_, prop, _IDX_, idx)
970
979#define DT_PROP_LAST(node_id, prop) \
980 DT_PROP_BY_IDX(node_id, prop, UTIL_DEC(DT_PROP_LEN(node_id, prop)))
981
995#define DT_PROP_OR(node_id, prop, default_value) \
996 COND_CODE_1(DT_NODE_HAS_PROP(node_id, prop), \
997 (DT_PROP(node_id, prop)), (default_value))
998
1054#define DT_ENUM_IDX_BY_IDX(node_id, prop, idx) \
1055 DT_CAT6(node_id, _P_, prop, _IDX_, idx, _ENUM_IDX)
1056
1063#define DT_ENUM_IDX(node_id, prop) DT_ENUM_IDX_BY_IDX(node_id, prop, 0)
1064
1080#define DT_ENUM_IDX_BY_IDX_OR(node_id, prop, idx, default_idx_value) \
1081 COND_CODE_1(DT_PROP_HAS_IDX(node_id, prop, idx), \
1082 (DT_ENUM_IDX_BY_IDX(node_id, prop, idx)), (default_idx_value))
1083
1092#define DT_ENUM_IDX_OR(node_id, prop, default_idx_value) \
1093 DT_ENUM_IDX_BY_IDX_OR(node_id, prop, 0, default_idx_value)
1094
1104#define DT_ENUM_HAS_VALUE_BY_IDX(node_id, prop, idx, value) \
1105 IS_ENABLED(DT_CAT8(node_id, _P_, prop, _IDX_, idx, _ENUM_VAL_, value, _EXISTS))
1106
1114#define DT_ENUM_HAS_VALUE(node_id, prop, value) \
1115 IS_ENABLED(DT_CAT6(node_id, _P_, prop, _ENUM_VAL_, value, _EXISTS))
1116
1176#define DT_STRING_TOKEN(node_id, prop) \
1177 DT_CAT4(node_id, _P_, prop, _STRING_TOKEN)
1178
1192#define DT_STRING_TOKEN_OR(node_id, prop, default_value) \
1193 COND_CODE_1(DT_NODE_HAS_PROP(node_id, prop), \
1194 (DT_STRING_TOKEN(node_id, prop)), (default_value))
1195
1253#define DT_STRING_UPPER_TOKEN(node_id, prop) \
1254 DT_CAT4(node_id, _P_, prop, _STRING_UPPER_TOKEN)
1255
1270#define DT_STRING_UPPER_TOKEN_OR(node_id, prop, default_value) \
1271 COND_CODE_1(DT_NODE_HAS_PROP(node_id, prop), \
1272 (DT_STRING_UPPER_TOKEN(node_id, prop)), (default_value))
1273
1314#define DT_STRING_UNQUOTED(node_id, prop) \
1315 DT_CAT4(node_id, _P_, prop, _STRING_UNQUOTED)
1316
1331#define DT_STRING_UNQUOTED_OR(node_id, prop, default_value) \
1332 COND_CODE_1(DT_NODE_HAS_PROP(node_id, prop), \
1333 (DT_STRING_UNQUOTED(node_id, prop)), (default_value))
1334
1382#define DT_STRING_TOKEN_BY_IDX(node_id, prop, idx) \
1383 DT_CAT6(node_id, _P_, prop, _IDX_, idx, _STRING_TOKEN)
1384
1393#define DT_STRING_TOKEN_BY_IDX_OR(node_id, prop, idx, default_value) \
1394 COND_CODE_1(DT_PROP_HAS_IDX(node_id, prop, idx), \
1395 (DT_STRING_TOKEN_BY_IDX(node_id, prop, idx)), (default_value))
1396
1444#define DT_STRING_UPPER_TOKEN_BY_IDX(node_id, prop, idx) \
1445 DT_CAT6(node_id, _P_, prop, _IDX_, idx, _STRING_UPPER_TOKEN)
1446
1487#define DT_STRING_UNQUOTED_BY_IDX(node_id, prop, idx) \
1488 DT_CAT6(node_id, _P_, prop, _IDX_, idx, _STRING_UNQUOTED)
1489
1490/*
1491 * phandle properties
1492 *
1493 * These are special-cased to manage the impedance mismatch between
1494 * phandles, which are just uint32_t node properties that only make sense
1495 * within the tree itself, and C values.
1496 */
1497
1543#define DT_PROP_BY_PHANDLE_IDX(node_id, phs, idx, prop) \
1544 DT_PROP(DT_PHANDLE_BY_IDX(node_id, phs, idx), prop)
1545
1565#define DT_PROP_BY_PHANDLE_IDX_OR(node_id, phs, idx, prop, default_value) \
1566 DT_PROP_OR(DT_PHANDLE_BY_IDX(node_id, phs, idx), prop, default_value)
1567
1579#define DT_PROP_BY_PHANDLE(node_id, ph, prop) \
1580 DT_PROP_BY_PHANDLE_IDX(node_id, ph, 0, prop)
1581
1636#define DT_PHA_BY_IDX(node_id, pha, idx, cell) \
1637 DT_CAT7(node_id, _P_, pha, _IDX_, idx, _VAL_, cell)
1638
1662#define DT_PHA_BY_IDX_OR(node_id, pha, idx, cell, default_value) \
1663 DT_PROP_OR(node_id, DT_CAT5(pha, _IDX_, idx, _VAL_, cell), default_value)
1664
1672#define DT_PHA(node_id, pha, cell) DT_PHA_BY_IDX(node_id, pha, 0, cell)
1673
1688#define DT_PHA_OR(node_id, pha, cell, default_value) \
1689 DT_PHA_BY_IDX_OR(node_id, pha, 0, cell, default_value)
1690
1731#define DT_PHA_BY_NAME(node_id, pha, name, cell) \
1732 DT_CAT7(node_id, _P_, pha, _NAME_, name, _VAL_, cell)
1733
1755#define DT_PHA_BY_NAME_OR(node_id, pha, name, cell, default_value) \
1756 DT_PROP_OR(node_id, DT_CAT5(pha, _NAME_, name, _VAL_, cell), default_value)
1757
1805#define DT_PHANDLE_BY_NAME(node_id, pha, name) \
1806 DT_CAT6(node_id, _P_, pha, _NAME_, name, _PH)
1807
1857#define DT_PHANDLE_BY_IDX(node_id, prop, idx) \
1858 DT_CAT6(node_id, _P_, prop, _IDX_, idx, _PH)
1859
1871#define DT_PHANDLE(node_id, prop) DT_PHANDLE_BY_IDX(node_id, prop, 0)
1872
1876
1882
1919#define DT_NUM_RANGES(node_id) DT_CAT(node_id, _RANGES_NUM)
1920
1973#define DT_RANGES_HAS_IDX(node_id, idx) \
1974 IS_ENABLED(DT_CAT4(node_id, _RANGES_IDX_, idx, _EXISTS))
1975
2028#define DT_RANGES_HAS_CHILD_BUS_FLAGS_AT_IDX(node_id, idx) \
2029 IS_ENABLED(DT_CAT4(node_id, _RANGES_IDX_, idx, _VAL_CHILD_BUS_FLAGS_EXISTS))
2030
2068#define DT_RANGES_CHILD_BUS_FLAGS_BY_IDX(node_id, idx) \
2069 DT_CAT4(node_id, _RANGES_IDX_, idx, _VAL_CHILD_BUS_FLAGS)
2070
2117#define DT_RANGES_CHILD_BUS_ADDRESS_BY_IDX(node_id, idx) \
2118 DT_CAT4(node_id, _RANGES_IDX_, idx, _VAL_CHILD_BUS_ADDRESS)
2119
2166#define DT_RANGES_PARENT_BUS_ADDRESS_BY_IDX(node_id, idx) \
2167 DT_CAT4(node_id, _RANGES_IDX_, idx, _VAL_PARENT_BUS_ADDRESS)
2168
2215#define DT_RANGES_LENGTH_BY_IDX(node_id, idx) \
2216 DT_CAT4(node_id, _RANGES_IDX_, idx, _VAL_LENGTH)
2217
2257#define DT_FOREACH_RANGE(node_id, fn) \
2258 DT_CAT(node_id, _FOREACH_RANGE)(fn)
2259
2263
2269
2305#define DT_NODE_VENDOR_BY_IDX(node_id, idx) \
2306 DT_CAT3(node_id, _COMPAT_VENDOR_IDX_, idx)
2307
2320#define DT_NODE_VENDOR_HAS_IDX(node_id, idx) \
2321 IS_ENABLED(DT_CAT4(node_id, _COMPAT_VENDOR_IDX_, idx, _EXISTS))
2322
2337#define DT_NODE_VENDOR_BY_IDX_OR(node_id, idx, default_value) \
2338 COND_CODE_1(DT_NODE_VENDOR_HAS_IDX(node_id, idx), \
2339 (DT_NODE_VENDOR_BY_IDX(node_id, idx)), (default_value))
2340
2349#define DT_NODE_VENDOR_OR(node_id, default_value) \
2350 DT_NODE_VENDOR_BY_IDX_OR(node_id, 0, default_value)
2351
2381#define DT_NODE_MODEL_BY_IDX(node_id, idx) \
2382 DT_CAT3(node_id, _COMPAT_MODEL_IDX_, idx)
2383
2396#define DT_NODE_MODEL_HAS_IDX(node_id, idx) \
2397 IS_ENABLED(DT_CAT4(node_id, _COMPAT_MODEL_IDX_, idx, _EXISTS))
2398
2413#define DT_NODE_MODEL_BY_IDX_OR(node_id, idx, default_value) \
2414 COND_CODE_1(DT_NODE_MODEL_HAS_IDX(node_id, idx), \
2415 (DT_NODE_MODEL_BY_IDX(node_id, idx)), (default_value))
2416
2425#define DT_NODE_MODEL_OR(node_id, default_value) \
2426 DT_NODE_MODEL_BY_IDX_OR(node_id, 0, default_value)
2427
2431
2437
2445#define DT_NUM_REGS(node_id) DT_CAT(node_id, _REG_NUM)
2446
2458#define DT_REG_HAS_IDX(node_id, idx) \
2459 IS_ENABLED(DT_CAT4(node_id, _REG_IDX_, idx, _EXISTS))
2460
2472#define DT_REG_HAS_NAME(node_id, name) \
2473 IS_ENABLED(DT_CAT4(node_id, _REG_NAME_, name, _EXISTS))
2474
2486#define DT_REG_ADDR_BY_IDX_RAW(node_id, idx) \
2487 DT_CAT4(node_id, _REG_IDX_, idx, _VAL_ADDRESS)
2488
2500#define DT_REG_ADDR_RAW(node_id) \
2501 DT_REG_ADDR_BY_IDX_RAW(node_id, 0)
2502
2509#define DT_REG_ADDR_BY_IDX(node_id, idx) \
2510 DT_U32_C(DT_REG_ADDR_BY_IDX_RAW(node_id, idx))
2511
2523#define DT_REG_SIZE_BY_IDX(node_id, idx) \
2524 DT_U32_C(DT_CAT4(node_id, _REG_IDX_, idx, _VAL_SIZE))
2525
2533#define DT_REG_ADDR(node_id) DT_REG_ADDR_BY_IDX(node_id, 0)
2534
2545#define DT_REG_ADDR_U64(node_id) DT_U64_C(DT_REG_ADDR_BY_IDX_RAW(node_id, 0))
2546
2554#define DT_REG_SIZE(node_id) DT_REG_SIZE_BY_IDX(node_id, 0)
2555
2562#define DT_REG_ADDR_BY_NAME(node_id, name) \
2563 DT_U32_C(DT_CAT4(node_id, _REG_NAME_, name, _VAL_ADDRESS))
2564
2573#define DT_REG_ADDR_BY_NAME_OR(node_id, name, default_value) \
2574 COND_CODE_1(DT_REG_HAS_NAME(node_id, name), \
2575 (DT_REG_ADDR_BY_NAME(node_id, name)), (default_value))
2576
2589#define DT_REG_ADDR_BY_NAME_U64(node_id, name) \
2590 DT_U64_C(DT_CAT4(node_id, _REG_NAME_, name, _VAL_ADDRESS))
2591
2598#define DT_REG_SIZE_BY_NAME(node_id, name) \
2599 DT_U32_C(DT_CAT4(node_id, _REG_NAME_, name, _VAL_SIZE))
2600
2609#define DT_REG_SIZE_BY_NAME_OR(node_id, name, default_value) \
2610 COND_CODE_1(DT_REG_HAS_NAME(node_id, name), \
2611 (DT_REG_SIZE_BY_NAME(node_id, name)), (default_value))
2612
2613
2661#define DT_FOREACH_REG(node_id, fn) \
2662 DT_CAT(node_id, _FOREACH_REG)(fn)
2663
2712#define DT_FOREACH_REG_SEP(node_id, fn, sep) \
2713 DT_CAT(node_id, _FOREACH_REG_SEP)(fn, sep)
2714
2728
2729#define DT_FOREACH_REG_VARGS(node_id, fn, ...) \
2730 DT_CAT(node_id, _FOREACH_REG_VARGS)(fn, __VA_ARGS__)
2731
2748#define DT_FOREACH_REG_SEP_VARGS(node_id, fn, sep, ...) \
2749 DT_CAT(node_id, _FOREACH_REG_SEP_VARGS)(fn, sep, __VA_ARGS__)
2750
2754
2760
2769#define DT_NUM_IRQS(node_id) DT_CAT(node_id, _IRQ_NUM)
2770
2795#define DT_NUM_NODELABELS(node_id) DT_CAT(node_id, _NODELABEL_NUM)
2796
2803#define DT_IRQ_LEVEL(node_id) DT_CAT(node_id, _IRQ_LEVEL)
2804
2815#define DT_IRQ_HAS_IDX(node_id, idx) \
2816 IS_ENABLED(DT_CAT4(node_id, _IRQ_IDX_, idx, _EXISTS))
2817
2828#define DT_IRQ_HAS_CELL_AT_IDX(node_id, idx, cell) \
2829 IS_ENABLED(DT_CAT6(node_id, _IRQ_IDX_, idx, _VAL_, cell, _EXISTS))
2830
2838#define DT_IRQ_HAS_CELL(node_id, cell) DT_IRQ_HAS_CELL_AT_IDX(node_id, 0, cell)
2839
2849#define DT_IRQ_HAS_NAME(node_id, name) \
2850 IS_ENABLED(DT_CAT4(node_id, _IRQ_NAME_, name, _VAL_irq_EXISTS))
2851
2887#define DT_IRQ_BY_IDX(node_id, idx, cell) \
2888 DT_CAT5(node_id, _IRQ_IDX_, idx, _VAL_, cell)
2889
2905#define DT_IRQ_BY_NAME(node_id, name, cell) \
2906 DT_CAT5(node_id, _IRQ_NAME_, name, _VAL_, cell)
2907
2915#define DT_IRQ(node_id, cell) DT_IRQ_BY_IDX(node_id, 0, cell)
2916
2959#define DT_IRQ_INTC_BY_IDX(node_id, idx) \
2960 DT_CAT4(node_id, _IRQ_IDX_, idx, _CONTROLLER)
2961
3006#define DT_IRQ_INTC_BY_NAME(node_id, name) \
3007 DT_CAT4(node_id, _IRQ_NAME_, name, _CONTROLLER)
3008
3048#define DT_IRQ_INTC(node_id) \
3049 DT_IRQ_INTC_BY_IDX(node_id, 0)
3050
3054
3055/* DT helper macro to encode a node's IRQN to level 1 according to the multi-level scheme */
3056#define DT_IRQN_L1_INTERNAL(node_id, idx) DT_IRQ_BY_IDX(node_id, idx, irq)
3057/* DT helper macro to encode a node's IRQN to level 2 according to the multi-level scheme */
3058#define DT_IRQN_L2_INTERNAL(node_id, idx) \
3059 (IRQ_TO_L2(DT_IRQN_L1_INTERNAL(node_id, idx)) | \
3060 DT_IRQ(DT_IRQ_INTC_BY_IDX(node_id, idx), irq))
3061/* DT helper macro to encode a node's IRQN to level 3 according to the multi-level scheme */
3062#define DT_IRQN_L3_INTERNAL(node_id, idx) \
3063 (IRQ_TO_L3(DT_IRQN_L1_INTERNAL(node_id, idx)) | \
3064 IRQ_TO_L2(DT_IRQ(DT_IRQ_INTC_BY_IDX(node_id, idx), irq)) | \
3065 DT_IRQ(DT_IRQ_INTC(DT_IRQ_INTC_BY_IDX(node_id, idx)), irq))
3066/* DT helper macro for the macros above */
3067#define DT_IRQN_LVL_INTERNAL(node_id, idx, level) DT_CAT3(DT_IRQN_L, level, _INTERNAL)(node_id, idx)
3068
3073#define DT_MULTI_LEVEL_IRQN_INTERNAL(node_id, idx) \
3074 DT_IRQN_LVL_INTERNAL(node_id, idx, DT_IRQ_LEVEL(node_id))
3075
3079
3088#define DT_IRQN_BY_IDX(node_id, idx) \
3089 COND_CODE_1(IS_ENABLED(CONFIG_MULTI_LEVEL_INTERRUPTS), \
3090 (DT_MULTI_LEVEL_IRQN_INTERNAL(node_id, idx)), \
3091 (DT_IRQ_BY_IDX(node_id, idx, irq)))
3092
3103#define DT_IRQN(node_id) DT_IRQN_BY_IDX(node_id, 0)
3104
3108
3114
3123#define DT_CHOSEN(prop) DT_CAT(DT_CHOSEN_, prop)
3124
3131#define DT_HAS_CHOSEN(prop) IS_ENABLED(DT_CAT3(DT_CHOSEN_, prop, _EXISTS))
3132
3136
3172
3182#define DT_FOREACH_NODE(fn) DT_FOREACH_HELPER(fn)
3183
3196#define DT_FOREACH_NODE_VARGS(fn, ...) DT_FOREACH_VARGS_HELPER(fn, __VA_ARGS__)
3197
3209#define DT_FOREACH_STATUS_OKAY_NODE(fn) DT_FOREACH_OKAY_HELPER(fn)
3210
3225#define DT_FOREACH_STATUS_OKAY_NODE_VARGS(fn, ...) DT_FOREACH_OKAY_VARGS_HELPER(fn, __VA_ARGS__)
3226
3273#define DT_FOREACH_ANCESTOR(node_id, fn) \
3274 DT_CAT(node_id, _FOREACH_ANCESTOR)(fn)
3275
3319#define DT_FOREACH_CHILD(node_id, fn) \
3320 DT_CAT(node_id, _FOREACH_CHILD)(fn)
3321
3362#define DT_FOREACH_CHILD_SEP(node_id, fn, sep) \
3363 DT_CAT(node_id, _FOREACH_CHILD_SEP)(fn, sep)
3364
3380#define DT_FOREACH_CHILD_VARGS(node_id, fn, ...) \
3381 DT_CAT(node_id, _FOREACH_CHILD_VARGS)(fn, __VA_ARGS__)
3382
3398#define DT_FOREACH_CHILD_SEP_VARGS(node_id, fn, sep, ...) \
3399 DT_CAT(node_id, _FOREACH_CHILD_SEP_VARGS)(fn, sep, __VA_ARGS__)
3400
3416#define DT_FOREACH_CHILD_STATUS_OKAY(node_id, fn) \
3417 DT_CAT(node_id, _FOREACH_CHILD_STATUS_OKAY)(fn)
3418
3435#define DT_FOREACH_CHILD_STATUS_OKAY_SEP(node_id, fn, sep) \
3436 DT_CAT(node_id, _FOREACH_CHILD_STATUS_OKAY_SEP)(fn, sep)
3437
3457#define DT_FOREACH_CHILD_STATUS_OKAY_VARGS(node_id, fn, ...) \
3458 DT_CAT(node_id, _FOREACH_CHILD_STATUS_OKAY_VARGS)(fn, __VA_ARGS__)
3459
3478#define DT_FOREACH_CHILD_STATUS_OKAY_SEP_VARGS(node_id, fn, sep, ...) \
3479 DT_CAT(node_id, _FOREACH_CHILD_STATUS_OKAY_SEP_VARGS)(fn, sep, __VA_ARGS__)
3480
3531#define DT_FOREACH_PROP_ELEM(node_id, prop, fn) \
3532 DT_CAT4(node_id, _P_, prop, _FOREACH_PROP_ELEM)(fn)
3533
3576#define DT_FOREACH_PROP_ELEM_SEP(node_id, prop, fn, sep) \
3577 DT_CAT4(node_id, _P_, prop, _FOREACH_PROP_ELEM_SEP)(fn, sep)
3578
3599#define DT_FOREACH_PROP_ELEM_VARGS(node_id, prop, fn, ...) \
3600 DT_CAT4(node_id, _P_, prop, _FOREACH_PROP_ELEM_VARGS)(fn, __VA_ARGS__)
3601
3618#define DT_FOREACH_PROP_ELEM_SEP_VARGS(node_id, prop, fn, sep, ...) \
3619 DT_CAT4(node_id, _P_, prop, _FOREACH_PROP_ELEM_SEP_VARGS)( \
3620 fn, sep, __VA_ARGS__)
3621
3675#define DT_FOREACH_STATUS_OKAY(compat, fn) \
3676 COND_CODE_1(DT_HAS_COMPAT_STATUS_OKAY(compat), \
3677 (UTIL_CAT(DT_FOREACH_OKAY_, compat)(fn)), \
3678 ())
3679
3724#define DT_FOREACH_STATUS_OKAY_VARGS(compat, fn, ...) \
3725 COND_CODE_1(DT_HAS_COMPAT_STATUS_OKAY(compat), \
3726 (DT_CAT(DT_FOREACH_OKAY_VARGS_, \
3727 compat)(fn, __VA_ARGS__)), \
3728 ())
3729
3742#define DT_COMPAT_FOREACH_STATUS_OKAY_VARGS(compat, fn, ...) \
3743 COND_CODE_1(DT_HAS_COMPAT_STATUS_OKAY(compat), \
3744 (UTIL_CAT(DT_FOREACH_OKAY_INST_VARGS_, \
3745 compat)(fn, compat, __VA_ARGS__)), \
3746 ())
3747
3748
3787#define DT_FOREACH_NODELABEL(node_id, fn) DT_CAT(node_id, _FOREACH_NODELABEL)(fn)
3788
3826#define DT_FOREACH_NODELABEL_VARGS(node_id, fn, ...) \
3827 DT_CAT(node_id, _FOREACH_NODELABEL_VARGS)(fn, __VA_ARGS__)
3828
3832
3838
3853#define DT_NODE_EXISTS(node_id) IS_ENABLED(DT_CAT(node_id, _EXISTS))
3854
3876#define DT_NODE_HAS_STATUS(node_id, status) \
3877 DT_NODE_HAS_STATUS_INTERNAL(node_id, status)
3878
3899#define DT_NODE_HAS_STATUS_OKAY(node_id) DT_NODE_HAS_STATUS(node_id, okay)
3900
3920#define DT_HAS_COMPAT_STATUS_OKAY(compat) \
3921 IS_ENABLED(DT_CAT(DT_COMPAT_HAS_OKAY_, compat))
3922
3929#define DT_NUM_INST_STATUS_OKAY(compat) \
3930 UTIL_AND(DT_HAS_COMPAT_STATUS_OKAY(compat), \
3931 UTIL_CAT(DT_N_INST, DT_DASH(compat, NUM_OKAY)))
3932
3960#define DT_NODE_HAS_COMPAT(node_id, compat) \
3961 IS_ENABLED(DT_CAT3(node_id, _COMPAT_MATCHES_, compat))
3962
3977#define DT_NODE_HAS_COMPAT_STATUS(node_id, compat, status) \
3978 UTIL_AND(DT_NODE_HAS_COMPAT(node_id, compat), DT_NODE_HAS_STATUS(node_id, status))
3979
3993#define DT_NODE_HAS_PROP(node_id, prop) \
3994 IS_ENABLED(DT_CAT4(node_id, _P_, prop, _EXISTS))
3995
3996
4013#define DT_PHA_HAS_CELL_AT_IDX(node_id, pha, idx, cell) \
4014 IS_ENABLED(DT_CAT8(node_id, _P_, pha, \
4015 _IDX_, idx, _VAL_, cell, _EXISTS))
4016
4026#define DT_PHA_HAS_CELL(node_id, pha, cell) \
4027 DT_PHA_HAS_CELL_AT_IDX(node_id, pha, 0, cell)
4028
4049#define DT_FOREACH_PHA_CELL_BY_IDX(node_id, pha, idx, fn) \
4050 DT_CAT6(node_id, _P_, pha, _IDX_, idx, _FOREACH_CELL)(fn)
4051
4064#define DT_FOREACH_PHA_CELL_BY_IDX_SEP(node_id, pha, idx, fn, sep) \
4065 DT_CAT6(node_id, _P_, pha, _IDX_, idx, _FOREACH_CELL_SEP)(fn, sep)
4066
4075#define DT_PHA_NUM_CELLS_BY_IDX(node_id, pha, idx) \
4076 DT_CAT6(node_id, _P_, pha, _IDX_, idx, _NUM_CELLS)
4077
4089#define DT_PHA_ELEM_NAME_BY_IDX(node_id, pha, idx) \
4090 DT_CAT6(node_id, _P_, pha, _IDX_, idx, _NAME)
4091
4113#define DT_FOREACH_PHA_CELL_BY_NAME(node_id, pha, name, fn) \
4114 DT_CAT6(node_id, _P_, pha, _NAME_, name, _FOREACH_CELL)(fn)
4115
4128#define DT_FOREACH_PHA_CELL_BY_NAME_SEP(node_id, pha, name, fn, sep) \
4129 DT_CAT6(node_id, _P_, pha, _NAME_, name, _FOREACH_CELL_SEP)(fn, sep)
4130
4139#define DT_PHA_NUM_CELLS_BY_NAME(node_id, pha, name) \
4140 DT_CAT6(node_id, _P_, pha, _NAME_, name, _NUM_CELLS)
4141
4153#define DT_PHA_ELEM_IDX_BY_NAME(node_id, pha, name) \
4154 DT_CAT6(node_id, _P_, pha, _NAME_, name, _IDX)
4155
4156
4160
4166
4198#define DT_BUS(node_id) DT_CAT(node_id, _BUS)
4199
4228#define DT_ON_BUS(node_id, bus) IS_ENABLED(DT_CAT3(node_id, _BUS_, bus))
4229
4233
4239
4246#define DT_DRV_INST(inst) DT_INST(inst, DT_DRV_COMPAT)
4247
4255#define DT_INST_PARENT(inst) DT_PARENT(DT_DRV_INST(inst))
4256
4264#define DT_INST_GPARENT(inst) DT_GPARENT(DT_DRV_INST(inst))
4265
4275#define DT_INST_CHILD(inst, child) \
4276 DT_CHILD(DT_DRV_INST(inst), child)
4277
4290#define DT_INST_CHILD_BY_UNIT_ADDR_INT(inst, addr) \
4291 DT_CHILD_BY_UNIT_ADDR_INT(DT_DRV_INST(inst), addr)
4292
4302#define DT_INST_CHILD_NUM(inst) DT_CHILD_NUM(DT_DRV_INST(inst))
4303
4314#define DT_INST_CHILD_NUM_STATUS_OKAY(inst) \
4315 DT_CHILD_NUM_STATUS_OKAY(DT_DRV_INST(inst))
4316
4329#define DT_INST_DESCENDANT_NUM_ON_BUS(inst, bus) \
4330 DT_DESCENDANT_NUM_ON_BUS(DT_DRV_INST(inst), bus)
4331
4345#define DT_INST_DESCENDANT_NUM_ON_BUS_STATUS_OKAY(inst, bus) \
4346 DT_DESCENDANT_NUM_ON_BUS_STATUS_OKAY(DT_DRV_INST(inst), bus)
4347
4356#define DT_INST_NODELABEL_STRING_ARRAY(inst) DT_NODELABEL_STRING_ARRAY(DT_DRV_INST(inst))
4357
4366#define DT_INST_NUM_NODELABELS(inst) DT_NUM_NODELABELS(DT_DRV_INST(inst))
4367
4382#define DT_INST_FOREACH_CHILD(inst, fn) \
4383 DT_FOREACH_CHILD(DT_DRV_INST(inst), fn)
4384
4398#define DT_INST_FOREACH_CHILD_SEP(inst, fn, sep) \
4399 DT_FOREACH_CHILD_SEP(DT_DRV_INST(inst), fn, sep)
4400
4416#define DT_INST_FOREACH_CHILD_VARGS(inst, fn, ...) \
4417 DT_FOREACH_CHILD_VARGS(DT_DRV_INST(inst), fn, __VA_ARGS__)
4418
4433#define DT_INST_FOREACH_CHILD_SEP_VARGS(inst, fn, sep, ...) \
4434 DT_FOREACH_CHILD_SEP_VARGS(DT_DRV_INST(inst), fn, sep, __VA_ARGS__)
4435
4447#define DT_INST_FOREACH_CHILD_STATUS_OKAY(inst, fn) \
4448 DT_FOREACH_CHILD_STATUS_OKAY(DT_DRV_INST(inst), fn)
4449
4464#define DT_INST_FOREACH_CHILD_STATUS_OKAY_SEP(inst, fn, sep) \
4465 DT_FOREACH_CHILD_STATUS_OKAY_SEP(DT_DRV_INST(inst), fn, sep)
4466
4480#define DT_INST_FOREACH_CHILD_STATUS_OKAY_VARGS(inst, fn, ...) \
4481 DT_FOREACH_CHILD_STATUS_OKAY_VARGS(DT_DRV_INST(inst), fn, __VA_ARGS__)
4482
4498#define DT_INST_FOREACH_CHILD_STATUS_OKAY_SEP_VARGS(inst, fn, sep, ...) \
4499 DT_FOREACH_CHILD_STATUS_OKAY_SEP_VARGS(DT_DRV_INST(inst), fn, sep, __VA_ARGS__)
4500
4515#define DT_INST_FOREACH_REG(inst, fn) \
4516 DT_FOREACH_REG(DT_DRV_INST(inst), fn)
4517
4534#define DT_INST_FOREACH_REG_SEP(inst, fn, sep) \
4535 DT_FOREACH_REG_SEP(DT_DRV_INST(inst), fn, sep)
4536
4553#define DT_INST_FOREACH_REG_VARGS(inst, fn, ...) \
4554 DT_FOREACH_REG_VARGS(DT_DRV_INST(inst), fn, __VA_ARGS__)
4555
4574#define DT_INST_FOREACH_REG_SEP_VARGS(inst, fn, sep, ...) \
4575 DT_FOREACH_REG_SEP_VARGS(DT_DRV_INST(inst), fn, sep, __VA_ARGS__)
4576
4584#define DT_INST_ENUM_IDX_BY_IDX(inst, prop, idx) \
4585 DT_ENUM_IDX_BY_IDX(DT_DRV_INST(inst), prop, idx)
4586
4593#define DT_INST_ENUM_IDX(inst, prop) \
4594 DT_ENUM_IDX(DT_DRV_INST(inst), prop)
4595
4605#define DT_INST_ENUM_IDX_BY_IDX_OR(inst, prop, idx, default_idx_value) \
4606 DT_ENUM_IDX_BY_IDX_OR(DT_DRV_INST(inst), prop, idx, default_idx_value)
4607
4616#define DT_INST_ENUM_IDX_OR(inst, prop, default_idx_value) \
4617 DT_ENUM_IDX_OR(DT_DRV_INST(inst), prop, default_idx_value)
4618
4627#define DT_INST_ENUM_HAS_VALUE_BY_IDX(inst, prop, idx, value) \
4628 DT_ENUM_HAS_VALUE_BY_IDX(DT_DRV_INST(inst), prop, idx, value)
4629
4638#define DT_INST_ENUM_HAS_VALUE(inst, prop, value) \
4639 DT_ENUM_HAS_VALUE(DT_DRV_INST(inst), prop, value)
4640
4647#define DT_INST_PROP(inst, prop) DT_PROP(DT_DRV_INST(inst), prop)
4648
4655#define DT_INST_PROP_LEN(inst, prop) DT_PROP_LEN(DT_DRV_INST(inst), prop)
4656
4666#define DT_INST_PROP_HAS_IDX(inst, prop, idx) \
4667 DT_PROP_HAS_IDX(DT_DRV_INST(inst), prop, idx)
4668
4677#define DT_INST_PROP_HAS_NAME(inst, prop, name) \
4678 DT_PROP_HAS_NAME(DT_DRV_INST(inst), prop, name)
4679
4687#define DT_INST_PROP_BY_IDX(inst, prop, idx) \
4688 DT_PROP_BY_IDX(DT_DRV_INST(inst), prop, idx)
4689
4697#define DT_INST_PROP_OR(inst, prop, default_value) \
4698 DT_PROP_OR(DT_DRV_INST(inst), prop, default_value)
4699
4707#define DT_INST_PROP_LEN_OR(inst, prop, default_value) \
4708 DT_PROP_LEN_OR(DT_DRV_INST(inst), prop, default_value)
4709
4719#define DT_INST_STRING_TOKEN(inst, prop) \
4720 DT_STRING_TOKEN(DT_DRV_INST(inst), prop)
4721
4729#define DT_INST_STRING_UPPER_TOKEN(inst, prop) \
4730 DT_STRING_UPPER_TOKEN(DT_DRV_INST(inst), prop)
4731
4740#define DT_INST_STRING_UNQUOTED(inst, prop) \
4741 DT_STRING_UNQUOTED(DT_DRV_INST(inst), prop)
4742
4750#define DT_INST_STRING_TOKEN_BY_IDX(inst, prop, idx) \
4751 DT_STRING_TOKEN_BY_IDX(DT_DRV_INST(inst), prop, idx)
4752
4761#define DT_INST_STRING_TOKEN_BY_IDX_OR(inst, prop, idx, default_value) \
4762 DT_STRING_TOKEN_BY_IDX_OR(DT_DRV_INST(inst), prop, idx, default_value)
4763
4771#define DT_INST_STRING_UPPER_TOKEN_BY_IDX(inst, prop, idx) \
4772 DT_STRING_UPPER_TOKEN_BY_IDX(DT_DRV_INST(inst), prop, idx)
4773
4781#define DT_INST_STRING_UNQUOTED_BY_IDX(inst, prop, idx) \
4782 DT_STRING_UNQUOTED_BY_IDX(DT_DRV_INST(inst), prop, idx)
4783
4792#define DT_INST_PROP_BY_PHANDLE(inst, ph, prop) \
4793 DT_INST_PROP_BY_PHANDLE_IDX(inst, ph, 0, prop)
4794
4806#define DT_INST_PROP_BY_PHANDLE_IDX(inst, phs, idx, prop) \
4807 DT_PROP_BY_PHANDLE_IDX(DT_DRV_INST(inst), phs, idx, prop)
4808
4817#define DT_INST_PHA_BY_IDX(inst, pha, idx, cell) \
4818 DT_PHA_BY_IDX(DT_DRV_INST(inst), pha, idx, cell)
4819
4829#define DT_INST_PHA_BY_IDX_OR(inst, pha, idx, cell, default_value) \
4830 DT_PHA_BY_IDX_OR(DT_DRV_INST(inst), pha, idx, cell, default_value)
4831
4840#define DT_INST_PHA(inst, pha, cell) DT_INST_PHA_BY_IDX(inst, pha, 0, cell)
4841
4850#define DT_INST_PHA_OR(inst, pha, cell, default_value) \
4851 DT_INST_PHA_BY_IDX_OR(inst, pha, 0, cell, default_value)
4852
4862#define DT_INST_PHA_BY_NAME(inst, pha, name, cell) \
4863 DT_PHA_BY_NAME(DT_DRV_INST(inst), pha, name, cell)
4864
4874#define DT_INST_PHA_BY_NAME_OR(inst, pha, name, cell, default_value) \
4875 DT_PHA_BY_NAME_OR(DT_DRV_INST(inst), pha, name, cell, default_value)
4876
4885#define DT_INST_PHANDLE_BY_NAME(inst, pha, name) \
4886 DT_PHANDLE_BY_NAME(DT_DRV_INST(inst), pha, name) \
4887
4888
4897#define DT_INST_PHANDLE_BY_IDX(inst, prop, idx) \
4898 DT_PHANDLE_BY_IDX(DT_DRV_INST(inst), prop, idx)
4899
4908#define DT_INST_PHANDLE(inst, prop) DT_INST_PHANDLE_BY_IDX(inst, prop, 0)
4909
4917#define DT_INST_REG_HAS_IDX(inst, idx) DT_REG_HAS_IDX(DT_DRV_INST(inst), idx)
4918
4926#define DT_INST_REG_HAS_NAME(inst, name) DT_REG_HAS_NAME(DT_DRV_INST(inst), name)
4927
4934#define DT_INST_REG_ADDR_BY_IDX_RAW(inst, idx) DT_REG_ADDR_BY_IDX_RAW(DT_DRV_INST(inst), idx)
4935
4942#define DT_INST_REG_ADDR_BY_IDX(inst, idx) DT_REG_ADDR_BY_IDX(DT_DRV_INST(inst), idx)
4943
4950#define DT_INST_REG_SIZE_BY_IDX(inst, idx) \
4951 DT_REG_SIZE_BY_IDX(DT_DRV_INST(inst), idx)
4952
4959#define DT_INST_REG_ADDR_BY_NAME(inst, name) \
4960 DT_REG_ADDR_BY_NAME(DT_DRV_INST(inst), name)
4961
4970#define DT_INST_REG_ADDR_BY_NAME_OR(inst, name, default_value) \
4971 DT_REG_ADDR_BY_NAME_OR(DT_DRV_INST(inst), name, default_value)
4972
4985#define DT_INST_REG_ADDR_BY_NAME_U64(inst, name) \
4986 DT_REG_ADDR_BY_NAME_U64(DT_DRV_INST(inst), name)
4987
4994#define DT_INST_REG_SIZE_BY_NAME(inst, name) \
4995 DT_REG_SIZE_BY_NAME(DT_DRV_INST(inst), name)
4996
5005#define DT_INST_REG_SIZE_BY_NAME_OR(inst, name, default_value) \
5006 DT_REG_SIZE_BY_NAME_OR(DT_DRV_INST(inst), name, default_value)
5007
5013#define DT_INST_REG_ADDR_RAW(inst) DT_INST_REG_ADDR_BY_IDX_RAW(inst, 0)
5014
5020#define DT_INST_REG_ADDR(inst) DT_INST_REG_ADDR_BY_IDX(inst, 0)
5021
5033#define DT_INST_REG_ADDR_U64(inst) DT_REG_ADDR_U64(DT_DRV_INST(inst))
5034
5040#define DT_INST_REG_SIZE(inst) DT_INST_REG_SIZE_BY_IDX(inst, 0)
5041
5048#define DT_INST_NUM_IRQS(inst) DT_NUM_IRQS(DT_DRV_INST(inst))
5049
5056#define DT_INST_IRQ_LEVEL(inst) DT_IRQ_LEVEL(DT_DRV_INST(inst))
5057
5065#define DT_INST_IRQ_BY_IDX(inst, idx, cell) \
5066 DT_IRQ_BY_IDX(DT_DRV_INST(inst), idx, cell)
5067
5074#define DT_INST_IRQ_INTC_BY_IDX(inst, idx) \
5075 DT_IRQ_INTC_BY_IDX(DT_DRV_INST(inst), idx)
5076
5083#define DT_INST_IRQ_INTC_BY_NAME(inst, name) \
5084 DT_IRQ_INTC_BY_NAME(DT_DRV_INST(inst), name)
5085
5093#define DT_INST_IRQ_INTC(inst) \
5094 DT_INST_IRQ_INTC_BY_IDX(inst, 0)
5095
5103#define DT_INST_IRQ_BY_NAME(inst, name, cell) \
5104 DT_IRQ_BY_NAME(DT_DRV_INST(inst), name, cell)
5105
5112#define DT_INST_IRQ(inst, cell) DT_INST_IRQ_BY_IDX(inst, 0, cell)
5113
5119#define DT_INST_IRQN(inst) DT_IRQN(DT_DRV_INST(inst))
5120
5127#define DT_INST_IRQN_BY_IDX(inst, idx) DT_IRQN_BY_IDX(DT_DRV_INST(inst), idx)
5128
5134#define DT_INST_BUS(inst) DT_BUS(DT_DRV_INST(inst))
5135
5143#define DT_INST_ON_BUS(inst, bus) DT_ON_BUS(DT_DRV_INST(inst), bus)
5144
5154#define DT_INST_STRING_TOKEN_OR(inst, name, default_value) \
5155 DT_STRING_TOKEN_OR(DT_DRV_INST(inst), name, default_value)
5156
5165#define DT_INST_STRING_UPPER_TOKEN_OR(inst, name, default_value) \
5166 DT_STRING_UPPER_TOKEN_OR(DT_DRV_INST(inst), name, default_value)
5167
5176#define DT_INST_STRING_UNQUOTED_OR(inst, name, default_value) \
5177 DT_STRING_UNQUOTED_OR(DT_DRV_INST(inst), name, default_value)
5178
5209#define DT_HAS_COMPAT_ON_BUS_STATUS_OKAY(compat, bus) \
5210 IS_ENABLED(DT_CAT4(DT_COMPAT_, compat, _BUS_, bus))
5211
5244#define DT_ANY_INST_ON_BUS_STATUS_OKAY(bus) \
5245 DT_HAS_COMPAT_ON_BUS_STATUS_OKAY(DT_DRV_COMPAT, bus)
5246
5291#define DT_ANY_INST_HAS_PROP_STATUS_OKAY(prop) \
5292 UTIL_NOT(IS_EMPTY( \
5293 DT_INST_FOREACH_STATUS_OKAY_VARGS(DT_ANY_INST_HAS_PROP_STATUS_OKAY_, prop)))
5294
5339#define DT_ALL_INST_HAS_PROP_STATUS_OKAY(prop) \
5340 IS_EMPTY(DT_INST_FOREACH_STATUS_OKAY_VARGS(DT_ALL_INST_HAS_PROP_STATUS_OKAY_, prop))
5341
5386#define DT_ANY_COMPAT_HAS_PROP_STATUS_OKAY(compat, prop) \
5387 (DT_COMPAT_FOREACH_STATUS_OKAY_VARGS(compat, DT_COMPAT_NODE_HAS_PROP_AND_OR, prop) 0)
5388
5436#define DT_ANY_INST_HAS_BOOL_STATUS_OKAY(prop) \
5437 UTIL_NOT(IS_EMPTY( \
5438 DT_INST_FOREACH_STATUS_OKAY_VARGS(DT_ANY_INST_HAS_BOOL_STATUS_OKAY_, prop)))
5439
5485#define DT_ALL_INST_HAS_BOOL_STATUS_OKAY(prop) \
5486 IS_EMPTY(DT_INST_FOREACH_STATUS_OKAY_VARGS(DT_ALL_INST_HAS_BOOL_STATUS_OKAY_, prop))
5487
5494#define DT_ANY_INST_REG_HAS_NAME_STATUS_OKAY(name) \
5495 UTIL_NOT(IS_EMPTY( \
5496 DT_INST_FOREACH_STATUS_OKAY_VARGS(DT_ANY_INST_REG_HAS_NAME_STATUS_OKAY_, name)))
5497
5504#define DT_ALL_INST_REG_HAS_NAME_STATUS_OKAY(name) \
5505 IS_EMPTY(DT_INST_FOREACH_STATUS_OKAY_VARGS(DT_ALL_INST_REG_HAS_NAME_STATUS_OKAY_, name))
5506
5572#define DT_INST_FOREACH_STATUS_OKAY(fn) \
5573 COND_CODE_1(DT_HAS_COMPAT_STATUS_OKAY(DT_DRV_COMPAT), \
5574 (UTIL_CAT(DT_FOREACH_OKAY_INST_, \
5575 DT_DRV_COMPAT)(fn)), \
5576 ())
5577
5590#define DT_INST_FOREACH_STATUS_OKAY_VARGS(fn, ...) \
5591 COND_CODE_1(DT_HAS_COMPAT_STATUS_OKAY(DT_DRV_COMPAT), \
5592 (UTIL_CAT(DT_FOREACH_OKAY_INST_VARGS_, \
5593 DT_DRV_COMPAT)(fn, __VA_ARGS__)), \
5594 ())
5595
5605#define DT_INST_FOREACH_NODELABEL(inst, fn) \
5606 DT_FOREACH_NODELABEL(DT_DRV_INST(inst), fn)
5607
5619#define DT_INST_FOREACH_NODELABEL_VARGS(inst, fn, ...) \
5620 DT_FOREACH_NODELABEL_VARGS(DT_DRV_INST(inst), fn, __VA_ARGS__)
5621
5632#define DT_INST_FOREACH_PROP_ELEM(inst, prop, fn) \
5633 DT_FOREACH_PROP_ELEM(DT_DRV_INST(inst), prop, fn)
5634
5647#define DT_INST_FOREACH_PROP_ELEM_SEP(inst, prop, fn, sep) \
5648 DT_FOREACH_PROP_ELEM_SEP(DT_DRV_INST(inst), prop, fn, sep)
5649
5664#define DT_INST_FOREACH_PROP_ELEM_VARGS(inst, prop, fn, ...) \
5665 DT_FOREACH_PROP_ELEM_VARGS(DT_DRV_INST(inst), prop, fn, __VA_ARGS__)
5666
5684#define DT_INST_FOREACH_PROP_ELEM_SEP_VARGS(inst, prop, fn, sep, ...) \
5685 DT_FOREACH_PROP_ELEM_SEP_VARGS(DT_DRV_INST(inst), prop, fn, sep, \
5686 __VA_ARGS__)
5687
5694#define DT_INST_NODE_HAS_PROP(inst, prop) \
5695 DT_NODE_HAS_PROP(DT_DRV_INST(inst), prop)
5696
5703#define DT_INST_NODE_HAS_COMPAT(inst, compat) \
5704 DT_NODE_HAS_COMPAT(DT_DRV_INST(inst), compat)
5705
5716#define DT_INST_PHA_HAS_CELL_AT_IDX(inst, pha, idx, cell) \
5717 DT_PHA_HAS_CELL_AT_IDX(DT_DRV_INST(inst), pha, idx, cell)
5718
5728#define DT_INST_PHA_HAS_CELL(inst, pha, cell) \
5729 DT_INST_PHA_HAS_CELL_AT_IDX(inst, pha, 0, cell)
5730
5738#define DT_INST_IRQ_HAS_IDX(inst, idx) DT_IRQ_HAS_IDX(DT_DRV_INST(inst), idx)
5739
5748#define DT_INST_IRQ_HAS_CELL_AT_IDX(inst, idx, cell) \
5749 DT_IRQ_HAS_CELL_AT_IDX(DT_DRV_INST(inst), idx, cell)
5750
5758#define DT_INST_IRQ_HAS_CELL(inst, cell) \
5759 DT_INST_IRQ_HAS_CELL_AT_IDX(inst, 0, cell)
5760
5767#define DT_INST_IRQ_HAS_NAME(inst, name) \
5768 DT_IRQ_HAS_NAME(DT_DRV_INST(inst), name)
5769
5773
5775
5787#define DT_ANY_INST_HAS_PROP_STATUS_OKAY_(inst, prop) \
5788 IF_ENABLED(DT_INST_NODE_HAS_PROP(inst, prop), (1,))
5789
5802#define DT_ANY_INST_HAS_BOOL_STATUS_OKAY_(inst, prop) \
5803 IF_ENABLED(DT_INST_PROP(inst, prop), (1,))
5804
5817#define DT_ANY_INST_REG_HAS_NAME_STATUS_OKAY_(inst, name) \
5818 IF_ENABLED(DT_INST_REG_HAS_NAME(inst, name), (1,))
5819
5831#define DT_ALL_INST_HAS_PROP_STATUS_OKAY_(inst, prop) \
5832 IF_DISABLED(DT_INST_NODE_HAS_PROP(inst, prop), (1,))
5833
5846#define DT_ALL_INST_HAS_BOOL_STATUS_OKAY_(inst, prop) \
5847 IF_DISABLED(DT_INST_PROP(inst, prop), (1,))
5848
5861#define DT_ALL_INST_REG_HAS_NAME_STATUS_OKAY_(inst, name) \
5862 IF_DISABLED(DT_INST_REG_HAS_NAME(inst, name), (1,))
5863
5864#define DT_PATH_INTERNAL(...) \
5865 UTIL_CAT(DT_ROOT, MACRO_MAP_CAT(DT_S_PREFIX, __VA_ARGS__))
5871#define DT_S_PREFIX(name) _S_##name
5872
5887#define DT_CAT(a1, a2) a1 ## a2
5889#define DT_CAT3(a1, a2, a3) a1 ## a2 ## a3
5891#define DT_CAT4(a1, a2, a3, a4) a1 ## a2 ## a3 ## a4
5893#define DT_CAT5(a1, a2, a3, a4, a5) a1 ## a2 ## a3 ## a4 ## a5
5895#define DT_CAT6(a1, a2, a3, a4, a5, a6) a1 ## a2 ## a3 ## a4 ## a5 ## a6
5897#define DT_CAT7(a1, a2, a3, a4, a5, a6, a7) \
5898 a1 ## a2 ## a3 ## a4 ## a5 ## a6 ## a7
5900#define DT_CAT8(a1, a2, a3, a4, a5, a6, a7, a8) \
5901 a1 ## a2 ## a3 ## a4 ## a5 ## a6 ## a7 ## a8
5902/*
5903 * If you need to define a bigger DT_CATN(), do so here. Don't leave
5904 * any "holes" of undefined macros, please.
5905 */
5906
5908#define DT_DASH(...) MACRO_MAP_CAT(DT_DASH_PREFIX, __VA_ARGS__)
5910#define DT_DASH_PREFIX(name) _##name
5912#define DT_NODE_HAS_STATUS_INTERNAL(node_id, status) \
5913 IS_ENABLED(DT_CAT3(node_id, _STATUS_, status))
5914
5918#define DT_COMPAT_NODE_HAS_PROP_AND_OR(inst, compat, prop) \
5919 DT_NODE_HAS_PROP(DT_INST(inst, compat), prop) ||
5920
5925#if defined(_LINKER) || defined(_ASMLANGUAGE)
5926#define DT_U32_C(_v) (_v)
5927#else
5928#define DT_U32_C(_v) UINT32_C(_v)
5929#endif
5930
5935#if defined(_LINKER) || defined(_ASMLANGUAGE)
5936#define DT_U64_C(_v) (_v)
5937#else
5938#define DT_U64_C(_v) UINT64_C(_v)
5939#endif
5940
5941/* Helpers for DT_NODELABEL_STRING_ARRAY. We define our own stringify
5942 * in order to avoid adding a dependency on toolchain.h..
5943 */
5944#define DT_NODELABEL_STRING_ARRAY_ENTRY_INTERNAL(nodelabel) DT_STRINGIFY_INTERNAL(nodelabel),
5945#define DT_STRINGIFY_INTERNAL(arg) DT_STRINGIFY_INTERNAL_HELPER(arg)
5946#define DT_STRINGIFY_INTERNAL_HELPER(arg) #arg
5947
5949
5950/* have these last so they have access to all previously defined macros */
5953#include <zephyr/devicetree/gpio.h>
5954#include <zephyr/devicetree/spi.h>
5955#include <zephyr/devicetree/dma.h>
5956#include <zephyr/devicetree/pwms.h>
5960#include <zephyr/devicetree/can.h>
5962#include <zephyr/devicetree/mbox.h>
5966#include <zephyr/devicetree/map.h>
5967#include <zephyr/devicetree/wuc.h>
5970#include <zephyr/devicetree/sram.h>
5971
5972#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.
Map devicetree macro public API header file.
MBOX Devicetree macro public API header file.
Flash Devicetree macro public API header file, for partitions.
Devicetree pin control helpers.
Reset Controller Devicetree macro public API header file.
SPI Devicetree macro public API header file.
Wakeup Controller 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.
Flash Devicetree macro public API header file, for memory-mapped partitions.
Devicetree node dependency ordinals.
Port / Endpoint Devicetree macro public API header file.
PWMs Devicetree macro public API header file.
Chosen SRAM Devicetree macro public API header file.
Misc utilities.