summaryrefslogtreecommitdiff
path: root/include/hooks.h
blob: 2c691fb639204a52fdc7bc81d2dff04998fe1335 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
/* 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 {
	/* Generic values across all hooks */
	HOOK_PRIO_FIRST = 1,       /* Highest priority */
	HOOK_PRIO_DEFAULT = 5000,  /* Default priority */
	HOOK_PRIO_LAST = 9999,     /* Lowest priority */

	/* Specific hook vales for HOOK_INIT */
	/* LPC inits before modules which need memory-mapped I/O */
	HOOK_PRIO_INIT_LPC = HOOK_PRIO_FIRST + 1,
	/* Chipset inits before modules which need to know its initial state. */
	HOOK_PRIO_INIT_CHIPSET = HOOK_PRIO_FIRST + 2,
};

enum hook_type {
	HOOK_INIT = 0,         /* System init */
	HOOK_FREQ_CHANGE,      /* System clock changed frequency */
	HOOK_SYSJUMP,          /* About to jump to another image.  Modules
				* which need to preserve data across such a
				* jump should save it here and restore it in
				* HOOK_INIT.
				*
				* NOTE: This hook is called with interrupts
				* disabled! */
	HOOK_CHIPSET_PRE_INIT, /* Initialization for components such as PMU to
				* be done before host chipset/AP starts up. */
	HOOK_CHIPSET_STARTUP,  /* System is starting up.  All suspend rails are
				* now on. */
	HOOK_CHIPSET_RESUME,   /* System is resuming from suspend, or booting
				* and has reached the point where all voltage
				* rails are on */
	HOOK_CHIPSET_SUSPEND,  /* System is suspending, or shutting down; all
				* voltage rails are still on */
	HOOK_CHIPSET_SHUTDOWN, /* System is shutting down.  All suspend rails
				* are still on. */
	HOOK_AC_CHANGE,        /* AC power plugged in or removed */
	HOOK_LID_CHANGE,       /* Lid opened or closed.  Based on debounced lid
				* state, not raw lid GPIO input. */
	HOOK_TICK,             /* Periodic tick, every HOOK_TICK_INTERVAL */
};

struct hook_data {
	/* Hook processing routine. */
	void (*routine)(void);
	/* Priority; low numbers = higher priority. */
	int priority;
};

/**
 * Call all the hook routines of a specified type.
 *
 * @param type		Type of hook routines to call.
 */
void hook_notify(enum hook_type type);

/**
 * Register a hook routine.
 *
 * @param hooktype	Type of hook for routine (enum hook_type)
 * @param routine	Hook routine, with prototype void routine(void)
 * @param priority      Priority for determining when routine is called vs.
 *			other hook routines; 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 */