On 24.5.2020 2.23, Peter Chen wrote: > Some platforms (eg cdns3) may have special sequences between > xhci_bus_suspend and xhci_suspend, add .suspend_quick for it. > > Signed-off-by: Peter Chen <peter.chen@xxxxxxx> > --- > drivers/usb/host/xhci-plat.c | 19 +++++++++++++++++++ > drivers/usb/host/xhci-plat.h | 1 + > 2 files changed, 20 insertions(+) > > diff --git a/drivers/usb/host/xhci-plat.c b/drivers/usb/host/xhci-plat.c > index 38bea2b6a17d..51e20464fe0a 100644 > --- a/drivers/usb/host/xhci-plat.c > +++ b/drivers/usb/host/xhci-plat.c > @@ -54,6 +54,16 @@ static int xhci_priv_init_quirk(struct usb_hcd *hcd) > return priv->init_quirk(hcd); > } > > +static int xhci_priv_suspend_quirk(struct usb_hcd *hcd) > +{ > + struct xhci_plat_priv *priv = hcd_to_xhci_priv(hcd); > + > + if (!priv->suspend_quirk) > + return 0; > + > + return priv->suspend_quirk(hcd); > +} > + > static int xhci_priv_resume_quirk(struct usb_hcd *hcd) > { > struct xhci_plat_priv *priv = hcd_to_xhci_priv(hcd); > @@ -401,7 +411,11 @@ static int __maybe_unused xhci_plat_suspend(struct device *dev) > { > struct usb_hcd *hcd = dev_get_drvdata(dev); > struct xhci_hcd *xhci = hcd_to_xhci(hcd); > + int ret; > > + ret = xhci_priv_suspend_quirk(hcd); > + if (ret) > + return ret; > /* > * xhci_suspend() needs `do_wakeup` to know whether host is allowed > * to do wakeup during suspend. Since xhci_plat_suspend is currently > @@ -438,6 +452,11 @@ static int __maybe_unused xhci_plat_runtime_suspend(struct device *dev) > { > struct usb_hcd *hcd = dev_get_drvdata(dev); > struct xhci_hcd *xhci = hcd_to_xhci(hcd); > + int ret; > + > + ret = xhci_priv_suspend_quirk(hcd); > + if (ret) > + return ret; > > return xhci_suspend(xhci, true); > } > diff --git a/drivers/usb/host/xhci-plat.h b/drivers/usb/host/xhci-plat.h > index b49f6447bd3a..1fb149d1fbce 100644 > --- a/drivers/usb/host/xhci-plat.h > +++ b/drivers/usb/host/xhci-plat.h > @@ -15,6 +15,7 @@ struct xhci_plat_priv { > unsigned long long quirks; > void (*plat_start)(struct usb_hcd *); > int (*init_quirk)(struct usb_hcd *); > + int (*suspend_quirk)(struct usb_hcd *); > int (*resume_quirk)(struct usb_hcd *); > }; > > Acked-by: Mathias Nyman <mathias.nyman@xxxxxxxxxxxxxxx>