aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/usb/host/ohci-s3c2410.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/usb/host/ohci-s3c2410.c')
-rw-r--r--drivers/usb/host/ohci-s3c2410.c55
1 files changed, 53 insertions, 2 deletions
diff --git a/drivers/usb/host/ohci-s3c2410.c b/drivers/usb/host/ohci-s3c2410.c
index a1877c47601e..56dcf069246d 100644
--- a/drivers/usb/host/ohci-s3c2410.c
+++ b/drivers/usb/host/ohci-s3c2410.c
@@ -486,15 +486,66 @@ static int __devexit ohci_hcd_s3c2410_drv_remove(struct platform_device *pdev)
486 return 0; 486 return 0;
487} 487}
488 488
489#ifdef CONFIG_PM
490static int ohci_hcd_s3c2410_drv_suspend(struct device *dev)
491{
492 struct usb_hcd *hcd = dev_get_drvdata(dev);
493 struct ohci_hcd *ohci = hcd_to_ohci(hcd);
494 struct platform_device *pdev = to_platform_device(dev);
495 unsigned long flags;
496 int rc = 0;
497
498 /*
499 * Root hub was already suspended. Disable irq emission and
500 * mark HW unaccessible, bail out if RH has been resumed. Use
501 * the spinlock to properly synchronize with possible pending
502 * RH suspend or resume activity.
503 */
504 spin_lock_irqsave(&ohci->lock, flags);
505 if (ohci->rh_state != OHCI_RH_SUSPENDED) {
506 rc = -EINVAL;
507 goto bail;
508 }
509
510 clear_bit(HCD_FLAG_HW_ACCESSIBLE, &hcd->flags);
511
512 s3c2410_stop_hc(pdev);
513bail:
514 spin_unlock_irqrestore(&ohci->lock, flags);
515
516 return rc;
517}
518
519static int ohci_hcd_s3c2410_drv_resume(struct device *dev)
520{
521 struct usb_hcd *hcd = dev_get_drvdata(dev);
522 struct platform_device *pdev = to_platform_device(dev);
523
524 s3c2410_start_hc(pdev, hcd);
525
526 set_bit(HCD_FLAG_HW_ACCESSIBLE, &hcd->flags);
527 ohci_finish_controller_resume(hcd);
528
529 return 0;
530}
531#else
532#define ohci_hcd_s3c2410_drv_suspend NULL
533#define ohci_hcd_s3c2410_drv_resume NULL
534#endif
535
536static const struct dev_pm_ops ohci_hcd_s3c2410_pm_ops = {
537 .suspend = ohci_hcd_s3c2410_drv_suspend,
538 .resume = ohci_hcd_s3c2410_drv_resume,
539};
540
489static struct platform_driver ohci_hcd_s3c2410_driver = { 541static struct platform_driver ohci_hcd_s3c2410_driver = {
490 .probe = ohci_hcd_s3c2410_drv_probe, 542 .probe = ohci_hcd_s3c2410_drv_probe,
491 .remove = __devexit_p(ohci_hcd_s3c2410_drv_remove), 543 .remove = __devexit_p(ohci_hcd_s3c2410_drv_remove),
492 .shutdown = usb_hcd_platform_shutdown, 544 .shutdown = usb_hcd_platform_shutdown,
493 /*.suspend = ohci_hcd_s3c2410_drv_suspend, */
494 /*.resume = ohci_hcd_s3c2410_drv_resume, */
495 .driver = { 545 .driver = {
496 .owner = THIS_MODULE, 546 .owner = THIS_MODULE,
497 .name = "s3c2410-ohci", 547 .name = "s3c2410-ohci",
548 .pm = &ohci_hcd_s3c2410_pm_ops,
498 }, 549 },
499}; 550};
500 551