[PATCH] all HCDs provide root hub suspend/resume methods

This cleans up a small recent FIXME, ensuring that all the HCDs provide
root hub suspend/resume methods.  It also wraps the calls to those root
suspend routines just like on the PCI "USB_SUSPEND not defined" cases,
so non-PCI bus glue won't be as tempted to behave very differently.

Several of the SOC based OHCI drivers forgot to list those methods;
the patch also adds those missing declarations.

Signed-off-by: David Brownell <[EMAIL PROTECTED]>
Signed-off-by: Greg Kroah-Hartman <[EMAIL PROTECTED]>

 drivers/usb/core/hcd.c          |   42 +++++++++++++++++++++++++---------------
 drivers/usb/host/ohci-au1xxx.c  |    5 ++++
 drivers/usb/host/ohci-lh7a404.c |    5 ++++
 drivers/usb/host/ohci-pxa27x.c  |    1
 drivers/usb/host/ohci-s3c2410.c |    1
 drivers/usb/host/ohci-sa1111.c  |    1
 6 files changed, 40 insertions(+), 15 deletions(-)

---
commit 9293677af3dace2645dec0d0808efa02d36bf47b
tree 1300a91bd6d6b20a69e35f67e7ff71b5a5d776e6
parent 7ff71d6adf81a43505b7cbaa034e4063d3439182
author David Brownell <[EMAIL PROTECTED]> Thu, 22 Sep 2005 22:32:11 -0700
committer Greg Kroah-Hartman <[EMAIL PROTECTED]> Fri, 28 Oct 2005 16:47:40 -0700

 drivers/usb/core/hcd.c          |   42 +++++++++++++++++++++++++--------------
 drivers/usb/host/ohci-au1xxx.c  |    5 +++++
 drivers/usb/host/ohci-lh7a404.c |    5 +++++
 drivers/usb/host/ohci-pxa27x.c  |    1 +
 drivers/usb/host/ohci-s3c2410.c |    1 +
 drivers/usb/host/ohci-sa1111.c  |    1 +
 6 files changed, 40 insertions(+), 15 deletions(-)

diff --git a/drivers/usb/core/hcd.c b/drivers/usb/core/hcd.c
index 5e8ade0..375382f 100644
--- a/drivers/usb/core/hcd.c
+++ b/drivers/usb/core/hcd.c
@@ -1431,28 +1431,44 @@ rescan:
 
 /*-------------------------------------------------------------------------*/
 
-/* FIXME make this #ifdef CONFIG_PM ... update root hubs, retest */
-
-#ifdef CONFIG_USB_SUSPEND
+#ifdef CONFIG_PM
 
 static int hcd_hub_suspend (struct usb_bus *bus)
 {
        struct usb_hcd          *hcd;
+       int                     status;
 
        hcd = container_of (bus, struct usb_hcd, self);
-       if (hcd->driver->hub_suspend)
-               return hcd->driver->hub_suspend (hcd);
-       return 0;
+       if (!hcd->driver->hub_suspend)
+               return -ENOENT;
+       hcd->state = HC_STATE_QUIESCING;
+       status = hcd->driver->hub_suspend (hcd);
+       if (status == 0)
+               hcd->state = HC_STATE_SUSPENDED;
+       else
+               dev_dbg(&bus->root_hub->dev, "%s fail, err %d\n",
+                               "suspend", status);
+       return status;
 }
 
 static int hcd_hub_resume (struct usb_bus *bus)
 {
        struct usb_hcd          *hcd;
+       int                     status;
 
        hcd = container_of (bus, struct usb_hcd, self);
-       if (hcd->driver->hub_resume)
-               return hcd->driver->hub_resume (hcd);
-       return 0;
+       if (!hcd->driver->hub_resume)
+               return -ENOENT;
+       hcd->state = HC_STATE_RESUMING;
+       status = hcd->driver->hub_resume (hcd);
+       if (status == 0)
+               hcd->state = HC_STATE_RUNNING;
+       else {
+               dev_dbg(&bus->root_hub->dev, "%s fail, err %d\n",
+                               "resume", status);
+               usb_hc_died(hcd);
+       }
+       return status;
 }
 
 /**
@@ -1473,13 +1489,9 @@ void usb_hcd_resume_root_hub (struct usb
                usb_resume_root_hub (hcd->self.root_hub);
        spin_unlock_irqrestore (&hcd_root_hub_lock, flags);
 }
+EXPORT_SYMBOL_GPL(usb_hcd_resume_root_hub);
 
-#else
-void usb_hcd_resume_root_hub (struct usb_hcd *hcd)
-{
-}
 #endif
-EXPORT_SYMBOL_GPL(usb_hcd_resume_root_hub);
 
 /*-------------------------------------------------------------------------*/
 
@@ -1532,7 +1544,7 @@ static struct usb_operations usb_hcd_ope
        .buffer_alloc =         hcd_buffer_alloc,
        .buffer_free =          hcd_buffer_free,
        .disable =              hcd_endpoint_disable,
-#ifdef CONFIG_USB_SUSPEND
+#ifdef CONFIG_PM
        .hub_suspend =          hcd_hub_suspend,
        .hub_resume =           hcd_hub_resume,
 #endif
diff --git a/drivers/usb/host/ohci-au1xxx.c b/drivers/usb/host/ohci-au1xxx.c
index 3981bf1..550d67a 100644
--- a/drivers/usb/host/ohci-au1xxx.c
+++ b/drivers/usb/host/ohci-au1xxx.c
@@ -214,6 +214,11 @@ static const struct hc_driver ohci_au1xx
         */
        .hub_status_data =      ohci_hub_status_data,
        .hub_control =          ohci_hub_control,
+#ifdef CONFIG_PM
+       .hub_suspend =          ohci_hub_suspend,
+       .hub_resume =           ohci_hub_resume,
+#endif
+       .start_port_reset =     ohci_start_port_reset,
 };
 
 /*-------------------------------------------------------------------------*/
diff --git a/drivers/usb/host/ohci-lh7a404.c b/drivers/usb/host/ohci-lh7a404.c
index 859aca7..71d975a 100644
--- a/drivers/usb/host/ohci-lh7a404.c
+++ b/drivers/usb/host/ohci-lh7a404.c
@@ -193,6 +193,11 @@ static const struct hc_driver ohci_lh7a4
         */
        .hub_status_data =      ohci_hub_status_data,
        .hub_control =          ohci_hub_control,
+#ifdef CONFIG_PM
+       .hub_suspend =          ohci_hub_suspend,
+       .hub_resume =           ohci_hub_resume,
+#endif
+       .start_port_reset =     ohci_start_port_reset,
 };
 
 /*-------------------------------------------------------------------------*/
diff --git a/drivers/usb/host/ohci-pxa27x.c b/drivers/usb/host/ohci-pxa27x.c
index 986c4f6..2e7b485 100644
--- a/drivers/usb/host/ohci-pxa27x.c
+++ b/drivers/usb/host/ohci-pxa27x.c
@@ -282,6 +282,7 @@ static const struct hc_driver ohci_pxa27
        .hub_suspend =          ohci_hub_suspend,
        .hub_resume =           ohci_hub_resume,
 #endif
+       .start_port_reset =     ohci_start_port_reset,
 };
 
 /*-------------------------------------------------------------------------*/
diff --git a/drivers/usb/host/ohci-s3c2410.c b/drivers/usb/host/ohci-s3c2410.c
index 8cf12b2..922e2a6 100644
--- a/drivers/usb/host/ohci-s3c2410.c
+++ b/drivers/usb/host/ohci-s3c2410.c
@@ -452,6 +452,7 @@ static const struct hc_driver ohci_s3c24
        .hub_suspend =          ohci_hub_suspend,
        .hub_resume =           ohci_hub_resume,
 #endif
+       .start_port_reset =     ohci_start_port_reset,
 };
 
 /* device driver */
diff --git a/drivers/usb/host/ohci-sa1111.c b/drivers/usb/host/ohci-sa1111.c
index 7dd1f41..13324b7 100644
--- a/drivers/usb/host/ohci-sa1111.c
+++ b/drivers/usb/host/ohci-sa1111.c
@@ -239,6 +239,7 @@ static const struct hc_driver ohci_sa111
        .hub_suspend =          ohci_hub_suspend,
        .hub_resume =           ohci_hub_resume,
 #endif
+       .start_port_reset =     ohci_start_port_reset,
 };
 
 /*-------------------------------------------------------------------------*/



-------------------------------------------------------
This SF.Net email is sponsored by the JBoss Inc.
Get Certified Today * Register for a JBoss Training Course
Free Certification Exam for All Training Attendees Through End of 2005
Visit http://www.jboss.com/services/certification for more information
_______________________________________________
[email protected]
To unsubscribe, use the last form field at:
https://lists.sourceforge.net/lists/listinfo/linux-usb-devel

Reply via email to