PCI: host-generic: Eliminate pci_host_common_probe wrappers
authorRob Herring <robh@kernel.org>
Thu, 9 Apr 2020 23:49:23 +0000 (17:49 -0600)
committerLorenzo Pieralisi <lorenzo.pieralisi@arm.com>
Thu, 7 May 2020 08:29:43 +0000 (09:29 +0100)
Most ECAM host drivers are just different pci_ecam_ops which can be DT
match table data. That's already the case in some cases, but let's
do that for all the ECAM drivers. Then we can use
of_device_get_match_data() in pci_host_common_probe() and eliminate the
probe wrapper functions and use pci_host_common_probe() directly for
probe.

Link: https://lore.kernel.org/r/20200409234923.21598-4-robh@kernel.org
Signed-off-by: Rob Herring <robh@kernel.org>
Signed-off-by: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>
Acked-by: Bjorn Helgaas <bhelgaas@google.com>
Cc: Zhou Wang <wangzhou1@hisilicon.com>
Cc: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>
Cc: Andrew Murray <amurray@thegoodpenguin.co.uk>
Cc: Bjorn Helgaas <bhelgaas@google.com>
Cc: Will Deacon <will@kernel.org>
Cc: Robert Richter <rrichter@marvell.com>
Cc: Marc Gonzalez <marc.w.gonzalez@free.fr>
Cc: Mans Rullgard <mans@mansr.com>
Cc: linux-pci@vger.kernel.org
Cc: linux-arm-kernel@lists.infradead.org
drivers/pci/controller/dwc/pcie-hisi.c
drivers/pci/controller/pci-host-common.c
drivers/pci/controller/pci-host-generic.c
drivers/pci/controller/pci-thunder-ecam.c
drivers/pci/controller/pci-thunder-pem.c
drivers/pci/controller/pcie-tango.c
include/linux/pci-ecam.h

index 90017045334d6b35d378fa809f462e5201b5790e..0ba50fb473b101b72c55dc36d74cee7ce8b65f3f 100644 (file)
@@ -332,15 +332,6 @@ static struct platform_driver hisi_pcie_driver = {
 };
 builtin_platform_driver(hisi_pcie_driver);
 
-static int hisi_pcie_almost_ecam_probe(struct platform_device *pdev)
-{
-       struct device *dev = &pdev->dev;
-       struct pci_ecam_ops *ops;
-
-       ops = (struct pci_ecam_ops *)of_device_get_match_data(dev);
-       return pci_host_common_probe(pdev, ops);
-}
-
 static int hisi_pcie_platform_init(struct pci_config_window *cfg)
 {
        struct device *dev = cfg->parent;
@@ -385,7 +376,7 @@ static const struct of_device_id hisi_pcie_almost_ecam_of_match[] = {
 };
 
 static struct platform_driver hisi_pcie_almost_ecam_driver = {
-       .probe  = hisi_pcie_almost_ecam_probe,
+       .probe  = pci_host_common_probe,
        .driver = {
                   .name = "hisi-pcie-almost-ecam",
                   .of_match_table = hisi_pcie_almost_ecam_of_match,
index 6d15bc12e726f632503afe184d44a49b70911521..953de57f6c570704543118394a0a26008d757d32 100644 (file)
@@ -10,6 +10,7 @@
 #include <linux/kernel.h>
 #include <linux/module.h>
 #include <linux/of_address.h>
+#include <linux/of_device.h>
 #include <linux/of_pci.h>
 #include <linux/pci-ecam.h>
 #include <linux/platform_device.h>
@@ -55,15 +56,19 @@ err_out:
        return ERR_PTR(err);
 }
 
-int pci_host_common_probe(struct platform_device *pdev,
-                         const struct pci_ecam_ops *ops)
+int pci_host_common_probe(struct platform_device *pdev)
 {
        struct device *dev = &pdev->dev;
        struct pci_host_bridge *bridge;
        struct pci_config_window *cfg;
        struct list_head resources;
+       const struct pci_ecam_ops *ops;
        int ret;
 
+       ops = of_device_get_match_data(&pdev->dev);
+       if (!ops)
+               return -ENODEV;
+
        bridge = devm_pci_alloc_host_bridge(dev, 0);
        if (!bridge)
                return -ENOMEM;
index fd8cff61de14fc17e924daca2c63ee529fa02a8f..b51977abfdf1c860f435bca8d6001e14024ac447 100644 (file)
@@ -11,8 +11,6 @@
 #include <linux/kernel.h>
 #include <linux/init.h>
 #include <linux/module.h>
-#include <linux/of_address.h>
-#include <linux/of_pci.h>
 #include <linux/pci-ecam.h>
 #include <linux/platform_device.h>
 
@@ -79,23 +77,12 @@ static const struct of_device_id gen_pci_of_match[] = {
 };
 MODULE_DEVICE_TABLE(of, gen_pci_of_match);
 
-static int gen_pci_probe(struct platform_device *pdev)
-{
-       const struct of_device_id *of_id;
-       struct pci_ecam_ops *ops;
-
-       of_id = of_match_node(gen_pci_of_match, pdev->dev.of_node);
-       ops = (struct pci_ecam_ops *)of_id->data;
-
-       return pci_host_common_probe(pdev, ops);
-}
-
 static struct platform_driver gen_pci_driver = {
        .driver = {
                .name = "pci-host-generic",
                .of_match_table = gen_pci_of_match,
        },
-       .probe = gen_pci_probe,
+       .probe = pci_host_common_probe,
        .remove = pci_host_common_remove,
 };
 module_platform_driver(gen_pci_driver);
index c3fdd3e6b21cf6502bb6844763a36edfc4f66f3b..7e8835fee5f73d0efa5085b18dada3fdfbaf6985 100644 (file)
@@ -357,22 +357,20 @@ const struct pci_ecam_ops pci_thunder_ecam_ops = {
 #ifdef CONFIG_PCI_HOST_THUNDER_ECAM
 
 static const struct of_device_id thunder_ecam_of_match[] = {
-       { .compatible = "cavium,pci-host-thunder-ecam" },
+       {
+               .compatible = "cavium,pci-host-thunder-ecam",
+               .data = &pci_thunder_ecam_ops,
+       },
        { },
 };
 
-static int thunder_ecam_probe(struct platform_device *pdev)
-{
-       return pci_host_common_probe(pdev, &pci_thunder_ecam_ops);
-}
-
 static struct platform_driver thunder_ecam_driver = {
        .driver = {
                .name = KBUILD_MODNAME,
                .of_match_table = thunder_ecam_of_match,
                .suppress_bind_attrs = true,
        },
-       .probe = thunder_ecam_probe,
+       .probe = pci_host_common_probe,
 };
 builtin_platform_driver(thunder_ecam_driver);
 
index 2e792707ceab7e36ecb215a999246700c6530fb0..3f847969143e8fed23ca29ff1f09fca574efaab0 100644 (file)
@@ -451,22 +451,20 @@ static const struct pci_ecam_ops pci_thunder_pem_ops = {
 };
 
 static const struct of_device_id thunder_pem_of_match[] = {
-       { .compatible = "cavium,pci-host-thunder-pem" },
+       {
+               .compatible = "cavium,pci-host-thunder-pem",
+               .data = &pci_thunder_pem_ops,
+       },
        { },
 };
 
-static int thunder_pem_probe(struct platform_device *pdev)
-{
-       return pci_host_common_probe(pdev, &pci_thunder_pem_ops);
-}
-
 static struct platform_driver thunder_pem_driver = {
        .driver = {
                .name = KBUILD_MODNAME,
                .of_match_table = thunder_pem_of_match,
                .suppress_bind_attrs = true,
        },
-       .probe = thunder_pem_probe,
+       .probe = pci_host_common_probe,
 };
 builtin_platform_driver(thunder_pem_driver);
 
index 3b2b10906fdd60ce5dd92ae753079dcd915bd473..c13367c30fc65e42457d1ef35325e35964e317bc 100644 (file)
@@ -295,11 +295,14 @@ static int tango_pcie_probe(struct platform_device *pdev)
        spin_lock_init(&pcie->used_msi_lock);
        irq_set_chained_handler_and_data(virq, tango_msi_isr, pcie);
 
-       return pci_host_common_probe(pdev, &smp8759_ecam_ops);
+       return pci_host_common_probe(pdev);
 }
 
 static const struct of_device_id tango_pcie_ids[] = {
-       { .compatible = "sigma,smp8759-pcie" },
+       {
+               .compatible = "sigma,smp8759-pcie",
+               .data = &smp8759_ecam_ops,
+       },
        { },
 };
 
index fd0edb8b8a00a4fb6456fa21447dfbde1eccfbf8..1af5cb02ef7f90f4769047d8b60ad33b66677f99 100644 (file)
@@ -61,8 +61,7 @@ extern const struct pci_ecam_ops al_pcie_ops; /* Amazon Annapurna Labs PCIe */
 
 #if IS_ENABLED(CONFIG_PCI_HOST_COMMON)
 /* for DT-based PCI controllers that support ECAM */
-int pci_host_common_probe(struct platform_device *pdev,
-                         const struct pci_ecam_ops *ops);
+int pci_host_common_probe(struct platform_device *pdev);
 int pci_host_common_remove(struct platform_device *pdev);
 #endif
 #endif