diff options
Diffstat (limited to 'kernel/power/console.c')
-rw-r--r-- | kernel/power/console.c | 58 |
1 files changed, 58 insertions, 0 deletions
diff --git a/kernel/power/console.c b/kernel/power/console.c new file mode 100644 index 000000000000..7ff375e7c95f --- /dev/null +++ b/kernel/power/console.c | |||
@@ -0,0 +1,58 @@ | |||
1 | /* | ||
2 | * drivers/power/process.c - Functions for saving/restoring console. | ||
3 | * | ||
4 | * Originally from swsusp. | ||
5 | */ | ||
6 | |||
7 | #include <linux/vt_kern.h> | ||
8 | #include <linux/kbd_kern.h> | ||
9 | #include <linux/console.h> | ||
10 | #include "power.h" | ||
11 | |||
12 | static int new_loglevel = 10; | ||
13 | static int orig_loglevel; | ||
14 | #ifdef SUSPEND_CONSOLE | ||
15 | static int orig_fgconsole, orig_kmsg; | ||
16 | #endif | ||
17 | |||
18 | int pm_prepare_console(void) | ||
19 | { | ||
20 | orig_loglevel = console_loglevel; | ||
21 | console_loglevel = new_loglevel; | ||
22 | |||
23 | #ifdef SUSPEND_CONSOLE | ||
24 | acquire_console_sem(); | ||
25 | |||
26 | orig_fgconsole = fg_console; | ||
27 | |||
28 | if (vc_allocate(SUSPEND_CONSOLE)) { | ||
29 | /* we can't have a free VC for now. Too bad, | ||
30 | * we don't want to mess the screen for now. */ | ||
31 | release_console_sem(); | ||
32 | return 1; | ||
33 | } | ||
34 | |||
35 | set_console(SUSPEND_CONSOLE); | ||
36 | release_console_sem(); | ||
37 | |||
38 | if (vt_waitactive(SUSPEND_CONSOLE)) { | ||
39 | pr_debug("Suspend: Can't switch VCs."); | ||
40 | return 1; | ||
41 | } | ||
42 | orig_kmsg = kmsg_redirect; | ||
43 | kmsg_redirect = SUSPEND_CONSOLE; | ||
44 | #endif | ||
45 | return 0; | ||
46 | } | ||
47 | |||
48 | void pm_restore_console(void) | ||
49 | { | ||
50 | console_loglevel = orig_loglevel; | ||
51 | #ifdef SUSPEND_CONSOLE | ||
52 | acquire_console_sem(); | ||
53 | set_console(orig_fgconsole); | ||
54 | release_console_sem(); | ||
55 | kmsg_redirect = orig_kmsg; | ||
56 | #endif | ||
57 | return; | ||
58 | } | ||