]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
HID: pidff: Add MISSING_NEG_SATURATION quirk
authorTomasz Pakuła <tomasz.pakula.oficjalny@gmail.com>
Tue, 3 Feb 2026 17:45:29 +0000 (18:45 +0100)
committerJiri Kosina <jkosina@suse.com>
Thu, 26 Feb 2026 14:46:00 +0000 (15:46 +0100)
This is the same case as the previous MISSING_NEG_COEFFICIENT quirk

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>
drivers/hid/usbhid/hid-pidff.c
drivers/hid/usbhid/hid-pidff.h

index aebf6c89643f75cd63076064ee4da45d4b32d4b2..17bdc36d1908750a97430f737b8cd021e8aec329 100644 (file)
@@ -619,16 +619,19 @@ static void pidff_set_condition_report(struct pidff_device *pidff,
                                 effect->u.condition[i].center);
                pidff_set_signed(&pidff->set_condition[PID_POS_COEFFICIENT],
                                 effect->u.condition[i].right_coeff);
+               pidff_set(&pidff->set_condition[PID_POS_SATURATION],
+                         effect->u.condition[i].right_saturation);
 
                /* Omit Negative Coefficient if missing */
                if (!(pidff->quirks & HID_PIDFF_QUIRK_MISSING_NEG_COEFFICIENT))
                        pidff_set_signed(&pidff->set_condition[PID_NEG_COEFFICIENT],
                                        effect->u.condition[i].left_coeff);
 
-               pidff_set(&pidff->set_condition[PID_POS_SATURATION],
-                         effect->u.condition[i].right_saturation);
-               pidff_set(&pidff->set_condition[PID_NEG_SATURATION],
-                         effect->u.condition[i].left_saturation);
+               /* Omit Negative Saturation if missing */
+               if (!(pidff->quirks & HID_PIDFF_QUIRK_MISSING_NEG_SATURATION))
+                       pidff_set_signed(&pidff->set_condition[PID_NEG_SATURATION],
+                                       effect->u.condition[i].left_saturation);
+
                pidff_set(&pidff->set_condition[PID_DEAD_BAND],
                          effect->u.condition[i].deadband);
                hid_hw_request(pidff->hid, pidff->reports[PID_SET_CONDITION],
@@ -1097,6 +1100,9 @@ static int pidff_find_fields(struct pidff_usage *usage, const u8 *table,
                else if (table[i] == pidff_set_condition[PID_NEG_COEFFICIENT])
                        PIDFF_MISSING_FIELD(NEG_COEFFICIENT, quirks);
 
+               else if (table[i] == pidff_set_condition[PID_NEG_SATURATION])
+                       PIDFF_MISSING_FIELD(NEG_SATURATION, quirks);
+
                else if (strict) {
                        pr_debug("failed to locate %d\n", i);
                        return -1;
index 5bf54e981543b13a775905cd58eac0407dbe2871..8d879067718fa5a55f3b0217c23bea49ec538169 100644 (file)
@@ -24,6 +24,9 @@
 /* Allow devices with missing negative coefficient in the set condition usage */
 #define HID_PIDFF_QUIRK_MISSING_NEG_COEFFICIENT        BIT(5)
 
+/* Allow devices with missing negative saturation in the set condition usage */
+#define HID_PIDFF_QUIRK_MISSING_NEG_SATURATION BIT(6)
+
 #ifdef CONFIG_HID_PID
 int hid_pidff_init(struct hid_device *hid);
 int hid_pidff_init_with_quirks(struct hid_device *hid, u32 initial_quirks);