summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/acpi/acpi_platform.c76
-rw-r--r--drivers/base/platform.c2
-rw-r--r--include/linux/platform_device.h1
3 files changed, 13 insertions, 66 deletions
diff --git a/drivers/acpi/acpi_platform.c b/drivers/acpi/acpi_platform.c
index 7ac20d8b8f07..b7df9b197bcf 100644
--- a/drivers/acpi/acpi_platform.c
+++ b/drivers/acpi/acpi_platform.c
@@ -33,7 +33,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 +60,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 +78,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 +100,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);
diff --git a/drivers/base/platform.c b/drivers/base/platform.c
index 7de29ebfce7f..49fd96e23460 100644
--- a/drivers/base/platform.c
+++ b/drivers/base/platform.c
@@ -437,6 +437,7 @@ struct platform_device *platform_device_register_full(
goto err_alloc;
pdev->dev.parent = pdevinfo->parent;
+ ACPI_HANDLE_SET(&pdev->dev, pdevinfo->acpi_node.handle);
if (pdevinfo->dma_mask) {
/*
@@ -467,6 +468,7 @@ struct platform_device *platform_device_register_full(
ret = platform_device_add(pdev);
if (ret) {
err:
+ ACPI_HANDLE_SET(&pdev->dev, NULL);
kfree(pdev->dev.dma_mask);
err_alloc:
diff --git a/include/linux/platform_device.h b/include/linux/platform_device.h
index 5711e9525a2a..a9ded9a3c175 100644
--- a/include/linux/platform_device.h
+++ b/include/linux/platform_device.h
@@ -55,6 +55,7 @@ extern int platform_add_devices(struct platform_device **, int);
struct platform_device_info {
struct device *parent;
+ struct acpi_dev_node acpi_node;
const char *name;
int id;
OpenPOWER on IntegriCloud