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>
This commit is contained in:
parent
10e66449d7
commit
d138792112
@ -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;
|
||||
|
Loading…
Reference in New Issue
Block a user