示例#1
0
文件: core.c 项目: 274914765/C
static int __init pnpacpi_add_device(struct acpi_device *device)
{
    acpi_handle temp = NULL;
    acpi_status status;
    struct pnp_dev *dev;

    status = acpi_get_handle(device->handle, "_CRS", &temp);
    if (ACPI_FAILURE(status) || !ispnpidacpi(acpi_device_hid(device)) ||
        is_exclusive_device(device))
        return 0;

    dev = pnp_alloc_dev(&pnpacpi_protocol, num, acpi_device_hid(device));
    if (!dev)
        return -ENOMEM;

    dev->data = device->handle;
    /* .enabled means the device can decode the resources */
    dev->active = device->status.enabled;
    status = acpi_get_handle(device->handle, "_SRS", &temp);
    if (ACPI_SUCCESS(status))
        dev->capabilities |= PNP_CONFIGURABLE;
    dev->capabilities |= PNP_READ;
    if (device->flags.dynamic_status && (dev->capabilities & PNP_CONFIGURABLE))
        dev->capabilities |= PNP_WRITE;
    if (device->flags.removable)
        dev->capabilities |= PNP_REMOVABLE;
    status = acpi_get_handle(device->handle, "_DIS", &temp);
    if (ACPI_SUCCESS(status))
        dev->capabilities |= PNP_DISABLE;

    if (strlen(acpi_device_name(device)))
        strncpy(dev->name, acpi_device_name(device), sizeof(dev->name));
    else
        strncpy(dev->name, acpi_device_bid(device), sizeof(dev->name));

    if (dev->active)
        pnpacpi_parse_allocated_resource(dev);

    if (dev->capabilities & PNP_CONFIGURABLE)
        pnpacpi_parse_resource_option_data(dev);

    if (device->flags.compatible_ids) {
        struct acpi_compatible_id_list *cid_list = device->pnp.cid_list;
        int i;

        for (i = 0; i < cid_list->count; i++) {
            if (!ispnpidacpi(cid_list->id[i].value))
                continue;
            pnp_add_id(dev, cid_list->id[i].value);
        }
    }

    /* clear out the damaged flags */
    if (!dev->active)
        pnp_init_resources(dev);
    pnp_add_device(dev);
    num++;

    return AE_OK;
}
示例#2
0
int pnpacpi_parse_allocated_resource(struct pnp_dev *dev)
{
	acpi_handle handle = dev->data;
	acpi_status status;

	pnp_dbg(&dev->dev, "parse allocated resources\n");

	pnp_init_resources(dev);

	status = acpi_walk_resources(handle, METHOD_NAME__CRS,
				     pnpacpi_allocated_resource, dev);

	if (ACPI_FAILURE(status)) {
		if (status != AE_NOT_FOUND)
			dev_err(&dev->dev, "can't evaluate _CRS: %d", status);
		return -EPERM;
	}
	return 0;
}