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