@@ -387,16 +387,24 @@ static int omap_dm_timer_set_source(struct omap_dm_timer *timer, int source)
387387
388388static void omap_dm_timer_enable (struct omap_dm_timer * timer )
389389{
390- pm_runtime_get_sync (& timer -> pdev -> dev );
390+ struct device * dev = & timer -> pdev -> dev ;
391+ int rc ;
392+
393+ rc = pm_runtime_resume_and_get (dev );
394+ if (rc )
395+ dev_err (dev , "could not enable timer\n" );
391396}
392397
393398static void omap_dm_timer_disable (struct omap_dm_timer * timer )
394399{
395- pm_runtime_put_sync (& timer -> pdev -> dev );
400+ struct device * dev = & timer -> pdev -> dev ;
401+
402+ pm_runtime_put_sync (dev );
396403}
397404
398405static int omap_dm_timer_prepare (struct omap_dm_timer * timer )
399406{
407+ struct device * dev = & timer -> pdev -> dev ;
400408 int rc ;
401409
402410 /*
@@ -411,18 +419,20 @@ static int omap_dm_timer_prepare(struct omap_dm_timer *timer)
411419 }
412420 }
413421
414- omap_dm_timer_enable (timer );
422+ rc = pm_runtime_resume_and_get (dev );
423+ if (rc )
424+ return rc ;
415425
416426 if (timer -> capability & OMAP_TIMER_NEEDS_RESET ) {
417427 rc = omap_dm_timer_reset (timer );
418428 if (rc ) {
419- omap_dm_timer_disable ( timer );
429+ pm_runtime_put_sync ( dev );
420430 return rc ;
421431 }
422432 }
423433
424434 __omap_dm_timer_enable_posted (timer );
425- omap_dm_timer_disable ( timer );
435+ pm_runtime_put_sync ( dev );
426436
427437 return 0 ;
428438}
@@ -628,12 +638,16 @@ __u32 omap_dm_timer_modify_idlect_mask(__u32 inputmask)
628638
629639static int omap_dm_timer_start (struct omap_dm_timer * timer )
630640{
641+ struct device * dev = & timer -> pdev -> dev ;
642+ int rc ;
631643 u32 l ;
632644
633645 if (unlikely (!timer ))
634646 return - EINVAL ;
635647
636- omap_dm_timer_enable (timer );
648+ rc = pm_runtime_resume_and_get (dev );
649+ if (rc )
650+ return rc ;
637651
638652 l = dmtimer_read (timer , OMAP_TIMER_CTRL_REG );
639653 if (!(l & OMAP_TIMER_CTRL_ST )) {
@@ -646,6 +660,7 @@ static int omap_dm_timer_start(struct omap_dm_timer *timer)
646660
647661static int omap_dm_timer_stop (struct omap_dm_timer * timer )
648662{
663+ struct device * dev = & timer -> pdev -> dev ;
649664 unsigned long rate = 0 ;
650665
651666 if (unlikely (!timer ))
@@ -656,32 +671,47 @@ static int omap_dm_timer_stop(struct omap_dm_timer *timer)
656671
657672 __omap_dm_timer_stop (timer , rate );
658673
659- omap_dm_timer_disable (timer );
674+ pm_runtime_put_sync (dev );
675+
660676 return 0 ;
661677}
662678
663679static int omap_dm_timer_set_load (struct omap_dm_timer * timer ,
664680 unsigned int load )
665681{
682+ struct device * dev ;
683+ int rc ;
684+
666685 if (unlikely (!timer ))
667686 return - EINVAL ;
668687
669- omap_dm_timer_enable (timer );
688+ dev = & timer -> pdev -> dev ;
689+ rc = pm_runtime_resume_and_get (dev );
690+ if (rc )
691+ return rc ;
692+
670693 dmtimer_write (timer , OMAP_TIMER_LOAD_REG , load );
671694
672- omap_dm_timer_disable (timer );
695+ pm_runtime_put_sync (dev );
696+
673697 return 0 ;
674698}
675699
676700static int omap_dm_timer_set_match (struct omap_dm_timer * timer , int enable ,
677701 unsigned int match )
678702{
703+ struct device * dev ;
704+ int rc ;
679705 u32 l ;
680706
681707 if (unlikely (!timer ))
682708 return - EINVAL ;
683709
684- omap_dm_timer_enable (timer );
710+ dev = & timer -> pdev -> dev ;
711+ rc = pm_runtime_resume_and_get (dev );
712+ if (rc )
713+ return rc ;
714+
685715 l = dmtimer_read (timer , OMAP_TIMER_CTRL_REG );
686716 if (enable )
687717 l |= OMAP_TIMER_CTRL_CE ;
@@ -690,19 +720,26 @@ static int omap_dm_timer_set_match(struct omap_dm_timer *timer, int enable,
690720 dmtimer_write (timer , OMAP_TIMER_MATCH_REG , match );
691721 dmtimer_write (timer , OMAP_TIMER_CTRL_REG , l );
692722
693- omap_dm_timer_disable (timer );
723+ pm_runtime_put_sync (dev );
724+
694725 return 0 ;
695726}
696727
697728static int omap_dm_timer_set_pwm (struct omap_dm_timer * timer , int def_on ,
698729 int toggle , int trigger , int autoreload )
699730{
731+ struct device * dev ;
732+ int rc ;
700733 u32 l ;
701734
702735 if (unlikely (!timer ))
703736 return - EINVAL ;
704737
705- omap_dm_timer_enable (timer );
738+ dev = & timer -> pdev -> dev ;
739+ rc = pm_runtime_resume_and_get (dev );
740+ if (rc )
741+ return rc ;
742+
706743 l = dmtimer_read (timer , OMAP_TIMER_CTRL_REG );
707744 l &= ~(OMAP_TIMER_CTRL_GPOCFG | OMAP_TIMER_CTRL_SCPWM |
708745 OMAP_TIMER_CTRL_PT | (0x03 << 10 ) | OMAP_TIMER_CTRL_AR );
@@ -715,33 +752,47 @@ static int omap_dm_timer_set_pwm(struct omap_dm_timer *timer, int def_on,
715752 l |= OMAP_TIMER_CTRL_AR ;
716753 dmtimer_write (timer , OMAP_TIMER_CTRL_REG , l );
717754
718- omap_dm_timer_disable (timer );
755+ pm_runtime_put_sync (dev );
756+
719757 return 0 ;
720758}
721759
722760static int omap_dm_timer_get_pwm_status (struct omap_dm_timer * timer )
723761{
762+ struct device * dev ;
763+ int rc ;
724764 u32 l ;
725765
726766 if (unlikely (!timer ))
727767 return - EINVAL ;
728768
729- omap_dm_timer_enable (timer );
769+ dev = & timer -> pdev -> dev ;
770+ rc = pm_runtime_resume_and_get (dev );
771+ if (rc )
772+ return rc ;
773+
730774 l = dmtimer_read (timer , OMAP_TIMER_CTRL_REG );
731- omap_dm_timer_disable (timer );
775+
776+ pm_runtime_put_sync (dev );
732777
733778 return l ;
734779}
735780
736781static int omap_dm_timer_set_prescaler (struct omap_dm_timer * timer ,
737782 int prescaler )
738783{
784+ struct device * dev ;
785+ int rc ;
739786 u32 l ;
740787
741788 if (unlikely (!timer ) || prescaler < -1 || prescaler > 7 )
742789 return - EINVAL ;
743790
744- omap_dm_timer_enable (timer );
791+ dev = & timer -> pdev -> dev ;
792+ rc = pm_runtime_resume_and_get (dev );
793+ if (rc )
794+ return rc ;
795+
745796 l = dmtimer_read (timer , OMAP_TIMER_CTRL_REG );
746797 l &= ~(OMAP_TIMER_CTRL_PRE | (0x07 << 2 ));
747798 if (prescaler >= 0 ) {
@@ -750,20 +801,29 @@ static int omap_dm_timer_set_prescaler(struct omap_dm_timer *timer,
750801 }
751802 dmtimer_write (timer , OMAP_TIMER_CTRL_REG , l );
752803
753- omap_dm_timer_disable (timer );
804+ pm_runtime_put_sync (dev );
805+
754806 return 0 ;
755807}
756808
757809static int omap_dm_timer_set_int_enable (struct omap_dm_timer * timer ,
758810 unsigned int value )
759811{
812+ struct device * dev ;
813+ int rc ;
814+
760815 if (unlikely (!timer ))
761816 return - EINVAL ;
762817
763- omap_dm_timer_enable (timer );
818+ dev = & timer -> pdev -> dev ;
819+ rc = pm_runtime_resume_and_get (dev );
820+ if (rc )
821+ return rc ;
822+
764823 __omap_dm_timer_int_enable (timer , value );
765824
766- omap_dm_timer_disable (timer );
825+ pm_runtime_put_sync (dev );
826+
767827 return 0 ;
768828}
769829
@@ -776,12 +836,17 @@ static int omap_dm_timer_set_int_enable(struct omap_dm_timer *timer,
776836 */
777837static int omap_dm_timer_set_int_disable (struct omap_dm_timer * timer , u32 mask )
778838{
839+ struct device * dev ;
779840 u32 l = mask ;
841+ int rc ;
780842
781843 if (unlikely (!timer ))
782844 return - EINVAL ;
783845
784- omap_dm_timer_enable (timer );
846+ dev = & timer -> pdev -> dev ;
847+ rc = pm_runtime_resume_and_get (dev );
848+ if (rc )
849+ return rc ;
785850
786851 if (timer -> revision == 1 )
787852 l = dmtimer_read (timer , timer -> irq_ena ) & ~mask ;
@@ -790,7 +855,8 @@ static int omap_dm_timer_set_int_disable(struct omap_dm_timer *timer, u32 mask)
790855 l = dmtimer_read (timer , OMAP_TIMER_WAKEUP_EN_REG ) & ~mask ;
791856 dmtimer_write (timer , OMAP_TIMER_WAKEUP_EN_REG , l );
792857
793- omap_dm_timer_disable (timer );
858+ pm_runtime_put_sync (dev );
859+
794860 return 0 ;
795861}
796862
@@ -943,11 +1009,11 @@ static int omap_dm_timer_probe(struct platform_device *pdev)
9431009 pm_runtime_enable (dev );
9441010
9451011 if (!timer -> reserved ) {
946- ret = pm_runtime_get_sync (dev );
947- if (ret < 0 ) {
1012+ ret = pm_runtime_resume_and_get (dev );
1013+ if (ret ) {
9481014 dev_err (dev , "%s: pm_runtime_get_sync failed!\n" ,
9491015 __func__ );
950- goto err_get_sync ;
1016+ goto err_disable ;
9511017 }
9521018 __omap_dm_timer_init_regs (timer );
9531019 pm_runtime_put (dev );
@@ -962,8 +1028,7 @@ static int omap_dm_timer_probe(struct platform_device *pdev)
9621028
9631029 return 0 ;
9641030
965- err_get_sync :
966- pm_runtime_put_noidle (dev );
1031+ err_disable :
9671032 pm_runtime_disable (dev );
9681033 return ret ;
9691034}
0 commit comments