[PATCH v3 3/6] dm: core: Support multiple drivers with same compatibles

Maniyam, Dinesh dinesh.maniyam at altera.com
Wed Jan 21 17:45:49 CET 2026


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)"<msp at baylibre.com> 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<simon.glass at canonical.com>
>> Signed-off-by: Markus Schneider-Pargmann (TI.com)<msp at baylibre.com>
>> ---
>>   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
>
>
>
>
>


More information about the U-Boot mailing list