From owner-svn-src-head@FreeBSD.ORG Tue Mar 27 23:43:02 2012 Return-Path: Delivered-To: svn-src-head@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 1FFCD106564A; Tue, 27 Mar 2012 23:43:02 +0000 (UTC) (envelope-from jkim@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 0974D8FC15; Tue, 27 Mar 2012 23:43:02 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.4/8.14.4) with ESMTP id q2RNh144008591; Tue, 27 Mar 2012 23:43:01 GMT (envelope-from jkim@svn.freebsd.org) Received: (from jkim@localhost) by svn.freebsd.org (8.14.4/8.14.4/Submit) id q2RNh17d008588; Tue, 27 Mar 2012 23:43:01 GMT (envelope-from jkim@svn.freebsd.org) Message-Id: <201203272343.q2RNh17d008588@svn.freebsd.org> From: Jung-uk Kim Date: Tue, 27 Mar 2012 23:43:01 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org X-SVN-Group: head MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r233580 - in head: share/man/man4 sys/dev/atkbdc X-BeenThere: svn-src-head@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: SVN commit messages for the src tree for head/-current List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 27 Mar 2012 23:43:02 -0000 Author: jkim Date: Tue Mar 27 23:43:01 2012 New Revision: 233580 URL: http://svn.freebsd.org/changeset/base/233580 Log: - Do not clobber softc when psm(4) is reintialized. - Make INITAFTERSUSPEND flag independent of HOOKRESUME flag. - Automatically set INITAFTERSUSPEND flag when ALPS GlidePoint is detected. - Always probe Synaptics Touchpad. Allow MOUSE_SYN_GETHWINFO ioctl and automatically set INITAFTERSUSPEND flag when a supported device is detected, regardless of "hw.psm.synaptics_support" tunable setting. - Update psm(4) to reflect the above changes. - Remove long-time defunct SYNCHACK flag while I am in the neighborhood. MFC after: 1 month Modified: head/share/man/man4/psm.4 head/sys/dev/atkbdc/psm.c Modified: head/share/man/man4/psm.4 ============================================================================== --- head/share/man/man4/psm.4 Tue Mar 27 23:26:58 2012 (r233579) +++ head/share/man/man4/psm.4 Tue Mar 27 23:43:01 2012 (r233580) @@ -26,7 +26,7 @@ .\" .\" $FreeBSD$ .\" -.Dd April 8, 2008 +.Dd March 27, 2012 .Dt PSM 4 .Os .Sh NAME @@ -329,9 +329,6 @@ It will cause the .Nm driver to reset and re-initialize the pointing device after the `resume' event. -It has no effect unless the -.Em HOOKRESUME -flag is set as well. .El .Sh LOADER TUNABLES Extended support for Synaptics touchpads can be enabled by setting @@ -445,10 +442,8 @@ Microsoft IntelliMouse .El .Pp .It Dv MOUSE_SYN_GETHWINFO Ar synapticshw_t *synhw -Retrieves extra information associated with Synaptics Touchpads. -Only available when -.Va hw.psm.synaptics_support -has been enabled. +Retrieves extra information associated with Synaptics Touchpad. +Only available when a supported device has been detected. .Bd -literal typedef struct synapticshw { int infoMajor; /* major hardware revision */ @@ -837,12 +832,11 @@ In contrast, some pad products, e.g.\& s and Interlink VersaPad, treat the tapping action as fourth button events. .Pp -It is reported that Interlink VersaPad requires both -.Em HOOKRESUME -and +It is reported that ALPS GlidePoint, Synaptics Touchpad, and +Interlink VersaPad require .Em INITAFTERSUSPEND -flags in order to recover from suspended state. -These flags are automatically set when VersaPad is detected by the +flag in order to recover from suspended state. +This flag is automatically set when one of these devices is detected by the .Nm driver. .Pp Modified: head/sys/dev/atkbdc/psm.c ============================================================================== --- head/sys/dev/atkbdc/psm.c Tue Mar 27 23:26:58 2012 (r233579) +++ head/sys/dev/atkbdc/psm.c Tue Mar 27 23:43:01 2012 (r233580) @@ -318,13 +318,11 @@ static devclass_t psm_devclass; #define PSM_CONFIG_IGNPORTERROR 0x1000 /* ignore error in aux port test */ #define PSM_CONFIG_HOOKRESUME 0x2000 /* hook the system resume event */ #define PSM_CONFIG_INITAFTERSUSPEND 0x4000 /* init the device at the resume event */ -#define PSM_CONFIG_SYNCHACK 0x8000 /* enable `out-of-sync' hack */ #define PSM_CONFIG_FLAGS \ (PSM_CONFIG_RESOLUTION | \ PSM_CONFIG_ACCEL | \ PSM_CONFIG_NOCHECKSYNC | \ - PSM_CONFIG_SYNCHACK | \ PSM_CONFIG_NOIDPROBE | \ PSM_CONFIG_NORESET | \ PSM_CONFIG_FORCETAP | \ @@ -415,7 +413,7 @@ static int tame_mouse(struct psm_softc * u_char *); /* vendor specific features */ -typedef int probefunc_t(struct psm_softc *); +typedef int probefunc_t(KBDC, struct psm_softc *); static int mouse_id_proc1(KBDC, int, int, int *); static int mouse_ext_command(KBDC, int); @@ -822,24 +820,10 @@ doinitialize(struct psm_softc *sc, mouse } empty_both_buffers(kbdc, 10); /* remove stray data if any */ - if (sc->config & PSM_CONFIG_NOIDPROBE) - i = GENERIC_MOUSE_ENTRY; - else { - /* FIXME: hardware ID, mouse buttons? */ - - /* other parameters */ - for (i = 0; vendortype[i].probefunc != NULL; ++i) - if ((*vendortype[i].probefunc)(sc)) { - if (verbose >= 2) - log(LOG_ERR, "psm%d: found %s\n", - sc->unit, - model_name(vendortype[i].model)); - break; - } - } - - sc->hw.model = vendortype[i].model; - sc->mode.packetsize = vendortype[i].packetsize; + /* Re-enable the mouse. */ + for (i = 0; vendortype[i].probefunc != NULL; ++i) + if (vendortype[i].model == sc->hw.model) + (*vendortype[i].probefunc)(sc->kbdc, NULL); /* set mouse parameters */ if (mode != (mousemode_t *)NULL) { @@ -1149,7 +1133,7 @@ psmprobe(device_t dev) #if defined(PSM_HOOKRESUME) || defined(PSM_HOOKAPM) sc->config |= #ifdef PSM_RESETAFTERSUSPEND - PSM_CONFIG_HOOKRESUME | PSM_CONFIG_INITAFTERSUSPEND; + PSM_CONFIG_INITAFTERSUSPEND; #else PSM_CONFIG_HOOKRESUME; #endif @@ -1338,7 +1322,7 @@ psmprobe(device_t dev) /* other parameters */ for (i = 0; vendortype[i].probefunc != NULL; ++i) - if ((*vendortype[i].probefunc)(sc)) { + if ((*vendortype[i].probefunc)(sc->kbdc, sc)) { if (verbose >= 2) printf("psm%d: found %s\n", unit, model_name(vendortype[i].model)); @@ -1454,6 +1438,19 @@ psmattach(device_t dev) sc->bdev = make_dev(&psm_cdevsw, 0, 0, 0, 0666, "bpsm%d", unit); sc->bdev->si_drv1 = sc; + /* Some touchpad devices need full reinitialization after suspend. */ + switch (sc->hw.model) { + case MOUSE_MODEL_SYNAPTICS: + case MOUSE_MODEL_GLIDEPOINT: + case MOUSE_MODEL_VERSAPAD: + sc->config |= PSM_CONFIG_INITAFTERSUSPEND; + break; + default: + if (sc->synhw.infoMajor >= 4) + sc->config |= PSM_CONFIG_INITAFTERSUSPEND; + break; + } + if (!verbose) printf("psm%d: model %s, device ID %d\n", unit, model_name(sc->hw.model), sc->hw.hwid & 0x00ff); @@ -1952,7 +1949,7 @@ psmioctl(struct cdev *dev, u_long cmd, c case MOUSE_SYN_GETHWINFO: s = spltty(); - if (synaptics_support && sc->hw.model == MOUSE_MODEL_SYNAPTICS) + if (sc->synhw.infoMajor >= 4) *(synapticshw_t *)addr = sc->synhw; else error = EINVAL; @@ -3566,12 +3563,12 @@ mouse_ext_command(KBDC kbdc, int command #ifdef notyet /* Logitech MouseMan Cordless II */ static int -enable_lcordless(struct psm_softc *sc) +enable_lcordless(KDBC kbdc, struct psm_softc *sc) { int status[3]; int ch; - if (!mouse_id_proc1(sc->kbdc, PSMD_RES_HIGH, 2, status)) + if (!mouse_id_proc1(kbdc, PSMD_RES_HIGH, 2, status)) return (FALSE); if (status[1] == PSMD_RES_HIGH) return (FALSE); @@ -3588,7 +3585,7 @@ enable_lcordless(struct psm_softc *sc) /* Genius NetScroll Mouse, MouseSystems SmartScroll Mouse */ static int -enable_groller(struct psm_softc *sc) +enable_groller(KBDC kbdc, struct psm_softc *sc) { int status[3]; @@ -3613,18 +3610,19 @@ enable_groller(struct psm_softc *sc) * byte 3 report rate (?) */ - if (!mouse_id_proc1(sc->kbdc, PSMD_RES_HIGH, 1, status)) + if (!mouse_id_proc1(kbdc, PSMD_RES_HIGH, 1, status)) return (FALSE); if ((status[1] != '3') || (status[2] != 'D')) return (FALSE); /* FIXME: SmartScroll Mouse has 5 buttons! XXX */ - sc->hw.buttons = 4; + if (sc != NULL) + sc->hw.buttons = 4; return (TRUE); } /* Genius NetMouse/NetMouse Pro, ASCII Mie Mouse, NetScroll Optical */ static int -enable_gmouse(struct psm_softc *sc) +enable_gmouse(KBDC kbdc, struct psm_softc *sc) { int status[3]; @@ -3638,7 +3636,7 @@ enable_gmouse(struct psm_softc *sc) * say they have three buttons too and they do have a button on the * side... */ - if (!mouse_id_proc1(sc->kbdc, PSMD_RES_HIGH, 1, status)) + if (!mouse_id_proc1(kbdc, PSMD_RES_HIGH, 1, status)) return (FALSE); if ((status[1] != '3') || (status[2] != 'U')) return (FALSE); @@ -3647,7 +3645,7 @@ enable_gmouse(struct psm_softc *sc) /* ALPS GlidePoint */ static int -enable_aglide(struct psm_softc *sc) +enable_aglide(KBDC kbdc, struct psm_softc *sc) { int status[3]; @@ -3658,9 +3656,9 @@ enable_aglide(struct psm_softc *sc) * NOTE: ALPS produces several models of GlidePoint. Some of those * do not respond to this sequence, thus, cannot be detected this way. */ - if (set_mouse_sampling_rate(sc->kbdc, 100) != 100) + if (set_mouse_sampling_rate(kbdc, 100) != 100) return (FALSE); - if (!mouse_id_proc1(sc->kbdc, PSMD_RES_LOW, 2, status)) + if (!mouse_id_proc1(kbdc, PSMD_RES_LOW, 2, status)) return (FALSE); if ((status[1] == PSMD_RES_LOW) || (status[2] == 100)) return (FALSE); @@ -3669,10 +3667,9 @@ enable_aglide(struct psm_softc *sc) /* Kensington ThinkingMouse/Trackball */ static int -enable_kmouse(struct psm_softc *sc) +enable_kmouse(KBDC kbdc, struct psm_softc *sc) { static u_char rate[] = { 20, 60, 40, 20, 20, 60, 40, 20, 20 }; - KBDC kbdc = sc->kbdc; int status[3]; int id1; int id2; @@ -3723,9 +3720,8 @@ enable_kmouse(struct psm_softc *sc) /* Logitech MouseMan+/FirstMouse+, IBM ScrollPoint Mouse */ static int -enable_mmanplus(struct psm_softc *sc) +enable_mmanplus(KBDC kbdc, struct psm_softc *sc) { - KBDC kbdc = sc->kbdc; int data[3]; /* the special sequence to enable the fourth button and the roller. */ @@ -3766,8 +3762,10 @@ enable_mmanplus(struct psm_softc *sc) if (MOUSE_PS2PLUS_PACKET_TYPE(data) != 0) return (FALSE); - sc->hw.hwid &= 0x00ff; - sc->hw.hwid |= data[2] << 8; /* save model ID */ + if (sc != NULL) { + sc->hw.hwid &= 0x00ff; + sc->hw.hwid |= data[2] << 8; /* save model ID */ + } /* * MouseMan+ (or FirstMouse+) is now in its native mode, in which @@ -3780,11 +3778,10 @@ enable_mmanplus(struct psm_softc *sc) /* MS IntelliMouse Explorer */ static int -enable_msexplorer(struct psm_softc *sc) +enable_msexplorer(KBDC kbdc, struct psm_softc *sc) { static u_char rate0[] = { 200, 100, 80, }; static u_char rate1[] = { 200, 200, 80, }; - KBDC kbdc = sc->kbdc; int id; int i; @@ -3793,7 +3790,7 @@ enable_msexplorer(struct psm_softc *sc) * straight to Explorer mode, but need to be set to Intelli mode * first. */ - enable_msintelli(sc); + enable_msintelli(kbdc, sc); /* the special sequence to enable the extra buttons and the roller. */ for (i = 0; i < sizeof(rate1)/sizeof(rate1[0]); ++i) @@ -3804,8 +3801,10 @@ enable_msexplorer(struct psm_softc *sc) if (id != PSM_EXPLORER_ID) return (FALSE); - sc->hw.hwid = id; - sc->hw.buttons = 5; /* IntelliMouse Explorer XXX */ + if (sc != NULL) { + sc->hw.buttons = 5; /* IntelliMouse Explorer XXX */ + sc->hw.hwid = id; + } /* * XXX: this is a kludge to fool some KVM switch products @@ -3820,14 +3819,14 @@ enable_msexplorer(struct psm_softc *sc) for (i = 0; i < sizeof(rate0)/sizeof(rate0[0]); ++i) if (set_mouse_sampling_rate(kbdc, rate0[i]) != rate0[i]) break; - id = get_aux_id(kbdc); + get_aux_id(kbdc); return (TRUE); } /* MS IntelliMouse */ static int -enable_msintelli(struct psm_softc *sc) +enable_msintelli(KBDC kbdc, struct psm_softc *sc) { /* * Logitech MouseMan+ and FirstMouse+ will also respond to this @@ -3835,7 +3834,6 @@ enable_msintelli(struct psm_softc *sc) */ static u_char rate[] = { 200, 100, 80, }; - KBDC kbdc = sc->kbdc; int id; int i; @@ -3848,22 +3846,23 @@ enable_msintelli(struct psm_softc *sc) if (id != PSM_INTELLI_ID) return (FALSE); - sc->hw.hwid = id; - sc->hw.buttons = 3; + if (sc != NULL) { + sc->hw.buttons = 3; + sc->hw.hwid = id; + } return (TRUE); } /* A4 Tech 4D Mouse */ static int -enable_4dmouse(struct psm_softc *sc) +enable_4dmouse(KBDC kbdc, struct psm_softc *sc) { /* * Newer wheel mice from A4 Tech may use the 4D+ protocol. */ static u_char rate[] = { 200, 100, 80, 60, 40, 20 }; - KBDC kbdc = sc->kbdc; int id; int i; @@ -3879,21 +3878,22 @@ enable_4dmouse(struct psm_softc *sc) if (id != PSM_4DMOUSE_ID) return (FALSE); - sc->hw.hwid = id; - sc->hw.buttons = 3; /* XXX some 4D mice have 4? */ + if (sc != NULL) { + sc->hw.buttons = 3; /* XXX some 4D mice have 4? */ + sc->hw.hwid = id; + } return (TRUE); } /* A4 Tech 4D+ Mouse */ static int -enable_4dplus(struct psm_softc *sc) +enable_4dplus(KBDC kbdc, struct psm_softc *sc) { /* * Newer wheel mice from A4 Tech seem to use this protocol. * Older models are recognized as either 4D Mouse or IntelliMouse. */ - KBDC kbdc = sc->kbdc; int id; /* @@ -3909,16 +3909,17 @@ enable_4dplus(struct psm_softc *sc) id = get_aux_id(kbdc); switch (id) { case PSM_4DPLUS_ID: - sc->hw.buttons = 4; break; case PSM_4DPLUS_RFSW35_ID: - sc->hw.buttons = 3; break; default: return (FALSE); } - sc->hw.hwid = id; + if (sc != NULL) { + sc->hw.buttons = (id == PSM_4DPLUS_ID) ? 4 : 3; + sc->hw.hwid = id; + } return (TRUE); } @@ -4307,18 +4308,13 @@ synaptics_sysctl_create_tree(struct psm_ } static int -enable_synaptics(struct psm_softc *sc) +enable_synaptics(KBDC kbdc, struct psm_softc *sc) { + synapticshw_t synhw; int status[3]; - KBDC kbdc; + int buttons; - if (!synaptics_support) - return (FALSE); - - kbdc = sc->kbdc; VLOG(3, (LOG_DEBUG, "synaptics: BEGIN init\n")); - sc->hw.buttons = 3; - sc->squelch = 0; /* * Just to be on the safe side: this avoids troubles with @@ -4336,14 +4332,15 @@ enable_synaptics(struct psm_softc *sc) if (status[1] != 0x47) return (FALSE); - sc->synhw.infoMinor = status[0]; - sc->synhw.infoMajor = status[2] & 0x0f; + bzero(&synhw, sizeof(synhw)); + synhw.infoMinor = status[0]; + synhw.infoMajor = status[2] & 0x0f; if (verbose >= 2) - printf("Synaptics Touchpad v%d.%d\n", sc->synhw.infoMajor, - sc->synhw.infoMinor); + printf("Synaptics Touchpad v%d.%d\n", synhw.infoMajor, + synhw.infoMinor); - if (sc->synhw.infoMajor < 4) { + if (synhw.infoMajor < 4) { printf(" Unsupported (pre-v4) Touchpad detected\n"); return (FALSE); } @@ -4358,25 +4355,25 @@ enable_synaptics(struct psm_softc *sc) return (FALSE); } - sc->synhw.infoRot180 = (status[0] & 0x80) >> 7; - sc->synhw.infoPortrait = (status[0] & 0x40) >> 6; - sc->synhw.infoSensor = status[0] & 0x3f; - sc->synhw.infoHardware = (status[1] & 0xfe) >> 1; - sc->synhw.infoNewAbs = (status[2] & 0x80) >> 7; - sc->synhw.capPen = (status[2] & 0x40) >> 6; - sc->synhw.infoSimplC = (status[2] & 0x20) >> 5; - sc->synhw.infoGeometry = status[2] & 0x0f; + synhw.infoRot180 = (status[0] & 0x80) != 0; + synhw.infoPortrait = (status[0] & 0x40) != 0; + synhw.infoSensor = status[0] & 0x3f; + synhw.infoHardware = (status[1] & 0xfe) >> 1; + synhw.infoNewAbs = (status[2] & 0x80) != 0; + synhw.capPen = (status[2] & 0x40) != 0; + synhw.infoSimplC = (status[2] & 0x20) != 0; + synhw.infoGeometry = status[2] & 0x0f; if (verbose >= 2) { printf(" Model information:\n"); - printf(" infoRot180: %d\n", sc->synhw.infoRot180); - printf(" infoPortrait: %d\n", sc->synhw.infoPortrait); - printf(" infoSensor: %d\n", sc->synhw.infoSensor); - printf(" infoHardware: %d\n", sc->synhw.infoHardware); - printf(" infoNewAbs: %d\n", sc->synhw.infoNewAbs); - printf(" capPen: %d\n", sc->synhw.capPen); - printf(" infoSimplC: %d\n", sc->synhw.infoSimplC); - printf(" infoGeometry: %d\n", sc->synhw.infoGeometry); + printf(" infoRot180: %d\n", synhw.infoRot180); + printf(" infoPortrait: %d\n", synhw.infoPortrait); + printf(" infoSensor: %d\n", synhw.infoSensor); + printf(" infoHardware: %d\n", synhw.infoHardware); + printf(" infoNewAbs: %d\n", synhw.infoNewAbs); + printf(" capPen: %d\n", synhw.capPen); + printf(" infoSimplC: %d\n", synhw.infoSimplC); + printf(" infoGeometry: %d\n", synhw.infoGeometry); } /* Read the extended capability bits. */ @@ -4390,46 +4387,42 @@ enable_synaptics(struct psm_softc *sc) } /* Set the different capabilities when they exist. */ - if ((status[0] & 0x80) >> 7) { - sc->synhw.capExtended = (status[0] & 0x80) >> 7; - sc->synhw.capPassthrough = (status[2] & 0x80) >> 7; - sc->synhw.capSleep = (status[2] & 0x10) >> 4; - sc->synhw.capFourButtons = (status[2] & 0x08) >> 3; - sc->synhw.capMultiFinger = (status[2] & 0x02) >> 1; - sc->synhw.capPalmDetect = (status[2] & 0x01); + buttons = 0; + synhw.capExtended = (status[0] & 0x80) != 0; + if (synhw.capExtended) { + synhw.capPassthrough = (status[2] & 0x80) != 0; + synhw.capSleep = (status[2] & 0x10) != 0; + synhw.capFourButtons = (status[2] & 0x08) != 0; + synhw.capMultiFinger = (status[2] & 0x02) != 0; + synhw.capPalmDetect = (status[2] & 0x01) != 0; if (verbose >= 2) { printf(" Extended capabilities:\n"); - printf(" capExtended: %d\n", sc->synhw.capExtended); - printf(" capPassthrough: %d\n", - sc->synhw.capPassthrough); - printf(" capSleep: %d\n", sc->synhw.capSleep); - printf(" capFourButtons: %d\n", - sc->synhw.capFourButtons); - printf(" capMultiFinger: %d\n", - sc->synhw.capMultiFinger); - printf(" capPalmDetect: %d\n", - sc->synhw.capPalmDetect); + printf(" capExtended: %d\n", synhw.capExtended); + printf(" capPassthrough: %d\n", synhw.capPassthrough); + printf(" capSleep: %d\n", synhw.capSleep); + printf(" capFourButtons: %d\n", synhw.capFourButtons); + printf(" capMultiFinger: %d\n", synhw.capMultiFinger); + printf(" capPalmDetect: %d\n", synhw.capPalmDetect); } /* * If we have bits set in status[0] & 0x70, then we can load * more information about buttons using query 0x09. */ - if (status[0] & 0x70) { + if ((status[0] & 0x70) != 0) { if (mouse_ext_command(kbdc, 0x09) == 0) return (FALSE); if (get_mouse_status(kbdc, status, 0, 3) != 3) return (FALSE); - sc->hw.buttons = ((status[1] & 0xf0) >> 4) + 3; - if (verbose >= 2) - printf(" Additional Buttons: %d\n", - sc->hw.buttons -3); - } - } else { - sc->synhw.capExtended = 0; - - if (verbose >= 2) + buttons = (status[1] & 0xf0) >> 4; + } else + buttons = synhw.capFourButtons ? 1 : 0; + } + if (verbose >= 2) { + if (synhw.capExtended) + printf(" Additional Buttons: %d\n", buttons); + else printf(" No extended capabilities\n"); } @@ -4449,43 +4442,34 @@ enable_synaptics(struct psm_softc *sc) return (FALSE); } + if (sc != NULL) + sc->synhw = synhw; + if (!synaptics_support) + return (FALSE); + /* Set the mode byte; request wmode where available. */ - if (sc->synhw.capExtended) - mouse_ext_command(kbdc, 0xc1); - else - mouse_ext_command(kbdc, 0xc0); + mouse_ext_command(kbdc, synhw.capExtended ? 0xc1 : 0xc0); /* "Commit" the Set Mode Byte command sent above. */ set_mouse_sampling_rate(kbdc, 20); - /* - * Report the correct number of buttons - * - * XXX: I'm not sure this is used anywhere. - */ - if (sc->synhw.capExtended && sc->synhw.capFourButtons) - sc->hw.buttons = 4; - - VLOG(3, (LOG_DEBUG, "synaptics: END init (%d buttons)\n", - sc->hw.buttons)); + buttons += 3; + VLOG(3, (LOG_DEBUG, "synaptics: END init (%d buttons)\n", buttons)); - /* Create sysctl tree. */ - synaptics_sysctl_create_tree(sc); + if (sc != NULL) { + /* Create sysctl tree. */ + synaptics_sysctl_create_tree(sc); - /* - * The touchpad will have to be reinitialized after - * suspend/resume. - */ - sc->config |= PSM_CONFIG_HOOKRESUME | PSM_CONFIG_INITAFTERSUSPEND; + sc->hw.buttons = buttons; + } return (TRUE); } /* Interlink electronics VersaPad */ static int -enable_versapad(struct psm_softc *sc) +enable_versapad(KBDC kbdc, struct psm_softc *sc) { - KBDC kbdc = sc->kbdc; int data[3]; set_mouse_resolution(kbdc, PSMD_RES_MEDIUM_HIGH); /* set res. 2 */ @@ -4500,8 +4484,6 @@ enable_versapad(struct psm_softc *sc) return (FALSE); set_mouse_scaling(kbdc, 1); /* set scale 1:1 */ - sc->config |= PSM_CONFIG_HOOKRESUME | PSM_CONFIG_INITAFTERSUSPEND; - return (TRUE); /* PS/2 absolute mode */ } @@ -4539,7 +4521,8 @@ psmresume(device_t dev) VLOG(2, (LOG_NOTICE, "psm%d: system resume hook called.\n", unit)); - if (!(sc->config & PSM_CONFIG_HOOKRESUME)) + if ((sc->config & + (PSM_CONFIG_HOOKRESUME | PSM_CONFIG_INITAFTERSUSPEND)) == 0) return (0); err = reinitialize(sc, sc->config & PSM_CONFIG_INITAFTERSUSPEND);