On Tue, Apr 01, 2025 at 10:17:05AM +0100, Marc Zyngier wrote: > Now that we have the required infrastructure, split the Apple PCIe > setup into two categories: > > - stuff that has to do with PCI setup stays in the .init() callback > > - stuff that is just driver gunk (such as MSI setup) goes into a > probe routine, which will eventually call into the host-common > code > > The result is a far more logical setup process. > > Reviewed-by: Rob Herring (Arm) <robh@xxxxxxxxxx> > Acked-by: Alyssa Rosenzweig <alyssa@xxxxxxxxxxxxx> > Tested-by: Janne Grunau <j@xxxxxxxxxx> > Signed-off-by: Marc Zyngier <maz@xxxxxxxxxx> Reviewed-by: Manivannan Sadhasivam <manivannan.sadhasivam@xxxxxxxxxx> - Mani > --- > drivers/pci/controller/pcie-apple.c | 54 ++++++++++++++++------------- > 1 file changed, 30 insertions(+), 24 deletions(-) > > diff --git a/drivers/pci/controller/pcie-apple.c b/drivers/pci/controller/pcie-apple.c > index 842f8cee7c868..d07e488051290 100644 > --- a/drivers/pci/controller/pcie-apple.c > +++ b/drivers/pci/controller/pcie-apple.c > @@ -730,35 +730,15 @@ static void apple_pcie_disable_device(struct pci_host_bridge *bridge, struct pci > > static int apple_pcie_init(struct pci_config_window *cfg) > { > + struct apple_pcie *pcie = cfg->priv; > struct device *dev = cfg->parent; > - struct platform_device *platform = to_platform_device(dev); > struct device_node *of_port; > - struct apple_pcie *pcie; > int ret; > > - pcie = devm_kzalloc(dev, sizeof(*pcie), GFP_KERNEL); > - if (!pcie) > - return -ENOMEM; > - > - pcie->dev = dev; > - > - mutex_init(&pcie->lock); > - > - pcie->base = devm_platform_ioremap_resource(platform, 1); > - if (IS_ERR(pcie->base)) > - return PTR_ERR(pcie->base); > - > - cfg->priv = pcie; > - INIT_LIST_HEAD(&pcie->ports); > - > - ret = apple_msi_init(pcie); > - if (ret) > - return ret; > - > for_each_available_child_of_node(dev->of_node, of_port) { > ret = apple_pcie_setup_port(pcie, of_port); > if (ret) { > - dev_err(pcie->dev, "Port %pOF setup fail: %d\n", of_port, ret); > + dev_err(dev, "Port %pOF setup fail: %d\n", of_port, ret); > of_node_put(of_port); > return ret; > } > @@ -778,14 +758,40 @@ static const struct pci_ecam_ops apple_pcie_cfg_ecam_ops = { > } > }; > > +static int apple_pcie_probe(struct platform_device *pdev) > +{ > + struct device *dev = &pdev->dev; > + struct apple_pcie *pcie; > + int ret; > + > + pcie = devm_kzalloc(dev, sizeof(*pcie), GFP_KERNEL); > + if (!pcie) > + return -ENOMEM; > + > + pcie->dev = dev; > + pcie->base = devm_platform_ioremap_resource(pdev, 1); > + if (IS_ERR(pcie->base)) > + return PTR_ERR(pcie->base); > + > + mutex_init(&pcie->lock); > + INIT_LIST_HEAD(&pcie->ports); > + dev_set_drvdata(dev, pcie); > + > + ret = apple_msi_init(pcie); > + if (ret) > + return ret; > + > + return pci_host_common_init(pdev, &apple_pcie_cfg_ecam_ops); > +} > + > static const struct of_device_id apple_pcie_of_match[] = { > - { .compatible = "apple,pcie", .data = &apple_pcie_cfg_ecam_ops }, > + { .compatible = "apple,pcie" }, > { } > }; > MODULE_DEVICE_TABLE(of, apple_pcie_of_match); > > static struct platform_driver apple_pcie_driver = { > - .probe = pci_host_common_probe, > + .probe = apple_pcie_probe, > .driver = { > .name = "pcie-apple", > .of_match_table = apple_pcie_of_match, > -- > 2.39.2 > -- மணிவண்ணன் சதாசிவம்