The of_devices_ensure_probed_by functions are expected to return an error code after iterating over all matching devices should any device have failed its of_device_ensure_probed. Doing this unearths one common failure: a matching node has status = "disabled". These will have of_device_ensure_probed return -ENODEV, which makes sense for users wanting to ensure a specific device is probed, but doesn't when iterating over multiple nodes. We already have of_devices_ensure_probed_by_dev_id, which does an early of_device_is_available check, so do likewise for the other to ensure_probed_by_* functions. Signed-off-by: Ahmad Fatoum <a.fatoum@xxxxxxxxxxxxxx> --- drivers/of/platform.c | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/drivers/of/platform.c b/drivers/of/platform.c index dc784ea8e550..a9a5d4c2daf2 100644 --- a/drivers/of/platform.c +++ b/drivers/of/platform.c @@ -525,12 +525,15 @@ int of_devices_ensure_probed_by_property(const char *property_name) return 0; for_each_node_with_property(node, property_name) { - ret = of_device_ensure_probed(node); + if (!of_device_is_available(node)) + continue; + + err = of_device_ensure_probed(node); if (err) ret = err; } - return 0; + return ret; } EXPORT_SYMBOL_GPL(of_devices_ensure_probed_by_property); @@ -543,12 +546,15 @@ int of_devices_ensure_probed_by_name(const char *name) return 0; for_each_node_by_name(node, name) { - ret = of_device_ensure_probed(node); + if (!of_device_is_available(node)) + continue; + + err = of_device_ensure_probed(node); if (err) ret = err; } - return 0; + return ret; } EXPORT_SYMBOL_GPL(of_devices_ensure_probed_by_name); -- 2.30.2