diff options
author | Dmitry Torokhov <dtor@insightbb.com> | 2007-02-18 01:40:24 -0500 |
---|---|---|
committer | Dmitry Torokhov <dtor@insightbb.com> | 2007-02-18 01:40:24 -0500 |
commit | a1cec06177386ecc320af643de11cfa77e8945bd (patch) | |
tree | 1c335b711acb5c2f9186da2d08da8b7a7810f755 /drivers/input/mouse/psmouse-base.c | |
parent | 8a03d9a498eaf02c8a118752050a5154852c13bf (diff) | |
download | kernel-crypto-a1cec06177386ecc320af643de11cfa77e8945bd.tar.gz kernel-crypto-a1cec06177386ecc320af643de11cfa77e8945bd.tar.xz kernel-crypto-a1cec06177386ecc320af643de11cfa77e8945bd.zip |
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>
Diffstat (limited to 'drivers/input/mouse/psmouse-base.c')
-rw-r--r-- | drivers/input/mouse/psmouse-base.c | 28 |
1 files changed, 28 insertions, 0 deletions
diff --git a/drivers/input/mouse/psmouse-base.c b/drivers/input/mouse/psmouse-base.c index a0e4a033e2d..9a6e4b6bdbf 100644 --- a/drivers/input/mouse/psmouse-base.c +++ b/drivers/input/mouse/psmouse-base.c @@ -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); } /* |