+++ /dev/null
-From a891de5fc808516a5b5ca246efe145a32a6ae7e1 Mon Sep 17 00:00:00 2001
-From: Sasha Levin <sashal@kernel.org>
-Date: Thu, 19 Nov 2020 13:46:10 +0100
-Subject: driver core: platform: change logic implementing
- platform_driver_probe
-MIME-Version: 1.0
-Content-Type: text/plain; charset=UTF-8
-Content-Transfer-Encoding: 8bit
-
-From: Uwe Kleine-König <u.kleine-koenig@pengutronix.de>
-
-[ Upstream commit 16085668eacdc56c46652d0f3bfef81ecace57de ]
-
-Instead of overwriting the core driver's probe function handle probing
-devices for drivers loaded by platform_driver_probe() in the platform
-driver probe function.
-
-The intended goal is to not have to change the probe function to
-simplify converting the platform bus to use bus functions.
-
-Signed-off-by: Uwe Kleine-König <u.kleine-koenig@pengutronix.de>
-Link: https://lore.kernel.org/r/20201119124611.2573057-2-u.kleine-koenig@pengutronix.de
-Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
-Stable-dep-of: cfd67903977b ("PCI: xilinx-nwl: Clean up clock on probe failure/removal")
-Signed-off-by: Sasha Levin <sashal@kernel.org>
----
- drivers/base/platform.c | 18 +++++++++++++++---
- 1 file changed, 15 insertions(+), 3 deletions(-)
-
-diff --git a/drivers/base/platform.c b/drivers/base/platform.c
-index fa023cf80dc48..16426eb934632 100644
---- a/drivers/base/platform.c
-+++ b/drivers/base/platform.c
-@@ -743,12 +743,25 @@ struct platform_device *platform_device_register_full(
- }
- EXPORT_SYMBOL_GPL(platform_device_register_full);
-
-+static int platform_probe_fail(struct platform_device *pdev);
-+
- static int platform_drv_probe(struct device *_dev)
- {
- struct platform_driver *drv = to_platform_driver(_dev->driver);
- struct platform_device *dev = to_platform_device(_dev);
- int ret;
-
-+ /*
-+ * A driver registered using platform_driver_probe() cannot be bound
-+ * again later because the probe function usually lives in __init code
-+ * and so is gone. For these drivers .probe is set to
-+ * platform_probe_fail in __platform_driver_probe(). Don't even
-+ * prepare clocks and PM domains for these to match the traditional
-+ * behaviour.
-+ */
-+ if (unlikely(drv->probe == platform_probe_fail))
-+ return -ENXIO;
-+
- ret = of_clk_set_defaults(_dev->of_node, false);
- if (ret < 0)
- return ret;
-@@ -822,7 +835,7 @@ void platform_driver_unregister(struct platform_driver *drv)
- }
- EXPORT_SYMBOL_GPL(platform_driver_unregister);
-
--static int platform_drv_probe_fail(struct device *_dev)
-+static int platform_probe_fail(struct platform_device *pdev)
- {
- return -ENXIO;
- }
-@@ -887,10 +900,9 @@ int __init_or_module __platform_driver_probe(struct platform_driver *drv,
- * new devices fail.
- */
- spin_lock(&drv->driver.bus->p->klist_drivers.k_lock);
-- drv->probe = NULL;
-+ drv->probe = platform_probe_fail;
- if (code == 0 && list_empty(&drv->driver.p->klist_devices.k_list))
- retval = -ENODEV;
-- drv->driver.probe = platform_drv_probe_fail;
- spin_unlock(&drv->driver.bus->p->klist_drivers.k_lock);
-
- if (code != retval)
---
-2.43.0
-