aboutsummaryrefslogtreecommitdiffstats
path: root/arch/powerpc/sysdev/dart_iommu.c
diff options
context:
space:
mode:
authorDaniel Axtens <dja@axtens.net>2015-03-31 01:00:48 -0400
committerMichael Ellerman <mpe@ellerman.id.au>2015-04-11 06:49:14 -0400
commit798248a3c083a4cf0ead44a85e66c6a18647abea (patch)
tree88a0971d56d65ff2b5a4e2d93a696926f2dd182f /arch/powerpc/sysdev/dart_iommu.c
parentcd16c7ba0cc21aa1563e4b8430519b6488d0de60 (diff)
powerpc: dart_iommu: optionally populate controller_ops on init
If a pci_controller_ops struct is provided to iommu_init_early_dart, populate that with the DMA setup ops, rather than ppc_md. If NULL is provided, populate ppc_md as before. This also patches the call sites for Maple and Power Mac to pass NULL, so existing behaviour is preserved. The benefit of making this optional is that it means we don't have to change dart, Maple and Power Mac over to the controller_ops system in one fell swoop. Signed-off-by: Daniel Axtens <dja@axtens.net> Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
Diffstat (limited to 'arch/powerpc/sysdev/dart_iommu.c')
-rw-r--r--arch/powerpc/sysdev/dart_iommu.c16
1 files changed, 12 insertions, 4 deletions
diff --git a/arch/powerpc/sysdev/dart_iommu.c b/arch/powerpc/sysdev/dart_iommu.c
index 9e5353ff6d1b..120e96a9e2cb 100644
--- a/arch/powerpc/sysdev/dart_iommu.c
+++ b/arch/powerpc/sysdev/dart_iommu.c
@@ -369,7 +369,7 @@ static int dart_dma_set_mask(struct device *dev, u64 dma_mask)
369 return 0; 369 return 0;
370} 370}
371 371
372void __init iommu_init_early_dart(void) 372void __init iommu_init_early_dart(struct pci_controller_ops *controller_ops)
373{ 373{
374 struct device_node *dn; 374 struct device_node *dn;
375 375
@@ -395,15 +395,23 @@ void __init iommu_init_early_dart(void)
395 if (dart_is_u4) 395 if (dart_is_u4)
396 ppc_md.dma_set_mask = dart_dma_set_mask; 396 ppc_md.dma_set_mask = dart_dma_set_mask;
397 397
398 ppc_md.pci_dma_dev_setup = pci_dma_dev_setup_dart; 398 if (controller_ops) {
399 ppc_md.pci_dma_bus_setup = pci_dma_bus_setup_dart; 399 controller_ops->dma_dev_setup = pci_dma_dev_setup_dart;
400 400 controller_ops->dma_bus_setup = pci_dma_bus_setup_dart;
401 } else {
402 ppc_md.pci_dma_dev_setup = pci_dma_dev_setup_dart;
403 ppc_md.pci_dma_bus_setup = pci_dma_bus_setup_dart;
404 }
401 /* Setup pci_dma ops */ 405 /* Setup pci_dma ops */
402 set_pci_dma_ops(&dma_iommu_ops); 406 set_pci_dma_ops(&dma_iommu_ops);
403 return; 407 return;
404 408
405 bail: 409 bail:
406 /* If init failed, use direct iommu and null setup functions */ 410 /* If init failed, use direct iommu and null setup functions */
411 if (controller_ops) {
412 controller_ops->dma_dev_setup = NULL;
413 controller_ops->dma_bus_setup = NULL;
414 }
407 ppc_md.pci_dma_dev_setup = NULL; 415 ppc_md.pci_dma_dev_setup = NULL;
408 ppc_md.pci_dma_bus_setup = NULL; 416 ppc_md.pci_dma_bus_setup = NULL;
409 417