Merge tag 'acpi-6.10-rc1-2' of git://git.kernel.org/pub/scm/linux/kernel/git/rafael...
[linux-2.6-block.git] / drivers / platform / x86 / wmi.c
CommitLineData
1a59d1b8 1// SPDX-License-Identifier: GPL-2.0-or-later
bff431e4
CC
2/*
3 * ACPI-WMI mapping driver
4 *
5 * Copyright (C) 2007-2008 Carlos Corbacho <carlos@strangeworlds.co.uk>
6 *
7 * GUID parsing code from ldm.c is:
8 * Copyright (C) 2001,2002 Richard Russon <ldm@flatcap.org>
9 * Copyright (c) 2001-2007 Anton Altaparmakov
10 * Copyright (C) 2001,2002 Jakob Kemi <jakob.kemi@telia.com>
11 *
2c9c5664
DHV
12 * WMI bus infrastructure by Andrew Lutomirski and Darren Hart:
13 * Copyright (C) 2015 Andrew Lutomirski
14 * Copyright (C) 2017 VMware, Inc. All Rights Reserved.
bff431e4
CC
15 */
16
8e07514d
DT
17#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
18
b60ee4e0 19#include <linux/acpi.h>
1c95ace7 20#include <linux/bits.h>
dea878d8 21#include <linux/build_bug.h>
1caab3c1 22#include <linux/device.h>
b60ee4e0
ML
23#include <linux/init.h>
24#include <linux/kernel.h>
bff431e4 25#include <linux/list.h>
7c52d551 26#include <linux/module.h>
9599ed91 27#include <linux/platform_device.h>
29e473f4 28#include <linux/rwsem.h>
b60ee4e0 29#include <linux/slab.h>
6133913a 30#include <linux/sysfs.h>
b60ee4e0 31#include <linux/types.h>
538d7eb8 32#include <linux/uuid.h>
b60ee4e0 33#include <linux/wmi.h>
df23e2be 34#include <linux/fs.h>
bff431e4 35
bff431e4
CC
36MODULE_AUTHOR("Carlos Corbacho");
37MODULE_DESCRIPTION("ACPI-WMI Mapping Driver");
38MODULE_LICENSE("GPL");
39
762e1a2f 40static LIST_HEAD(wmi_block_list);
bff431e4
CC
41
42struct guid_block {
67f472fd 43 guid_t guid;
bff431e4
CC
44 union {
45 char object_id[2];
46 struct {
47 unsigned char notify_id;
48 unsigned char reserved;
49 };
50 };
51 u8 instance_count;
52 u8 flags;
dea878d8
BP
53} __packed;
54static_assert(sizeof(typeof_member(struct guid_block, guid)) == 16);
55static_assert(sizeof(struct guid_block) == 20);
56static_assert(__alignof__(struct guid_block) == 1);
bff431e4 57
a90b38c5
HG
58enum { /* wmi_block flags */
59 WMI_READ_TAKES_NO_ARGS,
92843958 60 WMI_GUID_DUPLICATED,
4f299135 61 WMI_NO_EVENT_DATA,
a90b38c5
HG
62};
63
bff431e4 64struct wmi_block {
844af950 65 struct wmi_device dev;
bff431e4
CC
66 struct list_head list;
67 struct guid_block gblock;
b0e86302 68 struct acpi_device *acpi_device;
29e473f4 69 struct rw_semaphore notify_lock; /* Protects notify callback add/remove */
bff431e4
CC
70 wmi_notify_handler handler;
71 void *handler_data;
29e473f4 72 bool driver_ready;
a90b38c5 73 unsigned long flags;
bff431e4
CC
74};
75
bff431e4
CC
76
77/*
78 * If the GUID data block is marked as expensive, we must enable and
79 * explicitily disable data collection.
80 */
1c95ace7
BP
81#define ACPI_WMI_EXPENSIVE BIT(0)
82#define ACPI_WMI_METHOD BIT(1) /* GUID is a method */
83#define ACPI_WMI_STRING BIT(2) /* GUID takes & returns a string */
84#define ACPI_WMI_EVENT BIT(3) /* GUID is an event */
bff431e4 85
bff431e4
CC
86static const struct acpi_device_id wmi_device_ids[] = {
87 {"PNP0C14", 0},
88 {"pnp0c14", 0},
9bf9ca95 89 { }
bff431e4
CC
90};
91MODULE_DEVICE_TABLE(acpi, wmi_device_ids);
92
7444f834
AW
93#define dev_to_wblock(__dev) container_of_const(__dev, struct wmi_block, dev.dev)
94#define dev_to_wdev(__dev) container_of_const(__dev, struct wmi_device, dev)
95
bff431e4
CC
96/*
97 * GUID parsing functions
98 */
99
028e6e20
AS
100static bool guid_parse_and_compare(const char *string, const guid_t *guid)
101{
102 guid_t guid_input;
103
104 if (guid_parse(string, &guid_input))
105 return false;
106
107 return guid_equal(&guid_input, guid);
108}
109
a48e2338 110static const void *find_guid_context(struct wmi_block *wblock,
bba08f35 111 struct wmi_driver *wdriver)
a48e2338
MJ
112{
113 const struct wmi_device_id *id;
a48e2338 114
6e0bc588
BP
115 id = wdriver->id_table;
116 if (!id)
a48e2338
MJ
117 return NULL;
118
a48e2338 119 while (*id->guid_string) {
028e6e20 120 if (guid_parse_and_compare(id->guid_string, &wblock->gblock.guid))
a48e2338
MJ
121 return id->context;
122 id++;
123 }
124 return NULL;
125}
126
285dd01a 127static acpi_status wmi_method_enable(struct wmi_block *wblock, bool enable)
a66bfa7a 128{
43aacf83 129 struct guid_block *block;
a66bfa7a 130 char method[5];
a66bfa7a
MG
131 acpi_status status;
132 acpi_handle handle;
133
134 block = &wblock->gblock;
b0e86302 135 handle = wblock->acpi_device->handle;
a66bfa7a 136
a66bfa7a 137 snprintf(method, 5, "WE%02X", block->notify_id);
8122ab66 138 status = acpi_execute_simple_method(handle, method, enable);
736b48aa 139 if (status == AE_NOT_FOUND)
a66bfa7a 140 return AE_OK;
736b48aa
BP
141
142 return status;
a66bfa7a
MG
143}
144
57f2ce89
BP
145#define WMI_ACPI_METHOD_NAME_SIZE 5
146
147static inline void get_acpi_method_name(const struct wmi_block *wblock,
148 const char method,
149 char buffer[static WMI_ACPI_METHOD_NAME_SIZE])
150{
151 static_assert(ARRAY_SIZE(wblock->gblock.object_id) == 2);
152 static_assert(WMI_ACPI_METHOD_NAME_SIZE >= 5);
153
154 buffer[0] = 'W';
155 buffer[1] = method;
156 buffer[2] = wblock->gblock.object_id[0];
157 buffer[3] = wblock->gblock.object_id[1];
158 buffer[4] = '\0';
159}
160
51142a08
BP
161static inline acpi_object_type get_param_acpi_type(const struct wmi_block *wblock)
162{
163 if (wblock->gblock.flags & ACPI_WMI_STRING)
164 return ACPI_TYPE_STRING;
165 else
166 return ACPI_TYPE_BUFFER;
167}
168
25be44f6
BP
169static acpi_status get_event_data(const struct wmi_block *wblock, struct acpi_buffer *out)
170{
171 union acpi_object param = {
172 .integer = {
173 .type = ACPI_TYPE_INTEGER,
174 .value = wblock->gblock.notify_id,
175 }
176 };
177 struct acpi_object_list input = {
178 .count = 1,
179 .pointer = &param,
180 };
181
182 return acpi_evaluate_object(wblock->acpi_device->handle, "_WED", &input, out);
183}
184
7444f834
AW
185static int wmidev_match_guid(struct device *dev, const void *data)
186{
187 struct wmi_block *wblock = dev_to_wblock(dev);
188 const guid_t *guid = data;
189
92843958
AW
190 /* Legacy GUID-based functions are restricted to only see
191 * a single WMI device for each GUID.
192 */
193 if (test_bit(WMI_GUID_DUPLICATED, &wblock->flags))
194 return 0;
195
7444f834
AW
196 if (guid_equal(guid, &wblock->gblock.guid))
197 return 1;
198
199 return 0;
200}
201
3ea7f59a
AW
202static int wmidev_match_notify_id(struct device *dev, const void *data)
203{
204 struct wmi_block *wblock = dev_to_wblock(dev);
205 const u32 *notify_id = data;
206
92843958
AW
207 /* Legacy GUID-based functions are restricted to only see
208 * a single WMI device for each GUID.
209 */
210 if (test_bit(WMI_GUID_DUPLICATED, &wblock->flags))
211 return 0;
212
3ea7f59a
AW
213 if (wblock->gblock.flags & ACPI_WMI_EVENT && wblock->gblock.notify_id == *notify_id)
214 return 1;
215
216 return 0;
217}
218
10fdfd13 219static const struct bus_type wmi_bus_type;
7444f834
AW
220
221static struct wmi_device *wmi_find_device_by_guid(const char *guid_string)
222{
223 struct device *dev;
224 guid_t guid;
225 int ret;
226
227 ret = guid_parse(guid_string, &guid);
228 if (ret < 0)
229 return ERR_PTR(ret);
230
231 dev = bus_find_device(&wmi_bus_type, NULL, &guid, wmidev_match_guid);
232 if (!dev)
233 return ERR_PTR(-ENODEV);
234
235 return dev_to_wdev(dev);
236}
237
3ea7f59a
AW
238static struct wmi_device *wmi_find_event_by_notify_id(const u32 notify_id)
239{
240 struct device *dev;
241
242 dev = bus_find_device(&wmi_bus_type, NULL, &notify_id, wmidev_match_notify_id);
243 if (!dev)
244 return ERR_PTR(-ENODEV);
245
246 return to_wmi_device(dev);
247}
248
7444f834
AW
249static void wmi_device_put(struct wmi_device *wdev)
250{
251 put_device(&wdev->dev);
252}
253
bff431e4
CC
254/*
255 * Exported WMI functions
256 */
44b6b766 257
2a2b13ae
AW
258/**
259 * wmi_instance_count - Get number of WMI object instances
260 * @guid_string: 36 char string of the form fa50ff2b-f2e8-45de-83fa-65417f2f49ba
261 *
262 * Get the number of WMI object instances.
263 *
264 * Returns: Number of WMI object instances or negative error code.
265 */
266int wmi_instance_count(const char *guid_string)
267{
7444f834
AW
268 struct wmi_device *wdev;
269 int ret;
2a2b13ae 270
7444f834
AW
271 wdev = wmi_find_device_by_guid(guid_string);
272 if (IS_ERR(wdev))
273 return PTR_ERR(wdev);
2a2b13ae 274
7444f834
AW
275 ret = wmidev_instance_count(wdev);
276 wmi_device_put(wdev);
2a2b13ae 277
7444f834 278 return ret;
2a2b13ae
AW
279}
280EXPORT_SYMBOL_GPL(wmi_instance_count);
281
282/**
283 * wmidev_instance_count - Get number of WMI object instances
284 * @wdev: A wmi bus device from a driver
285 *
286 * Get the number of WMI object instances.
287 *
288 * Returns: Number of WMI object instances.
289 */
290u8 wmidev_instance_count(struct wmi_device *wdev)
291{
292 struct wmi_block *wblock = container_of(wdev, struct wmi_block, dev);
293
294 return wblock->gblock.instance_count;
295}
296EXPORT_SYMBOL_GPL(wmidev_instance_count);
297
bff431e4 298/**
d54bd4bc 299 * wmi_evaluate_method - Evaluate a WMI method (deprecated)
bff431e4
CC
300 * @guid_string: 36 char string of the form fa50ff2b-f2e8-45de-83fa-65417f2f49ba
301 * @instance: Instance index
302 * @method_id: Method ID to call
5b559e8a 303 * @in: Mandatory buffer containing input for the method call
5a707af1 304 * @out: Empty buffer to return the method results
bff431e4 305 *
b4cc9795
AW
306 * Call an ACPI-WMI method, the caller must free @out.
307 *
308 * Return: acpi_status signaling success or error.
bff431e4 309 */
bba08f35
BP
310acpi_status wmi_evaluate_method(const char *guid_string, u8 instance, u32 method_id,
311 const struct acpi_buffer *in, struct acpi_buffer *out)
722c856d 312{
7444f834 313 struct wmi_device *wdev;
b0179b80
BP
314 acpi_status status;
315
7444f834
AW
316 wdev = wmi_find_device_by_guid(guid_string);
317 if (IS_ERR(wdev))
318 return AE_ERROR;
319
320 status = wmidev_evaluate_method(wdev, instance, method_id, in, out);
722c856d 321
7444f834
AW
322 wmi_device_put(wdev);
323
324 return status;
722c856d
ML
325}
326EXPORT_SYMBOL_GPL(wmi_evaluate_method);
327
328/**
329 * wmidev_evaluate_method - Evaluate a WMI method
330 * @wdev: A wmi bus device from a driver
331 * @instance: Instance index
332 * @method_id: Method ID to call
5b559e8a 333 * @in: Mandatory buffer containing input for the method call
5a707af1 334 * @out: Empty buffer to return the method results
722c856d 335 *
b4cc9795
AW
336 * Call an ACPI-WMI method, the caller must free @out.
337 *
338 * Return: acpi_status signaling success or error.
722c856d 339 */
bba08f35
BP
340acpi_status wmidev_evaluate_method(struct wmi_device *wdev, u8 instance, u32 method_id,
341 const struct acpi_buffer *in, struct acpi_buffer *out)
bff431e4 342{
43aacf83
BP
343 struct guid_block *block;
344 struct wmi_block *wblock;
bff431e4 345 acpi_handle handle;
bff431e4
CC
346 struct acpi_object_list input;
347 union acpi_object params[3];
57f2ce89 348 char method[WMI_ACPI_METHOD_NAME_SIZE];
bff431e4 349
722c856d 350 wblock = container_of(wdev, struct wmi_block, dev);
bff431e4 351 block = &wblock->gblock;
b0e86302 352 handle = wblock->acpi_device->handle;
bff431e4 353
5b559e8a
AW
354 if (!in)
355 return AE_BAD_DATA;
356
e6bafba5 357 if (!(block->flags & ACPI_WMI_METHOD))
bff431e4
CC
358 return AE_BAD_DATA;
359
6afa1e2a 360 if (block->instance_count <= instance)
bff431e4
CC
361 return AE_BAD_PARAMETER;
362
5b559e8a 363 input.count = 3;
bff431e4 364 input.pointer = params;
5b559e8a 365
bff431e4
CC
366 params[0].type = ACPI_TYPE_INTEGER;
367 params[0].integer.value = instance;
368 params[1].type = ACPI_TYPE_INTEGER;
369 params[1].integer.value = method_id;
5b559e8a
AW
370 params[2].type = get_param_acpi_type(wblock);
371 params[2].buffer.length = in->length;
372 params[2].buffer.pointer = in->pointer;
bff431e4 373
57f2ce89 374 get_acpi_method_name(wblock, 'M', method);
bff431e4 375
21397cac 376 return acpi_evaluate_object(handle, method, &input, out);
bff431e4 377}
722c856d 378EXPORT_SYMBOL_GPL(wmidev_evaluate_method);
bff431e4 379
56a37025
AL
380static acpi_status __query_block(struct wmi_block *wblock, u8 instance,
381 struct acpi_buffer *out)
bff431e4 382{
43aacf83 383 struct guid_block *block;
54f14c27 384 acpi_handle handle;
bff431e4 385 acpi_status status, wc_status = AE_ERROR;
8122ab66
ZR
386 struct acpi_object_list input;
387 union acpi_object wq_params[1];
57f2ce89
BP
388 char wc_method[WMI_ACPI_METHOD_NAME_SIZE];
389 char method[WMI_ACPI_METHOD_NAME_SIZE];
bff431e4 390
56a37025 391 if (!out)
bff431e4
CC
392 return AE_BAD_PARAMETER;
393
bff431e4 394 block = &wblock->gblock;
b0e86302 395 handle = wblock->acpi_device->handle;
bff431e4 396
6afa1e2a 397 if (block->instance_count <= instance)
bff431e4
CC
398 return AE_BAD_PARAMETER;
399
400 /* Check GUID is a data block */
401 if (block->flags & (ACPI_WMI_EVENT | ACPI_WMI_METHOD))
08237974 402 return AE_ERROR;
bff431e4
CC
403
404 input.count = 1;
405 input.pointer = wq_params;
406 wq_params[0].type = ACPI_TYPE_INTEGER;
407 wq_params[0].integer.value = instance;
408
a90b38c5 409 if (instance == 0 && test_bit(WMI_READ_TAKES_NO_ARGS, &wblock->flags))
d4fc91ad
AL
410 input.count = 0;
411
bff431e4
CC
412 /*
413 * If ACPI_WMI_EXPENSIVE, call the relevant WCxx method first to
414 * enable collection.
415 */
416 if (block->flags & ACPI_WMI_EXPENSIVE) {
57f2ce89 417 get_acpi_method_name(wblock, 'C', wc_method);
bff431e4
CC
418
419 /*
420 * Some GUIDs break the specification by declaring themselves
421 * expensive, but have no corresponding WCxx method. So we
422 * should not fail if this happens.
423 */
bad9da86 424 wc_status = acpi_execute_simple_method(handle, wc_method, 1);
bff431e4
CC
425 }
426
57f2ce89 427 get_acpi_method_name(wblock, 'Q', method);
dab36ad8 428 status = acpi_evaluate_object(handle, method, &input, out);
bff431e4
CC
429
430 /*
431 * If ACPI_WMI_EXPENSIVE, call the relevant WCxx method, even if
432 * the WQxx method failed - we should disable collection anyway.
433 */
a527f2d7 434 if ((block->flags & ACPI_WMI_EXPENSIVE) && ACPI_SUCCESS(wc_status)) {
1975718c
BP
435 /*
436 * Ignore whether this WCxx call succeeds or not since
437 * the previously executed WQxx method call might have
438 * succeeded, and returning the failing status code
439 * of this call would throw away the result of the WQxx
440 * call, potentially leaking memory.
441 */
442 acpi_execute_simple_method(handle, wc_method, 0);
bff431e4
CC
443 }
444
445 return status;
446}
56a37025
AL
447
448/**
449 * wmi_query_block - Return contents of a WMI block (deprecated)
450 * @guid_string: 36 char string of the form fa50ff2b-f2e8-45de-83fa-65417f2f49ba
451 * @instance: Instance index
5a707af1 452 * @out: Empty buffer to return the contents of the data block to
56a37025 453 *
b4cc9795
AW
454 * Query a ACPI-WMI block, the caller must free @out.
455 *
456 * Return: ACPI object containing the content of the WMI block.
56a37025
AL
457 */
458acpi_status wmi_query_block(const char *guid_string, u8 instance,
459 struct acpi_buffer *out)
460{
461 struct wmi_block *wblock;
7444f834 462 struct wmi_device *wdev;
b0179b80 463 acpi_status status;
56a37025 464
7444f834
AW
465 wdev = wmi_find_device_by_guid(guid_string);
466 if (IS_ERR(wdev))
467 return AE_ERROR;
468
469 wblock = container_of(wdev, struct wmi_block, dev);
470 status = __query_block(wblock, instance, out);
471
472 wmi_device_put(wdev);
56a37025 473
7444f834 474 return status;
56a37025 475}
bff431e4
CC
476EXPORT_SYMBOL_GPL(wmi_query_block);
477
b4cc9795
AW
478/**
479 * wmidev_block_query - Return contents of a WMI block
480 * @wdev: A wmi bus device from a driver
481 * @instance: Instance index
482 *
483 * Query an ACPI-WMI block, the caller must free the result.
484 *
485 * Return: ACPI object containing the content of the WMI block.
486 */
56a37025
AL
487union acpi_object *wmidev_block_query(struct wmi_device *wdev, u8 instance)
488{
489 struct acpi_buffer out = { ACPI_ALLOCATE_BUFFER, NULL };
490 struct wmi_block *wblock = container_of(wdev, struct wmi_block, dev);
491
492 if (ACPI_FAILURE(__query_block(wblock, instance, &out)))
493 return NULL;
494
c06a2fde 495 return out.pointer;
56a37025
AL
496}
497EXPORT_SYMBOL_GPL(wmidev_block_query);
498
bff431e4 499/**
d54bd4bc 500 * wmi_set_block - Write to a WMI block (deprecated)
bff431e4
CC
501 * @guid_string: 36 char string of the form fa50ff2b-f2e8-45de-83fa-65417f2f49ba
502 * @instance: Instance index
5a707af1 503 * @in: Buffer containing new values for the data block
bff431e4 504 *
b4cc9795
AW
505 * Write the contents of the input buffer to an ACPI-WMI data block.
506 *
507 * Return: acpi_status signaling success or error.
bff431e4 508 */
f25d3464 509acpi_status wmi_set_block(const char *guid_string, u8 instance, const struct acpi_buffer *in)
bff431e4 510{
7444f834 511 struct wmi_device *wdev;
b0179b80 512 acpi_status status;
bff431e4 513
7444f834
AW
514 wdev = wmi_find_device_by_guid(guid_string);
515 if (IS_ERR(wdev))
516 return AE_ERROR;
bff431e4 517
f25d3464
AW
518 status = wmidev_block_set(wdev, instance, in);
519 wmi_device_put(wdev);
bff431e4 520
f25d3464
AW
521 return status;
522}
523EXPORT_SYMBOL_GPL(wmi_set_block);
7444f834 524
f25d3464
AW
525/**
526 * wmidev_block_set - Write to a WMI block
527 * @wdev: A wmi bus device from a driver
528 * @instance: Instance index
529 * @in: Buffer containing new values for the data block
530 *
531 * Write contents of the input buffer to an ACPI-WMI data block.
532 *
533 * Return: acpi_status signaling success or error.
534 */
535acpi_status wmidev_block_set(struct wmi_device *wdev, u8 instance, const struct acpi_buffer *in)
536{
537 struct wmi_block *wblock = container_of(wdev, struct wmi_block, dev);
538 acpi_handle handle = wblock->acpi_device->handle;
539 struct guid_block *block = &wblock->gblock;
540 char method[WMI_ACPI_METHOD_NAME_SIZE];
541 struct acpi_object_list input;
542 union acpi_object params[2];
bff431e4 543
f25d3464
AW
544 if (!in)
545 return AE_BAD_DATA;
7444f834 546
f25d3464
AW
547 if (block->instance_count <= instance)
548 return AE_BAD_PARAMETER;
549
550 /* Check GUID is a data block */
551 if (block->flags & (ACPI_WMI_EVENT | ACPI_WMI_METHOD))
552 return AE_ERROR;
bff431e4
CC
553
554 input.count = 2;
555 input.pointer = params;
556 params[0].type = ACPI_TYPE_INTEGER;
557 params[0].integer.value = instance;
51142a08 558 params[1].type = get_param_acpi_type(wblock);
bff431e4
CC
559 params[1].buffer.length = in->length;
560 params[1].buffer.pointer = in->pointer;
561
57f2ce89 562 get_acpi_method_name(wblock, 'S', method);
bff431e4 563
f25d3464 564 return acpi_evaluate_object(handle, method, &input, NULL);
bff431e4 565}
f25d3464 566EXPORT_SYMBOL_GPL(wmidev_block_set);
bff431e4
CC
567
568/**
d54bd4bc 569 * wmi_install_notify_handler - Register handler for WMI events (deprecated)
5a707af1 570 * @guid: 36 char string of the form fa50ff2b-f2e8-45de-83fa-65417f2f49ba
bff431e4
CC
571 * @handler: Function to handle notifications
572 * @data: Data to be returned to handler when event is fired
573 *
574 * Register a handler for events sent to the ACPI-WMI mapper device.
b4cc9795
AW
575 *
576 * Return: acpi_status signaling success or error.
bff431e4
CC
577 */
578acpi_status wmi_install_notify_handler(const char *guid,
bba08f35
BP
579 wmi_notify_handler handler,
580 void *data)
bff431e4 581{
3ea7f59a
AW
582 struct wmi_block *wblock;
583 struct wmi_device *wdev;
584 acpi_status status;
bff431e4 585
3ea7f59a
AW
586 wdev = wmi_find_device_by_guid(guid);
587 if (IS_ERR(wdev))
588 return AE_ERROR;
bff431e4 589
3ea7f59a 590 wblock = container_of(wdev, struct wmi_block, dev);
58f6425e 591
29e473f4 592 down_write(&wblock->notify_lock);
3ea7f59a
AW
593 if (wblock->handler) {
594 status = AE_ALREADY_ACQUIRED;
595 } else {
596 wblock->handler = handler;
597 wblock->handler_data = data;
bff431e4 598
3ea7f59a
AW
599 if (ACPI_FAILURE(wmi_method_enable(wblock, true)))
600 dev_warn(&wblock->dev.dev, "Failed to enable device\n");
bff431e4 601
3ea7f59a 602 status = AE_OK;
58f6425e 603 }
29e473f4 604 up_write(&wblock->notify_lock);
a66bfa7a 605
3ea7f59a 606 wmi_device_put(wdev);
a66bfa7a
MG
607
608 return status;
bff431e4
CC
609}
610EXPORT_SYMBOL_GPL(wmi_install_notify_handler);
611
612/**
d54bd4bc 613 * wmi_remove_notify_handler - Unregister handler for WMI events (deprecated)
5a707af1 614 * @guid: 36 char string of the form fa50ff2b-f2e8-45de-83fa-65417f2f49ba
bff431e4
CC
615 *
616 * Unregister handler for events sent to the ACPI-WMI mapper device.
b4cc9795
AW
617 *
618 * Return: acpi_status signaling success or error.
bff431e4
CC
619 */
620acpi_status wmi_remove_notify_handler(const char *guid)
621{
3ea7f59a
AW
622 struct wmi_block *wblock;
623 struct wmi_device *wdev;
624 acpi_status status;
bff431e4 625
3ea7f59a
AW
626 wdev = wmi_find_device_by_guid(guid);
627 if (IS_ERR(wdev))
628 return AE_ERROR;
bff431e4 629
3ea7f59a 630 wblock = container_of(wdev, struct wmi_block, dev);
bff431e4 631
29e473f4 632 down_write(&wblock->notify_lock);
3ea7f59a
AW
633 if (!wblock->handler) {
634 status = AE_NULL_ENTRY;
635 } else {
636 if (ACPI_FAILURE(wmi_method_enable(wblock, false)))
637 dev_warn(&wblock->dev.dev, "Failed to disable device\n");
58f6425e 638
3ea7f59a
AW
639 wblock->handler = NULL;
640 wblock->handler_data = NULL;
58f6425e 641
3ea7f59a 642 status = AE_OK;
fc3155b2 643 }
29e473f4 644 up_write(&wblock->notify_lock);
58f6425e 645
3ea7f59a 646 wmi_device_put(wdev);
58f6425e 647
a66bfa7a 648 return status;
bff431e4
CC
649}
650EXPORT_SYMBOL_GPL(wmi_remove_notify_handler);
651
652/**
d54bd4bc 653 * wmi_get_event_data - Get WMI data associated with an event (deprecated)
bff431e4 654 *
3e9b988e 655 * @event: Event to find
b4cc9795
AW
656 * @out: Buffer to hold event data
657 *
658 * Get extra data associated with an WMI event, the caller needs to free @out.
bff431e4 659 *
b4cc9795 660 * Return: acpi_status signaling success or error.
bff431e4
CC
661 */
662acpi_status wmi_get_event_data(u32 event, struct acpi_buffer *out)
663{
bff431e4 664 struct wmi_block *wblock;
3ea7f59a
AW
665 struct wmi_device *wdev;
666 acpi_status status;
bff431e4 667
3ea7f59a
AW
668 wdev = wmi_find_event_by_notify_id(event);
669 if (IS_ERR(wdev))
670 return AE_NOT_FOUND;
bff431e4 671
3ea7f59a
AW
672 wblock = container_of(wdev, struct wmi_block, dev);
673 status = get_event_data(wblock, out);
bff431e4 674
3ea7f59a
AW
675 wmi_device_put(wdev);
676
677 return status;
bff431e4
CC
678}
679EXPORT_SYMBOL_GPL(wmi_get_event_data);
680
681/**
682 * wmi_has_guid - Check if a GUID is available
683 * @guid_string: 36 char string of the form fa50ff2b-f2e8-45de-83fa-65417f2f49ba
684 *
b4cc9795
AW
685 * Check if a given GUID is defined by _WDG.
686 *
687 * Return: True if GUID is available, false otherwise.
bff431e4
CC
688 */
689bool wmi_has_guid(const char *guid_string)
690{
7444f834
AW
691 struct wmi_device *wdev;
692
693 wdev = wmi_find_device_by_guid(guid_string);
694 if (IS_ERR(wdev))
695 return false;
696
697 wmi_device_put(wdev);
698
699 return true;
bff431e4
CC
700}
701EXPORT_SYMBOL_GPL(wmi_has_guid);
702
e7488e58 703/**
d54bd4bc 704 * wmi_get_acpi_device_uid() - Get _UID name of ACPI device that defines GUID (deprecated)
e7488e58
YP
705 * @guid_string: 36 char string of the form fa50ff2b-f2e8-45de-83fa-65417f2f49ba
706 *
707 * Find the _UID of ACPI device associated with this WMI GUID.
708 *
b4cc9795 709 * Return: The ACPI _UID field value or NULL if the WMI GUID was not found.
e7488e58
YP
710 */
711char *wmi_get_acpi_device_uid(const char *guid_string)
712{
7444f834
AW
713 struct wmi_block *wblock;
714 struct wmi_device *wdev;
715 char *uid;
e7488e58 716
7444f834
AW
717 wdev = wmi_find_device_by_guid(guid_string);
718 if (IS_ERR(wdev))
e7488e58
YP
719 return NULL;
720
7444f834
AW
721 wblock = container_of(wdev, struct wmi_block, dev);
722 uid = acpi_device_uid(wblock->acpi_device);
723
724 wmi_device_put(wdev);
725
726 return uid;
e7488e58
YP
727}
728EXPORT_SYMBOL_GPL(wmi_get_acpi_device_uid);
729
e7b2e334
BP
730static inline struct wmi_driver *drv_to_wdrv(struct device_driver *drv)
731{
732 return container_of(drv, struct wmi_driver, driver);
733}
734
1caab3c1
MG
735/*
736 * sysfs interface
737 */
614ef432 738static ssize_t modalias_show(struct device *dev, struct device_attribute *attr,
1caab3c1
MG
739 char *buf)
740{
844af950 741 struct wmi_block *wblock = dev_to_wblock(dev);
1caab3c1 742
6133913a 743 return sysfs_emit(buf, "wmi:%pUL\n", &wblock->gblock.guid);
1caab3c1 744}
e80b89a5 745static DEVICE_ATTR_RO(modalias);
614ef432 746
844af950
AL
747static ssize_t guid_show(struct device *dev, struct device_attribute *attr,
748 char *buf)
749{
750 struct wmi_block *wblock = dev_to_wblock(dev);
751
6133913a 752 return sysfs_emit(buf, "%pUL\n", &wblock->gblock.guid);
844af950
AL
753}
754static DEVICE_ATTR_RO(guid);
755
d79b1074
AL
756static ssize_t instance_count_show(struct device *dev,
757 struct device_attribute *attr, char *buf)
758{
759 struct wmi_block *wblock = dev_to_wblock(dev);
760
6133913a 761 return sysfs_emit(buf, "%d\n", (int)wblock->gblock.instance_count);
d79b1074
AL
762}
763static DEVICE_ATTR_RO(instance_count);
764
765static ssize_t expensive_show(struct device *dev,
766 struct device_attribute *attr, char *buf)
767{
768 struct wmi_block *wblock = dev_to_wblock(dev);
769
6133913a
BP
770 return sysfs_emit(buf, "%d\n",
771 (wblock->gblock.flags & ACPI_WMI_EXPENSIVE) != 0);
d79b1074
AL
772}
773static DEVICE_ATTR_RO(expensive);
774
e80b89a5
GKH
775static struct attribute *wmi_attrs[] = {
776 &dev_attr_modalias.attr,
844af950 777 &dev_attr_guid.attr,
d79b1074
AL
778 &dev_attr_instance_count.attr,
779 &dev_attr_expensive.attr,
cd3e3d29 780 NULL
614ef432 781};
e80b89a5 782ATTRIBUTE_GROUPS(wmi);
1caab3c1 783
d79b1074
AL
784static ssize_t notify_id_show(struct device *dev, struct device_attribute *attr,
785 char *buf)
786{
787 struct wmi_block *wblock = dev_to_wblock(dev);
788
6133913a 789 return sysfs_emit(buf, "%02X\n", (unsigned int)wblock->gblock.notify_id);
d79b1074
AL
790}
791static DEVICE_ATTR_RO(notify_id);
792
793static struct attribute *wmi_event_attrs[] = {
794 &dev_attr_notify_id.attr,
cd3e3d29 795 NULL
d79b1074
AL
796};
797ATTRIBUTE_GROUPS(wmi_event);
798
799static ssize_t object_id_show(struct device *dev, struct device_attribute *attr,
800 char *buf)
801{
802 struct wmi_block *wblock = dev_to_wblock(dev);
803
6133913a
BP
804 return sysfs_emit(buf, "%c%c\n", wblock->gblock.object_id[0],
805 wblock->gblock.object_id[1]);
d79b1074
AL
806}
807static DEVICE_ATTR_RO(object_id);
808
fd70da6a
DHV
809static ssize_t setable_show(struct device *dev, struct device_attribute *attr,
810 char *buf)
d4fc91ad
AL
811{
812 struct wmi_device *wdev = dev_to_wdev(dev);
813
6133913a 814 return sysfs_emit(buf, "%d\n", (int)wdev->setable);
d4fc91ad 815}
fd70da6a 816static DEVICE_ATTR_RO(setable);
d4fc91ad
AL
817
818static struct attribute *wmi_data_attrs[] = {
819 &dev_attr_object_id.attr,
fd70da6a 820 &dev_attr_setable.attr,
cd3e3d29 821 NULL
d4fc91ad
AL
822};
823ATTRIBUTE_GROUPS(wmi_data);
824
825static struct attribute *wmi_method_attrs[] = {
d79b1074 826 &dev_attr_object_id.attr,
cd3e3d29 827 NULL
d79b1074 828};
d4fc91ad 829ATTRIBUTE_GROUPS(wmi_method);
d79b1074 830
2a81ada3 831static int wmi_dev_uevent(const struct device *dev, struct kobj_uevent_env *env)
1caab3c1 832{
2a81ada3 833 const struct wmi_block *wblock = dev_to_wblock(dev);
1caab3c1 834
67f472fd 835 if (add_uevent_var(env, "MODALIAS=wmi:%pUL", &wblock->gblock.guid))
1caab3c1
MG
836 return -ENOMEM;
837
67f472fd 838 if (add_uevent_var(env, "WMI_GUID=%pUL", &wblock->gblock.guid))
1caab3c1
MG
839 return -ENOMEM;
840
844af950
AL
841 return 0;
842}
843
844static void wmi_dev_release(struct device *dev)
845{
846 struct wmi_block *wblock = dev_to_wblock(dev);
847
848 kfree(wblock);
849}
850
851static int wmi_dev_match(struct device *dev, struct device_driver *driver)
852{
e7b2e334 853 struct wmi_driver *wmi_driver = drv_to_wdrv(driver);
844af950
AL
854 struct wmi_block *wblock = dev_to_wblock(dev);
855 const struct wmi_device_id *id = wmi_driver->id_table;
1caab3c1 856
c355ec65
MJ
857 if (id == NULL)
858 return 0;
859
eacc95ea 860 while (*id->guid_string) {
028e6e20 861 if (guid_parse_and_compare(id->guid_string, &wblock->gblock.guid))
844af950
AL
862 return 1;
863
864 id++;
865 }
1caab3c1
MG
866
867 return 0;
868}
869
844af950 870static int wmi_dev_probe(struct device *dev)
1caab3c1 871{
844af950 872 struct wmi_block *wblock = dev_to_wblock(dev);
e7b2e334 873 struct wmi_driver *wdriver = drv_to_wdrv(dev->driver);
844af950
AL
874 int ret = 0;
875
a66ccfc2
AW
876 /* Some older WMI drivers will break if instantiated multiple times,
877 * so they are blocked from probing WMI devices with a duplicated GUID.
878 *
879 * New WMI drivers should support being instantiated multiple times.
880 */
881 if (test_bit(WMI_GUID_DUPLICATED, &wblock->flags) && !wdriver->no_singleton) {
882 dev_warn(dev, "Legacy driver %s cannot be instantiated multiple times\n",
883 dev->driver->name);
884
885 return -ENODEV;
886 }
887
4f299135
AW
888 if (wdriver->notify) {
889 if (test_bit(WMI_NO_EVENT_DATA, &wblock->flags) && !wdriver->no_notify_data)
890 return -ENODEV;
891 }
892
285dd01a 893 if (ACPI_FAILURE(wmi_method_enable(wblock, true)))
844af950
AL
894 dev_warn(dev, "failed to enable device -- probing anyway\n");
895
896 if (wdriver->probe) {
440c4983
MJ
897 ret = wdriver->probe(dev_to_wdev(dev),
898 find_guid_context(wblock, wdriver));
8446f9d1 899 if (ret) {
704af3a4
AW
900 if (ACPI_FAILURE(wmi_method_enable(wblock, false)))
901 dev_warn(dev, "Failed to disable device\n");
44b6b766 902
704af3a4 903 return ret;
44b6b766 904 }
844af950
AL
905 }
906
29e473f4
AW
907 down_write(&wblock->notify_lock);
908 wblock->driver_ready = true;
909 up_write(&wblock->notify_lock);
44b6b766 910
704af3a4 911 return 0;
844af950
AL
912}
913
fc7a6209 914static void wmi_dev_remove(struct device *dev)
844af950
AL
915{
916 struct wmi_block *wblock = dev_to_wblock(dev);
e7b2e334 917 struct wmi_driver *wdriver = drv_to_wdrv(dev->driver);
844af950 918
29e473f4
AW
919 down_write(&wblock->notify_lock);
920 wblock->driver_ready = false;
921 up_write(&wblock->notify_lock);
99188786 922
844af950 923 if (wdriver->remove)
2b329f56 924 wdriver->remove(dev_to_wdev(dev));
844af950 925
285dd01a 926 if (ACPI_FAILURE(wmi_method_enable(wblock, false)))
844af950 927 dev_warn(dev, "failed to disable device\n");
1caab3c1
MG
928}
929
844af950
AL
930static struct class wmi_bus_class = {
931 .name = "wmi_bus",
932};
933
10fdfd13 934static const struct bus_type wmi_bus_type = {
1caab3c1 935 .name = "wmi",
e80b89a5 936 .dev_groups = wmi_groups,
844af950
AL
937 .match = wmi_dev_match,
938 .uevent = wmi_dev_uevent,
939 .probe = wmi_dev_probe,
940 .remove = wmi_dev_remove,
1caab3c1
MG
941};
942
69372c1d 943static const struct device_type wmi_type_event = {
d79b1074
AL
944 .name = "event",
945 .groups = wmi_event_groups,
946 .release = wmi_dev_release,
947};
948
69372c1d 949static const struct device_type wmi_type_method = {
d79b1074 950 .name = "method",
d4fc91ad 951 .groups = wmi_method_groups,
d79b1074
AL
952 .release = wmi_dev_release,
953};
954
69372c1d 955static const struct device_type wmi_type_data = {
d79b1074 956 .name = "data",
d4fc91ad 957 .groups = wmi_data_groups,
d79b1074
AL
958 .release = wmi_dev_release,
959};
960
134038b0
ML
961/*
962 * _WDG is a static list that is only parsed at startup,
963 * so it's safe to count entries without extra protection.
964 */
965static int guid_count(const guid_t *guid)
966{
967 struct wmi_block *wblock;
968 int count = 0;
969
970 list_for_each_entry(wblock, &wmi_block_list, list) {
971 if (guid_equal(&wblock->gblock.guid, guid))
972 count++;
973 }
974
975 return count;
976}
977
fd70da6a 978static int wmi_create_device(struct device *wmi_bus_dev,
7f5809bf
AL
979 struct wmi_block *wblock,
980 struct acpi_device *device)
1caab3c1 981{
57f2ce89 982 char method[WMI_ACPI_METHOD_NAME_SIZE];
d0c595a1
AW
983 struct acpi_device_info *info;
984 acpi_handle method_handle;
985 acpi_status status;
134038b0 986 uint count;
1caab3c1 987
84eacf7e 988 if (wblock->gblock.flags & ACPI_WMI_EVENT) {
d79b1074 989 wblock->dev.dev.type = &wmi_type_event;
fd70da6a
DHV
990 goto out_init;
991 }
992
84eacf7e 993 if (wblock->gblock.flags & ACPI_WMI_METHOD) {
7f1b998a
AW
994 get_acpi_method_name(wblock, 'M', method);
995 if (!acpi_has_method(device->handle, method)) {
996 dev_warn(wmi_bus_dev,
997 FW_BUG "%s method block execution control method not found\n",
998 method);
999
1000 return -ENXIO;
1001 }
1002
d79b1074 1003 wblock->dev.dev.type = &wmi_type_method;
fd70da6a
DHV
1004 goto out_init;
1005 }
d4fc91ad 1006
fd70da6a
DHV
1007 /*
1008 * Data Block Query Control Method (WQxx by convention) is
1009 * required per the WMI documentation. If it is not present,
1010 * we ignore this data block.
1011 */
57f2ce89 1012 get_acpi_method_name(wblock, 'Q', method);
d0c595a1
AW
1013 status = acpi_get_handle(device->handle, method, &method_handle);
1014 if (ACPI_FAILURE(status)) {
fd70da6a 1015 dev_warn(wmi_bus_dev,
d0c595a1 1016 FW_BUG "%s data block query control method not found\n",
fd70da6a 1017 method);
d0c595a1
AW
1018
1019 return -ENXIO;
fd70da6a 1020 }
d4fc91ad 1021
d0c595a1
AW
1022 status = acpi_get_object_info(method_handle, &info);
1023 if (ACPI_FAILURE(status))
1024 return -EIO;
1025
fd70da6a 1026 wblock->dev.dev.type = &wmi_type_data;
d4fc91ad 1027
fd70da6a
DHV
1028 /*
1029 * The Microsoft documentation specifically states:
1030 *
1031 * Data blocks registered with only a single instance
1032 * can ignore the parameter.
1033 *
1034 * ACPICA will get mad at us if we call the method with the wrong number
1035 * of arguments, so check what our method expects. (On some Dell
1036 * laptops, WQxx may not be a method at all.)
1037 */
1038 if (info->type != ACPI_TYPE_METHOD || info->param_count == 0)
a90b38c5 1039 set_bit(WMI_READ_TAKES_NO_ARGS, &wblock->flags);
d4fc91ad 1040
fd70da6a 1041 kfree(info);
d4fc91ad 1042
57f2ce89 1043 get_acpi_method_name(wblock, 'S', method);
bd142914 1044 if (acpi_has_method(device->handle, method))
fd70da6a 1045 wblock->dev.setable = true;
d4fc91ad 1046
fd70da6a 1047 out_init:
29e473f4
AW
1048 init_rwsem(&wblock->notify_lock);
1049 wblock->driver_ready = false;
fd70da6a
DHV
1050 wblock->dev.dev.bus = &wmi_bus_type;
1051 wblock->dev.dev.parent = wmi_bus_dev;
d4fc91ad 1052
134038b0 1053 count = guid_count(&wblock->gblock.guid);
92843958 1054 if (count) {
134038b0 1055 dev_set_name(&wblock->dev.dev, "%pUL-%d", &wblock->gblock.guid, count);
92843958
AW
1056 set_bit(WMI_GUID_DUPLICATED, &wblock->flags);
1057 } else {
134038b0 1058 dev_set_name(&wblock->dev.dev, "%pUL", &wblock->gblock.guid);
92843958 1059 }
1caab3c1 1060
6ee50aaa 1061 device_initialize(&wblock->dev.dev);
fd70da6a
DHV
1062
1063 return 0;
1caab3c1
MG
1064}
1065
4186a47d
AW
1066static int wmi_add_device(struct platform_device *pdev, struct wmi_device *wdev)
1067{
1068 struct device_link *link;
1069
1070 /*
1071 * Many aggregate WMI drivers do not use -EPROBE_DEFER when they
1072 * are unable to find a WMI device during probe, instead they require
1073 * all WMI devices associated with an platform device to become available
1074 * at once. This device link thus prevents WMI drivers from probing until
1075 * the associated platform device has finished probing (and has registered
1076 * all discovered WMI devices).
1077 */
1078
1079 link = device_link_add(&wdev->dev, &pdev->dev, DL_FLAG_AUTOREMOVE_SUPPLIER);
1080 if (!link)
1081 return -EINVAL;
1082
1083 return device_add(&wdev->dev);
1084}
1085
bff431e4
CC
1086/*
1087 * Parse the _WDG method for the GUID data blocks
1088 */
4186a47d 1089static int parse_wdg(struct device *wmi_bus_dev, struct platform_device *pdev)
bff431e4 1090{
4186a47d 1091 struct acpi_device *device = ACPI_COMPANION(&pdev->dev);
bff431e4 1092 struct acpi_buffer out = {ACPI_ALLOCATE_BUFFER, NULL};
37830662 1093 const struct guid_block *gblock;
4f299135 1094 bool event_data_available;
4186a47d 1095 struct wmi_block *wblock;
6ee50aaa 1096 union acpi_object *obj;
bff431e4
CC
1097 acpi_status status;
1098 u32 i, total;
ed85891a 1099 int retval;
bff431e4 1100
7f5809bf 1101 status = acpi_evaluate_object(device->handle, "_WDG", NULL, &out);
bff431e4 1102 if (ACPI_FAILURE(status))
c64eefd4 1103 return -ENXIO;
bff431e4 1104
c06a2fde 1105 obj = out.pointer;
3d2c63eb 1106 if (!obj)
c64eefd4 1107 return -ENXIO;
bff431e4 1108
64ed0ab8 1109 if (obj->type != ACPI_TYPE_BUFFER) {
ed85891a
AW
1110 kfree(obj);
1111 return -ENXIO;
64ed0ab8 1112 }
bff431e4 1113
4f299135 1114 event_data_available = acpi_has_method(device->handle, "_WED");
37830662 1115 gblock = (const struct guid_block *)obj->buffer.pointer;
bff431e4
CC
1116 total = obj->buffer.length / sizeof(struct guid_block);
1117
bff431e4 1118 for (i = 0; i < total; i++) {
cbf54f37
AW
1119 if (!gblock[i].instance_count) {
1120 dev_info(wmi_bus_dev, FW_INFO "%pUL has zero instances\n", &gblock[i].guid);
1121 continue;
1122 }
1123
7410b8e6 1124 wblock = kzalloc(sizeof(*wblock), GFP_KERNEL);
49c67cd5 1125 if (!wblock)
ed85891a 1126 continue;
58f6425e 1127
b0e86302 1128 wblock->acpi_device = device;
58f6425e 1129 wblock->gblock = gblock[i];
4f299135
AW
1130 if (gblock[i].flags & ACPI_WMI_EVENT && !event_data_available)
1131 set_bit(WMI_NO_EVENT_DATA, &wblock->flags);
58f6425e 1132
84eacf7e 1133 retval = wmi_create_device(wmi_bus_dev, wblock, device);
fd70da6a
DHV
1134 if (retval) {
1135 kfree(wblock);
1136 continue;
1137 }
c64eefd4 1138
58f6425e 1139 list_add_tail(&wblock->list, &wmi_block_list);
bff431e4 1140
4186a47d 1141 retval = wmi_add_device(pdev, &wblock->dev);
6ee50aaa 1142 if (retval) {
501f7e52 1143 dev_err(wmi_bus_dev, "failed to register %pUL\n",
67f472fd 1144 &wblock->gblock.guid);
4186a47d 1145
6ee50aaa
DHV
1146 list_del(&wblock->list);
1147 put_device(&wblock->dev.dev);
1148 }
1149 }
c64eefd4 1150
ed85891a
AW
1151 kfree(obj);
1152
1153 return 0;
bff431e4
CC
1154}
1155
56230bd7 1156static int wmi_get_notify_data(struct wmi_block *wblock, union acpi_object **obj)
29e473f4 1157{
29e473f4
AW
1158 struct acpi_buffer data = { ACPI_ALLOCATE_BUFFER, NULL };
1159 acpi_status status;
1160
56230bd7
AW
1161 if (test_bit(WMI_NO_EVENT_DATA, &wblock->flags)) {
1162 *obj = NULL;
1163 return 0;
1164 }
12561911 1165
56230bd7
AW
1166 status = get_event_data(wblock, &data);
1167 if (ACPI_FAILURE(status)) {
1168 dev_warn(&wblock->dev.dev, "Failed to get event data\n");
1169 return -EIO;
1170 }
1171
1172 *obj = data.pointer;
1173
1174 return 0;
1175}
1176
1177static void wmi_notify_driver(struct wmi_block *wblock, union acpi_object *obj)
1178{
1179 struct wmi_driver *driver = drv_to_wdrv(wblock->dev.dev.driver);
1180
1181 if (!obj && !driver->no_notify_data) {
1182 dev_warn(&wblock->dev.dev, "Event contains no event data\n");
1183 return;
29e473f4
AW
1184 }
1185
1186 if (driver->notify)
12561911 1187 driver->notify(&wblock->dev, obj);
29e473f4
AW
1188}
1189
2c933755 1190static int wmi_notify_device(struct device *dev, void *data)
bff431e4 1191{
2c933755 1192 struct wmi_block *wblock = dev_to_wblock(dev);
56230bd7 1193 union acpi_object *obj;
2c933755 1194 u32 *event = data;
56230bd7 1195 int ret;
1686f544 1196
2c933755
AW
1197 if (!(wblock->gblock.flags & ACPI_WMI_EVENT && wblock->gblock.notify_id == *event))
1198 return 0;
1686f544 1199
29e473f4
AW
1200 down_read(&wblock->notify_lock);
1201 /* The WMI driver notify handler conflicts with the legacy WMI handler.
1202 * Because of this the WMI driver notify handler takes precedence.
1203 */
1204 if (wblock->dev.dev.driver && wblock->driver_ready) {
56230bd7
AW
1205 ret = wmi_get_notify_data(wblock, &obj);
1206 if (ret >= 0) {
1207 wmi_notify_driver(wblock, obj);
1208 kfree(obj);
1209 }
29e473f4 1210 } else {
56230bd7 1211 if (wblock->handler) {
29e473f4 1212 wblock->handler(*event, wblock->handler_data);
56230bd7
AW
1213 } else {
1214 /* The ACPI WMI specification says that _WED should be
1215 * evaluated every time an notification is received, even
1216 * if no consumers are present.
1217 *
1218 * Some firmware implementations actually depend on this
1219 * by using a queue for events which will fill up if the
1220 * WMI driver core stops evaluating _WED due to missing
1221 * WMI event consumers.
1222 *
1223 * Because of this we need this seemingly useless call to
1224 * wmi_get_notify_data() which in turn evaluates _WED.
1225 */
1226 ret = wmi_get_notify_data(wblock, &obj);
1227 if (ret >= 0)
1228 kfree(obj);
1229 }
1230
1686f544 1231 }
29e473f4 1232 up_read(&wblock->notify_lock);
1686f544 1233
6468e64e 1234 acpi_bus_generate_netlink_event("wmi", acpi_dev_name(wblock->acpi_device), *event, 0);
2c933755
AW
1235
1236 return -EBUSY;
1237}
1238
1239static void acpi_wmi_notify_handler(acpi_handle handle, u32 event, void *context)
1240{
1241 struct device *wmi_bus_dev = context;
1242
1243 device_for_each_child(wmi_bus_dev, &event, wmi_notify_device);
bff431e4
CC
1244}
1245
ac9bc85c
AW
1246static int wmi_remove_device(struct device *dev, void *data)
1247{
1248 struct wmi_block *wblock = dev_to_wblock(dev);
1249
1250 list_del(&wblock->list);
1251 device_unregister(dev);
1252
1253 return 0;
1254}
1255
0f16136b 1256static void acpi_wmi_remove(struct platform_device *device)
bff431e4 1257{
ac9bc85c 1258 struct device *wmi_bus_device = dev_get_drvdata(&device->dev);
9599ed91 1259
ac9bc85c 1260 device_for_each_child_reverse(wmi_bus_device, NULL, wmi_remove_device);
08e7f4d6
AW
1261}
1262
1263static void acpi_wmi_remove_notify_handler(void *data)
1264{
1265 struct acpi_device *acpi_device = data;
22574e17
AW
1266
1267 acpi_remove_notify_handler(acpi_device->handle, ACPI_ALL_NOTIFY, acpi_wmi_notify_handler);
08e7f4d6
AW
1268}
1269
08e7f4d6
AW
1270static void acpi_wmi_remove_bus_device(void *data)
1271{
1272 struct device *wmi_bus_dev = data;
1273
1274 device_unregister(wmi_bus_dev);
1275}
1276
9599ed91 1277static int acpi_wmi_probe(struct platform_device *device)
bff431e4 1278{
9599ed91 1279 struct acpi_device *acpi_device;
844af950 1280 struct device *wmi_bus_dev;
bff431e4 1281 acpi_status status;
c64eefd4 1282 int error;
bff431e4 1283
9599ed91
AL
1284 acpi_device = ACPI_COMPANION(&device->dev);
1285 if (!acpi_device) {
1286 dev_err(&device->dev, "ACPI companion is missing\n");
1287 return -ENODEV;
1288 }
1289
095fa72a
AW
1290 wmi_bus_dev = device_create(&wmi_bus_class, &device->dev, MKDEV(0, 0), NULL, "wmi_bus-%s",
1291 dev_name(&device->dev));
1292 if (IS_ERR(wmi_bus_dev))
1293 return PTR_ERR(wmi_bus_dev);
1294
1295 error = devm_add_action_or_reset(&device->dev, acpi_wmi_remove_bus_device, wmi_bus_dev);
1296 if (error < 0)
1297 return error;
1298
1299 dev_set_drvdata(&device->dev, wmi_bus_dev);
1300
2c933755
AW
1301 status = acpi_install_notify_handler(acpi_device->handle, ACPI_ALL_NOTIFY,
1302 acpi_wmi_notify_handler, wmi_bus_dev);
1686f544
AL
1303 if (ACPI_FAILURE(status)) {
1304 dev_err(&device->dev, "Error installing notify handler\n");
08e7f4d6 1305 return -ENODEV;
1686f544 1306 }
08e7f4d6
AW
1307 error = devm_add_action_or_reset(&device->dev, acpi_wmi_remove_notify_handler,
1308 acpi_device);
1309 if (error < 0)
1310 return error;
1686f544 1311
4186a47d 1312 error = parse_wdg(wmi_bus_dev, device);
c64eefd4 1313 if (error) {
fde7da10 1314 dev_err(&device->dev, "Failed to parse _WDG method\n");
08e7f4d6 1315 return error;
bff431e4
CC
1316 }
1317
c64eefd4 1318 return 0;
bff431e4
CC
1319}
1320
844af950
AL
1321int __must_check __wmi_driver_register(struct wmi_driver *driver,
1322 struct module *owner)
1323{
1324 driver->driver.owner = owner;
1325 driver->driver.bus = &wmi_bus_type;
1326
1327 return driver_register(&driver->driver);
1328}
1329EXPORT_SYMBOL(__wmi_driver_register);
1330
b4cc9795
AW
1331/**
1332 * wmi_driver_unregister() - Unregister a WMI driver
1333 * @driver: WMI driver to unregister
1334 *
1335 * Unregisters a WMI driver from the WMI bus.
1336 */
844af950
AL
1337void wmi_driver_unregister(struct wmi_driver *driver)
1338{
1339 driver_unregister(&driver->driver);
1340}
1341EXPORT_SYMBOL(wmi_driver_unregister);
1342
c710765a
UKK
1343static struct platform_driver acpi_wmi_driver = {
1344 .driver = {
1345 .name = "acpi-wmi",
1346 .acpi_match_table = wmi_device_ids,
1347 },
1348 .probe = acpi_wmi_probe,
0f16136b 1349 .remove_new = acpi_wmi_remove,
c710765a
UKK
1350};
1351
bff431e4
CC
1352static int __init acpi_wmi_init(void)
1353{
c64eefd4 1354 int error;
bff431e4
CC
1355
1356 if (acpi_disabled)
1357 return -ENODEV;
1358
844af950 1359 error = class_register(&wmi_bus_class);
c64eefd4
DT
1360 if (error)
1361 return error;
1caab3c1 1362
844af950
AL
1363 error = bus_register(&wmi_bus_type);
1364 if (error)
1365 goto err_unreg_class;
1366
9599ed91 1367 error = platform_driver_register(&acpi_wmi_driver);
c64eefd4
DT
1368 if (error) {
1369 pr_err("Error loading mapper\n");
844af950 1370 goto err_unreg_bus;
bff431e4
CC
1371 }
1372
8e07514d 1373 return 0;
844af950 1374
844af950
AL
1375err_unreg_bus:
1376 bus_unregister(&wmi_bus_type);
1377
97277717
AK
1378err_unreg_class:
1379 class_unregister(&wmi_bus_class);
1380
844af950 1381 return error;
bff431e4
CC
1382}
1383
1384static void __exit acpi_wmi_exit(void)
1385{
9599ed91 1386 platform_driver_unregister(&acpi_wmi_driver);
844af950 1387 bus_unregister(&wmi_bus_type);
303d1fcc 1388 class_unregister(&wmi_bus_class);
bff431e4
CC
1389}
1390
98b8e4e5 1391subsys_initcall_sync(acpi_wmi_init);
bff431e4 1392module_exit(acpi_wmi_exit);