[PATCH v2 libinput 5.5/9] udev: add a model-quirks callout
Hans de Goede
hdegoede at redhat.com
Thu Jul 9 01:31:53 PDT 2015
Hi,
On 09-07-15 07:31, Peter Hutterer wrote:
> Some model-specific information isn't available through udev properties. This
> callout is used to query the device directly and set a property that we can
> then match on for the hwdb entries.
>
> This is geared for Elantech and ALPS touchpads where the firmware version is
> the interesting bit. The udev rule is added already to match on that, note
> that the callout doesn't do anything at this point. The various
> touchpad-related things will be added separately.
>
> Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>
LGTM: Reviewed-by: Hans de Goede <hdegoede at redhat.com>
Regards,
Hans
> ---
> changes to v1:
> * this is everything but the elantech specific bits, so we can merge it
> while waiting for that to be sorted.
>
> udev/.gitignore | 1 +
> udev/90-libinput-model-quirks.hwdb | 2 +-
> udev/90-libinput-model-quirks.rules.in | 14 ++++++
> udev/Makefile.am | 10 +++-
> udev/libinput-model-quirks.c | 90 ++++++++++++++++++++++++++++++++++
> 5 files changed, 115 insertions(+), 2 deletions(-)
> create mode 100644 udev/libinput-model-quirks.c
>
> diff --git a/udev/.gitignore b/udev/.gitignore
> index 72c77a0..2fdaedc 100644
> --- a/udev/.gitignore
> +++ b/udev/.gitignore
> @@ -1,2 +1,3 @@
> libinput-device-group
> +libinput-model-quirks
> *.rules
> diff --git a/udev/90-libinput-model-quirks.hwdb b/udev/90-libinput-model-quirks.hwdb
> index cf57e9c..fd9efa8 100644
> --- a/udev/90-libinput-model-quirks.hwdb
> +++ b/udev/90-libinput-model-quirks.hwdb
> @@ -11,7 +11,7 @@
> # Match string formats:
> # libinput:<modalias>
> # libinput:name:<name>:dmi:<dmi string>
> -
> +# libinput:name:<name>:fwversion:<version>
> #
> # Sort by brand, model
>
> diff --git a/udev/90-libinput-model-quirks.rules.in b/udev/90-libinput-model-quirks.rules.in
> index 43674f5..d834155 100644
> --- a/udev/90-libinput-model-quirks.rules.in
> +++ b/udev/90-libinput-model-quirks.rules.in
> @@ -11,6 +11,20 @@
> ACTION!="add|change", GOTO="libinput_model_quirks_end"
> KERNEL!="event*", GOTO="libinput_model_quirks_end"
>
> +# Touchpad 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 at 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}!="", \
> + IMPORT{builtin}="hwdb 'libinput:name:$attr{name}:fwversion:$env{LIBINPUT_MODEL_FIRMWARE_VERSION}'"
> +# End of touchpad firmware detection
> +
> # Matches below are exclusive, if one matches we skip the rest
> # hwdb matches:
> #
> diff --git a/udev/Makefile.am b/udev/Makefile.am
> index e5cf95c..e850e09 100644
> --- a/udev/Makefile.am
> +++ b/udev/Makefile.am
> @@ -1,5 +1,6 @@
> udevdir=$(UDEV_DIR)
> -udev_PROGRAMS = libinput-device-group
> +udev_PROGRAMS = libinput-device-group \
> + libinput-model-quirks
>
> litest_rules = 80-libinput-device-groups-litest.rules \
> 90-libinput-model-quirks-litest.rules
> @@ -9,6 +10,13 @@ libinput_device_group_SOURCES = libinput-device-group.c
> libinput_device_group_CFLAGS = $(LIBUDEV_CFLAGS) $(GCC_CFLAGS)
> libinput_device_group_LDADD = $(LIBUDEV_LIBS)
>
> +libinput_model_quirks_SOURCES = libinput-model-quirks.c
> +libinput_model_quirks_CFLAGS = \
> + -I$(top_srcdir)/src \
> + $(LIBUDEV_CFLAGS) \
> + $(GCC_CFLAGS)
> +libinput_model_quirks_LDADD = $(LIBUDEV_LIBS)
> +
> udev_rulesdir=$(UDEV_DIR)/rules.d
> dist_udev_rules_DATA = \
> 80-libinput-device-groups.rules \
> diff --git a/udev/libinput-model-quirks.c b/udev/libinput-model-quirks.c
> new file mode 100644
> index 0000000..3c51a37
> --- /dev/null
> +++ b/udev/libinput-model-quirks.c
> @@ -0,0 +1,90 @@
> +/*
> + * Copyright © 2015 Red Hat, Inc.
> + *
> + * Permission is hereby granted, free of charge, to any person obtaining a
> + * copy of this software and associated documentation files (the "Software"),
> + * to deal in the Software without restriction, including without limitation
> + * the rights to use, copy, modify, merge, publish, distribute, sublicense,
> + * and/or sell copies of the Software, and to permit persons to whom the
> + * Software is furnished to do so, subject to the following conditions:
> + *
> + * The above copyright notice and this permission notice (including the next
> + * paragraph) shall be included in all copies or substantial portions of the
> + * Software.
> + *
> + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
> + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
> + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
> + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
> + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
> + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
> + * DEALINGS IN THE SOFTWARE.
> + */
> +
> +#include "config.h"
> +
> +#include <fcntl.h>
> +#include <stdbool.h>
> +#include <stdio.h>
> +#include <stdlib.h>
> +#include <string.h>
> +#include <unistd.h>
> +#include <libudev.h>
> +#include <linux/input.h>
> +
> +#include "libinput-util.h"
> +
> +static inline const char *
> +prop_value(struct udev_device *device,
> + const char *prop_name)
> +{
> + struct udev_device *parent;
> + const char *prop_value = NULL;
> +
> + parent = device;
> + while (parent && !prop_value) {
> + prop_value = udev_device_get_property_value(parent, prop_name);
> + parent = udev_device_get_parent(parent);
> + }
> +
> + return prop_value;
> +}
> +
> +static void
> +handle_touchpad(struct udev_device *device)
> +{
> +}
> +
> +int main(int argc, char **argv)
> +{
> + int rc = 1;
> + struct udev *udev = NULL;
> + struct udev_device *device = NULL;
> + const char *syspath;
> +
> + if (argc != 2)
> + return 1;
> +
> + syspath = argv[1];
> +
> + udev = udev_new();
> + if (!udev)
> + goto out;
> +
> + device = udev_device_new_from_syspath(udev, syspath);
> + if (!device)
> + goto out;
> +
> + if (udev_device_get_property_value(device, "ID_INPUT_TOUCHPAD"))
> + handle_touchpad(device);
> +
> + rc = 0;
> +
> +out:
> + if (device)
> + udev_device_unref(device);
> + if (udev)
> + udev_unref(udev);
> +
> + return rc;
> +}
>
More information about the wayland-devel
mailing list