]> git.karo-electronics.de Git - karo-tx-linux.git/commitdiff
HID: hid-logitech: Add combined pedal support Logitech wheels
authorSimon Wood <gitsend@mungewell.org>
Sun, 18 Sep 2016 16:55:38 +0000 (10:55 -0600)
committerJiri Kosina <jkosina@suse.cz>
Mon, 26 Sep 2016 13:39:54 +0000 (15:39 +0200)
Add support for reporting a combined accelerator/brake axis for wheels
which contain combined data in their HID stream.

This includes DF, MOMO, MOMO2 and DFP.

Signed-off-by: Simon Wood <simon@mungewell.org>
Signed-off-by: Jiri Kosina <jkosina@suse.cz>
drivers/hid/hid-lg.c
drivers/hid/hid-lg4ff.c
drivers/hid/hid-lg4ff.h

index feb2be71f77c199e9ab21fabd0e6ffcd267d2d9e..06f8a5e0fc8fefac15997c4aff77640a2afe312d 100644 (file)
@@ -657,6 +657,17 @@ static int lg_event(struct hid_device *hdev, struct hid_field *field,
        return 0;
 }
 
+static int lg_raw_event(struct hid_device *hdev, struct hid_report *report,
+               u8 *rd, int size)
+{
+       struct lg_drv_data *drv_data = hid_get_drvdata(hdev);
+
+       if (drv_data->quirks & LG_FF4)
+               return lg4ff_raw_event(hdev, report, rd, size, drv_data);
+
+       return 0;
+}
+
 static int lg_probe(struct hid_device *hdev, const struct hid_device_id *id)
 {
        struct usb_interface *iface = to_usb_interface(hdev->dev.parent);
@@ -830,6 +841,7 @@ static struct hid_driver lg_driver = {
        .input_mapping = lg_input_mapping,
        .input_mapped = lg_input_mapped,
        .event = lg_event,
+       .raw_event = lg_raw_event,
        .probe = lg_probe,
        .remove = lg_remove,
 };
index ca31ce4d2c242584e7c8876522af6cfcceaeea92..79d34c2f639b144319e756a71b3a78aa7c3adf83 100644 (file)
@@ -329,6 +329,38 @@ int lg4ff_adjust_input_event(struct hid_device *hid, struct hid_field *field,
        }
 }
 
+int lg4ff_raw_event(struct hid_device *hdev, struct hid_report *report,
+               u8 *rd, int size, struct lg_drv_data *drv_data)
+{
+       struct lg4ff_device_entry *entry = drv_data->device_props;
+
+       if (!entry)
+               return 0;
+
+       /* adjust HID report present combined pedals data */
+       if (entry->wdata.combine) {
+               switch (entry->wdata.product_id) {
+               case USB_DEVICE_ID_LOGITECH_WHEEL:
+                       rd[5] = rd[3];
+                       rd[6] = 0x7F;
+                       return 1;
+               case USB_DEVICE_ID_LOGITECH_MOMO_WHEEL:
+               case USB_DEVICE_ID_LOGITECH_MOMO_WHEEL2:
+                       rd[4] = rd[3];
+                       rd[5] = 0x7F;
+                       return 1;
+               case USB_DEVICE_ID_LOGITECH_DFP_WHEEL:
+                       rd[5] = rd[4];
+                       rd[6] = 0x7F;
+                       return 1;
+               default:
+                       return 0;
+               }
+       }
+
+       return 0;
+}
+
 static void lg4ff_init_wheel_data(struct lg4ff_wheel_data * const wdata, const struct lg4ff_wheel *wheel,
                                  const struct lg4ff_multimode_wheel *mmode_wheel,
                                  const u16 real_product_id)
index 66201af44da33b6c699983c7e04330fd765c3c7e..de1f350e0bd300e5a81d4546bd1b4063becf8e11 100644 (file)
@@ -6,11 +6,15 @@ extern int lg4ff_no_autoswitch; /* From hid-lg.c */
 
 int lg4ff_adjust_input_event(struct hid_device *hid, struct hid_field *field,
                             struct hid_usage *usage, s32 value, struct lg_drv_data *drv_data);
+int lg4ff_raw_event(struct hid_device *hdev, struct hid_report *report,
+               u8 *rd, int size, struct lg_drv_data *drv_data);
 int lg4ff_init(struct hid_device *hdev);
 int lg4ff_deinit(struct hid_device *hdev);
 #else
 static inline int lg4ff_adjust_input_event(struct hid_device *hid, struct hid_field *field,
                                           struct hid_usage *usage, s32 value, struct lg_drv_data *drv_data) { return 0; }
+static inline int lg4ff_raw_event(struct hid_device *hdev, struct hid_report *report,
+               u8 *rd, int size, struct lg_drv_data *drv_data) { return 0; }
 static inline int lg4ff_init(struct hid_device *hdev) { return -1; }
 static inline int lg4ff_deinit(struct hid_device *hdev) { return -1; }
 #endif