aboutsummaryrefslogtreecommitdiffstats
path: root/include/linux/suspend.h
diff options
context:
space:
mode:
authorRafael J. Wysocki <rjw@sisk.pl>2007-10-18 06:04:39 -0400
committerLinus Torvalds <torvalds@woody.linux-foundation.org>2007-10-18 17:37:18 -0400
commit95d9ffbe01fb21d524c86bf77871255066bc6e55 (patch)
tree647355f56f85b1038ffc81fa50ff2c3878ab6597 /include/linux/suspend.h
parenta065c86e1bfcdd36709025d018965afea3f3a2b6 (diff)
PM: Move definition of struct pm_ops to suspend.h
Move the definition of 'struct pm_ops' and related functions from <linux/pm.h> to <linux/suspend.h> . There are, at least, the following reasons to do that: * 'struct pm_ops' is specifically related to suspend and not to the power management in general. * As long as 'struct pm_ops' is defined in <linux/pm.h>, any modification of it causes the entire kernel to be recompiled, which is unnecessary and annoying. * Some suspend-related features are already defined in <linux/suspend.h>, so it is logical to move the definition of 'struct pm_ops' into there. * 'struct hibernation_ops', being the hibernation-related counterpart of 'struct pm_ops', is defined in <linux/suspend.h> . Signed-off-by: Rafael J. Wysocki <rjw@sisk.pl> Acked-by: Pavel Machek <pavel@ucw.cz> Cc: Len Brown <lenb@kernel.org> Cc: Greg KH <greg@kroah.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'include/linux/suspend.h')
-rw-r--r--include/linux/suspend.h121
1 files changed, 110 insertions, 11 deletions
diff --git a/include/linux/suspend.h b/include/linux/suspend.h
index 388cace9751f..c230680d5252 100644
--- a/include/linux/suspend.h
+++ b/include/linux/suspend.h
@@ -1,5 +1,5 @@
1#ifndef _LINUX_SWSUSP_H 1#ifndef _LINUX_SUSPEND_H
2#define _LINUX_SWSUSP_H 2#define _LINUX_SUSPEND_H
3 3
4#if defined(CONFIG_X86) || defined(CONFIG_FRV) || defined(CONFIG_PPC32) || defined(CONFIG_PPC64) 4#if defined(CONFIG_X86) || defined(CONFIG_FRV) || defined(CONFIG_PPC32) || defined(CONFIG_PPC64)
5#include <asm/suspend.h> 5#include <asm/suspend.h>
@@ -9,6 +9,113 @@
9#include <linux/init.h> 9#include <linux/init.h>
10#include <linux/pm.h> 10#include <linux/pm.h>
11#include <linux/mm.h> 11#include <linux/mm.h>
12#include <asm/errno.h>
13
14#if defined(CONFIG_PM_SLEEP) && defined(CONFIG_VT) && defined(CONFIG_VT_CONSOLE)
15extern int pm_prepare_console(void);
16extern void pm_restore_console(void);
17#else
18static inline int pm_prepare_console(void) { return 0; }
19static inline void pm_restore_console(void) {}
20#endif
21
22typedef int __bitwise suspend_state_t;
23
24#define PM_SUSPEND_ON ((__force suspend_state_t) 0)
25#define PM_SUSPEND_STANDBY ((__force suspend_state_t) 1)
26#define PM_SUSPEND_MEM ((__force suspend_state_t) 3)
27#define PM_SUSPEND_MAX ((__force suspend_state_t) 4)
28
29/**
30 * struct pm_ops - Callbacks for managing platform dependent system sleep
31 * states.
32 *
33 * @valid: Callback to determine if given system sleep state is supported by
34 * the platform.
35 * Valid (ie. supported) states are advertised in /sys/power/state. Note
36 * that it still may be impossible to enter given system sleep state if the
37 * conditions aren't right.
38 * There is the %pm_valid_only_mem function available that can be assigned
39 * to this if the platform only supports mem sleep.
40 *
41 * @set_target: Tell the platform which system sleep state is going to be
42 * entered.
43 * @set_target() is executed right prior to suspending devices. The
44 * information conveyed to the platform code by @set_target() should be
45 * disregarded by the platform as soon as @finish() is executed and if
46 * @prepare() fails. If @set_target() fails (ie. returns nonzero),
47 * @prepare(), @enter() and @finish() will not be called by the PM core.
48 * This callback is optional. However, if it is implemented, the argument
49 * passed to @prepare(), @enter() and @finish() is meaningless and should
50 * be ignored.
51 *
52 * @prepare: Prepare the platform for entering the system sleep state indicated
53 * by @set_target() or represented by the argument if @set_target() is not
54 * implemented.
55 * @prepare() is called right after devices have been suspended (ie. the
56 * appropriate .suspend() method has been executed for each device) and
57 * before the nonboot CPUs are disabled (it is executed with IRQs enabled).
58 * This callback is optional. It returns 0 on success or a negative
59 * error code otherwise, in which case the system cannot enter the desired
60 * sleep state (@enter() and @finish() will not be called in that case).
61 *
62 * @enter: Enter the system sleep state indicated by @set_target() or
63 * represented by the argument if @set_target() is not implemented.
64 * This callback is mandatory. It returns 0 on success or a negative
65 * error code otherwise, in which case the system cannot enter the desired
66 * sleep state.
67 *
68 * @finish: Called when the system has just left a sleep state, right after
69 * the nonboot CPUs have been enabled and before devices are resumed (it is
70 * executed with IRQs enabled). If @set_target() is not implemented, the
71 * argument represents the sleep state being left.
72 * This callback is optional, but should be implemented by the platforms
73 * that implement @prepare(). If implemented, it is always called after
74 * @enter() (even if @enter() fails).
75 */
76struct pm_ops {
77 int (*valid)(suspend_state_t state);
78 int (*set_target)(suspend_state_t state);
79 int (*prepare)(suspend_state_t state);
80 int (*enter)(suspend_state_t state);
81 int (*finish)(suspend_state_t state);
82};
83
84#ifdef CONFIG_SUSPEND
85extern struct pm_ops *pm_ops;
86
87/**
88 * pm_set_ops - set platform dependent power management ops
89 * @pm_ops: The new power management operations to set.
90 */
91extern void pm_set_ops(struct pm_ops *pm_ops);
92extern int pm_valid_only_mem(suspend_state_t state);
93
94/**
95 * arch_suspend_disable_irqs - disable IRQs for suspend
96 *
97 * Disables IRQs (in the default case). This is a weak symbol in the common
98 * code and thus allows architectures to override it if more needs to be
99 * done. Not called for suspend to disk.
100 */
101extern void arch_suspend_disable_irqs(void);
102
103/**
104 * arch_suspend_enable_irqs - enable IRQs after suspend
105 *
106 * Enables IRQs (in the default case). This is a weak symbol in the common
107 * code and thus allows architectures to override it if more needs to be
108 * done. Not called for suspend to disk.
109 */
110extern void arch_suspend_enable_irqs(void);
111
112extern int pm_suspend(suspend_state_t state);
113#else /* !CONFIG_SUSPEND */
114#define suspend_valid_only_mem NULL
115
116static inline void pm_set_ops(struct pm_ops *pm_ops) {}
117static inline int pm_suspend(suspend_state_t state) { return -ENOSYS; }
118#endif /* !CONFIG_SUSPEND */
12 119
13/* struct pbe is used for creating lists of pages that should be restored 120/* struct pbe is used for creating lists of pages that should be restored
14 * atomically during the resume from disk, because the page frames they have 121 * atomically during the resume from disk, because the page frames they have
@@ -24,14 +131,6 @@ struct pbe {
24extern void drain_local_pages(void); 131extern void drain_local_pages(void);
25extern void mark_free_pages(struct zone *zone); 132extern void mark_free_pages(struct zone *zone);
26 133
27#if defined(CONFIG_PM_SLEEP) && defined(CONFIG_VT) && defined(CONFIG_VT_CONSOLE)
28extern int pm_prepare_console(void);
29extern void pm_restore_console(void);
30#else
31static inline int pm_prepare_console(void) { return 0; }
32static inline void pm_restore_console(void) {}
33#endif
34
35/** 134/**
36 * struct hibernation_ops - hibernation platform support 135 * struct hibernation_ops - hibernation platform support
37 * 136 *
@@ -130,4 +229,4 @@ static inline void register_nosave_region_late(unsigned long b, unsigned long e)
130} 229}
131#endif 230#endif
132 231
133#endif /* _LINUX_SWSUSP_H */ 232#endif /* _LINUX_SUSPEND_H */