hc
2024-11-01 2f529f9b558ca1c1bd74be7437a84e4711743404
kernel/drivers/clocksource/exynos_mct.c
....@@ -194,23 +194,20 @@
194194 return readl_relaxed(reg_base + EXYNOS4_MCT_G_CNT_L);
195195 }
196196
197
-static u64 exynos4_frc_read(struct clocksource *cs)
198
-{
199
- return exynos4_read_count_32();
200
-}
201
-
202197 static void exynos4_frc_resume(struct clocksource *cs)
203198 {
204199 exynos4_mct_frc_start();
205200 }
206201
207
-static struct clocksource mct_frc = {
208
- .name = "mct-frc",
209
- .rating = 450, /* use value higher than ARM arch timer */
210
- .read = exynos4_frc_read,
211
- .mask = CLOCKSOURCE_MASK(32),
212
- .flags = CLOCK_SOURCE_IS_CONTINUOUS,
213
- .resume = exynos4_frc_resume,
202
+static struct clocksource_user_mmio mct_frc = {
203
+ .mmio.clksrc = {
204
+ .name = "mct-frc",
205
+ .rating = 450, /* use value higher than ARM arch timer */
206
+ .read = clocksource_mmio_readl_up,
207
+ .mask = CLOCKSOURCE_MASK(32),
208
+ .flags = CLOCK_SOURCE_IS_CONTINUOUS,
209
+ .resume = exynos4_frc_resume,
210
+ },
214211 };
215212
216213 static u64 notrace exynos4_read_sched_clock(void)
....@@ -231,6 +228,8 @@
231228
232229 static int __init exynos4_clocksource_init(void)
233230 {
231
+ struct clocksource_mmio_regs mmr;
232
+
234233 exynos4_mct_frc_start();
235234
236235 #if defined(CONFIG_ARM)
....@@ -239,8 +238,13 @@
239238 register_current_timer_delay(&exynos4_delay_timer);
240239 #endif
241240
242
- if (clocksource_register_hz(&mct_frc, clk_rate))
243
- panic("%s: can't register clocksource\n", mct_frc.name);
241
+ mmr.reg_upper = NULL;
242
+ mmr.reg_lower = reg_base + EXYNOS4_MCT_G_CNT_L;
243
+ mmr.bits_upper = 0;
244
+ mmr.bits_lower = 32;
245
+ mmr.revmap = NULL;
246
+ if (clocksource_user_mmio_init(&mct_frc, &mmr, clk_rate))
247
+ panic("%s: can't register clocksource\n", mct_frc.mmio.clksrc.name);
244248
245249 sched_clock_register(exynos4_read_sched_clock, 32, clk_rate);
246250
....@@ -308,7 +312,8 @@
308312 static struct clock_event_device mct_comp_device = {
309313 .name = "mct-comp",
310314 .features = CLOCK_EVT_FEAT_PERIODIC |
311
- CLOCK_EVT_FEAT_ONESHOT,
315
+ CLOCK_EVT_FEAT_ONESHOT |
316
+ CLOCK_EVT_FEAT_PIPELINE,
312317 .rating = 250,
313318 .set_next_event = exynos4_comp_set_next_event,
314319 .set_state_periodic = mct_set_state_periodic,
....@@ -324,7 +329,7 @@
324329
325330 exynos4_mct_write(0x1, EXYNOS4_MCT_G_INT_CSTAT);
326331
327
- evt->event_handler(evt);
332
+ clockevents_handle_event(evt);
328333
329334 return IRQ_HANDLED;
330335 }
....@@ -335,7 +340,7 @@
335340 clockevents_config_and_register(&mct_comp_device, clk_rate,
336341 0xf, 0xffffffff);
337342 if (request_irq(mct_irqs[MCT_G0_IRQ], exynos4_mct_comp_isr,
338
- IRQF_TIMER | IRQF_IRQPOLL, "mct_comp_irq",
343
+ IRQF_TIMER | IRQF_IRQPOLL | IRQF_OOB, "mct_comp_irq",
339344 &mct_comp_device))
340345 pr_err("%s: request_irq() failed\n", "mct_comp_irq");
341346
....@@ -434,7 +439,7 @@
434439
435440 exynos4_mct_tick_clear(mevt);
436441
437
- evt->event_handler(evt);
442
+ clockevents_handle_event(evt);
438443
439444 return IRQ_HANDLED;
440445 }
....@@ -456,7 +461,8 @@
456461 evt->set_state_oneshot = set_state_shutdown;
457462 evt->set_state_oneshot_stopped = set_state_shutdown;
458463 evt->tick_resume = set_state_shutdown;
459
- evt->features = CLOCK_EVT_FEAT_PERIODIC | CLOCK_EVT_FEAT_ONESHOT;
464
+ evt->features = CLOCK_EVT_FEAT_PERIODIC | CLOCK_EVT_FEAT_ONESHOT | \
465
+ CLOCK_EVT_FEAT_PIPELINE;
460466 evt->rating = 500; /* use value higher than ARM arch timer */
461467
462468 exynos4_mct_write(TICK_BASE_CNT, mevt->base + MCT_L_TCNTB_OFFSET);
....@@ -541,9 +547,9 @@
541547
542548 if (mct_int_type == MCT_INT_PPI) {
543549
544
- err = request_percpu_irq(mct_irqs[MCT_L0_IRQ],
545
- exynos4_mct_tick_isr, "MCT",
546
- &percpu_mct_tick);
550
+ err = __request_percpu_irq(mct_irqs[MCT_L0_IRQ],
551
+ exynos4_mct_tick_isr, IRQF_TIMER,
552
+ "MCT", &percpu_mct_tick);
547553 WARN(err, "MCT: can't request IRQ %d (%d)\n",
548554 mct_irqs[MCT_L0_IRQ], err);
549555 } else {