[U-Boot] UCLASS_MISC bug

Sergey Kubushyn ksi at koi8.net
Fri Mar 15 21:55:21 UTC 2019


I would like to point that this was not a very good idea:

=== Cut ===
--- uboot-imx-next/drivers/misc/misc-uclass.c	2018-12-20 20:35:22.505180339 -0800
+++ u-boot-imx/drivers/misc/misc-uclass.c	2019-03-13 11:50:19.408982814 -0700
@@ -68,4 +68,7 @@ int misc_set_enabled(struct udevice *dev
  UCLASS_DRIVER(misc) = {
  	.id		= UCLASS_MISC,
  	.name		= "misc",
+#if CONFIG_IS_ENABLED(OF_CONTROL) && !CONFIG_IS_ENABLED(OF_PLATDATA)
+	.post_bind	= dm_scan_fdt_dev,
+#endif
  };
=== Cut ===

The problem comes up with all those "glue" layers like e.g. in usb/dwc3 and
everywhere else.

Those "glues" primarily bind drivers to e.g. USB interfaces like e.g.
dwc3-generic does. That is where it should stop because glue knows better
what to bind. However, after glue has bound appropriate drivers to their
interfaces that post_bind scans FDT again and finds yet another bunch of
drivers that it binds on top of what glue already bound. This happens e.g.
with DWC3 drivers that glues bind to interfaces depending on their declared
roles. However both peripheral and XHCI drivers are compatible with
"snps,dwc3" so they are bound on top creating a huge mess. Here is a dm tree
fragment of its action:

=== Cut ===
  phy          0  [ + ]   imx8mq_usb_phy        |-- phy at 381f0040
  misc         0  [ + ]   imx8m_dwc3_glue       |-- usb at 38100000
  usb          0  [   ]   imx8m_dwc3_periphera  |   |-- dwc3
  usb          0  [   ]   xhci-dwc3             |   `-- dwc3
  phy          1  [   ]   imx8mq_usb_phy        |-- phy at 382f0040
  misc         1  [   ]   imx8m_dwc3_glue       |-- usb at 38200000
  usb          1  [   ]   xhci-dwc3             |   |-- dwc3
  usb          2  [   ]   xhci-dwc3             |   `-- dwc3
=== Cut ===

The glue bound imx8m_dwc3_peripheral to USB0 then post_bind found yet
another "compatible" driver, xhci-dwc3 and bound it to the same interface.

Then glue bound xhci-dwc3 to USB1 but post_bind found yet another
"compatible" driver, xhci-dwc3 and bound it again so there are TWO xhci
drivers bound to the same interface.

This is simplified picture -- I removed "compatible" from my peripheral
driver so it only comes up once, under USB0. If I leave that "compatible"
with "snps,dwc3" there everything gets even weirder :(

That diff above is the latest 2019.04-rc3 u-boot-imx-next vs 2019.01-rc
something release.

We either need some additional special flag to disable that post_bind where
it is not needed or create a special new class for those binding "glues" or
this change should be reverted.

P.S. I'm going to post imx8m USB glue, USB PHY, USB peripheral initial
drivers probably Monday late night as they still need some cleanup. It all
works with full Linux Kernel DTS files, picks power domains from there.

Don't know what to do with my board-specific DTS as there is (and probably
will not be) our board submitted -- it is not secret but used in our devices
only and not available to the public -- so it doesn't make sense to post a
full DTS. Will probably send a fragment.

---
******************************************************************
*  KSI at home    KOI8 Net  < >  The impossible we do immediately.  *
*  Las Vegas   NV, USA   < >  Miracles require 24-hour notice.   *
******************************************************************


More information about the U-Boot mailing list