diff --git a/drivers/pci/pci.c b/drivers/pci/pci.c index a544997..9743471 100644 --- a/drivers/pci/pci.c +++ b/drivers/pci/pci.c @@ -809,6 +809,40 @@ err_out: return -EBUSY; } +#ifndef ARCH_VALIDATE_PCI_IRQ +int pci_valid_irq(struct pci_dev *pdev) +{ + if (pdev->irq == 0) + return -EINVAL; + + return 0; +} +EXPORT_SYMBOL(pci_valid_irq); +#endif /* ARCH_VALIDATE_PCI_IRQ */ + +int pci_request_irq(struct pci_dev *pdev, + irqreturn_t (*handler)(int, void *, struct pt_regs *), + unsigned long flags, const char *name, void *userdata) +{ + int rc; + + rc = pci_valid_irq(pdev); + if (rc) { + dev_printk(KERN_ERR, &pdev->dev, "invalid irq\n"); + return rc; + } + + return request_irq(pdev->irq, handler, flags | IRQF_SHARED, + name, userdata); +} +EXPORT_SYMBOL(pci_request_irq); + +void pci_release_irq(struct pci_dev *pdev, void *userdata) +{ + free_irq(pdev->irq, userdata); +} +EXPORT_SYMBOL(pci_release_irq); + /** * pci_set_master - enables bus-mastering for device dev * @dev: the PCI device to enable diff --git a/include/linux/pci.h b/include/linux/pci.h index 5c3a417..5e254fc 100644 --- a/include/linux/pci.h +++ b/include/linux/pci.h @@ -52,6 +52,7 @@ #include #include #include #include +#include /* File state for mmap()s on /proc/bus/pci/X/Y */ enum pci_mmap_state { @@ -537,6 +538,12 @@ void pci_release_regions(struct pci_dev int __must_check pci_request_region(struct pci_dev *, int, const char *); void pci_release_region(struct pci_dev *, int); +int __must_check pci_valid_irq(struct pci_dev *pdev); +int __must_check pci_request_irq(struct pci_dev *pdev, + irqreturn_t (*handler)(int, void *, struct pt_regs *), + unsigned long flags, const char *name, void *userdata); +void pci_release_irq(struct pci_dev *pdev, void *userdata); + /* drivers/pci/bus.c */ int __must_check pci_bus_alloc_resource(struct pci_bus *bus, struct resource *res, resource_size_t size,