Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 336626
b: refs/heads/master
c: 863f9f3
h: refs/heads/master
v: v3
  • Loading branch information
Rafael J. Wysocki committed Nov 20, 2012
1 parent 5e68dc1 commit 3254b8c
Show file tree
Hide file tree
Showing 4 changed files with 14 additions and 67 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 95f8a082b9b1ead0c2859f2a7b1ac91ff63d8765
refs/heads/master: 863f9f30e6c1e30cb19a0cd17c5cf8879257dfd7
76 changes: 10 additions & 66 deletions trunk/drivers/acpi/acpi_platform.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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;
Expand All @@ -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));
Expand All @@ -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);
2 changes: 2 additions & 0 deletions trunk/drivers/base/platform.c
Original file line number Diff line number Diff line change
Expand Up @@ -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) {
/*
Expand Down Expand Up @@ -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:
Expand Down
1 change: 1 addition & 0 deletions trunk/include/linux/platform_device.h
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down

0 comments on commit 3254b8c

Please sign in to comment.