Skip to content

Commit

Permalink
Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel…
Browse files Browse the repository at this point in the history
…/git/jikos/hid

Pull HID updates from Jiri Kosina:

 - 3rd generation Wacom Intuos BT device support from Aaron Armstrong
   Skomra

 - support for NSG-MR5U and NSG-MR7U devices from Todd Kelner

 - multitouch Razer Blade Stealth support from Benjamin Tissoires

 - Elantech touchpad support from Alexandrov Stansilav

 - a few other scattered-around fixes and cleanups to drivers and
   generic code

* 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jikos/hid: (31 commits)
  HID: google: Enable PM Full On mode when adjusting backlight
  HID: google: add google hammer HID driver
  HID: core: reset the quirks before calling probe again
  HID: multitouch: do not set HID_QUIRK_NO_INIT_REPORTS
  HID: core: remove the need for HID_QUIRK_NO_EMPTY_INPUT
  HID: use BIT() macro for quirks too
  HID: use BIT macro instead of plain integers for flags
  HID: multitouch: remove dead zones of Razer Blade Stealth
  HID: multitouch: export a quirk for the button handling of touchpads
  HID: usbhid: extend the polling interval configuration to keyboards
  HID: ntrig: document sysfs interface
  HID: wacom: wacom_wac_collection() is local to wacom_wac.c
  HID: wacom: generic: add the "Report Valid" usage
  HID: wacom: generic: Support multiple tools per report
  HID: wacom: Add support for 3rd generation Intuos BT
  HID: core: rewrite the hid-generic automatic unbind
  HID: sony: Add touchpad support for NSG-MR5U and NSG-MR7U remotes
  HID: hid-multitouch: Use true and false for boolean values
  HID: hid-ntrig: use true and false for boolean values
  HID: logitech-hidpp: document sysfs interface
  ...
  • Loading branch information
torvalds committed Apr 5, 2018
2 parents e02d37b + 9931753 commit e8403b4
Show file tree
Hide file tree
Showing 27 changed files with 1,180 additions and 253 deletions.
19 changes: 19 additions & 0 deletions Documentation/ABI/testing/sysfs-driver-hid-logitech-hidpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
What: /sys/bus/hid/drivers/logitech-hidpp-device/<dev>/range
Date: Jan, 2016
KernelVersion: 4.6
Contact: [email protected]
Description:
(RW) This attribute controls the amount of 'turn' permitted in
Logitech G920 wheel. Reading from the file shows the current
range of the steering wheel. Writing a value within the min and
max boundary sets the range of the wheel.

What: /sys/bus/hid/drivers/logitech-hidpp-device/<dev>/builtin_power_supply
Date: Apr, 2017
KernelVersion: 4.12
Contact: [email protected]
Description:
Presence of this file indicates that HID++ driver is capable of
handling battery properties in the kernel. This way, upower can
add a udev rule to decide whether or not it should use the
internal unifying support or the generic kernel one.
70 changes: 70 additions & 0 deletions Documentation/ABI/testing/sysfs-driver-hid-ntrig
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
What: /sys/bus/hid/drivers/ntrig/<dev>/activate_slack
Date: May, 2010
KernelVersion: 2.6.35
Contact: [email protected]
Description:
(RW) Number of contact frames ignored before acknowledging the
start of activity (activating touch).


What: /sys/bus/hid/drivers/ntrig/<dev>/decativate_slack
Date: May, 2010
KernelVersion: 2.6.35
Contact: [email protected]
Description:
(RW) Number of empty (no contact) frames ignored before
acknowledging the end of activity (deactivating touch).

When the last finger is removed from the device, it sends a
number of empty frames. By holding off on deactivation for a few
frames false erroneous disconnects can be tolerated, where the
sensor may mistakenly not detect a finger that is still present.


What: /sys/bus/hid/drivers/ntrig/<dev>/activation_width
What: /sys/bus/hid/drivers/ntrig/<dev>/activation_height
Date: May, 2010
KernelVersion: 2.6.35
Contact: [email protected]
Description:
Threholds to override activation slack.

activation_width: (RW) Width threshold to immediately
start processing touch events.

activation_height: (RW) Height threshold to immediately
start processing touch events.


What: /sys/bus/hid/drivers/ntrig/<dev>/min_width
What: /sys/bus/hid/drivers/ntrig/<dev>/min_height
Date: May, 2010
KernelVersion: 2.6.35
Contact: [email protected]
Description:
Minimum size contact accepted.

min_width: (RW) Minimum touch contact width to decide
activation and activity.

min_height: (RW) Minimum touch contact height to decide
activation and activity.


What: /sys/bus/hid/drivers/ntrig/<dev>/sensor_physical_width
What: /sys/bus/hid/drivers/ntrig/<dev>/sensor_physical_height
Date: May, 2010
KernelVersion: 2.6.35
Contact: [email protected]
Description:
(RO) These are internal ranges not used for normal events but
useful for tuning.


What: /sys/bus/hid/drivers/ntrig/<dev>/sensor_logical_width
What: /sys/bus/hid/drivers/ntrig/<dev>/sensor_logical_height
Date: May, 2010
KernelVersion: 2.6.35
Contact: [email protected]
Description:
(RO) The range for positions reported during activity.
3 changes: 3 additions & 0 deletions Documentation/admin-guide/kernel-parameters.txt
Original file line number Diff line number Diff line change
Expand Up @@ -4456,6 +4456,9 @@
usbhid.jspoll=
[USBHID] The interval which joysticks are to be polled at.

usbhid.kbpoll=
[USBHID] The interval which keyboards are to be polled at.

usb-storage.delay_use=
[UMS] The delay in seconds before a new device is
scanned for Logical Units (default 1).
Expand Down
20 changes: 17 additions & 3 deletions drivers/hid/Kconfig
Original file line number Diff line number Diff line change
Expand Up @@ -274,15 +274,23 @@ config HID_EMS_FF
Currently the following devices are known to be supported:
- Trio Linker Plus II

config HID_ELAN
tristate "ELAN USB Touchpad Support"
depends on LEDS_CLASS && USB_HID
---help---
Say Y to enable support for the USB ELAN touchpad
Currently the following devices are known to be supported:
- HP Pavilion X2 10-p0XX.

config HID_ELECOM
tristate "ELECOM HID devices"
depends on HID
---help---
Support for ELECOM devices:
- BM084 Bluetooth Mouse
- EX-G Trackball (Wired and wireless)
- DEFT Trackball (Wired and wireless)
- HUGE Trackball (Wired and wireless)
- EX-G Trackballs (M-XT3DRBK, M-XT3URBK)
- DEFT Trackballs (M-DT1DRBK, M-DT1URBK, M-DT2DRBK, M-DT2URBK)
- HUGE Trackballs (M-HT1DRBK, M-HT1URBK)

config HID_ELO
tristate "ELO USB 4000/4500 touchscreen"
Expand Down Expand Up @@ -331,6 +339,12 @@ config HOLTEK_FF
Say Y here if you have a Holtek On Line Grip based game controller
and want to have force feedback support for it.

config HID_GOOGLE_HAMMER
tristate "Google Hammer Keyboard"
depends on USB_HID && LEDS_CLASS
---help---
Say Y here if you have a Google Hammer device.

config HID_GT683R
tristate "MSI GT68xR LED support"
depends on LEDS_CLASS && USB_HID
Expand Down
2 changes: 2 additions & 0 deletions drivers/hid/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -39,11 +39,13 @@ obj-$(CONFIG_HID_CP2112) += hid-cp2112.o
obj-$(CONFIG_HID_CYPRESS) += hid-cypress.o
obj-$(CONFIG_HID_DRAGONRISE) += hid-dr.o
obj-$(CONFIG_HID_EMS_FF) += hid-emsff.o
obj-$(CONFIG_HID_ELAN) += hid-elan.o
obj-$(CONFIG_HID_ELECOM) += hid-elecom.o
obj-$(CONFIG_HID_ELO) += hid-elo.o
obj-$(CONFIG_HID_EZKEY) += hid-ezkey.o
obj-$(CONFIG_HID_GEMBIRD) += hid-gembird.o
obj-$(CONFIG_HID_GFRM) += hid-gfrm.o
obj-$(CONFIG_HID_GOOGLE_HAMMER) += hid-google-hammer.o
obj-$(CONFIG_HID_GT683R) += hid-gt683r.o
obj-$(CONFIG_HID_GYRATION) += hid-gyration.o
obj-$(CONFIG_HID_HOLTEK) += hid-holtek-kbd.o
Expand Down
7 changes: 4 additions & 3 deletions drivers/hid/hid-asus.c
Original file line number Diff line number Diff line change
Expand Up @@ -570,7 +570,9 @@ static int asus_input_mapping(struct hid_device *hdev,
static int asus_start_multitouch(struct hid_device *hdev)
{
int ret;
const unsigned char buf[] = { FEATURE_REPORT_ID, 0x00, 0x03, 0x01, 0x00 };
static const unsigned char buf[] = {
FEATURE_REPORT_ID, 0x00, 0x03, 0x01, 0x00
};
unsigned char *dmabuf = kmemdup(buf, sizeof(buf), GFP_KERNEL);

if (!dmabuf) {
Expand Down Expand Up @@ -644,8 +646,7 @@ static int asus_probe(struct hid_device *hdev, const struct hid_device_id *id)
* All functionality is on a single HID interface and for
* userspace the touchpad must be a separate input_dev.
*/
hdev->quirks |= HID_QUIRK_MULTI_INPUT |
HID_QUIRK_NO_EMPTY_INPUT;
hdev->quirks |= HID_QUIRK_MULTI_INPUT;
drvdata->tp = &asus_t100chi_tp;
}

Expand Down
47 changes: 31 additions & 16 deletions drivers/hid/hid-core.c
Original file line number Diff line number Diff line change
Expand Up @@ -1365,7 +1365,7 @@ u8 *hid_alloc_report_buf(struct hid_report *report, gfp_t flags)
* of implement() working on 8 byte chunks
*/

int len = hid_report_len(report) + 7;
u32 len = hid_report_len(report) + 7;

return kmalloc(len, flags);
}
Expand Down Expand Up @@ -1430,7 +1430,7 @@ void __hid_request(struct hid_device *hid, struct hid_report *report,
{
char *buf;
int ret;
int len;
u32 len;

buf = hid_alloc_report_buf(report, GFP_KERNEL);
if (!buf)
Expand All @@ -1456,14 +1456,14 @@ void __hid_request(struct hid_device *hid, struct hid_report *report,
}
EXPORT_SYMBOL_GPL(__hid_request);

int hid_report_raw_event(struct hid_device *hid, int type, u8 *data, int size,
int hid_report_raw_event(struct hid_device *hid, int type, u8 *data, u32 size,
int interrupt)
{
struct hid_report_enum *report_enum = hid->report_enum + type;
struct hid_report *report;
struct hid_driver *hdrv;
unsigned int a;
int rsize, csize = size;
u32 rsize, csize = size;
u8 *cdata = data;
int ret = 0;

Expand Down Expand Up @@ -1521,7 +1521,7 @@ EXPORT_SYMBOL_GPL(hid_report_raw_event);
*
* This is data entry for lower layers.
*/
int hid_input_report(struct hid_device *hid, int type, u8 *data, int size, int interrupt)
int hid_input_report(struct hid_device *hid, int type, u8 *data, u32 size, int interrupt)
{
struct hid_report_enum *report_enum;
struct hid_driver *hdrv;
Expand Down Expand Up @@ -1966,6 +1966,8 @@ static int hid_device_probe(struct device *dev)
}
}

/* reset the quirks that has been previously set */
hdev->quirks = hid_lookup_quirk(hdev);
hdev->driver = hdrv;
if (hdrv->probe) {
ret = hdrv->probe(hdev, id);
Expand Down Expand Up @@ -2197,31 +2199,40 @@ void hid_destroy_device(struct hid_device *hdev)
EXPORT_SYMBOL_GPL(hid_destroy_device);


static int __bus_add_driver(struct device_driver *drv, void *data)
static int __hid_bus_reprobe_drivers(struct device *dev, void *data)
{
struct hid_driver *added_hdrv = data;
struct hid_driver *hdrv = to_hid_driver(drv);
struct hid_driver *hdrv = data;
struct hid_device *hdev = to_hid_device(dev);

if (hdrv->bus_add_driver)
hdrv->bus_add_driver(added_hdrv);
if (hdev->driver == hdrv &&
!hdrv->match(hdev, hid_ignore_special_drivers))
return device_reprobe(dev);

return 0;
}

static int __bus_removed_driver(struct device_driver *drv, void *data)
static int __hid_bus_driver_added(struct device_driver *drv, void *data)
{
struct hid_driver *removed_hdrv = data;
struct hid_driver *hdrv = to_hid_driver(drv);

if (hdrv->bus_removed_driver)
hdrv->bus_removed_driver(removed_hdrv);
if (hdrv->match) {
bus_for_each_dev(&hid_bus_type, NULL, hdrv,
__hid_bus_reprobe_drivers);
}

return 0;
}

static int __bus_removed_driver(struct device_driver *drv, void *data)
{
return bus_rescan_devices(&hid_bus_type);
}

int __hid_register_driver(struct hid_driver *hdrv, struct module *owner,
const char *mod_name)
{
int ret;

hdrv->driver.name = hdrv->name;
hdrv->driver.bus = &hid_bus_type;
hdrv->driver.owner = owner;
Expand All @@ -2230,9 +2241,13 @@ int __hid_register_driver(struct hid_driver *hdrv, struct module *owner,
INIT_LIST_HEAD(&hdrv->dyn_list);
spin_lock_init(&hdrv->dyn_lock);

bus_for_each_drv(&hid_bus_type, NULL, hdrv, __bus_add_driver);
ret = driver_register(&hdrv->driver);

if (ret == 0)
bus_for_each_drv(&hid_bus_type, NULL, NULL,
__hid_bus_driver_added);

return driver_register(&hdrv->driver);
return ret;
}
EXPORT_SYMBOL_GPL(__hid_register_driver);

Expand Down
24 changes: 18 additions & 6 deletions drivers/hid/hid-corsair.c
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,14 @@
* HID driver for Corsair devices
*
* Supported devices:
* - Vengeance K70 Keyboard
* - K70 RAPIDFIRE Keyboard
* - Vengeance K90 Keyboard
* - Scimitar PRO RGB Gaming Mouse
*
* Copyright (c) 2015 Clement Vuchener
* Copyright (c) 2017 Oscar Campos
* Copyright (c) 2017 Aaron Bottegal
*/

/*
Expand Down Expand Up @@ -673,15 +676,16 @@ static int corsair_input_mapping(struct hid_device *dev,
}

/*
* The report descriptor of Corsair Scimitar RGB Pro gaming mouse is
* The report descriptor of some of the Corsair gaming mice is
* non parseable as they define two consecutive Logical Minimum for
* the Usage Page (Consumer) in rdescs bytes 75 and 77 being 77 0x16
* that should be obviousy 0x26 for Logical Magimum of 16 bits. This
* prevents poper parsing of the report descriptor due Logical
* Minimum being larger than Logical Maximum.
*
* This driver fixes the report descriptor for:
* - USB ID b1c:1b3e, sold as Scimitar RGB Pro Gaming mouse
* - USB ID 1b1c:1b34, sold as GLAIVE RGB Gaming mouse
* - USB ID 1b1c:1b3e, sold as Scimitar RGB Pro Gaming mouse
*/

static __u8 *corsair_mouse_report_fixup(struct hid_device *hdev, __u8 *rdesc,
Expand All @@ -691,13 +695,14 @@ static __u8 *corsair_mouse_report_fixup(struct hid_device *hdev, __u8 *rdesc,

if (intf->cur_altsetting->desc.bInterfaceNumber == 1) {
/*
* Corsair Scimitar RGB Pro report descriptor is broken and
* defines two different Logical Minimum for the Consumer
* Application. The byte 77 should be a 0x26 defining a 16
* bits integer for the Logical Maximum but it is a 0x16
* Corsair GLAIVE RGB and Scimitar RGB Pro report descriptor is
* broken and defines two different Logical Minimum for the
* Consumer Application. The byte 77 should be a 0x26 defining
* a 16 bits integer for the Logical Maximum but it is a 0x16
* instead (Logical Minimum)
*/
switch (hdev->product) {
case USB_DEVICE_ID_CORSAIR_GLAIVE_RGB:
case USB_DEVICE_ID_CORSAIR_SCIMITAR_PRO_RGB:
if (*rsize >= 172 && rdesc[75] == 0x15 && rdesc[77] == 0x16
&& rdesc[78] == 0xff && rdesc[79] == 0x0f) {
Expand All @@ -715,8 +720,15 @@ static const struct hid_device_id corsair_devices[] = {
{ HID_USB_DEVICE(USB_VENDOR_ID_CORSAIR, USB_DEVICE_ID_CORSAIR_K90),
.driver_data = CORSAIR_USE_K90_MACRO |
CORSAIR_USE_K90_BACKLIGHT },
{ HID_USB_DEVICE(USB_VENDOR_ID_CORSAIR,
USB_DEVICE_ID_CORSAIR_GLAIVE_RGB) },
{ HID_USB_DEVICE(USB_VENDOR_ID_CORSAIR,
USB_DEVICE_ID_CORSAIR_SCIMITAR_PRO_RGB) },
/*
* Vengeance K70 and K70 RAPIDFIRE share product IDs.
*/
{ HID_USB_DEVICE(USB_VENDOR_ID_CORSAIR,
USB_DEVICE_ID_CORSAIR_K70R) },
{}
};

Expand Down
Loading

0 comments on commit e8403b4

Please sign in to comment.