Blame view
drivers/hid/hid-a4tech.c
3.26 KB
14a21cd45 HID: move a4tech ... |
1 2 3 4 5 6 7 |
/* * HID driver for some a4tech "special" devices * * Copyright (c) 1999 Andreas Gal * Copyright (c) 2000-2005 Vojtech Pavlik <vojtech@suse.cz> * Copyright (c) 2005 Michael Haboustak <mike-@cinci.rr.com> for Concept2, Inc * Copyright (c) 2006-2007 Jiri Kosina |
14a21cd45 HID: move a4tech ... |
8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
* Copyright (c) 2008 Jiri Slaby */ /* * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the Free * Software Foundation; either version 2 of the License, or (at your option) * any later version. */ #include <linux/device.h> #include <linux/input.h> #include <linux/hid.h> #include <linux/module.h> |
5a0e3ad6a include cleanup: ... |
22 |
#include <linux/slab.h> |
14a21cd45 HID: move a4tech ... |
23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 |
#include "hid-ids.h" #define A4_2WHEEL_MOUSE_HACK_7 0x01 #define A4_2WHEEL_MOUSE_HACK_B8 0x02 struct a4tech_sc { unsigned long quirks; unsigned int hw_wheel; __s32 delayed_value; }; static int a4_input_mapped(struct hid_device *hdev, struct hid_input *hi, struct hid_field *field, struct hid_usage *usage, unsigned long **bit, int *max) { struct a4tech_sc *a4 = hid_get_drvdata(hdev); if (usage->type == EV_REL && usage->code == REL_WHEEL) set_bit(REL_HWHEEL, *bit); if ((a4->quirks & A4_2WHEEL_MOUSE_HACK_7) && usage->hid == 0x00090007) return -1; return 0; } static int a4_event(struct hid_device *hdev, struct hid_field *field, struct hid_usage *usage, __s32 value) { struct a4tech_sc *a4 = hid_get_drvdata(hdev); struct input_dev *input; if (!(hdev->claimed & HID_CLAIMED_INPUT) || !field->hidinput || !usage->type) return 0; input = field->hidinput->input; if (a4->quirks & A4_2WHEEL_MOUSE_HACK_B8) { if (usage->type == EV_REL && usage->code == REL_WHEEL) { a4->delayed_value = value; return 1; } if (usage->hid == 0x000100b8) { input_event(input, EV_REL, value ? REL_HWHEEL : REL_WHEEL, a4->delayed_value); return 1; } } if ((a4->quirks & A4_2WHEEL_MOUSE_HACK_7) && usage->hid == 0x00090007) { a4->hw_wheel = !!value; return 1; } if (usage->code == REL_WHEEL && a4->hw_wheel) { input_event(input, usage->type, REL_HWHEEL, value); return 1; } return 0; } static int a4_probe(struct hid_device *hdev, const struct hid_device_id *id) { struct a4tech_sc *a4; int ret; |
abf832bfc HID: trivial devm... |
92 |
a4 = devm_kzalloc(&hdev->dev, sizeof(*a4), GFP_KERNEL); |
14a21cd45 HID: move a4tech ... |
93 |
if (a4 == NULL) { |
4291ee305 HID: Add and use ... |
94 95 |
hid_err(hdev, "can't alloc device descriptor "); |
abf832bfc HID: trivial devm... |
96 |
return -ENOMEM; |
14a21cd45 HID: move a4tech ... |
97 98 99 100 101 102 103 104 |
} a4->quirks = id->driver_data; hid_set_drvdata(hdev, a4); ret = hid_parse(hdev); if (ret) { |
4291ee305 HID: Add and use ... |
105 106 |
hid_err(hdev, "parse failed "); |
abf832bfc HID: trivial devm... |
107 |
return ret; |
14a21cd45 HID: move a4tech ... |
108 |
} |
93c10132a HID: move connect... |
109 |
ret = hid_hw_start(hdev, HID_CONNECT_DEFAULT); |
14a21cd45 HID: move a4tech ... |
110 |
if (ret) { |
4291ee305 HID: Add and use ... |
111 112 |
hid_err(hdev, "hw start failed "); |
abf832bfc HID: trivial devm... |
113 |
return ret; |
14a21cd45 HID: move a4tech ... |
114 115 116 |
} return 0; |
14a21cd45 HID: move a4tech ... |
117 118 119 120 121 122 123 |
} static const struct hid_device_id a4_devices[] = { { HID_USB_DEVICE(USB_VENDOR_ID_A4TECH, USB_DEVICE_ID_A4TECH_WCP32PU), .driver_data = A4_2WHEEL_MOUSE_HACK_7 }, { HID_USB_DEVICE(USB_VENDOR_ID_A4TECH, USB_DEVICE_ID_A4TECH_X5_005D), .driver_data = A4_2WHEEL_MOUSE_HACK_B8 }, |
b7e1b2039 HID: fix A4Tech R... |
124 125 |
{ HID_USB_DEVICE(USB_VENDOR_ID_A4TECH, USB_DEVICE_ID_A4TECH_RP_649), .driver_data = A4_2WHEEL_MOUSE_HACK_B8 }, |
14a21cd45 HID: move a4tech ... |
126 127 128 129 130 131 132 133 134 135 |
{ } }; MODULE_DEVICE_TABLE(hid, a4_devices); static struct hid_driver a4_driver = { .name = "a4tech", .id_table = a4_devices, .input_mapped = a4_input_mapped, .event = a4_event, .probe = a4_probe, |
14a21cd45 HID: move a4tech ... |
136 |
}; |
f425458ea HID: Use module_h... |
137 |
module_hid_driver(a4_driver); |
14a21cd45 HID: move a4tech ... |
138 |
|
14a21cd45 HID: move a4tech ... |
139 |
MODULE_LICENSE("GPL"); |