hc
2024-11-01 2f529f9b558ca1c1bd74be7437a84e4711743404
kernel/drivers/clocksource/bcm2835_timer.c
....@@ -53,18 +53,25 @@
5353 static irqreturn_t bcm2835_time_interrupt(int irq, void *dev_id)
5454 {
5555 struct bcm2835_timer *timer = dev_id;
56
- void (*event_handler)(struct clock_event_device *);
56
+
5757 if (readl_relaxed(timer->control) & timer->match_mask) {
5858 writel_relaxed(timer->match_mask, timer->control);
5959
60
- event_handler = READ_ONCE(timer->evt.event_handler);
61
- if (event_handler)
62
- event_handler(&timer->evt);
60
+ clockevents_handle_event(&timer->evt);
6361 return IRQ_HANDLED;
6462 } else {
6563 return IRQ_NONE;
6664 }
6765 }
66
+
67
+static struct clocksource_user_mmio clocksource_bcm2835 = {
68
+ .mmio.clksrc = {
69
+ .rating = 300,
70
+ .read = clocksource_mmio_readl_up,
71
+ .mask = CLOCKSOURCE_MASK(32),
72
+ .flags = CLOCK_SOURCE_IS_CONTINUOUS,
73
+ },
74
+};
6875
6976 static int __init bcm2835_timer_init(struct device_node *node)
7077 {
....@@ -72,6 +79,7 @@
7279 u32 freq;
7380 int irq, ret;
7481 struct bcm2835_timer *timer;
82
+ struct clocksource_mmio_regs mmr;
7583
7684 base = of_iomap(node, 0);
7785 if (!base) {
....@@ -88,8 +96,13 @@
8896 system_clock = base + REG_COUNTER_LO;
8997 sched_clock_register(bcm2835_sched_read, 32, freq);
9098
91
- clocksource_mmio_init(base + REG_COUNTER_LO, node->name,
92
- freq, 300, 32, clocksource_mmio_readl_up);
99
+ mmr.reg_lower = base + REG_COUNTER_LO;
100
+ mmr.bits_lower = 32;
101
+ mmr.reg_upper = 0;
102
+ mmr.bits_upper = 0;
103
+ mmr.revmap = NULL;
104
+ clocksource_bcm2835.mmio.clksrc.name = node->name;
105
+ clocksource_user_mmio_init(&clocksource_bcm2835, &mmr, freq);
93106
94107 irq = irq_of_parse_and_map(node, DEFAULT_TIMER);
95108 if (irq <= 0) {
....@@ -109,7 +122,7 @@
109122 timer->match_mask = BIT(DEFAULT_TIMER);
110123 timer->evt.name = node->name;
111124 timer->evt.rating = 300;
112
- timer->evt.features = CLOCK_EVT_FEAT_ONESHOT;
125
+ timer->evt.features = CLOCK_EVT_FEAT_ONESHOT | CLOCK_EVT_FEAT_PIPELINE;
113126 timer->evt.set_next_event = bcm2835_time_set_next_event;
114127 timer->evt.cpumask = cpumask_of(0);
115128