diff options
Diffstat (limited to 'drivers/usb/host/ohci-s3c2410.c')
-rw-r--r-- | drivers/usb/host/ohci-s3c2410.c | 55 |
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 | ||
490 | static 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); | ||
513 | bail: | ||
514 | spin_unlock_irqrestore(&ohci->lock, flags); | ||
515 | |||
516 | return rc; | ||
517 | } | ||
518 | |||
519 | static 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 | |||
536 | static 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 | |||
489 | static struct platform_driver ohci_hcd_s3c2410_driver = { | 541 | static 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 | ||