From: Matthias Kaehlcke <mka@chromium.org>
To: Sandeep Maheswaram <quic_c_sanm@quicinc.com>
Cc: 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>,
linux-arm-msm@vger.kernel.org, linux-usb@vger.kernel.org,
linux-kernel@vger.kernel.org, quic_pkondeti@quicinc.com,
quic_ppratap@quicinc.com
Subject: Re: [PATCH v9 1/5] usb: host: xhci: plat: Add suspend quirk for dwc3 controller
Date: Mon, 1 Nov 2021 11:59:10 -0700 [thread overview]
Message-ID: <YYA4/rjSN/QvIM+w@google.com> (raw)
In-Reply-To: <1635753224-23975-2-git-send-email-quic_c_sanm@quicinc.com>
Hi Sandeep,
On Mon, Nov 01, 2021 at 01:23:40PM +0530, Sandeep Maheswaram wrote:
> During suspend check if any wakeup capable devices are connected to the
> controller (directly or through hubs), and set the wakeup capable property
> for xhci plat device.
>
> Signed-off-by: Sandeep Maheswaram <quic_c_sanm@quicinc.com>
> ---
> drivers/usb/host/xhci-plat.c | 12 ++++++++++++
> 1 file changed, 12 insertions(+)
>
> diff --git a/drivers/usb/host/xhci-plat.c b/drivers/usb/host/xhci-plat.c
> index c1edcc9..7ab272b 100644
> --- a/drivers/usb/host/xhci-plat.c
> +++ b/drivers/usb/host/xhci-plat.c
> @@ -431,6 +431,14 @@ static int xhci_plat_remove(struct platform_device *dev)
> return 0;
> }
>
> +static void xhci_dwc3_suspend_quirk(struct usb_hcd *hcd, struct device *dev)
> +{
> + if (usb_wakeup_enabled_descendants(hcd->self.root_hub))
> + device_set_wakeup_capable(dev, true);
> + else
> + device_set_wakeup_capable(dev, false);
IIUC wakeup capability is typically a static property that reflects the
actual hardware (or firmware) support for wakeup. In that sense it doesn't
seem a good idea to change it dynamically at suspend time, depending on
what is connected to the bus. I understand though that the odd split
of the dwc3 driver makes it hard to do things properly ...
Earlier in this discussion Felipe suggested to add a function like
device_children_wakeup_capable(), to avoid having to call
usb_wakeup_enabled_descendants() from the dwc3 drivers.
Below is an initial implementation for device_children_wakeup_capable(),
could you try if calling it from dwc3_suspend/resume_common() and
dwc3_qcom_suspend() would work instead of relying on the wakeup
capability?
Thanks
Matthias
From 97c838334045ed67c3943f8e035ac70acd12b89b Mon Sep 17 00:00:00 2001
From: Matthias Kaehlcke <mka@chromium.org>
Date: Mon, 1 Nov 2021 11:37:19 -0700
Subject: [PATCH] PM / wakeup: Add device_children_wakeup_capable()
Add device_children_wakeup_capable() which checks whether the device itself
or one if its descendants is wakeup capable.
Change-Id: Ib359eb5ac8650ddf9889c7d1f77707f50777fe99
Suggested-by: Felipe Balbi <balbi@kernel.org>
Signed-off-by: Matthias Kaehlcke <mka@chromium.org>
---
drivers/base/power/wakeup.c | 17 +++++++++++++++++
include/linux/pm_wakeup.h | 6 ++++++
2 files changed, 23 insertions(+)
diff --git a/drivers/base/power/wakeup.c b/drivers/base/power/wakeup.c
index 9c0932603642..2aee7fa8230f 100644
--- a/drivers/base/power/wakeup.c
+++ b/drivers/base/power/wakeup.c
@@ -483,6 +483,23 @@ int device_set_wakeup_enable(struct device *dev, bool enable)
}
EXPORT_SYMBOL_GPL(device_set_wakeup_enable);
+static int __device_children_wakeup_capable(struct device *dev, void *dummy)
+{
+ return device_may_wakeup(dev) ||
+ device_for_each_child(dev, NULL, __device_children_wakeup_capable);
+}
+
+/**
+ * device_children_wakeup_capable - Check whether a device or one of its descendants is
+ * wakeup capable.
+ * @dev: Device to handle.
+ */
+bool device_children_wakeup_capable(struct device *dev)
+{
+ return __device_children_wakeup_capable(dev, NULL);
+}
+EXPORT_SYMBOL_GPL(device_children_wakeup_capable);
+
/**
* wakeup_source_not_registered - validate the given wakeup source.
* @ws: Wakeup source to be validated.
diff --git a/include/linux/pm_wakeup.h b/include/linux/pm_wakeup.h
index 661efa029c96..a0ca42aac6d6 100644
--- a/include/linux/pm_wakeup.h
+++ b/include/linux/pm_wakeup.h
@@ -97,6 +97,7 @@ extern int device_wakeup_disable(struct device *dev);
extern void device_set_wakeup_capable(struct device *dev, bool capable);
extern int device_init_wakeup(struct device *dev, bool val);
extern int device_set_wakeup_enable(struct device *dev, bool enable);
+extern bool device_children_wakeup_capable(struct device *dev);
extern void __pm_stay_awake(struct wakeup_source *ws);
extern void pm_stay_awake(struct device *dev);
extern void __pm_relax(struct wakeup_source *ws);
@@ -167,6 +168,11 @@ static inline bool device_may_wakeup(struct device *dev)
static inline void device_set_wakeup_path(struct device *dev) {}
+static inline bool device_children_wakeup_capable(struct device *dev)
+{
+ return false;
+}
+
static inline void __pm_stay_awake(struct wakeup_source *ws) {}
static inline void pm_stay_awake(struct device *dev) {}
next prev parent reply other threads:[~2021-11-01 19:00 UTC|newest]
Thread overview: 17+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-11-01 7:53 [PATCH v9 0/5] USB DWC3 host wake up support from system suspend Sandeep Maheswaram
2021-11-01 7:53 ` [PATCH v9 1/5] usb: host: xhci: plat: Add suspend quirk for dwc3 controller Sandeep Maheswaram
2021-11-01 18:59 ` Matthias Kaehlcke [this message]
2021-11-01 20:50 ` Bjorn Andersson
2021-11-01 21:05 ` Matthias Kaehlcke
2021-11-01 7:53 ` [PATCH v9 2/5] usb: dwc3: core: Host wake up support from system suspend Sandeep Maheswaram
2021-11-17 0:28 ` Brian Norris
2021-11-17 1:14 ` Matthias Kaehlcke
2021-11-17 3:09 ` Brian Norris
2021-11-17 6:01 ` Pavan Kondeti
2021-11-01 7:53 ` [PATCH v9 3/5] usb: dwc3: qcom: Add helper functions to enable,disable wake irqs Sandeep Maheswaram
2021-11-01 16:18 ` Matthias Kaehlcke
2021-11-01 16:39 ` Bjorn Andersson
2021-11-01 7:53 ` [PATCH v9 4/5] usb: dwc3: qcom: Change the IRQ flag for DP/DM hs phy irq Sandeep Maheswaram
2021-11-01 16:31 ` Bjorn Andersson
2021-11-18 11:45 ` Sandeep Maheswaram
2021-11-01 7:53 ` [PATCH v9 5/5] usb: dwc3: qcom: Keep power domain on to support wakeup 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=YYA4/rjSN/QvIM+w@google.com \
--to=mka@chromium.org \
--cc=agross@kernel.org \
--cc=balbi@kernel.org \
--cc=bjorn.andersson@linaro.org \
--cc=dianders@chromium.org \
--cc=gregkh@linuxfoundation.org \
--cc=linux-arm-msm@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-usb@vger.kernel.org \
--cc=mathias.nyman@intel.com \
--cc=quic_c_sanm@quicinc.com \
--cc=quic_pkondeti@quicinc.com \
--cc=quic_ppratap@quicinc.com \
--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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.