diff options
Diffstat (limited to 'drivers/platform')
-rw-r--r-- | drivers/platform/x86/fujitsu-laptop.c | 60 | ||||
-rw-r--r-- | drivers/platform/x86/panasonic-laptop.c | 28 | ||||
-rw-r--r-- | drivers/platform/x86/sony-laptop.c | 57 | ||||
-rw-r--r-- | drivers/platform/x86/thinkpad_acpi.c | 81 | ||||
-rw-r--r-- | drivers/platform/x86/wmi.c | 15 |
5 files changed, 86 insertions, 155 deletions
diff --git a/drivers/platform/x86/fujitsu-laptop.c b/drivers/platform/x86/fujitsu-laptop.c index 45940f31fe9e..218b9a16ac3f 100644 --- a/drivers/platform/x86/fujitsu-laptop.c +++ b/drivers/platform/x86/fujitsu-laptop.c | |||
@@ -174,8 +174,7 @@ struct fujitsu_hotkey_t { | |||
174 | 174 | ||
175 | static struct fujitsu_hotkey_t *fujitsu_hotkey; | 175 | static struct fujitsu_hotkey_t *fujitsu_hotkey; |
176 | 176 | ||
177 | static void acpi_fujitsu_hotkey_notify(acpi_handle handle, u32 event, | 177 | static void acpi_fujitsu_hotkey_notify(struct acpi_device *device, u32 event); |
178 | void *data); | ||
179 | 178 | ||
180 | #ifdef CONFIG_LEDS_CLASS | 179 | #ifdef CONFIG_LEDS_CLASS |
181 | static enum led_brightness logolamp_get(struct led_classdev *cdev); | 180 | static enum led_brightness logolamp_get(struct led_classdev *cdev); |
@@ -203,7 +202,7 @@ struct led_classdev kblamps_led = { | |||
203 | static u32 dbg_level = 0x03; | 202 | static u32 dbg_level = 0x03; |
204 | #endif | 203 | #endif |
205 | 204 | ||
206 | static void acpi_fujitsu_notify(acpi_handle handle, u32 event, void *data); | 205 | static void acpi_fujitsu_notify(struct acpi_device *device, u32 event); |
207 | 206 | ||
208 | /* Fujitsu ACPI interface function */ | 207 | /* Fujitsu ACPI interface function */ |
209 | 208 | ||
@@ -658,7 +657,6 @@ static struct dmi_system_id fujitsu_dmi_table[] = { | |||
658 | 657 | ||
659 | static int acpi_fujitsu_add(struct acpi_device *device) | 658 | static int acpi_fujitsu_add(struct acpi_device *device) |
660 | { | 659 | { |
661 | acpi_status status; | ||
662 | acpi_handle handle; | 660 | acpi_handle handle; |
663 | int result = 0; | 661 | int result = 0; |
664 | int state = 0; | 662 | int state = 0; |
@@ -673,20 +671,10 @@ static int acpi_fujitsu_add(struct acpi_device *device) | |||
673 | sprintf(acpi_device_class(device), "%s", ACPI_FUJITSU_CLASS); | 671 | sprintf(acpi_device_class(device), "%s", ACPI_FUJITSU_CLASS); |
674 | device->driver_data = fujitsu; | 672 | device->driver_data = fujitsu; |
675 | 673 | ||
676 | status = acpi_install_notify_handler(device->handle, | ||
677 | ACPI_DEVICE_NOTIFY, | ||
678 | acpi_fujitsu_notify, fujitsu); | ||
679 | |||
680 | if (ACPI_FAILURE(status)) { | ||
681 | printk(KERN_ERR "Error installing notify handler\n"); | ||
682 | error = -ENODEV; | ||
683 | goto err_stop; | ||
684 | } | ||
685 | |||
686 | fujitsu->input = input = input_allocate_device(); | 674 | fujitsu->input = input = input_allocate_device(); |
687 | if (!input) { | 675 | if (!input) { |
688 | error = -ENOMEM; | 676 | error = -ENOMEM; |
689 | goto err_uninstall_notify; | 677 | goto err_stop; |
690 | } | 678 | } |
691 | 679 | ||
692 | snprintf(fujitsu->phys, sizeof(fujitsu->phys), | 680 | snprintf(fujitsu->phys, sizeof(fujitsu->phys), |
@@ -743,9 +731,6 @@ static int acpi_fujitsu_add(struct acpi_device *device) | |||
743 | end: | 731 | end: |
744 | err_free_input_dev: | 732 | err_free_input_dev: |
745 | input_free_device(input); | 733 | input_free_device(input); |
746 | err_uninstall_notify: | ||
747 | acpi_remove_notify_handler(device->handle, ACPI_DEVICE_NOTIFY, | ||
748 | acpi_fujitsu_notify); | ||
749 | err_stop: | 734 | err_stop: |
750 | 735 | ||
751 | return result; | 736 | return result; |
@@ -753,7 +738,6 @@ err_stop: | |||
753 | 738 | ||
754 | static int acpi_fujitsu_remove(struct acpi_device *device, int type) | 739 | static int acpi_fujitsu_remove(struct acpi_device *device, int type) |
755 | { | 740 | { |
756 | acpi_status status; | ||
757 | struct fujitsu_t *fujitsu = NULL; | 741 | struct fujitsu_t *fujitsu = NULL; |
758 | 742 | ||
759 | if (!device || !acpi_driver_data(device)) | 743 | if (!device || !acpi_driver_data(device)) |
@@ -761,10 +745,6 @@ static int acpi_fujitsu_remove(struct acpi_device *device, int type) | |||
761 | 745 | ||
762 | fujitsu = acpi_driver_data(device); | 746 | fujitsu = acpi_driver_data(device); |
763 | 747 | ||
764 | status = acpi_remove_notify_handler(fujitsu->acpi_handle, | ||
765 | ACPI_DEVICE_NOTIFY, | ||
766 | acpi_fujitsu_notify); | ||
767 | |||
768 | if (!device || !acpi_driver_data(device)) | 748 | if (!device || !acpi_driver_data(device)) |
769 | return -EINVAL; | 749 | return -EINVAL; |
770 | 750 | ||
@@ -775,7 +755,7 @@ static int acpi_fujitsu_remove(struct acpi_device *device, int type) | |||
775 | 755 | ||
776 | /* Brightness notify */ | 756 | /* Brightness notify */ |
777 | 757 | ||
778 | static void acpi_fujitsu_notify(acpi_handle handle, u32 event, void *data) | 758 | static void acpi_fujitsu_notify(struct acpi_device *device, u32 event) |
779 | { | 759 | { |
780 | struct input_dev *input; | 760 | struct input_dev *input; |
781 | int keycode; | 761 | int keycode; |
@@ -829,15 +809,12 @@ static void acpi_fujitsu_notify(acpi_handle handle, u32 event, void *data) | |||
829 | input_report_key(input, keycode, 0); | 809 | input_report_key(input, keycode, 0); |
830 | input_sync(input); | 810 | input_sync(input); |
831 | } | 811 | } |
832 | |||
833 | return; | ||
834 | } | 812 | } |
835 | 813 | ||
836 | /* ACPI device for hotkey handling */ | 814 | /* ACPI device for hotkey handling */ |
837 | 815 | ||
838 | static int acpi_fujitsu_hotkey_add(struct acpi_device *device) | 816 | static int acpi_fujitsu_hotkey_add(struct acpi_device *device) |
839 | { | 817 | { |
840 | acpi_status status; | ||
841 | acpi_handle handle; | 818 | acpi_handle handle; |
842 | int result = 0; | 819 | int result = 0; |
843 | int state = 0; | 820 | int state = 0; |
@@ -854,17 +831,6 @@ static int acpi_fujitsu_hotkey_add(struct acpi_device *device) | |||
854 | sprintf(acpi_device_class(device), "%s", ACPI_FUJITSU_CLASS); | 831 | sprintf(acpi_device_class(device), "%s", ACPI_FUJITSU_CLASS); |
855 | device->driver_data = fujitsu_hotkey; | 832 | device->driver_data = fujitsu_hotkey; |
856 | 833 | ||
857 | status = acpi_install_notify_handler(device->handle, | ||
858 | ACPI_DEVICE_NOTIFY, | ||
859 | acpi_fujitsu_hotkey_notify, | ||
860 | fujitsu_hotkey); | ||
861 | |||
862 | if (ACPI_FAILURE(status)) { | ||
863 | printk(KERN_ERR "Error installing notify handler\n"); | ||
864 | error = -ENODEV; | ||
865 | goto err_stop; | ||
866 | } | ||
867 | |||
868 | /* kfifo */ | 834 | /* kfifo */ |
869 | spin_lock_init(&fujitsu_hotkey->fifo_lock); | 835 | spin_lock_init(&fujitsu_hotkey->fifo_lock); |
870 | fujitsu_hotkey->fifo = | 836 | fujitsu_hotkey->fifo = |
@@ -879,7 +845,7 @@ static int acpi_fujitsu_hotkey_add(struct acpi_device *device) | |||
879 | fujitsu_hotkey->input = input = input_allocate_device(); | 845 | fujitsu_hotkey->input = input = input_allocate_device(); |
880 | if (!input) { | 846 | if (!input) { |
881 | error = -ENOMEM; | 847 | error = -ENOMEM; |
882 | goto err_uninstall_notify; | 848 | goto err_free_fifo; |
883 | } | 849 | } |
884 | 850 | ||
885 | snprintf(fujitsu_hotkey->phys, sizeof(fujitsu_hotkey->phys), | 851 | snprintf(fujitsu_hotkey->phys, sizeof(fujitsu_hotkey->phys), |
@@ -975,9 +941,7 @@ static int acpi_fujitsu_hotkey_add(struct acpi_device *device) | |||
975 | end: | 941 | end: |
976 | err_free_input_dev: | 942 | err_free_input_dev: |
977 | input_free_device(input); | 943 | input_free_device(input); |
978 | err_uninstall_notify: | 944 | err_free_fifo: |
979 | acpi_remove_notify_handler(device->handle, ACPI_DEVICE_NOTIFY, | ||
980 | acpi_fujitsu_hotkey_notify); | ||
981 | kfifo_free(fujitsu_hotkey->fifo); | 945 | kfifo_free(fujitsu_hotkey->fifo); |
982 | err_stop: | 946 | err_stop: |
983 | 947 | ||
@@ -986,7 +950,6 @@ err_stop: | |||
986 | 950 | ||
987 | static int acpi_fujitsu_hotkey_remove(struct acpi_device *device, int type) | 951 | static int acpi_fujitsu_hotkey_remove(struct acpi_device *device, int type) |
988 | { | 952 | { |
989 | acpi_status status; | ||
990 | struct fujitsu_hotkey_t *fujitsu_hotkey = NULL; | 953 | struct fujitsu_hotkey_t *fujitsu_hotkey = NULL; |
991 | 954 | ||
992 | if (!device || !acpi_driver_data(device)) | 955 | if (!device || !acpi_driver_data(device)) |
@@ -994,10 +957,6 @@ static int acpi_fujitsu_hotkey_remove(struct acpi_device *device, int type) | |||
994 | 957 | ||
995 | fujitsu_hotkey = acpi_driver_data(device); | 958 | fujitsu_hotkey = acpi_driver_data(device); |
996 | 959 | ||
997 | status = acpi_remove_notify_handler(fujitsu_hotkey->acpi_handle, | ||
998 | ACPI_DEVICE_NOTIFY, | ||
999 | acpi_fujitsu_hotkey_notify); | ||
1000 | |||
1001 | fujitsu_hotkey->acpi_handle = NULL; | 960 | fujitsu_hotkey->acpi_handle = NULL; |
1002 | 961 | ||
1003 | kfifo_free(fujitsu_hotkey->fifo); | 962 | kfifo_free(fujitsu_hotkey->fifo); |
@@ -1005,8 +964,7 @@ static int acpi_fujitsu_hotkey_remove(struct acpi_device *device, int type) | |||
1005 | return 0; | 964 | return 0; |
1006 | } | 965 | } |
1007 | 966 | ||
1008 | static void acpi_fujitsu_hotkey_notify(acpi_handle handle, u32 event, | 967 | static void acpi_fujitsu_hotkey_notify(struct acpi_device *device, u32 event) |
1009 | void *data) | ||
1010 | { | 968 | { |
1011 | struct input_dev *input; | 969 | struct input_dev *input; |
1012 | int keycode, keycode_r; | 970 | int keycode, keycode_r; |
@@ -1089,8 +1047,6 @@ static void acpi_fujitsu_hotkey_notify(acpi_handle handle, u32 event, | |||
1089 | input_sync(input); | 1047 | input_sync(input); |
1090 | break; | 1048 | break; |
1091 | } | 1049 | } |
1092 | |||
1093 | return; | ||
1094 | } | 1050 | } |
1095 | 1051 | ||
1096 | /* Initialization */ | 1052 | /* Initialization */ |
@@ -1107,6 +1063,7 @@ static struct acpi_driver acpi_fujitsu_driver = { | |||
1107 | .ops = { | 1063 | .ops = { |
1108 | .add = acpi_fujitsu_add, | 1064 | .add = acpi_fujitsu_add, |
1109 | .remove = acpi_fujitsu_remove, | 1065 | .remove = acpi_fujitsu_remove, |
1066 | .notify = acpi_fujitsu_notify, | ||
1110 | }, | 1067 | }, |
1111 | }; | 1068 | }; |
1112 | 1069 | ||
@@ -1122,6 +1079,7 @@ static struct acpi_driver acpi_fujitsu_hotkey_driver = { | |||
1122 | .ops = { | 1079 | .ops = { |
1123 | .add = acpi_fujitsu_hotkey_add, | 1080 | .add = acpi_fujitsu_hotkey_add, |
1124 | .remove = acpi_fujitsu_hotkey_remove, | 1081 | .remove = acpi_fujitsu_hotkey_remove, |
1082 | .notify = acpi_fujitsu_hotkey_notify, | ||
1125 | }, | 1083 | }, |
1126 | }; | 1084 | }; |
1127 | 1085 | ||
diff --git a/drivers/platform/x86/panasonic-laptop.c b/drivers/platform/x86/panasonic-laptop.c index a5ce4bc202e3..fe7cf0188acc 100644 --- a/drivers/platform/x86/panasonic-laptop.c +++ b/drivers/platform/x86/panasonic-laptop.c | |||
@@ -176,6 +176,7 @@ enum SINF_BITS { SINF_NUM_BATTERIES = 0, | |||
176 | static int acpi_pcc_hotkey_add(struct acpi_device *device); | 176 | static int acpi_pcc_hotkey_add(struct acpi_device *device); |
177 | static int acpi_pcc_hotkey_remove(struct acpi_device *device, int type); | 177 | static int acpi_pcc_hotkey_remove(struct acpi_device *device, int type); |
178 | static int acpi_pcc_hotkey_resume(struct acpi_device *device); | 178 | static int acpi_pcc_hotkey_resume(struct acpi_device *device); |
179 | static void acpi_pcc_hotkey_notify(struct acpi_device *device, u32 event); | ||
179 | 180 | ||
180 | static const struct acpi_device_id pcc_device_ids[] = { | 181 | static const struct acpi_device_id pcc_device_ids[] = { |
181 | { "MAT0012", 0}, | 182 | { "MAT0012", 0}, |
@@ -194,6 +195,7 @@ static struct acpi_driver acpi_pcc_driver = { | |||
194 | .add = acpi_pcc_hotkey_add, | 195 | .add = acpi_pcc_hotkey_add, |
195 | .remove = acpi_pcc_hotkey_remove, | 196 | .remove = acpi_pcc_hotkey_remove, |
196 | .resume = acpi_pcc_hotkey_resume, | 197 | .resume = acpi_pcc_hotkey_resume, |
198 | .notify = acpi_pcc_hotkey_notify, | ||
197 | }, | 199 | }, |
198 | }; | 200 | }; |
199 | 201 | ||
@@ -271,7 +273,7 @@ static int acpi_pcc_retrieve_biosdata(struct pcc_acpi *pcc, u32 *sinf) | |||
271 | union acpi_object *hkey = NULL; | 273 | union acpi_object *hkey = NULL; |
272 | int i; | 274 | int i; |
273 | 275 | ||
274 | status = acpi_evaluate_object(pcc->handle, METHOD_HKEY_SINF, 0, | 276 | status = acpi_evaluate_object(pcc->handle, METHOD_HKEY_SINF, NULL, |
275 | &buffer); | 277 | &buffer); |
276 | if (ACPI_FAILURE(status)) { | 278 | if (ACPI_FAILURE(status)) { |
277 | ACPI_DEBUG_PRINT((ACPI_DB_ERROR, | 279 | ACPI_DEBUG_PRINT((ACPI_DB_ERROR, |
@@ -527,9 +529,9 @@ static void acpi_pcc_generate_keyinput(struct pcc_acpi *pcc) | |||
527 | return; | 529 | return; |
528 | } | 530 | } |
529 | 531 | ||
530 | static void acpi_pcc_hotkey_notify(acpi_handle handle, u32 event, void *data) | 532 | static void acpi_pcc_hotkey_notify(struct acpi_device *device, u32 event) |
531 | { | 533 | { |
532 | struct pcc_acpi *pcc = (struct pcc_acpi *) data; | 534 | struct pcc_acpi *pcc = acpi_driver_data(device); |
533 | 535 | ||
534 | switch (event) { | 536 | switch (event) { |
535 | case HKEY_NOTIFY: | 537 | case HKEY_NOTIFY: |
@@ -599,7 +601,6 @@ static int acpi_pcc_hotkey_resume(struct acpi_device *device) | |||
599 | 601 | ||
600 | static int acpi_pcc_hotkey_add(struct acpi_device *device) | 602 | static int acpi_pcc_hotkey_add(struct acpi_device *device) |
601 | { | 603 | { |
602 | acpi_status status; | ||
603 | struct pcc_acpi *pcc; | 604 | struct pcc_acpi *pcc; |
604 | int num_sifr, result; | 605 | int num_sifr, result; |
605 | 606 | ||
@@ -640,22 +641,11 @@ static int acpi_pcc_hotkey_add(struct acpi_device *device) | |||
640 | goto out_sinf; | 641 | goto out_sinf; |
641 | } | 642 | } |
642 | 643 | ||
643 | /* initialize hotkey input device */ | ||
644 | status = acpi_install_notify_handler(pcc->handle, ACPI_DEVICE_NOTIFY, | ||
645 | acpi_pcc_hotkey_notify, pcc); | ||
646 | |||
647 | if (ACPI_FAILURE(status)) { | ||
648 | ACPI_DEBUG_PRINT((ACPI_DB_ERROR, | ||
649 | "Error installing notify handler\n")); | ||
650 | result = -ENODEV; | ||
651 | goto out_input; | ||
652 | } | ||
653 | |||
654 | /* initialize backlight */ | 644 | /* initialize backlight */ |
655 | pcc->backlight = backlight_device_register("panasonic", NULL, pcc, | 645 | pcc->backlight = backlight_device_register("panasonic", NULL, pcc, |
656 | &pcc_backlight_ops); | 646 | &pcc_backlight_ops); |
657 | if (IS_ERR(pcc->backlight)) | 647 | if (IS_ERR(pcc->backlight)) |
658 | goto out_notify; | 648 | goto out_input; |
659 | 649 | ||
660 | if (!acpi_pcc_retrieve_biosdata(pcc, pcc->sinf)) { | 650 | if (!acpi_pcc_retrieve_biosdata(pcc, pcc->sinf)) { |
661 | ACPI_DEBUG_PRINT((ACPI_DB_ERROR, | 651 | ACPI_DEBUG_PRINT((ACPI_DB_ERROR, |
@@ -680,9 +670,6 @@ static int acpi_pcc_hotkey_add(struct acpi_device *device) | |||
680 | 670 | ||
681 | out_backlight: | 671 | out_backlight: |
682 | backlight_device_unregister(pcc->backlight); | 672 | backlight_device_unregister(pcc->backlight); |
683 | out_notify: | ||
684 | acpi_remove_notify_handler(pcc->handle, ACPI_DEVICE_NOTIFY, | ||
685 | acpi_pcc_hotkey_notify); | ||
686 | out_input: | 673 | out_input: |
687 | input_unregister_device(pcc->input_dev); | 674 | input_unregister_device(pcc->input_dev); |
688 | /* no need to input_free_device() since core input API refcount and | 675 | /* no need to input_free_device() since core input API refcount and |
@@ -723,9 +710,6 @@ static int acpi_pcc_hotkey_remove(struct acpi_device *device, int type) | |||
723 | 710 | ||
724 | backlight_device_unregister(pcc->backlight); | 711 | backlight_device_unregister(pcc->backlight); |
725 | 712 | ||
726 | acpi_remove_notify_handler(pcc->handle, ACPI_DEVICE_NOTIFY, | ||
727 | acpi_pcc_hotkey_notify); | ||
728 | |||
729 | input_unregister_device(pcc->input_dev); | 713 | input_unregister_device(pcc->input_dev); |
730 | /* no need to input_free_device() since core input API refcount and | 714 | /* no need to input_free_device() since core input API refcount and |
731 | * free()s the device */ | 715 | * free()s the device */ |
diff --git a/drivers/platform/x86/sony-laptop.c b/drivers/platform/x86/sony-laptop.c index a90ec5cb2f20..552958545f94 100644 --- a/drivers/platform/x86/sony-laptop.c +++ b/drivers/platform/x86/sony-laptop.c | |||
@@ -317,7 +317,8 @@ static void sony_laptop_report_input_event(u8 event) | |||
317 | struct input_dev *key_dev = sony_laptop_input.key_dev; | 317 | struct input_dev *key_dev = sony_laptop_input.key_dev; |
318 | struct sony_laptop_keypress kp = { NULL }; | 318 | struct sony_laptop_keypress kp = { NULL }; |
319 | 319 | ||
320 | if (event == SONYPI_EVENT_FNKEY_RELEASED) { | 320 | if (event == SONYPI_EVENT_FNKEY_RELEASED || |
321 | event == SONYPI_EVENT_ANYBUTTON_RELEASED) { | ||
321 | /* Nothing, not all VAIOs generate this event */ | 322 | /* Nothing, not all VAIOs generate this event */ |
322 | return; | 323 | return; |
323 | } | 324 | } |
@@ -905,7 +906,6 @@ static struct sony_nc_event sony_127_events[] = { | |||
905 | { 0x05, SONYPI_EVENT_ANYBUTTON_RELEASED }, | 906 | { 0x05, SONYPI_EVENT_ANYBUTTON_RELEASED }, |
906 | { 0x86, SONYPI_EVENT_PKEY_P5 }, | 907 | { 0x86, SONYPI_EVENT_PKEY_P5 }, |
907 | { 0x06, SONYPI_EVENT_ANYBUTTON_RELEASED }, | 908 | { 0x06, SONYPI_EVENT_ANYBUTTON_RELEASED }, |
908 | { 0x06, SONYPI_EVENT_ANYBUTTON_RELEASED }, | ||
909 | { 0x87, SONYPI_EVENT_SETTINGKEY_PRESSED }, | 909 | { 0x87, SONYPI_EVENT_SETTINGKEY_PRESSED }, |
910 | { 0x07, SONYPI_EVENT_ANYBUTTON_RELEASED }, | 910 | { 0x07, SONYPI_EVENT_ANYBUTTON_RELEASED }, |
911 | { 0, 0 }, | 911 | { 0, 0 }, |
@@ -914,7 +914,7 @@ static struct sony_nc_event sony_127_events[] = { | |||
914 | /* | 914 | /* |
915 | * ACPI callbacks | 915 | * ACPI callbacks |
916 | */ | 916 | */ |
917 | static void sony_acpi_notify(acpi_handle handle, u32 event, void *data) | 917 | static void sony_nc_notify(struct acpi_device *device, u32 event) |
918 | { | 918 | { |
919 | u32 ev = event; | 919 | u32 ev = event; |
920 | 920 | ||
@@ -933,7 +933,7 @@ static void sony_acpi_notify(acpi_handle handle, u32 event, void *data) | |||
933 | struct sony_nc_event *key_event; | 933 | struct sony_nc_event *key_event; |
934 | 934 | ||
935 | if (sony_call_snc_handle(key_handle, 0x200, &result)) { | 935 | if (sony_call_snc_handle(key_handle, 0x200, &result)) { |
936 | dprintk("sony_acpi_notify, unable to decode" | 936 | dprintk("sony_nc_notify, unable to decode" |
937 | " event 0x%.2x 0x%.2x\n", key_handle, | 937 | " event 0x%.2x 0x%.2x\n", key_handle, |
938 | ev); | 938 | ev); |
939 | /* restore the original event */ | 939 | /* restore the original event */ |
@@ -968,7 +968,7 @@ static void sony_acpi_notify(acpi_handle handle, u32 event, void *data) | |||
968 | } else | 968 | } else |
969 | sony_laptop_report_input_event(ev); | 969 | sony_laptop_report_input_event(ev); |
970 | 970 | ||
971 | dprintk("sony_acpi_notify, event: 0x%.2x\n", ev); | 971 | dprintk("sony_nc_notify, event: 0x%.2x\n", ev); |
972 | acpi_bus_generate_proc_event(sony_nc_acpi_device, 1, ev); | 972 | acpi_bus_generate_proc_event(sony_nc_acpi_device, 1, ev); |
973 | } | 973 | } |
974 | 974 | ||
@@ -1004,6 +1004,7 @@ static int sony_nc_function_setup(struct acpi_device *device) | |||
1004 | sony_call_snc_handle(0x0100, 0, &result); | 1004 | sony_call_snc_handle(0x0100, 0, &result); |
1005 | sony_call_snc_handle(0x0101, 0, &result); | 1005 | sony_call_snc_handle(0x0101, 0, &result); |
1006 | sony_call_snc_handle(0x0102, 0x100, &result); | 1006 | sony_call_snc_handle(0x0102, 0x100, &result); |
1007 | sony_call_snc_handle(0x0127, 0, &result); | ||
1007 | 1008 | ||
1008 | return 0; | 1009 | return 0; |
1009 | } | 1010 | } |
@@ -1040,7 +1041,7 @@ static int sony_nc_resume(struct acpi_device *device) | |||
1040 | 1041 | ||
1041 | /* set the last requested brightness level */ | 1042 | /* set the last requested brightness level */ |
1042 | if (sony_backlight_device && | 1043 | if (sony_backlight_device && |
1043 | !sony_backlight_update_status(sony_backlight_device)) | 1044 | sony_backlight_update_status(sony_backlight_device) < 0) |
1044 | printk(KERN_WARNING DRV_PFX "unable to restore brightness level\n"); | 1045 | printk(KERN_WARNING DRV_PFX "unable to restore brightness level\n"); |
1045 | 1046 | ||
1046 | return 0; | 1047 | return 0; |
@@ -1102,8 +1103,11 @@ static int sony_nc_setup_wifi_rfkill(struct acpi_device *device) | |||
1102 | err = rfkill_register(sony_wifi_rfkill); | 1103 | err = rfkill_register(sony_wifi_rfkill); |
1103 | if (err) | 1104 | if (err) |
1104 | rfkill_free(sony_wifi_rfkill); | 1105 | rfkill_free(sony_wifi_rfkill); |
1105 | else | 1106 | else { |
1106 | sony_rfkill_devices[SONY_WIFI] = sony_wifi_rfkill; | 1107 | sony_rfkill_devices[SONY_WIFI] = sony_wifi_rfkill; |
1108 | sony_nc_rfkill_set(sony_wifi_rfkill->data, | ||
1109 | RFKILL_STATE_UNBLOCKED); | ||
1110 | } | ||
1107 | return err; | 1111 | return err; |
1108 | } | 1112 | } |
1109 | 1113 | ||
@@ -1124,8 +1128,11 @@ static int sony_nc_setup_bluetooth_rfkill(struct acpi_device *device) | |||
1124 | err = rfkill_register(sony_bluetooth_rfkill); | 1128 | err = rfkill_register(sony_bluetooth_rfkill); |
1125 | if (err) | 1129 | if (err) |
1126 | rfkill_free(sony_bluetooth_rfkill); | 1130 | rfkill_free(sony_bluetooth_rfkill); |
1127 | else | 1131 | else { |
1128 | sony_rfkill_devices[SONY_BLUETOOTH] = sony_bluetooth_rfkill; | 1132 | sony_rfkill_devices[SONY_BLUETOOTH] = sony_bluetooth_rfkill; |
1133 | sony_nc_rfkill_set(sony_bluetooth_rfkill->data, | ||
1134 | RFKILL_STATE_UNBLOCKED); | ||
1135 | } | ||
1129 | return err; | 1136 | return err; |
1130 | } | 1137 | } |
1131 | 1138 | ||
@@ -1145,8 +1152,11 @@ static int sony_nc_setup_wwan_rfkill(struct acpi_device *device) | |||
1145 | err = rfkill_register(sony_wwan_rfkill); | 1152 | err = rfkill_register(sony_wwan_rfkill); |
1146 | if (err) | 1153 | if (err) |
1147 | rfkill_free(sony_wwan_rfkill); | 1154 | rfkill_free(sony_wwan_rfkill); |
1148 | else | 1155 | else { |
1149 | sony_rfkill_devices[SONY_WWAN] = sony_wwan_rfkill; | 1156 | sony_rfkill_devices[SONY_WWAN] = sony_wwan_rfkill; |
1157 | sony_nc_rfkill_set(sony_wwan_rfkill->data, | ||
1158 | RFKILL_STATE_UNBLOCKED); | ||
1159 | } | ||
1150 | return err; | 1160 | return err; |
1151 | } | 1161 | } |
1152 | 1162 | ||
@@ -1166,8 +1176,11 @@ static int sony_nc_setup_wimax_rfkill(struct acpi_device *device) | |||
1166 | err = rfkill_register(sony_wimax_rfkill); | 1176 | err = rfkill_register(sony_wimax_rfkill); |
1167 | if (err) | 1177 | if (err) |
1168 | rfkill_free(sony_wimax_rfkill); | 1178 | rfkill_free(sony_wimax_rfkill); |
1169 | else | 1179 | else { |
1170 | sony_rfkill_devices[SONY_WIMAX] = sony_wimax_rfkill; | 1180 | sony_rfkill_devices[SONY_WIMAX] = sony_wimax_rfkill; |
1181 | sony_nc_rfkill_set(sony_wimax_rfkill->data, | ||
1182 | RFKILL_STATE_UNBLOCKED); | ||
1183 | } | ||
1171 | return err; | 1184 | return err; |
1172 | } | 1185 | } |
1173 | 1186 | ||
@@ -1276,15 +1289,6 @@ static int sony_nc_add(struct acpi_device *device) | |||
1276 | goto outwalk; | 1289 | goto outwalk; |
1277 | } | 1290 | } |
1278 | 1291 | ||
1279 | status = acpi_install_notify_handler(sony_nc_acpi_handle, | ||
1280 | ACPI_DEVICE_NOTIFY, | ||
1281 | sony_acpi_notify, NULL); | ||
1282 | if (ACPI_FAILURE(status)) { | ||
1283 | printk(KERN_WARNING DRV_PFX "unable to install notify handler (%u)\n", status); | ||
1284 | result = -ENODEV; | ||
1285 | goto outinput; | ||
1286 | } | ||
1287 | |||
1288 | if (acpi_video_backlight_support()) { | 1292 | if (acpi_video_backlight_support()) { |
1289 | printk(KERN_INFO DRV_PFX "brightness ignored, must be " | 1293 | printk(KERN_INFO DRV_PFX "brightness ignored, must be " |
1290 | "controlled by ACPI video driver\n"); | 1294 | "controlled by ACPI video driver\n"); |
@@ -1362,13 +1366,6 @@ static int sony_nc_add(struct acpi_device *device) | |||
1362 | if (sony_backlight_device) | 1366 | if (sony_backlight_device) |
1363 | backlight_device_unregister(sony_backlight_device); | 1367 | backlight_device_unregister(sony_backlight_device); |
1364 | 1368 | ||
1365 | status = acpi_remove_notify_handler(sony_nc_acpi_handle, | ||
1366 | ACPI_DEVICE_NOTIFY, | ||
1367 | sony_acpi_notify); | ||
1368 | if (ACPI_FAILURE(status)) | ||
1369 | printk(KERN_WARNING DRV_PFX "unable to remove notify handler\n"); | ||
1370 | |||
1371 | outinput: | ||
1372 | sony_laptop_remove_input(); | 1369 | sony_laptop_remove_input(); |
1373 | 1370 | ||
1374 | outwalk: | 1371 | outwalk: |
@@ -1378,7 +1375,6 @@ static int sony_nc_add(struct acpi_device *device) | |||
1378 | 1375 | ||
1379 | static int sony_nc_remove(struct acpi_device *device, int type) | 1376 | static int sony_nc_remove(struct acpi_device *device, int type) |
1380 | { | 1377 | { |
1381 | acpi_status status; | ||
1382 | struct sony_nc_value *item; | 1378 | struct sony_nc_value *item; |
1383 | 1379 | ||
1384 | if (sony_backlight_device) | 1380 | if (sony_backlight_device) |
@@ -1386,12 +1382,6 @@ static int sony_nc_remove(struct acpi_device *device, int type) | |||
1386 | 1382 | ||
1387 | sony_nc_acpi_device = NULL; | 1383 | sony_nc_acpi_device = NULL; |
1388 | 1384 | ||
1389 | status = acpi_remove_notify_handler(sony_nc_acpi_handle, | ||
1390 | ACPI_DEVICE_NOTIFY, | ||
1391 | sony_acpi_notify); | ||
1392 | if (ACPI_FAILURE(status)) | ||
1393 | printk(KERN_WARNING DRV_PFX "unable to remove notify handler\n"); | ||
1394 | |||
1395 | for (item = sony_nc_values; item->name; ++item) { | 1385 | for (item = sony_nc_values; item->name; ++item) { |
1396 | device_remove_file(&sony_pf_device->dev, &item->devattr); | 1386 | device_remove_file(&sony_pf_device->dev, &item->devattr); |
1397 | } | 1387 | } |
@@ -1425,6 +1415,7 @@ static struct acpi_driver sony_nc_driver = { | |||
1425 | .add = sony_nc_add, | 1415 | .add = sony_nc_add, |
1426 | .remove = sony_nc_remove, | 1416 | .remove = sony_nc_remove, |
1427 | .resume = sony_nc_resume, | 1417 | .resume = sony_nc_resume, |
1418 | .notify = sony_nc_notify, | ||
1428 | }, | 1419 | }, |
1429 | }; | 1420 | }; |
1430 | 1421 | ||
diff --git a/drivers/platform/x86/thinkpad_acpi.c b/drivers/platform/x86/thinkpad_acpi.c index a40b075743d9..912be65b6261 100644 --- a/drivers/platform/x86/thinkpad_acpi.c +++ b/drivers/platform/x86/thinkpad_acpi.c | |||
@@ -21,7 +21,7 @@ | |||
21 | * 02110-1301, USA. | 21 | * 02110-1301, USA. |
22 | */ | 22 | */ |
23 | 23 | ||
24 | #define TPACPI_VERSION "0.22" | 24 | #define TPACPI_VERSION "0.23" |
25 | #define TPACPI_SYSFS_VERSION 0x020300 | 25 | #define TPACPI_SYSFS_VERSION 0x020300 |
26 | 26 | ||
27 | /* | 27 | /* |
@@ -303,11 +303,17 @@ static u32 dbg_level; | |||
303 | 303 | ||
304 | static struct workqueue_struct *tpacpi_wq; | 304 | static struct workqueue_struct *tpacpi_wq; |
305 | 305 | ||
306 | enum led_status_t { | ||
307 | TPACPI_LED_OFF = 0, | ||
308 | TPACPI_LED_ON, | ||
309 | TPACPI_LED_BLINK, | ||
310 | }; | ||
311 | |||
306 | /* Special LED class that can defer work */ | 312 | /* Special LED class that can defer work */ |
307 | struct tpacpi_led_classdev { | 313 | struct tpacpi_led_classdev { |
308 | struct led_classdev led_classdev; | 314 | struct led_classdev led_classdev; |
309 | struct work_struct work; | 315 | struct work_struct work; |
310 | enum led_brightness new_brightness; | 316 | enum led_status_t new_state; |
311 | unsigned int led; | 317 | unsigned int led; |
312 | }; | 318 | }; |
313 | 319 | ||
@@ -2946,12 +2952,18 @@ static int hotkey_read(char *p) | |||
2946 | return len; | 2952 | return len; |
2947 | } | 2953 | } |
2948 | 2954 | ||
2949 | static void hotkey_enabledisable_warn(void) | 2955 | static void hotkey_enabledisable_warn(bool enable) |
2950 | { | 2956 | { |
2951 | tpacpi_log_usertask("procfs hotkey enable/disable"); | 2957 | tpacpi_log_usertask("procfs hotkey enable/disable"); |
2952 | WARN(1, TPACPI_WARN | 2958 | if (!WARN((tpacpi_lifecycle == TPACPI_LIFE_RUNNING || !enable), |
2953 | "hotkey enable/disable functionality has been " | 2959 | TPACPI_WARN |
2954 | "removed from the driver. Hotkeys are always enabled.\n"); | 2960 | "hotkey enable/disable functionality has been " |
2961 | "removed from the driver. Hotkeys are always " | ||
2962 | "enabled\n")) | ||
2963 | printk(TPACPI_ERR | ||
2964 | "Please remove the hotkey=enable module " | ||
2965 | "parameter, it is deprecated. Hotkeys are always " | ||
2966 | "enabled\n"); | ||
2955 | } | 2967 | } |
2956 | 2968 | ||
2957 | static int hotkey_write(char *buf) | 2969 | static int hotkey_write(char *buf) |
@@ -2971,9 +2983,9 @@ static int hotkey_write(char *buf) | |||
2971 | res = 0; | 2983 | res = 0; |
2972 | while ((cmd = next_cmd(&buf))) { | 2984 | while ((cmd = next_cmd(&buf))) { |
2973 | if (strlencmp(cmd, "enable") == 0) { | 2985 | if (strlencmp(cmd, "enable") == 0) { |
2974 | hotkey_enabledisable_warn(); | 2986 | hotkey_enabledisable_warn(1); |
2975 | } else if (strlencmp(cmd, "disable") == 0) { | 2987 | } else if (strlencmp(cmd, "disable") == 0) { |
2976 | hotkey_enabledisable_warn(); | 2988 | hotkey_enabledisable_warn(0); |
2977 | res = -EPERM; | 2989 | res = -EPERM; |
2978 | } else if (strlencmp(cmd, "reset") == 0) { | 2990 | } else if (strlencmp(cmd, "reset") == 0) { |
2979 | mask = hotkey_orig_mask; | 2991 | mask = hotkey_orig_mask; |
@@ -4207,7 +4219,7 @@ static void light_set_status_worker(struct work_struct *work) | |||
4207 | container_of(work, struct tpacpi_led_classdev, work); | 4219 | container_of(work, struct tpacpi_led_classdev, work); |
4208 | 4220 | ||
4209 | if (likely(tpacpi_lifecycle == TPACPI_LIFE_RUNNING)) | 4221 | if (likely(tpacpi_lifecycle == TPACPI_LIFE_RUNNING)) |
4210 | light_set_status((data->new_brightness != LED_OFF)); | 4222 | light_set_status((data->new_state != TPACPI_LED_OFF)); |
4211 | } | 4223 | } |
4212 | 4224 | ||
4213 | static void light_sysfs_set(struct led_classdev *led_cdev, | 4225 | static void light_sysfs_set(struct led_classdev *led_cdev, |
@@ -4217,7 +4229,8 @@ static void light_sysfs_set(struct led_classdev *led_cdev, | |||
4217 | container_of(led_cdev, | 4229 | container_of(led_cdev, |
4218 | struct tpacpi_led_classdev, | 4230 | struct tpacpi_led_classdev, |
4219 | led_classdev); | 4231 | led_classdev); |
4220 | data->new_brightness = brightness; | 4232 | data->new_state = (brightness != LED_OFF) ? |
4233 | TPACPI_LED_ON : TPACPI_LED_OFF; | ||
4221 | queue_work(tpacpi_wq, &data->work); | 4234 | queue_work(tpacpi_wq, &data->work); |
4222 | } | 4235 | } |
4223 | 4236 | ||
@@ -4724,12 +4737,6 @@ enum { /* For TPACPI_LED_OLD */ | |||
4724 | TPACPI_LED_EC_HLMS = 0x0e, /* EC reg to select led to command */ | 4737 | TPACPI_LED_EC_HLMS = 0x0e, /* EC reg to select led to command */ |
4725 | }; | 4738 | }; |
4726 | 4739 | ||
4727 | enum led_status_t { | ||
4728 | TPACPI_LED_OFF = 0, | ||
4729 | TPACPI_LED_ON, | ||
4730 | TPACPI_LED_BLINK, | ||
4731 | }; | ||
4732 | |||
4733 | static enum led_access_mode led_supported; | 4740 | static enum led_access_mode led_supported; |
4734 | 4741 | ||
4735 | TPACPI_HANDLE(led, ec, "SLED", /* 570 */ | 4742 | TPACPI_HANDLE(led, ec, "SLED", /* 570 */ |
@@ -4841,23 +4848,13 @@ static int led_set_status(const unsigned int led, | |||
4841 | return rc; | 4848 | return rc; |
4842 | } | 4849 | } |
4843 | 4850 | ||
4844 | static void led_sysfs_set_status(unsigned int led, | ||
4845 | enum led_brightness brightness) | ||
4846 | { | ||
4847 | led_set_status(led, | ||
4848 | (brightness == LED_OFF) ? | ||
4849 | TPACPI_LED_OFF : | ||
4850 | (tpacpi_led_state_cache[led] == TPACPI_LED_BLINK) ? | ||
4851 | TPACPI_LED_BLINK : TPACPI_LED_ON); | ||
4852 | } | ||
4853 | |||
4854 | static void led_set_status_worker(struct work_struct *work) | 4851 | static void led_set_status_worker(struct work_struct *work) |
4855 | { | 4852 | { |
4856 | struct tpacpi_led_classdev *data = | 4853 | struct tpacpi_led_classdev *data = |
4857 | container_of(work, struct tpacpi_led_classdev, work); | 4854 | container_of(work, struct tpacpi_led_classdev, work); |
4858 | 4855 | ||
4859 | if (likely(tpacpi_lifecycle == TPACPI_LIFE_RUNNING)) | 4856 | if (likely(tpacpi_lifecycle == TPACPI_LIFE_RUNNING)) |
4860 | led_sysfs_set_status(data->led, data->new_brightness); | 4857 | led_set_status(data->led, data->new_state); |
4861 | } | 4858 | } |
4862 | 4859 | ||
4863 | static void led_sysfs_set(struct led_classdev *led_cdev, | 4860 | static void led_sysfs_set(struct led_classdev *led_cdev, |
@@ -4866,7 +4863,13 @@ static void led_sysfs_set(struct led_classdev *led_cdev, | |||
4866 | struct tpacpi_led_classdev *data = container_of(led_cdev, | 4863 | struct tpacpi_led_classdev *data = container_of(led_cdev, |
4867 | struct tpacpi_led_classdev, led_classdev); | 4864 | struct tpacpi_led_classdev, led_classdev); |
4868 | 4865 | ||
4869 | data->new_brightness = brightness; | 4866 | if (brightness == LED_OFF) |
4867 | data->new_state = TPACPI_LED_OFF; | ||
4868 | else if (tpacpi_led_state_cache[data->led] != TPACPI_LED_BLINK) | ||
4869 | data->new_state = TPACPI_LED_ON; | ||
4870 | else | ||
4871 | data->new_state = TPACPI_LED_BLINK; | ||
4872 | |||
4870 | queue_work(tpacpi_wq, &data->work); | 4873 | queue_work(tpacpi_wq, &data->work); |
4871 | } | 4874 | } |
4872 | 4875 | ||
@@ -4884,7 +4887,7 @@ static int led_sysfs_blink_set(struct led_classdev *led_cdev, | |||
4884 | } else if ((*delay_on != 500) || (*delay_off != 500)) | 4887 | } else if ((*delay_on != 500) || (*delay_off != 500)) |
4885 | return -EINVAL; | 4888 | return -EINVAL; |
4886 | 4889 | ||
4887 | data->new_brightness = TPACPI_LED_BLINK; | 4890 | data->new_state = TPACPI_LED_BLINK; |
4888 | queue_work(tpacpi_wq, &data->work); | 4891 | queue_work(tpacpi_wq, &data->work); |
4889 | 4892 | ||
4890 | return 0; | 4893 | return 0; |
@@ -7858,6 +7861,15 @@ static int __init thinkpad_acpi_module_init(void) | |||
7858 | MODULE_ALIAS(TPACPI_DRVR_SHORTNAME); | 7861 | MODULE_ALIAS(TPACPI_DRVR_SHORTNAME); |
7859 | 7862 | ||
7860 | /* | 7863 | /* |
7864 | * This will autoload the driver in almost every ThinkPad | ||
7865 | * in widespread use. | ||
7866 | * | ||
7867 | * Only _VERY_ old models, like the 240, 240x and 570 lack | ||
7868 | * the HKEY event interface. | ||
7869 | */ | ||
7870 | MODULE_DEVICE_TABLE(acpi, ibm_htk_device_ids); | ||
7871 | |||
7872 | /* | ||
7861 | * DMI matching for module autoloading | 7873 | * DMI matching for module autoloading |
7862 | * | 7874 | * |
7863 | * See http://thinkwiki.org/wiki/List_of_DMI_IDs | 7875 | * See http://thinkwiki.org/wiki/List_of_DMI_IDs |
@@ -7869,18 +7881,13 @@ MODULE_ALIAS(TPACPI_DRVR_SHORTNAME); | |||
7869 | #define IBM_BIOS_MODULE_ALIAS(__type) \ | 7881 | #define IBM_BIOS_MODULE_ALIAS(__type) \ |
7870 | MODULE_ALIAS("dmi:bvnIBM:bvr" __type "ET??WW*") | 7882 | MODULE_ALIAS("dmi:bvnIBM:bvr" __type "ET??WW*") |
7871 | 7883 | ||
7872 | /* Non-ancient thinkpads */ | ||
7873 | MODULE_ALIAS("dmi:bvnIBM:*:svnIBM:*:pvrThinkPad*:rvnIBM:*"); | ||
7874 | MODULE_ALIAS("dmi:bvnLENOVO:*:svnLENOVO:*:pvrThinkPad*:rvnLENOVO:*"); | ||
7875 | |||
7876 | /* Ancient thinkpad BIOSes have to be identified by | 7884 | /* Ancient thinkpad BIOSes have to be identified by |
7877 | * BIOS type or model number, and there are far less | 7885 | * BIOS type or model number, and there are far less |
7878 | * BIOS types than model numbers... */ | 7886 | * BIOS types than model numbers... */ |
7879 | IBM_BIOS_MODULE_ALIAS("I[BDHIMNOTWVYZ]"); | 7887 | IBM_BIOS_MODULE_ALIAS("I[MU]"); /* 570, 570e */ |
7880 | IBM_BIOS_MODULE_ALIAS("1[0368A-GIKM-PST]"); | ||
7881 | IBM_BIOS_MODULE_ALIAS("K[UX-Z]"); | ||
7882 | 7888 | ||
7883 | MODULE_AUTHOR("Borislav Deianov, Henrique de Moraes Holschuh"); | 7889 | MODULE_AUTHOR("Borislav Deianov <borislav@users.sf.net>"); |
7890 | MODULE_AUTHOR("Henrique de Moraes Holschuh <hmh@hmh.eng.br>"); | ||
7884 | MODULE_DESCRIPTION(TPACPI_DESC); | 7891 | MODULE_DESCRIPTION(TPACPI_DESC); |
7885 | MODULE_VERSION(TPACPI_VERSION); | 7892 | MODULE_VERSION(TPACPI_VERSION); |
7886 | MODULE_LICENSE("GPL"); | 7893 | MODULE_LICENSE("GPL"); |
diff --git a/drivers/platform/x86/wmi.c b/drivers/platform/x86/wmi.c index 2f269e117b8f..043b208d971d 100644 --- a/drivers/platform/x86/wmi.c +++ b/drivers/platform/x86/wmi.c | |||
@@ -81,6 +81,7 @@ static struct wmi_block wmi_blocks; | |||
81 | 81 | ||
82 | static int acpi_wmi_remove(struct acpi_device *device, int type); | 82 | static int acpi_wmi_remove(struct acpi_device *device, int type); |
83 | static int acpi_wmi_add(struct acpi_device *device); | 83 | static int acpi_wmi_add(struct acpi_device *device); |
84 | static void acpi_wmi_notify(struct acpi_device *device, u32 event); | ||
84 | 85 | ||
85 | static const struct acpi_device_id wmi_device_ids[] = { | 86 | static const struct acpi_device_id wmi_device_ids[] = { |
86 | {"PNP0C14", 0}, | 87 | {"PNP0C14", 0}, |
@@ -96,6 +97,7 @@ static struct acpi_driver acpi_wmi_driver = { | |||
96 | .ops = { | 97 | .ops = { |
97 | .add = acpi_wmi_add, | 98 | .add = acpi_wmi_add, |
98 | .remove = acpi_wmi_remove, | 99 | .remove = acpi_wmi_remove, |
100 | .notify = acpi_wmi_notify, | ||
99 | }, | 101 | }, |
100 | }; | 102 | }; |
101 | 103 | ||
@@ -643,12 +645,11 @@ acpi_wmi_ec_space_handler(u32 function, acpi_physical_address address, | |||
643 | } | 645 | } |
644 | } | 646 | } |
645 | 647 | ||
646 | static void acpi_wmi_notify(acpi_handle handle, u32 event, void *data) | 648 | static void acpi_wmi_notify(struct acpi_device *device, u32 event) |
647 | { | 649 | { |
648 | struct guid_block *block; | 650 | struct guid_block *block; |
649 | struct wmi_block *wblock; | 651 | struct wmi_block *wblock; |
650 | struct list_head *p; | 652 | struct list_head *p; |
651 | struct acpi_device *device = data; | ||
652 | 653 | ||
653 | list_for_each(p, &wmi_blocks.list) { | 654 | list_for_each(p, &wmi_blocks.list) { |
654 | wblock = list_entry(p, struct wmi_block, list); | 655 | wblock = list_entry(p, struct wmi_block, list); |
@@ -669,9 +670,6 @@ static void acpi_wmi_notify(acpi_handle handle, u32 event, void *data) | |||
669 | 670 | ||
670 | static int acpi_wmi_remove(struct acpi_device *device, int type) | 671 | static int acpi_wmi_remove(struct acpi_device *device, int type) |
671 | { | 672 | { |
672 | acpi_remove_notify_handler(device->handle, ACPI_DEVICE_NOTIFY, | ||
673 | acpi_wmi_notify); | ||
674 | |||
675 | acpi_remove_address_space_handler(device->handle, | 673 | acpi_remove_address_space_handler(device->handle, |
676 | ACPI_ADR_SPACE_EC, &acpi_wmi_ec_space_handler); | 674 | ACPI_ADR_SPACE_EC, &acpi_wmi_ec_space_handler); |
677 | 675 | ||
@@ -683,13 +681,6 @@ static int __init acpi_wmi_add(struct acpi_device *device) | |||
683 | acpi_status status; | 681 | acpi_status status; |
684 | int result = 0; | 682 | int result = 0; |
685 | 683 | ||
686 | status = acpi_install_notify_handler(device->handle, ACPI_DEVICE_NOTIFY, | ||
687 | acpi_wmi_notify, device); | ||
688 | if (ACPI_FAILURE(status)) { | ||
689 | printk(KERN_ERR PREFIX "Error installing notify handler\n"); | ||
690 | return -ENODEV; | ||
691 | } | ||
692 | |||
693 | status = acpi_install_address_space_handler(device->handle, | 684 | status = acpi_install_address_space_handler(device->handle, |
694 | ACPI_ADR_SPACE_EC, | 685 | ACPI_ADR_SPACE_EC, |
695 | &acpi_wmi_ec_space_handler, | 686 | &acpi_wmi_ec_space_handler, |