diff options
| -rw-r--r-- | drivers/platform/x86/dell-smbios-wmi.c | 5 | ||||
| -rw-r--r-- | drivers/platform/x86/dell-wmi-descriptor.c | 16 | ||||
| -rw-r--r-- | drivers/platform/x86/dell-wmi-descriptor.h | 8 | ||||
| -rw-r--r-- | drivers/platform/x86/dell-wmi.c | 6 |
4 files changed, 30 insertions, 5 deletions
diff --git a/drivers/platform/x86/dell-smbios-wmi.c b/drivers/platform/x86/dell-smbios-wmi.c index 5cf9b13ce6e6..0cab1f9c35af 100644 --- a/drivers/platform/x86/dell-smbios-wmi.c +++ b/drivers/platform/x86/dell-smbios-wmi.c | |||
| @@ -151,8 +151,9 @@ static int dell_smbios_wmi_probe(struct wmi_device *wdev) | |||
| 151 | int count; | 151 | int count; |
| 152 | int ret; | 152 | int ret; |
| 153 | 153 | ||
| 154 | if (!wmi_has_guid(DELL_WMI_DESCRIPTOR_GUID)) | 154 | ret = dell_wmi_get_descriptor_valid(); |
| 155 | return -ENODEV; | 155 | if (ret) |
| 156 | return ret; | ||
| 156 | 157 | ||
| 157 | priv = devm_kzalloc(&wdev->dev, sizeof(struct wmi_smbios_priv), | 158 | priv = devm_kzalloc(&wdev->dev, sizeof(struct wmi_smbios_priv), |
| 158 | GFP_KERNEL); | 159 | GFP_KERNEL); |
diff --git a/drivers/platform/x86/dell-wmi-descriptor.c b/drivers/platform/x86/dell-wmi-descriptor.c index 28ef5f37cfbf..4dfef1f53481 100644 --- a/drivers/platform/x86/dell-wmi-descriptor.c +++ b/drivers/platform/x86/dell-wmi-descriptor.c | |||
| @@ -21,14 +21,26 @@ | |||
| 21 | #include <linux/wmi.h> | 21 | #include <linux/wmi.h> |
| 22 | #include "dell-wmi-descriptor.h" | 22 | #include "dell-wmi-descriptor.h" |
| 23 | 23 | ||
| 24 | #define DELL_WMI_DESCRIPTOR_GUID "8D9DDCBC-A997-11DA-B012-B622A1EF5492" | ||
| 25 | |||
| 24 | struct descriptor_priv { | 26 | struct descriptor_priv { |
| 25 | struct list_head list; | 27 | struct list_head list; |
| 26 | u32 interface_version; | 28 | u32 interface_version; |
| 27 | u32 size; | 29 | u32 size; |
| 28 | }; | 30 | }; |
| 31 | static int descriptor_valid = -EPROBE_DEFER; | ||
| 29 | static LIST_HEAD(wmi_list); | 32 | static LIST_HEAD(wmi_list); |
| 30 | static DEFINE_MUTEX(list_mutex); | 33 | static DEFINE_MUTEX(list_mutex); |
| 31 | 34 | ||
| 35 | int dell_wmi_get_descriptor_valid(void) | ||
| 36 | { | ||
| 37 | if (!wmi_has_guid(DELL_WMI_DESCRIPTOR_GUID)) | ||
| 38 | return -ENODEV; | ||
| 39 | |||
| 40 | return descriptor_valid; | ||
| 41 | } | ||
| 42 | EXPORT_SYMBOL_GPL(dell_wmi_get_descriptor_valid); | ||
| 43 | |||
| 32 | bool dell_wmi_get_interface_version(u32 *version) | 44 | bool dell_wmi_get_interface_version(u32 *version) |
| 33 | { | 45 | { |
| 34 | struct descriptor_priv *priv; | 46 | struct descriptor_priv *priv; |
| @@ -91,6 +103,7 @@ static int dell_wmi_descriptor_probe(struct wmi_device *wdev) | |||
| 91 | if (obj->type != ACPI_TYPE_BUFFER) { | 103 | if (obj->type != ACPI_TYPE_BUFFER) { |
| 92 | dev_err(&wdev->dev, "Dell descriptor has wrong type\n"); | 104 | dev_err(&wdev->dev, "Dell descriptor has wrong type\n"); |
| 93 | ret = -EINVAL; | 105 | ret = -EINVAL; |
| 106 | descriptor_valid = ret; | ||
| 94 | goto out; | 107 | goto out; |
| 95 | } | 108 | } |
| 96 | 109 | ||
| @@ -102,6 +115,7 @@ static int dell_wmi_descriptor_probe(struct wmi_device *wdev) | |||
| 102 | "Dell descriptor buffer has unexpected length (%d)\n", | 115 | "Dell descriptor buffer has unexpected length (%d)\n", |
| 103 | obj->buffer.length); | 116 | obj->buffer.length); |
| 104 | ret = -EINVAL; | 117 | ret = -EINVAL; |
| 118 | descriptor_valid = ret; | ||
| 105 | goto out; | 119 | goto out; |
| 106 | } | 120 | } |
| 107 | 121 | ||
| @@ -111,8 +125,10 @@ static int dell_wmi_descriptor_probe(struct wmi_device *wdev) | |||
| 111 | dev_err(&wdev->dev, "Dell descriptor buffer has invalid signature (%8ph)\n", | 125 | dev_err(&wdev->dev, "Dell descriptor buffer has invalid signature (%8ph)\n", |
| 112 | buffer); | 126 | buffer); |
| 113 | ret = -EINVAL; | 127 | ret = -EINVAL; |
| 128 | descriptor_valid = ret; | ||
| 114 | goto out; | 129 | goto out; |
| 115 | } | 130 | } |
| 131 | descriptor_valid = 0; | ||
| 116 | 132 | ||
| 117 | if (buffer[2] != 0 && buffer[2] != 1) | 133 | if (buffer[2] != 0 && buffer[2] != 1) |
| 118 | dev_warn(&wdev->dev, "Dell descriptor buffer has unknown version (%lu)\n", | 134 | dev_warn(&wdev->dev, "Dell descriptor buffer has unknown version (%lu)\n", |
diff --git a/drivers/platform/x86/dell-wmi-descriptor.h b/drivers/platform/x86/dell-wmi-descriptor.h index 5f7b69c2c83a..1e8cb96ffd78 100644 --- a/drivers/platform/x86/dell-wmi-descriptor.h +++ b/drivers/platform/x86/dell-wmi-descriptor.h | |||
| @@ -13,7 +13,13 @@ | |||
| 13 | 13 | ||
| 14 | #include <linux/wmi.h> | 14 | #include <linux/wmi.h> |
| 15 | 15 | ||
| 16 | #define DELL_WMI_DESCRIPTOR_GUID "8D9DDCBC-A997-11DA-B012-B622A1EF5492" | 16 | /* possible return values: |
| 17 | * -ENODEV: Descriptor GUID missing from WMI bus | ||
| 18 | * -EPROBE_DEFER: probing for dell-wmi-descriptor not yet run | ||
| 19 | * 0: valid descriptor, successfully probed | ||
| 20 | * < 0: invalid descriptor, don't probe dependent devices | ||
| 21 | */ | ||
| 22 | int dell_wmi_get_descriptor_valid(void); | ||
| 17 | 23 | ||
| 18 | bool dell_wmi_get_interface_version(u32 *version); | 24 | bool dell_wmi_get_interface_version(u32 *version); |
| 19 | bool dell_wmi_get_size(u32 *size); | 25 | bool dell_wmi_get_size(u32 *size); |
diff --git a/drivers/platform/x86/dell-wmi.c b/drivers/platform/x86/dell-wmi.c index 54321080a30d..39d2f4518483 100644 --- a/drivers/platform/x86/dell-wmi.c +++ b/drivers/platform/x86/dell-wmi.c | |||
| @@ -655,9 +655,11 @@ static int dell_wmi_events_set_enabled(bool enable) | |||
| 655 | static int dell_wmi_probe(struct wmi_device *wdev) | 655 | static int dell_wmi_probe(struct wmi_device *wdev) |
| 656 | { | 656 | { |
| 657 | struct dell_wmi_priv *priv; | 657 | struct dell_wmi_priv *priv; |
| 658 | int ret; | ||
| 658 | 659 | ||
| 659 | if (!wmi_has_guid(DELL_WMI_DESCRIPTOR_GUID)) | 660 | ret = dell_wmi_get_descriptor_valid(); |
| 660 | return -ENODEV; | 661 | if (ret) |
| 662 | return ret; | ||
| 661 | 663 | ||
| 662 | priv = devm_kzalloc( | 664 | priv = devm_kzalloc( |
| 663 | &wdev->dev, sizeof(struct dell_wmi_priv), GFP_KERNEL); | 665 | &wdev->dev, sizeof(struct dell_wmi_priv), GFP_KERNEL); |
