powerpc: dart_iommu: optionally populate controller_ops on init
[firefly-linux-kernel-4.4.55.git] / arch / powerpc / sysdev / dart_iommu.c
index 9e5353ff6d1bb936fb1b84af74d8f2e6a1dd6da2..120e96a9e2cb065cc3cb5eacfeb3249deb1b8cfe 100644 (file)
@@ -369,7 +369,7 @@ static int dart_dma_set_mask(struct device *dev, u64 dma_mask)
        return 0;
 }
 
-void __init iommu_init_early_dart(void)
+void __init iommu_init_early_dart(struct pci_controller_ops *controller_ops)
 {
        struct device_node *dn;
 
@@ -395,15 +395,23 @@ void __init iommu_init_early_dart(void)
        if (dart_is_u4)
                ppc_md.dma_set_mask = dart_dma_set_mask;
 
-       ppc_md.pci_dma_dev_setup = pci_dma_dev_setup_dart;
-       ppc_md.pci_dma_bus_setup = pci_dma_bus_setup_dart;
-
+       if (controller_ops) {
+               controller_ops->dma_dev_setup = pci_dma_dev_setup_dart;
+               controller_ops->dma_bus_setup = pci_dma_bus_setup_dart;
+       } else {
+               ppc_md.pci_dma_dev_setup = pci_dma_dev_setup_dart;
+               ppc_md.pci_dma_bus_setup = pci_dma_bus_setup_dart;
+       }
        /* Setup pci_dma ops */
        set_pci_dma_ops(&dma_iommu_ops);
        return;
 
  bail:
        /* If init failed, use direct iommu and null setup functions */
+       if (controller_ops) {
+               controller_ops->dma_dev_setup = NULL;
+               controller_ops->dma_bus_setup = NULL;
+       }
        ppc_md.pci_dma_dev_setup = NULL;
        ppc_md.pci_dma_bus_setup = NULL;