kernel/io_uring: cancel io_uring before task works
[linux-2.6-microblaze.git] / drivers / clocksource / sh_cmt.c
index 7607774..e258230 100644 (file)
@@ -319,7 +319,6 @@ static int sh_cmt_enable(struct sh_cmt_channel *ch)
 {
        int k, ret;
 
-       pm_runtime_get_sync(&ch->cmt->pdev->dev);
        dev_pm_syscore_device(&ch->cmt->pdev->dev, true);
 
        /* enable clock */
@@ -394,7 +393,6 @@ static void sh_cmt_disable(struct sh_cmt_channel *ch)
        clk_disable(ch->cmt->clk);
 
        dev_pm_syscore_device(&ch->cmt->pdev->dev, false);
-       pm_runtime_put(&ch->cmt->pdev->dev);
 }
 
 /* private flags */
@@ -562,10 +560,16 @@ static int sh_cmt_start(struct sh_cmt_channel *ch, unsigned long flag)
        int ret = 0;
        unsigned long flags;
 
+       if (flag & FLAG_CLOCKSOURCE)
+               pm_runtime_get_sync(&ch->cmt->pdev->dev);
+
        raw_spin_lock_irqsave(&ch->lock, flags);
 
-       if (!(ch->flags & (FLAG_CLOCKEVENT | FLAG_CLOCKSOURCE)))
+       if (!(ch->flags & (FLAG_CLOCKEVENT | FLAG_CLOCKSOURCE))) {
+               if (flag & FLAG_CLOCKEVENT)
+                       pm_runtime_get_sync(&ch->cmt->pdev->dev);
                ret = sh_cmt_enable(ch);
+       }
 
        if (ret)
                goto out;
@@ -590,14 +594,20 @@ static void sh_cmt_stop(struct sh_cmt_channel *ch, unsigned long flag)
        f = ch->flags & (FLAG_CLOCKEVENT | FLAG_CLOCKSOURCE);
        ch->flags &= ~flag;
 
-       if (f && !(ch->flags & (FLAG_CLOCKEVENT | FLAG_CLOCKSOURCE)))
+       if (f && !(ch->flags & (FLAG_CLOCKEVENT | FLAG_CLOCKSOURCE))) {
                sh_cmt_disable(ch);
+               if (flag & FLAG_CLOCKEVENT)
+                       pm_runtime_put(&ch->cmt->pdev->dev);
+       }
 
        /* adjust the timeout to maximum if only clocksource left */
        if ((flag == FLAG_CLOCKEVENT) && (ch->flags & FLAG_CLOCKSOURCE))
                __sh_cmt_set_next(ch, ch->max_match_value);
 
        raw_spin_unlock_irqrestore(&ch->lock, flags);
+
+       if (flag & FLAG_CLOCKSOURCE)
+               pm_runtime_put(&ch->cmt->pdev->dev);
 }
 
 static struct sh_cmt_channel *cs_to_sh_cmt(struct clocksource *cs)
@@ -658,7 +668,7 @@ static void sh_cmt_clocksource_suspend(struct clocksource *cs)
                return;
 
        sh_cmt_stop(ch, FLAG_CLOCKSOURCE);
-       pm_genpd_syscore_poweroff(&ch->cmt->pdev->dev);
+       dev_pm_genpd_suspend(&ch->cmt->pdev->dev);
 }
 
 static void sh_cmt_clocksource_resume(struct clocksource *cs)
@@ -668,7 +678,7 @@ static void sh_cmt_clocksource_resume(struct clocksource *cs)
        if (!ch->cs_enabled)
                return;
 
-       pm_genpd_syscore_poweron(&ch->cmt->pdev->dev);
+       dev_pm_genpd_resume(&ch->cmt->pdev->dev);
        sh_cmt_start(ch, FLAG_CLOCKSOURCE);
 }
 
@@ -760,7 +770,7 @@ static void sh_cmt_clock_event_suspend(struct clock_event_device *ced)
 {
        struct sh_cmt_channel *ch = ced_to_sh_cmt(ced);
 
-       pm_genpd_syscore_poweroff(&ch->cmt->pdev->dev);
+       dev_pm_genpd_suspend(&ch->cmt->pdev->dev);
        clk_unprepare(ch->cmt->clk);
 }
 
@@ -769,7 +779,7 @@ static void sh_cmt_clock_event_resume(struct clock_event_device *ced)
        struct sh_cmt_channel *ch = ced_to_sh_cmt(ced);
 
        clk_prepare(ch->cmt->clk);
-       pm_genpd_syscore_poweron(&ch->cmt->pdev->dev);
+       dev_pm_genpd_resume(&ch->cmt->pdev->dev);
 }
 
 static int sh_cmt_register_clockevent(struct sh_cmt_channel *ch,