usb: chipidea: host: add suspend/resume support for host controller
authorXu Yang <xu.yang_2@nxp.com>
Thu, 13 Oct 2022 15:14:37 +0000 (23:14 +0800)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Sun, 23 Oct 2022 12:34:53 +0000 (14:34 +0200)
The controller's power may be powered off during system suspend. This
will add suspend/resume support when the controller suffers power lost.

Signed-off-by: Xu Yang <xu.yang_2@nxp.com>
Link: https://lore.kernel.org/r/20221013151442.3262951-4-xu.yang_2@nxp.com
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/usb/chipidea/host.c

index bc3634a54c6b7f5e5e3aa95bac1e7af0e41e642e..ebe7400243b127baf9c503b0060b80f9c33b6541 100644 (file)
@@ -459,6 +459,18 @@ static void ci_hdrc_unmap_urb_for_dma(struct usb_hcd *hcd, struct urb *urb)
        ci_hdrc_free_dma_aligned_buffer(urb);
 }
 
+#ifdef CONFIG_PM_SLEEP
+static void ci_hdrc_host_suspend(struct ci_hdrc *ci)
+{
+       ehci_suspend(ci->hcd, device_may_wakeup(ci->dev));
+}
+
+static void ci_hdrc_host_resume(struct ci_hdrc *ci, bool power_lost)
+{
+       ehci_resume(ci->hcd, power_lost);
+}
+#endif
+
 int ci_hdrc_host_init(struct ci_hdrc *ci)
 {
        struct ci_role_driver *rdrv;
@@ -472,6 +484,10 @@ int ci_hdrc_host_init(struct ci_hdrc *ci)
 
        rdrv->start     = host_start;
        rdrv->stop      = host_stop;
+#ifdef CONFIG_PM_SLEEP
+       rdrv->suspend   = ci_hdrc_host_suspend;
+       rdrv->resume    = ci_hdrc_host_resume;
+#endif
        rdrv->irq       = host_irq;
        rdrv->name      = "host";
        ci->roles[CI_ROLE_HOST] = rdrv;