PCI: mips: use generic INTx swizzle from PCI core
[firefly-linux-kernel-4.4.55.git] / arch / mips / pci / pci.c
index a377e9d2d029be681072a265908ba7f0f9a2dd17..b0eb9e75c6829444c10815312f0e0a145cb331e9 100644 (file)
@@ -149,28 +149,6 @@ out:
               "Skipping PCI bus scan due to resource conflict\n");
 }
 
-/* Most MIPS systems have straight-forward swizzling needs.  */
-
-static inline u8 bridge_swizzle(u8 pin, u8 slot)
-{
-       return (((pin - 1) + slot) % 4) + 1;
-}
-
-static u8 __init common_swizzle(struct pci_dev *dev, u8 *pinp)
-{
-       u8 pin = *pinp;
-
-       while (dev->bus->parent) {
-               pin = bridge_swizzle(pin, PCI_SLOT(dev->devfn));
-               /* Move up the chain of bridges. */
-               dev = dev->bus->self;
-        }
-       *pinp = pin;
-
-       /* The slot is the slot of the last bridge. */
-       return PCI_SLOT(dev->devfn);
-}
-
 static int __init pcibios_init(void)
 {
        struct pci_controller *hose;
@@ -179,7 +157,7 @@ static int __init pcibios_init(void)
        for (hose = hose_head; hose; hose = hose->next)
                pcibios_scanbus(hose);
 
-       pci_fixup_irqs(common_swizzle, pcibios_map_irq);
+       pci_fixup_irqs(pci_common_swizzle, pcibios_map_irq);
 
        pci_initialized = 1;
 
@@ -354,6 +332,30 @@ EXPORT_SYMBOL(PCIBIOS_MIN_IO);
 EXPORT_SYMBOL(PCIBIOS_MIN_MEM);
 #endif
 
+int pci_mmap_page_range(struct pci_dev *dev, struct vm_area_struct *vma,
+                       enum pci_mmap_state mmap_state, int write_combine)
+{
+       unsigned long prot;
+
+       /*
+        * I/O space can be accessed via normal processor loads and stores on
+        * this platform but for now we elect not to do this and portable
+        * drivers should not do this anyway.
+        */
+       if (mmap_state == pci_mmap_io)
+               return -EINVAL;
+
+       /*
+        * Ignore write-combine; for now only return uncached mappings.
+        */
+       prot = pgprot_val(vma->vm_page_prot);
+       prot = (prot & ~_CACHE_MASK) | _CACHE_UNCACHED;
+       vma->vm_page_prot = __pgprot(prot);
+
+       return remap_pfn_range(vma, vma->vm_start, vma->vm_pgoff,
+               vma->vm_end - vma->vm_start, vma->vm_page_prot);
+}
+
 char * (*pcibios_plat_setup)(char *str) __devinitdata;
 
 char *__devinit pcibios_setup(char *str)