The branch main has been updated by wulf:

URL: 
https://cgit.FreeBSD.org/src/commit/?id=f5998d20ed80fdc1cb3ba0c245cae5f179e22fe2

commit f5998d20ed80fdc1cb3ba0c245cae5f179e22fe2
Author:     Vladimir Kondratyev <w...@freebsd.org>
AuthorDate: 2021-07-14 10:30:26 +0000
Commit:     Vladimir Kondratyev <w...@freebsd.org>
CommitDate: 2021-07-14 10:30:26 +0000

    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
---
 sys/dev/atkbdc/psm.c | 42 ++++++++++++++++++++++++++++--------------
 1 file changed, 28 insertions(+), 14 deletions(-)

diff --git a/sys/dev/atkbdc/psm.c b/sys/dev/atkbdc/psm.c
index 43d19b5174d3..f6276ae847aa 100644
--- a/sys/dev/atkbdc/psm.c
+++ b/sys/dev/atkbdc/psm.c
@@ -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
_______________________________________________
dev-commits-src-main@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/dev-commits-src-main
To unsubscribe, send any mail to "dev-commits-src-main-unsubscr...@freebsd.org"

Reply via email to