Skip to content

Commit b4d8e47

Browse files
jirislabyJiri Kosina
authored andcommitted
HID: fix hidbus/appletouch device binding regression
The appletouch mouse devices are grabbed by the hid bus and not released even if apple driver says ENODEV (as expected) -- these are composite USB devices, for which we only ignore the mouse interface. This is currently not handled by hidbus code properly. Move the ignoring one level upper to forbid the hid layer to grab the device. Reported-by: Justin Mattock <[email protected]> Reported-by: Steven Noonan <[email protected]> Signed-off-by: Jiri Slaby <[email protected]> Signed-off-by: Jiri Kosina <[email protected]>
1 parent a73a637 commit b4d8e47

File tree

2 files changed

+60
-41
lines changed

2 files changed

+60
-41
lines changed

drivers/hid/hid-apple.c

Lines changed: 22 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -312,13 +312,6 @@ static int apple_probe(struct hid_device *hdev,
312312
unsigned int connect_mask = HID_CONNECT_DEFAULT;
313313
int ret;
314314

315-
/* return something else or move to hid layer? device will reside
316-
allocated */
317-
if (id->bus == BUS_USB && (quirks & APPLE_IGNORE_MOUSE) &&
318-
to_usb_interface(hdev->dev.parent)->cur_altsetting->
319-
desc.bInterfaceProtocol == USB_INTERFACE_PROTOCOL_MOUSE)
320-
return -ENODEV;
321-
322315
asc = kzalloc(sizeof(*asc), GFP_KERNEL);
323316
if (asc == NULL) {
324317
dev_err(&hdev->dev, "can't alloc apple descriptor\n");
@@ -367,53 +360,45 @@ static const struct hid_device_id apple_devices[] = {
367360
.driver_data = APPLE_MIGHTYMOUSE | APPLE_INVERT_HWHEEL },
368361

369362
{ HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_FOUNTAIN_ANSI),
370-
.driver_data = APPLE_NUMLOCK_EMULATION | APPLE_HAS_FN |
371-
APPLE_IGNORE_MOUSE },
363+
.driver_data = APPLE_NUMLOCK_EMULATION | APPLE_HAS_FN },
372364
{ HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_FOUNTAIN_ISO),
373-
.driver_data = APPLE_NUMLOCK_EMULATION | APPLE_HAS_FN |
374-
APPLE_IGNORE_MOUSE },
365+
.driver_data = APPLE_NUMLOCK_EMULATION | APPLE_HAS_FN },
375366
{ HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER_ANSI),
376-
.driver_data = APPLE_NUMLOCK_EMULATION | APPLE_HAS_FN |
377-
APPLE_IGNORE_MOUSE },
367+
.driver_data = APPLE_NUMLOCK_EMULATION | APPLE_HAS_FN },
378368
{ HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER_ISO),
379369
.driver_data = APPLE_NUMLOCK_EMULATION | APPLE_HAS_FN |
380-
APPLE_IGNORE_MOUSE | APPLE_ISO_KEYBOARD },
370+
APPLE_ISO_KEYBOARD },
381371
{ HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER_JIS),
382-
.driver_data = APPLE_NUMLOCK_EMULATION | APPLE_HAS_FN |
383-
APPLE_IGNORE_MOUSE },
372+
.driver_data = APPLE_NUMLOCK_EMULATION | APPLE_HAS_FN },
384373
{ HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER3_ANSI),
385-
.driver_data = APPLE_NUMLOCK_EMULATION | APPLE_HAS_FN |
386-
APPLE_IGNORE_MOUSE },
374+
.driver_data = APPLE_NUMLOCK_EMULATION | APPLE_HAS_FN },
387375
{ HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER3_ISO),
388376
.driver_data = APPLE_NUMLOCK_EMULATION | APPLE_HAS_FN |
389-
APPLE_IGNORE_MOUSE | APPLE_ISO_KEYBOARD },
377+
APPLE_ISO_KEYBOARD },
390378
{ HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER3_JIS),
391379
.driver_data = APPLE_NUMLOCK_EMULATION | APPLE_HAS_FN |
392-
APPLE_IGNORE_MOUSE | APPLE_RDESC_JIS },
380+
APPLE_RDESC_JIS },
393381
{ HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER4_ANSI),
394-
.driver_data = APPLE_NUMLOCK_EMULATION | APPLE_HAS_FN |
395-
APPLE_IGNORE_MOUSE },
382+
.driver_data = APPLE_NUMLOCK_EMULATION | APPLE_HAS_FN },
396383
{ HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER4_ISO),
397384
.driver_data = APPLE_NUMLOCK_EMULATION | APPLE_HAS_FN |
398-
APPLE_IGNORE_MOUSE | APPLE_ISO_KEYBOARD },
385+
APPLE_ISO_KEYBOARD },
399386
{ HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER4_JIS),
400387
.driver_data = APPLE_NUMLOCK_EMULATION | APPLE_HAS_FN |
401-
APPLE_IGNORE_MOUSE | APPLE_RDESC_JIS},
388+
APPLE_RDESC_JIS },
402389
{ HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_ANSI),
403390
.driver_data = APPLE_HAS_FN },
404391
{ HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_ISO),
405392
.driver_data = APPLE_HAS_FN | APPLE_ISO_KEYBOARD },
406393
{ HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_JIS),
407394
.driver_data = APPLE_HAS_FN },
408395
{ HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER4_HF_ANSI),
409-
.driver_data = APPLE_NUMLOCK_EMULATION | APPLE_HAS_FN |
410-
APPLE_IGNORE_MOUSE },
396+
.driver_data = APPLE_NUMLOCK_EMULATION | APPLE_HAS_FN },
411397
{ HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER4_HF_ISO),
412-
.driver_data = APPLE_NUMLOCK_EMULATION | APPLE_HAS_FN |
413-
APPLE_IGNORE_MOUSE },
398+
.driver_data = APPLE_NUMLOCK_EMULATION | APPLE_HAS_FN },
414399
{ HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER4_HF_JIS),
415400
.driver_data = APPLE_NUMLOCK_EMULATION | APPLE_HAS_FN |
416-
APPLE_IGNORE_MOUSE | APPLE_RDESC_JIS },
401+
APPLE_RDESC_JIS },
417402
{ HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_WIRELESS_ANSI),
418403
.driver_data = APPLE_NUMLOCK_EMULATION | APPLE_HAS_FN },
419404
{ HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_WIRELESS_ISO),
@@ -422,25 +407,21 @@ static const struct hid_device_id apple_devices[] = {
422407
{ HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_WIRELESS_JIS),
423408
.driver_data = APPLE_NUMLOCK_EMULATION | APPLE_HAS_FN },
424409
{ HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING_ANSI),
425-
.driver_data = APPLE_HAS_FN | APPLE_IGNORE_MOUSE },
410+
.driver_data = APPLE_HAS_FN },
426411
{ HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING_ISO),
427-
.driver_data = APPLE_HAS_FN | APPLE_ISO_KEYBOARD |
428-
APPLE_IGNORE_MOUSE },
412+
.driver_data = APPLE_HAS_FN | APPLE_ISO_KEYBOARD },
429413
{ HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING_JIS),
430-
.driver_data = APPLE_HAS_FN | APPLE_IGNORE_MOUSE | APPLE_RDESC_JIS },
414+
.driver_data = APPLE_HAS_FN | APPLE_RDESC_JIS },
431415
{ HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING2_ANSI),
432-
.driver_data = APPLE_HAS_FN | APPLE_IGNORE_MOUSE },
416+
.driver_data = APPLE_HAS_FN },
433417
{ HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING2_ISO),
434-
.driver_data = APPLE_HAS_FN | APPLE_ISO_KEYBOARD |
435-
APPLE_IGNORE_MOUSE },
418+
.driver_data = APPLE_HAS_FN | APPLE_ISO_KEYBOARD },
436419
{ HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING2_JIS),
437-
.driver_data = APPLE_HAS_FN | APPLE_IGNORE_MOUSE | APPLE_RDESC_JIS },
420+
.driver_data = APPLE_HAS_FN | APPLE_RDESC_JIS },
438421
{ HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_FOUNTAIN_TP_ONLY),
439-
.driver_data = APPLE_NUMLOCK_EMULATION | APPLE_HAS_FN |
440-
APPLE_IGNORE_MOUSE },
422+
.driver_data = APPLE_NUMLOCK_EMULATION | APPLE_HAS_FN },
441423
{ HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER1_TP_ONLY),
442-
.driver_data = APPLE_NUMLOCK_EMULATION | APPLE_HAS_FN |
443-
APPLE_IGNORE_MOUSE },
424+
.driver_data = APPLE_NUMLOCK_EMULATION | APPLE_HAS_FN },
444425

445426
/* Apple wireless Mighty Mouse */
446427
{ HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_APPLE, 0x030c),

drivers/hid/hid-core.c

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1541,6 +1541,40 @@ static const struct hid_device_id hid_ignore_list[] = {
15411541
{ }
15421542
};
15431543

1544+
/**
1545+
* hid_mouse_ignore_list - mouse devices which should not be handled by the hid layer
1546+
*
1547+
* There are composite devices for which we want to ignore only a certain
1548+
* interface. This is a list of devices for which only the mouse interface will
1549+
* be ignored. This allows a dedicated driver to take care of the interface.
1550+
*/
1551+
static const struct hid_device_id hid_mouse_ignore_list[] = {
1552+
/* appletouch driver */
1553+
{ HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_FOUNTAIN_ANSI) },
1554+
{ HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_FOUNTAIN_ISO) },
1555+
{ HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER_ANSI) },
1556+
{ HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER_ISO) },
1557+
{ HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER_JIS) },
1558+
{ HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER3_ANSI) },
1559+
{ HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER3_ISO) },
1560+
{ HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER3_JIS) },
1561+
{ HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER4_ANSI) },
1562+
{ HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER4_ISO) },
1563+
{ HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER4_JIS) },
1564+
{ HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER4_HF_ANSI) },
1565+
{ HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER4_HF_ISO) },
1566+
{ HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER4_HF_JIS) },
1567+
{ HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING_ANSI) },
1568+
{ HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING_ISO) },
1569+
{ HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING_JIS) },
1570+
{ HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING2_ANSI) },
1571+
{ HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING2_ISO) },
1572+
{ HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING2_JIS) },
1573+
{ HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_FOUNTAIN_TP_ONLY) },
1574+
{ HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER1_TP_ONLY) },
1575+
{ }
1576+
};
1577+
15441578
static bool hid_ignore(struct hid_device *hdev)
15451579
{
15461580
switch (hdev->vendor) {
@@ -1557,6 +1591,10 @@ static bool hid_ignore(struct hid_device *hdev)
15571591
break;
15581592
}
15591593

1594+
if (hdev->type == HID_TYPE_USBMOUSE &&
1595+
hid_match_id(hdev, hid_mouse_ignore_list))
1596+
return true;
1597+
15601598
return !!hid_match_id(hdev, hid_ignore_list);
15611599
}
15621600

0 commit comments

Comments
 (0)