aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/pci/pci.c49
-rw-r--r--include/linux/pci.h2
2 files changed, 50 insertions, 1 deletions
diff --git a/drivers/pci/pci.c b/drivers/pci/pci.c
index 7248e9fb12bd..5027e4d08b48 100644
--- a/drivers/pci/pci.c
+++ b/drivers/pci/pci.c
@@ -764,6 +764,51 @@ pci_enable_device_bars(struct pci_dev *dev, int bars)
764 return err; 764 return err;
765} 765}
766 766
767static int __pci_enable_device_flags(struct pci_dev *dev,
768 resource_size_t flags)
769{
770 int err;
771 int i, bars = 0;
772
773 if (atomic_add_return(1, &dev->enable_cnt) > 1)
774 return 0; /* already enabled */
775
776 for (i = 0; i < DEVICE_COUNT_RESOURCE; i++)
777 if (dev->resource[i].flags & flags)
778 bars |= (1 << i);
779
780 err = do_pci_enable_device(dev, bars);
781 if (err < 0)
782 atomic_dec(&dev->enable_cnt);
783 return err;
784}
785
786/**
787 * pci_enable_device_io - Initialize a device for use with IO space
788 * @dev: PCI device to be initialized
789 *
790 * Initialize device before it's used by a driver. Ask low-level code
791 * to enable I/O resources. Wake up the device if it was suspended.
792 * Beware, this function can fail.
793 */
794int pci_enable_device_io(struct pci_dev *dev)
795{
796 return __pci_enable_device_flags(dev, IORESOURCE_IO);
797}
798
799/**
800 * pci_enable_device_mem - Initialize a device for use with Memory space
801 * @dev: PCI device to be initialized
802 *
803 * Initialize device before it's used by a driver. Ask low-level code
804 * to enable Memory resources. Wake up the device if it was suspended.
805 * Beware, this function can fail.
806 */
807int pci_enable_device_mem(struct pci_dev *dev)
808{
809 return __pci_enable_device_flags(dev, IORESOURCE_MEM);
810}
811
767/** 812/**
768 * pci_enable_device - Initialize device before it's used by a driver. 813 * pci_enable_device - Initialize device before it's used by a driver.
769 * @dev: PCI device to be initialized 814 * @dev: PCI device to be initialized
@@ -777,7 +822,7 @@ pci_enable_device_bars(struct pci_dev *dev, int bars)
777 */ 822 */
778int pci_enable_device(struct pci_dev *dev) 823int pci_enable_device(struct pci_dev *dev)
779{ 824{
780 return pci_enable_device_bars(dev, (1 << PCI_NUM_RESOURCES) - 1); 825 return __pci_enable_device_flags(dev, IORESOURCE_MEM | IORESOURCE_IO);
781} 826}
782 827
783/* 828/*
@@ -1651,6 +1696,8 @@ device_initcall(pci_init);
1651 1696
1652EXPORT_SYMBOL(pci_reenable_device); 1697EXPORT_SYMBOL(pci_reenable_device);
1653EXPORT_SYMBOL(pci_enable_device_bars); 1698EXPORT_SYMBOL(pci_enable_device_bars);
1699EXPORT_SYMBOL(pci_enable_device_io);
1700EXPORT_SYMBOL(pci_enable_device_mem);
1654EXPORT_SYMBOL(pci_enable_device); 1701EXPORT_SYMBOL(pci_enable_device);
1655EXPORT_SYMBOL(pcim_enable_device); 1702EXPORT_SYMBOL(pcim_enable_device);
1656EXPORT_SYMBOL(pcim_pin_device); 1703EXPORT_SYMBOL(pcim_pin_device);
diff --git a/include/linux/pci.h b/include/linux/pci.h
index 4b4d711a5da8..e4c1dacb6636 100644
--- a/include/linux/pci.h
+++ b/include/linux/pci.h
@@ -544,6 +544,8 @@ static inline int pci_write_config_dword(struct pci_dev *dev, int where, u32 val
544 544
545int __must_check pci_enable_device(struct pci_dev *dev); 545int __must_check pci_enable_device(struct pci_dev *dev);
546int __must_check pci_enable_device_bars(struct pci_dev *dev, int mask); 546int __must_check pci_enable_device_bars(struct pci_dev *dev, int mask);
547int __must_check pci_enable_device_io(struct pci_dev *dev);
548int __must_check pci_enable_device_mem(struct pci_dev *dev);
547int __must_check pci_reenable_device(struct pci_dev *); 549int __must_check pci_reenable_device(struct pci_dev *);
548int __must_check pcim_enable_device(struct pci_dev *pdev); 550int __must_check pcim_enable_device(struct pci_dev *pdev);
549void pcim_pin_device(struct pci_dev *pdev); 551void pcim_pin_device(struct pci_dev *pdev);