summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTomasz Pakuła <tomasz.pakula.oficjalny@gmail.com>2026-02-03 20:45:27 +0300
committerJiri Kosina <jkosina@suse.com>2026-02-26 17:46:00 +0300
commit446e303982a616f5cd48beabd236f0e6a17ec0ab (patch)
tree48cc604b10a0d13f22d95c9f52685ecc9153a102
parentf50822fd8675c68d294e89bd102f7b487ca3acd3 (diff)
downloadlinux-446e303982a616f5cd48beabd236f0e6a17ec0ab.tar.xz
HID: pidff: Refactor field quirks detection
In preparation for additional quirks Co-developed-by: Oleg Makarenko <oleg@makarenk.ooo> Signed-off-by: Oleg Makarenko <oleg@makarenk.ooo> Signed-off-by: Tomasz Pakuła <tomasz.pakula.oficjalny@gmail.com> Signed-off-by: Jiri Kosina <jkosina@suse.com>
-rw-r--r--drivers/hid/usbhid/hid-pidff.c24
1 files changed, 12 insertions, 12 deletions
diff --git a/drivers/hid/usbhid/hid-pidff.c b/drivers/hid/usbhid/hid-pidff.c
index a4e700b40ba9..68049d5d76b3 100644
--- a/drivers/hid/usbhid/hid-pidff.c
+++ b/drivers/hid/usbhid/hid-pidff.c
@@ -13,6 +13,7 @@
#include <linux/input.h>
#include <linux/minmax.h>
#include <linux/slab.h>
+#include <linux/stringify.h>
#include <linux/usb.h>
#define PID_EFFECTS_MAX 64
@@ -1053,6 +1054,11 @@ static int pidff_find_field_with_usage(int *usage_index,
return -1;
}
+#define PIDFF_MISSING_FIELD(name, quirks) \
+ ({ pr_debug("%s field not found, but that's OK\n", __stringify(name)); \
+ pr_debug("Setting MISSING_%s quirk\n", __stringify(name)); \
+ *quirks |= HID_PIDFF_QUIRK_MISSING_ ## name; })
+
/*
* Find fields from a report and fill a pidff_usage
*/
@@ -1060,9 +1066,6 @@ static int pidff_find_fields(struct pidff_usage *usage, const u8 *table,
struct hid_report *report, int count, int strict,
u32 *quirks)
{
- const u8 block_offset = pidff_set_condition[PID_PARAM_BLOCK_OFFSET];
- const u8 delay = pidff_set_effect[PID_START_DELAY];
-
if (!report) {
pr_debug("%s, null report\n", __func__);
return -1;
@@ -1080,17 +1083,14 @@ static int pidff_find_fields(struct pidff_usage *usage, const u8 *table,
continue;
}
- if (table[i] == delay) {
- pr_debug("Delay field not found, but that's OK\n");
- pr_debug("Setting MISSING_DELAY quirk\n");
- *quirks |= HID_PIDFF_QUIRK_MISSING_DELAY;
+ /* Field quirks auto-detection */
+ if (table[i] == pidff_set_effect[PID_START_DELAY])
+ PIDFF_MISSING_FIELD(DELAY, quirks);
- } else if (table[i] == block_offset) {
- pr_debug("PBO field not found, but that's OK\n");
- pr_debug("Setting MISSING_PBO quirk\n");
- *quirks |= HID_PIDFF_QUIRK_MISSING_PBO;
+ else if (table[i] == pidff_set_condition[PID_PARAM_BLOCK_OFFSET])
+ PIDFF_MISSING_FIELD(PBO, quirks);
- } else if (strict) {
+ else if (strict) {
pr_debug("failed to locate %d\n", i);
return -1;
}