[PATCH v2 0/4] usb: dwc3: Modify role-switching QC drd usb controllers
From: Krishna Kurapati
Date: Tue Jun 10 2025 - 05:16:42 EST
Currently on QC targets, the conndone/disconnect events in device mode are
generated by controller when software writes to QSCRATCH registers in qcom
glue layer rather than the vbus line being routed to dwc3 core IP for it
to recognize and generate these events. We need to set UTMI_OTG_VBUS_VALID
bit of QSCRATCH_HS_PHY_CTRL register to generate a connection done event
and clear it to generate a disconnect event during cable removal or mode
switch is done
When the disconnect is not generated upon cable removal, the "connected"
flag of dwc3 is left marked as "true" and it blocks suspend routines and
for that to happen upon cable removal, the cable disconnect notification
from usb_role_switch to DWC3 core driver needs to reach DWC3 Qualcomm glue
driver for it generate the event.
Currently, the way DWC3 core and Qualcomm glue driver is designed, there
is no mechanism through which the DWC3 core can notify the Qualcomm glue
layer of any role changes which it receives from usb_role_switch. To
register these glue callbacks at probe time, for enabling core to notify
glue layer, the legacy Qualcomm driver has no way to find out when the
child driver probe was successful since it does not check for the same
during of_platform_populate.
For flattened implementation of the glue driver, register callbacks for
core to invoke and notify glue layer of role switch notifications.
Set-Role and Run_stop notifier callbacks have been added to inform glue
of changes in role and any modifications UDC might be performing on the
controller. These callbacks allow us to modify qscratch accordingly and
generate disconnect/connect events to facilitate suspend entry and proper
enumeration.
The series only allows autosuspend to be used but still relies on user
enabling it from userspace (echo auto > a600000.usb/power/control).
Tests done:
1. Enumeration in device mode:
After creating symlinks to ffs.adb and writing to UDC node, ADB is up and
working in a stable way.
2. When none is written to UDC, device enters suspend.
3. When cable is removed, cable disconnect notification comes and when
qscratch registers are cleared properly, it is generating disconnect event
4. Device enters suspend upon removing cable (host and device mode).
5. In host mode, when autosuspend is enabled from userspace for controller,
xhci, roothubs and connected peripheral, the controller
enters runtime suspend.
6. Upon removing cable in host mode, setmode brings back usb to device
mode (which is default setting), it enters suspend as cable is still
disconnected.
7. When in host mode, if we enter runtime suspend with wakeup enabled,
clicking on buttons of headset are resuming the controller.
While at it, remove glue's extcon handling. Let the DTs being flattened use
role-switch/typec frameworks instead of extcon. DTs using "linux,extcon-usb-
gpio" can use "usb-conn-gpio" if they are having USB-B connectors. If they
are using Type-c like in case of msm8996-xiaomi-common.dtsi which gets
extcon informtation from TI based typec control chip, while flattening the
DT, role switch mechanism needs to be used instead of extcon.
This series has been tested on SM8450 QRD.
There will be a separate patch sent for flattening usb dt node.
changes in v2:
Rebased on top of usb-next.
Removed glue's extcon handling and made use of in-core handling.
Link to v1:
https://lore.kernel.org/all/20231017131851.8299-1-quic_kriskura@xxxxxxxxxxx/
Krishna Kurapati (4):
usb: dwc3: core: Introduce glue callbacks for flattened
implementations
usb: dwc3: qcom: Implement glue callbacks to facilitate runtime
suspend
usb: dwc3: qcom: Facilitate autosuspend during host mode
usb: dwc3: qcom: Remove extcon functionality from glue
drivers/usb/dwc3/core.c | 1 +
drivers/usb/dwc3/core.h | 26 +++++
drivers/usb/dwc3/drd.c | 1 +
drivers/usb/dwc3/dwc3-qcom.c | 219 +++++++++++++++++++----------------
drivers/usb/dwc3/gadget.c | 1 +
5 files changed, 150 insertions(+), 98 deletions(-)
--
2.34.1