We unified the Freescale pci/pcie initialization by changing the fsl_pci to a platform driver.
In previous version pci/pcie initialization is in platform code which Initialize pci bridge base on EP/RC or host/agent settings. Signed-off-by: Jia Hongtao <b38...@freescale.com> Signed-off-by: Li Yang <le...@freescale.com> --- arch/powerpc/platforms/85xx/p1022_ds.c | 39 +++++++---------------- arch/powerpc/sysdev/fsl_pci.c | 53 ++++++++++++++++++++++++++++++++ 2 files changed, 65 insertions(+), 27 deletions(-) diff --git a/arch/powerpc/platforms/85xx/p1022_ds.c b/arch/powerpc/platforms/85xx/p1022_ds.c index 2bf4342..41de2c1 100644 --- a/arch/powerpc/platforms/85xx/p1022_ds.c +++ b/arch/powerpc/platforms/85xx/p1022_ds.c @@ -277,32 +277,9 @@ void __init mpc85xx_smp_init(void); */ static void __init p1022_ds_setup_arch(void) { -#ifdef CONFIG_PCI - struct device_node *np; -#endif - dma_addr_t max = 0xffffffff; - if (ppc_md.progress) ppc_md.progress("p1022_ds_setup_arch()", 0); -#ifdef CONFIG_PCI - for_each_compatible_node(np, "pci", "fsl,p1022-pcie") { - struct resource rsrc; - struct pci_controller *hose; - - of_address_to_resource(np, 0, &rsrc); - - if ((rsrc.start & 0xfffff) == 0x8000) - fsl_add_bridge(np, 1); - else - fsl_add_bridge(np, 0); - - hose = pci_find_hose_for_OF_device(np); - max = min(max, hose->dma_window_base_cur + - hose->dma_window_size); - } -#endif - #if defined(CONFIG_FB_FSL_DIU) || defined(CONFIG_FB_FSL_DIU_MODULE) diu_ops.get_pixel_format = p1022ds_get_pixel_format; diu_ops.set_gamma_table = p1022ds_set_gamma_table; @@ -316,11 +293,8 @@ static void __init p1022_ds_setup_arch(void) #endif #ifdef CONFIG_SWIOTLB - if (memblock_end_of_DRAM() > max) { + if (memblock_end_of_DRAM() > 0xffffffff) ppc_swiotlb_enable = 1; - set_pci_dma_ops(&swiotlb_dma_ops); - ppc_md.pci_dma_dev_setup = pci_dma_dev_setup_swiotlb; - } #endif pr_info("Freescale P1022 DS reference board\n"); @@ -339,6 +313,17 @@ static int __init p1022_ds_publish_devices(void) } machine_device_initcall(p1022_ds, p1022_ds_publish_devices); +static struct of_device_id __initdata p1022_pci_ids[] = { + { .compatible = "fsl,p1022-pcie", }, + {}, +}; + +static int __init p1022_ds_publish_pci_device(void) +{ + return of_platform_bus_probe(NULL, p1022_pci_ids, NULL); +} +machine_arch_initcall(p1022_ds, p1022_ds_publish_pci_device); + machine_arch_initcall(p1022_ds, swiotlb_setup_bus_notifier); /* diff --git a/arch/powerpc/sysdev/fsl_pci.c b/arch/powerpc/sysdev/fsl_pci.c index 4ce547e..a0f305d 100644 --- a/arch/powerpc/sysdev/fsl_pci.c +++ b/arch/powerpc/sysdev/fsl_pci.c @@ -712,3 +712,56 @@ u64 fsl_pci_immrbar_base(struct pci_controller *hose) return 0; } + +static const struct of_device_id pci_ids[] = { + { .compatible = "fsl,mpc8540-pci", }, + { .compatible = "fsl,mpc8548-pcie", }, + { .compatible = "fsl,p1022-pcie", }, + {}, +}; + +static int __devinit fsl_pci_probe(struct platform_device *pdev) +{ + struct pci_controller *hose; + + if (of_match_node(pci_ids, pdev->dev.of_node)) { + struct resource rsrc; + of_address_to_resource(pdev->dev.of_node, 0, &rsrc); + if ((rsrc.start & 0xfffff) == 8000) + fsl_add_bridge(pdev->dev.of_node, 1); + else + fsl_add_bridge(pdev->dev.of_node, 0); + +#ifdef CONFIG_SWIOTLB + hose = pci_find_hose_for_OF_device(pdev->dev.of_node); + /* + * if we couldn't map all of DRAM via the dma windows + * we need SWIOTLB to handle buffers located outside of + * dma capable memory region + */ + if (memblock_end_of_DRAM() > hose->dma_window_base_cur + + hose->dma_window_size) { + ppc_swiotlb_enable = 1; + set_pci_dma_ops(&swiotlb_dma_ops); + ppc_md.pci_dma_dev_setup = pci_dma_dev_setup_swiotlb; + } +#endif + + } + + return 0; +} + +static struct platform_driver fsl_pci_driver = { + .driver = { + .name = "fsl-pci", + .of_match_table = pci_ids, + }, + .probe = fsl_pci_probe, +}; + +static int __init fsl_pci_init(void) +{ + return platform_driver_register(&fsl_pci_driver); +} +arch_initcall(fsl_pci_init); -- 1.7.5.1 _______________________________________________ Linuxppc-dev mailing list Linuxppc-dev@lists.ozlabs.org https://lists.ozlabs.org/listinfo/linuxppc-dev