acpiphp_let_context_go(context);
 }
 
-/* Check whether the PCI device is managed by native PCIe hotplug driver */
-static bool device_is_managed_by_native_pciehp(struct pci_dev *pdev)
-{
-       acpi_handle tmp;
-       struct acpi_pci_root *root;
-
-       /* Check whether the PCIe port supports native PCIe hotplug */
-       if (!pdev->is_hotplug_bridge)
-               return false;
-
-       /*
-        * Check whether native PCIe hotplug has been enabled for
-        * this PCIe hierarchy.
-        */
-       tmp = acpi_find_root_bridge_handle(pdev);
-       if (!tmp)
-               return false;
-       root = acpi_pci_find_root(tmp);
-       if (!root)
-               return false;
-       if (!(root->osc_control_set & OSC_PCI_EXPRESS_NATIVE_HP_CONTROL))
-               return false;
-
-       return true;
-}
-
 /**
  * acpiphp_add_context - Add ACPIPHP context to an ACPI device object.
  * @handle: ACPI handle of the object to add a context to.
         * expose slots to user space in those cases.
         */
        if ((acpi_pci_check_ejectable(pbus, handle) || is_dock_device(adev))
-           && !(pdev && device_is_managed_by_native_pciehp(pdev))) {
+           && !(pdev && pdev->is_hotplug_bridge && pciehp_is_native(pdev))) {
                unsigned long long sun;
                int retval;
 
 
 }
 EXPORT_SYMBOL_GPL(pci_get_hp_params);
 
+/**
+ * pciehp_is_native - Check whether a hotplug port is handled by the OS
+ * @pdev: Hotplug port to check
+ *
+ * Walk up from @pdev to the host bridge, obtain its cached _OSC Control Field
+ * and return the value of the "PCI Express Native Hot Plug control" bit.
+ * On failure to obtain the _OSC Control Field return %false.
+ */
+bool pciehp_is_native(struct pci_dev *pdev)
+{
+       struct acpi_pci_root *root;
+       acpi_handle handle;
+
+       handle = acpi_find_root_bridge_handle(pdev);
+       if (!handle)
+               return false;
+
+       root = acpi_pci_find_root(handle);
+       if (!root)
+               return false;
+
+       return root->osc_control_set & OSC_PCI_EXPRESS_NATIVE_HP_CONTROL;
+}
+
 /**
  * pci_acpi_wake_bus - Root bus wakeup notification fork function.
  * @work: Work item to handle.
 
 #ifdef CONFIG_ACPI
 #include <linux/acpi.h>
 int pci_get_hp_params(struct pci_dev *dev, struct hotplug_params *hpp);
+bool pciehp_is_native(struct pci_dev *pdev);
 int acpi_get_hp_hw_control_from_firmware(struct pci_dev *dev, u32 flags);
 int acpi_pci_check_ejectable(struct pci_bus *pbus, acpi_handle handle);
 int acpi_pci_detect_ejectable(acpi_handle handle);
 {
        return -ENODEV;
 }
+static inline bool pciehp_is_native(struct pci_dev *pdev) { return true; }
 #endif
 #endif