aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAndy Lutomirski <luto@kernel.org>2017-08-01 11:37:27 -0400
committerDarren Hart (VMware) <dvhart@infradead.org>2017-08-18 20:06:32 -0400
commit00ebbeb39b70072cc0d0acad32c47e4660eb84e7 (patch)
treee841914d5618735adc3755b76eea4fac484e7e0c
parenta9c37b74fd0242f3c8ce4221bb7a61cb14ccd59b (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.c69
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
51static u32 dell_wmi_interface_version;
52static bool wmi_requires_smbios_request; 51static bool wmi_requires_smbios_request;
53 52
54MODULE_ALIAS("wmi:"DELL_EVENT_GUID); 53MODULE_ALIAS("wmi:"DELL_EVENT_GUID);
@@ -56,6 +55,7 @@ MODULE_ALIAS("wmi:"DELL_DESCRIPTOR_GUID);
56 55
57struct dell_wmi_priv { 56struct dell_wmi_priv {
58 struct input_dev *input_dev; 57 struct input_dev *input_dev;
58 u32 interface_version;
59}; 59};
60 60
61static int __init dmi_matched(const struct dmi_system_id *dmi) 61static 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)
348static void dell_wmi_notify(struct wmi_device *wdev, 348static 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 */
629static int dell_wmi_check_descriptor_buffer(void) 630static 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
687out:
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
718static int dell_wmi_probe(struct wmi_device *wdev) 725static 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