diff options
Diffstat (limited to 'arch/powerpc/kernel/pci_32.c')
-rw-r--r-- | arch/powerpc/kernel/pci_32.c | 36 |
1 files changed, 12 insertions, 24 deletions
diff --git a/arch/powerpc/kernel/pci_32.c b/arch/powerpc/kernel/pci_32.c index 132cd80afa21..d473634e39e3 100644 --- a/arch/powerpc/kernel/pci_32.c +++ b/arch/powerpc/kernel/pci_32.c | |||
@@ -20,6 +20,7 @@ | |||
20 | #include <asm/prom.h> | 20 | #include <asm/prom.h> |
21 | #include <asm/sections.h> | 21 | #include <asm/sections.h> |
22 | #include <asm/pci-bridge.h> | 22 | #include <asm/pci-bridge.h> |
23 | #include <asm/ppc-pci.h> | ||
23 | #include <asm/byteorder.h> | 24 | #include <asm/byteorder.h> |
24 | #include <asm/uaccess.h> | 25 | #include <asm/uaccess.h> |
25 | #include <asm/machdep.h> | 26 | #include <asm/machdep.h> |
@@ -43,8 +44,6 @@ static u8* pci_to_OF_bus_map; | |||
43 | */ | 44 | */ |
44 | static int pci_assign_all_buses; | 45 | static int pci_assign_all_buses; |
45 | 46 | ||
46 | LIST_HEAD(hose_list); | ||
47 | |||
48 | static int pci_bus_count; | 47 | static int pci_bus_count; |
49 | 48 | ||
50 | /* This will remain NULL for now, until isa-bridge.c is made common | 49 | /* This will remain NULL for now, until isa-bridge.c is made common |
@@ -219,16 +218,23 @@ scan_OF_pci_childs(struct device_node *parent, pci_OF_scan_iterator filter, void | |||
219 | static struct device_node *scan_OF_for_pci_dev(struct device_node *parent, | 218 | static struct device_node *scan_OF_for_pci_dev(struct device_node *parent, |
220 | unsigned int devfn) | 219 | unsigned int devfn) |
221 | { | 220 | { |
222 | struct device_node *np; | 221 | struct device_node *np, *cnp; |
223 | const u32 *reg; | 222 | const u32 *reg; |
224 | unsigned int psize; | 223 | unsigned int psize; |
225 | 224 | ||
226 | for_each_child_of_node(parent, np) { | 225 | for_each_child_of_node(parent, np) { |
227 | reg = of_get_property(np, "reg", &psize); | 226 | reg = of_get_property(np, "reg", &psize); |
228 | if (reg == NULL || psize < 4) | 227 | if (reg && psize >= 4 && ((reg[0] >> 8) & 0xff) == devfn) |
229 | continue; | ||
230 | if (((reg[0] >> 8) & 0xff) == devfn) | ||
231 | return np; | 228 | return np; |
229 | |||
230 | /* Note: some OFs create a parent node "multifunc-device" as | ||
231 | * a fake root for all functions of a multi-function device, | ||
232 | * we go down them as well. */ | ||
233 | if (!strcmp(np->name, "multifunc-device")) { | ||
234 | cnp = scan_OF_for_pci_dev(np, devfn); | ||
235 | if (cnp) | ||
236 | return cnp; | ||
237 | } | ||
232 | } | 238 | } |
233 | return NULL; | 239 | return NULL; |
234 | } | 240 | } |
@@ -491,24 +497,6 @@ long sys_pciconfig_iobase(long which, unsigned long bus, unsigned long devfn) | |||
491 | return result; | 497 | return result; |
492 | } | 498 | } |
493 | 499 | ||
494 | unsigned long pci_address_to_pio(phys_addr_t address) | ||
495 | { | ||
496 | struct pci_controller *hose, *tmp; | ||
497 | |||
498 | list_for_each_entry_safe(hose, tmp, &hose_list, list_node) { | ||
499 | unsigned int size = hose->io_resource.end - | ||
500 | hose->io_resource.start + 1; | ||
501 | if (address >= hose->io_base_phys && | ||
502 | address < (hose->io_base_phys + size)) { | ||
503 | unsigned long base = | ||
504 | (unsigned long)hose->io_base_virt - _IO_BASE; | ||
505 | return base + (address - hose->io_base_phys); | ||
506 | } | ||
507 | } | ||
508 | return (unsigned int)-1; | ||
509 | } | ||
510 | EXPORT_SYMBOL(pci_address_to_pio); | ||
511 | |||
512 | /* | 500 | /* |
513 | * Null PCI config access functions, for the case when we can't | 501 | * Null PCI config access functions, for the case when we can't |
514 | * find a hose. | 502 | * find a hose. |