|
@@ -306,6 +306,30 @@ static __u8 *dr_report_fixup(struct hid_device *hdev, __u8 *rdesc,
|
|
|
return rdesc;
|
|
|
}
|
|
|
|
|
|
+#define map_abs(c) hid_map_usage(hi, usage, bit, max, EV_ABS, (c))
|
|
|
+#define map_rel(c) hid_map_usage(hi, usage, bit, max, EV_REL, (c))
|
|
|
+
|
|
|
+static int dr_input_mapping(struct hid_device *hdev, struct hid_input *hi,
|
|
|
+ struct hid_field *field, struct hid_usage *usage,
|
|
|
+ unsigned long **bit, int *max)
|
|
|
+{
|
|
|
+ switch (usage->hid) {
|
|
|
+ /*
|
|
|
+ * revert to the old hid-input behavior where axes
|
|
|
+ * can be randomly assigned when hid->usage is reused.
|
|
|
+ */
|
|
|
+ case HID_GD_X: case HID_GD_Y: case HID_GD_Z:
|
|
|
+ case HID_GD_RX: case HID_GD_RY: case HID_GD_RZ:
|
|
|
+ if (field->flags & HID_MAIN_ITEM_RELATIVE)
|
|
|
+ map_rel(usage->hid & 0xf);
|
|
|
+ else
|
|
|
+ map_abs(usage->hid & 0xf);
|
|
|
+ return 1;
|
|
|
+ }
|
|
|
+
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
static int dr_probe(struct hid_device *hdev, const struct hid_device_id *id)
|
|
|
{
|
|
|
int ret;
|
|
@@ -352,6 +376,7 @@ static struct hid_driver dr_driver = {
|
|
|
.id_table = dr_devices,
|
|
|
.report_fixup = dr_report_fixup,
|
|
|
.probe = dr_probe,
|
|
|
+ .input_mapping = dr_input_mapping,
|
|
|
};
|
|
|
module_hid_driver(dr_driver);
|
|
|
|