diff options
author | Seth Forshee <seth.forshee@canonical.com> | 2011-09-20 17:55:51 -0400 |
---|---|---|
committer | Matthew Garrett <mjg@redhat.com> | 2011-10-24 10:52:36 -0400 |
commit | 6e02cc7eb61aeafadb91f7b591a768cdb7a57740 (patch) | |
tree | c308c6910ed2a44dd6b23f8041d7fab897f3b3eb /drivers/platform | |
parent | 32bcd5cba02436336053d9c3b7a8ff86f889ebf4 (diff) |
toshiba_acpi: Use handle for HCI calls
Now that we're using an acpi driver we already have a handle to
the namespace of the HCI call, so there's no need to test various
paths to the HCI call or even be aware of the path at all.
Signed-off-by: Azael Avalos <coproscefalo@gmail.com>
Signed-off-by: Seth Forshee <seth.forshee@canonical.com>
Signed-off-by: Matthew Garrett <mjg@redhat.com>
Diffstat (limited to 'drivers/platform')
-rw-r--r-- | drivers/platform/x86/toshiba_acpi.c | 55 |
1 files changed, 15 insertions, 40 deletions
diff --git a/drivers/platform/x86/toshiba_acpi.c b/drivers/platform/x86/toshiba_acpi.c index 6b281c040bc0..a924c7f77220 100644 --- a/drivers/platform/x86/toshiba_acpi.c +++ b/drivers/platform/x86/toshiba_acpi.c | |||
@@ -62,11 +62,7 @@ MODULE_DESCRIPTION("Toshiba Laptop ACPI Extras Driver"); | |||
62 | MODULE_LICENSE("GPL"); | 62 | MODULE_LICENSE("GPL"); |
63 | 63 | ||
64 | /* Toshiba ACPI method paths */ | 64 | /* Toshiba ACPI method paths */ |
65 | #define METHOD_LCD_BRIGHTNESS "\\_SB_.PCI0.VGA_.LCD_._BCM" | ||
66 | #define TOSH_INTERFACE_1 "\\_SB_.VALD" | ||
67 | #define TOSH_INTERFACE_2 "\\_SB_.VALZ" | ||
68 | #define METHOD_VIDEO_OUT "\\_SB_.VALX.DSSX" | 65 | #define METHOD_VIDEO_OUT "\\_SB_.VALX.DSSX" |
69 | #define GHCI_METHOD ".GHCI" | ||
70 | 66 | ||
71 | /* Toshiba HCI interface definitions | 67 | /* Toshiba HCI interface definitions |
72 | * | 68 | * |
@@ -121,7 +117,6 @@ struct toshiba_acpi_dev { | |||
121 | int force_fan; | 117 | int force_fan; |
122 | int last_key_event; | 118 | int last_key_event; |
123 | int key_event_valid; | 119 | int key_event_valid; |
124 | acpi_handle handle; | ||
125 | 120 | ||
126 | struct mutex mutex; | 121 | struct mutex mutex; |
127 | }; | 122 | }; |
@@ -170,15 +165,6 @@ static __inline__ void _set_bit(u32 * word, u32 mask, int value) | |||
170 | /* acpi interface wrappers | 165 | /* acpi interface wrappers |
171 | */ | 166 | */ |
172 | 167 | ||
173 | static int is_valid_acpi_path(const char *methodName) | ||
174 | { | ||
175 | acpi_handle handle; | ||
176 | acpi_status status; | ||
177 | |||
178 | status = acpi_get_handle(NULL, (char *)methodName, &handle); | ||
179 | return !ACPI_FAILURE(status); | ||
180 | } | ||
181 | |||
182 | static int write_acpi_int(const char *methodName, int val) | 168 | static int write_acpi_int(const char *methodName, int val) |
183 | { | 169 | { |
184 | struct acpi_object_list params; | 170 | struct acpi_object_list params; |
@@ -217,7 +203,8 @@ static acpi_status hci_raw(struct toshiba_acpi_dev *dev, | |||
217 | results.length = sizeof(out_objs); | 203 | results.length = sizeof(out_objs); |
218 | results.pointer = out_objs; | 204 | results.pointer = out_objs; |
219 | 205 | ||
220 | status = acpi_evaluate_object(NULL, (char *)dev->method_hci, ¶ms, | 206 | status = acpi_evaluate_object(dev->acpi_dev->handle, |
207 | (char *)dev->method_hci, ¶ms, | ||
221 | &results); | 208 | &results); |
222 | if ((status == AE_OK) && (out_objs->package.count <= HCI_WORDS)) { | 209 | if ((status == AE_OK) && (out_objs->package.count <= HCI_WORDS)) { |
223 | for (i = 0; i < out_objs->package.count; ++i) { | 210 | for (i = 0; i < out_objs->package.count; ++i) { |
@@ -836,18 +823,11 @@ static const struct backlight_ops toshiba_backlight_data = { | |||
836 | .update_status = set_lcd_status, | 823 | .update_status = set_lcd_status, |
837 | }; | 824 | }; |
838 | 825 | ||
839 | static int __devinit toshiba_acpi_setup_keyboard(struct toshiba_acpi_dev *dev, | 826 | static int __devinit toshiba_acpi_setup_keyboard(struct toshiba_acpi_dev *dev) |
840 | char *device_path) | ||
841 | { | 827 | { |
842 | acpi_status status; | 828 | acpi_status status; |
843 | int error; | 829 | int error; |
844 | 830 | ||
845 | status = acpi_get_handle(NULL, device_path, &dev->handle); | ||
846 | if (ACPI_FAILURE(status)) { | ||
847 | pr_info("Unable to get notification device\n"); | ||
848 | return -ENODEV; | ||
849 | } | ||
850 | |||
851 | dev->hotkey_dev = input_allocate_device(); | 831 | dev->hotkey_dev = input_allocate_device(); |
852 | if (!dev->hotkey_dev) { | 832 | if (!dev->hotkey_dev) { |
853 | pr_info("Unable to register input device\n"); | 833 | pr_info("Unable to register input device\n"); |
@@ -855,14 +835,14 @@ static int __devinit toshiba_acpi_setup_keyboard(struct toshiba_acpi_dev *dev, | |||
855 | } | 835 | } |
856 | 836 | ||
857 | dev->hotkey_dev->name = "Toshiba input device"; | 837 | dev->hotkey_dev->name = "Toshiba input device"; |
858 | dev->hotkey_dev->phys = device_path; | 838 | dev->hotkey_dev->phys = "toshiba_acpi/input0"; |
859 | dev->hotkey_dev->id.bustype = BUS_HOST; | 839 | dev->hotkey_dev->id.bustype = BUS_HOST; |
860 | 840 | ||
861 | error = sparse_keymap_setup(dev->hotkey_dev, toshiba_acpi_keymap, NULL); | 841 | error = sparse_keymap_setup(dev->hotkey_dev, toshiba_acpi_keymap, NULL); |
862 | if (error) | 842 | if (error) |
863 | goto err_free_dev; | 843 | goto err_free_dev; |
864 | 844 | ||
865 | status = acpi_evaluate_object(dev->handle, "ENAB", NULL, NULL); | 845 | status = acpi_evaluate_object(dev->acpi_dev->handle, "ENAB", NULL, NULL); |
866 | if (ACPI_FAILURE(status)) { | 846 | if (ACPI_FAILURE(status)) { |
867 | pr_info("Unable to enable hotkeys\n"); | 847 | pr_info("Unable to enable hotkeys\n"); |
868 | error = -ENODEV; | 848 | error = -ENODEV; |
@@ -915,6 +895,8 @@ static int toshiba_acpi_remove(struct acpi_device *acpi_dev, int type) | |||
915 | static int __devinit toshiba_acpi_add(struct acpi_device *acpi_dev) | 895 | static int __devinit toshiba_acpi_add(struct acpi_device *acpi_dev) |
916 | { | 896 | { |
917 | struct toshiba_acpi_dev *dev; | 897 | struct toshiba_acpi_dev *dev; |
898 | acpi_status status; | ||
899 | acpi_handle handle; | ||
918 | u32 hci_result; | 900 | u32 hci_result; |
919 | bool bt_present; | 901 | bool bt_present; |
920 | int ret = 0; | 902 | int ret = 0; |
@@ -923,27 +905,20 @@ static int __devinit toshiba_acpi_add(struct acpi_device *acpi_dev) | |||
923 | pr_info("Toshiba Laptop ACPI Extras version %s\n", | 905 | pr_info("Toshiba Laptop ACPI Extras version %s\n", |
924 | TOSHIBA_ACPI_VERSION); | 906 | TOSHIBA_ACPI_VERSION); |
925 | 907 | ||
908 | /* simple device detection: look for HCI method */ | ||
909 | status = acpi_get_handle(acpi_dev->handle, "GHCI", &handle); | ||
910 | if (ACPI_FAILURE(status)) | ||
911 | return -ENODEV; | ||
912 | |||
926 | dev = kzalloc(sizeof(*dev), GFP_KERNEL); | 913 | dev = kzalloc(sizeof(*dev), GFP_KERNEL); |
927 | if (!dev) | 914 | if (!dev) |
928 | return -ENOMEM; | 915 | return -ENOMEM; |
929 | dev->acpi_dev = acpi_dev; | 916 | dev->acpi_dev = acpi_dev; |
917 | dev->method_hci = "GHCI"; | ||
930 | acpi_dev->driver_data = dev; | 918 | acpi_dev->driver_data = dev; |
931 | 919 | ||
932 | /* simple device detection: look for HCI method */ | 920 | if (toshiba_acpi_setup_keyboard(dev)) |
933 | if (is_valid_acpi_path(TOSH_INTERFACE_1 GHCI_METHOD)) { | 921 | pr_info("Unable to activate hotkeys\n"); |
934 | dev->method_hci = TOSH_INTERFACE_1 GHCI_METHOD; | ||
935 | if (toshiba_acpi_setup_keyboard(dev, TOSH_INTERFACE_1)) | ||
936 | pr_info("Unable to activate hotkeys\n"); | ||
937 | } else if (is_valid_acpi_path(TOSH_INTERFACE_2 GHCI_METHOD)) { | ||
938 | dev->method_hci = TOSH_INTERFACE_2 GHCI_METHOD; | ||
939 | if (toshiba_acpi_setup_keyboard(dev, TOSH_INTERFACE_2)) | ||
940 | pr_info("Unable to activate hotkeys\n"); | ||
941 | } else { | ||
942 | ret = -ENODEV; | ||
943 | goto error; | ||
944 | } | ||
945 | |||
946 | pr_info("HCI method: %s\n", dev->method_hci); | ||
947 | 922 | ||
948 | mutex_init(&dev->mutex); | 923 | mutex_init(&dev->mutex); |
949 | 924 | ||