Input: psmouse - properly reset mouse on shutdown/suspend

Some people report that they need psmouse module unloaded
for suspend to ram/disk to work properly. Let's make port
cleanup behave the same way as driver unload.

This fixes "bad state" roblem on various HP laptops, such
as nx7400.

Signed-off-by: Dmitry Torokhov <dtor@mail.ru>
This commit is contained in:
Dmitry Torokhov 2007-02-18 01:40:24 -05:00
parent 8a03d9a498
commit a1cec06177
3 changed files with 30 additions and 0 deletions

View file

@ -987,8 +987,36 @@ static void psmouse_resync(struct work_struct *work)
static void psmouse_cleanup(struct serio *serio) static void psmouse_cleanup(struct serio *serio)
{ {
struct psmouse *psmouse = serio_get_drvdata(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); 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);
} }
/* /*

View file

@ -68,6 +68,7 @@ struct psmouse {
int (*reconnect)(struct psmouse *psmouse); int (*reconnect)(struct psmouse *psmouse);
void (*disconnect)(struct psmouse *psmouse); void (*disconnect)(struct psmouse *psmouse);
void (*cleanup)(struct psmouse *psmouse);
int (*poll)(struct psmouse *psmouse); int (*poll)(struct psmouse *psmouse);
void (*pt_activate)(struct psmouse *psmouse); void (*pt_activate)(struct psmouse *psmouse);

View file

@ -652,6 +652,7 @@ int synaptics_init(struct psmouse *psmouse)
psmouse->set_rate = synaptics_set_rate; psmouse->set_rate = synaptics_set_rate;
psmouse->disconnect = synaptics_disconnect; psmouse->disconnect = synaptics_disconnect;
psmouse->reconnect = synaptics_reconnect; psmouse->reconnect = synaptics_reconnect;
psmouse->cleanup = synaptics_reset;
psmouse->pktsize = 6; psmouse->pktsize = 6;
/* Synaptics can usually stay in sync without extra help */ /* Synaptics can usually stay in sync without extra help */
psmouse->resync_time = 0; psmouse->resync_time = 0;