return NOTIFY_DONE;
 }
 
+static void rescan_work_func(struct work_struct *work)
+{
+       struct pci_pwrctl *pwrctl = container_of(work, struct pci_pwrctl, work);
+
+       pci_lock_rescan_remove();
+       pci_rescan_bus(to_pci_dev(pwrctl->dev->parent)->bus);
+       pci_unlock_rescan_remove();
+}
+
+/**
+ * pci_pwrctl_init() - Initialize the PCI power control context struct
+ *
+ * @pwrctl: PCI power control data
+ * @dev: Parent device
+ */
+void pci_pwrctl_init(struct pci_pwrctl *pwrctl, struct device *dev)
+{
+       pwrctl->dev = dev;
+       INIT_WORK(&pwrctl->work, rescan_work_func);
+}
+EXPORT_SYMBOL_GPL(pci_pwrctl_init);
+
 /**
  * pci_pwrctl_device_set_ready() - Notify the pwrctl subsystem that the PCI
  * device is powered-up and ready to be detected.
        if (ret)
                return ret;
 
-       pci_lock_rescan_remove();
-       pci_rescan_bus(to_pci_dev(pwrctl->dev->parent)->bus);
-       pci_unlock_rescan_remove();
+       schedule_work(&pwrctl->work);
 
        return 0;
 }
 
 #define __PCI_PWRCTL_H__
 
 #include <linux/notifier.h>
+#include <linux/workqueue.h>
 
 struct device;
 struct device_link;
        /* Private: don't use. */
        struct notifier_block nb;
        struct device_link *link;
+       struct work_struct work;
 };
 
+void pci_pwrctl_init(struct pci_pwrctl *pwrctl, struct device *dev);
 int pci_pwrctl_device_set_ready(struct pci_pwrctl *pwrctl);
 void pci_pwrctl_device_unset_ready(struct pci_pwrctl *pwrctl);
 int devm_pci_pwrctl_device_set_ready(struct device *dev,