On Mon, 21 Nov 2011, Jingoo Han wrote: > This patch adds power management support such as suspend and resume > functions. > > Signed-off-by: Jingoo Han <jg1.han@xxxxxxxxxxx> > --- > drivers/usb/host/ohci-s3c2410.c | 58 +++++++++++++++++++++++++++++++++++++- > 1 files changed, 56 insertions(+), 2 deletions(-) > > diff --git a/drivers/usb/host/ohci-s3c2410.c b/drivers/usb/host/ohci-s3c2410.c > index a1877c4..4832a7a 100644 > --- a/drivers/usb/host/ohci-s3c2410.c > +++ b/drivers/usb/host/ohci-s3c2410.c > @@ -486,15 +486,69 @@ static int __devexit ohci_hcd_s3c2410_drv_remove(struct platform_device *pdev) > return 0; > } > > +#ifdef CONFIG_PM > +static int ohci_hcd_s3c2410_drv_suspend(struct device *dev) > +{ > + struct usb_hcd *hcd = dev_get_drvdata(dev); > + struct ohci_hcd *ohci = hcd_to_ohci(hcd); > + struct platform_device *pdev = to_platform_device(dev); > + unsigned long flags; > + int rc = 0; > + > + /* Root hub was already suspended. Disable irq emission and > + * mark HW unaccessible, bail out if RH has been resumed. Use > + * the spinlock to properly synchronize with possible pending > + * RH suspend or resume activity. > + * > + * This is still racy as hcd->state is manipulated outside of > + * any locks =P But that will be a different fix. > + */ > + spin_lock_irqsave(&ohci->lock, flags); > + if (hcd->state != HC_STATE_SUSPENDED) { > + rc = -EINVAL; > + goto bail; > + } > + > + clear_bit(HCD_FLAG_HW_ACCESSIBLE, &hcd->flags); > + > + s3c2410_stop_hc(pdev); > +bail: > + spin_unlock_irqrestore(&ohci->lock, flags); > + > + return rc; > +} > + > +static int ohci_hcd_s3c2410_drv_resume(struct device *dev) > +{ > + struct usb_hcd *hcd = dev_get_drvdata(dev); > + struct platform_device *pdev = to_platform_device(dev); > + int rc = 0; > + > + s3c2410_start_hc(pdev, hcd); > + > + set_bit(HCD_FLAG_HW_ACCESSIBLE, &hcd->flags); > + ohci_finish_controller_resume(hcd); > + > + return rc; > +} > +#else > +#define ohci_hcd_s3c2410_drv_suspend NULL > +#define ohci_hcd_s3c2410_drv_resume NULL > +#endif > + > +static const struct dev_pm_ops ohci_hcd_s3c2410_pm_ops = { > + .suspend = ohci_hcd_s3c2410_drv_suspend, > + .resume = ohci_hcd_s3c2410_drv_resume, > +}; > + > static struct platform_driver ohci_hcd_s3c2410_driver = { > .probe = ohci_hcd_s3c2410_drv_probe, > .remove = __devexit_p(ohci_hcd_s3c2410_drv_remove), > .shutdown = usb_hcd_platform_shutdown, > - /*.suspend = ohci_hcd_s3c2410_drv_suspend, */ > - /*.resume = ohci_hcd_s3c2410_drv_resume, */ > .driver = { > .owner = THIS_MODULE, > .name = "s3c2410-ohci", > + .pm = &ohci_hcd_s3c2410_pm_ops, > }, > }; This patch is already out of date because of changes recently added to Greg KH's git tree. Take a look at commit b7463c71fbbff7111d0c879d2f64fe2b08f51848 (OHCI: remove uses of hcd->state) in the usb-next branch. In particular, look at the changes to the ohci-au1xxx.c file. Alan Stern -- To unsubscribe from this list: send the line "unsubscribe linux-usb" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html