diff options
-rw-r--r-- | zephyr/emul/emul_rtc.c | 4 | ||||
-rw-r--r-- | zephyr/test/drivers/shim_rtc/src/test_shim_rtc.c | 35 |
2 files changed, 39 insertions, 0 deletions
diff --git a/zephyr/emul/emul_rtc.c b/zephyr/emul/emul_rtc.c index 0d59fb782a..0bd2ef0828 100644 --- a/zephyr/emul/emul_rtc.c +++ b/zephyr/emul/emul_rtc.c @@ -63,6 +63,10 @@ static int cros_rtc_emul_set_value(const struct device *dev, uint32_t value) data->value = value; + if (data->value >= data->alarm_time && data->alarm_time) { + data->alarm_callback(dev); + } + return EC_SUCCESS; } diff --git a/zephyr/test/drivers/shim_rtc/src/test_shim_rtc.c b/zephyr/test/drivers/shim_rtc/src/test_shim_rtc.c index f0b35037be..0b4120a404 100644 --- a/zephyr/test/drivers/shim_rtc/src/test_shim_rtc.c +++ b/zephyr/test/drivers/shim_rtc/src/test_shim_rtc.c @@ -10,6 +10,8 @@ #include "ec_commands.h" #include "host_command.h" +#include "lpc.h" +#include "system.h" #include "test/drivers/test_state.h" ZTEST_USER(rtc_shim, test_hc_rtc_set_get_val) @@ -34,4 +36,37 @@ ZTEST_USER(rtc_shim, test_hc_rtc_set_get_val) zassert_equal(get_value.time, set_value.time); } +ZTEST(rtc_shim, test_hc_rtc_set_alarm_can_fire_cb) +{ + struct ec_params_rtc set_value; + struct host_cmd_handler_args set_args = + BUILD_HOST_COMMAND_PARAMS(EC_CMD_RTC_SET_ALARM, 0, set_value); + +#ifdef CONFIG_HOSTCMD_X86 + /* Enable the RTC event to fire */ + host_event_t lpc_event_mask; + host_event_t mask = EC_HOST_EVENT_MASK(EC_HOST_EVENT_RTC); + + lpc_event_mask = lpc_get_host_event_mask(LPC_HOST_EVENT_SMI); + lpc_set_host_event_mask(LPC_HOST_EVENT_SMI, lpc_event_mask | mask); +#endif + + /* Arbitrary value of 2 */ + system_set_rtc(2); + + /* Clear events so we can check that RTC event happened */ + host_clear_events(CONFIG_HOST_EVENT_REPORT_MASK); + zassert_false(host_is_event_set(EC_HOST_EVENT_RTC)); + + /* Initially set arbitrary value of alarm in 2 seconds*/ + set_value.time = 2; + zassert_ok(host_command_process(&set_args)); + /* Set fake driver time forward to hit the alarm in 2 seconds */ + system_set_rtc(4); + + /* Wait for irq to finish */ + k_sleep(K_SECONDS(1)); + zassert_true(host_is_event_set(EC_HOST_EVENT_RTC)); +} + ZTEST_SUITE(rtc_shim, drivers_predicate_post_main, NULL, NULL, NULL, NULL); |