diff options
author | Simon Glass <sjg@chromium.org> | 2022-10-08 21:33:20 -0600 |
---|---|---|
committer | Simon Glass <sjg@chromium.org> | 2022-10-29 07:36:33 -0600 |
commit | d13879211285d5cc5cfb727eb36b41da0111edf0 (patch) | |
tree | 14ad00ace8e38d0425d80347eae2f9c02fcfda0b /drivers/core | |
parent | 10e66449d7e8a6aaee69b9fd130a3f04ea7b6f57 (diff) | |
download | u-boot-d13879211285d5cc5cfb727eb36b41da0111edf0.tar.gz |
dm: core: Fix lists_bind_fdt() using non-existent of_match
The call to device_bind_with_driver_data() passes id->data but if
the entry has no of_match then the id has not been set by the selected
driver.
Normally this passes unnoticed since a previous driver likely had an
of_match value, so the id is set to that. Of course it is not correct
to pass the id->data from a different driver.
With clang-14 the driver ordering is such that the id is never actually
set in the 'bind /usb@1 usb_ether' line in test_bind_unbind_with_node()
thus causing a crash.
Fix this by passing 0 if the of_match for a driver does not exist.
Signed-off-by: Simon Glass <sjg@chromium.org>
Diffstat (limited to 'drivers/core')
-rw-r--r-- | drivers/core/lists.c | 4 |
1 files changed, 3 insertions, 1 deletions
diff --git a/drivers/core/lists.c b/drivers/core/lists.c index c49695b24f..3878957c9e 100644 --- a/drivers/core/lists.c +++ b/drivers/core/lists.c @@ -222,6 +222,7 @@ int lists_bind_fdt(struct udevice *parent, ofnode node, struct udevice **devp, log_debug(" - attempt to match compatible string '%s'\n", compat); + id = NULL; for (entry = driver; entry != driver + n_ents; entry++) { if (drv) { if (drv != entry) @@ -250,7 +251,8 @@ int lists_bind_fdt(struct udevice *parent, ofnode node, struct udevice **devp, entry->name, entry->of_match->compatible, id->compatible); ret = device_bind_with_driver_data(parent, entry, name, - id->data, node, &dev); + id ? id->data : 0, node, + &dev); if (ret == -ENODEV) { log_debug("Driver '%s' refuses to bind\n", entry->name); continue; |