Zephyr API Documentation  3.5.0
A Scalable Open Source RTOS
3.5.0
All Data Structures Files Functions Variables Typedefs Enumerations Enumerator Macros Modules Pages
devicetree.h
Go to the documentation of this file.
1/*
2 * SPDX-License-Identifier: Apache-2.0
3 * Copyright (c) 2020 Nordic Semiconductor
4 * Copyright (c) 2020, Linaro Ltd.
5 *
6 * Not a generated file. Feel free to modify.
7 */
8
16#ifndef DEVICETREE_H
17#define DEVICETREE_H
18
19#include <devicetree_generated.h>
20
21#if !defined(_LINKER) && !defined(_ASMLANGUAGE)
22#include <stdint.h>
23#endif
24
25#include <zephyr/sys/util.h>
26
34/*
35 * Property suffixes
36 * -----------------
37 *
38 * These are the optional parts that come after the _P_<property>
39 * part in DT_N_<path-id>_P_<property-id> macros, or the "prop-suf"
40 * nonterminal in the DT guide's macros.bnf file.
41 *
42 * Before adding new ones, check this list to avoid conflicts. If any
43 * are missing from this list, please add them. It should be complete.
44 *
45 * _ENUM_IDX: property's value as an index into bindings enum
46 * _ENUM_VAL_<val>_EXISTS property's value as a token exists
47 * _ENUM_TOKEN: property's value as a token into bindings enum (string
48 * enum values are identifiers) [deprecated, use _STRING_TOKEN]
49 * _ENUM_UPPER_TOKEN: like _ENUM_TOKEN, but uppercased [deprecated, use
50 * _STRING_UPPER_TOKEN]
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
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
333#define DT_INST(inst, compat) UTIL_CAT(DT_N_INST, DT_DASH(inst, compat))
334
358#define DT_PARENT(node_id) UTIL_CAT(node_id, _PARENT)
359
383#define DT_GPARENT(node_id) DT_PARENT(DT_PARENT(node_id))
384
420#define DT_CHILD(node_id, child) UTIL_CAT(node_id, DT_S_PREFIX(child))
421
463#define DT_COMPAT_GET_ANY_STATUS_OKAY(compat) \
464 COND_CODE_1(DT_HAS_COMPAT_STATUS_OKAY(compat), \
465 (DT_INST(0, compat)), \
466 (DT_INVALID_NODE))
467
495#define DT_NODE_PATH(node_id) DT_CAT(node_id, _PATH)
496
521#define DT_NODE_FULL_NAME(node_id) DT_CAT(node_id, _FULL_NAME)
522
549#define DT_NODE_CHILD_IDX(node_id) DT_CAT(node_id, _CHILD_IDX)
550
571#define DT_SAME_NODE(node_id1, node_id2) \
572 (DT_DEP_ORD(node_id1) == (DT_DEP_ORD(node_id2)))
573
614#define DT_PROP(node_id, prop) DT_CAT3(node_id, _P_, prop)
615
648#define DT_PROP_LEN(node_id, prop) DT_CAT4(node_id, _P_, prop, _LEN)
649
664#define DT_PROP_LEN_OR(node_id, prop, default_value) \
665 COND_CODE_1(DT_NODE_HAS_PROP(node_id, prop), \
666 (DT_PROP_LEN(node_id, prop)), (default_value))
667
688#define DT_PROP_HAS_IDX(node_id, prop, idx) \
689 IS_ENABLED(DT_CAT6(node_id, _P_, prop, _IDX_, idx, _EXISTS))
690
723#define DT_PROP_HAS_NAME(node_id, prop, name) \
724 IS_ENABLED(DT_CAT6(node_id, _P_, prop, _NAME_, name, _EXISTS))
725
760#define DT_PROP_BY_IDX(node_id, prop, idx) \
761 DT_CAT5(node_id, _P_, prop, _IDX_, idx)
762
776#define DT_PROP_OR(node_id, prop, default_value) \
777 COND_CODE_1(DT_NODE_HAS_PROP(node_id, prop), \
778 (DT_PROP(node_id, prop)), (default_value))
779
789#define DT_LABEL(node_id) DT_PROP(node_id, label) __DEPRECATED_MACRO
790
831#define DT_ENUM_IDX(node_id, prop) DT_CAT4(node_id, _P_, prop, _ENUM_IDX)
832
847#define DT_ENUM_IDX_OR(node_id, prop, default_idx_value) \
848 COND_CODE_1(DT_NODE_HAS_PROP(node_id, prop), \
849 (DT_ENUM_IDX(node_id, prop)), (default_idx_value))
850
859#define DT_ENUM_HAS_VALUE(node_id, prop, value) \
860 IS_ENABLED(DT_CAT6(node_id, _P_, prop, _ENUM_VAL_, value, _EXISTS))
861
921#define DT_STRING_TOKEN(node_id, prop) \
922 DT_CAT4(node_id, _P_, prop, _STRING_TOKEN)
923
937#define DT_STRING_TOKEN_OR(node_id, prop, default_value) \
938 COND_CODE_1(DT_NODE_HAS_PROP(node_id, prop), \
939 (DT_STRING_TOKEN(node_id, prop)), (default_value))
940
998#define DT_STRING_UPPER_TOKEN(node_id, prop) \
999 DT_CAT4(node_id, _P_, prop, _STRING_UPPER_TOKEN)
1000
1015#define DT_STRING_UPPER_TOKEN_OR(node_id, prop, default_value) \
1016 COND_CODE_1(DT_NODE_HAS_PROP(node_id, prop), \
1017 (DT_STRING_UPPER_TOKEN(node_id, prop)), (default_value))
1018
1059#define DT_STRING_UNQUOTED(node_id, prop) \
1060 DT_CAT4(node_id, _P_, prop, _STRING_UNQUOTED)
1061
1076#define DT_STRING_UNQUOTED_OR(node_id, prop, default_value) \
1077 COND_CODE_1(DT_NODE_HAS_PROP(node_id, prop), \
1078 (DT_STRING_UNQUOTED(node_id, prop)), (default_value))
1079
1127#define DT_STRING_TOKEN_BY_IDX(node_id, prop, idx) \
1128 DT_CAT6(node_id, _P_, prop, _IDX_, idx, _STRING_TOKEN)
1129
1177#define DT_STRING_UPPER_TOKEN_BY_IDX(node_id, prop, idx) \
1178 DT_CAT6(node_id, _P_, prop, _IDX_, idx, _STRING_UPPER_TOKEN)
1179
1220#define DT_STRING_UNQUOTED_BY_IDX(node_id, prop, idx) \
1221 DT_CAT4(node_id, _P_, prop##_IDX_##idx, _STRING_UNQUOTED)
1222
1223/*
1224 * phandle properties
1225 *
1226 * These are special-cased to manage the impedance mismatch between
1227 * phandles, which are just uint32_t node properties that only make sense
1228 * within the tree itself, and C values.
1229 */
1230
1276#define DT_PROP_BY_PHANDLE_IDX(node_id, phs, idx, prop) \
1277 DT_PROP(DT_PHANDLE_BY_IDX(node_id, phs, idx), prop)
1278
1298#define DT_PROP_BY_PHANDLE_IDX_OR(node_id, phs, idx, prop, default_value) \
1299 DT_PROP_OR(DT_PHANDLE_BY_IDX(node_id, phs, idx), prop, default_value)
1300
1312#define DT_PROP_BY_PHANDLE(node_id, ph, prop) \
1313 DT_PROP_BY_PHANDLE_IDX(node_id, ph, 0, prop)
1314
1369#define DT_PHA_BY_IDX(node_id, pha, idx, cell) \
1370 DT_CAT7(node_id, _P_, pha, _IDX_, idx, _VAL_, cell)
1371
1395#define DT_PHA_BY_IDX_OR(node_id, pha, idx, cell, default_value) \
1396 DT_PROP_OR(node_id, pha##_IDX_##idx##_VAL_##cell, default_value)
1397
1405#define DT_PHA(node_id, pha, cell) DT_PHA_BY_IDX(node_id, pha, 0, cell)
1406
1421#define DT_PHA_OR(node_id, pha, cell, default_value) \
1422 DT_PHA_BY_IDX_OR(node_id, pha, 0, cell, default_value)
1423
1464#define DT_PHA_BY_NAME(node_id, pha, name, cell) \
1465 DT_CAT7(node_id, _P_, pha, _NAME_, name, _VAL_, cell)
1466
1488#define DT_PHA_BY_NAME_OR(node_id, pha, name, cell, default_value) \
1489 DT_PROP_OR(node_id, pha##_NAME_##name##_VAL_##cell, default_value)
1490
1538#define DT_PHANDLE_BY_NAME(node_id, pha, name) \
1539 DT_CAT6(node_id, _P_, pha, _NAME_, name, _PH)
1540
1590#define DT_PHANDLE_BY_IDX(node_id, prop, idx) \
1591 DT_CAT6(node_id, _P_, prop, _IDX_, idx, _PH)
1592
1604#define DT_PHANDLE(node_id, prop) DT_PHANDLE_BY_IDX(node_id, prop, 0)
1605
1652#define DT_NUM_RANGES(node_id) DT_CAT(node_id, _RANGES_NUM)
1653
1706#define DT_RANGES_HAS_IDX(node_id, idx) \
1707 IS_ENABLED(DT_CAT4(node_id, _RANGES_IDX_, idx, _EXISTS))
1708
1761#define DT_RANGES_HAS_CHILD_BUS_FLAGS_AT_IDX(node_id, idx) \
1762 IS_ENABLED(DT_CAT4(node_id, _RANGES_IDX_, idx, _VAL_CHILD_BUS_FLAGS_EXISTS))
1763
1801#define DT_RANGES_CHILD_BUS_FLAGS_BY_IDX(node_id, idx) \
1802 DT_CAT4(node_id, _RANGES_IDX_, idx, _VAL_CHILD_BUS_FLAGS)
1803
1850#define DT_RANGES_CHILD_BUS_ADDRESS_BY_IDX(node_id, idx) \
1851 DT_CAT4(node_id, _RANGES_IDX_, idx, _VAL_CHILD_BUS_ADDRESS)
1852
1899#define DT_RANGES_PARENT_BUS_ADDRESS_BY_IDX(node_id, idx) \
1900 DT_CAT4(node_id, _RANGES_IDX_, idx, _VAL_PARENT_BUS_ADDRESS)
1901
1948#define DT_RANGES_LENGTH_BY_IDX(node_id, idx) \
1949 DT_CAT4(node_id, _RANGES_IDX_, idx, _VAL_LENGTH)
1950
1990#define DT_FOREACH_RANGE(node_id, fn) \
1991 DT_CAT(node_id, _FOREACH_RANGE)(fn)
1992
2038#define DT_NODE_VENDOR_BY_IDX(node_id, idx) \
2039 DT_CAT3(node_id, _COMPAT_VENDOR_IDX_, idx)
2040
2053#define DT_NODE_VENDOR_HAS_IDX(node_id, idx) \
2054 IS_ENABLED(DT_CAT4(node_id, _COMPAT_VENDOR_IDX_, idx, _EXISTS))
2055
2070#define DT_NODE_VENDOR_BY_IDX_OR(node_id, idx, default_value) \
2071 COND_CODE_1(DT_NODE_VENDOR_HAS_IDX(node_id, idx), \
2072 (DT_NODE_VENDOR_BY_IDX(node_id, idx)), (default_value))
2073
2082#define DT_NODE_VENDOR_OR(node_id, default_value) \
2083 DT_NODE_VENDOR_BY_IDX_OR(node_id, 0, default_value)
2084
2114#define DT_NODE_MODEL_BY_IDX(node_id, idx) \
2115 DT_CAT3(node_id, _COMPAT_MODEL_IDX_, idx)
2116
2129#define DT_NODE_MODEL_HAS_IDX(node_id, idx) \
2130 IS_ENABLED(DT_CAT4(node_id, _COMPAT_MODEL_IDX_, idx, _EXISTS))
2131
2146#define DT_NODE_MODEL_BY_IDX_OR(node_id, idx, default_value) \
2147 COND_CODE_1(DT_NODE_MODEL_HAS_IDX(node_id, idx), \
2148 (DT_NODE_MODEL_BY_IDX(node_id, idx)), (default_value))
2149
2158#define DT_NODE_MODEL_OR(node_id, default_value) \
2159 DT_NODE_MODEL_BY_IDX_OR(node_id, 0, default_value)
2160
2178#define DT_NUM_REGS(node_id) DT_CAT(node_id, _REG_NUM)
2179
2191#define DT_REG_HAS_IDX(node_id, idx) \
2192 IS_ENABLED(DT_CAT4(node_id, _REG_IDX_, idx, _EXISTS))
2193
2200#define DT_REG_ADDR_BY_IDX(node_id, idx) \
2201 DT_CAT4(node_id, _REG_IDX_, idx, _VAL_ADDRESS)
2202
2214#define DT_REG_SIZE_BY_IDX(node_id, idx) \
2215 DT_CAT4(node_id, _REG_IDX_, idx, _VAL_SIZE)
2216
2224#define DT_REG_ADDR(node_id) DT_REG_ADDR_BY_IDX(node_id, 0)
2225
2236#define DT_REG_ADDR_U64(node_id) DT_U64_C(DT_REG_ADDR(node_id))
2237
2245#define DT_REG_SIZE(node_id) DT_REG_SIZE_BY_IDX(node_id, 0)
2246
2253#define DT_REG_ADDR_BY_NAME(node_id, name) \
2254 DT_CAT4(node_id, _REG_NAME_, name, _VAL_ADDRESS)
2255
2268#define DT_REG_ADDR_BY_NAME_U64(node_id, name) \
2269 DT_U64_C(DT_REG_ADDR_BY_NAME(node_id, name))
2270
2277#define DT_REG_SIZE_BY_NAME(node_id, name) \
2278 DT_CAT4(node_id, _REG_NAME_, name, _VAL_SIZE)
2279
2298#define DT_NUM_IRQS(node_id) DT_CAT(node_id, _IRQ_NUM)
2299
2310#define DT_IRQ_HAS_IDX(node_id, idx) \
2311 IS_ENABLED(DT_CAT4(node_id, _IRQ_IDX_, idx, _EXISTS))
2312
2323#define DT_IRQ_HAS_CELL_AT_IDX(node_id, idx, cell) \
2324 IS_ENABLED(DT_CAT6(node_id, _IRQ_IDX_, idx, _VAL_, cell, _EXISTS))
2325
2333#define DT_IRQ_HAS_CELL(node_id, cell) DT_IRQ_HAS_CELL_AT_IDX(node_id, 0, cell)
2334
2344#define DT_IRQ_HAS_NAME(node_id, name) \
2345 IS_ENABLED(DT_CAT4(node_id, _IRQ_NAME_, name, _VAL_irq_EXISTS))
2346
2382#define DT_IRQ_BY_IDX(node_id, idx, cell) \
2383 DT_CAT5(node_id, _IRQ_IDX_, idx, _VAL_, cell)
2384
2400#define DT_IRQ_BY_NAME(node_id, name, cell) \
2401 DT_CAT5(node_id, _IRQ_NAME_, name, _VAL_, cell)
2402
2410#define DT_IRQ(node_id, cell) DT_IRQ_BY_IDX(node_id, 0, cell)
2411
2422#define DT_IRQN(node_id) DT_IRQ(node_id, irq)
2423
2442#define DT_CHOSEN(prop) DT_CAT(DT_CHOSEN_, prop)
2443
2450#define DT_HAS_CHOSEN(prop) IS_ENABLED(DT_CAT3(DT_CHOSEN_, prop, _EXISTS))
2451
2471#define DT_FOREACH_NODE(fn) DT_FOREACH_HELPER(fn)
2472
2485#define DT_FOREACH_NODE_VARGS(fn, ...) DT_FOREACH_VARGS_HELPER(fn, __VA_ARGS__)
2486
2498#define DT_FOREACH_STATUS_OKAY_NODE(fn) DT_FOREACH_OKAY_HELPER(fn)
2499
2514#define DT_FOREACH_STATUS_OKAY_NODE_VARGS(fn, ...) DT_FOREACH_OKAY_VARGS_HELPER(fn, __VA_ARGS__)
2515
2559#define DT_FOREACH_CHILD(node_id, fn) \
2560 DT_CAT(node_id, _FOREACH_CHILD)(fn)
2561
2602#define DT_FOREACH_CHILD_SEP(node_id, fn, sep) \
2603 DT_CAT(node_id, _FOREACH_CHILD_SEP)(fn, sep)
2604
2620#define DT_FOREACH_CHILD_VARGS(node_id, fn, ...) \
2621 DT_CAT(node_id, _FOREACH_CHILD_VARGS)(fn, __VA_ARGS__)
2622
2638#define DT_FOREACH_CHILD_SEP_VARGS(node_id, fn, sep, ...) \
2639 DT_CAT(node_id, _FOREACH_CHILD_SEP_VARGS)(fn, sep, __VA_ARGS__)
2640
2656#define DT_FOREACH_CHILD_STATUS_OKAY(node_id, fn) \
2657 DT_CAT(node_id, _FOREACH_CHILD_STATUS_OKAY)(fn)
2658
2675#define DT_FOREACH_CHILD_STATUS_OKAY_SEP(node_id, fn, sep) \
2676 DT_CAT(node_id, _FOREACH_CHILD_STATUS_OKAY_SEP)(fn, sep)
2677
2697#define DT_FOREACH_CHILD_STATUS_OKAY_VARGS(node_id, fn, ...) \
2698 DT_CAT(node_id, _FOREACH_CHILD_STATUS_OKAY_VARGS)(fn, __VA_ARGS__)
2699
2718#define DT_FOREACH_CHILD_STATUS_OKAY_SEP_VARGS(node_id, fn, sep, ...) \
2719 DT_CAT(node_id, _FOREACH_CHILD_STATUS_OKAY_SEP_VARGS)(fn, sep, __VA_ARGS__)
2720
2771#define DT_FOREACH_PROP_ELEM(node_id, prop, fn) \
2772 DT_CAT4(node_id, _P_, prop, _FOREACH_PROP_ELEM)(fn)
2773
2816#define DT_FOREACH_PROP_ELEM_SEP(node_id, prop, fn, sep) \
2817 DT_CAT4(node_id, _P_, prop, _FOREACH_PROP_ELEM_SEP)(fn, sep)
2818
2839#define DT_FOREACH_PROP_ELEM_VARGS(node_id, prop, fn, ...) \
2840 DT_CAT4(node_id, _P_, prop, _FOREACH_PROP_ELEM_VARGS)(fn, __VA_ARGS__)
2841
2858#define DT_FOREACH_PROP_ELEM_SEP_VARGS(node_id, prop, fn, sep, ...) \
2859 DT_CAT4(node_id, _P_, prop, _FOREACH_PROP_ELEM_SEP_VARGS)( \
2860 fn, sep, __VA_ARGS__)
2861
2915#define DT_FOREACH_STATUS_OKAY(compat, fn) \
2916 COND_CODE_1(DT_HAS_COMPAT_STATUS_OKAY(compat), \
2917 (UTIL_CAT(DT_FOREACH_OKAY_, compat)(fn)), \
2918 ())
2919
2964#define DT_FOREACH_STATUS_OKAY_VARGS(compat, fn, ...) \
2965 COND_CODE_1(DT_HAS_COMPAT_STATUS_OKAY(compat), \
2966 (UTIL_CAT(DT_FOREACH_OKAY_VARGS_, \
2967 compat)(fn, __VA_ARGS__)), \
2968 ())
2969
2994#define DT_NODE_EXISTS(node_id) IS_ENABLED(DT_CAT(node_id, _EXISTS))
2995
3017#define DT_NODE_HAS_STATUS(node_id, status) \
3018 DT_NODE_HAS_STATUS_INTERNAL(node_id, status)
3019
3039#define DT_HAS_COMPAT_STATUS_OKAY(compat) \
3040 IS_ENABLED(DT_CAT(DT_COMPAT_HAS_OKAY_, compat))
3041
3048#define DT_NUM_INST_STATUS_OKAY(compat) \
3049 UTIL_AND(DT_HAS_COMPAT_STATUS_OKAY(compat), \
3050 UTIL_CAT(DT_N_INST, DT_DASH(compat, NUM_OKAY)))
3051
3079#define DT_NODE_HAS_COMPAT(node_id, compat) \
3080 IS_ENABLED(DT_CAT3(node_id, _COMPAT_MATCHES_, compat))
3081
3096#define DT_NODE_HAS_COMPAT_STATUS(node_id, compat, status) \
3097 DT_NODE_HAS_COMPAT(node_id, compat) && DT_NODE_HAS_STATUS(node_id, status)
3098
3112#define DT_NODE_HAS_PROP(node_id, prop) \
3113 IS_ENABLED(DT_CAT4(node_id, _P_, prop, _EXISTS))
3114
3115
3132#define DT_PHA_HAS_CELL_AT_IDX(node_id, pha, idx, cell) \
3133 IS_ENABLED(DT_CAT8(node_id, _P_, pha, \
3134 _IDX_, idx, _VAL_, cell, _EXISTS))
3135
3145#define DT_PHA_HAS_CELL(node_id, pha, cell) \
3146 DT_PHA_HAS_CELL_AT_IDX(node_id, pha, 0, cell)
3147
3189#define DT_BUS(node_id) DT_CAT(node_id, _BUS)
3190
3199#define DT_BUS_LABEL(node_id) DT_PROP(DT_BUS(node_id), label) __DEPRECATED_MACRO
3200
3229#define DT_ON_BUS(node_id, bus) IS_ENABLED(DT_CAT3(node_id, _BUS_, bus))
3230
3247#define DT_DRV_INST(inst) DT_INST(inst, DT_DRV_COMPAT)
3248
3256#define DT_INST_PARENT(inst) DT_PARENT(DT_DRV_INST(inst))
3257
3265#define DT_INST_GPARENT(inst) DT_GPARENT(DT_DRV_INST(inst))
3266
3276#define DT_INST_CHILD(inst, child) \
3277 DT_CHILD(DT_DRV_INST(inst), child)
3278
3293#define DT_INST_FOREACH_CHILD(inst, fn) \
3294 DT_FOREACH_CHILD(DT_DRV_INST(inst), fn)
3295
3309#define DT_INST_FOREACH_CHILD_SEP(inst, fn, sep) \
3310 DT_FOREACH_CHILD_SEP(DT_DRV_INST(inst), fn, sep)
3311
3327#define DT_INST_FOREACH_CHILD_VARGS(inst, fn, ...) \
3328 DT_FOREACH_CHILD_VARGS(DT_DRV_INST(inst), fn, __VA_ARGS__)
3329
3344#define DT_INST_FOREACH_CHILD_SEP_VARGS(inst, fn, sep, ...) \
3345 DT_FOREACH_CHILD_SEP_VARGS(DT_DRV_INST(inst), fn, sep, __VA_ARGS__)
3346
3358#define DT_INST_FOREACH_CHILD_STATUS_OKAY(inst, fn) \
3359 DT_FOREACH_CHILD_STATUS_OKAY(DT_DRV_INST(inst), fn)
3360
3375#define DT_INST_FOREACH_CHILD_STATUS_OKAY_SEP(inst, fn, sep) \
3376 DT_FOREACH_CHILD_STATUS_OKAY_SEP(DT_DRV_INST(inst), fn, sep)
3377
3391#define DT_INST_FOREACH_CHILD_STATUS_OKAY_VARGS(inst, fn, ...) \
3392 DT_FOREACH_CHILD_STATUS_OKAY_VARGS(DT_DRV_INST(inst), fn, __VA_ARGS__)
3393
3409#define DT_INST_FOREACH_CHILD_STATUS_OKAY_SEP_VARGS(inst, fn, sep, ...) \
3410 DT_FOREACH_CHILD_STATUS_OKAY_SEP_VARGS(DT_DRV_INST(inst), fn, sep, __VA_ARGS__)
3411
3418#define DT_INST_ENUM_IDX(inst, prop) \
3419 DT_ENUM_IDX(DT_DRV_INST(inst), prop)
3420
3429#define DT_INST_ENUM_IDX_OR(inst, prop, default_idx_value) \
3430 DT_ENUM_IDX_OR(DT_DRV_INST(inst), prop, default_idx_value)
3431
3440#define DT_INST_ENUM_HAS_VALUE(inst, prop, value) \
3441 DT_ENUM_HAS_VALUE(DT_DRV_INST(inst), prop, value)
3442
3449#define DT_INST_PROP(inst, prop) DT_PROP(DT_DRV_INST(inst), prop)
3450
3457#define DT_INST_PROP_LEN(inst, prop) DT_PROP_LEN(DT_DRV_INST(inst), prop)
3458
3468#define DT_INST_PROP_HAS_IDX(inst, prop, idx) \
3469 DT_PROP_HAS_IDX(DT_DRV_INST(inst), prop, idx)
3470
3479#define DT_INST_PROP_HAS_NAME(inst, prop, name) \
3480 DT_PROP_HAS_NAME(DT_DRV_INST(inst), prop, name)
3481
3489#define DT_INST_PROP_BY_IDX(inst, prop, idx) \
3490 DT_PROP_BY_IDX(DT_DRV_INST(inst), prop, idx)
3491
3499#define DT_INST_PROP_OR(inst, prop, default_value) \
3500 DT_PROP_OR(DT_DRV_INST(inst), prop, default_value)
3501
3509#define DT_INST_PROP_LEN_OR(inst, prop, default_value) \
3510 DT_PROP_LEN_OR(DT_DRV_INST(inst), prop, default_value)
3511
3518#define DT_INST_LABEL(inst) DT_INST_PROP(inst, label) __DEPRECATED_MACRO
3519
3529#define DT_INST_STRING_TOKEN(inst, prop) \
3530 DT_STRING_TOKEN(DT_DRV_INST(inst), prop)
3531
3539#define DT_INST_STRING_UPPER_TOKEN(inst, prop) \
3540 DT_STRING_UPPER_TOKEN(DT_DRV_INST(inst), prop)
3541
3550#define DT_INST_STRING_UNQUOTED(inst, prop) \
3551 DT_STRING_UNQUOTED(DT_DRV_INST(inst), prop)
3552
3560#define DT_INST_STRING_TOKEN_BY_IDX(inst, prop, idx) \
3561 DT_STRING_TOKEN_BY_IDX(DT_DRV_INST(inst), prop, idx)
3562
3570#define DT_INST_STRING_UPPER_TOKEN_BY_IDX(inst, prop, idx) \
3571 DT_STRING_UPPER_TOKEN_BY_IDX(DT_DRV_INST(inst), prop, idx)
3572
3580#define DT_INST_STRING_UNQUOTED_BY_IDX(inst, prop, idx) \
3581 DT_STRING_UNQUOTED_BY_IDX(DT_DRV_INST(inst), prop, idx)
3582
3591#define DT_INST_PROP_BY_PHANDLE(inst, ph, prop) \
3592 DT_INST_PROP_BY_PHANDLE_IDX(inst, ph, 0, prop)
3593
3605#define DT_INST_PROP_BY_PHANDLE_IDX(inst, phs, idx, prop) \
3606 DT_PROP_BY_PHANDLE_IDX(DT_DRV_INST(inst), phs, idx, prop)
3607
3616#define DT_INST_PHA_BY_IDX(inst, pha, idx, cell) \
3617 DT_PHA_BY_IDX(DT_DRV_INST(inst), pha, idx, cell)
3618
3628#define DT_INST_PHA_BY_IDX_OR(inst, pha, idx, cell, default_value) \
3629 DT_PHA_BY_IDX_OR(DT_DRV_INST(inst), pha, idx, cell, default_value)
3630
3639#define DT_INST_PHA(inst, pha, cell) DT_INST_PHA_BY_IDX(inst, pha, 0, cell)
3640
3649#define DT_INST_PHA_OR(inst, pha, cell, default_value) \
3650 DT_INST_PHA_BY_IDX_OR(inst, pha, 0, cell, default_value)
3651
3661#define DT_INST_PHA_BY_NAME(inst, pha, name, cell) \
3662 DT_PHA_BY_NAME(DT_DRV_INST(inst), pha, name, cell)
3663
3673#define DT_INST_PHA_BY_NAME_OR(inst, pha, name, cell, default_value) \
3674 DT_PHA_BY_NAME_OR(DT_DRV_INST(inst), pha, name, cell, default_value)
3675
3684#define DT_INST_PHANDLE_BY_NAME(inst, pha, name) \
3685 DT_PHANDLE_BY_NAME(DT_DRV_INST(inst), pha, name) \
3686
3696#define DT_INST_PHANDLE_BY_IDX(inst, prop, idx) \
3697 DT_PHANDLE_BY_IDX(DT_DRV_INST(inst), prop, idx)
3698
3707#define DT_INST_PHANDLE(inst, prop) DT_INST_PHANDLE_BY_IDX(inst, prop, 0)
3708
3716#define DT_INST_REG_HAS_IDX(inst, idx) DT_REG_HAS_IDX(DT_DRV_INST(inst), idx)
3717
3724#define DT_INST_REG_ADDR_BY_IDX(inst, idx) DT_REG_ADDR_BY_IDX(DT_DRV_INST(inst), idx)
3725
3732#define DT_INST_REG_SIZE_BY_IDX(inst, idx) \
3733 DT_REG_SIZE_BY_IDX(DT_DRV_INST(inst), idx)
3734
3741#define DT_INST_REG_ADDR_BY_NAME(inst, name) \
3742 DT_REG_ADDR_BY_NAME(DT_DRV_INST(inst), name)
3743
3756#define DT_INST_REG_ADDR_BY_NAME_U64(inst, name) \
3757 DT_U64_C(DT_INST_REG_ADDR_BY_NAME(inst, name))
3758
3765#define DT_INST_REG_SIZE_BY_NAME(inst, name) \
3766 DT_REG_SIZE_BY_NAME(DT_DRV_INST(inst), name)
3767
3773#define DT_INST_REG_ADDR(inst) DT_INST_REG_ADDR_BY_IDX(inst, 0)
3774
3786#define DT_INST_REG_ADDR_U64(inst) DT_U64_C(DT_INST_REG_ADDR(inst))
3787
3793#define DT_INST_REG_SIZE(inst) DT_INST_REG_SIZE_BY_IDX(inst, 0)
3794
3802#define DT_INST_IRQ_BY_IDX(inst, idx, cell) \
3803 DT_IRQ_BY_IDX(DT_DRV_INST(inst), idx, cell)
3804
3812#define DT_INST_IRQ_BY_NAME(inst, name, cell) \
3813 DT_IRQ_BY_NAME(DT_DRV_INST(inst), name, cell)
3814
3821#define DT_INST_IRQ(inst, cell) DT_INST_IRQ_BY_IDX(inst, 0, cell)
3822
3828#define DT_INST_IRQN(inst) DT_INST_IRQ(inst, irq)
3829
3835#define DT_INST_BUS(inst) DT_BUS(DT_DRV_INST(inst))
3836
3845#define DT_INST_BUS_LABEL(inst) DT_BUS_LABEL(DT_DRV_INST(inst)) __DEPRECATED_MACRO
3846
3854#define DT_INST_ON_BUS(inst, bus) DT_ON_BUS(DT_DRV_INST(inst), bus)
3855
3865#define DT_INST_STRING_TOKEN_OR(inst, name, default_value) \
3866 DT_STRING_TOKEN_OR(DT_DRV_INST(inst), name, default_value)
3867
3876#define DT_INST_STRING_UPPER_TOKEN_OR(inst, name, default_value) \
3877 DT_STRING_UPPER_TOKEN_OR(DT_DRV_INST(inst), name, default_value)
3878
3887#define DT_INST_STRING_UNQUOTED_OR(inst, name, default_value) \
3888 DT_STRING_UNQUOTED_OR(DT_DRV_INST(inst), name, default_value)
3889
3890/*
3891 * @brief Test if any enabled node with the given compatible is on
3892 * the given bus type
3893 *
3894 * This is like DT_ANY_INST_ON_BUS_STATUS_OKAY(), except it can also
3895 * be useful for handling multiple compatibles in single source file.
3896 *
3897 * Example devicetree overlay:
3898 *
3899 * @code{.dts}
3900 * &i2c0 {
3901 * temp: temperature-sensor@76 {
3902 * compatible = "vnd,some-sensor";
3903 * reg = <0x76>;
3904 * };
3905 * };
3906 * @endcode
3907 *
3908 * Example usage, assuming `i2c0` is an I2C bus controller node, and
3909 * therefore `temp` is on an I2C bus:
3910 *
3911 * @code{.c}
3912 * DT_HAS_COMPAT_ON_BUS_STATUS_OKAY(vnd_some_sensor, i2c) // 1
3913 * @endcode
3914 *
3915 * @param compat lowercase-and-underscores compatible, without quotes
3916 * @param bus a binding's bus type as a C token, lowercased and without quotes
3917 * @return 1 if any enabled node with that compatible is on that bus type,
3918 * 0 otherwise
3919 */
3920#define DT_HAS_COMPAT_ON_BUS_STATUS_OKAY(compat, bus) \
3921 IS_ENABLED(UTIL_CAT(DT_CAT(DT_COMPAT_, compat), _BUS_##bus))
3922
3955#define DT_ANY_INST_ON_BUS_STATUS_OKAY(bus) \
3956 DT_HAS_COMPAT_ON_BUS_STATUS_OKAY(DT_DRV_COMPAT, bus)
3957
4002#define DT_ANY_INST_HAS_PROP_STATUS_OKAY(prop) \
4003 (DT_INST_FOREACH_STATUS_OKAY_VARGS(DT_INST_NODE_HAS_PROP_AND_OR, prop) 0)
4004
4070#define DT_INST_FOREACH_STATUS_OKAY(fn) \
4071 COND_CODE_1(DT_HAS_COMPAT_STATUS_OKAY(DT_DRV_COMPAT), \
4072 (UTIL_CAT(DT_FOREACH_OKAY_INST_, \
4073 DT_DRV_COMPAT)(fn)), \
4074 ())
4075
4087#define DT_INST_FOREACH_STATUS_OKAY_VARGS(fn, ...) \
4088 COND_CODE_1(DT_HAS_COMPAT_STATUS_OKAY(DT_DRV_COMPAT), \
4089 (UTIL_CAT(DT_FOREACH_OKAY_INST_VARGS_, \
4090 DT_DRV_COMPAT)(fn, __VA_ARGS__)), \
4091 ())
4092
4103#define DT_INST_FOREACH_PROP_ELEM(inst, prop, fn) \
4104 DT_FOREACH_PROP_ELEM(DT_DRV_INST(inst), prop, fn)
4105
4118#define DT_INST_FOREACH_PROP_ELEM_SEP(inst, prop, fn, sep) \
4119 DT_FOREACH_PROP_ELEM_SEP(DT_DRV_INST(inst), prop, fn, sep)
4120
4135#define DT_INST_FOREACH_PROP_ELEM_VARGS(inst, prop, fn, ...) \
4136 DT_FOREACH_PROP_ELEM_VARGS(DT_DRV_INST(inst), prop, fn, __VA_ARGS__)
4137
4155#define DT_INST_FOREACH_PROP_ELEM_SEP_VARGS(inst, prop, fn, sep, ...) \
4156 DT_FOREACH_PROP_ELEM_SEP_VARGS(DT_DRV_INST(inst), prop, fn, sep, \
4157 __VA_ARGS__)
4158
4165#define DT_INST_NODE_HAS_PROP(inst, prop) \
4166 DT_NODE_HAS_PROP(DT_DRV_INST(inst), prop)
4167
4178#define DT_INST_PHA_HAS_CELL_AT_IDX(inst, pha, idx, cell) \
4179 DT_PHA_HAS_CELL_AT_IDX(DT_DRV_INST(inst), pha, idx, cell)
4180
4190#define DT_INST_PHA_HAS_CELL(inst, pha, cell) \
4191 DT_INST_PHA_HAS_CELL_AT_IDX(inst, pha, 0, cell)
4192
4200#define DT_INST_IRQ_HAS_IDX(inst, idx) DT_IRQ_HAS_IDX(DT_DRV_INST(inst), idx)
4201
4210#define DT_INST_IRQ_HAS_CELL_AT_IDX(inst, idx, cell) \
4211 DT_IRQ_HAS_CELL_AT_IDX(DT_DRV_INST(inst), idx, cell)
4212
4220#define DT_INST_IRQ_HAS_CELL(inst, cell) \
4221 DT_INST_IRQ_HAS_CELL_AT_IDX(inst, 0, cell)
4222
4229#define DT_INST_IRQ_HAS_NAME(inst, name) \
4230 DT_IRQ_HAS_NAME(DT_DRV_INST(inst), name)
4231
4238#define DT_PATH_INTERNAL(...) \
4239 UTIL_CAT(DT_ROOT, MACRO_MAP_CAT(DT_S_PREFIX, __VA_ARGS__))
4245#define DT_S_PREFIX(name) _S_##name
4246
4261#define DT_CAT(a1, a2) a1 ## a2
4263#define DT_CAT3(a1, a2, a3) a1 ## a2 ## a3
4265#define DT_CAT4(a1, a2, a3, a4) a1 ## a2 ## a3 ## a4
4267#define DT_CAT5(a1, a2, a3, a4, a5) a1 ## a2 ## a3 ## a4 ## a5
4269#define DT_CAT6(a1, a2, a3, a4, a5, a6) a1 ## a2 ## a3 ## a4 ## a5 ## a6
4271#define DT_CAT7(a1, a2, a3, a4, a5, a6, a7) \
4272 a1 ## a2 ## a3 ## a4 ## a5 ## a6 ## a7
4274#define DT_CAT8(a1, a2, a3, a4, a5, a6, a7, a8) \
4275 a1 ## a2 ## a3 ## a4 ## a5 ## a6 ## a7 ## a8
4276/*
4277 * If you need to define a bigger DT_CATN(), do so here. Don't leave
4278 * any "holes" of undefined macros, please.
4279 */
4280
4282#define DT_DASH(...) MACRO_MAP_CAT(DT_DASH_PREFIX, __VA_ARGS__)
4284#define DT_DASH_PREFIX(name) _##name
4286#define DT_NODE_HAS_STATUS_INTERNAL(node_id, status) \
4287 IS_ENABLED(DT_CAT3(node_id, _STATUS_, status))
4288
4290#define DT_INST_NODE_HAS_PROP_AND_OR(inst, prop) \
4291 DT_INST_NODE_HAS_PROP(inst, prop) ||
4292
4297#if defined(_LINKER) || defined(_ASMLANGUAGE)
4298#define DT_U64_C(_v) (_v)
4299#else
4300#define DT_U64_C(_v) UINT64_C(_v)
4301#endif
4302
4305/* have these last so they have access to all previously defined macros */
4308#include <zephyr/devicetree/gpio.h>
4309#include <zephyr/devicetree/spi.h>
4310#include <zephyr/devicetree/dma.h>
4311#include <zephyr/devicetree/pwms.h>
4315#include <zephyr/devicetree/can.h>
4317#include <zephyr/devicetree/mbox.h>
4318
4319#endif /* DEVICETREE_H */
Clocks Devicetree macro public API header file.
CAN devicetree macro public API header file.
DMA Devicetree macro public API header file.
GPIO Devicetree macro public API header file.
MBOX Devicetree macro public API header file.
Devicetree pin control helpers.
Reset Controller Devicetree macro public API header file.
SPI Devicetree macro public API header file.
Flash Devicetree macro public API header file.
IO channels devicetree macro public API header file.
Devicetree node dependency ordinals.
PWMs Devicetree macro public API header file.
Misc utilities.