@@ -319,7 +319,6 @@ static int sh_cmt_enable(struct sh_cmt_channel *ch)
319319{
320320	int  k , ret ;
321321
322- 	pm_runtime_get_sync (& ch -> cmt -> pdev -> dev );
323322	dev_pm_syscore_device (& ch -> cmt -> pdev -> dev , true);
324323
325324	/* enable clock */ 
@@ -394,7 +393,6 @@ static void sh_cmt_disable(struct sh_cmt_channel *ch)
394393	clk_disable (ch -> cmt -> clk );
395394
396395	dev_pm_syscore_device (& ch -> cmt -> pdev -> dev , false);
397- 	pm_runtime_put (& ch -> cmt -> pdev -> dev );
398396}
399397
400398/* private flags */ 
@@ -562,10 +560,16 @@ static int sh_cmt_start(struct sh_cmt_channel *ch, unsigned long flag)
562560	int  ret  =  0 ;
563561	unsigned long  flags ;
564562
563+ 	if  (flag  &  FLAG_CLOCKSOURCE )
564+ 		pm_runtime_get_sync (& ch -> cmt -> pdev -> dev );
565+ 
565566	raw_spin_lock_irqsave (& ch -> lock , flags );
566567
567- 	if  (!(ch -> flags  &  (FLAG_CLOCKEVENT  | FLAG_CLOCKSOURCE )))
568+ 	if  (!(ch -> flags  &  (FLAG_CLOCKEVENT  | FLAG_CLOCKSOURCE ))) {
569+ 		if  (flag  &  FLAG_CLOCKEVENT )
570+ 			pm_runtime_get_sync (& ch -> cmt -> pdev -> dev );
568571		ret  =  sh_cmt_enable (ch );
572+ 	}
569573
570574	if  (ret )
571575		goto out ;
@@ -590,14 +594,20 @@ static void sh_cmt_stop(struct sh_cmt_channel *ch, unsigned long flag)
590594	f  =  ch -> flags  &  (FLAG_CLOCKEVENT  | FLAG_CLOCKSOURCE );
591595	ch -> flags  &= ~flag ;
592596
593- 	if  (f  &&  !(ch -> flags  &  (FLAG_CLOCKEVENT  | FLAG_CLOCKSOURCE )))
597+ 	if  (f  &&  !(ch -> flags  &  (FLAG_CLOCKEVENT  | FLAG_CLOCKSOURCE ))) { 
594598		sh_cmt_disable (ch );
599+ 		if  (flag  &  FLAG_CLOCKEVENT )
600+ 			pm_runtime_put (& ch -> cmt -> pdev -> dev );
601+ 	}
595602
596603	/* adjust the timeout to maximum if only clocksource left */ 
597604	if  ((flag  ==  FLAG_CLOCKEVENT ) &&  (ch -> flags  &  FLAG_CLOCKSOURCE ))
598605		__sh_cmt_set_next (ch , ch -> max_match_value );
599606
600607	raw_spin_unlock_irqrestore (& ch -> lock , flags );
608+ 
609+ 	if  (flag  &  FLAG_CLOCKSOURCE )
610+ 		pm_runtime_put (& ch -> cmt -> pdev -> dev );
601611}
602612
603613static  struct  sh_cmt_channel  * cs_to_sh_cmt (struct  clocksource  * cs )
0 commit comments