]> git.hungrycats.org Git - linux/commitdiff
[power] Divorce suspend console code from swsusp.
authorPatrick Mochel <mochel@osdl.org>
Mon, 4 Aug 2003 10:35:30 +0000 (03:35 -0700)
committerPatrick Mochel <mochel@osdl.org>
Mon, 4 Aug 2003 10:35:30 +0000 (03:35 -0700)
- 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.

include/linux/suspend.h
kernel/power/Makefile
kernel/power/console.c [new file with mode: 0644]
kernel/power/power.h [new file with mode: 0644]
kernel/power/swsusp.c

index 864067f87aa8fe158b71b61a07d42e53d204f4f6..03340682a466c6bcba0a929dcd89bf5b46ef8789 100644 (file)
@@ -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)
 {
index 01e81e5f5bd7a17fc059177907388078eb17b8b1..2a1e6368f7e522e5f09d3c2ea6dde9e33d041b70 100644 (file)
@@ -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 (file)
index 0000000..bfaf3f1
--- /dev/null
@@ -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 (file)
index 0000000..0b7f86a
--- /dev/null
@@ -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
index 3dfb07e05a2def91495509bef1b3e0e2c661beba..b9cd4bd183584db22ad0b96b8e01282c082d1dac 100644 (file)
@@ -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>
 #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;
 }