|
@@ -987,8 +987,36 @@ static void psmouse_resync(struct work_struct *work)
|
|
|
static void psmouse_cleanup(struct serio *serio)
|
|
|
{
|
|
|
struct psmouse *psmouse = serio_get_drvdata(serio);
|
|
|
+ struct psmouse *parent = NULL;
|
|
|
+
|
|
|
+ mutex_lock(&psmouse_mutex);
|
|
|
+
|
|
|
+ if (serio->parent && serio->id.type == SERIO_PS_PSTHRU) {
|
|
|
+ parent = serio_get_drvdata(serio->parent);
|
|
|
+ psmouse_deactivate(parent);
|
|
|
+ }
|
|
|
+
|
|
|
+ psmouse_deactivate(psmouse);
|
|
|
+
|
|
|
+ if (psmouse->cleanup)
|
|
|
+ psmouse->cleanup(psmouse);
|
|
|
|
|
|
psmouse_reset(psmouse);
|
|
|
+
|
|
|
+/*
|
|
|
+ * Some boxes, such as HP nx7400, get terribly confused if mouse
|
|
|
+ * is not fully enabled before suspending/shutting down.
|
|
|
+ */
|
|
|
+ ps2_command(&psmouse->ps2dev, NULL, PSMOUSE_CMD_ENABLE);
|
|
|
+
|
|
|
+ if (parent) {
|
|
|
+ if (parent->pt_deactivate)
|
|
|
+ parent->pt_deactivate(parent);
|
|
|
+
|
|
|
+ psmouse_activate(parent);
|
|
|
+ }
|
|
|
+
|
|
|
+ mutex_unlock(&psmouse_mutex);
|
|
|
}
|
|
|
|
|
|
/*
|