]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
HID: pidff: Add PERIODIC_SINE_ONLY quirk
authorTomasz Pakuła <tomasz.pakula.oficjalny@gmail.com>
Sat, 1 Feb 2025 11:38:56 +0000 (12:38 +0100)
committerJiri Kosina <jkosina@suse.com>
Mon, 3 Feb 2025 14:17:02 +0000 (15:17 +0100)
Some devices only support SINE periodic effect although they advertise
support for all PERIODIC effect in their HID descriptor. Some just do
nothing when trying to play such an effect (upload goes fine), some express
undefined behavior like turning to one side.

This quirk forces all the periodic effects to be uploaded as SINE. This is
acceptable as all these effects are similar in nature and are mostly used as
rumble. SINE is the most popular with others seldom used (especially SAW_UP
and SAW_DOWN).

Fixes periodic effects for PXN and LITE STAR wheels

Signed-off-by: Tomasz Pakuła <tomasz.pakula.oficjalny@gmail.com>
Reviewed-by: Michał Kopeć <michal@nozomi.space>
Reviewed-by: Paul Dino Jones <paul@spacefreak18.xyz>
Tested-by: Cristóferson Bueno <cbueno81@gmail.com>
Signed-off-by: Jiri Kosina <jkosina@suse.com>
drivers/hid/hid-universal-pidff.c
drivers/hid/usbhid/hid-pidff.c
include/linux/hid.h

index 55aad2e4ac1b84615986012c1bfecc8939eb3819..7ef5ab9146b1cf7dd832cbda87b5dd9977dd2ae9 100644 (file)
@@ -168,11 +168,16 @@ static const struct hid_device_id universal_pidff_devices[] = {
        { HID_USB_DEVICE(USB_VENDOR_ID_FFBEAST, USB_DEVICE_ID_FFBEAST_JOYSTICK), },
        { HID_USB_DEVICE(USB_VENDOR_ID_FFBEAST, USB_DEVICE_ID_FFBEAST_RUDDER), },
        { HID_USB_DEVICE(USB_VENDOR_ID_FFBEAST, USB_DEVICE_ID_FFBEAST_WHEEL) },
-       { HID_USB_DEVICE(USB_VENDOR_ID_LITE_STAR, USB_DEVICE_ID_PXN_V10) },
-       { HID_USB_DEVICE(USB_VENDOR_ID_LITE_STAR, USB_DEVICE_ID_PXN_V12) },
-       { HID_USB_DEVICE(USB_VENDOR_ID_LITE_STAR, USB_DEVICE_ID_PXN_V12_LITE) },
-       { HID_USB_DEVICE(USB_VENDOR_ID_LITE_STAR, USB_DEVICE_ID_PXN_V12_LITE_2) },
-       { HID_USB_DEVICE(USB_VENDOR_ID_LITE_STAR, USB_DEVICE_LITE_STAR_GT987_FF) },
+       { HID_USB_DEVICE(USB_VENDOR_ID_LITE_STAR, USB_DEVICE_ID_PXN_V10),
+               .driver_data = HID_PIDFF_QUIRK_PERIODIC_SINE_ONLY },
+       { HID_USB_DEVICE(USB_VENDOR_ID_LITE_STAR, USB_DEVICE_ID_PXN_V12),
+               .driver_data = HID_PIDFF_QUIRK_PERIODIC_SINE_ONLY },
+       { HID_USB_DEVICE(USB_VENDOR_ID_LITE_STAR, USB_DEVICE_ID_PXN_V12_LITE),
+               .driver_data = HID_PIDFF_QUIRK_PERIODIC_SINE_ONLY },
+       { HID_USB_DEVICE(USB_VENDOR_ID_LITE_STAR, USB_DEVICE_ID_PXN_V12_LITE_2),
+               .driver_data = HID_PIDFF_QUIRK_PERIODIC_SINE_ONLY },
+       { HID_USB_DEVICE(USB_VENDOR_ID_LITE_STAR, USB_DEVICE_LITE_STAR_GT987_FF),
+               .driver_data = HID_PIDFF_QUIRK_PERIODIC_SINE_ONLY },
        { }
 };
 MODULE_DEVICE_TABLE(hid, universal_pidff_devices);
index c125f029b6d6c88b565aab55ef30640ec3e3fdb4..e6224e797dc6da8c94ca8ef9c4407daa9e77011e 100644 (file)
@@ -651,6 +651,9 @@ static int pidff_upload_effect(struct input_dev *dev, struct ff_effect *effect,
                                return -EINVAL;
                        }
 
+                       if (pidff->quirks & HID_PIDFF_QUIRK_PERIODIC_SINE_ONLY)
+                               type_id = PID_SINE;
+
                        error = pidff_request_effect_upload(pidff,
                                        pidff->type_id[type_id]);
                        if (error)
index 7a55accf689e020817191a8001c44b2b92a46c57..e180679ab284c8c407ce820779f8d3147f9634f9 100644 (file)
@@ -1235,6 +1235,7 @@ int hid_pidff_init_with_quirks(struct hid_device *hid, __u32 initial_quirks);
 #define HID_PIDFF_QUIRK_MISSING_PBO            BIT(1)
 #define HID_PIDFF_QUIRK_PERMISSIVE_CONTROL     BIT(2)
 #define HID_PIDFF_QUIRK_FIX_WHEEL_DIRECTION    BIT(3)
+#define HID_PIDFF_QUIRK_PERIODIC_SINE_ONLY     BIT(4)
 
 #define dbg_hid(fmt, ...) pr_debug("%s: " fmt, __FILE__, ##__VA_ARGS__)