1 /*
2  * Copyright (c) 2020 Nordic Semiconductor ASA
3  *
4  * SPDX-License-Identifier: Apache-2.0
5  */
6 
7 #include <zephyr/ztest.h>
8 #include <zephyr/devicetree.h>
9 #include <zephyr/device.h>
10 #include <zephyr/drivers/gpio.h>
11 
12 #include <stdlib.h>
13 
14 #define TEST_CHILDREN	DT_PATH(test, test_children)
15 #define TEST_DEADBEEF	DT_PATH(test, gpio_deadbeef)
16 #define TEST_ABCD1234	DT_PATH(test, gpio_abcd1234)
17 #define TEST_ALIAS	DT_ALIAS(test_alias)
18 #define TEST_NODELABEL	DT_NODELABEL(test_nodelabel)
19 #define TEST_INST	DT_INST(0, vnd_gpio_device)
20 #define TEST_ARRAYS	DT_NODELABEL(test_arrays)
21 #define TEST_PH	DT_NODELABEL(test_phandles)
22 #define TEST_INTC	DT_NODELABEL(test_intc)
23 #define TEST_IRQ	DT_NODELABEL(test_irq)
24 #define TEST_IRQ_EXT	DT_NODELABEL(test_irq_extended)
25 #define TEST_TEMP	DT_NODELABEL(test_temp_sensor)
26 #define TEST_REG	DT_NODELABEL(test_reg)
27 #define TEST_VENDOR	DT_NODELABEL(test_vendor)
28 #define TEST_MODEL	DT_NODELABEL(test_vendor)
29 #define TEST_ENUM_0	DT_NODELABEL(test_enum_0)
30 #define TEST_64BIT	DT_NODELABEL(test_reg_64)
31 #define TEST_INTC	DT_NODELABEL(test_intc)
32 
33 #define TEST_I2C DT_NODELABEL(test_i2c)
34 #define TEST_I2C_DEV DT_PATH(test, i2c_11112222, test_i2c_dev_10)
35 #define TEST_I2C_BUS DT_BUS(TEST_I2C_DEV)
36 
37 #define TEST_I2C_MUX DT_NODELABEL(test_i2c_mux)
38 #define TEST_I2C_MUX_CTLR_1 DT_CHILD(TEST_I2C_MUX, i2c_mux_ctlr_1)
39 #define TEST_I2C_MUX_CTLR_2 DT_CHILD(TEST_I2C_MUX, i2c_mux_ctlr_2)
40 #define TEST_MUXED_I2C_DEV_1 DT_NODELABEL(test_muxed_i2c_dev_1)
41 #define TEST_MUXED_I2C_DEV_2 DT_NODELABEL(test_muxed_i2c_dev_2)
42 
43 #define TEST_I3C DT_NODELABEL(test_i3c)
44 #define TEST_I3C_DEV DT_PATH(test, i3c_88889999, test_i3c_dev_420000abcd12345678)
45 #define TEST_I3C_BUS DT_BUS(TEST_I3C_DEV)
46 
47 #define TEST_GPIO_1 DT_NODELABEL(test_gpio_1)
48 #define TEST_GPIO_2 DT_NODELABEL(test_gpio_2)
49 #define TEST_GPIO_4 DT_NODELABEL(test_gpio_4)
50 
51 #define TEST_GPIO_HOG_1 DT_PATH(test, gpio_deadbeef, test_gpio_hog_1)
52 #define TEST_GPIO_HOG_2 DT_PATH(test, gpio_deadbeef, test_gpio_hog_2)
53 #define TEST_GPIO_HOG_3 DT_PATH(test, gpio_abcd1234, test_gpio_hog_3)
54 
55 #define TEST_SPI DT_NODELABEL(test_spi)
56 
57 #define TEST_SPI_DEV_0 DT_PATH(test, spi_33334444, test_spi_dev_0)
58 #define TEST_SPI_BUS_0 DT_BUS(TEST_SPI_DEV_0)
59 
60 #define TEST_SPI_DEV_1 DT_PATH(test, spi_33334444, test_spi_dev_1)
61 #define TEST_SPI_BUS_1 DT_BUS(TEST_SPI_DEV_1)
62 
63 #define TEST_SPI_NO_CS DT_NODELABEL(test_spi_no_cs)
64 #define TEST_SPI_DEV_NO_CS DT_NODELABEL(test_spi_no_cs)
65 
66 #define TEST_PWM_CTLR_1 DT_NODELABEL(test_pwm1)
67 #define TEST_PWM_CTLR_2 DT_NODELABEL(test_pwm2)
68 
69 #define TEST_CAN_CTRL_0 DT_NODELABEL(test_can0)
70 #define TEST_CAN_CTRL_1 DT_NODELABEL(test_can1)
71 #define TEST_CAN_CTRL_2 DT_NODELABEL(test_can2)
72 #define TEST_CAN_CTRL_3 DT_NODELABEL(test_can3)
73 
74 #define TEST_DMA_CTLR_1 DT_NODELABEL(test_dma1)
75 #define TEST_DMA_CTLR_2 DT_NODELABEL(test_dma2)
76 
77 #define TEST_VIDEO2           DT_NODELABEL(test_video2)
78 #define TEST_VIDEO2_PORT0     DT_NODELABEL(test_video2_port0)
79 #define TEST_VIDEO2_PORT0_IN0 DT_NODELABEL(test_video2_port0_in0)
80 #define TEST_VIDEO2_PORT0_IN1 DT_NODELABEL(test_video2_port0_in1)
81 #define TEST_VIDEO2_PORT1     DT_NODELABEL(test_video2_port1)
82 #define TEST_VIDEO2_PORT1_IN  DT_NODELABEL(test_video2_port1_in)
83 #define TEST_VIDEO0           DT_NODELABEL(test_video0)
84 #define TEST_VIDEO0_OUT       DT_NODELABEL(test_video0_out)
85 #define TEST_VIDEO0_PORT      DT_NODELABEL(test_video0_port)
86 #define TEST_VIDEO1           DT_NODELABEL(test_video1)
87 #define TEST_VIDEO1_OUT0      DT_NODELABEL(test_video1_out0)
88 #define TEST_VIDEO1_OUT1      DT_NODELABEL(test_video1_out1)
89 #define TEST_VIDEO1_PORT      DT_NODELABEL(test_video1_port)
90 
91 #define TEST_IO_CHANNEL_CTLR_1 DT_NODELABEL(test_adc_1)
92 #define TEST_IO_CHANNEL_CTLR_2 DT_NODELABEL(test_adc_2)
93 
94 #define TEST_RANGES_PCIE  DT_NODELABEL(test_ranges_pcie)
95 #define TEST_RANGES_OTHER DT_NODELABEL(test_ranges_other)
96 #define TEST_RANGES_EMPTY DT_NODELABEL(test_ranges_empty)
97 
98 #define TEST_MTD_0 DT_PATH(test, test_mtd_ffeeddcc)
99 #define TEST_MTD_1 DT_PATH(test, test_mtd_33221100)
100 
101 #define TEST_MEM_0 DT_CHILD(TEST_MTD_0, flash_20000000)
102 
103 #define TEST_PARTITION_0 DT_PATH(test, test_mtd_ffeeddcc, flash_20000000, partitions, partition_0)
104 #define TEST_PARTITION_1 DT_PATH(test, test_mtd_ffeeddcc, flash_20000000, partitions, partition_c0)
105 #define TEST_PARTITION_2 DT_PATH(test, test_mtd_33221100, partitions, partition_6ff80)
106 
107 #define ZEPHYR_USER DT_PATH(zephyr_user)
108 
109 #define TA_HAS_COMPAT(compat) DT_NODE_HAS_COMPAT(TEST_ARRAYS, compat)
110 
111 #define TO_STRING(x) TO_STRING_(x)
112 #define TO_STRING_(x) #x
113 
ZTEST(devicetree_api,test_path_props)114 ZTEST(devicetree_api, test_path_props)
115 {
116 	zassert_equal(DT_NUM_REGS(TEST_DEADBEEF), 1, "");
117 	zassert_equal(DT_REG_ADDR(TEST_DEADBEEF), 0xdeadbeef, "");
118 	zassert_equal(DT_REG_SIZE(TEST_DEADBEEF), 0x1000, "");
119 	zassert_equal(DT_PROP(TEST_DEADBEEF, gpio_controller), 1, "");
120 	zassert_equal(DT_PROP(TEST_DEADBEEF, ngpios), 100, "");
121 	zassert_true(!strcmp(DT_PROP(TEST_DEADBEEF, status), "okay"), "");
122 	zassert_equal(DT_PROP_LEN(TEST_DEADBEEF, compatible), 1, "");
123 	zassert_true(!strcmp(DT_PROP_BY_IDX(TEST_DEADBEEF, compatible, 0),
124 			     "vnd,gpio-device"), "");
125 	zassert_true(!strcmp(DT_PROP_LAST(TEST_DEADBEEF, compatible), "vnd,gpio-device"), "");
126 	zassert_true(DT_NODE_HAS_PROP(TEST_DEADBEEF, status), "");
127 	zassert_false(DT_NODE_HAS_PROP(TEST_DEADBEEF, foobar), "");
128 
129 	zassert_true(DT_SAME_NODE(TEST_ABCD1234, TEST_GPIO_2), "");
130 	zassert_equal(DT_NUM_REGS(TEST_ABCD1234), 2, "");
131 	zassert_equal(DT_PROP(TEST_ABCD1234, gpio_controller), 1, "");
132 	zassert_equal(DT_PROP(TEST_ABCD1234, ngpios), 200, "");
133 	zassert_true(!strcmp(DT_PROP(TEST_ABCD1234, status), "okay"), "");
134 	zassert_equal(DT_PROP_LEN(TEST_ABCD1234, compatible), 1, "");
135 	zassert_equal(DT_PROP_LEN_OR(TEST_ABCD1234, compatible, 4), 1, "");
136 	zassert_equal(DT_PROP_LEN_OR(TEST_ABCD1234, invalid_property, 0), 0, "");
137 	zassert_true(!strcmp(DT_PROP_BY_IDX(TEST_ABCD1234, compatible, 0),
138 			     "vnd,gpio-device"), "");
139 }
140 
ZTEST(devicetree_api,test_alias_props)141 ZTEST(devicetree_api, test_alias_props)
142 {
143 	zassert_equal(DT_HAS_ALIAS(test_alias), 1, "");
144 	zassert_equal(DT_HAS_ALIAS(test_alias_none), 0, "");
145 	zassert_equal(DT_NUM_REGS(TEST_ALIAS), 1, "");
146 	zassert_equal(DT_REG_ADDR(TEST_ALIAS), 0xdeadbeef, "");
147 	zassert_equal(DT_REG_SIZE(TEST_ALIAS), 0x1000, "");
148 	zassert_true(DT_SAME_NODE(TEST_ALIAS, TEST_GPIO_1), "");
149 	zassert_equal(DT_PROP(TEST_ALIAS, gpio_controller), 1, "");
150 	zassert_equal(DT_PROP(TEST_ALIAS, ngpios), 100, "");
151 	zassert_true(!strcmp(DT_PROP(TEST_ALIAS, status), "okay"), "");
152 	zassert_equal(DT_PROP_LEN(TEST_ALIAS, compatible), 1, "");
153 	zassert_true(!strcmp(DT_PROP_BY_IDX(TEST_ALIAS, compatible, 0),
154 			     "vnd,gpio-device"), "");
155 }
156 
ZTEST(devicetree_api,test_nodelabel_props)157 ZTEST(devicetree_api, test_nodelabel_props)
158 {
159 	zassert_equal(DT_NUM_REGS(TEST_NODELABEL), 1, "");
160 	zassert_equal(DT_REG_ADDR(TEST_NODELABEL), 0xdeadbeef, "");
161 	zassert_equal(DT_REG_SIZE(TEST_NODELABEL), 0x1000, "");
162 	zassert_equal(DT_PROP(TEST_NODELABEL, gpio_controller), 1, "");
163 	zassert_equal(DT_PROP(TEST_NODELABEL, ngpios), 100, "");
164 	zassert_true(!strcmp(DT_PROP(TEST_NODELABEL, status), "okay"), "");
165 	zassert_equal(DT_PROP_LEN(TEST_NODELABEL, compatible), 1, "");
166 	zassert_true(!strcmp(DT_PROP_BY_IDX(TEST_NODELABEL, compatible, 0),
167 			     "vnd,gpio-device"), "");
168 	zassert_equal(DT_PROP_LEN(TEST_ENUM_0, val), 1, "");
169 }
170 
171 #undef DT_DRV_COMPAT
172 #define DT_DRV_COMPAT vnd_gpio_device
ZTEST(devicetree_api,test_inst_props)173 ZTEST(devicetree_api, test_inst_props)
174 {
175 	/*
176 	 * Careful:
177 	 *
178 	 * We can only test properties that are shared across all
179 	 * instances of this compatible here. This includes instances
180 	 * with status "disabled".
181 	 */
182 
183 	zassert_equal(DT_PROP(TEST_INST, gpio_controller), 1, "");
184 	zassert_true(!strcmp(DT_PROP(TEST_INST, status), "okay") ||
185 		     !strcmp(DT_PROP(TEST_INST, status), "disabled"), "");
186 	zassert_equal(DT_PROP_LEN(TEST_INST, compatible), 1, "");
187 	zassert_true(!strcmp(DT_PROP_BY_IDX(TEST_INST, compatible, 0),
188 			     "vnd,gpio-device"), "");
189 
190 	zassert_equal(DT_INST_NODE_HAS_PROP(0, gpio_controller), 1, "");
191 	zassert_equal(DT_INST_PROP(0, gpio_controller), 1, "");
192 	zassert_equal(DT_INST_NODE_HAS_PROP(0, xxxx), 0, "");
193 	zassert_true(!strcmp(DT_INST_PROP(0, status), "okay") ||
194 		     !strcmp(DT_PROP(TEST_INST, status), "disabled"), "");
195 	zassert_equal(DT_INST_PROP_LEN(0, compatible), 1, "");
196 	zassert_true(!strcmp(DT_INST_PROP_BY_IDX(0, compatible, 0),
197 			     "vnd,gpio-device"), "");
198 }
199 
200 #undef DT_DRV_COMPAT
201 #define DT_DRV_COMPAT vnd_device_with_props
ZTEST(devicetree_api,test_any_inst_prop)202 ZTEST(devicetree_api, test_any_inst_prop)
203 {
204 	zassert_equal(DT_ANY_INST_HAS_PROP_STATUS_OKAY(foo), 1, "");
205 	zassert_equal(DT_ANY_INST_HAS_PROP_STATUS_OKAY(bar), 1, "");
206 	zassert_equal(DT_ANY_INST_HAS_PROP_STATUS_OKAY(baz), 0, "");
207 	zassert_equal(DT_ANY_INST_HAS_PROP_STATUS_OKAY(does_not_exist), 0, "");
208 
209 	zassert_equal(COND_CODE_1(DT_ANY_INST_HAS_PROP_STATUS_OKAY(foo),
210 				  (5), (6)),
211 		      5, "");
212 	zassert_equal(COND_CODE_0(DT_ANY_INST_HAS_PROP_STATUS_OKAY(foo),
213 				  (5), (6)),
214 		      6, "");
215 	zassert_equal(COND_CODE_1(DT_ANY_INST_HAS_PROP_STATUS_OKAY(baz),
216 				  (5), (6)),
217 		      6, "");
218 	zassert_equal(COND_CODE_0(DT_ANY_INST_HAS_PROP_STATUS_OKAY(baz),
219 				  (5), (6)),
220 		      5, "");
221 	zassert_true(IS_ENABLED(DT_ANY_INST_HAS_PROP_STATUS_OKAY(foo)), "");
222 	zassert_true(!IS_ENABLED(DT_ANY_INST_HAS_PROP_STATUS_OKAY(baz)), "");
223 	zassert_equal(IF_ENABLED(DT_ANY_INST_HAS_PROP_STATUS_OKAY(foo), (1)) + 1,
224 		      2, "");
225 	zassert_equal(IF_ENABLED(DT_ANY_INST_HAS_PROP_STATUS_OKAY(baz), (1)) + 1,
226 		      1, "");
227 }
228 
229 #undef DT_DRV_COMPAT
ZTEST(devicetree_api,test_any_compat_inst_prop)230 ZTEST(devicetree_api, test_any_compat_inst_prop)
231 {
232 	zassert_equal(DT_ANY_COMPAT_HAS_PROP_STATUS_OKAY(vnd_device_with_props, foo), 1, "");
233 	zassert_equal(DT_ANY_COMPAT_HAS_PROP_STATUS_OKAY(vnd_device_with_props, bar), 1, "");
234 	zassert_equal(DT_ANY_COMPAT_HAS_PROP_STATUS_OKAY(vnd_device_with_props, baz), 0, "");
235 	zassert_equal(DT_ANY_COMPAT_HAS_PROP_STATUS_OKAY(vnd_device_with_props, does_not_exist),
236 		      0, "");
237 }
238 
239 #undef DT_DRV_COMPAT
240 #define DT_DRV_COMPAT vnd_device_with_props
ZTEST(devicetree_api,test_any_inst_bool)241 ZTEST(devicetree_api, test_any_inst_bool)
242 {
243 	zassert_equal(DT_ANY_INST_HAS_BOOL_STATUS_OKAY(bool_foo), 1, "");
244 	zassert_equal(DT_ANY_INST_HAS_BOOL_STATUS_OKAY(bool_bar), 1, "");
245 	zassert_equal(DT_ANY_INST_HAS_BOOL_STATUS_OKAY(bool_baz), 0, "");
246 	zassert_equal(DT_ANY_INST_HAS_BOOL_STATUS_OKAY(does_not_exist), 0, "");
247 
248 	zassert_equal(COND_CODE_1(DT_ANY_INST_HAS_BOOL_STATUS_OKAY(bool_foo),
249 				  (5), (6)),
250 		      5, "");
251 	zassert_equal(COND_CODE_0(DT_ANY_INST_HAS_BOOL_STATUS_OKAY(bool_foo),
252 				  (5), (6)),
253 		      6, "");
254 	zassert_equal(COND_CODE_1(DT_ANY_INST_HAS_BOOL_STATUS_OKAY(bool_baz),
255 				  (5), (6)),
256 		      6, "");
257 	zassert_equal(COND_CODE_0(DT_ANY_INST_HAS_BOOL_STATUS_OKAY(bool_baz),
258 				  (5), (6)),
259 		      5, "");
260 	zassert_true(IS_ENABLED(DT_ANY_INST_HAS_BOOL_STATUS_OKAY(bool_foo)), "");
261 	zassert_true(!IS_ENABLED(DT_ANY_INST_HAS_BOOL_STATUS_OKAY(bool_baz)), "");
262 	zassert_equal(IF_ENABLED(DT_ANY_INST_HAS_BOOL_STATUS_OKAY(bool_foo), (1)) + 1,
263 		      2, "");
264 	zassert_equal(IF_ENABLED(DT_ANY_INST_HAS_BOOL_STATUS_OKAY(bool_baz), (1)) + 1,
265 		      1, "");
266 }
267 
ZTEST(devicetree_api,test_default_prop_access)268 ZTEST(devicetree_api, test_default_prop_access)
269 {
270 	/*
271 	 * The APIs guarantee that the default_value is not expanded
272 	 * if the relevant property or cell is defined. This "X" macro
273 	 * is meant as poison which causes (hopefully) easy to
274 	 * understand build errors if this guarantee is not met due to
275 	 * a regression.
276 	 */
277 #undef X
278 #define X do.not.expand.this.argument
279 
280 	/* Node identifier variants. */
281 	zassert_equal(DT_PROP_OR(TEST_REG, misc_prop, X), 1234, "");
282 	zassert_equal(DT_PROP_OR(TEST_REG, not_a_property, -1), -1, "");
283 
284 	zassert_equal(DT_PHA_BY_IDX_OR(TEST_TEMP, dmas, 1, channel, X), 3, "");
285 	zassert_equal(DT_PHA_BY_IDX_OR(TEST_TEMP, dmas, 1, not_a_cell, -1), -1,
286 		      "");
287 
288 	zassert_equal(DT_PHA_OR(TEST_TEMP, dmas, channel, X), 1, "");
289 	zassert_equal(DT_PHA_OR(TEST_TEMP, dmas, not_a_cell, -1), -1, "");
290 
291 	zassert_equal(DT_PHA_BY_NAME_OR(TEST_TEMP, dmas, tx, channel, X), 1,
292 		      "");
293 	zassert_equal(DT_PHA_BY_NAME_OR(TEST_TEMP, dmas, tx, not_a_cell, -1),
294 		      -1, "");
295 
296 	/* Instance number variants. */
297 #undef DT_DRV_COMPAT
298 #define DT_DRV_COMPAT vnd_reg_holder
299 	zassert_equal(DT_INST_PROP_OR(0, misc_prop, X), 1234, "");
300 	zassert_equal(DT_INST_PROP_OR(0, not_a_property, -1), -1, "");
301 
302 #undef DT_DRV_COMPAT
303 #define DT_DRV_COMPAT vnd_array_holder
304 	zassert_equal(DT_INST_PROP_LEN_OR(0, a, X), 3, "");
305 	zassert_equal(DT_INST_PROP_LEN_OR(0, not_a_property, -1), -1, "");
306 
307 #undef DT_DRV_COMPAT
308 #define DT_DRV_COMPAT vnd_adc_temp_sensor
309 	zassert_equal(DT_INST_PHA_BY_IDX_OR(0, dmas, 1, channel, X), 3, "");
310 	zassert_equal(DT_INST_PHA_BY_IDX_OR(0, dmas, 1, not_a_cell, -1), -1,
311 		      "");
312 
313 	zassert_equal(DT_INST_PHA_OR(0, dmas, channel, X), 1, "");
314 	zassert_equal(DT_INST_PHA_OR(0, dmas, not_a_cell, -1), -1, "");
315 
316 	zassert_equal(DT_INST_PHA_BY_NAME_OR(0, dmas, tx, channel, X), 1,
317 		      "");
318 	zassert_equal(DT_INST_PHA_BY_NAME_OR(0, dmas, tx, not_a_cell, -1), -1,
319 		      "");
320 
321 #undef X
322 }
323 
ZTEST(devicetree_api,test_has_path)324 ZTEST(devicetree_api, test_has_path)
325 {
326 	zassert_equal(DT_NODE_HAS_STATUS(DT_PATH(test, gpio_0), okay), 0, "");
327 	zassert_equal(DT_NODE_HAS_STATUS(DT_PATH(test, gpio_deadbeef), okay), 1,
328 		      "");
329 	zassert_equal(DT_NODE_HAS_STATUS(DT_PATH(test, gpio_abcd1234), okay), 1,
330 		      "");
331 }
332 
ZTEST(devicetree_api,test_has_alias)333 ZTEST(devicetree_api, test_has_alias)
334 {
335 	zassert_equal(DT_NODE_HAS_STATUS(DT_ALIAS(test_alias), okay), 1, "");
336 	zassert_equal(DT_NODE_HAS_STATUS(DT_ALIAS(test_undef), okay), 0, "");
337 }
338 
ZTEST(devicetree_api,test_node_hashes)339 ZTEST(devicetree_api, test_node_hashes)
340 {
341 	zassert_str_equal(TO_STRING(DT_NODE_HASH(DT_ROOT)),
342 			  "il7asoJjJEMhngUeSt4tHVu8Zxx4EFG_FDeJfL3_oPE");
343 	zassert_str_equal(TO_STRING(DT_NODE_HASH(TEST_DEADBEEF)),
344 			  "kPPqtBX5DX_QDQMO0_cOls2ebJMevAWHhAPY1JCKTyU");
345 	zassert_str_equal(TO_STRING(DT_NODE_HASH(TEST_ABCD1234)),
346 			  "Bk4fvF6o3Mgslz_xiIZaJcuwo6_IeelozwOaxtUsSos");
347 }
348 
ZTEST(devicetree_api,test_inst_checks)349 ZTEST(devicetree_api, test_inst_checks)
350 {
351 	zassert_equal(DT_NODE_EXISTS(DT_INST(0, vnd_gpio_device)), 1, "");
352 	zassert_equal(DT_NODE_EXISTS(DT_INST(1, vnd_gpio_device)), 1, "");
353 	zassert_equal(DT_NODE_EXISTS(DT_INST(2, vnd_gpio_device)), 1, "");
354 
355 	zassert_equal(DT_NUM_INST_STATUS_OKAY(vnd_gpio_device), 2, "");
356 	zassert_equal(DT_NUM_INST_STATUS_OKAY(xxxx), 0, "");
357 }
358 
ZTEST(devicetree_api,test_has_nodelabel)359 ZTEST(devicetree_api, test_has_nodelabel)
360 {
361 	zassert_equal(DT_NODE_HAS_STATUS(DT_NODELABEL(disabled_gpio), okay), 0,
362 		      "");
363 	zassert_equal(DT_NODE_HAS_STATUS(DT_NODELABEL(test_nodelabel), okay), 1,
364 		      "");
365 	zassert_equal(DT_NODE_HAS_STATUS(DT_NODELABEL(test_nodelabel_allcaps),
366 					 okay),
367 		      1, "");
368 }
369 
ZTEST(devicetree_api,test_has_compat)370 ZTEST(devicetree_api, test_has_compat)
371 {
372 	unsigned int compats;
373 
374 	zassert_true(DT_HAS_COMPAT_STATUS_OKAY(vnd_gpio_device), "");
375 	zassert_true(DT_HAS_COMPAT_STATUS_OKAY(vnd_gpio_device), "");
376 	zassert_false(DT_HAS_COMPAT_STATUS_OKAY(vnd_disabled_compat), "");
377 	zassert_false(DT_HAS_COMPAT_STATUS_OKAY(vnd_reserved_compat), "");
378 
379 	zassert_equal(TA_HAS_COMPAT(vnd_array_holder), 1, "");
380 	zassert_equal(TA_HAS_COMPAT(vnd_undefined_compat), 1, "");
381 	zassert_equal(TA_HAS_COMPAT(vnd_not_a_test_array_compat), 0, "");
382 	compats = ((TA_HAS_COMPAT(vnd_array_holder) << 0) |
383 		   (TA_HAS_COMPAT(vnd_undefined_compat) << 1) |
384 		   (TA_HAS_COMPAT(vnd_not_a_test_array_compat) << 2));
385 	zassert_equal(compats, 0x3, "");
386 
387 #undef DT_DRV_COMPAT
388 #define DT_DRV_COMPAT vnd_model1
389 	zassert_true(DT_INST_NODE_HAS_COMPAT(0, zephyr_model2));
390 }
391 
ZTEST(devicetree_api,test_has_status)392 ZTEST(devicetree_api, test_has_status)
393 {
394 	zassert_equal(DT_NODE_HAS_STATUS(DT_NODELABEL(test_gpio_1), okay),
395 		      1, "");
396 	zassert_equal(DT_NODE_HAS_STATUS(DT_NODELABEL(test_gpio_1), disabled),
397 		      0, "");
398 	zassert_equal(DT_NODE_HAS_STATUS(DT_NODELABEL(test_gpio_1), reserved),
399 		      0, "");
400 
401 	zassert_equal(DT_NODE_HAS_STATUS(DT_NODELABEL(test_no_status), okay),
402 		      1, "");
403 	zassert_equal(DT_NODE_HAS_STATUS(DT_NODELABEL(test_no_status), disabled),
404 		      0, "");
405 	zassert_equal(DT_NODE_HAS_STATUS(DT_NODELABEL(test_no_status), reserved),
406 		      0, "");
407 
408 	zassert_equal(DT_NODE_HAS_STATUS(DT_NODELABEL(disabled_gpio), disabled),
409 		      1, "");
410 	zassert_equal(DT_NODE_HAS_STATUS(DT_NODELABEL(disabled_gpio), okay),
411 		      0, "");
412 	zassert_equal(DT_NODE_HAS_STATUS(DT_NODELABEL(disabled_gpio), reserved),
413 		      0, "");
414 
415 	zassert_equal(DT_NODE_HAS_STATUS(DT_NODELABEL(reserved_gpio), reserved),
416 		      1, "");
417 	zassert_equal(DT_NODE_HAS_STATUS(DT_NODELABEL(reserved_gpio), disabled),
418 		      0, "");
419 	zassert_equal(DT_NODE_HAS_STATUS(DT_NODELABEL(reserved_gpio), okay),
420 		      0, "");
421 }
422 
ZTEST(devicetree_api,test_has_status_okay)423 ZTEST(devicetree_api, test_has_status_okay)
424 {
425 	zassert_equal(DT_NODE_HAS_STATUS_OKAY(DT_NODELABEL(test_gpio_1)), 1);
426 
427 	zassert_equal(DT_NODE_HAS_STATUS_OKAY(DT_NODELABEL(test_no_status)), 1);
428 
429 	zassert_equal(DT_NODE_HAS_STATUS_OKAY(DT_NODELABEL(disabled_gpio)), 0);
430 
431 	zassert_equal(DT_NODE_HAS_STATUS_OKAY(DT_NODELABEL(reserved_gpio)), 0);
432 }
433 
ZTEST(devicetree_api,test_bus)434 ZTEST(devicetree_api, test_bus)
435 {
436 	int pin, flags;
437 
438 	zassert_true(DT_SAME_NODE(TEST_I3C_BUS, TEST_I3C), "");
439 	zassert_true(DT_SAME_NODE(TEST_I2C_BUS, TEST_I2C), "");
440 	zassert_true(DT_SAME_NODE(TEST_SPI_BUS_0, TEST_SPI), "");
441 	zassert_true(DT_SAME_NODE(TEST_SPI_BUS_1, TEST_SPI), "");
442 
443 	zassert_equal(DT_SPI_DEV_HAS_CS_GPIOS(TEST_SPI_DEV_0), 1, "");
444 	zassert_equal(DT_SPI_DEV_HAS_CS_GPIOS(TEST_SPI_DEV_NO_CS), 0, "");
445 
446 	/* Test a nested I2C bus using vnd,i2c-mux. */
447 	zassert_true(DT_SAME_NODE(TEST_I2C_MUX_CTLR_1,
448 				  DT_BUS(TEST_MUXED_I2C_DEV_1)), "");
449 	zassert_true(DT_SAME_NODE(TEST_I2C_MUX_CTLR_2,
450 				  DT_BUS(TEST_MUXED_I2C_DEV_2)), "");
451 
452 #undef DT_DRV_COMPAT
453 #define DT_DRV_COMPAT vnd_spi_device_2
454 	/* there is only one instance, and it has no CS */
455 	zassert_equal(DT_INST_SPI_DEV_HAS_CS_GPIOS(0), 0, "");
456 	/* since there's only one instance, we also know its bus. */
457 	zassert_true(DT_SAME_NODE(TEST_SPI_NO_CS, DT_INST_BUS(0)),
458 		     "expected TEST_SPI_NO_CS as bus for vnd,spi-device-2");
459 
460 #undef DT_DRV_COMPAT
461 #define DT_DRV_COMPAT vnd_spi_device
462 	/*
463 	 * DT_INST_SPI_DEV: use with care here. We could be matching
464 	 * either vnd,spi-device.
465 	 */
466 	zassert_equal(DT_INST_SPI_DEV_HAS_CS_GPIOS(0), 1, "");
467 
468 #define CTLR_NODE DT_INST_SPI_DEV_CS_GPIOS_CTLR(0)
469 	zassert_true(DT_SAME_NODE(CTLR_NODE, DT_NODELABEL(test_gpio_1)) ||
470 		     DT_SAME_NODE(CTLR_NODE, DT_NODELABEL(test_gpio_2)), "");
471 #undef CTLR_NODE
472 
473 	pin = DT_INST_SPI_DEV_CS_GPIOS_PIN(0);
474 	zassert_true((pin == 0x10) || (pin == 0x30), "");
475 
476 	flags = DT_INST_SPI_DEV_CS_GPIOS_FLAGS(0);
477 	zassert_true((flags == 0x20) || (flags == 0x40), "");
478 
479 	zassert_equal(DT_ON_BUS(TEST_SPI_DEV_0, spi), 1, "");
480 	zassert_equal(DT_ON_BUS(TEST_SPI_DEV_0, i2c), 0, "");
481 	zassert_equal(DT_ON_BUS(TEST_SPI_DEV_0, i3c), 0, "");
482 
483 	zassert_equal(DT_ON_BUS(TEST_I2C_DEV, i2c), 1, "");
484 	zassert_equal(DT_ON_BUS(TEST_I2C_DEV, i3c), 0, "");
485 	zassert_equal(DT_ON_BUS(TEST_I2C_DEV, spi), 0, "");
486 
487 #undef DT_DRV_COMPAT
488 #define DT_DRV_COMPAT vnd_spi_device
489 	zassert_equal(DT_NUM_INST_STATUS_OKAY(DT_DRV_COMPAT), 2, "");
490 
491 	zassert_equal(DT_INST_ON_BUS(0, spi), 1, "");
492 	zassert_equal(DT_INST_ON_BUS(0, i2c), 0, "");
493 	zassert_equal(DT_INST_ON_BUS(0, i3c), 0, "");
494 
495 	zassert_equal(DT_ANY_INST_ON_BUS_STATUS_OKAY(spi), 1, "");
496 	zassert_equal(DT_ANY_INST_ON_BUS_STATUS_OKAY(i2c), 0, "");
497 	zassert_equal(DT_ANY_INST_ON_BUS_STATUS_OKAY(i3c), 0, "");
498 
499 #undef DT_DRV_COMPAT
500 #define DT_DRV_COMPAT vnd_i2c_device
501 	zassert_equal(DT_NUM_INST_STATUS_OKAY(DT_DRV_COMPAT), 2, "");
502 
503 	zassert_equal(DT_INST_ON_BUS(0, i2c), 1, "");
504 	zassert_equal(DT_INST_ON_BUS(0, i3c), 0, "");
505 	zassert_equal(DT_INST_ON_BUS(0, spi), 0, "");
506 
507 	zassert_equal(DT_ANY_INST_ON_BUS_STATUS_OKAY(i2c), 1, "");
508 	zassert_equal(DT_ANY_INST_ON_BUS_STATUS_OKAY(i3c), 0, "");
509 	zassert_equal(DT_ANY_INST_ON_BUS_STATUS_OKAY(spi), 0, "");
510 
511 #undef DT_DRV_COMPAT
512 #define DT_DRV_COMPAT vnd_i3c_device
513 	zassert_equal(DT_NUM_INST_STATUS_OKAY(DT_DRV_COMPAT), 1, "");
514 
515 	zassert_equal(DT_INST_ON_BUS(0, i2c), 1, "");
516 	zassert_equal(DT_INST_ON_BUS(0, i3c), 1, "");
517 	zassert_equal(DT_INST_ON_BUS(0, spi), 0, "");
518 
519 	zassert_equal(DT_ANY_INST_ON_BUS_STATUS_OKAY(i2c), 1, "");
520 	zassert_equal(DT_ANY_INST_ON_BUS_STATUS_OKAY(i3c), 1, "");
521 	zassert_equal(DT_ANY_INST_ON_BUS_STATUS_OKAY(spi), 0, "");
522 
523 #undef DT_DRV_COMPAT
524 #define DT_DRV_COMPAT vnd_i3c_i2c_device
525 	zassert_equal(DT_NUM_INST_STATUS_OKAY(DT_DRV_COMPAT), 1, "");
526 
527 	zassert_equal(DT_INST_ON_BUS(0, i2c), 1, "");
528 	zassert_equal(DT_INST_ON_BUS(0, i3c), 1, "");
529 	zassert_equal(DT_INST_ON_BUS(0, spi), 0, "");
530 
531 	zassert_equal(DT_ANY_INST_ON_BUS_STATUS_OKAY(i2c), 1, "");
532 	zassert_equal(DT_ANY_INST_ON_BUS_STATUS_OKAY(i3c), 1, "");
533 	zassert_equal(DT_ANY_INST_ON_BUS_STATUS_OKAY(spi), 0, "");
534 
535 #undef DT_DRV_COMPAT
536 
537 	/*
538 	 * Make sure the underlying DT_HAS_COMPAT_ON_BUS_STATUS_OKAY used by
539 	 * DT_ANY_INST_ON_BUS works without DT_DRV_COMPAT defined.
540 	 */
541 	zassert_equal(DT_HAS_COMPAT_ON_BUS_STATUS_OKAY(vnd_spi_device, spi), 1);
542 	zassert_equal(DT_HAS_COMPAT_ON_BUS_STATUS_OKAY(vnd_spi_device, i2c), 0);
543 
544 	zassert_equal(DT_HAS_COMPAT_ON_BUS_STATUS_OKAY(vnd_i2c_device, i2c), 1);
545 	zassert_equal(DT_HAS_COMPAT_ON_BUS_STATUS_OKAY(vnd_i2c_device, spi), 0);
546 
547 	zassert_equal(DT_HAS_COMPAT_ON_BUS_STATUS_OKAY(vnd_gpio_expander, i2c), 1,
548 		      NULL);
549 	zassert_equal(DT_HAS_COMPAT_ON_BUS_STATUS_OKAY(vnd_gpio_expander, spi), 1,
550 		      NULL);
551 }
552 
553 #undef DT_DRV_COMPAT
554 #define DT_DRV_COMPAT vnd_vendor
555 
556 #define VND_VENDOR "A stand-in for a real vendor which can be used in examples and tests"
557 #define ZEP_VENDOR "Zephyr-specific binding"
558 
ZTEST(devicetree_api,test_vendor)559 ZTEST(devicetree_api, test_vendor)
560 {
561 	/* DT_NODE_VENDOR_HAS_IDX */
562 	zassert_true(DT_NODE_VENDOR_HAS_IDX(TEST_VENDOR, 0), "");
563 	zassert_false(DT_NODE_VENDOR_HAS_IDX(TEST_VENDOR, 1), "");
564 	zassert_true(DT_NODE_VENDOR_HAS_IDX(TEST_VENDOR, 2), "");
565 	zassert_false(DT_NODE_VENDOR_HAS_IDX(TEST_VENDOR, 3), "");
566 
567 	/* DT_NODE_VENDOR_BY_IDX */
568 	zassert_true(!strcmp(DT_NODE_VENDOR_BY_IDX(TEST_VENDOR, 0), VND_VENDOR), "");
569 	zassert_true(!strcmp(DT_NODE_VENDOR_BY_IDX(TEST_VENDOR, 2), ZEP_VENDOR), "");
570 
571 	/* DT_NODE_VENDOR_BY_IDX_OR */
572 	zassert_true(!strcmp(DT_NODE_VENDOR_BY_IDX_OR(TEST_VENDOR, 0, NULL), VND_VENDOR), "");
573 	zassert_is_null(DT_NODE_VENDOR_BY_IDX_OR(TEST_VENDOR, 1, NULL), "");
574 	zassert_true(!strcmp(DT_NODE_VENDOR_BY_IDX_OR(TEST_VENDOR, 2, NULL), ZEP_VENDOR), "");
575 	zassert_is_null(DT_NODE_VENDOR_BY_IDX_OR(TEST_VENDOR, 3, NULL), "");
576 
577 	/* DT_NODE_VENDOR_OR */
578 	zassert_true(!strcmp(DT_NODE_VENDOR_OR(TEST_VENDOR, NULL), VND_VENDOR), "");
579 }
580 
581 #define VND_MODEL "model1"
582 #define ZEP_MODEL "model2"
583 
ZTEST(devicetree_api,test_model)584 ZTEST(devicetree_api, test_model)
585 {
586 	/* DT_NODE_MODEL_HAS_IDX */
587 	zassert_true(DT_NODE_MODEL_HAS_IDX(TEST_MODEL, 0), "");
588 	zassert_false(DT_NODE_MODEL_HAS_IDX(TEST_MODEL, 1), "");
589 	zassert_true(DT_NODE_MODEL_HAS_IDX(TEST_MODEL, 2), "");
590 	zassert_false(DT_NODE_MODEL_HAS_IDX(TEST_MODEL, 3), "");
591 
592 	/* DT_NODE_MODEL_BY_IDX */
593 	zassert_true(!strcmp(DT_NODE_MODEL_BY_IDX(TEST_MODEL, 0), VND_MODEL), "");
594 	zassert_true(!strcmp(DT_NODE_MODEL_BY_IDX(TEST_MODEL, 2), ZEP_MODEL), "");
595 
596 	/* DT_NODE_MODEL_BY_IDX_OR */
597 	zassert_true(!strcmp(DT_NODE_MODEL_BY_IDX_OR(TEST_MODEL, 0, NULL), VND_MODEL), "");
598 	zassert_is_null(DT_NODE_MODEL_BY_IDX_OR(TEST_MODEL, 1, NULL), "");
599 	zassert_true(!strcmp(DT_NODE_MODEL_BY_IDX_OR(TEST_MODEL, 2, NULL), ZEP_MODEL), "");
600 	zassert_is_null(DT_NODE_MODEL_BY_IDX_OR(TEST_MODEL, 3, NULL), "");
601 
602 	/* DT_NODE_MODEL_OR */
603 	zassert_true(!strcmp(DT_NODE_MODEL_OR(TEST_MODEL, NULL), VND_MODEL), "");
604 }
605 
606 #undef ZEP_MODEL
607 #undef VND_MODEL
608 
609 #undef DT_DRV_COMPAT
610 #define DT_DRV_COMPAT vnd_reg_holder
ZTEST(devicetree_api,test_reg)611 ZTEST(devicetree_api, test_reg)
612 {
613 	/* DT_REG_HAS_IDX */
614 	zassert_true(DT_REG_HAS_IDX(TEST_ABCD1234, 0), "");
615 	zassert_true(DT_REG_HAS_IDX(TEST_ABCD1234, 1), "");
616 	zassert_false(DT_REG_HAS_IDX(TEST_ABCD1234, 2), "");
617 
618 	/* DT_REG_HAS_NAME */
619 	zassert_true(DT_REG_HAS_NAME(TEST_ABCD1234, one), "");
620 	zassert_true(DT_REG_HAS_NAME(TEST_ABCD1234, two), "");
621 	zassert_false(DT_REG_HAS_NAME(TEST_ABCD1234, three), "");
622 
623 	/* DT_REG_ADDR_BY_IDX */
624 	zassert_equal(DT_REG_ADDR_BY_IDX(TEST_ABCD1234, 0), 0xabcd1234, "");
625 	zassert_equal(DT_REG_ADDR_BY_IDX(TEST_ABCD1234, 1), 0x98765432, "");
626 
627 	/* DT_REG_SIZE_BY_IDX */
628 	zassert_equal(DT_REG_SIZE_BY_IDX(TEST_ABCD1234, 0), 0x500, "");
629 	zassert_equal(DT_REG_SIZE_BY_IDX(TEST_ABCD1234, 1), 0xff, "");
630 
631 	/* DT_REG_ADDR */
632 	zassert_equal(DT_REG_ADDR(TEST_ABCD1234), 0xabcd1234, "");
633 
634 	/* DT_REG_ADDR_U64 */
635 	zassert_equal(DT_REG_ADDR_U64(TEST_ABCD1234), 0xabcd1234, "");
636 
637 	/* DT_REG_SIZE */
638 	zassert_equal(DT_REG_SIZE(TEST_ABCD1234), 0x500, "");
639 
640 	/* DT_REG_ADDR_BY_NAME */
641 	zassert_equal(DT_REG_ADDR_BY_NAME(TEST_ABCD1234, one), 0xabcd1234, "");
642 	zassert_equal(DT_REG_ADDR_BY_NAME(TEST_ABCD1234, two), 0x98765432, "");
643 
644 	/* DT_REG_ADDR_BY_NAME_OR */
645 	zassert_equal(DT_REG_ADDR_BY_NAME_OR(TEST_ABCD1234, one, 0x10), 0xabcd1234, "");
646 	zassert_equal(DT_REG_ADDR_BY_NAME_OR(TEST_ABCD1234, two, 0x11), 0x98765432, "");
647 	zassert_equal(DT_REG_ADDR_BY_NAME_OR(TEST_ABCD1234, three, 0x12), 0x12, "");
648 
649 	/* DT_REG_ADDR_BY_NAME_U64 */
650 	zassert_equal(DT_REG_ADDR_BY_NAME_U64(TEST_ABCD1234, one), 0xabcd1234, "");
651 	zassert_equal(DT_REG_ADDR_BY_NAME_U64(TEST_ABCD1234, two), 0x98765432, "");
652 
653 	/* DT_REG_SIZE_BY_NAME */
654 	zassert_equal(DT_REG_SIZE_BY_NAME(TEST_ABCD1234, one), 0x500, "");
655 	zassert_equal(DT_REG_SIZE_BY_NAME(TEST_ABCD1234, two), 0xff, "");
656 
657 	/* DT_REG_SIZE_BY_NAME_OR */
658 	zassert_equal(DT_REG_SIZE_BY_NAME_OR(TEST_ABCD1234, one, 0x10), 0x500, "");
659 	zassert_equal(DT_REG_SIZE_BY_NAME_OR(TEST_ABCD1234, two, 0x11), 0xff, "");
660 	zassert_equal(DT_REG_SIZE_BY_NAME_OR(TEST_ABCD1234, three, 0x12), 0x12, "");
661 
662 	/* DT_INST */
663 	zassert_equal(DT_NUM_INST_STATUS_OKAY(DT_DRV_COMPAT), 1, "");
664 
665 	/* DT_INST_REG_HAS_IDX */
666 	zassert_true(DT_INST_REG_HAS_IDX(0, 0), "");
667 	zassert_true(DT_INST_REG_HAS_IDX(0, 1), "");
668 	zassert_false(DT_INST_REG_HAS_IDX(0, 2), "");
669 
670 	/* DT_INST_REG_HAS_NAME */
671 	zassert_true(DT_INST_REG_HAS_NAME(0, first), "");
672 	zassert_true(DT_INST_REG_HAS_NAME(0, second), "");
673 	zassert_false(DT_INST_REG_HAS_NAME(0, third), "");
674 
675 	/* DT_INST_REG_ADDR_BY_IDX */
676 	zassert_equal(DT_INST_REG_ADDR_BY_IDX(0, 0), 0x9999aaaa, "");
677 	zassert_equal(DT_INST_REG_ADDR_BY_IDX(0, 1), 0xbbbbcccc, "");
678 
679 	/* DT_INST_REG_SIZE_BY_IDX */
680 	zassert_equal(DT_INST_REG_SIZE_BY_IDX(0, 0), 0x1000, "");
681 	zassert_equal(DT_INST_REG_SIZE_BY_IDX(0, 1), 0x3f, "");
682 
683 	/* DT_INST_REG_ADDR */
684 	zassert_equal(DT_INST_REG_ADDR(0), 0x9999aaaa, "");
685 
686 	/* DT_INST_REG_ADDR_U64 */
687 	zassert_equal(DT_INST_REG_ADDR_U64(0), 0x9999aaaa, "");
688 
689 	/* DT_INST_REG_SIZE */
690 	zassert_equal(DT_INST_REG_SIZE(0), 0x1000, "");
691 
692 	/* DT_INST_REG_ADDR_BY_NAME */
693 	zassert_equal(DT_INST_REG_ADDR_BY_NAME(0, first), 0x9999aaaa, "");
694 	zassert_equal(DT_INST_REG_ADDR_BY_NAME(0, second), 0xbbbbcccc, "");
695 
696 	/* DT_INST_REG_ADDR_BY_NAME_OR */
697 	zassert_equal(DT_INST_REG_ADDR_BY_NAME_OR(0, first, 0x10), 0x9999aaaa, "");
698 	zassert_equal(DT_INST_REG_ADDR_BY_NAME_OR(0, second, 0x11), 0xbbbbcccc, "");
699 	zassert_equal(DT_INST_REG_SIZE_BY_NAME_OR(0, third, 0x12), 0x12, "");
700 
701 	/* DT_INST_REG_ADDR_BY_NAME_U64 */
702 	zassert_equal(DT_INST_REG_ADDR_BY_NAME_U64(0, first), 0x9999aaaa, "");
703 	zassert_equal(DT_INST_REG_ADDR_BY_NAME_U64(0, second), 0xbbbbcccc, "");
704 
705 	/* DT_INST_REG_SIZE_BY_NAME */
706 	zassert_equal(DT_INST_REG_SIZE_BY_NAME(0, first), 0x1000, "");
707 	zassert_equal(DT_INST_REG_SIZE_BY_NAME(0, second), 0x3f, "");
708 
709 	/* DT_REG_SIZE_BY_NAME_OR */
710 	zassert_equal(DT_INST_REG_SIZE_BY_NAME_OR(0, first, 0x10), 0x1000, "");
711 	zassert_equal(DT_INST_REG_SIZE_BY_NAME_OR(0, second, 0x11), 0x3f, "");
712 	zassert_equal(DT_INST_REG_SIZE_BY_NAME_OR(0, third, 0x12), 0x12, "");
713 }
714 
715 #undef DT_DRV_COMPAT
716 #define DT_DRV_COMPAT vnd_reg_holder_64
ZTEST(devicetree_api,test_reg_64)717 ZTEST(devicetree_api, test_reg_64)
718 {
719 	/* DT_REG_ADDR_U64 */
720 	zassert_equal(DT_REG_ADDR_U64(TEST_64BIT), 0xffffffff11223344, "");
721 
722 	/* DT_REG_ADDR_BY_NAME_U64 */
723 	zassert_equal(DT_REG_ADDR_BY_NAME_U64(TEST_64BIT, test_name), 0xffffffff11223344, "");
724 
725 	/* DT_INST_REG_ADDR_U64 */
726 	zassert_equal(DT_INST_REG_ADDR_U64(0), 0xffffffff11223344, "");
727 
728 	/* DT_INST_REG_ADDR_BY_NAME_U64 */
729 	zassert_equal(DT_INST_REG_ADDR_BY_NAME_U64(0, test_name), 0xffffffff11223344, "");
730 }
731 
732 #undef DT_DRV_COMPAT
733 #define DT_DRV_COMPAT vnd_interrupt_holder
ZTEST(devicetree_api,test_irq)734 ZTEST(devicetree_api, test_irq)
735 {
736 	/* DT_NUM_IRQS */
737 	zassert_equal(DT_NUM_IRQS(TEST_DEADBEEF), 1, "");
738 	zassert_equal(DT_NUM_IRQS(TEST_I2C_BUS), 2, "");
739 	zassert_equal(DT_NUM_IRQS(TEST_SPI), 3, "");
740 
741 	/* DT_IRQ_HAS_IDX */
742 	zassert_true(DT_IRQ_HAS_IDX(TEST_SPI_BUS_0, 0), "");
743 	zassert_true(DT_IRQ_HAS_IDX(TEST_SPI_BUS_0, 1), "");
744 	zassert_true(DT_IRQ_HAS_IDX(TEST_SPI_BUS_0, 2), "");
745 	zassert_false(DT_IRQ_HAS_IDX(TEST_SPI_BUS_0, 3), "");
746 
747 	zassert_true(DT_IRQ_HAS_IDX(TEST_DEADBEEF, 0), "");
748 	zassert_false(DT_IRQ_HAS_IDX(TEST_DEADBEEF, 1), "");
749 
750 	zassert_true(DT_IRQ_HAS_IDX(TEST_I2C_BUS, 0), "");
751 	zassert_true(DT_IRQ_HAS_IDX(TEST_I2C_BUS, 1), "");
752 	zassert_false(DT_IRQ_HAS_IDX(TEST_I2C_BUS, 2), "");
753 
754 	/* DT_IRQ_BY_IDX */
755 	zassert_equal(DT_IRQ_BY_IDX(TEST_SPI_BUS_0, 0, irq), 8, "");
756 	zassert_equal(DT_IRQ_BY_IDX(TEST_SPI_BUS_0, 1, irq), 9, "");
757 	zassert_equal(DT_IRQ_BY_IDX(TEST_SPI_BUS_0, 2, irq), 10, "");
758 	zassert_equal(DT_IRQ_BY_IDX(TEST_SPI_BUS_0, 0, priority), 3, "");
759 	zassert_equal(DT_IRQ_BY_IDX(TEST_SPI_BUS_0, 1, priority), 0, "");
760 	zassert_equal(DT_IRQ_BY_IDX(TEST_SPI_BUS_0, 2, priority), 1, "");
761 
762 	/* DT_IRQ_BY_NAME */
763 	zassert_equal(DT_IRQ_BY_NAME(TEST_I2C_BUS, status, irq), 6, "");
764 	zassert_equal(DT_IRQ_BY_NAME(TEST_I2C_BUS, error, irq), 7, "");
765 	zassert_equal(DT_IRQ_BY_NAME(TEST_I2C_BUS, status, priority), 2, "");
766 	zassert_equal(DT_IRQ_BY_NAME(TEST_I2C_BUS, error, priority), 1, "");
767 
768 	/* DT_IRQ_HAS_CELL_AT_IDX */
769 	zassert_true(DT_IRQ_HAS_CELL_AT_IDX(TEST_IRQ, 0, irq), "");
770 	zassert_true(DT_IRQ_HAS_CELL_AT_IDX(TEST_IRQ, 0, priority), "");
771 	zassert_false(DT_IRQ_HAS_CELL_AT_IDX(TEST_IRQ, 0, foo), 0, "");
772 	zassert_true(DT_IRQ_HAS_CELL_AT_IDX(TEST_IRQ, 2, irq), "");
773 	zassert_true(DT_IRQ_HAS_CELL_AT_IDX(TEST_IRQ, 2, priority), "");
774 	zassert_false(DT_IRQ_HAS_CELL_AT_IDX(TEST_IRQ, 2, foo), "");
775 
776 	/* DT_IRQ_HAS_CELL */
777 	zassert_true(DT_IRQ_HAS_CELL(TEST_IRQ, irq), "");
778 	zassert_true(DT_IRQ_HAS_CELL(TEST_IRQ, priority), "");
779 	zassert_false(DT_IRQ_HAS_CELL(TEST_IRQ, foo), "");
780 
781 	/* DT_IRQ_HAS_NAME */
782 	zassert_true(DT_IRQ_HAS_NAME(TEST_IRQ, err), "");
783 	zassert_true(DT_IRQ_HAS_NAME(TEST_IRQ, stat), "");
784 	zassert_true(DT_IRQ_HAS_NAME(TEST_IRQ, done), "");
785 	zassert_false(DT_IRQ_HAS_NAME(TEST_IRQ, alpha), "");
786 
787 	/* DT_IRQ */
788 	zassert_equal(DT_IRQ(TEST_I2C_BUS, irq), 6, "");
789 	zassert_equal(DT_IRQ(TEST_I2C_BUS, priority), 2, "");
790 
791 	/* DT_IRQN */
792 #ifndef CONFIG_MULTI_LEVEL_INTERRUPTS
793 	zassert_equal(DT_IRQN(TEST_I2C_BUS), 6, "");
794 	zassert_equal(DT_IRQN(DT_INST(0, DT_DRV_COMPAT)), 30, "");
795 #else
796 	zassert_equal(DT_IRQN(TEST_I2C_BUS),
797 			((6 + 1) << CONFIG_1ST_LEVEL_INTERRUPT_BITS) | 11, "");
798 	zassert_equal(DT_IRQN(DT_INST(0, DT_DRV_COMPAT)),
799 			((30 + 1) << CONFIG_1ST_LEVEL_INTERRUPT_BITS) | 11, "");
800 #endif
801 
802 	/* DT_IRQN_BY_IDX */
803 #ifndef CONFIG_MULTI_LEVEL_INTERRUPTS
804 	zassert_equal(DT_IRQN_BY_IDX(DT_INST(0, DT_DRV_COMPAT), 0), 30, "");
805 	zassert_equal(DT_IRQN_BY_IDX(DT_INST(0, DT_DRV_COMPAT), 1), 40, "");
806 	zassert_equal(DT_IRQN_BY_IDX(DT_INST(0, DT_DRV_COMPAT), 2), 60, "");
807 #else
808 	zassert_equal(DT_IRQN_BY_IDX(DT_INST(0, DT_DRV_COMPAT), 0),
809 		      ((30 + 1) << CONFIG_1ST_LEVEL_INTERRUPT_BITS) | 11, "");
810 	zassert_equal(DT_IRQN_BY_IDX(DT_INST(0, DT_DRV_COMPAT), 1),
811 		      ((40 + 1) << CONFIG_1ST_LEVEL_INTERRUPT_BITS) | 11, "");
812 	zassert_equal(DT_IRQN_BY_IDX(DT_INST(0, DT_DRV_COMPAT), 2),
813 		      ((60 + 1) << CONFIG_1ST_LEVEL_INTERRUPT_BITS) | 11, "");
814 #endif
815 
816 	/* DT_INST */
817 	zassert_equal(DT_NUM_INST_STATUS_OKAY(DT_DRV_COMPAT), 1, "");
818 
819 	/* DT_INST_NUM_IRQS */
820 	zassert_equal(DT_INST_NUM_IRQS(0), 3);
821 
822 	/* DT_INST_IRQ_HAS_IDX */
823 	zassert_equal(DT_INST_IRQ_HAS_IDX(0, 0), 1, "");
824 	zassert_equal(DT_INST_IRQ_HAS_IDX(0, 1), 1, "");
825 	zassert_equal(DT_INST_IRQ_HAS_IDX(0, 2), 1, "");
826 	zassert_equal(DT_INST_IRQ_HAS_IDX(0, 3), 0, "");
827 
828 	/* DT_INST_IRQ_BY_IDX */
829 	zassert_equal(DT_INST_IRQ_BY_IDX(0, 0, irq), 30, "");
830 	zassert_equal(DT_INST_IRQ_BY_IDX(0, 1, irq), 40, "");
831 	zassert_equal(DT_INST_IRQ_BY_IDX(0, 2, irq), 60, "");
832 	zassert_equal(DT_INST_IRQ_BY_IDX(0, 0, priority), 3, "");
833 	zassert_equal(DT_INST_IRQ_BY_IDX(0, 1, priority), 5, "");
834 	zassert_equal(DT_INST_IRQ_BY_IDX(0, 2, priority), 7, "");
835 
836 	/* DT_INST_IRQ_BY_NAME */
837 	zassert_equal(DT_INST_IRQ_BY_NAME(0, err, irq), 30, "");
838 	zassert_equal(DT_INST_IRQ_BY_NAME(0, stat, irq), 40, "");
839 	zassert_equal(DT_INST_IRQ_BY_NAME(0, done, irq), 60, "");
840 	zassert_equal(DT_INST_IRQ_BY_NAME(0, err, priority), 3, "");
841 	zassert_equal(DT_INST_IRQ_BY_NAME(0, stat, priority), 5, "");
842 	zassert_equal(DT_INST_IRQ_BY_NAME(0, done, priority), 7, "");
843 
844 	/* DT_INST_IRQ */
845 	zassert_equal(DT_INST_IRQ(0, irq), 30, "");
846 	zassert_equal(DT_INST_IRQ(0, priority), 3, "");
847 
848 	/* DT_INST_IRQN */
849 #ifndef CONFIG_MULTI_LEVEL_INTERRUPTS
850 	zassert_equal(DT_INST_IRQN(0), 30, "");
851 #else
852 	zassert_equal(DT_INST_IRQN(0), ((30 + 1) << CONFIG_1ST_LEVEL_INTERRUPT_BITS) | 11, "");
853 #endif
854 
855 	/* DT_INST_IRQN_BY_IDX */
856 #ifndef CONFIG_MULTI_LEVEL_INTERRUPTS
857 	zassert_equal(DT_INST_IRQN_BY_IDX(0, 0), 30, "");
858 	zassert_equal(DT_INST_IRQN_BY_IDX(0, 1), 40, "");
859 	zassert_equal(DT_INST_IRQN_BY_IDX(0, 2), 60, "");
860 #else
861 	zassert_equal(DT_INST_IRQN_BY_IDX(0, 0),
862 		      ((30 + 1) << CONFIG_1ST_LEVEL_INTERRUPT_BITS) | 11, "");
863 	zassert_equal(DT_INST_IRQN_BY_IDX(0, 1),
864 		      ((40 + 1) << CONFIG_1ST_LEVEL_INTERRUPT_BITS) | 11, "");
865 	zassert_equal(DT_INST_IRQN_BY_IDX(0, 2),
866 		      ((60 + 1) << CONFIG_1ST_LEVEL_INTERRUPT_BITS) | 11, "");
867 #endif
868 
869 	/* DT_INST_IRQ_HAS_CELL_AT_IDX */
870 	zassert_true(DT_INST_IRQ_HAS_CELL_AT_IDX(0, 0, irq), "");
871 	zassert_true(DT_INST_IRQ_HAS_CELL_AT_IDX(0, 0, priority), "");
872 	zassert_false(DT_INST_IRQ_HAS_CELL_AT_IDX(0, 0, foo), "");
873 	zassert_true(DT_INST_IRQ_HAS_CELL_AT_IDX(0, 2, irq), "");
874 	zassert_true(DT_INST_IRQ_HAS_CELL_AT_IDX(0, 2, priority), "");
875 	zassert_false(DT_INST_IRQ_HAS_CELL_AT_IDX(0, 2, foo), "");
876 
877 	/* DT_INST_IRQ_HAS_CELL */
878 	zassert_true(DT_INST_IRQ_HAS_CELL(0, irq), "");
879 	zassert_true(DT_INST_IRQ_HAS_CELL(0, priority), "");
880 	zassert_false(DT_INST_IRQ_HAS_CELL(0, foo), "");
881 
882 	/* DT_INST_IRQ_HAS_NAME */
883 	zassert_true(DT_INST_IRQ_HAS_NAME(0, err), "");
884 	zassert_true(DT_INST_IRQ_HAS_NAME(0, stat), "");
885 	zassert_true(DT_INST_IRQ_HAS_NAME(0, done), "");
886 	zassert_false(DT_INST_IRQ_HAS_NAME(0, alpha), "");
887 
888 #ifdef CONFIG_MULTI_LEVEL_INTERRUPTS
889 	/* the following asserts check if interrupt IDs are encoded
890 	 * properly when dealing with a node that consumes interrupts
891 	 * from L2 aggregators extending different L1 interrupts.
892 	 */
893 	zassert_equal(DT_IRQN_BY_IDX(TEST_IRQ_EXT, 0),
894 		      ((70 + 1) << CONFIG_1ST_LEVEL_INTERRUPT_BITS) | 11, "");
895 	zassert_equal(DT_IRQN_BY_IDX(TEST_IRQ_EXT, 2),
896 		      ((42 + 1) << CONFIG_1ST_LEVEL_INTERRUPT_BITS) | 12, "");
897 #else
898 	zassert_equal(DT_IRQN_BY_IDX(TEST_IRQ_EXT, 0), 70, "");
899 	zassert_equal(DT_IRQN_BY_IDX(TEST_IRQ_EXT, 2), 42, "");
900 #endif /* CONFIG_MULTI_LEVEL_INTERRUPTS */
901 }
902 
ZTEST(devicetree_api,test_irq_level)903 ZTEST(devicetree_api, test_irq_level)
904 {
905 	/* DT_IRQ_LEVEL */
906 	zassert_equal(DT_IRQ_LEVEL(TEST_TEMP), 0, "");
907 	zassert_equal(DT_IRQ_LEVEL(TEST_INTC), 1, "");
908 	zassert_equal(DT_IRQ_LEVEL(TEST_SPI), 2, "");
909 
910 	/* DT_IRQ_LEVEL */
911 	#undef DT_DRV_COMPAT
912 	#define DT_DRV_COMPAT vnd_adc_temp_sensor
913 	zassert_equal(DT_INST_IRQ_LEVEL(0), 0, "");
914 
915 	#undef DT_DRV_COMPAT
916 	#define DT_DRV_COMPAT vnd_intc
917 	zassert_equal(DT_INST_IRQ_LEVEL(1), 1, "");
918 
919 	#undef DT_DRV_COMPAT
920 	#define DT_DRV_COMPAT vnd_spi
921 	zassert_equal(DT_INST_IRQ_LEVEL(0), 2, "");
922 }
923 
924 struct gpios_struct {
925 	gpio_pin_t pin;
926 	gpio_flags_t flags;
927 };
928 
929 #define CLOCK_FREQUENCY_AND_COMMA(node_id, prop, idx) \
930 	DT_PROP_BY_PHANDLE_IDX(node_id, prop, idx, clock_frequency),
931 
932 /* Helper macro that UTIL_LISTIFY can use and produces an element with comma */
933 #define DT_GPIO_ELEM(idx, node_id, prop) \
934 	{ \
935 		DT_PHA_BY_IDX(node_id, prop, idx, pin),\
936 		DT_PHA_BY_IDX(node_id, prop, idx, flags),\
937 	}
938 #define DT_GPIO_LISTIFY(node_id, prop) \
939 	{ LISTIFY(DT_PROP_LEN(node_id, prop), DT_GPIO_ELEM, (,), \
940 		  node_id, prop) }
941 
942 #undef DT_DRV_COMPAT
943 #define DT_DRV_COMPAT vnd_phandle_holder
ZTEST(devicetree_api,test_phandles)944 ZTEST(devicetree_api, test_phandles)
945 {
946 	bool gpio_controller = DT_PROP_BY_PHANDLE(TEST_PH, ph, gpio_controller);
947 	size_t phs_freqs[] = { DT_FOREACH_PROP_ELEM(TEST_PH, phs, CLOCK_FREQUENCY_AND_COMMA) };
948 	struct gpios_struct gps[] = DT_GPIO_LISTIFY(TEST_PH, gpios);
949 
950 	/* phandle */
951 	zassert_true(DT_NODE_HAS_PROP(TEST_PH, ph), "");
952 	zassert_true(DT_SAME_NODE(DT_PROP(TEST_PH, ph),
953 				  DT_NODELABEL(test_gpio_1)), "");
954 	zassert_equal(DT_PROP_LEN(TEST_PH, ph), 1, "");
955 	zassert_true(DT_SAME_NODE(DT_PROP_BY_IDX(TEST_PH, ph, 0),
956 				  DT_NODELABEL(test_gpio_1)), "");
957 	/* DT_PROP_BY_PHANDLE */
958 	zassert_equal(gpio_controller, true, "");
959 
960 	/* phandles */
961 	zassert_true(DT_NODE_HAS_PROP(TEST_PH, phs), "");
962 	zassert_equal(ARRAY_SIZE(phs_freqs), 2, "");
963 	zassert_equal(DT_PROP_LEN(TEST_PH, phs), 2, "");
964 	zassert_true(DT_SAME_NODE(DT_PROP_BY_IDX(TEST_PH, phs, 1),
965 				  TEST_SPI), "");
966 
967 	/* DT_FOREACH_PROP_ELEM on a phandles type property */
968 	zassert_equal(phs_freqs[0], 100000, "");
969 	zassert_equal(phs_freqs[1], 2000000, "");
970 
971 	/* DT_PROP_BY_PHANDLE_IDX on a phandles type property */
972 	zassert_equal(DT_PROP_BY_PHANDLE_IDX(TEST_PH, phs, 0, clock_frequency),
973 		      100000, "");
974 	zassert_equal(DT_PROP_BY_PHANDLE_IDX(TEST_PH, phs, 1, clock_frequency),
975 		      2000000, "");
976 
977 	/* DT_PROP_BY_PHANDLE_IDX on a phandle-array type property */
978 	zassert_equal(DT_PROP_BY_PHANDLE_IDX(TEST_PH, gpios, 0,
979 					     ngpios), 100, "");
980 	zassert_equal(DT_PROP_BY_PHANDLE_IDX(TEST_PH, gpios, 1,
981 					     ngpios), 200, "");
982 	zassert_true(!strcmp(DT_PROP_BY_PHANDLE_IDX(TEST_PH, gpios, 0, status),
983 			     "okay"), "");
984 	zassert_true(!strcmp(DT_PROP_BY_PHANDLE_IDX(TEST_PH, gpios, 1, status),
985 			     "okay"), "");
986 
987 	/* DT_PROP_BY_PHANDLE_IDX_OR */
988 	zassert_true(!strcmp(DT_PROP_BY_PHANDLE_IDX_OR(TEST_PH, phs_or, 0,
989 						val, "zero"), "one"), "");
990 	zassert_true(!strcmp(DT_PROP_BY_PHANDLE_IDX_OR(TEST_PH, phs_or, 1,
991 						val, "zero"), "zero"), "");
992 
993 	/* phandle-array */
994 	zassert_true(DT_NODE_HAS_PROP(TEST_PH, gpios), "");
995 	zassert_equal(ARRAY_SIZE(gps), 2, "");
996 	zassert_equal(DT_PROP_LEN(TEST_PH, gpios), 2, "");
997 
998 	/* DT_PROP_HAS_IDX */
999 	zassert_true(DT_PROP_HAS_IDX(TEST_PH, gpios, 0), "");
1000 	zassert_true(DT_PROP_HAS_IDX(TEST_PH, gpios, 1), "");
1001 	zassert_false(DT_PROP_HAS_IDX(TEST_PH, gpios, 2), "");
1002 
1003 	/* DT_PROP_HAS_NAME */
1004 	zassert_false(DT_PROP_HAS_NAME(TEST_PH, foos, A), "");
1005 	zassert_true(DT_PROP_HAS_NAME(TEST_PH, foos, a), "");
1006 	zassert_false(DT_PROP_HAS_NAME(TEST_PH, foos, b-c), "");
1007 	zassert_true(DT_PROP_HAS_NAME(TEST_PH, foos, b_c), "");
1008 	zassert_false(DT_PROP_HAS_NAME(TEST_PH, bazs, jane), "");
1009 
1010 	/* DT_PHA_HAS_CELL_AT_IDX */
1011 	zassert_true(DT_PHA_HAS_CELL_AT_IDX(TEST_PH, gpios, 1, pin), "");
1012 	zassert_true(DT_PHA_HAS_CELL_AT_IDX(TEST_PH, gpios, 1, flags), "");
1013 	/* pha-gpios index 1 has nothing, not even a phandle */
1014 	zassert_false(DT_PROP_HAS_IDX(TEST_PH, pha_gpios, 1), "");
1015 	zassert_false(DT_PHA_HAS_CELL_AT_IDX(TEST_PH, pha_gpios, 1, pin), "");
1016 	zassert_false(DT_PHA_HAS_CELL_AT_IDX(TEST_PH, pha_gpios, 1, flags),
1017 		      "");
1018 	/* index 2 only has a pin cell, no flags */
1019 	zassert_true(DT_PHA_HAS_CELL_AT_IDX(TEST_PH, pha_gpios, 2, pin), "");
1020 	zassert_false(DT_PHA_HAS_CELL_AT_IDX(TEST_PH, pha_gpios, 2, flags),
1021 		      "");
1022 	/* index 3 has both pin and flags cells*/
1023 	zassert_true(DT_PHA_HAS_CELL_AT_IDX(TEST_PH, pha_gpios, 3, pin), "");
1024 	zassert_true(DT_PHA_HAS_CELL_AT_IDX(TEST_PH, pha_gpios, 3, flags), "");
1025 	/* even though index 1 has nothing, the length is still 4 */
1026 	zassert_equal(DT_PROP_LEN(TEST_PH, pha_gpios), 4, "");
1027 
1028 	/* DT_PHA_HAS_CELL */
1029 	zassert_true(DT_PHA_HAS_CELL(TEST_PH, gpios, flags), "");
1030 	zassert_false(DT_PHA_HAS_CELL(TEST_PH, gpios, bar), "");
1031 
1032 	/* DT_PHANDLE_BY_IDX */
1033 	zassert_true(DT_SAME_NODE(DT_PHANDLE_BY_IDX(TEST_PH, gpios, 0), TEST_GPIO_1), "");
1034 	zassert_true(DT_SAME_NODE(DT_PHANDLE_BY_IDX(TEST_PH, gpios, 1), TEST_GPIO_2), "");
1035 
1036 	/* DT_PHANDLE */
1037 	zassert_true(DT_SAME_NODE(DT_PHANDLE(TEST_PH, gpios), TEST_GPIO_1), "");
1038 
1039 	/* DT_PHA */
1040 	zassert_equal(DT_PHA(TEST_PH, gpios, pin), 10, "");
1041 	zassert_equal(DT_PHA(TEST_PH, gpios, flags), 20, "");
1042 
1043 	/* DT_PHA_BY_IDX */
1044 	zassert_equal(DT_PHA_BY_IDX(TEST_PH, gpios, 0, pin), 10, "");
1045 	zassert_equal(DT_PHA_BY_IDX(TEST_PH, gpios, 0, flags), 20, "");
1046 
1047 	zassert_equal(DT_PHA_BY_IDX(TEST_PH, gpios, 1, pin), 30, "");
1048 	zassert_equal(DT_PHA_BY_IDX(TEST_PH, gpios, 1, flags), 40, "");
1049 
1050 	/* DT_PHA_BY_NAME */
1051 	zassert_equal(DT_PHA_BY_NAME(TEST_PH, foos, a, foocell), 100, "");
1052 	zassert_equal(DT_PHA_BY_NAME(TEST_PH, foos, b_c, foocell), 110, "");
1053 
1054 	/* DT_PHANDLE_BY_NAME */
1055 	zassert_true(DT_SAME_NODE(DT_PHANDLE_BY_NAME(TEST_PH, foos, a), TEST_GPIO_1), "");
1056 	zassert_true(DT_SAME_NODE(DT_PHANDLE_BY_NAME(TEST_PH, foos, b_c), TEST_GPIO_2), "");
1057 
1058 	/* array initializers */
1059 	zassert_equal(gps[0].pin, 10, "");
1060 	zassert_equal(gps[0].flags, 20, "");
1061 
1062 	zassert_equal(gps[1].pin, 30, "");
1063 	zassert_equal(gps[1].flags, 40, "");
1064 
1065 	/* DT_INST */
1066 	zassert_equal(DT_NUM_INST_STATUS_OKAY(DT_DRV_COMPAT), 1, "");
1067 
1068 	/* DT_INST_PROP_BY_PHANDLE */
1069 	zassert_equal(DT_INST_PROP_BY_PHANDLE(0, ph, ngpios), 100, "");
1070 
1071 	/* DT_INST_PROP_BY_PHANDLE_IDX */
1072 	zassert_equal(DT_INST_PROP_BY_PHANDLE_IDX(0, phs, 0, clock_frequency),
1073 		      100000, "");
1074 	zassert_equal(DT_INST_PROP_BY_PHANDLE_IDX(0, phs, 1, clock_frequency),
1075 		      2000000, "");
1076 	zassert_equal(DT_INST_PROP_BY_PHANDLE_IDX(0, gpios, 0,
1077 					     gpio_controller),
1078 		      1, "");
1079 	zassert_equal(DT_INST_PROP_BY_PHANDLE_IDX(0, gpios, 1,
1080 					     gpio_controller),
1081 		      1, "");
1082 	zassert_equal(DT_INST_PROP_BY_PHANDLE_IDX(0, gpios, 0, ngpios),
1083 		      100, "");
1084 	zassert_equal(DT_INST_PROP_BY_PHANDLE_IDX(0, gpios, 1, ngpios),
1085 		      200, "");
1086 
1087 	/* DT_INST_PROP_HAS_IDX */
1088 	zassert_true(DT_INST_PROP_HAS_IDX(0, gpios, 0), "");
1089 	zassert_true(DT_INST_PROP_HAS_IDX(0, gpios, 1), "");
1090 	zassert_false(DT_INST_PROP_HAS_IDX(0, gpios, 2), "");
1091 
1092 	/* DT_INST_PROP_HAS_NAME */
1093 	zassert_false(DT_INST_PROP_HAS_NAME(0, foos, A), "");
1094 	zassert_true(DT_INST_PROP_HAS_NAME(0, foos, a), "");
1095 	zassert_false(DT_INST_PROP_HAS_NAME(0, foos, b-c), "");
1096 	zassert_true(DT_INST_PROP_HAS_NAME(0, foos, b_c), "");
1097 	zassert_false(DT_INST_PROP_HAS_NAME(0, bazs, jane), "");
1098 
1099 	/* DT_INST_PHA_HAS_CELL_AT_IDX */
1100 	zassert_true(DT_INST_PHA_HAS_CELL_AT_IDX(0, gpios, 1, pin), "");
1101 	zassert_true(DT_INST_PHA_HAS_CELL_AT_IDX(0, gpios, 1, flags), "");
1102 	/* index 1 has nothing, not even a phandle */
1103 	zassert_false(DT_INST_PROP_HAS_IDX(0, pha_gpios, 1), "");
1104 	zassert_false(DT_INST_PHA_HAS_CELL_AT_IDX(0, pha_gpios, 1, pin), "");
1105 	zassert_false(DT_INST_PHA_HAS_CELL_AT_IDX(0, pha_gpios, 1, flags), "");
1106 	/* index 2 only has pin, no flags */
1107 	zassert_true(DT_INST_PHA_HAS_CELL_AT_IDX(0, pha_gpios, 2, pin), "");
1108 	zassert_false(DT_INST_PHA_HAS_CELL_AT_IDX(0, pha_gpios, 2, flags), "");
1109 	/* index 3 has both pin and flags */
1110 	zassert_true(DT_INST_PHA_HAS_CELL_AT_IDX(0, pha_gpios, 3, pin), "");
1111 	zassert_true(DT_INST_PHA_HAS_CELL_AT_IDX(0, pha_gpios, 3, flags), "");
1112 	/* even though index 1 has nothing, the length is still 4 */
1113 	zassert_equal(DT_INST_PROP_LEN(0, pha_gpios), 4, "");
1114 
1115 	/* DT_INST_PHA_HAS_CELL */
1116 	zassert_true(DT_INST_PHA_HAS_CELL(0, gpios, flags), "");
1117 	zassert_false(DT_INST_PHA_HAS_CELL(0, gpios, bar), "");
1118 
1119 	/* DT_INST_PHANDLE_BY_IDX */
1120 	zassert_true(DT_SAME_NODE(DT_INST_PHANDLE_BY_IDX(0, gpios, 0), TEST_GPIO_1), "");
1121 	zassert_true(DT_SAME_NODE(DT_INST_PHANDLE_BY_IDX(0, gpios, 1), TEST_GPIO_2), "");
1122 
1123 	/* DT_INST_PHANDLE */
1124 	zassert_true(DT_SAME_NODE(DT_INST_PHANDLE(0, gpios), TEST_GPIO_1), "");
1125 
1126 	/* DT_INST_PHA */
1127 	zassert_equal(DT_INST_PHA(0, gpios, pin), 10, "");
1128 	zassert_equal(DT_INST_PHA(0, gpios, flags), 20, "");
1129 
1130 	/* DT_INST_PHA_BY_IDX */
1131 	zassert_equal(DT_INST_PHA_BY_IDX(0, gpios, 0, pin), 10, "");
1132 	zassert_equal(DT_INST_PHA_BY_IDX(0, gpios, 0, flags), 20, "");
1133 
1134 	zassert_equal(DT_INST_PHA_BY_IDX(0, gpios, 1, pin), 30, "");
1135 	zassert_equal(DT_INST_PHA_BY_IDX(0, gpios, 1, flags), 40, "");
1136 
1137 	/* DT_INST_PHA_BY_NAME */
1138 	zassert_equal(DT_INST_PHA_BY_NAME(0, foos, a, foocell), 100, "");
1139 	zassert_equal(DT_INST_PHA_BY_NAME(0, foos, b_c, foocell), 110, "");
1140 
1141 	/* DT_INST_PHANDLE_BY_NAME */
1142 	zassert_true(DT_SAME_NODE(DT_INST_PHANDLE_BY_NAME(0, foos, a), TEST_GPIO_1), "");
1143 	zassert_true(DT_SAME_NODE(DT_INST_PHANDLE_BY_NAME(0, foos, b_c), TEST_GPIO_2), "");
1144 }
1145 
1146 #undef DT_DRV_COMPAT
1147 #define DT_DRV_COMPAT vnd_phandle_holder
ZTEST(devicetree_api,test_gpio)1148 ZTEST(devicetree_api, test_gpio)
1149 {
1150 	/* DT_GPIO_CTLR_BY_IDX */
1151 	zassert_true(!strcmp(TO_STRING(DT_GPIO_CTLR_BY_IDX(TEST_PH, gpios, 0)),
1152 			     TO_STRING(DT_NODELABEL(test_gpio_1))), "");
1153 	zassert_true(!strcmp(TO_STRING(DT_GPIO_CTLR_BY_IDX(TEST_PH, gpios, 1)),
1154 			     TO_STRING(DT_NODELABEL(test_gpio_2))), "");
1155 
1156 	/* DT_GPIO_CTLR */
1157 	zassert_true(!strcmp(TO_STRING(DT_GPIO_CTLR(TEST_PH, gpios)),
1158 			     TO_STRING(DT_NODELABEL(test_gpio_1))), "");
1159 
1160 	/* DT_GPIO_PIN_BY_IDX */
1161 	zassert_equal(DT_GPIO_PIN_BY_IDX(TEST_PH, gpios, 0), 10, "");
1162 	zassert_equal(DT_GPIO_PIN_BY_IDX(TEST_PH, gpios, 1), 30, "");
1163 
1164 	/* DT_GPIO_PIN */
1165 	zassert_equal(DT_GPIO_PIN(TEST_PH, gpios), 10, "");
1166 
1167 	/* DT_GPIO_FLAGS_BY_IDX */
1168 	zassert_equal(DT_GPIO_FLAGS_BY_IDX(TEST_PH, gpios, 0), 20, "");
1169 	zassert_equal(DT_GPIO_FLAGS_BY_IDX(TEST_PH, gpios, 1), 40, "");
1170 
1171 	/* DT_GPIO_FLAGS */
1172 	zassert_equal(DT_GPIO_FLAGS(TEST_PH, gpios), 20, "");
1173 
1174 	/* DT_NUM_GPIO_HOGS */
1175 	zassert_equal(DT_NUM_GPIO_HOGS(TEST_GPIO_HOG_1), 2, "");
1176 	zassert_equal(DT_NUM_GPIO_HOGS(TEST_GPIO_HOG_2), 1, "");
1177 	zassert_equal(DT_NUM_GPIO_HOGS(TEST_GPIO_HOG_3), 1, "");
1178 
1179 	/* DT_GPIO_HOG_PIN_BY_IDX */
1180 	zassert_equal(DT_GPIO_HOG_PIN_BY_IDX(TEST_GPIO_HOG_1, 0), 0, "");
1181 	zassert_equal(DT_GPIO_HOG_PIN_BY_IDX(TEST_GPIO_HOG_1, 1), 1, "");
1182 	zassert_equal(DT_GPIO_HOG_PIN_BY_IDX(TEST_GPIO_HOG_2, 0), 3, "");
1183 	zassert_equal(DT_GPIO_HOG_PIN_BY_IDX(TEST_GPIO_HOG_3, 0), 4, "");
1184 
1185 	/* DT_GPIO_HOG_FLAGS_BY_IDX */
1186 	zassert_equal(DT_GPIO_HOG_FLAGS_BY_IDX(TEST_GPIO_HOG_1, 0), 0x00, "");
1187 	zassert_equal(DT_GPIO_HOG_FLAGS_BY_IDX(TEST_GPIO_HOG_1, 1), 0x10, "");
1188 	zassert_equal(DT_GPIO_HOG_FLAGS_BY_IDX(TEST_GPIO_HOG_2, 0), 0x20, "");
1189 	zassert_equal(DT_GPIO_HOG_FLAGS_BY_IDX(TEST_GPIO_HOG_3, 0), 0x30, "");
1190 
1191 	/* DT_INST */
1192 	zassert_equal(DT_NUM_INST_STATUS_OKAY(DT_DRV_COMPAT), 1, "");
1193 
1194 	/* DT_INST_GPIO_PIN_BY_IDX */
1195 	zassert_equal(DT_INST_GPIO_PIN_BY_IDX(0, gpios, 0), 10, "");
1196 	zassert_equal(DT_INST_GPIO_PIN_BY_IDX(0, gpios, 1), 30, "");
1197 
1198 	/* DT_INST_GPIO_PIN */
1199 	zassert_equal(DT_INST_GPIO_PIN(0, gpios), 10, "");
1200 
1201 	/* DT_INST_GPIO_FLAGS_BY_IDX */
1202 	zassert_equal(DT_INST_GPIO_FLAGS_BY_IDX(0, gpios, 0), 20, "");
1203 	zassert_equal(DT_INST_GPIO_FLAGS_BY_IDX(0, gpios, 1), 40, "");
1204 
1205 	/* DT_INST_GPIO_FLAGS */
1206 	zassert_equal(DT_INST_GPIO_FLAGS(0, gpios), 20, "");
1207 }
1208 
1209 #undef DT_DRV_COMPAT
1210 #define DT_DRV_COMPAT vnd_adc_temp_sensor
ZTEST(devicetree_api,test_io_channels)1211 ZTEST(devicetree_api, test_io_channels)
1212 {
1213 	/* DT_IO_CHANNELS_CTLR_BY_IDX */
1214 	zassert_true(DT_SAME_NODE(DT_IO_CHANNELS_CTLR_BY_IDX(TEST_TEMP, 0),
1215 				  TEST_IO_CHANNEL_CTLR_1), "");
1216 	zassert_true(DT_SAME_NODE(DT_IO_CHANNELS_CTLR_BY_IDX(TEST_TEMP, 1),
1217 				  TEST_IO_CHANNEL_CTLR_2), "");
1218 
1219 	/* DT_IO_CHANNELS_CTLR_BY_NAME */
1220 	zassert_true(DT_SAME_NODE(DT_IO_CHANNELS_CTLR_BY_NAME(TEST_TEMP, ch1),
1221 				  TEST_IO_CHANNEL_CTLR_1), "");
1222 	zassert_true(DT_SAME_NODE(DT_IO_CHANNELS_CTLR_BY_NAME(TEST_TEMP, ch2),
1223 				  TEST_IO_CHANNEL_CTLR_2), "");
1224 
1225 	/* DT_IO_CHANNELS_CTLR */
1226 	zassert_true(DT_SAME_NODE(DT_IO_CHANNELS_CTLR(TEST_TEMP),
1227 				  TEST_IO_CHANNEL_CTLR_1), "");
1228 
1229 	/* DT_INST_IO_CHANNELS_CTLR_BY_IDX */
1230 	zassert_true(DT_SAME_NODE(DT_INST_IO_CHANNELS_CTLR_BY_IDX(0, 0),
1231 				  TEST_IO_CHANNEL_CTLR_1), "");
1232 	zassert_true(DT_SAME_NODE(DT_INST_IO_CHANNELS_CTLR_BY_IDX(0, 1),
1233 				  TEST_IO_CHANNEL_CTLR_2), "");
1234 
1235 	/* DT_INST_IO_CHANNELS_CTLR_BY_NAME */
1236 	zassert_true(DT_SAME_NODE(DT_INST_IO_CHANNELS_CTLR_BY_NAME(0, ch1),
1237 				  TEST_IO_CHANNEL_CTLR_1), "");
1238 	zassert_true(DT_SAME_NODE(DT_INST_IO_CHANNELS_CTLR_BY_NAME(0, ch2),
1239 				  TEST_IO_CHANNEL_CTLR_2), "");
1240 
1241 	/* DT_INST_IO_CHANNELS_CTLR */
1242 	zassert_true(DT_SAME_NODE(DT_INST_IO_CHANNELS_CTLR(0),
1243 				  TEST_IO_CHANNEL_CTLR_1), "");
1244 
1245 	zassert_equal(DT_IO_CHANNELS_INPUT_BY_IDX(TEST_TEMP, 0), 10, "");
1246 	zassert_equal(DT_IO_CHANNELS_INPUT_BY_IDX(TEST_TEMP, 1), 20, "");
1247 	zassert_equal(DT_IO_CHANNELS_INPUT_BY_NAME(TEST_TEMP, ch1), 10, "");
1248 	zassert_equal(DT_IO_CHANNELS_INPUT_BY_NAME(TEST_TEMP, ch2), 20, "");
1249 	zassert_equal(DT_IO_CHANNELS_INPUT(TEST_TEMP), 10, "");
1250 
1251 	zassert_equal(DT_INST_IO_CHANNELS_INPUT_BY_IDX(0, 0), 10, "");
1252 	zassert_equal(DT_INST_IO_CHANNELS_INPUT_BY_IDX(0, 1), 20, "");
1253 	zassert_equal(DT_INST_IO_CHANNELS_INPUT_BY_NAME(0, ch1), 10, "");
1254 	zassert_equal(DT_INST_IO_CHANNELS_INPUT_BY_NAME(0, ch2), 20, "");
1255 	zassert_equal(DT_INST_IO_CHANNELS_INPUT(0), 10, "");
1256 }
1257 
1258 #undef DT_DRV_COMPAT
1259 #define DT_DRV_COMPAT vnd_adc_temp_sensor
ZTEST(devicetree_api,test_dma)1260 ZTEST(devicetree_api, test_dma)
1261 {
1262 	/* DT_DMAS_CTLR_BY_IDX */
1263 	zassert_true(DT_SAME_NODE(DT_DMAS_CTLR_BY_IDX(TEST_TEMP, 0),
1264 				  TEST_DMA_CTLR_1), "");
1265 	zassert_true(DT_SAME_NODE(DT_DMAS_CTLR_BY_IDX(TEST_TEMP, 1),
1266 				  TEST_DMA_CTLR_2), "");
1267 
1268 	/* DT_DMAS_CTLR_BY_NAME */
1269 	zassert_true(DT_SAME_NODE(DT_DMAS_CTLR_BY_NAME(TEST_TEMP, tx),
1270 				  TEST_DMA_CTLR_1), "");
1271 	zassert_true(DT_SAME_NODE(DT_DMAS_CTLR_BY_NAME(TEST_TEMP, rx),
1272 				  TEST_DMA_CTLR_2), "");
1273 
1274 	/* DT_DMAS_CTLR */
1275 	zassert_true(DT_SAME_NODE(DT_DMAS_CTLR(TEST_TEMP),
1276 				  TEST_DMA_CTLR_1), "");
1277 
1278 	/* DT_INST_DMAS_CTLR_BY_IDX */
1279 	zassert_true(DT_SAME_NODE(DT_INST_DMAS_CTLR_BY_IDX(0, 0),
1280 				  TEST_DMA_CTLR_1), "");
1281 	zassert_true(DT_SAME_NODE(DT_INST_DMAS_CTLR_BY_IDX(0, 1),
1282 				  TEST_DMA_CTLR_2), "");
1283 
1284 	/* DT_INST_DMAS_CTLR_BY_NAME */
1285 	zassert_true(DT_SAME_NODE(DT_INST_DMAS_CTLR_BY_NAME(0, tx),
1286 				  TEST_DMA_CTLR_1), "");
1287 	zassert_true(DT_SAME_NODE(DT_INST_DMAS_CTLR_BY_NAME(0, rx),
1288 				  TEST_DMA_CTLR_2), "");
1289 
1290 	/* DT_INST_DMAS_CTLR */
1291 	zassert_true(DT_SAME_NODE(DT_INST_DMAS_CTLR(0), TEST_DMA_CTLR_1), "");
1292 
1293 	zassert_equal(DT_DMAS_CELL_BY_NAME(TEST_TEMP, rx, channel), 3, "");
1294 	zassert_equal(DT_INST_DMAS_CELL_BY_NAME(0, rx, channel), 3, "");
1295 	zassert_equal(DT_DMAS_CELL_BY_NAME(TEST_TEMP, rx, slot), 4, "");
1296 	zassert_equal(DT_INST_DMAS_CELL_BY_NAME(0, rx, slot), 4, "");
1297 
1298 	zassert_equal(DT_DMAS_CELL_BY_IDX(TEST_TEMP, 1, channel), 3, "");
1299 	zassert_equal(DT_INST_DMAS_CELL_BY_IDX(0, 1, channel), 3, "");
1300 	zassert_equal(DT_DMAS_CELL_BY_IDX(TEST_TEMP, 1, slot), 4, "");
1301 	zassert_equal(DT_INST_DMAS_CELL_BY_IDX(0, 1, slot), 4, "");
1302 
1303 	zassert_true(DT_DMAS_HAS_NAME(TEST_TEMP, tx), "");
1304 	zassert_true(DT_INST_DMAS_HAS_NAME(0, tx), "");
1305 	zassert_false(DT_DMAS_HAS_NAME(TEST_TEMP, output), "");
1306 	zassert_false(DT_INST_DMAS_HAS_NAME(0, output), "");
1307 
1308 	zassert_true(DT_DMAS_HAS_IDX(TEST_TEMP, 1), "");
1309 	zassert_true(DT_INST_DMAS_HAS_IDX(0, 1), "");
1310 	zassert_false(DT_DMAS_HAS_IDX(TEST_TEMP, 2), "");
1311 	zassert_false(DT_INST_DMAS_HAS_IDX(0, 2), "");
1312 }
1313 
1314 #undef DT_DRV_COMPAT
1315 DT_FOREACH_STATUS_OKAY_VARGS(vnd_video_single_port, DEVICE_DT_DEFINE, NULL, NULL, NULL, NULL,
1316 			     POST_KERNEL, CONFIG_APPLICATION_INIT_PRIORITY, NULL);
1317 DT_FOREACH_STATUS_OKAY_VARGS(vnd_video_multi_port, DEVICE_DT_DEFINE, NULL, NULL, NULL, NULL,
1318 			     POST_KERNEL, CONFIG_APPLICATION_INIT_PRIORITY, NULL);
ZTEST(devicetree_api,test_video)1319 ZTEST(devicetree_api, test_video)
1320 {
1321 	/* DT_INST_PORT_BY_ID */
1322 #define DT_DRV_COMPAT vnd_video_single_port
1323 	zassert_true(DT_SAME_NODE(DT_INST_PORT_BY_ID(0, 0),
1324 				  TEST_VIDEO0_PORT), "get port node of video0");
1325 	zassert_true(DT_SAME_NODE(DT_INST_PORT_BY_ID(1, 0), TEST_VIDEO1_PORT),
1326 		     "get port node of video1");
1327 #undef DT_DRV_COMPAT
1328 #define DT_DRV_COMPAT vnd_video_multi_port
1329 	zassert_true(DT_SAME_NODE(DT_INST_PORT_BY_ID(0, 0), TEST_VIDEO2_PORT0),
1330 		     "get port@0 node of video2");
1331 	zassert_true(DT_SAME_NODE(DT_INST_PORT_BY_ID(0, 1), TEST_VIDEO2_PORT1),
1332 		     "get port@1 node of video2");
1333 #undef DT_DRV_COMPAT
1334 
1335 	/* DT_INST_ENDPOINT_BY_ID */
1336 #define DT_DRV_COMPAT vnd_video_single_port
1337 	zassert_true(DT_SAME_NODE(DT_INST_ENDPOINT_BY_ID(0, 0, 0), TEST_VIDEO0_OUT),
1338 		     "get endpoint node of port node of video0");
1339 	zassert_true(DT_SAME_NODE(DT_INST_ENDPOINT_BY_ID(1, 0, 0), TEST_VIDEO1_OUT0),
1340 		     "get endpoint@0 node of port node of video1");
1341 	zassert_true(DT_SAME_NODE(DT_INST_ENDPOINT_BY_ID(1, 0, 1), TEST_VIDEO1_OUT1),
1342 		     "get endpoint@1 node of port node of video1");
1343 #undef DT_DRV_COMPAT
1344 #define DT_DRV_COMPAT vnd_video_multi_port
1345 	zassert_true(DT_SAME_NODE(DT_INST_ENDPOINT_BY_ID(0, 0, 0), TEST_VIDEO2_PORT0_IN0),
1346 		     "get endpoint@0 node of port@0 node of video2");
1347 	zassert_true(DT_SAME_NODE(DT_INST_ENDPOINT_BY_ID(0, 0, 1), TEST_VIDEO2_PORT0_IN1),
1348 		     "get endpoint@1 node of port@0 node of video2");
1349 	zassert_true(DT_SAME_NODE(DT_INST_ENDPOINT_BY_ID(0, 1, 0), TEST_VIDEO2_PORT1_IN),
1350 		     "get endpoint node of port@1 node of video2");
1351 #undef DT_DRV_COMPAT
1352 
1353 	/* DT_NODE_BY_ENDPOINT */
1354 	zassert_true(DT_SAME_NODE(DT_NODE_BY_ENDPOINT(TEST_VIDEO0_OUT),
1355 				  TEST_VIDEO0), "get video0 node from its endpoint");
1356 	zassert_true(DT_SAME_NODE(DT_NODE_BY_ENDPOINT(TEST_VIDEO1_OUT0), TEST_VIDEO1),
1357 		     "get video1 node from its endpoint@0");
1358 	zassert_true(DT_SAME_NODE(DT_NODE_BY_ENDPOINT(TEST_VIDEO1_OUT1), TEST_VIDEO1),
1359 		     "get video1 node from its endpoint@1");
1360 	zassert_true(DT_SAME_NODE(DT_NODE_BY_ENDPOINT(TEST_VIDEO2_PORT0_IN0), TEST_VIDEO2),
1361 		     "get video2 node from its endpoint@0 at port@0");
1362 	zassert_true(DT_SAME_NODE(DT_NODE_BY_ENDPOINT(TEST_VIDEO2_PORT0_IN1), TEST_VIDEO2),
1363 		     "get video2 node from its endpoint@1 at port@0");
1364 	zassert_true(DT_SAME_NODE(DT_NODE_BY_ENDPOINT(TEST_VIDEO2_PORT1_IN), TEST_VIDEO2),
1365 		     "get video2 node from its endpoint at port@1");
1366 
1367 	/* DT_NODE_REMOTE_DEVICE */
1368 #define DT_DRV_COMPAT vnd_video_single_port
1369 	zassert_true(DT_SAME_NODE(DT_NODE_REMOTE_DEVICE(TEST_VIDEO0_OUT), TEST_VIDEO2),
1370 			 "get remote device node of video0's endpoint");
1371 	zassert_true(DT_SAME_NODE(DT_NODE_REMOTE_DEVICE(TEST_VIDEO1_OUT0), TEST_VIDEO2),
1372 		     "get remote device node of video1's endpoint@0");
1373 	zassert_true(DT_SAME_NODE(DT_NODE_REMOTE_DEVICE(TEST_VIDEO1_OUT1), TEST_VIDEO2),
1374 		     "get remote device node of video1's endpoint@1");
1375 #undef DT_DRV_COMPAT
1376 #define DT_DRV_COMPAT vnd_video_multi_port
1377 	zassert_true(DT_SAME_NODE(DT_NODE_REMOTE_DEVICE(TEST_VIDEO2_PORT0_IN0), TEST_VIDEO0),
1378 		     "get remote device node of video2's port@0 endpoint@0");
1379 	zassert_true(DT_SAME_NODE(DT_NODE_REMOTE_DEVICE(TEST_VIDEO2_PORT0_IN1), TEST_VIDEO1),
1380 		     "get remote device node of video2's port@0 endpoint@1");
1381 	zassert_true(DT_SAME_NODE(DT_NODE_REMOTE_DEVICE(TEST_VIDEO2_PORT1_IN), TEST_VIDEO1),
1382 		     "get remote device node of video2's port@1 endpoint");
1383 #undef DT_DRV_COMPAT
1384 }
1385 
1386 #undef DT_DRV_COMPAT
1387 #define DT_DRV_COMPAT vnd_phandle_holder
ZTEST(devicetree_api,test_pwms)1388 ZTEST(devicetree_api, test_pwms)
1389 {
1390 	/* DT_PWMS_CTLR_BY_IDX */
1391 	zassert_true(DT_SAME_NODE(DT_PWMS_CTLR_BY_IDX(TEST_PH, 0),
1392 				  TEST_PWM_CTLR_1), "");
1393 	zassert_true(DT_SAME_NODE(DT_PWMS_CTLR_BY_IDX(TEST_PH, 1),
1394 				  TEST_PWM_CTLR_2), "");
1395 
1396 	/* DT_PWMS_CTLR_BY_NAME */
1397 	zassert_true(DT_SAME_NODE(DT_PWMS_CTLR_BY_NAME(TEST_PH, red),
1398 				  TEST_PWM_CTLR_1), "");
1399 	zassert_true(DT_SAME_NODE(DT_PWMS_CTLR_BY_NAME(TEST_PH, green),
1400 				  TEST_PWM_CTLR_2), "");
1401 
1402 	/* DT_PWMS_CTLR */
1403 	zassert_true(DT_SAME_NODE(DT_PWMS_CTLR(TEST_PH),
1404 				  TEST_PWM_CTLR_1), "");
1405 
1406 	/* DT_PWMS_CELL_BY_IDX */
1407 	zassert_equal(DT_PWMS_CELL_BY_IDX(TEST_PH, 1, channel), 5, "");
1408 	zassert_equal(DT_PWMS_CELL_BY_IDX(TEST_PH, 1, period), 100, "");
1409 	zassert_equal(DT_PWMS_CELL_BY_IDX(TEST_PH, 1, flags), 1, "");
1410 
1411 	/* DT_PWMS_CELL_BY_NAME */
1412 	zassert_equal(DT_PWMS_CELL_BY_NAME(TEST_PH, red, channel), 8, "");
1413 	zassert_equal(DT_PWMS_CELL_BY_NAME(TEST_PH, red, period), 200, "");
1414 	zassert_equal(DT_PWMS_CELL_BY_NAME(TEST_PH, red, flags), 3, "");
1415 
1416 	/* DT_PWMS_CELL */
1417 	zassert_equal(DT_PWMS_CELL(TEST_PH, channel), 8, "");
1418 	zassert_equal(DT_PWMS_CELL(TEST_PH, period), 200, "");
1419 	zassert_equal(DT_PWMS_CELL(TEST_PH, flags), 3, "");
1420 
1421 	/* DT_PWMS_CHANNEL_BY_IDX */
1422 	zassert_equal(DT_PWMS_CHANNEL_BY_IDX(TEST_PH, 1), 5, "");
1423 
1424 	/* DT_PWMS_CHANNEL_BY_NAME */
1425 	zassert_equal(DT_PWMS_CHANNEL_BY_NAME(TEST_PH, green), 5, "");
1426 
1427 	/* DT_PWMS_CHANNEL */
1428 	zassert_equal(DT_PWMS_CHANNEL(TEST_PH), 8, "");
1429 
1430 	/* DT_PWMS_PERIOD_BY_IDX */
1431 	zassert_equal(DT_PWMS_PERIOD_BY_IDX(TEST_PH, 1), 100, "");
1432 
1433 	/* DT_PWMS_PERIOD_BY_NAME */
1434 	zassert_equal(DT_PWMS_PERIOD_BY_NAME(TEST_PH, green), 100, "");
1435 
1436 	/* DT_PWMS_PERIOD */
1437 	zassert_equal(DT_PWMS_PERIOD(TEST_PH), 200, "");
1438 
1439 	/* DT_PWMS_FLAGS_BY_IDX */
1440 	zassert_equal(DT_PWMS_FLAGS_BY_IDX(TEST_PH, 1), 1, "");
1441 
1442 	/* DT_PWMS_FLAGS_BY_NAME */
1443 	zassert_equal(DT_PWMS_FLAGS_BY_NAME(TEST_PH, green), 1, "");
1444 
1445 	/* DT_PWMS_FLAGS */
1446 	zassert_equal(DT_PWMS_FLAGS(TEST_PH), 3, "");
1447 
1448 	/* DT_INST */
1449 	zassert_equal(DT_NUM_INST_STATUS_OKAY(DT_DRV_COMPAT), 1, "");
1450 
1451 	/* DT_INST_PWMS_CTLR_BY_IDX */
1452 	zassert_true(DT_SAME_NODE(DT_INST_PWMS_CTLR_BY_IDX(0, 0),
1453 				  TEST_PWM_CTLR_1), "");
1454 	zassert_true(DT_SAME_NODE(DT_INST_PWMS_CTLR_BY_IDX(0, 1),
1455 				  TEST_PWM_CTLR_2), "");
1456 
1457 	/* DT_INST_PWMS_CTLR_BY_NAME */
1458 	zassert_true(DT_SAME_NODE(DT_INST_PWMS_CTLR_BY_NAME(0, red),
1459 				  TEST_PWM_CTLR_1), "");
1460 	zassert_true(DT_SAME_NODE(DT_INST_PWMS_CTLR_BY_NAME(0, green),
1461 				  TEST_PWM_CTLR_2), "");
1462 
1463 	/* DT_INST_PWMS_CTLR */
1464 	zassert_true(DT_SAME_NODE(DT_INST_PWMS_CTLR(0), TEST_PWM_CTLR_1), "");
1465 
1466 	/* DT_INST_PWMS_CELL_BY_IDX */
1467 	zassert_equal(DT_INST_PWMS_CELL_BY_IDX(0, 1, channel), 5, "");
1468 	zassert_equal(DT_INST_PWMS_CELL_BY_IDX(0, 1, period), 100, "");
1469 	zassert_equal(DT_INST_PWMS_CELL_BY_IDX(0, 1, flags), 1, "");
1470 
1471 	/* DT_INST_PWMS_CELL_BY_NAME */
1472 	zassert_equal(DT_INST_PWMS_CELL_BY_NAME(0, green, channel), 5, "");
1473 	zassert_equal(DT_INST_PWMS_CELL_BY_NAME(0, green, period), 100, "");
1474 	zassert_equal(DT_INST_PWMS_CELL_BY_NAME(0, green, flags), 1, "");
1475 
1476 	/* DT_INST_PWMS_CELL */
1477 	zassert_equal(DT_INST_PWMS_CELL(0, channel), 8, "");
1478 	zassert_equal(DT_INST_PWMS_CELL(0, period), 200, "");
1479 	zassert_equal(DT_INST_PWMS_CELL(0, flags), 3, "");
1480 
1481 	/* DT_INST_PWMS_CHANNEL_BY_IDX */
1482 	zassert_equal(DT_INST_PWMS_CHANNEL_BY_IDX(0, 1), 5, "");
1483 
1484 	/* DT_INST_PWMS_CHANNEL_BY_NAME */
1485 	zassert_equal(DT_INST_PWMS_CHANNEL_BY_NAME(0, green), 5, "");
1486 
1487 	/* DT_INST_PWMS_CHANNEL */
1488 	zassert_equal(DT_INST_PWMS_CHANNEL(0), 8, "");
1489 
1490 	/* DT_INST_PWMS_PERIOD_BY_IDX */
1491 	zassert_equal(DT_INST_PWMS_PERIOD_BY_IDX(0, 1), 100, "");
1492 
1493 	/* DT_INST_PWMS_PERIOD_BY_NAME */
1494 	zassert_equal(DT_INST_PWMS_PERIOD_BY_NAME(0, red), 200, "");
1495 
1496 	/* DT_INST_PWMS_PERIOD */
1497 	zassert_equal(DT_INST_PWMS_PERIOD(0), 200, "");
1498 
1499 	/* DT_INST_PWMS_FLAGS_BY_IDX */
1500 	zassert_equal(DT_INST_PWMS_FLAGS_BY_IDX(0, 1), 1, "");
1501 
1502 	/* DT_INST_PWMS_FLAGS_BY_NAME */
1503 	zassert_equal(DT_INST_PWMS_FLAGS_BY_NAME(0, red), 3, "");
1504 
1505 	/* DT_INST_PWMS_FLAGS */
1506 	zassert_equal(DT_INST_PWMS_FLAGS(0), 3, "");
1507 }
1508 
1509 #undef DT_DRV_COMPAT
1510 #define DT_DRV_COMPAT vnd_can_controller
ZTEST(devicetree_api,test_can)1511 ZTEST(devicetree_api, test_can)
1512 {
1513 	/* DT_CAN_TRANSCEIVER_MIN_BITRATE */
1514 	zassert_equal(DT_CAN_TRANSCEIVER_MIN_BITRATE(TEST_CAN_CTRL_0, 0), 10000, "");
1515 	zassert_equal(DT_CAN_TRANSCEIVER_MIN_BITRATE(TEST_CAN_CTRL_0, 10000), 10000, "");
1516 	zassert_equal(DT_CAN_TRANSCEIVER_MIN_BITRATE(TEST_CAN_CTRL_0, 20000), 20000, "");
1517 	zassert_equal(DT_CAN_TRANSCEIVER_MIN_BITRATE(TEST_CAN_CTRL_1, 0), 50000, "");
1518 	zassert_equal(DT_CAN_TRANSCEIVER_MIN_BITRATE(TEST_CAN_CTRL_1, 50000), 50000, "");
1519 	zassert_equal(DT_CAN_TRANSCEIVER_MIN_BITRATE(TEST_CAN_CTRL_1, 100000), 100000, "");
1520 	zassert_equal(DT_CAN_TRANSCEIVER_MIN_BITRATE(TEST_CAN_CTRL_2, 0), 0, "");
1521 	zassert_equal(DT_CAN_TRANSCEIVER_MIN_BITRATE(TEST_CAN_CTRL_2, 10000), 10000, "");
1522 	zassert_equal(DT_CAN_TRANSCEIVER_MIN_BITRATE(TEST_CAN_CTRL_2, 20000), 20000, "");
1523 	zassert_equal(DT_CAN_TRANSCEIVER_MIN_BITRATE(TEST_CAN_CTRL_3, 0), 0, "");
1524 	zassert_equal(DT_CAN_TRANSCEIVER_MIN_BITRATE(TEST_CAN_CTRL_3, 30000), 30000, "");
1525 	zassert_equal(DT_CAN_TRANSCEIVER_MIN_BITRATE(TEST_CAN_CTRL_3, 40000), 40000, "");
1526 
1527 	/* DT_INST_CAN_TRANSCEIVER_MIN_BITRATE */
1528 	zassert_equal(DT_INST_CAN_TRANSCEIVER_MIN_BITRATE(0, 0), 10000, "");
1529 	zassert_equal(DT_INST_CAN_TRANSCEIVER_MIN_BITRATE(0, 10000), 10000, "");
1530 	zassert_equal(DT_INST_CAN_TRANSCEIVER_MIN_BITRATE(0, 20000), 20000, "");
1531 	zassert_equal(DT_INST_CAN_TRANSCEIVER_MIN_BITRATE(1, 0), 50000, "");
1532 	zassert_equal(DT_INST_CAN_TRANSCEIVER_MIN_BITRATE(1, 50000), 50000, "");
1533 	zassert_equal(DT_INST_CAN_TRANSCEIVER_MIN_BITRATE(1, 100000), 100000, "");
1534 	zassert_equal(DT_INST_CAN_TRANSCEIVER_MIN_BITRATE(2, 0), 0, "");
1535 	zassert_equal(DT_INST_CAN_TRANSCEIVER_MIN_BITRATE(2, 10000), 10000, "");
1536 	zassert_equal(DT_INST_CAN_TRANSCEIVER_MIN_BITRATE(2, 20000), 20000, "");
1537 	zassert_equal(DT_INST_CAN_TRANSCEIVER_MIN_BITRATE(3, 0), 0, "");
1538 	zassert_equal(DT_INST_CAN_TRANSCEIVER_MIN_BITRATE(3, 30000), 30000, "");
1539 	zassert_equal(DT_INST_CAN_TRANSCEIVER_MIN_BITRATE(3, 40000), 40000, "");
1540 
1541 	/* DT_CAN_TRANSCEIVER_MAX_BITRATE */
1542 	zassert_equal(DT_CAN_TRANSCEIVER_MAX_BITRATE(TEST_CAN_CTRL_0, 1000000), 1000000, "");
1543 	zassert_equal(DT_CAN_TRANSCEIVER_MAX_BITRATE(TEST_CAN_CTRL_0, 5000000), 5000000, "");
1544 	zassert_equal(DT_CAN_TRANSCEIVER_MAX_BITRATE(TEST_CAN_CTRL_0, 8000000), 5000000, "");
1545 	zassert_equal(DT_CAN_TRANSCEIVER_MAX_BITRATE(TEST_CAN_CTRL_1, 125000), 125000, "");
1546 	zassert_equal(DT_CAN_TRANSCEIVER_MAX_BITRATE(TEST_CAN_CTRL_1, 2000000), 2000000, "");
1547 	zassert_equal(DT_CAN_TRANSCEIVER_MAX_BITRATE(TEST_CAN_CTRL_1, 5000000), 2000000, "");
1548 	zassert_equal(DT_CAN_TRANSCEIVER_MAX_BITRATE(TEST_CAN_CTRL_2, 125000), 125000, "");
1549 	zassert_equal(DT_CAN_TRANSCEIVER_MAX_BITRATE(TEST_CAN_CTRL_2, 1000000), 1000000, "");
1550 	zassert_equal(DT_CAN_TRANSCEIVER_MAX_BITRATE(TEST_CAN_CTRL_2, 5000000), 1000000, "");
1551 	zassert_equal(DT_CAN_TRANSCEIVER_MAX_BITRATE(TEST_CAN_CTRL_3, 125000), 125000, "");
1552 	zassert_equal(DT_CAN_TRANSCEIVER_MAX_BITRATE(TEST_CAN_CTRL_3, 1000000), 1000000, "");
1553 	zassert_equal(DT_CAN_TRANSCEIVER_MAX_BITRATE(TEST_CAN_CTRL_3, 5000000), 1000000, "");
1554 
1555 	/* DT_INST_CAN_TRANSCEIVER_MAX_BITRATE */
1556 	zassert_equal(DT_INST_CAN_TRANSCEIVER_MAX_BITRATE(0, 1000000), 1000000, "");
1557 	zassert_equal(DT_INST_CAN_TRANSCEIVER_MAX_BITRATE(0, 5000000), 5000000, "");
1558 	zassert_equal(DT_INST_CAN_TRANSCEIVER_MAX_BITRATE(0, 8000000), 5000000, "");
1559 	zassert_equal(DT_INST_CAN_TRANSCEIVER_MAX_BITRATE(1, 125000), 125000, "");
1560 	zassert_equal(DT_INST_CAN_TRANSCEIVER_MAX_BITRATE(1, 2000000), 2000000, "");
1561 	zassert_equal(DT_INST_CAN_TRANSCEIVER_MAX_BITRATE(1, 5000000), 2000000, "");
1562 	zassert_equal(DT_INST_CAN_TRANSCEIVER_MAX_BITRATE(2, 125000), 125000, "");
1563 	zassert_equal(DT_INST_CAN_TRANSCEIVER_MAX_BITRATE(2, 1000000), 1000000, "");
1564 	zassert_equal(DT_INST_CAN_TRANSCEIVER_MAX_BITRATE(2, 5000000), 1000000, "");
1565 	zassert_equal(DT_INST_CAN_TRANSCEIVER_MAX_BITRATE(3, 125000), 125000, "");
1566 	zassert_equal(DT_INST_CAN_TRANSCEIVER_MAX_BITRATE(3, 1000000), 1000000, "");
1567 	zassert_equal(DT_INST_CAN_TRANSCEIVER_MAX_BITRATE(3, 5000000), 1000000, "");
1568 }
1569 
ZTEST(devicetree_api,test_macro_names)1570 ZTEST(devicetree_api, test_macro_names)
1571 {
1572 	/* white box */
1573 	zassert_true(!strcmp(TO_STRING(DT_PATH(test, gpio_deadbeef)),
1574 			     "DT_N_S_test_S_gpio_deadbeef"), "");
1575 	zassert_true(!strcmp(TO_STRING(DT_ALIAS(test_alias)),
1576 			     "DT_N_S_test_S_gpio_deadbeef"), "");
1577 	zassert_true(!strcmp(TO_STRING(DT_NODELABEL(test_nodelabel)),
1578 			     "DT_N_S_test_S_gpio_deadbeef"), "");
1579 	zassert_true(!strcmp(TO_STRING(DT_NODELABEL(test_nodelabel_allcaps)),
1580 			     "DT_N_S_test_S_gpio_deadbeef"), "");
1581 
1582 #define CHILD_NODE_ID DT_CHILD(DT_PATH(test, i2c_11112222), test_i2c_dev_10)
1583 #define FULL_PATH_ID DT_PATH(test, i2c_11112222, test_i2c_dev_10)
1584 
1585 	zassert_true(!strcmp(TO_STRING(CHILD_NODE_ID),
1586 			     TO_STRING(FULL_PATH_ID)), "");
1587 
1588 #undef CHILD_NODE_ID
1589 #undef FULL_PATH_ID
1590 }
1591 
1592 static int a[] = DT_PROP(TEST_ARRAYS, a);
1593 static unsigned char b[] = DT_PROP(TEST_ARRAYS, b);
1594 static char *c[] = DT_PROP(TEST_ARRAYS, c);
1595 
ZTEST(devicetree_api,test_arrays)1596 ZTEST(devicetree_api, test_arrays)
1597 {
1598 	int ok;
1599 
1600 	zassert_equal(ARRAY_SIZE(a), 3, "");
1601 	zassert_equal(ARRAY_SIZE(b), 4, "");
1602 	zassert_equal(ARRAY_SIZE(c), 2, "");
1603 
1604 	zassert_equal(a[0], 1000, "");
1605 	zassert_equal(a[1], 2000, "");
1606 	zassert_equal(a[2], 3000, "");
1607 
1608 	zassert_true(DT_PROP_HAS_IDX(TEST_ARRAYS, a, 0), "");
1609 	zassert_true(DT_PROP_HAS_IDX(TEST_ARRAYS, a, 1), "");
1610 	zassert_true(DT_PROP_HAS_IDX(TEST_ARRAYS, a, 2), "");
1611 	zassert_false(DT_PROP_HAS_IDX(TEST_ARRAYS, a, 3), "");
1612 
1613 	/*
1614 	 * Verify that DT_PROP_HAS_IDX can be used with COND_CODE_1()
1615 	 * and COND_CODE_0(), i.e. its expansion is a literal 1 or 0,
1616 	 * not an equivalent expression that evaluates to 1 or 0.
1617 	 */
1618 	ok = 0;
1619 	COND_CODE_1(DT_PROP_HAS_IDX(TEST_ARRAYS, a, 0), (ok = 1;), ());
1620 	zassert_equal(ok, 1, "");
1621 	ok = 0;
1622 	COND_CODE_0(DT_PROP_HAS_IDX(TEST_ARRAYS, a, 3), (ok = 1;), ());
1623 	zassert_equal(ok, 1, "");
1624 
1625 	zassert_equal(DT_PROP_BY_IDX(TEST_ARRAYS, a, 0), a[0], "");
1626 	zassert_equal(DT_PROP_BY_IDX(TEST_ARRAYS, a, 1), a[1], "");
1627 	zassert_equal(DT_PROP_BY_IDX(TEST_ARRAYS, a, 2), a[2], "");
1628 	zassert_equal(DT_PROP_LAST(TEST_ARRAYS, a), a[2], "");
1629 
1630 	zassert_equal(DT_PROP_LEN(TEST_ARRAYS, a), 3, "");
1631 
1632 	zassert_equal(b[0], 0xaa, "");
1633 	zassert_equal(b[1], 0xbb, "");
1634 	zassert_equal(b[2], 0xcc, "");
1635 	zassert_equal(b[3], 0xdd, "");
1636 
1637 	zassert_true(DT_PROP_HAS_IDX(TEST_ARRAYS, b, 0), "");
1638 	zassert_true(DT_PROP_HAS_IDX(TEST_ARRAYS, b, 1), "");
1639 	zassert_true(DT_PROP_HAS_IDX(TEST_ARRAYS, b, 2), "");
1640 	zassert_true(DT_PROP_HAS_IDX(TEST_ARRAYS, b, 3), "");
1641 	zassert_false(DT_PROP_HAS_IDX(TEST_ARRAYS, b, 4), "");
1642 
1643 	zassert_equal(DT_PROP_BY_IDX(TEST_ARRAYS, b, 0), b[0], "");
1644 	zassert_equal(DT_PROP_BY_IDX(TEST_ARRAYS, b, 1), b[1], "");
1645 	zassert_equal(DT_PROP_BY_IDX(TEST_ARRAYS, b, 2), b[2], "");
1646 	zassert_equal(DT_PROP_BY_IDX(TEST_ARRAYS, b, 3), b[3], "");
1647 
1648 	zassert_equal(DT_PROP_LEN(TEST_ARRAYS, b), 4, "");
1649 
1650 	zassert_true(!strcmp(c[0], "bar"), "");
1651 	zassert_true(!strcmp(c[1], "baz"), "");
1652 
1653 	zassert_true(DT_PROP_HAS_IDX(TEST_ARRAYS, c, 0), "");
1654 	zassert_true(DT_PROP_HAS_IDX(TEST_ARRAYS, c, 1), "");
1655 	zassert_false(DT_PROP_HAS_IDX(TEST_ARRAYS, c, 2), "");
1656 
1657 	zassert_true(!strcmp(DT_PROP_BY_IDX(TEST_ARRAYS, c, 0), c[0]), "");
1658 	zassert_true(!strcmp(DT_PROP_BY_IDX(TEST_ARRAYS, c, 1), c[1]), "");
1659 
1660 	zassert_equal(DT_PROP_LEN(TEST_ARRAYS, c), 2, "");
1661 }
1662 
ZTEST(devicetree_api,test_foreach)1663 ZTEST(devicetree_api, test_foreach)
1664 {
1665 	/*
1666 	 * We don't know what platform we are running on, so settle for
1667 	 * some basic checks related to nodes we know are in our overlay.
1668 	 */
1669 #define IS_ALIASES(node_id) + DT_SAME_NODE(DT_PATH(aliases), node_id)
1670 #define IS_DISABLED_GPIO(node_id) + DT_SAME_NODE(DT_NODELABEL(disabled_gpio), \
1671 						node_id)
1672 	zassert_equal(1, DT_FOREACH_NODE(IS_ALIASES), "");
1673 	zassert_equal(1, DT_FOREACH_NODE(IS_DISABLED_GPIO), "");
1674 	zassert_equal(1, DT_FOREACH_STATUS_OKAY_NODE(IS_ALIASES), "");
1675 	zassert_equal(0, DT_FOREACH_STATUS_OKAY_NODE(IS_DISABLED_GPIO), "");
1676 
1677 #define IS_ALIASES_VARGS(node_id, mul) + ((mul) * DT_SAME_NODE(DT_PATH(aliases), node_id))
1678 #define IS_DISABLED_GPIO_VARGS(node_id, mul) + ((mul) * \
1679 			       DT_SAME_NODE(DT_NODELABEL(disabled_gpio), node_id))
1680 	zassert_equal(2, DT_FOREACH_NODE_VARGS(IS_ALIASES_VARGS, 2), "");
1681 	zassert_equal(2, DT_FOREACH_NODE_VARGS(IS_DISABLED_GPIO_VARGS, 2), "");
1682 	zassert_equal(2, DT_FOREACH_STATUS_OKAY_NODE_VARGS(IS_ALIASES_VARGS, 2), "");
1683 	zassert_equal(0, DT_FOREACH_STATUS_OKAY_NODE_VARGS(IS_DISABLED_GPIO_VARGS, 2), "");
1684 
1685 
1686 #undef IS_ALIASES
1687 #undef IS_DISABLED_GPIO
1688 #undef IS_ALIASES_VARGS
1689 #undef IS_DISABLED_GPIO_VARGS
1690 }
1691 
1692 #undef DT_DRV_COMPAT
1693 #define DT_DRV_COMPAT vnd_gpio_device
ZTEST(devicetree_api,test_foreach_status_okay)1694 ZTEST(devicetree_api, test_foreach_status_okay)
1695 {
1696 	/*
1697 	 * For-each-node type macro tests.
1698 	 *
1699 	 * See test_foreach_prop_elem*() for tests of
1700 	 * for-each-property type macros.
1701 	 */
1702 	unsigned int val;
1703 	const char *str;
1704 
1705 	/* This should expand to something like:
1706 	 *
1707 	 * "/test/enum-0" "/test/enum-1"
1708 	 *
1709 	 * but there is no guarantee about the order of nodes in the
1710 	 * expansion, so we test both.
1711 	 */
1712 	str = DT_FOREACH_STATUS_OKAY(vnd_enum_holder, DT_NODE_PATH);
1713 	zassert_true(!strcmp(str, "/test/enum-0/test/enum-1") ||
1714 		     !strcmp(str, "/test/enum-1/test/enum-0"), "");
1715 
1716 #undef MY_FN
1717 #define MY_FN(node_id, operator) DT_ENUM_IDX(node_id, val) operator
1718 	/* This should expand to something like:
1719 	 *
1720 	 * 0 + 2 + 3
1721 	 *
1722 	 * and order of expansion doesn't matter, since we're adding
1723 	 * the values all up.
1724 	 */
1725 	val = DT_FOREACH_STATUS_OKAY_VARGS(vnd_enum_holder, MY_FN, +) 3;
1726 	zassert_equal(val, 5, "");
1727 
1728 #undef MY_FN
1729 #define MY_FN(inst, compat, operator) DT_ENUM_IDX(DT_INST(inst, compat), val) operator
1730 	/* This should expand to something like:
1731 	 *
1732 	 * 0 + 2 + 3
1733 	 *
1734 	 * and order of expansion doesn't matter, since we're adding
1735 	 * the values all up.
1736 	 */
1737 	val = DT_COMPAT_FOREACH_STATUS_OKAY_VARGS(vnd_enum_holder, MY_FN, +) 3;
1738 	zassert_equal(val, 5, "");
1739 
1740 	/*
1741 	 * Make sure DT_INST_FOREACH_STATUS_OKAY can be called from functions
1742 	 * using macros with side effects in the current scope.
1743 	 */
1744 	val = 0;
1745 #define INC(inst_ignored) do { val++; } while (0);
1746 	DT_INST_FOREACH_STATUS_OKAY(INC)
1747 	zassert_equal(val, 2, "");
1748 #undef INC
1749 
1750 	val = 0;
1751 #define INC_ARG(arg) do { val++; val += arg; } while (0)
1752 #define INC(inst_ignored, arg) INC_ARG(arg);
1753 	DT_INST_FOREACH_STATUS_OKAY_VARGS(INC, 1)
1754 	zassert_equal(val, 4, "");
1755 #undef INC_ARG
1756 #undef INC
1757 
1758 	/*
1759 	 * Make sure DT_INST_FOREACH_STATUS_OKAY works with 0 instances, and does
1760 	 * not expand its argument at all.
1761 	 */
1762 #undef DT_DRV_COMPAT
1763 #define DT_DRV_COMPAT xxxx
1764 #define BUILD_BUG_ON_EXPANSION (there is a bug in devicetree.h)
1765 	DT_INST_FOREACH_STATUS_OKAY(BUILD_BUG_ON_EXPANSION)
1766 #undef BUILD_BUG_ON_EXPANSION
1767 
1768 #undef DT_DRV_COMPAT
1769 #define DT_DRV_COMPAT xxxx
1770 #define BUILD_BUG_ON_EXPANSION(arg) (there is a bug in devicetree.h)
1771 	DT_INST_FOREACH_STATUS_OKAY_VARGS(BUILD_BUG_ON_EXPANSION, 1)
1772 #undef BUILD_BUG_ON_EXPANSION
1773 }
1774 
ZTEST(devicetree_api,test_foreach_nodelabel)1775 ZTEST(devicetree_api, test_foreach_nodelabel)
1776 {
1777 #undef DT_DRV_COMPAT
1778 #define DT_DRV_COMPAT vnd_adc_temp_sensor
1779 #define ENTRY(nodelabel) enum_ ## nodelabel,
1780 #define VAR_PLUS(nodelabel, to_add) int nodelabel ## _added = enum_ ## nodelabel + to_add;
1781 
1782 	/* DT_FOREACH_NODELABEL */
1783 	enum {
1784 		DT_FOREACH_NODELABEL(DT_NODELABEL(test_nodelabel), ENTRY)
1785 	};
1786 	zassert_equal(enum_test_nodelabel, 0, "");
1787 	zassert_equal(enum_TEST_NODELABEL_ALLCAPS, 1, "");
1788 	zassert_equal(enum_test_gpio_1, 2, "");
1789 
1790 	/* DT_FOREACH_NODELABEL_VARGS */
1791 	DT_FOREACH_NODELABEL_VARGS(DT_NODELABEL(test_nodelabel), VAR_PLUS, 1);
1792 	zassert_equal(test_nodelabel_added, 1, "");
1793 	zassert_equal(TEST_NODELABEL_ALLCAPS_added, 2, "");
1794 	zassert_equal(test_gpio_1_added, 3, "");
1795 
1796 	/* DT_NODELABEL_STRING_ARRAY is tested here since it's closely related */
1797 	const char *nodelabels[] = DT_NODELABEL_STRING_ARRAY(DT_NODELABEL(test_nodelabel));
1798 
1799 	zassert_equal(ARRAY_SIZE(nodelabels), 3);
1800 	zassert_true(!strcmp(nodelabels[0], "test_nodelabel"), "");
1801 	zassert_true(!strcmp(nodelabels[1], "TEST_NODELABEL_ALLCAPS"), "");
1802 	zassert_true(!strcmp(nodelabels[2], "test_gpio_1"), "");
1803 
1804 	/* DT_NUM_NODELABELS */
1805 	zassert_equal(DT_NUM_NODELABELS(DT_NODELABEL(test_nodelabel)), 3, "");
1806 	zassert_equal(DT_NUM_NODELABELS(DT_PATH(chosen)), 0, "");
1807 	zassert_equal(DT_NUM_NODELABELS(DT_ROOT), 0, "");
1808 
1809 	/* DT_INST_FOREACH_NODELABEL */
1810 	enum {
1811 		DT_INST_FOREACH_NODELABEL(0, ENTRY)
1812 	};
1813 	zassert_equal(enum_test_temp_sensor, 0, "");
1814 
1815 	/* DT_INST_FOREACH_NODELABEL_VARGS */
1816 	DT_INST_FOREACH_NODELABEL_VARGS(0, VAR_PLUS, 1);
1817 	zassert_equal(test_temp_sensor_added, 1, "");
1818 
1819 	/* DT_INST_NODELABEL_STRING_ARRAY */
1820 	const char *inst_nodelabels[] = DT_INST_NODELABEL_STRING_ARRAY(0);
1821 
1822 	zassert_equal(ARRAY_SIZE(inst_nodelabels), 1);
1823 	zassert_true(!strcmp(inst_nodelabels[0], "test_temp_sensor"), "");
1824 
1825 	/* DT_INST_NUM_NODELABELS */
1826 	zassert_equal(DT_INST_NUM_NODELABELS(0), 1, "");
1827 
1828 #undef VAR_PLUS
1829 #undef ENTRY
1830 #undef DT_DRV_COMPAT
1831 }
1832 
ZTEST(devicetree_api,test_foreach_prop_elem)1833 ZTEST(devicetree_api, test_foreach_prop_elem)
1834 {
1835 #define TIMES_TWO(node_id, prop, idx) \
1836 	(2 * DT_PROP_BY_IDX(node_id, prop, idx)),
1837 #define BY_IDX_COMMA(node_id, prop, idx) DT_PROP_BY_IDX(node_id, prop, idx),
1838 
1839 	int array_a[] = {
1840 		DT_FOREACH_PROP_ELEM(TEST_ARRAYS, a, TIMES_TWO)
1841 	};
1842 
1843 	zassert_equal(ARRAY_SIZE(array_a), 3, "");
1844 	zassert_equal(array_a[0], 2000, "");
1845 	zassert_equal(array_a[1], 4000, "");
1846 	zassert_equal(array_a[2], 6000, "");
1847 
1848 	int array_b[] = {
1849 		DT_FOREACH_PROP_ELEM(TEST_ARRAYS, b, TIMES_TWO)
1850 	};
1851 
1852 	zassert_equal(ARRAY_SIZE(array_b), 4, "");
1853 	zassert_equal(array_b[0], 2 * 0xAA, "");
1854 	zassert_equal(array_b[1], 2 * 0xBB, "");
1855 	zassert_equal(array_b[2], 2 * 0xCC, "");
1856 	zassert_equal(array_b[3], 2 * 0xDD, "");
1857 
1858 	static const char * const array_c[] = {
1859 		DT_FOREACH_PROP_ELEM(TEST_ARRAYS, c, BY_IDX_COMMA)
1860 	};
1861 
1862 	zassert_equal(ARRAY_SIZE(array_c), 2, "");
1863 	zassert_true(!strcmp(array_c[0], "bar"), "");
1864 	zassert_true(!strcmp(array_c[1], "baz"), "");
1865 
1866 	static const char * const array_val[] = {
1867 		DT_FOREACH_PROP_ELEM(TEST_ENUM_0, val, BY_IDX_COMMA)
1868 	};
1869 
1870 	zassert_equal(ARRAY_SIZE(array_val), 1, "");
1871 	zassert_true(!strcmp(array_val[0], "zero"), "");
1872 
1873 	static const char * const string_zephyr_user[] = {
1874 		DT_FOREACH_PROP_ELEM(ZEPHYR_USER, string, BY_IDX_COMMA)
1875 	};
1876 
1877 	zassert_equal(ARRAY_SIZE(string_zephyr_user), 1, "");
1878 	zassert_true(!strcmp(string_zephyr_user[0], "foo"), "");
1879 
1880 #undef BY_IDX_COMMA
1881 
1882 #define PATH_COMMA(node_id, prop, idx) \
1883 	DT_NODE_PATH(DT_PROP_BY_IDX(node_id, prop, idx)),
1884 
1885 	static const char * const array_ph[] = {
1886 		DT_FOREACH_PROP_ELEM(TEST_PH, ph, PATH_COMMA)
1887 	};
1888 
1889 	zassert_equal(ARRAY_SIZE(array_ph), 1, "");
1890 	zassert_true(!strcmp(array_ph[0], DT_NODE_PATH(TEST_GPIO_1)), "");
1891 
1892 	static const char * const array_zephyr_user_ph[] = {
1893 		DT_FOREACH_PROP_ELEM(ZEPHYR_USER, ph, PATH_COMMA)
1894 	};
1895 
1896 	zassert_equal(ARRAY_SIZE(array_zephyr_user_ph), 1, "");
1897 	zassert_true(!strcmp(array_zephyr_user_ph[0],
1898 			     DT_NODE_PATH(TEST_GPIO_1)), "");
1899 
1900 	static const char * const array_phs[] = {
1901 		DT_FOREACH_PROP_ELEM(TEST_PH, phs, PATH_COMMA)
1902 	};
1903 
1904 	zassert_equal(ARRAY_SIZE(array_phs), 2, "");
1905 	zassert_true(!strcmp(array_phs[0], DT_NODE_PATH(TEST_I2C)), "");
1906 	zassert_true(!strcmp(array_phs[1], DT_NODE_PATH(TEST_SPI)), "");
1907 
1908 #undef PATH_COMMA
1909 
1910 #define PIN_COMMA(node_id, prop, idx) DT_GPIO_PIN_BY_IDX(node_id, prop, idx),
1911 
1912 	int array_gpios[] = {
1913 		DT_FOREACH_PROP_ELEM(TEST_PH, gpios, PIN_COMMA)
1914 	};
1915 
1916 	zassert_equal(ARRAY_SIZE(array_gpios), 2, "");
1917 	zassert_equal(array_gpios[0], 10, "");
1918 	zassert_equal(array_gpios[1], 30, "");
1919 
1920 #undef PATH_COMMA
1921 
1922 	int array_sep[] = {
1923 		DT_FOREACH_PROP_ELEM_SEP(TEST_ARRAYS, a, DT_PROP_BY_IDX, (,))
1924 	};
1925 
1926 	zassert_equal(ARRAY_SIZE(array_sep), 3, "");
1927 	zassert_equal(array_sep[0], 1000, "");
1928 	zassert_equal(array_sep[1], 2000, "");
1929 	zassert_equal(array_sep[2], 3000, "");
1930 
1931 #undef DT_DRV_COMPAT
1932 #define DT_DRV_COMPAT vnd_array_holder
1933 
1934 	int inst_array[] = {
1935 		DT_INST_FOREACH_PROP_ELEM(0, a, TIMES_TWO)
1936 	};
1937 
1938 	zassert_equal(ARRAY_SIZE(inst_array), ARRAY_SIZE(array_a), "");
1939 	zassert_equal(inst_array[0], array_a[0], "");
1940 	zassert_equal(inst_array[1], array_a[1], "");
1941 	zassert_equal(inst_array[2], array_a[2], "");
1942 
1943 	int inst_array_sep[] = {
1944 		DT_INST_FOREACH_PROP_ELEM_SEP(0, a, DT_PROP_BY_IDX, (,))
1945 	};
1946 
1947 	zassert_equal(ARRAY_SIZE(inst_array_sep), ARRAY_SIZE(array_sep), "");
1948 	zassert_equal(inst_array_sep[0], array_sep[0], "");
1949 	zassert_equal(inst_array_sep[1], array_sep[1], "");
1950 	zassert_equal(inst_array_sep[2], array_sep[2], "");
1951 #undef TIMES_TWO
1952 }
1953 
ZTEST(devicetree_api,test_foreach_prop_elem_varg)1954 ZTEST(devicetree_api, test_foreach_prop_elem_varg)
1955 {
1956 #define TIMES_TWO_ADD(node_id, prop, idx, arg) \
1957 	((2 * DT_PROP_BY_IDX(node_id, prop, idx)) + arg),
1958 
1959 	int array[] = {
1960 		DT_FOREACH_PROP_ELEM_VARGS(TEST_ARRAYS, a, TIMES_TWO_ADD, 3)
1961 	};
1962 
1963 	zassert_equal(ARRAY_SIZE(array), 3, "");
1964 	zassert_equal(array[0], 2003, "");
1965 	zassert_equal(array[1], 4003, "");
1966 	zassert_equal(array[2], 6003, "");
1967 
1968 #define PROP_PLUS_ARG(node_id, prop, idx, arg) \
1969 	(DT_PROP_BY_IDX(node_id, prop, idx) + arg)
1970 
1971 	int array_sep[] = {
1972 		DT_FOREACH_PROP_ELEM_SEP_VARGS(TEST_ARRAYS, a, PROP_PLUS_ARG,
1973 					       (,), 3)
1974 	};
1975 
1976 	zassert_equal(ARRAY_SIZE(array_sep), 3, "");
1977 	zassert_equal(array_sep[0], 1003, "");
1978 	zassert_equal(array_sep[1], 2003, "");
1979 	zassert_equal(array_sep[2], 3003, "");
1980 
1981 #undef DT_DRV_COMPAT
1982 #define DT_DRV_COMPAT vnd_array_holder
1983 
1984 	int inst_array[] = {
1985 		DT_INST_FOREACH_PROP_ELEM_VARGS(0, a, TIMES_TWO_ADD, 3)
1986 	};
1987 
1988 	zassert_equal(ARRAY_SIZE(inst_array), ARRAY_SIZE(array), "");
1989 	zassert_equal(inst_array[0], array[0], "");
1990 	zassert_equal(inst_array[1], array[1], "");
1991 	zassert_equal(inst_array[2], array[2], "");
1992 
1993 	int inst_array_sep[] = {
1994 		DT_INST_FOREACH_PROP_ELEM_SEP_VARGS(0, a, PROP_PLUS_ARG, (,),
1995 						    3)
1996 	};
1997 
1998 	zassert_equal(ARRAY_SIZE(inst_array_sep), ARRAY_SIZE(array_sep), "");
1999 	zassert_equal(inst_array_sep[0], array_sep[0], "");
2000 	zassert_equal(inst_array_sep[1], array_sep[1], "");
2001 	zassert_equal(inst_array_sep[2], array_sep[2], "");
2002 #undef TIMES_TWO
2003 }
2004 
2005 struct test_gpio_info {
2006 	uint32_t reg_addr;
2007 	uint32_t reg_len;
2008 };
2009 
2010 struct test_gpio_data {
2011 	bool init_called;
2012 	bool is_gpio_ctlr;
2013 };
2014 
test_gpio_init(const struct device * dev)2015 static int test_gpio_init(const struct device *dev)
2016 {
2017 	struct test_gpio_data *data = dev->data;
2018 
2019 	data->init_called = 1;
2020 	return 0;
2021 }
2022 
2023 #undef DT_DRV_COMPAT
2024 #define DT_DRV_COMPAT vnd_gpio_device
2025 
2026 static DEVICE_API(gpio, test_api);
2027 
2028 #define TEST_GPIO_INIT(num)					\
2029 	static struct test_gpio_data gpio_data_##num = {	\
2030 		.is_gpio_ctlr = DT_INST_PROP(num,		\
2031 					     gpio_controller),	\
2032 	};							\
2033 	static const struct test_gpio_info gpio_info_##num = {	\
2034 		.reg_addr = DT_INST_REG_ADDR(num),		\
2035 		.reg_len = DT_INST_REG_SIZE(num),		\
2036 	};							\
2037 	DEVICE_DT_INST_DEFINE(num,				\
2038 			      test_gpio_init,			\
2039 			      NULL,				\
2040 			      &gpio_data_##num,			\
2041 			      &gpio_info_##num,			\
2042 			      POST_KERNEL,			\
2043 			      CONFIG_APPLICATION_INIT_PRIORITY,	\
2044 			      &test_api);
2045 
2046 DT_INST_FOREACH_STATUS_OKAY(TEST_GPIO_INIT)
2047 
ZTEST(devicetree_api,test_devices)2048 ZTEST(devicetree_api, test_devices)
2049 {
2050 	const struct device *devs[2] = { DEVICE_DT_INST_GET(0), DEVICE_DT_INST_GET(1) };
2051 	const struct device *dev_abcd;
2052 	struct test_gpio_data *data_dev0;
2053 	struct test_gpio_data *data_dev1;
2054 	const struct test_gpio_info *config_abdc;
2055 
2056 	zassert_equal(DT_NUM_INST_STATUS_OKAY(vnd_gpio_device), 2, "");
2057 
2058 	data_dev0 = devs[0]->data;
2059 	data_dev1 = devs[1]->data;
2060 
2061 	zassert_not_null(devs[0], "");
2062 	zassert_not_null(devs[1], "");
2063 
2064 	zassert_true(data_dev0->is_gpio_ctlr, "");
2065 	zassert_true(data_dev1->is_gpio_ctlr, "");
2066 	zassert_true(data_dev0->init_called, "");
2067 	zassert_true(data_dev1->init_called, "");
2068 
2069 	dev_abcd = DEVICE_DT_GET(TEST_ABCD1234);
2070 	config_abdc = dev_abcd->config;
2071 	zassert_not_null(dev_abcd, "");
2072 	zassert_equal(config_abdc->reg_addr, 0xabcd1234, "");
2073 	zassert_equal(config_abdc->reg_len, 0x500, "");
2074 }
2075 
ZTEST(devicetree_api,test_cs_gpios)2076 ZTEST(devicetree_api, test_cs_gpios)
2077 {
2078 	zassert_equal(DT_SPI_HAS_CS_GPIOS(TEST_SPI_NO_CS), 0, "");
2079 	zassert_equal(DT_SPI_NUM_CS_GPIOS(TEST_SPI_NO_CS), 0, "");
2080 
2081 	zassert_equal(DT_SPI_HAS_CS_GPIOS(TEST_SPI), 1, "");
2082 	zassert_equal(DT_SPI_NUM_CS_GPIOS(TEST_SPI), 3, "");
2083 
2084 	zassert_equal(DT_DEP_ORD(DT_SPI_DEV_CS_GPIOS_CTLR(TEST_SPI_DEV_0)),
2085 		      DT_DEP_ORD(DT_NODELABEL(test_gpio_1)),
2086 		     "dev 0 cs gpio controller");
2087 	zassert_equal(DT_SPI_DEV_CS_GPIOS_PIN(TEST_SPI_DEV_0), 0x10, "");
2088 	zassert_equal(DT_SPI_DEV_CS_GPIOS_FLAGS(TEST_SPI_DEV_0), 0x20, "");
2089 }
2090 
ZTEST(devicetree_api,test_chosen)2091 ZTEST(devicetree_api, test_chosen)
2092 {
2093 	zassert_equal(DT_HAS_CHOSEN(ztest_xxxx), 0, "");
2094 	zassert_equal(DT_HAS_CHOSEN(ztest_gpio), 1, "");
2095 	zassert_true(!strcmp(TO_STRING(DT_CHOSEN(ztest_gpio)),
2096 			     "DT_N_S_test_S_gpio_deadbeef"), "");
2097 }
2098 
2099 #define TO_MY_ENUM(token) TO_MY_ENUM_2(token) /* force another expansion */
2100 #define TO_MY_ENUM_2(token) MY_ENUM_ ## token
ZTEST(devicetree_api,test_enums)2101 ZTEST(devicetree_api, test_enums)
2102 {
2103 	enum {
2104 		MY_ENUM_zero = 0xff,
2105 		MY_ENUM_ZERO = 0xaa,
2106 	};
2107 
2108 	/* DT_ENUM_IDX and DT_ENUM_HAS_VALUE on string enum */
2109 	zassert_equal(DT_ENUM_IDX(TEST_ENUM_0, val), 0, "0");
2110 	zassert_true(DT_ENUM_HAS_VALUE(TEST_ENUM_0, val, zero), "");
2111 	zassert_false(DT_ENUM_HAS_VALUE(TEST_ENUM_0, val, one), "");
2112 	zassert_false(DT_ENUM_HAS_VALUE(TEST_ENUM_0, val, two), "");
2113 
2114 	/* DT_ENUM_IDX and DT_ENUM_HAS_VALUE on int enum */
2115 	zassert_equal(DT_ENUM_IDX(DT_NODELABEL(test_enum_int_default_0), val), 0, "0");
2116 	zassert_true(DT_ENUM_HAS_VALUE(DT_NODELABEL(test_enum_int_default_0), val, 5), "");
2117 	zassert_false(DT_ENUM_HAS_VALUE(DT_NODELABEL(test_enum_int_default_0), val, 6), "");
2118 	zassert_false(DT_ENUM_HAS_VALUE(DT_NODELABEL(test_enum_int_default_0), val, 7), "");
2119 
2120 	/* DT_ENUM_IDX_BY_IDX and DT_ENUM_HAS_VALUE_BY_IDX on string-array enum */
2121 	zassert_equal(DT_ENUM_IDX_BY_IDX(DT_NODELABEL(test_enum_string_array), val, 0), 0);
2122 	zassert_equal(DT_ENUM_IDX_BY_IDX(DT_NODELABEL(test_enum_string_array), val, 1), 3);
2123 	zassert_equal(DT_ENUM_IDX_BY_IDX(DT_NODELABEL(test_enum_string_array), val, 2), 0);
2124 	zassert_true(DT_ENUM_HAS_VALUE_BY_IDX(DT_NODELABEL(test_enum_string_array), val, 0, foo));
2125 	zassert_false(DT_ENUM_HAS_VALUE_BY_IDX(DT_NODELABEL(test_enum_string_array), val, 0, bar));
2126 	zassert_false(DT_ENUM_HAS_VALUE_BY_IDX(DT_NODELABEL(test_enum_string_array), val, 0, baz));
2127 	zassert_false(DT_ENUM_HAS_VALUE_BY_IDX(DT_NODELABEL(test_enum_string_array), val, 0, zoo));
2128 	zassert_true(DT_ENUM_HAS_VALUE_BY_IDX(DT_NODELABEL(test_enum_string_array), val, 1, zoo));
2129 	zassert_false(DT_ENUM_HAS_VALUE_BY_IDX(DT_NODELABEL(test_enum_string_array), val, 1, foo));
2130 	zassert_false(DT_ENUM_HAS_VALUE_BY_IDX(DT_NODELABEL(test_enum_string_array), val, 1, bar));
2131 	zassert_false(DT_ENUM_HAS_VALUE_BY_IDX(DT_NODELABEL(test_enum_string_array), val, 1, baz));
2132 	zassert_true(DT_ENUM_HAS_VALUE_BY_IDX(DT_NODELABEL(test_enum_string_array), val, 2, foo));
2133 	zassert_false(DT_ENUM_HAS_VALUE_BY_IDX(DT_NODELABEL(test_enum_string_array), val, 2, baz));
2134 	zassert_false(DT_ENUM_HAS_VALUE_BY_IDX(DT_NODELABEL(test_enum_string_array), val, 2, bar));
2135 	zassert_false(DT_ENUM_HAS_VALUE_BY_IDX(DT_NODELABEL(test_enum_string_array), val, 2, zoo));
2136 
2137 	/* DT_ENUM_IDX_BY_IDX and DT_ENUM_HAS_VALUE_BY_IDX on int-array enum */
2138 	zassert_equal(DT_ENUM_IDX_BY_IDX(DT_NODELABEL(test_enum_int_array), val, 0), 3);
2139 	zassert_equal(DT_ENUM_IDX_BY_IDX(DT_NODELABEL(test_enum_int_array), val, 1), 4);
2140 	zassert_equal(DT_ENUM_IDX_BY_IDX(DT_NODELABEL(test_enum_int_array), val, 2), 3);
2141 	zassert_equal(DT_ENUM_IDX_BY_IDX(DT_NODELABEL(test_enum_int_array), val, 3), 7);
2142 	zassert_true(DT_ENUM_HAS_VALUE_BY_IDX(DT_NODELABEL(test_enum_int_array), val, 0, 4));
2143 	zassert_false(DT_ENUM_HAS_VALUE_BY_IDX(DT_NODELABEL(test_enum_int_array), val, 0, 5));
2144 	zassert_false(DT_ENUM_HAS_VALUE_BY_IDX(DT_NODELABEL(test_enum_int_array), val, 0, 6));
2145 	zassert_true(DT_ENUM_HAS_VALUE_BY_IDX(DT_NODELABEL(test_enum_int_array), val, 1, 3));
2146 	zassert_false(DT_ENUM_HAS_VALUE_BY_IDX(DT_NODELABEL(test_enum_int_array), val, 1, 0));
2147 	zassert_false(DT_ENUM_HAS_VALUE_BY_IDX(DT_NODELABEL(test_enum_int_array), val, 1, 1));
2148 	zassert_true(DT_ENUM_HAS_VALUE_BY_IDX(DT_NODELABEL(test_enum_int_array), val, 2, 4));
2149 	zassert_false(DT_ENUM_HAS_VALUE_BY_IDX(DT_NODELABEL(test_enum_int_array), val, 2, 3));
2150 	zassert_false(DT_ENUM_HAS_VALUE_BY_IDX(DT_NODELABEL(test_enum_int_array), val, 2, 7));
2151 	zassert_true(DT_ENUM_HAS_VALUE_BY_IDX(DT_NODELABEL(test_enum_int_array), val, 3, 0));
2152 	zassert_false(DT_ENUM_HAS_VALUE_BY_IDX(DT_NODELABEL(test_enum_int_array), val, 3, 2));
2153 	zassert_false(DT_ENUM_HAS_VALUE_BY_IDX(DT_NODELABEL(test_enum_int_array), val, 3, 1));
2154 }
2155 #undef TO_MY_ENUM
2156 #undef TO_MY_ENUM_2
2157 
ZTEST(devicetree_api,test_enums_required_false)2158 ZTEST(devicetree_api, test_enums_required_false)
2159 {
2160 	/* DT_ENUM_IDX_OR on string value */
2161 	zassert_equal(DT_ENUM_IDX_OR(DT_NODELABEL(test_enum_default_0), val, 2),
2162 		      1, "");
2163 	zassert_equal(DT_ENUM_IDX_OR(DT_NODELABEL(test_enum_default_1), val, 2),
2164 		      2, "");
2165 	/* DT_ENUM_IDX_OR on int value */
2166 	zassert_equal(DT_ENUM_IDX_OR(DT_NODELABEL(test_enum_int_default_0),
2167 				     val, 4),
2168 		      0, "");
2169 	zassert_equal(DT_ENUM_IDX_OR(DT_NODELABEL(test_enum_int_default_1),
2170 				     val, 4),
2171 		      4, "");
2172 	/* DT_ENUM_IDX_OR on string-array value */
2173 	zassert_equal(DT_ENUM_IDX_BY_IDX_OR(DT_NODELABEL(test_enum_string_array), val, 0, 2),
2174 		      0, "");
2175 	zassert_equal(DT_ENUM_IDX_BY_IDX_OR(DT_NODELABEL(test_enum_string_array), val, 5, 2),
2176 		      2, "");
2177 	/* DT_ENUM_IDX_OR on int-array value */
2178 	zassert_equal(DT_ENUM_IDX_BY_IDX_OR(DT_NODELABEL(test_enum_int_array),
2179 				     val, 0, 7),
2180 		      3, "");
2181 	zassert_equal(DT_ENUM_IDX_BY_IDX_OR(DT_NODELABEL(test_enum_int_array),
2182 				     val, 4, 7),
2183 		      7, "");
2184 }
2185 
ZTEST(devicetree_api,test_inst_enums)2186 ZTEST(devicetree_api, test_inst_enums)
2187 {
2188 #undef DT_DRV_COMPAT
2189 #define DT_DRV_COMPAT vnd_enum_holder_inst
2190 	zassert_equal(DT_INST_ENUM_IDX(0, val), 0, "");
2191 	zassert_equal(DT_INST_ENUM_IDX_OR(0, val, 2), 0, "");
2192 	zassert_true(DT_INST_ENUM_HAS_VALUE(0, val, zero), "");
2193 	zassert_false(DT_INST_ENUM_HAS_VALUE(0, val, one), "");
2194 	zassert_false(DT_INST_ENUM_HAS_VALUE(0, val, two), "");
2195 
2196 #undef DT_DRV_COMPAT
2197 #define DT_DRV_COMPAT vnd_enum_required_false_holder_inst
2198 	zassert_equal(DT_INST_ENUM_IDX_OR(0, val, 2), 2, "");
2199 	zassert_false(DT_INST_ENUM_HAS_VALUE(0, val, zero), "");
2200 	zassert_false(DT_INST_ENUM_HAS_VALUE(0, val, one), "");
2201 	zassert_false(DT_INST_ENUM_HAS_VALUE(0, val, two), "");
2202 
2203 	/* Also add tests for these:
2204 	 * DT_INST_ENUM_IDX_BY_IDX
2205 	 * DT_INST_ENUM_IDX_BY_IDX_OR
2206 	 * DT_INST_ENUM_HAS_VALUE_BY_IDX
2207 	 */
2208 #undef DT_DRV_COMPAT
2209 #define DT_DRV_COMPAT vnd_enum_string_array_holder
2210 	zassert_equal(DT_INST_ENUM_IDX_BY_IDX(0, val, 0), 0, "");
2211 	zassert_equal(DT_INST_ENUM_IDX_BY_IDX(0, val, 1), 3, "");
2212 	zassert_true(DT_INST_ENUM_HAS_VALUE_BY_IDX(0, val, 0, foo), "");
2213 	zassert_false(DT_INST_ENUM_HAS_VALUE_BY_IDX(0, val, 0, zoo), "");
2214 	zassert_true(DT_INST_ENUM_HAS_VALUE_BY_IDX(0, val, 1, zoo), "");
2215 	zassert_false(DT_INST_ENUM_HAS_VALUE_BY_IDX(0, val, 2, baz), "");
2216 	zassert_equal(DT_INST_ENUM_IDX_BY_IDX_OR(0, val, 0, 10), 0, "");
2217 	zassert_equal(DT_INST_ENUM_IDX_BY_IDX_OR(0, val, 4, 10), 10, "");
2218 
2219 #undef DT_DRV_COMPAT
2220 #define DT_DRV_COMPAT vnd_enum_int_array_holder
2221 	zassert_equal(DT_INST_ENUM_IDX_BY_IDX(0, val, 0), 3, "");
2222 	zassert_equal(DT_INST_ENUM_IDX_BY_IDX(0, val, 3), 7, "");
2223 	zassert_equal(DT_INST_ENUM_IDX_BY_IDX_OR(0, val, 1, 10), 4, "");
2224 	zassert_equal(DT_INST_ENUM_IDX_BY_IDX_OR(0, val, 123654, 10), 10, "");
2225 }
2226 
2227 #undef DT_DRV_COMPAT
2228 #define DT_DRV_COMPAT vnd_adc_temp_sensor
ZTEST(devicetree_api,test_clocks)2229 ZTEST(devicetree_api, test_clocks)
2230 {
2231 	/* DT_CLOCKS_CTLR_BY_IDX */
2232 	zassert_true(DT_SAME_NODE(DT_CLOCKS_CTLR_BY_IDX(TEST_TEMP, 1),
2233 				  DT_NODELABEL(test_fixed_clk)), "");
2234 
2235 	/* DT_CLOCKS_CTLR */
2236 	zassert_true(DT_SAME_NODE(DT_CLOCKS_CTLR(TEST_TEMP),
2237 				  DT_NODELABEL(test_clk)), "");
2238 
2239 	/* DT_CLOCKS_CTLR_BY_NAME */
2240 	zassert_true(DT_SAME_NODE(DT_CLOCKS_CTLR_BY_NAME(TEST_TEMP, clk_b),
2241 				  DT_NODELABEL(test_clk)), "");
2242 
2243 	/* DT_NUM_CLOCKS */
2244 	zassert_equal(DT_NUM_CLOCKS(TEST_TEMP), 3, "");
2245 
2246 	/* DT_CLOCKS_HAS_IDX */
2247 	zassert_true(DT_CLOCKS_HAS_IDX(TEST_TEMP, 2), "");
2248 	zassert_false(DT_CLOCKS_HAS_IDX(TEST_TEMP, 3), "");
2249 
2250 	/* DT_CLOCKS_HAS_NAME */
2251 	zassert_true(DT_CLOCKS_HAS_NAME(TEST_TEMP, clk_a), "");
2252 	zassert_false(DT_CLOCKS_HAS_NAME(TEST_TEMP, clk_z), "");
2253 
2254 	/* DT_CLOCKS_CELL_BY_IDX */
2255 	zassert_equal(DT_CLOCKS_CELL_BY_IDX(TEST_TEMP, 2, bits), 2, "");
2256 	zassert_equal(DT_CLOCKS_CELL_BY_IDX(TEST_TEMP, 2, bus), 8, "");
2257 
2258 	/* DT_CLOCKS_CELL_BY_NAME */
2259 	zassert_equal(DT_CLOCKS_CELL_BY_NAME(TEST_TEMP, clk_a, bits), 7, "");
2260 	zassert_equal(DT_CLOCKS_CELL_BY_NAME(TEST_TEMP, clk_b, bus), 8, "");
2261 
2262 	/* DT_CLOCKS_CELL */
2263 	zassert_equal(DT_CLOCKS_CELL(TEST_TEMP, bits), 7, "");
2264 	zassert_equal(DT_CLOCKS_CELL(TEST_TEMP, bus), 3, "");
2265 
2266 	/* clock-freq on fixed clock */
2267 	zassert_equal(DT_PROP_BY_PHANDLE_IDX(TEST_TEMP, clocks, 1,
2268 					     clock_frequency),
2269 		      25000000, "");
2270 
2271 	/* DT_INST */
2272 	zassert_equal(DT_NUM_INST_STATUS_OKAY(DT_DRV_COMPAT), 1, "");
2273 
2274 	/* DT_INST_CLOCKS_CTLR_BY_IDX */
2275 	zassert_true(DT_SAME_NODE(DT_INST_CLOCKS_CTLR_BY_IDX(0, 1),
2276 				  DT_NODELABEL(test_fixed_clk)), "");
2277 
2278 	/* DT_INST_CLOCKS_CTLR */
2279 	zassert_true(DT_SAME_NODE(DT_INST_CLOCKS_CTLR(0),
2280 				  DT_NODELABEL(test_clk)), "");
2281 
2282 	/* DT_INST_CLOCKS_CTLR_BY_NAME */
2283 	zassert_true(DT_SAME_NODE(DT_INST_CLOCKS_CTLR_BY_NAME(0, clk_b),
2284 				  DT_NODELABEL(test_clk)), "");
2285 
2286 	/* DT_INST_NUM_CLOCKS */
2287 	zassert_equal(DT_INST_NUM_CLOCKS(0), 3, "");
2288 
2289 	/* DT_INST_CLOCKS_HAS_IDX */
2290 	zassert_true(DT_INST_CLOCKS_HAS_IDX(0, 2), "");
2291 	zassert_false(DT_INST_CLOCKS_HAS_IDX(0, 3), "");
2292 
2293 	/* DT_INST_CLOCKS_HAS_NAME */
2294 	zassert_true(DT_INST_CLOCKS_HAS_NAME(0, clk_a), "");
2295 	zassert_false(DT_INST_CLOCKS_HAS_NAME(0, clk_z), "");
2296 
2297 	/* DT_INST_CLOCKS_CELL_BY_IDX */
2298 	zassert_equal(DT_INST_CLOCKS_CELL_BY_IDX(0, 2, bits), 2, "");
2299 	zassert_equal(DT_INST_CLOCKS_CELL_BY_IDX(0, 2, bus), 8, "");
2300 
2301 	/* DT_INST_CLOCKS_CELL_BY_NAME */
2302 	zassert_equal(DT_INST_CLOCKS_CELL_BY_NAME(0, clk_a, bits), 7, "");
2303 	zassert_equal(DT_INST_CLOCKS_CELL_BY_NAME(0, clk_b, bus), 8, "");
2304 
2305 	/* DT_INST_CLOCKS_CELL */
2306 	zassert_equal(DT_INST_CLOCKS_CELL(0, bits), 7, "");
2307 	zassert_equal(DT_INST_CLOCKS_CELL(0, bus), 3, "");
2308 
2309 	/* clock-freq on fixed clock */
2310 	zassert_equal(DT_INST_PROP_BY_PHANDLE_IDX(0, clocks, 1,
2311 						  clock_frequency),
2312 		      25000000, "");
2313 }
2314 
2315 #undef DT_DRV_COMPAT
2316 #define DT_DRV_COMPAT vnd_spi_device
ZTEST(devicetree_api,test_parent)2317 ZTEST(devicetree_api, test_parent)
2318 {
2319 	zassert_true(DT_SAME_NODE(DT_PARENT(TEST_SPI_DEV_0), TEST_SPI_BUS_0), "");
2320 
2321 	/*
2322 	 * The parent's label for the first instance of vnd,spi-device,
2323 	 * child of TEST_SPI, is the same as TEST_SPI.
2324 	 */
2325 	zassert_true(DT_SAME_NODE(DT_INST_PARENT(0), TEST_SPI), "");
2326 	/*
2327 	 * We should be able to use DT_PARENT() even with nodes, like /test,
2328 	 * that have no matching compatible.
2329 	 */
2330 	zassert_true(DT_SAME_NODE(DT_CHILD(DT_PARENT(TEST_SPI_BUS_0), spi_33334444),
2331 				  TEST_SPI_BUS_0), "");
2332 }
2333 
2334 #undef DT_DRV_COMPAT
2335 #define DT_DRV_COMPAT vnd_parent_bindings
ZTEST(devicetree_api,test_parent_nodes_list)2336 ZTEST(devicetree_api, test_parent_nodes_list)
2337 {
2338 	/* When traversing upwards, there are no fixed attributes and labels */
2339 	#define TEST_FUNC(parent) { /* No operation */ }
2340 	#define TEST_FUNC_AND_COMMA(parent) TEST_FUNC(parent),
2341 
2342 	struct vnd_parent_binding {
2343 		int val;
2344 	};
2345 
2346 	struct vnd_parent_binding vals_a[] = {
2347 		DT_FOREACH_ANCESTOR(DT_NODELABEL(test_parent_a), TEST_FUNC_AND_COMMA)};
2348 
2349 	struct vnd_parent_binding vals_b[] = {
2350 		DT_FOREACH_ANCESTOR(DT_NODELABEL(test_parent_b), TEST_FUNC_AND_COMMA)};
2351 
2352 	zassert_equal(ARRAY_SIZE(vals_a), 3, "");
2353 	zassert_equal(ARRAY_SIZE(vals_b), 4, "");
2354 
2355 	#undef TEST_FUNC_AND_COMMA
2356 	#undef TEST_FUNC
2357 }
2358 
2359 #undef DT_DRV_COMPAT
2360 #define DT_DRV_COMPAT vnd_i2c_mux_controller
ZTEST(devicetree_api,test_gparent)2361 ZTEST(devicetree_api, test_gparent)
2362 {
2363 	zassert_true(DT_SAME_NODE(DT_GPARENT(TEST_I2C_MUX_CTLR_1), TEST_I2C), "");
2364 	zassert_true(DT_SAME_NODE(DT_INST_GPARENT(0), TEST_I2C), "");
2365 	zassert_true(DT_SAME_NODE(DT_INST_GPARENT(1), TEST_I2C), "");
2366 }
2367 
2368 #undef DT_DRV_COMPAT
2369 #define DT_DRV_COMPAT vnd_child_bindings
ZTEST(devicetree_api,test_children)2370 ZTEST(devicetree_api, test_children)
2371 {
2372 	zassert_equal(DT_PROP(DT_CHILD(DT_NODELABEL(test_children), child_a),
2373 			      val), 0, "");
2374 	zassert_equal(DT_PROP(DT_CHILD(DT_NODELABEL(test_children), child_b),
2375 			      val), 1, "");
2376 	zassert_equal(DT_PROP(DT_CHILD(DT_NODELABEL(test_children), child_c),
2377 			      val), 2, "");
2378 
2379 	zassert_equal(DT_PROP(DT_INST_CHILD(0, child_a), val), 0, "");
2380 	zassert_equal(DT_PROP(DT_INST_CHILD(0, child_b), val), 1, "");
2381 	zassert_equal(DT_PROP(DT_INST_CHILD(0, child_c), val), 2, "");
2382 }
2383 
2384 #undef DT_DRV_COMPAT
2385 #define DT_DRV_COMPAT vnd_child_bindings
ZTEST(devicetree_api,test_child_nodes_list)2386 ZTEST(devicetree_api, test_child_nodes_list)
2387 {
2388 	#define TEST_FUNC(child) { DT_PROP(child, val) }
2389 	#define TEST_FUNC_AND_COMMA(child) TEST_FUNC(child),
2390 	#define TEST_PARENT DT_PARENT(DT_NODELABEL(test_child_a))
2391 
2392 	struct vnd_child_binding {
2393 		int val;
2394 	};
2395 
2396 	struct vnd_child_binding vals[] = {
2397 		DT_FOREACH_CHILD(TEST_PARENT, TEST_FUNC_AND_COMMA)
2398 	};
2399 
2400 	struct vnd_child_binding vals_sep[] = {
2401 		DT_FOREACH_CHILD_SEP(TEST_PARENT, TEST_FUNC, (,))
2402 	};
2403 
2404 	struct vnd_child_binding vals_inst[] = {
2405 		DT_INST_FOREACH_CHILD(0, TEST_FUNC_AND_COMMA)
2406 	};
2407 
2408 	struct vnd_child_binding vals_inst_sep[] = {
2409 		DT_INST_FOREACH_CHILD_SEP(0, TEST_FUNC, (,))
2410 	};
2411 
2412 	struct vnd_child_binding vals_status_okay[] = {
2413 		DT_FOREACH_CHILD_STATUS_OKAY(TEST_PARENT, TEST_FUNC_AND_COMMA)
2414 	};
2415 
2416 	struct vnd_child_binding vals_status_okay_inst[] = {
2417 		DT_INST_FOREACH_CHILD_STATUS_OKAY(0, TEST_FUNC_AND_COMMA)
2418 	};
2419 
2420 	struct vnd_child_binding vals_status_okay_sep[] = {
2421 		DT_FOREACH_CHILD_STATUS_OKAY_SEP(TEST_PARENT, TEST_FUNC, (,))
2422 	};
2423 
2424 	struct vnd_child_binding vals_status_okay_inst_sep[] = {
2425 		DT_INST_FOREACH_CHILD_STATUS_OKAY_SEP(0, TEST_FUNC, (,))
2426 	};
2427 
2428 	zassert_equal(ARRAY_SIZE(vals), 3, "");
2429 	zassert_equal(ARRAY_SIZE(vals_sep), 3, "");
2430 	zassert_equal(ARRAY_SIZE(vals_inst), 3, "");
2431 	zassert_equal(ARRAY_SIZE(vals_inst_sep), 3, "");
2432 	zassert_equal(ARRAY_SIZE(vals_status_okay), 2, "");
2433 	zassert_equal(ARRAY_SIZE(vals_status_okay_inst), 2, "");
2434 	zassert_equal(ARRAY_SIZE(vals_status_okay_sep), 2, "");
2435 	zassert_equal(ARRAY_SIZE(vals_status_okay_inst_sep), 2, "");
2436 
2437 	zassert_equal(vals[0].val, 0, "");
2438 	zassert_equal(vals[1].val, 1, "");
2439 	zassert_equal(vals[2].val, 2, "");
2440 	zassert_equal(vals_sep[0].val, 0, "");
2441 	zassert_equal(vals_sep[1].val, 1, "");
2442 	zassert_equal(vals_sep[2].val, 2, "");
2443 	zassert_equal(vals_inst[0].val, 0, "");
2444 	zassert_equal(vals_inst[1].val, 1, "");
2445 	zassert_equal(vals_inst[2].val, 2, "");
2446 	zassert_equal(vals_inst_sep[0].val, 0, "");
2447 	zassert_equal(vals_inst_sep[1].val, 1, "");
2448 	zassert_equal(vals_inst_sep[2].val, 2, "");
2449 	zassert_equal(vals_status_okay[0].val, 0, "");
2450 	zassert_equal(vals_status_okay[1].val, 1, "");
2451 	zassert_equal(vals_status_okay_inst[0].val, 0, "");
2452 	zassert_equal(vals_status_okay_inst[1].val, 1, "");
2453 	zassert_equal(vals_status_okay_sep[0].val, 0, "");
2454 	zassert_equal(vals_status_okay_sep[1].val, 1, "");
2455 	zassert_equal(vals_status_okay_inst_sep[0].val, 0, "");
2456 	zassert_equal(vals_status_okay_inst_sep[1].val, 1, "");
2457 
2458 	#undef TEST_PARENT
2459 	#undef TEST_FUNC_AND_COMMA
2460 	#undef TEST_FUNC
2461 }
2462 
2463 #undef DT_DRV_COMPAT
2464 #define DT_DRV_COMPAT vnd_child_bindings
ZTEST(devicetree_api,test_child_nodes_list_varg)2465 ZTEST(devicetree_api, test_child_nodes_list_varg)
2466 {
2467 	#define TEST_FUNC(child, arg) { DT_PROP(child, val) + arg }
2468 	#define TEST_FUNC_AND_COMMA(child, arg) TEST_FUNC(child, arg),
2469 	#define TEST_PARENT DT_PARENT(DT_NODELABEL(test_child_a))
2470 
2471 	struct vnd_child_binding {
2472 		int val;
2473 	};
2474 
2475 	struct vnd_child_binding vals[] = {
2476 		DT_FOREACH_CHILD_VARGS(TEST_PARENT, TEST_FUNC_AND_COMMA, 1)
2477 	};
2478 
2479 	struct vnd_child_binding vals_sep[] = {
2480 		DT_FOREACH_CHILD_SEP_VARGS(TEST_PARENT, TEST_FUNC, (,), 1)
2481 	};
2482 
2483 	struct vnd_child_binding vals_inst[] = {
2484 		DT_INST_FOREACH_CHILD_VARGS(0, TEST_FUNC_AND_COMMA, 1)
2485 	};
2486 
2487 	struct vnd_child_binding vals_inst_sep[] = {
2488 		DT_INST_FOREACH_CHILD_SEP_VARGS(0, TEST_FUNC, (,), 1)
2489 	};
2490 
2491 	struct vnd_child_binding vals_status_okay[] = {
2492 		DT_FOREACH_CHILD_STATUS_OKAY_VARGS(TEST_PARENT, TEST_FUNC_AND_COMMA, 1)
2493 	};
2494 
2495 	struct vnd_child_binding vals_status_okay_inst[] = {
2496 		DT_INST_FOREACH_CHILD_STATUS_OKAY_VARGS(0, TEST_FUNC_AND_COMMA, 1)
2497 	};
2498 
2499 	struct vnd_child_binding vals_status_okay_sep[] = {
2500 		DT_FOREACH_CHILD_STATUS_OKAY_SEP_VARGS(TEST_PARENT, TEST_FUNC, (,), 1)
2501 	};
2502 
2503 	struct vnd_child_binding vals_status_okay_inst_sep[] = {
2504 		DT_INST_FOREACH_CHILD_STATUS_OKAY_SEP_VARGS(0, TEST_FUNC, (,), 1)
2505 	};
2506 
2507 	zassert_equal(ARRAY_SIZE(vals), 3, "");
2508 	zassert_equal(ARRAY_SIZE(vals_sep), 3, "");
2509 	zassert_equal(ARRAY_SIZE(vals_inst), 3, "");
2510 	zassert_equal(ARRAY_SIZE(vals_inst_sep), 3, "");
2511 	zassert_equal(ARRAY_SIZE(vals_status_okay), 2, "");
2512 	zassert_equal(ARRAY_SIZE(vals_status_okay_inst), 2, "");
2513 	zassert_equal(ARRAY_SIZE(vals_status_okay_sep), 2, "");
2514 	zassert_equal(ARRAY_SIZE(vals_status_okay_inst_sep), 2, "");
2515 
2516 	zassert_equal(vals[0].val, 1, "");
2517 	zassert_equal(vals[1].val, 2, "");
2518 	zassert_equal(vals[2].val, 3, "");
2519 	zassert_equal(vals_sep[0].val, 1, "");
2520 	zassert_equal(vals_sep[1].val, 2, "");
2521 	zassert_equal(vals_sep[2].val, 3, "");
2522 	zassert_equal(vals_inst[0].val, 1, "");
2523 	zassert_equal(vals_inst[1].val, 2, "");
2524 	zassert_equal(vals_inst[2].val, 3, "");
2525 	zassert_equal(vals_inst_sep[0].val, 1, "");
2526 	zassert_equal(vals_inst_sep[1].val, 2, "");
2527 	zassert_equal(vals_inst_sep[2].val, 3, "");
2528 	zassert_equal(vals_status_okay[0].val, 1, "");
2529 	zassert_equal(vals_status_okay[1].val, 2, "");
2530 	zassert_equal(vals_status_okay_inst[0].val, 1, "");
2531 	zassert_equal(vals_status_okay_inst[1].val, 2, "");
2532 	zassert_equal(vals_status_okay_sep[0].val, 1, "");
2533 	zassert_equal(vals_status_okay_sep[1].val, 2, "");
2534 	zassert_equal(vals_status_okay_inst_sep[0].val, 1, "");
2535 	zassert_equal(vals_status_okay_inst_sep[1].val, 2, "");
2536 
2537 	#undef TEST_PARENT
2538 	#undef TEST_FUNC_AND_COMMA
2539 	#undef TEST_FUNC
2540 }
2541 
2542 #undef DT_DRV_COMPAT
2543 #define DT_DRV_COMPAT vnd_child_bindings
ZTEST(devicetree_api,test_child_nodes_number)2544 ZTEST(devicetree_api, test_child_nodes_number)
2545 {
2546 	zassert_equal(DT_CHILD_NUM(TEST_CHILDREN), 3, "");
2547 	zassert_equal(DT_INST_CHILD_NUM(0), 3, "");
2548 	zassert_equal(DT_CHILD_NUM_STATUS_OKAY(TEST_CHILDREN), 2, "");
2549 	zassert_equal(DT_INST_CHILD_NUM_STATUS_OKAY(0), 2, "");
2550 }
2551 
ZTEST(devicetree_api,test_great_grandchild)2552 ZTEST(devicetree_api, test_great_grandchild)
2553 {
2554 	zassert_equal(DT_PROP(DT_NODELABEL(test_ggc), ggc_prop), 42, "");
2555 }
2556 
2557 #undef DT_DRV_COMPAT
2558 #define DT_DRV_COMPAT vnd_test_ranges_pcie
ZTEST(devicetree_api,test_ranges_pcie)2559 ZTEST(devicetree_api, test_ranges_pcie)
2560 {
2561 #define FLAGS(node_id, idx)				\
2562 	DT_RANGES_CHILD_BUS_FLAGS_BY_IDX(node_id, idx),
2563 #define CHILD_BUS_ADDR(node_id, idx)				\
2564 	DT_RANGES_CHILD_BUS_ADDRESS_BY_IDX(node_id, idx),
2565 #define PARENT_BUS_ADDR(node_id, idx)				\
2566 	DT_RANGES_PARENT_BUS_ADDRESS_BY_IDX(node_id, idx),
2567 #define LENGTH(node_id, idx) DT_RANGES_LENGTH_BY_IDX(node_id, idx),
2568 
2569 	unsigned int count = DT_NUM_RANGES(TEST_RANGES_PCIE);
2570 
2571 	const uint64_t ranges_pcie_flags[] = {
2572 		DT_FOREACH_RANGE(TEST_RANGES_PCIE, FLAGS)
2573 	};
2574 
2575 	const uint64_t ranges_child_bus_addr[] = {
2576 		DT_FOREACH_RANGE(TEST_RANGES_PCIE, CHILD_BUS_ADDR)
2577 	};
2578 
2579 	const uint64_t ranges_parent_bus_addr[] = {
2580 		DT_FOREACH_RANGE(TEST_RANGES_PCIE, PARENT_BUS_ADDR)
2581 	};
2582 
2583 	const uint64_t ranges_length[] = {
2584 		DT_FOREACH_RANGE(TEST_RANGES_PCIE, LENGTH)
2585 	};
2586 
2587 	zassert_equal(count, 3, "");
2588 
2589 	zassert_equal(DT_RANGES_HAS_IDX(TEST_RANGES_PCIE, 0), 1, "");
2590 	zassert_equal(DT_RANGES_HAS_IDX(TEST_RANGES_PCIE, 1), 1, "");
2591 	zassert_equal(DT_RANGES_HAS_IDX(TEST_RANGES_PCIE, 2), 1, "");
2592 	zassert_equal(DT_RANGES_HAS_IDX(TEST_RANGES_PCIE, 3), 0, "");
2593 
2594 	zassert_equal(DT_RANGES_HAS_CHILD_BUS_FLAGS_AT_IDX(TEST_RANGES_PCIE, 0),
2595 		      1, "");
2596 	zassert_equal(DT_RANGES_HAS_CHILD_BUS_FLAGS_AT_IDX(TEST_RANGES_PCIE, 1),
2597 		      1, "");
2598 	zassert_equal(DT_RANGES_HAS_CHILD_BUS_FLAGS_AT_IDX(TEST_RANGES_PCIE, 2),
2599 		      1, "");
2600 	zassert_equal(DT_RANGES_HAS_CHILD_BUS_FLAGS_AT_IDX(TEST_RANGES_PCIE, 3),
2601 		      0, "");
2602 
2603 	zassert_equal(ranges_pcie_flags[0], 0x1000000, "");
2604 	zassert_equal(ranges_pcie_flags[1], 0x2000000, "");
2605 	zassert_equal(ranges_pcie_flags[2], 0x3000000, "");
2606 	zassert_equal(ranges_child_bus_addr[0], 0, "");
2607 	zassert_equal(ranges_child_bus_addr[1], 0x10000000, "");
2608 	zassert_equal(ranges_child_bus_addr[2], 0x8000000000, "");
2609 	zassert_equal(ranges_parent_bus_addr[0], 0x3eff0000, "");
2610 	zassert_equal(ranges_parent_bus_addr[1], 0x10000000, "");
2611 	zassert_equal(ranges_parent_bus_addr[2], 0x8000000000, "");
2612 	zassert_equal(ranges_length[0], 0x10000, "");
2613 	zassert_equal(ranges_length[1], 0x2eff0000, "");
2614 	zassert_equal(ranges_length[2], 0x8000000000, "");
2615 
2616 #undef FLAGS
2617 #undef CHILD_BUS_ADDR
2618 #undef PARENT_BUS_ADDR
2619 #undef LENGTH
2620 }
2621 
ZTEST(devicetree_api,test_ranges_other)2622 ZTEST(devicetree_api, test_ranges_other)
2623 {
2624 #define HAS_FLAGS(node_id, idx) \
2625 	DT_RANGES_HAS_CHILD_BUS_FLAGS_AT_IDX(node_id, idx)
2626 #define FLAGS(node_id, idx) \
2627 	DT_RANGES_CHILD_BUS_FLAGS_BY_IDX(node_id, idx),
2628 #define CHILD_BUS_ADDR(node_id, idx) \
2629 	DT_RANGES_CHILD_BUS_ADDRESS_BY_IDX(node_id, idx),
2630 #define PARENT_BUS_ADDR(node_id, idx) \
2631 	DT_RANGES_PARENT_BUS_ADDRESS_BY_IDX(node_id, idx),
2632 #define LENGTH(node_id, idx) DT_RANGES_LENGTH_BY_IDX(node_id, idx),
2633 
2634 	unsigned int count = DT_NUM_RANGES(TEST_RANGES_OTHER);
2635 
2636 	const uint32_t ranges_child_bus_addr[] = {
2637 		DT_FOREACH_RANGE(TEST_RANGES_OTHER, CHILD_BUS_ADDR)
2638 	};
2639 
2640 	const uint32_t ranges_parent_bus_addr[] = {
2641 		DT_FOREACH_RANGE(TEST_RANGES_OTHER, PARENT_BUS_ADDR)
2642 	};
2643 
2644 	const uint32_t ranges_length[] = {
2645 		DT_FOREACH_RANGE(TEST_RANGES_OTHER, LENGTH)
2646 	};
2647 
2648 	zassert_equal(count, 2, "");
2649 
2650 	zassert_equal(DT_RANGES_HAS_IDX(TEST_RANGES_OTHER, 0), 1, "");
2651 	zassert_equal(DT_RANGES_HAS_IDX(TEST_RANGES_OTHER, 1), 1, "");
2652 	zassert_equal(DT_RANGES_HAS_IDX(TEST_RANGES_OTHER, 2), 0, "");
2653 	zassert_equal(DT_RANGES_HAS_IDX(TEST_RANGES_OTHER, 3), 0, "");
2654 
2655 	zassert_equal(HAS_FLAGS(TEST_RANGES_OTHER, 0), 0, "");
2656 	zassert_equal(HAS_FLAGS(TEST_RANGES_OTHER, 1), 0, "");
2657 	zassert_equal(HAS_FLAGS(TEST_RANGES_OTHER, 2), 0, "");
2658 	zassert_equal(HAS_FLAGS(TEST_RANGES_OTHER, 3), 0, "");
2659 
2660 	zassert_equal(ranges_child_bus_addr[0], 0, "");
2661 	zassert_equal(ranges_child_bus_addr[1], 0x10000000, "");
2662 	zassert_equal(ranges_parent_bus_addr[0], 0x3eff0000, "");
2663 	zassert_equal(ranges_parent_bus_addr[1], 0x10000000, "");
2664 	zassert_equal(ranges_length[0], 0x10000, "");
2665 	zassert_equal(ranges_length[1], 0x2eff0000, "");
2666 
2667 #undef HAS_FLAGS
2668 #undef FLAGS
2669 #undef CHILD_BUS_ADDR
2670 #undef PARENT_BUS_ADDR
2671 #undef LENGTH
2672 }
2673 
ZTEST(devicetree_api,test_ranges_empty)2674 ZTEST(devicetree_api, test_ranges_empty)
2675 {
2676 	zassert_equal(DT_NODE_HAS_PROP(TEST_RANGES_EMPTY, ranges), 1, "");
2677 
2678 	zassert_equal(DT_NUM_RANGES(TEST_RANGES_EMPTY), 0, "");
2679 
2680 	zassert_equal(DT_RANGES_HAS_IDX(TEST_RANGES_EMPTY, 0), 0, "");
2681 	zassert_equal(DT_RANGES_HAS_IDX(TEST_RANGES_EMPTY, 1), 0, "");
2682 
2683 #define FAIL(node_id, idx) ztest_test_fail();
2684 
2685 	DT_FOREACH_RANGE(TEST_RANGES_EMPTY, FAIL);
2686 
2687 #undef FAIL
2688 }
2689 
ZTEST(devicetree_api,test_compat_get_any_status_okay)2690 ZTEST(devicetree_api, test_compat_get_any_status_okay)
2691 {
2692 	zassert_true(
2693 		DT_SAME_NODE(
2694 			DT_COMPAT_GET_ANY_STATUS_OKAY(vnd_reg_holder),
2695 			TEST_REG),
2696 		"");
2697 
2698 	/*
2699 	 * DT_SAME_NODE requires that both its arguments are valid
2700 	 * node identifiers, so we can't pass it DT_INVALID_NODE,
2701 	 * which is what this DT_COMPAT_GET_ANY_STATUS_OKAY() expands to.
2702 	 */
2703 	zassert_false(
2704 		DT_NODE_EXISTS(
2705 			DT_COMPAT_GET_ANY_STATUS_OKAY(this_is_not_a_real_compat)),
2706 		"");
2707 }
2708 
ord_in_array(unsigned int ord,unsigned int * array,size_t array_size)2709 static bool ord_in_array(unsigned int ord, unsigned int *array,
2710 			 size_t array_size)
2711 {
2712 	size_t i;
2713 
2714 	for (i = 0; i < array_size; i++) {
2715 		if (array[i] == ord) {
2716 			return true;
2717 		}
2718 	}
2719 
2720 	return false;
2721 }
2722 
2723 /* Magic numbers used by COMBINED_ORD_ARRAY. Must be invalid dependency
2724  * ordinals.
2725  */
2726 #define ORD_LIST_SEP		0xFFFF0000
2727 #define ORD_LIST_END		0xFFFF0001
2728 #define INJECTED_DEP_0		0xFFFF0002
2729 #define INJECTED_DEP_1		0xFFFF0003
2730 
2731 #define DEP_ORD_AND_COMMA(node_id) DT_DEP_ORD(node_id),
2732 #define CHILD_ORDINALS(node_id) DT_FOREACH_CHILD(node_id, DEP_ORD_AND_COMMA)
2733 
2734 #define COMBINED_ORD_ARRAY(node_id)		\
2735 	{					\
2736 		DT_DEP_ORD(node_id),		\
2737 		DT_DEP_ORD(DT_PARENT(node_id)),	\
2738 		CHILD_ORDINALS(node_id)		\
2739 		ORD_LIST_SEP,			\
2740 		DT_REQUIRES_DEP_ORDS(node_id)	\
2741 		INJECTED_DEP_0,			\
2742 		INJECTED_DEP_1,			\
2743 		ORD_LIST_SEP,			\
2744 		DT_SUPPORTS_DEP_ORDS(node_id)	\
2745 		ORD_LIST_END			\
2746 	}
2747 
ZTEST(devicetree_api,test_dep_ord)2748 ZTEST(devicetree_api, test_dep_ord)
2749 {
2750 #define ORD_IN_ARRAY(ord, array) ord_in_array(ord, array, ARRAY_SIZE(array))
2751 
2752 	unsigned int root_ord = DT_DEP_ORD(DT_ROOT),
2753 		test_ord = DT_DEP_ORD(DT_PATH(test)),
2754 		root_requires[] = { DT_REQUIRES_DEP_ORDS(DT_ROOT) },
2755 		test_requires[] = { DT_REQUIRES_DEP_ORDS(DT_PATH(test)) },
2756 		root_supports[] = { DT_SUPPORTS_DEP_ORDS(DT_ROOT) },
2757 		test_supports[] = { DT_SUPPORTS_DEP_ORDS(DT_PATH(test)) },
2758 		children_ords[] = {
2759 			DT_FOREACH_CHILD(TEST_CHILDREN, DEP_ORD_AND_COMMA)
2760 		},
2761 		children_combined_ords[] = COMBINED_ORD_ARRAY(TEST_CHILDREN),
2762 		child_a_combined_ords[] =
2763 			COMBINED_ORD_ARRAY(DT_NODELABEL(test_child_a));
2764 	size_t i;
2765 
2766 	/* DT_DEP_ORD */
2767 	zassert_equal(root_ord, 0, "");
2768 	zassert_true(DT_DEP_ORD(DT_NODELABEL(test_child_a)) >
2769 		     DT_DEP_ORD(DT_NODELABEL(test_children)), "");
2770 	zassert_true(DT_DEP_ORD(DT_NODELABEL(test_irq)) >
2771 		     DT_DEP_ORD(DT_NODELABEL(test_intc)), "");
2772 	zassert_true(DT_DEP_ORD(DT_NODELABEL(test_phandles)) >
2773 		     DT_DEP_ORD(DT_NODELABEL(test_gpio_1)), "");
2774 
2775 	/* DT_REQUIRES_DEP_ORDS */
2776 	zassert_equal(ARRAY_SIZE(root_requires), 0, "");
2777 	zassert_true(ORD_IN_ARRAY(root_ord, test_requires), "");
2778 
2779 	/* DT_SUPPORTS_DEP_ORDS */
2780 	zassert_true(ORD_IN_ARRAY(test_ord, root_supports), "");
2781 	zassert_false(ORD_IN_ARRAY(root_ord, test_supports), "");
2782 
2783 	unsigned int children_combined_ords_expected[] = {
2784 		/*
2785 		 * Combined ordinals for /test/test-children are from
2786 		 * these nodes in this order:
2787 		 */
2788 		DT_DEP_ORD(TEST_CHILDREN),		/* node */
2789 		DT_DEP_ORD(DT_PATH(test)),		/* parent */
2790 		DT_DEP_ORD(DT_NODELABEL(test_child_a)),	/* children */
2791 		DT_DEP_ORD(DT_NODELABEL(test_child_b)),
2792 		DT_DEP_ORD(DT_NODELABEL(test_child_c)),
2793 		ORD_LIST_SEP,				/* separator */
2794 		DT_DEP_ORD(DT_PATH(test)),		/* requires */
2795 		INJECTED_DEP_0,				/* injected
2796 							 * dependencies
2797 							 */
2798 		INJECTED_DEP_1,
2799 		ORD_LIST_SEP,				/* separator */
2800 		DT_DEP_ORD(DT_NODELABEL(test_child_a)),	/* supports */
2801 		DT_DEP_ORD(DT_NODELABEL(test_child_b)),
2802 		DT_DEP_ORD(DT_NODELABEL(test_child_c)),
2803 		ORD_LIST_END,				/* terminator */
2804 	};
2805 	zassert_equal(ARRAY_SIZE(children_combined_ords),
2806 		      ARRAY_SIZE(children_combined_ords_expected),
2807 		      "%zu", ARRAY_SIZE(children_combined_ords));
2808 	for (i = 0; i < ARRAY_SIZE(children_combined_ords); i++) {
2809 		zassert_equal(children_combined_ords[i],
2810 			      children_combined_ords_expected[i],
2811 			      "test-children at %zu", i);
2812 	}
2813 
2814 	unsigned int child_a_combined_ords_expected[] = {
2815 		/*
2816 		 * Combined ordinals for /test/test-children/child-a
2817 		 * are from these nodes in this order:
2818 		 */
2819 		DT_DEP_ORD(DT_NODELABEL(test_child_a)), /* node */
2820 		DT_DEP_ORD(TEST_CHILDREN),		/* parent */
2821 		/* children (none) */
2822 		ORD_LIST_SEP,				/* separator */
2823 		DT_DEP_ORD(TEST_CHILDREN),		/* requires */
2824 		INJECTED_DEP_0,				/* injected
2825 							 * dependencies
2826 							 */
2827 		INJECTED_DEP_1,
2828 		ORD_LIST_SEP,				/* separator */
2829 		/* supports (none) */
2830 		ORD_LIST_END,				/* terminator */
2831 	};
2832 	zassert_equal(ARRAY_SIZE(child_a_combined_ords),
2833 		      ARRAY_SIZE(child_a_combined_ords_expected),
2834 		      "%zu", ARRAY_SIZE(child_a_combined_ords));
2835 	for (i = 0; i < ARRAY_SIZE(child_a_combined_ords); i++) {
2836 		zassert_equal(child_a_combined_ords[i],
2837 			      child_a_combined_ords_expected[i],
2838 			      "child-a at %zu", i);
2839 	}
2840 
2841 #undef DT_DRV_COMPAT
2842 #define DT_DRV_COMPAT vnd_child_bindings
2843 
2844 	/* DT_INST_DEP_ORD */
2845 	zassert_equal(DT_INST_DEP_ORD(0),
2846 		      DT_DEP_ORD(DT_NODELABEL(test_children)), "");
2847 
2848 	/* DT_INST_REQUIRES_DEP_ORDS */
2849 	unsigned int inst_requires[] = { DT_INST_REQUIRES_DEP_ORDS(0) };
2850 
2851 	zassert_equal(ARRAY_SIZE(inst_requires), 1, "");
2852 	zassert_equal(inst_requires[0], test_ord, "");
2853 
2854 	/* DT_INST_SUPPORTS_DEP_ORDS */
2855 	unsigned int inst_supports[] = { DT_INST_SUPPORTS_DEP_ORDS(0) };
2856 
2857 	zassert_equal(ARRAY_SIZE(inst_supports), 3, "");
2858 	for (i = 0; i < ARRAY_SIZE(inst_supports); i++) {
2859 		zassert_true(ORD_IN_ARRAY(inst_supports[i], children_ords), "");
2860 	}
2861 }
2862 
ZTEST(devicetree_api,test_dep_ord_str_sortable)2863 ZTEST(devicetree_api, test_dep_ord_str_sortable)
2864 {
2865 	const char *root_ord = STRINGIFY(DT_DEP_ORD_STR_SORTABLE(DT_ROOT));
2866 
2867 	/* Root ordinal is always 0 */
2868 	zassert_mem_equal(root_ord, "00000", 6);
2869 
2870 	/* Test string sortable versions equal decimal values.
2871 	 * We go through the STRINGIFY()->atoi conversion cycle to avoid
2872 	 * the C compiler treating the number as octal due to leading zeros.
2873 	 * atoi() simply ignores them.
2874 	 */
2875 	zassert_equal(atoi(STRINGIFY(DT_DEP_ORD_STR_SORTABLE(DT_ROOT))),
2876 		      DT_DEP_ORD(DT_ROOT), "Invalid sortable string");
2877 	zassert_equal(atoi(STRINGIFY(DT_DEP_ORD_STR_SORTABLE(TEST_DEADBEEF))),
2878 		      DT_DEP_ORD(TEST_DEADBEEF), "Invalid sortable string");
2879 	zassert_equal(atoi(STRINGIFY(DT_DEP_ORD_STR_SORTABLE(TEST_TEMP))),
2880 		      DT_DEP_ORD(TEST_TEMP), "Invalid sortable string");
2881 	zassert_equal(atoi(STRINGIFY(DT_DEP_ORD_STR_SORTABLE(TEST_REG))),
2882 		      DT_DEP_ORD(TEST_REG), "Invalid sortable string");
2883 }
2884 
ZTEST(devicetree_api,test_path)2885 ZTEST(devicetree_api, test_path)
2886 {
2887 	zassert_true(!strcmp(DT_NODE_PATH(DT_ROOT), "/"), "");
2888 	zassert_true(!strcmp(DT_NODE_PATH(TEST_DEADBEEF),
2889 			     "/test/gpio@deadbeef"), "");
2890 }
2891 
ZTEST(devicetree_api,test_node_name)2892 ZTEST(devicetree_api, test_node_name)
2893 {
2894 	zassert_true(!strcmp(DT_NODE_FULL_NAME(DT_ROOT), "/"), "");
2895 	zassert_true(!strcmp(DT_NODE_FULL_NAME(TEST_DEADBEEF),
2896 			     "gpio@deadbeef"), "");
2897 	zassert_true(!strcmp(DT_NODE_FULL_NAME(TEST_TEMP),
2898 			     "temperature-sensor"), "");
2899 	zassert_true(strcmp(DT_NODE_FULL_NAME(TEST_REG),
2900 			     "reg-holder"), "");
2901 }
2902 
ZTEST(devicetree_api,test_node_child_idx)2903 ZTEST(devicetree_api, test_node_child_idx)
2904 {
2905 	zassert_equal(DT_NODE_CHILD_IDX(DT_NODELABEL(test_child_a)), 0, "");
2906 	zassert_equal(DT_NODE_CHILD_IDX(DT_NODELABEL(test_child_b)), 1, "");
2907 	zassert_equal(DT_NODE_CHILD_IDX(DT_NODELABEL(test_child_c)), 2, "");
2908 }
2909 
ZTEST(devicetree_api,test_same_node)2910 ZTEST(devicetree_api, test_same_node)
2911 {
2912 	zassert_true(DT_SAME_NODE(TEST_DEADBEEF, TEST_DEADBEEF), "");
2913 	zassert_false(DT_SAME_NODE(TEST_DEADBEEF, TEST_ABCD1234), "");
2914 }
2915 
ZTEST(devicetree_api,test_pinctrl)2916 ZTEST(devicetree_api, test_pinctrl)
2917 {
2918 #undef DT_DRV_COMPAT
2919 #define DT_DRV_COMPAT vnd_adc_temp_sensor
2920 	/*
2921 	 * Tests when a node does have pinctrl properties.
2922 	 */
2923 
2924 	/*
2925 	 * node_id versions:
2926 	 */
2927 
2928 	zassert_true(DT_SAME_NODE(DT_PINCTRL_BY_IDX(TEST_TEMP, 0, 1),
2929 				  DT_NODELABEL(test_pincfg_b)), "");
2930 	zassert_true(DT_SAME_NODE(DT_PINCTRL_BY_IDX(TEST_TEMP, 1, 0),
2931 				  DT_NODELABEL(test_pincfg_c)), "");
2932 
2933 	zassert_true(DT_SAME_NODE(DT_PINCTRL_0(TEST_TEMP, 0),
2934 				  DT_NODELABEL(test_pincfg_a)), "");
2935 
2936 	zassert_true(DT_SAME_NODE(DT_PINCTRL_BY_NAME(TEST_TEMP, default, 1),
2937 				  DT_NODELABEL(test_pincfg_b)), "");
2938 	zassert_true(DT_SAME_NODE(DT_PINCTRL_BY_NAME(TEST_TEMP, sleep, 0),
2939 				  DT_NODELABEL(test_pincfg_c)), "");
2940 	zassert_true(DT_SAME_NODE(DT_PINCTRL_BY_NAME(TEST_TEMP, f_o_o2, 0),
2941 				  DT_NODELABEL(test_pincfg_d)), "");
2942 
2943 	zassert_equal(DT_PINCTRL_NAME_TO_IDX(TEST_TEMP, default), 0, "");
2944 	zassert_equal(DT_PINCTRL_NAME_TO_IDX(TEST_TEMP, sleep), 1, "");
2945 	zassert_equal(DT_PINCTRL_NAME_TO_IDX(TEST_TEMP, f_o_o2), 2, "");
2946 
2947 	zassert_equal(DT_NUM_PINCTRLS_BY_IDX(TEST_TEMP, 0), 2, "");
2948 
2949 	zassert_equal(DT_NUM_PINCTRLS_BY_NAME(TEST_TEMP, default), 2, "");
2950 	zassert_equal(DT_NUM_PINCTRLS_BY_NAME(TEST_TEMP, f_o_o2), 1, "");
2951 
2952 	zassert_equal(DT_NUM_PINCTRL_STATES(TEST_TEMP), 3, "");
2953 
2954 	zassert_equal(DT_PINCTRL_HAS_IDX(TEST_TEMP, 0), 1, "");
2955 	zassert_equal(DT_PINCTRL_HAS_IDX(TEST_TEMP, 1), 1, "");
2956 	zassert_equal(DT_PINCTRL_HAS_IDX(TEST_TEMP, 2), 1, "");
2957 	zassert_equal(DT_PINCTRL_HAS_IDX(TEST_TEMP, 3), 0, "");
2958 
2959 	zassert_equal(DT_PINCTRL_HAS_NAME(TEST_TEMP, default), 1, "");
2960 	zassert_equal(DT_PINCTRL_HAS_NAME(TEST_TEMP, sleep), 1, "");
2961 	zassert_equal(DT_PINCTRL_HAS_NAME(TEST_TEMP, f_o_o2), 1, "");
2962 	zassert_equal(DT_PINCTRL_HAS_NAME(TEST_TEMP, bar), 0, "");
2963 
2964 #undef MAKE_TOKEN
2965 #define MAKE_TOKEN(pc_idx)						\
2966 	_CONCAT(NODE_ID_ENUM_,						\
2967 		DT_PINCTRL_IDX_TO_NAME_TOKEN(TEST_TEMP, pc_idx))
2968 #undef MAKE_UPPER_TOKEN
2969 #define MAKE_UPPER_TOKEN(pc_idx)					\
2970 	_CONCAT(NODE_ID_ENUM_,						\
2971 		DT_PINCTRL_IDX_TO_NAME_UPPER_TOKEN(TEST_TEMP, pc_idx))
2972 	enum {
2973 		MAKE_TOKEN(0) = 10,
2974 		MAKE_TOKEN(1) = 11,
2975 		MAKE_TOKEN(2) = 12,
2976 		MAKE_TOKEN(3) = 13,
2977 
2978 		MAKE_UPPER_TOKEN(0) = 20,
2979 		MAKE_UPPER_TOKEN(1) = 21,
2980 		MAKE_UPPER_TOKEN(2) = 22,
2981 		MAKE_UPPER_TOKEN(3) = 23,
2982 	};
2983 
2984 	zassert_equal(NODE_ID_ENUM_default, 10, "");
2985 	zassert_equal(NODE_ID_ENUM_sleep, 11, "");
2986 	zassert_equal(NODE_ID_ENUM_f_o_o2, 12, "");
2987 
2988 	zassert_equal(NODE_ID_ENUM_DEFAULT, 20, "");
2989 	zassert_equal(NODE_ID_ENUM_SLEEP, 21, "");
2990 	zassert_equal(NODE_ID_ENUM_F_O_O2, 22, "");
2991 
2992 	/*
2993 	 * inst versions:
2994 	 */
2995 
2996 	zassert_true(DT_SAME_NODE(DT_INST_PINCTRL_BY_IDX(0, 0, 1),
2997 				  DT_NODELABEL(test_pincfg_b)), "");
2998 	zassert_true(DT_SAME_NODE(DT_INST_PINCTRL_BY_IDX(0, 1, 0),
2999 				  DT_NODELABEL(test_pincfg_c)), "");
3000 
3001 	zassert_true(DT_SAME_NODE(DT_INST_PINCTRL_0(0, 0),
3002 				  DT_NODELABEL(test_pincfg_a)), "");
3003 
3004 	zassert_true(DT_SAME_NODE(DT_INST_PINCTRL_BY_NAME(0, default, 1),
3005 				  DT_NODELABEL(test_pincfg_b)), "");
3006 	zassert_true(DT_SAME_NODE(DT_INST_PINCTRL_BY_NAME(0, sleep, 0),
3007 				  DT_NODELABEL(test_pincfg_c)), "");
3008 	zassert_true(DT_SAME_NODE(DT_INST_PINCTRL_BY_NAME(0, f_o_o2, 0),
3009 				  DT_NODELABEL(test_pincfg_d)), "");
3010 
3011 	zassert_equal(DT_INST_PINCTRL_NAME_TO_IDX(0, default), 0, "");
3012 	zassert_equal(DT_INST_PINCTRL_NAME_TO_IDX(0, sleep), 1, "");
3013 	zassert_equal(DT_INST_PINCTRL_NAME_TO_IDX(0, f_o_o2), 2, "");
3014 
3015 	zassert_equal(DT_INST_NUM_PINCTRLS_BY_IDX(0, 0), 2, "");
3016 
3017 	zassert_equal(DT_INST_NUM_PINCTRLS_BY_NAME(0, default), 2, "");
3018 	zassert_equal(DT_INST_NUM_PINCTRLS_BY_NAME(0, f_o_o2), 1, "");
3019 
3020 	zassert_equal(DT_INST_NUM_PINCTRL_STATES(0), 3, "");
3021 
3022 	zassert_equal(DT_INST_PINCTRL_HAS_IDX(0, 0), 1, "");
3023 	zassert_equal(DT_INST_PINCTRL_HAS_IDX(0, 1), 1, "");
3024 	zassert_equal(DT_INST_PINCTRL_HAS_IDX(0, 2), 1, "");
3025 	zassert_equal(DT_INST_PINCTRL_HAS_IDX(0, 3), 0, "");
3026 
3027 	zassert_equal(DT_INST_PINCTRL_HAS_NAME(0, default), 1, "");
3028 	zassert_equal(DT_INST_PINCTRL_HAS_NAME(0, sleep), 1, "");
3029 	zassert_equal(DT_INST_PINCTRL_HAS_NAME(0, f_o_o2), 1, "");
3030 	zassert_equal(DT_INST_PINCTRL_HAS_NAME(0, bar), 0, "");
3031 
3032 #undef MAKE_TOKEN
3033 #define MAKE_TOKEN(pc_idx)						\
3034 	_CONCAT(INST_ENUM_,						\
3035 			DT_INST_PINCTRL_IDX_TO_NAME_TOKEN(0, pc_idx))
3036 #undef MAKE_UPPER_TOKEN
3037 #define MAKE_UPPER_TOKEN(pc_idx)					\
3038 	_CONCAT(INST_ENUM_,						\
3039 			DT_INST_PINCTRL_IDX_TO_NAME_UPPER_TOKEN(0, pc_idx))
3040 	enum {
3041 		MAKE_TOKEN(0) = 10,
3042 		MAKE_TOKEN(1) = 11,
3043 		MAKE_TOKEN(2) = 12,
3044 
3045 		MAKE_UPPER_TOKEN(0) = 20,
3046 		MAKE_UPPER_TOKEN(1) = 21,
3047 		MAKE_UPPER_TOKEN(2) = 22,
3048 	};
3049 
3050 	zassert_equal(INST_ENUM_default, 10, "");
3051 	zassert_equal(INST_ENUM_sleep, 11, "");
3052 	zassert_equal(INST_ENUM_f_o_o2, 12, "");
3053 
3054 	zassert_equal(INST_ENUM_DEFAULT, 20, "");
3055 	zassert_equal(INST_ENUM_SLEEP, 21, "");
3056 	zassert_equal(INST_ENUM_F_O_O2, 22, "");
3057 
3058 #undef DT_DRV_COMPAT
3059 #define DT_DRV_COMPAT vnd_reg_holder
3060 	/*
3061 	 * Tests when a node does NOT have any pinctrl properties.
3062 	 */
3063 
3064 	/* node_id versions */
3065 	zassert_equal(DT_NUM_PINCTRL_STATES(TEST_REG), 0, "");
3066 	zassert_equal(DT_PINCTRL_HAS_IDX(TEST_REG, 0), 0, "");
3067 	zassert_equal(DT_PINCTRL_HAS_NAME(TEST_REG, f_o_o2), 0, "");
3068 
3069 	/* inst versions */
3070 	zassert_equal(DT_INST_NUM_PINCTRL_STATES(0), 0, "");
3071 	zassert_equal(DT_INST_PINCTRL_HAS_IDX(0, 0), 0, "");
3072 	zassert_equal(DT_INST_PINCTRL_HAS_NAME(0, f_o_o2), 0, "");
3073 }
3074 
ZTEST(devicetree_api,test_mbox)3075 ZTEST(devicetree_api, test_mbox)
3076 {
3077 	zassert_equal(DT_MBOX_CHANNEL_BY_NAME(TEST_TEMP, tx), 1, "");
3078 	zassert_equal(DT_MBOX_CHANNEL_BY_NAME(TEST_TEMP, rx), 2, "");
3079 
3080 	zassert_true(DT_SAME_NODE(DT_MBOX_CTLR_BY_NAME(TEST_TEMP, tx),
3081 				  DT_NODELABEL(test_mbox)), "");
3082 	zassert_true(DT_SAME_NODE(DT_MBOX_CTLR_BY_NAME(TEST_TEMP, rx),
3083 				  DT_NODELABEL(test_mbox)), "");
3084 
3085 	zassert_equal(DT_MBOX_CHANNEL_BY_NAME(TEST_TEMP, tx), 1, "");
3086 	zassert_equal(DT_MBOX_CHANNEL_BY_NAME(TEST_TEMP, rx), 2, "");
3087 
3088 	zassert_equal(DT_MBOX_CHANNEL_BY_NAME(TEST_TEMP, zero), 0, "");
3089 
3090 	zassert_true(DT_SAME_NODE(DT_MBOX_CTLR_BY_NAME(TEST_TEMP, zero),
3091 				  DT_NODELABEL(test_mbox_zero_cell)), "");
3092 }
3093 
ZTEST(devicetree_api,test_fixed_partitions)3094 ZTEST(devicetree_api, test_fixed_partitions)
3095 {
3096 	/* Test finding fixed partitions by the 'label' property. */
3097 	zassert_true(DT_HAS_FIXED_PARTITION_LABEL(test_partition_0));
3098 	zassert_true(DT_HAS_FIXED_PARTITION_LABEL(test_partition_1));
3099 	zassert_true(DT_HAS_FIXED_PARTITION_LABEL(test_partition_2));
3100 
3101 	zassert_true(DT_SAME_NODE(TEST_PARTITION_0,
3102 				  DT_NODE_BY_FIXED_PARTITION_LABEL(test_partition_0)));
3103 	zassert_true(DT_SAME_NODE(TEST_PARTITION_1,
3104 				  DT_NODE_BY_FIXED_PARTITION_LABEL(test_partition_1)));
3105 	zassert_true(DT_SAME_NODE(TEST_PARTITION_2,
3106 				  DT_NODE_BY_FIXED_PARTITION_LABEL(test_partition_2)));
3107 
3108 	zassert_true(DT_FIXED_PARTITION_EXISTS(TEST_PARTITION_0));
3109 	zassert_true(DT_FIXED_PARTITION_EXISTS(TEST_PARTITION_1));
3110 	zassert_true(DT_FIXED_PARTITION_EXISTS(TEST_PARTITION_2));
3111 
3112 	/* There should not be a node with `label = "test_partition_3"`. */
3113 	zassert_false(DT_HAS_FIXED_PARTITION_LABEL(test_partition_3));
3114 	zassert_false(DT_NODE_EXISTS(DT_NODE_BY_FIXED_PARTITION_LABEL(test_partition_3)));
3115 
3116 	/* There is a node with `label = "FOO"`, but it is not a fixed partition. */
3117 	zassert_false(DT_HAS_FIXED_PARTITION_LABEL(FOO));
3118 	zassert_false(DT_NODE_EXISTS(DT_NODE_BY_FIXED_PARTITION_LABEL(FOO)));
3119 
3120 	/* Test DT_MTD_FROM_FIXED_PARTITION. */
3121 	zassert_true(DT_NODE_EXISTS(DT_MTD_FROM_FIXED_PARTITION(TEST_PARTITION_0)));
3122 	zassert_true(DT_NODE_EXISTS(DT_MTD_FROM_FIXED_PARTITION(TEST_PARTITION_1)));
3123 	zassert_true(DT_NODE_EXISTS(DT_MTD_FROM_FIXED_PARTITION(TEST_PARTITION_2)));
3124 
3125 	zassert_true(DT_SAME_NODE(TEST_MTD_0, DT_MTD_FROM_FIXED_PARTITION(TEST_PARTITION_0)));
3126 	zassert_true(DT_SAME_NODE(TEST_MTD_0, DT_MTD_FROM_FIXED_PARTITION(TEST_PARTITION_1)));
3127 	zassert_true(DT_SAME_NODE(TEST_MTD_1, DT_MTD_FROM_FIXED_PARTITION(TEST_PARTITION_2)));
3128 
3129 	/* Test DT_MEM_FROM_FIXED_PARTITION. */
3130 	zassert_true(DT_NODE_EXISTS(DT_MEM_FROM_FIXED_PARTITION(TEST_PARTITION_0)));
3131 	zassert_true(DT_NODE_EXISTS(DT_MEM_FROM_FIXED_PARTITION(TEST_PARTITION_1)));
3132 	zassert_false(DT_NODE_EXISTS(DT_MEM_FROM_FIXED_PARTITION(TEST_PARTITION_2)));
3133 
3134 	zassert_true(DT_SAME_NODE(TEST_MEM_0, DT_MEM_FROM_FIXED_PARTITION(TEST_PARTITION_0)));
3135 	zassert_true(DT_SAME_NODE(TEST_MEM_0, DT_MEM_FROM_FIXED_PARTITION(TEST_PARTITION_1)));
3136 
3137 	/* Test DT_FIXED_PARTITION_ADDR. */
3138 	zassert_equal(DT_FIXED_PARTITION_ADDR(TEST_PARTITION_0), 0x20000000);
3139 	zassert_equal(DT_FIXED_PARTITION_ADDR(TEST_PARTITION_1), 0x200000c0);
3140 
3141 	/* DT_FIXED_PARTITION_ADDR(TEST_PARTITION_2) expands to an invalid expression.
3142 	 * Test this by way of string comparison.
3143 	 */
3144 	zassert_true(!strcmp(TO_STRING(DT_FIXED_PARTITION_ADDR(TEST_PARTITION_2)),
3145 			     "(__REG_IDX_0_VAL_ADDRESSU + 458624U)"));
3146 	zassert_equal(DT_REG_ADDR(TEST_PARTITION_2), 458624);
3147 
3148 	/* Test that all DT_FIXED_PARTITION_ID are defined and unique. */
3149 #define FIXED_PARTITION_ID_COMMA(node_id) DT_FIXED_PARTITION_ID(node_id),
3150 
3151 	static const int ids[] = {
3152 		DT_FOREACH_STATUS_OKAY_VARGS(fixed_partitions, DT_FOREACH_CHILD,
3153 					     FIXED_PARTITION_ID_COMMA)
3154 	};
3155 	bool found[ARRAY_SIZE(ids)] = { false };
3156 
3157 	for (int i = 0; i < ARRAY_SIZE(ids); i++) {
3158 		zassert_between_inclusive(ids[i], 0, ARRAY_SIZE(ids) - 1, "");
3159 		zassert_false(found[ids[i]]);
3160 		found[ids[i]] = true;
3161 	}
3162 
3163 #undef FIXED_PARTITION_ID_COMMA
3164 }
3165 
ZTEST(devicetree_api,test_string_token)3166 ZTEST(devicetree_api, test_string_token)
3167 {
3168 #undef DT_DRV_COMPAT
3169 #define DT_DRV_COMPAT vnd_string_token
3170 	enum {
3171 		token_zero,
3172 		token_one,
3173 		token_two,
3174 		token_no_inst,
3175 	};
3176 	enum {
3177 		TOKEN_ZERO = token_no_inst + 1,
3178 		TOKEN_ONE,
3179 		TOKEN_TWO,
3180 		TOKEN_NO_INST,
3181 	};
3182 	int i;
3183 
3184 	/* Test DT_INST_STRING_TOKEN */
3185 #define STRING_TOKEN_TEST_INST_EXPANSION(inst) \
3186 	DT_INST_STRING_TOKEN(inst, val),
3187 	int array_inst[] = {
3188 		DT_INST_FOREACH_STATUS_OKAY(STRING_TOKEN_TEST_INST_EXPANSION)
3189 	};
3190 
3191 	for (i = 0; i < ARRAY_SIZE(array_inst); i++) {
3192 		zassert_between_inclusive(array_inst[i], token_zero, token_two, "");
3193 	}
3194 
3195 	/* Test DT_INST_STRING_UPPER_TOKEN */
3196 #define STRING_UPPER_TOKEN_TEST_INST_EXPANSION(inst) \
3197 	DT_INST_STRING_UPPER_TOKEN(inst, val),
3198 	int array_inst_upper[] = {
3199 		DT_INST_FOREACH_STATUS_OKAY(STRING_UPPER_TOKEN_TEST_INST_EXPANSION)
3200 	};
3201 
3202 	for (i = 0; i < ARRAY_SIZE(array_inst_upper); i++) {
3203 		zassert_between_inclusive(array_inst_upper[i], TOKEN_ZERO, TOKEN_TWO, "");
3204 	}
3205 
3206 	/* Test DT_INST_STRING_TOKEN_OR when property is found */
3207 #define STRING_TOKEN_OR_TEST_INST_EXPANSION(inst) \
3208 	DT_INST_STRING_TOKEN_OR(inst, val, token_no_inst),
3209 	int array_inst_or[] = {
3210 		DT_INST_FOREACH_STATUS_OKAY(STRING_TOKEN_OR_TEST_INST_EXPANSION)
3211 	};
3212 
3213 	for (i = 0; i < ARRAY_SIZE(array_inst_or); i++) {
3214 		zassert_between_inclusive(array_inst_or[i], token_zero, token_two, "");
3215 	}
3216 
3217 	/* Test DT_INST_STRING_UPPER_TOKEN_OR when property is found */
3218 #define STRING_UPPER_TOKEN_OR_TEST_INST_EXPANSION(inst)	\
3219 	DT_INST_STRING_UPPER_TOKEN_OR(inst, val, TOKEN_NO_INST),
3220 	int array_inst_upper_or[] = {
3221 		DT_INST_FOREACH_STATUS_OKAY(STRING_UPPER_TOKEN_OR_TEST_INST_EXPANSION)
3222 	};
3223 
3224 	for (i = 0; i < ARRAY_SIZE(array_inst_upper_or); i++) {
3225 		zassert_between_inclusive(array_inst_upper_or[i], TOKEN_ZERO, TOKEN_TWO, "");
3226 	}
3227 
3228 	/* Test DT_STRING_TOKEN_OR when property is found */
3229 	zassert_equal(DT_STRING_TOKEN_OR(DT_NODELABEL(test_string_token_0),
3230 					 val, token_one), token_zero, "");
3231 	zassert_equal(DT_STRING_TOKEN_OR(DT_NODELABEL(test_string_token_1),
3232 					 val, token_two), token_one, "");
3233 
3234 	/* Test DT_STRING_TOKEN_OR is not found */
3235 	zassert_equal(DT_STRING_TOKEN_OR(DT_NODELABEL(test_string_token_1),
3236 					 no_inst, token_zero), token_zero, "");
3237 
3238 	/* Test DT_STRING_UPPER_TOKEN_OR when property is found */
3239 	zassert_equal(DT_STRING_UPPER_TOKEN_OR(DT_NODELABEL(test_string_token_0),
3240 					       val, TOKEN_ONE), TOKEN_ZERO, "");
3241 	zassert_equal(DT_STRING_UPPER_TOKEN_OR(DT_NODELABEL(test_string_token_1),
3242 					       val, TOKEN_TWO), TOKEN_ONE, "");
3243 
3244 	/* Test DT_STRING_UPPER_TOKEN_OR is not found */
3245 	zassert_equal(DT_STRING_UPPER_TOKEN_OR(DT_NODELABEL(test_string_token_1),
3246 					       no_inst, TOKEN_ZERO), TOKEN_ZERO, "");
3247 
3248 	/* Test DT_INST_STRING_TOKEN_OR when property is not found */
3249 #define STRING_TOKEN_TEST_NO_INST_EXPANSION(inst) \
3250 	DT_INST_STRING_TOKEN_OR(inst, no_inst, token_no_inst),
3251 	int array_no_inst_or[] = {
3252 		DT_INST_FOREACH_STATUS_OKAY(STRING_TOKEN_TEST_NO_INST_EXPANSION)
3253 	};
3254 	for (i = 0; i < ARRAY_SIZE(array_no_inst_or); i++) {
3255 		zassert_equal(array_no_inst_or[i], token_no_inst, "");
3256 	}
3257 
3258 	/* Test DT_INST_STRING_UPPER_TOKEN_OR when property is not found */
3259 #define STRING_UPPER_TOKEN_TEST_NO_INST_EXPANSION(inst)	\
3260 	DT_INST_STRING_UPPER_TOKEN_OR(inst, no_inst, TOKEN_NO_INST),
3261 	int array_no_inst_upper_or[] = {
3262 		DT_INST_FOREACH_STATUS_OKAY(STRING_UPPER_TOKEN_TEST_NO_INST_EXPANSION)
3263 	};
3264 	for (i = 0; i < ARRAY_SIZE(array_no_inst_upper_or); i++) {
3265 		zassert_equal(array_no_inst_upper_or[i], TOKEN_NO_INST, "");
3266 	}
3267 }
3268 
3269 #undef DT_DRV_COMPAT
3270 #define DT_DRV_COMPAT vnd_string_array_token
ZTEST(devicetree_api,test_string_idx_token)3271 ZTEST(devicetree_api, test_string_idx_token)
3272 {
3273 	enum token_string_idx {
3274 		/* Tokens */
3275 		token_first_idx_zero,
3276 		token_first_idx_one,
3277 		token_first_idx_two,
3278 		token_second_idx_zero,
3279 		token_second_idx_one,
3280 		token_second_idx_two,
3281 		token_second_idx_three,
3282 		/* Upper tokens */
3283 		TOKEN_FIRST_IDX_ZERO,
3284 		TOKEN_FIRST_IDX_ONE,
3285 		TOKEN_FIRST_IDX_TWO,
3286 		TOKEN_SECOND_IDX_ZERO,
3287 		TOKEN_SECOND_IDX_ONE,
3288 		TOKEN_SECOND_IDX_TWO,
3289 		TOKEN_SECOND_IDX_THREE
3290 	};
3291 
3292 	/* Test direct idx access */
3293 	zassert_equal(DT_STRING_TOKEN_BY_IDX(DT_NODELABEL(test_str_array_token_0), val, 0),
3294 			token_first_idx_zero, "");
3295 	zassert_equal(DT_STRING_TOKEN_BY_IDX(DT_NODELABEL(test_str_array_token_0), val, 1),
3296 			token_first_idx_one, "");
3297 	zassert_equal(DT_STRING_TOKEN_BY_IDX(DT_NODELABEL(test_str_array_token_0), val, 2),
3298 			token_first_idx_two, "");
3299 	zassert_equal(DT_STRING_TOKEN_BY_IDX(DT_NODELABEL(test_str_array_token_1), val, 0),
3300 			token_second_idx_zero, "");
3301 	zassert_equal(DT_STRING_TOKEN_BY_IDX(DT_NODELABEL(test_str_array_token_1), val, 1),
3302 			token_second_idx_one, "");
3303 	zassert_equal(DT_STRING_TOKEN_BY_IDX(DT_NODELABEL(test_str_array_token_1), val, 2),
3304 			token_second_idx_two, "");
3305 	zassert_equal(DT_STRING_TOKEN_BY_IDX(DT_NODELABEL(test_str_array_token_1), val, 3),
3306 			token_second_idx_three, "");
3307 
3308 	zassert_equal(DT_STRING_UPPER_TOKEN_BY_IDX(DT_NODELABEL(test_str_array_token_0), val, 0),
3309 			TOKEN_FIRST_IDX_ZERO, "");
3310 	zassert_equal(DT_STRING_UPPER_TOKEN_BY_IDX(DT_NODELABEL(test_str_array_token_0), val, 1),
3311 			TOKEN_FIRST_IDX_ONE, "");
3312 	zassert_equal(DT_STRING_UPPER_TOKEN_BY_IDX(DT_NODELABEL(test_str_array_token_0), val, 2),
3313 			TOKEN_FIRST_IDX_TWO, "");
3314 	zassert_equal(DT_STRING_UPPER_TOKEN_BY_IDX(DT_NODELABEL(test_str_array_token_1), val, 0),
3315 			TOKEN_SECOND_IDX_ZERO, "");
3316 	zassert_equal(DT_STRING_UPPER_TOKEN_BY_IDX(DT_NODELABEL(test_str_array_token_1), val, 1),
3317 			TOKEN_SECOND_IDX_ONE, "");
3318 	zassert_equal(DT_STRING_UPPER_TOKEN_BY_IDX(DT_NODELABEL(test_str_array_token_1), val, 2),
3319 			TOKEN_SECOND_IDX_TWO, "");
3320 	zassert_equal(DT_STRING_UPPER_TOKEN_BY_IDX(DT_NODELABEL(test_str_array_token_1), val, 3),
3321 			TOKEN_SECOND_IDX_THREE, "");
3322 
3323 	/* Test instances */
3324 #define STRING_TOKEN_BY_IDX_VAR(node_id) _CONCAT(var_token_, node_id)
3325 #define STRING_TOKEN_BY_IDX_TEST_INST_EXPANSION(inst) \
3326 	enum token_string_idx STRING_TOKEN_BY_IDX_VAR(DT_DRV_INST(inst))[] = { \
3327 		DT_INST_STRING_TOKEN_BY_IDX(inst, val, 0), \
3328 		DT_INST_STRING_TOKEN_BY_IDX(inst, val, 1), \
3329 		DT_INST_STRING_TOKEN_BY_IDX(inst, val, 2)  \
3330 	};
3331 	DT_INST_FOREACH_STATUS_OKAY(STRING_TOKEN_BY_IDX_TEST_INST_EXPANSION);
3332 
3333 	zassert_equal(STRING_TOKEN_BY_IDX_VAR(DT_NODELABEL(test_str_array_token_0))[0],
3334 			token_first_idx_zero, "");
3335 	zassert_equal(STRING_TOKEN_BY_IDX_VAR(DT_NODELABEL(test_str_array_token_0))[1],
3336 			token_first_idx_one, "");
3337 	zassert_equal(STRING_TOKEN_BY_IDX_VAR(DT_NODELABEL(test_str_array_token_0))[2],
3338 			token_first_idx_two, "");
3339 	zassert_equal(STRING_TOKEN_BY_IDX_VAR(DT_NODELABEL(test_str_array_token_1))[0],
3340 			token_second_idx_zero, "");
3341 	zassert_equal(STRING_TOKEN_BY_IDX_VAR(DT_NODELABEL(test_str_array_token_1))[1],
3342 			token_second_idx_one, "");
3343 	zassert_equal(STRING_TOKEN_BY_IDX_VAR(DT_NODELABEL(test_str_array_token_1))[2],
3344 			token_second_idx_two, "");
3345 
3346 #define STRING_UPPER_TOKEN_BY_IDX_VAR(node_id) _CONCAT(var_upper_token, node_id)
3347 #define STRING_UPPER_TOKEN_BY_IDX_TEST_INST_EXPANSION(inst) \
3348 	enum token_string_idx STRING_UPPER_TOKEN_BY_IDX_VAR(DT_DRV_INST(inst))[] = { \
3349 		DT_INST_STRING_UPPER_TOKEN_BY_IDX(inst, val, 0), \
3350 		DT_INST_STRING_UPPER_TOKEN_BY_IDX(inst, val, 1), \
3351 		DT_INST_STRING_UPPER_TOKEN_BY_IDX(inst, val, 2)  \
3352 	};
3353 	DT_INST_FOREACH_STATUS_OKAY(STRING_UPPER_TOKEN_BY_IDX_TEST_INST_EXPANSION);
3354 
3355 	zassert_equal(STRING_UPPER_TOKEN_BY_IDX_VAR(DT_NODELABEL(test_str_array_token_0))[0],
3356 			TOKEN_FIRST_IDX_ZERO, "");
3357 	zassert_equal(STRING_UPPER_TOKEN_BY_IDX_VAR(DT_NODELABEL(test_str_array_token_0))[1],
3358 			TOKEN_FIRST_IDX_ONE, "");
3359 	zassert_equal(STRING_UPPER_TOKEN_BY_IDX_VAR(DT_NODELABEL(test_str_array_token_0))[2],
3360 			TOKEN_FIRST_IDX_TWO, "");
3361 	zassert_equal(STRING_UPPER_TOKEN_BY_IDX_VAR(DT_NODELABEL(test_str_array_token_1))[0],
3362 			TOKEN_SECOND_IDX_ZERO, "");
3363 	zassert_equal(STRING_UPPER_TOKEN_BY_IDX_VAR(DT_NODELABEL(test_str_array_token_1))[1],
3364 			TOKEN_SECOND_IDX_ONE, "");
3365 	zassert_equal(STRING_UPPER_TOKEN_BY_IDX_VAR(DT_NODELABEL(test_str_array_token_1))[2],
3366 			TOKEN_SECOND_IDX_TWO, "");
3367 }
3368 
3369 #undef DT_DRV_COMPAT
3370 #define DT_DRV_COMPAT vnd_string_unquoted
ZTEST(devicetree_api,test_string_unquoted)3371 ZTEST(devicetree_api, test_string_unquoted)
3372 {
3373 #define XA 12.0
3374 #define XB 34.0
3375 #define XPLUS +
3376 #define XSTR1 "one"
3377 #define XSTR2 "two"
3378 	const double f0_expected = 0.1234;
3379 	const double f1_expected = 0.9e-3;
3380 	const double delta = 0.1e-4;
3381 
3382 	/* Test DT_STRING_UNQUOTED */
3383 	zassert_within(DT_STRING_UNQUOTED(DT_NODELABEL(test_str_unquoted_f0), val),
3384 		       f0_expected, delta, "");
3385 	zassert_within(DT_STRING_UNQUOTED(DT_NODELABEL(test_str_unquoted_f1), val),
3386 		       f1_expected, delta, "");
3387 	zassert_within(DT_STRING_UNQUOTED(DT_NODELABEL(test_str_unquoted_t), val),
3388 		       XA XPLUS XB, delta, "");
3389 	zassert_within(DT_STRING_UNQUOTED(DT_NODELABEL(test_str_unquoted_esc_t), val), XA XPLUS XB,
3390 		       delta, "");
3391 	zassert_str_equal(DT_STRING_UNQUOTED(DT_NODELABEL(test_str_unquoted_esc_s), val),
3392 			  "one plus two");
3393 	/* Test DT_STRING_UNQUOTED_OR */
3394 	zassert_within(DT_STRING_UNQUOTED_OR(DT_NODELABEL(test_str_unquoted_f0), val, (0.0)),
3395 		       f0_expected, delta, "");
3396 	zassert_within(DT_STRING_UNQUOTED_OR(DT_NODELABEL(test_str_unquoted_f1), val, (0.0)),
3397 		       f1_expected, delta, "");
3398 	zassert_within(DT_STRING_UNQUOTED_OR(DT_NODELABEL(test_str_unquoted_t), val, (0.0)),
3399 		       XA XPLUS XB, delta, "");
3400 	zassert_within(DT_STRING_UNQUOTED_OR(DT_NODELABEL(test_str_unquoted_esc_t), val, (0.0)),
3401 		       XA XPLUS XB, delta, "");
3402 	zassert_str_equal(DT_STRING_UNQUOTED_OR(DT_NODELABEL(test_str_unquoted_esc_s), val, "nak"),
3403 			  "one plus two");
3404 	zassert_within(DT_STRING_UNQUOTED_OR(DT_NODELABEL(test_str_unquoted_f0), nak, (0.0)),
3405 		       0.0, delta, "");
3406 	zassert_within(DT_STRING_UNQUOTED_OR(DT_NODELABEL(test_str_unquoted_f1), nak, (0.0)),
3407 		       0.0, delta, "");
3408 	zassert_within(DT_STRING_UNQUOTED_OR(DT_NODELABEL(test_str_unquoted_t), nak, (0.0)),
3409 		       0.0, delta, "");
3410 	zassert_within(DT_STRING_UNQUOTED_OR(DT_NODELABEL(test_str_unquoted_esc_t), nak, (0.0)),
3411 		       0.0, delta, "");
3412 	zassert_str_equal(DT_STRING_UNQUOTED_OR(DT_NODELABEL(test_str_unquoted_esc_s), nak, "nak"),
3413 			  "nak");
3414 	/* Test DT_INST_STRING_UNQUOTED */
3415 #define STRING_UNQUOTED_VAR(node_id) _CONCAT(var_, node_id)
3416 #define STRING_UNQUOTED_TEST_INST_EXPANSION(inst) \
3417 	double STRING_UNQUOTED_VAR(DT_DRV_INST(inst)) = DT_INST_STRING_UNQUOTED(inst, val);
3418 	DT_INST_FOREACH_STATUS_OKAY(STRING_UNQUOTED_TEST_INST_EXPANSION);
3419 
3420 	zassert_within(STRING_UNQUOTED_VAR(DT_NODELABEL(test_str_unquoted_f0)),
3421 		       f0_expected, delta, "");
3422 	zassert_within(STRING_UNQUOTED_VAR(DT_NODELABEL(test_str_unquoted_f1)),
3423 		       f1_expected, delta, "");
3424 	zassert_within(STRING_UNQUOTED_VAR(DT_NODELABEL(test_str_unquoted_t)), XA XPLUS XB,
3425 		       delta, "");
3426 	zassert_within(STRING_UNQUOTED_VAR(DT_NODELABEL(test_str_unquoted_esc_t)), XA XPLUS XB,
3427 		       delta, "");
3428 
3429 	/* Test DT_INST_STRING_UNQUOTED_OR */
3430 #define STRING_UNQUOTED_OR_VAR(node_id) _CONCAT(var_or_, node_id)
3431 #define STRING_UNQUOTED_OR_TEST_INST_EXPANSION(inst)       \
3432 	double STRING_UNQUOTED_OR_VAR(DT_DRV_INST(inst))[2] = { \
3433 		DT_INST_STRING_UNQUOTED_OR(inst, val, (1.0e10)),   \
3434 		DT_INST_STRING_UNQUOTED_OR(inst, dummy, (1.0e10))  \
3435 	};
3436 	DT_INST_FOREACH_STATUS_OKAY(STRING_UNQUOTED_OR_TEST_INST_EXPANSION);
3437 
3438 	zassert_within(STRING_UNQUOTED_OR_VAR(DT_NODELABEL(test_str_unquoted_f0))[0],
3439 		       f0_expected, delta, "");
3440 	zassert_within(STRING_UNQUOTED_OR_VAR(DT_NODELABEL(test_str_unquoted_f1))[0],
3441 		       f1_expected, delta, "");
3442 	zassert_within(STRING_UNQUOTED_OR_VAR(DT_NODELABEL(test_str_unquoted_t))[0],
3443 		       XA XPLUS XB, delta, "");
3444 	zassert_within(STRING_UNQUOTED_OR_VAR(DT_NODELABEL(test_str_unquoted_esc_t))[0],
3445 		       XA XPLUS XB, delta, "");
3446 	zassert_within(STRING_UNQUOTED_OR_VAR(DT_NODELABEL(test_str_unquoted_f0))[1],
3447 		       1.0e10, delta, "");
3448 	zassert_within(STRING_UNQUOTED_OR_VAR(DT_NODELABEL(test_str_unquoted_f1))[1],
3449 		       1.0e10, delta, "");
3450 	zassert_within(STRING_UNQUOTED_OR_VAR(DT_NODELABEL(test_str_unquoted_t))[1],
3451 		       1.0e10, delta, "");
3452 	zassert_within(STRING_UNQUOTED_OR_VAR(DT_NODELABEL(test_str_unquoted_esc_t))[1], 1.0e10,
3453 		       delta, "");
3454 #undef XA
3455 #undef XB
3456 #undef XPLUS
3457 #undef XSTR1
3458 #undef XSTR2
3459 }
3460 
3461 #undef DT_DRV_COMPAT
3462 #define DT_DRV_COMPAT vnd_string_array_unquoted
ZTEST(devicetree_api,test_string_idx_unquoted)3463 ZTEST(devicetree_api, test_string_idx_unquoted)
3464 {
3465 #define XA 12.0
3466 #define XB 34.0
3467 #define XC 56.0
3468 #define XD 78.0
3469 #define XPLUS +
3470 #define XMINUS -
3471 #define XSTR1  "one"
3472 #define XSTR2  "two"
3473 	const double delta = 0.1e-4;
3474 
3475 	/* DT_STRING_UNQUOTED_BY_IDX */
3476 	zassert_within(DT_STRING_UNQUOTED_BY_IDX(DT_NODELABEL(test_stra_unquoted_f0), val, 0),
3477 		       1.0e2, delta, "");
3478 	zassert_within(DT_STRING_UNQUOTED_BY_IDX(DT_NODELABEL(test_stra_unquoted_f0), val, 1),
3479 		       2.0e2, delta, "");
3480 	zassert_within(DT_STRING_UNQUOTED_BY_IDX(DT_NODELABEL(test_stra_unquoted_f0), val, 2),
3481 		       3.0e2, delta, "");
3482 	zassert_within(DT_STRING_UNQUOTED_BY_IDX(DT_NODELABEL(test_stra_unquoted_f0), val, 3),
3483 		       4.0e2, delta, "");
3484 
3485 	zassert_within(DT_STRING_UNQUOTED_BY_IDX(DT_NODELABEL(test_stra_unquoted_f1), val, 0),
3486 		       0.01, delta, "");
3487 	zassert_within(DT_STRING_UNQUOTED_BY_IDX(DT_NODELABEL(test_stra_unquoted_f1), val, 1),
3488 		       0.1,  delta, "");
3489 	zassert_within(DT_STRING_UNQUOTED_BY_IDX(DT_NODELABEL(test_stra_unquoted_f1), val, 2),
3490 		       1.0,  delta, "");
3491 	zassert_within(DT_STRING_UNQUOTED_BY_IDX(DT_NODELABEL(test_stra_unquoted_f1), val, 3),
3492 		       10.0, delta, "");
3493 
3494 	zassert_within(DT_STRING_UNQUOTED_BY_IDX(DT_NODELABEL(test_stra_unquoted_t), val, 0),
3495 		       XA XPLUS XB, delta, "");
3496 	zassert_within(DT_STRING_UNQUOTED_BY_IDX(DT_NODELABEL(test_stra_unquoted_t), val, 1),
3497 		       XC XPLUS XD,  delta, "");
3498 	zassert_within(DT_STRING_UNQUOTED_BY_IDX(DT_NODELABEL(test_stra_unquoted_t), val, 2),
3499 		       XA XMINUS XB,  delta, "");
3500 	zassert_within(DT_STRING_UNQUOTED_BY_IDX(DT_NODELABEL(test_stra_unquoted_t), val, 3),
3501 		       XC XMINUS XD, delta, "");
3502 
3503 	zassert_within(DT_STRING_UNQUOTED_BY_IDX(DT_NODELABEL(test_stra_unquoted_esc), val, 0),
3504 		       XA XPLUS XB, delta, "");
3505 	zassert_str_equal(DT_STRING_UNQUOTED_BY_IDX(DT_NODELABEL(test_stra_unquoted_esc), val, 1),
3506 			  "one plus two");
3507 
3508 #define STRING_UNQUOTED_BY_IDX_VAR(node_id) _CONCAT(var_, node_id)
3509 #define STRING_UNQUOTED_BY_IDX_TEST_INST_EXPANSION(inst)       \
3510 	double STRING_UNQUOTED_BY_IDX_VAR(DT_DRV_INST(inst))[] = { \
3511 		DT_INST_STRING_UNQUOTED_BY_IDX(inst, val, 0),          \
3512 		DT_INST_STRING_UNQUOTED_BY_IDX(inst, val, 1),          \
3513 		DT_INST_STRING_UNQUOTED_BY_IDX(inst, val, 2),          \
3514 		DT_INST_STRING_UNQUOTED_BY_IDX(inst, val, 3),          \
3515 	};
3516 	DT_INST_FOREACH_STATUS_OKAY(STRING_UNQUOTED_BY_IDX_TEST_INST_EXPANSION);
3517 
3518 	zassert_within(STRING_UNQUOTED_BY_IDX_VAR(DT_NODELABEL(test_stra_unquoted_f0))[0],
3519 		       1.0e2, delta, "");
3520 	zassert_within(STRING_UNQUOTED_BY_IDX_VAR(DT_NODELABEL(test_stra_unquoted_f0))[1],
3521 		       2.0e2, delta, "");
3522 	zassert_within(STRING_UNQUOTED_BY_IDX_VAR(DT_NODELABEL(test_stra_unquoted_f0))[2],
3523 		       3.0e2, delta, "");
3524 	zassert_within(STRING_UNQUOTED_BY_IDX_VAR(DT_NODELABEL(test_stra_unquoted_f0))[3],
3525 		       4.0e2, delta, "");
3526 
3527 	zassert_within(STRING_UNQUOTED_BY_IDX_VAR(DT_NODELABEL(test_stra_unquoted_f1))[0],
3528 		       0.01, delta, "");
3529 	zassert_within(STRING_UNQUOTED_BY_IDX_VAR(DT_NODELABEL(test_stra_unquoted_f1))[1],
3530 		       0.1,  delta, "");
3531 	zassert_within(STRING_UNQUOTED_BY_IDX_VAR(DT_NODELABEL(test_stra_unquoted_f1))[2],
3532 		       1.0,  delta, "");
3533 	zassert_within(STRING_UNQUOTED_BY_IDX_VAR(DT_NODELABEL(test_stra_unquoted_f1))[3],
3534 		       10.0, delta, "");
3535 
3536 	zassert_within(STRING_UNQUOTED_BY_IDX_VAR(DT_NODELABEL(test_stra_unquoted_t))[0],
3537 		       XA XPLUS XB, delta, "");
3538 	zassert_within(STRING_UNQUOTED_BY_IDX_VAR(DT_NODELABEL(test_stra_unquoted_t))[1],
3539 		       XC XPLUS XD,  delta, "");
3540 	zassert_within(STRING_UNQUOTED_BY_IDX_VAR(DT_NODELABEL(test_stra_unquoted_t))[2],
3541 		       XA XMINUS XB,  delta, "");
3542 	zassert_within(STRING_UNQUOTED_BY_IDX_VAR(DT_NODELABEL(test_stra_unquoted_t))[3],
3543 		       XC XMINUS XD, delta, "");
3544 #undef XA
3545 #undef XB
3546 #undef XC
3547 #undef XD
3548 #undef XPLUS
3549 #undef XMINUS
3550 #undef XSTR1
3551 #undef XSTR2
3552 }
3553 
3554 #undef DT_DRV_COMPAT
ZTEST(devicetree_api,test_string_escape)3555 ZTEST(devicetree_api, test_string_escape)
3556 {
3557 	zassert_str_equal(DT_PROP(DT_NODELABEL(test_str_escape_0), val), "\a\b\f\n\r\t\v");
3558 	zassert_str_equal(DT_PROP(DT_NODELABEL(test_str_escape_1), val), "\'single\' \"double\"");
3559 	zassert_str_equal(DT_PROP(DT_NODELABEL(test_str_escape_2), val), "first\nsecond");
3560 	zassert_str_equal(DT_PROP(DT_NODELABEL(test_str_escape_3), val), "\x01\x7F");
3561 }
3562 
ZTEST(devicetree_api,test_string_array_escape)3563 ZTEST(devicetree_api, test_string_array_escape)
3564 {
3565 	zassert_str_equal(DT_PROP_BY_IDX(DT_NODELABEL(test_stra_escape), val, 0), "\a\b\f\n\r\t\v");
3566 	zassert_str_equal(DT_PROP_BY_IDX(DT_NODELABEL(test_stra_escape), val, 1),
3567 			  "\'single\' \"double\"");
3568 	zassert_str_equal(DT_PROP_BY_IDX(DT_NODELABEL(test_stra_escape), val, 2), "first\nsecond");
3569 	zassert_str_equal(DT_PROP_BY_IDX(DT_NODELABEL(test_stra_escape), val, 3), "\x01\x7F");
3570 }
3571 
3572 #undef DT_DRV_COMPAT
3573 #define DT_DRV_COMPAT vnd_adc_temp_sensor
ZTEST(devicetree_api,test_reset)3574 ZTEST(devicetree_api, test_reset)
3575 {
3576 	/* DT_RESET_CTLR_BY_IDX */
3577 	zassert_true(DT_SAME_NODE(DT_RESET_CTLR_BY_IDX(TEST_TEMP, 1),
3578 				  DT_NODELABEL(test_reset)), "");
3579 
3580 	/* DT_RESET_CTLR */
3581 	zassert_true(DT_SAME_NODE(DT_RESET_CTLR(TEST_TEMP),
3582 				  DT_NODELABEL(test_reset)), "");
3583 
3584 	/* DT_RESET_CTLR_BY_NAME */
3585 	zassert_true(DT_SAME_NODE(DT_RESET_CTLR_BY_NAME(TEST_TEMP, reset_b),
3586 				  DT_NODELABEL(test_reset)), "");
3587 
3588 	/* DT_RESET_CELL_BY_IDX */
3589 	zassert_equal(DT_RESET_CELL_BY_IDX(TEST_TEMP, 1, id), 20, "");
3590 	zassert_equal(DT_RESET_CELL_BY_IDX(TEST_TEMP, 0, id), 10, "");
3591 
3592 	/* DT_RESET_CELL_BY_NAME */
3593 	zassert_equal(DT_RESET_CELL_BY_NAME(TEST_TEMP, reset_a, id), 10, "");
3594 	zassert_equal(DT_RESET_CELL_BY_NAME(TEST_TEMP, reset_b, id), 20, "");
3595 
3596 	/* DT_RESET_CELL */
3597 	zassert_equal(DT_RESET_CELL(TEST_TEMP, id), 10, "");
3598 
3599 	/* reg-width on reset */
3600 	zassert_equal(DT_PROP_BY_PHANDLE_IDX(TEST_TEMP, resets, 1, reg_width), 4, "");
3601 
3602 	/* DT_INST */
3603 	zassert_equal(DT_NUM_INST_STATUS_OKAY(DT_DRV_COMPAT), 1, "");
3604 
3605 	/* DT_INST_RESET_CTLR_BY_IDX */
3606 	zassert_true(DT_SAME_NODE(DT_INST_RESET_CTLR_BY_IDX(0, 1),
3607 				  DT_NODELABEL(test_reset)), "");
3608 
3609 	/* DT_INST_RESET_CTLR */
3610 	zassert_true(DT_SAME_NODE(DT_INST_RESET_CTLR(0),
3611 				  DT_NODELABEL(test_reset)), "");
3612 
3613 	/* DT_INST_RESET_CTLR_BY_NAME */
3614 	zassert_true(DT_SAME_NODE(DT_INST_RESET_CTLR_BY_NAME(0, reset_b),
3615 				  DT_NODELABEL(test_reset)), "");
3616 
3617 	/* DT_INST_RESET_CELL_BY_IDX */
3618 	zassert_equal(DT_INST_RESET_CELL_BY_IDX(0, 1, id), 20, "");
3619 	zassert_equal(DT_INST_RESET_CELL_BY_IDX(0, 0, id), 10, "");
3620 
3621 	/* DT_INST_RESET_CELL_BY_NAME */
3622 	zassert_equal(DT_INST_RESET_CELL_BY_NAME(0, reset_a, id), 10, "");
3623 	zassert_equal(DT_INST_RESET_CELL_BY_NAME(0, reset_b, id), 20, "");
3624 
3625 	/* DT_INST_RESET_CELL */
3626 	zassert_equal(DT_INST_RESET_CELL(0, id), 10, "");
3627 
3628 	/* reg-width on reset */
3629 	zassert_equal(DT_INST_PROP_BY_PHANDLE_IDX(0, resets, 1, reg_width), 4, "");
3630 
3631 	/* DT_RESET_ID_BY_IDX */
3632 	zassert_equal(DT_RESET_ID_BY_IDX(TEST_TEMP, 0), 10, "");
3633 	zassert_equal(DT_RESET_ID_BY_IDX(TEST_TEMP, 1), 20, "");
3634 
3635 	/* DT_RESET_ID */
3636 	zassert_equal(DT_RESET_ID(TEST_TEMP), 10, "");
3637 
3638 	/* DT_INST_RESET_ID_BY_IDX */
3639 	zassert_equal(DT_INST_RESET_ID_BY_IDX(0, 0), 10, "");
3640 	zassert_equal(DT_INST_RESET_ID_BY_IDX(0, 1), 20, "");
3641 
3642 	/* DT_INST_RESET_ID */
3643 	zassert_equal(DT_INST_RESET_ID(0), 10, "");
3644 }
3645 
3646 #undef DT_DRV_COMPAT
3647 #define DT_DRV_COMPAT vnd_interrupt_holder_extended
ZTEST(devicetree_api,test_interrupt_controller)3648 ZTEST(devicetree_api, test_interrupt_controller)
3649 {
3650 	/* DT_IRQ_INTC_BY_IDX */
3651 	zassert_true(DT_SAME_NODE(DT_IRQ_INTC_BY_IDX(TEST_IRQ_EXT, 0), TEST_INTC), "");
3652 	zassert_true(DT_SAME_NODE(DT_IRQ_INTC_BY_IDX(TEST_IRQ_EXT, 1), TEST_GPIO_4), "");
3653 
3654 	/* DT_IRQ_INTC_BY_NAME */
3655 	zassert_true(DT_SAME_NODE(DT_IRQ_INTC_BY_NAME(TEST_IRQ_EXT, int1), TEST_INTC), "");
3656 	zassert_true(DT_SAME_NODE(DT_IRQ_INTC_BY_NAME(TEST_IRQ_EXT, int2), TEST_GPIO_4), "");
3657 
3658 	/* DT_IRQ_INTC */
3659 	zassert_true(DT_SAME_NODE(DT_IRQ_INTC(TEST_IRQ_EXT), TEST_INTC), "");
3660 
3661 	/* DT_INST_IRQ_INTC_BY_IDX */
3662 	zassert_true(DT_SAME_NODE(DT_INST_IRQ_INTC_BY_IDX(0, 0), TEST_INTC), "");
3663 	zassert_true(DT_SAME_NODE(DT_INST_IRQ_INTC_BY_IDX(0, 1), TEST_GPIO_4), "");
3664 
3665 	/* DT_INST_IRQ_INTC_BY_NAME */
3666 	zassert_true(DT_SAME_NODE(DT_INST_IRQ_INTC_BY_NAME(0, int1), TEST_INTC), "");
3667 	zassert_true(DT_SAME_NODE(DT_INST_IRQ_INTC_BY_NAME(0, int2), TEST_GPIO_4), "");
3668 
3669 	/* DT_INST_IRQ_INTC */
3670 	zassert_true(DT_SAME_NODE(DT_INST_IRQ_INTC(0), TEST_INTC), "");
3671 }
3672 
3673 ZTEST_SUITE(devicetree_api, NULL, NULL, NULL, NULL, NULL);
3674