// SPDX-License-Identifier: GPL-2.0 /* * Functions for saving/restoring console. * * Originally from swsusp. */ #include <linux/console.h> #include <linux/vt_kern.h> #include <linux/kbd_kern.h> #include <linux/vt.h> #include <linux/module.h> #include <linux/slab.h> #include "power.h" #define SUSPEND_CONSOLE … static int orig_fgconsole, orig_kmsg; static DEFINE_MUTEX(vt_switch_mutex); struct pm_vt_switch { … }; static LIST_HEAD(pm_vt_switch_list); /** * pm_vt_switch_required - indicate VT switch at suspend requirements * @dev: device * @required: if true, caller needs VT switch at suspend/resume time * * The different console drivers may or may not require VT switches across * suspend/resume, depending on how they handle restoring video state and * what may be running. * * Drivers can indicate support for switchless suspend/resume, which can * save time and flicker, by using this routine and passing 'false' as * the argument. If any loaded driver needs VT switching, or the * no_console_suspend argument has been passed on the command line, VT * switches will occur. */ void pm_vt_switch_required(struct device *dev, bool required) { … } EXPORT_SYMBOL(…); /** * pm_vt_switch_unregister - stop tracking a device's VT switching needs * @dev: device * * Remove @dev from the vt switch list. */ void pm_vt_switch_unregister(struct device *dev) { … } EXPORT_SYMBOL(…); /* * There are three cases when a VT switch on suspend/resume are required: * 1) no driver has indicated a requirement one way or another, so preserve * the old behavior * 2) console suspend is disabled, we want to see debug messages across * suspend/resume * 3) any registered driver indicates it needs a VT switch * * If none of these conditions is present, meaning we have at least one driver * that doesn't need the switch, and none that do, we can avoid it to make * resume look a little prettier (and suspend too, but that's usually hidden, * e.g. when closing the lid on a laptop). */ static bool pm_vt_switch(void) { … } void pm_prepare_console(void) { … } void pm_restore_console(void) { … }