Hi Markus,

Thanks for the patch.

On 16/1/2026 6:50 pm, Mattijs Korpershoek wrote:
[CAUTION: This email is from outside your organization. Unless you trust the 
sender, do not click on links or open attachments as it may be a fraudulent 
email attempting to steal your information and/or compromise your computer.]

Hi Markus,

Thank you for the patch.

On Wed, Jan 14, 2026 at 09:33, "Markus Schneider-Pargmann 
(TI.com)"<[email protected]> wrote:

Currently once a driver matched the compatible string of a device, other
drivers are ignored. If the first matching driver returns -ENODEV, no
other possibly matching drivers are iterated with that compatible of the
device. Instead the next compatible in the list of compatibles is
selected, assuming only one driver matches one compatible at a time.

To be able to use the bind function to return -ENODEV and continue
matching other drivers with the same compatible, move the for loop a bit
to continue the for loop after -ENODEV was returned. The loop had to be
adjusted a bit to still support the 'drv' argument properly. Some
simplifications where done as well.
Nitpick: where -> were.

Please don't do any refactor/tweaks in this patch. drivers/core is
already difficult enough to review without formatting changes (to me at
least)

I see a couple below.

The modification will only add additional loop iterations if -ENODEV is
returned. Otherwise the exit and continue conditions for the loop stay
the same and do not cause any additional iterations and should not
impact performance.

This is required for ti-musb-host and ti-musb-peripheral which both
match on the same device but differ based on the dr_mode DT property.
Depending on this property, the driver is either UCLASS_USB or
UCLASS_USB_GADGET_GENERIc. By checking the DT property in the bind
Nitpick: UCLASS_USB_GADGET_GENERIC (not GENERIc)

function and returning -ENODEV the other driver can probe instead.

Reviewed-by: Simon Glass<[email protected]>
Signed-off-by: Markus Schneider-Pargmann (TI.com)<[email protected]>
---
  drivers/core/lists.c | 65 ++++++++++++++++++++++++++--------------------------
  1 file changed, 33 insertions(+), 32 deletions(-)

diff --git a/drivers/core/lists.c b/drivers/core/lists.c
index 
9d1ca38212ee7f53b8894f964f096611c8ec20a5..3d9f9bc93954efdd624dddb1833f3a855c3c28de
 100644
--- a/drivers/core/lists.c
+++ b/drivers/core/lists.c
@@ -235,50 +235,51 @@ 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++) {
+                     /* Search for drivers with matching drv or existing 
of_match */
                       if (drv) {
                               if (drv != entry)
                                       continue;
-                             if (!entry->of_match)
-                                     break;
+                     } else if (!entry->of_match) {
+                             continue;
                       }
-                     ret = driver_check_compatible(entry->of_match, &id,
-                                                   compat);
-                     if (!ret)
-                             break;
-             }
-             if (entry == driver + n_ents)
-                     continue;

-             if (pre_reloc_only) {
-                     if (!ofnode_pre_reloc(node) &&
-                         !(entry->flags & DM_FLAG_PRE_RELOC)) {
-                             log_debug("Skipping device pre-relocation\n");
-                             return 0;
+                     id = NULL;
+                     if (entry->of_match) {
+                             ret = driver_check_compatible(entry->of_match, 
&id,
+                                                           compat);
+                             if (ret)
+                                     continue;
+                             log_debug("   - found match at driver '%s' for 
'%s'\n",
+                                       entry->name, id->compatible);
+                     }
+
+                     if (pre_reloc_only) {
+                             if (!ofnode_pre_reloc(node) &&
+                                 !(entry->flags & DM_FLAG_PRE_RELOC)) {
+                                     log_debug("   - Skipping device 
pre-relocation\n");

This was changed from :

   log_debug("Skipping device pre-relocation\n");

Please move log formatting to a separate, cosmetic patch. This way, this
patch stays purely functional, and simpler.

See:https://docs.u-boot.org/en/latest/develop/sending_patches.html#general-patch-submission-rules


+                                     return 0;
+                             }
+                     }
+
+                     ret = device_bind_with_driver_data(parent, entry, name,
+                                                        id ? id->data : 0, 
node,
+                                                        &dev);
+                     if (!drv && ret == -ENODEV) {
+                             log_debug("   - Driver '%s' refuses to bind\n", 
entry->name);
Same here. We added "   -" to the log, making the diff overly
complicated.

Locally, discarded these message formatting changes and the diff was
much simpler.

Can we please re-submit by moving the formatting changes in a separate
patch?

Thanks
Mattijs

Previously, we were using glue/wrapper driver to support multiple drivers
with same compatibility.

For example:

In this file,
https://source.denx.de/u-boot/u-boot/-/blob/master/drivers/usb/dwc3/dwc3-generic.c

look for|dwc3_glue_bind_common, why not use the similar implementation? |Why 
does/core DM /need to know about USB role selection?

|lists_bind_fdt()| must remain simple and predictable

Thanks
Dinesh





Reply via email to