Download raw body.
sys/ihidev: quirk for Honor MagicBook's touchpad
On Mon, Jan 06, 2025 at 03:27:07AM GMT, Kirill A. Korinsky wrote:
> tech@,
>
> Here a quirk which is required for Honor MagicBook's touchpad to be read as
> multioutch. This touchpad needs re-power command with sleep after report
> description is read. Without waitng quite enough, almost the seconds, or
> re-power command it reads only as:
>
> imt0 at ihidev1ihidev1: failed fetching report
> ims0 at ihidev1 reportid 1: 3 buttons, Z dir
>
> but seems only on the cold boot. Otherwise with 1 seconds sleep and re-power
> command, or on warm boot, it reads as:
>
> imt0 at ihidev1: touchpad, 5 contacts
> ims0 at ihidev1 reportid 1: 3 buttons, Z dir
>
> Ok?
Looks good to me, and did pass a quick regression test on my Samsung.
ok mglocker@
> Index: sys/dev/i2c/ihidev.c
> ===================================================================
> RCS file: /cvs/src/sys/dev/i2c/ihidev.c,v
> diff -u -p -u -p -r1.35 ihidev.c
> --- sys/dev/i2c/ihidev.c 6 Jan 2025 02:13:55 -0000 1.35
> +++ sys/dev/i2c/ihidev.c 6 Jan 2025 02:18:27 -0000
> @@ -76,6 +76,17 @@ int ihidev_maxrepid(void *buf, int len);
> int ihidev_print(void *aux, const char *pnp);
> int ihidev_submatch(struct device *parent, void *cf, void *aux);
>
> +#define IHIDEV_QUIRK_RE_POWER_ON 0x1
> +
> +const struct ihidev_quirks {
> + uint16_t ihq_vid;
> + uint16_t ihq_pid;
> + int ihq_quirks;
> +} ihidev_devs[] = {
> + /* HONOR MagicBook Art 14 Touchpad (QTEC0002) */
> + { 0x35cc, 0x0104, IHIDEV_QUIRK_RE_POWER_ON },
> +};
> +
> const struct cfattach ihidev_ca = {
> sizeof(struct ihidev_softc),
> ihidev_match,
> @@ -99,6 +110,25 @@ ihidev_match(struct device *parent, void
> return (0);
> }
>
> +int
> +ihidev_quirks(struct ihidev_softc *sc)
> +{
> + const struct ihidev_quirks *q;
> + uint16_t vid, pid;
> + int i, nent;
> +
> + nent = nitems(ihidev_devs);
> +
> + vid = letoh16(sc->hid_desc.wVendorID);
> + pid = letoh16(sc->hid_desc.wProductID);
> +
> + for (i = 0, q = ihidev_devs; i < nent; i++, q++)
> + if (vid == q->ihq_vid && pid == q->ihq_pid)
> + return (q->ihq_quirks);
> +
> + return (0);
> +}
> +
> void
> ihidev_attach(struct device *parent, struct device *self, void *aux)
> {
> @@ -637,6 +667,23 @@ ihidev_hid_desc_parse(struct ihidev_soft
> printf("%s: failed fetching HID report\n",
> sc->sc_dev.dv_xname);
> return (1);
> + }
> +
> + if (sc->sc_quirks & IHIDEV_QUIRK_RE_POWER_ON) {
> + if (ihidev_poweron(sc))
> + return (1);
> +
> + /*
> + * 7.2.8 states that a device shall not respond back
> + * after receiving the power on command, and must ensure
> + * that it transitions to power on state in less than 1
> + * second. The ihidev_poweron function uses a shorter
> + * sleep, sufficient for the ON-RESET sequence. Here,
> + * however, it sleeps for the full second to accommodate
> + * cold boot scenarios on affected devices.
> + */
> +
> + ihidev_sleep(sc, 1000);
> }
>
> return (0);
> Index: sys/dev/i2c/ihidev.h
> ===================================================================
> RCS file: /cvs/src/sys/dev/i2c/ihidev.h,v
> diff -u -p -u -p -r1.9 ihidev.h
> --- sys/dev/i2c/ihidev.h 3 Sep 2022 15:48:16 -0000 1.9
> +++ sys/dev/i2c/ihidev.h 6 Jan 2025 02:18:27 -0000
> @@ -93,6 +93,8 @@ struct ihidev_softc {
> int sc_fastpoll;
> struct timeout sc_timer;
> int sc_dying;
> +
> + int sc_quirks;
> };
>
> struct ihidev {
>
>
> --
> wbr, Kirill
>
sys/ihidev: quirk for Honor MagicBook's touchpad