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/hid/hid

Pull HID updates from Jiri Kosina:

 - fix for some modern devices that return multi-byte battery report,
   from Grant Likely

 - fix for devices with Resolution Multiplier, from Peter Hutterer

 - device probing speed increase, from Dmitry Torokhov

 - ThinkPad 10 Ultrabook Keyboard support, from Hans de Goede

 - other small assorted fixes and device ID additions

* 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/hid/hid:
  HID: quirks: add NOGET quirk for Logitech GROUP
  HID: Replace HTTP links with HTTPS ones
  HID: udraw-ps3: Replace HTTP links with HTTPS ones
  HID: mcp2221: Replace HTTP links with HTTPS ones
  HID: input: Fix devices that return multiple bytes in battery report
  HID: lenovo: Fix spurious F23 key press report during resume from suspend
  HID: lenovo: Add ThinkPad 10 Ultrabook Keyboard fn_lock support
  HID: lenovo: Add ThinkPad 10 Ultrabook Keyboard support
  HID: lenovo: Rename fn_lock sysfs attr handlers to make them generic
  HID: lenovo: Factor out generic parts of the LED code
  HID: lenovo: Merge tpkbd and cptkbd data structures
  HID: intel-ish-hid: Replace PCI_DEV_FLAGS_NO_D3 with pci_save_state
  HID: Wiimote: Treat the d-pad as an analogue stick
  HID: input: do not run GET_REPORT unless there's a Resolution Multiplier
  HID: usbhid: remove redundant assignment to variable retval
  HID: usbhid: do not sleep when opening device
  • Loading branch information
Linus Torvalds committed Aug 10, 2020
2 parents fc80c51 + e6b6e19 commit b7b8e36
Show file tree
Hide file tree
Showing 14 changed files with 404 additions and 150 deletions.
2 changes: 1 addition & 1 deletion drivers/hid/Kconfig
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ config HID
removed from the HID bus by the transport-layer drivers, such as
usbhid (USB_HID) and hidp (BT_HIDP).

For docs and specs, see http://www.usb.org/developers/hidpage/
For docs and specs, see https://www.usb.org/developers/hidpage/

If unsure, say Y.

Expand Down
2 changes: 1 addition & 1 deletion drivers/hid/hid-cp2112.c
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
* host communicates with the CP2112 via raw HID reports.
*
* Data Sheet:
* http://www.silabs.com/Support%20Documents/TechnicalDocs/CP2112.pdf
* https://www.silabs.com/Support%20Documents/TechnicalDocs/CP2112.pdf
* Programming Interface Specification:
* https://www.silabs.com/documents/public/application-notes/an495-cp2112-interface-specification.pdf
*/
Expand Down
2 changes: 2 additions & 0 deletions drivers/hid/hid-ids.h
Original file line number Diff line number Diff line change
Expand Up @@ -724,6 +724,7 @@
#define USB_DEVICE_ID_LENOVO_CUSBKBD 0x6047
#define USB_DEVICE_ID_LENOVO_CBTKBD 0x6048
#define USB_DEVICE_ID_LENOVO_SCROLLPOINT_OPTICAL 0x6049
#define USB_DEVICE_ID_LENOVO_TP10UBKBD 0x6062
#define USB_DEVICE_ID_LENOVO_TPPRODOCK 0x6067
#define USB_DEVICE_ID_LENOVO_X1_COVER 0x6085
#define USB_DEVICE_ID_LENOVO_PIXART_USB_MOUSE_608D 0x608d
Expand Down Expand Up @@ -773,6 +774,7 @@
#define USB_DEVICE_ID_LOGITECH_G27_WHEEL 0xc29b
#define USB_DEVICE_ID_LOGITECH_WII_WHEEL 0xc29c
#define USB_DEVICE_ID_LOGITECH_ELITE_KBD 0xc30a
#define USB_DEVICE_ID_LOGITECH_GROUP_AUDIO 0x0882
#define USB_DEVICE_ID_S510_RECEIVER 0xc50c
#define USB_DEVICE_ID_S510_RECEIVER_2 0xc517
#define USB_DEVICE_ID_LOGITECH_CORDLESS_DESKTOP_LX500 0xc512
Expand Down
36 changes: 23 additions & 13 deletions drivers/hid/hid-input.c
Original file line number Diff line number Diff line change
Expand Up @@ -350,13 +350,13 @@ static int hidinput_query_battery_capacity(struct hid_device *dev)
u8 *buf;
int ret;

buf = kmalloc(2, GFP_KERNEL);
buf = kmalloc(4, GFP_KERNEL);
if (!buf)
return -ENOMEM;

ret = hid_hw_raw_request(dev, dev->battery_report_id, buf, 2,
ret = hid_hw_raw_request(dev, dev->battery_report_id, buf, 4,
dev->battery_report_type, HID_REQ_GET_REPORT);
if (ret != 2) {
if (ret < 2) {
kfree(buf);
return -ENODATA;
}
Expand Down Expand Up @@ -1560,21 +1560,12 @@ static bool __hidinput_change_resolution_multipliers(struct hid_device *hid,
{
struct hid_usage *usage;
bool update_needed = false;
bool get_report_completed = false;
int i, j;

if (report->maxfield == 0)
return false;

/*
* If we have more than one feature within this report we
* need to fill in the bits from the others before we can
* overwrite the ones for the Resolution Multiplier.
*/
if (report->maxfield > 1) {
hid_hw_request(hid, report, HID_REQ_GET_REPORT);
hid_hw_wait(hid);
}

for (i = 0; i < report->maxfield; i++) {
__s32 value = use_logical_max ?
report->field[i]->logical_maximum :
Expand All @@ -1593,6 +1584,25 @@ static bool __hidinput_change_resolution_multipliers(struct hid_device *hid,
if (usage->hid != HID_GD_RESOLUTION_MULTIPLIER)
continue;

/*
* If we have more than one feature within this
* report we need to fill in the bits from the
* others before we can overwrite the ones for the
* Resolution Multiplier.
*
* But if we're not allowed to read from the device,
* we just bail. Such a device should not exist
* anyway.
*/
if (!get_report_completed && report->maxfield > 1) {
if (hid->quirks & HID_QUIRK_NO_INIT_REPORTS)
return update_needed;

hid_hw_request(hid, report, HID_REQ_GET_REPORT);
hid_hw_wait(hid);
get_report_completed = true;
}

report->field[i]->value[j] = value;
update_needed = true;
}
Expand Down
Loading

0 comments on commit b7b8e36

Please sign in to comment.