|
@@ -197,30 +197,27 @@ static void acpi_physnode_link_name(char *buf, unsigned int node_id)
|
|
|
|
|
|
int acpi_bind_one(struct device *dev, acpi_handle handle)
|
|
|
{
|
|
|
- struct acpi_device *acpi_dev;
|
|
|
- acpi_status status;
|
|
|
+ struct acpi_device *acpi_dev = NULL;
|
|
|
struct acpi_device_physical_node *physical_node, *pn;
|
|
|
char physical_node_name[PHYSICAL_NODE_NAME_SIZE];
|
|
|
struct list_head *physnode_list;
|
|
|
unsigned int node_id;
|
|
|
int retval = -EINVAL;
|
|
|
|
|
|
- if (ACPI_HANDLE(dev)) {
|
|
|
+ if (ACPI_COMPANION(dev)) {
|
|
|
if (handle) {
|
|
|
- dev_warn(dev, "ACPI handle is already set\n");
|
|
|
+ dev_warn(dev, "ACPI companion already set\n");
|
|
|
return -EINVAL;
|
|
|
} else {
|
|
|
- handle = ACPI_HANDLE(dev);
|
|
|
+ acpi_dev = ACPI_COMPANION(dev);
|
|
|
}
|
|
|
+ } else {
|
|
|
+ acpi_bus_get_device(handle, &acpi_dev);
|
|
|
}
|
|
|
- if (!handle)
|
|
|
+ if (!acpi_dev)
|
|
|
return -EINVAL;
|
|
|
|
|
|
get_device(dev);
|
|
|
- status = acpi_bus_get_device(handle, &acpi_dev);
|
|
|
- if (ACPI_FAILURE(status))
|
|
|
- goto err;
|
|
|
-
|
|
|
physical_node = kzalloc(sizeof(*physical_node), GFP_KERNEL);
|
|
|
if (!physical_node) {
|
|
|
retval = -ENOMEM;
|
|
@@ -242,7 +239,7 @@ int acpi_bind_one(struct device *dev, acpi_handle handle)
|
|
|
|
|
|
dev_warn(dev, "Already associated with ACPI node\n");
|
|
|
kfree(physical_node);
|
|
|
- if (ACPI_HANDLE(dev) != handle)
|
|
|
+ if (ACPI_COMPANION(dev) != acpi_dev)
|
|
|
goto err;
|
|
|
|
|
|
put_device(dev);
|
|
@@ -259,8 +256,8 @@ int acpi_bind_one(struct device *dev, acpi_handle handle)
|
|
|
list_add(&physical_node->node, physnode_list);
|
|
|
acpi_dev->physical_node_count++;
|
|
|
|
|
|
- if (!ACPI_HANDLE(dev))
|
|
|
- ACPI_HANDLE_SET(dev, acpi_dev->handle);
|
|
|
+ if (!ACPI_COMPANION(dev))
|
|
|
+ ACPI_COMPANION_SET(dev, acpi_dev);
|
|
|
|
|
|
acpi_physnode_link_name(physical_node_name, node_id);
|
|
|
retval = sysfs_create_link(&acpi_dev->dev.kobj, &dev->kobj,
|
|
@@ -283,7 +280,7 @@ int acpi_bind_one(struct device *dev, acpi_handle handle)
|
|
|
return 0;
|
|
|
|
|
|
err:
|
|
|
- ACPI_HANDLE_SET(dev, NULL);
|
|
|
+ ACPI_COMPANION_SET(dev, NULL);
|
|
|
put_device(dev);
|
|
|
return retval;
|
|
|
}
|
|
@@ -291,19 +288,12 @@ EXPORT_SYMBOL_GPL(acpi_bind_one);
|
|
|
|
|
|
int acpi_unbind_one(struct device *dev)
|
|
|
{
|
|
|
+ struct acpi_device *acpi_dev = ACPI_COMPANION(dev);
|
|
|
struct acpi_device_physical_node *entry;
|
|
|
- struct acpi_device *acpi_dev;
|
|
|
- acpi_status status;
|
|
|
|
|
|
- if (!ACPI_HANDLE(dev))
|
|
|
+ if (!acpi_dev)
|
|
|
return 0;
|
|
|
|
|
|
- status = acpi_bus_get_device(ACPI_HANDLE(dev), &acpi_dev);
|
|
|
- if (ACPI_FAILURE(status)) {
|
|
|
- dev_err(dev, "Oops, ACPI handle corrupt in %s()\n", __func__);
|
|
|
- return -EINVAL;
|
|
|
- }
|
|
|
-
|
|
|
mutex_lock(&acpi_dev->physical_node_lock);
|
|
|
|
|
|
list_for_each_entry(entry, &acpi_dev->physical_node_list, node)
|
|
@@ -316,7 +306,7 @@ int acpi_unbind_one(struct device *dev)
|
|
|
acpi_physnode_link_name(physnode_name, entry->node_id);
|
|
|
sysfs_remove_link(&acpi_dev->dev.kobj, physnode_name);
|
|
|
sysfs_remove_link(&dev->kobj, "firmware_node");
|
|
|
- ACPI_HANDLE_SET(dev, NULL);
|
|
|
+ ACPI_COMPANION_SET(dev, NULL);
|
|
|
/* acpi_bind_one() increase refcnt by one. */
|
|
|
put_device(dev);
|
|
|
kfree(entry);
|
|
@@ -328,6 +318,15 @@ int acpi_unbind_one(struct device *dev)
|
|
|
}
|
|
|
EXPORT_SYMBOL_GPL(acpi_unbind_one);
|
|
|
|
|
|
+void acpi_preset_companion(struct device *dev, acpi_handle parent, u64 addr)
|
|
|
+{
|
|
|
+ struct acpi_device *adev;
|
|
|
+
|
|
|
+ if (!acpi_bus_get_device(acpi_get_child(parent, addr), &adev))
|
|
|
+ ACPI_COMPANION_SET(dev, adev);
|
|
|
+}
|
|
|
+EXPORT_SYMBOL_GPL(acpi_preset_companion);
|
|
|
+
|
|
|
static int acpi_platform_notify(struct device *dev)
|
|
|
{
|
|
|
struct acpi_bus_type *type = acpi_get_bus_type(dev);
|