kernel/io_uring: cancel io_uring before task works
[linux-2.6-microblaze.git] / drivers / clocksource / sh_cmt.c
index 7275d95..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)