Skip to content

Commit bd351f1

Browse files
tmlinddlezcano
authored andcommitted
clocksource/drivers/timer-ti-dm: Use runtime PM directly and check errors
Use pm_runtime_resume_and_get() and check for a possible error returned. We want to do this as omap_dm_timer_enable() and omap_dm_timer_disable() are exposed to the pwm and remoteproc drivers, and in the following patch we turn struct omap_dm_timer into a cookie used by the exposed functions only. Signed-off-by: Tony Lindgren <[email protected]> Reviewed-by: Janusz Krzysztofik <[email protected]> Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Daniel Lezcano <[email protected]>
1 parent 1d513f4 commit bd351f1

File tree

1 file changed

+91
-26
lines changed

1 file changed

+91
-26
lines changed

drivers/clocksource/timer-ti-dm.c

Lines changed: 91 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -387,16 +387,24 @@ static int omap_dm_timer_set_source(struct omap_dm_timer *timer, int source)
387387

388388
static 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

393398
static 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

398405
static 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

629639
static 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

647661
static 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

663679
static 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

676700
static 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

697728
static 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

722760
static 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

736781
static 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

757809
static 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
*/
777837
static 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

Comments
 (0)