hc
2024-11-01 2f529f9b558ca1c1bd74be7437a84e4711743404
kernel/drivers/clocksource/arm_global_timer.c
....@@ -153,11 +153,11 @@
153153 * the Global Timer flag _after_ having incremented
154154 * the Comparator register value to a higher value.
155155 */
156
- if (clockevent_state_oneshot(evt))
156
+ if (clockevent_is_oob(evt) || clockevent_state_oneshot(evt))
157157 gt_compare_set(ULONG_MAX, 0);
158158
159159 writel_relaxed(GT_INT_STATUS_EVENT_FLAG, gt_base + GT_INT_STATUS);
160
- evt->event_handler(evt);
160
+ clockevents_handle_event(evt);
161161
162162 return IRQ_HANDLED;
163163 }
....@@ -168,7 +168,7 @@
168168
169169 clk->name = "arm_global_timer";
170170 clk->features = CLOCK_EVT_FEAT_PERIODIC | CLOCK_EVT_FEAT_ONESHOT |
171
- CLOCK_EVT_FEAT_PERCPU;
171
+ CLOCK_EVT_FEAT_PERCPU | CLOCK_EVT_FEAT_PIPELINE;
172172 clk->set_state_shutdown = gt_clockevent_shutdown;
173173 clk->set_state_periodic = gt_clockevent_set_periodic;
174174 clk->set_state_oneshot = gt_clockevent_shutdown;
....@@ -192,11 +192,6 @@
192192 return 0;
193193 }
194194
195
-static u64 gt_clocksource_read(struct clocksource *cs)
196
-{
197
- return gt_counter_read();
198
-}
199
-
200195 static void gt_resume(struct clocksource *cs)
201196 {
202197 unsigned long ctrl;
....@@ -207,13 +202,15 @@
207202 writel(GT_CONTROL_TIMER_ENABLE, gt_base + GT_CONTROL);
208203 }
209204
210
-static struct clocksource gt_clocksource = {
211
- .name = "arm_global_timer",
212
- .rating = 300,
213
- .read = gt_clocksource_read,
214
- .mask = CLOCKSOURCE_MASK(64),
215
- .flags = CLOCK_SOURCE_IS_CONTINUOUS,
216
- .resume = gt_resume,
205
+static struct clocksource_user_mmio gt_clocksource = {
206
+ .mmio.clksrc = {
207
+ .name = "arm_global_timer",
208
+ .rating = 300,
209
+ .read = clocksource_dual_mmio_readl_up,
210
+ .mask = CLOCKSOURCE_MASK(64),
211
+ .flags = CLOCK_SOURCE_IS_CONTINUOUS,
212
+ .resume = gt_resume,
213
+ },
217214 };
218215
219216 #ifdef CONFIG_CLKSRC_ARM_GLOBAL_TIMER_SCHED_CLOCK
....@@ -240,6 +237,8 @@
240237
241238 static int __init gt_clocksource_init(void)
242239 {
240
+ struct clocksource_mmio_regs mmr;
241
+
243242 writel(0, gt_base + GT_CONTROL);
244243 writel(0, gt_base + GT_COUNTER0);
245244 writel(0, gt_base + GT_COUNTER1);
....@@ -249,7 +248,13 @@
249248 #ifdef CONFIG_CLKSRC_ARM_GLOBAL_TIMER_SCHED_CLOCK
250249 sched_clock_register(gt_sched_clock_read, 64, gt_clk_rate);
251250 #endif
252
- return clocksource_register_hz(&gt_clocksource, gt_clk_rate);
251
+ mmr.reg_upper = gt_base + GT_COUNTER1;
252
+ mmr.reg_lower = gt_base + GT_COUNTER0;
253
+ mmr.bits_upper = 32;
254
+ mmr.bits_lower = 32;
255
+ mmr.revmap = NULL;
256
+
257
+ return clocksource_user_mmio_init(&gt_clocksource, &mmr, gt_clk_rate);
253258 }
254259
255260 static int __init global_timer_of_register(struct device_node *np)
....@@ -299,8 +304,8 @@
299304 goto out_clk;
300305 }
301306
302
- err = request_percpu_irq(gt_ppi, gt_clockevent_interrupt,
303
- "gt", gt_evt);
307
+ err = __request_percpu_irq(gt_ppi, gt_clockevent_interrupt,
308
+ IRQF_TIMER, "gt", gt_evt);
304309 if (err) {
305310 pr_warn("global-timer: can't register interrupt %d (%d)\n",
306311 gt_ppi, err);