@@ -387,16 +387,24 @@ static int omap_dm_timer_set_source(struct omap_dm_timer *timer, int source)
387
387
388
388
static void omap_dm_timer_enable (struct omap_dm_timer * timer )
389
389
{
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" );
391
396
}
392
397
393
398
static void omap_dm_timer_disable (struct omap_dm_timer * timer )
394
399
{
395
- pm_runtime_put_sync (& timer -> pdev -> dev );
400
+ struct device * dev = & timer -> pdev -> dev ;
401
+
402
+ pm_runtime_put_sync (dev );
396
403
}
397
404
398
405
static int omap_dm_timer_prepare (struct omap_dm_timer * timer )
399
406
{
407
+ struct device * dev = & timer -> pdev -> dev ;
400
408
int rc ;
401
409
402
410
/*
@@ -411,18 +419,20 @@ static int omap_dm_timer_prepare(struct omap_dm_timer *timer)
411
419
}
412
420
}
413
421
414
- omap_dm_timer_enable (timer );
422
+ rc = pm_runtime_resume_and_get (dev );
423
+ if (rc )
424
+ return rc ;
415
425
416
426
if (timer -> capability & OMAP_TIMER_NEEDS_RESET ) {
417
427
rc = omap_dm_timer_reset (timer );
418
428
if (rc ) {
419
- omap_dm_timer_disable ( timer );
429
+ pm_runtime_put_sync ( dev );
420
430
return rc ;
421
431
}
422
432
}
423
433
424
434
__omap_dm_timer_enable_posted (timer );
425
- omap_dm_timer_disable ( timer );
435
+ pm_runtime_put_sync ( dev );
426
436
427
437
return 0 ;
428
438
}
@@ -628,12 +638,16 @@ __u32 omap_dm_timer_modify_idlect_mask(__u32 inputmask)
628
638
629
639
static int omap_dm_timer_start (struct omap_dm_timer * timer )
630
640
{
641
+ struct device * dev = & timer -> pdev -> dev ;
642
+ int rc ;
631
643
u32 l ;
632
644
633
645
if (unlikely (!timer ))
634
646
return - EINVAL ;
635
647
636
- omap_dm_timer_enable (timer );
648
+ rc = pm_runtime_resume_and_get (dev );
649
+ if (rc )
650
+ return rc ;
637
651
638
652
l = dmtimer_read (timer , OMAP_TIMER_CTRL_REG );
639
653
if (!(l & OMAP_TIMER_CTRL_ST )) {
@@ -646,6 +660,7 @@ static int omap_dm_timer_start(struct omap_dm_timer *timer)
646
660
647
661
static int omap_dm_timer_stop (struct omap_dm_timer * timer )
648
662
{
663
+ struct device * dev = & timer -> pdev -> dev ;
649
664
unsigned long rate = 0 ;
650
665
651
666
if (unlikely (!timer ))
@@ -656,32 +671,47 @@ static int omap_dm_timer_stop(struct omap_dm_timer *timer)
656
671
657
672
__omap_dm_timer_stop (timer , rate );
658
673
659
- omap_dm_timer_disable (timer );
674
+ pm_runtime_put_sync (dev );
675
+
660
676
return 0 ;
661
677
}
662
678
663
679
static int omap_dm_timer_set_load (struct omap_dm_timer * timer ,
664
680
unsigned int load )
665
681
{
682
+ struct device * dev ;
683
+ int rc ;
684
+
666
685
if (unlikely (!timer ))
667
686
return - EINVAL ;
668
687
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
+
670
693
dmtimer_write (timer , OMAP_TIMER_LOAD_REG , load );
671
694
672
- omap_dm_timer_disable (timer );
695
+ pm_runtime_put_sync (dev );
696
+
673
697
return 0 ;
674
698
}
675
699
676
700
static int omap_dm_timer_set_match (struct omap_dm_timer * timer , int enable ,
677
701
unsigned int match )
678
702
{
703
+ struct device * dev ;
704
+ int rc ;
679
705
u32 l ;
680
706
681
707
if (unlikely (!timer ))
682
708
return - EINVAL ;
683
709
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
+
685
715
l = dmtimer_read (timer , OMAP_TIMER_CTRL_REG );
686
716
if (enable )
687
717
l |= OMAP_TIMER_CTRL_CE ;
@@ -690,19 +720,26 @@ static int omap_dm_timer_set_match(struct omap_dm_timer *timer, int enable,
690
720
dmtimer_write (timer , OMAP_TIMER_MATCH_REG , match );
691
721
dmtimer_write (timer , OMAP_TIMER_CTRL_REG , l );
692
722
693
- omap_dm_timer_disable (timer );
723
+ pm_runtime_put_sync (dev );
724
+
694
725
return 0 ;
695
726
}
696
727
697
728
static int omap_dm_timer_set_pwm (struct omap_dm_timer * timer , int def_on ,
698
729
int toggle , int trigger , int autoreload )
699
730
{
731
+ struct device * dev ;
732
+ int rc ;
700
733
u32 l ;
701
734
702
735
if (unlikely (!timer ))
703
736
return - EINVAL ;
704
737
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
+
706
743
l = dmtimer_read (timer , OMAP_TIMER_CTRL_REG );
707
744
l &= ~(OMAP_TIMER_CTRL_GPOCFG | OMAP_TIMER_CTRL_SCPWM |
708
745
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,
715
752
l |= OMAP_TIMER_CTRL_AR ;
716
753
dmtimer_write (timer , OMAP_TIMER_CTRL_REG , l );
717
754
718
- omap_dm_timer_disable (timer );
755
+ pm_runtime_put_sync (dev );
756
+
719
757
return 0 ;
720
758
}
721
759
722
760
static int omap_dm_timer_get_pwm_status (struct omap_dm_timer * timer )
723
761
{
762
+ struct device * dev ;
763
+ int rc ;
724
764
u32 l ;
725
765
726
766
if (unlikely (!timer ))
727
767
return - EINVAL ;
728
768
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
+
730
774
l = dmtimer_read (timer , OMAP_TIMER_CTRL_REG );
731
- omap_dm_timer_disable (timer );
775
+
776
+ pm_runtime_put_sync (dev );
732
777
733
778
return l ;
734
779
}
735
780
736
781
static int omap_dm_timer_set_prescaler (struct omap_dm_timer * timer ,
737
782
int prescaler )
738
783
{
784
+ struct device * dev ;
785
+ int rc ;
739
786
u32 l ;
740
787
741
788
if (unlikely (!timer ) || prescaler < -1 || prescaler > 7 )
742
789
return - EINVAL ;
743
790
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
+
745
796
l = dmtimer_read (timer , OMAP_TIMER_CTRL_REG );
746
797
l &= ~(OMAP_TIMER_CTRL_PRE | (0x07 << 2 ));
747
798
if (prescaler >= 0 ) {
@@ -750,20 +801,29 @@ static int omap_dm_timer_set_prescaler(struct omap_dm_timer *timer,
750
801
}
751
802
dmtimer_write (timer , OMAP_TIMER_CTRL_REG , l );
752
803
753
- omap_dm_timer_disable (timer );
804
+ pm_runtime_put_sync (dev );
805
+
754
806
return 0 ;
755
807
}
756
808
757
809
static int omap_dm_timer_set_int_enable (struct omap_dm_timer * timer ,
758
810
unsigned int value )
759
811
{
812
+ struct device * dev ;
813
+ int rc ;
814
+
760
815
if (unlikely (!timer ))
761
816
return - EINVAL ;
762
817
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
+
764
823
__omap_dm_timer_int_enable (timer , value );
765
824
766
- omap_dm_timer_disable (timer );
825
+ pm_runtime_put_sync (dev );
826
+
767
827
return 0 ;
768
828
}
769
829
@@ -776,12 +836,17 @@ static int omap_dm_timer_set_int_enable(struct omap_dm_timer *timer,
776
836
*/
777
837
static int omap_dm_timer_set_int_disable (struct omap_dm_timer * timer , u32 mask )
778
838
{
839
+ struct device * dev ;
779
840
u32 l = mask ;
841
+ int rc ;
780
842
781
843
if (unlikely (!timer ))
782
844
return - EINVAL ;
783
845
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 ;
785
850
786
851
if (timer -> revision == 1 )
787
852
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)
790
855
l = dmtimer_read (timer , OMAP_TIMER_WAKEUP_EN_REG ) & ~mask ;
791
856
dmtimer_write (timer , OMAP_TIMER_WAKEUP_EN_REG , l );
792
857
793
- omap_dm_timer_disable (timer );
858
+ pm_runtime_put_sync (dev );
859
+
794
860
return 0 ;
795
861
}
796
862
@@ -943,11 +1009,11 @@ static int omap_dm_timer_probe(struct platform_device *pdev)
943
1009
pm_runtime_enable (dev );
944
1010
945
1011
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 ) {
948
1014
dev_err (dev , "%s: pm_runtime_get_sync failed!\n" ,
949
1015
__func__ );
950
- goto err_get_sync ;
1016
+ goto err_disable ;
951
1017
}
952
1018
__omap_dm_timer_init_regs (timer );
953
1019
pm_runtime_put (dev );
@@ -962,8 +1028,7 @@ static int omap_dm_timer_probe(struct platform_device *pdev)
962
1028
963
1029
return 0 ;
964
1030
965
- err_get_sync :
966
- pm_runtime_put_noidle (dev );
1031
+ err_disable :
967
1032
pm_runtime_disable (dev );
968
1033
return ret ;
969
1034
}
0 commit comments