diff options
Diffstat (limited to 'arch/unicore32/kernel/pci.c')
-rw-r--r-- | arch/unicore32/kernel/pci.c | 35 |
1 files changed, 31 insertions, 4 deletions
diff --git a/arch/unicore32/kernel/pci.c b/arch/unicore32/kernel/pci.c index 1053bca1f8aa..9f26840e41b1 100644 --- a/arch/unicore32/kernel/pci.c +++ b/arch/unicore32/kernel/pci.c | |||
@@ -101,7 +101,7 @@ void pci_puv3_preinit(void) | |||
101 | writel(readl(PCIBRI_CMD) | PCIBRI_CMD_IO | PCIBRI_CMD_MEM, PCIBRI_CMD); | 101 | writel(readl(PCIBRI_CMD) | PCIBRI_CMD_IO | PCIBRI_CMD_MEM, PCIBRI_CMD); |
102 | } | 102 | } |
103 | 103 | ||
104 | static int __init pci_puv3_map_irq(const struct pci_dev *dev, u8 slot, u8 pin) | 104 | static int pci_puv3_map_irq(const struct pci_dev *dev, u8 slot, u8 pin) |
105 | { | 105 | { |
106 | if (dev->bus->number == 0) { | 106 | if (dev->bus->number == 0) { |
107 | #ifdef CONFIG_ARCH_FPGA /* 4 pci slots */ | 107 | #ifdef CONFIG_ARCH_FPGA /* 4 pci slots */ |
@@ -252,19 +252,46 @@ void pcibios_fixup_bus(struct pci_bus *bus) | |||
252 | } | 252 | } |
253 | EXPORT_SYMBOL(pcibios_fixup_bus); | 253 | EXPORT_SYMBOL(pcibios_fixup_bus); |
254 | 254 | ||
255 | static struct resource busn_resource = { | ||
256 | .name = "PCI busn", | ||
257 | .start = 0, | ||
258 | .end = 255, | ||
259 | .flags = IORESOURCE_BUS, | ||
260 | }; | ||
261 | |||
255 | static int __init pci_common_init(void) | 262 | static int __init pci_common_init(void) |
256 | { | 263 | { |
257 | struct pci_bus *puv3_bus; | 264 | struct pci_bus *puv3_bus; |
265 | struct pci_host_bridge *bridge; | ||
266 | int ret; | ||
267 | |||
268 | bridge = pci_alloc_host_bridge(0); | ||
269 | if (!bridge) | ||
270 | return -ENOMEM; | ||
258 | 271 | ||
259 | pci_puv3_preinit(); | 272 | pci_puv3_preinit(); |
260 | 273 | ||
261 | puv3_bus = pci_scan_bus(0, &pci_puv3_ops, NULL); | 274 | pci_add_resource(&bridge->windows, &ioport_resource); |
275 | pci_add_resource(&bridge->windows, &iomem_resource); | ||
276 | pci_add_resource(&bridge->windows, &busn_resource); | ||
277 | bridge->sysdata = NULL; | ||
278 | bridge->busnr = 0; | ||
279 | bridge->ops = &pci_puv3_ops; | ||
280 | bridge->swizzle_irq = pci_common_swizzle; | ||
281 | bridge->map_irq = pci_puv3_map_irq; | ||
282 | |||
283 | /* Scan our single hose. */ | ||
284 | ret = pci_scan_root_bus_bridge(bridge); | ||
285 | if (ret) { | ||
286 | pci_free_host_bridge(bridge); | ||
287 | return; | ||
288 | } | ||
289 | |||
290 | puv3_bus = bridge->bus; | ||
262 | 291 | ||
263 | if (!puv3_bus) | 292 | if (!puv3_bus) |
264 | panic("PCI: unable to scan bus!"); | 293 | panic("PCI: unable to scan bus!"); |
265 | 294 | ||
266 | pci_fixup_irqs(pci_common_swizzle, pci_puv3_map_irq); | ||
267 | |||
268 | pci_bus_size_bridges(puv3_bus); | 295 | pci_bus_size_bridges(puv3_bus); |
269 | pci_bus_assign_resources(puv3_bus); | 296 | pci_bus_assign_resources(puv3_bus); |
270 | pci_bus_add_devices(puv3_bus); | 297 | pci_bus_add_devices(puv3_bus); |