tests/kernel/device: Add tests for device deferred init

Ensure that devices are not ready before calling `device_init()`, but
are after the call.

Signed-off-by: Ederson de Souza <ederson.desouza@intel.com>
This commit is contained in:
Ederson de Souza 2024-01-05 13:33:25 -08:00 committed by Anas Nashif
parent eeebb4d911
commit 2febacc60b
4 changed files with 83 additions and 1 deletions

View File

@ -52,6 +52,20 @@
status = "okay";
};
fakedeferdriver@E7000000 {
compatible = "fakedeferdriver";
reg = <0xE7000000 0x2000>;
status = "okay";
zephyr,deferred-init;
};
fakedeferdriver@E8000000 {
compatible = "fakedeferdriver";
reg = <0xE8000000 0x2000>;
status = "okay";
zephyr,deferred-init;
};
fakedomain_0: fakedomain_0 {
compatible = "fakedomain";
status = "okay";

View File

@ -49,6 +49,20 @@
status = "okay";
};
fakedeferdriver@E7000000 {
compatible = "fakedeferdriver";
reg = <0x0 0xE7000000 0x0 0x2000>;
status = "okay";
zephyr,deferred-init;
};
fakedeferdriver@E8000000 {
compatible = "fakedeferdriver";
reg = <0x0 0xE8000000 0x0 0x2000>;
status = "okay";
zephyr,deferred-init;
};
fakedomain_0: fakedomain_0 {
compatible = "fakedomain";
status = "okay";

View File

@ -0,0 +1,8 @@
# Copyright (c) 2023 Intel Corporation
# SPDX-License-Identifier: Apache-2.0
description: Properties for fake deferred driver.
compatible: "fakedeferdriver"
include: base.yaml

View File

@ -6,6 +6,7 @@
#include <zephyr/kernel.h>
#include <zephyr/device.h>
#include <zephyr/drivers/gpio.h>
#include <zephyr/init.h>
#include <zephyr/ztest.h>
#include <zephyr/sys/printk.h>
@ -21,10 +22,23 @@
#define MY_DRIVER_A "my_driver_A"
#define MY_DRIVER_B "my_driver_B"
#define FAKEDEFERDRIVER0 DEVICE_DT_GET(DT_PATH(fakedeferdriver_e7000000))
#define FAKEDEFERDRIVER1 DEVICE_DT_GET(DT_PATH(fakedeferdriver_e8000000))
/* A device without init call */
DEVICE_DEFINE(dummy_noinit, DUMMY_NOINIT, NULL, NULL, NULL, NULL,
POST_KERNEL, CONFIG_KERNEL_INIT_PRIORITY_DEFAULT, NULL);
/* To access from userspace, the device needs an API. Use a dummy GPIO one */
static const struct gpio_driver_api fakedeferdriverapi;
/* Fake deferred devices */
DEVICE_DT_DEFINE(DT_INST(0, fakedeferdriver), NULL, NULL, NULL, NULL,
POST_KERNEL, CONFIG_KERNEL_INIT_PRIORITY_DEFAULT, NULL);
DEVICE_DT_DEFINE(DT_INST(1, fakedeferdriver), NULL, NULL, NULL, NULL,
POST_KERNEL, CONFIG_KERNEL_INIT_PRIORITY_DEFAULT,
&fakedeferdriverapi);
/**
* @brief Test cases to verify device objects
*
@ -387,9 +401,41 @@ ZTEST(device, test_abstraction_driver_common)
zassert_true(baz == 2, "common API do_that fail");
}
ZTEST(device, test_deferred_init)
{
int ret;
zassert_false(device_is_ready(FAKEDEFERDRIVER0));
ret = device_init(FAKEDEFERDRIVER0);
zassert_true(ret == 0);
zassert_true(device_is_ready(FAKEDEFERDRIVER0));
}
ZTEST_USER(device, test_deferred_init_user)
{
int ret;
zassert_false(device_is_ready(FAKEDEFERDRIVER1));
ret = device_init(FAKEDEFERDRIVER1);
zassert_true(ret == 0);
zassert_true(device_is_ready(FAKEDEFERDRIVER1));
}
void *user_setup(void)
{
#ifdef CONFIG_USERSPACE
k_object_access_grant(FAKEDEFERDRIVER1, k_current_get());
#endif
return NULL;
}
/**
* @}
*/
ZTEST_SUITE(device, NULL, NULL, NULL, NULL, NULL);
ZTEST_SUITE(device, NULL, user_setup, NULL, NULL, NULL);