Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Input: psmouse - fix Synaptics detection when protocol is disabled

For configurations where Synaptics hardware is present but the Synaptics
extensions support is not compiled in, the mouse is reprobed and a new
device is allocated on every suspend/resume.

During probe, psmouse_switch_protocol() calls psmouse_extensions() with
set_properties=1. This calls the dummy synaptics_init() which returns an
error code, instructing us not to use the synaptics extensions.

During resume, psmouse_reconnect() calls psmouse_extensions() with
set_properties=0, in which case call to synaptics_init() is bypassed and
PSMOUSE_SYNAPTICS is returned. Since the result is different from previous
attempt psmouse_reconnect() fails and full re-probe happens.

Fix this by tweaking the set_properties=0 codepath in psmouse_extensions()
to be more careful about offering PSMOUSE_SYNAPTICS extensions.

Signed-off-by: Daniel Drake <dsd@laptop.org>
Signed-off-by: Dmitry Torokhov <dtor@mail.ru>

authored by

Daniel Drake and committed by
Dmitry Torokhov
e4e6efd2 6f2701b7

+19 -1
+8 -1
drivers/input/mouse/psmouse-base.c
··· 627 627 synaptics_hardware = true; 628 628 629 629 if (max_proto > PSMOUSE_IMEX) { 630 - if (!set_properties || synaptics_init(psmouse) == 0) 630 + /* 631 + * Try activating protocol, but check if support is enabled first, since 632 + * we try detecting Synaptics even when protocol is disabled. 633 + */ 634 + if (synaptics_supported() && 635 + (!set_properties || synaptics_init(psmouse) == 0)) { 631 636 return PSMOUSE_SYNAPTICS; 637 + } 638 + 632 639 /* 633 640 * Some Synaptics touchpads can emulate extended protocols (like IMPS/2). 634 641 * Unfortunately Logitech/Genius probes confuse some firmware versions so
+10
drivers/input/mouse/synaptics.c
··· 743 743 return -1; 744 744 } 745 745 746 + bool synaptics_supported(void) 747 + { 748 + return true; 749 + } 750 + 746 751 #else /* CONFIG_MOUSE_PS2_SYNAPTICS */ 747 752 748 753 void __init synaptics_module_init(void) ··· 757 752 int synaptics_init(struct psmouse *psmouse) 758 753 { 759 754 return -ENOSYS; 755 + } 756 + 757 + bool synaptics_supported(void) 758 + { 759 + return false; 760 760 } 761 761 762 762 #endif /* CONFIG_MOUSE_PS2_SYNAPTICS */
+1
drivers/input/mouse/synaptics.h
··· 109 109 int synaptics_detect(struct psmouse *psmouse, bool set_properties); 110 110 int synaptics_init(struct psmouse *psmouse); 111 111 void synaptics_reset(struct psmouse *psmouse); 112 + bool synaptics_supported(void); 112 113 113 114 #endif /* _SYNAPTICS_H */