Back to home page

OSCL-LXR

 
 

    


0001 // SPDX-License-Identifier: GPL-2.0-or-later
0002 /*
0003  *  Plantronics USB HID Driver
0004  *
0005  *  Copyright (c) 2014 JD Cole <jd.cole@plantronics.com>
0006  *  Copyright (c) 2015-2018 Terry Junge <terry.junge@plantronics.com>
0007  */
0008 
0009 /*
0010  */
0011 
0012 #include "hid-ids.h"
0013 
0014 #include <linux/hid.h>
0015 #include <linux/module.h>
0016 #include <linux/jiffies.h>
0017 
0018 #define PLT_HID_1_0_PAGE    0xffa00000
0019 #define PLT_HID_2_0_PAGE    0xffa20000
0020 
0021 #define PLT_BASIC_TELEPHONY 0x0003
0022 #define PLT_BASIC_EXCEPTION 0x0005
0023 
0024 #define PLT_VOL_UP      0x00b1
0025 #define PLT_VOL_DOWN        0x00b2
0026 
0027 #define PLT1_VOL_UP     (PLT_HID_1_0_PAGE | PLT_VOL_UP)
0028 #define PLT1_VOL_DOWN       (PLT_HID_1_0_PAGE | PLT_VOL_DOWN)
0029 #define PLT2_VOL_UP     (PLT_HID_2_0_PAGE | PLT_VOL_UP)
0030 #define PLT2_VOL_DOWN       (PLT_HID_2_0_PAGE | PLT_VOL_DOWN)
0031 
0032 #define PLT_DA60        0xda60
0033 #define PLT_BT300_MIN       0x0413
0034 #define PLT_BT300_MAX       0x0418
0035 
0036 
0037 #define PLT_ALLOW_CONSUMER (field->application == HID_CP_CONSUMERCONTROL && \
0038                 (usage->hid & HID_USAGE_PAGE) == HID_UP_CONSUMER)
0039 
0040 #define PLT_QUIRK_DOUBLE_VOLUME_KEYS BIT(0)
0041 
0042 #define PLT_DOUBLE_KEY_TIMEOUT 5 /* ms */
0043 
0044 struct plt_drv_data {
0045     unsigned long device_type;
0046     unsigned long last_volume_key_ts;
0047     u32 quirks;
0048 };
0049 
0050 static int plantronics_input_mapping(struct hid_device *hdev,
0051                      struct hid_input *hi,
0052                      struct hid_field *field,
0053                      struct hid_usage *usage,
0054                      unsigned long **bit, int *max)
0055 {
0056     unsigned short mapped_key;
0057     struct plt_drv_data *drv_data = hid_get_drvdata(hdev);
0058     unsigned long plt_type = drv_data->device_type;
0059 
0060     /* special case for PTT products */
0061     if (field->application == HID_GD_JOYSTICK)
0062         goto defaulted;
0063 
0064     /* handle volume up/down mapping */
0065     /* non-standard types or multi-HID interfaces - plt_type is PID */
0066     if (!(plt_type & HID_USAGE_PAGE)) {
0067         switch (plt_type) {
0068         case PLT_DA60:
0069             if (PLT_ALLOW_CONSUMER)
0070                 goto defaulted;
0071             goto ignored;
0072         default:
0073             if (PLT_ALLOW_CONSUMER)
0074                 goto defaulted;
0075         }
0076     }
0077     /* handle standard types - plt_type is 0xffa0uuuu or 0xffa2uuuu */
0078     /* 'basic telephony compliant' - allow default consumer page map */
0079     else if ((plt_type & HID_USAGE) >= PLT_BASIC_TELEPHONY &&
0080          (plt_type & HID_USAGE) != PLT_BASIC_EXCEPTION) {
0081         if (PLT_ALLOW_CONSUMER)
0082             goto defaulted;
0083     }
0084     /* not 'basic telephony' - apply legacy mapping */
0085     /* only map if the field is in the device's primary vendor page */
0086     else if (!((field->application ^ plt_type) & HID_USAGE_PAGE)) {
0087         switch (usage->hid) {
0088         case PLT1_VOL_UP:
0089         case PLT2_VOL_UP:
0090             mapped_key = KEY_VOLUMEUP;
0091             goto mapped;
0092         case PLT1_VOL_DOWN:
0093         case PLT2_VOL_DOWN:
0094             mapped_key = KEY_VOLUMEDOWN;
0095             goto mapped;
0096         }
0097     }
0098 
0099 /*
0100  * Future mapping of call control or other usages,
0101  * if and when keys are defined would go here
0102  * otherwise, ignore everything else that was not mapped
0103  */
0104 
0105 ignored:
0106     return -1;
0107 
0108 defaulted:
0109     hid_dbg(hdev, "usage: %08x (appl: %08x) - defaulted\n",
0110         usage->hid, field->application);
0111     return 0;
0112 
0113 mapped:
0114     hid_map_usage_clear(hi, usage, bit, max, EV_KEY, mapped_key);
0115     hid_dbg(hdev, "usage: %08x (appl: %08x) - mapped to key %d\n",
0116         usage->hid, field->application, mapped_key);
0117     return 1;
0118 }
0119 
0120 static int plantronics_event(struct hid_device *hdev, struct hid_field *field,
0121                  struct hid_usage *usage, __s32 value)
0122 {
0123     struct plt_drv_data *drv_data = hid_get_drvdata(hdev);
0124 
0125     if (drv_data->quirks & PLT_QUIRK_DOUBLE_VOLUME_KEYS) {
0126         unsigned long prev_ts, cur_ts;
0127 
0128         /* Usages are filtered in plantronics_usages. */
0129 
0130         if (!value) /* Handle key presses only. */
0131             return 0;
0132 
0133         prev_ts = drv_data->last_volume_key_ts;
0134         cur_ts = jiffies;
0135         if (jiffies_to_msecs(cur_ts - prev_ts) <= PLT_DOUBLE_KEY_TIMEOUT)
0136             return 1; /* Ignore the repeated key. */
0137 
0138         drv_data->last_volume_key_ts = cur_ts;
0139     }
0140 
0141     return 0;
0142 }
0143 
0144 static unsigned long plantronics_device_type(struct hid_device *hdev)
0145 {
0146     unsigned i, col_page;
0147     unsigned long plt_type = hdev->product;
0148 
0149     /* multi-HID interfaces? - plt_type is PID */
0150     if (plt_type >= PLT_BT300_MIN && plt_type <= PLT_BT300_MAX)
0151         goto exit;
0152 
0153     /* determine primary vendor page */
0154     for (i = 0; i < hdev->maxcollection; i++) {
0155         col_page = hdev->collection[i].usage & HID_USAGE_PAGE;
0156         if (col_page == PLT_HID_2_0_PAGE) {
0157             plt_type = hdev->collection[i].usage;
0158             break;
0159         }
0160         if (col_page == PLT_HID_1_0_PAGE)
0161             plt_type = hdev->collection[i].usage;
0162     }
0163 
0164 exit:
0165     hid_dbg(hdev, "plt_type decoded as: %08lx\n", plt_type);
0166     return plt_type;
0167 }
0168 
0169 static int plantronics_probe(struct hid_device *hdev,
0170                  const struct hid_device_id *id)
0171 {
0172     struct plt_drv_data *drv_data;
0173     int ret;
0174 
0175     drv_data = devm_kzalloc(&hdev->dev, sizeof(*drv_data), GFP_KERNEL);
0176     if (!drv_data)
0177         return -ENOMEM;
0178 
0179     ret = hid_parse(hdev);
0180     if (ret) {
0181         hid_err(hdev, "parse failed\n");
0182         goto err;
0183     }
0184 
0185     drv_data->device_type = plantronics_device_type(hdev);
0186     drv_data->quirks = id->driver_data;
0187     drv_data->last_volume_key_ts = jiffies - msecs_to_jiffies(PLT_DOUBLE_KEY_TIMEOUT);
0188 
0189     hid_set_drvdata(hdev, drv_data);
0190 
0191     ret = hid_hw_start(hdev, HID_CONNECT_DEFAULT |
0192         HID_CONNECT_HIDINPUT_FORCE | HID_CONNECT_HIDDEV_FORCE);
0193     if (ret)
0194         hid_err(hdev, "hw start failed\n");
0195 
0196 err:
0197     return ret;
0198 }
0199 
0200 static const struct hid_device_id plantronics_devices[] = {
0201     { HID_USB_DEVICE(USB_VENDOR_ID_PLANTRONICS,
0202                      USB_DEVICE_ID_PLANTRONICS_BLACKWIRE_3220_SERIES),
0203         .driver_data = PLT_QUIRK_DOUBLE_VOLUME_KEYS },
0204     { HID_USB_DEVICE(USB_VENDOR_ID_PLANTRONICS, HID_ANY_ID) },
0205     { }
0206 };
0207 MODULE_DEVICE_TABLE(hid, plantronics_devices);
0208 
0209 static const struct hid_usage_id plantronics_usages[] = {
0210     { HID_CP_VOLUMEUP, EV_KEY, HID_ANY_ID },
0211     { HID_CP_VOLUMEDOWN, EV_KEY, HID_ANY_ID },
0212     { HID_TERMINATOR, HID_TERMINATOR, HID_TERMINATOR }
0213 };
0214 
0215 static struct hid_driver plantronics_driver = {
0216     .name = "plantronics",
0217     .id_table = plantronics_devices,
0218     .usage_table = plantronics_usages,
0219     .input_mapping = plantronics_input_mapping,
0220     .event = plantronics_event,
0221     .probe = plantronics_probe,
0222 };
0223 module_hid_driver(plantronics_driver);
0224 
0225 MODULE_AUTHOR("JD Cole <jd.cole@plantronics.com>");
0226 MODULE_AUTHOR("Terry Junge <terry.junge@plantronics.com>");
0227 MODULE_DESCRIPTION("Plantronics USB HID Driver");
0228 MODULE_LICENSE("GPL");