Merge branch 'of-pci' of git://git.kernel.org/pub/scm/linux/kernel/git/benh/powerpc
Linus Torvalds [Fri, 22 Jul 2011 21:54:02 +0000 (14:54 -0700)]
* 'of-pci' of git://git.kernel.org/pub/scm/linux/kernel/git/benh/powerpc:
  pci/of: Consolidate pci_bus_to_OF_node()
  pci/of: Consolidate pci_device_to_OF_node()
  x86/devicetree: Use generic PCI <-> OF matching
  microblaze/pci: Move the remains of pci_32.c to pci-common.c
  microblaze/pci: Remove powermac originated cruft
  pci/of: Match PCI devices to OF nodes dynamically

1  2 
arch/sparc/include/asm/pci_32.h
arch/x86/kernel/devicetree.c
drivers/pci/Makefile
drivers/pci/probe.c

@@@ -42,36 -42,9 +42,33 @@@ static inline void pci_dma_burst_advice
  }
  #endif
  
- struct device_node;
- extern struct device_node *pci_device_to_OF_node(struct pci_dev *pdev);
  #endif /* __KERNEL__ */
  
 +#ifndef CONFIG_LEON_PCI
  /* generic pci stuff */
  #include <asm-generic/pci.h>
 +#else
 +/*
 + * On LEON PCI Memory space is mapped 1:1 with physical address space.
 + *
 + * I/O space is located at low 64Kbytes in PCI I/O space. The I/O addresses
 + * are converted into CPU addresses to virtual addresses that are mapped with
 + * MMU to the PCI Host PCI I/O space window which are translated to the low
 + * 64Kbytes by the Host controller.
 + */
 +
 +extern void
 +pcibios_resource_to_bus(struct pci_dev *dev, struct pci_bus_region *region,
 +                      struct resource *res);
 +
 +extern void
 +pcibios_bus_to_resource(struct pci_dev *dev, struct resource *res,
 +                      struct pci_bus_region *region);
 +
 +static inline int pci_get_legacy_ide_irq(struct pci_dev *dev, int channel)
 +{
 +      return PCI_IRQ_NONE;
 +}
 +#endif
  
  #endif /* __SPARC_PCI_H */
@@@ -13,7 -13,6 +13,7 @@@
  #include <linux/slab.h>
  #include <linux/pci.h>
  #include <linux/of_pci.h>
 +#include <linux/initrd.h>
  
  #include <asm/hpet.h>
  #include <asm/irq_controller.h>
@@@ -99,16 -98,6 +99,16 @@@ void * __init early_init_dt_alloc_memor
        return __alloc_bootmem(size, align, __pa(MAX_DMA_ADDRESS));
  }
  
 +#ifdef CONFIG_BLK_DEV_INITRD
 +void __init early_init_dt_setup_initrd_arch(unsigned long start,
 +                                          unsigned long end)
 +{
 +      initrd_start = (unsigned long)__va(start);
 +      initrd_end = (unsigned long)__va(end);
 +      initrd_below_start_ok = 1;
 +}
 +#endif
 +
  void __init add_dtb(u64 data)
  {
        initial_dtb = data + offsetof(struct setup_data, data);
@@@ -134,6 -123,24 +134,24 @@@ static int __init add_bus_probe(void
  module_init(add_bus_probe);
  
  #ifdef CONFIG_PCI
+ struct device_node *pcibios_get_phb_of_node(struct pci_bus *bus)
+ {
+       struct device_node *np;
+       for_each_node_by_type(np, "pci") {
+               const void *prop;
+               unsigned int bus_min;
+               prop = of_get_property(np, "bus-range", NULL);
+               if (!prop)
+                       continue;
+               bus_min = be32_to_cpup(prop);
+               if (bus->number == bus_min)
+                       return np;
+       }
+       return NULL;
+ }
  static int x86_of_pci_irq_enable(struct pci_dev *dev)
  {
        struct of_irq oirq;
@@@ -165,50 -172,8 +183,8 @@@ static void x86_of_pci_irq_disable(stru
  
  void __cpuinit x86_of_pci_init(void)
  {
-       struct device_node *np;
        pcibios_enable_irq = x86_of_pci_irq_enable;
        pcibios_disable_irq = x86_of_pci_irq_disable;
-       for_each_node_by_type(np, "pci") {
-               const void *prop;
-               struct pci_bus *bus;
-               unsigned int bus_min;
-               struct device_node *child;
-               prop = of_get_property(np, "bus-range", NULL);
-               if (!prop)
-                       continue;
-               bus_min = be32_to_cpup(prop);
-               bus = pci_find_bus(0, bus_min);
-               if (!bus) {
-                       printk(KERN_ERR "Can't find a node for bus %s.\n",
-                                       np->full_name);
-                       continue;
-               }
-               if (bus->self)
-                       bus->self->dev.of_node = np;
-               else
-                       bus->dev.of_node = np;
-               for_each_child_of_node(np, child) {
-                       struct pci_dev *dev;
-                       u32 devfn;
-                       prop = of_get_property(child, "reg", NULL);
-                       if (!prop)
-                               continue;
-                       devfn = (be32_to_cpup(prop) >> 8) & 0xff;
-                       dev = pci_get_slot(bus, devfn);
-                       if (!dev)
-                               continue;
-                       dev->dev.of_node = child;
-                       pci_dev_put(dev);
-               }
-       }
  }
  #endif
  
diff --combined drivers/pci/Makefile
@@@ -51,7 -51,6 +51,7 @@@ obj-$(CONFIG_X86_VISWS) += setup-irq.
  obj-$(CONFIG_MN10300) += setup-bus.o
  obj-$(CONFIG_MICROBLAZE) += setup-bus.o
  obj-$(CONFIG_TILE) += setup-bus.o setup-irq.o
 +obj-$(CONFIG_SPARC_LEON) += setup-bus.o setup-irq.o
  
  #
  # ACPI Related PCI FW Functions
@@@ -71,4 -70,6 +71,6 @@@ obj-$(CONFIG_PCI_STUB) += pci-stub.
  
  obj-$(CONFIG_XEN_PCIDEV_FRONTEND) += xen-pcifront.o
  
+ obj-$(CONFIG_OF) += of.o
  ccflags-$(CONFIG_PCI_DEBUG) := -DDEBUG
diff --combined drivers/pci/probe.c
@@@ -52,6 -52,7 +52,7 @@@ static void release_pcibus_dev(struct d
        if (pci_bus->bridge)
                put_device(pci_bus->bridge);
        pci_bus_remove_resources(pci_bus);
+       pci_release_bus_of_node(pci_bus);
        kfree(pci_bus);
  }
  
@@@ -168,7 -169,7 +169,7 @@@ int __pci_read_base(struct pci_dev *dev
                res->flags |= pci_calc_resource_flags(l) | IORESOURCE_SIZEALIGN;
                if (type == pci_bar_io) {
                        l &= PCI_BASE_ADDRESS_IO_MASK;
 -                      mask = PCI_BASE_ADDRESS_IO_MASK & IO_SPACE_LIMIT;
 +                      mask = PCI_BASE_ADDRESS_IO_MASK & (u32) IO_SPACE_LIMIT;
                } else {
                        l &= PCI_BASE_ADDRESS_MEM_MASK;
                        mask = (u32)PCI_BASE_ADDRESS_MEM_MASK;
@@@ -588,7 -589,7 +589,7 @@@ static struct pci_bus *pci_alloc_child_
  
        child->self = bridge;
        child->bridge = get_device(&bridge->dev);
+       pci_set_bus_of_node(child);
        pci_set_bus_speed(child);
  
        /* Set up default resource pointers and names.. */
@@@ -1038,6 -1039,7 +1039,7 @@@ static void pci_release_dev(struct devi
  
        pci_dev = to_pci_dev(dev);
        pci_release_capabilities(pci_dev);
+       pci_release_of_node(pci_dev);
        kfree(pci_dev);
  }
  
@@@ -1157,6 -1159,8 +1159,8 @@@ static struct pci_dev *pci_scan_device(
        dev->vendor = l & 0xffff;
        dev->device = (l >> 16) & 0xffff;
  
+       pci_set_of_node(dev);
        if (pci_setup_device(dev)) {
                kfree(dev);
                return NULL;
@@@ -1409,6 -1413,7 +1413,7 @@@ struct pci_bus * pci_create_bus(struct 
                goto dev_reg_err;
        b->bridge = get_device(dev);
        device_enable_async_suspend(b->bridge);
+       pci_set_bus_of_node(b);
  
        if (!parent)
                set_dev_node(b->bridge, pcibus_to_node(b));