Skip to content

Commit 38d7601

Browse files
author
Jiri Kosina
committed
Merge branch 'for-7.1/pidff' into for-linus
- various new per-device(-group) type quirks for pidff driver (Tomasz Pakuła)
2 parents 1b2e437 + f8d3794 commit 38d7601

3 files changed

Lines changed: 56 additions & 27 deletions

File tree

MAINTAINERS

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -11364,14 +11364,6 @@ F: drivers/hid/hid-sensor-*
1136411364
F: drivers/iio/*/hid-*
1136511365
F: include/linux/hid-sensor-*
1136611366

11367-
HID UNIVERSAL PIDFF DRIVER
11368-
M: Tomasz Pakuła <tomasz.pakula.oficjalny@gmail.com>
11369-
M: Oleg Makarenko <oleg@makarenk.ooo>
11370-
L: linux-input@vger.kernel.org
11371-
S: Maintained
11372-
B: https://github.com/JacKeTUs/universal-pidff/issues
11373-
F: drivers/hid/hid-universal-pidff.c
11374-
1137511367
HID VRC-2 CAR CONTROLLER DRIVER
1137611368
M: Marcus Folkesson <marcus.folkesson@gmail.com>
1137711369
L: linux-input@vger.kernel.org
@@ -27279,6 +27271,15 @@ T: git git://git.kernel.org/pub/scm/linux/kernel/git/hid/hid.git
2727927271
F: Documentation/hid/hiddev.rst
2728027272
F: drivers/hid/usbhid/
2728127273

27274+
USB HID PID DRIVERS (USB WHEELBASES, JOYSTICKS, RUDDERS, ...)
27275+
M: Tomasz Pakuła <tomasz.pakula.oficjalny@gmail.com>
27276+
M: Oleg Makarenko <oleg@makarenk.ooo>
27277+
L: linux-input@vger.kernel.org
27278+
S: Maintained
27279+
B: https://github.com/JacKeTUs/universal-pidff/issues
27280+
F: drivers/hid/usbhid/hid-pidff*
27281+
F: drivers/hid/hid-universal-pidff.c
27282+
2728227283
USB INTEL XHCI ROLE MUX DRIVER
2728327284
M: Hans de Goede <hansg@kernel.org>
2728427285
L: linux-usb@vger.kernel.org

drivers/hid/usbhid/hid-pidff.c

Lines changed: 38 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
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
8586
static 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
*/
10591075
static 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
}

drivers/hid/usbhid/hid-pidff.h

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,15 @@
2121
/* Force all periodic effects to be uploaded as SINE */
2222
#define HID_PIDFF_QUIRK_PERIODIC_SINE_ONLY BIT(4)
2323

24+
/* Allow devices with missing negative coefficient in the set condition usage */
25+
#define HID_PIDFF_QUIRK_MISSING_NEG_COEFFICIENT BIT(5)
26+
27+
/* Allow devices with missing negative saturation in the set condition usage */
28+
#define HID_PIDFF_QUIRK_MISSING_NEG_SATURATION BIT(6)
29+
30+
/* Allow devices with missing deadband in the set condition usage */
31+
#define HID_PIDFF_QUIRK_MISSING_DEADBAND BIT(7)
32+
2433
#ifdef CONFIG_HID_PID
2534
int hid_pidff_init(struct hid_device *hid);
2635
int hid_pidff_init_with_quirks(struct hid_device *hid, u32 initial_quirks);

0 commit comments

Comments
 (0)