1 /*
2  * Copyright (c) 2015 Intel Corporation.
3  *
4  * SPDX-License-Identifier: Apache-2.0
5  */
6 
7 #ifndef ZEPHYR_INCLUDE_DEVICE_H_
8 #define ZEPHYR_INCLUDE_DEVICE_H_
9 
10 #include <stdint.h>
11 
12 #include <zephyr/devicetree.h>
13 #include <zephyr/init.h>
14 #include <zephyr/linker/sections.h>
15 #include <zephyr/pm/state.h>
16 #include <zephyr/sys/device_mmio.h>
17 #include <zephyr/sys/iterable_sections.h>
18 #include <zephyr/sys/util.h>
19 #include <zephyr/toolchain.h>
20 
21 #ifdef CONFIG_LLEXT
22 #include <zephyr/llext/symbol.h>
23 #endif
24 
25 #ifdef __cplusplus
26 extern "C" {
27 #endif
28 
29 /**
30  * @brief Device Model
31  * @defgroup device_model Device Model
32  * @since 1.0
33  * @version 1.1.0
34  * @{
35  */
36 
37 /** @cond INTERNAL_HIDDEN */
38 
39 /**
40  * @brief Flag value used in lists of device dependencies to separate distinct
41  * groups.
42  */
43 #define Z_DEVICE_DEPS_SEP INT16_MIN
44 
45 /**
46  * @brief Flag value used in lists of device dependencies to indicate the end of
47  * the list.
48  */
49 #define Z_DEVICE_DEPS_ENDS INT16_MAX
50 
51 /** @brief Determine if a DT node is mutable */
52 #define Z_DEVICE_IS_MUTABLE(node_id)                                                               \
53 	COND_CODE_1(IS_ENABLED(CONFIG_DEVICE_MUTABLE), (DT_PROP(node_id, zephyr_mutable)), (0))
54 
55 /** @endcond */
56 
57 /**
58  * @brief Type used to represent a "handle" for a device.
59  *
60  * Every @ref device has an associated handle. You can get a pointer to a
61  * @ref device from its handle and vice versa, but the handle uses less space
62  * than a pointer. The device.h API mainly uses handles to store lists of
63  * multiple devices in a compact way.
64  *
65  * The extreme values and zero have special significance. Negative values
66  * identify functionality that does not correspond to a Zephyr device, such as
67  * the system clock or a SYS_INIT() function.
68  *
69  * @see device_handle_get()
70  * @see device_from_handle()
71  */
72 typedef int16_t device_handle_t;
73 
74 /** @brief Flag value used to identify an unknown device. */
75 #define DEVICE_HANDLE_NULL 0
76 
77 /**
78  * @brief Expands to the name of a global device object.
79  *
80  * Return the full name of a device object symbol created by DEVICE_DEFINE(),
81  * using the `dev_id` provided to DEVICE_DEFINE(). This is the name of the
82  * global variable storing the device structure, not a pointer to the string in
83  * the @ref device.name field.
84  *
85  * It is meant to be used for declaring extern symbols pointing to device
86  * objects before using the DEVICE_GET macro to get the device object.
87  *
88  * This macro is normally only useful within device driver source code. In other
89  * situations, you are probably looking for device_get_binding().
90  *
91  * @param dev_id Device identifier.
92  *
93  * @return The full name of the device object defined by device definition
94  * macros.
95  */
96 #define DEVICE_NAME_GET(dev_id) _CONCAT(__device_, dev_id)
97 
98 /* This macro synthesizes a unique dev_id from a devicetree node by using
99  * the node's dependency ordinal.
100  *
101  * The ordinal used in this name can be mapped to the path by
102  * examining zephyr/include/generated/zephyr/devicetree_generated.h.
103  */
104 #define Z_DEVICE_DT_DEV_ID(node_id) _CONCAT(dts_ord_, DT_DEP_ORD(node_id))
105 
106 #if defined(CONFIG_LLEXT_EXPORT_DEVICES)
107 /* Export device identifiers using the builtin name */
108 #define Z_DEVICE_EXPORT(node_id) EXPORT_SYMBOL(DEVICE_DT_NAME_GET(node_id))
109 #endif
110 
111 /**
112  * @brief Create a device object and set it up for boot time initialization.
113  *
114  * This macro defines a @ref device that is automatically configured by the
115  * kernel during system initialization. This macro should only be used when the
116  * device is not being allocated from a devicetree node. If you are allocating a
117  * device from a devicetree node, use DEVICE_DT_DEFINE() or
118  * DEVICE_DT_INST_DEFINE() instead.
119  *
120  * @param dev_id A unique token which is used in the name of the global device
121  * structure as a C identifier.
122  * @param name A string name for the device, which will be stored in
123  * @ref device.name. This name can be used to look up the device with
124  * device_get_binding(). This must be less than Z_DEVICE_MAX_NAME_LEN characters
125  * (including terminating `NULL`) in order to be looked up from user mode.
126  * @param init_fn Pointer to the device's initialization function, which will be
127  * run by the kernel during system initialization. Can be `NULL`.
128  * @param pm Pointer to the device's power management resources, a
129  * @ref pm_device, which will be stored in @ref device.pm field. Use `NULL` if
130  * the device does not use PM.
131  * @param data Pointer to the device's private mutable data, which will be
132  * stored in @ref device.data.
133  * @param config Pointer to the device's private constant data, which will be
134  * stored in @ref device.config.
135  * @param level The device's initialization level (PRE_KERNEL_1, PRE_KERNEL_2 or
136  * POST_KERNEL).
137  * @param prio The device's priority within its initialization level. See
138  * SYS_INIT() for details.
139  * @param api Pointer to the device's API structure. Can be `NULL`.
140  */
141 #define DEVICE_DEFINE(dev_id, name, init_fn, pm, data, config, level, prio,    \
142 		      api)                                                     \
143 	Z_DEVICE_STATE_DEFINE(dev_id);                                         \
144 	Z_DEVICE_DEFINE(DT_INVALID_NODE, dev_id, name, init_fn, pm, data,      \
145 			config, level, prio, api,                              \
146 			&Z_DEVICE_STATE_NAME(dev_id))
147 
148 /**
149  * @brief Return a string name for a devicetree node.
150  *
151  * This macro returns a string literal usable as a device's name from a
152  * devicetree node identifier.
153  *
154  * @param node_id The devicetree node identifier.
155  *
156  * @return The value of the node's `label` property, if it has one.
157  * Otherwise, the node's full name in `node-name@unit-address` form.
158  */
159 #define DEVICE_DT_NAME(node_id)                                                \
160 	DT_PROP_OR(node_id, label, DT_NODE_FULL_NAME(node_id))
161 
162 /**
163  * @brief Determine if a devicetree node initialization should be deferred.
164  *
165  * @param node_id The devicetree node identifier.
166  *
167  * @return Boolean stating if node initialization should be deferred.
168  */
169 #define DEVICE_DT_DEFER(node_id)                                               \
170 	DT_PROP(node_id, zephyr_deferred_init)
171 
172 /**
173  * @brief Create a device object from a devicetree node identifier and set it up
174  * for boot time initialization.
175  *
176  * This macro defines a @ref device that is automatically configured by the
177  * kernel during system initialization. The global device object's name as a C
178  * identifier is derived from the node's dependency ordinal. @ref device.name is
179  * set to `DEVICE_DT_NAME(node_id)`.
180  *
181  * The device is declared with extern visibility, so a pointer to a global
182  * device object can be obtained with `DEVICE_DT_GET(node_id)` from any source
183  * file that includes `<zephyr/device.h>` (even from extensions, when
184  * @kconfig{CONFIG_LLEXT_EXPORT_DEVICES} is enabled). Before using the
185  * pointer, the referenced object should be checked using device_is_ready().
186  *
187  * @param node_id The devicetree node identifier.
188  * @param init_fn Pointer to the device's initialization function, which will be
189  * run by the kernel during system initialization. Can be `NULL`.
190  * @param pm Pointer to the device's power management resources, a
191  * @ref pm_device, which will be stored in @ref device.pm. Use `NULL` if the
192  * device does not use PM.
193  * @param data Pointer to the device's private mutable data, which will be
194  * stored in @ref device.data.
195  * @param config Pointer to the device's private constant data, which will be
196  * stored in @ref device.config field.
197  * @param level The device's initialization level (PRE_KERNEL_1, PRE_KERNEL_2 or
198  * POST_KERNEL).
199  * @param prio The device's priority within its initialization level. See
200  * SYS_INIT() for details.
201  * @param api Pointer to the device's API structure. Can be `NULL`.
202  */
203 #define DEVICE_DT_DEFINE(node_id, init_fn, pm, data, config, level, prio, api, \
204 			 ...)                                                  \
205 	Z_DEVICE_STATE_DEFINE(Z_DEVICE_DT_DEV_ID(node_id));                    \
206 	Z_DEVICE_DEFINE(node_id, Z_DEVICE_DT_DEV_ID(node_id),                  \
207 			DEVICE_DT_NAME(node_id), init_fn, pm, data, config,    \
208 			level, prio, api,                                      \
209 			&Z_DEVICE_STATE_NAME(Z_DEVICE_DT_DEV_ID(node_id)),     \
210 			__VA_ARGS__)
211 
212 /**
213  * @brief Like DEVICE_DT_DEFINE(), but uses an instance of a `DT_DRV_COMPAT`
214  * compatible instead of a node identifier.
215  *
216  * @param inst Instance number. The `node_id` argument to DEVICE_DT_DEFINE() is
217  * set to `DT_DRV_INST(inst)`.
218  * @param ... Other parameters as expected by DEVICE_DT_DEFINE().
219  */
220 #define DEVICE_DT_INST_DEFINE(inst, ...)                                       \
221 	DEVICE_DT_DEFINE(DT_DRV_INST(inst), __VA_ARGS__)
222 
223 /**
224  * @brief The name of the global device object for @p node_id
225  *
226  * Returns the name of the global device structure as a C identifier. The device
227  * must be allocated using DEVICE_DT_DEFINE() or DEVICE_DT_INST_DEFINE() for
228  * this to work.
229  *
230  * This macro is normally only useful within device driver source code. In other
231  * situations, you are probably looking for DEVICE_DT_GET().
232  *
233  * @param node_id Devicetree node identifier
234  *
235  * @return The name of the device object as a C identifier
236  */
237 #define DEVICE_DT_NAME_GET(node_id) DEVICE_NAME_GET(Z_DEVICE_DT_DEV_ID(node_id))
238 
239 /**
240  * @brief Get a @ref device reference from a devicetree node identifier.
241  *
242  * Returns a pointer to a device object created from a devicetree node, if any
243  * device was allocated by a driver.
244  *
245  * If no such device was allocated, this will fail at linker time. If you get an
246  * error that looks like `undefined reference to __device_dts_ord_<N>`, that is
247  * what happened. Check to make sure your device driver is being compiled,
248  * usually by enabling the Kconfig options it requires.
249  *
250  * @param node_id A devicetree node identifier
251  *
252  * @return A pointer to the device object created for that node
253  */
254 #define DEVICE_DT_GET(node_id) (&DEVICE_DT_NAME_GET(node_id))
255 
256 /**
257  * @brief Get a @ref device reference for an instance of a `DT_DRV_COMPAT`
258  * compatible.
259  *
260  * This is equivalent to `DEVICE_DT_GET(DT_DRV_INST(inst))`.
261  *
262  * @param inst `DT_DRV_COMPAT` instance number
263  * @return A pointer to the device object created for that instance
264  */
265 #define DEVICE_DT_INST_GET(inst) DEVICE_DT_GET(DT_DRV_INST(inst))
266 
267 /**
268  * @brief Get a @ref device reference from a devicetree compatible.
269  *
270  * If an enabled devicetree node has the given compatible and a device
271  * object was created from it, this returns a pointer to that device.
272  *
273  * If there no such devices, this returns NULL.
274  *
275  * If there are multiple, this returns an arbitrary one.
276  *
277  * If this returns non-NULL, the device must be checked for readiness
278  * before use, e.g. with device_is_ready().
279  *
280  * @param compat lowercase-and-underscores devicetree compatible
281  * @return a pointer to a device, or NULL
282  */
283 #define DEVICE_DT_GET_ANY(compat)                                              \
284 	COND_CODE_1(DT_HAS_COMPAT_STATUS_OKAY(compat),                         \
285 		    (DEVICE_DT_GET(DT_COMPAT_GET_ANY_STATUS_OKAY(compat))),    \
286 		    (NULL))
287 
288 /**
289  * @brief Get a @ref device reference from a devicetree compatible.
290  *
291  * If an enabled devicetree node has the given compatible and a device object
292  * was created from it, this returns a pointer to that device.
293  *
294  * If there are no such devices, this will fail at compile time.
295  *
296  * If there are multiple, this returns an arbitrary one.
297  *
298  * If this returns non-NULL, the device must be checked for readiness before
299  * use, e.g. with device_is_ready().
300  *
301  * @param compat lowercase-and-underscores devicetree compatible
302  * @return a pointer to a device
303  */
304 #define DEVICE_DT_GET_ONE(compat)                                              \
305 	COND_CODE_1(DT_HAS_COMPAT_STATUS_OKAY(compat),                         \
306 		    (DEVICE_DT_GET(DT_COMPAT_GET_ANY_STATUS_OKAY(compat))),    \
307 		    (ZERO_OR_COMPILE_ERROR(0)))
308 
309 /**
310  * @brief Utility macro to obtain an optional reference to a device.
311  *
312  * If the node identifier refers to a node with status `okay`, this returns
313  * `DEVICE_DT_GET(node_id)`. Otherwise, it returns `NULL`.
314  *
315  * @param node_id devicetree node identifier
316  *
317  * @return a @ref device reference for the node identifier, which may be `NULL`.
318  */
319 #define DEVICE_DT_GET_OR_NULL(node_id)                                         \
320 	COND_CODE_1(DT_NODE_HAS_STATUS_OKAY(node_id),                          \
321 		    (DEVICE_DT_GET(node_id)), (NULL))
322 
323 /**
324  * @brief Obtain a pointer to a device object by name
325  *
326  * @details Return the address of a device object created by
327  * DEVICE_DEFINE(), using the dev_id provided to DEVICE_DEFINE().
328  *
329  * @param dev_id Device identifier.
330  *
331  * @return A pointer to the device object created by DEVICE_DEFINE()
332  */
333 #define DEVICE_GET(dev_id) (&DEVICE_NAME_GET(dev_id))
334 
335 /**
336  * @brief Declare a static device object
337  *
338  * This macro can be used at the top-level to declare a device, such
339  * that DEVICE_GET() may be used before the full declaration in
340  * DEVICE_DEFINE().
341  *
342  * This is often useful when configuring interrupts statically in a
343  * device's init or per-instance config function, as the init function
344  * itself is required by DEVICE_DEFINE() and use of DEVICE_GET()
345  * inside it creates a circular dependency.
346  *
347  * @param dev_id Device identifier.
348  */
349 #define DEVICE_DECLARE(dev_id)                                                 \
350 	static const struct device DEVICE_NAME_GET(dev_id)
351 
352 /**
353  * @brief Get a @ref init_entry reference from a devicetree node.
354  *
355  * @param node_id A devicetree node identifier
356  *
357  * @return A pointer to the @ref init_entry object created for that node
358  */
359 #define DEVICE_INIT_DT_GET(node_id)                                            \
360 	(&Z_INIT_ENTRY_NAME(DEVICE_DT_NAME_GET(node_id)))
361 
362 /**
363  * @brief Get a @ref init_entry reference from a device identifier.
364  *
365  * @param dev_id Device identifier.
366  *
367  * @return A pointer to the init_entry object created for that device
368  */
369 #define DEVICE_INIT_GET(dev_id) (&Z_INIT_ENTRY_NAME(DEVICE_NAME_GET(dev_id)))
370 
371 /**
372  * @brief Runtime device dynamic structure (in RAM) per driver instance
373  *
374  * Fields in this are expected to be default-initialized to zero. The
375  * kernel driver infrastructure and driver access functions are
376  * responsible for ensuring that any non-zero initialization is done
377  * before they are accessed.
378  */
379 struct device_state {
380 	/**
381 	 * Device initialization return code (positive errno value).
382 	 *
383 	 * Device initialization functions return a negative errno code if they
384 	 * fail. In Zephyr, errno values do not exceed 255, so we can store the
385 	 * positive result value in a uint8_t type.
386 	 */
387 	uint8_t init_res;
388 
389 	/** Indicates the device initialization function has been
390 	 * invoked.
391 	 */
392 	bool initialized : 1;
393 };
394 
395 struct pm_device_base;
396 struct pm_device;
397 struct pm_device_isr;
398 #if defined(CONFIG_DEVICE_DT_METADATA) || defined(__DOXYGEN__)
399 struct device_dt_metadata;
400 #endif
401 
402 #ifdef CONFIG_DEVICE_DEPS_DYNAMIC
403 #define Z_DEVICE_DEPS_CONST
404 #else
405 #define Z_DEVICE_DEPS_CONST const
406 #endif
407 
408 /**
409  * @brief Runtime device structure (in ROM) per driver instance
410  */
411 struct device {
412 	/** Name of the device instance */
413 	const char *name;
414 	/** Address of device instance config information */
415 	const void *config;
416 	/** Address of the API structure exposed by the device instance */
417 	const void *api;
418 	/** Address of the common device state */
419 	struct device_state *state;
420 	/** Address of the device instance private data */
421 	void *data;
422 #if defined(CONFIG_DEVICE_DEPS) || defined(__DOXYGEN__)
423 	/**
424 	 * Optional pointer to dependencies associated with the device.
425 	 *
426 	 * This encodes a sequence of sets of device handles that have some
427 	 * relationship to this node. The individual sets are extracted with
428 	 * dedicated API, such as device_required_handles_get(). Only available
429 	 * if @kconfig{CONFIG_DEVICE_DEPS} is enabled.
430 	 */
431 	Z_DEVICE_DEPS_CONST device_handle_t *deps;
432 #endif /* CONFIG_DEVICE_DEPS */
433 #if defined(CONFIG_PM_DEVICE) || defined(__DOXYGEN__)
434 	/**
435 	 * Reference to the device PM resources (only available if
436 	 * @kconfig{CONFIG_PM_DEVICE} is enabled).
437 	 */
438 	union {
439 		struct pm_device_base *pm_base;
440 		struct pm_device *pm;
441 		struct pm_device_isr *pm_isr;
442 	};
443 #endif
444 #if defined(CONFIG_DEVICE_DT_METADATA) || defined(__DOXYGEN__)
445 	const struct device_dt_metadata *dt_meta;
446 #endif /* CONFIG_DEVICE_DT_METADATA */
447 };
448 
449 /**
450  * @brief Get the handle for a given device
451  *
452  * @param dev the device for which a handle is desired.
453  *
454  * @return the handle for the device, or DEVICE_HANDLE_NULL if the device does
455  * not have an associated handle.
456  */
device_handle_get(const struct device * dev)457 static inline device_handle_t device_handle_get(const struct device *dev)
458 {
459 	device_handle_t ret = DEVICE_HANDLE_NULL;
460 	STRUCT_SECTION_START_EXTERN(device);
461 
462 	/* TODO: If/when devices can be constructed that are not part of the
463 	 * fixed sequence we'll need another solution.
464 	 */
465 	if (dev != NULL) {
466 		ret = 1 + (device_handle_t)(dev - STRUCT_SECTION_START(device));
467 	}
468 
469 	return ret;
470 }
471 
472 /**
473  * @brief Get the device corresponding to a handle.
474  *
475  * @param dev_handle the device handle
476  *
477  * @return the device that has that handle, or a null pointer if @p dev_handle
478  * does not identify a device.
479  */
480 static inline const struct device *
device_from_handle(device_handle_t dev_handle)481 device_from_handle(device_handle_t dev_handle)
482 {
483 	STRUCT_SECTION_START_EXTERN(device);
484 	const struct device *dev = NULL;
485 	size_t numdev;
486 
487 	STRUCT_SECTION_COUNT(device, &numdev);
488 
489 	if ((dev_handle > 0) && ((size_t)dev_handle <= numdev)) {
490 		dev = &STRUCT_SECTION_START(device)[dev_handle - 1];
491 	}
492 
493 	return dev;
494 }
495 
496 #if defined(CONFIG_DEVICE_DEPS) || defined(__DOXYGEN__)
497 
498 /**
499  * @brief Prototype for functions used when iterating over a set of devices.
500  *
501  * Such a function may be used in API that identifies a set of devices and
502  * provides a visitor API supporting caller-specific interaction with each
503  * device in the set.
504  *
505  * The visit is said to succeed if the visitor returns a non-negative value.
506  *
507  * @param dev a device in the set being iterated
508  * @param context state used to support the visitor function
509  *
510  * @return A non-negative number to allow walking to continue, and a negative
511  * error code to case the iteration to stop.
512  *
513  * @see device_required_foreach()
514  * @see device_supported_foreach()
515  */
516 typedef int (*device_visitor_callback_t)(const struct device *dev,
517 					 void *context);
518 
519 /**
520  * @brief Get the device handles for devicetree dependencies of this device.
521  *
522  * This function returns a pointer to an array of device handles. The length of
523  * the array is stored in the @p count parameter.
524  *
525  * The array contains a handle for each device that @p dev requires directly, as
526  * determined from the devicetree. This does not include transitive
527  * dependencies; you must recursively determine those.
528  *
529  * @param dev the device for which dependencies are desired.
530  * @param count pointer to where this function should store the length of the
531  * returned array. No value is stored if the call returns a null pointer. The
532  * value may be set to zero if the device has no devicetree dependencies.
533  *
534  * @return a pointer to a sequence of @p count device handles, or a null pointer
535  * if @p dev does not have any dependency data.
536  */
537 static inline const device_handle_t *
device_required_handles_get(const struct device * dev,size_t * count)538 device_required_handles_get(const struct device *dev, size_t *count)
539 {
540 	const device_handle_t *rv = dev->deps;
541 
542 	if (rv != NULL) {
543 		size_t i = 0;
544 
545 		while ((rv[i] != Z_DEVICE_DEPS_ENDS) &&
546 		       (rv[i] != Z_DEVICE_DEPS_SEP)) {
547 			++i;
548 		}
549 		*count = i;
550 	}
551 
552 	return rv;
553 }
554 
555 /**
556  * @brief Get the device handles for injected dependencies of this device.
557  *
558  * This function returns a pointer to an array of device handles. The length of
559  * the array is stored in the @p count parameter.
560  *
561  * The array contains a handle for each device that @p dev manually injected as
562  * a dependency, via providing extra arguments to Z_DEVICE_DEFINE. This does not
563  * include transitive dependencies; you must recursively determine those.
564  *
565  * @param dev the device for which injected dependencies are desired.
566  * @param count pointer to where this function should store the length of the
567  * returned array. No value is stored if the call returns a null pointer. The
568  * value may be set to zero if the device has no devicetree dependencies.
569  *
570  * @return a pointer to a sequence of @p *count device handles, or a null
571  * pointer if @p dev does not have any dependency data.
572  */
573 static inline const device_handle_t *
device_injected_handles_get(const struct device * dev,size_t * count)574 device_injected_handles_get(const struct device *dev, size_t *count)
575 {
576 	const device_handle_t *rv = dev->deps;
577 	size_t region = 0;
578 	size_t i = 0;
579 
580 	if (rv != NULL) {
581 		/* Fast forward to injected devices */
582 		while (region != 1) {
583 			if (*rv == Z_DEVICE_DEPS_SEP) {
584 				region++;
585 			}
586 			rv++;
587 		}
588 		while ((rv[i] != Z_DEVICE_DEPS_ENDS) &&
589 		       (rv[i] != Z_DEVICE_DEPS_SEP)) {
590 			++i;
591 		}
592 		*count = i;
593 	}
594 
595 	return rv;
596 }
597 
598 /**
599  * @brief Get the set of handles that this device supports.
600  *
601  * This function returns a pointer to an array of device handles. The length of
602  * the array is stored in the @p count parameter.
603  *
604  * The array contains a handle for each device that @p dev "supports" -- that
605  * is, devices that require @p dev directly -- as determined from the
606  * devicetree. This does not include transitive dependencies; you must
607  * recursively determine those.
608  *
609  * @param dev the device for which supports are desired.
610  * @param count pointer to where this function should store the length of the
611  * returned array. No value is stored if the call returns a null pointer. The
612  * value may be set to zero if nothing in the devicetree depends on @p dev.
613  *
614  * @return a pointer to a sequence of @p *count device handles, or a null
615  * pointer if @p dev does not have any dependency data.
616  */
617 static inline const device_handle_t *
device_supported_handles_get(const struct device * dev,size_t * count)618 device_supported_handles_get(const struct device *dev, size_t *count)
619 {
620 	const device_handle_t *rv = dev->deps;
621 	size_t region = 0;
622 	size_t i = 0;
623 
624 	if (rv != NULL) {
625 		/* Fast forward to supporting devices */
626 		while (region != 2) {
627 			if (*rv == Z_DEVICE_DEPS_SEP) {
628 				region++;
629 			}
630 			rv++;
631 		}
632 		/* Count supporting devices.
633 		 * Trailing NULL's can be injected by gen_device_deps.py due to
634 		 * CONFIG_PM_DEVICE_POWER_DOMAIN_DYNAMIC_NUM
635 		 */
636 		while ((rv[i] != Z_DEVICE_DEPS_ENDS) &&
637 		       (rv[i] != DEVICE_HANDLE_NULL)) {
638 			++i;
639 		}
640 		*count = i;
641 	}
642 
643 	return rv;
644 }
645 
646 /**
647  * @brief Visit every device that @p dev directly requires.
648  *
649  * Zephyr maintains information about which devices are directly required by
650  * another device; for example an I2C-based sensor driver will require an I2C
651  * controller for communication. Required devices can derive from
652  * statically-defined devicetree relationships or dependencies registered at
653  * runtime.
654  *
655  * This API supports operating on the set of required devices. Example uses
656  * include making sure required devices are ready before the requiring device is
657  * used, and releasing them when the requiring device is no longer needed.
658  *
659  * There is no guarantee on the order in which required devices are visited.
660  *
661  * If the @p visitor_cb function returns a negative value iteration is halted,
662  * and the returned value from the visitor is returned from this function.
663  *
664  * @note This API is not available to unprivileged threads.
665  *
666  * @param dev a device of interest. The devices that this device depends on will
667  * be used as the set of devices to visit. This parameter must not be null.
668  * @param visitor_cb the function that should be invoked on each device in the
669  * dependency set. This parameter must not be null.
670  * @param context state that is passed through to the visitor function. This
671  * parameter may be null if @p visitor_cb tolerates a null @p context.
672  *
673  * @return The number of devices that were visited if all visits succeed, or
674  * the negative value returned from the first visit that did not succeed.
675  */
676 int device_required_foreach(const struct device *dev,
677 			    device_visitor_callback_t visitor_cb,
678 			    void *context);
679 
680 /**
681  * @brief Visit every device that @p dev directly supports.
682  *
683  * Zephyr maintains information about which devices are directly supported by
684  * another device; for example an I2C controller will support an I2C-based
685  * sensor driver. Supported devices can derive from statically-defined
686  * devicetree relationships.
687  *
688  * This API supports operating on the set of supported devices. Example uses
689  * include iterating over the devices connected to a regulator when it is
690  * powered on.
691  *
692  * There is no guarantee on the order in which required devices are visited.
693  *
694  * If the @p visitor_cb function returns a negative value iteration is halted,
695  * and the returned value from the visitor is returned from this function.
696  *
697  * @note This API is not available to unprivileged threads.
698  *
699  * @param dev a device of interest. The devices that this device supports
700  * will be used as the set of devices to visit. This parameter must not be null.
701  * @param visitor_cb the function that should be invoked on each device in the
702  * support set. This parameter must not be null.
703  * @param context state that is passed through to the visitor function. This
704  * parameter may be null if @p visitor_cb tolerates a null @p context.
705  *
706  * @return The number of devices that were visited if all visits succeed, or the
707  * negative value returned from the first visit that did not succeed.
708  */
709 int device_supported_foreach(const struct device *dev,
710 			     device_visitor_callback_t visitor_cb,
711 			     void *context);
712 
713 #endif /* CONFIG_DEVICE_DEPS */
714 
715 /**
716  * @brief Get a @ref device reference from its @ref device.name field.
717  *
718  * This function iterates through the devices on the system. If a device with
719  * the given @p name field is found, and that device initialized successfully at
720  * boot time, this function returns a pointer to the device.
721  *
722  * If no device has the given @p name, this function returns `NULL`.
723  *
724  * This function also returns NULL when a device is found, but it failed to
725  * initialize successfully at boot time. (To troubleshoot this case, set a
726  * breakpoint on your device driver's initialization function.)
727  *
728  * @param name device name to search for. A null pointer, or a pointer to an
729  * empty string, will cause NULL to be returned.
730  *
731  * @return pointer to device structure with the given name; `NULL` if the device
732  * is not found or if the device with that name's initialization function
733  * failed.
734  */
735 __syscall const struct device *device_get_binding(const char *name);
736 
737 /**
738  * @brief Get access to the static array of static devices.
739  *
740  * @param devices where to store the pointer to the array of statically
741  * allocated devices. The array must not be mutated through this pointer.
742  *
743  * @return the number of statically allocated devices.
744  */
745 size_t z_device_get_all_static(const struct device **devices);
746 
747 /**
748  * @brief Verify that a device is ready for use.
749  *
750  * Indicates whether the provided device pointer is for a device known to be
751  * in a state where it can be used with its standard API.
752  *
753  * This can be used with device pointers captured from DEVICE_DT_GET(), which
754  * does not include the readiness checks of device_get_binding(). At minimum
755  * this means that the device has been successfully initialized.
756  *
757  * @param dev pointer to the device in question.
758  *
759  * @retval true If the device is ready for use.
760  * @retval false If the device is not ready for use or if a NULL device pointer
761  * is passed as argument.
762  */
763 __syscall bool device_is_ready(const struct device *dev);
764 
765 /**
766  * @brief Initialize a device.
767  *
768  * A device whose initialization was deferred (by marking it as
769  * ``zephyr,deferred-init`` on devicetree) needs to be initialized manually via
770  * this call. Note that only devices whose initialization was deferred can be
771  * initialized via this call - one can not try to initialize a non
772  * initialization deferred device that failed initialization with this call.
773  *
774  * @param dev device to be initialized.
775  *
776  * @retval -ENOENT If device was not found - or isn't a deferred one.
777  * @retval -errno For other errors.
778  */
779 __syscall int device_init(const struct device *dev);
780 
781 /**
782  * @}
783  */
784 
785 /** @cond INTERNAL_HIDDEN */
786 
787 /**
788  * @brief Synthesize a unique name for the device state associated with
789  * @p dev_id.
790  */
791 #define Z_DEVICE_STATE_NAME(dev_id) _CONCAT(__devstate_, dev_id)
792 
793 /**
794  * @brief Utility macro to define and initialize the device state.
795  *
796  * @param dev_id Device identifier.
797  */
798 #define Z_DEVICE_STATE_DEFINE(dev_id)                                          \
799 	static Z_DECL_ALIGN(struct device_state) Z_DEVICE_STATE_NAME(dev_id)   \
800 		__attribute__((__section__(".z_devstate")))
801 
802 #if defined(CONFIG_DEVICE_DEPS) || defined(__DOXYGEN__)
803 
804 /**
805  * @brief Synthesize the name of the object that holds device ordinal and
806  * dependency data.
807  *
808  * @param dev_id Device identifier.
809  */
810 #define Z_DEVICE_DEPS_NAME(dev_id) _CONCAT(__devicedeps_, dev_id)
811 
812 /**
813  * @brief Expand extra dependencies with a comma in between.
814  *
815  * @param ... Extra dependencies.
816  */
817 #define Z_DEVICE_EXTRA_DEPS(...)                                            \
818 	FOR_EACH_NONEMPTY_TERM(IDENTITY, (,), __VA_ARGS__)
819 
820 /** @brief Linker section were device dependencies are placed. */
821 #define Z_DEVICE_DEPS_SECTION                                               \
822 	__attribute__((__section__(".__device_deps_pass1")))
823 
824 #ifdef __cplusplus
825 #define Z_DEVICE_DEPS_EXTERN extern
826 #else
827 #define Z_DEVICE_DEPS_EXTERN
828 #endif
829 
830 /**
831  * @brief Define device dependencies.
832  *
833  * Initial build provides a record that associates the device object with its
834  * devicetree ordinal, and provides the dependency ordinals. These are provided
835  * as weak definitions (to prevent the reference from being captured when the
836  * original object file is compiled), and in a distinct pass1 section (which
837  * will be replaced by postprocessing).
838  *
839  * Before processing in gen_device_deps.py, the array format is:
840  * {
841  *     DEVICE_ORDINAL (or DEVICE_HANDLE_NULL if not a devicetree node),
842  *     List of devicetree dependency ordinals (if any),
843  *     Z_DEVICE_DEPS_SEP,
844  *     List of injected dependency ordinals (if any),
845  *     Z_DEVICE_DEPS_SEP,
846  *     List of devicetree supporting ordinals (if any),
847  * }
848  *
849  * After processing in gen_device_deps.py, the format is updated to:
850  * {
851  *     List of existing devicetree dependency handles (if any),
852  *     Z_DEVICE_DEPS_SEP,
853  *     List of injected devicetree dependency handles (if any),
854  *     Z_DEVICE_DEPS_SEP,
855  *     List of existing devicetree support handles (if any),
856  *     DEVICE_HANDLE_NULL
857  * }
858  *
859  * It is also (experimentally) necessary to provide explicit alignment on each
860  * object. Otherwise x86-64 builds will introduce padding between objects in the
861  * same input section in individual object files, which will be retained in
862  * subsequent links both wasting space and resulting in aggregate size changes
863  * relative to pass2 when all objects will be in the same input section.
864  */
865 #define Z_DEVICE_DEPS_DEFINE(node_id, dev_id, ...)                             \
866 	extern Z_DEVICE_DEPS_CONST device_handle_t Z_DEVICE_DEPS_NAME(         \
867 		dev_id)[];                                                     \
868 	Z_DEVICE_DEPS_CONST Z_DECL_ALIGN(device_handle_t)                      \
869 	Z_DEVICE_DEPS_SECTION Z_DEVICE_DEPS_EXTERN __weak                      \
870 		Z_DEVICE_DEPS_NAME(dev_id)[] = {                               \
871 		COND_CODE_1(                                                   \
872 			DT_NODE_EXISTS(node_id),                               \
873 			(DT_DEP_ORD(node_id), DT_REQUIRES_DEP_ORDS(node_id)),  \
874 			(DEVICE_HANDLE_NULL,)) /**/                            \
875 		Z_DEVICE_DEPS_SEP,                                             \
876 		Z_DEVICE_EXTRA_DEPS(__VA_ARGS__) /**/                          \
877 		Z_DEVICE_DEPS_SEP,                                             \
878 		COND_CODE_1(DT_NODE_EXISTS(node_id),                           \
879 			    (DT_SUPPORTS_DEP_ORDS(node_id)), ()) /**/          \
880 	}
881 
882 #endif /* CONFIG_DEVICE_DEPS */
883 #if defined(CONFIG_DEVICE_DT_METADATA) || defined(__DOXYGEN__)
884 /**
885  * @brief Devicetree node labels associated with a device
886  */
887 struct device_dt_nodelabels {
888 	/* @brief number of elements in the nodelabels array */
889 	size_t num_nodelabels;
890 	/* @brief array of node labels as strings, exactly as they
891 	 *        appear in the final devicetree
892 	 */
893 	const char *nodelabels[];
894 };
895 
896 /**
897  * @brief Devicetree metadata associated with a device
898  *
899  * This is currently limited to node labels, but the structure is
900  * generic enough to be extended later without requiring breaking
901  * changes.
902  */
903 struct device_dt_metadata {
904 	/**
905 	 * @brief Node labels associated with the device
906 	 * @see device_get_dt_nodelabels()
907 	 */
908 	const struct device_dt_nodelabels *nl;
909 };
910 
911 /**
912  * @brief Get a @ref device reference from a devicetree node label.
913  *
914  * If:
915  *
916  * 1. a device was defined from a devicetree node, for example
917  *    with DEVICE_DT_DEFINE() or another similar macro, and
918  * 2. that devicetree node has @p nodelabel as one of its node labels, and
919  * 3. the device initialized successfully at boot time,
920  *
921  * then this function returns a pointer to the device. Otherwise, it
922  * returns NULL.
923  *
924  * @param nodelabel a devicetree node label
925  * @return a device reference for a device created from a node with that
926  *         node label, or NULL if either no such device exists or the device
927  *         failed to initialize
928  */
929 __syscall const struct device *device_get_by_dt_nodelabel(const char *nodelabel);
930 
931 /**
932  * @brief Get the devicetree node labels associated with a device
933  * @param dev device whose metadata to look up
934  * @return information about the devicetree node labels or NULL if not available
935  */
936 static inline const struct device_dt_nodelabels *
device_get_dt_nodelabels(const struct device * dev)937 device_get_dt_nodelabels(const struct device *dev)
938 {
939 	if (dev->dt_meta == NULL) {
940 		return NULL;
941 	}
942 	return dev->dt_meta->nl;
943 }
944 
945 /**
946  * @brief Maximum devicetree node label length.
947  *
948  * The maximum length is set so that device_get_by_dt_nodelabel() can
949  * be used from userspace.
950  */
951 #define Z_DEVICE_MAX_NODELABEL_LEN Z_DEVICE_MAX_NAME_LEN
952 
953 /**
954  * @brief Name of the identifier for a device's DT metadata structure
955  * @param dev_id device identifier
956  */
957 #define Z_DEVICE_DT_METADATA_NAME_GET(dev_id) UTIL_CAT(__dev_dt_meta_, dev_id)
958 
959 /**
960  * @brief Name of the identifier for the array of node label strings
961  *        saved for a device.
962  */
963 #define Z_DEVICE_DT_NODELABELS_NAME_GET(dev_id) UTIL_CAT(__dev_dt_nodelabels_, dev_id)
964 
965 /**
966  * @brief Initialize an entry in the device DT node label lookup table
967  *
968  * Allocates and initializes a struct device_dt_metadata in the
969  * appropriate iterable section for use finding devices.
970  */
971 #define Z_DEVICE_DT_METADATA_DEFINE(node_id, dev_id)			\
972 	static const struct device_dt_nodelabels			\
973 	Z_DEVICE_DT_NODELABELS_NAME_GET(dev_id) = {			\
974 		.num_nodelabels = DT_NUM_NODELABELS(node_id),		\
975 		.nodelabels = DT_NODELABEL_STRING_ARRAY(node_id),	\
976 	};								\
977 									\
978 	static const struct device_dt_metadata				\
979 	Z_DEVICE_DT_METADATA_NAME_GET(dev_id) = {			\
980 		.nl = &Z_DEVICE_DT_NODELABELS_NAME_GET(dev_id),			\
981 	};
982 #endif  /* CONFIG_DEVICE_DT_METADATA */
983 
984 /**
985  * @brief Init sub-priority of the device
986  *
987  * The sub-priority is defined by the devicetree ordinal, which ensures that
988  * multiple drivers running at the same priority level run in an order that
989  * respects the devicetree dependencies.
990  */
991 #define Z_DEVICE_INIT_SUB_PRIO(node_id)                                        \
992 	COND_CODE_1(DT_NODE_EXISTS(node_id),                                   \
993 		    (DT_DEP_ORD_STR_SORTABLE(node_id)), (0))
994 
995 /**
996  * @brief Maximum device name length.
997  *
998  * The maximum length is set so that device_get_binding() can be used from
999  * userspace.
1000  */
1001 #define Z_DEVICE_MAX_NAME_LEN 48U
1002 
1003 /**
1004  * @brief Compile time check for device name length
1005  *
1006  * @param name Device name.
1007  */
1008 #define Z_DEVICE_NAME_CHECK(name)                                              \
1009 	BUILD_ASSERT(sizeof(Z_STRINGIFY(name)) <= Z_DEVICE_MAX_NAME_LEN,       \
1010 			    Z_STRINGIFY(name) " too long")
1011 
1012 /**
1013  * @brief Initializer for @ref device.
1014  *
1015  * @param name_ Name of the device.
1016  * @param pm_ Reference to @ref pm_device_base (optional).
1017  * @param data_ Reference to device data.
1018  * @param config_ Reference to device config.
1019  * @param api_ Reference to device API ops.
1020  * @param state_ Reference to device state.
1021  * @param deps_ Reference to device dependencies.
1022  * @param node_id_ Devicetree node identifier
1023  * @param dev_id_ Device identifier token, as passed to Z_DEVICE_BASE_DEFINE
1024  */
1025 #define Z_DEVICE_INIT(name_, pm_, data_, config_, api_, state_, deps_, node_id_,	\
1026 		      dev_id_)								\
1027 	{										\
1028 		.name = name_,								\
1029 		.config = (config_),							\
1030 		.api = (api_),								\
1031 		.state = (state_),							\
1032 		.data = (data_),							\
1033 		IF_ENABLED(CONFIG_DEVICE_DEPS, (.deps = (deps_),)) /**/			\
1034 		IF_ENABLED(CONFIG_PM_DEVICE, Z_DEVICE_INIT_PM_BASE(pm_)) /**/		\
1035 		IF_ENABLED(CONFIG_DEVICE_DT_METADATA,					\
1036 			   (IF_ENABLED(DT_NODE_EXISTS(node_id_),			\
1037 				       (.dt_meta = &Z_DEVICE_DT_METADATA_NAME_GET(	\
1038 						dev_id_),))))				\
1039 	}
1040 
1041 /*
1042  * Anonymous unions require C11. Some pre-C11 gcc versions have early support for anonymous
1043  * unions but they require these braces when combined with C99 designated initializers. For
1044  * more details see https://docs.zephyrproject.org/latest/develop/languages/cpp/
1045  */
1046 #if defined(__STDC_VERSION__) && (__STDC_VERSION__) < 201100
1047 #  define Z_DEVICE_INIT_PM_BASE(pm_) ({ .pm_base = (pm_),},)
1048 #else
1049 #  define Z_DEVICE_INIT_PM_BASE(pm_)   (.pm_base = (pm_),)
1050 #endif
1051 
1052 /**
1053  * @brief Device section name (used for sorting purposes).
1054  *
1055  * @param level Initialization level
1056  * @param prio Initialization priority
1057  */
1058 #define Z_DEVICE_SECTION_NAME(level, prio)                                     \
1059 	_CONCAT(INIT_LEVEL_ORD(level), _##prio)
1060 
1061 /**
1062  * @brief Define a @ref device
1063  *
1064  * @param node_id Devicetree node id for the device (DT_INVALID_NODE if a
1065  * software device).
1066  * @param dev_id Device identifier (used to name the defined @ref device).
1067  * @param name Name of the device.
1068  * @param pm Reference to @ref pm_device_base associated with the device.
1069  * (optional).
1070  * @param data Reference to device data.
1071  * @param config Reference to device config.
1072  * @param level Initialization level.
1073  * @param prio Initialization priority.
1074  * @param api Reference to device API.
1075  * @param ... Optional dependencies, manually specified.
1076  */
1077 #define Z_DEVICE_BASE_DEFINE(node_id, dev_id, name, pm, data, config, level, prio, api, state,     \
1078 			     deps)                                                    \
1079 	COND_CODE_1(DT_NODE_EXISTS(node_id), (), (static))                                         \
1080 	COND_CODE_1(Z_DEVICE_IS_MUTABLE(node_id), (), (const))                                     \
1081 	STRUCT_SECTION_ITERABLE_NAMED_ALTERNATE(                                                   \
1082 		device, COND_CODE_1(Z_DEVICE_IS_MUTABLE(node_id), (device_mutable), (device)),     \
1083 		Z_DEVICE_SECTION_NAME(level, prio), DEVICE_NAME_GET(dev_id)) =                     \
1084 		Z_DEVICE_INIT(name, pm, data, config, api, state, deps, node_id, dev_id)
1085 
1086 /**
1087  * @brief Issue an error if the given init level is not supported.
1088  *
1089  * @param level Init level
1090  */
1091 #define Z_DEVICE_CHECK_INIT_LEVEL(level)                                       \
1092 	COND_CODE_1(Z_INIT_PRE_KERNEL_1_##level, (),                           \
1093 	(COND_CODE_1(Z_INIT_PRE_KERNEL_2_##level, (),                          \
1094 	(COND_CODE_1(Z_INIT_POST_KERNEL_##level, (),                           \
1095 	(ZERO_OR_COMPILE_ERROR(0)))))))
1096 
1097 /**
1098  * @brief Define the init entry for a device.
1099  *
1100  * @param node_id Devicetree node id for the device (DT_INVALID_NODE if a
1101  * software device).
1102  * @param dev_id Device identifier.
1103  * @param init_fn_ Device init function.
1104  * @param level Initialization level.
1105  * @param prio Initialization priority.
1106  */
1107 #define Z_DEVICE_INIT_ENTRY_DEFINE(node_id, dev_id, init_fn_, level, prio)                         \
1108 	Z_DEVICE_CHECK_INIT_LEVEL(level)                                                           \
1109                                                                                                    \
1110 	static const Z_DECL_ALIGN(struct init_entry) __used __noasan Z_INIT_ENTRY_SECTION(         \
1111 		level, prio, Z_DEVICE_INIT_SUB_PRIO(node_id))                                      \
1112 		Z_INIT_ENTRY_NAME(DEVICE_NAME_GET(dev_id)) = {                                     \
1113 			.init_fn = {COND_CODE_1(Z_DEVICE_IS_MUTABLE(node_id), (.dev_rw), (.dev)) = \
1114 					    (init_fn_)},                                           \
1115 			Z_DEVICE_INIT_ENTRY_DEV(node_id, dev_id),                                  \
1116 	}
1117 
1118 #define Z_DEFER_DEVICE_INIT_ENTRY_DEFINE(node_id, dev_id, init_fn_)                                \
1119 	static const Z_DECL_ALIGN(struct init_entry) __used __noasan                               \
1120 		__attribute__((__section__(".z_deferred_init")))                                   \
1121 		Z_INIT_ENTRY_NAME(DEVICE_NAME_GET(dev_id)) = {                                     \
1122 			.init_fn = {COND_CODE_1(Z_DEVICE_IS_MUTABLE(node_id), (.dev_rw), (.dev)) = \
1123 					    (init_fn_)},                                           \
1124 			Z_DEVICE_INIT_ENTRY_DEV(node_id, dev_id),                                  \
1125 	}
1126 
1127 /*
1128  * Anonymous unions require C11. Some pre-C11 gcc versions have early support for anonymous
1129  * unions but they require these braces when combined with C99 designated initializers. For
1130  * more details see https://docs.zephyrproject.org/latest/develop/languages/cpp/
1131  */
1132 #if defined(__STDC_VERSION__) && (__STDC_VERSION__) < 201100
1133 #  define Z_DEVICE_INIT_ENTRY_DEV(node_id, dev_id) { Z_DEV_ENTRY_DEV(node_id, dev_id) }
1134 #else
1135 #  define Z_DEVICE_INIT_ENTRY_DEV(node_id, dev_id)   Z_DEV_ENTRY_DEV(node_id, dev_id)
1136 #endif
1137 
1138 #define Z_DEV_ENTRY_DEV(node_id, dev_id)                                                           \
1139 	COND_CODE_1(Z_DEVICE_IS_MUTABLE(node_id), (.dev_rw), (.dev)) =  &DEVICE_NAME_GET(dev_id)
1140 
1141 /**
1142  * @brief Define a @ref device and all other required objects.
1143  *
1144  * This is the common macro used to define @ref device objects. It can be used
1145  * to define both Devicetree and software devices.
1146  *
1147  * @param node_id Devicetree node id for the device (DT_INVALID_NODE if a
1148  * software device).
1149  * @param dev_id Device identifier (used to name the defined @ref device).
1150  * @param name Name of the device.
1151  * @param init_fn Device init function.
1152  * @param pm Reference to @ref pm_device_base associated with the device.
1153  * (optional).
1154  * @param data Reference to device data.
1155  * @param config Reference to device config.
1156  * @param level Initialization level.
1157  * @param prio Initialization priority.
1158  * @param api Reference to device API.
1159  * @param state Reference to device state.
1160  * @param ... Optional dependencies, manually specified.
1161  */
1162 #define Z_DEVICE_DEFINE(node_id, dev_id, name, init_fn, pm, data, config,       \
1163 			level, prio, api, state, ...)                           \
1164 	Z_DEVICE_NAME_CHECK(name);                                              \
1165                                                                                 \
1166 	IF_ENABLED(CONFIG_DEVICE_DEPS,                                          \
1167 		   (Z_DEVICE_DEPS_DEFINE(node_id, dev_id, __VA_ARGS__);))       \
1168                                                                                 \
1169 	IF_ENABLED(CONFIG_DEVICE_DT_METADATA,                                   \
1170 		   (IF_ENABLED(DT_NODE_EXISTS(node_id),                         \
1171 			      (Z_DEVICE_DT_METADATA_DEFINE(node_id, dev_id);))))\
1172                                                                                 \
1173 	Z_DEVICE_BASE_DEFINE(node_id, dev_id, name, pm, data, config, level,    \
1174 		prio, api, state, Z_DEVICE_DEPS_NAME(dev_id));                  \
1175 	COND_CODE_1(DEVICE_DT_DEFER(node_id),                                   \
1176 		    (Z_DEFER_DEVICE_INIT_ENTRY_DEFINE(node_id, dev_id,          \
1177 						      init_fn)),                \
1178 		    (Z_DEVICE_INIT_ENTRY_DEFINE(node_id, dev_id, init_fn,       \
1179 						level, prio)));                 \
1180 	IF_ENABLED(CONFIG_LLEXT_EXPORT_DEVICES,                                 \
1181 		(IF_ENABLED(DT_NODE_EXISTS(node_id),                            \
1182 				(Z_DEVICE_EXPORT(node_id);))))
1183 
1184 /**
1185  * @brief Declare a device for each status "okay" devicetree node.
1186  *
1187  * @note Disabled nodes should not result in devices, so not predeclaring these
1188  * keeps drivers honest.
1189  *
1190  * This is only "maybe" a device because some nodes have status "okay", but
1191  * don't have a corresponding @ref device allocated. There's no way to figure
1192  * that out until after we've built the zephyr image, though.
1193  */
1194 #define Z_MAYBE_DEVICE_DECLARE_INTERNAL(node_id)                                                   \
1195 	extern COND_CODE_1(Z_DEVICE_IS_MUTABLE(node_id), (),                                       \
1196 			   (const)) struct device DEVICE_DT_NAME_GET(node_id);
1197 
1198 DT_FOREACH_STATUS_OKAY_NODE(Z_MAYBE_DEVICE_DECLARE_INTERNAL)
1199 
1200 /** @brief Expands to the full type. */
1201 #define Z_DEVICE_API_TYPE(_class) _CONCAT(_class, _driver_api)
1202 
1203 /** @endcond */
1204 
1205 /**
1206  * @brief Wrapper macro for declaring device API structs inside iterable sections.
1207  *
1208  * @param _class The device API class.
1209  * @param _name The API instance name.
1210  */
1211 #define DEVICE_API(_class, _name) const STRUCT_SECTION_ITERABLE(Z_DEVICE_API_TYPE(_class), _name)
1212 
1213 /**
1214  * @brief Expands to the pointer of a device's API for a given class.
1215  *
1216  * @param _class The device API class.
1217  * @param _dev The device instance pointer.
1218  *
1219  * @return the pointer to the device API.
1220  */
1221 #define DEVICE_API_GET(_class, _dev) ((const struct Z_DEVICE_API_TYPE(_class) *)_dev->api)
1222 
1223 /**
1224  * @brief Macro that evaluates to a boolean that can be used to check if
1225  *        a device is of a particular class.
1226  *
1227  * @param _class The device API class.
1228  * @param _dev The device instance pointer.
1229  *
1230  * @retval true If the device is of the given class
1231  * @retval false If the device is not of the given class
1232  */
1233 #define DEVICE_API_IS(_class, _dev)                                                                \
1234 	({                                                                                         \
1235 		STRUCT_SECTION_START_EXTERN(Z_DEVICE_API_TYPE(_class));                            \
1236 		STRUCT_SECTION_END_EXTERN(Z_DEVICE_API_TYPE(_class));                              \
1237 		(DEVICE_API_GET(_class, _dev) < STRUCT_SECTION_END(Z_DEVICE_API_TYPE(_class)) &&   \
1238 		 DEVICE_API_GET(_class, _dev) >= STRUCT_SECTION_START(Z_DEVICE_API_TYPE(_class))); \
1239 	})
1240 
1241 #ifdef __cplusplus
1242 }
1243 #endif
1244 
1245 #include <zephyr/syscalls/device.h>
1246 
1247 #endif /* ZEPHYR_INCLUDE_DEVICE_H_ */
1248