]> pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - arch/powerpc/kernel/rtas_pci.c
Merge branch 'master' of /pub/scm/linux/kernel/git/torvalds/linux-2.6
[linux-2.6-omap-h63xx.git] / arch / powerpc / kernel / rtas_pci.c
index b4a0de79c0600e306aaae78aae5a84bf3c94cf00..a5de6211b97ad6b8af75dfb2611907ce8d09b689 100644 (file)
@@ -38,6 +38,7 @@
 #include <asm/rtas.h>
 #include <asm/mpic.h>
 #include <asm/ppc-pci.h>
+#include <asm/eeh.h>
 
 /* RTAS tokens */
 static int read_pci_config;
@@ -59,7 +60,7 @@ static int of_device_available(struct device_node * dn)
 {
         const char *status;
 
-        status = get_property(dn, "status", NULL);
+        status = of_get_property(dn, "status", NULL);
 
         if (!status)
                 return 1;
@@ -176,7 +177,7 @@ struct pci_ops rtas_pci_ops = {
 
 int is_python(struct device_node *dev)
 {
-       const char *model = get_property(dev, "model", NULL);
+       const char *model = of_get_property(dev, "model", NULL);
 
        if (model && strstr(model, "Python"))
                return 1;
@@ -231,32 +232,13 @@ void __init init_pci_config_tokens (void)
 
 unsigned long __devinit get_phb_buid (struct device_node *phb)
 {
-       int addr_cells;
-       const unsigned int *buid_vals;
-       unsigned int len;
-       unsigned long buid;
-
-       if (ibm_read_pci_config == -1) return 0;
+       struct resource r;
 
-       /* PHB's will always be children of the root node,
-        * or so it is promised by the current firmware. */
-       if (phb->parent == NULL)
+       if (ibm_read_pci_config == -1)
                return 0;
-       if (phb->parent->parent)
+       if (of_address_to_resource(phb, 0, &r))
                return 0;
-
-       buid_vals = get_property(phb, "reg", &len);
-       if (buid_vals == NULL)
-               return 0;
-
-       addr_cells = prom_n_addr_cells(phb);
-       if (addr_cells == 1) {
-               buid = (unsigned long) buid_vals[0];
-       } else {
-               buid = (((unsigned long)buid_vals[0]) << 32UL) |
-                       (((unsigned long)buid_vals[1]) & 0xffffffff);
-       }
-       return buid;
+       return r.start;
 }
 
 static int phb_set_bus_ranges(struct device_node *dev,
@@ -265,7 +247,7 @@ static int phb_set_bus_ranges(struct device_node *dev,
        const int *bus_range;
        unsigned int len;
 
-       bus_range = get_property(dev, "bus-range", &len);
+       bus_range = of_get_property(dev, "bus-range", &len);
        if (bus_range == NULL || len < 2 * sizeof(int)) {
                return 1;
        }
@@ -276,8 +258,10 @@ static int phb_set_bus_ranges(struct device_node *dev,
        return 0;
 }
 
-int __devinit setup_phb(struct device_node *dev, struct pci_controller *phb)
+int __devinit rtas_setup_phb(struct pci_controller *phb)
 {
+       struct device_node *dev = phb->arch_data;
+
        if (is_python(dev))
                python_countermeasures(dev);
 
@@ -290,14 +274,12 @@ int __devinit setup_phb(struct device_node *dev, struct pci_controller *phb)
        return 0;
 }
 
-unsigned long __init find_and_init_phbs(void)
+void __init find_and_init_phbs(void)
 {
        struct device_node *node;
        struct pci_controller *phb;
-       unsigned int index;
        struct device_node *root = of_find_node_by_path("/");
 
-       index = 0;
        for (node = of_get_next_child(root, NULL);
             node != NULL;
             node = of_get_next_child(root, node)) {
@@ -309,10 +291,9 @@ unsigned long __init find_and_init_phbs(void)
                phb = pcibios_alloc_controller(node);
                if (!phb)
                        continue;
-               setup_phb(node, phb);
+               rtas_setup_phb(phb);
                pci_process_bridge_OF_ranges(phb, node, 0);
-               pci_setup_phb_io(phb, index == 0);
-               index++;
+               isa_bridge_find_early(phb);
        }
 
        of_node_put(root);
@@ -325,18 +306,16 @@ unsigned long __init find_and_init_phbs(void)
        if (of_chosen) {
                const int *prop;
 
-               prop = get_property(of_chosen,
+               prop = of_get_property(of_chosen,
                                "linux,pci-probe-only", NULL);
                if (prop)
                        pci_probe_only = *prop;
 
-               prop = get_property(of_chosen,
+               prop = of_get_property(of_chosen,
                                "linux,pci-assign-all-buses", NULL);
                if (prop)
                        pci_assign_all_buses = *prop;
        }
-
-       return 0;
 }
 
 /* RPA-specific bits for removing PHBs */
@@ -353,7 +332,7 @@ int pcibios_remove_root_bus(struct pci_controller *phb)
                return 1;
        }
 
-       rc = unmap_bus_range(b);
+       rc = pcibios_unmap_io_space(b);
        if (rc) {
                printk(KERN_ERR "%s: failed to unmap IO on bus %s\n",
                        __FUNCTION__, b->name);
@@ -381,7 +360,6 @@ int pcibios_remove_root_bus(struct pci_controller *phb)
                }
        }
 
-       list_del(&phb->list_node);
        pcibios_free_controller(phb);
 
        return 0;