summaryrefslogtreecommitdiff
path: root/include/hooks.h
diff options
context:
space:
mode:
authorRandall Spangler <rspangler@chromium.org>2012-04-18 13:03:38 -0700
committerRandall Spangler <rspangler@chromium.org>2012-04-19 08:39:41 -0700
commit70f3fcaf8648230a5cd27a9da151494d6df3016f (patch)
treec67e9ff911914f7eaef7af6c9e95874cf8d0cce2 /include/hooks.h
parent6ecbb86b6392fa0b11514903a9fb3d3a3b704391 (diff)
downloadchrome-ec-70f3fcaf8648230a5cd27a9da151494d6df3016f.tar.gz
Add hooks module so modules can be notified of system-level events.
This will be used for sleep/wake/sysjump/etc. For now it's just wired up to clock frequency changing. Signed-off-by: Randall Spangler <rspangler@chromium.org> BUG=none TEST=manual: use nopll command, should still work Change-Id: Iedcea5830bc18eacfd955c29b8f793aba8905dd8
Diffstat (limited to 'include/hooks.h')
-rw-r--r--include/hooks.h48
1 files changed, 48 insertions, 0 deletions
diff --git a/include/hooks.h b/include/hooks.h
new file mode 100644
index 0000000000..3d3a834e25
--- /dev/null
+++ b/include/hooks.h
@@ -0,0 +1,48 @@
+/* Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
+ * Use of this source code is governed by a BSD-style license that can be
+ * found in the LICENSE file.
+ */
+
+/* System hooks for Chrome EC */
+
+#ifndef __CROS_EC_HOOKS_H
+#define __CROS_EC_HOOKS_H
+
+#include "common.h"
+
+enum hook_priority {
+ HOOK_PRIO_FIRST = 1, /* Highest priority */
+ HOOK_PRIO_DEFAULT = 5000, /* Default priority */
+ HOOK_PRIO_LAST = 9999 /* Lowest priority */
+};
+
+enum hook_type {
+ HOOK_FREQ_CHANGE, /* System clock changed frequency */
+};
+
+
+struct hook_data {
+ /* Hook processing routine; returns EC error code. */
+ int (*routine)(void);
+ /* Priority; low numbers = higher priority. */
+ int priority;
+};
+
+
+/* Call all the hook routines of a specified type. If stop_on_error, stops on
+ * the first non-EC_SUCCESS return code. Returns the first non-EC_SUCCESS
+ * return code, if any, or EC_SUCCESS if all hooks returned EC_SUCCESS. */
+int hook_notify(enum hook_type type, int stop_on_error);
+
+
+/* Register a hook routine. <hooktype> should be one of enum hook_type.
+ * <routine> should be int routine(void), and should return an error code or
+ * EC_SUCCESS if no error. <priority> should be between HOOK_PRIO_FIRST and
+ * HOOK_PRIO_LAST, and should be HOOK_PRIO_DEFAULT unless there's a compelling
+ * reason to care about the order in which hooks are called. */
+#define DECLARE_HOOK(hooktype, routine, priority) \
+ const struct hook_data __hook_##hooktype##_##routine \
+ __attribute__((section(".rodata." #hooktype))) \
+ = {routine, priority}
+
+#endif /* __CROS_EC_HOOKS_H */