diff options
Diffstat (limited to 'drivers/platform')
-rw-r--r-- | drivers/platform/x86/acer-wmi.c | 38 |
1 files changed, 26 insertions, 12 deletions
diff --git a/drivers/platform/x86/acer-wmi.c b/drivers/platform/x86/acer-wmi.c index cb7e841582d9..c31664438e76 100644 --- a/drivers/platform/x86/acer-wmi.c +++ b/drivers/platform/x86/acer-wmi.c | |||
@@ -159,7 +159,14 @@ struct lm_return_value { | |||
159 | u16 reserved; | 159 | u16 reserved; |
160 | } __attribute__((packed)); | 160 | } __attribute__((packed)); |
161 | 161 | ||
162 | struct wmid3_gds_input_param { /* Get Device Status input parameter */ | 162 | struct wmid3_gds_set_input_param { /* Set Device Status input parameter */ |
163 | u8 function_num; /* Function Number */ | ||
164 | u8 hotkey_number; /* Hotkey Number */ | ||
165 | u16 devices; /* Set Device */ | ||
166 | u8 volume_value; /* Volume Value */ | ||
167 | } __attribute__((packed)); | ||
168 | |||
169 | struct wmid3_gds_get_input_param { /* Get Device Status input parameter */ | ||
163 | u8 function_num; /* Function Number */ | 170 | u8 function_num; /* Function Number */ |
164 | u8 hotkey_number; /* Hotkey Number */ | 171 | u8 hotkey_number; /* Hotkey Number */ |
165 | u16 devices; /* Get Device */ | 172 | u16 devices; /* Get Device */ |
@@ -922,13 +929,13 @@ static acpi_status wmid3_get_device_status(u32 *value, u16 device) | |||
922 | struct wmid3_gds_return_value return_value; | 929 | struct wmid3_gds_return_value return_value; |
923 | acpi_status status; | 930 | acpi_status status; |
924 | union acpi_object *obj; | 931 | union acpi_object *obj; |
925 | struct wmid3_gds_input_param params = { | 932 | struct wmid3_gds_get_input_param params = { |
926 | .function_num = 0x1, | 933 | .function_num = 0x1, |
927 | .hotkey_number = commun_fn_key_number, | 934 | .hotkey_number = commun_fn_key_number, |
928 | .devices = device, | 935 | .devices = device, |
929 | }; | 936 | }; |
930 | struct acpi_buffer input = { | 937 | struct acpi_buffer input = { |
931 | sizeof(struct wmid3_gds_input_param), | 938 | sizeof(struct wmid3_gds_get_input_param), |
932 | ¶ms | 939 | ¶ms |
933 | }; | 940 | }; |
934 | struct acpi_buffer output = { ACPI_ALLOCATE_BUFFER, NULL }; | 941 | struct acpi_buffer output = { ACPI_ALLOCATE_BUFFER, NULL }; |
@@ -991,19 +998,28 @@ static acpi_status wmid3_set_device_status(u32 value, u16 device) | |||
991 | acpi_status status; | 998 | acpi_status status; |
992 | union acpi_object *obj; | 999 | union acpi_object *obj; |
993 | u16 devices; | 1000 | u16 devices; |
994 | struct wmid3_gds_input_param params = { | 1001 | struct wmid3_gds_get_input_param get_params = { |
995 | .function_num = 0x1, | 1002 | .function_num = 0x1, |
996 | .hotkey_number = commun_fn_key_number, | 1003 | .hotkey_number = commun_fn_key_number, |
997 | .devices = commun_func_bitmap, | 1004 | .devices = commun_func_bitmap, |
998 | }; | 1005 | }; |
999 | struct acpi_buffer input = { | 1006 | struct acpi_buffer get_input = { |
1000 | sizeof(struct wmid3_gds_input_param), | 1007 | sizeof(struct wmid3_gds_get_input_param), |
1001 | ¶ms | 1008 | &get_params |
1009 | }; | ||
1010 | struct wmid3_gds_set_input_param set_params = { | ||
1011 | .function_num = 0x2, | ||
1012 | .hotkey_number = commun_fn_key_number, | ||
1013 | .devices = commun_func_bitmap, | ||
1014 | }; | ||
1015 | struct acpi_buffer set_input = { | ||
1016 | sizeof(struct wmid3_gds_set_input_param), | ||
1017 | &set_params | ||
1002 | }; | 1018 | }; |
1003 | struct acpi_buffer output = { ACPI_ALLOCATE_BUFFER, NULL }; | 1019 | struct acpi_buffer output = { ACPI_ALLOCATE_BUFFER, NULL }; |
1004 | struct acpi_buffer output2 = { ACPI_ALLOCATE_BUFFER, NULL }; | 1020 | struct acpi_buffer output2 = { ACPI_ALLOCATE_BUFFER, NULL }; |
1005 | 1021 | ||
1006 | status = wmi_evaluate_method(WMID_GUID3, 0, 0x2, &input, &output); | 1022 | status = wmi_evaluate_method(WMID_GUID3, 0, 0x2, &get_input, &output); |
1007 | if (ACPI_FAILURE(status)) | 1023 | if (ACPI_FAILURE(status)) |
1008 | return status; | 1024 | return status; |
1009 | 1025 | ||
@@ -1032,11 +1048,9 @@ static acpi_status wmid3_set_device_status(u32 value, u16 device) | |||
1032 | } | 1048 | } |
1033 | 1049 | ||
1034 | devices = return_value.devices; | 1050 | devices = return_value.devices; |
1035 | params.function_num = 0x2; | 1051 | set_params.devices = (value) ? (devices | device) : (devices & ~device); |
1036 | params.hotkey_number = commun_fn_key_number; | ||
1037 | params.devices = (value) ? (devices | device) : (devices & ~device); | ||
1038 | 1052 | ||
1039 | status = wmi_evaluate_method(WMID_GUID3, 0, 0x1, &input, &output2); | 1053 | status = wmi_evaluate_method(WMID_GUID3, 0, 0x1, &set_input, &output2); |
1040 | if (ACPI_FAILURE(status)) | 1054 | if (ACPI_FAILURE(status)) |
1041 | return status; | 1055 | return status; |
1042 | 1056 | ||