diff options
author | Randall Spangler <rspangler@chromium.org> | 2012-04-18 13:03:38 -0700 |
---|---|---|
committer | Randall Spangler <rspangler@chromium.org> | 2012-04-19 08:39:41 -0700 |
commit | 70f3fcaf8648230a5cd27a9da151494d6df3016f (patch) | |
tree | c67e9ff911914f7eaef7af6c9e95874cf8d0cce2 /include/hooks.h | |
parent | 6ecbb86b6392fa0b11514903a9fb3d3a3b704391 (diff) | |
download | chrome-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.h | 48 |
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 */ |