Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

HID: apple: Use country code to detect ISO keyboards

At least on newer laptops, Apple uses the same USB ID for both ISO and
ANSI keyboards. However, they have been good about filling in the
bCountryCode field in the HID descriptor on all of their keyboards. A
value of 13 indicates an ISO layout and other values indicate various
country-specific ANSI layouts.

With this patch, users of Apple US keyboards will no longer have to run
`echo 0 > /sys/module/hid_apple/parameters/iso_layout` to get a working
tilde key.

Please test this patch and send feedback if you have a Macbook or an
Apple keyboard.

Signed-off-by: Alex Henrie <alexhenrie24@gmail.com>
Reviewed-by: Benjamin Tissoires <benjamin.tissoires@redhat.com>
Signed-off-by: Jiri Kosina <jkosina@suse.cz>

authored by

Alex Henrie and committed by
Jiri Kosina
bd77a0f0 6df62e79

+27 -32
+27 -32
drivers/hid/hid-apple.c
··· 28 28 #define APPLE_IGNORE_MOUSE 0x0002 29 29 #define APPLE_HAS_FN 0x0004 30 30 #define APPLE_HIDDEV 0x0008 31 - #define APPLE_ISO_KEYBOARD 0x0010 31 + /* 0x0010 reserved, was: APPLE_ISO_KEYBOARD */ 32 32 #define APPLE_MIGHTYMOUSE 0x0020 33 33 #define APPLE_INVERT_HWHEEL 0x0040 34 34 #define APPLE_IGNORE_HIDINPUT 0x0080 35 35 #define APPLE_NUMLOCK_EMULATION 0x0100 36 36 37 37 #define APPLE_FLAG_FKEY 0x01 38 + 39 + #define HID_COUNTRY_INTERNATIONAL_ISO 13 38 40 39 41 static unsigned int fnmode = 1; 40 42 module_param(fnmode, uint, 0644); ··· 249 247 } 250 248 251 249 if (iso_layout) { 252 - if (asc->quirks & APPLE_ISO_KEYBOARD) { 250 + if (hid->country == HID_COUNTRY_INTERNATIONAL_ISO) { 253 251 trans = apple_find_translation(apple_iso_keyboard, usage->code); 254 252 if (trans) { 255 253 input_event(input, usage->type, trans->to, value); ··· 414 412 { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER_ANSI), 415 413 .driver_data = APPLE_NUMLOCK_EMULATION | APPLE_HAS_FN }, 416 414 { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER_ISO), 417 - .driver_data = APPLE_NUMLOCK_EMULATION | APPLE_HAS_FN | 418 - APPLE_ISO_KEYBOARD }, 415 + .driver_data = APPLE_NUMLOCK_EMULATION | APPLE_HAS_FN }, 419 416 { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER_JIS), 420 417 .driver_data = APPLE_NUMLOCK_EMULATION | APPLE_HAS_FN }, 421 418 { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER3_ANSI), 422 419 .driver_data = APPLE_NUMLOCK_EMULATION | APPLE_HAS_FN }, 423 420 { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER3_ISO), 424 - .driver_data = APPLE_NUMLOCK_EMULATION | APPLE_HAS_FN | 425 - APPLE_ISO_KEYBOARD }, 421 + .driver_data = APPLE_NUMLOCK_EMULATION | APPLE_HAS_FN }, 426 422 { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER3_JIS), 427 423 .driver_data = APPLE_NUMLOCK_EMULATION | APPLE_HAS_FN | 428 424 APPLE_RDESC_JIS }, 429 425 { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER4_ANSI), 430 426 .driver_data = APPLE_NUMLOCK_EMULATION | APPLE_HAS_FN }, 431 427 { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER4_ISO), 432 - .driver_data = APPLE_NUMLOCK_EMULATION | APPLE_HAS_FN | 433 - APPLE_ISO_KEYBOARD }, 428 + .driver_data = APPLE_NUMLOCK_EMULATION | APPLE_HAS_FN }, 434 429 { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER4_JIS), 435 430 .driver_data = APPLE_NUMLOCK_EMULATION | APPLE_HAS_FN | 436 431 APPLE_RDESC_JIS }, 437 432 { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_MINI_ANSI), 438 433 .driver_data = APPLE_HAS_FN }, 439 434 { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_MINI_ISO), 440 - .driver_data = APPLE_HAS_FN | APPLE_ISO_KEYBOARD }, 435 + .driver_data = APPLE_HAS_FN }, 441 436 { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_MINI_JIS), 442 437 .driver_data = APPLE_HAS_FN }, 443 438 { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_ANSI), 444 439 .driver_data = APPLE_HAS_FN }, 445 440 { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_ISO), 446 - .driver_data = APPLE_HAS_FN | APPLE_ISO_KEYBOARD }, 441 + .driver_data = APPLE_HAS_FN }, 447 442 { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_JIS), 448 443 .driver_data = APPLE_HAS_FN }, 449 444 { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER4_HF_ANSI), 450 445 .driver_data = APPLE_NUMLOCK_EMULATION | APPLE_HAS_FN }, 451 446 { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER4_HF_ISO), 452 - .driver_data = APPLE_NUMLOCK_EMULATION | APPLE_HAS_FN | 453 - APPLE_ISO_KEYBOARD }, 447 + .driver_data = APPLE_NUMLOCK_EMULATION | APPLE_HAS_FN }, 454 448 { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER4_HF_JIS), 455 449 .driver_data = APPLE_NUMLOCK_EMULATION | APPLE_HAS_FN | 456 450 APPLE_RDESC_JIS }, 457 451 { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_REVB_ANSI), 458 452 .driver_data = APPLE_HAS_FN }, 459 453 { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_REVB_ISO), 460 - .driver_data = APPLE_HAS_FN | APPLE_ISO_KEYBOARD }, 454 + .driver_data = APPLE_HAS_FN }, 461 455 { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_REVB_JIS), 462 456 .driver_data = APPLE_HAS_FN }, 463 457 { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_WIRELESS_ANSI), 464 458 .driver_data = APPLE_NUMLOCK_EMULATION | APPLE_HAS_FN }, 465 459 { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_WIRELESS_ISO), 466 - .driver_data = APPLE_NUMLOCK_EMULATION | APPLE_HAS_FN | 467 - APPLE_ISO_KEYBOARD }, 460 + .driver_data = APPLE_NUMLOCK_EMULATION | APPLE_HAS_FN }, 468 461 { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_WIRELESS_2011_ISO), 469 - .driver_data = APPLE_NUMLOCK_EMULATION | APPLE_HAS_FN | 470 - APPLE_ISO_KEYBOARD }, 462 + .driver_data = APPLE_NUMLOCK_EMULATION | APPLE_HAS_FN }, 471 463 { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_APPLE, 472 464 USB_DEVICE_ID_APPLE_ALU_WIRELESS_2011_ANSI), 473 465 .driver_data = APPLE_NUMLOCK_EMULATION | APPLE_HAS_FN }, ··· 475 479 { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING_ANSI), 476 480 .driver_data = APPLE_HAS_FN }, 477 481 { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING_ISO), 478 - .driver_data = APPLE_HAS_FN | APPLE_ISO_KEYBOARD }, 482 + .driver_data = APPLE_HAS_FN }, 479 483 { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING_JIS), 480 484 .driver_data = APPLE_HAS_FN | APPLE_RDESC_JIS }, 481 485 { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING2_ANSI), 482 486 .driver_data = APPLE_HAS_FN }, 483 487 { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING2_ISO), 484 - .driver_data = APPLE_HAS_FN | APPLE_ISO_KEYBOARD }, 488 + .driver_data = APPLE_HAS_FN }, 485 489 { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING2_JIS), 486 490 .driver_data = APPLE_HAS_FN | APPLE_RDESC_JIS }, 487 491 { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING3_ANSI), 488 492 .driver_data = APPLE_HAS_FN }, 489 493 { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING3_ISO), 490 - .driver_data = APPLE_HAS_FN | APPLE_ISO_KEYBOARD }, 494 + .driver_data = APPLE_HAS_FN }, 491 495 { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING3_JIS), 492 496 .driver_data = APPLE_HAS_FN | APPLE_RDESC_JIS }, 493 497 { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING4_ANSI), 494 498 .driver_data = APPLE_HAS_FN }, 495 499 { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING4_ISO), 496 - .driver_data = APPLE_HAS_FN | APPLE_ISO_KEYBOARD }, 500 + .driver_data = APPLE_HAS_FN }, 497 501 { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING4_JIS), 498 502 .driver_data = APPLE_HAS_FN | APPLE_RDESC_JIS }, 499 503 { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING4A_ANSI), 500 504 .driver_data = APPLE_HAS_FN }, 501 505 { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING4A_ISO), 502 - .driver_data = APPLE_HAS_FN | APPLE_ISO_KEYBOARD }, 506 + .driver_data = APPLE_HAS_FN }, 503 507 { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING4A_JIS), 504 508 .driver_data = APPLE_HAS_FN | APPLE_RDESC_JIS }, 505 509 { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING5_ANSI), 506 510 .driver_data = APPLE_HAS_FN }, 507 511 { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING5_ISO), 508 - .driver_data = APPLE_HAS_FN | APPLE_ISO_KEYBOARD }, 512 + .driver_data = APPLE_HAS_FN }, 509 513 { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING5_JIS), 510 514 .driver_data = APPLE_HAS_FN | APPLE_RDESC_JIS }, 511 515 { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING6_ANSI), 512 516 .driver_data = APPLE_HAS_FN }, 513 517 { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING6_ISO), 514 - .driver_data = APPLE_HAS_FN | APPLE_ISO_KEYBOARD }, 518 + .driver_data = APPLE_HAS_FN }, 515 519 { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING6_JIS), 516 520 .driver_data = APPLE_HAS_FN | APPLE_RDESC_JIS }, 517 521 { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING6A_ANSI), 518 522 .driver_data = APPLE_HAS_FN }, 519 523 { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING6A_ISO), 520 - .driver_data = APPLE_HAS_FN | APPLE_ISO_KEYBOARD }, 524 + .driver_data = APPLE_HAS_FN }, 521 525 { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING6A_JIS), 522 526 .driver_data = APPLE_HAS_FN | APPLE_RDESC_JIS }, 523 527 { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING5A_ANSI), 524 528 .driver_data = APPLE_HAS_FN }, 525 529 { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING5A_ISO), 526 - .driver_data = APPLE_HAS_FN | APPLE_ISO_KEYBOARD }, 530 + .driver_data = APPLE_HAS_FN }, 527 531 { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING5A_JIS), 528 532 .driver_data = APPLE_HAS_FN | APPLE_RDESC_JIS }, 529 533 { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING7_ANSI), 530 534 .driver_data = APPLE_HAS_FN }, 531 535 { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING7_ISO), 532 - .driver_data = APPLE_HAS_FN | APPLE_ISO_KEYBOARD }, 536 + .driver_data = APPLE_HAS_FN }, 533 537 { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING7_JIS), 534 538 .driver_data = APPLE_HAS_FN | APPLE_RDESC_JIS }, 535 539 { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING7A_ANSI), 536 540 .driver_data = APPLE_HAS_FN }, 537 541 { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING7A_ISO), 538 - .driver_data = APPLE_HAS_FN | APPLE_ISO_KEYBOARD }, 542 + .driver_data = APPLE_HAS_FN }, 539 543 { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING7A_JIS), 540 544 .driver_data = APPLE_HAS_FN | APPLE_RDESC_JIS }, 541 545 { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING8_ANSI), 542 546 .driver_data = APPLE_HAS_FN }, 543 547 { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING8_ISO), 544 - .driver_data = APPLE_HAS_FN | APPLE_ISO_KEYBOARD }, 548 + .driver_data = APPLE_HAS_FN }, 545 549 { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING8_JIS), 546 550 .driver_data = APPLE_HAS_FN | APPLE_RDESC_JIS }, 547 551 { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING9_ANSI), 548 552 .driver_data = APPLE_HAS_FN }, 549 553 { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING9_ISO), 550 - .driver_data = APPLE_HAS_FN | APPLE_ISO_KEYBOARD }, 554 + .driver_data = APPLE_HAS_FN }, 551 555 { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING9_JIS), 552 556 .driver_data = APPLE_HAS_FN | APPLE_RDESC_JIS }, 553 557 { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_WIRELESS_2009_ANSI), 554 558 .driver_data = APPLE_NUMLOCK_EMULATION | APPLE_HAS_FN }, 555 559 { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_WIRELESS_2009_ISO), 556 - .driver_data = APPLE_NUMLOCK_EMULATION | APPLE_HAS_FN | 557 - APPLE_ISO_KEYBOARD }, 560 + .driver_data = APPLE_NUMLOCK_EMULATION | APPLE_HAS_FN }, 558 561 { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_WIRELESS_2009_JIS), 559 562 .driver_data = APPLE_NUMLOCK_EMULATION | APPLE_HAS_FN }, 560 563 { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_FOUNTAIN_TP_ONLY),