Skip to content

Commit

Permalink
ACPI / scan: Introduce acpi_scan_match_handler()
Browse files Browse the repository at this point in the history
Introduce helper routine acpi_scan_match_handler() that will find the
ACPI scan handler matching a given device ID, if there is one, and
rework acpi_scan_attach_handler() to use the new routine (that
routine will also be useful for other purposes going forward).

Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
Acked-by: Yasuaki Ishimatsu <isimatu.yasuaki@jp.fujitsu.com>
Acked-by: Toshi Kani <toshi.kani@hp.com>
Tested-by: Toshi Kani <toshi.kani@hp.com>
  • Loading branch information
Rafael J. Wysocki committed Mar 4, 2013
1 parent 6dbe51c commit c569807
Showing 1 changed file with 28 additions and 25 deletions.
53 changes: 28 additions & 25 deletions drivers/acpi/scan.c
Original file line number Diff line number Diff line change
Expand Up @@ -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)
{
Expand Down Expand Up @@ -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;
}

Expand Down

0 comments on commit c569807

Please sign in to comment.