#define SERIO_QUIRK_KBDRESET           BIT(12)
 #define SERIO_QUIRK_DRITEK             BIT(13)
 #define SERIO_QUIRK_NOPNP              BIT(14)
+#define SERIO_QUIRK_FORCENORESTORE     BIT(15)
 
 /* Quirk table for different mainboards. Options similar or identical to i8042
  * module parameters.
        if (quirks & SERIO_QUIRK_NOPNP)
                i8042_nopnp = true;
 #endif
+       if (quirks & SERIO_QUIRK_FORCENORESTORE)
+               i8042_forcenorestore = true;
 }
 #else
 static inline void i8042_check_quirks(void) {}
 
        i8042_check_quirks();
 
-       pr_debug("Active quirks (empty means none):%s%s%s%s%s%s%s%s%s%s%s%s%s\n",
+       pr_debug("Active quirks (empty means none):%s%s%s%s%s%s%s%s%s%s%s%s%s%s\n",
                i8042_nokbd ? " nokbd" : "",
                i8042_noaux ? " noaux" : "",
                i8042_nomux ? " nomux" : "",
                "",
 #endif
 #ifdef CONFIG_PNP
-               i8042_nopnp ? " nopnp" : "");
+               i8042_nopnp ? " nopnp" : "",
 #else
-               "");
+               "",
 #endif
+               i8042_forcenorestore ? " forcenorestore" : "");
 
        retval = i8042_pnp_init();
        if (retval)
 
 MODULE_PARM_DESC(nopnp, "Do not use PNP to detect controller settings");
 #endif
 
+static bool i8042_forcenorestore;
+module_param_named(forcenorestore, i8042_forcenorestore, bool, 0);
+MODULE_PARM_DESC(forcenorestore, "Force no restore on s3 resume, copying s2idle behaviour");
+
 #define DEBUG
 #ifdef DEBUG
 static bool i8042_debug;
 {
        int i;
 
-       if (pm_suspend_via_firmware())
+       if (!i8042_forcenorestore && pm_suspend_via_firmware())
                i8042_controller_reset(true);
 
        /* Set up serio interrupts for system wakeup. */
 
 static int i8042_pm_resume_noirq(struct device *dev)
 {
-       if (!pm_resume_via_firmware())
+       if (i8042_forcenorestore || !pm_resume_via_firmware())
                i8042_interrupt(0, NULL);
 
        return 0;
         * not restore the controller state to whatever it had been at boot
         * time, so we do not need to do anything.
         */
-       if (!pm_suspend_via_firmware())
+       if (i8042_forcenorestore || !pm_suspend_via_firmware())
                return 0;
 
        /*