1 // SPDX-License-Identifier: GPL-2.0-or-later 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 * 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. 15 */ 16 17 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt 18 19 #include <linux/acpi.h> 20 #include <linux/bits.h> 21 #include <linux/build_bug.h> 22 #include <linux/device.h> 23 #include <linux/init.h> 24 #include <linux/kernel.h> 25 #include <linux/list.h> 26 #include <linux/miscdevice.h> 27 #include <linux/module.h> 28 #include <linux/platform_device.h> 29 #include <linux/slab.h> 30 #include <linux/sysfs.h> 31 #include <linux/types.h> 32 #include <linux/uaccess.h> 33 #include <linux/uuid.h> 34 #include <linux/wmi.h> 35 #include <linux/fs.h> 36 #include <uapi/linux/wmi.h> 37 38 MODULE_AUTHOR("Carlos Corbacho"); 39 MODULE_DESCRIPTION("ACPI-WMI Mapping Driver"); 40 MODULE_LICENSE("GPL"); 41 42 static LIST_HEAD(wmi_block_list); 43 44 struct guid_block { 45 guid_t guid; 46 union { 47 char object_id[2]; 48 struct { 49 unsigned char notify_id; 50 unsigned char reserved; 51 }; 52 }; 53 u8 instance_count; 54 u8 flags; 55 } __packed; 56 static_assert(sizeof(typeof_member(struct guid_block, guid)) == 16); 57 static_assert(sizeof(struct guid_block) == 20); 58 static_assert(__alignof__(struct guid_block) == 1); 59 60 enum { /* wmi_block flags */ 61 WMI_READ_TAKES_NO_ARGS, 62 WMI_PROBED, 63 }; 64 65 struct wmi_block { 66 struct wmi_device dev; 67 struct list_head list; 68 struct guid_block gblock; 69 struct miscdevice char_dev; 70 struct mutex char_mutex; 71 struct acpi_device *acpi_device; 72 wmi_notify_handler handler; 73 void *handler_data; 74 u64 req_buf_size; 75 unsigned long flags; 76 }; 77 78 79 /* 80 * If the GUID data block is marked as expensive, we must enable and 81 * explicitily disable data collection. 82 */ 83 #define ACPI_WMI_EXPENSIVE BIT(0) 84 #define ACPI_WMI_METHOD BIT(1) /* GUID is a method */ 85 #define ACPI_WMI_STRING BIT(2) /* GUID takes & returns a string */ 86 #define ACPI_WMI_EVENT BIT(3) /* GUID is an event */ 87 88 static bool debug_event; 89 module_param(debug_event, bool, 0444); 90 MODULE_PARM_DESC(debug_event, 91 "Log WMI Events [0/1]"); 92 93 static bool debug_dump_wdg; 94 module_param(debug_dump_wdg, bool, 0444); 95 MODULE_PARM_DESC(debug_dump_wdg, 96 "Dump available WMI interfaces [0/1]"); 97 98 static const struct acpi_device_id wmi_device_ids[] = { 99 {"PNP0C14", 0}, 100 {"pnp0c14", 0}, 101 { } 102 }; 103 MODULE_DEVICE_TABLE(acpi, wmi_device_ids); 104 105 /* allow duplicate GUIDs as these device drivers use struct wmi_driver */ 106 static const char * const allow_duplicates[] = { 107 "05901221-D566-11D1-B2F0-00A0C9062910", /* wmi-bmof */ 108 "8A42EA14-4F2A-FD45-6422-0087F7A7E608", /* dell-wmi-ddv */ 109 NULL 110 }; 111 112 /* 113 * GUID parsing functions 114 */ 115 116 static acpi_status find_guid(const char *guid_string, struct wmi_block **out) 117 { 118 guid_t guid_input; 119 struct wmi_block *wblock; 120 121 if (!guid_string) 122 return AE_BAD_PARAMETER; 123 124 if (guid_parse(guid_string, &guid_input)) 125 return AE_BAD_PARAMETER; 126 127 list_for_each_entry(wblock, &wmi_block_list, list) { 128 if (guid_equal(&wblock->gblock.guid, &guid_input)) { 129 if (out) 130 *out = wblock; 131 132 return AE_OK; 133 } 134 } 135 136 return AE_NOT_FOUND; 137 } 138 139 static const void *find_guid_context(struct wmi_block *wblock, 140 struct wmi_driver *wdriver) 141 { 142 const struct wmi_device_id *id; 143 144 id = wdriver->id_table; 145 if (!id) 146 return NULL; 147 148 while (*id->guid_string) { 149 guid_t guid_input; 150 151 if (guid_parse(id->guid_string, &guid_input)) 152 continue; 153 if (guid_equal(&wblock->gblock.guid, &guid_input)) 154 return id->context; 155 id++; 156 } 157 return NULL; 158 } 159 160 static int get_subobj_info(acpi_handle handle, const char *pathname, 161 struct acpi_device_info **info) 162 { 163 struct acpi_device_info *dummy_info, **info_ptr; 164 acpi_handle subobj_handle; 165 acpi_status status; 166 167 status = acpi_get_handle(handle, (char *)pathname, &subobj_handle); 168 if (status == AE_NOT_FOUND) 169 return -ENOENT; 170 else if (ACPI_FAILURE(status)) 171 return -EIO; 172 173 info_ptr = info ? info : &dummy_info; 174 status = acpi_get_object_info(subobj_handle, info_ptr); 175 if (ACPI_FAILURE(status)) 176 return -EIO; 177 178 if (!info) 179 kfree(dummy_info); 180 181 return 0; 182 } 183 184 static acpi_status wmi_method_enable(struct wmi_block *wblock, bool enable) 185 { 186 struct guid_block *block; 187 char method[5]; 188 acpi_status status; 189 acpi_handle handle; 190 191 block = &wblock->gblock; 192 handle = wblock->acpi_device->handle; 193 194 snprintf(method, 5, "WE%02X", block->notify_id); 195 status = acpi_execute_simple_method(handle, method, enable); 196 if (status == AE_NOT_FOUND) 197 return AE_OK; 198 199 return status; 200 } 201 202 #define WMI_ACPI_METHOD_NAME_SIZE 5 203 204 static inline void get_acpi_method_name(const struct wmi_block *wblock, 205 const char method, 206 char buffer[static WMI_ACPI_METHOD_NAME_SIZE]) 207 { 208 static_assert(ARRAY_SIZE(wblock->gblock.object_id) == 2); 209 static_assert(WMI_ACPI_METHOD_NAME_SIZE >= 5); 210 211 buffer[0] = 'W'; 212 buffer[1] = method; 213 buffer[2] = wblock->gblock.object_id[0]; 214 buffer[3] = wblock->gblock.object_id[1]; 215 buffer[4] = '\0'; 216 } 217 218 static inline acpi_object_type get_param_acpi_type(const struct wmi_block *wblock) 219 { 220 if (wblock->gblock.flags & ACPI_WMI_STRING) 221 return ACPI_TYPE_STRING; 222 else 223 return ACPI_TYPE_BUFFER; 224 } 225 226 static acpi_status get_event_data(const struct wmi_block *wblock, struct acpi_buffer *out) 227 { 228 union acpi_object param = { 229 .integer = { 230 .type = ACPI_TYPE_INTEGER, 231 .value = wblock->gblock.notify_id, 232 } 233 }; 234 struct acpi_object_list input = { 235 .count = 1, 236 .pointer = ¶m, 237 }; 238 239 return acpi_evaluate_object(wblock->acpi_device->handle, "_WED", &input, out); 240 } 241 242 /* 243 * Exported WMI functions 244 */ 245 246 /** 247 * set_required_buffer_size - Sets the buffer size needed for performing IOCTL 248 * @wdev: A wmi bus device from a driver 249 * @length: Required buffer size 250 * 251 * Allocates memory needed for buffer, stores the buffer size in that memory 252 */ 253 int set_required_buffer_size(struct wmi_device *wdev, u64 length) 254 { 255 struct wmi_block *wblock; 256 257 wblock = container_of(wdev, struct wmi_block, dev); 258 wblock->req_buf_size = length; 259 260 return 0; 261 } 262 EXPORT_SYMBOL_GPL(set_required_buffer_size); 263 264 /** 265 * wmi_evaluate_method - Evaluate a WMI method 266 * @guid_string: 36 char string of the form fa50ff2b-f2e8-45de-83fa-65417f2f49ba 267 * @instance: Instance index 268 * @method_id: Method ID to call 269 * @in: Buffer containing input for the method call 270 * @out: Empty buffer to return the method results 271 * 272 * Call an ACPI-WMI method 273 */ 274 acpi_status wmi_evaluate_method(const char *guid_string, u8 instance, u32 method_id, 275 const struct acpi_buffer *in, struct acpi_buffer *out) 276 { 277 struct wmi_block *wblock = NULL; 278 acpi_status status; 279 280 status = find_guid(guid_string, &wblock); 281 if (ACPI_FAILURE(status)) 282 return status; 283 284 return wmidev_evaluate_method(&wblock->dev, instance, method_id, 285 in, out); 286 } 287 EXPORT_SYMBOL_GPL(wmi_evaluate_method); 288 289 /** 290 * wmidev_evaluate_method - Evaluate a WMI method 291 * @wdev: A wmi bus device from a driver 292 * @instance: Instance index 293 * @method_id: Method ID to call 294 * @in: Buffer containing input for the method call 295 * @out: Empty buffer to return the method results 296 * 297 * Call an ACPI-WMI method 298 */ 299 acpi_status wmidev_evaluate_method(struct wmi_device *wdev, u8 instance, u32 method_id, 300 const struct acpi_buffer *in, struct acpi_buffer *out) 301 { 302 struct guid_block *block; 303 struct wmi_block *wblock; 304 acpi_handle handle; 305 struct acpi_object_list input; 306 union acpi_object params[3]; 307 char method[WMI_ACPI_METHOD_NAME_SIZE]; 308 309 wblock = container_of(wdev, struct wmi_block, dev); 310 block = &wblock->gblock; 311 handle = wblock->acpi_device->handle; 312 313 if (!(block->flags & ACPI_WMI_METHOD)) 314 return AE_BAD_DATA; 315 316 if (block->instance_count <= instance) 317 return AE_BAD_PARAMETER; 318 319 input.count = 2; 320 input.pointer = params; 321 params[0].type = ACPI_TYPE_INTEGER; 322 params[0].integer.value = instance; 323 params[1].type = ACPI_TYPE_INTEGER; 324 params[1].integer.value = method_id; 325 326 if (in) { 327 input.count = 3; 328 329 params[2].type = get_param_acpi_type(wblock); 330 params[2].buffer.length = in->length; 331 params[2].buffer.pointer = in->pointer; 332 } 333 334 get_acpi_method_name(wblock, 'M', method); 335 336 return acpi_evaluate_object(handle, method, &input, out); 337 } 338 EXPORT_SYMBOL_GPL(wmidev_evaluate_method); 339 340 static acpi_status __query_block(struct wmi_block *wblock, u8 instance, 341 struct acpi_buffer *out) 342 { 343 struct guid_block *block; 344 acpi_handle handle; 345 acpi_status status, wc_status = AE_ERROR; 346 struct acpi_object_list input; 347 union acpi_object wq_params[1]; 348 char wc_method[WMI_ACPI_METHOD_NAME_SIZE]; 349 char method[WMI_ACPI_METHOD_NAME_SIZE]; 350 351 if (!out) 352 return AE_BAD_PARAMETER; 353 354 block = &wblock->gblock; 355 handle = wblock->acpi_device->handle; 356 357 if (block->instance_count <= instance) 358 return AE_BAD_PARAMETER; 359 360 /* Check GUID is a data block */ 361 if (block->flags & (ACPI_WMI_EVENT | ACPI_WMI_METHOD)) 362 return AE_ERROR; 363 364 input.count = 1; 365 input.pointer = wq_params; 366 wq_params[0].type = ACPI_TYPE_INTEGER; 367 wq_params[0].integer.value = instance; 368 369 if (instance == 0 && test_bit(WMI_READ_TAKES_NO_ARGS, &wblock->flags)) 370 input.count = 0; 371 372 /* 373 * If ACPI_WMI_EXPENSIVE, call the relevant WCxx method first to 374 * enable collection. 375 */ 376 if (block->flags & ACPI_WMI_EXPENSIVE) { 377 get_acpi_method_name(wblock, 'C', wc_method); 378 379 /* 380 * Some GUIDs break the specification by declaring themselves 381 * expensive, but have no corresponding WCxx method. So we 382 * should not fail if this happens. 383 */ 384 wc_status = acpi_execute_simple_method(handle, wc_method, 1); 385 } 386 387 get_acpi_method_name(wblock, 'Q', method); 388 status = acpi_evaluate_object(handle, method, &input, out); 389 390 /* 391 * If ACPI_WMI_EXPENSIVE, call the relevant WCxx method, even if 392 * the WQxx method failed - we should disable collection anyway. 393 */ 394 if ((block->flags & ACPI_WMI_EXPENSIVE) && ACPI_SUCCESS(wc_status)) { 395 /* 396 * Ignore whether this WCxx call succeeds or not since 397 * the previously executed WQxx method call might have 398 * succeeded, and returning the failing status code 399 * of this call would throw away the result of the WQxx 400 * call, potentially leaking memory. 401 */ 402 acpi_execute_simple_method(handle, wc_method, 0); 403 } 404 405 return status; 406 } 407 408 /** 409 * wmi_query_block - Return contents of a WMI block (deprecated) 410 * @guid_string: 36 char string of the form fa50ff2b-f2e8-45de-83fa-65417f2f49ba 411 * @instance: Instance index 412 * @out: Empty buffer to return the contents of the data block to 413 * 414 * Return the contents of an ACPI-WMI data block to a buffer 415 */ 416 acpi_status wmi_query_block(const char *guid_string, u8 instance, 417 struct acpi_buffer *out) 418 { 419 struct wmi_block *wblock; 420 acpi_status status; 421 422 status = find_guid(guid_string, &wblock); 423 if (ACPI_FAILURE(status)) 424 return status; 425 426 return __query_block(wblock, instance, out); 427 } 428 EXPORT_SYMBOL_GPL(wmi_query_block); 429 430 union acpi_object *wmidev_block_query(struct wmi_device *wdev, u8 instance) 431 { 432 struct acpi_buffer out = { ACPI_ALLOCATE_BUFFER, NULL }; 433 struct wmi_block *wblock = container_of(wdev, struct wmi_block, dev); 434 435 if (ACPI_FAILURE(__query_block(wblock, instance, &out))) 436 return NULL; 437 438 return out.pointer; 439 } 440 EXPORT_SYMBOL_GPL(wmidev_block_query); 441 442 /** 443 * wmi_set_block - Write to a WMI block 444 * @guid_string: 36 char string of the form fa50ff2b-f2e8-45de-83fa-65417f2f49ba 445 * @instance: Instance index 446 * @in: Buffer containing new values for the data block 447 * 448 * Write the contents of the input buffer to an ACPI-WMI data block 449 */ 450 acpi_status wmi_set_block(const char *guid_string, u8 instance, 451 const struct acpi_buffer *in) 452 { 453 struct wmi_block *wblock = NULL; 454 struct guid_block *block; 455 acpi_handle handle; 456 struct acpi_object_list input; 457 union acpi_object params[2]; 458 char method[WMI_ACPI_METHOD_NAME_SIZE]; 459 acpi_status status; 460 461 if (!in) 462 return AE_BAD_DATA; 463 464 status = find_guid(guid_string, &wblock); 465 if (ACPI_FAILURE(status)) 466 return status; 467 468 block = &wblock->gblock; 469 handle = wblock->acpi_device->handle; 470 471 if (block->instance_count <= instance) 472 return AE_BAD_PARAMETER; 473 474 /* Check GUID is a data block */ 475 if (block->flags & (ACPI_WMI_EVENT | ACPI_WMI_METHOD)) 476 return AE_ERROR; 477 478 input.count = 2; 479 input.pointer = params; 480 params[0].type = ACPI_TYPE_INTEGER; 481 params[0].integer.value = instance; 482 params[1].type = get_param_acpi_type(wblock); 483 params[1].buffer.length = in->length; 484 params[1].buffer.pointer = in->pointer; 485 486 get_acpi_method_name(wblock, 'S', method); 487 488 return acpi_evaluate_object(handle, method, &input, NULL); 489 } 490 EXPORT_SYMBOL_GPL(wmi_set_block); 491 492 static void wmi_dump_wdg(const struct guid_block *g) 493 { 494 pr_info("%pUL:\n", &g->guid); 495 if (g->flags & ACPI_WMI_EVENT) 496 pr_info("\tnotify_id: 0x%02X\n", g->notify_id); 497 else 498 pr_info("\tobject_id: %2pE\n", g->object_id); 499 pr_info("\tinstance_count: %d\n", g->instance_count); 500 pr_info("\tflags: %#x", g->flags); 501 if (g->flags) { 502 if (g->flags & ACPI_WMI_EXPENSIVE) 503 pr_cont(" ACPI_WMI_EXPENSIVE"); 504 if (g->flags & ACPI_WMI_METHOD) 505 pr_cont(" ACPI_WMI_METHOD"); 506 if (g->flags & ACPI_WMI_STRING) 507 pr_cont(" ACPI_WMI_STRING"); 508 if (g->flags & ACPI_WMI_EVENT) 509 pr_cont(" ACPI_WMI_EVENT"); 510 } 511 pr_cont("\n"); 512 513 } 514 515 static void wmi_notify_debug(u32 value, void *context) 516 { 517 struct acpi_buffer response = { ACPI_ALLOCATE_BUFFER, NULL }; 518 union acpi_object *obj; 519 acpi_status status; 520 521 status = wmi_get_event_data(value, &response); 522 if (status != AE_OK) { 523 pr_info("bad event status 0x%x\n", status); 524 return; 525 } 526 527 obj = response.pointer; 528 if (!obj) 529 return; 530 531 pr_info("DEBUG: event 0x%02X ", value); 532 switch (obj->type) { 533 case ACPI_TYPE_BUFFER: 534 pr_cont("BUFFER_TYPE - length %u\n", obj->buffer.length); 535 break; 536 case ACPI_TYPE_STRING: 537 pr_cont("STRING_TYPE - %s\n", obj->string.pointer); 538 break; 539 case ACPI_TYPE_INTEGER: 540 pr_cont("INTEGER_TYPE - %llu\n", obj->integer.value); 541 break; 542 case ACPI_TYPE_PACKAGE: 543 pr_cont("PACKAGE_TYPE - %u elements\n", obj->package.count); 544 break; 545 default: 546 pr_cont("object type 0x%X\n", obj->type); 547 } 548 kfree(obj); 549 } 550 551 /** 552 * wmi_install_notify_handler - Register handler for WMI events 553 * @guid: 36 char string of the form fa50ff2b-f2e8-45de-83fa-65417f2f49ba 554 * @handler: Function to handle notifications 555 * @data: Data to be returned to handler when event is fired 556 * 557 * Register a handler for events sent to the ACPI-WMI mapper device. 558 */ 559 acpi_status wmi_install_notify_handler(const char *guid, 560 wmi_notify_handler handler, 561 void *data) 562 { 563 struct wmi_block *block; 564 acpi_status status = AE_NOT_EXIST; 565 guid_t guid_input; 566 567 if (!guid || !handler) 568 return AE_BAD_PARAMETER; 569 570 if (guid_parse(guid, &guid_input)) 571 return AE_BAD_PARAMETER; 572 573 list_for_each_entry(block, &wmi_block_list, list) { 574 acpi_status wmi_status; 575 576 if (guid_equal(&block->gblock.guid, &guid_input)) { 577 if (block->handler && 578 block->handler != wmi_notify_debug) 579 return AE_ALREADY_ACQUIRED; 580 581 block->handler = handler; 582 block->handler_data = data; 583 584 wmi_status = wmi_method_enable(block, true); 585 if ((wmi_status != AE_OK) || 586 ((wmi_status == AE_OK) && (status == AE_NOT_EXIST))) 587 status = wmi_status; 588 } 589 } 590 591 return status; 592 } 593 EXPORT_SYMBOL_GPL(wmi_install_notify_handler); 594 595 /** 596 * wmi_remove_notify_handler - Unregister handler for WMI events 597 * @guid: 36 char string of the form fa50ff2b-f2e8-45de-83fa-65417f2f49ba 598 * 599 * Unregister handler for events sent to the ACPI-WMI mapper device. 600 */ 601 acpi_status wmi_remove_notify_handler(const char *guid) 602 { 603 struct wmi_block *block; 604 acpi_status status = AE_NOT_EXIST; 605 guid_t guid_input; 606 607 if (!guid) 608 return AE_BAD_PARAMETER; 609 610 if (guid_parse(guid, &guid_input)) 611 return AE_BAD_PARAMETER; 612 613 list_for_each_entry(block, &wmi_block_list, list) { 614 acpi_status wmi_status; 615 616 if (guid_equal(&block->gblock.guid, &guid_input)) { 617 if (!block->handler || 618 block->handler == wmi_notify_debug) 619 return AE_NULL_ENTRY; 620 621 if (debug_event) { 622 block->handler = wmi_notify_debug; 623 status = AE_OK; 624 } else { 625 wmi_status = wmi_method_enable(block, false); 626 block->handler = NULL; 627 block->handler_data = NULL; 628 if ((wmi_status != AE_OK) || 629 ((wmi_status == AE_OK) && 630 (status == AE_NOT_EXIST))) 631 status = wmi_status; 632 } 633 } 634 } 635 636 return status; 637 } 638 EXPORT_SYMBOL_GPL(wmi_remove_notify_handler); 639 640 /** 641 * wmi_get_event_data - Get WMI data associated with an event 642 * 643 * @event: Event to find 644 * @out: Buffer to hold event data. out->pointer should be freed with kfree() 645 * 646 * Returns extra data associated with an event in WMI. 647 */ 648 acpi_status wmi_get_event_data(u32 event, struct acpi_buffer *out) 649 { 650 struct wmi_block *wblock; 651 652 list_for_each_entry(wblock, &wmi_block_list, list) { 653 struct guid_block *gblock = &wblock->gblock; 654 655 if ((gblock->flags & ACPI_WMI_EVENT) && gblock->notify_id == event) 656 return get_event_data(wblock, out); 657 } 658 659 return AE_NOT_FOUND; 660 } 661 EXPORT_SYMBOL_GPL(wmi_get_event_data); 662 663 /** 664 * wmi_has_guid - Check if a GUID is available 665 * @guid_string: 36 char string of the form fa50ff2b-f2e8-45de-83fa-65417f2f49ba 666 * 667 * Check if a given GUID is defined by _WDG 668 */ 669 bool wmi_has_guid(const char *guid_string) 670 { 671 return ACPI_SUCCESS(find_guid(guid_string, NULL)); 672 } 673 EXPORT_SYMBOL_GPL(wmi_has_guid); 674 675 /** 676 * wmi_get_acpi_device_uid() - Get _UID name of ACPI device that defines GUID 677 * @guid_string: 36 char string of the form fa50ff2b-f2e8-45de-83fa-65417f2f49ba 678 * 679 * Find the _UID of ACPI device associated with this WMI GUID. 680 * 681 * Return: The ACPI _UID field value or NULL if the WMI GUID was not found 682 */ 683 char *wmi_get_acpi_device_uid(const char *guid_string) 684 { 685 struct wmi_block *wblock = NULL; 686 acpi_status status; 687 688 status = find_guid(guid_string, &wblock); 689 if (ACPI_FAILURE(status)) 690 return NULL; 691 692 return acpi_device_uid(wblock->acpi_device); 693 } 694 EXPORT_SYMBOL_GPL(wmi_get_acpi_device_uid); 695 696 static struct wmi_block *dev_to_wblock(struct device *dev) 697 { 698 return container_of(dev, struct wmi_block, dev.dev); 699 } 700 701 static struct wmi_device *dev_to_wdev(struct device *dev) 702 { 703 return container_of(dev, struct wmi_device, dev); 704 } 705 706 static inline struct wmi_driver *drv_to_wdrv(struct device_driver *drv) 707 { 708 return container_of(drv, struct wmi_driver, driver); 709 } 710 711 /* 712 * sysfs interface 713 */ 714 static ssize_t modalias_show(struct device *dev, struct device_attribute *attr, 715 char *buf) 716 { 717 struct wmi_block *wblock = dev_to_wblock(dev); 718 719 return sysfs_emit(buf, "wmi:%pUL\n", &wblock->gblock.guid); 720 } 721 static DEVICE_ATTR_RO(modalias); 722 723 static ssize_t guid_show(struct device *dev, struct device_attribute *attr, 724 char *buf) 725 { 726 struct wmi_block *wblock = dev_to_wblock(dev); 727 728 return sysfs_emit(buf, "%pUL\n", &wblock->gblock.guid); 729 } 730 static DEVICE_ATTR_RO(guid); 731 732 static ssize_t instance_count_show(struct device *dev, 733 struct device_attribute *attr, char *buf) 734 { 735 struct wmi_block *wblock = dev_to_wblock(dev); 736 737 return sysfs_emit(buf, "%d\n", (int)wblock->gblock.instance_count); 738 } 739 static DEVICE_ATTR_RO(instance_count); 740 741 static ssize_t expensive_show(struct device *dev, 742 struct device_attribute *attr, char *buf) 743 { 744 struct wmi_block *wblock = dev_to_wblock(dev); 745 746 return sysfs_emit(buf, "%d\n", 747 (wblock->gblock.flags & ACPI_WMI_EXPENSIVE) != 0); 748 } 749 static DEVICE_ATTR_RO(expensive); 750 751 static struct attribute *wmi_attrs[] = { 752 &dev_attr_modalias.attr, 753 &dev_attr_guid.attr, 754 &dev_attr_instance_count.attr, 755 &dev_attr_expensive.attr, 756 NULL 757 }; 758 ATTRIBUTE_GROUPS(wmi); 759 760 static ssize_t notify_id_show(struct device *dev, struct device_attribute *attr, 761 char *buf) 762 { 763 struct wmi_block *wblock = dev_to_wblock(dev); 764 765 return sysfs_emit(buf, "%02X\n", (unsigned int)wblock->gblock.notify_id); 766 } 767 static DEVICE_ATTR_RO(notify_id); 768 769 static struct attribute *wmi_event_attrs[] = { 770 &dev_attr_notify_id.attr, 771 NULL 772 }; 773 ATTRIBUTE_GROUPS(wmi_event); 774 775 static ssize_t object_id_show(struct device *dev, struct device_attribute *attr, 776 char *buf) 777 { 778 struct wmi_block *wblock = dev_to_wblock(dev); 779 780 return sysfs_emit(buf, "%c%c\n", wblock->gblock.object_id[0], 781 wblock->gblock.object_id[1]); 782 } 783 static DEVICE_ATTR_RO(object_id); 784 785 static ssize_t setable_show(struct device *dev, struct device_attribute *attr, 786 char *buf) 787 { 788 struct wmi_device *wdev = dev_to_wdev(dev); 789 790 return sysfs_emit(buf, "%d\n", (int)wdev->setable); 791 } 792 static DEVICE_ATTR_RO(setable); 793 794 static struct attribute *wmi_data_attrs[] = { 795 &dev_attr_object_id.attr, 796 &dev_attr_setable.attr, 797 NULL 798 }; 799 ATTRIBUTE_GROUPS(wmi_data); 800 801 static struct attribute *wmi_method_attrs[] = { 802 &dev_attr_object_id.attr, 803 NULL 804 }; 805 ATTRIBUTE_GROUPS(wmi_method); 806 807 static int wmi_dev_uevent(struct device *dev, struct kobj_uevent_env *env) 808 { 809 struct wmi_block *wblock = dev_to_wblock(dev); 810 811 if (add_uevent_var(env, "MODALIAS=wmi:%pUL", &wblock->gblock.guid)) 812 return -ENOMEM; 813 814 if (add_uevent_var(env, "WMI_GUID=%pUL", &wblock->gblock.guid)) 815 return -ENOMEM; 816 817 return 0; 818 } 819 820 static void wmi_dev_release(struct device *dev) 821 { 822 struct wmi_block *wblock = dev_to_wblock(dev); 823 824 kfree(wblock); 825 } 826 827 static int wmi_dev_match(struct device *dev, struct device_driver *driver) 828 { 829 struct wmi_driver *wmi_driver = drv_to_wdrv(driver); 830 struct wmi_block *wblock = dev_to_wblock(dev); 831 const struct wmi_device_id *id = wmi_driver->id_table; 832 833 if (id == NULL) 834 return 0; 835 836 while (*id->guid_string) { 837 guid_t driver_guid; 838 839 if (WARN_ON(guid_parse(id->guid_string, &driver_guid))) 840 continue; 841 if (guid_equal(&driver_guid, &wblock->gblock.guid)) 842 return 1; 843 844 id++; 845 } 846 847 return 0; 848 } 849 static int wmi_char_open(struct inode *inode, struct file *filp) 850 { 851 const char *driver_name = filp->f_path.dentry->d_iname; 852 struct wmi_block *wblock; 853 struct wmi_block *next; 854 855 list_for_each_entry_safe(wblock, next, &wmi_block_list, list) { 856 if (!wblock->dev.dev.driver) 857 continue; 858 if (strcmp(driver_name, wblock->dev.dev.driver->name) == 0) { 859 filp->private_data = wblock; 860 break; 861 } 862 } 863 864 if (!filp->private_data) 865 return -ENODEV; 866 867 return nonseekable_open(inode, filp); 868 } 869 870 static ssize_t wmi_char_read(struct file *filp, char __user *buffer, 871 size_t length, loff_t *offset) 872 { 873 struct wmi_block *wblock = filp->private_data; 874 875 return simple_read_from_buffer(buffer, length, offset, 876 &wblock->req_buf_size, 877 sizeof(wblock->req_buf_size)); 878 } 879 880 static long wmi_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) 881 { 882 struct wmi_ioctl_buffer __user *input = 883 (struct wmi_ioctl_buffer __user *) arg; 884 struct wmi_block *wblock = filp->private_data; 885 struct wmi_ioctl_buffer *buf; 886 struct wmi_driver *wdriver; 887 int ret; 888 889 if (_IOC_TYPE(cmd) != WMI_IOC) 890 return -ENOTTY; 891 892 /* make sure we're not calling a higher instance than exists*/ 893 if (_IOC_NR(cmd) >= wblock->gblock.instance_count) 894 return -EINVAL; 895 896 mutex_lock(&wblock->char_mutex); 897 buf = wblock->handler_data; 898 if (get_user(buf->length, &input->length)) { 899 dev_dbg(&wblock->dev.dev, "Read length from user failed\n"); 900 ret = -EFAULT; 901 goto out_ioctl; 902 } 903 /* if it's too small, abort */ 904 if (buf->length < wblock->req_buf_size) { 905 dev_err(&wblock->dev.dev, 906 "Buffer %lld too small, need at least %lld\n", 907 buf->length, wblock->req_buf_size); 908 ret = -EINVAL; 909 goto out_ioctl; 910 } 911 /* if it's too big, warn, driver will only use what is needed */ 912 if (buf->length > wblock->req_buf_size) 913 dev_warn(&wblock->dev.dev, 914 "Buffer %lld is bigger than required %lld\n", 915 buf->length, wblock->req_buf_size); 916 917 /* copy the structure from userspace */ 918 if (copy_from_user(buf, input, wblock->req_buf_size)) { 919 dev_dbg(&wblock->dev.dev, "Copy %llu from user failed\n", 920 wblock->req_buf_size); 921 ret = -EFAULT; 922 goto out_ioctl; 923 } 924 925 /* let the driver do any filtering and do the call */ 926 wdriver = drv_to_wdrv(wblock->dev.dev.driver); 927 if (!try_module_get(wdriver->driver.owner)) { 928 ret = -EBUSY; 929 goto out_ioctl; 930 } 931 ret = wdriver->filter_callback(&wblock->dev, cmd, buf); 932 module_put(wdriver->driver.owner); 933 if (ret) 934 goto out_ioctl; 935 936 /* return the result (only up to our internal buffer size) */ 937 if (copy_to_user(input, buf, wblock->req_buf_size)) { 938 dev_dbg(&wblock->dev.dev, "Copy %llu to user failed\n", 939 wblock->req_buf_size); 940 ret = -EFAULT; 941 } 942 943 out_ioctl: 944 mutex_unlock(&wblock->char_mutex); 945 return ret; 946 } 947 948 static const struct file_operations wmi_fops = { 949 .owner = THIS_MODULE, 950 .read = wmi_char_read, 951 .open = wmi_char_open, 952 .unlocked_ioctl = wmi_ioctl, 953 .compat_ioctl = compat_ptr_ioctl, 954 }; 955 956 static int wmi_dev_probe(struct device *dev) 957 { 958 struct wmi_block *wblock = dev_to_wblock(dev); 959 struct wmi_driver *wdriver = drv_to_wdrv(dev->driver); 960 int ret = 0; 961 char *buf; 962 963 if (ACPI_FAILURE(wmi_method_enable(wblock, true))) 964 dev_warn(dev, "failed to enable device -- probing anyway\n"); 965 966 if (wdriver->probe) { 967 ret = wdriver->probe(dev_to_wdev(dev), 968 find_guid_context(wblock, wdriver)); 969 if (ret != 0) 970 goto probe_failure; 971 } 972 973 /* driver wants a character device made */ 974 if (wdriver->filter_callback) { 975 /* check that required buffer size declared by driver or MOF */ 976 if (!wblock->req_buf_size) { 977 dev_err(&wblock->dev.dev, 978 "Required buffer size not set\n"); 979 ret = -EINVAL; 980 goto probe_failure; 981 } 982 983 wblock->handler_data = kmalloc(wblock->req_buf_size, 984 GFP_KERNEL); 985 if (!wblock->handler_data) { 986 ret = -ENOMEM; 987 goto probe_failure; 988 } 989 990 buf = kasprintf(GFP_KERNEL, "wmi/%s", wdriver->driver.name); 991 if (!buf) { 992 ret = -ENOMEM; 993 goto probe_string_failure; 994 } 995 wblock->char_dev.minor = MISC_DYNAMIC_MINOR; 996 wblock->char_dev.name = buf; 997 wblock->char_dev.fops = &wmi_fops; 998 wblock->char_dev.mode = 0444; 999 ret = misc_register(&wblock->char_dev); 1000 if (ret) { 1001 dev_warn(dev, "failed to register char dev: %d\n", ret); 1002 ret = -ENOMEM; 1003 goto probe_misc_failure; 1004 } 1005 } 1006 1007 set_bit(WMI_PROBED, &wblock->flags); 1008 return 0; 1009 1010 probe_misc_failure: 1011 kfree(buf); 1012 probe_string_failure: 1013 kfree(wblock->handler_data); 1014 probe_failure: 1015 if (ACPI_FAILURE(wmi_method_enable(wblock, false))) 1016 dev_warn(dev, "failed to disable device\n"); 1017 return ret; 1018 } 1019 1020 static void wmi_dev_remove(struct device *dev) 1021 { 1022 struct wmi_block *wblock = dev_to_wblock(dev); 1023 struct wmi_driver *wdriver = drv_to_wdrv(dev->driver); 1024 1025 clear_bit(WMI_PROBED, &wblock->flags); 1026 1027 if (wdriver->filter_callback) { 1028 misc_deregister(&wblock->char_dev); 1029 kfree(wblock->char_dev.name); 1030 kfree(wblock->handler_data); 1031 } 1032 1033 if (wdriver->remove) 1034 wdriver->remove(dev_to_wdev(dev)); 1035 1036 if (ACPI_FAILURE(wmi_method_enable(wblock, false))) 1037 dev_warn(dev, "failed to disable device\n"); 1038 } 1039 1040 static struct class wmi_bus_class = { 1041 .name = "wmi_bus", 1042 }; 1043 1044 static struct bus_type wmi_bus_type = { 1045 .name = "wmi", 1046 .dev_groups = wmi_groups, 1047 .match = wmi_dev_match, 1048 .uevent = wmi_dev_uevent, 1049 .probe = wmi_dev_probe, 1050 .remove = wmi_dev_remove, 1051 }; 1052 1053 static const struct device_type wmi_type_event = { 1054 .name = "event", 1055 .groups = wmi_event_groups, 1056 .release = wmi_dev_release, 1057 }; 1058 1059 static const struct device_type wmi_type_method = { 1060 .name = "method", 1061 .groups = wmi_method_groups, 1062 .release = wmi_dev_release, 1063 }; 1064 1065 static const struct device_type wmi_type_data = { 1066 .name = "data", 1067 .groups = wmi_data_groups, 1068 .release = wmi_dev_release, 1069 }; 1070 1071 /* 1072 * _WDG is a static list that is only parsed at startup, 1073 * so it's safe to count entries without extra protection. 1074 */ 1075 static int guid_count(const guid_t *guid) 1076 { 1077 struct wmi_block *wblock; 1078 int count = 0; 1079 1080 list_for_each_entry(wblock, &wmi_block_list, list) { 1081 if (guid_equal(&wblock->gblock.guid, guid)) 1082 count++; 1083 } 1084 1085 return count; 1086 } 1087 1088 static int wmi_create_device(struct device *wmi_bus_dev, 1089 struct wmi_block *wblock, 1090 struct acpi_device *device) 1091 { 1092 struct acpi_device_info *info; 1093 char method[WMI_ACPI_METHOD_NAME_SIZE]; 1094 int result; 1095 uint count; 1096 1097 if (wblock->gblock.flags & ACPI_WMI_EVENT) { 1098 wblock->dev.dev.type = &wmi_type_event; 1099 goto out_init; 1100 } 1101 1102 if (wblock->gblock.flags & ACPI_WMI_METHOD) { 1103 wblock->dev.dev.type = &wmi_type_method; 1104 mutex_init(&wblock->char_mutex); 1105 goto out_init; 1106 } 1107 1108 /* 1109 * Data Block Query Control Method (WQxx by convention) is 1110 * required per the WMI documentation. If it is not present, 1111 * we ignore this data block. 1112 */ 1113 get_acpi_method_name(wblock, 'Q', method); 1114 result = get_subobj_info(device->handle, method, &info); 1115 1116 if (result) { 1117 dev_warn(wmi_bus_dev, 1118 "%s data block query control method not found\n", 1119 method); 1120 return result; 1121 } 1122 1123 wblock->dev.dev.type = &wmi_type_data; 1124 1125 /* 1126 * The Microsoft documentation specifically states: 1127 * 1128 * Data blocks registered with only a single instance 1129 * can ignore the parameter. 1130 * 1131 * ACPICA will get mad at us if we call the method with the wrong number 1132 * of arguments, so check what our method expects. (On some Dell 1133 * laptops, WQxx may not be a method at all.) 1134 */ 1135 if (info->type != ACPI_TYPE_METHOD || info->param_count == 0) 1136 set_bit(WMI_READ_TAKES_NO_ARGS, &wblock->flags); 1137 1138 kfree(info); 1139 1140 get_acpi_method_name(wblock, 'S', method); 1141 result = get_subobj_info(device->handle, method, NULL); 1142 1143 if (result == 0) 1144 wblock->dev.setable = true; 1145 1146 out_init: 1147 wblock->dev.dev.bus = &wmi_bus_type; 1148 wblock->dev.dev.parent = wmi_bus_dev; 1149 1150 count = guid_count(&wblock->gblock.guid); 1151 if (count) 1152 dev_set_name(&wblock->dev.dev, "%pUL-%d", &wblock->gblock.guid, count); 1153 else 1154 dev_set_name(&wblock->dev.dev, "%pUL", &wblock->gblock.guid); 1155 1156 device_initialize(&wblock->dev.dev); 1157 1158 return 0; 1159 } 1160 1161 static void wmi_free_devices(struct acpi_device *device) 1162 { 1163 struct wmi_block *wblock, *next; 1164 1165 /* Delete devices for all the GUIDs */ 1166 list_for_each_entry_safe(wblock, next, &wmi_block_list, list) { 1167 if (wblock->acpi_device == device) { 1168 list_del(&wblock->list); 1169 device_unregister(&wblock->dev.dev); 1170 } 1171 } 1172 } 1173 1174 static bool guid_already_parsed_for_legacy(struct acpi_device *device, const guid_t *guid) 1175 { 1176 struct wmi_block *wblock; 1177 1178 list_for_each_entry(wblock, &wmi_block_list, list) { 1179 /* skip warning and register if we know the driver will use struct wmi_driver */ 1180 for (int i = 0; allow_duplicates[i] != NULL; i++) { 1181 guid_t tmp; 1182 1183 if (guid_parse(allow_duplicates[i], &tmp)) 1184 continue; 1185 if (guid_equal(&tmp, guid)) 1186 return false; 1187 } 1188 if (guid_equal(&wblock->gblock.guid, guid)) { 1189 /* 1190 * Because we historically didn't track the relationship 1191 * between GUIDs and ACPI nodes, we don't know whether 1192 * we need to suppress GUIDs that are unique on a 1193 * given node but duplicated across nodes. 1194 */ 1195 dev_warn(&device->dev, "duplicate WMI GUID %pUL (first instance was on %s)\n", 1196 guid, dev_name(&wblock->acpi_device->dev)); 1197 return true; 1198 } 1199 } 1200 1201 return false; 1202 } 1203 1204 /* 1205 * Parse the _WDG method for the GUID data blocks 1206 */ 1207 static int parse_wdg(struct device *wmi_bus_dev, struct acpi_device *device) 1208 { 1209 struct acpi_buffer out = {ACPI_ALLOCATE_BUFFER, NULL}; 1210 const struct guid_block *gblock; 1211 struct wmi_block *wblock, *next; 1212 union acpi_object *obj; 1213 acpi_status status; 1214 int retval = 0; 1215 u32 i, total; 1216 1217 status = acpi_evaluate_object(device->handle, "_WDG", NULL, &out); 1218 if (ACPI_FAILURE(status)) 1219 return -ENXIO; 1220 1221 obj = out.pointer; 1222 if (!obj) 1223 return -ENXIO; 1224 1225 if (obj->type != ACPI_TYPE_BUFFER) { 1226 retval = -ENXIO; 1227 goto out_free_pointer; 1228 } 1229 1230 gblock = (const struct guid_block *)obj->buffer.pointer; 1231 total = obj->buffer.length / sizeof(struct guid_block); 1232 1233 for (i = 0; i < total; i++) { 1234 if (debug_dump_wdg) 1235 wmi_dump_wdg(&gblock[i]); 1236 1237 if (guid_already_parsed_for_legacy(device, &gblock[i].guid)) 1238 continue; 1239 1240 wblock = kzalloc(sizeof(*wblock), GFP_KERNEL); 1241 if (!wblock) { 1242 retval = -ENOMEM; 1243 break; 1244 } 1245 1246 wblock->acpi_device = device; 1247 wblock->gblock = gblock[i]; 1248 1249 retval = wmi_create_device(wmi_bus_dev, wblock, device); 1250 if (retval) { 1251 kfree(wblock); 1252 continue; 1253 } 1254 1255 list_add_tail(&wblock->list, &wmi_block_list); 1256 1257 if (debug_event) { 1258 wblock->handler = wmi_notify_debug; 1259 wmi_method_enable(wblock, true); 1260 } 1261 } 1262 1263 /* 1264 * Now that all of the devices are created, add them to the 1265 * device tree and probe subdrivers. 1266 */ 1267 list_for_each_entry_safe(wblock, next, &wmi_block_list, list) { 1268 if (wblock->acpi_device != device) 1269 continue; 1270 1271 retval = device_add(&wblock->dev.dev); 1272 if (retval) { 1273 dev_err(wmi_bus_dev, "failed to register %pUL\n", 1274 &wblock->gblock.guid); 1275 if (debug_event) 1276 wmi_method_enable(wblock, false); 1277 list_del(&wblock->list); 1278 put_device(&wblock->dev.dev); 1279 } 1280 } 1281 1282 out_free_pointer: 1283 kfree(out.pointer); 1284 return retval; 1285 } 1286 1287 /* 1288 * WMI can have EmbeddedControl access regions. In which case, we just want to 1289 * hand these off to the EC driver. 1290 */ 1291 static acpi_status 1292 acpi_wmi_ec_space_handler(u32 function, acpi_physical_address address, 1293 u32 bits, u64 *value, 1294 void *handler_context, void *region_context) 1295 { 1296 int result = 0, i = 0; 1297 u8 temp = 0; 1298 1299 if ((address > 0xFF) || !value) 1300 return AE_BAD_PARAMETER; 1301 1302 if (function != ACPI_READ && function != ACPI_WRITE) 1303 return AE_BAD_PARAMETER; 1304 1305 if (bits != 8) 1306 return AE_BAD_PARAMETER; 1307 1308 if (function == ACPI_READ) { 1309 result = ec_read(address, &temp); 1310 (*value) |= ((u64)temp) << i; 1311 } else { 1312 temp = 0xff & ((*value) >> i); 1313 result = ec_write(address, temp); 1314 } 1315 1316 switch (result) { 1317 case -EINVAL: 1318 return AE_BAD_PARAMETER; 1319 case -ENODEV: 1320 return AE_NOT_FOUND; 1321 case -ETIME: 1322 return AE_TIME; 1323 default: 1324 return AE_OK; 1325 } 1326 } 1327 1328 static void acpi_wmi_notify_handler(acpi_handle handle, u32 event, 1329 void *context) 1330 { 1331 struct wmi_block *wblock = NULL, *iter; 1332 1333 list_for_each_entry(iter, &wmi_block_list, list) { 1334 struct guid_block *block = &iter->gblock; 1335 1336 if (iter->acpi_device->handle == handle && 1337 (block->flags & ACPI_WMI_EVENT) && 1338 (block->notify_id == event)) { 1339 wblock = iter; 1340 break; 1341 } 1342 } 1343 1344 if (!wblock) 1345 return; 1346 1347 /* If a driver is bound, then notify the driver. */ 1348 if (test_bit(WMI_PROBED, &wblock->flags) && wblock->dev.dev.driver) { 1349 struct wmi_driver *driver = drv_to_wdrv(wblock->dev.dev.driver); 1350 struct acpi_buffer evdata = { ACPI_ALLOCATE_BUFFER, NULL }; 1351 acpi_status status; 1352 1353 if (!driver->no_notify_data) { 1354 status = get_event_data(wblock, &evdata); 1355 if (ACPI_FAILURE(status)) { 1356 dev_warn(&wblock->dev.dev, "failed to get event data\n"); 1357 return; 1358 } 1359 } 1360 1361 if (driver->notify) 1362 driver->notify(&wblock->dev, evdata.pointer); 1363 1364 kfree(evdata.pointer); 1365 } else if (wblock->handler) { 1366 /* Legacy handler */ 1367 wblock->handler(event, wblock->handler_data); 1368 } 1369 1370 if (debug_event) 1371 pr_info("DEBUG: GUID %pUL event 0x%02X\n", &wblock->gblock.guid, event); 1372 1373 acpi_bus_generate_netlink_event( 1374 wblock->acpi_device->pnp.device_class, 1375 dev_name(&wblock->dev.dev), 1376 event, 0); 1377 } 1378 1379 static int acpi_wmi_remove(struct platform_device *device) 1380 { 1381 struct acpi_device *acpi_device = ACPI_COMPANION(&device->dev); 1382 1383 acpi_remove_notify_handler(acpi_device->handle, ACPI_ALL_NOTIFY, 1384 acpi_wmi_notify_handler); 1385 acpi_remove_address_space_handler(acpi_device->handle, 1386 ACPI_ADR_SPACE_EC, &acpi_wmi_ec_space_handler); 1387 wmi_free_devices(acpi_device); 1388 device_unregister(dev_get_drvdata(&device->dev)); 1389 1390 return 0; 1391 } 1392 1393 static int acpi_wmi_probe(struct platform_device *device) 1394 { 1395 struct acpi_device *acpi_device; 1396 struct device *wmi_bus_dev; 1397 acpi_status status; 1398 int error; 1399 1400 acpi_device = ACPI_COMPANION(&device->dev); 1401 if (!acpi_device) { 1402 dev_err(&device->dev, "ACPI companion is missing\n"); 1403 return -ENODEV; 1404 } 1405 1406 status = acpi_install_address_space_handler(acpi_device->handle, 1407 ACPI_ADR_SPACE_EC, 1408 &acpi_wmi_ec_space_handler, 1409 NULL, NULL); 1410 if (ACPI_FAILURE(status)) { 1411 dev_err(&device->dev, "Error installing EC region handler\n"); 1412 return -ENODEV; 1413 } 1414 1415 status = acpi_install_notify_handler(acpi_device->handle, 1416 ACPI_ALL_NOTIFY, 1417 acpi_wmi_notify_handler, 1418 NULL); 1419 if (ACPI_FAILURE(status)) { 1420 dev_err(&device->dev, "Error installing notify handler\n"); 1421 error = -ENODEV; 1422 goto err_remove_ec_handler; 1423 } 1424 1425 wmi_bus_dev = device_create(&wmi_bus_class, &device->dev, MKDEV(0, 0), 1426 NULL, "wmi_bus-%s", dev_name(&device->dev)); 1427 if (IS_ERR(wmi_bus_dev)) { 1428 error = PTR_ERR(wmi_bus_dev); 1429 goto err_remove_notify_handler; 1430 } 1431 dev_set_drvdata(&device->dev, wmi_bus_dev); 1432 1433 error = parse_wdg(wmi_bus_dev, acpi_device); 1434 if (error) { 1435 pr_err("Failed to parse WDG method\n"); 1436 goto err_remove_busdev; 1437 } 1438 1439 return 0; 1440 1441 err_remove_busdev: 1442 device_unregister(wmi_bus_dev); 1443 1444 err_remove_notify_handler: 1445 acpi_remove_notify_handler(acpi_device->handle, ACPI_ALL_NOTIFY, 1446 acpi_wmi_notify_handler); 1447 1448 err_remove_ec_handler: 1449 acpi_remove_address_space_handler(acpi_device->handle, 1450 ACPI_ADR_SPACE_EC, 1451 &acpi_wmi_ec_space_handler); 1452 1453 return error; 1454 } 1455 1456 int __must_check __wmi_driver_register(struct wmi_driver *driver, 1457 struct module *owner) 1458 { 1459 driver->driver.owner = owner; 1460 driver->driver.bus = &wmi_bus_type; 1461 1462 return driver_register(&driver->driver); 1463 } 1464 EXPORT_SYMBOL(__wmi_driver_register); 1465 1466 void wmi_driver_unregister(struct wmi_driver *driver) 1467 { 1468 driver_unregister(&driver->driver); 1469 } 1470 EXPORT_SYMBOL(wmi_driver_unregister); 1471 1472 static struct platform_driver acpi_wmi_driver = { 1473 .driver = { 1474 .name = "acpi-wmi", 1475 .acpi_match_table = wmi_device_ids, 1476 }, 1477 .probe = acpi_wmi_probe, 1478 .remove = acpi_wmi_remove, 1479 }; 1480 1481 static int __init acpi_wmi_init(void) 1482 { 1483 int error; 1484 1485 if (acpi_disabled) 1486 return -ENODEV; 1487 1488 error = class_register(&wmi_bus_class); 1489 if (error) 1490 return error; 1491 1492 error = bus_register(&wmi_bus_type); 1493 if (error) 1494 goto err_unreg_class; 1495 1496 error = platform_driver_register(&acpi_wmi_driver); 1497 if (error) { 1498 pr_err("Error loading mapper\n"); 1499 goto err_unreg_bus; 1500 } 1501 1502 return 0; 1503 1504 err_unreg_bus: 1505 bus_unregister(&wmi_bus_type); 1506 1507 err_unreg_class: 1508 class_unregister(&wmi_bus_class); 1509 1510 return error; 1511 } 1512 1513 static void __exit acpi_wmi_exit(void) 1514 { 1515 platform_driver_unregister(&acpi_wmi_driver); 1516 bus_unregister(&wmi_bus_type); 1517 class_unregister(&wmi_bus_class); 1518 } 1519 1520 subsys_initcall_sync(acpi_wmi_init); 1521 module_exit(acpi_wmi_exit); 1522