ACPI / PM: Expose power states of ACPI devices to user space
[linux-3.10.git] / drivers / acpi / acpi_platform.c
index 7ac20d8..db129b9 100644 (file)
@@ -17,6 +17,8 @@
 #include <linux/module.h>
 #include <linux/platform_device.h>
 
+#include "internal.h"
+
 ACPI_MODULE_NAME("platform");
 
 /**
@@ -33,7 +35,7 @@ struct platform_device *acpi_create_platform_device(struct acpi_device *adev)
 {
        struct platform_device *pdev = NULL;
        struct acpi_device *acpi_parent;
-       struct device *parent = NULL;
+       struct platform_device_info pdevinfo;
        struct resource_list_entry *rentry;
        struct list_head resource_list;
        struct resource *resources;
@@ -60,11 +62,13 @@ struct platform_device *acpi_create_platform_device(struct acpi_device *adev)
 
        acpi_dev_free_resource_list(&resource_list);
 
+       memset(&pdevinfo, 0, sizeof(pdevinfo));
        /*
         * If the ACPI node has a parent and that parent has a physical device
         * attached to it, that physical device should be the parent of the
         * platform device we are about to create.
         */
+       pdevinfo.parent = NULL;
        acpi_parent = adev->parent;
        if (acpi_parent) {
                struct acpi_device_physical_node *entry;
@@ -76,12 +80,16 @@ struct platform_device *acpi_create_platform_device(struct acpi_device *adev)
                        entry = list_first_entry(list,
                                        struct acpi_device_physical_node,
                                        node);
-                       parent = entry->dev;
+                       pdevinfo.parent = entry->dev;
                }
                mutex_unlock(&acpi_parent->physical_node_lock);
        }
-       pdev = platform_device_register_resndata(parent, dev_name(&adev->dev),
-                                                -1, resources, count, NULL, 0);
+       pdevinfo.name = dev_name(&adev->dev);
+       pdevinfo.id = -1;
+       pdevinfo.res = resources;
+       pdevinfo.num_res = count;
+       pdevinfo.acpi_node.handle = adev->handle;
+       pdev = platform_device_register_full(&pdevinfo);
        if (IS_ERR(pdev)) {
                dev_err(&adev->dev, "platform device creation failed: %ld\n",
                        PTR_ERR(pdev));
@@ -94,65 +102,3 @@ struct platform_device *acpi_create_platform_device(struct acpi_device *adev)
        kfree(resources);
        return pdev;
 }
-
-static acpi_status acpi_platform_match(acpi_handle handle, u32 depth,
-                                      void *data, void **return_value)
-{
-       struct platform_device *pdev = data;
-       struct acpi_device *adev;
-       acpi_status status;
-
-       status = acpi_bus_get_device(handle, &adev);
-       if (ACPI_FAILURE(status))
-               return status;
-
-       /* Skip ACPI devices that have physical device attached */
-       if (adev->physical_node_count)
-               return AE_OK;
-
-       if (!strcmp(dev_name(&pdev->dev), dev_name(&adev->dev))) {
-               *(acpi_handle *)return_value = handle;
-               return AE_CTRL_TERMINATE;
-       }
-
-       return AE_OK;
-}
-
-static int acpi_platform_find_device(struct device *dev, acpi_handle *handle)
-{
-       struct platform_device *pdev = to_platform_device(dev);
-       char *name, *tmp, *hid;
-
-       /*
-        * The platform device is named using the ACPI device name
-        * _HID:INSTANCE so we strip the INSTANCE out in order to find the
-        * correct device using its _HID.
-        */
-       name = kstrdup(dev_name(dev), GFP_KERNEL);
-       if (!name)
-               return -ENOMEM;
-
-       tmp = name;
-       hid = strsep(&tmp, ":");
-       if (!hid) {
-               kfree(name);
-               return -ENODEV;
-       }
-
-       *handle = NULL;
-       acpi_get_devices(hid, acpi_platform_match, pdev, handle);
-
-       kfree(name);
-       return *handle ? 0 : -ENODEV;
-}
-
-static struct acpi_bus_type acpi_platform_bus = {
-       .bus = &platform_bus_type,
-       .find_device = acpi_platform_find_device,
-};
-
-static int __init acpi_platform_init(void)
-{
-       return register_acpi_bus_type(&acpi_platform_bus);
-}
-arch_initcall(acpi_platform_init);