[RESEND PATCH] driver core: Clear FWNODE_FLAG_LINKS_ADDED in device_links_purge()

Zhenhua Huang
2023-09-27T03:15:11Z

Flag FWNODE_FLAG_LINKS_ADDED stops fwnode links creation. Current kernel
only adds it once after fwnode links creation in fw_devlink_parse_fwnode().
After that even device links being purged, the flag will not be cleared.

Fwnode links are converted to device links and will not be added back
forever in normal case. Essentially if a device is registered and
unregisted (also deleted) before it is probed (due to missing fwlink
dependencies, abort in device_links_check_suppliers), the fwlink is not
setup next when device is newly created again. This means the probe gets
called without meeting all dependencies.

It usuallly happens in the case of a glue driver. Of_platform_populate()
allows us to populate subnodes. We may do it in ancestor node probing
function, then check subnode's probing status because there may be chances
that suppliers of subnode are not ready. We may further need to do
of_platform_depopulate(which purges device links) and in some time
of_platform_populate() again. Such case we miss fwnode links(so that device
links) during second time of populating subnodes.

Fix it by Clearing FWNODE_FLAG_LINKS_ADDED flag in purging device link
func, indicates both fwnode links and device links are absent.

Signed-off-by: Zhenhua Huang <quic_zhenhuah@quicinc.com>
---
drivers/base/core.c | 4 ++++
1 file changed, 4 insertions(+)

diff --git a/drivers/base/core.c b/drivers/base/core.c
index b7d7f41..2a1975d 100644
--- a/drivers/base/core.c
+++ b/drivers/base/core.c
@@ -1630,6 +1630,10 @@ static void device_links_purge(struct device *dev)
__device_link_del(&link->kref);
}

+ /* Clear flags in fwnode. Give a chance to create fwnode link again */
+ if (dev->fwnode)
+ dev->fwnode->flags &= ~FWNODE_FLAG_LINKS_ADDED;
+
device_links_write_unlock();
}

--
2.7.4