diff options
Diffstat (limited to 'drivers/acpi/acpi_platform.c')
| -rw-r--r-- | drivers/acpi/acpi_platform.c | 76 | 
1 files changed, 10 insertions, 66 deletions
diff --git a/drivers/acpi/acpi_platform.c b/drivers/acpi/acpi_platform.c index 7ac20d8b8f0..b7df9b197bc 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);  |