diff options
| -rw-r--r-- | drivers/clocksource/sh_cmt.c | 35 |
1 files changed, 31 insertions, 4 deletions
diff --git a/drivers/clocksource/sh_cmt.c b/drivers/clocksource/sh_cmt.c index 98b06baafcc6..c06d27fc59e8 100644 --- a/drivers/clocksource/sh_cmt.c +++ b/drivers/clocksource/sh_cmt.c | |||
| @@ -464,9 +464,20 @@ static void sh_cmt_clocksource_disable(struct clocksource *cs) | |||
| 464 | sh_cmt_stop(cs_to_sh_cmt(cs), FLAG_CLOCKSOURCE); | 464 | sh_cmt_stop(cs_to_sh_cmt(cs), FLAG_CLOCKSOURCE); |
| 465 | } | 465 | } |
| 466 | 466 | ||
| 467 | static void sh_cmt_clocksource_suspend(struct clocksource *cs) | ||
| 468 | { | ||
| 469 | struct sh_cmt_priv *p = cs_to_sh_cmt(cs); | ||
| 470 | |||
| 471 | sh_cmt_stop(p, FLAG_CLOCKSOURCE); | ||
| 472 | pm_genpd_syscore_poweroff(&p->pdev->dev); | ||
| 473 | } | ||
| 474 | |||
| 467 | static void sh_cmt_clocksource_resume(struct clocksource *cs) | 475 | static void sh_cmt_clocksource_resume(struct clocksource *cs) |
| 468 | { | 476 | { |
| 469 | sh_cmt_start(cs_to_sh_cmt(cs), FLAG_CLOCKSOURCE); | 477 | struct sh_cmt_priv *p = cs_to_sh_cmt(cs); |
| 478 | |||
| 479 | pm_genpd_syscore_poweron(&p->pdev->dev); | ||
| 480 | sh_cmt_start(p, FLAG_CLOCKSOURCE); | ||
| 470 | } | 481 | } |
| 471 | 482 | ||
| 472 | static int sh_cmt_register_clocksource(struct sh_cmt_priv *p, | 483 | static int sh_cmt_register_clocksource(struct sh_cmt_priv *p, |
| @@ -479,7 +490,7 @@ static int sh_cmt_register_clocksource(struct sh_cmt_priv *p, | |||
| 479 | cs->read = sh_cmt_clocksource_read; | 490 | cs->read = sh_cmt_clocksource_read; |
| 480 | cs->enable = sh_cmt_clocksource_enable; | 491 | cs->enable = sh_cmt_clocksource_enable; |
| 481 | cs->disable = sh_cmt_clocksource_disable; | 492 | cs->disable = sh_cmt_clocksource_disable; |
| 482 | cs->suspend = sh_cmt_clocksource_disable; | 493 | cs->suspend = sh_cmt_clocksource_suspend; |
| 483 | cs->resume = sh_cmt_clocksource_resume; | 494 | cs->resume = sh_cmt_clocksource_resume; |
| 484 | cs->mask = CLOCKSOURCE_MASK(sizeof(unsigned long) * 8); | 495 | cs->mask = CLOCKSOURCE_MASK(sizeof(unsigned long) * 8); |
| 485 | cs->flags = CLOCK_SOURCE_IS_CONTINUOUS; | 496 | cs->flags = CLOCK_SOURCE_IS_CONTINUOUS; |
| @@ -562,6 +573,16 @@ static int sh_cmt_clock_event_next(unsigned long delta, | |||
| 562 | return 0; | 573 | return 0; |
| 563 | } | 574 | } |
| 564 | 575 | ||
| 576 | static void sh_cmt_clock_event_suspend(struct clock_event_device *ced) | ||
| 577 | { | ||
| 578 | pm_genpd_syscore_poweroff(&ced_to_sh_cmt(ced)->pdev->dev); | ||
| 579 | } | ||
| 580 | |||
| 581 | static void sh_cmt_clock_event_resume(struct clock_event_device *ced) | ||
| 582 | { | ||
| 583 | pm_genpd_syscore_poweron(&ced_to_sh_cmt(ced)->pdev->dev); | ||
| 584 | } | ||
| 585 | |||
| 565 | static void sh_cmt_register_clockevent(struct sh_cmt_priv *p, | 586 | static void sh_cmt_register_clockevent(struct sh_cmt_priv *p, |
| 566 | char *name, unsigned long rating) | 587 | char *name, unsigned long rating) |
| 567 | { | 588 | { |
| @@ -576,6 +597,8 @@ static void sh_cmt_register_clockevent(struct sh_cmt_priv *p, | |||
| 576 | ced->cpumask = cpumask_of(0); | 597 | ced->cpumask = cpumask_of(0); |
| 577 | ced->set_next_event = sh_cmt_clock_event_next; | 598 | ced->set_next_event = sh_cmt_clock_event_next; |
| 578 | ced->set_mode = sh_cmt_clock_event_mode; | 599 | ced->set_mode = sh_cmt_clock_event_mode; |
| 600 | ced->suspend = sh_cmt_clock_event_suspend; | ||
| 601 | ced->resume = sh_cmt_clock_event_resume; | ||
| 579 | 602 | ||
| 580 | dev_info(&p->pdev->dev, "used for clock events\n"); | 603 | dev_info(&p->pdev->dev, "used for clock events\n"); |
| 581 | clockevents_register_device(ced); | 604 | clockevents_register_device(ced); |
| @@ -690,8 +713,12 @@ static int __devinit sh_cmt_probe(struct platform_device *pdev) | |||
| 690 | struct sh_cmt_priv *p = platform_get_drvdata(pdev); | 713 | struct sh_cmt_priv *p = platform_get_drvdata(pdev); |
| 691 | int ret; | 714 | int ret; |
| 692 | 715 | ||
| 693 | if (!is_early_platform_device(pdev)) | 716 | if (!is_early_platform_device(pdev)) { |
| 694 | pm_genpd_dev_always_on(&pdev->dev, true); | 717 | struct sh_timer_config *cfg = pdev->dev.platform_data; |
| 718 | |||
| 719 | if (cfg->clocksource_rating || cfg->clockevent_rating) | ||
| 720 | pm_genpd_dev_always_on(&pdev->dev, true); | ||
| 721 | } | ||
| 695 | 722 | ||
| 696 | if (p) { | 723 | if (p) { |
| 697 | dev_info(&pdev->dev, "kept as earlytimer\n"); | 724 | dev_info(&pdev->dev, "kept as earlytimer\n"); |
