diff --git a/include/zephyr/device.h b/include/zephyr/device.h index 57c628b94e94e..d6b358c18d9e2 100644 --- a/include/zephyr/device.h +++ b/include/zephyr/device.h @@ -786,6 +786,19 @@ __syscall const struct device *device_get_binding(const char *name); */ size_t z_device_get_all_static(const struct device **devices); +/** + * @brief Verify that a device was set to a deferred initialization + * + * Indictase whether the provided device pointer is part of deferred init + * device section, indicating its related DTS node has 'zephyr,deferred-init' + * attribute set. + * + * @param dev pointer to the device in question. + * @retval true If the device was set to a deferred initialization + * @retval false Otherwise + */ +__syscall bool device_is_deferred_init(const struct device *dev); + /** * @brief Verify that a device is ready for use. * diff --git a/kernel/device.c b/kernel/device.c index 7e8822695802a..26f16b3f762ef 100644 --- a/kernel/device.c +++ b/kernel/device.c @@ -59,6 +59,14 @@ static inline const struct device *z_vrfy_device_get_binding(const char *name) } #include +static inline bool z_vrfy_device_is_deferred_init(const struct device *dev) +{ + K_OOPS(K_SYSCALL_OBJ_INIT(dev, K_OBJ_ANY)); + + return z_impl_device_is_deferred_init(dev); +} +#include + static inline bool z_vrfy_device_is_ready(const struct device *dev) { K_OOPS(K_SYSCALL_OBJ_INIT(dev, K_OBJ_ANY)); @@ -129,6 +137,21 @@ size_t z_device_get_all_static(struct device const **devices) return cnt; } +bool z_impl_device_is_deferred_init(const struct device *dev) +{ + if (dev == NULL) { + return false; + } + + STRUCT_SECTION_FOREACH_ALTERNATE(_deferred_init, init_entry, entry) { + if (entry->dev == dev) { + return true; + } + } + + return false; +} + bool z_impl_device_is_ready(const struct device *dev) { /* diff --git a/tests/kernel/device/src/main.c b/tests/kernel/device/src/main.c index 4e998120d01d7..e53662600cff4 100644 --- a/tests/kernel/device/src/main.c +++ b/tests/kernel/device/src/main.c @@ -405,6 +405,8 @@ ZTEST(device, test_deferred_init) { int ret; + zassert_true(device_is_deferred_init(FAKEDEFERDRIVER0)); + zassert_false(device_is_ready(FAKEDEFERDRIVER0)); ret = device_init(FAKEDEFERDRIVER0);