| From 82467739e6ba263655c90983dca0a2859a6676d7 Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Fri, 18 Sep 2020 16:17:49 +0300 |
| Subject: usb: xhci: omit duplicate actions when suspending a runtime suspended |
| host. |
| |
| From: Peter Chen <peter.chen@nxp.com> |
| |
| [ Upstream commit 18a367e8947d72dd91b6fc401e88a2952c6363f7 ] |
| |
| If the xhci-plat.c is the platform driver, after the runtime pm is |
| enabled, the xhci_suspend is called if nothing is connected on |
| the port. When the system goes to suspend, it will call xhci_suspend again |
| if USB wakeup is enabled. |
| |
| Since the runtime suspend wakeup setting is not always the same as |
| system suspend wakeup setting, eg, at runtime suspend we always need |
| wakeup if the controller is in low power mode; but at system suspend, |
| we may not need wakeup. So, we move the judgement after changing |
| wakeup setting. |
| |
| [commit message rewording -Mathias] |
| |
| Reviewed-by: Jun Li <jun.li@nxp.com> |
| Signed-off-by: Peter Chen <peter.chen@nxp.com> |
| Signed-off-by: Mathias Nyman <mathias.nyman@linux.intel.com> |
| Link: https://lore.kernel.org/r/20200918131752.16488-8-mathias.nyman@linux.intel.com |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| drivers/usb/host/xhci.c | 7 +++++-- |
| 1 file changed, 5 insertions(+), 2 deletions(-) |
| |
| diff --git a/drivers/usb/host/xhci.c b/drivers/usb/host/xhci.c |
| index e534f524b7f87..e88f4f9539955 100644 |
| --- a/drivers/usb/host/xhci.c |
| +++ b/drivers/usb/host/xhci.c |
| @@ -982,12 +982,15 @@ int xhci_suspend(struct xhci_hcd *xhci, bool do_wakeup) |
| xhci->shared_hcd->state != HC_STATE_SUSPENDED) |
| return -EINVAL; |
| |
| - xhci_dbc_suspend(xhci); |
| - |
| /* Clear root port wake on bits if wakeup not allowed. */ |
| if (!do_wakeup) |
| xhci_disable_port_wake_on_bits(xhci); |
| |
| + if (!HCD_HW_ACCESSIBLE(hcd)) |
| + return 0; |
| + |
| + xhci_dbc_suspend(xhci); |
| + |
| /* Don't poll the roothubs on bus suspend. */ |
| xhci_dbg(xhci, "%s: stopping port polling.\n", __func__); |
| clear_bit(HCD_FLAG_POLL_RH, &hcd->flags); |
| -- |
| 2.27.0 |
| |