Add power management functions for the pxa27x USB OHCI host controller.
This is a totally rewritten version of the patch by Nicolas Pitre and
Todd Poynor which accounts for recent USB changes.

Signed-off-by: Richard Purdie

Index: git/drivers/usb/host/ohci-pxa27x.c
===================================================================
--- git.orig/drivers/usb/host/ohci-pxa27x.c     2005-10-30 11:26:52.000000000 
+0000
+++ git/drivers/usb/host/ohci-pxa27x.c  2005-10-30 12:11:18.000000000 +0000
@@ -310,23 +310,40 @@
        return 0;
 }
 
+#ifdef CONFIG_PM
 static int ohci_hcd_pxa27x_drv_suspend(struct device *dev, pm_message_t state)
 {
-//     struct platform_device *pdev = to_platform_device(dev);
-//     struct usb_hcd *hcd = dev_get_drvdata(dev);
-       printk("%s: not implemented yet\n", __FUNCTION__);
+       struct ohci_hcd *ohci = hcd_to_ohci(dev_get_drvdata(dev));
+
+       if (time_before(jiffies, ohci->next_statechange))
+               msleep(5);
+       ohci->next_statechange = jiffies;
+
+       pxa27x_stop_hc(dev);
+       ohci_to_hcd(ohci)->state = HC_STATE_SUSPENDED;
+       dev->power.power_state = PMSG_SUSPEND;
 
        return 0;
 }
 
 static int ohci_hcd_pxa27x_drv_resume(struct device *dev)
 {
-//     struct platform_device *pdev = to_platform_device(dev);
-//     struct usb_hcd *hcd = dev_get_drvdata(dev);
-       printk("%s: not implemented yet\n", __FUNCTION__);
+       struct ohci_hcd *ohci = hcd_to_ohci(dev_get_drvdata(dev));
+       int status;
+
+       if (time_before(jiffies, ohci->next_statechange))
+               msleep(5);
+       ohci->next_statechange = jiffies;
+
+       if ((status = pxa27x_start_hc(dev)) < 0)        
+               return status;
+
+       dev->power.power_state = PMSG_ON;
+       usb_hcd_resume_root_hub(dev_get_drvdata(dev));
 
        return 0;
 }
+#endif
 
 
 static struct device_driver ohci_hcd_pxa27x_driver = {
@@ -334,8 +351,10 @@
        .bus            = &platform_bus_type,
        .probe          = ohci_hcd_pxa27x_drv_probe,
        .remove         = ohci_hcd_pxa27x_drv_remove,
+#ifdef CONFIG_PM
        .suspend        = ohci_hcd_pxa27x_drv_suspend, 
        .resume         = ohci_hcd_pxa27x_drv_resume, 
+#endif
 };
 
 static int __init ohci_hcd_pxa27x_init (void)




-------------------------------------------------------
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
_______________________________________________
linux-usb-devel@lists.sourceforge.net
To unsubscribe, use the last form field at:
https://lists.sourceforge.net/lists/listinfo/linux-usb-devel

Reply via email to