Loading arch/arm/mach-at91/at91rm9200_time.c +6 −14 Original line number Original line Diff line number Diff line Loading @@ -58,6 +58,12 @@ static irqreturn_t at91rm9200_timer_interrupt(int irq, void *dev_id) { { u32 sr = at91_sys_read(AT91_ST_SR) & irqmask; 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 */ /* simulate "oneshot" timer with alarm */ if (sr & AT91_ST_ALMS) { if (sr & AT91_ST_ALMS) { clkevt.event_handler(&clkevt); clkevt.event_handler(&clkevt); Loading Loading @@ -132,24 +138,11 @@ clkevt32k_mode(enum clock_event_mode mode, struct clock_event_device *dev) static int static int clkevt32k_next_event(unsigned long delta, struct clock_event_device *dev) clkevt32k_next_event(unsigned long delta, struct clock_event_device *dev) { { unsigned long flags; u32 alm; u32 alm; int status = 0; int status = 0; BUG_ON(delta < 2); 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 /* The alarm IRQ uses absolute time (now+delta), not the relative * time (delta) in our calling convention. Like all clockevents * time (delta) in our calling convention. Like all clockevents * using such "match" hardware, we have a race to defend against. * using such "match" hardware, we have a race to defend against. Loading @@ -169,7 +162,6 @@ clkevt32k_next_event(unsigned long delta, struct clock_event_device *dev) alm += delta; alm += delta; at91_sys_write(AT91_ST_RTAR, alm); at91_sys_write(AT91_ST_RTAR, alm); raw_local_irq_restore(flags); return status; return status; } } Loading arch/arm/mach-at91/at91sam926x_time.c +6 −5 Original line number Original line Diff line number Diff line Loading @@ -62,16 +62,12 @@ static struct clocksource pit_clk = { static void static void pit_clkevt_mode(enum clock_event_mode mode, struct clock_event_device *dev) pit_clkevt_mode(enum clock_event_mode mode, struct clock_event_device *dev) { { unsigned long flags; switch (mode) { switch (mode) { case CLOCK_EVT_MODE_PERIODIC: case CLOCK_EVT_MODE_PERIODIC: /* update clocksource counter, then enable the IRQ */ /* update clocksource counter */ raw_local_irq_save(flags); pit_cnt += pit_cycle * PIT_PICNT(at91_sys_read(AT91_PIT_PIVR)); pit_cnt += pit_cycle * PIT_PICNT(at91_sys_read(AT91_PIT_PIVR)); at91_sys_write(AT91_PIT_MR, (pit_cycle - 1) | AT91_PIT_PITEN at91_sys_write(AT91_PIT_MR, (pit_cycle - 1) | AT91_PIT_PITEN | AT91_PIT_PITIEN); | AT91_PIT_PITIEN); raw_local_irq_restore(flags); break; break; case CLOCK_EVT_MODE_ONESHOT: case CLOCK_EVT_MODE_ONESHOT: BUG(); BUG(); Loading Loading @@ -100,6 +96,11 @@ static struct clock_event_device pit_clkevt = { */ */ static irqreturn_t at91sam926x_pit_interrupt(int irq, void *dev_id) static irqreturn_t at91sam926x_pit_interrupt(int irq, void *dev_id) { { /* * 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()); /* The PIT interrupt may be disabled, and is shared */ /* The PIT interrupt may be disabled, and is shared */ if ((pit_clkevt.mode == CLOCK_EVT_MODE_PERIODIC) if ((pit_clkevt.mode == CLOCK_EVT_MODE_PERIODIC) Loading arch/arm/mach-pxa/time.c +1 −9 Original line number Original line Diff line number Diff line Loading @@ -76,14 +76,12 @@ pxa_ost0_interrupt(int irq, void *dev_id) static int static int pxa_osmr0_set_next_event(unsigned long delta, struct clock_event_device *dev) pxa_osmr0_set_next_event(unsigned long delta, struct clock_event_device *dev) { { unsigned long flags, next, oscr; unsigned long next, oscr; raw_local_irq_save(flags); OIER |= OIER_E0; OIER |= OIER_E0; next = OSCR + delta; next = OSCR + delta; OSMR0 = next; OSMR0 = next; oscr = OSCR; oscr = OSCR; raw_local_irq_restore(flags); return (signed)(next - oscr) <= MIN_OSCR_DELTA ? -ETIME : 0; return (signed)(next - oscr) <= MIN_OSCR_DELTA ? -ETIME : 0; } } Loading @@ -91,23 +89,17 @@ pxa_osmr0_set_next_event(unsigned long delta, struct clock_event_device *dev) static void static void pxa_osmr0_set_mode(enum clock_event_mode mode, struct clock_event_device *dev) pxa_osmr0_set_mode(enum clock_event_mode mode, struct clock_event_device *dev) { { unsigned long irqflags; switch (mode) { switch (mode) { case CLOCK_EVT_MODE_ONESHOT: case CLOCK_EVT_MODE_ONESHOT: raw_local_irq_save(irqflags); OIER &= ~OIER_E0; OIER &= ~OIER_E0; OSSR = OSSR_M0; OSSR = OSSR_M0; raw_local_irq_restore(irqflags); break; break; case CLOCK_EVT_MODE_UNUSED: case CLOCK_EVT_MODE_UNUSED: case CLOCK_EVT_MODE_SHUTDOWN: case CLOCK_EVT_MODE_SHUTDOWN: /* initializing, released, or preparing for suspend */ /* initializing, released, or preparing for suspend */ raw_local_irq_save(irqflags); OIER &= ~OIER_E0; OIER &= ~OIER_E0; OSSR = OSSR_M0; OSSR = OSSR_M0; raw_local_irq_restore(irqflags); break; break; case CLOCK_EVT_MODE_RESUME: case CLOCK_EVT_MODE_RESUME: Loading arch/arm/mach-sa1100/time.c +1 −7 Original line number Original line Diff line number Diff line Loading @@ -35,14 +35,12 @@ static irqreturn_t sa1100_ost0_interrupt(int irq, void *dev_id) static int static int sa1100_osmr0_set_next_event(unsigned long delta, struct clock_event_device *c) sa1100_osmr0_set_next_event(unsigned long delta, struct clock_event_device *c) { { unsigned long flags, next, oscr; unsigned long next, oscr; raw_local_irq_save(flags); OIER |= OIER_E0; OIER |= OIER_E0; next = OSCR + delta; next = OSCR + delta; OSMR0 = next; OSMR0 = next; oscr = OSCR; oscr = OSCR; raw_local_irq_restore(flags); return (signed)(next - oscr) <= MIN_OSCR_DELTA ? -ETIME : 0; return (signed)(next - oscr) <= MIN_OSCR_DELTA ? -ETIME : 0; } } Loading @@ -50,16 +48,12 @@ sa1100_osmr0_set_next_event(unsigned long delta, struct clock_event_device *c) static void static void sa1100_osmr0_set_mode(enum clock_event_mode mode, struct clock_event_device *c) sa1100_osmr0_set_mode(enum clock_event_mode mode, struct clock_event_device *c) { { unsigned long flags; switch (mode) { switch (mode) { case CLOCK_EVT_MODE_ONESHOT: case CLOCK_EVT_MODE_ONESHOT: case CLOCK_EVT_MODE_UNUSED: case CLOCK_EVT_MODE_UNUSED: case CLOCK_EVT_MODE_SHUTDOWN: case CLOCK_EVT_MODE_SHUTDOWN: raw_local_irq_save(flags); OIER &= ~OIER_E0; OIER &= ~OIER_E0; OSSR = OSSR_M0; OSSR = OSSR_M0; raw_local_irq_restore(flags); break; break; case CLOCK_EVT_MODE_RESUME: case CLOCK_EVT_MODE_RESUME: Loading arch/arm/plat-nomadik/timer.c +1 −8 Original line number Original line Diff line number Diff line Loading @@ -49,24 +49,17 @@ static struct clocksource nmdk_clksrc = { static void nmdk_clkevt_mode(enum clock_event_mode mode, static void nmdk_clkevt_mode(enum clock_event_mode mode, struct clock_event_device *dev) struct clock_event_device *dev) { { unsigned long flags; switch (mode) { switch (mode) { case CLOCK_EVT_MODE_PERIODIC: case CLOCK_EVT_MODE_PERIODIC: /* enable interrupts -- and count current value? */ /* count current value? */ raw_local_irq_save(flags); writel(readl(mtu_base + MTU_IMSC) | 1, mtu_base + MTU_IMSC); writel(readl(mtu_base + MTU_IMSC) | 1, mtu_base + MTU_IMSC); raw_local_irq_restore(flags); break; break; case CLOCK_EVT_MODE_ONESHOT: case CLOCK_EVT_MODE_ONESHOT: BUG(); /* Not supported, yet */ BUG(); /* Not supported, yet */ /* FALLTHROUGH */ /* FALLTHROUGH */ case CLOCK_EVT_MODE_SHUTDOWN: case CLOCK_EVT_MODE_SHUTDOWN: case CLOCK_EVT_MODE_UNUSED: case CLOCK_EVT_MODE_UNUSED: /* disable irq */ raw_local_irq_save(flags); writel(readl(mtu_base + MTU_IMSC) & ~1, mtu_base + MTU_IMSC); writel(readl(mtu_base + MTU_IMSC) & ~1, mtu_base + MTU_IMSC); raw_local_irq_restore(flags); break; break; case CLOCK_EVT_MODE_RESUME: case CLOCK_EVT_MODE_RESUME: break; break; Loading Loading
arch/arm/mach-at91/at91rm9200_time.c +6 −14 Original line number Original line Diff line number Diff line Loading @@ -58,6 +58,12 @@ static irqreturn_t at91rm9200_timer_interrupt(int irq, void *dev_id) { { u32 sr = at91_sys_read(AT91_ST_SR) & irqmask; 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 */ /* simulate "oneshot" timer with alarm */ if (sr & AT91_ST_ALMS) { if (sr & AT91_ST_ALMS) { clkevt.event_handler(&clkevt); clkevt.event_handler(&clkevt); Loading Loading @@ -132,24 +138,11 @@ clkevt32k_mode(enum clock_event_mode mode, struct clock_event_device *dev) static int static int clkevt32k_next_event(unsigned long delta, struct clock_event_device *dev) clkevt32k_next_event(unsigned long delta, struct clock_event_device *dev) { { unsigned long flags; u32 alm; u32 alm; int status = 0; int status = 0; BUG_ON(delta < 2); 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 /* The alarm IRQ uses absolute time (now+delta), not the relative * time (delta) in our calling convention. Like all clockevents * time (delta) in our calling convention. Like all clockevents * using such "match" hardware, we have a race to defend against. * using such "match" hardware, we have a race to defend against. Loading @@ -169,7 +162,6 @@ clkevt32k_next_event(unsigned long delta, struct clock_event_device *dev) alm += delta; alm += delta; at91_sys_write(AT91_ST_RTAR, alm); at91_sys_write(AT91_ST_RTAR, alm); raw_local_irq_restore(flags); return status; return status; } } Loading
arch/arm/mach-at91/at91sam926x_time.c +6 −5 Original line number Original line Diff line number Diff line Loading @@ -62,16 +62,12 @@ static struct clocksource pit_clk = { static void static void pit_clkevt_mode(enum clock_event_mode mode, struct clock_event_device *dev) pit_clkevt_mode(enum clock_event_mode mode, struct clock_event_device *dev) { { unsigned long flags; switch (mode) { switch (mode) { case CLOCK_EVT_MODE_PERIODIC: case CLOCK_EVT_MODE_PERIODIC: /* update clocksource counter, then enable the IRQ */ /* update clocksource counter */ raw_local_irq_save(flags); pit_cnt += pit_cycle * PIT_PICNT(at91_sys_read(AT91_PIT_PIVR)); pit_cnt += pit_cycle * PIT_PICNT(at91_sys_read(AT91_PIT_PIVR)); at91_sys_write(AT91_PIT_MR, (pit_cycle - 1) | AT91_PIT_PITEN at91_sys_write(AT91_PIT_MR, (pit_cycle - 1) | AT91_PIT_PITEN | AT91_PIT_PITIEN); | AT91_PIT_PITIEN); raw_local_irq_restore(flags); break; break; case CLOCK_EVT_MODE_ONESHOT: case CLOCK_EVT_MODE_ONESHOT: BUG(); BUG(); Loading Loading @@ -100,6 +96,11 @@ static struct clock_event_device pit_clkevt = { */ */ static irqreturn_t at91sam926x_pit_interrupt(int irq, void *dev_id) static irqreturn_t at91sam926x_pit_interrupt(int irq, void *dev_id) { { /* * 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()); /* The PIT interrupt may be disabled, and is shared */ /* The PIT interrupt may be disabled, and is shared */ if ((pit_clkevt.mode == CLOCK_EVT_MODE_PERIODIC) if ((pit_clkevt.mode == CLOCK_EVT_MODE_PERIODIC) Loading
arch/arm/mach-pxa/time.c +1 −9 Original line number Original line Diff line number Diff line Loading @@ -76,14 +76,12 @@ pxa_ost0_interrupt(int irq, void *dev_id) static int static int pxa_osmr0_set_next_event(unsigned long delta, struct clock_event_device *dev) pxa_osmr0_set_next_event(unsigned long delta, struct clock_event_device *dev) { { unsigned long flags, next, oscr; unsigned long next, oscr; raw_local_irq_save(flags); OIER |= OIER_E0; OIER |= OIER_E0; next = OSCR + delta; next = OSCR + delta; OSMR0 = next; OSMR0 = next; oscr = OSCR; oscr = OSCR; raw_local_irq_restore(flags); return (signed)(next - oscr) <= MIN_OSCR_DELTA ? -ETIME : 0; return (signed)(next - oscr) <= MIN_OSCR_DELTA ? -ETIME : 0; } } Loading @@ -91,23 +89,17 @@ pxa_osmr0_set_next_event(unsigned long delta, struct clock_event_device *dev) static void static void pxa_osmr0_set_mode(enum clock_event_mode mode, struct clock_event_device *dev) pxa_osmr0_set_mode(enum clock_event_mode mode, struct clock_event_device *dev) { { unsigned long irqflags; switch (mode) { switch (mode) { case CLOCK_EVT_MODE_ONESHOT: case CLOCK_EVT_MODE_ONESHOT: raw_local_irq_save(irqflags); OIER &= ~OIER_E0; OIER &= ~OIER_E0; OSSR = OSSR_M0; OSSR = OSSR_M0; raw_local_irq_restore(irqflags); break; break; case CLOCK_EVT_MODE_UNUSED: case CLOCK_EVT_MODE_UNUSED: case CLOCK_EVT_MODE_SHUTDOWN: case CLOCK_EVT_MODE_SHUTDOWN: /* initializing, released, or preparing for suspend */ /* initializing, released, or preparing for suspend */ raw_local_irq_save(irqflags); OIER &= ~OIER_E0; OIER &= ~OIER_E0; OSSR = OSSR_M0; OSSR = OSSR_M0; raw_local_irq_restore(irqflags); break; break; case CLOCK_EVT_MODE_RESUME: case CLOCK_EVT_MODE_RESUME: Loading
arch/arm/mach-sa1100/time.c +1 −7 Original line number Original line Diff line number Diff line Loading @@ -35,14 +35,12 @@ static irqreturn_t sa1100_ost0_interrupt(int irq, void *dev_id) static int static int sa1100_osmr0_set_next_event(unsigned long delta, struct clock_event_device *c) sa1100_osmr0_set_next_event(unsigned long delta, struct clock_event_device *c) { { unsigned long flags, next, oscr; unsigned long next, oscr; raw_local_irq_save(flags); OIER |= OIER_E0; OIER |= OIER_E0; next = OSCR + delta; next = OSCR + delta; OSMR0 = next; OSMR0 = next; oscr = OSCR; oscr = OSCR; raw_local_irq_restore(flags); return (signed)(next - oscr) <= MIN_OSCR_DELTA ? -ETIME : 0; return (signed)(next - oscr) <= MIN_OSCR_DELTA ? -ETIME : 0; } } Loading @@ -50,16 +48,12 @@ sa1100_osmr0_set_next_event(unsigned long delta, struct clock_event_device *c) static void static void sa1100_osmr0_set_mode(enum clock_event_mode mode, struct clock_event_device *c) sa1100_osmr0_set_mode(enum clock_event_mode mode, struct clock_event_device *c) { { unsigned long flags; switch (mode) { switch (mode) { case CLOCK_EVT_MODE_ONESHOT: case CLOCK_EVT_MODE_ONESHOT: case CLOCK_EVT_MODE_UNUSED: case CLOCK_EVT_MODE_UNUSED: case CLOCK_EVT_MODE_SHUTDOWN: case CLOCK_EVT_MODE_SHUTDOWN: raw_local_irq_save(flags); OIER &= ~OIER_E0; OIER &= ~OIER_E0; OSSR = OSSR_M0; OSSR = OSSR_M0; raw_local_irq_restore(flags); break; break; case CLOCK_EVT_MODE_RESUME: case CLOCK_EVT_MODE_RESUME: Loading
arch/arm/plat-nomadik/timer.c +1 −8 Original line number Original line Diff line number Diff line Loading @@ -49,24 +49,17 @@ static struct clocksource nmdk_clksrc = { static void nmdk_clkevt_mode(enum clock_event_mode mode, static void nmdk_clkevt_mode(enum clock_event_mode mode, struct clock_event_device *dev) struct clock_event_device *dev) { { unsigned long flags; switch (mode) { switch (mode) { case CLOCK_EVT_MODE_PERIODIC: case CLOCK_EVT_MODE_PERIODIC: /* enable interrupts -- and count current value? */ /* count current value? */ raw_local_irq_save(flags); writel(readl(mtu_base + MTU_IMSC) | 1, mtu_base + MTU_IMSC); writel(readl(mtu_base + MTU_IMSC) | 1, mtu_base + MTU_IMSC); raw_local_irq_restore(flags); break; break; case CLOCK_EVT_MODE_ONESHOT: case CLOCK_EVT_MODE_ONESHOT: BUG(); /* Not supported, yet */ BUG(); /* Not supported, yet */ /* FALLTHROUGH */ /* FALLTHROUGH */ case CLOCK_EVT_MODE_SHUTDOWN: case CLOCK_EVT_MODE_SHUTDOWN: case CLOCK_EVT_MODE_UNUSED: case CLOCK_EVT_MODE_UNUSED: /* disable irq */ raw_local_irq_save(flags); writel(readl(mtu_base + MTU_IMSC) & ~1, mtu_base + MTU_IMSC); writel(readl(mtu_base + MTU_IMSC) & ~1, mtu_base + MTU_IMSC); raw_local_irq_restore(flags); break; break; case CLOCK_EVT_MODE_RESUME: case CLOCK_EVT_MODE_RESUME: break; break; Loading