[PATCH v6 4/5] clocksource/timer-econet-en751221: Disable IRQ until cevt registered
From: Caleb James DeLisle
Date: Thu May 28 2026 - 10:03:21 EST
Eliminate a race condition where cevt_interrupt may trigger before
clockevents_config_and_register has been called, and dev->event_handler
is at that point NULL. Additionally, NULL check dev->event_handler in
interrupt callback just in case clockevents_config_and_register failed.
Signed-off-by: Caleb James DeLisle <cjd@xxxxxxxx>
---
drivers/clocksource/timer-econet-en751221.c | 12 ++++++++----
1 file changed, 8 insertions(+), 4 deletions(-)
diff --git a/drivers/clocksource/timer-econet-en751221.c b/drivers/clocksource/timer-econet-en751221.c
index 714702b9ef12..f2c4c1ee0a56 100644
--- a/drivers/clocksource/timer-econet-en751221.c
+++ b/drivers/clocksource/timer-econet-en751221.c
@@ -75,7 +75,10 @@ static irqreturn_t cevt_interrupt(int irq, void *dev_id)
return IRQ_NONE;
iowrite32(ioread32(reg_count(cpu)), reg_compare(cpu));
- dev->event_handler(dev);
+
+ if (dev->event_handler)
+ dev->event_handler(dev);
+
return IRQ_HANDLED;
}
@@ -104,12 +107,11 @@ static int cevt_init_cpu(uint cpu)
reg = ioread32(reg_ctl(cpu)) | ctl_bit_enabled(cpu);
iowrite32(reg, reg_ctl(cpu));
- enable_percpu_irq(cd->irq, IRQ_TYPE_NONE);
-
- /* Do this last because it synchronously configures the timer */
clockevents_config_and_register(cd, econet_timer.freq_hz,
ECONET_MIN_DELTA, ECONET_MAX_DELTA);
+ enable_percpu_irq(cd->irq, IRQ_TYPE_NONE);
+
return 0;
}
@@ -178,6 +180,8 @@ static int __init timer_init(struct device_node *np)
goto out_membase;
}
+ irq_set_status_flags(econet_timer.irq, IRQ_NOAUTOEN);
+
ret = request_percpu_irq(econet_timer.irq, cevt_interrupt, np->name,
&econet_timer_pcpu);
--
2.39.5