summaryrefslogtreecommitdiffstats
path: root/sys/dev/i2c
diff options
context:
space:
mode:
authorjcs <jcs@openbsd.org>2020-07-09 21:01:55 +0000
committerjcs <jcs@openbsd.org>2020-07-09 21:01:55 +0000
commit8fabbf99b406209dfff93615e906d9d6117e312a (patch)
tree80b945c20424c017dcf12d7614b3d6a783fbac8d /sys/dev/i2c
parentSome touchpads don't have the "maximum number of contacts" or (diff)
downloadwireguard-openbsd-8fabbf99b406209dfff93615e906d9d6117e312a.tar.xz
wireguard-openbsd-8fabbf99b406209dfff93615e906d9d6117e312a.zip
On some laptops that have a Windows Precision Touchpad (imt) and
also a trackstick or separate physical buttons, imt was claiming all report ids of the ihidev device preventing the trackstick/buttons from attaching as a separate ims device on other report ids. Just claim the report ids that imt needs and let ims attach to others it may find. Fixes two Dell Latitude laptops and tested in snaps for a bit.
Diffstat (limited to 'sys/dev/i2c')
-rw-r--r--sys/dev/i2c/ihidev.c19
-rw-r--r--sys/dev/i2c/ihidev.h6
-rw-r--r--sys/dev/i2c/imt.c14
3 files changed, 26 insertions, 13 deletions
diff --git a/sys/dev/i2c/ihidev.c b/sys/dev/i2c/ihidev.c
index 4c63eb5bae2..07e7b86fae5 100644
--- a/sys/dev/i2c/ihidev.c
+++ b/sys/dev/i2c/ihidev.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: ihidev.c,v 1.22 2020/01/24 04:03:11 cheloha Exp $ */
+/* $OpenBSD: ihidev.c,v 1.23 2020/07/09 21:01:55 jcs Exp $ */
/*
* HID-over-i2c driver
*
@@ -173,17 +173,22 @@ ihidev_attach(struct device *parent, struct device *self, void *aux)
iha.iaa = ia;
iha.parent = sc;
- /* Look for a driver claiming all report IDs first. */
- iha.reportid = IHIDEV_CLAIM_ALLREPORTID;
+ /* Look for a driver claiming multiple report IDs first. */
+ iha.reportid = IHIDEV_CLAIM_MULTIPLEID;
+ iha.nclaims = 0;
dev = config_found_sm((struct device *)sc, &iha, NULL,
ihidev_submatch);
if (dev != NULL) {
- for (repid = 0; repid < sc->sc_nrepid; repid++)
- sc->sc_subdevs[repid] = (struct ihidev *)dev;
- return;
+ for (repid = 0; repid < iha.nclaims; repid++) {
+ sc->sc_subdevs[iha.claims[repid]] =
+ (struct ihidev *)dev;
+ }
}
for (repid = 0; repid < sc->sc_nrepid; repid++) {
+ if (sc->sc_subdevs[repid] != NULL)
+ continue;
+
if (hid_report_size(sc->sc_report, sc->sc_reportlen, hid_input,
repid) == 0 &&
hid_report_size(sc->sc_report, sc->sc_reportlen,
@@ -748,7 +753,7 @@ ihidev_print(void *aux, const char *pnp)
if (pnp)
printf("hid at %s", pnp);
- if (iha->reportid != 0 && iha->reportid != IHIDEV_CLAIM_ALLREPORTID)
+ if (iha->reportid != 0)
printf(" reportid %d", iha->reportid);
return (UNCONF);
diff --git a/sys/dev/i2c/ihidev.h b/sys/dev/i2c/ihidev.h
index dde7cef5ab5..0404be65b06 100644
--- a/sys/dev/i2c/ihidev.h
+++ b/sys/dev/i2c/ihidev.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: ihidev.h,v 1.7 2019/07/22 14:37:06 jcs Exp $ */
+/* $OpenBSD: ihidev.h,v 1.8 2020/07/09 21:01:56 jcs Exp $ */
/*
* HID-over-i2c driver
*
@@ -112,7 +112,9 @@ struct ihidev_attach_arg {
struct i2c_attach_args *iaa;
struct ihidev_softc *parent;
uint8_t reportid;
-#define IHIDEV_CLAIM_ALLREPORTID 255
+ uint8_t claims[16];
+ uint8_t nclaims;
+#define IHIDEV_CLAIM_MULTIPLEID 255
};
struct i2c_hid_report_request {
diff --git a/sys/dev/i2c/imt.c b/sys/dev/i2c/imt.c
index 38169837338..5bd3894898f 100644
--- a/sys/dev/i2c/imt.c
+++ b/sys/dev/i2c/imt.c
@@ -1,9 +1,9 @@
-/* $OpenBSD: imt.c,v 1.4 2018/08/25 20:31:31 jcs Exp $ */
+/* $OpenBSD: imt.c,v 1.5 2020/07/09 21:01:56 jcs Exp $ */
/*
* HID-over-i2c multitouch trackpad driver for devices conforming to
* Windows Precision Touchpad standard
*
- * https://msdn.microsoft.com/en-us/library/windows/hardware/dn467314%28v=vs.85%29.aspx
+ * https://docs.microsoft.com/en-us/windows-hardware/design/component-guidelines/windows-precision-touchpad-required-hid-top-level-collections
*
* Copyright (c) 2016 joshua stein <jcs@openbsd.org>
*
@@ -79,13 +79,19 @@ int
imt_match(struct device *parent, void *match, void *aux)
{
struct ihidev_attach_arg *iha = (struct ihidev_attach_arg *)aux;
+ struct imt_softc sc;
int size;
void *desc;
- if (iha->reportid == IHIDEV_CLAIM_ALLREPORTID) {
+ if (iha->reportid == IHIDEV_CLAIM_MULTIPLEID) {
ihidev_get_report_desc(iha->parent, &desc, &size);
- if (imt_find_winptp_reports(iha->parent, desc, size, NULL))
+ if (imt_find_winptp_reports(iha->parent, desc, size, &sc)) {
+ iha->claims[0] = sc.sc_rep_input;
+ iha->claims[1] = sc.sc_rep_config;
+ iha->claims[2] = sc.sc_rep_cap;
+ iha->nclaims = 3;
return (IMATCH_DEVCLASS_DEVSUBCLASS);
+ }
}
return (IMATCH_NONE);