Zephyr API Documentation  3.6.99
A Scalable Open Source RTOS
Loading...
Searching...
No Matches
devicetree.h
Go to the documentation of this file.
1/*
2 * SPDX-License-Identifier: Apache-2.0
3 * Copyright (c) 2020 Nordic Semiconductor
4 * Copyright (c) 2020, Linaro Ltd.
5 *
6 * Not a generated file. Feel free to modify.
7 */
8
16#ifndef DEVICETREE_H
17#define DEVICETREE_H
18
19#include <devicetree_generated.h>
21
22#if !defined(_LINKER) && !defined(_ASMLANGUAGE)
23#include <stdint.h>
24#endif
25
26#include <zephyr/sys/util.h>
27
37/*
38 * Property suffixes
39 * -----------------
40 *
41 * These are the optional parts that come after the _P_<property>
42 * part in DT_N_<path-id>_P_<property-id> macros, or the "prop-suf"
43 * nonterminal in the DT guide's macros.bnf file.
44 *
45 * Before adding new ones, check this list to avoid conflicts. If any
46 * are missing from this list, please add them. It should be complete.
47 *
48 * _ENUM_IDX: property's value as an index into bindings enum
49 * _ENUM_VAL_<val>_EXISTS property's value as a token exists
50 * _ENUM_TOKEN: property's value as a token into bindings enum (string
51 * enum values are identifiers) [deprecated, use _STRING_TOKEN]
52 * _ENUM_UPPER_TOKEN: like _ENUM_TOKEN, but uppercased [deprecated, use
53 * _STRING_UPPER_TOKEN]
54 * _EXISTS: property is defined
55 * _FOREACH_PROP_ELEM: helper for "iterating" over values in the property
56 * _FOREACH_PROP_ELEM_VARGS: foreach functions with variable number of arguments
57 * _IDX_<i>: logical index into property
58 * _IDX_<i>_EXISTS: logical index into property is defined
59 * _IDX_<i>_PH: phandle array's phandle by index (or phandle, phandles)
60 * _IDX_<i>_STRING_TOKEN: string array element value as a token
61 * _IDX_<i>_STRING_UPPER_TOKEN: string array element value as a uppercased token
62 * _IDX <i>_STRING_UNQUOTED: string array element value as a sequence of tokens, with no quotes
63 * _IDX_<i>_VAL_<val>: phandle array's specifier value by index
64 * _IDX_<i>_VAL_<val>_EXISTS: cell value exists, by index
65 * _LEN: property logical length
66 * _NAME_<name>_PH: phandle array's phandle by name
67 * _NAME_<name>_VAL_<val>: phandle array's property specifier by name
68 * _NAME_<name>_VAL_<val>_EXISTS: cell value exists, by name
69 * _STRING_TOKEN: string property's value as a token
70 * _STRING_UPPER_TOKEN: like _STRING_TOKEN, but uppercased
71 * _STRING_UNQUOTED: string property's value as a sequence of tokens, with no quotes
72 */
73
87#define DT_INVALID_NODE _
88
92#define DT_ROOT DT_N
93
144#define DT_PATH(...) DT_PATH_INTERNAL(__VA_ARGS__)
145
200#define DT_NODELABEL(label) DT_CAT(DT_N_NODELABEL_, label)
201
240#define DT_ALIAS(alias) DT_CAT(DT_N_ALIAS_, alias)
241
336#define DT_INST(inst, compat) UTIL_CAT(DT_N_INST, DT_DASH(inst, compat))
337
361#define DT_PARENT(node_id) DT_CAT(node_id, _PARENT)
362
386#define DT_GPARENT(node_id) DT_PARENT(DT_PARENT(node_id))
387
423#define DT_CHILD(node_id, child) UTIL_CAT(node_id, DT_S_PREFIX(child))
424
466#define DT_COMPAT_GET_ANY_STATUS_OKAY(compat) \
467 COND_CODE_1(DT_HAS_COMPAT_STATUS_OKAY(compat), \
468 (DT_INST(0, compat)), \
469 (DT_INVALID_NODE))
470
498#define DT_NODE_PATH(node_id) DT_CAT(node_id, _PATH)
499
524#define DT_NODE_FULL_NAME(node_id) DT_CAT(node_id, _FULL_NAME)
525
552#define DT_NODE_CHILD_IDX(node_id) DT_CAT(node_id, _CHILD_IDX)
553
574#define DT_SAME_NODE(node_id1, node_id2) \
575 (DT_DEP_ORD(node_id1) == (DT_DEP_ORD(node_id2)))
576
617#define DT_PROP(node_id, prop) DT_CAT3(node_id, _P_, prop)
618
651#define DT_PROP_LEN(node_id, prop) DT_CAT4(node_id, _P_, prop, _LEN)
652
667#define DT_PROP_LEN_OR(node_id, prop, default_value) \
668 COND_CODE_1(DT_NODE_HAS_PROP(node_id, prop), \
669 (DT_PROP_LEN(node_id, prop)), (default_value))
670
691#define DT_PROP_HAS_IDX(node_id, prop, idx) \
692 IS_ENABLED(DT_CAT6(node_id, _P_, prop, _IDX_, idx, _EXISTS))
693
726#define DT_PROP_HAS_NAME(node_id, prop, name) \
727 IS_ENABLED(DT_CAT6(node_id, _P_, prop, _NAME_, name, _EXISTS))
728
763#define DT_PROP_BY_IDX(node_id, prop, idx) \
764 DT_CAT5(node_id, _P_, prop, _IDX_, idx)
765
779#define DT_PROP_OR(node_id, prop, default_value) \
780 COND_CODE_1(DT_NODE_HAS_PROP(node_id, prop), \
781 (DT_PROP(node_id, prop)), (default_value))
782
823#define DT_ENUM_IDX(node_id, prop) DT_CAT4(node_id, _P_, prop, _ENUM_IDX)
824
839#define DT_ENUM_IDX_OR(node_id, prop, default_idx_value) \
840 COND_CODE_1(DT_NODE_HAS_PROP(node_id, prop), \
841 (DT_ENUM_IDX(node_id, prop)), (default_idx_value))
842
851#define DT_ENUM_HAS_VALUE(node_id, prop, value) \
852 IS_ENABLED(DT_CAT6(node_id, _P_, prop, _ENUM_VAL_, value, _EXISTS))
853
913#define DT_STRING_TOKEN(node_id, prop) \
914 DT_CAT4(node_id, _P_, prop, _STRING_TOKEN)
915
929#define DT_STRING_TOKEN_OR(node_id, prop, default_value) \
930 COND_CODE_1(DT_NODE_HAS_PROP(node_id, prop), \
931 (DT_STRING_TOKEN(node_id, prop)), (default_value))
932
990#define DT_STRING_UPPER_TOKEN(node_id, prop) \
991 DT_CAT4(node_id, _P_, prop, _STRING_UPPER_TOKEN)
992
1007#define DT_STRING_UPPER_TOKEN_OR(node_id, prop, default_value) \
1008 COND_CODE_1(DT_NODE_HAS_PROP(node_id, prop), \
1009 (DT_STRING_UPPER_TOKEN(node_id, prop)), (default_value))
1010
1051#define DT_STRING_UNQUOTED(node_id, prop) \
1052 DT_CAT4(node_id, _P_, prop, _STRING_UNQUOTED)
1053
1068#define DT_STRING_UNQUOTED_OR(node_id, prop, default_value) \
1069 COND_CODE_1(DT_NODE_HAS_PROP(node_id, prop), \
1070 (DT_STRING_UNQUOTED(node_id, prop)), (default_value))
1071
1119#define DT_STRING_TOKEN_BY_IDX(node_id, prop, idx) \
1120 DT_CAT6(node_id, _P_, prop, _IDX_, idx, _STRING_TOKEN)
1121
1169#define DT_STRING_UPPER_TOKEN_BY_IDX(node_id, prop, idx) \
1170 DT_CAT6(node_id, _P_, prop, _IDX_, idx, _STRING_UPPER_TOKEN)
1171
1212#define DT_STRING_UNQUOTED_BY_IDX(node_id, prop, idx) \
1213 DT_CAT6(node_id, _P_, prop, _IDX_, idx, _STRING_UNQUOTED)
1214
1215/*
1216 * phandle properties
1217 *
1218 * These are special-cased to manage the impedance mismatch between
1219 * phandles, which are just uint32_t node properties that only make sense
1220 * within the tree itself, and C values.
1221 */
1222
1268#define DT_PROP_BY_PHANDLE_IDX(node_id, phs, idx, prop) \
1269 DT_PROP(DT_PHANDLE_BY_IDX(node_id, phs, idx), prop)
1270
1290#define DT_PROP_BY_PHANDLE_IDX_OR(node_id, phs, idx, prop, default_value) \
1291 DT_PROP_OR(DT_PHANDLE_BY_IDX(node_id, phs, idx), prop, default_value)
1292
1304#define DT_PROP_BY_PHANDLE(node_id, ph, prop) \
1305 DT_PROP_BY_PHANDLE_IDX(node_id, ph, 0, prop)
1306
1361#define DT_PHA_BY_IDX(node_id, pha, idx, cell) \
1362 DT_CAT7(node_id, _P_, pha, _IDX_, idx, _VAL_, cell)
1363
1387#define DT_PHA_BY_IDX_OR(node_id, pha, idx, cell, default_value) \
1388 DT_PROP_OR(node_id, DT_CAT5(pha, _IDX_, idx, _VAL_, cell), default_value)
1389
1397#define DT_PHA(node_id, pha, cell) DT_PHA_BY_IDX(node_id, pha, 0, cell)
1398
1413#define DT_PHA_OR(node_id, pha, cell, default_value) \
1414 DT_PHA_BY_IDX_OR(node_id, pha, 0, cell, default_value)
1415
1456#define DT_PHA_BY_NAME(node_id, pha, name, cell) \
1457 DT_CAT7(node_id, _P_, pha, _NAME_, name, _VAL_, cell)
1458
1480#define DT_PHA_BY_NAME_OR(node_id, pha, name, cell, default_value) \
1481 DT_PROP_OR(node_id, DT_CAT5(pha, _NAME_, name, _VAL_, cell), default_value)
1482
1530#define DT_PHANDLE_BY_NAME(node_id, pha, name) \
1531 DT_CAT6(node_id, _P_, pha, _NAME_, name, _PH)
1532
1582#define DT_PHANDLE_BY_IDX(node_id, prop, idx) \
1583 DT_CAT6(node_id, _P_, prop, _IDX_, idx, _PH)
1584
1596#define DT_PHANDLE(node_id, prop) DT_PHANDLE_BY_IDX(node_id, prop, 0)
1597
1644#define DT_NUM_RANGES(node_id) DT_CAT(node_id, _RANGES_NUM)
1645
1698#define DT_RANGES_HAS_IDX(node_id, idx) \
1699 IS_ENABLED(DT_CAT4(node_id, _RANGES_IDX_, idx, _EXISTS))
1700
1753#define DT_RANGES_HAS_CHILD_BUS_FLAGS_AT_IDX(node_id, idx) \
1754 IS_ENABLED(DT_CAT4(node_id, _RANGES_IDX_, idx, _VAL_CHILD_BUS_FLAGS_EXISTS))
1755
1793#define DT_RANGES_CHILD_BUS_FLAGS_BY_IDX(node_id, idx) \
1794 DT_CAT4(node_id, _RANGES_IDX_, idx, _VAL_CHILD_BUS_FLAGS)
1795
1842#define DT_RANGES_CHILD_BUS_ADDRESS_BY_IDX(node_id, idx) \
1843 DT_CAT4(node_id, _RANGES_IDX_, idx, _VAL_CHILD_BUS_ADDRESS)
1844
1891#define DT_RANGES_PARENT_BUS_ADDRESS_BY_IDX(node_id, idx) \
1892 DT_CAT4(node_id, _RANGES_IDX_, idx, _VAL_PARENT_BUS_ADDRESS)
1893
1940#define DT_RANGES_LENGTH_BY_IDX(node_id, idx) \
1941 DT_CAT4(node_id, _RANGES_IDX_, idx, _VAL_LENGTH)
1942
1982#define DT_FOREACH_RANGE(node_id, fn) \
1983 DT_CAT(node_id, _FOREACH_RANGE)(fn)
1984
2030#define DT_NODE_VENDOR_BY_IDX(node_id, idx) \
2031 DT_CAT3(node_id, _COMPAT_VENDOR_IDX_, idx)
2032
2045#define DT_NODE_VENDOR_HAS_IDX(node_id, idx) \
2046 IS_ENABLED(DT_CAT4(node_id, _COMPAT_VENDOR_IDX_, idx, _EXISTS))
2047
2062#define DT_NODE_VENDOR_BY_IDX_OR(node_id, idx, default_value) \
2063 COND_CODE_1(DT_NODE_VENDOR_HAS_IDX(node_id, idx), \
2064 (DT_NODE_VENDOR_BY_IDX(node_id, idx)), (default_value))
2065
2074#define DT_NODE_VENDOR_OR(node_id, default_value) \
2075 DT_NODE_VENDOR_BY_IDX_OR(node_id, 0, default_value)
2076
2106#define DT_NODE_MODEL_BY_IDX(node_id, idx) \
2107 DT_CAT3(node_id, _COMPAT_MODEL_IDX_, idx)
2108
2121#define DT_NODE_MODEL_HAS_IDX(node_id, idx) \
2122 IS_ENABLED(DT_CAT4(node_id, _COMPAT_MODEL_IDX_, idx, _EXISTS))
2123
2138#define DT_NODE_MODEL_BY_IDX_OR(node_id, idx, default_value) \
2139 COND_CODE_1(DT_NODE_MODEL_HAS_IDX(node_id, idx), \
2140 (DT_NODE_MODEL_BY_IDX(node_id, idx)), (default_value))
2141
2150#define DT_NODE_MODEL_OR(node_id, default_value) \
2151 DT_NODE_MODEL_BY_IDX_OR(node_id, 0, default_value)
2152
2170#define DT_NUM_REGS(node_id) DT_CAT(node_id, _REG_NUM)
2171
2183#define DT_REG_HAS_IDX(node_id, idx) \
2184 IS_ENABLED(DT_CAT4(node_id, _REG_IDX_, idx, _EXISTS))
2185
2192#define DT_REG_ADDR_BY_IDX(node_id, idx) \
2193 DT_CAT4(node_id, _REG_IDX_, idx, _VAL_ADDRESS)
2194
2206#define DT_REG_SIZE_BY_IDX(node_id, idx) \
2207 DT_CAT4(node_id, _REG_IDX_, idx, _VAL_SIZE)
2208
2216#define DT_REG_ADDR(node_id) DT_REG_ADDR_BY_IDX(node_id, 0)
2217
2228#define DT_REG_ADDR_U64(node_id) DT_U64_C(DT_REG_ADDR(node_id))
2229
2237#define DT_REG_SIZE(node_id) DT_REG_SIZE_BY_IDX(node_id, 0)
2238
2245#define DT_REG_ADDR_BY_NAME(node_id, name) \
2246 DT_CAT4(node_id, _REG_NAME_, name, _VAL_ADDRESS)
2247
2260#define DT_REG_ADDR_BY_NAME_U64(node_id, name) \
2261 DT_U64_C(DT_REG_ADDR_BY_NAME(node_id, name))
2262
2269#define DT_REG_SIZE_BY_NAME(node_id, name) \
2270 DT_CAT4(node_id, _REG_NAME_, name, _VAL_SIZE)
2271
2290#define DT_NUM_IRQS(node_id) DT_CAT(node_id, _IRQ_NUM)
2291
2298#define DT_IRQ_LEVEL(node_id) DT_CAT(node_id, _IRQ_LEVEL)
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
2454#define DT_IRQ_INTC_BY_IDX(node_id, idx) \
2455 DT_CAT4(node_id, _IRQ_IDX_, idx, _CONTROLLER)
2456
2501#define DT_IRQ_INTC_BY_NAME(node_id, name) \
2502 DT_CAT4(node_id, _IRQ_NAME_, name, _CONTROLLER)
2503
2543#define DT_IRQ_INTC(node_id) \
2544 DT_IRQ_INTC_BY_IDX(node_id, 0)
2545
2550/* DT helper macro to encode a node's IRQN to level 1 according to the multi-level scheme */
2551#define DT_IRQN_L1_INTERNAL(node_id, idx) DT_IRQ_BY_IDX(node_id, idx, irq)
2552/* DT helper macro to encode a node's IRQN to level 2 according to the multi-level scheme */
2553#define DT_IRQN_L2_INTERNAL(node_id, idx) \
2554 (IRQ_TO_L2(DT_IRQN_L1_INTERNAL(node_id, idx)) | \
2555 DT_IRQ(DT_IRQ_INTC_BY_IDX(node_id, idx), irq))
2556/* DT helper macro to encode a node's IRQN to level 3 according to the multi-level scheme */
2557#define DT_IRQN_L3_INTERNAL(node_id, idx) \
2558 (IRQ_TO_L3(DT_IRQN_L1_INTERNAL(node_id, idx)) | \
2559 IRQ_TO_L2(DT_IRQ(DT_IRQ_INTC_BY_IDX(node_id, idx), irq)) | \
2560 DT_IRQ(DT_IRQ_INTC(DT_IRQ_INTC_BY_IDX(node_id, idx)), irq))
2561/* DT helper macro for the macros above */
2562#define DT_IRQN_LVL_INTERNAL(node_id, idx, level) DT_CAT3(DT_IRQN_L, level, _INTERNAL)(node_id, idx)
2563
2568#define DT_MULTI_LEVEL_IRQN_INTERNAL(node_id, idx) \
2569 DT_IRQN_LVL_INTERNAL(node_id, idx, DT_IRQ_LEVEL(node_id))
2570
2583#define DT_IRQN_BY_IDX(node_id, idx) \
2584 COND_CODE_1(IS_ENABLED(CONFIG_MULTI_LEVEL_INTERRUPTS), \
2585 (DT_MULTI_LEVEL_IRQN_INTERNAL(node_id, idx)), \
2586 (DT_IRQ_BY_IDX(node_id, idx, irq)))
2587
2598#define DT_IRQN(node_id) DT_IRQN_BY_IDX(node_id, 0)
2599
2618#define DT_CHOSEN(prop) DT_CAT(DT_CHOSEN_, prop)
2619
2626#define DT_HAS_CHOSEN(prop) IS_ENABLED(DT_CAT3(DT_CHOSEN_, prop, _EXISTS))
2627
2647#define DT_FOREACH_NODE(fn) DT_FOREACH_HELPER(fn)
2648
2661#define DT_FOREACH_NODE_VARGS(fn, ...) DT_FOREACH_VARGS_HELPER(fn, __VA_ARGS__)
2662
2674#define DT_FOREACH_STATUS_OKAY_NODE(fn) DT_FOREACH_OKAY_HELPER(fn)
2675
2690#define DT_FOREACH_STATUS_OKAY_NODE_VARGS(fn, ...) DT_FOREACH_OKAY_VARGS_HELPER(fn, __VA_ARGS__)
2691
2735#define DT_FOREACH_CHILD(node_id, fn) \
2736 DT_CAT(node_id, _FOREACH_CHILD)(fn)
2737
2778#define DT_FOREACH_CHILD_SEP(node_id, fn, sep) \
2779 DT_CAT(node_id, _FOREACH_CHILD_SEP)(fn, sep)
2780
2796#define DT_FOREACH_CHILD_VARGS(node_id, fn, ...) \
2797 DT_CAT(node_id, _FOREACH_CHILD_VARGS)(fn, __VA_ARGS__)
2798
2814#define DT_FOREACH_CHILD_SEP_VARGS(node_id, fn, sep, ...) \
2815 DT_CAT(node_id, _FOREACH_CHILD_SEP_VARGS)(fn, sep, __VA_ARGS__)
2816
2832#define DT_FOREACH_CHILD_STATUS_OKAY(node_id, fn) \
2833 DT_CAT(node_id, _FOREACH_CHILD_STATUS_OKAY)(fn)
2834
2851#define DT_FOREACH_CHILD_STATUS_OKAY_SEP(node_id, fn, sep) \
2852 DT_CAT(node_id, _FOREACH_CHILD_STATUS_OKAY_SEP)(fn, sep)
2853
2873#define DT_FOREACH_CHILD_STATUS_OKAY_VARGS(node_id, fn, ...) \
2874 DT_CAT(node_id, _FOREACH_CHILD_STATUS_OKAY_VARGS)(fn, __VA_ARGS__)
2875
2894#define DT_FOREACH_CHILD_STATUS_OKAY_SEP_VARGS(node_id, fn, sep, ...) \
2895 DT_CAT(node_id, _FOREACH_CHILD_STATUS_OKAY_SEP_VARGS)(fn, sep, __VA_ARGS__)
2896
2947#define DT_FOREACH_PROP_ELEM(node_id, prop, fn) \
2948 DT_CAT4(node_id, _P_, prop, _FOREACH_PROP_ELEM)(fn)
2949
2992#define DT_FOREACH_PROP_ELEM_SEP(node_id, prop, fn, sep) \
2993 DT_CAT4(node_id, _P_, prop, _FOREACH_PROP_ELEM_SEP)(fn, sep)
2994
3015#define DT_FOREACH_PROP_ELEM_VARGS(node_id, prop, fn, ...) \
3016 DT_CAT4(node_id, _P_, prop, _FOREACH_PROP_ELEM_VARGS)(fn, __VA_ARGS__)
3017
3034#define DT_FOREACH_PROP_ELEM_SEP_VARGS(node_id, prop, fn, sep, ...) \
3035 DT_CAT4(node_id, _P_, prop, _FOREACH_PROP_ELEM_SEP_VARGS)( \
3036 fn, sep, __VA_ARGS__)
3037
3091#define DT_FOREACH_STATUS_OKAY(compat, fn) \
3092 COND_CODE_1(DT_HAS_COMPAT_STATUS_OKAY(compat), \
3093 (DT_CAT(DT_FOREACH_OKAY_, compat)(fn)), \
3094 ())
3095
3140#define DT_FOREACH_STATUS_OKAY_VARGS(compat, fn, ...) \
3141 COND_CODE_1(DT_HAS_COMPAT_STATUS_OKAY(compat), \
3142 (DT_CAT(DT_FOREACH_OKAY_VARGS_, \
3143 compat)(fn, __VA_ARGS__)), \
3144 ())
3145
3170#define DT_NODE_EXISTS(node_id) IS_ENABLED(DT_CAT(node_id, _EXISTS))
3171
3193#define DT_NODE_HAS_STATUS(node_id, status) \
3194 DT_NODE_HAS_STATUS_INTERNAL(node_id, status)
3195
3215#define DT_HAS_COMPAT_STATUS_OKAY(compat) \
3216 IS_ENABLED(DT_CAT(DT_COMPAT_HAS_OKAY_, compat))
3217
3224#define DT_NUM_INST_STATUS_OKAY(compat) \
3225 UTIL_AND(DT_HAS_COMPAT_STATUS_OKAY(compat), \
3226 UTIL_CAT(DT_N_INST, DT_DASH(compat, NUM_OKAY)))
3227
3255#define DT_NODE_HAS_COMPAT(node_id, compat) \
3256 IS_ENABLED(DT_CAT3(node_id, _COMPAT_MATCHES_, compat))
3257
3272#define DT_NODE_HAS_COMPAT_STATUS(node_id, compat, status) \
3273 DT_NODE_HAS_COMPAT(node_id, compat) && DT_NODE_HAS_STATUS(node_id, status)
3274
3288#define DT_NODE_HAS_PROP(node_id, prop) \
3289 IS_ENABLED(DT_CAT4(node_id, _P_, prop, _EXISTS))
3290
3291
3308#define DT_PHA_HAS_CELL_AT_IDX(node_id, pha, idx, cell) \
3309 IS_ENABLED(DT_CAT8(node_id, _P_, pha, \
3310 _IDX_, idx, _VAL_, cell, _EXISTS))
3311
3321#define DT_PHA_HAS_CELL(node_id, pha, cell) \
3322 DT_PHA_HAS_CELL_AT_IDX(node_id, pha, 0, cell)
3323
3365#define DT_BUS(node_id) DT_CAT(node_id, _BUS)
3366
3395#define DT_ON_BUS(node_id, bus) IS_ENABLED(DT_CAT3(node_id, _BUS_, bus))
3396
3413#define DT_DRV_INST(inst) DT_INST(inst, DT_DRV_COMPAT)
3414
3422#define DT_INST_PARENT(inst) DT_PARENT(DT_DRV_INST(inst))
3423
3431#define DT_INST_GPARENT(inst) DT_GPARENT(DT_DRV_INST(inst))
3432
3442#define DT_INST_CHILD(inst, child) \
3443 DT_CHILD(DT_DRV_INST(inst), child)
3444
3459#define DT_INST_FOREACH_CHILD(inst, fn) \
3460 DT_FOREACH_CHILD(DT_DRV_INST(inst), fn)
3461
3475#define DT_INST_FOREACH_CHILD_SEP(inst, fn, sep) \
3476 DT_FOREACH_CHILD_SEP(DT_DRV_INST(inst), fn, sep)
3477
3493#define DT_INST_FOREACH_CHILD_VARGS(inst, fn, ...) \
3494 DT_FOREACH_CHILD_VARGS(DT_DRV_INST(inst), fn, __VA_ARGS__)
3495
3510#define DT_INST_FOREACH_CHILD_SEP_VARGS(inst, fn, sep, ...) \
3511 DT_FOREACH_CHILD_SEP_VARGS(DT_DRV_INST(inst), fn, sep, __VA_ARGS__)
3512
3524#define DT_INST_FOREACH_CHILD_STATUS_OKAY(inst, fn) \
3525 DT_FOREACH_CHILD_STATUS_OKAY(DT_DRV_INST(inst), fn)
3526
3541#define DT_INST_FOREACH_CHILD_STATUS_OKAY_SEP(inst, fn, sep) \
3542 DT_FOREACH_CHILD_STATUS_OKAY_SEP(DT_DRV_INST(inst), fn, sep)
3543
3557#define DT_INST_FOREACH_CHILD_STATUS_OKAY_VARGS(inst, fn, ...) \
3558 DT_FOREACH_CHILD_STATUS_OKAY_VARGS(DT_DRV_INST(inst), fn, __VA_ARGS__)
3559
3575#define DT_INST_FOREACH_CHILD_STATUS_OKAY_SEP_VARGS(inst, fn, sep, ...) \
3576 DT_FOREACH_CHILD_STATUS_OKAY_SEP_VARGS(DT_DRV_INST(inst), fn, sep, __VA_ARGS__)
3577
3584#define DT_INST_ENUM_IDX(inst, prop) \
3585 DT_ENUM_IDX(DT_DRV_INST(inst), prop)
3586
3595#define DT_INST_ENUM_IDX_OR(inst, prop, default_idx_value) \
3596 DT_ENUM_IDX_OR(DT_DRV_INST(inst), prop, default_idx_value)
3597
3606#define DT_INST_ENUM_HAS_VALUE(inst, prop, value) \
3607 DT_ENUM_HAS_VALUE(DT_DRV_INST(inst), prop, value)
3608
3615#define DT_INST_PROP(inst, prop) DT_PROP(DT_DRV_INST(inst), prop)
3616
3623#define DT_INST_PROP_LEN(inst, prop) DT_PROP_LEN(DT_DRV_INST(inst), prop)
3624
3634#define DT_INST_PROP_HAS_IDX(inst, prop, idx) \
3635 DT_PROP_HAS_IDX(DT_DRV_INST(inst), prop, idx)
3636
3645#define DT_INST_PROP_HAS_NAME(inst, prop, name) \
3646 DT_PROP_HAS_NAME(DT_DRV_INST(inst), prop, name)
3647
3655#define DT_INST_PROP_BY_IDX(inst, prop, idx) \
3656 DT_PROP_BY_IDX(DT_DRV_INST(inst), prop, idx)
3657
3665#define DT_INST_PROP_OR(inst, prop, default_value) \
3666 DT_PROP_OR(DT_DRV_INST(inst), prop, default_value)
3667
3675#define DT_INST_PROP_LEN_OR(inst, prop, default_value) \
3676 DT_PROP_LEN_OR(DT_DRV_INST(inst), prop, default_value)
3677
3687#define DT_INST_STRING_TOKEN(inst, prop) \
3688 DT_STRING_TOKEN(DT_DRV_INST(inst), prop)
3689
3697#define DT_INST_STRING_UPPER_TOKEN(inst, prop) \
3698 DT_STRING_UPPER_TOKEN(DT_DRV_INST(inst), prop)
3699
3708#define DT_INST_STRING_UNQUOTED(inst, prop) \
3709 DT_STRING_UNQUOTED(DT_DRV_INST(inst), prop)
3710
3718#define DT_INST_STRING_TOKEN_BY_IDX(inst, prop, idx) \
3719 DT_STRING_TOKEN_BY_IDX(DT_DRV_INST(inst), prop, idx)
3720
3728#define DT_INST_STRING_UPPER_TOKEN_BY_IDX(inst, prop, idx) \
3729 DT_STRING_UPPER_TOKEN_BY_IDX(DT_DRV_INST(inst), prop, idx)
3730
3738#define DT_INST_STRING_UNQUOTED_BY_IDX(inst, prop, idx) \
3739 DT_STRING_UNQUOTED_BY_IDX(DT_DRV_INST(inst), prop, idx)
3740
3749#define DT_INST_PROP_BY_PHANDLE(inst, ph, prop) \
3750 DT_INST_PROP_BY_PHANDLE_IDX(inst, ph, 0, prop)
3751
3763#define DT_INST_PROP_BY_PHANDLE_IDX(inst, phs, idx, prop) \
3764 DT_PROP_BY_PHANDLE_IDX(DT_DRV_INST(inst), phs, idx, prop)
3765
3774#define DT_INST_PHA_BY_IDX(inst, pha, idx, cell) \
3775 DT_PHA_BY_IDX(DT_DRV_INST(inst), pha, idx, cell)
3776
3786#define DT_INST_PHA_BY_IDX_OR(inst, pha, idx, cell, default_value) \
3787 DT_PHA_BY_IDX_OR(DT_DRV_INST(inst), pha, idx, cell, default_value)
3788
3797#define DT_INST_PHA(inst, pha, cell) DT_INST_PHA_BY_IDX(inst, pha, 0, cell)
3798
3807#define DT_INST_PHA_OR(inst, pha, cell, default_value) \
3808 DT_INST_PHA_BY_IDX_OR(inst, pha, 0, cell, default_value)
3809
3819#define DT_INST_PHA_BY_NAME(inst, pha, name, cell) \
3820 DT_PHA_BY_NAME(DT_DRV_INST(inst), pha, name, cell)
3821
3831#define DT_INST_PHA_BY_NAME_OR(inst, pha, name, cell, default_value) \
3832 DT_PHA_BY_NAME_OR(DT_DRV_INST(inst), pha, name, cell, default_value)
3833
3842#define DT_INST_PHANDLE_BY_NAME(inst, pha, name) \
3843 DT_PHANDLE_BY_NAME(DT_DRV_INST(inst), pha, name) \
3844
3854#define DT_INST_PHANDLE_BY_IDX(inst, prop, idx) \
3855 DT_PHANDLE_BY_IDX(DT_DRV_INST(inst), prop, idx)
3856
3865#define DT_INST_PHANDLE(inst, prop) DT_INST_PHANDLE_BY_IDX(inst, prop, 0)
3866
3874#define DT_INST_REG_HAS_IDX(inst, idx) DT_REG_HAS_IDX(DT_DRV_INST(inst), idx)
3875
3882#define DT_INST_REG_ADDR_BY_IDX(inst, idx) DT_REG_ADDR_BY_IDX(DT_DRV_INST(inst), idx)
3883
3890#define DT_INST_REG_SIZE_BY_IDX(inst, idx) \
3891 DT_REG_SIZE_BY_IDX(DT_DRV_INST(inst), idx)
3892
3899#define DT_INST_REG_ADDR_BY_NAME(inst, name) \
3900 DT_REG_ADDR_BY_NAME(DT_DRV_INST(inst), name)
3901
3914#define DT_INST_REG_ADDR_BY_NAME_U64(inst, name) \
3915 DT_U64_C(DT_INST_REG_ADDR_BY_NAME(inst, name))
3916
3923#define DT_INST_REG_SIZE_BY_NAME(inst, name) \
3924 DT_REG_SIZE_BY_NAME(DT_DRV_INST(inst), name)
3925
3931#define DT_INST_REG_ADDR(inst) DT_INST_REG_ADDR_BY_IDX(inst, 0)
3932
3944#define DT_INST_REG_ADDR_U64(inst) DT_U64_C(DT_INST_REG_ADDR(inst))
3945
3951#define DT_INST_REG_SIZE(inst) DT_INST_REG_SIZE_BY_IDX(inst, 0)
3952
3959#define DT_INST_IRQ_LEVEL(inst) DT_IRQ_LEVEL(DT_DRV_INST(inst))
3960
3968#define DT_INST_IRQ_BY_IDX(inst, idx, cell) \
3969 DT_IRQ_BY_IDX(DT_DRV_INST(inst), idx, cell)
3970
3977#define DT_INST_IRQ_INTC_BY_IDX(inst, idx) \
3978 DT_IRQ_INTC_BY_IDX(DT_DRV_INST(inst), idx)
3979
3986#define DT_INST_IRQ_INTC_BY_NAME(inst, name) \
3987 DT_IRQ_INTC_BY_NAME(DT_DRV_INST(inst), name)
3988
3996#define DT_INST_IRQ_INTC(inst) \
3997 DT_INST_IRQ_INTC_BY_IDX(inst, 0)
3998
4006#define DT_INST_IRQ_BY_NAME(inst, name, cell) \
4007 DT_IRQ_BY_NAME(DT_DRV_INST(inst), name, cell)
4008
4015#define DT_INST_IRQ(inst, cell) DT_INST_IRQ_BY_IDX(inst, 0, cell)
4016
4022#define DT_INST_IRQN(inst) DT_IRQN(DT_DRV_INST(inst))
4023
4030#define DT_INST_IRQN_BY_IDX(inst, idx) DT_IRQN_BY_IDX(DT_DRV_INST(inst), idx)
4031
4037#define DT_INST_BUS(inst) DT_BUS(DT_DRV_INST(inst))
4038
4046#define DT_INST_ON_BUS(inst, bus) DT_ON_BUS(DT_DRV_INST(inst), bus)
4047
4057#define DT_INST_STRING_TOKEN_OR(inst, name, default_value) \
4058 DT_STRING_TOKEN_OR(DT_DRV_INST(inst), name, default_value)
4059
4068#define DT_INST_STRING_UPPER_TOKEN_OR(inst, name, default_value) \
4069 DT_STRING_UPPER_TOKEN_OR(DT_DRV_INST(inst), name, default_value)
4070
4079#define DT_INST_STRING_UNQUOTED_OR(inst, name, default_value) \
4080 DT_STRING_UNQUOTED_OR(DT_DRV_INST(inst), name, default_value)
4081
4082/*
4083 * @brief Test if any enabled node with the given compatible is on
4084 * the given bus type
4085 *
4086 * This is like DT_ANY_INST_ON_BUS_STATUS_OKAY(), except it can also
4087 * be useful for handling multiple compatibles in single source file.
4088 *
4089 * Example devicetree overlay:
4090 *
4091 * @code{.dts}
4092 * &i2c0 {
4093 * temp: temperature-sensor@76 {
4094 * compatible = "vnd,some-sensor";
4095 * reg = <0x76>;
4096 * };
4097 * };
4098 * @endcode
4099 *
4100 * Example usage, assuming `i2c0` is an I2C bus controller node, and
4101 * therefore `temp` is on an I2C bus:
4102 *
4103 * @code{.c}
4104 * DT_HAS_COMPAT_ON_BUS_STATUS_OKAY(vnd_some_sensor, i2c) // 1
4105 * @endcode
4106 *
4107 * @param compat lowercase-and-underscores compatible, without quotes
4108 * @param bus a binding's bus type as a C token, lowercased and without quotes
4109 * @return 1 if any enabled node with that compatible is on that bus type,
4110 * 0 otherwise
4111 */
4112#define DT_HAS_COMPAT_ON_BUS_STATUS_OKAY(compat, bus) \
4113 IS_ENABLED(DT_CAT4(DT_COMPAT_, compat, _BUS_, bus))
4114
4147#define DT_ANY_INST_ON_BUS_STATUS_OKAY(bus) \
4148 DT_HAS_COMPAT_ON_BUS_STATUS_OKAY(DT_DRV_COMPAT, bus)
4149
4194#define DT_ANY_INST_HAS_PROP_STATUS_OKAY(prop) \
4195 COND_CODE_1(IS_EMPTY(DT_ANY_INST_HAS_PROP_STATUS_OKAY_(prop)), (0), (1))
4196
4262#define DT_INST_FOREACH_STATUS_OKAY(fn) \
4263 COND_CODE_1(DT_HAS_COMPAT_STATUS_OKAY(DT_DRV_COMPAT), \
4264 (UTIL_CAT(DT_FOREACH_OKAY_INST_, \
4265 DT_DRV_COMPAT)(fn)), \
4266 ())
4267
4279#define DT_INST_FOREACH_STATUS_OKAY_VARGS(fn, ...) \
4280 COND_CODE_1(DT_HAS_COMPAT_STATUS_OKAY(DT_DRV_COMPAT), \
4281 (UTIL_CAT(DT_FOREACH_OKAY_INST_VARGS_, \
4282 DT_DRV_COMPAT)(fn, __VA_ARGS__)), \
4283 ())
4284
4295#define DT_INST_FOREACH_PROP_ELEM(inst, prop, fn) \
4296 DT_FOREACH_PROP_ELEM(DT_DRV_INST(inst), prop, fn)
4297
4310#define DT_INST_FOREACH_PROP_ELEM_SEP(inst, prop, fn, sep) \
4311 DT_FOREACH_PROP_ELEM_SEP(DT_DRV_INST(inst), prop, fn, sep)
4312
4327#define DT_INST_FOREACH_PROP_ELEM_VARGS(inst, prop, fn, ...) \
4328 DT_FOREACH_PROP_ELEM_VARGS(DT_DRV_INST(inst), prop, fn, __VA_ARGS__)
4329
4347#define DT_INST_FOREACH_PROP_ELEM_SEP_VARGS(inst, prop, fn, sep, ...) \
4348 DT_FOREACH_PROP_ELEM_SEP_VARGS(DT_DRV_INST(inst), prop, fn, sep, \
4349 __VA_ARGS__)
4350
4357#define DT_INST_NODE_HAS_PROP(inst, prop) \
4358 DT_NODE_HAS_PROP(DT_DRV_INST(inst), prop)
4359
4370#define DT_INST_PHA_HAS_CELL_AT_IDX(inst, pha, idx, cell) \
4371 DT_PHA_HAS_CELL_AT_IDX(DT_DRV_INST(inst), pha, idx, cell)
4372
4382#define DT_INST_PHA_HAS_CELL(inst, pha, cell) \
4383 DT_INST_PHA_HAS_CELL_AT_IDX(inst, pha, 0, cell)
4384
4392#define DT_INST_IRQ_HAS_IDX(inst, idx) DT_IRQ_HAS_IDX(DT_DRV_INST(inst), idx)
4393
4402#define DT_INST_IRQ_HAS_CELL_AT_IDX(inst, idx, cell) \
4403 DT_IRQ_HAS_CELL_AT_IDX(DT_DRV_INST(inst), idx, cell)
4404
4412#define DT_INST_IRQ_HAS_CELL(inst, cell) \
4413 DT_INST_IRQ_HAS_CELL_AT_IDX(inst, 0, cell)
4414
4421#define DT_INST_IRQ_HAS_NAME(inst, name) \
4422 DT_IRQ_HAS_NAME(DT_DRV_INST(inst), name)
4423
4441#define DT_ANY_INST_HAS_PROP_STATUS_OKAY__(idx, prop) \
4442 COND_CODE_1(DT_INST_NODE_HAS_PROP(idx, prop), (1,), ())
4455#define DT_ANY_INST_HAS_PROP_STATUS_OKAY_(prop) \
4456 DT_INST_FOREACH_STATUS_OKAY_VARGS(DT_ANY_INST_HAS_PROP_STATUS_OKAY__, prop)
4457
4458#define DT_PATH_INTERNAL(...) \
4459 UTIL_CAT(DT_ROOT, MACRO_MAP_CAT(DT_S_PREFIX, __VA_ARGS__))
4465#define DT_S_PREFIX(name) _S_##name
4466
4481#define DT_CAT(a1, a2) a1 ## a2
4483#define DT_CAT3(a1, a2, a3) a1 ## a2 ## a3
4485#define DT_CAT4(a1, a2, a3, a4) a1 ## a2 ## a3 ## a4
4487#define DT_CAT5(a1, a2, a3, a4, a5) a1 ## a2 ## a3 ## a4 ## a5
4489#define DT_CAT6(a1, a2, a3, a4, a5, a6) a1 ## a2 ## a3 ## a4 ## a5 ## a6
4491#define DT_CAT7(a1, a2, a3, a4, a5, a6, a7) \
4492 a1 ## a2 ## a3 ## a4 ## a5 ## a6 ## a7
4494#define DT_CAT8(a1, a2, a3, a4, a5, a6, a7, a8) \
4495 a1 ## a2 ## a3 ## a4 ## a5 ## a6 ## a7 ## a8
4496/*
4497 * If you need to define a bigger DT_CATN(), do so here. Don't leave
4498 * any "holes" of undefined macros, please.
4499 */
4500
4502#define DT_DASH(...) MACRO_MAP_CAT(DT_DASH_PREFIX, __VA_ARGS__)
4504#define DT_DASH_PREFIX(name) _##name
4506#define DT_NODE_HAS_STATUS_INTERNAL(node_id, status) \
4507 IS_ENABLED(DT_CAT3(node_id, _STATUS_, status))
4508
4510#define DT_INST_NODE_HAS_PROP_AND_OR(inst, prop) \
4511 DT_INST_NODE_HAS_PROP(inst, prop) ||
4512
4517#if defined(_LINKER) || defined(_ASMLANGUAGE)
4518#define DT_U64_C(_v) (_v)
4519#else
4520#define DT_U64_C(_v) UINT64_C(_v)
4521#endif
4522
4525/* have these last so they have access to all previously defined macros */
4528#include <zephyr/devicetree/gpio.h>
4529#include <zephyr/devicetree/spi.h>
4530#include <zephyr/devicetree/dma.h>
4531#include <zephyr/devicetree/pwms.h>
4535#include <zephyr/devicetree/can.h>
4537#include <zephyr/devicetree/mbox.h>
4538
4539#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.
Public interface for multi-level interrupts.
Devicetree node dependency ordinals.
PWMs Devicetree macro public API header file.
Misc utilities.