diff options
Diffstat (limited to 'drivers/hid/hid-glorious.c')
| -rw-r--r-- | drivers/hid/hid-glorious.c | 16 | 
1 files changed, 14 insertions, 2 deletions
diff --git a/drivers/hid/hid-glorious.c b/drivers/hid/hid-glorious.c index 558eb08c19ef..281b3a7187ce 100644 --- a/drivers/hid/hid-glorious.c +++ b/drivers/hid/hid-glorious.c @@ -21,6 +21,10 @@ MODULE_DESCRIPTION("HID driver for Glorious PC Gaming Race mice");   * Glorious Model O and O- specify the const flag in the consumer input   * report descriptor, which leads to inputs being ignored. Fix this   * by patching the descriptor. + * + * Glorious Model I incorrectly specifes the Usage Minimum for its + * keyboard HID report, causing keycodes to be misinterpreted. + * Fix this by setting Usage Minimum to 0 in that report.   */  static __u8 *glorious_report_fixup(struct hid_device *hdev, __u8 *rdesc,  		unsigned int *rsize) @@ -32,6 +36,10 @@ static __u8 *glorious_report_fixup(struct hid_device *hdev, __u8 *rdesc,  		rdesc[85] = rdesc[113] = rdesc[141] = \  			HID_MAIN_ITEM_VARIABLE | HID_MAIN_ITEM_RELATIVE;  	} +	if (*rsize == 156 && rdesc[41] == 1) { +		hid_info(hdev, "patching Glorious Model I keyboard report descriptor\n"); +		rdesc[41] = 0; +	}  	return rdesc;  } @@ -44,6 +52,8 @@ static void glorious_update_name(struct hid_device *hdev)  		model = "Model O"; break;  	case USB_DEVICE_ID_GLORIOUS_MODEL_D:  		model = "Model D"; break; +	case USB_DEVICE_ID_GLORIOUS_MODEL_I: +		model = "Model I"; break;  	}  	snprintf(hdev->name, sizeof(hdev->name), "%s %s", "Glorious", model); @@ -66,10 +76,12 @@ static int glorious_probe(struct hid_device *hdev,  }  static const struct hid_device_id glorious_devices[] = { -	{ HID_USB_DEVICE(USB_VENDOR_ID_GLORIOUS, +	{ HID_USB_DEVICE(USB_VENDOR_ID_SINOWEALTH,  		USB_DEVICE_ID_GLORIOUS_MODEL_O) }, -	{ HID_USB_DEVICE(USB_VENDOR_ID_GLORIOUS, +	{ HID_USB_DEVICE(USB_VENDOR_ID_SINOWEALTH,  		USB_DEVICE_ID_GLORIOUS_MODEL_D) }, +	{ HID_USB_DEVICE(USB_VENDOR_ID_LAVIEW, +		USB_DEVICE_ID_GLORIOUS_MODEL_I) },  	{ }  };  MODULE_DEVICE_TABLE(hid, glorious_devices);  | 
