This is a note to let you know that I've just added the patch titled driver core: platform: change logic implementing platform_driver_probe to the 5.10-stable tree which can be found at: http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary The filename of the patch is: driver-core-platform-change-logic-implementing-platf.patch and it can be found in the queue-5.10 subdirectory. If you, or anyone else, feels it should not be added to the stable tree, please let <stable@xxxxxxxxxxxxxxx> know about it. commit 70fc1c8589b4de6e2f301a4307f3774ef5bce168 Author: Uwe Kleine-König <u.kleine-koenig@xxxxxxxxxxxxxx> Date: Thu Nov 19 13:46:10 2020 +0100 driver core: platform: change logic implementing platform_driver_probe [ 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@xxxxxxxxxxxxxx> Link: https://lore.kernel.org/r/20201119124611.2573057-2-u.kleine-koenig@xxxxxxxxxxxxxx Signed-off-by: Greg Kroah-Hartman <gregkh@xxxxxxxxxxxxxxxxxxx> Stable-dep-of: 55c421b36448 ("mmc: davinci: Don't strip remove function when driver is builtin") Signed-off-by: Sasha Levin <sashal@xxxxxxxxxx> 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)