diff options
Diffstat (limited to 'drivers/usb')
-rw-r--r-- | drivers/usb/musb/blackfin.c | 64 |
1 files changed, 40 insertions, 24 deletions
diff --git a/drivers/usb/musb/blackfin.c b/drivers/usb/musb/blackfin.c index 8c9c5fc3a6ca..df0e906b1850 100644 --- a/drivers/usb/musb/blackfin.c +++ b/drivers/usb/musb/blackfin.c | |||
@@ -27,6 +27,7 @@ struct bfin_glue { | |||
27 | struct device *dev; | 27 | struct device *dev; |
28 | struct platform_device *musb; | 28 | struct platform_device *musb; |
29 | }; | 29 | }; |
30 | #define glue_to_musb(g) platform_get_drvdata(g->musb) | ||
30 | 31 | ||
31 | /* | 32 | /* |
32 | * Load an endpoint's FIFO | 33 | * Load an endpoint's FIFO |
@@ -406,27 +407,6 @@ static int bfin_musb_init(struct musb *musb) | |||
406 | return 0; | 407 | return 0; |
407 | } | 408 | } |
408 | 409 | ||
409 | static int bfin_musb_suspend(struct musb *musb) | ||
410 | { | ||
411 | if (is_host_active(musb)) | ||
412 | /* | ||
413 | * During hibernate gpio_vrsel will change from high to low | ||
414 | * low which will generate wakeup event resume the system | ||
415 | * immediately. Set it to 0 before hibernate to avoid this | ||
416 | * wakeup event. | ||
417 | */ | ||
418 | gpio_set_value(musb->config->gpio_vrsel, 0); | ||
419 | |||
420 | return 0; | ||
421 | } | ||
422 | |||
423 | static int bfin_musb_resume(struct musb *musb) | ||
424 | { | ||
425 | bfin_musb_reg_init(musb); | ||
426 | |||
427 | return 0; | ||
428 | } | ||
429 | |||
430 | static int bfin_musb_exit(struct musb *musb) | 410 | static int bfin_musb_exit(struct musb *musb) |
431 | { | 411 | { |
432 | gpio_free(musb->config->gpio_vrsel); | 412 | gpio_free(musb->config->gpio_vrsel); |
@@ -446,9 +426,6 @@ static const struct musb_platform_ops bfin_ops = { | |||
446 | .set_mode = bfin_musb_set_mode, | 426 | .set_mode = bfin_musb_set_mode, |
447 | .try_idle = bfin_musb_try_idle, | 427 | .try_idle = bfin_musb_try_idle, |
448 | 428 | ||
449 | .suspend = bfin_musb_suspend, | ||
450 | .resume = bfin_musb_resume, | ||
451 | |||
452 | .vbus_status = bfin_musb_vbus_status, | 429 | .vbus_status = bfin_musb_vbus_status, |
453 | .set_vbus = bfin_musb_set_vbus, | 430 | .set_vbus = bfin_musb_set_vbus, |
454 | }; | 431 | }; |
@@ -528,10 +505,49 @@ static int __exit bfin_remove(struct platform_device *pdev) | |||
528 | return 0; | 505 | return 0; |
529 | } | 506 | } |
530 | 507 | ||
508 | #ifdef CONFIG_PM | ||
509 | static int bfin_suspend(struct device *dev) | ||
510 | { | ||
511 | struct bfin_glue *glue = dev_get_drvdata(dev); | ||
512 | struct musb *musb = glue_to_musb(glue); | ||
513 | |||
514 | if (is_host_active(musb)) | ||
515 | /* | ||
516 | * During hibernate gpio_vrsel will change from high to low | ||
517 | * low which will generate wakeup event resume the system | ||
518 | * immediately. Set it to 0 before hibernate to avoid this | ||
519 | * wakeup event. | ||
520 | */ | ||
521 | gpio_set_value(musb->config->gpio_vrsel, 0); | ||
522 | |||
523 | return 0; | ||
524 | } | ||
525 | |||
526 | static int bfin_resume(struct device *dev) | ||
527 | { | ||
528 | struct bfin_glue *glue = dev_get_drvdata(dev); | ||
529 | struct musb *musb = glue_to_musb(glue); | ||
530 | |||
531 | bfin_musb_reg_init(musb); | ||
532 | |||
533 | return 0; | ||
534 | } | ||
535 | |||
536 | static struct dev_pm_ops bfin_pm_ops = { | ||
537 | .suspend = bfin_suspend, | ||
538 | .resume = bfin_resume, | ||
539 | }; | ||
540 | |||
541 | #define DEV_PM_OPS &bfin_pm_op, | ||
542 | #else | ||
543 | #define DEV_PM_OPS NULL | ||
544 | #endif | ||
545 | |||
531 | static struct platform_driver bfin_driver = { | 546 | static struct platform_driver bfin_driver = { |
532 | .remove = __exit_p(bfin_remove), | 547 | .remove = __exit_p(bfin_remove), |
533 | .driver = { | 548 | .driver = { |
534 | .name = "musb-bfin", | 549 | .name = "musb-bfin", |
550 | .pm = DEV_PM_OPS, | ||
535 | }, | 551 | }, |
536 | }; | 552 | }; |
537 | 553 | ||