Orange Pi5 kernel

Deprecated Linux kernel 5.10.110 for OrangePi 5/5B/5+ boards

3 Commits   0 Branches   0 Tags
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   1) // SPDX-License-Identifier: GPL-2.0-or-later
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   2) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   3)  *  Plantronics USB HID Driver
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   4)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   5)  *  Copyright (c) 2014 JD Cole <jd.cole@plantronics.com>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   6)  *  Copyright (c) 2015-2018 Terry Junge <terry.junge@plantronics.com>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   7)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   8) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   9) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  10)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  11) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  12) #include "hid-ids.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  13) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  14) #include <linux/hid.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  15) #include <linux/module.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  16) #include <linux/jiffies.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  17) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  18) #define PLT_HID_1_0_PAGE	0xffa00000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  19) #define PLT_HID_2_0_PAGE	0xffa20000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  20) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  21) #define PLT_BASIC_TELEPHONY	0x0003
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  22) #define PLT_BASIC_EXCEPTION	0x0005
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  23) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  24) #define PLT_VOL_UP		0x00b1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  25) #define PLT_VOL_DOWN		0x00b2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  26) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  27) #define PLT1_VOL_UP		(PLT_HID_1_0_PAGE | PLT_VOL_UP)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  28) #define PLT1_VOL_DOWN		(PLT_HID_1_0_PAGE | PLT_VOL_DOWN)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  29) #define PLT2_VOL_UP		(PLT_HID_2_0_PAGE | PLT_VOL_UP)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  30) #define PLT2_VOL_DOWN		(PLT_HID_2_0_PAGE | PLT_VOL_DOWN)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  31) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  32) #define PLT_DA60		0xda60
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  33) #define PLT_BT300_MIN		0x0413
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  34) #define PLT_BT300_MAX		0x0418
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  35) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  36) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  37) #define PLT_ALLOW_CONSUMER (field->application == HID_CP_CONSUMERCONTROL && \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  38) 			    (usage->hid & HID_USAGE_PAGE) == HID_UP_CONSUMER)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  39) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  40) #define PLT_QUIRK_DOUBLE_VOLUME_KEYS BIT(0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  41) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  42) #define PLT_DOUBLE_KEY_TIMEOUT 5 /* ms */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  43) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  44) struct plt_drv_data {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  45) 	unsigned long device_type;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  46) 	unsigned long last_volume_key_ts;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  47) 	u32 quirks;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  48) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  49) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  50) static int plantronics_input_mapping(struct hid_device *hdev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  51) 				     struct hid_input *hi,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  52) 				     struct hid_field *field,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  53) 				     struct hid_usage *usage,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  54) 				     unsigned long **bit, int *max)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  55) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  56) 	unsigned short mapped_key;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  57) 	struct plt_drv_data *drv_data = hid_get_drvdata(hdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  58) 	unsigned long plt_type = drv_data->device_type;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  59) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  60) 	/* special case for PTT products */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  61) 	if (field->application == HID_GD_JOYSTICK)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  62) 		goto defaulted;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  63) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  64) 	/* handle volume up/down mapping */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  65) 	/* non-standard types or multi-HID interfaces - plt_type is PID */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  66) 	if (!(plt_type & HID_USAGE_PAGE)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  67) 		switch (plt_type) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  68) 		case PLT_DA60:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  69) 			if (PLT_ALLOW_CONSUMER)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  70) 				goto defaulted;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  71) 			goto ignored;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  72) 		default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  73) 			if (PLT_ALLOW_CONSUMER)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  74) 				goto defaulted;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  75) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  76) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  77) 	/* handle standard types - plt_type is 0xffa0uuuu or 0xffa2uuuu */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  78) 	/* 'basic telephony compliant' - allow default consumer page map */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  79) 	else if ((plt_type & HID_USAGE) >= PLT_BASIC_TELEPHONY &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  80) 		 (plt_type & HID_USAGE) != PLT_BASIC_EXCEPTION) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  81) 		if (PLT_ALLOW_CONSUMER)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  82) 			goto defaulted;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  83) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  84) 	/* not 'basic telephony' - apply legacy mapping */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  85) 	/* only map if the field is in the device's primary vendor page */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  86) 	else if (!((field->application ^ plt_type) & HID_USAGE_PAGE)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  87) 		switch (usage->hid) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  88) 		case PLT1_VOL_UP:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  89) 		case PLT2_VOL_UP:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  90) 			mapped_key = KEY_VOLUMEUP;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  91) 			goto mapped;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  92) 		case PLT1_VOL_DOWN:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  93) 		case PLT2_VOL_DOWN:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  94) 			mapped_key = KEY_VOLUMEDOWN;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  95) 			goto mapped;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  96) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  97) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  98) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  99) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100)  * Future mapping of call control or other usages,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101)  * if and when keys are defined would go here
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102)  * otherwise, ignore everything else that was not mapped
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) ignored:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) 	return -1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) defaulted:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) 	hid_dbg(hdev, "usage: %08x (appl: %08x) - defaulted\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) 		usage->hid, field->application);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) mapped:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114) 	hid_map_usage_clear(hi, usage, bit, max, EV_KEY, mapped_key);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) 	hid_dbg(hdev, "usage: %08x (appl: %08x) - mapped to key %d\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) 		usage->hid, field->application, mapped_key);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) 	return 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120) static int plantronics_event(struct hid_device *hdev, struct hid_field *field,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121) 			     struct hid_usage *usage, __s32 value)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123) 	struct plt_drv_data *drv_data = hid_get_drvdata(hdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125) 	if (drv_data->quirks & PLT_QUIRK_DOUBLE_VOLUME_KEYS) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126) 		unsigned long prev_ts, cur_ts;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128) 		/* Usages are filtered in plantronics_usages. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130) 		if (!value) /* Handle key presses only. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131) 			return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133) 		prev_ts = drv_data->last_volume_key_ts;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134) 		cur_ts = jiffies;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135) 		if (jiffies_to_msecs(cur_ts - prev_ts) <= PLT_DOUBLE_KEY_TIMEOUT)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136) 			return 1; /* Ignore the repeated key. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138) 		drv_data->last_volume_key_ts = cur_ts;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144) static unsigned long plantronics_device_type(struct hid_device *hdev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146) 	unsigned i, col_page;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147) 	unsigned long plt_type = hdev->product;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149) 	/* multi-HID interfaces? - plt_type is PID */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150) 	if (plt_type >= PLT_BT300_MIN && plt_type <= PLT_BT300_MAX)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 151) 		goto exit;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 152) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 153) 	/* determine primary vendor page */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 154) 	for (i = 0; i < hdev->maxcollection; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 155) 		col_page = hdev->collection[i].usage & HID_USAGE_PAGE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 156) 		if (col_page == PLT_HID_2_0_PAGE) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 157) 			plt_type = hdev->collection[i].usage;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 158) 			break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 159) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 160) 		if (col_page == PLT_HID_1_0_PAGE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 161) 			plt_type = hdev->collection[i].usage;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 162) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 163) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 164) exit:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 165) 	hid_dbg(hdev, "plt_type decoded as: %08lx\n", plt_type);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 166) 	return plt_type;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 167) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 168) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 169) static int plantronics_probe(struct hid_device *hdev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 170) 			     const struct hid_device_id *id)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 171) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 172) 	struct plt_drv_data *drv_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 173) 	int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 174) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 175) 	drv_data = devm_kzalloc(&hdev->dev, sizeof(*drv_data), GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 176) 	if (!drv_data)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 177) 		return -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 178) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 179) 	ret = hid_parse(hdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 180) 	if (ret) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 181) 		hid_err(hdev, "parse failed\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 182) 		goto err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 183) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 184) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 185) 	drv_data->device_type = plantronics_device_type(hdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 186) 	drv_data->quirks = id->driver_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 187) 	drv_data->last_volume_key_ts = jiffies - msecs_to_jiffies(PLT_DOUBLE_KEY_TIMEOUT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 188) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 189) 	hid_set_drvdata(hdev, drv_data);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 190) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 191) 	ret = hid_hw_start(hdev, HID_CONNECT_DEFAULT |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 192) 		HID_CONNECT_HIDINPUT_FORCE | HID_CONNECT_HIDDEV_FORCE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 193) 	if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 194) 		hid_err(hdev, "hw start failed\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 195) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 196) err:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 197) 	return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 198) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 199) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 200) static const struct hid_device_id plantronics_devices[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 201) 	{ HID_USB_DEVICE(USB_VENDOR_ID_PLANTRONICS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 202) 					 USB_DEVICE_ID_PLANTRONICS_BLACKWIRE_3220_SERIES),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 203) 		.driver_data = PLT_QUIRK_DOUBLE_VOLUME_KEYS },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 204) 	{ HID_USB_DEVICE(USB_VENDOR_ID_PLANTRONICS, HID_ANY_ID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 205) 	{ }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 206) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 207) MODULE_DEVICE_TABLE(hid, plantronics_devices);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 208) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 209) static const struct hid_usage_id plantronics_usages[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 210) 	{ HID_CP_VOLUMEUP, EV_KEY, HID_ANY_ID },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 211) 	{ HID_CP_VOLUMEDOWN, EV_KEY, HID_ANY_ID },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 212) 	{ HID_TERMINATOR, HID_TERMINATOR, HID_TERMINATOR }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 213) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 214) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 215) static struct hid_driver plantronics_driver = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 216) 	.name = "plantronics",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 217) 	.id_table = plantronics_devices,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 218) 	.usage_table = plantronics_usages,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 219) 	.input_mapping = plantronics_input_mapping,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 220) 	.event = plantronics_event,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 221) 	.probe = plantronics_probe,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 222) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 223) module_hid_driver(plantronics_driver);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 224) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 225) MODULE_AUTHOR("JD Cole <jd.cole@plantronics.com>");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 226) MODULE_AUTHOR("Terry Junge <terry.junge@plantronics.com>");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 227) MODULE_DESCRIPTION("Plantronics USB HID Driver");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 228) MODULE_LICENSE("GPL");