Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 336619
b: refs/heads/master
c: b4b6cae
h: refs/heads/master
i:
  336617: 60d8251
  336615: 65ed381
v: v3
  • Loading branch information
Mika Westerberg authored and Rafael J. Wysocki committed Nov 14, 2012
1 parent 064118a commit 0b1d33a
Show file tree
Hide file tree
Showing 2 changed files with 23 additions and 41 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: 91e5687805885f9fceb60b95e950a3d3bdcf4764
refs/heads/master: b4b6cae2f36d92b31788f10816709d5290a1119a
62 changes: 22 additions & 40 deletions trunk/drivers/acpi/acpi_platform.c
Original file line number Diff line number Diff line change
Expand Up @@ -120,25 +120,6 @@ static acpi_status acpi_platform_add_resources(struct acpi_resource *res,
return AE_OK;
}

static acpi_status acpi_platform_get_device_uid(struct acpi_device *adev,
int *uid)
{
struct acpi_device_info *info;
acpi_status status;

status = acpi_get_object_info(adev->handle, &info);
if (ACPI_FAILURE(status))
return status;

status = AE_NOT_EXIST;
if ((info->valid & ACPI_VALID_UID) &&
!kstrtoint(info->unique_id.string, 0, uid))
status = AE_OK;

kfree(info);
return status;
}

/**
* acpi_create_platform_device - Create platform device for ACPI device node
* @adev: ACPI device node to create a platform device for.
Expand All @@ -156,19 +137,12 @@ struct platform_device *acpi_create_platform_device(struct acpi_device *adev)
struct device *parent = NULL;
struct resource_info ri;
acpi_status status;
int devid;

/* If the ACPI node already has a physical device attached, skip it. */
if (adev->physical_node_count)
return NULL;

/* Use the UID of the device as the new platform device id if found. */
status = acpi_platform_get_device_uid(adev, &devid);
if (ACPI_FAILURE(status))
devid = -1;

memset(&ri, 0, sizeof(ri));

/* First, count the resources. */
status = acpi_walk_resources(adev->handle, METHOD_NAME__CRS,
acpi_platform_count_resources, &ri);
Expand Down Expand Up @@ -214,8 +188,8 @@ struct platform_device *acpi_create_platform_device(struct acpi_device *adev)
}
mutex_unlock(&acpi_parent->physical_node_lock);
}
pdev = platform_device_register_resndata(parent, acpi_device_hid(adev),
devid, ri.res, ri.n, NULL, 0);
pdev = platform_device_register_resndata(parent, dev_name(&adev->dev),
-1, ri.res, ri.n, NULL, 0);
if (IS_ERR(pdev)) {
dev_err(&adev->dev, "platform device creation failed: %ld\n",
PTR_ERR(pdev));
Expand Down Expand Up @@ -245,17 +219,7 @@ static acpi_status acpi_platform_match(acpi_handle handle, u32 depth,
if (adev->physical_node_count)
return AE_OK;

if (!strcmp(pdev->name, acpi_device_hid(adev))) {
int devid;

/* Check that both name and UID match if it exists */
status = acpi_platform_get_device_uid(adev, &devid);
if (ACPI_FAILURE(status))
devid = -1;

if (pdev->id != devid)
return AE_OK;

if (!strcmp(dev_name(&pdev->dev), dev_name(&adev->dev))) {
*(acpi_handle *)return_value = handle;
return AE_CTRL_TERMINATE;
}
Expand All @@ -266,10 +230,28 @@ static acpi_status acpi_platform_match(acpi_handle handle, u32 depth,
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(pdev->name, acpi_platform_match, pdev, handle);
acpi_get_devices(hid, acpi_platform_match, pdev, handle);

kfree(name);
return *handle ? 0 : -ENODEV;
}

Expand Down

0 comments on commit 0b1d33a

Please sign in to comment.