Blame view

drivers/hid/hid-belkin.c 2.14 KB
2874c5fd2   Thomas Gleixner   treewide: Replace...
1
  // SPDX-License-Identifier: GPL-2.0-or-later
b5635b129   Jiri Slaby   HID: move belkin ...
2
3
4
5
6
7
8
  /*
   *  HID driver for some belkin "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
b5635b129   Jiri Slaby   HID: move belkin ...
9
10
11
12
   *  Copyright (c) 2008 Jiri Slaby
   */
  
  /*
b5635b129   Jiri Slaby   HID: move belkin ...
13
14
15
16
17
18
19
20
21
22
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
   */
  
  #include <linux/device.h>
  #include <linux/hid.h>
  #include <linux/module.h>
  
  #include "hid-ids.h"
  
  #define BELKIN_HIDDEV	0x01
  #define BELKIN_WKBD	0x02
  
  #define belkin_map_key_clear(c)	hid_map_usage_clear(hi, usage, bit, max, \
  					EV_KEY, (c))
  static int belkin_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);
  
  	if ((usage->hid & HID_USAGE_PAGE) != HID_UP_CONSUMER ||
  			!(quirks & BELKIN_WKBD))
  		return 0;
  
  	switch (usage->hid & HID_USAGE) {
  	case 0x03a: belkin_map_key_clear(KEY_SOUND);		break;
  	case 0x03b: belkin_map_key_clear(KEY_CAMERA);		break;
  	case 0x03c: belkin_map_key_clear(KEY_DOCUMENTS);	break;
  	default:
  		return 0;
  	}
  	return 1;
  }
  
  static int belkin_probe(struct hid_device *hdev, const struct hid_device_id *id)
  {
  	unsigned long quirks = id->driver_data;
  	int ret;
  
  	hid_set_drvdata(hdev, (void *)quirks);
b5635b129   Jiri Slaby   HID: move belkin ...
52
53
  	ret = hid_parse(hdev);
  	if (ret) {
4291ee305   Joe Perches   HID: Add and use ...
54
55
  		hid_err(hdev, "parse failed
  ");
b5635b129   Jiri Slaby   HID: move belkin ...
56
57
  		goto err_free;
  	}
93c10132a   Jiri Slaby   HID: move connect...
58
59
  	ret = hid_hw_start(hdev, HID_CONNECT_DEFAULT |
  		((quirks & BELKIN_HIDDEV) ? HID_CONNECT_HIDDEV_FORCE : 0));
b5635b129   Jiri Slaby   HID: move belkin ...
60
  	if (ret) {
4291ee305   Joe Perches   HID: Add and use ...
61
62
  		hid_err(hdev, "hw start failed
  ");
b5635b129   Jiri Slaby   HID: move belkin ...
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
  		goto err_free;
  	}
  
  	return 0;
  err_free:
  	return ret;
  }
  
  static const struct hid_device_id belkin_devices[] = {
  	{ HID_USB_DEVICE(USB_VENDOR_ID_BELKIN, USB_DEVICE_ID_FLIP_KVM),
  		.driver_data = BELKIN_HIDDEV },
  	{ HID_USB_DEVICE(USB_VENDOR_ID_LABTEC, USB_DEVICE_ID_LABTEC_WIRELESS_KEYBOARD),
  		.driver_data = BELKIN_WKBD },
  	{ }
  };
  MODULE_DEVICE_TABLE(hid, belkin_devices);
  
  static struct hid_driver belkin_driver = {
  	.name = "belkin",
  	.id_table = belkin_devices,
  	.input_mapping = belkin_input_mapping,
  	.probe = belkin_probe,
  };
f425458ea   H Hartley Sweeten   HID: Use module_h...
86
  module_hid_driver(belkin_driver);
b5635b129   Jiri Slaby   HID: move belkin ...
87

b5635b129   Jiri Slaby   HID: move belkin ...
88
  MODULE_LICENSE("GPL");