[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