From 8c229ee0a8fc72a5a22bef3653b60afdcc402625 Mon Sep 17 00:00:00 2001 From: Martin Wilck Date: Tue, 29 May 2018 09:28:09 +0200 Subject: [PATCH] udev: support firmware detection for pointing sticks Add support for firmware detection on pointing stick devices. This is needed for ALPS only at this time. Signed-off-by: Martin Wilck --- udev/90-libinput-model-quirks.rules.in | 16 ++++++++++------ udev/libinput-model-quirks.c | 15 +++++++++++++++ 2 files changed, 25 insertions(+), 6 deletions(-) diff --git a/udev/90-libinput-model-quirks.rules.in b/udev/90-libinput-model-quirks.rules.in index 7c73f0a..f29cb8a 100644 --- a/udev/90-libinput-model-quirks.rules.in +++ b/udev/90-libinput-model-quirks.rules.in @@ -11,18 +11,22 @@ ACTION!="add|change", GOTO="libinput_model_quirks_end" KERNEL!="event*", GOTO="libinput_model_quirks_end" -# Touchpad firmware detection, two-stage process. +# Firmware detection, two-stage process. # First, run the program and import the LIBINPUT_MODEL_FIRMWARE_VERSION # environment (if any) -KERNELS=="*input*", \ - IMPORT{program}="@UDEV_TEST_PATH@libinput-model-quirks %S%p" - -# Second, match on anything with that env set and import from the hwdb KERNELS=="*input*", \ ENV{ID_INPUT_TOUCHPAD}=="1", \ - ENV{LIBINPUT_MODEL_FIRMWARE_VERSION}!="", \ + ENV{.DETECT_FWVERSION}="1" +KERNELS=="*input*", \ + ENV{ID_INPUT_POINTINGSTICK}=="1", \ + ENV{.DETECT_FWVERSION}="1" +ENV{.DETECT_FWVERSION}!="1", GOTO="skip_fwversion" + +IMPORT{program}="@UDEV_TEST_PATH@libinput-model-quirks %S%p" +ENV{LIBINPUT_MODEL_FIRMWARE_VERSION}!="", \ IMPORT{builtin}="hwdb 'libinput:name:$attr{name}:fwversion:$env{LIBINPUT_MODEL_FIRMWARE_VERSION}'" # End of touchpad firmware detection +LABEL="skip_fwversion" # libinput:touchpad: ENV{ID_INPUT_TOUCHPAD}=="1", \ diff --git a/udev/libinput-model-quirks.c b/udev/libinput-model-quirks.c index d1d5a68..9eb1505 100644 --- a/udev/libinput-model-quirks.c +++ b/udev/libinput-model-quirks.c @@ -108,6 +108,19 @@ handle_touchpad(struct udev_device *device) handle_touchpad_synaptics(device); } +static void +handle_pointingstick(struct udev_device *device) +{ + const char *name = NULL; + + name = prop_value(device, "NAME"); + if (!name) + return; + + if (strstr(name, "AlpsPS/2 ALPS") != NULL) + handle_touchpad_alps(device); +} + /** * For a non-zero fuzz on the x/y axes, print that fuzz as property and * reset the kernel's fuzz to 0. @@ -187,6 +200,8 @@ int main(int argc, char **argv) if (prop_value(device, "ID_INPUT_TOUCHPAD")) handle_touchpad(device); + if (prop_value(device, "ID_INPUT_POINTINGSTICK")) + handle_pointingstick(device); rc = 0; -- 2.17.0