| From foo@baz Sun May 27 17:33:37 CEST 2018 |
| From: Dmitry Torokhov <dmitry.torokhov@gmail.com> |
| Date: Tue, 9 Jan 2018 13:44:46 -0800 |
| Subject: Input: psmouse - fix Synaptics detection when protocol is disabled |
| |
| From: Dmitry Torokhov <dmitry.torokhov@gmail.com> |
| |
| [ Upstream commit 2bc4298f59d2f15175bb568e2d356b5912d0cdd9 ] |
| |
| When Synaptics protocol is disabled, we still need to try and detect the |
| hardware, so we can switch to SMBus device if SMbus is detected, or we know |
| that it is Synaptics device and reset it properly for the bare PS/2 |
| protocol. |
| |
| Fixes: c378b5119eb0 ("Input: psmouse - factor out common protocol probing code") |
| Reported-by: Matteo Croce <mcroce@redhat.com> |
| Tested-by: Matteo Croce <mcroce@redhat.com> |
| Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com> |
| Signed-off-by: Sasha Levin <alexander.levin@microsoft.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| --- |
| drivers/input/mouse/psmouse-base.c | 34 +++++++++++++++++++++------------- |
| 1 file changed, 21 insertions(+), 13 deletions(-) |
| |
| --- a/drivers/input/mouse/psmouse-base.c |
| +++ b/drivers/input/mouse/psmouse-base.c |
| @@ -937,6 +937,21 @@ static void psmouse_apply_defaults(struc |
| psmouse->pt_deactivate = NULL; |
| } |
| |
| +static bool psmouse_do_detect(int (*detect)(struct psmouse *, bool), |
| + struct psmouse *psmouse, bool allow_passthrough, |
| + bool set_properties) |
| +{ |
| + if (psmouse->ps2dev.serio->id.type == SERIO_PS_PSTHRU && |
| + !allow_passthrough) { |
| + return false; |
| + } |
| + |
| + if (set_properties) |
| + psmouse_apply_defaults(psmouse); |
| + |
| + return detect(psmouse, set_properties) == 0; |
| +} |
| + |
| static bool psmouse_try_protocol(struct psmouse *psmouse, |
| enum psmouse_type type, |
| unsigned int *max_proto, |
| @@ -948,15 +963,8 @@ static bool psmouse_try_protocol(struct |
| if (!proto) |
| return false; |
| |
| - if (psmouse->ps2dev.serio->id.type == SERIO_PS_PSTHRU && |
| - !proto->try_passthru) { |
| - return false; |
| - } |
| - |
| - if (set_properties) |
| - psmouse_apply_defaults(psmouse); |
| - |
| - if (proto->detect(psmouse, set_properties) != 0) |
| + if (!psmouse_do_detect(proto->detect, psmouse, proto->try_passthru, |
| + set_properties)) |
| return false; |
| |
| if (set_properties && proto->init && init_allowed) { |
| @@ -988,8 +996,8 @@ static int psmouse_extensions(struct psm |
| * Always check for focaltech, this is safe as it uses pnp-id |
| * matching. |
| */ |
| - if (psmouse_try_protocol(psmouse, PSMOUSE_FOCALTECH, |
| - &max_proto, set_properties, false)) { |
| + if (psmouse_do_detect(focaltech_detect, |
| + psmouse, false, set_properties)) { |
| if (max_proto > PSMOUSE_IMEX && |
| IS_ENABLED(CONFIG_MOUSE_PS2_FOCALTECH) && |
| (!set_properties || focaltech_init(psmouse) == 0)) { |
| @@ -1035,8 +1043,8 @@ static int psmouse_extensions(struct psm |
| * probing for IntelliMouse. |
| */ |
| if (max_proto > PSMOUSE_PS2 && |
| - psmouse_try_protocol(psmouse, PSMOUSE_SYNAPTICS, &max_proto, |
| - set_properties, false)) { |
| + psmouse_do_detect(synaptics_detect, |
| + psmouse, false, set_properties)) { |
| synaptics_hardware = true; |
| |
| if (max_proto > PSMOUSE_IMEX) { |