Browse Source

PNP: Allow console to override ACPI device sleep

If the serial console is an ACPI PNP device, the PNP bus always powers
down the device at system suspend, even though the no_console_suspend
command line parameter is specified (eg., when debugging suspend/resume).

Add PNP_CONSOLE capability, which when set, prevents calling both the
->disable() and ->suspend() PNP protocol methods if console suspend
is disabled.

Signed-off-by: Peter Hurley <peter@hurleysoftware.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Peter Hurley 10 years ago
parent
commit
01395d7984
2 changed files with 11 additions and 3 deletions
  1. 1 1
      drivers/pnp/driver.c
  2. 10 2
      include/linux/pnp.h

+ 1 - 1
drivers/pnp/driver.c

@@ -182,7 +182,7 @@ static int __pnp_bus_suspend(struct device *dev, pm_message_t state)
 			return error;
 			return error;
 	}
 	}
 
 
-	if (pnp_dev->protocol->suspend)
+	if (pnp_can_suspend(pnp_dev))
 		pnp_dev->protocol->suspend(pnp_dev, state);
 		pnp_dev->protocol->suspend(pnp_dev, state);
 	return 0;
 	return 0;
 }
 }

+ 10 - 2
include/linux/pnp.h

@@ -12,6 +12,7 @@
 #include <linux/list.h>
 #include <linux/list.h>
 #include <linux/errno.h>
 #include <linux/errno.h>
 #include <linux/mod_devicetable.h>
 #include <linux/mod_devicetable.h>
+#include <linux/console.h>
 
 
 #define PNP_NAME_LEN		50
 #define PNP_NAME_LEN		50
 
 
@@ -309,15 +310,22 @@ struct pnp_fixup {
 #define PNP_DISABLE		0x0004
 #define PNP_DISABLE		0x0004
 #define PNP_CONFIGURABLE	0x0008
 #define PNP_CONFIGURABLE	0x0008
 #define PNP_REMOVABLE		0x0010
 #define PNP_REMOVABLE		0x0010
+#define PNP_CONSOLE		0x0020
 
 
 #define pnp_can_read(dev)	(((dev)->protocol->get) && \
 #define pnp_can_read(dev)	(((dev)->protocol->get) && \
 				 ((dev)->capabilities & PNP_READ))
 				 ((dev)->capabilities & PNP_READ))
 #define pnp_can_write(dev)	(((dev)->protocol->set) && \
 #define pnp_can_write(dev)	(((dev)->protocol->set) && \
 				 ((dev)->capabilities & PNP_WRITE))
 				 ((dev)->capabilities & PNP_WRITE))
-#define pnp_can_disable(dev)	(((dev)->protocol->disable) && \
-				 ((dev)->capabilities & PNP_DISABLE))
+#define pnp_can_disable(dev)	(((dev)->protocol->disable) &&		  \
+				 ((dev)->capabilities & PNP_DISABLE) &&	  \
+				 (!((dev)->capabilities & PNP_CONSOLE) || \
+				  console_suspend_enabled))
 #define pnp_can_configure(dev)	((!(dev)->active) && \
 #define pnp_can_configure(dev)	((!(dev)->active) && \
 				 ((dev)->capabilities & PNP_CONFIGURABLE))
 				 ((dev)->capabilities & PNP_CONFIGURABLE))
+#define pnp_can_suspend(dev)	(((dev)->protocol->suspend) &&		  \
+				 (!((dev)->capabilities & PNP_CONSOLE) || \
+				  console_suspend_enabled))
+
 
 
 #ifdef CONFIG_ISAPNP
 #ifdef CONFIG_ISAPNP
 extern struct pnp_protocol isapnp_protocol;
 extern struct pnp_protocol isapnp_protocol;