usb: dwc3: Add role switch reset quirk for Apple DWC3
authorSven Peter <sven@svenpeter.dev>
Sun, 7 Nov 2021 10:21:20 +0000 (11:21 +0100)
committerHector Martin <marcan@marcan.st>
Sat, 19 Feb 2022 07:54:59 +0000 (16:54 +0900)
commite348923487d369cf9eb8d529ebdc541dc70dd186
tree9663665a26de14a99ea51f90a34f1d562abba095
parentb5c6a59de82609ce3ae834e32e11480c7146f494
usb: dwc3: Add role switch reset quirk for Apple DWC3

As mad as it sounds, the dwc3 controller present on the Apple M1 must be
reset and reinitialized whenever a device is unplugged from the root port.
The only reliable unplug/plug notification available comes from the USB
PD controller through the role-switch infrastructure.

This is required for at least two reasons:

  - The USB2 D+/D- lines are connected through a stateful eUSB2 repeater
    which in turn is controlled by a variant of the TI TPS6598x USB PD
    chip. When the USB PD controller detects a hotplug event it resets
    the eUSB2 repeater. Afterwards, no new device is recognized before
    the DWC3 core and PHY are reset as well.

  - It's possible to completely break the dwc3 controller by switching
    it to device mode and unplugging the cable at just the wrong time.
    Even a CORESOFTRESET is not enough to allow new devices again.
    The only workaround is to trigger a hard reset of the entire
    dwc3 core.

Signed-off-by: Sven Peter <sven@svenpeter.dev>
drivers/usb/dwc3/core.c
drivers/usb/dwc3/core.h
drivers/usb/dwc3/drd.c