From efccf735355c498176fd5093aa89cfb46ef16c94 Mon Sep 17 00:00:00 2001 From: Martin Wilck Date: Tue, 29 May 2018 09:28:09 +0200 Subject: [PATCH 1/2] 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 Signed-off-by: Peter Hutterer --- udev/90-libinput-model-quirks.rules.in | 15 +++++++++------ udev/libinput-model-quirks.c | 15 +++++++++++++++ 2 files changed, 24 insertions(+), 6 deletions(-) diff --git a/udev/90-libinput-model-quirks.rules.in b/udev/90-libinput-model-quirks.rules.in index e7d56bb..b584513 100644 --- a/udev/90-libinput-model-quirks.rules.in +++ b/udev/90-libinput-model-quirks.rules.in @@ -11,19 +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*", \ ENV{ID_INPUT_TOUCHPAD}=="1", \ - IMPORT{program}="@UDEV_TEST_PATH@libinput-model-quirks %S%p" - -# Second, match on anything with that env set and import from the hwdb + ENV{.DETECT_FWVERSION}="1" KERNELS=="*input*", \ - ENV{ID_INPUT_TOUCHPAD}=="1", \ - ENV{LIBINPUT_MODEL_FIRMWARE_VERSION}!="", \ + 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 2dc917d..411665d 100644 --- a/udev/libinput-model-quirks.c +++ b/udev/libinput-model-quirks.c @@ -107,6 +107,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); +} + int main(int argc, char **argv) { int rc = 1; @@ -129,6 +142,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