diff options
Diffstat (limited to 'drivers/pci/pci-driver.c')
| -rw-r--r-- | drivers/pci/pci-driver.c | 26 | 
1 files changed, 20 insertions, 6 deletions
| diff --git a/drivers/pci/pci-driver.c b/drivers/pci/pci-driver.c index 3cb2210de553..52a880ca1768 100644 --- a/drivers/pci/pci-driver.c +++ b/drivers/pci/pci-driver.c @@ -388,18 +388,31 @@ static int __pci_device_probe(struct pci_driver *drv, struct pci_dev *pci_dev)  	return error;  } +int __weak pcibios_alloc_irq(struct pci_dev *dev) +{ +	return 0; +} + +void __weak pcibios_free_irq(struct pci_dev *dev) +{ +} +  static int pci_device_probe(struct device *dev)  { -	int error = 0; -	struct pci_driver *drv; -	struct pci_dev *pci_dev; +	int error; +	struct pci_dev *pci_dev = to_pci_dev(dev); +	struct pci_driver *drv = to_pci_driver(dev->driver); + +	error = pcibios_alloc_irq(pci_dev); +	if (error < 0) +		return error; -	drv = to_pci_driver(dev->driver); -	pci_dev = to_pci_dev(dev);  	pci_dev_get(pci_dev);  	error = __pci_device_probe(drv, pci_dev); -	if (error) +	if (error) { +		pcibios_free_irq(pci_dev);  		pci_dev_put(pci_dev); +	}  	return error;  } @@ -415,6 +428,7 @@ static int pci_device_remove(struct device *dev)  			drv->remove(pci_dev);  			pm_runtime_put_noidle(dev);  		} +		pcibios_free_irq(pci_dev);  		pci_dev->driver = NULL;  	} | 
