static void pci_stop_dev(struct pci_dev *dev) { pci_pme_active(dev, false); if (pci_dev_is_added(dev)) { device_release_driver(&dev->dev); pci_proc_detach_device(dev); pci_remove_sysfs_dev_files(dev); pci_dev_assign_added(dev, false); } if (dev->bus->self) pcie_aspm_exit_link_state(dev); }
static bool acpi_pci_bridge_d3(struct pci_dev *dev) { const struct fwnode_handle *fwnode; struct acpi_device *adev; struct pci_dev *root; u8 val; if (!dev->is_hotplug_bridge) return false; /* * Look for a special _DSD property for the root port and if it * is set we know the hierarchy behind it supports D3 just fine. */ root = pci_find_pcie_root_port(dev); if (!root) return false; adev = ACPI_COMPANION(&root->dev); if (root == dev) { /* * It is possible that the ACPI companion is not yet bound * for the root port so look it up manually here. */ if (!adev && !pci_dev_is_added(root)) adev = acpi_pci_find_companion(&root->dev); } if (!adev) return false; fwnode = acpi_fwnode_handle(adev); if (fwnode_property_read_u8(fwnode, "HotPlugSupportInD3", &val)) return false; return val == 1; }