|
@@ -58,6 +58,12 @@ static irqreturn_t at91rm9200_timer_interrupt(int irq, void *dev_id)
|
|
|
{
|
|
|
u32 sr = at91_sys_read(AT91_ST_SR) & irqmask;
|
|
|
|
|
|
+ /*
|
|
|
+ * irqs should be disabled here, but as the irq is shared they are only
|
|
|
+ * guaranteed to be off if the timer irq is registered first.
|
|
|
+ */
|
|
|
+ WARN_ON_ONCE(!irqs_disabled());
|
|
|
+
|
|
|
/* simulate "oneshot" timer with alarm */
|
|
|
if (sr & AT91_ST_ALMS) {
|
|
|
clkevt.event_handler(&clkevt);
|
|
@@ -132,24 +138,11 @@ clkevt32k_mode(enum clock_event_mode mode, struct clock_event_device *dev)
|
|
|
static int
|
|
|
clkevt32k_next_event(unsigned long delta, struct clock_event_device *dev)
|
|
|
{
|
|
|
- unsigned long flags;
|
|
|
u32 alm;
|
|
|
int status = 0;
|
|
|
|
|
|
BUG_ON(delta < 2);
|
|
|
|
|
|
- /* Use "raw" primitives so we behave correctly on RT kernels. */
|
|
|
- raw_local_irq_save(flags);
|
|
|
-
|
|
|
- /*
|
|
|
- * According to Thomas Gleixner irqs are already disabled here. Simply
|
|
|
- * removing raw_local_irq_save above (and the matching
|
|
|
- * raw_local_irq_restore) was not accepted. See
|
|
|
- * http://thread.gmane.org/gmane.linux.ports.arm.kernel/41174
|
|
|
- * So for now (2008-11-20) just warn once if irqs were not disabled ...
|
|
|
- */
|
|
|
- WARN_ON_ONCE(!raw_irqs_disabled_flags(flags));
|
|
|
-
|
|
|
/* The alarm IRQ uses absolute time (now+delta), not the relative
|
|
|
* time (delta) in our calling convention. Like all clockevents
|
|
|
* using such "match" hardware, we have a race to defend against.
|
|
@@ -169,7 +162,6 @@ clkevt32k_next_event(unsigned long delta, struct clock_event_device *dev)
|
|
|
alm += delta;
|
|
|
at91_sys_write(AT91_ST_RTAR, alm);
|
|
|
|
|
|
- raw_local_irq_restore(flags);
|
|
|
return status;
|
|
|
}
|
|
|
|