Richard Purdie and I have been sending updates for the same
driver... here's a new version of PM support that applies to 2.6.14-rc1
after his "USB PXA-27x OHCI Separate platform code from main driver"
patch.  Thanks -- Todd

Power Management for the Intel XScale PXA27x OHCI USB host controller

Signed-off-by: Todd Poynor <[EMAIL PROTECTED]>
Signed-off-by: Richard Purdie <[EMAIL PROTECTED]>

Index: linux-2.6.14-rc1/drivers/usb/host/ohci-pxa27x.c
===================================================================
--- linux-2.6.14-rc1.orig/drivers/usb/host/ohci-pxa27x.c        2005-09-13 
16:39:13.000000000 +0100
+++ linux-2.6.14-rc1/drivers/usb/host/ohci-pxa27x.c     2005-09-13 
16:40:34.000000000 +0100
@@ -287,6 +287,7 @@
        .hub_suspend =          ohci_hub_suspend,
        .hub_resume =           ohci_hub_resume,
 #endif
+       .start_port_reset =     ohci_start_port_reset,
 };
 
 /*-------------------------------------------------------------------------*/
@@ -309,32 +310,70 @@
        return 0;
 }
 
-static int ohci_hcd_pxa27x_drv_suspend(struct device *dev, pm_message_t state, 
u32 level)
+
+#ifdef CONFIG_PM
+
+static int ohci_hcd_pxa27x_drv_suspend(struct device *dev, pm_message_t 
message, u32 level)
 {
-//     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 = -EINVAL;
 
-       return 0;
+       if (level != SUSPEND_POWER_DOWN)
+               return 0;
+
+       down(&ohci_to_hcd(ohci)->self.root_hub->serialize);
+       status = ohci_hub_suspend(ohci_to_hcd(ohci));
+       if (status == 0) {
+               pxa27x_stop_hc(dev);
+               ohci_to_hcd(ohci)->self.root_hub->state =
+                       USB_STATE_SUSPENDED;
+               ohci_to_hcd(ohci)->state = HC_STATE_SUSPENDED;
+               dev->power.power_state = PMSG_SUSPEND;
+       }
+       up(&ohci_to_hcd(ohci)->self.root_hub->serialize);
+       return status;
 }
 
 static int ohci_hcd_pxa27x_drv_resume(struct device *dev, u32 level)
 {
-//     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 = 0;
 
-       return 0;
+       if (level != RESUME_POWER_ON)
+               return 0;
+
+       if (time_before(jiffies, ohci->next_statechange))
+               msleep(5);
+       ohci->next_statechange = jiffies;
+
+       if ((status = pxa27x_start_hc(dev)) < 0)        
+               return status;
+
+#ifdef CONFIG_USB_SUSPEND
+       /* get extra cleanup even if remote wakeup isn't in use */
+       status = usb_resume_device(ohci_to_hcd(ohci)->self.root_hub);
+#else
+       down(&ohci_to_hcd(ohci)->self.root_hub->serialize);
+       status = ohci_hub_resume(ohci_to_hcd(ohci));
+       up(&ohci_to_hcd(ohci)->self.root_hub->serialize);
+#endif
+       if (status == 0)
+               dev->power.power_state = PMSG_ON;
+
+       return status;
 }
 
+#endif
 
 static struct device_driver ohci_hcd_pxa27x_driver = {
        .name           = "pxa27x-ohci",
        .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, 
+       .resume         = ohci_hcd_pxa27x_drv_resume,
+#endif 
 };
 
 static int __init ohci_hcd_pxa27x_init (void)





-------------------------------------------------------
SF.Net email is sponsored by:
Tame your development challenges with Apache's Geronimo App Server. Download
it for free - -and be entered to win a 42" plasma tv or your very own
Sony(tm)PSP.  Click here to play: http://sourceforge.net/geronimo.php
_______________________________________________
[email protected]
To unsubscribe, use the last form field at:
https://lists.sourceforge.net/lists/listinfo/linux-usb-devel

Reply via email to