|
@@ -764,6 +764,51 @@ pci_enable_device_bars(struct pci_dev *dev, int bars)
|
|
|
return err;
|
|
|
}
|
|
|
|
|
|
+static int __pci_enable_device_flags(struct pci_dev *dev,
|
|
|
+ resource_size_t flags)
|
|
|
+{
|
|
|
+ int err;
|
|
|
+ int i, bars = 0;
|
|
|
+
|
|
|
+ if (atomic_add_return(1, &dev->enable_cnt) > 1)
|
|
|
+ return 0; /* already enabled */
|
|
|
+
|
|
|
+ for (i = 0; i < DEVICE_COUNT_RESOURCE; i++)
|
|
|
+ if (dev->resource[i].flags & flags)
|
|
|
+ bars |= (1 << i);
|
|
|
+
|
|
|
+ err = do_pci_enable_device(dev, bars);
|
|
|
+ if (err < 0)
|
|
|
+ atomic_dec(&dev->enable_cnt);
|
|
|
+ return err;
|
|
|
+}
|
|
|
+
|
|
|
+/**
|
|
|
+ * pci_enable_device_io - Initialize a device for use with IO space
|
|
|
+ * @dev: PCI device to be initialized
|
|
|
+ *
|
|
|
+ * Initialize device before it's used by a driver. Ask low-level code
|
|
|
+ * to enable I/O resources. Wake up the device if it was suspended.
|
|
|
+ * Beware, this function can fail.
|
|
|
+ */
|
|
|
+int pci_enable_device_io(struct pci_dev *dev)
|
|
|
+{
|
|
|
+ return __pci_enable_device_flags(dev, IORESOURCE_IO);
|
|
|
+}
|
|
|
+
|
|
|
+/**
|
|
|
+ * pci_enable_device_mem - Initialize a device for use with Memory space
|
|
|
+ * @dev: PCI device to be initialized
|
|
|
+ *
|
|
|
+ * Initialize device before it's used by a driver. Ask low-level code
|
|
|
+ * to enable Memory resources. Wake up the device if it was suspended.
|
|
|
+ * Beware, this function can fail.
|
|
|
+ */
|
|
|
+int pci_enable_device_mem(struct pci_dev *dev)
|
|
|
+{
|
|
|
+ return __pci_enable_device_flags(dev, IORESOURCE_MEM);
|
|
|
+}
|
|
|
+
|
|
|
/**
|
|
|
* pci_enable_device - Initialize device before it's used by a driver.
|
|
|
* @dev: PCI device to be initialized
|
|
@@ -777,7 +822,7 @@ pci_enable_device_bars(struct pci_dev *dev, int bars)
|
|
|
*/
|
|
|
int pci_enable_device(struct pci_dev *dev)
|
|
|
{
|
|
|
- return pci_enable_device_bars(dev, (1 << PCI_NUM_RESOURCES) - 1);
|
|
|
+ return __pci_enable_device_flags(dev, IORESOURCE_MEM | IORESOURCE_IO);
|
|
|
}
|
|
|
|
|
|
/*
|
|
@@ -1651,6 +1696,8 @@ device_initcall(pci_init);
|
|
|
|
|
|
EXPORT_SYMBOL(pci_reenable_device);
|
|
|
EXPORT_SYMBOL(pci_enable_device_bars);
|
|
|
+EXPORT_SYMBOL(pci_enable_device_io);
|
|
|
+EXPORT_SYMBOL(pci_enable_device_mem);
|
|
|
EXPORT_SYMBOL(pci_enable_device);
|
|
|
EXPORT_SYMBOL(pcim_enable_device);
|
|
|
EXPORT_SYMBOL(pcim_pin_device);
|