| /* kernel/power/consoleearlysuspend.c | 
 |  * | 
 |  * Copyright (C) 2005-2008 Google, Inc. | 
 |  * | 
 |  * This software is licensed under the terms of the GNU General Public | 
 |  * License version 2, as published by the Free Software Foundation, and | 
 |  * may be copied, distributed, and modified under those terms. | 
 |  * | 
 |  * This program is distributed in the hope that it will be useful, | 
 |  * but WITHOUT ANY WARRANTY; without even the implied warranty of | 
 |  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | 
 |  * GNU General Public License for more details. | 
 |  * | 
 |  */ | 
 |  | 
 | #include <linux/console.h> | 
 | #include <linux/earlysuspend.h> | 
 | #include <linux/kbd_kern.h> | 
 | #include <linux/module.h> | 
 | #include <linux/vt_kern.h> | 
 | #include <linux/wait.h> | 
 |  | 
 | #define EARLY_SUSPEND_CONSOLE	(MAX_NR_CONSOLES-1) | 
 |  | 
 | static int orig_fgconsole; | 
 | static void console_early_suspend(struct early_suspend *h) | 
 | { | 
 | 	orig_fgconsole = fg_console; | 
 | 	if (vc_allocate(EARLY_SUSPEND_CONSOLE)) | 
 | 		goto err; | 
 | 	if (set_console(EARLY_SUSPEND_CONSOLE)) | 
 | 		goto err; | 
 |  | 
 | 	if (vt_waitactive(EARLY_SUSPEND_CONSOLE + 1)) | 
 | 		pr_warning("console_early_suspend: Can't switch VCs.\n"); | 
 | 	return; | 
 | err: | 
 | 	pr_warning("console_early_suspend: Can't set console\n"); | 
 | } | 
 |  | 
 | static void console_late_resume(struct early_suspend *h) | 
 | { | 
 | 	int ret; | 
 | 	ret = set_console(orig_fgconsole); | 
 | 	if (ret) { | 
 | 		pr_warning("console_late_resume: Can't set console.\n"); | 
 | 		return; | 
 | 	} | 
 |  | 
 | 	if (vt_waitactive(orig_fgconsole + 1)) | 
 | 		pr_warning("console_late_resume: Can't switch VCs.\n"); | 
 | } | 
 |  | 
 | static struct early_suspend console_early_suspend_desc = { | 
 | 	.level = EARLY_SUSPEND_LEVEL_STOP_DRAWING, | 
 | 	.suspend = console_early_suspend, | 
 | 	.resume = console_late_resume, | 
 | }; | 
 |  | 
 | static int __init console_early_suspend_init(void) | 
 | { | 
 | 	register_early_suspend(&console_early_suspend_desc); | 
 | 	return 0; | 
 | } | 
 |  | 
 | static void  __exit console_early_suspend_exit(void) | 
 | { | 
 | 	unregister_early_suspend(&console_early_suspend_desc); | 
 | } | 
 |  | 
 | module_init(console_early_suspend_init); | 
 | module_exit(console_early_suspend_exit); | 
 |  |