* [PATCH 0/1] usb: dwc3: qcom: Keep wakeup option default off
@ 2026-11-10 9:21 Peter Chen
2026-11-10 9:21 ` [PATCH 1/1] " Peter Chen
0 siblings, 1 reply; 2+ messages in thread
From: Peter Chen @ 2026-11-10 9:21 UTC (permalink / raw)
To: Thinh Nguyen
Cc: Greg Kroah-Hartman, Johan Hovold, Bjorn Andersson, Konrad Dybcio,
Dmitry Baryshkov, Wesley Cheng, Udipto Goswami, Jack Pham,
Pratham Pratap, Krishna Kurapati, Prashanth K, Elson Serrao,
cros-qcom-dts-watchers, linux-arm-msm, linux-usb, linux-kernel,
Peter Chen
Current policy
--------------
When the controller node has the "wakeup-source" property, dwc3-qcom
calls device_init_wakeup(dev, true). USB is then a system wakeup
source by default. Users who do NOT want the system woken up by USB
have to disable it:
echo disabled > /sys/devices/.../<dwc3 device>/power/wakeup
Proposed policy
---------------
"wakeup-source" only describes that the controller is capable of
waking up the system (see
Documentation/devicetree/bindings/power/wakeup-source.txt), so with
this patch the driver only marks the device as wakeup capable, and
power/wakeup starts out "disabled". Users who NEED USB as a wakeup
source have to enable it:
echo enabled > /sys/devices/.../<dwc3 device>/power/wakeup
The motivation is:
- Users do not expect USB activity (connect/disconnect or USB line status
changes) to wake up the system unless they asked for it.
- Power consumption. With wakeup enabled, host mode system suspend
keeps PHYs powered (dwc3_core_exit() is skipped) and necessary logic
for detecting wakeup must be on, so that the wakeup interrupts can
fire. Today this extra power is spent by default, even on systems
where USB is never used as a wakeup source and the controller could
be fully powered off during suspend.
Comparison
----------
Current (default on) Proposed (default off)
-------------------- ----------------------
Initial power/wakeup enabled disabled
User action write "disabled" if USB write "enabled" if USB
wakeup is NOT wanted wakeup IS wanted
Unexpected wakeups possible (connect, none unless the user
disconnect, noise) opted in
Suspend power higher, even if USB lower, USB fully powered
wakeup is never used off
Attached devices on stay suspended, resume reset-resumed or
resume quickly re-enumerated
Possible regression
-------------------
This is a user-visible change for existing platforms. Many Qualcomm
arm64 DTs set "wakeup-source" on the USB controller. With this patch:
- USB wakeup stops working until userspace (or a udev rule) writes
"enabled" to the controller's power/wakeup.
- In host mode, because device_may_wakeup() is now false by default,
system suspend takes the full power down path in
dwc3_suspend_common() (dwc3_core_exit()). Platforms where this
power down path has not been tested may fail to resume.
Peter Chen (1):
usb: dwc3: qcom: Keep wakeup option default off
drivers/usb/dwc3/dwc3-qcom.c | 5 ++---
1 file changed, 2 insertions(+), 3 deletions(-)
--
2.43.0
^ permalink raw reply [flat|nested] 2+ messages in thread
* [PATCH 1/1] usb: dwc3: qcom: Keep wakeup option default off
2026-11-10 9:21 [PATCH 0/1] usb: dwc3: qcom: Keep wakeup option default off Peter Chen
@ 2026-11-10 9:21 ` Peter Chen
0 siblings, 0 replies; 2+ messages in thread
From: Peter Chen @ 2026-11-10 9:21 UTC (permalink / raw)
To: Thinh Nguyen
Cc: Greg Kroah-Hartman, Johan Hovold, Bjorn Andersson, Konrad Dybcio,
Dmitry Baryshkov, Wesley Cheng, Udipto Goswami, Jack Pham,
Pratham Pratap, Krishna Kurapati, Prashanth K, Elson Serrao,
cros-qcom-dts-watchers, linux-arm-msm, linux-usb, linux-kernel,
Peter Chen
The "wakeup-source" property, as described in
Documentation/devicetree/bindings/power/wakeup-source.txt, only says
that a device is capable of waking up the system. Whether wakeup is
actually enabled is a policy decision, and drivers use
device_may_wakeup() to decide whether to arm the hardware wakeup logic.
Currently dwc3-qcom calls device_init_wakeup(dev, true) when the
property is present, so USB wakeup is enabled by default. Users who do
not want USB activity (e.g. connect/disconnect) to wake up the system
have to disable it through power/wakeup, otherwise unexpected wakeups
may happen.
Having wakeup enabled by default also costs power. In host mode, system
suspend skips dwc3_core_exit() and keeps the PHYs and the wakeup
detection logic powered so that the wakeup interrupts can fire, even on
systems where USB is never used as a wakeup source and the controller
could be fully powered off.
Keep the wakeup option default off and only mark the device as wakeup
capable, so that the user decides which USB controller is used as a
system wakeup source. Users who need it can enable it with:
echo enabled > /sys/devices/.../<dwc3 device>/power/wakeup
While at it, drop the local wakeup_source variable and use
device_property_read_bool() like the other property reads in probe.
Signed-off-by: Peter Chen <peter.chen@oss.qualcomm.com>
---
drivers/usb/dwc3/dwc3-qcom.c | 5 ++---
1 file changed, 2 insertions(+), 3 deletions(-)
diff --git a/drivers/usb/dwc3/dwc3-qcom.c b/drivers/usb/dwc3/dwc3-qcom.c
index ac68b4218b56..fb535e9a4a64 100644
--- a/drivers/usb/dwc3/dwc3-qcom.c
+++ b/drivers/usb/dwc3/dwc3-qcom.c
@@ -616,7 +616,6 @@ static int dwc3_qcom_probe(struct platform_device *pdev)
struct resource *r;
int ret;
bool ignore_pipe_clk;
- bool wakeup_source;
qcom = devm_kzalloc(&pdev->dev, sizeof(*qcom), GFP_KERNEL);
if (!qcom)
@@ -715,8 +714,8 @@ static int dwc3_qcom_probe(struct platform_device *pdev)
if (ret)
goto remove_core;
- wakeup_source = of_property_read_bool(dev->of_node, "wakeup-source");
- device_init_wakeup(&pdev->dev, wakeup_source);
+ if (device_property_read_bool(dev, "wakeup-source"))
+ device_set_wakeup_capable(dev, true);
qcom->is_suspended = false;
--
2.43.0
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2026-11-10 9:22 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2026-11-10 9:21 [PATCH 0/1] usb: dwc3: qcom: Keep wakeup option default off Peter Chen
2026-11-10 9:21 ` [PATCH 1/1] " Peter Chen
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®