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 #define dev_to_wblock(__dev) container_of_const(__dev, struct wmi_block, dev.dev) 697 #define dev_to_wdev(__dev) container_of_const(__dev, struct wmi_device, dev) 698 699 static inline struct wmi_driver *drv_to_wdrv(struct device_driver *drv) 700 { 701 return container_of(drv, struct wmi_driver, driver); 702 } 703 704 /* 705 * sysfs interface 706 */ 707 static ssize_t modalias_show(struct device *dev, struct device_attribute *attr, 708 char *buf) 709 { 710 struct wmi_block *wblock = dev_to_wblock(dev); 711 712 return sysfs_emit(buf, "wmi:%pUL\n", &wblock->gblock.guid); 713 } 714 static DEVICE_ATTR_RO(modalias); 715 716 static ssize_t guid_show(struct device *dev, struct device_attribute *attr, 717 char *buf) 718 { 719 struct wmi_block *wblock = dev_to_wblock(dev); 720 721 return sysfs_emit(buf, "%pUL\n", &wblock->gblock.guid); 722 } 723 static DEVICE_ATTR_RO(guid); 724 725 static ssize_t instance_count_show(struct device *dev, 726 struct device_attribute *attr, char *buf) 727 { 728 struct wmi_block *wblock = dev_to_wblock(dev); 729 730 return sysfs_emit(buf, "%d\n", (int)wblock->gblock.instance_count); 731 } 732 static DEVICE_ATTR_RO(instance_count); 733 734 static ssize_t expensive_show(struct device *dev, 735 struct device_attribute *attr, char *buf) 736 { 737 struct wmi_block *wblock = dev_to_wblock(dev); 738 739 return sysfs_emit(buf, "%d\n", 740 (wblock->gblock.flags & ACPI_WMI_EXPENSIVE) != 0); 741 } 742 static DEVICE_ATTR_RO(expensive); 743 744 static struct attribute *wmi_attrs[] = { 745 &dev_attr_modalias.attr, 746 &dev_attr_guid.attr, 747 &dev_attr_instance_count.attr, 748 &dev_attr_expensive.attr, 749 NULL 750 }; 751 ATTRIBUTE_GROUPS(wmi); 752 753 static ssize_t notify_id_show(struct device *dev, struct device_attribute *attr, 754 char *buf) 755 { 756 struct wmi_block *wblock = dev_to_wblock(dev); 757 758 return sysfs_emit(buf, "%02X\n", (unsigned int)wblock->gblock.notify_id); 759 } 760 static DEVICE_ATTR_RO(notify_id); 761 762 static struct attribute *wmi_event_attrs[] = { 763 &dev_attr_notify_id.attr, 764 NULL 765 }; 766 ATTRIBUTE_GROUPS(wmi_event); 767 768 static ssize_t object_id_show(struct device *dev, struct device_attribute *attr, 769 char *buf) 770 { 771 struct wmi_block *wblock = dev_to_wblock(dev); 772 773 return sysfs_emit(buf, "%c%c\n", wblock->gblock.object_id[0], 774 wblock->gblock.object_id[1]); 775 } 776 static DEVICE_ATTR_RO(object_id); 777 778 static ssize_t setable_show(struct device *dev, struct device_attribute *attr, 779 char *buf) 780 { 781 struct wmi_device *wdev = dev_to_wdev(dev); 782 783 return sysfs_emit(buf, "%d\n", (int)wdev->setable); 784 } 785 static DEVICE_ATTR_RO(setable); 786 787 static struct attribute *wmi_data_attrs[] = { 788 &dev_attr_object_id.attr, 789 &dev_attr_setable.attr, 790 NULL 791 }; 792 ATTRIBUTE_GROUPS(wmi_data); 793 794 static struct attribute *wmi_method_attrs[] = { 795 &dev_attr_object_id.attr, 796 NULL 797 }; 798 ATTRIBUTE_GROUPS(wmi_method); 799 800 static int wmi_dev_uevent(const struct device *dev, struct kobj_uevent_env *env) 801 { 802 const struct wmi_block *wblock = dev_to_wblock(dev); 803 804 if (add_uevent_var(env, "MODALIAS=wmi:%pUL", &wblock->gblock.guid)) 805 return -ENOMEM; 806 807 if (add_uevent_var(env, "WMI_GUID=%pUL", &wblock->gblock.guid)) 808 return -ENOMEM; 809 810 return 0; 811 } 812 813 static void wmi_dev_release(struct device *dev) 814 { 815 struct wmi_block *wblock = dev_to_wblock(dev); 816 817 kfree(wblock); 818 } 819 820 static int wmi_dev_match(struct device *dev, struct device_driver *driver) 821 { 822 struct wmi_driver *wmi_driver = drv_to_wdrv(driver); 823 struct wmi_block *wblock = dev_to_wblock(dev); 824 const struct wmi_device_id *id = wmi_driver->id_table; 825 826 if (id == NULL) 827 return 0; 828 829 while (*id->guid_string) { 830 guid_t driver_guid; 831 832 if (WARN_ON(guid_parse(id->guid_string, &driver_guid))) 833 continue; 834 if (guid_equal(&driver_guid, &wblock->gblock.guid)) 835 return 1; 836 837 id++; 838 } 839 840 return 0; 841 } 842 static int wmi_char_open(struct inode *inode, struct file *filp) 843 { 844 const char *driver_name = filp->f_path.dentry->d_iname; 845 struct wmi_block *wblock; 846 struct wmi_block *next; 847 848 list_for_each_entry_safe(wblock, next, &wmi_block_list, list) { 849 if (!wblock->dev.dev.driver) 850 continue; 851 if (strcmp(driver_name, wblock->dev.dev.driver->name) == 0) { 852 filp->private_data = wblock; 853 break; 854 } 855 } 856 857 if (!filp->private_data) 858 return -ENODEV; 859 860 return nonseekable_open(inode, filp); 861 } 862 863 static ssize_t wmi_char_read(struct file *filp, char __user *buffer, 864 size_t length, loff_t *offset) 865 { 866 struct wmi_block *wblock = filp->private_data; 867 868 return simple_read_from_buffer(buffer, length, offset, 869 &wblock->req_buf_size, 870 sizeof(wblock->req_buf_size)); 871 } 872 873 static long wmi_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) 874 { 875 struct wmi_ioctl_buffer __user *input = 876 (struct wmi_ioctl_buffer __user *) arg; 877 struct wmi_block *wblock = filp->private_data; 878 struct wmi_ioctl_buffer *buf; 879 struct wmi_driver *wdriver; 880 int ret; 881 882 if (_IOC_TYPE(cmd) != WMI_IOC) 883 return -ENOTTY; 884 885 /* make sure we're not calling a higher instance than exists*/ 886 if (_IOC_NR(cmd) >= wblock->gblock.instance_count) 887 return -EINVAL; 888 889 mutex_lock(&wblock->char_mutex); 890 buf = wblock->handler_data; 891 if (get_user(buf->length, &input->length)) { 892 dev_dbg(&wblock->dev.dev, "Read length from user failed\n"); 893 ret = -EFAULT; 894 goto out_ioctl; 895 } 896 /* if it's too small, abort */ 897 if (buf->length < wblock->req_buf_size) { 898 dev_err(&wblock->dev.dev, 899 "Buffer %lld too small, need at least %lld\n", 900 buf->length, wblock->req_buf_size); 901 ret = -EINVAL; 902 goto out_ioctl; 903 } 904 /* if it's too big, warn, driver will only use what is needed */ 905 if (buf->length > wblock->req_buf_size) 906 dev_warn(&wblock->dev.dev, 907 "Buffer %lld is bigger than required %lld\n", 908 buf->length, wblock->req_buf_size); 909 910 /* copy the structure from userspace */ 911 if (copy_from_user(buf, input, wblock->req_buf_size)) { 912 dev_dbg(&wblock->dev.dev, "Copy %llu from user failed\n", 913 wblock->req_buf_size); 914 ret = -EFAULT; 915 goto out_ioctl; 916 } 917 918 /* let the driver do any filtering and do the call */ 919 wdriver = drv_to_wdrv(wblock->dev.dev.driver); 920 if (!try_module_get(wdriver->driver.owner)) { 921 ret = -EBUSY; 922 goto out_ioctl; 923 } 924 ret = wdriver->filter_callback(&wblock->dev, cmd, buf); 925 module_put(wdriver->driver.owner); 926 if (ret) 927 goto out_ioctl; 928 929 /* return the result (only up to our internal buffer size) */ 930 if (copy_to_user(input, buf, wblock->req_buf_size)) { 931 dev_dbg(&wblock->dev.dev, "Copy %llu to user failed\n", 932 wblock->req_buf_size); 933 ret = -EFAULT; 934 } 935 936 out_ioctl: 937 mutex_unlock(&wblock->char_mutex); 938 return ret; 939 } 940 941 static const struct file_operations wmi_fops = { 942 .owner = THIS_MODULE, 943 .read = wmi_char_read, 944 .open = wmi_char_open, 945 .unlocked_ioctl = wmi_ioctl, 946 .compat_ioctl = compat_ptr_ioctl, 947 }; 948 949 static int wmi_dev_probe(struct device *dev) 950 { 951 struct wmi_block *wblock = dev_to_wblock(dev); 952 struct wmi_driver *wdriver = drv_to_wdrv(dev->driver); 953 int ret = 0; 954 char *buf; 955 956 if (ACPI_FAILURE(wmi_method_enable(wblock, true))) 957 dev_warn(dev, "failed to enable device -- probing anyway\n"); 958 959 if (wdriver->probe) { 960 ret = wdriver->probe(dev_to_wdev(dev), 961 find_guid_context(wblock, wdriver)); 962 if (ret != 0) 963 goto probe_failure; 964 } 965 966 /* driver wants a character device made */ 967 if (wdriver->filter_callback) { 968 /* check that required buffer size declared by driver or MOF */ 969 if (!wblock->req_buf_size) { 970 dev_err(&wblock->dev.dev, 971 "Required buffer size not set\n"); 972 ret = -EINVAL; 973 goto probe_failure; 974 } 975 976 wblock->handler_data = kmalloc(wblock->req_buf_size, 977 GFP_KERNEL); 978 if (!wblock->handler_data) { 979 ret = -ENOMEM; 980 goto probe_failure; 981 } 982 983 buf = kasprintf(GFP_KERNEL, "wmi/%s", wdriver->driver.name); 984 if (!buf) { 985 ret = -ENOMEM; 986 goto probe_string_failure; 987 } 988 wblock->char_dev.minor = MISC_DYNAMIC_MINOR; 989 wblock->char_dev.name = buf; 990 wblock->char_dev.fops = &wmi_fops; 991 wblock->char_dev.mode = 0444; 992 ret = misc_register(&wblock->char_dev); 993 if (ret) { 994 dev_warn(dev, "failed to register char dev: %d\n", ret); 995 ret = -ENOMEM; 996 goto probe_misc_failure; 997 } 998 } 999 1000 set_bit(WMI_PROBED, &wblock->flags); 1001 return 0; 1002 1003 probe_misc_failure: 1004 kfree(buf); 1005 probe_string_failure: 1006 kfree(wblock->handler_data); 1007 probe_failure: 1008 if (ACPI_FAILURE(wmi_method_enable(wblock, false))) 1009 dev_warn(dev, "failed to disable device\n"); 1010 return ret; 1011 } 1012 1013 static void wmi_dev_remove(struct device *dev) 1014 { 1015 struct wmi_block *wblock = dev_to_wblock(dev); 1016 struct wmi_driver *wdriver = drv_to_wdrv(dev->driver); 1017 1018 clear_bit(WMI_PROBED, &wblock->flags); 1019 1020 if (wdriver->filter_callback) { 1021 misc_deregister(&wblock->char_dev); 1022 kfree(wblock->char_dev.name); 1023 kfree(wblock->handler_data); 1024 } 1025 1026 if (wdriver->remove) 1027 wdriver->remove(dev_to_wdev(dev)); 1028 1029 if (ACPI_FAILURE(wmi_method_enable(wblock, false))) 1030 dev_warn(dev, "failed to disable device\n"); 1031 } 1032 1033 static struct class wmi_bus_class = { 1034 .name = "wmi_bus", 1035 }; 1036 1037 static struct bus_type wmi_bus_type = { 1038 .name = "wmi", 1039 .dev_groups = wmi_groups, 1040 .match = wmi_dev_match, 1041 .uevent = wmi_dev_uevent, 1042 .probe = wmi_dev_probe, 1043 .remove = wmi_dev_remove, 1044 }; 1045 1046 static const struct device_type wmi_type_event = { 1047 .name = "event", 1048 .groups = wmi_event_groups, 1049 .release = wmi_dev_release, 1050 }; 1051 1052 static const struct device_type wmi_type_method = { 1053 .name = "method", 1054 .groups = wmi_method_groups, 1055 .release = wmi_dev_release, 1056 }; 1057 1058 static const struct device_type wmi_type_data = { 1059 .name = "data", 1060 .groups = wmi_data_groups, 1061 .release = wmi_dev_release, 1062 }; 1063 1064 /* 1065 * _WDG is a static list that is only parsed at startup, 1066 * so it's safe to count entries without extra protection. 1067 */ 1068 static int guid_count(const guid_t *guid) 1069 { 1070 struct wmi_block *wblock; 1071 int count = 0; 1072 1073 list_for_each_entry(wblock, &wmi_block_list, list) { 1074 if (guid_equal(&wblock->gblock.guid, guid)) 1075 count++; 1076 } 1077 1078 return count; 1079 } 1080 1081 static int wmi_create_device(struct device *wmi_bus_dev, 1082 struct wmi_block *wblock, 1083 struct acpi_device *device) 1084 { 1085 struct acpi_device_info *info; 1086 char method[WMI_ACPI_METHOD_NAME_SIZE]; 1087 int result; 1088 uint count; 1089 1090 if (wblock->gblock.flags & ACPI_WMI_EVENT) { 1091 wblock->dev.dev.type = &wmi_type_event; 1092 goto out_init; 1093 } 1094 1095 if (wblock->gblock.flags & ACPI_WMI_METHOD) { 1096 wblock->dev.dev.type = &wmi_type_method; 1097 mutex_init(&wblock->char_mutex); 1098 goto out_init; 1099 } 1100 1101 /* 1102 * Data Block Query Control Method (WQxx by convention) is 1103 * required per the WMI documentation. If it is not present, 1104 * we ignore this data block. 1105 */ 1106 get_acpi_method_name(wblock, 'Q', method); 1107 result = get_subobj_info(device->handle, method, &info); 1108 1109 if (result) { 1110 dev_warn(wmi_bus_dev, 1111 "%s data block query control method not found\n", 1112 method); 1113 return result; 1114 } 1115 1116 wblock->dev.dev.type = &wmi_type_data; 1117 1118 /* 1119 * The Microsoft documentation specifically states: 1120 * 1121 * Data blocks registered with only a single instance 1122 * can ignore the parameter. 1123 * 1124 * ACPICA will get mad at us if we call the method with the wrong number 1125 * of arguments, so check what our method expects. (On some Dell 1126 * laptops, WQxx may not be a method at all.) 1127 */ 1128 if (info->type != ACPI_TYPE_METHOD || info->param_count == 0) 1129 set_bit(WMI_READ_TAKES_NO_ARGS, &wblock->flags); 1130 1131 kfree(info); 1132 1133 get_acpi_method_name(wblock, 'S', method); 1134 result = get_subobj_info(device->handle, method, NULL); 1135 1136 if (result == 0) 1137 wblock->dev.setable = true; 1138 1139 out_init: 1140 wblock->dev.dev.bus = &wmi_bus_type; 1141 wblock->dev.dev.parent = wmi_bus_dev; 1142 1143 count = guid_count(&wblock->gblock.guid); 1144 if (count) 1145 dev_set_name(&wblock->dev.dev, "%pUL-%d", &wblock->gblock.guid, count); 1146 else 1147 dev_set_name(&wblock->dev.dev, "%pUL", &wblock->gblock.guid); 1148 1149 device_initialize(&wblock->dev.dev); 1150 1151 return 0; 1152 } 1153 1154 static void wmi_free_devices(struct acpi_device *device) 1155 { 1156 struct wmi_block *wblock, *next; 1157 1158 /* Delete devices for all the GUIDs */ 1159 list_for_each_entry_safe(wblock, next, &wmi_block_list, list) { 1160 if (wblock->acpi_device == device) { 1161 list_del(&wblock->list); 1162 device_unregister(&wblock->dev.dev); 1163 } 1164 } 1165 } 1166 1167 static bool guid_already_parsed_for_legacy(struct acpi_device *device, const guid_t *guid) 1168 { 1169 struct wmi_block *wblock; 1170 1171 list_for_each_entry(wblock, &wmi_block_list, list) { 1172 /* skip warning and register if we know the driver will use struct wmi_driver */ 1173 for (int i = 0; allow_duplicates[i] != NULL; i++) { 1174 guid_t tmp; 1175 1176 if (guid_parse(allow_duplicates[i], &tmp)) 1177 continue; 1178 if (guid_equal(&tmp, guid)) 1179 return false; 1180 } 1181 if (guid_equal(&wblock->gblock.guid, guid)) { 1182 /* 1183 * Because we historically didn't track the relationship 1184 * between GUIDs and ACPI nodes, we don't know whether 1185 * we need to suppress GUIDs that are unique on a 1186 * given node but duplicated across nodes. 1187 */ 1188 dev_warn(&device->dev, "duplicate WMI GUID %pUL (first instance was on %s)\n", 1189 guid, dev_name(&wblock->acpi_device->dev)); 1190 return true; 1191 } 1192 } 1193 1194 return false; 1195 } 1196 1197 /* 1198 * Parse the _WDG method for the GUID data blocks 1199 */ 1200 static int parse_wdg(struct device *wmi_bus_dev, struct acpi_device *device) 1201 { 1202 struct acpi_buffer out = {ACPI_ALLOCATE_BUFFER, NULL}; 1203 const struct guid_block *gblock; 1204 struct wmi_block *wblock, *next; 1205 union acpi_object *obj; 1206 acpi_status status; 1207 int retval = 0; 1208 u32 i, total; 1209 1210 status = acpi_evaluate_object(device->handle, "_WDG", NULL, &out); 1211 if (ACPI_FAILURE(status)) 1212 return -ENXIO; 1213 1214 obj = out.pointer; 1215 if (!obj) 1216 return -ENXIO; 1217 1218 if (obj->type != ACPI_TYPE_BUFFER) { 1219 retval = -ENXIO; 1220 goto out_free_pointer; 1221 } 1222 1223 gblock = (const struct guid_block *)obj->buffer.pointer; 1224 total = obj->buffer.length / sizeof(struct guid_block); 1225 1226 for (i = 0; i < total; i++) { 1227 if (debug_dump_wdg) 1228 wmi_dump_wdg(&gblock[i]); 1229 1230 if (guid_already_parsed_for_legacy(device, &gblock[i].guid)) 1231 continue; 1232 1233 wblock = kzalloc(sizeof(*wblock), GFP_KERNEL); 1234 if (!wblock) { 1235 retval = -ENOMEM; 1236 break; 1237 } 1238 1239 wblock->acpi_device = device; 1240 wblock->gblock = gblock[i]; 1241 1242 retval = wmi_create_device(wmi_bus_dev, wblock, device); 1243 if (retval) { 1244 kfree(wblock); 1245 continue; 1246 } 1247 1248 list_add_tail(&wblock->list, &wmi_block_list); 1249 1250 if (debug_event) { 1251 wblock->handler = wmi_notify_debug; 1252 wmi_method_enable(wblock, true); 1253 } 1254 } 1255 1256 /* 1257 * Now that all of the devices are created, add them to the 1258 * device tree and probe subdrivers. 1259 */ 1260 list_for_each_entry_safe(wblock, next, &wmi_block_list, list) { 1261 if (wblock->acpi_device != device) 1262 continue; 1263 1264 retval = device_add(&wblock->dev.dev); 1265 if (retval) { 1266 dev_err(wmi_bus_dev, "failed to register %pUL\n", 1267 &wblock->gblock.guid); 1268 if (debug_event) 1269 wmi_method_enable(wblock, false); 1270 list_del(&wblock->list); 1271 put_device(&wblock->dev.dev); 1272 } 1273 } 1274 1275 out_free_pointer: 1276 kfree(out.pointer); 1277 return retval; 1278 } 1279 1280 /* 1281 * WMI can have EmbeddedControl access regions. In which case, we just want to 1282 * hand these off to the EC driver. 1283 */ 1284 static acpi_status 1285 acpi_wmi_ec_space_handler(u32 function, acpi_physical_address address, 1286 u32 bits, u64 *value, 1287 void *handler_context, void *region_context) 1288 { 1289 int result = 0, i = 0; 1290 u8 temp = 0; 1291 1292 if ((address > 0xFF) || !value) 1293 return AE_BAD_PARAMETER; 1294 1295 if (function != ACPI_READ && function != ACPI_WRITE) 1296 return AE_BAD_PARAMETER; 1297 1298 if (bits != 8) 1299 return AE_BAD_PARAMETER; 1300 1301 if (function == ACPI_READ) { 1302 result = ec_read(address, &temp); 1303 (*value) |= ((u64)temp) << i; 1304 } else { 1305 temp = 0xff & ((*value) >> i); 1306 result = ec_write(address, temp); 1307 } 1308 1309 switch (result) { 1310 case -EINVAL: 1311 return AE_BAD_PARAMETER; 1312 case -ENODEV: 1313 return AE_NOT_FOUND; 1314 case -ETIME: 1315 return AE_TIME; 1316 default: 1317 return AE_OK; 1318 } 1319 } 1320 1321 static void acpi_wmi_notify_handler(acpi_handle handle, u32 event, 1322 void *context) 1323 { 1324 struct wmi_block *wblock = NULL, *iter; 1325 1326 list_for_each_entry(iter, &wmi_block_list, list) { 1327 struct guid_block *block = &iter->gblock; 1328 1329 if (iter->acpi_device->handle == handle && 1330 (block->flags & ACPI_WMI_EVENT) && 1331 (block->notify_id == event)) { 1332 wblock = iter; 1333 break; 1334 } 1335 } 1336 1337 if (!wblock) 1338 return; 1339 1340 /* If a driver is bound, then notify the driver. */ 1341 if (test_bit(WMI_PROBED, &wblock->flags) && wblock->dev.dev.driver) { 1342 struct wmi_driver *driver = drv_to_wdrv(wblock->dev.dev.driver); 1343 struct acpi_buffer evdata = { ACPI_ALLOCATE_BUFFER, NULL }; 1344 acpi_status status; 1345 1346 if (!driver->no_notify_data) { 1347 status = get_event_data(wblock, &evdata); 1348 if (ACPI_FAILURE(status)) { 1349 dev_warn(&wblock->dev.dev, "failed to get event data\n"); 1350 return; 1351 } 1352 } 1353 1354 if (driver->notify) 1355 driver->notify(&wblock->dev, evdata.pointer); 1356 1357 kfree(evdata.pointer); 1358 } else if (wblock->handler) { 1359 /* Legacy handler */ 1360 wblock->handler(event, wblock->handler_data); 1361 } 1362 1363 if (debug_event) 1364 pr_info("DEBUG: GUID %pUL event 0x%02X\n", &wblock->gblock.guid, event); 1365 1366 acpi_bus_generate_netlink_event( 1367 wblock->acpi_device->pnp.device_class, 1368 dev_name(&wblock->dev.dev), 1369 event, 0); 1370 } 1371 1372 static int acpi_wmi_remove(struct platform_device *device) 1373 { 1374 struct acpi_device *acpi_device = ACPI_COMPANION(&device->dev); 1375 1376 acpi_remove_notify_handler(acpi_device->handle, ACPI_ALL_NOTIFY, 1377 acpi_wmi_notify_handler); 1378 acpi_remove_address_space_handler(acpi_device->handle, 1379 ACPI_ADR_SPACE_EC, &acpi_wmi_ec_space_handler); 1380 wmi_free_devices(acpi_device); 1381 device_unregister(dev_get_drvdata(&device->dev)); 1382 1383 return 0; 1384 } 1385 1386 static int acpi_wmi_probe(struct platform_device *device) 1387 { 1388 struct acpi_device *acpi_device; 1389 struct device *wmi_bus_dev; 1390 acpi_status status; 1391 int error; 1392 1393 acpi_device = ACPI_COMPANION(&device->dev); 1394 if (!acpi_device) { 1395 dev_err(&device->dev, "ACPI companion is missing\n"); 1396 return -ENODEV; 1397 } 1398 1399 status = acpi_install_address_space_handler(acpi_device->handle, 1400 ACPI_ADR_SPACE_EC, 1401 &acpi_wmi_ec_space_handler, 1402 NULL, NULL); 1403 if (ACPI_FAILURE(status)) { 1404 dev_err(&device->dev, "Error installing EC region handler\n"); 1405 return -ENODEV; 1406 } 1407 1408 status = acpi_install_notify_handler(acpi_device->handle, 1409 ACPI_ALL_NOTIFY, 1410 acpi_wmi_notify_handler, 1411 NULL); 1412 if (ACPI_FAILURE(status)) { 1413 dev_err(&device->dev, "Error installing notify handler\n"); 1414 error = -ENODEV; 1415 goto err_remove_ec_handler; 1416 } 1417 1418 wmi_bus_dev = device_create(&wmi_bus_class, &device->dev, MKDEV(0, 0), 1419 NULL, "wmi_bus-%s", dev_name(&device->dev)); 1420 if (IS_ERR(wmi_bus_dev)) { 1421 error = PTR_ERR(wmi_bus_dev); 1422 goto err_remove_notify_handler; 1423 } 1424 dev_set_drvdata(&device->dev, wmi_bus_dev); 1425 1426 error = parse_wdg(wmi_bus_dev, acpi_device); 1427 if (error) { 1428 pr_err("Failed to parse WDG method\n"); 1429 goto err_remove_busdev; 1430 } 1431 1432 return 0; 1433 1434 err_remove_busdev: 1435 device_unregister(wmi_bus_dev); 1436 1437 err_remove_notify_handler: 1438 acpi_remove_notify_handler(acpi_device->handle, ACPI_ALL_NOTIFY, 1439 acpi_wmi_notify_handler); 1440 1441 err_remove_ec_handler: 1442 acpi_remove_address_space_handler(acpi_device->handle, 1443 ACPI_ADR_SPACE_EC, 1444 &acpi_wmi_ec_space_handler); 1445 1446 return error; 1447 } 1448 1449 int __must_check __wmi_driver_register(struct wmi_driver *driver, 1450 struct module *owner) 1451 { 1452 driver->driver.owner = owner; 1453 driver->driver.bus = &wmi_bus_type; 1454 1455 return driver_register(&driver->driver); 1456 } 1457 EXPORT_SYMBOL(__wmi_driver_register); 1458 1459 void wmi_driver_unregister(struct wmi_driver *driver) 1460 { 1461 driver_unregister(&driver->driver); 1462 } 1463 EXPORT_SYMBOL(wmi_driver_unregister); 1464 1465 static struct platform_driver acpi_wmi_driver = { 1466 .driver = { 1467 .name = "acpi-wmi", 1468 .acpi_match_table = wmi_device_ids, 1469 }, 1470 .probe = acpi_wmi_probe, 1471 .remove = acpi_wmi_remove, 1472 }; 1473 1474 static int __init acpi_wmi_init(void) 1475 { 1476 int error; 1477 1478 if (acpi_disabled) 1479 return -ENODEV; 1480 1481 error = class_register(&wmi_bus_class); 1482 if (error) 1483 return error; 1484 1485 error = bus_register(&wmi_bus_type); 1486 if (error) 1487 goto err_unreg_class; 1488 1489 error = platform_driver_register(&acpi_wmi_driver); 1490 if (error) { 1491 pr_err("Error loading mapper\n"); 1492 goto err_unreg_bus; 1493 } 1494 1495 return 0; 1496 1497 err_unreg_bus: 1498 bus_unregister(&wmi_bus_type); 1499 1500 err_unreg_class: 1501 class_unregister(&wmi_bus_class); 1502 1503 return error; 1504 } 1505 1506 static void __exit acpi_wmi_exit(void) 1507 { 1508 platform_driver_unregister(&acpi_wmi_driver); 1509 bus_unregister(&wmi_bus_type); 1510 class_unregister(&wmi_bus_class); 1511 } 1512 1513 subsys_initcall_sync(acpi_wmi_init); 1514 module_exit(acpi_wmi_exit); 1515