[PATCH] USB: Add pxa27x OHCI PM functions
authorRichard Purdie <rpurdie@rpsys.net>
Sat, 12 Nov 2005 14:22:14 +0000 (14:22 +0000)
committerGreg Kroah-Hartman <gregkh@suse.de>
Wed, 4 Jan 2006 21:48:29 +0000 (13:48 -0800)
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 <rpurdie@rpsys.net>
Signed-off-by: David Brownell <dbrownell@users.sourceforge.net>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
drivers/usb/host/ohci-pxa27x.c

index c165d1e..3b1cfe9 100644 (file)
@@ -312,28 +312,49 @@ static int ohci_hcd_pxa27x_drv_remove(struct platform_device *pdev)
        return 0;
 }
 
-static int ohci_hcd_pxa27x_drv_suspend(struct platform_device *dev, pm_message_t state)
+#ifdef CONFIG_PM
+static int ohci_hcd_pxa27x_drv_suspend(struct platform_device *pdev, pm_message_t state)
 {
-//     struct usb_hcd *hcd = platform_get_drvdata(dev);
-       printk("%s: not implemented yet\n", __FUNCTION__);
+       struct ohci_hcd *ohci = platform_get_drvdata(pdev);
+
+       if (time_before(jiffies, ohci->next_statechange))
+               msleep(5);
+       ohci->next_statechange = jiffies;
+
+       pxa27x_stop_hc(&pdev->dev);
+       ohci_to_hcd(ohci)->state = HC_STATE_SUSPENDED;
+       pdev->dev.power.power_state = PMSG_SUSPEND;
 
        return 0;
 }
 
-static int ohci_hcd_pxa27x_drv_resume(struct platform_device *dev)
+static int ohci_hcd_pxa27x_drv_resume(struct platform_device *pdev)
 {
-//     struct usb_hcd *hcd = platform_get_drvdata(dev);
-       printk("%s: not implemented yet\n", __FUNCTION__);
+       struct ohci_hcd *ohci = platform_get_drvdata(pdev);
+       int status;
+
+       if (time_before(jiffies, ohci->next_statechange))
+               msleep(5);
+       ohci->next_statechange = jiffies;
+
+       if ((status = pxa27x_start_hc(&pdev->dev)) < 0)
+               return status;
+
+       pdev->dev.power.power_state = PMSG_ON;
+       usb_hcd_resume_root_hub(platform_get_drvdata(pdev));
 
        return 0;
 }
+#endif
 
 
 static struct platform_driver ohci_hcd_pxa27x_driver = {
        .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
        .driver         = {
                .name   = "pxa27x-ohci",
        },