|
@@ -861,9 +861,6 @@ static int i8042_controller_selftest(void)
|
|
unsigned char param;
|
|
unsigned char param;
|
|
int i = 0;
|
|
int i = 0;
|
|
|
|
|
|
- if (!i8042_reset)
|
|
|
|
- return 0;
|
|
|
|
-
|
|
|
|
/*
|
|
/*
|
|
* We try this 5 times; on some really fragile systems this does not
|
|
* We try this 5 times; on some really fragile systems this does not
|
|
* take the first time...
|
|
* take the first time...
|
|
@@ -1020,7 +1017,8 @@ static void i8042_controller_reset(void)
|
|
* Reset the controller if requested.
|
|
* Reset the controller if requested.
|
|
*/
|
|
*/
|
|
|
|
|
|
- i8042_controller_selftest();
|
|
|
|
|
|
+ if (i8042_reset)
|
|
|
|
+ i8042_controller_selftest();
|
|
|
|
|
|
/*
|
|
/*
|
|
* Restore the original control register setting.
|
|
* Restore the original control register setting.
|
|
@@ -1093,24 +1091,12 @@ static void i8042_dritek_enable(void)
|
|
|
|
|
|
#ifdef CONFIG_PM
|
|
#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
|
|
* Here we try to reset everything back to a state we had
|
|
* before suspending.
|
|
* before suspending.
|
|
*/
|
|
*/
|
|
|
|
|
|
-static int i8042_pm_restore(struct device *dev)
|
|
|
|
|
|
+static int i8042_controller_resume(bool force_reset)
|
|
{
|
|
{
|
|
int error;
|
|
int error;
|
|
|
|
|
|
@@ -1118,9 +1104,11 @@ static int i8042_pm_restore(struct device *dev)
|
|
if (error)
|
|
if (error)
|
|
return 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
|
|
* Restore original CTR value and disable all ports
|
|
@@ -1162,6 +1150,28 @@ static int i8042_pm_restore(struct device *dev)
|
|
return 0;
|
|
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)
|
|
static int i8042_pm_thaw(struct device *dev)
|
|
{
|
|
{
|
|
i8042_interrupt(0, NULL);
|
|
i8042_interrupt(0, NULL);
|
|
@@ -1169,9 +1179,14 @@ static int i8042_pm_thaw(struct device *dev)
|
|
return 0;
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+static int i8042_pm_restore(struct device *dev)
|
|
|
|
+{
|
|
|
|
+ return i8042_controller_resume(false);
|
|
|
|
+}
|
|
|
|
+
|
|
static const struct dev_pm_ops i8042_pm_ops = {
|
|
static const struct dev_pm_ops i8042_pm_ops = {
|
|
.suspend = i8042_pm_reset,
|
|
.suspend = i8042_pm_reset,
|
|
- .resume = i8042_pm_restore,
|
|
|
|
|
|
+ .resume = i8042_pm_resume,
|
|
.thaw = i8042_pm_thaw,
|
|
.thaw = i8042_pm_thaw,
|
|
.poweroff = i8042_pm_reset,
|
|
.poweroff = i8042_pm_reset,
|
|
.restore = i8042_pm_restore,
|
|
.restore = i8042_pm_restore,
|
|
@@ -1389,9 +1404,11 @@ static int __init i8042_probe(struct platform_device *dev)
|
|
|
|
|
|
i8042_platform_device = dev;
|
|
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();
|
|
error = i8042_controller_init();
|
|
if (error)
|
|
if (error)
|