aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/acpi/scan.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/acpi/scan.c')
-rw-r--r--drivers/acpi/scan.c40
1 files changed, 28 insertions, 12 deletions
diff --git a/drivers/acpi/scan.c b/drivers/acpi/scan.c
index 360f1338749b..688b7f7c23dd 100644
--- a/drivers/acpi/scan.c
+++ b/drivers/acpi/scan.c
@@ -1553,26 +1553,42 @@ static acpi_status acpi_bus_check_add(acpi_handle handle, u32 lvl_not_used,
return AE_OK;
}
-static int acpi_scan_attach_handler(struct acpi_device *device)
+static int acpi_scan_do_attach_handler(struct acpi_device *device, char *id)
{
struct acpi_scan_handler *handler;
- int ret = 0;
list_for_each_entry(handler, &acpi_scan_handlers_list, list_node) {
- const struct acpi_device_id *id;
+ const struct acpi_device_id *devid;
- id = __acpi_match_device(device, handler->ids);
- if (!id)
- continue;
+ for (devid = handler->ids; devid->id[0]; devid++) {
+ int ret;
- ret = handler->attach(device, id);
- if (ret > 0) {
- device->handler = handler;
- break;
- } else if (ret < 0) {
- break;
+ if (strcmp((char *)devid->id, id))
+ continue;
+
+ ret = handler->attach(device, devid);
+ if (ret > 0) {
+ device->handler = handler;
+ return ret;
+ } else if (ret < 0) {
+ return ret;
+ }
}
}
+ return 0;
+}
+
+static int acpi_scan_attach_handler(struct acpi_device *device)
+{
+ struct acpi_hardware_id *hwid;
+ int ret = 0;
+
+ list_for_each_entry(hwid, &device->pnp.ids, list) {
+ ret = acpi_scan_do_attach_handler(device, hwid->id);
+ if (ret)
+ break;
+
+ }
return ret;
}