From: Mehmet Fide <[email protected]>

"usb start" on a Colibri VF50 or VF61 kills U-Boot with a data abort,
and even with that fixed the host port stays unpowered:

- patch 1 makes the flat-tree alias lookups match a stem exactly, as
  the live tree does; their prefix match is what gave the two USB
  controllers of the Vybrid the sequence numbers 2 and 3
- patch 2 fixes the data abort: the controller index came from that
  sequence number and indexed past the driver's tables
- patches 3 to 8 drop the dead non-DM path and the empty bind hook,
  add ofnode_get_alias_seq(), take dr_mode through usb_get_dr_mode()
  and the ID detect gpio through the device, and the PHY, usbmisc and
  anatop bases from the device tree instead of the tables
- patch 9 sorts the includes
- patch 10 enables the vbus-supply of the port

Patches 3 to 8 are the follow-up Marek asked for in his review of the
data abort fix: the PHY and usbmisc tables are gone, and the port index
that is left, for board_ehci_hcd_init() and the anatop registers, comes
from the usbphy alias of the PHY node.

v8:
- Marek's review of v7: patch 6 reads dr_mode through usb_get_dr_mode()
  alone and takes USB_DR_MODE_UNKNOWN as host, for legacy device trees
  without the property; an unknown value now means host as well, as
  in v6, instead of the -EINVAL of v7
- new patch 9 sorts the includes; patch 10 adds its two in order and
  leaves the argument of the reset hook named dev
- patches 7 and 8 carry Marek's Reviewed-by
- rebased on main

v7:
- Marek's review of v6: the dr_mode patch is split in two, patch 6 only
  replaces the private enum and the strcmp() chain, the new patch 7
  moves the ID detect gpio request to the device and into the probe,
  checks the results of gpio_request_by_name() and dm_gpio_get_value(),
  and frees the gpio in a new remove hook and on the failing probe
  paths, so the probe that follows a "usb stop" can request it again
- a dr_mode value the driver does not know fails the probe with
  -EINVAL again, as it did before the series; v6 made it host
- patch 8 keeps the u32 portnr, the alias lookup writes a local int
- the tags sit above the Signed-off-by; patch 3 carries Marek's
  Reviewed-by
- Simon's Reviewed-by on v6 carried to patches 1 to 5, whose code is
  unchanged; patches 6 and 8 changed after his review and patch 7 is
  new
- patch 9 drops the Reviewed-by of Marek and Simon on v6: its VBUS code
  is unchanged, but it now adds its line to the remove hook of patch 7
- rebased on main

v6:
- Marek's review of v5: patch 3 names USB_HOST as the option that
  selects DM_USB, patch 4 loses its two Fixes tags, patches 2 and 4
  carry his Reviewed-by
- new patch 6: the driver's own dr_mode enum and parsing go, it uses
  usb_get_dr_mode() and USB_DR_MODE_* as ehci-mx6 does
- patch 7 reads the phandles of the controller node with
  dev_read_phandle_with_args() and passes the private data to the
  helpers instead of single addresses
- patch 8 reports through dev_err() and dev_dbg()

v5:
- Simon's review of patch 4 (now 5): the live and the flat lookup
  treated the stem differently, exact against prefix, and the register
  base patch relied on the prefix to find usbphy0 with the "usb" stem.
  New patch 1 makes the flat lookup exact, ofnode_get_alias_seq()
  documents it and its test checks a prefix stem; the PHY node is
  looked up with the "usbphy" stem
- ofnode_get_alias_seq() now works on a node of any tree, on the live
  tree as well: of_alias_get_id() looks a node outside the control tree
  up in the /aliases node of its own tree; a test uses the other tree of
  the sandbox tests
- the checkpatch note of patch 4 (now 5) moved below the --- line
- rebased on main after the v2026.10 release

v4:
- rebased on next; the dm core change that moved of_to_plat() after
  pinctrl is gone, the regulator GPIO is now claimed at probe time
  upstream, which is what the vbus patch needed
- the data abort fix joins the series, the register base patch depends
  on it
- the vbus patch enables VBUS in the reset hook only, as ehci-mx6 does;
  v3 enabled it there and in the shared init, so the regulator counted
  two enables per probe and "usb stop" never switched VBUS off
- the dm core patch gains a test and no longer documents -ENOENT for a
  missing alias, the live tree returns -ENODEV

v7 of this series:
https://lore.kernel.org/u-boot/[email protected]/
v6 of this series:
https://lore.kernel.org/u-boot/[email protected]/
v5 of this series:
https://lore.kernel.org/u-boot/[email protected]/
v4 of this series:
https://lore.kernel.org/u-boot/[email protected]/
v2 of the register base series:
https://lore.kernel.org/u-boot/[email protected]/
v3 of the vbus series:
https://lore.kernel.org/u-boot/[email protected]/
the data abort fix on its own:
https://lore.kernel.org/u-boot/[email protected]/

Tested on a Colibri VF50 V1.2A on the Iris carrier, colibri_vf_defconfig
on main (06f988df538): "usb start" finds a USB stick behind the host
port at usb@400b4000 and reads the same data before and after "usb
reset", VBUS goes on at "usb start" and off at "usb stop", also after
repeated resets, and Linux takes the port over when U-Boot boots it
without "usb stop". The code of patches 1 to 5 is the one tested on a
VF61 V1.2B for v6; patches 6 to 10 changed only in the driver and were
tested on the VF50 as above. With local device trees that make usb0 an
OTG port with the fsl,cdet-gpio colibri_vf had before its device tree
sync, both ID states went through "usb start", "usb reset" and "usb
stop" cycles: read as device, the port is not available on every start
and the gpio stays free; read as host (GPIO_ACTIVE_LOW), the port holds
the gpio while it runs and gives it back at "usb stop". Without the
frees, every probe after the first fails with -EBUSY. An unknown dr_mode
and a missing one both give a host port. The five ARCH_VF610 boards
build at every patch, and "ut dm" on sandbox gives the same result as
on main, plus the three tests of patches 1 and 5 on the live and the
flat tree.

Mehmet Fide (10):
  fdtdec: match an alias to its stem only when the number follows it
  usb: ehci-vf: take the controller index from the device tree
  usb: ehci-vf: remove the code path for a build without DM_USB
  usb: ehci-vf: drop the empty bind hook
  dm: core: add ofnode_get_alias_seq()
  usb: ehci-vf: use usb_get_dr_mode()
  usb: ehci-vf: request the ID detect gpio through the device
  usb: ehci-vf: take the register bases from the device tree
  usb: ehci-vf: sort the includes
  usb: ehci-vf: enable the vbus supply of the port

 arch/sandbox/dts/other.dts |   5 +
 drivers/core/of_access.c   |  42 +++++
 drivers/core/ofnode.c      |  20 +++
 drivers/core/read.c        |  20 +--
 drivers/usb/host/ehci-vf.c | 314 ++++++++++++++++++-------------------
 include/dm/of_access.h     |   7 +-
 include/dm/ofnode.h        |  16 ++
 include/dm/read.h          |   8 +-
 lib/fdtdec.c               |  43 +++--
 test/dm/fdtdec.c           |  35 +++++
 test/dm/ofnode.c           |  49 ++++++
 11 files changed, 360 insertions(+), 199 deletions(-)


base-commit: 06f988df538e5507287918d45100a66921b6feef
-- 
2.55.0

Reply via email to