PCI: pci-dra7xx: Prepare for deferred probe with module_platform_driver
After updating pci-dra7xx driver to probe with ti-sysc and genpd, I noticed that dra7xx_pcie_probe() would not run if a power-domains property was configured for the interconnect target module. Turns out that module_platform_driver_probe uses platform_driver_probe(), while builtin_platform_driver uses platform_driver_register(). Only platform_driver_register() works for deferred probe as noted in the comments for __platform_driver_probe() in drivers/base/platform.c with a line saying "Note that this is incompatible with deferred probing". With module_platform_driver_probe, we have platform_driver_probe() produce -ENODEV error at device_initcall() level, and no further attempts are done. Let's fix this by using module_platform_driver instead. Note this is not an issue currently as we probe devices with simple-bus, and only is needed as we start probing the device with ti-sysc, or when probed with simple-pm-bus. Note that we must now also remove __init for probe related functions to avoid a section mismatch warning. Cc: linux-pci@vger.kernel.org Cc: Bjorn Helgaas <bhelgaas@google.com> Cc: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com> Tested-by: Kishon Vijay Abraham I <kishon@ti.com> Signed-off-by: Tony Lindgren <tony@atomide.com>
This commit is contained in:
parent
7f7acef857
commit
e259c2926c
1 changed files with 7 additions and 6 deletions
|
@ -443,7 +443,7 @@ static const struct dw_pcie_ep_ops pcie_ep_ops = {
|
||||||
.get_features = dra7xx_pcie_get_features,
|
.get_features = dra7xx_pcie_get_features,
|
||||||
};
|
};
|
||||||
|
|
||||||
static int __init dra7xx_add_pcie_ep(struct dra7xx_pcie *dra7xx,
|
static int dra7xx_add_pcie_ep(struct dra7xx_pcie *dra7xx,
|
||||||
struct platform_device *pdev)
|
struct platform_device *pdev)
|
||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
|
@ -472,7 +472,7 @@ static int __init dra7xx_add_pcie_ep(struct dra7xx_pcie *dra7xx,
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int __init dra7xx_add_pcie_port(struct dra7xx_pcie *dra7xx,
|
static int dra7xx_add_pcie_port(struct dra7xx_pcie *dra7xx,
|
||||||
struct platform_device *pdev)
|
struct platform_device *pdev)
|
||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
|
@ -682,7 +682,7 @@ static int dra7xx_pcie_configure_two_lane(struct device *dev,
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int __init dra7xx_pcie_probe(struct platform_device *pdev)
|
static int dra7xx_pcie_probe(struct platform_device *pdev)
|
||||||
{
|
{
|
||||||
u32 reg;
|
u32 reg;
|
||||||
int ret;
|
int ret;
|
||||||
|
@ -938,6 +938,7 @@ static const struct dev_pm_ops dra7xx_pcie_pm_ops = {
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct platform_driver dra7xx_pcie_driver = {
|
static struct platform_driver dra7xx_pcie_driver = {
|
||||||
|
.probe = dra7xx_pcie_probe,
|
||||||
.driver = {
|
.driver = {
|
||||||
.name = "dra7-pcie",
|
.name = "dra7-pcie",
|
||||||
.of_match_table = of_dra7xx_pcie_match,
|
.of_match_table = of_dra7xx_pcie_match,
|
||||||
|
@ -946,4 +947,4 @@ static struct platform_driver dra7xx_pcie_driver = {
|
||||||
},
|
},
|
||||||
.shutdown = dra7xx_pcie_shutdown,
|
.shutdown = dra7xx_pcie_shutdown,
|
||||||
};
|
};
|
||||||
builtin_platform_driver_probe(dra7xx_pcie_driver, dra7xx_pcie_probe);
|
builtin_platform_driver(dra7xx_pcie_driver);
|
||||||
|
|
Loading…
Add table
Reference in a new issue