diff options
| author | Patrick Mochel <mochel@osdl.org> | 2003-08-04 03:35:30 -0700 |
|---|---|---|
| committer | Patrick Mochel <mochel@osdl.org> | 2003-08-04 03:35:30 -0700 |
| commit | 2e4208cd650e04a06eef8fa769892fc6964c9b37 (patch) | |
| tree | bc01fc72e916643bbe3584b43c95000cef56af1a | |
| parent | 5847d6c19bbbf2aa5c67504729f9b84750e57fa3 (diff) | |
[power] Divorce suspend console code from swsusp.
- Create kernel/power/console.c
- Rename prepare_suspend_console() to pm_prepare_console() and
restore_console() to pm_restore_console().
- Add prototypes to include/linux/suspend.h.
- Make kernel/power/console.o dependent only on CONFIG_PM
- Simplify logic for SUSPEND_CONSOLE define
- Make software_resume() prepare console much earlier, so we can localize
the loglevel variables in console.c.
- Remove #ifdef CONFIG_VT from console.c, and just check for SUSPEND_CONSOLE.
(Perhaps we should make entire file dependent on CONFIG_VT_CONSOLE?)
- Add kernel/power/power.h to share things across local files.
| -rw-r--r-- | include/linux/suspend.h | 4 | ||||
| -rw-r--r-- | kernel/power/Makefile | 2 | ||||
| -rw-r--r-- | kernel/power/console.c | 40 | ||||
| -rw-r--r-- | kernel/power/power.h | 9 | ||||
| -rw-r--r-- | kernel/power/swsusp.c | 62 |
5 files changed, 62 insertions, 55 deletions
diff --git a/include/linux/suspend.h b/include/linux/suspend.h index 864067f87aa8..03340682a466 100644 --- a/include/linux/suspend.h +++ b/include/linux/suspend.h @@ -85,6 +85,10 @@ static inline void software_suspend(void) extern void refrigerator(unsigned long); extern int freeze_processes(void); extern void thaw_processes(void); + +extern int pm_prepare_console(void); +extern void pm_restore_console(void); + #else static inline void refrigerator(unsigned long) { diff --git a/kernel/power/Makefile b/kernel/power/Makefile index 01e81e5f5bd7..2a1e6368f7e5 100644 --- a/kernel/power/Makefile +++ b/kernel/power/Makefile @@ -1,2 +1,2 @@ -obj-y := process.o +obj-y := process.o console.o obj-$(CONFIG_SOFTWARE_SUSPEND) += swsusp.o diff --git a/kernel/power/console.c b/kernel/power/console.c new file mode 100644 index 000000000000..bfaf3f14c114 --- /dev/null +++ b/kernel/power/console.c @@ -0,0 +1,40 @@ +#include <linux/vt_kern.h> +#include <linux/kbd_kern.h> +#include "power.h" + +static int new_loglevel = 7; +static int orig_loglevel; +static int orig_fgconsole, orig_kmsg; + +int pm_prepare_console(void) +{ + orig_loglevel = console_loglevel; + console_loglevel = new_loglevel; + +#ifdef SUSPEND_CONSOLE + orig_fgconsole = fg_console; + + if(vc_allocate(SUSPEND_CONSOLE)) + /* we can't have a free VC for now. Too bad, + * we don't want to mess the screen for now. */ + return 1; + + set_console (SUSPEND_CONSOLE); + if(vt_waitactive(SUSPEND_CONSOLE)) { + pr_debug("Suspend: Can't switch VCs."); + return 1; + } + orig_kmsg = kmsg_redirect; + kmsg_redirect = SUSPEND_CONSOLE; +#endif + return 0; +} + +void pm_restore_console(void) +{ + console_loglevel = orig_loglevel; +#ifdef SUSPEND_CONSOLE + set_console (orig_fgconsole); +#endif + return; +} diff --git a/kernel/power/power.h b/kernel/power/power.h new file mode 100644 index 000000000000..0b7f86a3311e --- /dev/null +++ b/kernel/power/power.h @@ -0,0 +1,9 @@ + + +/* With SUSPEND_CONSOLE defined, it suspend looks *really* cool, but + we probably do not take enough locks for switching consoles, etc, + so bad things might happen. +*/ +#if defined(CONFIG_VT) && defined(CONFIG_VT_CONSOLE) +#define SUSPEND_CONSOLE (MAX_NR_CONSOLES-1) +#endif diff --git a/kernel/power/swsusp.c b/kernel/power/swsusp.c index 3dfb07e05a2d..b9cd4bd18358 100644 --- a/kernel/power/swsusp.c +++ b/kernel/power/swsusp.c @@ -43,8 +43,8 @@ #include <linux/version.h> #include <linux/delay.h> #include <linux/reboot.h> -#include <linux/vt_kern.h> #include <linux/bitops.h> +#include <linux/vt_kern.h> #include <linux/kbd_kern.h> #include <linux/keyboard.h> #include <linux/spinlock.h> @@ -63,19 +63,12 @@ #include <asm/pgtable.h> #include <asm/io.h> +#include "power.h" + extern long sys_sync(void); unsigned char software_suspend_enabled = 0; -#define SUSPEND_CONSOLE (MAX_NR_CONSOLES-1) -/* With SUSPEND_CONSOLE defined, it suspend looks *really* cool, but - we probably do not take enough locks for switching consoles, etc, - so bad things might happen. -*/ -#if !defined(CONFIG_VT) || !defined(CONFIG_VT_CONSOLE) -#undef SUSPEND_CONSOLE -#endif - #define __ADDRESS(x) ((unsigned long) phys_to_virt(x)) #define ADDRESS(x) __ADDRESS((x) << PAGE_SHIFT) #define ADDRESS2(x) __ADDRESS(__pa(x)) /* Needed for x86-64 where some pages are in memory twice */ @@ -89,9 +82,6 @@ extern int is_head_of_free_region(struct page *); spinlock_t suspend_pagedir_lock __nosavedata = SPIN_LOCK_UNLOCKED; /* Variables to be preserved over suspend */ -static int new_loglevel = 7; -static int orig_loglevel; -static int orig_fgconsole, orig_kmsg; static int pagedir_order_check; static int nr_copy_pages_check; @@ -455,40 +445,6 @@ static suspend_pagedir_t *create_suspend_pagedir(int nr_copy_pages) return pagedir; } -static int prepare_suspend_console(void) -{ - orig_loglevel = console_loglevel; - console_loglevel = new_loglevel; - -#ifdef CONFIG_VT - orig_fgconsole = fg_console; -#ifdef SUSPEND_CONSOLE - if(vc_allocate(SUSPEND_CONSOLE)) - /* we can't have a free VC for now. Too bad, - * we don't want to mess the screen for now. */ - return 1; - - set_console (SUSPEND_CONSOLE); - if(vt_waitactive(SUSPEND_CONSOLE)) { - PRINTK("Bummer. Can't switch VCs."); - return 1; - } - orig_kmsg = kmsg_redirect; - kmsg_redirect = SUSPEND_CONSOLE; -#endif -#endif - return 0; -} - -static void restore_console(void) -{ - console_loglevel = orig_loglevel; -#ifdef SUSPEND_CONSOLE - set_console (orig_fgconsole); -#endif - return; -} - static int prepare_suspend_processes(void) { sys_sync(); /* Syncing needs pdflushd, so do it before stopping processes */ @@ -743,7 +699,7 @@ void do_magic_suspend_2(void) static void do_software_suspend(void) { arch_prepare_suspend(); - if (prepare_suspend_console()) + if (pm_prepare_console()) printk( "%sCan't allocate a console... proceeding\n", name_suspend); if (!prepare_suspend_processes()) { @@ -774,7 +730,7 @@ static void do_software_suspend(void) } software_suspend_enabled = 1; MDELAY(1000); - restore_console(); + pm_restore_console(); } /* @@ -997,8 +953,6 @@ static int __read_suspend_image(struct block_device *bdev, union diskpage *cur, bdev_write_page(bdev, 0, cur); } - if (prepare_suspend_console()) - printk("%sCan't allocate a console... proceeding\n", name_resume); printk( "%sSignature found, resuming\n", name_resume ); MDELAY(1000); @@ -1119,8 +1073,8 @@ void software_resume(void) } MDELAY(1000); - orig_loglevel = console_loglevel; - console_loglevel = new_loglevel; + if (pm_prepare_console()) + printk("swsusp: Can't allocate a console... proceeding\n"); if (!resume_file[0] && resume_status == RESUME_SPECIFIED) { printk( "suspension device unspecified\n" ); @@ -1134,7 +1088,7 @@ void software_resume(void) panic("This never returns"); read_failure: - console_loglevel = orig_loglevel; + pm_restore_console(); return; } |
