diff options
-rw-r--r-- | drivers/pci/pci.c | 49 | ||||
-rw-r--r-- | include/linux/pci.h | 2 |
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 | ||
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); |
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 | ||
545 | int __must_check pci_enable_device(struct pci_dev *dev); | 545 | int __must_check pci_enable_device(struct pci_dev *dev); |
546 | int __must_check pci_enable_device_bars(struct pci_dev *dev, int mask); | 546 | int __must_check pci_enable_device_bars(struct pci_dev *dev, int mask); |
547 | int __must_check pci_enable_device_io(struct pci_dev *dev); | ||
548 | int __must_check pci_enable_device_mem(struct pci_dev *dev); | ||
547 | int __must_check pci_reenable_device(struct pci_dev *); | 549 | int __must_check pci_reenable_device(struct pci_dev *); |
548 | int __must_check pcim_enable_device(struct pci_dev *pdev); | 550 | int __must_check pcim_enable_device(struct pci_dev *pdev); |
549 | void pcim_pin_device(struct pci_dev *pdev); | 551 | void pcim_pin_device(struct pci_dev *pdev); |