* its remove routine.
         */
        pm_runtime_get_sync(dev);
+       pci_dev->driver = pci_drv;
        rc = pci_drv->probe(pci_dev, ddi->id);
        if (!rc)
                return rc;
        if (rc < 0) {
+               pci_dev->driver = NULL;
                pm_runtime_put_sync(dev);
                return rc;
        }
  * @pci_dev: PCI device being probed
  *
  * returns 0 on success, else error.
+ * side-effect: pci_dev->driver is set to drv when drv claims pci_dev.
  */
 static int __pci_device_probe(struct pci_driver *drv, struct pci_dev *pci_dev)
 {
                pm_runtime_put_noidle(dev);
        }
        pcibios_free_irq(pci_dev);
+       pci_dev->driver = NULL;
        pci_iov_remove(pci_dev);
 
        /* Undo the runtime PM settings in local_pci_probe() */
 
        u16             pcie_flags_reg; /* Cached PCIe Capabilities Register */
        unsigned long   *dma_alias_mask;/* Mask of enabled devfn aliases */
 
+       struct pci_driver *driver;      /* Driver bound to this device */
        u64             dma_mask;       /* Mask of the bits of bus address this
                                           device implements.  Normally this is
                                           0xffffffff.  You only need to change