summaryrefslogtreecommitdiff
path: root/drivers
diff options
context:
space:
mode:
Diffstat (limited to 'drivers')
-rw-r--r--drivers/eisa/pci_eisa.c4
-rw-r--r--drivers/pci/bus.c50
-rw-r--r--drivers/pci/hotplug/shpchp_sysfs.c15
-rw-r--r--drivers/pci/pci.c6
-rw-r--r--drivers/pci/probe.c35
-rw-r--r--drivers/pci/setup-bus.c111
-rw-r--r--drivers/pcmcia/rsrc_nonstatic.c7
-rw-r--r--drivers/pcmcia/yenta_socket.c7
8 files changed, 93 insertions, 142 deletions
diff --git a/drivers/eisa/pci_eisa.c b/drivers/eisa/pci_eisa.c
index 562eaa4464d7..0dd0f633b18d 100644
--- a/drivers/eisa/pci_eisa.c
+++ b/drivers/eisa/pci_eisa.c
@@ -31,8 +31,8 @@ static int __init pci_eisa_init(struct pci_dev *pdev,
}
pci_eisa_root.dev = &pdev->dev;
- pci_eisa_root.res = &pdev->resource[PCI_BRIDGE_RESOURCES + 0];
- pci_eisa_root.bus_base_addr = pdev->resource[PCI_BRIDGE_RESOURCES + 0].start;
+ pci_eisa_root.res = pdev->bus->resource[0];
+ pci_eisa_root.bus_base_addr = pdev->bus->resource[0]->start;
pci_eisa_root.slots = EISA_MAX_SLOTS;
pci_eisa_root.dma_mask = pdev->dma_mask;
dev_set_drvdata(pci_eisa_root.dev, &pci_eisa_root);
diff --git a/drivers/pci/bus.c b/drivers/pci/bus.c
index 27bd0e395fe3..4688eaddae6b 100644
--- a/drivers/pci/bus.c
+++ b/drivers/pci/bus.c
@@ -17,49 +17,6 @@
#include "pci.h"
-void pci_bus_add_resource(struct pci_bus *bus, struct resource *res,
- unsigned int flags)
-{
- struct pci_bus_resource *bus_res;
-
- bus_res = kzalloc(sizeof(struct pci_bus_resource), GFP_KERNEL);
- if (!bus_res) {
- dev_err(&bus->dev, "can't add %pR resource\n", res);
- return;
- }
-
- bus_res->res = res;
- bus_res->flags = flags;
- list_add_tail(&bus_res->list, &bus->resources);
-}
-
-struct resource *pci_bus_get_resource(struct pci_bus *bus, unsigned long flags,
- int num)
-{
- struct pci_bus_resource *bus_res;
- struct resource *res;
-
- list_for_each_entry(bus_res, &bus->resources, list) {
- if (!(bus_res->flags & PCI_POSITIVE_DECODE))
- continue;
-
- res = bus_res->res;
- if (((res->flags & flags) == flags) && num-- == 0)
- return res;
- }
- return NULL;
-}
-
-void pci_bus_remove_resources(struct pci_bus *bus)
-{
- struct pci_bus_resource *bus_res, *tmp;
-
- list_for_each_entry_safe(bus_res, tmp, &bus->resources, list) {
- list_del(&bus_res->list);
- kfree(bus_res);
- }
-}
-
/**
* pci_bus_alloc_resource - allocate a resource from a parent bus
* @bus: PCI bus
@@ -85,8 +42,7 @@ pci_bus_alloc_resource(struct pci_bus *bus, struct resource *res,
resource_size_t),
void *alignf_data)
{
- int ret = -ENOMEM;
- struct pci_bus_resource *bus_res;
+ int i, ret = -ENOMEM;
resource_size_t max = -1;
type_mask |= IORESOURCE_IO | IORESOURCE_MEM;
@@ -95,8 +51,8 @@ pci_bus_alloc_resource(struct pci_bus *bus, struct resource *res,
if (!(res->flags & IORESOURCE_MEM_64))
max = PCIBIOS_MAX_MEM_32;
- list_for_each_entry(bus_res, &bus->resources, list) {
- struct resource *r = bus_res->res;
+ for (i = 0; i < PCI_BUS_NUM_RESOURCES; i++) {
+ struct resource *r = bus->resource[i];
if (!r)
continue;
diff --git a/drivers/pci/hotplug/shpchp_sysfs.c b/drivers/pci/hotplug/shpchp_sysfs.c
index e1a9d6ab8395..29fa9d26adae 100644
--- a/drivers/pci/hotplug/shpchp_sysfs.c
+++ b/drivers/pci/hotplug/shpchp_sysfs.c
@@ -39,17 +39,16 @@ static ssize_t show_ctrl (struct device *dev, struct device_attribute *attr, cha
{
struct pci_dev *pdev;
char * out = buf;
- int busnr;
+ int index, busnr;
struct resource *res;
struct pci_bus *bus;
- struct pci_bus_resource *bus_res;
pdev = container_of (dev, struct pci_dev, dev);
bus = pdev->subordinate;
out += sprintf(buf, "Free resources: memory\n");
- list_for_each_entry(bus_res, &bus->resources, list) {
- res = bus_res->res;
+ for (index = 0; index < PCI_BUS_NUM_RESOURCES; index++) {
+ res = bus->resource[index];
if (res && (res->flags & IORESOURCE_MEM) &&
!(res->flags & IORESOURCE_PREFETCH)) {
out += sprintf(out, "start = %8.8llx, "
@@ -59,8 +58,8 @@ static ssize_t show_ctrl (struct device *dev, struct device_attribute *attr, cha
}
}
out += sprintf(out, "Free resources: prefetchable memory\n");
- list_for_each_entry(bus_res, &bus->resources, list) {
- res = bus_res->res;
+ for (index = 0; index < PCI_BUS_NUM_RESOURCES; index++) {
+ res = bus->resource[index];
if (res && (res->flags & IORESOURCE_MEM) &&
(res->flags & IORESOURCE_PREFETCH)) {
out += sprintf(out, "start = %8.8llx, "
@@ -70,8 +69,8 @@ static ssize_t show_ctrl (struct device *dev, struct device_attribute *attr, cha
}
}
out += sprintf(out, "Free resources: IO\n");
- list_for_each_entry(bus_res, &bus->resources, list) {
- res = bus_res->res;
+ for (index = 0; index < PCI_BUS_NUM_RESOURCES; index++) {
+ res = bus->resource[index];
if (res && (res->flags & IORESOURCE_IO)) {
out += sprintf(out, "start = %8.8llx, "
"length = %8.8llx\n",
diff --git a/drivers/pci/pci.c b/drivers/pci/pci.c
index 29a798e72e64..c1accd36a6c6 100644
--- a/drivers/pci/pci.c
+++ b/drivers/pci/pci.c
@@ -385,11 +385,11 @@ struct resource *
pci_find_parent_resource(const struct pci_dev *dev, struct resource *res)
{
const struct pci_bus *bus = dev->bus;
- struct pci_bus_resource *bus_res;
+ int i;
struct resource *best = NULL;
- list_for_each_entry(bus_res, &bus->resources, list) {
- struct resource *r = bus_res->res;
+ for(i = 0; i < PCI_BUS_NUM_RESOURCES; i++) {
+ struct resource *r = bus->resource[i];
if (!r)
continue;
if (res->start && !(res->start >= r->start && res->end <= r->end))
diff --git a/drivers/pci/probe.c b/drivers/pci/probe.c
index dd6e4ac93e46..c01adeb123b7 100644
--- a/drivers/pci/probe.c
+++ b/drivers/pci/probe.c
@@ -89,7 +89,6 @@ static void release_pcibus_dev(struct device *dev)
if (pci_bus->bridge)
put_device(pci_bus->bridge);
- pci_bus_remove_resources(pci_bus);
kfree(pci_bus);
}
@@ -289,8 +288,7 @@ static void __devinit pci_read_bridge_io(struct pci_bus *child)
unsigned long base, limit;
struct resource *res;
- res = &dev->resource[PCI_BRIDGE_RESOURCES + 0];
-
+ res = child->resource[0];
pci_read_config_byte(dev, PCI_IO_BASE, &io_base_lo);
pci_read_config_byte(dev, PCI_IO_LIMIT, &io_limit_lo);
base = (io_base_lo & PCI_IO_RANGE_MASK) << 8;
@@ -325,8 +323,7 @@ static void __devinit pci_read_bridge_mmio(struct pci_bus *child)
unsigned long base, limit;
struct resource *res;
- res = &dev->resource[PCI_BRIDGE_RESOURCES + 1];
-
+ res = child->resource[1];
pci_read_config_word(dev, PCI_MEMORY_BASE, &mem_base_lo);
pci_read_config_word(dev, PCI_MEMORY_LIMIT, &mem_limit_lo);
base = (mem_base_lo & PCI_MEMORY_RANGE_MASK) << 16;
@@ -350,8 +347,7 @@ static void __devinit pci_read_bridge_mmio_pref(struct pci_bus *child)
unsigned long base, limit;
struct resource *res;
- res = &dev->resource[PCI_BRIDGE_RESOURCES + 2];
-
+ res = child->resource[2];
pci_read_config_word(dev, PCI_PREF_MEMORY_BASE, &mem_base_lo);
pci_read_config_word(dev, PCI_PREF_MEMORY_LIMIT, &mem_limit_lo);
base = (mem_base_lo & PCI_PREF_RANGE_MASK) << 16;
@@ -398,7 +394,7 @@ static void __devinit pci_read_bridge_mmio_pref(struct pci_bus *child)
void __devinit pci_read_bridge_bases(struct pci_bus *child)
{
struct pci_dev *dev = child->self;
- struct pci_bus_resource *bus_res;
+ int i;
if (pci_is_root_bus(child)) /* It's a host bus, nothing to read */
return;
@@ -412,11 +408,12 @@ void __devinit pci_read_bridge_bases(struct pci_bus *child)
pci_read_bridge_mmio_pref(child);
if (dev->transparent) {
- list_for_each_entry(bus_res, &child->parent->resources, list) {
- pci_bus_add_resource(child, bus_res->res, 0);
- dev_printk(KERN_DEBUG, &dev->dev,
- " bridge window %pR (subtractive decode)\n",
- bus_res->res);
+ for (i = 3; i < PCI_BUS_NUM_RESOURCES; i++) {
+ child->resource[i] = child->parent->resource[i - 3];
+ if (child->resource[i])
+ dev_printk(KERN_DEBUG, &dev->dev,
+ " bridge window %pR (subtractive decode)\n",
+ child->resource[i]);
}
}
}
@@ -431,7 +428,6 @@ static struct pci_bus * pci_alloc_bus(void)
INIT_LIST_HEAD(&b->children);
INIT_LIST_HEAD(&b->devices);
INIT_LIST_HEAD(&b->slots);
- INIT_LIST_HEAD(&b->resources);
b->max_bus_speed = PCI_SPEED_UNKNOWN;
b->cur_bus_speed = PCI_SPEED_UNKNOWN;
}
@@ -577,7 +573,6 @@ static struct pci_bus *pci_alloc_child_bus(struct pci_bus *parent,
{
struct pci_bus *child;
int i;
- struct resource *res;
/*
* Allocate a new bus, and inherit stuff from the parent..
@@ -616,11 +611,9 @@ static struct pci_bus *pci_alloc_child_bus(struct pci_bus *parent,
/* Set up default resource pointers and names.. */
for (i = 0; i < PCI_BRIDGE_RESOURCE_NUM; i++) {
- res = &bridge->resource[PCI_BRIDGE_RESOURCES + i];
- res->name = child->name;
- pci_bus_add_resource(child, res, PCI_POSITIVE_DECODE);
+ child->resource[i] = &bridge->resource[PCI_BRIDGE_RESOURCES+i];
+ child->resource[i]->name = child->name;
}
-
bridge->subordinate = child;
return child;
@@ -1453,8 +1446,8 @@ struct pci_bus * pci_create_bus(struct device *parent,
pci_create_legacy_files(b);
b->number = b->secondary = bus;
- pci_bus_add_resource(b, &ioport_resource, 0);
- pci_bus_add_resource(b, &iomem_resource, 0);
+ b->resource[0] = &ioport_resource;
+ b->resource[1] = &iomem_resource;
return b;
diff --git a/drivers/pci/setup-bus.c b/drivers/pci/setup-bus.c
index 8a3b512cc3e5..743ed8c48b9c 100644
--- a/drivers/pci/setup-bus.c
+++ b/drivers/pci/setup-bus.c
@@ -138,53 +138,58 @@ static void pbus_assign_resources_sorted(const struct pci_bus *bus,
__assign_resources_sorted(&head, fail_head);
}
-static void pci_setup_cardbus_window(struct pci_dev *bridge, char *type, int n,
- struct resource *res, int base_reg, int limit_reg)
+void pci_setup_cardbus(struct pci_bus *bus)
{
+ struct pci_dev *bridge = bus->self;
+ struct resource *res;
struct pci_bus_region region;
- u32 base, limit;
- if (!res) {
+ dev_info(&bridge->dev, "CardBus bridge to [bus %02x-%02x]\n",
+ bus->secondary, bus->subordinate);
+
+ res = bus->resource[0];
+ pcibios_resource_to_bus(bridge, &region, res);
+ if (res->flags & IORESOURCE_IO) {
/*
- * Maybe we should disable the window, but the previous
- * code left it alone.
+ * The IO resource is allocated a range twice as large as it
+ * would normally need. This allows us to set both IO regs.
*/
- pci_read_config_dword(bridge, base_reg, &base);
- pci_read_config_dword(bridge, limit_reg, &limit);
- dev_info(&bridge->dev, " no %s%d resource, leaving bridge programmed with base %#08x limit %#08x\n",
- type, n, base, limit);
- return;
+ dev_info(&bridge->dev, " bridge window %pR\n", res);
+ pci_write_config_dword(bridge, PCI_CB_IO_BASE_0,
+ region.start);
+ pci_write_config_dword(bridge, PCI_CB_IO_LIMIT_0,
+ region.end);
}
+ res = bus->resource[1];
pcibios_resource_to_bus(bridge, &region, res);
- pci_write_config_dword(bridge, base_reg, region.start);
- pci_write_config_dword(bridge, limit_reg, region.end);
- dev_info(&bridge->dev, " bridge window %pR\n", res);
-}
-
-void pci_setup_cardbus(struct pci_bus *bus)
-{
- struct pci_dev *bridge = bus->self;
+ if (res->flags & IORESOURCE_IO) {
+ dev_info(&bridge->dev, " bridge window %pR\n", res);
+ pci_write_config_dword(bridge, PCI_CB_IO_BASE_1,
+ region.start);
+ pci_write_config_dword(bridge, PCI_CB_IO_LIMIT_1,
+ region.end);
+ }
- dev_info(&bridge->dev, "CardBus bridge to [bus %02x-%02x]\n",
- bus->secondary, bus->subordinate);
+ res = bus->resource[2];
+ pcibios_resource_to_bus(bridge, &region, res);
+ if (res->flags & IORESOURCE_MEM) {
+ dev_info(&bridge->dev, " bridge window %pR\n", res);
+ pci_write_config_dword(bridge, PCI_CB_MEMORY_BASE_0,
+ region.start);
+ pci_write_config_dword(bridge, PCI_CB_MEMORY_LIMIT_0,
+ region.end);
+ }
- /*
- * The IO resource is allocated a range twice as large as it
- * would normally need. This allows us to set both IO regs.
- */
- pci_setup_cardbus_window(bridge, "io", 0,
- pci_bus_get_resource(bus, IORESOURCE_IO, 0),
- PCI_CB_IO_BASE_0, PCI_CB_IO_LIMIT_0);
- pci_setup_cardbus_window(bridge, "io", 1,
- pci_bus_get_resource(bus, IORESOURCE_IO, 1),
- PCI_CB_IO_BASE_1, PCI_CB_IO_LIMIT_1);
- pci_setup_cardbus_window(bridge, "mem", 0,
- pci_bus_get_resource(bus, IORESOURCE_MEM, 0),
- PCI_CB_MEMORY_BASE_0, PCI_CB_MEMORY_LIMIT_0);
- pci_setup_cardbus_window(bridge, "mem", 1,
- pci_bus_get_resource(bus, IORESOURCE_MEM, 1),
- PCI_CB_MEMORY_BASE_1, PCI_CB_MEMORY_LIMIT_1);
+ res = bus->resource[3];
+ pcibios_resource_to_bus(bridge, &region, res);
+ if (res->flags & IORESOURCE_MEM) {
+ dev_info(&bridge->dev, " bridge window %pR\n", res);
+ pci_write_config_dword(bridge, PCI_CB_MEMORY_BASE_1,
+ region.start);
+ pci_write_config_dword(bridge, PCI_CB_MEMORY_LIMIT_1,
+ region.end);
+ }
}
EXPORT_SYMBOL(pci_setup_cardbus);
@@ -207,9 +212,9 @@ static void pci_setup_bridge_io(struct pci_bus *bus)
u32 l, io_upper16;
/* Set up the top and bottom of the PCI I/O segment for this bus. */
- res = pci_bus_get_resource(bus, IORESOURCE_IO, 0);
- if (res) {
- pcibios_resource_to_bus(bridge, &region, res);
+ res = bus->resource[0];
+ pcibios_resource_to_bus(bridge, &region, res);
+ if (res->flags & IORESOURCE_IO) {
pci_read_config_dword(bridge, PCI_IO_BASE, &l);
l &= 0xffff0000;
l |= (region.start >> 8) & 0x00f0;
@@ -239,9 +244,9 @@ static void pci_setup_bridge_mmio(struct pci_bus *bus)
u32 l;
/* Set up the top and bottom of the PCI Memory segment for this bus. */
- res = pci_bus_get_resource(bus, IORESOURCE_MEM, 0);
- if (res) {
- pcibios_resource_to_bus(bridge, &region, res);
+ res = bus->resource[1];
+ pcibios_resource_to_bus(bridge, &region, res);
+ if (res->flags & IORESOURCE_MEM) {
l = (region.start >> 16) & 0xfff0;
l |= region.end & 0xfff00000;
dev_info(&bridge->dev, " bridge window %pR\n", res);
@@ -266,9 +271,9 @@ static void pci_setup_bridge_mmio_pref(struct pci_bus *bus)
/* Set up PREF base/limit. */
bu = lu = 0;
- res = pci_bus_get_resource(bus, IORESOURCE_MEM | IORESOURCE_PREFETCH, 0);
- if (res) {
- pcibios_resource_to_bus(bridge, &region, res);
+ res = bus->resource[2];
+ pcibios_resource_to_bus(bridge, &region, res);
+ if (res->flags & IORESOURCE_PREFETCH) {
l = (region.start >> 16) & 0xfff0;
l |= region.end & 0xfff00000;
if (res->flags & IORESOURCE_MEM_64) {
@@ -377,13 +382,13 @@ static void pci_bridge_check_ranges(struct pci_bus *bus)
have non-NULL parent resource). */
static struct resource *find_free_bus_resource(struct pci_bus *bus, unsigned long type)
{
- struct pci_bus_resource *bus_res;
+ int i;
struct resource *r;
unsigned long type_mask = IORESOURCE_IO | IORESOURCE_MEM |
IORESOURCE_PREFETCH;
- list_for_each_entry(bus_res, &bus->resources, list) {
- r = bus_res->res;
+ for (i = 0; i < PCI_BUS_NUM_RESOURCES; i++) {
+ r = bus->resource[i];
if (r == &ioport_resource || r == &iomem_resource)
continue;
if (r && (r->flags & type_mask) == type && !r->parent)
@@ -798,15 +803,15 @@ static void __ref pci_bus_release_bridge_resources(struct pci_bus *bus,
static void pci_bus_dump_res(struct pci_bus *bus)
{
- struct pci_bus_resource *bus_res;
+ int i;
- list_for_each_entry(bus_res, &bus->resources, list) {
- struct resource *res = bus_res->res;
+ for (i = 0; i < PCI_BUS_NUM_RESOURCES; i++) {
+ struct resource *res = bus->resource[i];
if (!res || !res->end || !res->flags)
continue;
- dev_printk(KERN_DEBUG, &bus->dev, "resource %pR\n", res);
+ dev_printk(KERN_DEBUG, &bus->dev, "resource %d %pR\n", i, res);
}
}
diff --git a/drivers/pcmcia/rsrc_nonstatic.c b/drivers/pcmcia/rsrc_nonstatic.c
index d22daa6d9c37..08913a230a9a 100644
--- a/drivers/pcmcia/rsrc_nonstatic.c
+++ b/drivers/pcmcia/rsrc_nonstatic.c
@@ -821,9 +821,8 @@ static int adjust_io(struct pcmcia_socket *s, unsigned int action, unsigned long
#ifdef CONFIG_PCI
static int nonstatic_autoadd_resources(struct pcmcia_socket *s)
{
- struct pci_bus_resource *bus_res;
struct resource *res;
- int done = 0;
+ int i, done = 0;
if (!s->cb_dev || !s->cb_dev->bus)
return -ENODEV;
@@ -839,8 +838,8 @@ static int nonstatic_autoadd_resources(struct pcmcia_socket *s)
return -EINVAL;
#endif
- list_for_each_entry(bus_res, &s->cb_dev->bus->resources, list) {
- res = bus_res->res;
+ for (i = 0; i < PCI_BUS_NUM_RESOURCES; i++) {
+ res = s->cb_dev->bus->resource[i];
if (!res)
continue;
diff --git a/drivers/pcmcia/yenta_socket.c b/drivers/pcmcia/yenta_socket.c
index 9e831871d92a..041a75a7e55e 100644
--- a/drivers/pcmcia/yenta_socket.c
+++ b/drivers/pcmcia/yenta_socket.c
@@ -654,10 +654,9 @@ static int yenta_search_one_res(struct resource *root, struct resource *res,
static int yenta_search_res(struct yenta_socket *socket, struct resource *res,
u32 min)
{
- struct pci_bus_resource *bus_res;
-
- list_for_each_entry(bus_res, &socket->dev->bus->resources, list) {
- struct resource *root = bus_res->res;
+ int i;
+ for (i = 0; i < PCI_BUS_NUM_RESOURCES; i++) {
+ struct resource *root = socket->dev->bus->resource[i];
if (!root)
continue;