PCI: host-generic: Eliminate pci_host_common_probe wrappers
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
This commit is contained in:

committed by
Lorenzo Pieralisi

parent
0c59c06a7c
commit
b2f75a41ea
@@ -332,15 +332,6 @@ static struct platform_driver hisi_pcie_driver = {
|
|||||||
};
|
};
|
||||||
builtin_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)
|
static int hisi_pcie_platform_init(struct pci_config_window *cfg)
|
||||||
{
|
{
|
||||||
struct device *dev = cfg->parent;
|
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 = {
|
static struct platform_driver hisi_pcie_almost_ecam_driver = {
|
||||||
.probe = hisi_pcie_almost_ecam_probe,
|
.probe = pci_host_common_probe,
|
||||||
.driver = {
|
.driver = {
|
||||||
.name = "hisi-pcie-almost-ecam",
|
.name = "hisi-pcie-almost-ecam",
|
||||||
.of_match_table = hisi_pcie_almost_ecam_of_match,
|
.of_match_table = hisi_pcie_almost_ecam_of_match,
|
||||||
|
@@ -10,6 +10,7 @@
|
|||||||
#include <linux/kernel.h>
|
#include <linux/kernel.h>
|
||||||
#include <linux/module.h>
|
#include <linux/module.h>
|
||||||
#include <linux/of_address.h>
|
#include <linux/of_address.h>
|
||||||
|
#include <linux/of_device.h>
|
||||||
#include <linux/of_pci.h>
|
#include <linux/of_pci.h>
|
||||||
#include <linux/pci-ecam.h>
|
#include <linux/pci-ecam.h>
|
||||||
#include <linux/platform_device.h>
|
#include <linux/platform_device.h>
|
||||||
@@ -55,15 +56,19 @@ err_out:
|
|||||||
return ERR_PTR(err);
|
return ERR_PTR(err);
|
||||||
}
|
}
|
||||||
|
|
||||||
int pci_host_common_probe(struct platform_device *pdev,
|
int pci_host_common_probe(struct platform_device *pdev)
|
||||||
const struct pci_ecam_ops *ops)
|
|
||||||
{
|
{
|
||||||
struct device *dev = &pdev->dev;
|
struct device *dev = &pdev->dev;
|
||||||
struct pci_host_bridge *bridge;
|
struct pci_host_bridge *bridge;
|
||||||
struct pci_config_window *cfg;
|
struct pci_config_window *cfg;
|
||||||
struct list_head resources;
|
struct list_head resources;
|
||||||
|
const struct pci_ecam_ops *ops;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
|
ops = of_device_get_match_data(&pdev->dev);
|
||||||
|
if (!ops)
|
||||||
|
return -ENODEV;
|
||||||
|
|
||||||
bridge = devm_pci_alloc_host_bridge(dev, 0);
|
bridge = devm_pci_alloc_host_bridge(dev, 0);
|
||||||
if (!bridge)
|
if (!bridge)
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
|
@@ -11,8 +11,6 @@
|
|||||||
#include <linux/kernel.h>
|
#include <linux/kernel.h>
|
||||||
#include <linux/init.h>
|
#include <linux/init.h>
|
||||||
#include <linux/module.h>
|
#include <linux/module.h>
|
||||||
#include <linux/of_address.h>
|
|
||||||
#include <linux/of_pci.h>
|
|
||||||
#include <linux/pci-ecam.h>
|
#include <linux/pci-ecam.h>
|
||||||
#include <linux/platform_device.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);
|
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 = {
|
static struct platform_driver gen_pci_driver = {
|
||||||
.driver = {
|
.driver = {
|
||||||
.name = "pci-host-generic",
|
.name = "pci-host-generic",
|
||||||
.of_match_table = gen_pci_of_match,
|
.of_match_table = gen_pci_of_match,
|
||||||
},
|
},
|
||||||
.probe = gen_pci_probe,
|
.probe = pci_host_common_probe,
|
||||||
.remove = pci_host_common_remove,
|
.remove = pci_host_common_remove,
|
||||||
};
|
};
|
||||||
module_platform_driver(gen_pci_driver);
|
module_platform_driver(gen_pci_driver);
|
||||||
|
@@ -357,22 +357,20 @@ const struct pci_ecam_ops pci_thunder_ecam_ops = {
|
|||||||
#ifdef CONFIG_PCI_HOST_THUNDER_ECAM
|
#ifdef CONFIG_PCI_HOST_THUNDER_ECAM
|
||||||
|
|
||||||
static const struct of_device_id thunder_ecam_of_match[] = {
|
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 = {
|
static struct platform_driver thunder_ecam_driver = {
|
||||||
.driver = {
|
.driver = {
|
||||||
.name = KBUILD_MODNAME,
|
.name = KBUILD_MODNAME,
|
||||||
.of_match_table = thunder_ecam_of_match,
|
.of_match_table = thunder_ecam_of_match,
|
||||||
.suppress_bind_attrs = true,
|
.suppress_bind_attrs = true,
|
||||||
},
|
},
|
||||||
.probe = thunder_ecam_probe,
|
.probe = pci_host_common_probe,
|
||||||
};
|
};
|
||||||
builtin_platform_driver(thunder_ecam_driver);
|
builtin_platform_driver(thunder_ecam_driver);
|
||||||
|
|
||||||
|
@@ -451,22 +451,20 @@ static const struct pci_ecam_ops pci_thunder_pem_ops = {
|
|||||||
};
|
};
|
||||||
|
|
||||||
static const struct of_device_id thunder_pem_of_match[] = {
|
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 = {
|
static struct platform_driver thunder_pem_driver = {
|
||||||
.driver = {
|
.driver = {
|
||||||
.name = KBUILD_MODNAME,
|
.name = KBUILD_MODNAME,
|
||||||
.of_match_table = thunder_pem_of_match,
|
.of_match_table = thunder_pem_of_match,
|
||||||
.suppress_bind_attrs = true,
|
.suppress_bind_attrs = true,
|
||||||
},
|
},
|
||||||
.probe = thunder_pem_probe,
|
.probe = pci_host_common_probe,
|
||||||
};
|
};
|
||||||
builtin_platform_driver(thunder_pem_driver);
|
builtin_platform_driver(thunder_pem_driver);
|
||||||
|
|
||||||
|
@@ -295,11 +295,14 @@ static int tango_pcie_probe(struct platform_device *pdev)
|
|||||||
spin_lock_init(&pcie->used_msi_lock);
|
spin_lock_init(&pcie->used_msi_lock);
|
||||||
irq_set_chained_handler_and_data(virq, tango_msi_isr, pcie);
|
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[] = {
|
static const struct of_device_id tango_pcie_ids[] = {
|
||||||
{ .compatible = "sigma,smp8759-pcie" },
|
{
|
||||||
|
.compatible = "sigma,smp8759-pcie",
|
||||||
|
.data = &smp8759_ecam_ops,
|
||||||
|
},
|
||||||
{ },
|
{ },
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@@ -61,8 +61,7 @@ extern const struct pci_ecam_ops al_pcie_ops; /* Amazon Annapurna Labs PCIe */
|
|||||||
|
|
||||||
#if IS_ENABLED(CONFIG_PCI_HOST_COMMON)
|
#if IS_ENABLED(CONFIG_PCI_HOST_COMMON)
|
||||||
/* for DT-based PCI controllers that support ECAM */
|
/* for DT-based PCI controllers that support ECAM */
|
||||||
int pci_host_common_probe(struct platform_device *pdev,
|
int pci_host_common_probe(struct platform_device *pdev);
|
||||||
const struct pci_ecam_ops *ops);
|
|
||||||
int pci_host_common_remove(struct platform_device *pdev);
|
int pci_host_common_remove(struct platform_device *pdev);
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
Reference in New Issue
Block a user