summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--zephyr/shim/src/hooks.c21
-rw-r--r--zephyr/test/hooks/hooks.c24
2 files changed, 37 insertions, 8 deletions
diff --git a/zephyr/shim/src/hooks.c b/zephyr/shim/src/hooks.c
index 179f35eef4..dee7c20441 100644
--- a/zephyr/shim/src/hooks.c
+++ b/zephyr/shim/src/hooks.c
@@ -55,13 +55,21 @@ void zephyr_shim_setup_deferred(const struct deferred_data *data)
int hook_call_deferred(const struct deferred_data *data, int us)
{
struct deferred_data *non_const = (struct deferred_data *)data;
- int rv;
+ int rv = 0;
+
+ if (us == -1) {
+ k_delayed_work_cancel(&non_const->delayed_work);
+ } else if (us >= 0) {
+ rv = k_delayed_work_submit_to_queue(&deferred_work_queue,
+ &non_const->delayed_work,
+ K_USEC(us));
+ if (rv < 0)
+ cprints(CC_HOOK,
+ "Warning: deferred call not submitted.");
+ } else {
+ return EC_ERROR_PARAM2;
+ }
- rv = k_delayed_work_submit_to_queue(&deferred_work_queue,
- &non_const->delayed_work,
- K_USEC(us));
- if (rv < 0)
- cprints(CC_HOOK, "Warning: deferred call not submitted.");
return rv;
}
@@ -126,4 +134,3 @@ void hook_task(void *u)
task_wait_event(next);
}
}
-
diff --git a/zephyr/test/hooks/hooks.c b/zephyr/test/hooks/hooks.c
index 6b482b30cf..9f504d4ff4 100644
--- a/zephyr/test/hooks/hooks.c
+++ b/zephyr/test/hooks/hooks.c
@@ -120,6 +120,27 @@ static void test_deferred_func_push_out(void)
"The deferred function was not called, but should have been");
}
+static bool deferred_func_3_called;
+
+static void deferred_func_3(void)
+{
+ deferred_func_3_called = true;
+}
+DECLARE_DEFERRED(deferred_func_3);
+
+static void test_deferred_func_cancel(void)
+{
+ zassert_false(
+ deferred_func_3_called,
+ "The deferred function was called, but should not have been");
+ hook_call_deferred(&deferred_func_3_data, DEFERRED_DELAY_US);
+ hook_call_deferred(&deferred_func_3_data, -1);
+ k_usleep(DEFERRED_DELAY_US * 2);
+ zassert_false(
+ deferred_func_3_called,
+ "The deferred function was called, but should not have been");
+}
+
void test_main(void)
{
ztest_test_suite(
@@ -128,7 +149,8 @@ void test_main(void)
ztest_unit_test(test_hook_list_single),
ztest_unit_test(test_hook_list_empty),
ztest_unit_test(test_deferred_func),
- ztest_unit_test(test_deferred_func_push_out));
+ ztest_unit_test(test_deferred_func_push_out),
+ ztest_unit_test(test_deferred_func_cancel));
ztest_run_test_suite(hooks_tests);
}