1313#include <linux/input.h>
1414#include <linux/minmax.h>
1515#include <linux/slab.h>
16+ #include <linux/stringify.h>
1617#include <linux/usb.h>
1718
1819#define PID_EFFECTS_MAX 64
@@ -81,7 +82,7 @@ static const u8 pidff_set_envelope[] = { 0x22, 0x5b, 0x5c, 0x5d, 0x5e };
8182#define PID_NEG_COEFFICIENT 4
8283#define PID_POS_SATURATION 5
8384#define PID_NEG_SATURATION 6
84- #define PID_DEAD_BAND 7
85+ #define PID_DEADBAND 7
8586static const u8 pidff_set_condition [] = {
8687 0x22 , 0x23 , 0x60 , 0x61 , 0x62 , 0x63 , 0x64 , 0x65
8788};
@@ -618,14 +619,24 @@ static void pidff_set_condition_report(struct pidff_device *pidff,
618619 effect -> u .condition [i ].center );
619620 pidff_set_signed (& pidff -> set_condition [PID_POS_COEFFICIENT ],
620621 effect -> u .condition [i ].right_coeff );
621- pidff_set_signed (& pidff -> set_condition [PID_NEG_COEFFICIENT ],
622- effect -> u .condition [i ].left_coeff );
623622 pidff_set (& pidff -> set_condition [PID_POS_SATURATION ],
624623 effect -> u .condition [i ].right_saturation );
625- pidff_set (& pidff -> set_condition [PID_NEG_SATURATION ],
626- effect -> u .condition [i ].left_saturation );
627- pidff_set (& pidff -> set_condition [PID_DEAD_BAND ],
628- effect -> u .condition [i ].deadband );
624+
625+ /* Omit Negative Coefficient if missing */
626+ if (!(pidff -> quirks & HID_PIDFF_QUIRK_MISSING_NEG_COEFFICIENT ))
627+ pidff_set_signed (& pidff -> set_condition [PID_NEG_COEFFICIENT ],
628+ effect -> u .condition [i ].left_coeff );
629+
630+ /* Omit Negative Saturation if missing */
631+ if (!(pidff -> quirks & HID_PIDFF_QUIRK_MISSING_NEG_SATURATION ))
632+ pidff_set_signed (& pidff -> set_condition [PID_NEG_SATURATION ],
633+ effect -> u .condition [i ].left_saturation );
634+
635+ /* Omit Deadband field if missing */
636+ if (!(pidff -> quirks & HID_PIDFF_QUIRK_MISSING_DEADBAND ))
637+ pidff_set (& pidff -> set_condition [PID_DEADBAND ],
638+ effect -> u .condition [i ].deadband );
639+
629640 hid_hw_request (pidff -> hid , pidff -> reports [PID_SET_CONDITION ],
630641 HID_REQ_SET_REPORT );
631642 }
@@ -1053,16 +1064,18 @@ static int pidff_find_field_with_usage(int *usage_index,
10531064 return -1 ;
10541065}
10551066
1067+ #define PIDFF_MISSING_FIELD (name , quirks ) \
1068+ ({ pr_debug("%s field not found, but that's OK\n", __stringify(name)); \
1069+ pr_debug("Setting MISSING_%s quirk\n", __stringify(name)); \
1070+ *quirks |= HID_PIDFF_QUIRK_MISSING_ ## name; })
1071+
10561072/*
10571073 * Find fields from a report and fill a pidff_usage
10581074 */
10591075static int pidff_find_fields (struct pidff_usage * usage , const u8 * table ,
10601076 struct hid_report * report , int count , int strict ,
10611077 u32 * quirks )
10621078{
1063- const u8 block_offset = pidff_set_condition [PID_PARAM_BLOCK_OFFSET ];
1064- const u8 delay = pidff_set_effect [PID_START_DELAY ];
1065-
10661079 if (!report ) {
10671080 pr_debug ("%s, null report\n" , __func__ );
10681081 return -1 ;
@@ -1080,17 +1093,23 @@ static int pidff_find_fields(struct pidff_usage *usage, const u8 *table,
10801093 continue ;
10811094 }
10821095
1083- if (table [i ] == delay ) {
1084- pr_debug ("Delay field not found, but that's OK\n" );
1085- pr_debug ("Setting MISSING_DELAY quirk\n" );
1086- * quirks |= HID_PIDFF_QUIRK_MISSING_DELAY ;
1096+ /* Field quirks auto-detection */
1097+ if (table [i ] == pidff_set_effect [PID_START_DELAY ])
1098+ PIDFF_MISSING_FIELD (DELAY , quirks );
1099+
1100+ else if (table [i ] == pidff_set_condition [PID_PARAM_BLOCK_OFFSET ])
1101+ PIDFF_MISSING_FIELD (PBO , quirks );
1102+
1103+ else if (table [i ] == pidff_set_condition [PID_NEG_COEFFICIENT ])
1104+ PIDFF_MISSING_FIELD (NEG_COEFFICIENT , quirks );
1105+
1106+ else if (table [i ] == pidff_set_condition [PID_NEG_SATURATION ])
1107+ PIDFF_MISSING_FIELD (NEG_SATURATION , quirks );
10871108
1088- } else if (table [i ] == block_offset ) {
1089- pr_debug ("PBO field not found, but that's OK\n" );
1090- pr_debug ("Setting MISSING_PBO quirk\n" );
1091- * quirks |= HID_PIDFF_QUIRK_MISSING_PBO ;
1109+ else if (table [i ] == pidff_set_condition [PID_DEADBAND ])
1110+ PIDFF_MISSING_FIELD (DEADBAND , quirks );
10921111
1093- } else if (strict ) {
1112+ else if (strict ) {
10941113 pr_debug ("failed to locate %d\n" , i );
10951114 return -1 ;
10961115 }
0 commit comments