diff options
author | Andy Lutomirski <luto@kernel.org> | 2017-08-01 11:37:27 -0400 |
---|---|---|
committer | Darren Hart (VMware) <dvhart@infradead.org> | 2017-08-18 20:06:32 -0400 |
commit | 00ebbeb39b70072cc0d0acad32c47e4660eb84e7 (patch) | |
tree | e841914d5618735adc3755b76eea4fac484e7e0c | |
parent | a9c37b74fd0242f3c8ce4221bb7a61cb14ccd59b (diff) |
platform/x86: dell-wmi: Update dell_wmi_check_descriptor_buffer() to new model
This converts dell_wmi_check_descriptor_buffer() to the new driver
model interface and puts the interface version in dell_wmi_priv
where it belongs.
Signed-off-by: Andy Lutomirski <luto@kernel.org>
Reviewed-by: Pali Rohár <pali.rohar@gmail.com>
Signed-off-by: Darren Hart (VMware) <dvhart@infradead.org>
-rw-r--r-- | drivers/platform/x86/dell-wmi.c | 69 |
1 files changed, 39 insertions, 30 deletions
diff --git a/drivers/platform/x86/dell-wmi.c b/drivers/platform/x86/dell-wmi.c index dad8f4afa17c..28d9f8696081 100644 --- a/drivers/platform/x86/dell-wmi.c +++ b/drivers/platform/x86/dell-wmi.c | |||
@@ -48,7 +48,6 @@ MODULE_LICENSE("GPL"); | |||
48 | #define DELL_EVENT_GUID "9DBB5994-A997-11DA-B012-B622A1EF5492" | 48 | #define DELL_EVENT_GUID "9DBB5994-A997-11DA-B012-B622A1EF5492" |
49 | #define DELL_DESCRIPTOR_GUID "8D9DDCBC-A997-11DA-B012-B622A1EF5492" | 49 | #define DELL_DESCRIPTOR_GUID "8D9DDCBC-A997-11DA-B012-B622A1EF5492" |
50 | 50 | ||
51 | static u32 dell_wmi_interface_version; | ||
52 | static bool wmi_requires_smbios_request; | 51 | static bool wmi_requires_smbios_request; |
53 | 52 | ||
54 | MODULE_ALIAS("wmi:"DELL_EVENT_GUID); | 53 | MODULE_ALIAS("wmi:"DELL_EVENT_GUID); |
@@ -56,6 +55,7 @@ MODULE_ALIAS("wmi:"DELL_DESCRIPTOR_GUID); | |||
56 | 55 | ||
57 | struct dell_wmi_priv { | 56 | struct dell_wmi_priv { |
58 | struct input_dev *input_dev; | 57 | struct input_dev *input_dev; |
58 | u32 interface_version; | ||
59 | }; | 59 | }; |
60 | 60 | ||
61 | static int __init dmi_matched(const struct dmi_system_id *dmi) | 61 | static int __init dmi_matched(const struct dmi_system_id *dmi) |
@@ -348,6 +348,7 @@ static void dell_wmi_process_key(struct wmi_device *wdev, int type, int code) | |||
348 | static void dell_wmi_notify(struct wmi_device *wdev, | 348 | static void dell_wmi_notify(struct wmi_device *wdev, |
349 | union acpi_object *obj) | 349 | union acpi_object *obj) |
350 | { | 350 | { |
351 | struct dell_wmi_priv *priv = dev_get_drvdata(&wdev->dev); | ||
351 | u16 *buffer_entry, *buffer_end; | 352 | u16 *buffer_entry, *buffer_end; |
352 | acpi_size buffer_size; | 353 | acpi_size buffer_size; |
353 | int len, i; | 354 | int len, i; |
@@ -376,7 +377,7 @@ static void dell_wmi_notify(struct wmi_device *wdev, | |||
376 | * So to prevent reading garbage from buffer we will process only first | 377 | * So to prevent reading garbage from buffer we will process only first |
377 | * one event on devices with WMI interface version 0. | 378 | * one event on devices with WMI interface version 0. |
378 | */ | 379 | */ |
379 | if (dell_wmi_interface_version == 0 && buffer_entry < buffer_end) | 380 | if (priv->interface_version == 0 && buffer_entry < buffer_end) |
380 | if (buffer_end > buffer_entry + buffer_entry[0] + 1) | 381 | if (buffer_end > buffer_entry + buffer_entry[0] + 1) |
381 | buffer_end = buffer_entry + buffer_entry[0] + 1; | 382 | buffer_end = buffer_entry + buffer_entry[0] + 1; |
382 | 383 | ||
@@ -626,61 +627,67 @@ static void dell_wmi_input_destroy(struct wmi_device *wdev) | |||
626 | * WMI Interface Version 8 4 <version> | 627 | * WMI Interface Version 8 4 <version> |
627 | * WMI buffer length 12 4 4096 | 628 | * WMI buffer length 12 4 4096 |
628 | */ | 629 | */ |
629 | static int dell_wmi_check_descriptor_buffer(void) | 630 | static int dell_wmi_check_descriptor_buffer(struct wmi_device *wdev) |
630 | { | 631 | { |
631 | struct acpi_buffer out = { ACPI_ALLOCATE_BUFFER, NULL }; | 632 | struct dell_wmi_priv *priv = dev_get_drvdata(&wdev->dev); |
632 | union acpi_object *obj; | 633 | union acpi_object *obj = NULL; |
633 | acpi_status status; | 634 | struct wmi_device *desc_dev; |
634 | u32 *buffer; | 635 | u32 *buffer; |
636 | int ret; | ||
635 | 637 | ||
636 | status = wmi_query_block(DELL_DESCRIPTOR_GUID, 0, &out); | 638 | desc_dev = wmidev_get_other_guid(wdev, DELL_DESCRIPTOR_GUID); |
637 | if (ACPI_FAILURE(status)) { | 639 | if (!desc_dev) { |
638 | pr_err("Cannot read Dell descriptor buffer - %d\n", status); | 640 | dev_err(&wdev->dev, "Dell WMI descriptor does not exist\n"); |
639 | return status; | 641 | return -ENODEV; |
640 | } | 642 | } |
641 | 643 | ||
642 | obj = (union acpi_object *)out.pointer; | 644 | obj = wmidev_block_query(desc_dev, 0); |
643 | if (!obj) { | 645 | if (!obj) { |
644 | pr_err("Dell descriptor buffer is empty\n"); | 646 | dev_err(&wdev->dev, "failed to read Dell WMI descriptor\n"); |
645 | return -EINVAL; | 647 | ret = -EIO; |
648 | goto out; | ||
646 | } | 649 | } |
647 | 650 | ||
648 | if (obj->type != ACPI_TYPE_BUFFER) { | 651 | if (obj->type != ACPI_TYPE_BUFFER) { |
649 | pr_err("Cannot read Dell descriptor buffer\n"); | 652 | dev_err(&wdev->dev, "Dell descriptor has wrong type\n"); |
650 | kfree(obj); | 653 | ret = -EINVAL; |
651 | return -EINVAL; | 654 | goto out; |
652 | } | 655 | } |
653 | 656 | ||
654 | if (obj->buffer.length != 128) { | 657 | if (obj->buffer.length != 128) { |
655 | pr_err("Dell descriptor buffer has invalid length (%d)\n", | 658 | dev_err(&wdev->dev, |
659 | "Dell descriptor buffer has invalid length (%d)\n", | ||
656 | obj->buffer.length); | 660 | obj->buffer.length); |
657 | if (obj->buffer.length < 16) { | 661 | if (obj->buffer.length < 16) { |
658 | kfree(obj); | 662 | ret = -EINVAL; |
659 | return -EINVAL; | 663 | goto out; |
660 | } | 664 | } |
661 | } | 665 | } |
662 | 666 | ||
663 | buffer = (u32 *)obj->buffer.pointer; | 667 | buffer = (u32 *)obj->buffer.pointer; |
664 | 668 | ||
665 | if (buffer[0] != 0x4C4C4544 && buffer[1] != 0x494D5720) | 669 | if (buffer[0] != 0x4C4C4544 && buffer[1] != 0x494D5720) |
666 | pr_warn("Dell descriptor buffer has invalid signature (%*ph)\n", | 670 | dev_warn(&wdev->dev, "Dell descriptor buffer has invalid signature (%*ph)\n", |
667 | 8, buffer); | 671 | 8, buffer); |
668 | 672 | ||
669 | if (buffer[2] != 0 && buffer[2] != 1) | 673 | if (buffer[2] != 0 && buffer[2] != 1) |
670 | pr_warn("Dell descriptor buffer has unknown version (%d)\n", | 674 | dev_warn(&wdev->dev, "Dell descriptor buffer has unknown version (%d)\n", |
671 | buffer[2]); | 675 | buffer[2]); |
672 | 676 | ||
673 | if (buffer[3] != 4096) | 677 | if (buffer[3] != 4096) |
674 | pr_warn("Dell descriptor buffer has invalid buffer length (%d)\n", | 678 | dev_warn(&wdev->dev, "Dell descriptor buffer has invalid buffer length (%d)\n", |
675 | buffer[3]); | 679 | buffer[3]); |
676 | 680 | ||
677 | dell_wmi_interface_version = buffer[2]; | 681 | priv->interface_version = buffer[2]; |
682 | ret = 0; | ||
678 | 683 | ||
679 | pr_info("Detected Dell WMI interface version %u\n", | 684 | dev_info(&wdev->dev, "Detected Dell WMI interface version %u\n", |
680 | dell_wmi_interface_version); | 685 | priv->interface_version); |
681 | 686 | ||
687 | out: | ||
682 | kfree(obj); | 688 | kfree(obj); |
683 | return 0; | 689 | put_device(&desc_dev->dev); |
690 | return ret; | ||
684 | } | 691 | } |
685 | 692 | ||
686 | /* | 693 | /* |
@@ -717,17 +724,19 @@ static int dell_wmi_events_set_enabled(bool enable) | |||
717 | 724 | ||
718 | static int dell_wmi_probe(struct wmi_device *wdev) | 725 | static int dell_wmi_probe(struct wmi_device *wdev) |
719 | { | 726 | { |
727 | struct dell_wmi_priv *priv; | ||
720 | int err; | 728 | int err; |
721 | 729 | ||
722 | struct dell_wmi_priv *priv = devm_kzalloc( | 730 | priv = devm_kzalloc( |
723 | &wdev->dev, sizeof(struct dell_wmi_priv), GFP_KERNEL); | 731 | &wdev->dev, sizeof(struct dell_wmi_priv), GFP_KERNEL); |
732 | if (!priv) | ||
733 | return -ENOMEM; | ||
734 | dev_set_drvdata(&wdev->dev, priv); | ||
724 | 735 | ||
725 | err = dell_wmi_check_descriptor_buffer(); | 736 | err = dell_wmi_check_descriptor_buffer(wdev); |
726 | if (err) | 737 | if (err) |
727 | return err; | 738 | return err; |
728 | 739 | ||
729 | dev_set_drvdata(&wdev->dev, priv); | ||
730 | |||
731 | return dell_wmi_input_setup(wdev); | 740 | return dell_wmi_input_setup(wdev); |
732 | } | 741 | } |
733 | 742 | ||