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. This series has been tested on SM8450 QRD. This series depends on removal of extcon functionality first [1]. [1]: https://lore.kernel.org/all/20250729092708.3628187-1-krishna.kurapati@xxxxxxxxxxxxxxxx/ Changes in v3: Removal of extcon functionality has been moved out of this series. Addressed coding style comments from Thinh. Instead of adding notifier and enabling autosuspend for xhci, it has been done in xhci-plat.c Link to v2: https://lore.kernel.org/all/20250610091357.2983085-1-krishna.kurapati@xxxxxxxxxxxxxxxx/ 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 (3): usb: dwc3: core: Introduce glue callbacks for flattened implementations usb: dwc3: qcom: Implement glue callbacks to facilitate runtime suspend usb: xhci: plat: Facilitate using autosuspend for xhci plat devices drivers/usb/dwc3/core.c | 1 + drivers/usb/dwc3/core.h | 26 ++++++++++++ drivers/usb/dwc3/drd.c | 1 + drivers/usb/dwc3/dwc3-qcom.c | 80 +++++++++++++++++++++++++++++++----- drivers/usb/dwc3/gadget.c | 1 + drivers/usb/host/xhci-plat.c | 1 + 6 files changed, 100 insertions(+), 10 deletions(-) -- 2.34.1