diff options
Diffstat (limited to 'drivers/pci')
-rw-r--r-- | drivers/pci/pci.c | 49 |
1 files changed, 48 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 | ||
767 | static 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 | */ | ||
794 | int 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 | */ | ||
807 | int 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 | */ |
778 | int pci_enable_device(struct pci_dev *dev) | 823 | int 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 | ||
1652 | EXPORT_SYMBOL(pci_reenable_device); | 1697 | EXPORT_SYMBOL(pci_reenable_device); |
1653 | EXPORT_SYMBOL(pci_enable_device_bars); | 1698 | EXPORT_SYMBOL(pci_enable_device_bars); |
1699 | EXPORT_SYMBOL(pci_enable_device_io); | ||
1700 | EXPORT_SYMBOL(pci_enable_device_mem); | ||
1654 | EXPORT_SYMBOL(pci_enable_device); | 1701 | EXPORT_SYMBOL(pci_enable_device); |
1655 | EXPORT_SYMBOL(pcim_enable_device); | 1702 | EXPORT_SYMBOL(pcim_enable_device); |
1656 | EXPORT_SYMBOL(pcim_pin_device); | 1703 | EXPORT_SYMBOL(pcim_pin_device); |