diff options
author | Bjorn Helgaas <bjorn.helgaas@hp.com> | 2009-04-07 11:37:16 -0400 |
---|---|---|
committer | Len Brown <len.brown@intel.com> | 2009-04-07 16:26:58 -0400 |
commit | 700b6721cd1b891b67c2dcee046be12154a21fd6 (patch) | |
tree | 039361cd10127bc6ea10cb3ef09bf61b84023016 /drivers/platform | |
parent | 7015558fca5ee82fc17227b61d88ddaa02d82242 (diff) |
fujitsu-laptop: use .notify method instead of installing handler directly
This patch adds a .notify() method. The presence of .notify() causes
Linux/ACPI to manage event handlers and notify handlers on our behalf,
so we don't have to install and remove them ourselves.
Tested by Tony on Fujitsu-Siemens Lifebook S6420 [FJNB1E6] with
BIOS 1.18 (01/09/2009). Tested by Jonathan on Fujitsu S7020.
Signed-off-by: Bjorn Helgaas <bjorn.helgaas@hp.com>
Acked-By: Tony Vroon <tony@linx.net>
Tested-By: Tony Vroon <tony@linx.net>
Acked-by: Jonathan Woithe <jwoithe@physics.adelaide.edu.au>
Tested-by: Jonathan Woithe <jwoithe@physics.adelaide.edu.au>
Signed-off-by: Len Brown <len.brown@intel.com>
Diffstat (limited to 'drivers/platform')
-rw-r--r-- | drivers/platform/x86/fujitsu-laptop.c | 28 |
1 files changed, 4 insertions, 24 deletions
diff --git a/drivers/platform/x86/fujitsu-laptop.c b/drivers/platform/x86/fujitsu-laptop.c index 45940f31fe9e..10f879648f25 100644 --- a/drivers/platform/x86/fujitsu-laptop.c +++ b/drivers/platform/x86/fujitsu-laptop.c | |||
@@ -203,7 +203,7 @@ struct led_classdev kblamps_led = { | |||
203 | static u32 dbg_level = 0x03; | 203 | static u32 dbg_level = 0x03; |
204 | #endif | 204 | #endif |
205 | 205 | ||
206 | static void acpi_fujitsu_notify(acpi_handle handle, u32 event, void *data); | 206 | static void acpi_fujitsu_notify(struct acpi_device *device, u32 event); |
207 | 207 | ||
208 | /* Fujitsu ACPI interface function */ | 208 | /* Fujitsu ACPI interface function */ |
209 | 209 | ||
@@ -658,7 +658,6 @@ static struct dmi_system_id fujitsu_dmi_table[] = { | |||
658 | 658 | ||
659 | static int acpi_fujitsu_add(struct acpi_device *device) | 659 | static int acpi_fujitsu_add(struct acpi_device *device) |
660 | { | 660 | { |
661 | acpi_status status; | ||
662 | acpi_handle handle; | 661 | acpi_handle handle; |
663 | int result = 0; | 662 | int result = 0; |
664 | int state = 0; | 663 | int state = 0; |
@@ -673,20 +672,10 @@ static int acpi_fujitsu_add(struct acpi_device *device) | |||
673 | sprintf(acpi_device_class(device), "%s", ACPI_FUJITSU_CLASS); | 672 | sprintf(acpi_device_class(device), "%s", ACPI_FUJITSU_CLASS); |
674 | device->driver_data = fujitsu; | 673 | device->driver_data = fujitsu; |
675 | 674 | ||
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(); | 675 | fujitsu->input = input = input_allocate_device(); |
687 | if (!input) { | 676 | if (!input) { |
688 | error = -ENOMEM; | 677 | error = -ENOMEM; |
689 | goto err_uninstall_notify; | 678 | goto err_stop; |
690 | } | 679 | } |
691 | 680 | ||
692 | snprintf(fujitsu->phys, sizeof(fujitsu->phys), | 681 | snprintf(fujitsu->phys, sizeof(fujitsu->phys), |
@@ -743,9 +732,6 @@ static int acpi_fujitsu_add(struct acpi_device *device) | |||
743 | end: | 732 | end: |
744 | err_free_input_dev: | 733 | err_free_input_dev: |
745 | input_free_device(input); | 734 | 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: | 735 | err_stop: |
750 | 736 | ||
751 | return result; | 737 | return result; |
@@ -753,7 +739,6 @@ err_stop: | |||
753 | 739 | ||
754 | static int acpi_fujitsu_remove(struct acpi_device *device, int type) | 740 | static int acpi_fujitsu_remove(struct acpi_device *device, int type) |
755 | { | 741 | { |
756 | acpi_status status; | ||
757 | struct fujitsu_t *fujitsu = NULL; | 742 | struct fujitsu_t *fujitsu = NULL; |
758 | 743 | ||
759 | if (!device || !acpi_driver_data(device)) | 744 | if (!device || !acpi_driver_data(device)) |
@@ -761,10 +746,6 @@ static int acpi_fujitsu_remove(struct acpi_device *device, int type) | |||
761 | 746 | ||
762 | fujitsu = acpi_driver_data(device); | 747 | fujitsu = acpi_driver_data(device); |
763 | 748 | ||
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)) | 749 | if (!device || !acpi_driver_data(device)) |
769 | return -EINVAL; | 750 | return -EINVAL; |
770 | 751 | ||
@@ -775,7 +756,7 @@ static int acpi_fujitsu_remove(struct acpi_device *device, int type) | |||
775 | 756 | ||
776 | /* Brightness notify */ | 757 | /* Brightness notify */ |
777 | 758 | ||
778 | static void acpi_fujitsu_notify(acpi_handle handle, u32 event, void *data) | 759 | static void acpi_fujitsu_notify(struct acpi_device *device, u32 event) |
779 | { | 760 | { |
780 | struct input_dev *input; | 761 | struct input_dev *input; |
781 | int keycode; | 762 | int keycode; |
@@ -829,8 +810,6 @@ static void acpi_fujitsu_notify(acpi_handle handle, u32 event, void *data) | |||
829 | input_report_key(input, keycode, 0); | 810 | input_report_key(input, keycode, 0); |
830 | input_sync(input); | 811 | input_sync(input); |
831 | } | 812 | } |
832 | |||
833 | return; | ||
834 | } | 813 | } |
835 | 814 | ||
836 | /* ACPI device for hotkey handling */ | 815 | /* ACPI device for hotkey handling */ |
@@ -1107,6 +1086,7 @@ static struct acpi_driver acpi_fujitsu_driver = { | |||
1107 | .ops = { | 1086 | .ops = { |
1108 | .add = acpi_fujitsu_add, | 1087 | .add = acpi_fujitsu_add, |
1109 | .remove = acpi_fujitsu_remove, | 1088 | .remove = acpi_fujitsu_remove, |
1089 | .notify = acpi_fujitsu_notify, | ||
1110 | }, | 1090 | }, |
1111 | }; | 1091 | }; |
1112 | 1092 | ||