|
@@ -1536,6 +1536,25 @@ static int acpi_bus_type_and_status(acpi_handle handle, int *type,
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
+static struct acpi_scan_handler *acpi_scan_match_handler(char *idstr,
|
|
|
+ const struct acpi_device_id **matchid)
|
|
|
+{
|
|
|
+ struct acpi_scan_handler *handler;
|
|
|
+
|
|
|
+ list_for_each_entry(handler, &acpi_scan_handlers_list, list_node) {
|
|
|
+ const struct acpi_device_id *devid;
|
|
|
+
|
|
|
+ for (devid = handler->ids; devid->id[0]; devid++)
|
|
|
+ if (!strcmp((char *)devid->id, idstr)) {
|
|
|
+ if (matchid)
|
|
|
+ *matchid = devid;
|
|
|
+
|
|
|
+ return handler;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return NULL;
|
|
|
+}
|
|
|
+
|
|
|
static acpi_status acpi_bus_check_add(acpi_handle handle, u32 lvl_not_used,
|
|
|
void *not_used, void **return_value)
|
|
|
{
|
|
@@ -1583,42 +1602,26 @@ static acpi_status acpi_bus_check_add(acpi_handle handle, u32 lvl_not_used,
|
|
|
return AE_OK;
|
|
|
}
|
|
|
|
|
|
-static int acpi_scan_do_attach_handler(struct acpi_device *device, char *id)
|
|
|
+static int acpi_scan_attach_handler(struct acpi_device *device)
|
|
|
{
|
|
|
- struct acpi_scan_handler *handler;
|
|
|
+ struct acpi_hardware_id *hwid;
|
|
|
+ int ret = 0;
|
|
|
|
|
|
- list_for_each_entry(handler, &acpi_scan_handlers_list, list_node) {
|
|
|
+ list_for_each_entry(hwid, &device->pnp.ids, list) {
|
|
|
const struct acpi_device_id *devid;
|
|
|
+ struct acpi_scan_handler *handler;
|
|
|
|
|
|
- for (devid = handler->ids; devid->id[0]; devid++) {
|
|
|
- int ret;
|
|
|
-
|
|
|
- if (strcmp((char *)devid->id, id))
|
|
|
- continue;
|
|
|
-
|
|
|
+ handler = acpi_scan_match_handler(hwid->id, &devid);
|
|
|
+ if (handler) {
|
|
|
ret = handler->attach(device, devid);
|
|
|
if (ret > 0) {
|
|
|
device->handler = handler;
|
|
|
- return ret;
|
|
|
+ break;
|
|
|
} else if (ret < 0) {
|
|
|
- return ret;
|
|
|
+ break;
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
- 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;
|
|
|
}
|
|
|
|