diff options
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/eisa/pci_eisa.c | 4 | ||||
-rw-r--r-- | drivers/pci/bus.c | 50 | ||||
-rw-r--r-- | drivers/pci/hotplug/shpchp_sysfs.c | 15 | ||||
-rw-r--r-- | drivers/pci/pci.c | 6 | ||||
-rw-r--r-- | drivers/pci/probe.c | 35 | ||||
-rw-r--r-- | drivers/pci/setup-bus.c | 111 | ||||
-rw-r--r-- | drivers/pcmcia/rsrc_nonstatic.c | 7 | ||||
-rw-r--r-- | drivers/pcmcia/yenta_socket.c | 7 |
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, ®ion, 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, ®ion, 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, ®ion, 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, ®ion, 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, ®ion, res); + res = bus->resource[0]; + pcibios_resource_to_bus(bridge, ®ion, 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, ®ion, res); + res = bus->resource[1]; + pcibios_resource_to_bus(bridge, ®ion, 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, ®ion, res); + res = bus->resource[2]; + pcibios_resource_to_bus(bridge, ®ion, 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; |