psm(4): Probe Synaptics touchpad with active multiplexing mode enabled
if it is only multiplexed device. Also enable syncbit checks for them. This fixes touchpad recognition on Panasonic Toughbook CF-MX4 laptop. Reported by: Tomasz "CeDeROM" CEDRO <tomek_AT_cedro_DOT_info> MFC after: 1 month PR: 253279 Differential revision: https://reviews.freebsd.org/D28502
This commit is contained in:
+28
-14
@@ -466,6 +466,7 @@ struct psm_softc { /* Driver status information */
|
||||
int muxtpbuttons; /* Touchpad button state */
|
||||
int muxmsbuttons; /* Mouse (trackpoint) button state */
|
||||
struct timeval muxmidtimeout; /* middle button supression timeout */
|
||||
int muxsinglesyna; /* Probe result of single Synaptics */
|
||||
#ifdef EVDEV_SUPPORT
|
||||
struct evdev_dev *evdev_a; /* Absolute reporting device */
|
||||
struct evdev_dev *evdev_r; /* Relative reporting device */
|
||||
@@ -666,6 +667,7 @@ static probefunc_t enable_4dplus;
|
||||
static probefunc_t enable_mmanplus;
|
||||
static probefunc_t enable_synaptics;
|
||||
static probefunc_t enable_synaptics_mux;
|
||||
static probefunc_t enable_single_synaptics_mux;
|
||||
static probefunc_t enable_trackpoint;
|
||||
static probefunc_t enable_versapad;
|
||||
static probefunc_t enable_elantech;
|
||||
@@ -686,8 +688,10 @@ static struct {
|
||||
* WARNING: the order of probe is very important. Don't mess it
|
||||
* unless you know what you are doing.
|
||||
*/
|
||||
{ MOUSE_MODEL_SYNAPTICS, /* Synaptics Touchpad on Active Mux */
|
||||
{ MOUSE_MODEL_SYNAPTICS, /* Synaptics + mouse on Active Mux */
|
||||
0x00, MOUSE_PS2_PACKETSIZE, enable_synaptics_mux },
|
||||
{ MOUSE_MODEL_SYNAPTICS, /* Single Synaptics on Active Mux */
|
||||
0xc0, MOUSE_SYNAPTICS_PACKETSIZE, enable_single_synaptics_mux },
|
||||
{ MOUSE_MODEL_NET, /* Genius NetMouse */
|
||||
0x08, MOUSE_PS2INTELLI_PACKETSIZE, enable_gmouse },
|
||||
{ MOUSE_MODEL_NETSCROLL, /* Genius NetScroll */
|
||||
@@ -6292,6 +6296,8 @@ enable_synaptics_mux(struct psm_softc *sc, enum probearg arg)
|
||||
int active_ports_count = 0;
|
||||
int active_ports_mask = 0;
|
||||
|
||||
sc->muxsinglesyna = FALSE;
|
||||
|
||||
if (mux_disabled == 1 || (mux_disabled == -1 &&
|
||||
(kbdc->quirks & KBDC_QUIRK_DISABLE_MUX_PROBE) != 0))
|
||||
return (FALSE);
|
||||
@@ -6315,18 +6321,16 @@ enable_synaptics_mux(struct psm_softc *sc, enum probearg arg)
|
||||
active_ports_count);
|
||||
|
||||
/* psm has a special support for GenMouse + SynTouchpad combination */
|
||||
if (active_ports_count >= 2) {
|
||||
for (port = 0; port < KBDC_AUX_MUX_NUM_PORTS; port++) {
|
||||
if ((active_ports_mask & 1 << port) == 0)
|
||||
continue;
|
||||
VLOG(3, (LOG_DEBUG, "aux_mux: probe port %d\n", port));
|
||||
set_active_aux_mux_port(kbdc, port);
|
||||
probe = enable_synaptics(sc, arg);
|
||||
if (probe) {
|
||||
if (arg == PROBE)
|
||||
sc->muxport = port;
|
||||
break;
|
||||
}
|
||||
for (port = 0; port < KBDC_AUX_MUX_NUM_PORTS; port++) {
|
||||
if ((active_ports_mask & 1 << port) == 0)
|
||||
continue;
|
||||
VLOG(3, (LOG_DEBUG, "aux_mux: probe port %d\n", port));
|
||||
set_active_aux_mux_port(kbdc, port);
|
||||
probe = enable_synaptics(sc, arg);
|
||||
if (probe) {
|
||||
if (arg == PROBE)
|
||||
sc->muxport = port;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -6348,7 +6352,17 @@ enable_synaptics_mux(struct psm_softc *sc, enum probearg arg)
|
||||
}
|
||||
empty_both_buffers(kbdc, 10); /* remove stray data if any */
|
||||
|
||||
return (probe);
|
||||
/* Don't disable syncbit checks if Synaptics is only device on MUX */
|
||||
if (active_ports_count == 1)
|
||||
sc->muxsinglesyna = probe;
|
||||
return (active_ports_count != 1 ? probe : FALSE);
|
||||
}
|
||||
|
||||
static int
|
||||
enable_single_synaptics_mux(struct psm_softc *sc, enum probearg arg)
|
||||
{
|
||||
/* Synaptics device is already initialized in enable_synaptics_mux */
|
||||
return (sc->muxsinglesyna);
|
||||
}
|
||||
|
||||
static int
|
||||
|
||||
Reference in New Issue
Block a user