Commit 0fc300b0 authored by Rafael J. Wysocki's avatar Rafael J. Wysocki

ACPI: Make acpi_bus_add() and acpi_bus_start() visibly different

The current ACPI namespace scanning code suggests that acpi_bus_add()
and acpi_bus_start() share some code.  In fact, however, they are
completely different code paths (except for the initial checks), so
refactor the code to make that distinction visibly clear.
Signed-off-by: default avatarRafael J. Wysocki <rafael.j.wysocki@intel.com>
Acked-by: default avatarYinghai Lu <yinghai@kernel.org>
Acked-by: default avatarToshi Kani <toshi.kani@hp.com>
parent 92ef2a25
...@@ -1623,10 +1623,9 @@ static acpi_status acpi_bus_check_add(acpi_handle handle, u32 lvl, ...@@ -1623,10 +1623,9 @@ static acpi_status acpi_bus_check_add(acpi_handle handle, u32 lvl,
return AE_OK; return AE_OK;
} }
static acpi_status acpi_bus_probe_start(acpi_handle handle, u32 lvl, static acpi_status acpi_bus_device_attach(acpi_handle handle, u32 lvl_not_used,
void *context, void **not_used) void *not_used, void **ret_not_used)
{ {
struct acpi_bus_ops *ops = context;
acpi_status status = AE_OK; acpi_status status = AE_OK;
struct acpi_device *device; struct acpi_device *device;
unsigned long long sta_not_used; unsigned long long sta_not_used;
...@@ -1642,17 +1641,12 @@ static acpi_status acpi_bus_probe_start(acpi_handle handle, u32 lvl, ...@@ -1642,17 +1641,12 @@ static acpi_status acpi_bus_probe_start(acpi_handle handle, u32 lvl,
if (acpi_bus_get_device(handle, &device)) if (acpi_bus_get_device(handle, &device))
return AE_CTRL_DEPTH; return AE_CTRL_DEPTH;
if (ops->acpi_op_add) {
if (!acpi_match_device_ids(device, acpi_platform_device_ids)) { if (!acpi_match_device_ids(device, acpi_platform_device_ids)) {
/* This is a known good platform device. */ /* This is a known good platform device. */
acpi_create_platform_device(device); acpi_create_platform_device(device);
} else if (device_attach(&device->dev)) { } else if (device_attach(&device->dev)) {
status = AE_CTRL_DEPTH; status = AE_CTRL_DEPTH;
} }
} else if (ops->acpi_op_start) {
if (ACPI_FAILURE(acpi_start_single_object(device)))
status = AE_CTRL_DEPTH;
}
return status; return status;
} }
...@@ -1672,10 +1666,10 @@ static int acpi_bus_scan(acpi_handle handle, struct acpi_bus_ops *ops, ...@@ -1672,10 +1666,10 @@ static int acpi_bus_scan(acpi_handle handle, struct acpi_bus_ops *ops,
goto out; goto out;
ret = 0; ret = 0;
status = acpi_bus_probe_start(handle, 0, ops, NULL); status = acpi_bus_device_attach(handle, 0, NULL, NULL);
if (ACPI_SUCCESS(status)) if (ACPI_SUCCESS(status))
acpi_walk_namespace(ACPI_TYPE_ANY, handle, ACPI_UINT32_MAX, acpi_walk_namespace(ACPI_TYPE_ANY, handle, ACPI_UINT32_MAX,
acpi_bus_probe_start, NULL, ops, NULL); acpi_bus_device_attach, NULL, NULL, NULL);
out: out:
if (child) if (child)
...@@ -1700,31 +1694,44 @@ int ...@@ -1700,31 +1694,44 @@ int
acpi_bus_add(struct acpi_device **child, acpi_bus_add(struct acpi_device **child,
struct acpi_device *parent, acpi_handle handle, int type) struct acpi_device *parent, acpi_handle handle, int type)
{ {
struct acpi_bus_ops ops; struct acpi_bus_ops ops = { .acpi_op_add = 1, };
memset(&ops, 0, sizeof(ops));
ops.acpi_op_add = 1;
return acpi_bus_scan(handle, &ops, child); return acpi_bus_scan(handle, &ops, child);
} }
EXPORT_SYMBOL(acpi_bus_add); EXPORT_SYMBOL(acpi_bus_add);
int acpi_bus_start(struct acpi_device *device) static acpi_status acpi_bus_start_device(acpi_handle handle, u32 lvl,
void *not_used, void **ret_not_used)
{ {
struct acpi_bus_ops ops; struct acpi_device *device;
int result; unsigned long long sta_not_used;
int type_not_used;
/*
* Ignore errors ignored by acpi_bus_check_add() to avoid terminating
* namespace walks prematurely.
*/
if (acpi_bus_type_and_status(handle, &type_not_used, &sta_not_used))
return AE_OK;
if (acpi_bus_get_device(handle, &device))
return AE_CTRL_DEPTH;
return acpi_start_single_object(device);
}
int acpi_bus_start(struct acpi_device *device)
{
if (!device) if (!device)
return -EINVAL; return -EINVAL;
memset(&ops, 0, sizeof(ops)); if (ACPI_SUCCESS(acpi_start_single_object(device)))
ops.acpi_op_start = 1; acpi_walk_namespace(ACPI_TYPE_ANY, device->handle,
ACPI_UINT32_MAX, acpi_bus_start_device,
result = acpi_bus_scan(device->handle, &ops, NULL); NULL, NULL, NULL);
acpi_update_all_gpes(); acpi_update_all_gpes();
return 0;
return result;
} }
EXPORT_SYMBOL(acpi_bus_start); EXPORT_SYMBOL(acpi_bus_start);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment