提交 950334bc 编写于 作者: B Bjorn Helgaas

PCI: Add devm_request_pci_bus_resources()

Several host bridge drivers iterate through the list of bridge windows to
request resources.  Several others don't request the window resources at
all.

Add a devm_request_pci_bus_resources() interface to make it easier for
drivers to request all the window resources.  Export to GPL modules (from
Arnd Bergmann <arnd@arndb.de>).
Signed-off-by: NBjorn Helgaas <bhelgaas@google.com>
上级 1a695a90
...@@ -91,6 +91,35 @@ void pci_bus_remove_resources(struct pci_bus *bus) ...@@ -91,6 +91,35 @@ void pci_bus_remove_resources(struct pci_bus *bus)
} }
} }
int devm_request_pci_bus_resources(struct device *dev,
struct list_head *resources)
{
struct resource_entry *win;
struct resource *parent, *res;
int err;
resource_list_for_each_entry(win, resources) {
res = win->res;
switch (resource_type(res)) {
case IORESOURCE_IO:
parent = &ioport_resource;
break;
case IORESOURCE_MEM:
parent = &iomem_resource;
break;
default:
continue;
}
err = devm_request_resource(dev, parent, res);
if (err)
return err;
}
return 0;
}
EXPORT_SYMBOL_GPL(devm_request_pci_bus_resources);
static struct pci_bus_region pci_32_bit = {0, 0xffffffffULL}; static struct pci_bus_region pci_32_bit = {0, 0xffffffffULL};
#ifdef CONFIG_PCI_BUS_ADDR_T_64BIT #ifdef CONFIG_PCI_BUS_ADDR_T_64BIT
static struct pci_bus_region pci_64_bit = {0, static struct pci_bus_region pci_64_bit = {0,
...@@ -397,4 +426,3 @@ void pci_bus_put(struct pci_bus *bus) ...@@ -397,4 +426,3 @@ void pci_bus_put(struct pci_bus *bus)
put_device(&bus->dev); put_device(&bus->dev);
} }
EXPORT_SYMBOL(pci_bus_put); EXPORT_SYMBOL(pci_bus_put);
...@@ -1143,9 +1143,12 @@ void pci_add_resource(struct list_head *resources, struct resource *res); ...@@ -1143,9 +1143,12 @@ void pci_add_resource(struct list_head *resources, struct resource *res);
void pci_add_resource_offset(struct list_head *resources, struct resource *res, void pci_add_resource_offset(struct list_head *resources, struct resource *res,
resource_size_t offset); resource_size_t offset);
void pci_free_resource_list(struct list_head *resources); void pci_free_resource_list(struct list_head *resources);
void pci_bus_add_resource(struct pci_bus *bus, struct resource *res, unsigned int flags); void pci_bus_add_resource(struct pci_bus *bus, struct resource *res,
unsigned int flags);
struct resource *pci_bus_resource_n(const struct pci_bus *bus, int n); struct resource *pci_bus_resource_n(const struct pci_bus *bus, int n);
void pci_bus_remove_resources(struct pci_bus *bus); void pci_bus_remove_resources(struct pci_bus *bus);
int devm_request_pci_bus_resources(struct device *dev,
struct list_head *resources);
#define pci_bus_for_each_resource(bus, res, i) \ #define pci_bus_for_each_resource(bus, res, i) \
for (i = 0; \ for (i = 0; \
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册