devicetree.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Matthias Kaehlcke <mka@chromium.org>
To: Pavan Kondeti <quic_pkondeti@quicinc.com>
Cc: Rob Herring <robh+dt@kernel.org>, Andy Gross <agross@kernel.org>,
	Bjorn Andersson <bjorn.andersson@linaro.org>,
	Greg Kroah-Hartman <gregkh@linuxfoundation.org>,
	Felipe Balbi <balbi@kernel.org>,
	Stephen Boyd <swboyd@chromium.org>,
	Doug Anderson <dianders@chromium.org>,
	Mathias Nyman <mathias.nyman@intel.com>,
	Krzysztof Kozlowski <krzysztof.kozlowski+dt@linaro.org>,
	"Rafael J . Wysocki" <rafael@kernel.org>,
	Len Brown <len.brown@intel.com>, Pavel Machek <pavel@ucw.cz>,
	linux-pm@vger.kernel.org, devicetree@vger.kernel.org,
	linux-arm-msm@vger.kernel.org, linux-usb@vger.kernel.org,
	linux-kernel@vger.kernel.org, quic_ppratap@quicinc.com,
	quic_kriskura@quicinc.com, quic_vpulyala@quicinc.com
Subject: Re: [PATCH v14 3/7] usb: dwc3: core: Host wake up support from system suspend
Date: Fri, 6 May 2022 09:43:55 -0700	[thread overview]
Message-ID: <YnVQS5twzZ/q1iWu@google.com> (raw)
In-Reply-To: <20220506030107.GD4640@hu-pkondeti-hyd.qualcomm.com>

On Fri, May 06, 2022 at 08:31:07AM +0530, Pavan Kondeti wrote:
> On Thu, May 05, 2022 at 09:45:49AM -0700, Matthias Kaehlcke wrote:
> > On Thu, May 05, 2022 at 08:56:18AM +0530, Pavan Kondeti wrote:
> > > On Wed, May 04, 2022 at 10:46:30AM -0700, Matthias Kaehlcke wrote:
> > > > On Wed, Apr 20, 2022 at 12:41:06AM +0530, Sandeep Maheswaram wrote:
> > > > > During suspend read the status of all port and set hs phy mode
> > > > > based on current speed. Use this hs phy mode to configure wakeup
> > > > > interrupts in qcom glue driver.
> > > > > 
> > > > > Check wakeup-source property for dwc3 core node to set the
> > > > > wakeup capability. Drop the device_init_wakeup call from
> > > > > runtime suspend and resume.
> > > > > 
> > > > > Also check during suspend if any wakeup capable devices are
> > > > > connected to the controller (directly or through hubs), if there
> > > > > are none set a flag to indicate that the PHY is powered
> > > > > down during suspend.
> > > > > 
> > > > > Signed-off-by: Sandeep Maheswaram <quic_c_sanm@quicinc.com>
> > > > > ---
> > > > > v14:
> > > > > Used device_children_wakeup_capable instead of usb_wakeup_enabled_descendants.
> > > > > 
> > > > > v13:
> > > > > Changed dwc3_set_phy_speed_mode to dwc3_check_phy_speed_mode.
> > > > > Removed device_init_wakeup calls from dwc3_runtime_suspend and dwc3_runtime_resume
> > > > > as we have a new dt property wakeup-source.
> > > > > 
> > > > > 
> > > > >  drivers/usb/dwc3/core.c | 33 ++++++++++++++++++++-------------
> > > > >  drivers/usb/dwc3/core.h |  4 ++++
> > > > >  drivers/usb/dwc3/host.c | 24 ++++++++++++++++++++++++
> > > > >  3 files changed, 48 insertions(+), 13 deletions(-)
> > > > > 
> > > > > diff --git a/drivers/usb/dwc3/core.c b/drivers/usb/dwc3/core.c
> > > > > index 1170b80..898aa66 100644
> > > > > --- a/drivers/usb/dwc3/core.c
> > > > > +++ b/drivers/usb/dwc3/core.c
> > > > > @@ -32,6 +32,7 @@
> > > > >  #include <linux/usb/gadget.h>
> > > > >  #include <linux/usb/of.h>
> > > > >  #include <linux/usb/otg.h>
> > > > > +#include <linux/usb/hcd.h>
> > > > >  
> > > > >  #include "core.h"
> > > > >  #include "gadget.h"
> > > > > @@ -1723,6 +1724,7 @@ static int dwc3_probe(struct platform_device *pdev)
> > > > >  
> > > > >  	platform_set_drvdata(pdev, dwc);
> > > > >  	dwc3_cache_hwparams(dwc);
> > > > > +	device_init_wakeup(&pdev->dev, of_property_read_bool(dev->of_node, "wakeup-source"));
> > > > >  
> > > > >  	spin_lock_init(&dwc->lock);
> > > > >  	mutex_init(&dwc->mutex);
> > > > > @@ -1865,6 +1867,7 @@ static int dwc3_suspend_common(struct dwc3 *dwc, pm_message_t msg)
> > > > >  {
> > > > >  	unsigned long	flags;
> > > > >  	u32 reg;
> > > > > +	struct usb_hcd  *hcd = platform_get_drvdata(dwc->xhci);
> > > > >  
> > > > >  	switch (dwc->current_dr_role) {
> > > > >  	case DWC3_GCTL_PRTCAP_DEVICE:
> > > > > @@ -1877,10 +1880,7 @@ static int dwc3_suspend_common(struct dwc3 *dwc, pm_message_t msg)
> > > > >  		dwc3_core_exit(dwc);
> > > > >  		break;
> > > > >  	case DWC3_GCTL_PRTCAP_HOST:
> > > > > -		if (!PMSG_IS_AUTO(msg)) {
> > > > > -			dwc3_core_exit(dwc);
> > > > > -			break;
> > > > > -		}
> > > > > +		dwc3_check_phy_speed_mode(dwc);
> > > > >  
> > > > >  		/* Let controller to suspend HSPHY before PHY driver suspends */
> > > > >  		if (dwc->dis_u2_susphy_quirk ||
> > > > > @@ -1896,6 +1896,16 @@ static int dwc3_suspend_common(struct dwc3 *dwc, pm_message_t msg)
> > > > >  
> > > > >  		phy_pm_runtime_put_sync(dwc->usb2_generic_phy);
> > > > >  		phy_pm_runtime_put_sync(dwc->usb3_generic_phy);
> > > > > +
> > > > > +		if (!PMSG_IS_AUTO(msg)) {
> > > > > +			if (device_may_wakeup(dwc->dev) &&
> > > > > +			    device_children_wakeup_capable(&hcd->self.root_hub->dev)) {
> > > > > +				dwc->phy_power_off = false;
> > > > > +			} else {
> > > > > +				dwc->phy_power_off = true;
> > > > > +				dwc3_core_exit(dwc);
> > > > 
> > > > I found that shutting the PHYs down during suspend leads to high power
> > > > consumption of a downstream hub (about 80mW vs 15mW when the PHYs are
> > > > not shut down).
> > > > 
> > > > It would be interesting to know if this also impacts other non-hub
> > > > peripherals. Unfortunately I can't test that, the hub on my system is
> > > > soldered to the board.
> > > > 
> > > > I understand that shutting the PHYs down might be beneficial in terms
> > > > of power on some systems, however on those I'm looking at we'd strongly
> > > > prefer to save the 65mW of power consumed by the hub, rather than
> > > > whatever smaller amount of power that is saved by powering down the
> > > > PHYs.
> > > > 
> > > > Could we introduce a sysfs attribute (or some other sort of knob) to
> > > > allow the admin to configure whether the PHYs should remain on or off
> > > > during suspend? That is assuming that it is actually desirable to power
> > > > them off on some systems.
> > > 
> > > The result may vary across SoCs also. The current proposal is to keep PHY
> > > powered during system suspend if any of the downstream USB devices are enabled
> > > for wakeup. This also includes USB2/USB3 root hub. If one wants to keep PHY
> > > always powered on even when no device is attached, they can do so by enabling
> > > wakeup (echo enabled > /sys/bus/usb/devices/usbX/power/wakeup). This is anyway
> > > needed if you want to detect a peripheral attach during system suspend.
> > 
> > My concern is that it is not evident for an admin what causes the high power
> > consumption of the USB client (if they detect/localize it in the first place),
> > and even less that wakeup needs to be enabled to mitigate it.
> > 
> > Why can't we just put the PHYs in suspend, rather than taking the controller
> > down completely during suspend?
> 
> Agreed and I also have the same question.
> 
> I don't know the background on why DWC3 chooses to power down the PHY(s)
> during system suspend. Probably it is beneficial in some board designs.
> Atleast this patch series provides a way to wakeup the USB from system
> suspend, which also can be used not to power down the PHY(s). If all the users
> of DWC3 agree that powering down the PHY is bad, then we can do something
> about it.

I came across this commit while doing a bit of archeology:

  commit c4a5153e87fdf6805f63ff57556260e2554155a5
  Author: Manu Gautam <mgautam@codeaurora.org>
  Date:   Thu Jan 18 16:54:30 2018 +0530

  usb: dwc3: core: Power-off core/PHYs on system_suspend in host mode

  Commit 689bf72c6e0d ("usb: dwc3: Don't reinitialize core during
  host bus-suspend/resume") updated suspend/resume routines to not
  power_off and reinit PHYs/core for host mode.
  It broke platforms that rely on DWC3 core to power_off PHYs to
  enter low power state on system suspend.

  Perform dwc3_core_exit/init only during host mode system_suspend/
  resume to addresses power regression from above mentioned patch
  and also allow USB session to stay connected across
  runtime_suspend/resume in host mode. While at it also replace
  existing checks for HOST only dr_mode with current_dr_role to
  have similar core driver behavior for both Host-only and DRD+Host
  configurations.

  Fixes: 689bf72c6e0d ("usb: dwc3: Don't reinitialize core during host bus-suspend/resume")
  Reviewed-by: Roger Quadros <rogerq@ti.com>
  Signed-off-by: Manu Gautam <mgautam@codeaurora.org>
  Signed-off-by: Felipe Balbi <felipe.balbi@linux.intel.com>


So apparently powering off the core and PHYs is needed on some
platforms.

We could introduce a DT property that indicates that keeping the core/PHYs
on is supported. Another hint could be the fact that the controller is
marked as wakeup capable, however that would still power the core/PHYs
down if the 'wakeup-source' property isn't set for a controller that is
technically wakeup capable.

  reply	other threads:[~2022-05-06 16:44 UTC|newest]

Thread overview: 20+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-04-19 19:11 [PATCH v14 0/7] USB DWC3 host wake up support from system suspend Sandeep Maheswaram
2022-04-19 19:11 ` [PATCH v14 1/7] dt-bindings: usb: dwc3: Add wakeup-source property support Sandeep Maheswaram
2022-04-19 19:11 ` [PATCH v14 2/7] PM / wakeup: Add device_children_wakeup_capable() Sandeep Maheswaram
2022-04-22 11:57   ` Rafael J. Wysocki
2022-04-22 18:44     ` Matthias Kaehlcke
2022-04-25 13:03       ` Pavan Kondeti
2022-04-29 12:59         ` Pavan Kondeti
2022-04-29 19:19           ` Matthias Kaehlcke
2022-04-30  3:11             ` Pavan Kondeti
2022-05-03  0:57               ` Matthias Kaehlcke
2022-04-19 19:11 ` [PATCH v14 3/7] usb: dwc3: core: Host wake up support from system suspend Sandeep Maheswaram
2022-05-04 17:46   ` Matthias Kaehlcke
2022-05-05  3:26     ` Pavan Kondeti
2022-05-05 16:45       ` Matthias Kaehlcke
2022-05-06  3:01         ` Pavan Kondeti
2022-05-06 16:43           ` Matthias Kaehlcke [this message]
2022-04-19 19:11 ` [PATCH v14 4/7] usb: dwc3: qcom: Add helper functions to enable,disable wake irqs Sandeep Maheswaram
2022-04-19 19:11 ` [PATCH v14 5/7] usb: dwc3: qcom: Configure wakeup interrupts during suspend Sandeep Maheswaram
2022-04-19 19:11 ` [PATCH v14 6/7] usb: dwc3: qcom: Keep power domain on to retain controller status Sandeep Maheswaram
2022-04-19 19:11 ` [PATCH v14 7/7] arm64: dts: qcom: sc7280: Add wakeup-source property for USB node Sandeep Maheswaram

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=YnVQS5twzZ/q1iWu@google.com \
    --to=mka@chromium.org \
    --cc=agross@kernel.org \
    --cc=balbi@kernel.org \
    --cc=bjorn.andersson@linaro.org \
    --cc=devicetree@vger.kernel.org \
    --cc=dianders@chromium.org \
    --cc=gregkh@linuxfoundation.org \
    --cc=krzysztof.kozlowski+dt@linaro.org \
    --cc=len.brown@intel.com \
    --cc=linux-arm-msm@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-pm@vger.kernel.org \
    --cc=linux-usb@vger.kernel.org \
    --cc=mathias.nyman@intel.com \
    --cc=pavel@ucw.cz \
    --cc=quic_kriskura@quicinc.com \
    --cc=quic_pkondeti@quicinc.com \
    --cc=quic_ppratap@quicinc.com \
    --cc=quic_vpulyala@quicinc.com \
    --cc=rafael@kernel.org \
    --cc=robh+dt@kernel.org \
    --cc=swboyd@chromium.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).