hc
2024-11-01 2f529f9b558ca1c1bd74be7437a84e4711743404
kernel/drivers/clocksource/timer-ti-dm-systimer.c
....@@ -57,7 +57,7 @@
5757 };
5858
5959 struct dmtimer_clocksource {
60
- struct clocksource dev;
60
+ struct clocksource_user_mmio mmio;
6161 struct dmtimer_systimer t;
6262 unsigned int loadval;
6363 };
....@@ -437,7 +437,7 @@
437437 struct dmtimer_systimer *t = &clkevt->t;
438438
439439 writel_relaxed(OMAP_TIMER_INT_OVERFLOW, t->base + t->irq_stat);
440
- clkevt->dev.event_handler(&clkevt->dev);
440
+ clockevents_handle_event(&clkevt->dev);
441441
442442 return IRQ_HANDLED;
443443 }
....@@ -548,7 +548,7 @@
548548 * We mostly use cpuidle_coupled with ARM local timers for runtime,
549549 * so there's probably no use for CLOCK_EVT_FEAT_DYNIRQ here.
550550 */
551
- dev->features = features;
551
+ dev->features = features | CLOCK_EVT_FEAT_PIPELINE;
552552 dev->rating = rating;
553553 dev->set_next_event = dmtimer_set_next_event;
554554 dev->set_state_shutdown = dmtimer_clockevent_shutdown;
....@@ -706,15 +706,7 @@
706706 static struct dmtimer_clocksource *
707707 to_dmtimer_clocksource(struct clocksource *cs)
708708 {
709
- return container_of(cs, struct dmtimer_clocksource, dev);
710
-}
711
-
712
-static u64 dmtimer_clocksource_read_cycles(struct clocksource *cs)
713
-{
714
- struct dmtimer_clocksource *clksrc = to_dmtimer_clocksource(cs);
715
- struct dmtimer_systimer *t = &clksrc->t;
716
-
717
- return (u64)readl_relaxed(t->base + t->counter);
709
+ return container_of(cs, struct dmtimer_clocksource, mmio.mmio.clksrc);
718710 }
719711
720712 static void __iomem *dmtimer_sched_clock_counter;
....@@ -753,6 +745,7 @@
753745 static int __init dmtimer_clocksource_init(struct device_node *np)
754746 {
755747 struct dmtimer_clocksource *clksrc;
748
+ struct clocksource_mmio_regs mmr;
756749 struct dmtimer_systimer *t;
757750 struct clocksource *dev;
758751 int error;
....@@ -761,7 +754,7 @@
761754 if (!clksrc)
762755 return -ENOMEM;
763756
764
- dev = &clksrc->dev;
757
+ dev = &clksrc->mmio.mmio.clksrc;
765758 t = &clksrc->t;
766759
767760 error = dmtimer_systimer_setup(np, t);
....@@ -770,7 +763,7 @@
770763
771764 dev->name = "dmtimer";
772765 dev->rating = 300;
773
- dev->read = dmtimer_clocksource_read_cycles;
766
+ dev->read = clocksource_mmio_readl_up,
774767 dev->mask = CLOCKSOURCE_MASK(32);
775768 dev->flags = CLOCK_SOURCE_IS_CONTINUOUS;
776769
....@@ -793,7 +786,13 @@
793786 sched_clock_register(dmtimer_read_sched_clock, 32, t->rate);
794787 }
795788
796
- if (clocksource_register_hz(dev, t->rate))
789
+ mmr.reg_lower = t->base + t->counter;
790
+ mmr.bits_lower = 32;
791
+ mmr.reg_upper = 0;
792
+ mmr.bits_upper = 0;
793
+ mmr.revmap = NULL;
794
+
795
+ if (clocksource_user_mmio_init(&clksrc->mmio, &mmr, t->rate))
797796 pr_err("Could not register clocksource %pOF\n", np);
798797
799798 return 0;