Zephyr API Documentation 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
236#define DT_NODELABEL_C_TOKEN_BY_IDX(node_id, idx) \
237 DT_CAT5(DT_N_NODELABEL_, node_id, _IDX_, idx, _C_TOKEN)
238
247#define DT_NODELABEL_C_TOKEN(node_id) \
248 DT_NODELABEL_C_TOKEN_BY_IDX(node_id, 0)
249
288#define DT_ALIAS(alias) DT_CAT(DT_N_ALIAS_, alias)
289
295#define DT_HAS_ALIAS(alias_name) DT_NODE_EXISTS(DT_ALIAS(alias_name))
296
305#define DT_NODE_HASH(node_id) DT_CAT(node_id, _HASH)
306
401#define DT_INST(inst, compat) UTIL_CAT(DT_N_INST, DT_DASH(inst, compat))
402
426#define DT_PARENT(node_id) DT_CAT(node_id, _PARENT)
427
451#define DT_GPARENT(node_id) DT_PARENT(DT_PARENT(node_id))
452
488#define DT_CHILD(node_id, child) UTIL_CAT(node_id, DT_S_PREFIX(child))
489
522#define DT_CHILD_BY_UNIT_ADDR_INT(node_id, addr) \
523 DT_CAT3(node_id, _CHILD_UNIT_ADDR_INT_, addr)
524
566#define DT_COMPAT_GET_ANY_STATUS_OKAY(compat) \
567 COND_CODE_1(DT_HAS_COMPAT_STATUS_OKAY(compat), \
568 (DT_INST(0, compat)), \
569 (DT_INVALID_NODE))
570
598#define DT_NODE_PATH(node_id) DT_CAT(node_id, _PATH)
599
624#define DT_NODE_FULL_NAME(node_id) DT_CAT(node_id, _FULL_NAME)
625
652#define DT_NODE_FULL_NAME_UNQUOTED(node_id) DT_CAT(node_id, _FULL_NAME_UNQUOTED)
653
680#define DT_NODE_FULL_NAME_TOKEN(node_id) DT_CAT(node_id, _FULL_NAME_TOKEN)
681
710#define DT_NODE_FULL_NAME_UPPER_TOKEN(node_id) DT_CAT(node_id, _FULL_NAME_UPPER_TOKEN)
711
738#define DT_NODE_CHILD_IDX(node_id) DT_CAT(node_id, _CHILD_IDX)
739
746#define DT_CHILD_NUM(node_id) DT_CAT(node_id, _CHILD_NUM)
747
755#define DT_CHILD_NUM_STATUS_OKAY(node_id) \
756 DT_CAT(node_id, _CHILD_NUM_STATUS_OKAY)
757
767#define DT_DESCENDANT_NUM_ON_BUS(node_id, bus) \
768 DT_CAT3(node_id, _DESCENDANT_NUM_ON_BUS_, bus)
769
780#define DT_DESCENDANT_NUM_ON_BUS_STATUS_OKAY(node_id, bus) \
781 DT_CAT4(node_id, _DESCENDANT_NUM_ON_BUS_, bus, _STATUS_OKAY)
782
803#define DT_SAME_NODE(node_id1, node_id2) \
804 IS_EQ(DT_DEP_ORD(node_id1), DT_DEP_ORD(node_id2))
805
830#define DT_NODELABEL_STRING_ARRAY(node_id) \
831 { DT_FOREACH_NODELABEL(node_id, DT_NODELABEL_STRING_ARRAY_ENTRY_INTERNAL) }
832
836
842
873#define DT_PROP(node_id, prop) DT_CAT3(node_id, _P_, prop)
874
907#define DT_PROP_LEN(node_id, prop) DT_CAT4(node_id, _P_, prop, _LEN)
908
923#define DT_PROP_LEN_OR(node_id, prop, default_value) \
924 COND_CODE_1(DT_NODE_HAS_PROP(node_id, prop), \
925 (DT_PROP_LEN(node_id, prop)), (default_value))
926
947#define DT_PROP_HAS_IDX(node_id, prop, idx) \
948 IS_ENABLED(DT_CAT6(node_id, _P_, prop, _IDX_, idx, _EXISTS))
949
982#define DT_PROP_HAS_NAME(node_id, prop, name) \
983 IS_ENABLED(DT_CAT6(node_id, _P_, prop, _NAME_, name, _EXISTS))
984
1019#define DT_PROP_BY_IDX(node_id, prop, idx) \
1020 DT_CAT5(node_id, _P_, prop, _IDX_, idx)
1021
1030#define DT_PROP_LAST(node_id, prop) \
1031 DT_PROP_BY_IDX(node_id, prop, UTIL_DEC(DT_PROP_LEN(node_id, prop)))
1032
1046#define DT_PROP_OR(node_id, prop, default_value) \
1047 COND_CODE_1(DT_NODE_HAS_PROP(node_id, prop), \
1048 (DT_PROP(node_id, prop)), (default_value))
1049
1105#define DT_ENUM_IDX_BY_IDX(node_id, prop, idx) \
1106 DT_CAT6(node_id, _P_, prop, _IDX_, idx, _ENUM_IDX)
1107
1114#define DT_ENUM_IDX(node_id, prop) DT_ENUM_IDX_BY_IDX(node_id, prop, 0)
1115
1131#define DT_ENUM_IDX_BY_IDX_OR(node_id, prop, idx, default_idx_value) \
1132 COND_CODE_1(DT_PROP_HAS_IDX(node_id, prop, idx), \
1133 (DT_ENUM_IDX_BY_IDX(node_id, prop, idx)), (default_idx_value))
1134
1143#define DT_ENUM_IDX_OR(node_id, prop, default_idx_value) \
1144 DT_ENUM_IDX_BY_IDX_OR(node_id, prop, 0, default_idx_value)
1145
1155#define DT_ENUM_HAS_VALUE_BY_IDX(node_id, prop, idx, value) \
1156 IS_ENABLED(DT_CAT8(node_id, _P_, prop, _IDX_, idx, _ENUM_VAL_, value, _EXISTS))
1157
1165#define DT_ENUM_HAS_VALUE(node_id, prop, value) \
1166 IS_ENABLED(DT_CAT6(node_id, _P_, prop, _ENUM_VAL_, value, _EXISTS))
1167
1227#define DT_STRING_TOKEN(node_id, prop) \
1228 DT_CAT4(node_id, _P_, prop, _STRING_TOKEN)
1229
1243#define DT_STRING_TOKEN_OR(node_id, prop, default_value) \
1244 COND_CODE_1(DT_NODE_HAS_PROP(node_id, prop), \
1245 (DT_STRING_TOKEN(node_id, prop)), (default_value))
1246
1304#define DT_STRING_UPPER_TOKEN(node_id, prop) \
1305 DT_CAT4(node_id, _P_, prop, _STRING_UPPER_TOKEN)
1306
1321#define DT_STRING_UPPER_TOKEN_OR(node_id, prop, default_value) \
1322 COND_CODE_1(DT_NODE_HAS_PROP(node_id, prop), \
1323 (DT_STRING_UPPER_TOKEN(node_id, prop)), (default_value))
1324
1365#define DT_STRING_UNQUOTED(node_id, prop) \
1366 DT_CAT4(node_id, _P_, prop, _STRING_UNQUOTED)
1367
1382#define DT_STRING_UNQUOTED_OR(node_id, prop, default_value) \
1383 COND_CODE_1(DT_NODE_HAS_PROP(node_id, prop), \
1384 (DT_STRING_UNQUOTED(node_id, prop)), (default_value))
1385
1433#define DT_STRING_TOKEN_BY_IDX(node_id, prop, idx) \
1434 DT_CAT6(node_id, _P_, prop, _IDX_, idx, _STRING_TOKEN)
1435
1444#define DT_STRING_TOKEN_BY_IDX_OR(node_id, prop, idx, default_value) \
1445 COND_CODE_1(DT_PROP_HAS_IDX(node_id, prop, idx), \
1446 (DT_STRING_TOKEN_BY_IDX(node_id, prop, idx)), (default_value))
1447
1495#define DT_STRING_UPPER_TOKEN_BY_IDX(node_id, prop, idx) \
1496 DT_CAT6(node_id, _P_, prop, _IDX_, idx, _STRING_UPPER_TOKEN)
1497
1538#define DT_STRING_UNQUOTED_BY_IDX(node_id, prop, idx) \
1539 DT_CAT6(node_id, _P_, prop, _IDX_, idx, _STRING_UNQUOTED)
1540
1541/*
1542 * phandle properties
1543 *
1544 * These are special-cased to manage the impedance mismatch between
1545 * phandles, which are just uint32_t node properties that only make sense
1546 * within the tree itself, and C values.
1547 */
1548
1594#define DT_PROP_BY_PHANDLE_IDX(node_id, phs, idx, prop) \
1595 DT_PROP(DT_PHANDLE_BY_IDX(node_id, phs, idx), prop)
1596
1616#define DT_PROP_BY_PHANDLE_IDX_OR(node_id, phs, idx, prop, default_value) \
1617 DT_PROP_OR(DT_PHANDLE_BY_IDX(node_id, phs, idx), prop, default_value)
1618
1630#define DT_PROP_BY_PHANDLE(node_id, ph, prop) \
1631 DT_PROP_BY_PHANDLE_IDX(node_id, ph, 0, prop)
1632
1687#define DT_PHA_BY_IDX(node_id, pha, idx, cell) \
1688 DT_CAT7(node_id, _P_, pha, _IDX_, idx, _VAL_, cell)
1689
1713#define DT_PHA_BY_IDX_OR(node_id, pha, idx, cell, default_value) \
1714 DT_PROP_OR(node_id, DT_CAT5(pha, _IDX_, idx, _VAL_, cell), default_value)
1715
1723#define DT_PHA(node_id, pha, cell) DT_PHA_BY_IDX(node_id, pha, 0, cell)
1724
1739#define DT_PHA_OR(node_id, pha, cell, default_value) \
1740 DT_PHA_BY_IDX_OR(node_id, pha, 0, cell, default_value)
1741
1782#define DT_PHA_BY_NAME(node_id, pha, name, cell) \
1783 DT_CAT7(node_id, _P_, pha, _NAME_, name, _VAL_, cell)
1784
1806#define DT_PHA_BY_NAME_OR(node_id, pha, name, cell, default_value) \
1807 DT_PROP_OR(node_id, DT_CAT5(pha, _NAME_, name, _VAL_, cell), default_value)
1808
1856#define DT_PHANDLE_BY_NAME(node_id, pha, name) \
1857 DT_CAT6(node_id, _P_, pha, _NAME_, name, _PH)
1858
1908#define DT_PHANDLE_BY_IDX(node_id, prop, idx) \
1909 DT_CAT6(node_id, _P_, prop, _IDX_, idx, _PH)
1910
1922#define DT_PHANDLE(node_id, prop) DT_PHANDLE_BY_IDX(node_id, prop, 0)
1923
1927
1933
1970#define DT_NUM_RANGES(node_id) DT_CAT(node_id, _RANGES_NUM)
1971
2024#define DT_RANGES_HAS_IDX(node_id, idx) \
2025 IS_ENABLED(DT_CAT4(node_id, _RANGES_IDX_, idx, _EXISTS))
2026
2079#define DT_RANGES_HAS_CHILD_BUS_FLAGS_AT_IDX(node_id, idx) \
2080 IS_ENABLED(DT_CAT4(node_id, _RANGES_IDX_, idx, _VAL_CHILD_BUS_FLAGS_EXISTS))
2081
2119#define DT_RANGES_CHILD_BUS_FLAGS_BY_IDX(node_id, idx) \
2120 DT_CAT4(node_id, _RANGES_IDX_, idx, _VAL_CHILD_BUS_FLAGS)
2121
2168#define DT_RANGES_CHILD_BUS_ADDRESS_BY_IDX(node_id, idx) \
2169 DT_CAT4(node_id, _RANGES_IDX_, idx, _VAL_CHILD_BUS_ADDRESS)
2170
2217#define DT_RANGES_PARENT_BUS_ADDRESS_BY_IDX(node_id, idx) \
2218 DT_CAT4(node_id, _RANGES_IDX_, idx, _VAL_PARENT_BUS_ADDRESS)
2219
2266#define DT_RANGES_LENGTH_BY_IDX(node_id, idx) \
2267 DT_CAT4(node_id, _RANGES_IDX_, idx, _VAL_LENGTH)
2268
2308#define DT_FOREACH_RANGE(node_id, fn) \
2309 DT_CAT(node_id, _FOREACH_RANGE)(fn)
2310
2314
2320
2356#define DT_NODE_VENDOR_BY_IDX(node_id, idx) \
2357 DT_CAT3(node_id, _COMPAT_VENDOR_IDX_, idx)
2358
2371#define DT_NODE_VENDOR_HAS_IDX(node_id, idx) \
2372 IS_ENABLED(DT_CAT4(node_id, _COMPAT_VENDOR_IDX_, idx, _EXISTS))
2373
2388#define DT_NODE_VENDOR_BY_IDX_OR(node_id, idx, default_value) \
2389 COND_CODE_1(DT_NODE_VENDOR_HAS_IDX(node_id, idx), \
2390 (DT_NODE_VENDOR_BY_IDX(node_id, idx)), (default_value))
2391
2400#define DT_NODE_VENDOR_OR(node_id, default_value) \
2401 DT_NODE_VENDOR_BY_IDX_OR(node_id, 0, default_value)
2402
2432#define DT_NODE_MODEL_BY_IDX(node_id, idx) \
2433 DT_CAT3(node_id, _COMPAT_MODEL_IDX_, idx)
2434
2447#define DT_NODE_MODEL_HAS_IDX(node_id, idx) \
2448 IS_ENABLED(DT_CAT4(node_id, _COMPAT_MODEL_IDX_, idx, _EXISTS))
2449
2464#define DT_NODE_MODEL_BY_IDX_OR(node_id, idx, default_value) \
2465 COND_CODE_1(DT_NODE_MODEL_HAS_IDX(node_id, idx), \
2466 (DT_NODE_MODEL_BY_IDX(node_id, idx)), (default_value))
2467
2476#define DT_NODE_MODEL_OR(node_id, default_value) \
2477 DT_NODE_MODEL_BY_IDX_OR(node_id, 0, default_value)
2478
2482
2488
2496#define DT_NUM_REGS(node_id) DT_CAT(node_id, _REG_NUM)
2497
2509#define DT_REG_HAS_IDX(node_id, idx) \
2510 IS_ENABLED(DT_CAT4(node_id, _REG_IDX_, idx, _EXISTS))
2511
2523#define DT_REG_HAS_NAME(node_id, name) \
2524 IS_ENABLED(DT_CAT4(node_id, _REG_NAME_, name, _EXISTS))
2525
2537#define DT_REG_ADDR_BY_IDX_RAW(node_id, idx) \
2538 DT_CAT4(node_id, _REG_IDX_, idx, _VAL_ADDRESS)
2539
2551#define DT_REG_ADDR_RAW(node_id) \
2552 DT_REG_ADDR_BY_IDX_RAW(node_id, 0)
2553
2560#define DT_REG_ADDR_BY_IDX(node_id, idx) \
2561 DT_U32_C(DT_REG_ADDR_BY_IDX_RAW(node_id, idx))
2562
2574#define DT_REG_SIZE_BY_IDX(node_id, idx) \
2575 DT_U32_C(DT_CAT4(node_id, _REG_IDX_, idx, _VAL_SIZE))
2576
2584#define DT_REG_ADDR(node_id) DT_REG_ADDR_BY_IDX(node_id, 0)
2585
2596#define DT_REG_ADDR_U64(node_id) DT_U64_C(DT_REG_ADDR_BY_IDX_RAW(node_id, 0))
2597
2605#define DT_REG_SIZE(node_id) DT_REG_SIZE_BY_IDX(node_id, 0)
2606
2613#define DT_REG_ADDR_BY_NAME(node_id, name) \
2614 DT_U32_C(DT_CAT4(node_id, _REG_NAME_, name, _VAL_ADDRESS))
2615
2624#define DT_REG_ADDR_BY_NAME_OR(node_id, name, default_value) \
2625 COND_CODE_1(DT_REG_HAS_NAME(node_id, name), \
2626 (DT_REG_ADDR_BY_NAME(node_id, name)), (default_value))
2627
2640#define DT_REG_ADDR_BY_NAME_U64(node_id, name) \
2641 DT_U64_C(DT_CAT4(node_id, _REG_NAME_, name, _VAL_ADDRESS))
2642
2649#define DT_REG_SIZE_BY_NAME(node_id, name) \
2650 DT_U32_C(DT_CAT4(node_id, _REG_NAME_, name, _VAL_SIZE))
2651
2660#define DT_REG_SIZE_BY_NAME_OR(node_id, name, default_value) \
2661 COND_CODE_1(DT_REG_HAS_NAME(node_id, name), \
2662 (DT_REG_SIZE_BY_NAME(node_id, name)), (default_value))
2663
2664
2712#define DT_FOREACH_REG(node_id, fn) \
2713 DT_CAT(node_id, _FOREACH_REG)(fn)
2714
2763#define DT_FOREACH_REG_SEP(node_id, fn, sep) \
2764 DT_CAT(node_id, _FOREACH_REG_SEP)(fn, sep)
2765
2779
2780#define DT_FOREACH_REG_VARGS(node_id, fn, ...) \
2781 DT_CAT(node_id, _FOREACH_REG_VARGS)(fn, __VA_ARGS__)
2782
2799#define DT_FOREACH_REG_SEP_VARGS(node_id, fn, sep, ...) \
2800 DT_CAT(node_id, _FOREACH_REG_SEP_VARGS)(fn, sep, __VA_ARGS__)
2801
2805
2811
2820#define DT_NUM_IRQS(node_id) DT_CAT(node_id, _IRQ_NUM)
2821
2846#define DT_NUM_NODELABELS(node_id) DT_CAT(node_id, _NODELABEL_NUM)
2847
2854#define DT_IRQ_LEVEL(node_id) DT_CAT(node_id, _IRQ_LEVEL)
2855
2866#define DT_IRQ_HAS_IDX(node_id, idx) \
2867 IS_ENABLED(DT_CAT4(node_id, _IRQ_IDX_, idx, _EXISTS))
2868
2879#define DT_IRQ_HAS_CELL_AT_IDX(node_id, idx, cell) \
2880 IS_ENABLED(DT_CAT6(node_id, _IRQ_IDX_, idx, _VAL_, cell, _EXISTS))
2881
2889#define DT_IRQ_HAS_CELL(node_id, cell) DT_IRQ_HAS_CELL_AT_IDX(node_id, 0, cell)
2890
2900#define DT_IRQ_HAS_NAME(node_id, name) \
2901 IS_ENABLED(DT_CAT4(node_id, _IRQ_NAME_, name, _VAL_irq_EXISTS))
2902
2938#define DT_IRQ_BY_IDX(node_id, idx, cell) \
2939 DT_CAT5(node_id, _IRQ_IDX_, idx, _VAL_, cell)
2940
2956#define DT_IRQ_BY_NAME(node_id, name, cell) \
2957 DT_CAT5(node_id, _IRQ_NAME_, name, _VAL_, cell)
2958
2966#define DT_IRQ(node_id, cell) DT_IRQ_BY_IDX(node_id, 0, cell)
2967
3010#define DT_IRQ_INTC_BY_IDX(node_id, idx) \
3011 DT_CAT4(node_id, _IRQ_IDX_, idx, _CONTROLLER)
3012
3057#define DT_IRQ_INTC_BY_NAME(node_id, name) \
3058 DT_CAT4(node_id, _IRQ_NAME_, name, _CONTROLLER)
3059
3099#define DT_IRQ_INTC(node_id) \
3100 DT_IRQ_INTC_BY_IDX(node_id, 0)
3101
3105
3106/* DT helper macro to encode a node's IRQN to level 1 according to the multi-level scheme */
3107#define DT_IRQN_L1_INTERNAL(node_id, idx) DT_IRQ_BY_IDX(node_id, idx, irq)
3108/* DT helper macro to encode a node's IRQN to level 2 according to the multi-level scheme */
3109#define DT_IRQN_L2_INTERNAL(node_id, idx) \
3110 (IRQ_TO_L2(DT_IRQN_L1_INTERNAL(node_id, idx)) | \
3111 DT_IRQ(DT_IRQ_INTC_BY_IDX(node_id, idx), irq))
3112/* DT helper macro to encode a node's IRQN to level 3 according to the multi-level scheme */
3113#define DT_IRQN_L3_INTERNAL(node_id, idx) \
3114 (IRQ_TO_L3(DT_IRQN_L1_INTERNAL(node_id, idx)) | \
3115 IRQ_TO_L2(DT_IRQ(DT_IRQ_INTC_BY_IDX(node_id, idx), irq)) | \
3116 DT_IRQ(DT_IRQ_INTC(DT_IRQ_INTC_BY_IDX(node_id, idx)), irq))
3117/* DT helper macro for the macros above */
3118#define DT_IRQN_LVL_INTERNAL(node_id, idx, level) DT_CAT3(DT_IRQN_L, level, _INTERNAL)(node_id, idx)
3119
3124#define DT_MULTI_LEVEL_IRQN_INTERNAL(node_id, idx) \
3125 DT_IRQN_LVL_INTERNAL(node_id, idx, DT_IRQ_LEVEL(node_id))
3126
3127
3128/* DT helper macro to encode a node's IRQN to level 1 according to the multi-level scheme */
3129#define DT_IRQN_NAME_L1_INTERNAL(node_id, name) DT_IRQ_BY_NAME(node_id, name, irq)
3130/* DT helper macro to encode a node's IRQN to level 2 according to the multi-level scheme */
3131#define DT_IRQN_NAME_L2_INTERNAL(node_id, name) \
3132 (IRQ_TO_L2(DT_IRQN_NAME_L1_INTERNAL(node_id, name)) | \
3133 DT_IRQ(DT_IRQ_INTC_BY_NAME(node_id, name), irq))
3134/* DT helper macro to encode a node's IRQN to level 3 according to the multi-level scheme */
3135#define DT_IRQN_NAME_L3_INTERNAL(node_id, name) \
3136 (IRQ_TO_L3(DT_IRQN_NAME_L1_INTERNAL(node_id, name)) | \
3137 IRQ_TO_L2(DT_IRQ(DT_IRQ_INTC_BY_NAME(node_id, name), irq)) | \
3138 DT_IRQ(DT_IRQ_INTC(DT_IRQ_INTC_BY_NAME(node_id, name)), irq))
3139/* DT helper macro for the macros above */
3140#define DT_IRQN_NAME_LVL_INTERNAL(node_id, name, level) \
3141 DT_CAT3(DT_IRQN_NAME_L, level, _INTERNAL)(node_id, name)
3142
3147#define DT_MULTI_LEVEL_IRQN_NAME_INTERNAL(node_id, name) \
3148 DT_IRQN_NAME_LVL_INTERNAL(node_id, name, DT_IRQ_LEVEL(node_id))
3149
3153
3162#define DT_IRQN_BY_IDX(node_id, idx) \
3163 COND_CODE_1(IS_ENABLED(CONFIG_MULTI_LEVEL_INTERRUPTS), \
3164 (DT_MULTI_LEVEL_IRQN_INTERNAL(node_id, idx)), \
3165 (DT_IRQ_BY_IDX(node_id, idx, irq)))
3166
3175#define DT_IRQN_BY_NAME(node_id, name) \
3176 COND_CODE_1(IS_ENABLED(CONFIG_MULTI_LEVEL_INTERRUPTS), \
3177 (DT_MULTI_LEVEL_IRQN_NAME_INTERNAL(node_id, name)), \
3178 (DT_IRQ_BY_NAME(node_id, name, irq)))
3179
3190#define DT_IRQN(node_id) DT_IRQN_BY_IDX(node_id, 0)
3191
3195
3201
3210#define DT_CHOSEN(prop) DT_CAT(DT_CHOSEN_, prop)
3211
3218#define DT_HAS_CHOSEN(prop) IS_ENABLED(DT_CAT3(DT_CHOSEN_, prop, _EXISTS))
3219
3223
3259
3269#define DT_FOREACH_NODE(fn) DT_FOREACH_HELPER(fn)
3270
3283#define DT_FOREACH_NODE_VARGS(fn, ...) DT_FOREACH_VARGS_HELPER(fn, __VA_ARGS__)
3284
3296#define DT_FOREACH_STATUS_OKAY_NODE(fn) DT_FOREACH_OKAY_HELPER(fn)
3297
3312#define DT_FOREACH_STATUS_OKAY_NODE_VARGS(fn, ...) DT_FOREACH_OKAY_VARGS_HELPER(fn, __VA_ARGS__)
3313
3360#define DT_FOREACH_ANCESTOR(node_id, fn) \
3361 DT_CAT(node_id, _FOREACH_ANCESTOR)(fn)
3362
3406#define DT_FOREACH_CHILD(node_id, fn) \
3407 DT_CAT(node_id, _FOREACH_CHILD)(fn)
3408
3449#define DT_FOREACH_CHILD_SEP(node_id, fn, sep) \
3450 DT_CAT(node_id, _FOREACH_CHILD_SEP)(fn, sep)
3451
3467#define DT_FOREACH_CHILD_VARGS(node_id, fn, ...) \
3468 DT_CAT(node_id, _FOREACH_CHILD_VARGS)(fn, __VA_ARGS__)
3469
3485#define DT_FOREACH_CHILD_SEP_VARGS(node_id, fn, sep, ...) \
3486 DT_CAT(node_id, _FOREACH_CHILD_SEP_VARGS)(fn, sep, __VA_ARGS__)
3487
3503#define DT_FOREACH_CHILD_STATUS_OKAY(node_id, fn) \
3504 DT_CAT(node_id, _FOREACH_CHILD_STATUS_OKAY)(fn)
3505
3522#define DT_FOREACH_CHILD_STATUS_OKAY_SEP(node_id, fn, sep) \
3523 DT_CAT(node_id, _FOREACH_CHILD_STATUS_OKAY_SEP)(fn, sep)
3524
3544#define DT_FOREACH_CHILD_STATUS_OKAY_VARGS(node_id, fn, ...) \
3545 DT_CAT(node_id, _FOREACH_CHILD_STATUS_OKAY_VARGS)(fn, __VA_ARGS__)
3546
3565#define DT_FOREACH_CHILD_STATUS_OKAY_SEP_VARGS(node_id, fn, sep, ...) \
3566 DT_CAT(node_id, _FOREACH_CHILD_STATUS_OKAY_SEP_VARGS)(fn, sep, __VA_ARGS__)
3567
3618#define DT_FOREACH_PROP_ELEM(node_id, prop, fn) \
3619 DT_CAT4(node_id, _P_, prop, _FOREACH_PROP_ELEM)(fn)
3620
3663#define DT_FOREACH_PROP_ELEM_SEP(node_id, prop, fn, sep) \
3664 DT_CAT4(node_id, _P_, prop, _FOREACH_PROP_ELEM_SEP)(fn, sep)
3665
3686#define DT_FOREACH_PROP_ELEM_VARGS(node_id, prop, fn, ...) \
3687 DT_CAT4(node_id, _P_, prop, _FOREACH_PROP_ELEM_VARGS)(fn, __VA_ARGS__)
3688
3705#define DT_FOREACH_PROP_ELEM_SEP_VARGS(node_id, prop, fn, sep, ...) \
3706 DT_CAT4(node_id, _P_, prop, _FOREACH_PROP_ELEM_SEP_VARGS)( \
3707 fn, sep, __VA_ARGS__)
3708
3762#define DT_FOREACH_STATUS_OKAY(compat, fn) \
3763 COND_CODE_1(DT_HAS_COMPAT_STATUS_OKAY(compat), \
3764 (UTIL_CAT(DT_FOREACH_OKAY_, compat)(fn)), \
3765 ())
3766
3811#define DT_FOREACH_STATUS_OKAY_VARGS(compat, fn, ...) \
3812 COND_CODE_1(DT_HAS_COMPAT_STATUS_OKAY(compat), \
3813 (DT_CAT(DT_FOREACH_OKAY_VARGS_, \
3814 compat)(fn, __VA_ARGS__)), \
3815 ())
3816
3829#define DT_COMPAT_FOREACH_STATUS_OKAY_VARGS(compat, fn, ...) \
3830 COND_CODE_1(DT_HAS_COMPAT_STATUS_OKAY(compat), \
3831 (UTIL_CAT(DT_FOREACH_OKAY_INST_VARGS_, \
3832 compat)(fn, compat, __VA_ARGS__)), \
3833 ())
3834
3835
3874#define DT_FOREACH_NODELABEL(node_id, fn) DT_CAT(node_id, _FOREACH_NODELABEL)(fn)
3875
3913#define DT_FOREACH_NODELABEL_VARGS(node_id, fn, ...) \
3914 DT_CAT(node_id, _FOREACH_NODELABEL_VARGS)(fn, __VA_ARGS__)
3915
3919
3925
3940#define DT_NODE_EXISTS(node_id) IS_ENABLED(DT_CAT(node_id, _EXISTS))
3941
3963#define DT_NODE_HAS_STATUS(node_id, status) \
3964 DT_NODE_HAS_STATUS_INTERNAL(node_id, status)
3965
3986#define DT_NODE_HAS_STATUS_OKAY(node_id) DT_NODE_HAS_STATUS(node_id, okay)
3987
4007#define DT_HAS_COMPAT_STATUS_OKAY(compat) \
4008 IS_ENABLED(DT_CAT(DT_COMPAT_HAS_OKAY_, compat))
4009
4016#define DT_NUM_INST_STATUS_OKAY(compat) \
4017 UTIL_AND(DT_HAS_COMPAT_STATUS_OKAY(compat), \
4018 UTIL_CAT(DT_N_INST, DT_DASH(compat, NUM_OKAY)))
4019
4047#define DT_NODE_HAS_COMPAT(node_id, compat) \
4048 IS_ENABLED(DT_CAT3(node_id, _COMPAT_MATCHES_, compat))
4049
4064#define DT_NODE_HAS_COMPAT_STATUS(node_id, compat, status) \
4065 UTIL_AND(DT_NODE_HAS_COMPAT(node_id, compat), DT_NODE_HAS_STATUS(node_id, status))
4066
4080#define DT_NODE_HAS_PROP(node_id, prop) \
4081 IS_ENABLED(DT_CAT4(node_id, _P_, prop, _EXISTS))
4082
4083
4100#define DT_PHA_HAS_CELL_AT_IDX(node_id, pha, idx, cell) \
4101 IS_ENABLED(DT_CAT8(node_id, _P_, pha, \
4102 _IDX_, idx, _VAL_, cell, _EXISTS))
4103
4113#define DT_PHA_HAS_CELL(node_id, pha, cell) \
4114 DT_PHA_HAS_CELL_AT_IDX(node_id, pha, 0, cell)
4115
4136#define DT_FOREACH_PHA_CELL_BY_IDX(node_id, pha, idx, fn) \
4137 DT_CAT6(node_id, _P_, pha, _IDX_, idx, _FOREACH_CELL)(fn)
4138
4151#define DT_FOREACH_PHA_CELL_BY_IDX_SEP(node_id, pha, idx, fn, sep) \
4152 DT_CAT6(node_id, _P_, pha, _IDX_, idx, _FOREACH_CELL_SEP)(fn, sep)
4153
4162#define DT_PHA_NUM_CELLS_BY_IDX(node_id, pha, idx) \
4163 DT_CAT6(node_id, _P_, pha, _IDX_, idx, _NUM_CELLS)
4164
4176#define DT_PHA_ELEM_NAME_BY_IDX(node_id, pha, idx) \
4177 DT_CAT6(node_id, _P_, pha, _IDX_, idx, _NAME)
4178
4200#define DT_FOREACH_PHA_CELL_BY_NAME(node_id, pha, name, fn) \
4201 DT_CAT6(node_id, _P_, pha, _NAME_, name, _FOREACH_CELL)(fn)
4202
4215#define DT_FOREACH_PHA_CELL_BY_NAME_SEP(node_id, pha, name, fn, sep) \
4216 DT_CAT6(node_id, _P_, pha, _NAME_, name, _FOREACH_CELL_SEP)(fn, sep)
4217
4226#define DT_PHA_NUM_CELLS_BY_NAME(node_id, pha, name) \
4227 DT_CAT6(node_id, _P_, pha, _NAME_, name, _NUM_CELLS)
4228
4240#define DT_PHA_ELEM_IDX_BY_NAME(node_id, pha, name) \
4241 DT_CAT6(node_id, _P_, pha, _NAME_, name, _IDX)
4242
4243
4247
4253
4285#define DT_BUS(node_id) DT_CAT(node_id, _BUS)
4286
4315#define DT_ON_BUS(node_id, bus) IS_ENABLED(DT_CAT3(node_id, _BUS_, bus))
4316
4320
4326
4333#define DT_DRV_INST(inst) DT_INST(inst, DT_DRV_COMPAT)
4334
4342#define DT_INST_PARENT(inst) DT_PARENT(DT_DRV_INST(inst))
4343
4351#define DT_INST_GPARENT(inst) DT_GPARENT(DT_DRV_INST(inst))
4352
4362#define DT_INST_CHILD(inst, child) \
4363 DT_CHILD(DT_DRV_INST(inst), child)
4364
4377#define DT_INST_CHILD_BY_UNIT_ADDR_INT(inst, addr) \
4378 DT_CHILD_BY_UNIT_ADDR_INT(DT_DRV_INST(inst), addr)
4379
4389#define DT_INST_CHILD_NUM(inst) DT_CHILD_NUM(DT_DRV_INST(inst))
4390
4401#define DT_INST_CHILD_NUM_STATUS_OKAY(inst) \
4402 DT_CHILD_NUM_STATUS_OKAY(DT_DRV_INST(inst))
4403
4416#define DT_INST_DESCENDANT_NUM_ON_BUS(inst, bus) \
4417 DT_DESCENDANT_NUM_ON_BUS(DT_DRV_INST(inst), bus)
4418
4432#define DT_INST_DESCENDANT_NUM_ON_BUS_STATUS_OKAY(inst, bus) \
4433 DT_DESCENDANT_NUM_ON_BUS_STATUS_OKAY(DT_DRV_INST(inst), bus)
4434
4443#define DT_INST_NODELABEL_STRING_ARRAY(inst) DT_NODELABEL_STRING_ARRAY(DT_DRV_INST(inst))
4444
4453#define DT_INST_NUM_NODELABELS(inst) DT_NUM_NODELABELS(DT_DRV_INST(inst))
4454
4469#define DT_INST_FOREACH_CHILD(inst, fn) \
4470 DT_FOREACH_CHILD(DT_DRV_INST(inst), fn)
4471
4485#define DT_INST_FOREACH_CHILD_SEP(inst, fn, sep) \
4486 DT_FOREACH_CHILD_SEP(DT_DRV_INST(inst), fn, sep)
4487
4503#define DT_INST_FOREACH_CHILD_VARGS(inst, fn, ...) \
4504 DT_FOREACH_CHILD_VARGS(DT_DRV_INST(inst), fn, __VA_ARGS__)
4505
4520#define DT_INST_FOREACH_CHILD_SEP_VARGS(inst, fn, sep, ...) \
4521 DT_FOREACH_CHILD_SEP_VARGS(DT_DRV_INST(inst), fn, sep, __VA_ARGS__)
4522
4534#define DT_INST_FOREACH_CHILD_STATUS_OKAY(inst, fn) \
4535 DT_FOREACH_CHILD_STATUS_OKAY(DT_DRV_INST(inst), fn)
4536
4551#define DT_INST_FOREACH_CHILD_STATUS_OKAY_SEP(inst, fn, sep) \
4552 DT_FOREACH_CHILD_STATUS_OKAY_SEP(DT_DRV_INST(inst), fn, sep)
4553
4567#define DT_INST_FOREACH_CHILD_STATUS_OKAY_VARGS(inst, fn, ...) \
4568 DT_FOREACH_CHILD_STATUS_OKAY_VARGS(DT_DRV_INST(inst), fn, __VA_ARGS__)
4569
4585#define DT_INST_FOREACH_CHILD_STATUS_OKAY_SEP_VARGS(inst, fn, sep, ...) \
4586 DT_FOREACH_CHILD_STATUS_OKAY_SEP_VARGS(DT_DRV_INST(inst), fn, sep, __VA_ARGS__)
4587
4602#define DT_INST_FOREACH_REG(inst, fn) \
4603 DT_FOREACH_REG(DT_DRV_INST(inst), fn)
4604
4621#define DT_INST_FOREACH_REG_SEP(inst, fn, sep) \
4622 DT_FOREACH_REG_SEP(DT_DRV_INST(inst), fn, sep)
4623
4640#define DT_INST_FOREACH_REG_VARGS(inst, fn, ...) \
4641 DT_FOREACH_REG_VARGS(DT_DRV_INST(inst), fn, __VA_ARGS__)
4642
4661#define DT_INST_FOREACH_REG_SEP_VARGS(inst, fn, sep, ...) \
4662 DT_FOREACH_REG_SEP_VARGS(DT_DRV_INST(inst), fn, sep, __VA_ARGS__)
4663
4671#define DT_INST_ENUM_IDX_BY_IDX(inst, prop, idx) \
4672 DT_ENUM_IDX_BY_IDX(DT_DRV_INST(inst), prop, idx)
4673
4680#define DT_INST_ENUM_IDX(inst, prop) \
4681 DT_ENUM_IDX(DT_DRV_INST(inst), prop)
4682
4692#define DT_INST_ENUM_IDX_BY_IDX_OR(inst, prop, idx, default_idx_value) \
4693 DT_ENUM_IDX_BY_IDX_OR(DT_DRV_INST(inst), prop, idx, default_idx_value)
4694
4703#define DT_INST_ENUM_IDX_OR(inst, prop, default_idx_value) \
4704 DT_ENUM_IDX_OR(DT_DRV_INST(inst), prop, default_idx_value)
4705
4714#define DT_INST_ENUM_HAS_VALUE_BY_IDX(inst, prop, idx, value) \
4715 DT_ENUM_HAS_VALUE_BY_IDX(DT_DRV_INST(inst), prop, idx, value)
4716
4725#define DT_INST_ENUM_HAS_VALUE(inst, prop, value) \
4726 DT_ENUM_HAS_VALUE(DT_DRV_INST(inst), prop, value)
4727
4734#define DT_INST_PROP(inst, prop) DT_PROP(DT_DRV_INST(inst), prop)
4735
4742#define DT_INST_PROP_LEN(inst, prop) DT_PROP_LEN(DT_DRV_INST(inst), prop)
4743
4753#define DT_INST_PROP_HAS_IDX(inst, prop, idx) \
4754 DT_PROP_HAS_IDX(DT_DRV_INST(inst), prop, idx)
4755
4764#define DT_INST_PROP_HAS_NAME(inst, prop, name) \
4765 DT_PROP_HAS_NAME(DT_DRV_INST(inst), prop, name)
4766
4774#define DT_INST_PROP_BY_IDX(inst, prop, idx) \
4775 DT_PROP_BY_IDX(DT_DRV_INST(inst), prop, idx)
4776
4784#define DT_INST_PROP_OR(inst, prop, default_value) \
4785 DT_PROP_OR(DT_DRV_INST(inst), prop, default_value)
4786
4794#define DT_INST_PROP_LEN_OR(inst, prop, default_value) \
4795 DT_PROP_LEN_OR(DT_DRV_INST(inst), prop, default_value)
4796
4806#define DT_INST_STRING_TOKEN(inst, prop) \
4807 DT_STRING_TOKEN(DT_DRV_INST(inst), prop)
4808
4816#define DT_INST_STRING_UPPER_TOKEN(inst, prop) \
4817 DT_STRING_UPPER_TOKEN(DT_DRV_INST(inst), prop)
4818
4827#define DT_INST_STRING_UNQUOTED(inst, prop) \
4828 DT_STRING_UNQUOTED(DT_DRV_INST(inst), prop)
4829
4837#define DT_INST_STRING_TOKEN_BY_IDX(inst, prop, idx) \
4838 DT_STRING_TOKEN_BY_IDX(DT_DRV_INST(inst), prop, idx)
4839
4848#define DT_INST_STRING_TOKEN_BY_IDX_OR(inst, prop, idx, default_value) \
4849 DT_STRING_TOKEN_BY_IDX_OR(DT_DRV_INST(inst), prop, idx, default_value)
4850
4858#define DT_INST_STRING_UPPER_TOKEN_BY_IDX(inst, prop, idx) \
4859 DT_STRING_UPPER_TOKEN_BY_IDX(DT_DRV_INST(inst), prop, idx)
4860
4868#define DT_INST_STRING_UNQUOTED_BY_IDX(inst, prop, idx) \
4869 DT_STRING_UNQUOTED_BY_IDX(DT_DRV_INST(inst), prop, idx)
4870
4879#define DT_INST_PROP_BY_PHANDLE(inst, ph, prop) \
4880 DT_INST_PROP_BY_PHANDLE_IDX(inst, ph, 0, prop)
4881
4893#define DT_INST_PROP_BY_PHANDLE_IDX(inst, phs, idx, prop) \
4894 DT_PROP_BY_PHANDLE_IDX(DT_DRV_INST(inst), phs, idx, prop)
4895
4904#define DT_INST_PHA_BY_IDX(inst, pha, idx, cell) \
4905 DT_PHA_BY_IDX(DT_DRV_INST(inst), pha, idx, cell)
4906
4916#define DT_INST_PHA_BY_IDX_OR(inst, pha, idx, cell, default_value) \
4917 DT_PHA_BY_IDX_OR(DT_DRV_INST(inst), pha, idx, cell, default_value)
4918
4927#define DT_INST_PHA(inst, pha, cell) DT_INST_PHA_BY_IDX(inst, pha, 0, cell)
4928
4937#define DT_INST_PHA_OR(inst, pha, cell, default_value) \
4938 DT_INST_PHA_BY_IDX_OR(inst, pha, 0, cell, default_value)
4939
4949#define DT_INST_PHA_BY_NAME(inst, pha, name, cell) \
4950 DT_PHA_BY_NAME(DT_DRV_INST(inst), pha, name, cell)
4951
4961#define DT_INST_PHA_BY_NAME_OR(inst, pha, name, cell, default_value) \
4962 DT_PHA_BY_NAME_OR(DT_DRV_INST(inst), pha, name, cell, default_value)
4963
4972#define DT_INST_PHANDLE_BY_NAME(inst, pha, name) \
4973 DT_PHANDLE_BY_NAME(DT_DRV_INST(inst), pha, name) \
4974
4975
4984#define DT_INST_PHANDLE_BY_IDX(inst, prop, idx) \
4985 DT_PHANDLE_BY_IDX(DT_DRV_INST(inst), prop, idx)
4986
4995#define DT_INST_PHANDLE(inst, prop) DT_INST_PHANDLE_BY_IDX(inst, prop, 0)
4996
5004#define DT_INST_REG_HAS_IDX(inst, idx) DT_REG_HAS_IDX(DT_DRV_INST(inst), idx)
5005
5013#define DT_INST_REG_HAS_NAME(inst, name) DT_REG_HAS_NAME(DT_DRV_INST(inst), name)
5014
5021#define DT_INST_REG_ADDR_BY_IDX_RAW(inst, idx) DT_REG_ADDR_BY_IDX_RAW(DT_DRV_INST(inst), idx)
5022
5029#define DT_INST_REG_ADDR_BY_IDX(inst, idx) DT_REG_ADDR_BY_IDX(DT_DRV_INST(inst), idx)
5030
5037#define DT_INST_REG_SIZE_BY_IDX(inst, idx) \
5038 DT_REG_SIZE_BY_IDX(DT_DRV_INST(inst), idx)
5039
5046#define DT_INST_REG_ADDR_BY_NAME(inst, name) \
5047 DT_REG_ADDR_BY_NAME(DT_DRV_INST(inst), name)
5048
5057#define DT_INST_REG_ADDR_BY_NAME_OR(inst, name, default_value) \
5058 DT_REG_ADDR_BY_NAME_OR(DT_DRV_INST(inst), name, default_value)
5059
5072#define DT_INST_REG_ADDR_BY_NAME_U64(inst, name) \
5073 DT_REG_ADDR_BY_NAME_U64(DT_DRV_INST(inst), name)
5074
5081#define DT_INST_REG_SIZE_BY_NAME(inst, name) \
5082 DT_REG_SIZE_BY_NAME(DT_DRV_INST(inst), name)
5083
5092#define DT_INST_REG_SIZE_BY_NAME_OR(inst, name, default_value) \
5093 DT_REG_SIZE_BY_NAME_OR(DT_DRV_INST(inst), name, default_value)
5094
5100#define DT_INST_REG_ADDR_RAW(inst) DT_INST_REG_ADDR_BY_IDX_RAW(inst, 0)
5101
5107#define DT_INST_REG_ADDR(inst) DT_INST_REG_ADDR_BY_IDX(inst, 0)
5108
5120#define DT_INST_REG_ADDR_U64(inst) DT_REG_ADDR_U64(DT_DRV_INST(inst))
5121
5127#define DT_INST_REG_SIZE(inst) DT_INST_REG_SIZE_BY_IDX(inst, 0)
5128
5135#define DT_INST_NUM_IRQS(inst) DT_NUM_IRQS(DT_DRV_INST(inst))
5136
5143#define DT_INST_IRQ_LEVEL(inst) DT_IRQ_LEVEL(DT_DRV_INST(inst))
5144
5152#define DT_INST_IRQ_BY_IDX(inst, idx, cell) \
5153 DT_IRQ_BY_IDX(DT_DRV_INST(inst), idx, cell)
5154
5161#define DT_INST_IRQ_INTC_BY_IDX(inst, idx) \
5162 DT_IRQ_INTC_BY_IDX(DT_DRV_INST(inst), idx)
5163
5170#define DT_INST_IRQ_INTC_BY_NAME(inst, name) \
5171 DT_IRQ_INTC_BY_NAME(DT_DRV_INST(inst), name)
5172
5180#define DT_INST_IRQ_INTC(inst) \
5181 DT_INST_IRQ_INTC_BY_IDX(inst, 0)
5182
5190#define DT_INST_IRQ_BY_NAME(inst, name, cell) \
5191 DT_IRQ_BY_NAME(DT_DRV_INST(inst), name, cell)
5192
5199#define DT_INST_IRQ(inst, cell) DT_INST_IRQ_BY_IDX(inst, 0, cell)
5200
5206#define DT_INST_IRQN(inst) DT_IRQN(DT_DRV_INST(inst))
5207
5214#define DT_INST_IRQN_BY_IDX(inst, idx) DT_IRQN_BY_IDX(DT_DRV_INST(inst), idx)
5215
5222#define DT_INST_IRQN_BY_NAME(inst, name) \
5223 DT_IRQN_BY_NAME(DT_DRV_INST(inst), name)
5224
5230#define DT_INST_BUS(inst) DT_BUS(DT_DRV_INST(inst))
5231
5239#define DT_INST_ON_BUS(inst, bus) DT_ON_BUS(DT_DRV_INST(inst), bus)
5240
5250#define DT_INST_STRING_TOKEN_OR(inst, name, default_value) \
5251 DT_STRING_TOKEN_OR(DT_DRV_INST(inst), name, default_value)
5252
5261#define DT_INST_STRING_UPPER_TOKEN_OR(inst, name, default_value) \
5262 DT_STRING_UPPER_TOKEN_OR(DT_DRV_INST(inst), name, default_value)
5263
5272#define DT_INST_STRING_UNQUOTED_OR(inst, name, default_value) \
5273 DT_STRING_UNQUOTED_OR(DT_DRV_INST(inst), name, default_value)
5274
5305#define DT_HAS_COMPAT_ON_BUS_STATUS_OKAY(compat, bus) \
5306 IS_ENABLED(DT_CAT4(DT_COMPAT_, compat, _BUS_, bus))
5307
5340#define DT_ANY_INST_ON_BUS_STATUS_OKAY(bus) \
5341 DT_HAS_COMPAT_ON_BUS_STATUS_OKAY(DT_DRV_COMPAT, bus)
5342
5387#define DT_ANY_INST_HAS_PROP_STATUS_OKAY(prop) \
5388 UTIL_NOT(IS_EMPTY( \
5389 DT_INST_FOREACH_STATUS_OKAY_VARGS(DT_ANY_INST_HAS_PROP_STATUS_OKAY_, prop)))
5390
5435#define DT_ALL_INST_HAS_PROP_STATUS_OKAY(prop) \
5436 IS_EMPTY(DT_INST_FOREACH_STATUS_OKAY_VARGS(DT_ALL_INST_HAS_PROP_STATUS_OKAY_, prop))
5437
5482#define DT_ANY_COMPAT_HAS_PROP_STATUS_OKAY(compat, prop) \
5483 (DT_COMPAT_FOREACH_STATUS_OKAY_VARGS(compat, DT_COMPAT_NODE_HAS_PROP_AND_OR, prop) 0)
5484
5532#define DT_ANY_INST_HAS_BOOL_STATUS_OKAY(prop) \
5533 UTIL_NOT(IS_EMPTY( \
5534 DT_INST_FOREACH_STATUS_OKAY_VARGS(DT_ANY_INST_HAS_BOOL_STATUS_OKAY_, prop)))
5535
5581#define DT_ALL_INST_HAS_BOOL_STATUS_OKAY(prop) \
5582 IS_EMPTY(DT_INST_FOREACH_STATUS_OKAY_VARGS(DT_ALL_INST_HAS_BOOL_STATUS_OKAY_, prop))
5583
5590#define DT_ANY_INST_REG_HAS_NAME_STATUS_OKAY(name) \
5591 UTIL_NOT(IS_EMPTY( \
5592 DT_INST_FOREACH_STATUS_OKAY_VARGS(DT_ANY_INST_REG_HAS_NAME_STATUS_OKAY_, name)))
5593
5600#define DT_ALL_INST_REG_HAS_NAME_STATUS_OKAY(name) \
5601 IS_EMPTY(DT_INST_FOREACH_STATUS_OKAY_VARGS(DT_ALL_INST_REG_HAS_NAME_STATUS_OKAY_, name))
5602
5668#define DT_INST_FOREACH_STATUS_OKAY(fn) \
5669 COND_CODE_1(DT_HAS_COMPAT_STATUS_OKAY(DT_DRV_COMPAT), \
5670 (UTIL_CAT(DT_FOREACH_OKAY_INST_, \
5671 DT_DRV_COMPAT)(fn)), \
5672 ())
5673
5686#define DT_INST_FOREACH_STATUS_OKAY_VARGS(fn, ...) \
5687 COND_CODE_1(DT_HAS_COMPAT_STATUS_OKAY(DT_DRV_COMPAT), \
5688 (UTIL_CAT(DT_FOREACH_OKAY_INST_VARGS_, \
5689 DT_DRV_COMPAT)(fn, __VA_ARGS__)), \
5690 ())
5691
5701#define DT_INST_FOREACH_NODELABEL(inst, fn) \
5702 DT_FOREACH_NODELABEL(DT_DRV_INST(inst), fn)
5703
5715#define DT_INST_FOREACH_NODELABEL_VARGS(inst, fn, ...) \
5716 DT_FOREACH_NODELABEL_VARGS(DT_DRV_INST(inst), fn, __VA_ARGS__)
5717
5728#define DT_INST_FOREACH_PROP_ELEM(inst, prop, fn) \
5729 DT_FOREACH_PROP_ELEM(DT_DRV_INST(inst), prop, fn)
5730
5743#define DT_INST_FOREACH_PROP_ELEM_SEP(inst, prop, fn, sep) \
5744 DT_FOREACH_PROP_ELEM_SEP(DT_DRV_INST(inst), prop, fn, sep)
5745
5760#define DT_INST_FOREACH_PROP_ELEM_VARGS(inst, prop, fn, ...) \
5761 DT_FOREACH_PROP_ELEM_VARGS(DT_DRV_INST(inst), prop, fn, __VA_ARGS__)
5762
5780#define DT_INST_FOREACH_PROP_ELEM_SEP_VARGS(inst, prop, fn, sep, ...) \
5781 DT_FOREACH_PROP_ELEM_SEP_VARGS(DT_DRV_INST(inst), prop, fn, sep, \
5782 __VA_ARGS__)
5783
5790#define DT_INST_NODE_HAS_PROP(inst, prop) \
5791 DT_NODE_HAS_PROP(DT_DRV_INST(inst), prop)
5792
5799#define DT_INST_NODE_HAS_COMPAT(inst, compat) \
5800 DT_NODE_HAS_COMPAT(DT_DRV_INST(inst), compat)
5801
5812#define DT_INST_PHA_HAS_CELL_AT_IDX(inst, pha, idx, cell) \
5813 DT_PHA_HAS_CELL_AT_IDX(DT_DRV_INST(inst), pha, idx, cell)
5814
5824#define DT_INST_PHA_HAS_CELL(inst, pha, cell) \
5825 DT_INST_PHA_HAS_CELL_AT_IDX(inst, pha, 0, cell)
5826
5834#define DT_INST_IRQ_HAS_IDX(inst, idx) DT_IRQ_HAS_IDX(DT_DRV_INST(inst), idx)
5835
5844#define DT_INST_IRQ_HAS_CELL_AT_IDX(inst, idx, cell) \
5845 DT_IRQ_HAS_CELL_AT_IDX(DT_DRV_INST(inst), idx, cell)
5846
5854#define DT_INST_IRQ_HAS_CELL(inst, cell) \
5855 DT_INST_IRQ_HAS_CELL_AT_IDX(inst, 0, cell)
5856
5863#define DT_INST_IRQ_HAS_NAME(inst, name) \
5864 DT_IRQ_HAS_NAME(DT_DRV_INST(inst), name)
5865
5869
5871
5883#define DT_ANY_INST_HAS_PROP_STATUS_OKAY_(inst, prop) \
5884 IF_ENABLED(DT_INST_NODE_HAS_PROP(inst, prop), (1,))
5885
5898#define DT_ANY_INST_HAS_BOOL_STATUS_OKAY_(inst, prop) \
5899 IF_ENABLED(DT_INST_PROP(inst, prop), (1,))
5900
5913#define DT_ANY_INST_REG_HAS_NAME_STATUS_OKAY_(inst, name) \
5914 IF_ENABLED(DT_INST_REG_HAS_NAME(inst, name), (1,))
5915
5927#define DT_ALL_INST_HAS_PROP_STATUS_OKAY_(inst, prop) \
5928 IF_DISABLED(DT_INST_NODE_HAS_PROP(inst, prop), (1,))
5929
5942#define DT_ALL_INST_HAS_BOOL_STATUS_OKAY_(inst, prop) \
5943 IF_DISABLED(DT_INST_PROP(inst, prop), (1,))
5944
5957#define DT_ALL_INST_REG_HAS_NAME_STATUS_OKAY_(inst, name) \
5958 IF_DISABLED(DT_INST_REG_HAS_NAME(inst, name), (1,))
5959
5960#define DT_PATH_INTERNAL(...) \
5961 UTIL_CAT(DT_ROOT, MACRO_MAP_CAT(DT_S_PREFIX, __VA_ARGS__))
5967#define DT_S_PREFIX(name) _S_##name
5968
5983#define DT_CAT(a1, a2) a1 ## a2
5985#define DT_CAT3(a1, a2, a3) a1 ## a2 ## a3
5987#define DT_CAT4(a1, a2, a3, a4) a1 ## a2 ## a3 ## a4
5989#define DT_CAT5(a1, a2, a3, a4, a5) a1 ## a2 ## a3 ## a4 ## a5
5991#define DT_CAT6(a1, a2, a3, a4, a5, a6) a1 ## a2 ## a3 ## a4 ## a5 ## a6
5993#define DT_CAT7(a1, a2, a3, a4, a5, a6, a7) \
5994 a1 ## a2 ## a3 ## a4 ## a5 ## a6 ## a7
5996#define DT_CAT8(a1, a2, a3, a4, a5, a6, a7, a8) \
5997 a1 ## a2 ## a3 ## a4 ## a5 ## a6 ## a7 ## a8
5998/*
5999 * If you need to define a bigger DT_CATN(), do so here. Don't leave
6000 * any "holes" of undefined macros, please.
6001 */
6002
6004#define DT_DASH(...) MACRO_MAP_CAT(DT_DASH_PREFIX, __VA_ARGS__)
6006#define DT_DASH_PREFIX(name) _##name
6008#define DT_NODE_HAS_STATUS_INTERNAL(node_id, status) \
6009 IS_ENABLED(DT_CAT3(node_id, _STATUS_, status))
6010
6014#define DT_COMPAT_NODE_HAS_PROP_AND_OR(inst, compat, prop) \
6015 DT_NODE_HAS_PROP(DT_INST(inst, compat), prop) ||
6016
6021#if defined(_LINKER) || defined(_ASMLANGUAGE)
6022#define DT_U32_C(_v) (_v)
6023#else
6024#define DT_U32_C(_v) UINT32_C(_v)
6025#endif
6026
6031#if defined(_LINKER) || defined(_ASMLANGUAGE)
6032#define DT_U64_C(_v) (_v)
6033#else
6034#define DT_U64_C(_v) UINT64_C(_v)
6035#endif
6036
6037/* Helpers for DT_NODELABEL_STRING_ARRAY. We define our own stringify
6038 * in order to avoid adding a dependency on toolchain.h..
6039 */
6040#define DT_NODELABEL_STRING_ARRAY_ENTRY_INTERNAL(nodelabel) DT_STRINGIFY_INTERNAL(nodelabel),
6041#define DT_STRINGIFY_INTERNAL(arg) DT_STRINGIFY_INTERNAL_HELPER(arg)
6042#define DT_STRINGIFY_INTERNAL_HELPER(arg) #arg
6043
6045
6046/* have these last so they have access to all previously defined macros */
6049#include <zephyr/devicetree/gpio.h>
6050#include <zephyr/devicetree/spi.h>
6051#include <zephyr/devicetree/dma.h>
6052#include <zephyr/devicetree/pwms.h>
6056#include <zephyr/devicetree/can.h>
6058#include <zephyr/devicetree/mbox.h>
6062#include <zephyr/devicetree/map.h>
6063#include <zephyr/devicetree/wuc.h>
6066#include <zephyr/devicetree/sram.h>
6067
6068#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.