/* 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; }
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; }