debian/patches: Use hwdb to store device autosuspend rules and drop debian specifics

Upstream will use an hwdb to store the device autosuspend (that will be
included in systemd also, so libfprint packagin may stop shipping it at
later point), so use it earlier.

Drop the debian specific rules to set the devices part of the `plugdev`
group as such devices should not be ever readable by an user, but the
access should be managed through a libfprint-based service (frpintd at
the date).
This commit is contained in:
Marco Trevisan (Treviño)
2021-01-21 15:43:38 +01:00
parent f2c4614779
commit 3ccd267ad2
13 changed files with 1219 additions and 680 deletions
+178
View File
@@ -0,0 +1,178 @@
From: Benjamin Berg <bberg@redhat.com>
Date: Tue, 19 Jan 2021 14:42:35 +0100
Subject: Drop version from libfprint hwdb
As we are shipping a hwdb file now, we cannot have a collision with the
old libfprint version. Also, we are going to pull these rules into
systemd and they will not be installed via libfprint in the future. As
such, collisions will not happen again and it makes more sense like this
for systemd.
---
.gitlab-ci.yml | 144 --------------------------------------------------
libfprint/meson.build | 2 +-
2 files changed, 1 insertion(+), 145 deletions(-)
delete mode 100644 .gitlab-ci.yml
diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
deleted file mode 100644
index 3f0925b..0000000
--- a/.gitlab-ci.yml
+++ /dev/null
@@ -1,144 +0,0 @@
-include:
- - local: '.gitlab-ci/libfprint-templates.yaml'
- - project: 'wayland/ci-templates'
- ref: master
- file: '/templates/fedora.yml'
- - remote: 'https://gitlab.gnome.org/GNOME/citemplates/-/raw/master/flatpak/flatpak_ci_initiative.yml'
-
-variables:
- extends: .libfprint_common_variables
- FDO_DISTRIBUTION_TAG: latest
- FDO_DISTRIBUTION_VERSION: rawhide
- FEDORA_IMAGE: "$CI_REGISTRY/libfprint/$CI_PROJECT_NAME/fedora/$FDO_DISTRIBUTION_VERSION:$FDO_DISTRIBUTION_TAG"
- BUNDLE: "org.freedesktop.libfprint.Demo.flatpak"
- LAST_ABI_BREAK: "056ea541ddc97f5806cffbd99a12dc87e4da3546"
-
-stages:
- - check-source
- - build
- - test
- - flatpak
-
-image: "$FEDORA_IMAGE"
-
-.build_one_driver_template: &build_one_driver
- script:
- # Build with a driver that doesn't need imaging, or nss
- - meson --werror -Ddrivers=$driver . _build
- - ninja -C _build
- - rm -rf _build/
-
-.build_template: &build
- script:
- # And build with everything
- - meson --werror -Ddrivers=all . _build
- - ninja -C _build
- - ninja -C _build install
-
-.build_template: &check_abi
- script:
- - ./.ci/check-abi ${LAST_ABI_BREAK} $(git rev-parse HEAD)
-
-build:
- stage: build
- except:
- variables:
- - $CI_PIPELINE_SOURCE == "schedule"
- variables:
- driver: virtual_image
- <<: *build_one_driver
- <<: *build
-# <<: *check_abi
- artifacts:
- expose_as: "HTML Documentation"
- paths:
- - _build/doc/html/
- expire_in: 1 week
-
-test:
- stage: test
- except:
- variables:
- - $CI_PIPELINE_SOURCE == "schedule"
- script:
- - meson --werror -Ddrivers=all -Db_coverage=true . _build
- - ninja -C _build
- - meson test -C _build --verbose --no-stdsplit --timeout-multiplier 3
- - ninja -C _build coverage
- - cat _build/meson-logs/coverage.txt
- artifacts:
- paths:
- - _build/meson-logs
- expire_in: 1 week
- coverage: '/^TOTAL.*\s+(\d+\%)$/'
-
-test_valgrind:
- stage: test
- except:
- variables:
- - $CI_PIPELINE_SOURCE == "schedule"
- script:
- - meson -Ddrivers=all . _build
- - ninja -C _build
- - meson test -C _build --verbose --no-stdsplit --setup=valgrind
-
-test_scan_build:
- stage: test
- except:
- variables:
- - $CI_PIPELINE_SOURCE == "schedule"
- allow_failure: true
- script:
- - meson -Ddrivers=all . _build
- # This is ugly, the wrapper disables the malloc checker
- - SCANBUILD=$CI_PROJECT_DIR/.gitlab-ci/scan-build ninja -C _build scan-build
- # Check that the directory is empty
- - "! ls -A _build/meson-logs/scanbuild | grep -q ."
- artifacts:
- paths:
- - _build/meson-logs
- expire_in: 1 week
-
-test_indent:
- stage: check-source
- except:
- variables:
- - $CI_PIPELINE_SOURCE == "schedule"
- script:
- - scripts/uncrustify.sh
- - git diff
- - "! git status -s | grep -q ."
-
-flatpak:
- stage: flatpak
- extends: .flatpak
- image: registry.gitlab.gnome.org/gnome/gnome-runtime-images/gnome:3.36
- variables:
- MANIFEST_PATH: "demo/org.freedesktop.libfprint.Demo.json"
- FLATPAK_MODULE: "libfprint"
- APP_ID: "org.freedesktop.libfprint.Demo"
- rules:
- - if: '$CI_PROJECT_PATH != "libfprint/libfprint"'
- when: never
- - if: '$CI_PIPELINE_SOURCE == "schedule"'
- when: never
- - if: '$CI_COMMIT_BRANCH == "master"'
- when: always
- - if: '$CI_COMMIT_TAG'
- when: always
- # For any other (commit), allow manual run.
- # This excludes MRs which would create a duplicate pipeline
- - if: '$CI_COMMIT_BRANCH'
- when: manual
- allow_failure: true
-
-# CONTAINERS creation stage
-container_fedora_build:
- extends: .fdo.container-build@fedora
- only:
- variables:
- - $CI_PIPELINE_SOURCE == "schedule" && $CRON_TASK == "BUILD_CI_IMAGES"
- variables:
- GIT_STRATEGY: none # no need to pull the whole tree for rebuilding the image
- # a list of packages to install
- FDO_DISTRIBUTION_PACKAGES: $LIBFPRINT_DEPENDENCIES
diff --git a/libfprint/meson.build b/libfprint/meson.build
index 3464bf3..abf2fb9 100644
--- a/libfprint/meson.build
+++ b/libfprint/meson.build
@@ -304,7 +304,7 @@ udev_hwdb = executable('fprint-list-udev-hwdb',
# We always build this file; primarily so that systemd can pull it
# from the artefacts!
custom_target('udev-rules',
- output: '60-autosuspend-@0@.hwdb'.format(versioned_libname),
+ output: '60-autosuspend-@0@.hwdb'.format(meson.project_name()),
capture: true,
command: [ udev_hwdb ],
install: get_option('udev_rules'),
@@ -0,0 +1,491 @@
From: Benjamin Berg <bberg@redhat.com>
Date: Tue, 19 Jan 2021 14:13:03 +0100
Subject: Generate a hwdb instead of udev rules
We only use the rules/hwdb to enable auto-suspend. So, instead of
shipping our own rules, we can just use the existing autosuspend rules
and ship a hwdb that sets the appropriate flag.
Closes: #336
Origin: https://gitlab.freedesktop.org/libfprint/libfprint/-/commit/55a2bb55
---
libfprint/fprint-list-udev-hwdb.c | 191 +++++++++++++++++++++++++++++++++++++
libfprint/fprint-list-udev-rules.c | 188 ------------------------------------
libfprint/meson.build | 10 +-
meson.build | 6 +-
meson_options.txt | 4 +-
tests/meson.build | 4 +-
6 files changed, 203 insertions(+), 200 deletions(-)
create mode 100644 libfprint/fprint-list-udev-hwdb.c
delete mode 100644 libfprint/fprint-list-udev-rules.c
diff --git a/libfprint/fprint-list-udev-hwdb.c b/libfprint/fprint-list-udev-hwdb.c
new file mode 100644
index 0000000..b687085
--- /dev/null
+++ b/libfprint/fprint-list-udev-hwdb.c
@@ -0,0 +1,191 @@
+/*
+ * Copyright (C) 2009 Red Hat <mjg@redhat.com>
+ * Copyright (C) 2008 Bastien Nocera <hadess@hadess.net>
+ * Copyright (C) 2008 Timo Hoenig <thoenig@suse.de>, <thoenig@nouse.net>
+ * Copyright (C) 2019 Benjamin Berg <bberg@redhat.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#include <config.h>
+
+#include "fpi-context.h"
+#include "fpi-device.h"
+
+static const FpIdEntry whitelist_id_table[] = {
+ /* Currently known and unsupported devices.
+ * You can generate this list from the wiki page using e.g.:
+ * gio cat https://gitlab.freedesktop.org/libfprint/wiki/-/wikis/Unsupported-Devices.md | sed -n 's!|.*\([0-9a-fA-F]\{4\}\):\([0-9a-fA-F]\{4\}\).*|.*! { .vid = 0x\1, .pid = 0x\2 },!p'
+ */
+ { .vid = 0x04f3, .pid = 0x036b },
+ { .vid = 0x04f3, .pid = 0x0c00 },
+ { .vid = 0x04f3, .pid = 0x0c4b },
+ { .vid = 0x04f3, .pid = 0x0c4c },
+ { .vid = 0x04f3, .pid = 0x0c4f },
+ { .vid = 0x04f3, .pid = 0x0c57 },
+ { .vid = 0x04f3, .pid = 0x2706 },
+ { .vid = 0x06cb, .pid = 0x0081 },
+ { .vid = 0x06cb, .pid = 0x0088 },
+ { .vid = 0x06cb, .pid = 0x008a },
+ { .vid = 0x06cb, .pid = 0x009a },
+ { .vid = 0x06cb, .pid = 0x009b },
+ { .vid = 0x06cb, .pid = 0x00a2 },
+ { .vid = 0x06cb, .pid = 0x00b7 },
+ { .vid = 0x06cb, .pid = 0x00bb },
+ { .vid = 0x06cb, .pid = 0x00be },
+ { .vid = 0x06cb, .pid = 0x00cb },
+ { .vid = 0x06cb, .pid = 0x00d8 },
+ { .vid = 0x06cb, .pid = 0x00da },
+ { .vid = 0x0a5c, .pid = 0x5801 },
+ { .vid = 0x0a5c, .pid = 0x5805 },
+ { .vid = 0x0a5c, .pid = 0x5834 },
+ { .vid = 0x0a5c, .pid = 0x5843 },
+ { .vid = 0x10a5, .pid = 0x0007 },
+ { .vid = 0x1188, .pid = 0x9545 },
+ { .vid = 0x138a, .pid = 0x0007 },
+ { .vid = 0x138a, .pid = 0x003a },
+ { .vid = 0x138a, .pid = 0x003c },
+ { .vid = 0x138a, .pid = 0x003d },
+ { .vid = 0x138a, .pid = 0x003f },
+ { .vid = 0x138a, .pid = 0x0090 },
+ { .vid = 0x138a, .pid = 0x0091 },
+ { .vid = 0x138a, .pid = 0x0092 },
+ { .vid = 0x138a, .pid = 0x0094 },
+ { .vid = 0x138a, .pid = 0x0097 },
+ { .vid = 0x138a, .pid = 0x009d },
+ { .vid = 0x138a, .pid = 0x00ab },
+ { .vid = 0x147e, .pid = 0x1002 },
+ { .vid = 0x1491, .pid = 0x0088 },
+ { .vid = 0x16d1, .pid = 0x1027 },
+ { .vid = 0x1c7a, .pid = 0x0300 },
+ { .vid = 0x1c7a, .pid = 0x0570 },
+ { .vid = 0x1c7a, .pid = 0x0575 },
+ { .vid = 0x27c6, .pid = 0x5042 },
+ { .vid = 0x27c6, .pid = 0x5110 },
+ { .vid = 0x27c6, .pid = 0x5117 },
+ { .vid = 0x27c6, .pid = 0x5201 },
+ { .vid = 0x27c6, .pid = 0x521d },
+ { .vid = 0x27c6, .pid = 0x5301 },
+ { .vid = 0x27c6, .pid = 0x530c },
+ { .vid = 0x27c6, .pid = 0x532d },
+ { .vid = 0x27c6, .pid = 0x533c },
+ { .vid = 0x27c6, .pid = 0x5381 },
+ { .vid = 0x27c6, .pid = 0x5385 },
+ { .vid = 0x27c6, .pid = 0x538c },
+ { .vid = 0x27c6, .pid = 0x538d },
+ { .vid = 0x27c6, .pid = 0x5395 },
+ { .vid = 0x27c6, .pid = 0x5584 },
+ { .vid = 0x27c6, .pid = 0x55a2 },
+ { .vid = 0x27c6, .pid = 0x55a4 },
+ { .vid = 0x27c6, .pid = 0x55b4 },
+ { .vid = 0x27c6, .pid = 0x5740 },
+ { .vid = 0x2808, .pid = 0x9338 },
+ { .vid = 0x298d, .pid = 0x2033 },
+ { .vid = 0x3538, .pid = 0x0930 },
+ { .vid = 0 },
+};
+
+static const FpIdEntry blacklist_id_table[] = {
+ { .vid = 0x0483, .pid = 0x2016 },
+ /* https://bugs.freedesktop.org/show_bug.cgi?id=66659 */
+ { .vid = 0x045e, .pid = 0x00bb },
+ { .vid = 0 },
+};
+
+static const FpDeviceClass whitelist = {
+ .type = FP_DEVICE_TYPE_USB,
+ .id_table = whitelist_id_table,
+ .id = "whitelist",
+ .full_name = "Hardcoded whitelist"
+};
+
+GHashTable *printed = NULL;
+
+static void
+print_driver (const FpDeviceClass *cls)
+{
+ const FpIdEntry *entry;
+ gint num_printed = 0;
+
+ if (cls->type != FP_DEVICE_TYPE_USB)
+ return;
+
+ for (entry = cls->id_table; entry->vid != 0; entry++)
+ {
+ const FpIdEntry *bl_entry;
+ char *key;
+
+ for (bl_entry = blacklist_id_table; bl_entry->vid != 0; bl_entry++)
+ if (entry->vid == bl_entry->vid && entry->pid == bl_entry->pid)
+ break;
+
+ if (bl_entry->vid != 0)
+ continue;
+
+ key = g_strdup_printf ("%04x:%04x", entry->vid, entry->pid);
+
+ if (g_hash_table_lookup (printed, key) != NULL)
+ {
+ if (cls == &whitelist)
+ g_warning ("%s implemented by driver %s",
+ key, (const char *) g_hash_table_lookup (printed, key));
+ g_free (key);
+ continue;
+ }
+
+ g_hash_table_insert (printed, key, (void *) cls->id);
+
+ if (num_printed == 0)
+ {
+ if (cls != &whitelist)
+ g_print ("\n# Supported by libfprint driver %s\n", cls->id);
+ else
+ g_print ("\n# Known unsupported devices\n");
+ }
+
+ g_print ("usb:v%04Xp%04X*\n",
+ entry->vid, entry->pid);
+ num_printed++;
+ }
+
+ if (num_printed > 0)
+ g_print (" ID_AUTOSUSPEND=1\n");
+}
+
+int
+main (int argc, char **argv)
+{
+ g_autoptr(GArray) drivers = fpi_get_driver_types ();
+ guint i;
+
+ printed = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, NULL);
+
+ for (i = 0; i < drivers->len; i++)
+ {
+ GType driver = g_array_index (drivers, GType, i);
+ g_autoptr(FpDeviceClass) cls = g_type_class_ref (driver);
+
+ if (cls->type != FP_DEVICE_TYPE_USB)
+ continue;
+
+ print_driver (cls);
+ }
+
+ print_driver (&whitelist);
+
+ g_hash_table_destroy (printed);
+
+ return 0;
+}
diff --git a/libfprint/fprint-list-udev-rules.c b/libfprint/fprint-list-udev-rules.c
deleted file mode 100644
index 050a450..0000000
--- a/libfprint/fprint-list-udev-rules.c
+++ /dev/null
@@ -1,188 +0,0 @@
-/*
- * Copyright (C) 2009 Red Hat <mjg@redhat.com>
- * Copyright (C) 2008 Bastien Nocera <hadess@hadess.net>
- * Copyright (C) 2008 Timo Hoenig <thoenig@suse.de>, <thoenig@nouse.net>
- * Copyright (C) 2019 Benjamin Berg <bberg@redhat.com>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- */
-
-#include <config.h>
-
-#include "fpi-context.h"
-#include "fpi-device.h"
-
-static const FpIdEntry whitelist_id_table[] = {
- /* Currently known and unsupported devices.
- * You can generate this list from the wiki page using e.g.:
- * gio cat https://gitlab.freedesktop.org/libfprint/wiki/-/wikis/Unsupported-Devices.md | sed -n 's!|.*\([0-9a-fA-F]\{4\}\):\([0-9a-fA-F]\{4\}\).*|.*! { .vid = 0x\1, .pid = 0x\2 },!p'
- */
- { .vid = 0x04f3, .pid = 0x036b },
- { .vid = 0x04f3, .pid = 0x0c00 },
- { .vid = 0x04f3, .pid = 0x0c4b },
- { .vid = 0x04f3, .pid = 0x0c4c },
- { .vid = 0x04f3, .pid = 0x0c4f },
- { .vid = 0x04f3, .pid = 0x0c57 },
- { .vid = 0x04f3, .pid = 0x2706 },
- { .vid = 0x06cb, .pid = 0x0081 },
- { .vid = 0x06cb, .pid = 0x0088 },
- { .vid = 0x06cb, .pid = 0x008a },
- { .vid = 0x06cb, .pid = 0x009a },
- { .vid = 0x06cb, .pid = 0x009b },
- { .vid = 0x06cb, .pid = 0x00a2 },
- { .vid = 0x06cb, .pid = 0x00b7 },
- { .vid = 0x06cb, .pid = 0x00bb },
- { .vid = 0x06cb, .pid = 0x00be },
- { .vid = 0x06cb, .pid = 0x00cb },
- { .vid = 0x06cb, .pid = 0x00d8 },
- { .vid = 0x06cb, .pid = 0x00da },
- { .vid = 0x0a5c, .pid = 0x5801 },
- { .vid = 0x0a5c, .pid = 0x5805 },
- { .vid = 0x0a5c, .pid = 0x5834 },
- { .vid = 0x0a5c, .pid = 0x5843 },
- { .vid = 0x10a5, .pid = 0x0007 },
- { .vid = 0x1188, .pid = 0x9545 },
- { .vid = 0x138a, .pid = 0x0007 },
- { .vid = 0x138a, .pid = 0x003a },
- { .vid = 0x138a, .pid = 0x003c },
- { .vid = 0x138a, .pid = 0x003d },
- { .vid = 0x138a, .pid = 0x003f },
- { .vid = 0x138a, .pid = 0x0090 },
- { .vid = 0x138a, .pid = 0x0091 },
- { .vid = 0x138a, .pid = 0x0092 },
- { .vid = 0x138a, .pid = 0x0094 },
- { .vid = 0x138a, .pid = 0x0097 },
- { .vid = 0x138a, .pid = 0x009d },
- { .vid = 0x138a, .pid = 0x00ab },
- { .vid = 0x147e, .pid = 0x1002 },
- { .vid = 0x1491, .pid = 0x0088 },
- { .vid = 0x16d1, .pid = 0x1027 },
- { .vid = 0x1c7a, .pid = 0x0300 },
- { .vid = 0x1c7a, .pid = 0x0570 },
- { .vid = 0x1c7a, .pid = 0x0575 },
- { .vid = 0x27c6, .pid = 0x5042 },
- { .vid = 0x27c6, .pid = 0x5110 },
- { .vid = 0x27c6, .pid = 0x5117 },
- { .vid = 0x27c6, .pid = 0x5201 },
- { .vid = 0x27c6, .pid = 0x521d },
- { .vid = 0x27c6, .pid = 0x5301 },
- { .vid = 0x27c6, .pid = 0x530c },
- { .vid = 0x27c6, .pid = 0x532d },
- { .vid = 0x27c6, .pid = 0x533c },
- { .vid = 0x27c6, .pid = 0x5381 },
- { .vid = 0x27c6, .pid = 0x5385 },
- { .vid = 0x27c6, .pid = 0x538c },
- { .vid = 0x27c6, .pid = 0x538d },
- { .vid = 0x27c6, .pid = 0x5395 },
- { .vid = 0x27c6, .pid = 0x5584 },
- { .vid = 0x27c6, .pid = 0x55a2 },
- { .vid = 0x27c6, .pid = 0x55a4 },
- { .vid = 0x27c6, .pid = 0x55b4 },
- { .vid = 0x27c6, .pid = 0x5740 },
- { .vid = 0x2808, .pid = 0x9338 },
- { .vid = 0x298d, .pid = 0x2033 },
- { .vid = 0x3538, .pid = 0x0930 },
- { .vid = 0 },
-};
-
-static const FpIdEntry blacklist_id_table[] = {
- { .vid = 0x0483, .pid = 0x2016 },
- /* https://bugs.freedesktop.org/show_bug.cgi?id=66659 */
- { .vid = 0x045e, .pid = 0x00bb },
- { .vid = 0 },
-};
-
-static const FpDeviceClass whitelist = {
- .type = FP_DEVICE_TYPE_USB,
- .id_table = whitelist_id_table,
- .id = "whitelist",
- .full_name = "Hardcoded whitelist"
-};
-
-GHashTable *printed = NULL;
-
-static void
-print_driver (const FpDeviceClass *cls)
-{
- const FpIdEntry *entry;
- gint num_printed = 0;
-
- if (cls->type != FP_DEVICE_TYPE_USB)
- return;
-
- for (entry = cls->id_table; entry->vid != 0; entry++)
- {
- const FpIdEntry *bl_entry;
- char *key;
-
- for (bl_entry = blacklist_id_table; bl_entry->vid != 0; bl_entry++)
- if (entry->vid == bl_entry->vid && entry->pid == bl_entry->pid)
- break;
-
- if (bl_entry->vid != 0)
- continue;
-
- key = g_strdup_printf ("%04x:%04x", entry->vid, entry->pid);
-
- if (g_hash_table_lookup (printed, key) != NULL)
- {
- if (cls == &whitelist)
- g_warning ("%s implemented by driver %s",
- key, (const char *) g_hash_table_lookup (printed, key));
- g_free (key);
- continue;
- }
-
- g_hash_table_insert (printed, key, (void *) cls->id);
-
- if (num_printed == 0)
- g_print ("# %s\n", cls->full_name);
-
- g_print ("SUBSYSTEM==\"usb\", ATTRS{idVendor}==\"%04x\", ATTRS{idProduct}==\"%04x\", ATTRS{dev}==\"*\", TEST==\"power/control\", ATTR{power/control}=\"auto\"\n",
- entry->vid, entry->pid);
- g_print ("SUBSYSTEM==\"usb\", ATTRS{idVendor}==\"%04x\", ATTRS{idProduct}==\"%04x\", ENV{LIBFPRINT_DRIVER}=\"%s\"\n",
- entry->vid, entry->pid, cls->full_name);
- num_printed++;
- }
-
- if (num_printed > 0)
- g_print ("\n");
-}
-
-int
-main (int argc, char **argv)
-{
- g_autoptr(GArray) drivers = fpi_get_driver_types ();
- guint i;
-
- printed = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, NULL);
-
- for (i = 0; i < drivers->len; i++)
- {
- GType driver = g_array_index (drivers, GType, i);
- g_autoptr(FpDeviceClass) cls = g_type_class_ref (driver);
-
- if (cls->type != FP_DEVICE_TYPE_USB)
- continue;
-
- print_driver (cls);
- }
-
- print_driver (&whitelist);
-
- g_hash_table_destroy (printed);
-
- return 0;
-}
diff --git a/libfprint/meson.build b/libfprint/meson.build
index 4d1d30c..e385ce8 100644
--- a/libfprint/meson.build
+++ b/libfprint/meson.build
@@ -295,19 +295,19 @@ libfprint_private_dep = declare_dependency(
]
)
-udev_rules = executable('fprint-list-udev-rules',
- 'fprint-list-udev-rules.c',
+udev_hwdb = executable('fprint-list-udev-hwdb',
+ 'fprint-list-udev-hwdb.c',
dependencies: libfprint_private_dep,
link_with: libfprint_drivers,
install: false)
if get_option('udev_rules')
custom_target('udev-rules',
- output: '60-@0@-autosuspend.rules'.format(versioned_libname),
+ output: '60-autosuspend-@0@.hwdb'.format(versioned_libname),
capture: true,
- command: [ udev_rules ],
+ command: [ udev_hwdb ],
install: true,
- install_dir: udev_rules_dir)
+ install_dir: udev_hwdb_dir)
endif
supported_devices = executable('fprint-list-supported-devices',
diff --git a/meson.build b/meson.build
index 483f1ec..ab4ac72 100644
--- a/meson.build
+++ b/meson.build
@@ -194,11 +194,11 @@ drivers_type_func += '}'
root_inc = include_directories('.')
if get_option('udev_rules')
- udev_rules_dir = get_option('udev_rules_dir')
+ udev_hwdb_dir = get_option('udev_hwdb_dir')
- if udev_rules_dir == 'auto'
+ if udev_hwdb_dir == 'auto'
udev_dep = dependency('udev')
- udev_rules_dir = udev_dep.get_pkgconfig_variable('udevdir') + '/rules.d'
+ udev_hwdb_dir = udev_dep.get_pkgconfig_variable('udevdir') + '/hwdb.d'
endif
endif
diff --git a/meson_options.txt b/meson_options.txt
index 746efdc..414695f 100644
--- a/meson_options.txt
+++ b/meson_options.txt
@@ -10,8 +10,8 @@ option('udev_rules',
description: 'Whether to create a udev rules file',
type: 'boolean',
value: true)
-option('udev_rules_dir',
- description: 'Installation path for udev rules',
+option('udev_hwdb_dir',
+ description: 'Installation path for udev hwdb',
type: 'string',
value: 'auto')
option('gtk-examples',
diff --git a/tests/meson.build b/tests/meson.build
index 27bdd9f..4ebf3b7 100644
--- a/tests/meson.build
+++ b/tests/meson.build
@@ -170,8 +170,8 @@ foreach test_name: unit_tests
endforeach
# Run udev rule generator with fatal warnings
-test('udev-rules',
- udev_rules,
+test('udev-hwdb',
+ udev_hwdb,
env: envs)
gdb = find_program('gdb', required: false)
@@ -0,0 +1,21 @@
From: =?utf-8?b?Ik1hcmNvIFRyZXZpc2FuIChUcmV2acOxbyki?= <mail@3v1n0.net>
Date: Thu, 21 Jan 2021 00:57:43 +0100
Subject: build: Ensure we process the data dir
Origin: https://gitlab.freedesktop.org/libfprint/libfprint/-/commit/018641ad
---
meson.build | 1 +
1 file changed, 1 insertion(+)
diff --git a/meson.build b/meson.build
index 415f27e..9494ebb 100644
--- a/meson.build
+++ b/meson.build
@@ -237,6 +237,7 @@ if get_option('gtk-examples')
subdir('demo')
endif
+subdir('data')
subdir('tests')
pkgconfig = import('pkgconfig')
@@ -0,0 +1,22 @@
From: =?utf-8?b?Ik1hcmNvIFRyZXZpc2FuIChUcmV2acOxbyki?= <mail@3v1n0.net>
Date: Thu, 21 Jan 2021 01:17:02 +0100
Subject: data: Keep using versioned libname for hwdb file
Origin: https://gitlab.freedesktop.org/libfprint/libfprint/-/commit/2f6adce2
---
data/meson.build | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/data/meson.build b/data/meson.build
index 975c1c3..99adf5d 100644
--- a/data/meson.build
+++ b/data/meson.build
@@ -3,7 +3,7 @@ if get_option('udev_rules')
# ninja -C <builddir> libfprint/sync-udev-hwdb
install_data('autosuspend.hwdb',
- rename: '60-autosuspend-@0@.hwdb'.format(meson.project_name()),
+ rename: '60-autosuspend-@0@.hwdb'.format(versioned_libname),
install_dir: udev_hwdb_dir,
)
endif
@@ -0,0 +1,437 @@
From: =?utf-8?b?Ik1hcmNvIFRyZXZpc2FuIChUcmV2acOxbyki?= <mail@3v1n0.net>
Date: Wed, 20 Jan 2021 20:02:05 +0100
Subject: data: Use auto-generated but hardcoded autosuspend hwdb file
This solves various problems:
1. It stays the same also if some drivers have been disabled
2. It uses a stable path for being imported by systemd
3. It is still checked for its validity by tests
4. It can be auto-generated using a simple command
---
data/autosuspend.hwdb | 262 ++++++++++++++++++++++++++++++++++++++
data/meson.build | 9 ++
libfprint/fprint-list-udev-hwdb.c | 5 +
libfprint/meson.build | 24 ++--
meson.build | 12 ++
tests/meson.build | 5 +-
tests/test-generated-hwdb.sh | 24 ++++
7 files changed, 332 insertions(+), 9 deletions(-)
create mode 100644 data/autosuspend.hwdb
create mode 100644 data/meson.build
create mode 100755 tests/test-generated-hwdb.sh
diff --git a/data/autosuspend.hwdb b/data/autosuspend.hwdb
new file mode 100644
index 0000000..f22d16a
--- /dev/null
+++ b/data/autosuspend.hwdb
@@ -0,0 +1,262 @@
+# This file has been generated using fprint-list-udev-hwdb with all drivers enabled
+
+# Supported by libfprint driver upektc_img
+usb:v147Ep2016*
+usb:v147Ep2020*
+ ID_AUTOSUSPEND=1
+
+# Supported by libfprint driver vfs5011
+usb:v138Ap0010*
+usb:v138Ap0011*
+usb:v138Ap0015*
+usb:v138Ap0017*
+usb:v138Ap0018*
+ ID_AUTOSUSPEND=1
+
+# Supported by libfprint driver aes3500
+usb:v08FFp5731*
+ ID_AUTOSUSPEND=1
+
+# Supported by libfprint driver aes4000
+usb:v5501p08FF*
+ ID_AUTOSUSPEND=1
+
+# Supported by libfprint driver aes1610
+usb:v08FFp1600*
+ ID_AUTOSUSPEND=1
+
+# Supported by libfprint driver aes1660
+usb:v08FFp1660*
+usb:v08FFp1680*
+usb:v08FFp1681*
+usb:v08FFp1682*
+usb:v08FFp1683*
+usb:v08FFp1684*
+usb:v08FFp1685*
+usb:v08FFp1686*
+usb:v08FFp1687*
+usb:v08FFp1688*
+usb:v08FFp1689*
+usb:v08FFp168A*
+usb:v08FFp168B*
+usb:v08FFp168C*
+usb:v08FFp168D*
+usb:v08FFp168E*
+usb:v08FFp168F*
+ ID_AUTOSUSPEND=1
+
+# Supported by libfprint driver aes2660
+usb:v08FFp2660*
+usb:v08FFp2680*
+usb:v08FFp2681*
+usb:v08FFp2682*
+usb:v08FFp2683*
+usb:v08FFp2684*
+usb:v08FFp2685*
+usb:v08FFp2686*
+usb:v08FFp2687*
+usb:v08FFp2688*
+usb:v08FFp2689*
+usb:v08FFp268A*
+usb:v08FFp268B*
+usb:v08FFp268C*
+usb:v08FFp268D*
+usb:v08FFp268E*
+usb:v08FFp268F*
+usb:v08FFp2691*
+ ID_AUTOSUSPEND=1
+
+# Supported by libfprint driver aes2501
+usb:v08FFp2500*
+usb:v08FFp2580*
+ ID_AUTOSUSPEND=1
+
+# Supported by libfprint driver aes2550
+usb:v08FFp2550*
+usb:v08FFp2810*
+ ID_AUTOSUSPEND=1
+
+# Supported by libfprint driver vfs101
+usb:v138Ap0001*
+ ID_AUTOSUSPEND=1
+
+# Supported by libfprint driver vfs301
+usb:v138Ap0005*
+usb:v138Ap0008*
+ ID_AUTOSUSPEND=1
+
+# Supported by libfprint driver vfs0050
+usb:v138Ap0050*
+ ID_AUTOSUSPEND=1
+
+# Supported by libfprint driver etes603
+usb:v1C7Ap0603*
+ ID_AUTOSUSPEND=1
+
+# Supported by libfprint driver vcom5s
+usb:v061Ap0110*
+ ID_AUTOSUSPEND=1
+
+# Supported by libfprint driver synaptics
+usb:v06CBp00BD*
+usb:v06CBp00E9*
+usb:v06CBp00DF*
+usb:v06CBp00F9*
+usb:v06CBp00FC*
+usb:v06CBp00C2*
+usb:v06CBp00C9*
+usb:v06CBp00E7*
+ ID_AUTOSUSPEND=1
+
+# Supported by libfprint driver elan
+usb:v04F3p0903*
+usb:v04F3p0907*
+usb:v04F3p0C01*
+usb:v04F3p0C02*
+usb:v04F3p0C03*
+usb:v04F3p0C04*
+usb:v04F3p0C05*
+usb:v04F3p0C06*
+usb:v04F3p0C07*
+usb:v04F3p0C08*
+usb:v04F3p0C09*
+usb:v04F3p0C0A*
+usb:v04F3p0C0B*
+usb:v04F3p0C0C*
+usb:v04F3p0C0D*
+usb:v04F3p0C0E*
+usb:v04F3p0C0F*
+usb:v04F3p0C10*
+usb:v04F3p0C11*
+usb:v04F3p0C12*
+usb:v04F3p0C13*
+usb:v04F3p0C14*
+usb:v04F3p0C15*
+usb:v04F3p0C16*
+usb:v04F3p0C17*
+usb:v04F3p0C18*
+usb:v04F3p0C19*
+usb:v04F3p0C1A*
+usb:v04F3p0C1B*
+usb:v04F3p0C1C*
+usb:v04F3p0C1D*
+usb:v04F3p0C1E*
+usb:v04F3p0C1F*
+usb:v04F3p0C20*
+usb:v04F3p0C21*
+usb:v04F3p0C22*
+usb:v04F3p0C23*
+usb:v04F3p0C24*
+usb:v04F3p0C25*
+usb:v04F3p0C26*
+usb:v04F3p0C27*
+usb:v04F3p0C28*
+usb:v04F3p0C29*
+usb:v04F3p0C2A*
+usb:v04F3p0C2B*
+usb:v04F3p0C2C*
+usb:v04F3p0C2D*
+usb:v04F3p0C2E*
+usb:v04F3p0C2F*
+usb:v04F3p0C30*
+usb:v04F3p0C31*
+usb:v04F3p0C32*
+usb:v04F3p0C33*
+usb:v04F3p0C42*
+usb:v04F3p0C4D*
+ ID_AUTOSUSPEND=1
+
+# Supported by libfprint driver uru4000
+usb:v045Ep00BC*
+usb:v045Ep00BD*
+usb:v045Ep00CA*
+usb:v05BAp0007*
+usb:v05BAp0008*
+usb:v05BAp000A*
+ ID_AUTOSUSPEND=1
+
+# Supported by libfprint driver upektc
+usb:v0483p2015*
+usb:v147Ep3001*
+ ID_AUTOSUSPEND=1
+
+# Supported by libfprint driver upeksonly
+usb:v147Ep1000*
+usb:v147Ep1001*
+ ID_AUTOSUSPEND=1
+
+# Supported by libfprint driver goodixmoc
+usb:v27C6p5840*
+usb:v27C6p6496*
+usb:v27C6p60A2*
+usb:v27C6p63AC*
+usb:v27C6p639C*
+ ID_AUTOSUSPEND=1
+
+# Known unsupported devices
+usb:v04F3p036B*
+usb:v04F3p0C00*
+usb:v04F3p0C4B*
+usb:v04F3p0C4C*
+usb:v04F3p0C4F*
+usb:v04F3p0C57*
+usb:v04F3p2706*
+usb:v06CBp0081*
+usb:v06CBp0088*
+usb:v06CBp008A*
+usb:v06CBp009A*
+usb:v06CBp009B*
+usb:v06CBp00A2*
+usb:v06CBp00B7*
+usb:v06CBp00BB*
+usb:v06CBp00BE*
+usb:v06CBp00CB*
+usb:v06CBp00D8*
+usb:v06CBp00DA*
+usb:v0A5Cp5801*
+usb:v0A5Cp5805*
+usb:v0A5Cp5834*
+usb:v0A5Cp5843*
+usb:v10A5p0007*
+usb:v1188p9545*
+usb:v138Ap0007*
+usb:v138Ap003A*
+usb:v138Ap003C*
+usb:v138Ap003D*
+usb:v138Ap003F*
+usb:v138Ap0090*
+usb:v138Ap0091*
+usb:v138Ap0092*
+usb:v138Ap0094*
+usb:v138Ap0097*
+usb:v138Ap009D*
+usb:v138Ap00AB*
+usb:v147Ep1002*
+usb:v1491p0088*
+usb:v16D1p1027*
+usb:v1C7Ap0300*
+usb:v1C7Ap0570*
+usb:v1C7Ap0575*
+usb:v27C6p5042*
+usb:v27C6p5110*
+usb:v27C6p5117*
+usb:v27C6p5201*
+usb:v27C6p521D*
+usb:v27C6p5301*
+usb:v27C6p530C*
+usb:v27C6p532D*
+usb:v27C6p533C*
+usb:v27C6p5381*
+usb:v27C6p5385*
+usb:v27C6p538C*
+usb:v27C6p538D*
+usb:v27C6p5395*
+usb:v27C6p5584*
+usb:v27C6p55A2*
+usb:v27C6p55A4*
+usb:v27C6p55B4*
+usb:v27C6p5740*
+usb:v2808p9338*
+usb:v298Dp2033*
+usb:v3538p0930*
+ ID_AUTOSUSPEND=1
diff --git a/data/meson.build b/data/meson.build
new file mode 100644
index 0000000..975c1c3
--- /dev/null
+++ b/data/meson.build
@@ -0,0 +1,9 @@
+if get_option('udev_rules')
+ # This file has to be updated using
+ # ninja -C <builddir> libfprint/sync-udev-hwdb
+
+ install_data('autosuspend.hwdb',
+ rename: '60-autosuspend-@0@.hwdb'.format(meson.project_name()),
+ install_dir: udev_hwdb_dir,
+ )
+endif
diff --git a/libfprint/fprint-list-udev-hwdb.c b/libfprint/fprint-list-udev-hwdb.c
index b687085..630be0f 100644
--- a/libfprint/fprint-list-udev-hwdb.c
+++ b/libfprint/fprint-list-udev-hwdb.c
@@ -168,8 +168,13 @@ int
main (int argc, char **argv)
{
g_autoptr(GArray) drivers = fpi_get_driver_types ();
+ g_autofree char *program_name = NULL;
guint i;
+ program_name = g_path_get_basename (argv[0]);
+ g_print ("# This file has been generated using %s with all drivers enabled\n",
+ program_name);
+
printed = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, NULL);
for (i = 0; i < drivers->len; i++)
diff --git a/libfprint/meson.build b/libfprint/meson.build
index abf2fb9..110c458 100644
--- a/libfprint/meson.build
+++ b/libfprint/meson.build
@@ -301,16 +301,24 @@ udev_hwdb = executable('fprint-list-udev-hwdb',
link_with: libfprint_drivers,
install: false)
-# We always build this file; primarily so that systemd can pull it
-# from the artefacts!
-custom_target('udev-rules',
- output: '60-autosuspend-@0@.hwdb'.format(meson.project_name()),
+udev_hwdb_generator = custom_target('udev-hwdb',
+ output: 'autosuspend.hwdb',
+ depend_files: drivers_sources,
capture: true,
command: [ udev_hwdb ],
- install: get_option('udev_rules'),
- install_dir: udev_hwdb_dir,
- build_by_default: true
- )
+ install: false,
+)
+
+custom_target('sync-udev-hwdb',
+ depends: udev_hwdb_generator,
+ output: 'sync-udev-hwdb',
+ install: false,
+ command: [
+ 'cp', '-v',
+ udev_hwdb_generator.full_path(),
+ meson.source_root() / 'data'
+ ]
+)
supported_devices = executable('fprint-list-supported-devices',
'fprint-list-supported-devices.c',
diff --git a/meson.build b/meson.build
index db619d7..415f27e 100644
--- a/meson.build
+++ b/meson.build
@@ -136,6 +136,18 @@ if drivers.length() == 0 or drivers[0] == ''
error('Cannot build libfprint without drivers, please specify a valid value for the drivers option')
endif
+if drivers == all_drivers or drivers == default_drivers
+ default_drivers_are_enabled = true
+else
+ default_drivers_are_enabled = true
+ foreach driver: default_drivers
+ if driver not in drivers
+ default_drivers_are_enabled = false
+ break
+ endif
+ endforeach
+endif
+
nss_dep = dependency('', required: false)
imaging_dep = dependency('', required: false)
libfprint_conf.set10('HAVE_PIXMAN', false)
diff --git a/tests/meson.build b/tests/meson.build
index 4ebf3b7..8e24980 100644
--- a/tests/meson.build
+++ b/tests/meson.build
@@ -5,6 +5,7 @@ envs.set('G_MESSAGES_DEBUG', 'all')
# Setup paths
envs.set('MESON_SOURCE_ROOT', meson.source_root())
+envs.set('MESON_BUILD_ROOT', meson.build_root())
envs.prepend('LD_LIBRARY_PATH', join_paths(meson.build_root(), 'libfprint'))
# Set FP_DEVICE_EMULATION so that drivers can adapt (e.g. to use fixed
@@ -170,8 +171,10 @@ foreach test_name: unit_tests
endforeach
# Run udev rule generator with fatal warnings
+envs.set('UDEV_HWDB', udev_hwdb.full_path())
+envs.set('UDEV_HWDB_CHECK_CONTENTS', default_drivers_are_enabled ? '1' : '0')
test('udev-hwdb',
- udev_hwdb,
+ find_program('test-generated-hwdb.sh'),
env: envs)
gdb = find_program('gdb', required: false)
diff --git a/tests/test-generated-hwdb.sh b/tests/test-generated-hwdb.sh
new file mode 100755
index 0000000..34209cb
--- /dev/null
+++ b/tests/test-generated-hwdb.sh
@@ -0,0 +1,24 @@
+#!/usr/bin/env bash
+set -e
+
+[ -x "$UDEV_HWDB" ] || exit 1
+
+if [ "$UDEV_HWDB_CHECK_CONTENTS" == 1 ]; then
+ generated_rules=$(mktemp "${TMPDIR:-/tmp}/libfprint-XXXXXX.hwdb")
+else
+ generated_rules=/dev/null
+fi
+
+$UDEV_HWDB > "$generated_rules"
+
+if [ "$UDEV_HWDB_CHECK_CONTENTS" != 1 ]; then
+ exit 77
+fi
+
+if ! cmp "$MESON_SOURCE_ROOT/data/autosuspend.hwdb" "$generated_rules"; then
+ echo "E: Autosuspend file needs to be re-generated!"
+ echo " ninja -C $MESON_BUILD_ROOT libfprint/sync-udev-hwdb"
+ exit 1
+fi
+
+rm "$generated_rules"
@@ -1,42 +0,0 @@
From: Didier Raboud <odyx@debian.org>
Date: Wed, 2 Dec 2020 04:57:32 +0100
Subject: Tweak the udev rules creator for Debian usage
List all devices; automatic power/control only for the non-blacklisted
ones; mode and group to all.
Author: Didier Raboud <odyx@debian.org>
Author: Sebastien Bacher <seb128@ubuntu.com>
Origin: vendor
Last-Update: 2020-01-10
---
libfprint/fprint-list-udev-rules.c | 9 ++++-----
1 file changed, 4 insertions(+), 5 deletions(-)
diff --git a/libfprint/fprint-list-udev-rules.c b/libfprint/fprint-list-udev-rules.c
index d6c884c..3b6f572 100644
--- a/libfprint/fprint-list-udev-rules.c
+++ b/libfprint/fprint-list-udev-rules.c
@@ -133,9 +133,6 @@ print_driver (const FpDeviceClass *cls)
if (entry->vid == bl_entry->vid && entry->pid == bl_entry->pid)
break;
- if (bl_entry->vid != 0)
- continue;
-
key = g_strdup_printf ("%04x:%04x", entry->vid, entry->pid);
if (g_hash_table_lookup (printed, key) != NULL)
@@ -149,8 +146,10 @@ print_driver (const FpDeviceClass *cls)
if (num_printed == 0)
g_print ("# %s\n", cls->full_name);
- g_print ("SUBSYSTEM==\"usb\", ATTRS{idVendor}==\"%04x\", ATTRS{idProduct}==\"%04x\", ATTRS{dev}==\"*\", TEST==\"power/control\", ATTR{power/control}=\"auto\"\n",
- entry->vid, entry->pid);
+ g_print ("SUBSYSTEM==\"usb\", ATTRS{idVendor}==\"%04x\", ATTRS{idProduct}==\"%04x\", ATTRS{dev}==\"*\", ", entry->vid, entry->pid);
+ if (bl_entry->vid == 0)
+ g_print ("TEST==\"power/control\", ATTR{power/control}=\"auto\", ");
+ g_print ("MODE=\"0660\", GROUP=\"plugdev\"\n");
g_print ("SUBSYSTEM==\"usb\", ATTRS{idVendor}==\"%04x\", ATTRS{idProduct}==\"%04x\", ENV{LIBFPRINT_DRIVER}=\"%s\"\n",
entry->vid, entry->pid, cls->full_name);
num_printed++;
@@ -1,629 +0,0 @@
From: =?utf-8?b?Ik1hcmNvIFRyZXZpc2FuIChUcmV2acOxbyki?= <mail@3v1n0.net>
Date: Wed, 20 Jan 2021 20:02:05 +0100
Subject: data: Use auto-generated but hardcoded autosuspend rules file
This solves various problems:
1. It stays the same also if some drivers have been disabled
2. It is still checked for its validity by tests
3. It can be auto-generated using a simple command
Based on: https://gitlab.freedesktop.org/libfprint/libfprint/-/commit/533180a2
---
data/autosuspend.rules | 445 +++++++++++++++++++++++++++++++++++++
data/meson.build | 9 +
libfprint/fprint-list-udev-rules.c | 5 +
libfprint/meson.build | 26 ++-
meson.build | 13 ++
tests/meson.build | 5 +-
tests/test-generated-rules.sh | 24 ++
7 files changed, 518 insertions(+), 9 deletions(-)
create mode 100644 data/autosuspend.rules
create mode 100644 data/meson.build
create mode 100755 tests/test-generated-rules.sh
diff --git a/data/autosuspend.rules b/data/autosuspend.rules
new file mode 100644
index 0000000..c87d3d1
--- /dev/null
+++ b/data/autosuspend.rules
@@ -0,0 +1,445 @@
+# This file has been generated using fprint-list-udev-rules with all drivers enabled
+# Upek TouchChip Fingerprint Coprocessor
+SUBSYSTEM=="usb", ATTRS{idVendor}=="147e", ATTRS{idProduct}=="2016", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="147e", ATTRS{idProduct}=="2016", ENV{LIBFPRINT_DRIVER}="Upek TouchChip Fingerprint Coprocessor"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="147e", ATTRS{idProduct}=="2020", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="147e", ATTRS{idProduct}=="2020", ENV{LIBFPRINT_DRIVER}="Upek TouchChip Fingerprint Coprocessor"
+
+# Validity VFS5011
+SUBSYSTEM=="usb", ATTRS{idVendor}=="138a", ATTRS{idProduct}=="0010", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="138a", ATTRS{idProduct}=="0010", ENV{LIBFPRINT_DRIVER}="Validity VFS5011"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="138a", ATTRS{idProduct}=="0011", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="138a", ATTRS{idProduct}=="0011", ENV{LIBFPRINT_DRIVER}="Validity VFS5011"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="138a", ATTRS{idProduct}=="0015", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="138a", ATTRS{idProduct}=="0015", ENV{LIBFPRINT_DRIVER}="Validity VFS5011"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="138a", ATTRS{idProduct}=="0017", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="138a", ATTRS{idProduct}=="0017", ENV{LIBFPRINT_DRIVER}="Validity VFS5011"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="138a", ATTRS{idProduct}=="0018", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="138a", ATTRS{idProduct}=="0018", ENV{LIBFPRINT_DRIVER}="Validity VFS5011"
+
+# AuthenTec AES3500
+SUBSYSTEM=="usb", ATTRS{idVendor}=="08ff", ATTRS{idProduct}=="5731", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="08ff", ATTRS{idProduct}=="5731", ENV{LIBFPRINT_DRIVER}="AuthenTec AES3500"
+
+# AuthenTec AES4000
+SUBSYSTEM=="usb", ATTRS{idVendor}=="5501", ATTRS{idProduct}=="08ff", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="5501", ATTRS{idProduct}=="08ff", ENV{LIBFPRINT_DRIVER}="AuthenTec AES4000"
+
+# AuthenTec AES1610
+SUBSYSTEM=="usb", ATTRS{idVendor}=="08ff", ATTRS{idProduct}=="1600", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="08ff", ATTRS{idProduct}=="1600", ENV{LIBFPRINT_DRIVER}="AuthenTec AES1610"
+
+# AuthenTec AES1660
+SUBSYSTEM=="usb", ATTRS{idVendor}=="08ff", ATTRS{idProduct}=="1660", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="08ff", ATTRS{idProduct}=="1660", ENV{LIBFPRINT_DRIVER}="AuthenTec AES1660"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="08ff", ATTRS{idProduct}=="1680", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="08ff", ATTRS{idProduct}=="1680", ENV{LIBFPRINT_DRIVER}="AuthenTec AES1660"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="08ff", ATTRS{idProduct}=="1681", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="08ff", ATTRS{idProduct}=="1681", ENV{LIBFPRINT_DRIVER}="AuthenTec AES1660"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="08ff", ATTRS{idProduct}=="1682", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="08ff", ATTRS{idProduct}=="1682", ENV{LIBFPRINT_DRIVER}="AuthenTec AES1660"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="08ff", ATTRS{idProduct}=="1683", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="08ff", ATTRS{idProduct}=="1683", ENV{LIBFPRINT_DRIVER}="AuthenTec AES1660"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="08ff", ATTRS{idProduct}=="1684", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="08ff", ATTRS{idProduct}=="1684", ENV{LIBFPRINT_DRIVER}="AuthenTec AES1660"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="08ff", ATTRS{idProduct}=="1685", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="08ff", ATTRS{idProduct}=="1685", ENV{LIBFPRINT_DRIVER}="AuthenTec AES1660"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="08ff", ATTRS{idProduct}=="1686", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="08ff", ATTRS{idProduct}=="1686", ENV{LIBFPRINT_DRIVER}="AuthenTec AES1660"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="08ff", ATTRS{idProduct}=="1687", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="08ff", ATTRS{idProduct}=="1687", ENV{LIBFPRINT_DRIVER}="AuthenTec AES1660"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="08ff", ATTRS{idProduct}=="1688", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="08ff", ATTRS{idProduct}=="1688", ENV{LIBFPRINT_DRIVER}="AuthenTec AES1660"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="08ff", ATTRS{idProduct}=="1689", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="08ff", ATTRS{idProduct}=="1689", ENV{LIBFPRINT_DRIVER}="AuthenTec AES1660"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="08ff", ATTRS{idProduct}=="168a", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="08ff", ATTRS{idProduct}=="168a", ENV{LIBFPRINT_DRIVER}="AuthenTec AES1660"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="08ff", ATTRS{idProduct}=="168b", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="08ff", ATTRS{idProduct}=="168b", ENV{LIBFPRINT_DRIVER}="AuthenTec AES1660"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="08ff", ATTRS{idProduct}=="168c", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="08ff", ATTRS{idProduct}=="168c", ENV{LIBFPRINT_DRIVER}="AuthenTec AES1660"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="08ff", ATTRS{idProduct}=="168d", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="08ff", ATTRS{idProduct}=="168d", ENV{LIBFPRINT_DRIVER}="AuthenTec AES1660"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="08ff", ATTRS{idProduct}=="168e", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="08ff", ATTRS{idProduct}=="168e", ENV{LIBFPRINT_DRIVER}="AuthenTec AES1660"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="08ff", ATTRS{idProduct}=="168f", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="08ff", ATTRS{idProduct}=="168f", ENV{LIBFPRINT_DRIVER}="AuthenTec AES1660"
+
+# AuthenTec AES2660
+SUBSYSTEM=="usb", ATTRS{idVendor}=="08ff", ATTRS{idProduct}=="2660", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="08ff", ATTRS{idProduct}=="2660", ENV{LIBFPRINT_DRIVER}="AuthenTec AES2660"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="08ff", ATTRS{idProduct}=="2680", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="08ff", ATTRS{idProduct}=="2680", ENV{LIBFPRINT_DRIVER}="AuthenTec AES2660"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="08ff", ATTRS{idProduct}=="2681", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="08ff", ATTRS{idProduct}=="2681", ENV{LIBFPRINT_DRIVER}="AuthenTec AES2660"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="08ff", ATTRS{idProduct}=="2682", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="08ff", ATTRS{idProduct}=="2682", ENV{LIBFPRINT_DRIVER}="AuthenTec AES2660"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="08ff", ATTRS{idProduct}=="2683", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="08ff", ATTRS{idProduct}=="2683", ENV{LIBFPRINT_DRIVER}="AuthenTec AES2660"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="08ff", ATTRS{idProduct}=="2684", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="08ff", ATTRS{idProduct}=="2684", ENV{LIBFPRINT_DRIVER}="AuthenTec AES2660"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="08ff", ATTRS{idProduct}=="2685", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="08ff", ATTRS{idProduct}=="2685", ENV{LIBFPRINT_DRIVER}="AuthenTec AES2660"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="08ff", ATTRS{idProduct}=="2686", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="08ff", ATTRS{idProduct}=="2686", ENV{LIBFPRINT_DRIVER}="AuthenTec AES2660"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="08ff", ATTRS{idProduct}=="2687", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="08ff", ATTRS{idProduct}=="2687", ENV{LIBFPRINT_DRIVER}="AuthenTec AES2660"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="08ff", ATTRS{idProduct}=="2688", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="08ff", ATTRS{idProduct}=="2688", ENV{LIBFPRINT_DRIVER}="AuthenTec AES2660"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="08ff", ATTRS{idProduct}=="2689", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="08ff", ATTRS{idProduct}=="2689", ENV{LIBFPRINT_DRIVER}="AuthenTec AES2660"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="08ff", ATTRS{idProduct}=="268a", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="08ff", ATTRS{idProduct}=="268a", ENV{LIBFPRINT_DRIVER}="AuthenTec AES2660"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="08ff", ATTRS{idProduct}=="268b", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="08ff", ATTRS{idProduct}=="268b", ENV{LIBFPRINT_DRIVER}="AuthenTec AES2660"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="08ff", ATTRS{idProduct}=="268c", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="08ff", ATTRS{idProduct}=="268c", ENV{LIBFPRINT_DRIVER}="AuthenTec AES2660"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="08ff", ATTRS{idProduct}=="268d", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="08ff", ATTRS{idProduct}=="268d", ENV{LIBFPRINT_DRIVER}="AuthenTec AES2660"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="08ff", ATTRS{idProduct}=="268e", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="08ff", ATTRS{idProduct}=="268e", ENV{LIBFPRINT_DRIVER}="AuthenTec AES2660"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="08ff", ATTRS{idProduct}=="268f", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="08ff", ATTRS{idProduct}=="268f", ENV{LIBFPRINT_DRIVER}="AuthenTec AES2660"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="08ff", ATTRS{idProduct}=="2691", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="08ff", ATTRS{idProduct}=="2691", ENV{LIBFPRINT_DRIVER}="AuthenTec AES2660"
+
+# AuthenTec AES2501
+SUBSYSTEM=="usb", ATTRS{idVendor}=="08ff", ATTRS{idProduct}=="2500", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="08ff", ATTRS{idProduct}=="2500", ENV{LIBFPRINT_DRIVER}="AuthenTec AES2501"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="08ff", ATTRS{idProduct}=="2580", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="08ff", ATTRS{idProduct}=="2580", ENV{LIBFPRINT_DRIVER}="AuthenTec AES2501"
+
+# AuthenTec AES2550/AES2810
+SUBSYSTEM=="usb", ATTRS{idVendor}=="08ff", ATTRS{idProduct}=="2550", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="08ff", ATTRS{idProduct}=="2550", ENV{LIBFPRINT_DRIVER}="AuthenTec AES2550/AES2810"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="08ff", ATTRS{idProduct}=="2810", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="08ff", ATTRS{idProduct}=="2810", ENV{LIBFPRINT_DRIVER}="AuthenTec AES2550/AES2810"
+
+# Validity VFS101
+SUBSYSTEM=="usb", ATTRS{idVendor}=="138a", ATTRS{idProduct}=="0001", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="138a", ATTRS{idProduct}=="0001", ENV{LIBFPRINT_DRIVER}="Validity VFS101"
+
+# Validity VFS301
+SUBSYSTEM=="usb", ATTRS{idVendor}=="138a", ATTRS{idProduct}=="0005", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="138a", ATTRS{idProduct}=="0005", ENV{LIBFPRINT_DRIVER}="Validity VFS301"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="138a", ATTRS{idProduct}=="0008", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="138a", ATTRS{idProduct}=="0008", ENV{LIBFPRINT_DRIVER}="Validity VFS301"
+
+# Validity VFS0050
+SUBSYSTEM=="usb", ATTRS{idVendor}=="138a", ATTRS{idProduct}=="0050", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="138a", ATTRS{idProduct}=="0050", ENV{LIBFPRINT_DRIVER}="Validity VFS0050"
+
+# EgisTec ES603
+SUBSYSTEM=="usb", ATTRS{idVendor}=="1c7a", ATTRS{idProduct}=="0603", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="1c7a", ATTRS{idProduct}=="0603", ENV{LIBFPRINT_DRIVER}="EgisTec ES603"
+
+# Veridicom 5thSense
+SUBSYSTEM=="usb", ATTRS{idVendor}=="061a", ATTRS{idProduct}=="0110", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="061a", ATTRS{idProduct}=="0110", ENV{LIBFPRINT_DRIVER}="Veridicom 5thSense"
+
+# Synaptics Sensors
+SUBSYSTEM=="usb", ATTRS{idVendor}=="06cb", ATTRS{idProduct}=="00bd", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="06cb", ATTRS{idProduct}=="00bd", ENV{LIBFPRINT_DRIVER}="Synaptics Sensors"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="06cb", ATTRS{idProduct}=="00e9", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="06cb", ATTRS{idProduct}=="00e9", ENV{LIBFPRINT_DRIVER}="Synaptics Sensors"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="06cb", ATTRS{idProduct}=="00df", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="06cb", ATTRS{idProduct}=="00df", ENV{LIBFPRINT_DRIVER}="Synaptics Sensors"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="06cb", ATTRS{idProduct}=="00f9", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="06cb", ATTRS{idProduct}=="00f9", ENV{LIBFPRINT_DRIVER}="Synaptics Sensors"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="06cb", ATTRS{idProduct}=="00fc", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="06cb", ATTRS{idProduct}=="00fc", ENV{LIBFPRINT_DRIVER}="Synaptics Sensors"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="06cb", ATTRS{idProduct}=="00c2", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="06cb", ATTRS{idProduct}=="00c2", ENV{LIBFPRINT_DRIVER}="Synaptics Sensors"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="06cb", ATTRS{idProduct}=="00c9", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="06cb", ATTRS{idProduct}=="00c9", ENV{LIBFPRINT_DRIVER}="Synaptics Sensors"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="06cb", ATTRS{idProduct}=="00e7", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="06cb", ATTRS{idProduct}=="00e7", ENV{LIBFPRINT_DRIVER}="Synaptics Sensors"
+
+# ElanTech Fingerprint Sensor
+SUBSYSTEM=="usb", ATTRS{idVendor}=="04f3", ATTRS{idProduct}=="0903", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="04f3", ATTRS{idProduct}=="0903", ENV{LIBFPRINT_DRIVER}="ElanTech Fingerprint Sensor"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="04f3", ATTRS{idProduct}=="0907", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="04f3", ATTRS{idProduct}=="0907", ENV{LIBFPRINT_DRIVER}="ElanTech Fingerprint Sensor"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="04f3", ATTRS{idProduct}=="0c01", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="04f3", ATTRS{idProduct}=="0c01", ENV{LIBFPRINT_DRIVER}="ElanTech Fingerprint Sensor"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="04f3", ATTRS{idProduct}=="0c02", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="04f3", ATTRS{idProduct}=="0c02", ENV{LIBFPRINT_DRIVER}="ElanTech Fingerprint Sensor"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="04f3", ATTRS{idProduct}=="0c03", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="04f3", ATTRS{idProduct}=="0c03", ENV{LIBFPRINT_DRIVER}="ElanTech Fingerprint Sensor"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="04f3", ATTRS{idProduct}=="0c04", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="04f3", ATTRS{idProduct}=="0c04", ENV{LIBFPRINT_DRIVER}="ElanTech Fingerprint Sensor"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="04f3", ATTRS{idProduct}=="0c05", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="04f3", ATTRS{idProduct}=="0c05", ENV{LIBFPRINT_DRIVER}="ElanTech Fingerprint Sensor"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="04f3", ATTRS{idProduct}=="0c06", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="04f3", ATTRS{idProduct}=="0c06", ENV{LIBFPRINT_DRIVER}="ElanTech Fingerprint Sensor"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="04f3", ATTRS{idProduct}=="0c07", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="04f3", ATTRS{idProduct}=="0c07", ENV{LIBFPRINT_DRIVER}="ElanTech Fingerprint Sensor"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="04f3", ATTRS{idProduct}=="0c08", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="04f3", ATTRS{idProduct}=="0c08", ENV{LIBFPRINT_DRIVER}="ElanTech Fingerprint Sensor"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="04f3", ATTRS{idProduct}=="0c09", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="04f3", ATTRS{idProduct}=="0c09", ENV{LIBFPRINT_DRIVER}="ElanTech Fingerprint Sensor"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="04f3", ATTRS{idProduct}=="0c0a", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="04f3", ATTRS{idProduct}=="0c0a", ENV{LIBFPRINT_DRIVER}="ElanTech Fingerprint Sensor"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="04f3", ATTRS{idProduct}=="0c0b", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="04f3", ATTRS{idProduct}=="0c0b", ENV{LIBFPRINT_DRIVER}="ElanTech Fingerprint Sensor"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="04f3", ATTRS{idProduct}=="0c0c", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="04f3", ATTRS{idProduct}=="0c0c", ENV{LIBFPRINT_DRIVER}="ElanTech Fingerprint Sensor"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="04f3", ATTRS{idProduct}=="0c0d", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="04f3", ATTRS{idProduct}=="0c0d", ENV{LIBFPRINT_DRIVER}="ElanTech Fingerprint Sensor"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="04f3", ATTRS{idProduct}=="0c0e", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="04f3", ATTRS{idProduct}=="0c0e", ENV{LIBFPRINT_DRIVER}="ElanTech Fingerprint Sensor"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="04f3", ATTRS{idProduct}=="0c0f", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="04f3", ATTRS{idProduct}=="0c0f", ENV{LIBFPRINT_DRIVER}="ElanTech Fingerprint Sensor"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="04f3", ATTRS{idProduct}=="0c10", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="04f3", ATTRS{idProduct}=="0c10", ENV{LIBFPRINT_DRIVER}="ElanTech Fingerprint Sensor"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="04f3", ATTRS{idProduct}=="0c11", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="04f3", ATTRS{idProduct}=="0c11", ENV{LIBFPRINT_DRIVER}="ElanTech Fingerprint Sensor"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="04f3", ATTRS{idProduct}=="0c12", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="04f3", ATTRS{idProduct}=="0c12", ENV{LIBFPRINT_DRIVER}="ElanTech Fingerprint Sensor"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="04f3", ATTRS{idProduct}=="0c13", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="04f3", ATTRS{idProduct}=="0c13", ENV{LIBFPRINT_DRIVER}="ElanTech Fingerprint Sensor"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="04f3", ATTRS{idProduct}=="0c14", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="04f3", ATTRS{idProduct}=="0c14", ENV{LIBFPRINT_DRIVER}="ElanTech Fingerprint Sensor"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="04f3", ATTRS{idProduct}=="0c15", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="04f3", ATTRS{idProduct}=="0c15", ENV{LIBFPRINT_DRIVER}="ElanTech Fingerprint Sensor"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="04f3", ATTRS{idProduct}=="0c16", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="04f3", ATTRS{idProduct}=="0c16", ENV{LIBFPRINT_DRIVER}="ElanTech Fingerprint Sensor"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="04f3", ATTRS{idProduct}=="0c17", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="04f3", ATTRS{idProduct}=="0c17", ENV{LIBFPRINT_DRIVER}="ElanTech Fingerprint Sensor"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="04f3", ATTRS{idProduct}=="0c18", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="04f3", ATTRS{idProduct}=="0c18", ENV{LIBFPRINT_DRIVER}="ElanTech Fingerprint Sensor"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="04f3", ATTRS{idProduct}=="0c19", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="04f3", ATTRS{idProduct}=="0c19", ENV{LIBFPRINT_DRIVER}="ElanTech Fingerprint Sensor"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="04f3", ATTRS{idProduct}=="0c1a", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="04f3", ATTRS{idProduct}=="0c1a", ENV{LIBFPRINT_DRIVER}="ElanTech Fingerprint Sensor"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="04f3", ATTRS{idProduct}=="0c1b", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="04f3", ATTRS{idProduct}=="0c1b", ENV{LIBFPRINT_DRIVER}="ElanTech Fingerprint Sensor"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="04f3", ATTRS{idProduct}=="0c1c", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="04f3", ATTRS{idProduct}=="0c1c", ENV{LIBFPRINT_DRIVER}="ElanTech Fingerprint Sensor"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="04f3", ATTRS{idProduct}=="0c1d", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="04f3", ATTRS{idProduct}=="0c1d", ENV{LIBFPRINT_DRIVER}="ElanTech Fingerprint Sensor"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="04f3", ATTRS{idProduct}=="0c1e", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="04f3", ATTRS{idProduct}=="0c1e", ENV{LIBFPRINT_DRIVER}="ElanTech Fingerprint Sensor"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="04f3", ATTRS{idProduct}=="0c1f", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="04f3", ATTRS{idProduct}=="0c1f", ENV{LIBFPRINT_DRIVER}="ElanTech Fingerprint Sensor"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="04f3", ATTRS{idProduct}=="0c20", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="04f3", ATTRS{idProduct}=="0c20", ENV{LIBFPRINT_DRIVER}="ElanTech Fingerprint Sensor"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="04f3", ATTRS{idProduct}=="0c21", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="04f3", ATTRS{idProduct}=="0c21", ENV{LIBFPRINT_DRIVER}="ElanTech Fingerprint Sensor"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="04f3", ATTRS{idProduct}=="0c22", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="04f3", ATTRS{idProduct}=="0c22", ENV{LIBFPRINT_DRIVER}="ElanTech Fingerprint Sensor"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="04f3", ATTRS{idProduct}=="0c23", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="04f3", ATTRS{idProduct}=="0c23", ENV{LIBFPRINT_DRIVER}="ElanTech Fingerprint Sensor"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="04f3", ATTRS{idProduct}=="0c24", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="04f3", ATTRS{idProduct}=="0c24", ENV{LIBFPRINT_DRIVER}="ElanTech Fingerprint Sensor"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="04f3", ATTRS{idProduct}=="0c25", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="04f3", ATTRS{idProduct}=="0c25", ENV{LIBFPRINT_DRIVER}="ElanTech Fingerprint Sensor"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="04f3", ATTRS{idProduct}=="0c26", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="04f3", ATTRS{idProduct}=="0c26", ENV{LIBFPRINT_DRIVER}="ElanTech Fingerprint Sensor"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="04f3", ATTRS{idProduct}=="0c27", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="04f3", ATTRS{idProduct}=="0c27", ENV{LIBFPRINT_DRIVER}="ElanTech Fingerprint Sensor"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="04f3", ATTRS{idProduct}=="0c28", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="04f3", ATTRS{idProduct}=="0c28", ENV{LIBFPRINT_DRIVER}="ElanTech Fingerprint Sensor"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="04f3", ATTRS{idProduct}=="0c29", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="04f3", ATTRS{idProduct}=="0c29", ENV{LIBFPRINT_DRIVER}="ElanTech Fingerprint Sensor"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="04f3", ATTRS{idProduct}=="0c2a", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="04f3", ATTRS{idProduct}=="0c2a", ENV{LIBFPRINT_DRIVER}="ElanTech Fingerprint Sensor"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="04f3", ATTRS{idProduct}=="0c2b", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="04f3", ATTRS{idProduct}=="0c2b", ENV{LIBFPRINT_DRIVER}="ElanTech Fingerprint Sensor"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="04f3", ATTRS{idProduct}=="0c2c", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="04f3", ATTRS{idProduct}=="0c2c", ENV{LIBFPRINT_DRIVER}="ElanTech Fingerprint Sensor"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="04f3", ATTRS{idProduct}=="0c2d", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="04f3", ATTRS{idProduct}=="0c2d", ENV{LIBFPRINT_DRIVER}="ElanTech Fingerprint Sensor"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="04f3", ATTRS{idProduct}=="0c2e", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="04f3", ATTRS{idProduct}=="0c2e", ENV{LIBFPRINT_DRIVER}="ElanTech Fingerprint Sensor"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="04f3", ATTRS{idProduct}=="0c2f", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="04f3", ATTRS{idProduct}=="0c2f", ENV{LIBFPRINT_DRIVER}="ElanTech Fingerprint Sensor"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="04f3", ATTRS{idProduct}=="0c30", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="04f3", ATTRS{idProduct}=="0c30", ENV{LIBFPRINT_DRIVER}="ElanTech Fingerprint Sensor"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="04f3", ATTRS{idProduct}=="0c31", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="04f3", ATTRS{idProduct}=="0c31", ENV{LIBFPRINT_DRIVER}="ElanTech Fingerprint Sensor"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="04f3", ATTRS{idProduct}=="0c32", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="04f3", ATTRS{idProduct}=="0c32", ENV{LIBFPRINT_DRIVER}="ElanTech Fingerprint Sensor"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="04f3", ATTRS{idProduct}=="0c33", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="04f3", ATTRS{idProduct}=="0c33", ENV{LIBFPRINT_DRIVER}="ElanTech Fingerprint Sensor"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="04f3", ATTRS{idProduct}=="0c42", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="04f3", ATTRS{idProduct}=="0c42", ENV{LIBFPRINT_DRIVER}="ElanTech Fingerprint Sensor"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="04f3", ATTRS{idProduct}=="0c4d", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="04f3", ATTRS{idProduct}=="0c4d", ENV{LIBFPRINT_DRIVER}="ElanTech Fingerprint Sensor"
+
+# Digital Persona U.are.U 4000/4000B/4500
+SUBSYSTEM=="usb", ATTRS{idVendor}=="045e", ATTRS{idProduct}=="00bb", ATTRS{dev}=="*", MODE="0660", GROUP="plugdev"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="045e", ATTRS{idProduct}=="00bb", ENV{LIBFPRINT_DRIVER}="Digital Persona U.are.U 4000/4000B/4500"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="045e", ATTRS{idProduct}=="00bc", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="045e", ATTRS{idProduct}=="00bc", ENV{LIBFPRINT_DRIVER}="Digital Persona U.are.U 4000/4000B/4500"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="045e", ATTRS{idProduct}=="00bd", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="045e", ATTRS{idProduct}=="00bd", ENV{LIBFPRINT_DRIVER}="Digital Persona U.are.U 4000/4000B/4500"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="045e", ATTRS{idProduct}=="00ca", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="045e", ATTRS{idProduct}=="00ca", ENV{LIBFPRINT_DRIVER}="Digital Persona U.are.U 4000/4000B/4500"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="05ba", ATTRS{idProduct}=="0007", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="05ba", ATTRS{idProduct}=="0007", ENV{LIBFPRINT_DRIVER}="Digital Persona U.are.U 4000/4000B/4500"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="05ba", ATTRS{idProduct}=="0008", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="05ba", ATTRS{idProduct}=="0008", ENV{LIBFPRINT_DRIVER}="Digital Persona U.are.U 4000/4000B/4500"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="05ba", ATTRS{idProduct}=="000a", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="05ba", ATTRS{idProduct}=="000a", ENV{LIBFPRINT_DRIVER}="Digital Persona U.are.U 4000/4000B/4500"
+
+# UPEK TouchChip/Eikon Touch 300
+SUBSYSTEM=="usb", ATTRS{idVendor}=="0483", ATTRS{idProduct}=="2015", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="0483", ATTRS{idProduct}=="2015", ENV{LIBFPRINT_DRIVER}="UPEK TouchChip/Eikon Touch 300"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="147e", ATTRS{idProduct}=="3001", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="147e", ATTRS{idProduct}=="3001", ENV{LIBFPRINT_DRIVER}="UPEK TouchChip/Eikon Touch 300"
+
+# UPEK TouchStrip Sensor-Only
+SUBSYSTEM=="usb", ATTRS{idVendor}=="147e", ATTRS{idProduct}=="1000", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="147e", ATTRS{idProduct}=="1000", ENV{LIBFPRINT_DRIVER}="UPEK TouchStrip Sensor-Only"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="147e", ATTRS{idProduct}=="1001", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="147e", ATTRS{idProduct}=="1001", ENV{LIBFPRINT_DRIVER}="UPEK TouchStrip Sensor-Only"
+
+# UPEK TouchStrip
+SUBSYSTEM=="usb", ATTRS{idVendor}=="0483", ATTRS{idProduct}=="2016", ATTRS{dev}=="*", MODE="0660", GROUP="plugdev"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="0483", ATTRS{idProduct}=="2016", ENV{LIBFPRINT_DRIVER}="UPEK TouchStrip"
+
+# Goodix MOC Fingerprint Sensor
+SUBSYSTEM=="usb", ATTRS{idVendor}=="27c6", ATTRS{idProduct}=="5840", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="27c6", ATTRS{idProduct}=="5840", ENV{LIBFPRINT_DRIVER}="Goodix MOC Fingerprint Sensor"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="27c6", ATTRS{idProduct}=="6496", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="27c6", ATTRS{idProduct}=="6496", ENV{LIBFPRINT_DRIVER}="Goodix MOC Fingerprint Sensor"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="27c6", ATTRS{idProduct}=="60a2", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="27c6", ATTRS{idProduct}=="60a2", ENV{LIBFPRINT_DRIVER}="Goodix MOC Fingerprint Sensor"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="27c6", ATTRS{idProduct}=="63ac", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="27c6", ATTRS{idProduct}=="63ac", ENV{LIBFPRINT_DRIVER}="Goodix MOC Fingerprint Sensor"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="27c6", ATTRS{idProduct}=="639c", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="27c6", ATTRS{idProduct}=="639c", ENV{LIBFPRINT_DRIVER}="Goodix MOC Fingerprint Sensor"
+
+# Hardcoded whitelist
+SUBSYSTEM=="usb", ATTRS{idVendor}=="04f3", ATTRS{idProduct}=="036b", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="04f3", ATTRS{idProduct}=="036b", ENV{LIBFPRINT_DRIVER}="Hardcoded whitelist"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="04f3", ATTRS{idProduct}=="0c00", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="04f3", ATTRS{idProduct}=="0c00", ENV{LIBFPRINT_DRIVER}="Hardcoded whitelist"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="04f3", ATTRS{idProduct}=="0c4b", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="04f3", ATTRS{idProduct}=="0c4b", ENV{LIBFPRINT_DRIVER}="Hardcoded whitelist"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="04f3", ATTRS{idProduct}=="0c4c", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="04f3", ATTRS{idProduct}=="0c4c", ENV{LIBFPRINT_DRIVER}="Hardcoded whitelist"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="04f3", ATTRS{idProduct}=="0c4f", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="04f3", ATTRS{idProduct}=="0c4f", ENV{LIBFPRINT_DRIVER}="Hardcoded whitelist"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="04f3", ATTRS{idProduct}=="0c57", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="04f3", ATTRS{idProduct}=="0c57", ENV{LIBFPRINT_DRIVER}="Hardcoded whitelist"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="04f3", ATTRS{idProduct}=="2706", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="04f3", ATTRS{idProduct}=="2706", ENV{LIBFPRINT_DRIVER}="Hardcoded whitelist"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="06cb", ATTRS{idProduct}=="0081", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="06cb", ATTRS{idProduct}=="0081", ENV{LIBFPRINT_DRIVER}="Hardcoded whitelist"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="06cb", ATTRS{idProduct}=="0088", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="06cb", ATTRS{idProduct}=="0088", ENV{LIBFPRINT_DRIVER}="Hardcoded whitelist"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="06cb", ATTRS{idProduct}=="008a", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="06cb", ATTRS{idProduct}=="008a", ENV{LIBFPRINT_DRIVER}="Hardcoded whitelist"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="06cb", ATTRS{idProduct}=="009a", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="06cb", ATTRS{idProduct}=="009a", ENV{LIBFPRINT_DRIVER}="Hardcoded whitelist"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="06cb", ATTRS{idProduct}=="009b", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="06cb", ATTRS{idProduct}=="009b", ENV{LIBFPRINT_DRIVER}="Hardcoded whitelist"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="06cb", ATTRS{idProduct}=="00a2", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="06cb", ATTRS{idProduct}=="00a2", ENV{LIBFPRINT_DRIVER}="Hardcoded whitelist"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="06cb", ATTRS{idProduct}=="00b7", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="06cb", ATTRS{idProduct}=="00b7", ENV{LIBFPRINT_DRIVER}="Hardcoded whitelist"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="06cb", ATTRS{idProduct}=="00bb", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="06cb", ATTRS{idProduct}=="00bb", ENV{LIBFPRINT_DRIVER}="Hardcoded whitelist"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="06cb", ATTRS{idProduct}=="00be", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="06cb", ATTRS{idProduct}=="00be", ENV{LIBFPRINT_DRIVER}="Hardcoded whitelist"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="06cb", ATTRS{idProduct}=="00cb", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="06cb", ATTRS{idProduct}=="00cb", ENV{LIBFPRINT_DRIVER}="Hardcoded whitelist"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="06cb", ATTRS{idProduct}=="00d8", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="06cb", ATTRS{idProduct}=="00d8", ENV{LIBFPRINT_DRIVER}="Hardcoded whitelist"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="06cb", ATTRS{idProduct}=="00da", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="06cb", ATTRS{idProduct}=="00da", ENV{LIBFPRINT_DRIVER}="Hardcoded whitelist"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="0a5c", ATTRS{idProduct}=="5801", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="0a5c", ATTRS{idProduct}=="5801", ENV{LIBFPRINT_DRIVER}="Hardcoded whitelist"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="0a5c", ATTRS{idProduct}=="5805", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="0a5c", ATTRS{idProduct}=="5805", ENV{LIBFPRINT_DRIVER}="Hardcoded whitelist"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="0a5c", ATTRS{idProduct}=="5834", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="0a5c", ATTRS{idProduct}=="5834", ENV{LIBFPRINT_DRIVER}="Hardcoded whitelist"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="0a5c", ATTRS{idProduct}=="5843", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="0a5c", ATTRS{idProduct}=="5843", ENV{LIBFPRINT_DRIVER}="Hardcoded whitelist"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="10a5", ATTRS{idProduct}=="0007", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="10a5", ATTRS{idProduct}=="0007", ENV{LIBFPRINT_DRIVER}="Hardcoded whitelist"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="1188", ATTRS{idProduct}=="9545", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="1188", ATTRS{idProduct}=="9545", ENV{LIBFPRINT_DRIVER}="Hardcoded whitelist"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="138a", ATTRS{idProduct}=="0007", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="138a", ATTRS{idProduct}=="0007", ENV{LIBFPRINT_DRIVER}="Hardcoded whitelist"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="138a", ATTRS{idProduct}=="003a", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="138a", ATTRS{idProduct}=="003a", ENV{LIBFPRINT_DRIVER}="Hardcoded whitelist"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="138a", ATTRS{idProduct}=="003c", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="138a", ATTRS{idProduct}=="003c", ENV{LIBFPRINT_DRIVER}="Hardcoded whitelist"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="138a", ATTRS{idProduct}=="003d", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="138a", ATTRS{idProduct}=="003d", ENV{LIBFPRINT_DRIVER}="Hardcoded whitelist"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="138a", ATTRS{idProduct}=="003f", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="138a", ATTRS{idProduct}=="003f", ENV{LIBFPRINT_DRIVER}="Hardcoded whitelist"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="138a", ATTRS{idProduct}=="0090", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="138a", ATTRS{idProduct}=="0090", ENV{LIBFPRINT_DRIVER}="Hardcoded whitelist"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="138a", ATTRS{idProduct}=="0091", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="138a", ATTRS{idProduct}=="0091", ENV{LIBFPRINT_DRIVER}="Hardcoded whitelist"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="138a", ATTRS{idProduct}=="0092", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="138a", ATTRS{idProduct}=="0092", ENV{LIBFPRINT_DRIVER}="Hardcoded whitelist"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="138a", ATTRS{idProduct}=="0094", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="138a", ATTRS{idProduct}=="0094", ENV{LIBFPRINT_DRIVER}="Hardcoded whitelist"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="138a", ATTRS{idProduct}=="0097", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="138a", ATTRS{idProduct}=="0097", ENV{LIBFPRINT_DRIVER}="Hardcoded whitelist"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="138a", ATTRS{idProduct}=="009d", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="138a", ATTRS{idProduct}=="009d", ENV{LIBFPRINT_DRIVER}="Hardcoded whitelist"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="138a", ATTRS{idProduct}=="00ab", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="138a", ATTRS{idProduct}=="00ab", ENV{LIBFPRINT_DRIVER}="Hardcoded whitelist"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="147e", ATTRS{idProduct}=="1002", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="147e", ATTRS{idProduct}=="1002", ENV{LIBFPRINT_DRIVER}="Hardcoded whitelist"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="1491", ATTRS{idProduct}=="0088", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="1491", ATTRS{idProduct}=="0088", ENV{LIBFPRINT_DRIVER}="Hardcoded whitelist"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="16d1", ATTRS{idProduct}=="1027", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="16d1", ATTRS{idProduct}=="1027", ENV{LIBFPRINT_DRIVER}="Hardcoded whitelist"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="1c7a", ATTRS{idProduct}=="0300", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="1c7a", ATTRS{idProduct}=="0300", ENV{LIBFPRINT_DRIVER}="Hardcoded whitelist"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="1c7a", ATTRS{idProduct}=="0570", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="1c7a", ATTRS{idProduct}=="0570", ENV{LIBFPRINT_DRIVER}="Hardcoded whitelist"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="1c7a", ATTRS{idProduct}=="0575", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="1c7a", ATTRS{idProduct}=="0575", ENV{LIBFPRINT_DRIVER}="Hardcoded whitelist"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="27c6", ATTRS{idProduct}=="5042", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="27c6", ATTRS{idProduct}=="5042", ENV{LIBFPRINT_DRIVER}="Hardcoded whitelist"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="27c6", ATTRS{idProduct}=="5110", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="27c6", ATTRS{idProduct}=="5110", ENV{LIBFPRINT_DRIVER}="Hardcoded whitelist"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="27c6", ATTRS{idProduct}=="5117", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="27c6", ATTRS{idProduct}=="5117", ENV{LIBFPRINT_DRIVER}="Hardcoded whitelist"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="27c6", ATTRS{idProduct}=="5201", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="27c6", ATTRS{idProduct}=="5201", ENV{LIBFPRINT_DRIVER}="Hardcoded whitelist"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="27c6", ATTRS{idProduct}=="521d", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="27c6", ATTRS{idProduct}=="521d", ENV{LIBFPRINT_DRIVER}="Hardcoded whitelist"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="27c6", ATTRS{idProduct}=="5301", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="27c6", ATTRS{idProduct}=="5301", ENV{LIBFPRINT_DRIVER}="Hardcoded whitelist"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="27c6", ATTRS{idProduct}=="530c", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="27c6", ATTRS{idProduct}=="530c", ENV{LIBFPRINT_DRIVER}="Hardcoded whitelist"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="27c6", ATTRS{idProduct}=="532d", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="27c6", ATTRS{idProduct}=="532d", ENV{LIBFPRINT_DRIVER}="Hardcoded whitelist"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="27c6", ATTRS{idProduct}=="533c", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="27c6", ATTRS{idProduct}=="533c", ENV{LIBFPRINT_DRIVER}="Hardcoded whitelist"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="27c6", ATTRS{idProduct}=="5381", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="27c6", ATTRS{idProduct}=="5381", ENV{LIBFPRINT_DRIVER}="Hardcoded whitelist"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="27c6", ATTRS{idProduct}=="5385", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="27c6", ATTRS{idProduct}=="5385", ENV{LIBFPRINT_DRIVER}="Hardcoded whitelist"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="27c6", ATTRS{idProduct}=="538c", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="27c6", ATTRS{idProduct}=="538c", ENV{LIBFPRINT_DRIVER}="Hardcoded whitelist"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="27c6", ATTRS{idProduct}=="538d", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="27c6", ATTRS{idProduct}=="538d", ENV{LIBFPRINT_DRIVER}="Hardcoded whitelist"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="27c6", ATTRS{idProduct}=="5395", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="27c6", ATTRS{idProduct}=="5395", ENV{LIBFPRINT_DRIVER}="Hardcoded whitelist"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="27c6", ATTRS{idProduct}=="5584", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="27c6", ATTRS{idProduct}=="5584", ENV{LIBFPRINT_DRIVER}="Hardcoded whitelist"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="27c6", ATTRS{idProduct}=="55a2", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="27c6", ATTRS{idProduct}=="55a2", ENV{LIBFPRINT_DRIVER}="Hardcoded whitelist"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="27c6", ATTRS{idProduct}=="55a4", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="27c6", ATTRS{idProduct}=="55a4", ENV{LIBFPRINT_DRIVER}="Hardcoded whitelist"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="27c6", ATTRS{idProduct}=="55b4", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="27c6", ATTRS{idProduct}=="55b4", ENV{LIBFPRINT_DRIVER}="Hardcoded whitelist"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="27c6", ATTRS{idProduct}=="5740", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="27c6", ATTRS{idProduct}=="5740", ENV{LIBFPRINT_DRIVER}="Hardcoded whitelist"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="2808", ATTRS{idProduct}=="9338", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="2808", ATTRS{idProduct}=="9338", ENV{LIBFPRINT_DRIVER}="Hardcoded whitelist"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="298d", ATTRS{idProduct}=="2033", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="298d", ATTRS{idProduct}=="2033", ENV{LIBFPRINT_DRIVER}="Hardcoded whitelist"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="3538", ATTRS{idProduct}=="0930", ATTRS{dev}=="*", TEST=="power/control", ATTR{power/control}="auto", MODE="0660", GROUP="plugdev"
+SUBSYSTEM=="usb", ATTRS{idVendor}=="3538", ATTRS{idProduct}=="0930", ENV{LIBFPRINT_DRIVER}="Hardcoded whitelist"
+
diff --git a/data/meson.build b/data/meson.build
new file mode 100644
index 0000000..8f79716
--- /dev/null
+++ b/data/meson.build
@@ -0,0 +1,9 @@
+if get_option('udev_rules')
+ # This file has to be updated using
+ # ninja -C <builddir> libfprint/sync-udev-rules
+
+ install_data('autosuspend.rules',
+ rename: '60-@0@-autosuspend.rules'.format(versioned_libname),
+ install_dir: udev_rules_dir,
+ )
+endif
diff --git a/libfprint/fprint-list-udev-rules.c b/libfprint/fprint-list-udev-rules.c
index cba2b2f..3cda912 100644
--- a/libfprint/fprint-list-udev-rules.c
+++ b/libfprint/fprint-list-udev-rules.c
@@ -164,8 +164,13 @@ int
main (int argc, char **argv)
{
g_autoptr(GArray) drivers = fpi_get_driver_types ();
+ g_autofree char *program_name = NULL;
guint i;
+ program_name = g_path_get_basename (argv[0]);
+ g_print ("# This file has been generated using %s with all drivers enabled\n",
+ program_name);
+
printed = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, NULL);
for (i = 0; i < drivers->len; i++)
diff --git a/libfprint/meson.build b/libfprint/meson.build
index 4d1d30c..671a1e5 100644
--- a/libfprint/meson.build
+++ b/libfprint/meson.build
@@ -301,14 +301,24 @@ udev_rules = executable('fprint-list-udev-rules',
link_with: libfprint_drivers,
install: false)
-if get_option('udev_rules')
- custom_target('udev-rules',
- output: '60-@0@-autosuspend.rules'.format(versioned_libname),
- capture: true,
- command: [ udev_rules ],
- install: true,
- install_dir: udev_rules_dir)
-endif
+udev_rules_generator = custom_target('udev-rules',
+ output: 'autosuspend.rules',
+ depend_files: drivers_sources,
+ capture: true,
+ command: [ udev_rules ],
+ install: false,
+)
+
+custom_target('sync-udev-rules',
+ depends: udev_rules_generator,
+ output: 'sync-udev-rules',
+ install: false,
+ command: [
+ 'cp', '-v',
+ udev_rules_generator.full_path(),
+ meson.source_root() / 'data'
+ ]
+)
supported_devices = executable('fprint-list-supported-devices',
'fprint-list-supported-devices.c',
diff --git a/meson.build b/meson.build
index 483f1ec..4c73c00 100644
--- a/meson.build
+++ b/meson.build
@@ -136,6 +136,18 @@ if drivers.length() == 0 or drivers[0] == ''
error('Cannot build libfprint without drivers, please specify a valid value for the drivers option')
endif
+if drivers == all_drivers or drivers == default_drivers
+ default_drivers_are_enabled = true
+else
+ default_drivers_are_enabled = true
+ foreach driver: default_drivers
+ if driver not in drivers
+ default_drivers_are_enabled = false
+ break
+ endif
+ endforeach
+endif
+
nss_dep = dependency('', required: false)
imaging_dep = dependency('', required: false)
libfprint_conf.set10('HAVE_PIXMAN', false)
@@ -223,6 +235,7 @@ if get_option('gtk-examples')
subdir('demo')
endif
+subdir('data')
subdir('tests')
pkgconfig = import('pkgconfig')
diff --git a/tests/meson.build b/tests/meson.build
index 27bdd9f..efcb1cb 100644
--- a/tests/meson.build
+++ b/tests/meson.build
@@ -5,6 +5,7 @@ envs.set('G_MESSAGES_DEBUG', 'all')
# Setup paths
envs.set('MESON_SOURCE_ROOT', meson.source_root())
+envs.set('MESON_BUILD_ROOT', meson.build_root())
envs.prepend('LD_LIBRARY_PATH', join_paths(meson.build_root(), 'libfprint'))
# Set FP_DEVICE_EMULATION so that drivers can adapt (e.g. to use fixed
@@ -170,8 +171,10 @@ foreach test_name: unit_tests
endforeach
# Run udev rule generator with fatal warnings
+envs.set('UDEV_RULES', udev_rules.full_path())
+envs.set('UDEV_RULES_CHECK_CONTENTS', default_drivers_are_enabled ? '1' : '0')
test('udev-rules',
- udev_rules,
+ find_program('test-generated-rules.sh'),
env: envs)
gdb = find_program('gdb', required: false)
diff --git a/tests/test-generated-rules.sh b/tests/test-generated-rules.sh
new file mode 100755
index 0000000..5ba913b
--- /dev/null
+++ b/tests/test-generated-rules.sh
@@ -0,0 +1,24 @@
+#!/usr/bin/env bash
+set -e
+
+[ -x "$UDEV_RULES" ] || exit 1
+
+if [ "$UDEV_RULES_CHECK_CONTENTS" == 1 ]; then
+ generated_rules=$(mktemp "${TMPDIR:-/tmp}/libfprint-XXXXXX.rules")
+else
+ generated_rules=/dev/null
+fi
+
+$UDEV_RULES > "$generated_rules"
+
+if [ "$UDEV_RULES_CHECK_CONTENTS" != 1 ]; then
+ exit 77
+fi
+
+if ! cmp "$MESON_SOURCE_ROOT/data/autosuspend.rules" "$generated_rules"; then
+ echo "E: Autosuspend file needs to be re-generated!"
+ echo " ninja -C $MESON_BUILD_ROOT libfprint/sync-udev-rules"
+ exit 1
+fi
+
+rm "$generated_rules"
+59
View File
@@ -0,0 +1,59 @@
From: Benjamin Berg <bberg@redhat.com>
Date: Tue, 19 Jan 2021 14:19:10 +0100
Subject: meson: Always build hwdb file
We want systemd to pull our hwdb. In order to ease this, always build
the hwdb file, even if it is disabled.
Once systemd has merged the rules, downstream should turn off the rules
in libfprint. The default in libfprint will also be changed to not build
the hwdb (udev_rules option) eventually.
Origin: https://gitlab.freedesktop.org/libfprint/libfprint/-/commit/cbce56c1
---
libfprint/meson.build | 18 ++++++++++--------
meson.build | 2 ++
2 files changed, 12 insertions(+), 8 deletions(-)
diff --git a/libfprint/meson.build b/libfprint/meson.build
index e385ce8..3464bf3 100644
--- a/libfprint/meson.build
+++ b/libfprint/meson.build
@@ -301,14 +301,16 @@ udev_hwdb = executable('fprint-list-udev-hwdb',
link_with: libfprint_drivers,
install: false)
-if get_option('udev_rules')
- custom_target('udev-rules',
- output: '60-autosuspend-@0@.hwdb'.format(versioned_libname),
- capture: true,
- command: [ udev_hwdb ],
- install: true,
- install_dir: udev_hwdb_dir)
-endif
+# We always build this file; primarily so that systemd can pull it
+# from the artefacts!
+custom_target('udev-rules',
+ output: '60-autosuspend-@0@.hwdb'.format(versioned_libname),
+ capture: true,
+ command: [ udev_hwdb ],
+ install: get_option('udev_rules'),
+ install_dir: udev_hwdb_dir,
+ build_by_default: true
+ )
supported_devices = executable('fprint-list-supported-devices',
'fprint-list-supported-devices.c',
diff --git a/meson.build b/meson.build
index ab4ac72..db619d7 100644
--- a/meson.build
+++ b/meson.build
@@ -200,6 +200,8 @@ if get_option('udev_rules')
udev_dep = dependency('udev')
udev_hwdb_dir = udev_dep.get_pkgconfig_variable('udevdir') + '/hwdb.d'
endif
+else
+ udev_hwdb_dir = false
endif
if get_option('gtk-examples')
+6 -2
View File
@@ -1,9 +1,13 @@
debian/Tweak-the-udev-rules-creator-for-Debian-usage.patch
meson-Do-not-support-drivers-known-to-fail-in-Big-Endian-.patch
udev-rules-Print-warning-if-an-ID-is-supported.patch
udev-rules-Remove-supported-synaptics-devices.patch
tests-Add-check-that-no-supported-device-is-whitelisted.patch
udev-hwdb-Prevent-devices-from-being-listed-twice.patch
Generate-a-hwdb-instead-of-udev-rules.patch
meson-Always-build-hwdb-file.patch
Drop-version-from-libfprint-hwdb.patch
data-Use-auto-generated-but-hardcoded-autosuspend-hwdb-fi.patch
build-Ensure-we-process-the-data-dir.patch
data-Keep-using-versioned-libname-for-hwdb-file.patch
tests-Add-trailing-newline-to-busname-devname-sysfs-attri.patch
build-Skip-the-hwdb-test-if-not-all-drivers-are-really-en.patch
debian/data-Use-auto-generated-but-hardcoded-autosuspend-rules-f.patch
@@ -6,8 +6,6 @@ libusb 1.0.24 now expects busnum/devnum to be \n terminated. Update the
device descriptions accordingly.
https://github.com/martinpitt/umockdev/issues/115
Origin: https://gitlab.freedesktop.org/libfprint/libfprint/-/merge_requests/240
---
tests/aes3500/device | 16 ++++++++--------
tests/elan/device | 12 ++++++------
@@ -11,10 +11,10 @@ is listed by two independent drivers.
1 file changed, 4 insertions(+), 3 deletions(-)
diff --git a/libfprint/fprint-list-udev-rules.c b/libfprint/fprint-list-udev-rules.c
index af289da..cba2b2f 100644
index e574cac..050a450 100644
--- a/libfprint/fprint-list-udev-rules.c
+++ b/libfprint/fprint-list-udev-rules.c
@@ -133,10 +133,11 @@ print_driver (const FpDeviceClass *cls)
@@ -136,10 +136,11 @@ print_driver (const FpDeviceClass *cls)
key = g_strdup_printf ("%04x:%04x", entry->vid, entry->pid);
@@ -7,7 +7,7 @@ Subject: udev-rules: Print warning if an ID is supported
1 file changed, 5 insertions(+), 2 deletions(-)
diff --git a/libfprint/fprint-list-udev-rules.c b/libfprint/fprint-list-udev-rules.c
index 3b6f572..57aa5e6 100644
index d6c884c..5f80fe1 100644
--- a/libfprint/fprint-list-udev-rules.c
+++ b/libfprint/fprint-list-udev-rules.c
@@ -110,6 +110,7 @@ static const FpIdEntry blacklist_id_table[] = {
@@ -18,7 +18,7 @@ index 3b6f572..57aa5e6 100644
.full_name = "Hardcoded whitelist"
};
@@ -135,13 +136,15 @@ print_driver (const FpDeviceClass *cls)
@@ -138,13 +139,15 @@ print_driver (const FpDeviceClass *cls)
key = g_strdup_printf ("%04x:%04x", entry->vid, entry->pid);
@@ -7,7 +7,7 @@ Subject: udev-rules: Remove supported synaptics devices
1 file changed, 3 deletions(-)
diff --git a/libfprint/fprint-list-udev-rules.c b/libfprint/fprint-list-udev-rules.c
index 57aa5e6..af289da 100644
index 5f80fe1..e574cac 100644
--- a/libfprint/fprint-list-udev-rules.c
+++ b/libfprint/fprint-list-udev-rules.c
@@ -45,12 +45,9 @@ static const FpIdEntry whitelist_id_table[] = {