Merge tag 'platform-drivers-x86-v5.3-1' of git://git.infradead.org/linux-platform...
[linux-2.6-microblaze.git] / drivers / platform / x86 / wmi.c
index 22f4b92..784cea8 100644 (file)
@@ -129,6 +129,28 @@ static bool find_guid(const char *guid_string, struct wmi_block **out)
        return false;
 }
 
+static const void *find_guid_context(struct wmi_block *wblock,
+                                     struct wmi_driver *wdriver)
+{
+       const struct wmi_device_id *id;
+       uuid_le guid_input;
+
+       if (wblock == NULL || wdriver == NULL)
+               return NULL;
+       if (wdriver->id_table == NULL)
+               return NULL;
+
+       id = wdriver->id_table;
+       while (*id->guid_string) {
+               if (uuid_le_to_bin(id->guid_string, &guid_input))
+                       continue;
+               if (!memcmp(wblock->gblock.guid, &guid_input, 16))
+                       return id->context;
+               id++;
+       }
+       return NULL;
+}
+
 static int get_subobj_info(acpi_handle handle, const char *pathname,
                           struct acpi_device_info **info)
 {
@@ -618,6 +640,25 @@ bool wmi_has_guid(const char *guid_string)
 }
 EXPORT_SYMBOL_GPL(wmi_has_guid);
 
+/**
+ * wmi_get_acpi_device_uid() - Get _UID name of ACPI device that defines GUID
+ * @guid_string: 36 char string of the form fa50ff2b-f2e8-45de-83fa-65417f2f49ba
+ *
+ * Find the _UID of ACPI device associated with this WMI GUID.
+ *
+ * Return: The ACPI _UID field value or NULL if the WMI GUID was not found
+ */
+char *wmi_get_acpi_device_uid(const char *guid_string)
+{
+       struct wmi_block *wblock = NULL;
+
+       if (!find_guid(guid_string, &wblock))
+               return NULL;
+
+       return acpi_device_uid(wblock->acpi_device);
+}
+EXPORT_SYMBOL_GPL(wmi_get_acpi_device_uid);
+
 static struct wmi_block *dev_to_wblock(struct device *dev)
 {
        return container_of(dev, struct wmi_block, dev.dev);
@@ -887,7 +928,8 @@ static int wmi_dev_probe(struct device *dev)
                dev_warn(dev, "failed to enable device -- probing anyway\n");
 
        if (wdriver->probe) {
-               ret = wdriver->probe(dev_to_wdev(dev));
+               ret = wdriver->probe(dev_to_wdev(dev),
+                               find_guid_context(wblock, wdriver));
                if (ret != 0)
                        goto probe_failure;
        }