mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-01-14 17:14:09 +00:00
Input: psmouse - fix Synaptics detection when protocol is disabled
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>
This commit is contained in:
parent
faec44b683
commit
2bc4298f59
@ -975,6 +975,21 @@ static void psmouse_apply_defaults(struct psmouse *psmouse)
|
||||
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,
|
||||
@ -986,15 +1001,8 @@ static bool psmouse_try_protocol(struct psmouse *psmouse,
|
||||
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) {
|
||||
@ -1027,8 +1035,8 @@ static int psmouse_extensions(struct psmouse *psmouse,
|
||||
* 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)) {
|
||||
@ -1074,8 +1082,8 @@ static int psmouse_extensions(struct psmouse *psmouse,
|
||||
* 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) {
|
||||
|
Loading…
x
Reference in New Issue
Block a user