aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMario Limonciello <mario.limonciello@dell.com>2017-11-01 15:25:23 -0400
committerDarren Hart (VMware) <dvhart@infradead.org>2017-11-03 19:33:57 -0400
commit722c856d46c6ca74a246b54a72f14751fec01aae (patch)
tree956a8cb207cc0ad028fa09d85f562efbeafe58c5
parentf35a8efe2c34496eaf45f8a9bd5bb7625d34bb5c (diff)
platform/x86: wmi: Add new method wmidev_evaluate_method
Drivers properly using the wmibus can pass their wmi_device pointer rather than the GUID back to the WMI bus to evaluate the proper methods. Any "new" drivers added that use the WMI bus should use this rather than the old wmi_evaluate_method that would take the GUID. Signed-off-by: Mario Limonciello <mario.limonciello@dell.com> Reviewed-by: Edward O'Callaghan <quasisec@google.com> Reviewed-by: Pali Rohár <pali.rohar@gmail.com> Signed-off-by: Darren Hart (VMware) <dvhart@infradead.org>
-rw-r--r--drivers/platform/x86/wmi.c28
-rw-r--r--include/linux/wmi.h6
2 files changed, 30 insertions, 4 deletions
diff --git a/drivers/platform/x86/wmi.c b/drivers/platform/x86/wmi.c
index 7a05843aff19..4d73a87c2ddf 100644
--- a/drivers/platform/x86/wmi.c
+++ b/drivers/platform/x86/wmi.c
@@ -201,6 +201,28 @@ static acpi_status wmi_method_enable(struct wmi_block *wblock, int enable)
201acpi_status wmi_evaluate_method(const char *guid_string, u8 instance, 201acpi_status wmi_evaluate_method(const char *guid_string, u8 instance,
202u32 method_id, const struct acpi_buffer *in, struct acpi_buffer *out) 202u32 method_id, const struct acpi_buffer *in, struct acpi_buffer *out)
203{ 203{
204 struct wmi_block *wblock = NULL;
205
206 if (!find_guid(guid_string, &wblock))
207 return AE_ERROR;
208 return wmidev_evaluate_method(&wblock->dev, instance, method_id,
209 in, out);
210}
211EXPORT_SYMBOL_GPL(wmi_evaluate_method);
212
213/**
214 * wmidev_evaluate_method - Evaluate a WMI method
215 * @wdev: A wmi bus device from a driver
216 * @instance: Instance index
217 * @method_id: Method ID to call
218 * &in: Buffer containing input for the method call
219 * &out: Empty buffer to return the method results
220 *
221 * Call an ACPI-WMI method
222 */
223acpi_status wmidev_evaluate_method(struct wmi_device *wdev, u8 instance,
224 u32 method_id, const struct acpi_buffer *in, struct acpi_buffer *out)
225{
204 struct guid_block *block = NULL; 226 struct guid_block *block = NULL;
205 struct wmi_block *wblock = NULL; 227 struct wmi_block *wblock = NULL;
206 acpi_handle handle; 228 acpi_handle handle;
@@ -209,9 +231,7 @@ u32 method_id, const struct acpi_buffer *in, struct acpi_buffer *out)
209 union acpi_object params[3]; 231 union acpi_object params[3];
210 char method[5] = "WM"; 232 char method[5] = "WM";
211 233
212 if (!find_guid(guid_string, &wblock)) 234 wblock = container_of(wdev, struct wmi_block, dev);
213 return AE_ERROR;
214
215 block = &wblock->gblock; 235 block = &wblock->gblock;
216 handle = wblock->acpi_device->handle; 236 handle = wblock->acpi_device->handle;
217 237
@@ -246,7 +266,7 @@ u32 method_id, const struct acpi_buffer *in, struct acpi_buffer *out)
246 266
247 return status; 267 return status;
248} 268}
249EXPORT_SYMBOL_GPL(wmi_evaluate_method); 269EXPORT_SYMBOL_GPL(wmidev_evaluate_method);
250 270
251static acpi_status __query_block(struct wmi_block *wblock, u8 instance, 271static acpi_status __query_block(struct wmi_block *wblock, u8 instance,
252 struct acpi_buffer *out) 272 struct acpi_buffer *out)
diff --git a/include/linux/wmi.h b/include/linux/wmi.h
index cd0d7734dc49..2cd10c3b89e9 100644
--- a/include/linux/wmi.h
+++ b/include/linux/wmi.h
@@ -26,6 +26,12 @@ struct wmi_device {
26 bool setable; 26 bool setable;
27}; 27};
28 28
29/* evaluate the ACPI method associated with this device */
30extern acpi_status wmidev_evaluate_method(struct wmi_device *wdev,
31 u8 instance, u32 method_id,
32 const struct acpi_buffer *in,
33 struct acpi_buffer *out);
34
29/* Caller must kfree the result. */ 35/* Caller must kfree the result. */
30extern union acpi_object *wmidev_block_query(struct wmi_device *wdev, 36extern union acpi_object *wmidev_block_query(struct wmi_device *wdev,
31 u8 instance); 37 u8 instance);