Skip to content

Commit abdbf87

Browse files
LawstorantJiri Kosina
authored andcommitted
HID: pidff: Add PERIODIC_SINE_ONLY quirk
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>
1 parent 7d3adb9 commit abdbf87

3 files changed

Lines changed: 14 additions & 5 deletions

File tree

drivers/hid/hid-universal-pidff.c

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -168,11 +168,16 @@ static const struct hid_device_id universal_pidff_devices[] = {
168168
{ HID_USB_DEVICE(USB_VENDOR_ID_FFBEAST, USB_DEVICE_ID_FFBEAST_JOYSTICK), },
169169
{ HID_USB_DEVICE(USB_VENDOR_ID_FFBEAST, USB_DEVICE_ID_FFBEAST_RUDDER), },
170170
{ HID_USB_DEVICE(USB_VENDOR_ID_FFBEAST, USB_DEVICE_ID_FFBEAST_WHEEL) },
171-
{ HID_USB_DEVICE(USB_VENDOR_ID_LITE_STAR, USB_DEVICE_ID_PXN_V10) },
172-
{ HID_USB_DEVICE(USB_VENDOR_ID_LITE_STAR, USB_DEVICE_ID_PXN_V12) },
173-
{ HID_USB_DEVICE(USB_VENDOR_ID_LITE_STAR, USB_DEVICE_ID_PXN_V12_LITE) },
174-
{ HID_USB_DEVICE(USB_VENDOR_ID_LITE_STAR, USB_DEVICE_ID_PXN_V12_LITE_2) },
175-
{ HID_USB_DEVICE(USB_VENDOR_ID_LITE_STAR, USB_DEVICE_LITE_STAR_GT987_FF) },
171+
{ HID_USB_DEVICE(USB_VENDOR_ID_LITE_STAR, USB_DEVICE_ID_PXN_V10),
172+
.driver_data = HID_PIDFF_QUIRK_PERIODIC_SINE_ONLY },
173+
{ HID_USB_DEVICE(USB_VENDOR_ID_LITE_STAR, USB_DEVICE_ID_PXN_V12),
174+
.driver_data = HID_PIDFF_QUIRK_PERIODIC_SINE_ONLY },
175+
{ HID_USB_DEVICE(USB_VENDOR_ID_LITE_STAR, USB_DEVICE_ID_PXN_V12_LITE),
176+
.driver_data = HID_PIDFF_QUIRK_PERIODIC_SINE_ONLY },
177+
{ HID_USB_DEVICE(USB_VENDOR_ID_LITE_STAR, USB_DEVICE_ID_PXN_V12_LITE_2),
178+
.driver_data = HID_PIDFF_QUIRK_PERIODIC_SINE_ONLY },
179+
{ HID_USB_DEVICE(USB_VENDOR_ID_LITE_STAR, USB_DEVICE_LITE_STAR_GT987_FF),
180+
.driver_data = HID_PIDFF_QUIRK_PERIODIC_SINE_ONLY },
176181
{ }
177182
};
178183
MODULE_DEVICE_TABLE(hid, universal_pidff_devices);

drivers/hid/usbhid/hid-pidff.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -651,6 +651,9 @@ static int pidff_upload_effect(struct input_dev *dev, struct ff_effect *effect,
651651
return -EINVAL;
652652
}
653653

654+
if (pidff->quirks & HID_PIDFF_QUIRK_PERIODIC_SINE_ONLY)
655+
type_id = PID_SINE;
656+
654657
error = pidff_request_effect_upload(pidff,
655658
pidff->type_id[type_id]);
656659
if (error)

include/linux/hid.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1235,6 +1235,7 @@ int hid_pidff_init_with_quirks(struct hid_device *hid, __u32 initial_quirks);
12351235
#define HID_PIDFF_QUIRK_MISSING_PBO BIT(1)
12361236
#define HID_PIDFF_QUIRK_PERMISSIVE_CONTROL BIT(2)
12371237
#define HID_PIDFF_QUIRK_FIX_WHEEL_DIRECTION BIT(3)
1238+
#define HID_PIDFF_QUIRK_PERIODIC_SINE_ONLY BIT(4)
12381239

12391240
#define dbg_hid(fmt, ...) pr_debug("%s: " fmt, __FILE__, ##__VA_ARGS__)
12401241

0 commit comments

Comments
 (0)