diff options
| author | Matthew Garrett <mjg59@srcf.ucam.org> | 2009-03-26 08:58:16 -0400 |
|---|---|---|
| committer | Len Brown <len.brown@intel.com> | 2009-03-27 12:18:30 -0400 |
| commit | 45c7942ba8f6b7d5d1147c10f84f0cbf5fa3a2b8 (patch) | |
| tree | 687e01ac22adba1bf3ed8d30e1928468947cdb04 | |
| parent | 6cc056bc31ea9910afb01adc0848bb6ae68e0205 (diff) | |
sony-laptop: Add support for extended hotkeys
Recent Sony SR-series machines have an additional set of buttons accessed
via the 0x127 method rather than the 0x100 method. Add support for these.
Signed-off-by: Matthew Garrett <mjg@redhat.com>
Signed-off-by: Mattia Dongili <malattia@linux.it>
Signed-off-by: Len Brown <len.brown@intel.com>
| -rw-r--r-- | drivers/platform/x86/sony-laptop.c | 65 | ||||
| -rw-r--r-- | include/linux/sonypi.h | 4 |
2 files changed, 57 insertions, 12 deletions
diff --git a/drivers/platform/x86/sony-laptop.c b/drivers/platform/x86/sony-laptop.c index f458870c30b6..e000c9f6cdf5 100644 --- a/drivers/platform/x86/sony-laptop.c +++ b/drivers/platform/x86/sony-laptop.c | |||
| @@ -226,6 +226,10 @@ static int sony_laptop_input_index[] = { | |||
| 226 | 49, /* 62 SONYPI_EVENT_ZOOM_IN_PRESSED */ | 226 | 49, /* 62 SONYPI_EVENT_ZOOM_IN_PRESSED */ |
| 227 | 50, /* 63 SONYPI_EVENT_ZOOM_OUT_PRESSED */ | 227 | 50, /* 63 SONYPI_EVENT_ZOOM_OUT_PRESSED */ |
| 228 | 51, /* 64 SONYPI_EVENT_CD_EJECT_PRESSED */ | 228 | 51, /* 64 SONYPI_EVENT_CD_EJECT_PRESSED */ |
| 229 | 52, /* 65 SONYPI_EVENT_MODEKEY_PRESSED */ | ||
| 230 | 53, /* 66 SONYPI_EVENT_PKEY_P4 */ | ||
| 231 | 54, /* 67 SONYPI_EVENT_PKEY_P5 */ | ||
| 232 | 55, /* 68 SONYPI_EVENT_SETTINGKEY_PRESSED */ | ||
| 229 | }; | 233 | }; |
| 230 | 234 | ||
| 231 | static int sony_laptop_input_keycode_map[] = { | 235 | static int sony_laptop_input_keycode_map[] = { |
| @@ -280,7 +284,11 @@ static int sony_laptop_input_keycode_map[] = { | |||
| 280 | KEY_WLAN, /* 48 SONYPI_EVENT_WIRELESS_OFF */ | 284 | KEY_WLAN, /* 48 SONYPI_EVENT_WIRELESS_OFF */ |
| 281 | KEY_ZOOMIN, /* 49 SONYPI_EVENT_ZOOM_IN_PRESSED */ | 285 | KEY_ZOOMIN, /* 49 SONYPI_EVENT_ZOOM_IN_PRESSED */ |
| 282 | KEY_ZOOMOUT, /* 50 SONYPI_EVENT_ZOOM_OUT_PRESSED */ | 286 | KEY_ZOOMOUT, /* 50 SONYPI_EVENT_ZOOM_OUT_PRESSED */ |
| 283 | KEY_EJECTCD /* 51 SONYPI_EVENT_CD_EJECT_PRESSED */ | 287 | KEY_EJECTCD, /* 51 SONYPI_EVENT_CD_EJECT_PRESSED */ |
| 288 | KEY_F13, /* 52 SONYPI_EVENT_MODEKEY_PRESSED */ | ||
| 289 | KEY_PROG4, /* 53 SONYPI_EVENT_PKEY_P4 */ | ||
| 290 | KEY_F14, /* 54 SONYPI_EVENT_PKEY_P5 */ | ||
| 291 | KEY_F15, /* 55 SONYPI_EVENT_SETTINGKEY_PRESSED */ | ||
| 284 | }; | 292 | }; |
| 285 | 293 | ||
| 286 | /* release buttons after a short delay if pressed */ | 294 | /* release buttons after a short delay if pressed */ |
| @@ -850,7 +858,7 @@ struct sony_nc_event { | |||
| 850 | u8 event; | 858 | u8 event; |
| 851 | }; | 859 | }; |
| 852 | 860 | ||
| 853 | static struct sony_nc_event sony_nc_events[] = { | 861 | static struct sony_nc_event sony_100_events[] = { |
| 854 | { 0x90, SONYPI_EVENT_PKEY_P1 }, | 862 | { 0x90, SONYPI_EVENT_PKEY_P1 }, |
| 855 | { 0x10, SONYPI_EVENT_ANYBUTTON_RELEASED }, | 863 | { 0x10, SONYPI_EVENT_ANYBUTTON_RELEASED }, |
| 856 | { 0x91, SONYPI_EVENT_PKEY_P1 }, | 864 | { 0x91, SONYPI_EVENT_PKEY_P1 }, |
| @@ -874,6 +882,25 @@ static struct sony_nc_event sony_nc_events[] = { | |||
| 874 | { 0, 0 }, | 882 | { 0, 0 }, |
| 875 | }; | 883 | }; |
| 876 | 884 | ||
| 885 | static struct sony_nc_event sony_127_events[] = { | ||
| 886 | { 0x81, SONYPI_EVENT_MODEKEY_PRESSED }, | ||
| 887 | { 0x01, SONYPI_EVENT_ANYBUTTON_RELEASED }, | ||
| 888 | { 0x82, SONYPI_EVENT_PKEY_P1 }, | ||
| 889 | { 0x02, SONYPI_EVENT_ANYBUTTON_RELEASED }, | ||
| 890 | { 0x83, SONYPI_EVENT_PKEY_P2 }, | ||
| 891 | { 0x03, SONYPI_EVENT_ANYBUTTON_RELEASED }, | ||
| 892 | { 0x84, SONYPI_EVENT_PKEY_P3 }, | ||
| 893 | { 0x04, SONYPI_EVENT_ANYBUTTON_RELEASED }, | ||
| 894 | { 0x85, SONYPI_EVENT_PKEY_P4 }, | ||
| 895 | { 0x05, SONYPI_EVENT_ANYBUTTON_RELEASED }, | ||
| 896 | { 0x86, SONYPI_EVENT_PKEY_P5 }, | ||
| 897 | { 0x06, SONYPI_EVENT_ANYBUTTON_RELEASED }, | ||
| 898 | { 0x06, SONYPI_EVENT_ANYBUTTON_RELEASED }, | ||
| 899 | { 0x87, SONYPI_EVENT_SETTINGKEY_PRESSED }, | ||
| 900 | { 0x07, SONYPI_EVENT_ANYBUTTON_RELEASED }, | ||
| 901 | { 0, 0 }, | ||
| 902 | }; | ||
| 903 | |||
| 877 | /* | 904 | /* |
| 878 | * ACPI callbacks | 905 | * ACPI callbacks |
| 879 | */ | 906 | */ |
| @@ -884,27 +911,41 @@ static void sony_acpi_notify(acpi_handle handle, u32 event, void *data) | |||
| 884 | 911 | ||
| 885 | if (ev >= 0x90) { | 912 | if (ev >= 0x90) { |
| 886 | /* New-style event */ | 913 | /* New-style event */ |
| 887 | int origev = ev; | 914 | int key_handle = 0; |
| 888 | ev -= 0x90; | 915 | ev -= 0x90; |
| 889 | 916 | ||
| 890 | if (sony_find_snc_handle(0x100) == ev) { | 917 | if (sony_find_snc_handle(0x100) == ev) |
| 891 | int i; | 918 | key_handle = 0x100; |
| 919 | if (sony_find_snc_handle(0x127) == ev) | ||
| 920 | key_handle = 0x127; | ||
| 921 | |||
| 922 | if (handle) { | ||
| 923 | struct sony_nc_event *key_event; | ||
| 892 | 924 | ||
| 893 | if (sony_call_snc_handle(0x100, 0x200, &result)) | 925 | if (sony_call_snc_handle(key_handle, 0x200, &result)) |
| 894 | dprintk("sony_acpi_notify, unable to decode event 0x%.2x\n", ev); | 926 | dprintk("sony_acpi_notify, unable to decode" |
| 927 | " event 0x%.2x 0x%.2x\n", key_handle, | ||
| 928 | ev); | ||
| 895 | else | 929 | else |
| 896 | ev = result & 0xFF; | 930 | ev = result & 0xFF; |
| 897 | 931 | ||
| 898 | for (i = 0; sony_nc_events[i].event; i++) { | 932 | if (key_handle == 0x100) |
| 899 | if (sony_nc_events[i].data == ev) { | 933 | key_event = sony_100_events; |
| 900 | ev = sony_nc_events[i].event; | 934 | else |
| 935 | key_event = sony_127_events; | ||
| 936 | |||
| 937 | for (; key_event->data; key_event++) { | ||
| 938 | if (key_event->data == ev) { | ||
| 939 | ev = key_event->event; | ||
| 901 | break; | 940 | break; |
| 902 | } | 941 | } |
| 903 | } | 942 | } |
| 904 | 943 | ||
| 905 | if (!sony_nc_events[i].data) | 944 | if (!key_event->data) { |
| 906 | printk(KERN_INFO DRV_PFX | 945 | printk(KERN_INFO DRV_PFX |
| 907 | "Unknown event: %x %x\n", origev, ev); | 946 | "Unknown event: 0x%x 0x%x\n", key_handle, |
| 947 | ev); | ||
| 948 | } | ||
| 908 | } else if (sony_find_snc_handle(0x124) == ev) { | 949 | } else if (sony_find_snc_handle(0x124) == ev) { |
| 909 | sony_nc_rfkill_update(); | 950 | sony_nc_rfkill_update(); |
| 910 | return; | 951 | return; |
diff --git a/include/linux/sonypi.h b/include/linux/sonypi.h index 8458dbe95862..bb835019ac7f 100644 --- a/include/linux/sonypi.h +++ b/include/linux/sonypi.h | |||
| @@ -104,6 +104,10 @@ | |||
| 104 | #define SONYPI_EVENT_ZOOM_IN_PRESSED 62 | 104 | #define SONYPI_EVENT_ZOOM_IN_PRESSED 62 |
| 105 | #define SONYPI_EVENT_ZOOM_OUT_PRESSED 63 | 105 | #define SONYPI_EVENT_ZOOM_OUT_PRESSED 63 |
| 106 | #define SONYPI_EVENT_CD_EJECT_PRESSED 64 | 106 | #define SONYPI_EVENT_CD_EJECT_PRESSED 64 |
| 107 | #define SONYPI_EVENT_MODEKEY_PRESSED 65 | ||
| 108 | #define SONYPI_EVENT_PKEY_P4 66 | ||
| 109 | #define SONYPI_EVENT_PKEY_P5 67 | ||
| 110 | #define SONYPI_EVENT_SETTINGKEY_PRESSED 68 | ||
| 107 | 111 | ||
| 108 | /* get/set brightness */ | 112 | /* get/set brightness */ |
| 109 | #define SONYPI_IOCGBRT _IOR('v', 0, __u8) | 113 | #define SONYPI_IOCGBRT _IOR('v', 0, __u8) |
