Exemple #1
0
/* Link dev to all power resources in _PR0 */
int acpi_power_resource_register_device(struct device *dev, acpi_handle handle)
{
	struct acpi_device *acpi_dev;
	struct acpi_handle_list *list;
	struct acpi_power_managed_device *powered_device;
	int i, ret;

	if (!dev || !handle)
		return -ENODEV;

	ret = acpi_bus_get_device(handle, &acpi_dev);
	if (ret || !acpi_dev->power.flags.power_resources)
		return -ENODEV;

	powered_device = kzalloc(sizeof(*powered_device), GFP_KERNEL);
	if (!powered_device)
		return -ENOMEM;

	powered_device->dev = dev;
	powered_device->handle = handle;

	list = &acpi_dev->power.states[ACPI_STATE_D0].resources;

	for (i = 0; i < list->count; i++) {
		ret = __acpi_power_resource_register_device(powered_device,
			list->handles[i]);

		if (ret) {
			acpi_power_resource_unregister_device(dev, handle);
			break;
		}
	}

	return ret;
}
Exemple #2
0
static int acpi_pci_unbind(struct acpi_device *device)
{
	struct pci_dev *dev;

	dev = acpi_get_pci_dev(device->handle);
	if (!dev)
		goto out;

	device_set_run_wake(&dev->dev, false);
	pci_acpi_remove_pm_notifier(device);
	acpi_power_resource_unregister_device(&dev->dev, device->handle);

	if (!dev->subordinate)
		goto out;

	acpi_pci_irq_del_prt(pci_domain_nr(dev->bus), dev->subordinate->number);

	device->ops.bind = NULL;
	device->ops.unbind = NULL;

out:
	pci_dev_put(dev);
	return 0;
}