unsigned char param;
        int i = 0;
 
-       if (!i8042_reset)
-               return 0;
-
        /*
         * We try this 5 times; on some really fragile systems this does not
         * take the first time...
  * Reset the controller if requested.
  */
 
-       i8042_controller_selftest();
+       if (i8042_reset)
+               i8042_controller_selftest();
 
 /*
  * Restore the original control register setting.
 
 #ifdef CONFIG_PM
 
-/*
- * Here we try to restore the original BIOS settings to avoid
- * upsetting it.
- */
-
-static int i8042_pm_reset(struct device *dev)
-{
-       i8042_controller_reset();
-
-       return 0;
-}
-
 /*
  * Here we try to reset everything back to a state we had
  * before suspending.
  */
 
-static int i8042_pm_restore(struct device *dev)
+static int i8042_controller_resume(bool force_reset)
 {
        int error;
 
        if (error)
                return error;
 
-       error = i8042_controller_selftest();
-       if (error)
-               return error;
+       if (i8042_reset || force_reset) {
+               error = i8042_controller_selftest();
+               if (error)
+                       return error;
+       }
 
 /*
  * Restore original CTR value and disable all ports
        return 0;
 }
 
+/*
+ * Here we try to restore the original BIOS settings to avoid
+ * upsetting it.
+ */
+
+static int i8042_pm_reset(struct device *dev)
+{
+       i8042_controller_reset();
+
+       return 0;
+}
+
+static int i8042_pm_resume(struct device *dev)
+{
+       /*
+        * On resume from S2R we always try to reset the controller
+        * to bring it in a sane state. (In case of S2D we expect
+        * BIOS to reset the controller for us.)
+        */
+       return i8042_controller_resume(true);
+}
+
 static int i8042_pm_thaw(struct device *dev)
 {
        i8042_interrupt(0, NULL);
        return 0;
 }
 
+static int i8042_pm_restore(struct device *dev)
+{
+       return i8042_controller_resume(false);
+}
+
 static const struct dev_pm_ops i8042_pm_ops = {
        .suspend        = i8042_pm_reset,
-       .resume         = i8042_pm_restore,
+       .resume         = i8042_pm_resume,
        .thaw           = i8042_pm_thaw,
        .poweroff       = i8042_pm_reset,
        .restore        = i8042_pm_restore,
 
        i8042_platform_device = dev;
 
-       error = i8042_controller_selftest();
-       if (error)
-               return error;
+       if (i8042_reset) {
+               error = i8042_controller_selftest();
+               if (error)
+                       return error;
+       }
 
        error = i8042_controller_init();
        if (error)