mirror of
https://github.com/edk2-porting/linux-next.git
synced 2024-12-19 02:34:01 +08:00
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:
parent
8a03d9a498
commit
a1cec06177
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -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);
|
||||||
|
@ -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;
|
||||||
|
Loading…
Reference in New Issue
Block a user