Thanks, I've made your suggested changes below. Since I have an OMAP1510 handy I can make those same changes to ohci-omap too if you like.
So far as I thought I knew, pm_message_t will eventually become a struct with fields that can be used to properly describe what sort of driver behavior is needed at suspend and resume, but I might be behind the times. Since system suspend currently forces a pm_message == ACPI D3 for all suspend modes (and previously a 3 was forced as well), we'd have to work outside the system to apply any intelligence to system suspend handling anyhow, before or after the pm_message_t conversion. But I suppose we can battle that out on linux-pm if it comes to that. Thanks -- Todd Index: linux-2.6.12-rc4/drivers/usb/host/ohci-pxa27x.c =================================================================== --- linux-2.6.12-rc4.orig/drivers/usb/host/ohci-pxa27x.c 2005-06-09 02:56:43.000000000 +0000 +++ linux-2.6.12-rc4/drivers/usb/host/ohci-pxa27x.c 2005-06-10 03:02:38.000000000 +0000 @@ -310,6 +310,7 @@ .hub_suspend = ohci_hub_suspend, .hub_resume = ohci_hub_resume, #endif + .start_port_reset = ohci_start_port_reset, }; /*-------------------------------------------------------------------------*/ @@ -337,32 +338,65 @@ 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 platform_device *pdev = to_platform_device(dev); + 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(pdev); + ohci_to_hcd(ohci)->self.root_hub->state = + USB_STATE_SUSPENDED; + ohci_to_hcd(ohci)->state = HC_STATE_SUSPENDED; + } + 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 platform_device *pdev = to_platform_device(dev); + 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; + pxa27x_start_hc(pdev); +#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 + 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) ------------------------------------------------------- This SF.Net email is sponsored by: NEC IT Guy Games. How far can you shotput a projector? How fast can you ride your desk chair down the office luge track? If you want to score the big prize, get to know the little guy. Play to win an NEC 61" plasma display: http://www.necitguy.com/?r=20 _______________________________________________ linux-usb-devel@lists.sourceforge.net To unsubscribe, use the last form field at: https://lists.sourceforge.net/lists/listinfo/linux-usb-devel