[PATCH 07/10] PM: earlysuspend: Add console switch when user requested sleep state changes.

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



When early-suspend is enabled, the framebuffer is turned off atearly-suspend. If CONSOLE_EARLYSUSPEND is enabled, a console switchis used to notify user space that it should stop drawing beforethe framebuffer is disabled, and that it should repaint and resumedrawing after the framebuffer is turned back on.
Signed-off-by: Arve Hjønnevåg <arve@xxxxxxxxxxx>--- kernel/power/Kconfig               |   17 ++++++++ kernel/power/Makefile              |    1 + kernel/power/consoleearlysuspend.c |   78 ++++++++++++++++++++++++++++++++++++ 3 files changed, 96 insertions(+), 0 deletions(-) create mode 100644 kernel/power/consoleearlysuspend.c
diff --git a/kernel/power/Kconfig b/kernel/power/Kconfigindex ccc55be..04e6fad 100644--- a/kernel/power/Kconfig+++ b/kernel/power/Kconfig@@ -159,6 +159,23 @@ config EARLYSUSPEND 	  Call early suspend handlers when the user requested sleep state 	  changes. +choice+	prompt "User-space screen access"+	default CONSOLE_EARLYSUSPEND+	depends on EARLYSUSPEND++	config NO_USER_SPACE_SCREEN_ACCESS_CONTROL+		bool "None"++	config CONSOLE_EARLYSUSPEND+		bool "Console switch on early-suspend"+		depends on EARLYSUSPEND && VT+		---help---+		  Register early suspend handler to perform a console switch+		  when user-space should stop drawing to the screen and a switch+		  back when it should resume.+endchoice+ config HIBERNATION 	bool "Hibernation (aka 'suspend to disk')" 	depends on PM && SWAP && ARCH_HIBERNATION_POSSIBLEdiff --git a/kernel/power/Makefile b/kernel/power/Makefileindex d3467b3..8bf293d 100644--- a/kernel/power/Makefile+++ b/kernel/power/Makefile@@ -9,6 +9,7 @@ obj-$(CONFIG_FREEZER)		+= process.o obj-$(CONFIG_WAKELOCK)		+= wakelock.o obj-$(CONFIG_USER_WAKELOCK)	+= userwakelock.o obj-$(CONFIG_EARLYSUSPEND)	+= earlysuspend.o+obj-$(CONFIG_CONSOLE_EARLYSUSPEND)	+= consoleearlysuspend.o obj-$(CONFIG_HIBERNATION)	+= swsusp.o disk.o snapshot.o swap.o user.o  obj-$(CONFIG_MAGIC_SYSRQ)	+= poweroff.odiff --git a/kernel/power/consoleearlysuspend.c b/kernel/power/consoleearlysuspend.cnew file mode 100644index 0000000..a8befb4--- /dev/null+++ b/kernel/power/consoleearlysuspend.c@@ -0,0 +1,78 @@+/* 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)+{+	acquire_console_sem();+	orig_fgconsole = fg_console;+	if (vc_allocate(EARLY_SUSPEND_CONSOLE))+		goto err;+	if (set_console(EARLY_SUSPEND_CONSOLE))+		goto err;+	release_console_sem();++	if (vt_waitactive(EARLY_SUSPEND_CONSOLE))+		pr_warning("console_early_suspend: Can't switch VCs.\n");+	return;+err:+	pr_warning("console_early_suspend: Can't set console\n");+	release_console_sem();+}++static void console_late_resume(struct early_suspend *h)+{+	int ret;+	acquire_console_sem();+	ret = set_console(orig_fgconsole);+	release_console_sem();+	if (ret) {+		pr_warning("console_late_resume: Can't set console.\n");+		return;+	}++	if (vt_waitactive(orig_fgconsole))+		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);+-- 1.6.1
_______________________________________________linux-pm mailing listlinux-pm@xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx://lists.linux-foundation.org/mailman/listinfo/linux-pm


[Index of Archives]     [Linux ACPI]     [Netdev]     [Ethernet Bridging]     [Linux Wireless]     [CPU Freq]     [Kernel Newbies]     [Fedora Kernel]     [Security]     [Linux for Hams]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux RAID]     [Linux Admin]     [Samba]

  Powered by Linux