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>
Tue, 18 Jan 2022 11:20:34 +0000 (20:20 +0900)
commit2cf19a7077f1fe2ef533f5a1b323eb219a298a05
tree1f31d2339a4492beca51fb288602acaf00aa17d1
parent1e620927eabcc0ca3657d352e076487732354f44
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