linux/kernel/power/console.c
<<
>>
Prefs
   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 <linux/module.h>
  11#include "power.h"
  12
  13#if defined(CONFIG_VT) && defined(CONFIG_VT_CONSOLE)
  14#define SUSPEND_CONSOLE (MAX_NR_CONSOLES-1)
  15
  16static int orig_fgconsole, orig_kmsg;
  17static int disable_vt_switch;
  18
  19/*
  20 * Normally during a suspend, we allocate a new console and switch to it.
  21 * When we resume, we switch back to the original console.  This switch
  22 * can be slow, so on systems where the framebuffer can handle restoration
  23 * of video registers anyways, there's little point in doing the console
  24 * switch.  This function allows you to disable it by passing it '0'.
  25 */
  26void pm_set_vt_switch(int do_switch)
  27{
  28        acquire_console_sem();
  29        disable_vt_switch = !do_switch;
  30        release_console_sem();
  31}
  32EXPORT_SYMBOL(pm_set_vt_switch);
  33
  34int pm_prepare_console(void)
  35{
  36        acquire_console_sem();
  37
  38        if (disable_vt_switch) {
  39                release_console_sem();
  40                return 0;
  41        }
  42
  43        orig_fgconsole = fg_console;
  44
  45        if (vc_allocate(SUSPEND_CONSOLE)) {
  46          /* we can't have a free VC for now. Too bad,
  47           * we don't want to mess the screen for now. */
  48                release_console_sem();
  49                return 1;
  50        }
  51
  52        if (set_console(SUSPEND_CONSOLE)) {
  53                /*
  54                 * We're unable to switch to the SUSPEND_CONSOLE.
  55                 * Let the calling function know so it can decide
  56                 * what to do.
  57                 */
  58                release_console_sem();
  59                return 1;
  60        }
  61        release_console_sem();
  62
  63        if (vt_waitactive(SUSPEND_CONSOLE)) {
  64                pr_debug("Suspend: Can't switch VCs.");
  65                return 1;
  66        }
  67        orig_kmsg = kmsg_redirect;
  68        kmsg_redirect = SUSPEND_CONSOLE;
  69        return 0;
  70}
  71
  72void pm_restore_console(void)
  73{
  74        acquire_console_sem();
  75        if (disable_vt_switch) {
  76                release_console_sem();
  77                return;
  78        }
  79        set_console(orig_fgconsole);
  80        release_console_sem();
  81        kmsg_redirect = orig_kmsg;
  82}
  83#endif
  84
lxr.linux.no kindly hosted by Redpill Linpro AS, provider of Linux consulting and operations services since 1995.