diff options
| -rw-r--r-- | drivers/platform/x86/ideapad-laptop.c | 32 |
1 files changed, 32 insertions, 0 deletions
diff --git a/drivers/platform/x86/ideapad-laptop.c b/drivers/platform/x86/ideapad-laptop.c index 17f6dfd8dbfb..2396242e8418 100644 --- a/drivers/platform/x86/ideapad-laptop.c +++ b/drivers/platform/x86/ideapad-laptop.c | |||
| @@ -65,6 +65,7 @@ enum { | |||
| 65 | VPCCMD_R_ODD, /* 0x21 */ | 65 | VPCCMD_R_ODD, /* 0x21 */ |
| 66 | VPCCMD_R_RF = 0x23, | 66 | VPCCMD_R_RF = 0x23, |
| 67 | VPCCMD_W_RF, | 67 | VPCCMD_W_RF, |
| 68 | VPCCMD_R_SPECIAL_BUTTONS = 0x31, | ||
| 68 | VPCCMD_W_BL_POWER = 0x33, | 69 | VPCCMD_W_BL_POWER = 0x33, |
| 69 | }; | 70 | }; |
| 70 | 71 | ||
| @@ -518,9 +519,13 @@ static void ideapad_platform_exit(struct ideapad_private *priv) | |||
| 518 | */ | 519 | */ |
| 519 | static const struct key_entry ideapad_keymap[] = { | 520 | static const struct key_entry ideapad_keymap[] = { |
| 520 | { KE_KEY, 6, { KEY_SWITCHVIDEOMODE } }, | 521 | { KE_KEY, 6, { KEY_SWITCHVIDEOMODE } }, |
| 522 | { KE_KEY, 7, { KEY_CAMERA } }, | ||
| 523 | { KE_KEY, 11, { KEY_F16 } }, | ||
| 521 | { KE_KEY, 13, { KEY_WLAN } }, | 524 | { KE_KEY, 13, { KEY_WLAN } }, |
| 522 | { KE_KEY, 16, { KEY_PROG1 } }, | 525 | { KE_KEY, 16, { KEY_PROG1 } }, |
| 523 | { KE_KEY, 17, { KEY_PROG2 } }, | 526 | { KE_KEY, 17, { KEY_PROG2 } }, |
| 527 | { KE_KEY, 64, { KEY_PROG3 } }, | ||
| 528 | { KE_KEY, 65, { KEY_PROG4 } }, | ||
| 524 | { KE_END, 0 }, | 529 | { KE_END, 0 }, |
| 525 | }; | 530 | }; |
| 526 | 531 | ||
| @@ -587,6 +592,28 @@ static void ideapad_input_novokey(struct ideapad_private *priv) | |||
| 587 | ideapad_input_report(priv, 16); | 592 | ideapad_input_report(priv, 16); |
| 588 | } | 593 | } |
| 589 | 594 | ||
| 595 | static void ideapad_check_special_buttons(struct ideapad_private *priv) | ||
| 596 | { | ||
| 597 | unsigned long bit, value; | ||
| 598 | |||
| 599 | read_ec_data(ideapad_handle, VPCCMD_R_SPECIAL_BUTTONS, &value); | ||
| 600 | |||
| 601 | for (bit = 0; bit < 16; bit++) { | ||
| 602 | if (test_bit(bit, &value)) { | ||
| 603 | switch (bit) { | ||
| 604 | case 6: | ||
| 605 | /* Thermal Management button */ | ||
| 606 | ideapad_input_report(priv, 65); | ||
| 607 | break; | ||
| 608 | case 1: | ||
| 609 | /* OneKey Theater button */ | ||
| 610 | ideapad_input_report(priv, 64); | ||
| 611 | break; | ||
| 612 | } | ||
| 613 | } | ||
| 614 | } | ||
| 615 | } | ||
| 616 | |||
| 590 | /* | 617 | /* |
| 591 | * backlight | 618 | * backlight |
| 592 | */ | 619 | */ |
| @@ -785,6 +812,8 @@ static void ideapad_acpi_notify(struct acpi_device *adevice, u32 event) | |||
| 785 | ideapad_sync_rfk_state(priv); | 812 | ideapad_sync_rfk_state(priv); |
| 786 | break; | 813 | break; |
| 787 | case 13: | 814 | case 13: |
| 815 | case 11: | ||
| 816 | case 7: | ||
| 788 | case 6: | 817 | case 6: |
| 789 | ideapad_input_report(priv, vpc_bit); | 818 | ideapad_input_report(priv, vpc_bit); |
| 790 | break; | 819 | break; |
| @@ -797,6 +826,9 @@ static void ideapad_acpi_notify(struct acpi_device *adevice, u32 event) | |||
| 797 | case 2: | 826 | case 2: |
| 798 | ideapad_backlight_notify_power(priv); | 827 | ideapad_backlight_notify_power(priv); |
| 799 | break; | 828 | break; |
| 829 | case 0: | ||
| 830 | ideapad_check_special_buttons(priv); | ||
| 831 | break; | ||
| 800 | default: | 832 | default: |
| 801 | pr_info("Unknown event: %lu\n", vpc_bit); | 833 | pr_info("Unknown event: %lu\n", vpc_bit); |
| 802 | } | 834 | } |
