aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/clocksource/sh_cmt.c20
1 files changed, 16 insertions, 4 deletions
diff --git a/drivers/clocksource/sh_cmt.c b/drivers/clocksource/sh_cmt.c
index 0965e9848b3d..940341a185d7 100644
--- a/drivers/clocksource/sh_cmt.c
+++ b/drivers/clocksource/sh_cmt.c
@@ -634,12 +634,18 @@ static int sh_cmt_clock_event_next(unsigned long delta,
634 634
635static void sh_cmt_clock_event_suspend(struct clock_event_device *ced) 635static void sh_cmt_clock_event_suspend(struct clock_event_device *ced)
636{ 636{
637 pm_genpd_syscore_poweroff(&ced_to_sh_cmt(ced)->pdev->dev); 637 struct sh_cmt_priv *p = ced_to_sh_cmt(ced);
638
639 pm_genpd_syscore_poweroff(&p->pdev->dev);
640 clk_unprepare(p->clk);
638} 641}
639 642
640static void sh_cmt_clock_event_resume(struct clock_event_device *ced) 643static void sh_cmt_clock_event_resume(struct clock_event_device *ced)
641{ 644{
642 pm_genpd_syscore_poweron(&ced_to_sh_cmt(ced)->pdev->dev); 645 struct sh_cmt_priv *p = ced_to_sh_cmt(ced);
646
647 clk_prepare(p->clk);
648 pm_genpd_syscore_poweron(&p->pdev->dev);
643} 649}
644 650
645static void sh_cmt_register_clockevent(struct sh_cmt_priv *p, 651static void sh_cmt_register_clockevent(struct sh_cmt_priv *p,
@@ -737,6 +743,10 @@ static int sh_cmt_setup(struct sh_cmt_priv *p, struct platform_device *pdev)
737 goto err2; 743 goto err2;
738 } 744 }
739 745
746 ret = clk_prepare(p->clk);
747 if (ret < 0)
748 goto err3;
749
740 if (res2 && (resource_size(res2) == 4)) { 750 if (res2 && (resource_size(res2) == 4)) {
741 /* assume both CMSTR and CMCSR to be 32-bit */ 751 /* assume both CMSTR and CMCSR to be 32-bit */
742 p->read_control = sh_cmt_read32; 752 p->read_control = sh_cmt_read32;
@@ -773,19 +783,21 @@ static int sh_cmt_setup(struct sh_cmt_priv *p, struct platform_device *pdev)
773 cfg->clocksource_rating); 783 cfg->clocksource_rating);
774 if (ret) { 784 if (ret) {
775 dev_err(&p->pdev->dev, "registration failed\n"); 785 dev_err(&p->pdev->dev, "registration failed\n");
776 goto err3; 786 goto err4;
777 } 787 }
778 p->cs_enabled = false; 788 p->cs_enabled = false;
779 789
780 ret = setup_irq(irq, &p->irqaction); 790 ret = setup_irq(irq, &p->irqaction);
781 if (ret) { 791 if (ret) {
782 dev_err(&p->pdev->dev, "failed to request irq %d\n", irq); 792 dev_err(&p->pdev->dev, "failed to request irq %d\n", irq);
783 goto err3; 793 goto err4;
784 } 794 }
785 795
786 platform_set_drvdata(pdev, p); 796 platform_set_drvdata(pdev, p);
787 797
788 return 0; 798 return 0;
799err4:
800 clk_unprepare(p->clk);
789err3: 801err3:
790 clk_put(p->clk); 802 clk_put(p->clk);
791err2: 803err2: