|
@@ -30,10 +30,15 @@
|
|
|
#define MS_DUPLICATE_USAGES BIT(5)
|
|
|
#define MS_SURFACE_DIAL BIT(6)
|
|
|
|
|
|
+struct ms_data {
|
|
|
+ unsigned long quirks;
|
|
|
+};
|
|
|
+
|
|
|
static __u8 *ms_report_fixup(struct hid_device *hdev, __u8 *rdesc,
|
|
|
unsigned int *rsize)
|
|
|
{
|
|
|
- unsigned long quirks = (unsigned long)hid_get_drvdata(hdev);
|
|
|
+ struct ms_data *ms = hid_get_drvdata(hdev);
|
|
|
+ unsigned long quirks = ms->quirks;
|
|
|
|
|
|
/*
|
|
|
* Microsoft Wireless Desktop Receiver (Model 1028) has
|
|
@@ -159,7 +164,8 @@ static int ms_input_mapping(struct hid_device *hdev, struct hid_input *hi,
|
|
|
struct hid_field *field, struct hid_usage *usage,
|
|
|
unsigned long **bit, int *max)
|
|
|
{
|
|
|
- unsigned long quirks = (unsigned long)hid_get_drvdata(hdev);
|
|
|
+ struct ms_data *ms = hid_get_drvdata(hdev);
|
|
|
+ unsigned long quirks = ms->quirks;
|
|
|
|
|
|
if (quirks & MS_ERGONOMY) {
|
|
|
int ret = ms_ergonomy_kb_quirk(hi, usage, bit, max);
|
|
@@ -185,7 +191,8 @@ static int ms_input_mapped(struct hid_device *hdev, struct hid_input *hi,
|
|
|
struct hid_field *field, struct hid_usage *usage,
|
|
|
unsigned long **bit, int *max)
|
|
|
{
|
|
|
- unsigned long quirks = (unsigned long)hid_get_drvdata(hdev);
|
|
|
+ struct ms_data *ms = hid_get_drvdata(hdev);
|
|
|
+ unsigned long quirks = ms->quirks;
|
|
|
|
|
|
if (quirks & MS_DUPLICATE_USAGES)
|
|
|
clear_bit(usage->code, *bit);
|
|
@@ -196,7 +203,8 @@ static int ms_input_mapped(struct hid_device *hdev, struct hid_input *hi,
|
|
|
static int ms_event(struct hid_device *hdev, struct hid_field *field,
|
|
|
struct hid_usage *usage, __s32 value)
|
|
|
{
|
|
|
- unsigned long quirks = (unsigned long)hid_get_drvdata(hdev);
|
|
|
+ struct ms_data *ms = hid_get_drvdata(hdev);
|
|
|
+ unsigned long quirks = ms->quirks;
|
|
|
struct input_dev *input;
|
|
|
|
|
|
if (!(hdev->claimed & HID_CLAIMED_INPUT) || !field->hidinput ||
|
|
@@ -254,9 +262,16 @@ static int ms_event(struct hid_device *hdev, struct hid_field *field,
|
|
|
static int ms_probe(struct hid_device *hdev, const struct hid_device_id *id)
|
|
|
{
|
|
|
unsigned long quirks = id->driver_data;
|
|
|
+ struct ms_data *ms;
|
|
|
int ret;
|
|
|
|
|
|
- hid_set_drvdata(hdev, (void *)quirks);
|
|
|
+ ms = devm_kzalloc(&hdev->dev, sizeof(*ms), GFP_KERNEL);
|
|
|
+ if (ms == NULL)
|
|
|
+ return -ENOMEM;
|
|
|
+
|
|
|
+ ms->quirks = quirks;
|
|
|
+
|
|
|
+ hid_set_drvdata(hdev, ms);
|
|
|
|
|
|
if (quirks & MS_NOGET)
|
|
|
hdev->quirks |= HID_QUIRK_NOGET;
|